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.
- {dulus-0.2.3/dulus.egg-info → dulus-0.2.5}/PKG-INFO +1 -1
- {dulus-0.2.3 → dulus-0.2.5}/claude_code_watcher.py +2 -1
- {dulus-0.2.3 → dulus-0.2.5/dulus.egg-info}/PKG-INFO +1 -1
- {dulus-0.2.3 → dulus-0.2.5}/dulus.py +5 -1
- {dulus-0.2.3 → dulus-0.2.5}/providers.py +15 -6
- {dulus-0.2.3 → dulus-0.2.5}/pyproject.toml +1 -1
- {dulus-0.2.3 → dulus-0.2.5}/LICENSE +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/MANIFEST.in +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/README.md +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/agent.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/backend/__init__.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/backend/compressor.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/backend/context.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/backend/githook.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/backend/marketplace.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/backend/mempalace_bridge.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/backend/personas.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/backend/plugins.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/backend/server.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/backend/tasks.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/batch_api.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/checkpoint/__init__.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/checkpoint/hooks.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/checkpoint/store.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/checkpoint/types.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/clipboard_utils.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/cloudsave.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/common.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/compaction.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/config.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/context.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/data/__init__.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/data/active_persona.json +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/data/context.json +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/data/marketplace.json +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/data/personas.json +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/data/tasks.json +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/docs/README.md +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/docs/__init__.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/docs/api.html +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/docs/architecture.md +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/docs/azure-speech-template.json +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/docs/dashboard/index.html +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/docs/divider.svg +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/docs/generate.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/docs/hero.svg +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/docs/index.html +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/docs/news.md +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/docs/nvidia-models.svg +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/docs/particle-playground.html +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/docs/personas/index.html +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/docs/preview.html +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/docs/sec-agents.svg +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/docs/sec-brainstorm.svg +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/docs/sec-bridges.svg +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/docs/sec-features.svg +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/docs/sec-freetier.svg +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/docs/sec-memory.svg +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/docs/sec-models.svg +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/docs/sec-perms.svg +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/docs/sec-plugins.svg +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/docs/sec-quickstart.svg +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/docs/sec-ssj.svg +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/docs/spinners.svg +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/docs/split-pane.svg +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/docs/terminal-boot.svg +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/docs/uploads/particle-playground.html +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/dulus.egg-info/SOURCES.txt +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/dulus.egg-info/dependency_links.txt +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/dulus.egg-info/entry_points.txt +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/dulus.egg-info/requires.txt +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/dulus.egg-info/top_level.txt +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/dulus_gui.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/dulus_mcp/__init__.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/dulus_mcp/client.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/dulus_mcp/config.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/dulus_mcp/tools.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/dulus_mcp/types.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/gui/__init__.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/gui/agent_bridge.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/gui/chat_widget.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/gui/main_window.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/gui/personas.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/gui/session_utils.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/gui/settings_dialog.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/gui/sidebar.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/gui/tasks_view.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/gui/themes.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/gui/tool_panel.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/input.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/license_manager.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/memory/__init__.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/memory/audit.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/memory/consolidator.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/memory/context.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/memory/offload.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/memory/palace.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/memory/scan.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/memory/sessions.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/memory/store.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/memory/tools.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/memory/types.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/memory/vector_search.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/multi_agent/__init__.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/multi_agent/subagent.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/multi_agent/tools.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/offload_helper.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/plugin/__init__.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/plugin/autoadapter.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/plugin/loader.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/plugin/recommend.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/plugin/store.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/plugin/types.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/setup.cfg +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/skill/__init__.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/skill/builtin.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/skill/clawhub.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/skill/executor.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/skill/loader.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/skill/tools.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/skills.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/spinner.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/string_utils.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/subagent.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/task/__init__.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/task/store.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/task/tools.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/task/types.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/tests/test_checkpoint.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/tests/test_compaction.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/tests/test_diff_view.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/tests/test_injection_fix.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/tests/test_license.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/tests/test_mcp.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/tests/test_memory.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/tests/test_plugin.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/tests/test_skills.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/tests/test_subagent.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/tests/test_task.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/tests/test_telegram_buffer.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/tests/test_tool_registry.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/tests/test_voice.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/tmux_offloader.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/tmux_tools.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/tool_registry.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/tools.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/ui/__init__.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/ui/input.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/ui/render.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/voice/__init__.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/voice/keyterms.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/voice/recorder.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/voice/stt.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/voice/tts.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/webchat.py +0 -0
- {dulus-0.2.3 → dulus-0.2.5}/webchat_server.py +0 -0
|
@@ -23,7 +23,8 @@ import argparse
|
|
|
23
23
|
from pathlib import Path
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
|
|
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.
|
|
@@ -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
|
-
|
|
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
|
|
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
|
-
|
|
1183
|
-
|
|
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
|
-
|
|
1191
|
-
|
|
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.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|