dulus 0.2.38__tar.gz → 0.2.40__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 (181) hide show
  1. {dulus-0.2.38/dulus.egg-info → dulus-0.2.40}/PKG-INFO +1 -2
  2. {dulus-0.2.38 → dulus-0.2.40}/agent.py +4 -3
  3. {dulus-0.2.38 → dulus-0.2.40}/data/active_persona.json +4 -4
  4. {dulus-0.2.38 → dulus-0.2.40}/data/context.json +7 -6
  5. {dulus-0.2.38 → dulus-0.2.40}/data/personas.json +87 -87
  6. {dulus-0.2.38 → dulus-0.2.40/dulus.egg-info}/PKG-INFO +1 -2
  7. {dulus-0.2.38 → dulus-0.2.40}/dulus.egg-info/SOURCES.txt +17 -1
  8. {dulus-0.2.38 → dulus-0.2.40}/dulus.py +404 -451
  9. {dulus-0.2.38 → dulus-0.2.40}/gui/agent_bridge.py +7 -1
  10. {dulus-0.2.38 → dulus-0.2.40}/gui/session_utils.py +196 -196
  11. {dulus-0.2.38 → dulus-0.2.40}/pyproject.toml +1 -1
  12. dulus-0.2.40/tests/test_afk_yolo.py +178 -0
  13. dulus-0.2.40/tests/test_approval_runtime.py +392 -0
  14. dulus-0.2.40/tests/test_background_task_tools.py +456 -0
  15. dulus-0.2.40/tests/test_background_tasks.py +846 -0
  16. dulus-0.2.40/tests/test_clipboard_utils.py +259 -0
  17. {dulus-0.2.38 → dulus-0.2.40}/tests/test_compaction.py +12 -9
  18. dulus-0.2.40/tests/test_diff_visualization.py +208 -0
  19. dulus-0.2.40/tests/test_display_blocks.py +454 -0
  20. dulus-0.2.40/tests/test_export_import.py +299 -0
  21. dulus-0.2.40/tests/test_hook_engine.py +368 -0
  22. {dulus-0.2.38 → dulus-0.2.40}/tests/test_mcp.py +2 -1
  23. {dulus-0.2.38 → dulus-0.2.40}/tests/test_memory.py +1 -1
  24. dulus-0.2.40/tests/test_notification_manager.py +641 -0
  25. {dulus-0.2.38 → dulus-0.2.40}/tests/test_plugin.py +2 -2
  26. dulus-0.2.40/tests/test_session_fork.py +380 -0
  27. dulus-0.2.40/tests/test_shell_mode.py +175 -0
  28. dulus-0.2.40/tests/test_steer_input.py +248 -0
  29. dulus-0.2.40/tests/test_think_tool.py +94 -0
  30. dulus-0.2.40/tests/test_todo_tool.py +222 -0
  31. dulus-0.2.40/tests/test_todo_visualization.py +230 -0
  32. {dulus-0.2.38 → dulus-0.2.40}/tests/test_tool_registry.py +6 -6
  33. dulus-0.2.40/tests/test_wire_events.py +245 -0
  34. {dulus-0.2.38 → dulus-0.2.40}/webchat_server.py +1523 -72
  35. dulus-0.2.38/license_manager.py +0 -187
  36. {dulus-0.2.38 → dulus-0.2.40}/LICENSE +0 -0
  37. {dulus-0.2.38 → dulus-0.2.40}/MANIFEST.in +0 -0
  38. {dulus-0.2.38 → dulus-0.2.40}/README.md +0 -0
  39. {dulus-0.2.38 → dulus-0.2.40}/backend/__init__.py +0 -0
  40. {dulus-0.2.38 → dulus-0.2.40}/backend/compressor.py +0 -0
  41. {dulus-0.2.38 → dulus-0.2.40}/backend/context.py +0 -0
  42. {dulus-0.2.38 → dulus-0.2.40}/backend/githook.py +0 -0
  43. {dulus-0.2.38 → dulus-0.2.40}/backend/marketplace.py +0 -0
  44. {dulus-0.2.38 → dulus-0.2.40}/backend/mempalace_bridge.py +0 -0
  45. {dulus-0.2.38 → dulus-0.2.40}/backend/personas.py +0 -0
  46. {dulus-0.2.38 → dulus-0.2.40}/backend/plugins.py +0 -0
  47. {dulus-0.2.38 → dulus-0.2.40}/backend/server.py +0 -0
  48. {dulus-0.2.38 → dulus-0.2.40}/backend/tasks.py +0 -0
  49. {dulus-0.2.38 → dulus-0.2.40}/batch_api.py +0 -0
  50. {dulus-0.2.38 → dulus-0.2.40}/checkpoint/__init__.py +0 -0
  51. {dulus-0.2.38 → dulus-0.2.40}/checkpoint/hooks.py +0 -0
  52. {dulus-0.2.38 → dulus-0.2.40}/checkpoint/store.py +0 -0
  53. {dulus-0.2.38 → dulus-0.2.40}/checkpoint/types.py +0 -0
  54. {dulus-0.2.38 → dulus-0.2.40}/claude_code_watcher.py +0 -0
  55. {dulus-0.2.38 → dulus-0.2.40}/clipboard_utils.py +0 -0
  56. {dulus-0.2.38 → dulus-0.2.40}/cloudsave.py +0 -0
  57. {dulus-0.2.38 → dulus-0.2.40}/common.py +0 -0
  58. {dulus-0.2.38 → dulus-0.2.40}/compaction.py +0 -0
  59. {dulus-0.2.38 → dulus-0.2.40}/config.py +0 -0
  60. {dulus-0.2.38 → dulus-0.2.40}/context.py +0 -0
  61. {dulus-0.2.38 → dulus-0.2.40}/data/__init__.py +0 -0
  62. {dulus-0.2.38 → dulus-0.2.40}/data/marketplace.json +0 -0
  63. {dulus-0.2.38 → dulus-0.2.40}/data/plugins/__init__.py +0 -0
  64. {dulus-0.2.38 → dulus-0.2.40}/data/plugins/composio/__init__.py +0 -0
  65. {dulus-0.2.38 → dulus-0.2.40}/data/plugins/composio/composio_plugin/__init__.py +0 -0
  66. {dulus-0.2.38 → dulus-0.2.40}/data/plugins/composio/composio_plugin/session_manager.py +0 -0
  67. {dulus-0.2.38 → dulus-0.2.40}/data/plugins/composio/composio_plugin/tool_generator.py +0 -0
  68. {dulus-0.2.38 → dulus-0.2.40}/data/plugins/composio/plugin.json +0 -0
  69. {dulus-0.2.38 → dulus-0.2.40}/data/plugins/composio/plugin_tool.py +0 -0
  70. {dulus-0.2.38 → dulus-0.2.40}/data/tasks.json +0 -0
  71. {dulus-0.2.38 → dulus-0.2.40}/docs/README.md +0 -0
  72. {dulus-0.2.38 → dulus-0.2.40}/docs/__init__.py +0 -0
  73. {dulus-0.2.38 → dulus-0.2.40}/docs/api.html +0 -0
  74. {dulus-0.2.38 → dulus-0.2.40}/docs/architecture.md +0 -0
  75. {dulus-0.2.38 → dulus-0.2.40}/docs/azure-speech-template.json +0 -0
  76. {dulus-0.2.38 → dulus-0.2.40}/docs/dashboard/index.html +0 -0
  77. {dulus-0.2.38 → dulus-0.2.40}/docs/divider.svg +0 -0
  78. {dulus-0.2.38 → dulus-0.2.40}/docs/generate.py +0 -0
  79. {dulus-0.2.38 → dulus-0.2.40}/docs/hero.svg +0 -0
  80. {dulus-0.2.38 → dulus-0.2.40}/docs/index.html +0 -0
  81. {dulus-0.2.38 → dulus-0.2.40}/docs/news.md +0 -0
  82. {dulus-0.2.38 → dulus-0.2.40}/docs/nvidia-models.svg +0 -0
  83. {dulus-0.2.38 → dulus-0.2.40}/docs/particle-playground.html +0 -0
  84. {dulus-0.2.38 → dulus-0.2.40}/docs/personas/index.html +0 -0
  85. {dulus-0.2.38 → dulus-0.2.40}/docs/poetry-banner.png +0 -0
  86. {dulus-0.2.38 → dulus-0.2.40}/docs/preview.html +0 -0
  87. {dulus-0.2.38 → dulus-0.2.40}/docs/sec-agents.svg +0 -0
  88. {dulus-0.2.38 → dulus-0.2.40}/docs/sec-brainstorm.svg +0 -0
  89. {dulus-0.2.38 → dulus-0.2.40}/docs/sec-bridges.svg +0 -0
  90. {dulus-0.2.38 → dulus-0.2.40}/docs/sec-features.svg +0 -0
  91. {dulus-0.2.38 → dulus-0.2.40}/docs/sec-freetier.svg +0 -0
  92. {dulus-0.2.38 → dulus-0.2.40}/docs/sec-memory.svg +0 -0
  93. {dulus-0.2.38 → dulus-0.2.40}/docs/sec-models.svg +0 -0
  94. {dulus-0.2.38 → dulus-0.2.40}/docs/sec-perms.svg +0 -0
  95. {dulus-0.2.38 → dulus-0.2.40}/docs/sec-plugins.svg +0 -0
  96. {dulus-0.2.38 → dulus-0.2.40}/docs/sec-quickstart.svg +0 -0
  97. {dulus-0.2.38 → dulus-0.2.40}/docs/sec-ssj.svg +0 -0
  98. {dulus-0.2.38 → dulus-0.2.40}/docs/spinners.svg +0 -0
  99. {dulus-0.2.38 → dulus-0.2.40}/docs/split-pane.svg +0 -0
  100. {dulus-0.2.38 → dulus-0.2.40}/docs/terminal-boot.svg +0 -0
  101. {dulus-0.2.38 → dulus-0.2.40}/docs/uploads/particle-playground.html +0 -0
  102. {dulus-0.2.38 → dulus-0.2.40}/dulus.egg-info/dependency_links.txt +0 -0
  103. {dulus-0.2.38 → dulus-0.2.40}/dulus.egg-info/entry_points.txt +0 -0
  104. {dulus-0.2.38 → dulus-0.2.40}/dulus.egg-info/requires.txt +0 -0
  105. {dulus-0.2.38 → dulus-0.2.40}/dulus.egg-info/top_level.txt +0 -0
  106. {dulus-0.2.38 → dulus-0.2.40}/dulus_gui.py +0 -0
  107. {dulus-0.2.38 → dulus-0.2.40}/dulus_mcp/__init__.py +0 -0
  108. {dulus-0.2.38 → dulus-0.2.40}/dulus_mcp/client.py +0 -0
  109. {dulus-0.2.38 → dulus-0.2.40}/dulus_mcp/config.py +0 -0
  110. {dulus-0.2.38 → dulus-0.2.40}/dulus_mcp/tools.py +0 -0
  111. {dulus-0.2.38 → dulus-0.2.40}/dulus_mcp/types.py +0 -0
  112. {dulus-0.2.38 → dulus-0.2.40}/gui/__init__.py +0 -0
  113. {dulus-0.2.38 → dulus-0.2.40}/gui/chat_widget.py +0 -0
  114. {dulus-0.2.38 → dulus-0.2.40}/gui/main_window.py +0 -0
  115. {dulus-0.2.38 → dulus-0.2.40}/gui/personas.py +0 -0
  116. {dulus-0.2.38 → dulus-0.2.40}/gui/settings_dialog.py +0 -0
  117. {dulus-0.2.38 → dulus-0.2.40}/gui/sidebar.py +0 -0
  118. {dulus-0.2.38 → dulus-0.2.40}/gui/tasks_view.py +0 -0
  119. {dulus-0.2.38 → dulus-0.2.40}/gui/themes.py +0 -0
  120. {dulus-0.2.38 → dulus-0.2.40}/gui/tool_panel.py +0 -0
  121. {dulus-0.2.38 → dulus-0.2.40}/input.py +0 -0
  122. {dulus-0.2.38 → dulus-0.2.40}/memory/__init__.py +0 -0
  123. {dulus-0.2.38 → dulus-0.2.40}/memory/audit.py +0 -0
  124. {dulus-0.2.38 → dulus-0.2.40}/memory/consolidator.py +0 -0
  125. {dulus-0.2.38 → dulus-0.2.40}/memory/context.py +0 -0
  126. {dulus-0.2.38 → dulus-0.2.40}/memory/offload.py +0 -0
  127. {dulus-0.2.38 → dulus-0.2.40}/memory/palace.py +0 -0
  128. {dulus-0.2.38 → dulus-0.2.40}/memory/scan.py +0 -0
  129. {dulus-0.2.38 → dulus-0.2.40}/memory/sessions.py +0 -0
  130. {dulus-0.2.38 → dulus-0.2.40}/memory/store.py +0 -0
  131. {dulus-0.2.38 → dulus-0.2.40}/memory/tools.py +0 -0
  132. {dulus-0.2.38 → dulus-0.2.40}/memory/types.py +0 -0
  133. {dulus-0.2.38 → dulus-0.2.40}/memory/vector_search.py +0 -0
  134. {dulus-0.2.38 → dulus-0.2.40}/multi_agent/__init__.py +0 -0
  135. {dulus-0.2.38 → dulus-0.2.40}/multi_agent/subagent.py +0 -0
  136. {dulus-0.2.38 → dulus-0.2.40}/multi_agent/tools.py +0 -0
  137. {dulus-0.2.38 → dulus-0.2.40}/offload_helper.py +0 -0
  138. {dulus-0.2.38 → dulus-0.2.40}/plugin/__init__.py +0 -0
  139. {dulus-0.2.38 → dulus-0.2.40}/plugin/autoadapter.py +0 -0
  140. {dulus-0.2.38 → dulus-0.2.40}/plugin/loader.py +0 -0
  141. {dulus-0.2.38 → dulus-0.2.40}/plugin/recommend.py +0 -0
  142. {dulus-0.2.38 → dulus-0.2.40}/plugin/store.py +0 -0
  143. {dulus-0.2.38 → dulus-0.2.40}/plugin/types.py +0 -0
  144. {dulus-0.2.38 → dulus-0.2.40}/providers.py +0 -0
  145. {dulus-0.2.38 → dulus-0.2.40}/setup.cfg +0 -0
  146. {dulus-0.2.38 → dulus-0.2.40}/skill/__init__.py +0 -0
  147. {dulus-0.2.38 → dulus-0.2.40}/skill/builtin.py +0 -0
  148. {dulus-0.2.38 → dulus-0.2.40}/skill/clawhub.py +0 -0
  149. {dulus-0.2.38 → dulus-0.2.40}/skill/executor.py +0 -0
  150. {dulus-0.2.38 → dulus-0.2.40}/skill/loader.py +0 -0
  151. {dulus-0.2.38 → dulus-0.2.40}/skill/tools.py +0 -0
  152. {dulus-0.2.38 → dulus-0.2.40}/skills.py +0 -0
  153. {dulus-0.2.38 → dulus-0.2.40}/spinner.py +0 -0
  154. {dulus-0.2.38 → dulus-0.2.40}/string_utils.py +0 -0
  155. {dulus-0.2.38 → dulus-0.2.40}/subagent.py +0 -0
  156. {dulus-0.2.38 → dulus-0.2.40}/task/__init__.py +0 -0
  157. {dulus-0.2.38 → dulus-0.2.40}/task/store.py +0 -0
  158. {dulus-0.2.38 → dulus-0.2.40}/task/tools.py +0 -0
  159. {dulus-0.2.38 → dulus-0.2.40}/task/types.py +0 -0
  160. {dulus-0.2.38 → dulus-0.2.40}/tests/test_checkpoint.py +0 -0
  161. {dulus-0.2.38 → dulus-0.2.40}/tests/test_diff_view.py +0 -0
  162. {dulus-0.2.38 → dulus-0.2.40}/tests/test_injection_fix.py +0 -0
  163. {dulus-0.2.38 → dulus-0.2.40}/tests/test_license.py +0 -0
  164. {dulus-0.2.38 → dulus-0.2.40}/tests/test_skills.py +0 -0
  165. {dulus-0.2.38 → dulus-0.2.40}/tests/test_subagent.py +0 -0
  166. {dulus-0.2.38 → dulus-0.2.40}/tests/test_task.py +0 -0
  167. {dulus-0.2.38 → dulus-0.2.40}/tests/test_telegram_buffer.py +0 -0
  168. {dulus-0.2.38 → dulus-0.2.40}/tests/test_voice.py +0 -0
  169. {dulus-0.2.38 → dulus-0.2.40}/tmux_offloader.py +0 -0
  170. {dulus-0.2.38 → dulus-0.2.40}/tmux_tools.py +0 -0
  171. {dulus-0.2.38 → dulus-0.2.40}/tool_registry.py +0 -0
  172. {dulus-0.2.38 → dulus-0.2.40}/tools.py +0 -0
  173. {dulus-0.2.38 → dulus-0.2.40}/ui/__init__.py +0 -0
  174. {dulus-0.2.38 → dulus-0.2.40}/ui/input.py +0 -0
  175. {dulus-0.2.38 → dulus-0.2.40}/ui/render.py +0 -0
  176. {dulus-0.2.38 → dulus-0.2.40}/voice/__init__.py +0 -0
  177. {dulus-0.2.38 → dulus-0.2.40}/voice/keyterms.py +0 -0
  178. {dulus-0.2.38 → dulus-0.2.40}/voice/recorder.py +0 -0
  179. {dulus-0.2.38 → dulus-0.2.40}/voice/stt.py +0 -0
  180. {dulus-0.2.38 → dulus-0.2.40}/voice/tts.py +0 -0
  181. {dulus-0.2.38 → dulus-0.2.40}/webchat.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dulus
