dulus 0.2.38__tar.gz → 0.2.39__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 (182) hide show
  1. {dulus-0.2.38/dulus.egg-info → dulus-0.2.39}/PKG-INFO +2 -1
  2. {dulus-0.2.38 → dulus-0.2.39}/agent.py +4 -3
  3. {dulus-0.2.38 → dulus-0.2.39}/data/active_persona.json +4 -4
  4. {dulus-0.2.38 → dulus-0.2.39}/data/context.json +7 -6
  5. {dulus-0.2.38 → dulus-0.2.39}/data/personas.json +87 -87
  6. {dulus-0.2.38 → dulus-0.2.39/dulus.egg-info}/PKG-INFO +2 -1
  7. {dulus-0.2.38 → dulus-0.2.39}/dulus.egg-info/SOURCES.txt +18 -0
  8. {dulus-0.2.38 → dulus-0.2.39}/dulus.py +404 -451
  9. {dulus-0.2.38 → dulus-0.2.39}/gui/agent_bridge.py +7 -1
  10. {dulus-0.2.38 → dulus-0.2.39}/gui/session_utils.py +196 -196
  11. dulus-0.2.39/license_server.py +63 -0
  12. {dulus-0.2.38 → dulus-0.2.39}/pyproject.toml +1 -1
  13. dulus-0.2.39/tests/test_afk_yolo.py +178 -0
  14. dulus-0.2.39/tests/test_approval_runtime.py +392 -0
  15. dulus-0.2.39/tests/test_background_task_tools.py +456 -0
  16. dulus-0.2.39/tests/test_background_tasks.py +846 -0
  17. dulus-0.2.39/tests/test_clipboard_utils.py +259 -0
  18. {dulus-0.2.38 → dulus-0.2.39}/tests/test_compaction.py +12 -9
  19. dulus-0.2.39/tests/test_diff_visualization.py +208 -0
  20. dulus-0.2.39/tests/test_display_blocks.py +454 -0
  21. dulus-0.2.39/tests/test_export_import.py +299 -0
  22. dulus-0.2.39/tests/test_hook_engine.py +368 -0
  23. {dulus-0.2.38 → dulus-0.2.39}/tests/test_mcp.py +2 -1
  24. {dulus-0.2.38 → dulus-0.2.39}/tests/test_memory.py +1 -1
  25. dulus-0.2.39/tests/test_notification_manager.py +641 -0
  26. {dulus-0.2.38 → dulus-0.2.39}/tests/test_plugin.py +2 -2
  27. dulus-0.2.39/tests/test_session_fork.py +380 -0
  28. dulus-0.2.39/tests/test_shell_mode.py +175 -0
  29. dulus-0.2.39/tests/test_steer_input.py +248 -0
  30. dulus-0.2.39/tests/test_think_tool.py +94 -0
  31. dulus-0.2.39/tests/test_todo_tool.py +222 -0
  32. dulus-0.2.39/tests/test_todo_visualization.py +230 -0
  33. {dulus-0.2.38 → dulus-0.2.39}/tests/test_tool_registry.py +6 -6
  34. dulus-0.2.39/tests/test_wire_events.py +245 -0
  35. {dulus-0.2.38 → dulus-0.2.39}/webchat_server.py +1523 -72
  36. {dulus-0.2.38 → dulus-0.2.39}/LICENSE +0 -0
  37. {dulus-0.2.38 → dulus-0.2.39}/MANIFEST.in +0 -0
  38. {dulus-0.2.38 → dulus-0.2.39}/README.md +0 -0
  39. {dulus-0.2.38 → dulus-0.2.39}/backend/__init__.py +0 -0
  40. {dulus-0.2.38 → dulus-0.2.39}/backend/compressor.py +0 -0
  41. {dulus-0.2.38 → dulus-0.2.39}/backend/context.py +0 -0
  42. {dulus-0.2.38 → dulus-0.2.39}/backend/githook.py +0 -0
  43. {dulus-0.2.38 → dulus-0.2.39}/backend/marketplace.py +0 -0
  44. {dulus-0.2.38 → dulus-0.2.39}/backend/mempalace_bridge.py +0 -0
  45. {dulus-0.2.38 → dulus-0.2.39}/backend/personas.py +0 -0
  46. {dulus-0.2.38 → dulus-0.2.39}/backend/plugins.py +0 -0
  47. {dulus-0.2.38 → dulus-0.2.39}/backend/server.py +0 -0
  48. {dulus-0.2.38 → dulus-0.2.39}/backend/tasks.py +0 -0
  49. {dulus-0.2.38 → dulus-0.2.39}/batch_api.py +0 -0
  50. {dulus-0.2.38 → dulus-0.2.39}/checkpoint/__init__.py +0 -0
  51. {dulus-0.2.38 → dulus-0.2.39}/checkpoint/hooks.py +0 -0
  52. {dulus-0.2.38 → dulus-0.2.39}/checkpoint/store.py +0 -0
  53. {dulus-0.2.38 → dulus-0.2.39}/checkpoint/types.py +0 -0
  54. {dulus-0.2.38 → dulus-0.2.39}/claude_code_watcher.py +0 -0
  55. {dulus-0.2.38 → dulus-0.2.39}/clipboard_utils.py +0 -0
  56. {dulus-0.2.38 → dulus-0.2.39}/cloudsave.py +0 -0
  57. {dulus-0.2.38 → dulus-0.2.39}/common.py +0 -0
  58. {dulus-0.2.38 → dulus-0.2.39}/compaction.py +0 -0
  59. {dulus-0.2.38 → dulus-0.2.39}/config.py +0 -0
  60. {dulus-0.2.38 → dulus-0.2.39}/context.py +0 -0
  61. {dulus-0.2.38 → dulus-0.2.39}/data/__init__.py +0 -0
  62. {dulus-0.2.38 → dulus-0.2.39}/data/marketplace.json +0 -0
  63. {dulus-0.2.38 → dulus-0.2.39}/data/plugins/__init__.py +0 -0
  64. {dulus-0.2.38 → dulus-0.2.39}/data/plugins/composio/__init__.py +0 -0
  65. {dulus-0.2.38 → dulus-0.2.39}/data/plugins/composio/composio_plugin/__init__.py +0 -0
  66. {dulus-0.2.38 → dulus-0.2.39}/data/plugins/composio/composio_plugin/session_manager.py +0 -0
  67. {dulus-0.2.38 → dulus-0.2.39}/data/plugins/composio/composio_plugin/tool_generator.py +0 -0
  68. {dulus-0.2.38 → dulus-0.2.39}/data/plugins/composio/plugin.json +0 -0
  69. {dulus-0.2.38 → dulus-0.2.39}/data/plugins/composio/plugin_tool.py +0 -0
  70. {dulus-0.2.38 → dulus-0.2.39}/data/tasks.json +0 -0
  71. {dulus-0.2.38 → dulus-0.2.39}/docs/README.md +0 -0
  72. {dulus-0.2.38 → dulus-0.2.39}/docs/__init__.py +0 -0
  73. {dulus-0.2.38 → dulus-0.2.39}/docs/api.html +0 -0
  74. {dulus-0.2.38 → dulus-0.2.39}/docs/architecture.md +0 -0
  75. {dulus-0.2.38 → dulus-0.2.39}/docs/azure-speech-template.json +0 -0
  76. {dulus-0.2.38 → dulus-0.2.39}/docs/dashboard/index.html +0 -0
  77. {dulus-0.2.38 → dulus-0.2.39}/docs/divider.svg +0 -0
  78. {dulus-0.2.38 → dulus-0.2.39}/docs/generate.py +0 -0
  79. {dulus-0.2.38 → dulus-0.2.39}/docs/hero.svg +0 -0
  80. {dulus-0.2.38 → dulus-0.2.39}/docs/index.html +0 -0
  81. {dulus-0.2.38 → dulus-0.2.39}/docs/news.md +0 -0
  82. {dulus-0.2.38 → dulus-0.2.39}/docs/nvidia-models.svg +0 -0
  83. {dulus-0.2.38 → dulus-0.2.39}/docs/particle-playground.html +0 -0
  84. {dulus-0.2.38 → dulus-0.2.39}/docs/personas/index.html +0 -0
  85. {dulus-0.2.38 → dulus-0.2.39}/docs/poetry-banner.png +0 -0
  86. {dulus-0.2.38 → dulus-0.2.39}/docs/preview.html +0 -0
  87. {dulus-0.2.38 → dulus-0.2.39}/docs/sec-agents.svg +0 -0
  88. {dulus-0.2.38 → dulus-0.2.39}/docs/sec-brainstorm.svg +0 -0
  89. {dulus-0.2.38 → dulus-0.2.39}/docs/sec-bridges.svg +0 -0
  90. {dulus-0.2.38 → dulus-0.2.39}/docs/sec-features.svg +0 -0
  91. {dulus-0.2.38 → dulus-0.2.39}/docs/sec-freetier.svg +0 -0
  92. {dulus-0.2.38 → dulus-0.2.39}/docs/sec-memory.svg +0 -0
  93. {dulus-0.2.38 → dulus-0.2.39}/docs/sec-models.svg +0 -0
  94. {dulus-0.2.38 → dulus-0.2.39}/docs/sec-perms.svg +0 -0
  95. {dulus-0.2.38 → dulus-0.2.39}/docs/sec-plugins.svg +0 -0
  96. {dulus-0.2.38 → dulus-0.2.39}/docs/sec-quickstart.svg +0 -0
  97. {dulus-0.2.38 → dulus-0.2.39}/docs/sec-ssj.svg +0 -0
  98. {dulus-0.2.38 → dulus-0.2.39}/docs/spinners.svg +0 -0
  99. {dulus-0.2.38 → dulus-0.2.39}/docs/split-pane.svg +0 -0
  100. {dulus-0.2.38 → dulus-0.2.39}/docs/terminal-boot.svg +0 -0
  101. {dulus-0.2.38 → dulus-0.2.39}/docs/uploads/particle-playground.html +0 -0
  102. {dulus-0.2.38 → dulus-0.2.39}/dulus.egg-info/dependency_links.txt +0 -0
  103. {dulus-0.2.38 → dulus-0.2.39}/dulus.egg-info/entry_points.txt +0 -0
  104. {dulus-0.2.38 → dulus-0.2.39}/dulus.egg-info/requires.txt +0 -0
  105. {dulus-0.2.38 → dulus-0.2.39}/dulus.egg-info/top_level.txt +0 -0
  106. {dulus-0.2.38 → dulus-0.2.39}/dulus_gui.py +0 -0
  107. {dulus-0.2.38 → dulus-0.2.39}/dulus_mcp/__init__.py +0 -0
  108. {dulus-0.2.38 → dulus-0.2.39}/dulus_mcp/client.py +0 -0
  109. {dulus-0.2.38 → dulus-0.2.39}/dulus_mcp/config.py +0 -0
  110. {dulus-0.2.38 → dulus-0.2.39}/dulus_mcp/tools.py +0 -0
  111. {dulus-0.2.38 → dulus-0.2.39}/dulus_mcp/types.py +0 -0
  112. {dulus-0.2.38 → dulus-0.2.39}/gui/__init__.py +0 -0
  113. {dulus-0.2.38 → dulus-0.2.39}/gui/chat_widget.py +0 -0
  114. {dulus-0.2.38 → dulus-0.2.39}/gui/main_window.py +0 -0
  115. {dulus-0.2.38 → dulus-0.2.39}/gui/personas.py +0 -0
  116. {dulus-0.2.38 → dulus-0.2.39}/gui/settings_dialog.py +0 -0
  117. {dulus-0.2.38 → dulus-0.2.39}/gui/sidebar.py +0 -0
  118. {dulus-0.2.38 → dulus-0.2.39}/gui/tasks_view.py +0 -0
  119. {dulus-0.2.38 → dulus-0.2.39}/gui/themes.py +0 -0
  120. {dulus-0.2.38 → dulus-0.2.39}/gui/tool_panel.py +0 -0
  121. {dulus-0.2.38 → dulus-0.2.39}/input.py +0 -0
  122. {dulus-0.2.38 → dulus-0.2.39}/license_manager.py +0 -0
  123. {dulus-0.2.38 → dulus-0.2.39}/memory/__init__.py +0 -0
  124. {dulus-0.2.38 → dulus-0.2.39}/memory/audit.py +0 -0
  125. {dulus-0.2.38 → dulus-0.2.39}/memory/consolidator.py +0 -0
  126. {dulus-0.2.38 → dulus-0.2.39}/memory/context.py +0 -0
  127. {dulus-0.2.38 → dulus-0.2.39}/memory/offload.py +0 -0
  128. {dulus-0.2.38 → dulus-0.2.39}/memory/palace.py +0 -0
  129. {dulus-0.2.38 → dulus-0.2.39}/memory/scan.py +0 -0
  130. {dulus-0.2.38 → dulus-0.2.39}/memory/sessions.py +0 -0
  131. {dulus-0.2.38 → dulus-0.2.39}/memory/store.py +0 -0
  132. {dulus-0.2.38 → dulus-0.2.39}/memory/tools.py +0 -0
  133. {dulus-0.2.38 → dulus-0.2.39}/memory/types.py +0 -0
  134. {dulus-0.2.38 → dulus-0.2.39}/memory/vector_search.py +0 -0
  135. {dulus-0.2.38 → dulus-0.2.39}/multi_agent/__init__.py +0 -0
  136. {dulus-0.2.38 → dulus-0.2.39}/multi_agent/subagent.py +0 -0
  137. {dulus-0.2.38 → dulus-0.2.39}/multi_agent/tools.py +0 -0
  138. {dulus-0.2.38 → dulus-0.2.39}/offload_helper.py +0 -0
  139. {dulus-0.2.38 → dulus-0.2.39}/plugin/__init__.py +0 -0
  140. {dulus-0.2.38 → dulus-0.2.39}/plugin/autoadapter.py +0 -0
  141. {dulus-0.2.38 → dulus-0.2.39}/plugin/loader.py +0 -0
  142. {dulus-0.2.38 → dulus-0.2.39}/plugin/recommend.py +0 -0
  143. {dulus-0.2.38 → dulus-0.2.39}/plugin/store.py +0 -0
  144. {dulus-0.2.38 → dulus-0.2.39}/plugin/types.py +0 -0
  145. {dulus-0.2.38 → dulus-0.2.39}/providers.py +0 -0
  146. {dulus-0.2.38 → dulus-0.2.39}/setup.cfg +0 -0
  147. {dulus-0.2.38 → dulus-0.2.39}/skill/__init__.py +0 -0
  148. {dulus-0.2.38 → dulus-0.2.39}/skill/builtin.py +0 -0
  149. {dulus-0.2.38 → dulus-0.2.39}/skill/clawhub.py +0 -0
  150. {dulus-0.2.38 → dulus-0.2.39}/skill/executor.py +0 -0
  151. {dulus-0.2.38 → dulus-0.2.39}/skill/loader.py +0 -0
  152. {dulus-0.2.38 → dulus-0.2.39}/skill/tools.py +0 -0
  153. {dulus-0.2.38 → dulus-0.2.39}/skills.py +0 -0
  154. {dulus-0.2.38 → dulus-0.2.39}/spinner.py +0 -0
  155. {dulus-0.2.38 → dulus-0.2.39}/string_utils.py +0 -0
  156. {dulus-0.2.38 → dulus-0.2.39}/subagent.py +0 -0
  157. {dulus-0.2.38 → dulus-0.2.39}/task/__init__.py +0 -0
  158. {dulus-0.2.38 → dulus-0.2.39}/task/store.py +0 -0
  159. {dulus-0.2.38 → dulus-0.2.39}/task/tools.py +0 -0
  160. {dulus-0.2.38 → dulus-0.2.39}/task/types.py +0 -0
  161. {dulus-0.2.38 → dulus-0.2.39}/tests/test_checkpoint.py +0 -0
  162. {dulus-0.2.38 → dulus-0.2.39}/tests/test_diff_view.py +0 -0
  163. {dulus-0.2.38 → dulus-0.2.39}/tests/test_injection_fix.py +0 -0
  164. {dulus-0.2.38 → dulus-0.2.39}/tests/test_license.py +0 -0
  165. {dulus-0.2.38 → dulus-0.2.39}/tests/test_skills.py +0 -0
  166. {dulus-0.2.38 → dulus-0.2.39}/tests/test_subagent.py +0 -0
  167. {dulus-0.2.38 → dulus-0.2.39}/tests/test_task.py +0 -0
  168. {dulus-0.2.38 → dulus-0.2.39}/tests/test_telegram_buffer.py +0 -0
  169. {dulus-0.2.38 → dulus-0.2.39}/tests/test_voice.py +0 -0
  170. {dulus-0.2.38 → dulus-0.2.39}/tmux_offloader.py +0 -0
  171. {dulus-0.2.38 → dulus-0.2.39}/tmux_tools.py +0 -0
  172. {dulus-0.2.38 → dulus-0.2.39}/tool_registry.py +0 -0
  173. {dulus-0.2.38 → dulus-0.2.39}/tools.py +0 -0
  174. {dulus-0.2.38 → dulus-0.2.39}/ui/__init__.py +0 -0
  175. {dulus-0.2.38 → dulus-0.2.39}/ui/input.py +0 -0
  176. {dulus-0.2.38 → dulus-0.2.39}/ui/render.py +0 -0
  177. {dulus-0.2.38 → dulus-0.2.39}/voice/__init__.py +0 -0
  178. {dulus-0.2.38 → dulus-0.2.39}/voice/keyterms.py +0 -0
  179. {dulus-0.2.38 → dulus-0.2.39}/voice/recorder.py +0 -0
  180. {dulus-0.2.38 → dulus-0.2.39}/voice/stt.py +0 -0
  181. {dulus-0.2.38 → dulus-0.2.39}/voice/tts.py +0 -0
  182. {dulus-0.2.38 → dulus-0.2.39}/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.39
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
@@ -23,6 +23,7 @@ Requires-Python: >=3.11
23
23
  Description-Content-Type: text/markdown
