dulus 0.2.3__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.3/dulus.egg-info → dulus-0.2.5}/PKG-INFO +1 -1
  2. {dulus-0.2.3 → dulus-0.2.5}/claude_code_watcher.py +2 -1
  3. {dulus-0.2.3 → dulus-0.2.5/dulus.egg-info}/PKG-INFO +1 -1
  4. {dulus-0.2.3 → dulus-0.2.5}/dulus.py +5 -1
  5. {dulus-0.2.3 → dulus-0.2.5}/providers.py +15 -6
  6. {dulus-0.2.3 → dulus-0.2.5}/pyproject.toml +1 -1
  7. {dulus-0.2.3 → dulus-0.2.5}/LICENSE +0 -0
  8. {dulus-0.2.3 → dulus-0.2.5}/MANIFEST.in +0 -0
  9. {dulus-0.2.3 → dulus-0.2.5}/README.md +0 -0
  10. {dulus-0.2.3 → dulus-0.2.5}/agent.py +0 -0
  11. {dulus-0.2.3 → dulus-0.2.5}/backend/__init__.py +0 -0
  12. {dulus-0.2.3 → dulus-0.2.5}/backend/compressor.py +0 -0
  13. {dulus-0.2.3 → dulus-0.2.5}/backend/context.py +0 -0
  14. {dulus-0.2.3 → dulus-0.2.5}/backend/githook.py +0 -0
  15. {dulus-0.2.3 → dulus-0.2.5}/backend/marketplace.py +0 -0
  16. {dulus-0.2.3 → dulus-0.2.5}/backend/mempalace_bridge.py +0 -0
  17. {dulus-0.2.3 → dulus-0.2.5}/backend/personas.py +0 -0
  18. {dulus-0.2.3 → dulus-0.2.5}/backend/plugins.py +0 -0
  19. {dulus-0.2.3 → dulus-0.2.5}/backend/server.py +0 -0
  20. {dulus-0.2.3 → dulus-0.2.5}/backend/tasks.py +0 -0
  21. {dulus-0.2.3 → dulus-0.2.5}/batch_api.py +0 -0
  22. {dulus-0.2.3 → dulus-0.2.5}/checkpoint/__init__.py +0 -0
  23. {dulus-0.2.3 → dulus-0.2.5}/checkpoint/hooks.py +0 -0
  24. {dulus-0.2.3 → dulus-0.2.5}/checkpoint/store.py +0 -0
  25. {dulus-0.2.3 → dulus-0.2.5}/checkpoint/types.py +0 -0
  26. {dulus-0.2.3 → dulus-0.2.5}/clipboard_utils.py +0 -0
  27. {dulus-0.2.3 → dulus-0.2.5}/cloudsave.py +0 -0
  28. {dulus-0.2.3 → dulus-0.2.5}/common.py +0 -0
  29. {dulus-0.2.3 → dulus-0.2.5}/compaction.py +0 -0
  30. {dulus-0.2.3 → dulus-0.2.5}/config.py +0 -0
  31. {dulus-0.2.3 → dulus-0.2.5}/context.py +0 -0
  32. {dulus-0.2.3 → dulus-0.2.5}/data/__init__.py +0 -0
  33. {dulus-0.2.3 → dulus-0.2.5}/data/active_persona.json +0 -0
  34. {dulus-0.2.3 → dulus-0.2.5}/data/context.json +0 -0
  35. {dulus-0.2.3 → dulus-0.2.5}/data/marketplace.json +0 -0
  36. {dulus-0.2.3 → dulus-0.2.5}/data/personas.json +0 -0
  37. {dulus-0.2.3 → dulus-0.2.5}/data/tasks.json +0 -0
  38. {dulus-0.2.3 → dulus-0.2.5}/docs/README.md +0 -0
  39. {dulus-0.2.3 → dulus-0.2.5}/docs/__init__.py +0 -0
  40. {dulus-0.2.3 → dulus-0.2.5}/docs/api.html +0 -0
  41. {dulus-0.2.3 → dulus-0.2.5}/docs/architecture.md +0 -0
  42. {dulus-0.2.3 → dulus-0.2.5}/docs/azure-speech-template.json +0 -0
  43. {dulus-0.2.3 → dulus-0.2.5}/docs/dashboard/index.html +0 -0
  44. {dulus-0.2.3 → dulus-0.2.5}/docs/divider.svg +0 -0
  45. {dulus-0.2.3 → dulus-0.2.5}/docs/generate.py +0 -0
  46. {dulus-0.2.3 → dulus-0.2.5}/docs/hero.svg +0 -0
  47. {dulus-0.2.3 → dulus-0.2.5}/docs/index.html +0 -0
  48. {dulus-0.2.3 → dulus-0.2.5}/docs/news.md +0 -0
  49. {dulus-0.2.3 → dulus-0.2.5}/docs/nvidia-models.svg +0 -0
  50. {dulus-0.2.3 → dulus-0.2.5}/docs/particle-playground.html +0 -0
  51. {dulus-0.2.3 → dulus-0.2.5}/docs/personas/index.html +0 -0
  52. {dulus-0.2.3 → dulus-0.2.5}/docs/preview.html +0 -0
  53. {dulus-0.2.3 → dulus-0.2.5}/docs/sec-agents.svg +0 -0
  54. {dulus-0.2.3 → dulus-0.2.5}/docs/sec-brainstorm.svg +0 -0
  55. {dulus-0.2.3 → dulus-0.2.5}/docs/sec-bridges.svg +0 -0
  56. {dulus-0.2.3 → dulus-0.2.5}/docs/sec-features.svg +0 -0
  57. {dulus-0.2.3 → dulus-0.2.5}/docs/sec-freetier.svg +0 -0
  58. {dulus-0.2.3 → dulus-0.2.5}/docs/sec-memory.svg +0 -0
  59. {dulus-0.2.3 → dulus-0.2.5}/docs/sec-models.svg +0 -0
  60. {dulus-0.2.3 → dulus-0.2.5}/docs/sec-perms.svg +0 -0
  61. {dulus-0.2.3 → dulus-0.2.5}/docs/sec-plugins.svg +0 -0
  62. {dulus-0.2.3 → dulus-0.2.5}/docs/sec-quickstart.svg +0 -0
  63. {dulus-0.2.3 → dulus-0.2.5}/docs/sec-ssj.svg +0 -0
  64. {dulus-0.2.3 → dulus-0.2.5}/docs/spinners.svg +0 -0
  65. {dulus-0.2.3 → dulus-0.2.5}/docs/split-pane.svg +0 -0
  66. {dulus-0.2.3 → dulus-0.2.5}/docs/terminal-boot.svg +0 -0
  67. {dulus-0.2.3 → dulus-0.2.5}/docs/uploads/particle-playground.html +0 -0
  68. {dulus-0.2.3 → dulus-0.2.5}/dulus.egg-info/SOURCES.txt +0 -0
  69. {dulus-0.2.3 → dulus-0.2.5}/dulus.egg-info/dependency_links.txt +0 -0
  70. {dulus-0.2.3 → dulus-0.2.5}/dulus.egg-info/entry_points.txt +0 -0
  71. {dulus-0.2.3 → dulus-0.2.5}/dulus.egg-info/requires.txt +0 -0
  72. {dulus-0.2.3 → dulus-0.2.5}/dulus.egg-info/top_level.txt +0 -0
  73. {dulus-0.2.3 → dulus-0.2.5}/dulus_gui.py +0 -0
  74. {dulus-0.2.3 → dulus-0.2.5}/dulus_mcp/__init__.py +0 -0
  75. {dulus-0.2.3 → dulus-0.2.5}/dulus_mcp/client.py +0 -0
  76. {dulus-0.2.3 → dulus-0.2.5}/dulus_mcp/config.py +0 -0
  77. {dulus-0.2.3 → dulus-0.2.5}/dulus_mcp/tools.py +0 -0
  78. {dulus-0.2.3 → dulus-0.2.5}/dulus_mcp/types.py +0 -0
  79. {dulus-0.2.3 → dulus-0.2.5}/gui/__init__.py +0 -0
  80. {dulus-0.2.3 → dulus-0.2.5}/gui/agent_bridge.py +0 -0
  81. {dulus-0.2.3 → dulus-0.2.5}/gui/chat_widget.py +0 -0
  82. {dulus-0.2.3 → dulus-0.2.5}/gui/main_window.py +0 -0
  83. {dulus-0.2.3 → dulus-0.2.5}/gui/personas.py +0 -0
  84. {dulus-0.2.3 → dulus-0.2.5}/gui/session_utils.py +0 -0
  85. {dulus-0.2.3 → dulus-0.2.5}/gui/settings_dialog.py +0 -0
  86. {dulus-0.2.3 → dulus-0.2.5}/gui/sidebar.py +0 -0
  87. {dulus-0.2.3 → dulus-0.2.5}/gui/tasks_view.py +0 -0
  88. {dulus-0.2.3 → dulus-0.2.5}/gui/themes.py +0 -0
  89. {dulus-0.2.3 → dulus-0.2.5}/gui/tool_panel.py +0 -0
  90. {dulus-0.2.3 → dulus-0.2.5}/input.py +0 -0
  91. {dulus-0.2.3 → dulus-0.2.5}/license_manager.py +0 -0
  92. {dulus-0.2.3 → dulus-0.2.5}/memory/__init__.py +0 -0
  93. {dulus-0.2.3 → dulus-0.2.5}/memory/audit.py +0 -0
  94. {dulus-0.2.3 → dulus-0.2.5}/memory/consolidator.py +0 -0
  95. {dulus-0.2.3 → dulus-0.2.5}/memory/context.py +0 -0
  96. {dulus-0.2.3 → dulus-0.2.5}/memory/offload.py +0 -0
  97. {dulus-0.2.3 → dulus-0.2.5}/memory/palace.py +0 -0
  98. {dulus-0.2.3 → dulus-0.2.5}/memory/scan.py +0 -0
  99. {dulus-0.2.3 → dulus-0.2.5}/memory/sessions.py +0 -0
  100. {dulus-0.2.3 → dulus-0.2.5}/memory/store.py +0 -0
  101. {dulus-0.2.3 → dulus-0.2.5}/memory/tools.py +0 -0
  102. {dulus-0.2.3 → dulus-0.2.5}/memory/types.py +0 -0
  103. {dulus-0.2.3 → dulus-0.2.5}/memory/vector_search.py +0 -0
  104. {dulus-0.2.3 → dulus-0.2.5}/multi_agent/__init__.py +0 -0
  105. {dulus-0.2.3 → dulus-0.2.5}/multi_agent/subagent.py +0 -0
  106. {dulus-0.2.3 → dulus-0.2.5}/multi_agent/tools.py +0 -0
  107. {dulus-0.2.3 → dulus-0.2.5}/offload_helper.py +0 -0
  108. {dulus-0.2.3 → dulus-0.2.5}/plugin/__init__.py +0 -0
  109. {dulus-0.2.3 → dulus-0.2.5}/plugin/autoadapter.py +0 -0
  110. {dulus-0.2.3 → dulus-0.2.5}/plugin/loader.py +0 -0
  111. {dulus-0.2.3 → dulus-0.2.5}/plugin/recommend.py +0 -0
  112. {dulus-0.2.3 → dulus-0.2.5}/plugin/store.py +0 -0
  113. {dulus-0.2.3 → dulus-0.2.5}/plugin/types.py +0 -0
  114. {dulus-0.2.3 → dulus-0.2.5}/setup.cfg +0 -0
  115. {dulus-0.2.3 → dulus-0.2.5}/skill/__init__.py +0 -0
  116. {dulus-0.2.3 → dulus-0.2.5}/skill/builtin.py +0 -0
  117. {dulus-0.2.3 → dulus-0.2.5}/skill/clawhub.py +0 -0
  118. {dulus-0.2.3 → dulus-0.2.5}/skill/executor.py +0 -0
  119. {dulus-0.2.3 → dulus-0.2.5}/skill/loader.py +0 -0
  120. {dulus-0.2.3 → dulus-0.2.5}/skill/tools.py +0 -0
  121. {dulus-0.2.3 → dulus-0.2.5}/skills.py +0 -0
  122. {dulus-0.2.3 → dulus-0.2.5}/spinner.py +0 -0
  123. {dulus-0.2.3 → dulus-0.2.5}/string_utils.py +0 -0
  124. {dulus-0.2.3 → dulus-0.2.5}/subagent.py +0 -0
  125. {dulus-0.2.3 → dulus-0.2.5}/task/__init__.py +0 -0
  126. {dulus-0.2.3 → dulus-0.2.5}/task/store.py +0 -0
  127. {dulus-0.2.3 → dulus-0.2.5}/task/tools.py +0 -0
  128. {dulus-0.2.3 → dulus-0.2.5}/task/types.py +0 -0
  129. {dulus-0.2.3 → dulus-0.2.5}/tests/test_checkpoint.py +0 -0
  130. {dulus-0.2.3 → dulus-0.2.5}/tests/test_compaction.py +0 -0
  131. {dulus-0.2.3 → dulus-0.2.5}/tests/test_diff_view.py +0 -0
  132. {dulus-0.2.3 → dulus-0.2.5}/tests/test_injection_fix.py +0 -0
  133. {dulus-0.2.3 → dulus-0.2.5}/tests/test_license.py +0 -0
  134. {dulus-0.2.3 → dulus-0.2.5}/tests/test_mcp.py +0 -0
  135. {dulus-0.2.3 → dulus-0.2.5}/tests/test_memory.py +0 -0
  136. {dulus-0.2.3 → dulus-0.2.5}/tests/test_plugin.py +0 -0
  137. {dulus-0.2.3 → dulus-0.2.5}/tests/test_skills.py +0 -0
  138. {dulus-0.2.3 → dulus-0.2.5}/tests/test_subagent.py +0 -0
  139. {dulus-0.2.3 → dulus-0.2.5}/tests/test_task.py +0 -0
  140. {dulus-0.2.3 → dulus-0.2.5}/tests/test_telegram_buffer.py +0 -0
  141. {dulus-0.2.3 → dulus-0.2.5}/tests/test_tool_registry.py +0 -0
  142. {dulus-0.2.3 → dulus-0.2.5}/tests/test_voice.py +0 -0
  143. {dulus-0.2.3 → dulus-0.2.5}/tmux_offloader.py +0 -0
  144. {dulus-0.2.3 → dulus-0.2.5}/tmux_tools.py +0 -0
  145. {dulus-0.2.3 → dulus-0.2.5}/tool_registry.py +0 -0
  146. {dulus-0.2.3 → dulus-0.2.5}/tools.py +0 -0
  147. {dulus-0.2.3 → dulus-0.2.5}/ui/__init__.py +0 -0
  148. {dulus-0.2.3 → dulus-0.2.5}/ui/input.py +0 -0
  149. {dulus-0.2.3 → dulus-0.2.5}/ui/render.py +0 -0
  150. {dulus-0.2.3 → dulus-0.2.5}/voice/__init__.py +0 -0
  151. {dulus-0.2.3 → dulus-0.2.5}/voice/keyterms.py +0 -0
  152. {dulus-0.2.3 → dulus-0.2.5}/voice/recorder.py +0 -0
  153. {dulus-0.2.3 → dulus-0.2.5}/voice/stt.py +0 -0
  154. {dulus-0.2.3 → dulus-0.2.5}/voice/tts.py +0 -0
  155. {dulus-0.2.3 → dulus-0.2.5}/webchat.py +0 -0
  156. {dulus-0.2.3 → 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.3
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
@@ -23,7 +23,8 @@ import argparse
23
23
  from pathlib import Path
24
24
 
25
25
 
26
- SESSION_DIR = Path.home() / ".claude" / "projects" / "C--Users-Admin-Desktop-DULUSV2"
26
+ _CWD_SLUG = str(Path.cwd()).replace(":", "-").replace("\\", "-").replace("/", "-")
27
+ SESSION_DIR = Path.home() / ".claude" / "projects" / _CWD_SLUG
27
28
 
28
29
  # How long to wait (seconds) with no new assistant entries before flushing
29
30
  # the accumulated turn as complete.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dulus
3
- Version: 0.2.3
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,7 +1065,12 @@ def stream_claude_code(
1065
1065
  import subprocess as _sp
1066
1066
  from pathlib import Path as _Path
1067
1067
 
1068
- _session_dir = _Path.home() / ".claude" / "projects" / "C--Users-Admin-Desktop-DULUSV2"
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
1069
1074
  _jsonl_files = sorted(_session_dir.glob("*.jsonl"), key=lambda f: f.stat().st_mtime, reverse=True)
1070
1075
  _jsonl_path = _jsonl_files[0] if _jsonl_files else None
1071
1076
 
@@ -1125,7 +1130,7 @@ def stream_claude_code(
1125
1130
 
1126
1131
  # ── Poll JSONL for new assistant entry ────────────────────────────────────
1127
1132
  if not _jsonl_path:
1128
- msg = "[claude-code] No JSONL session file found in ~/.claude/projects/C--Users-Admin-Desktop-DULUSV2"
1133
+ msg = f"[claude-code] No JSONL session file found in {_session_dir}"
1129
1134
  yield TextChunk(msg)
1130
1135
  yield AssistantTurn(msg, [], 0, 0, error=True)
1131
1136
  return
@@ -1179,16 +1184,20 @@ def stream_claude_code(
1179
1184
  # If we have text and silence window passed — flush
1180
1185
  if _accumulated and (_time.time() - _last_new_entry_time) >= _silence:
1181
1186
  text = "\n\n".join(_accumulated)
1182
- yield TextChunk(text)
1183
- 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)
1184
1191
  return
1185
1192
 
1186
1193
  _time.sleep(_poll)
1187
1194
 
1188
1195
  if _accumulated:
1189
1196
  text = "\n\n".join(_accumulated)
1190
- yield TextChunk(text)
1191
- 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)
1192
1201
  return
1193
1202
 
1194
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.3"
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