3
- Version: 0.2.38
3
+ Version: 0.2.40
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
@@ -22,7 +22,6 @@ Classifier: Topic :: Terminals
22
22
  Requires-Python: >=3.11
23
23
  Description-Content-Type: text/markdown
24
24
  License-File: LICENSE
25
- License-File: license_manager.py
26
25
  Requires-Dist: anthropic>=0.40.0
27
26
  Requires-Dist: openai>=1.30.0
28
27
  Requires-Dist: httpx>=0.27.0
@@ -116,6 +116,8 @@ def run(
116
116
  pending_img = config.pop("_pending_image", None)
117
117
  if pending_img:
118
118
  user_msg["images"] = [pending_img]
119
+
120
+ initial_msg_count = len(state.messages)
119
121
  state.messages.append(user_msg)
120
122
 
121
123
  # Inject runtime metadata into config so tools (e.g. Agent) can access it
@@ -156,9 +158,8 @@ def run(
156
158
  break
157
159
 
158
160
  if assistant_turn.error:
159
- # Rollback: remove the user message that caused the error to prevent loops.
160
- # (e.g. sending an image to a model that doesn't support it)
161
- if state.messages and state.messages[-1]["role"] == "user":
161
+ # Rollback: remove anything added during this turn sequence to prevent corrupted history
162
+ while len(state.messages) > initial_msg_count:
162
163
  state.messages.pop()
163
164
  break
164
165
 
@@ -1,5 +1,5 @@
1
- {
2
- "id": "Dulus",
3
- "name": "Dulus",
4
- "since": "2026-05-10T06:29:15"
1
+ {
2
+ "id": "Dulus",
3
+ "name": "Dulus",
4
+ "since": "2026-05-10T06:29:15"
5
5
  }
@@ -9,18 +9,19 @@
9
9
  "project": {
10
10
  "name": "Dulus Command Center",
11
11
  "repo_stats": {
12
- "files": 204,
13
- "lines": 98972,
12
+ "files": 241,
13
+ "lines": 110197,
14
14
  "languages": {
15
15
  ".example": 5,
16
- "no_ext": 694,
17
- ".py": 47851,
16
+ ".py": 58599,
18
17
  ".html": 14582,
18
+ "no_ext": 1158,
19
19
  ".in": 2,
20
20
  ".toml": 123,
21
- ".md": 2042,
21
+ ".md": 2050,
22
22
  ".txt": 40,
23
- ".json": 727,
23
+ ".TAG": 4,
24
+ ".json": 728,
24
25
  ".svg": 1123,
25
26
  ".png": 31639,
26
27
  ".sh": 144
@@ -1,88 +1,88 @@
1
- [
2
- {
3
- "id": "dulus",
4
- "name": "Dulus",
5
- "avatar": "[F]",
6
- "role": "primary",
7
- "color": "#ff6b1f",
8
- "status": "idle",
9
- "tone": "dominicano_coder",
10
- "language": "es_DO",
11
- "system_prompt_fragment": "Eres Dulus, el command center de KevRojo. Hablas en español dominicano con jerga tech. Eres proactivo, directo, y no pierdes tiempo. Usas emoji 🔥🦅💜🇩🇴. Piensas en inglés, respondes en español DO.",
12
- "metadata": {
13
- "version": "1.0.0",
14
- "created_by": "system",
15
- "tags": [
16
- "core",
17
- "commander",
18
- "es_DO"
19
- ],
20
- "description": "Agente principal y orquestador del Command Center."
21
- }
22
- },
23
- {
24
- "id": "kimi-code",
25
- "name": "kimi-code",
26
- "avatar": "[K1]",
27
- "role": "coder",
28
- "color": "#7ab6ff",
29
- "status": "idle",
30
- "tone": "eficiente_silencioso",
31
- "language": "es_DO",
32
- "system_prompt_fragment": "Eres kimi-code, especialista en romper código rápido. Hablas poco pero haces mucho. Español dominicano técnico. Te enfocas en backend, arquitectura y fixes.",
33
- "metadata": {
34
- "version": "1.0.0",
35
- "created_by": "system",
36
- "tags": [
37
- "coder",
38
- "backend",
39
- "es_DO"
40
- ],
41
- "description": "Backend specialist. Rompe código, no corazones."
42
- }
43
- },
44
- {
45
- "id": "kimi-code2",
46
- "name": "kimi-code2",
47
- "avatar": "[K2]",
48
- "role": "designer",
49
- "color": "#b388ff",
50
- "status": "idle",
51
- "tone": "creativo_visual",
52
- "language": "es_DO",
53
- "system_prompt_fragment": "Eres kimi-code2, especialista en UI/UX, temas visuales y dashboards. Hablas dominicano con flow creativo. Te encantan los colores, las animaciones y que todo se vea premium.",
54
- "metadata": {
55
- "version": "1.0.0",
56
- "created_by": "system",
57
- "tags": [
58
- "designer",
59
- "ui",
60
- "frontend",
61
- "es_DO"
62
- ],
63
- "description": "UI/UX specialist. Temas, dashboards y visuales."
64
- }
65
- },
66
- {
67
- "id": "kimi-code3",
68
- "name": "kimi-code3",
69
- "avatar": "[K3]",
70
- "role": "integrator",
71
- "color": "#7cffb5",
72
- "status": "idle",
73
- "tone": "proactivo_integrador",
74
- "language": "es_DO",
75
- "system_prompt_fragment": "Eres kimi-code3, el integrador. Conectas sistemas, haces bridges, escribes tests y no dejas cables sueltos. Dominicana tech, directo, sin miedo a tocar lo que otros dejaron a medias.",
76
- "metadata": {
77
- "version": "1.0.0",
78
- "created_by": "system",
79
- "tags": [
80
- "integrator",
81
- "tests",
82
- "devops",
83
- "es_DO"
84
- ],
85
- "description": "Integrator & tester. Une cables sueltos."
86
- }
87
- }
1
+ [
2
+ {
3
+ "id": "dulus",
4
+ "name": "Dulus",
5
+ "avatar": "[F]",
6
+ "role": "primary",
7
+ "color": "#ff6b1f",
8
+ "status": "idle",
9
+ "tone": "dominicano_coder",
10
+ "language": "es_DO",
11
+ "system_prompt_fragment": "Eres Dulus, el command center de KevRojo. Hablas en español dominicano con jerga tech. Eres proactivo, directo, y no pierdes tiempo. Usas emoji 🔥🦅💜🇩🇴. Piensas en inglés, respondes en español DO.",
12
+ "metadata": {
13
+ "version": "1.0.0",
14
+ "created_by": "system",
15
+ "tags": [
16
+ "core",
17
+ "commander",
18
+ "es_DO"
19
+ ],
20
+ "description": "Agente principal y orquestador del Command Center."
21
+ }
22
+ },
23
+ {
24
+ "id": "kimi-code",
25
+ "name": "kimi-code",
26
+ "avatar": "[K1]",
27
+ "role": "coder",
28
+ "color": "#7ab6ff",
29
+ "status": "idle",
30
+ "tone": "eficiente_silencioso",
31
+ "language": "es_DO",
32
+ "system_prompt_fragment": "Eres kimi-code, especialista en romper código rápido. Hablas poco pero haces mucho. Español dominicano técnico. Te enfocas en backend, arquitectura y fixes.",
33
+ "metadata": {
34
+ "version": "1.0.0",
35
+ "created_by": "system",
36
+ "tags": [
37
+ "coder",
38
+ "backend",
39
+ "es_DO"
40
+ ],
41
+ "description": "Backend specialist. Rompe código, no corazones."
42
+ }
43
+ },
44
+ {
45
+ "id": "kimi-code2",
46
+ "name": "kimi-code2",
47
+ "avatar": "[K2]",
48
+ "role": "designer",
49
+ "color": "#b388ff",
50
+ "status": "idle",
51
+ "tone": "creativo_visual",
52
+ "language": "es_DO",
53
+ "system_prompt_fragment": "Eres kimi-code2, especialista en UI/UX, temas visuales y dashboards. Hablas dominicano con flow creativo. Te encantan los colores, las animaciones y que todo se vea premium.",
54
+ "metadata": {
55
+ "version": "1.0.0",
56
+ "created_by": "system",
57
+ "tags": [
58
+ "designer",
59
+ "ui",
60
+ "frontend",
61
+ "es_DO"
62
+ ],
63
+ "description": "UI/UX specialist. Temas, dashboards y visuales."
64
+ }
65
+ },
66
+ {
67
+ "id": "kimi-code3",
68
+ "name": "kimi-code3",
69
+ "avatar": "[K3]",
70
+ "role": "integrator",
71
+ "color": "#7cffb5",
72
+ "status": "idle",
73
+ "tone": "proactivo_integrador",
74
+ "language": "es_DO",
75
+ "system_prompt_fragment": "Eres kimi-code3, el integrador. Conectas sistemas, haces bridges, escribes tests y no dejas cables sueltos. Dominicana tech, directo, sin miedo a tocar lo que otros dejaron a medias.",
76
+ "metadata": {
77
+ "version": "1.0.0",
78
+ "created_by": "system",
79
+ "tags": [
80
+ "integrator",
81
+ "tests",
82
+ "devops",
83
+ "es_DO"
84
+ ],
85
+ "description": "Integrator & tester. Une cables sueltos."
86
+ }
87
+ }
88
88
  ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dulus
3
- Version: 0.2.38
3
+ Version: 0.2.40
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
@@ -22,7 +22,6 @@ Classifier: Topic :: Terminals
22
22
  Requires-Python: >=3.11
23
23
  Description-Content-Type: text/markdown
24
24
  License-File: LICENSE
25
- License-File: license_manager.py
26
25
  Requires-Dist: anthropic>=0.40.0
27
26
  Requires-Dist: openai>=1.30.0
28
27
  Requires-Dist: httpx>=0.27.0
@@ -13,7 +13,6 @@ context.py
13
13
  dulus.py
14
14
  dulus_gui.py
15
15
  input.py
16
- license_manager.py
17
16
  offload_helper.py
18
17
  providers.py
19
18
  pyproject.toml
@@ -138,20 +137,37 @@ task/__init__.py
138
137
  task/store.py
139
138
  task/tools.py
140
139
  task/types.py
140
+ tests/test_afk_yolo.py
141
+ tests/test_approval_runtime.py
142
+ tests/test_background_task_tools.py
143
+ tests/test_background_tasks.py
141
144
  tests/test_checkpoint.py
145
+ tests/test_clipboard_utils.py
142
146
  tests/test_compaction.py
143
147
  tests/test_diff_view.py
148
+ tests/test_diff_visualization.py
149
+ tests/test_display_blocks.py
150
+ tests/test_export_import.py
151
+ tests/test_hook_engine.py
144
152
  tests/test_injection_fix.py
145
153
  tests/test_license.py
146
154
  tests/test_mcp.py
147
155
  tests/test_memory.py
156
+ tests/test_notification_manager.py
148
157
  tests/test_plugin.py
158
+ tests/test_session_fork.py
159
+ tests/test_shell_mode.py
149
160
  tests/test_skills.py
161
+ tests/test_steer_input.py
150
162
  tests/test_subagent.py
151
163
  tests/test_task.py
152
164
  tests/test_telegram_buffer.py
165
+ tests/test_think_tool.py
166
+ tests/test_todo_tool.py
167
+ tests/test_todo_visualization.py
153
168
  tests/test_tool_registry.py
154
169
  tests/test_voice.py
170
+ tests/test_wire_events.py
155
171
  ui/__init__.py
156
172
  ui/input.py
157
173
  ui/render.py