24
24
  License-File: LICENSE
25
25
  License-File: license_manager.py
26
+ License-File: license_server.py
26
27
  Requires-Dist: anthropic>=0.40.0
27
28
  Requires-Dist: openai>=1.30.0
28
29
  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.39
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
@@ -23,6 +23,7 @@ Requires-Python: >=3.11
23
23
  Description-Content-Type: text/markdown
24
24
  License-File: LICENSE
25
25
  License-File: license_manager.py
26
+ License-File: license_server.py
26
27
  Requires-Dist: anthropic>=0.40.0
27
28
  Requires-Dist: openai>=1.30.0
28
29
  Requires-Dist: httpx>=0.27.0
@@ -14,6 +14,7 @@ dulus.py
14
14
  dulus_gui.py
15
15
  input.py
16
16
  license_manager.py
17
+ license_server.py
17
18
  offload_helper.py
18
19
  providers.py
19
20
  pyproject.toml
@@ -138,20 +139,37 @@ task/__init__.py
138
139
  task/store.py
139
140
  task/tools.py
140
141
  task/types.py
142
+ tests/test_afk_yolo.py
143
+ tests/test_approval_runtime.py
144
+ tests/test_background_task_tools.py
145
+ tests/test_background_tasks.py
141
146
  tests/test_checkpoint.py
147
+ tests/test_clipboard_utils.py
142
148
  tests/test_compaction.py
143
149
  tests/test_diff_view.py
150
+ tests/test_diff_visualization.py
151
+ tests/test_display_blocks.py
152
+ tests/test_export_import.py
153
+ tests/test_hook_engine.py
144
154
  tests/test_injection_fix.py
145
155
  tests/test_license.py
146
156
  tests/test_mcp.py
147
157
  tests/test_memory.py
158
+ tests/test_notification_manager.py
148
159
  tests/test_plugin.py
160
+ tests/test_session_fork.py
161
+ tests/test_shell_mode.py
149
162
  tests/test_skills.py
163
+ tests/test_steer_input.py
150
164
  tests/test_subagent.py
151
165
  tests/test_task.py
152
166
  tests/test_telegram_buffer.py
167
+ tests/test_think_tool.py
168
+ tests/test_todo_tool.py
169
+ tests/test_todo_visualization.py
153
170
  tests/test_tool_registry.py
154
171
  tests/test_voice.py
172
+ tests/test_wire_events.py
155
173
  ui/__init__.py
156
174
  ui/input.py
157
175
  ui/render.py