dulus 0.2.4__tar.gz → 0.2.5__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.4/dulus.egg-info → dulus-0.2.5}/PKG-INFO +1 -1
  2. {dulus-0.2.4 → dulus-0.2.5/dulus.egg-info}/PKG-INFO +1 -1
  3. {dulus-0.2.4 → dulus-0.2.5}/dulus.py +5 -1
  4. {dulus-0.2.4 → dulus-0.2.5}/providers.py +14 -6
  5. {dulus-0.2.4 → dulus-0.2.5}/pyproject.toml +1 -1
  6. {dulus-0.2.4 → dulus-0.2.5}/LICENSE +0 -0
  7. {dulus-0.2.4 → dulus-0.2.5}/MANIFEST.in +0 -0
  8. {dulus-0.2.4 → dulus-0.2.5}/README.md +0 -0
  9. {dulus-0.2.4 → dulus-0.2.5}/agent.py +0 -0
  10. {dulus-0.2.4 → dulus-0.2.5}/backend/__init__.py +0 -0
  11. {dulus-0.2.4 → dulus-0.2.5}/backend/compressor.py +0 -0
  12. {dulus-0.2.4 → dulus-0.2.5}/backend/context.py +0 -0
  13. {dulus-0.2.4 → dulus-0.2.5}/backend/githook.py +0 -0
  14. {dulus-0.2.4 → dulus-0.2.5}/backend/marketplace.py +0 -0
  15. {dulus-0.2.4 → dulus-0.2.5}/backend/mempalace_bridge.py +0 -0
  16. {dulus-0.2.4 → dulus-0.2.5}/backend/personas.py +0 -0
  17. {dulus-0.2.4 → dulus-0.2.5}/backend/plugins.py +0 -0
  18. {dulus-0.2.4 → dulus-0.2.5}/backend/server.py +0 -0
  19. {dulus-0.2.4 → dulus-0.2.5}/backend/tasks.py +0 -0
  20. {dulus-0.2.4 → dulus-0.2.5}/batch_api.py +0 -0
  21. {dulus-0.2.4 → dulus-0.2.5}/checkpoint/__init__.py +0 -0
  22. {dulus-0.2.4 → dulus-0.2.5}/checkpoint/hooks.py +0 -0
  23. {dulus-0.2.4 → dulus-0.2.5}/checkpoint/store.py +0 -0
  24. {dulus-0.2.4 → dulus-0.2.5}/checkpoint/types.py +0 -0
  25. {dulus-0.2.4 → dulus-0.2.5}/claude_code_watcher.py +0 -0
  26. {dulus-0.2.4 → dulus-0.2.5}/clipboard_utils.py +0 -0
  27. {dulus-0.2.4 → dulus-0.2.5}/cloudsave.py +0 -0
  28. {dulus-0.2.4 → dulus-0.2.5}/common.py +0 -0
  29. {dulus-0.2.4 → dulus-0.2.5}/compaction.py +0 -0
  30. {dulus-0.2.4 → dulus-0.2.5}/config.py +0 -0
  31. {dulus-0.2.4 → dulus-0.2.5}/context.py +0 -0
  32. {dulus-0.2.4 → dulus-0.2.5}/data/__init__.py +0 -0
  33. {dulus-0.2.4 → dulus-0.2.5}/data/active_persona.json +0 -0
  34. {dulus-0.2.4 → dulus-0.2.5}/data/context.json +0 -0
  35. {dulus-0.2.4 → dulus-0.2.5}/data/marketplace.json +0 -0
  36. {dulus-0.2.4 → dulus-0.2.5}/data/personas.json +0 -0
  37. {dulus-0.2.4 → dulus-0.2.5}/data/tasks.json +0 -0
  38. {dulus-0.2.4 → dulus-0.2.5}/docs/README.md +0 -0
  39. {dulus-0.2.4 → dulus-0.2.5}/docs/__init__.py +0 -0
  40. {dulus-0.2.4 → dulus-0.2.5}/docs/api.html +0 -0
  41. {dulus-0.2.4 → dulus-0.2.5}/docs/architecture.md +0 -0
  42. {dulus-0.2.4 → dulus-0.2.5}/docs/azure-speech-template.json +0 -0
  43. {dulus-0.2.4 → dulus-0.2.5}/docs/dashboard/index.html +0 -0
  44. {dulus-0.2.4 → dulus-0.2.5}/docs/divider.svg +0 -0
  45. {dulus-0.2.4 → dulus-0.2.5}/docs/generate.py +0 -0
  46. {dulus-0.2.4 → dulus-0.2.5}/docs/hero.svg +0 -0
  47. {dulus-0.2.4 → dulus-0.2.5}/docs/index.html +0 -0
  48. {dulus-0.2.4 → dulus-0.2.5}/docs/news.md +0 -0
  49. {dulus-0.2.4 → dulus-0.2.5}/docs/nvidia-models.svg +0 -0
  50. {dulus-0.2.4 → dulus-0.2.5}/docs/particle-playground.html +0 -0
  51. {dulus-0.2.4 → dulus-0.2.5}/docs/personas/index.html +0 -0
  52. {dulus-0.2.4 → dulus-0.2.5}/docs/preview.html +0 -0
  53. {dulus-0.2.4 → dulus-0.2.5}/docs/sec-agents.svg +0 -0
  54. {dulus-0.2.4 → dulus-0.2.5}/docs/sec-brainstorm.svg +0 -0
  55. {dulus-0.2.4 → dulus-0.2.5}/docs/sec-bridges.svg +0 -0
  56. {dulus-0.2.4 → dulus-0.2.5}/docs/sec-features.svg +0 -0
  57. {dulus-0.2.4 → dulus-0.2.5}/docs/sec-freetier.svg +0 -0
  58. {dulus-0.2.4 → dulus-0.2.5}/docs/sec-memory.svg +0 -0
  59. {dulus-0.2.4 → dulus-0.2.5}/docs/sec-models.svg +0 -0
  60. {dulus-0.2.4 → dulus-0.2.5}/docs/sec-perms.svg +0 -0
  61. {dulus-0.2.4 → dulus-0.2.5}/docs/sec-plugins.svg +0 -0
  62. {dulus-0.2.4 → dulus-0.2.5}/docs/sec-quickstart.svg +0 -0
  63. {dulus-0.2.4 → dulus-0.2.5}/docs/sec-ssj.svg +0 -0
  64. {dulus-0.2.4 → dulus-0.2.5}/docs/spinners.svg +0 -0
  65. {dulus-0.2.4 → dulus-0.2.5}/docs/split-pane.svg +0 -0
  66. {dulus-0.2.4 → dulus-0.2.5}/docs/terminal-boot.svg +0 -0
  67. {dulus-0.2.4 → dulus-0.2.5}/docs/uploads/particle-playground.html +0 -0
  68. {dulus-0.2.4 → dulus-0.2.5}/dulus.egg-info/SOURCES.txt +0 -0
  69. {dulus-0.2.4 → dulus-0.2.5}/dulus.egg-info/dependency_links.txt +0 -0
  70. {dulus-0.2.4 → dulus-0.2.5}/dulus.egg-info/entry_points.txt +0 -0
  71. {dulus-0.2.4 → dulus-0.2.5}/dulus.egg-info/requires.txt +0 -0
  72. {dulus-0.2.4 → dulus-0.2.5}/dulus.egg-info/top_level.txt +0 -0
  73. {dulus-0.2.4 → dulus-0.2.5}/dulus_gui.py +0 -0
  74. {dulus-0.2.4 → dulus-0.2.5}/dulus_mcp/__init__.py +0 -0
  75. {dulus-0.2.4 → dulus-0.2.5}/dulus_mcp/client.py +0 -0
  76. {dulus-0.2.4 → dulus-0.2.5}/dulus_mcp/config.py +0 -0
  77. {dulus-0.2.4 → dulus-0.2.5}/dulus_mcp/tools.py +0 -0
  78. {dulus-0.2.4 → dulus-0.2.5}/dulus_mcp/types.py +0 -0
  79. {dulus-0.2.4 → dulus-0.2.5}/gui/__init__.py +0 -0
  80. {dulus-0.2.4 → dulus-0.2.5}/gui/agent_bridge.py +0 -0
  81. {dulus-0.2.4 → dulus-0.2.5}/gui/chat_widget.py +0 -0
  82. {dulus-0.2.4 → dulus-0.2.5}/gui/main_window.py +0 -0
  83. {dulus-0.2.4 → dulus-0.2.5}/gui/personas.py +0 -0
  84. {dulus-0.2.4 → dulus-0.2.5}/gui/session_utils.py +0 -0
  85. {dulus-0.2.4 → dulus-0.2.5}/gui/settings_dialog.py +0 -0
  86. {dulus-0.2.4 → dulus-0.2.5}/gui/sidebar.py +0 -0
  87. {dulus-0.2.4 → dulus-0.2.5}/gui/tasks_view.py +0 -0
  88. {dulus-0.2.4 → dulus-0.2.5}/gui/themes.py +0 -0
  89. {dulus-0.2.4 → dulus-0.2.5}/gui/tool_panel.py +0 -0
  90. {dulus-0.2.4 → dulus-0.2.5}/input.py +0 -0
  91. {dulus-0.2.4 → dulus-0.2.5}/license_manager.py +0 -0
  92. {dulus-0.2.4 → dulus-0.2.5}/memory/__init__.py +0 -0
  93. {dulus-0.2.4 → dulus-0.2.5}/memory/audit.py +0 -0
  94. {dulus-0.2.4 → dulus-0.2.5}/memory/consolidator.py +0 -0
  95. {dulus-0.2.4 → dulus-0.2.5}/memory/context.py +0 -0
  96. {dulus-0.2.4 → dulus-0.2.5}/memory/offload.py +0 -0
  97. {dulus-0.2.4 → dulus-0.2.5}/memory/palace.py +0 -0
  98. {dulus-0.2.4 → dulus-0.2.5}/memory/scan.py +0 -0
  99. {dulus-0.2.4 → dulus-0.2.5}/memory/sessions.py +0 -0
  100. {dulus-0.2.4 → dulus-0.2.5}/memory/store.py +0 -0
  101. {dulus-0.2.4 → dulus-0.2.5}/memory/tools.py +0 -0
  102. {dulus-0.2.4 → dulus-0.2.5}/memory/types.py +0 -0
  103. {dulus-0.2.4 → dulus-0.2.5}/memory/vector_search.py +0 -0
  104. {dulus-0.2.4 → dulus-0.2.5}/multi_agent/__init__.py +0 -0
  105. {dulus-0.2.4 → dulus-0.2.5}/multi_agent/subagent.py +0 -0
  106. {dulus-0.2.4 → dulus-0.2.5}/multi_agent/tools.py +0 -0
  107. {dulus-0.2.4 → dulus-0.2.5}/offload_helper.py +0 -0
  108. {dulus-0.2.4 → dulus-0.2.5}/plugin/__init__.py +0 -0
  109. {dulus-0.2.4 → dulus-0.2.5}/plugin/autoadapter.py +0 -0
  110. {dulus-0.2.4 → dulus-0.2.5}/plugin/loader.py +0 -0
  111. {dulus-0.2.4 → dulus-0.2.5}/plugin/recommend.py +0 -0
  112. {dulus-0.2.4 → dulus-0.2.5}/plugin/store.py +0 -0
  113. {dulus-0.2.4 → dulus-0.2.5}/plugin/types.py +0 -0
  114. {dulus-0.2.4 → dulus-0.2.5}/setup.cfg +0 -0
  115. {dulus-0.2.4 → dulus-0.2.5}/skill/__init__.py +0 -0
  116. {dulus-0.2.4 → dulus-0.2.5}/skill/builtin.py +0 -0
  117. {dulus-0.2.4 → dulus-0.2.5}/skill/clawhub.py +0 -0
  118. {dulus-0.2.4 → dulus-0.2.5}/skill/executor.py +0 -0
  119. {dulus-0.2.4 → dulus-0.2.5}/skill/loader.py +0 -0
  120. {dulus-0.2.4 → dulus-0.2.5}/skill/tools.py +0 -0
  121. {dulus-0.2.4 → dulus-0.2.5}/skills.py +0 -0
  122. {dulus-0.2.4 → dulus-0.2.5}/spinner.py +0 -0
  123. {dulus-0.2.4 → dulus-0.2.5}/string_utils.py +0 -0
  124. {dulus-0.2.4 → dulus-0.2.5}/subagent.py +0 -0
  125. {dulus-0.2.4 → dulus-0.2.5}/task/__init__.py +0 -0
  126. {dulus-0.2.4 → dulus-0.2.5}/task/store.py +0 -0
  127. {dulus-0.2.4 → dulus-0.2.5}/task/tools.py +0 -0
  128. {dulus-0.2.4 → dulus-0.2.5}/task/types.py +0 -0
  129. {dulus-0.2.4 → dulus-0.2.5}/tests/test_checkpoint.py +0 -0
  130. {dulus-0.2.4 → dulus-0.2.5}/tests/test_compaction.py +0 -0
  131. {dulus-0.2.4 → dulus-0.2.5}/tests/test_diff_view.py +0 -0
  132. {dulus-0.2.4 → dulus-0.2.5}/tests/test_injection_fix.py +0 -0
  133. {dulus-0.2.4 → dulus-0.2.5}/tests/test_license.py +0 -0
  134. {dulus-0.2.4 → dulus-0.2.5}/tests/test_mcp.py +0 -0
  135. {dulus-0.2.4 → dulus-0.2.5}/tests/test_memory.py +0 -0
  136. {dulus-0.2.4 → dulus-0.2.5}/tests/test_plugin.py +0 -0
  137. {dulus-0.2.4 → dulus-0.2.5}/tests/test_skills.py +0 -0
  138. {dulus-0.2.4 → dulus-0.2.5}/tests/test_subagent.py +0 -0
  139. {dulus-0.2.4 → dulus-0.2.5}/tests/test_task.py +0 -0
  140. {dulus-0.2.4 → dulus-0.2.5}/tests/test_telegram_buffer.py +0 -0
  141. {dulus-0.2.4 → dulus-0.2.5}/tests/test_tool_registry.py +0 -0
  142. {dulus-0.2.4 → dulus-0.2.5}/tests/test_voice.py +0 -0
  143. {dulus-0.2.4 → dulus-0.2.5}/tmux_offloader.py +0 -0
  144. {dulus-0.2.4 → dulus-0.2.5}/tmux_tools.py +0 -0
  145. {dulus-0.2.4 → dulus-0.2.5}/tool_registry.py +0 -0
  146. {dulus-0.2.4 → dulus-0.2.5}/tools.py +0 -0
  147. {dulus-0.2.4 → dulus-0.2.5}/ui/__init__.py +0 -0
  148. {dulus-0.2.4 → dulus-0.2.5}/ui/input.py +0 -0
  149. {dulus-0.2.4 → dulus-0.2.5}/ui/render.py +0 -0
  150. {dulus-0.2.4 → dulus-0.2.5}/voice/__init__.py +0 -0
  151. {dulus-0.2.4 → dulus-0.2.5}/voice/keyterms.py +0 -0
  152. {dulus-0.2.4 → dulus-0.2.5}/voice/recorder.py +0 -0
  153. {dulus-0.2.4 → dulus-0.2.5}/voice/stt.py +0 -0
  154. {dulus-0.2.4 → dulus-0.2.5}/voice/tts.py +0 -0
  155. {dulus-0.2.4 → dulus-0.2.5}/webchat.py +0 -0
  156. {dulus-0.2.4 → dulus-0.2.5}/webchat_server.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dulus
3
- Version: 0.2.4
3
+ Version: 0.2.5
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: MIT
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dulus
3
- Version: 0.2.4
3
+ Version: 0.2.5
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: MIT
@@ -99,7 +99,8 @@ Slash commands in REPL:
99
99
  /kill_tmux Kill all stuck tmux/psmux sessions (cleanup)
100
100
  /batch Manage Kimi Batch tasks (list, status, fetch)
101
101
  /roundtable Start a multi-model roundtable discussion
102
- /harvest Harvest Claude.ai cookies
102
+ /harvest Harvest Claude.ai cookies (alias: /harvest-claude)
103
+ /harvest-claude Harvest Claude.ai cookies
103
104
  /harvest-kimi Harvest Kimi.com (Consumer) session/gRPC tokens
104
105
  /harvest-gemini Harvest Gemini (Consumer) session tokens
105
106
  /harvest-qwen Harvest Qwen (chat.qwen.ai) session tokens
@@ -6372,6 +6373,8 @@ COMMANDS = {
6372
6373
  "history": cmd_history,
6373
6374
  "mem_palace": cmd_mem_palace,
6374
6375
  "harvest": cmd_harvest,
6376
+ "harvest-claude": cmd_harvest,
6377
+ "claude-harvest": cmd_harvest,
6375
6378
  "harvest-kimi": cmd_harvest_kimi,
6376
6379
  "harvest-gemini": cmd_harvest_gemini,
6377
6380
  "gemini-harvest": cmd_harvest_gemini,
@@ -6526,6 +6529,7 @@ _CMD_META: dict[str, tuple[str, list[str]]] = {
6526
6529
  "claude_chats": ("List Claude.ai conversations", ["all"]),
6527
6530
  "gemini_chats": ("Manage Gemini Web conversations", ["new"]),
6528
6531
  "gemini_harvest": ("Harvest Gemini Web cookies (alias)", []),
6532
+ "harvest-claude": ("Harvest Claude.ai cookies (alias)", []),
6529
6533
  "webchat": ("Spawn web chat UI", ["stop"]),
6530
6534
  "gui": ("Launch desktop GUI", []),
6531
6535
  }
@@ -1065,8 +1065,12 @@ def stream_claude_code(
1065
1065
  import subprocess as _sp
1066
1066
  from pathlib import Path as _Path
1067
1067
 
1068
- _cwd_slug = str(_Path.cwd()).replace(":", "-").replace("\\", "-").replace("/", "-")
1069
- _session_dir = _Path.home() / ".claude" / "projects" / _cwd_slug
1068
+ _project_override = config.get("claude_code_project_dir", "").strip()
1069
+ if _project_override:
1070
+ _slug = _project_override.replace(":", "-").replace("\\", "-").replace("/", "-")
1071
+ else:
1072
+ _slug = str(_Path.cwd()).replace(":", "-").replace("\\", "-").replace("/", "-")
1073
+ _session_dir = _Path.home() / ".claude" / "projects" / _slug
1070
1074
  _jsonl_files = sorted(_session_dir.glob("*.jsonl"), key=lambda f: f.stat().st_mtime, reverse=True)
1071
1075
  _jsonl_path = _jsonl_files[0] if _jsonl_files else None
1072
1076
 
@@ -1180,16 +1184,20 @@ def stream_claude_code(
1180
1184
  # If we have text and silence window passed — flush
1181
1185
  if _accumulated and (_time.time() - _last_new_entry_time) >= _silence:
1182
1186
  text = "\n\n".join(_accumulated)
1183
- yield TextChunk(text)
1184
- yield AssistantTurn(text, [], 0, 0)
1187
+ _parser = WebToolParser(auto_wrap_json=True)
1188
+ _display = _parser.parse_chunk(text) + _parser.flush()
1189
+ yield TextChunk(_display)
1190
+ yield AssistantTurn(_display, _parser.tool_calls, 0, 0)
1185
1191
  return
1186
1192
 
1187
1193
  _time.sleep(_poll)
1188
1194
 
1189
1195
  if _accumulated:
1190
1196
  text = "\n\n".join(_accumulated)
1191
- yield TextChunk(text)
1192
- yield AssistantTurn(text, [], 0, 0)
1197
+ _parser = WebToolParser(auto_wrap_json=True)
1198
+ _display = _parser.parse_chunk(text) + _parser.flush()
1199
+ yield TextChunk(_display)
1200
+ yield AssistantTurn(_display, _parser.tool_calls, 0, 0)
1193
1201
  return
1194
1202
 
1195
1203
  msg = "[claude-code] Timeout waiting for assistant response (90s)."
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "dulus"
7
- version = "0.2.4"
7
+ version = "0.2.5"
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"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes