dulus 0.2.22__tar.gz → 0.2.23__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.22/dulus.egg-info → dulus-0.2.23}/PKG-INFO +2 -2
- {dulus-0.2.22 → dulus-0.2.23}/README.md +1 -1
- {dulus-0.2.22 → dulus-0.2.23}/context.py +1 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/news.md +5 -0
- {dulus-0.2.22 → dulus-0.2.23/dulus.egg-info}/PKG-INFO +2 -2
- {dulus-0.2.22 → dulus-0.2.23}/dulus.py +1 -1
- {dulus-0.2.22 → dulus-0.2.23}/plugin/autoadapter.py +7 -0
- {dulus-0.2.22 → dulus-0.2.23}/pyproject.toml +1 -1
- {dulus-0.2.22 → dulus-0.2.23}/LICENSE +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/MANIFEST.in +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/agent.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/backend/__init__.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/backend/compressor.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/backend/context.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/backend/githook.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/backend/marketplace.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/backend/mempalace_bridge.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/backend/personas.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/backend/plugins.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/backend/server.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/backend/tasks.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/batch_api.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/checkpoint/__init__.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/checkpoint/hooks.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/checkpoint/store.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/checkpoint/types.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/claude_code_watcher.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/clipboard_utils.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/cloudsave.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/common.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/compaction.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/config.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/data/__init__.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/data/active_persona.json +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/data/context.json +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/data/marketplace.json +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/data/personas.json +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/data/plugins/__init__.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/data/plugins/composio/__init__.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/data/plugins/composio/composio_plugin/__init__.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/data/plugins/composio/composio_plugin/session_manager.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/data/plugins/composio/composio_plugin/tool_generator.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/data/plugins/composio/plugin.json +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/data/plugins/composio/plugin_tool.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/data/tasks.json +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/README.md +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/__init__.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/api.html +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/architecture.md +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/azure-speech-template.json +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/dashboard/index.html +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/divider.svg +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/generate.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/hero.svg +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/index.html +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/nvidia-models.svg +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/particle-playground.html +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/personas/index.html +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/poetry-banner.png +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/preview.html +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/sec-agents.svg +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/sec-brainstorm.svg +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/sec-bridges.svg +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/sec-features.svg +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/sec-freetier.svg +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/sec-memory.svg +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/sec-models.svg +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/sec-perms.svg +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/sec-plugins.svg +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/sec-quickstart.svg +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/sec-ssj.svg +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/spinners.svg +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/split-pane.svg +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/terminal-boot.svg +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/docs/uploads/particle-playground.html +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/dulus.egg-info/SOURCES.txt +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/dulus.egg-info/dependency_links.txt +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/dulus.egg-info/entry_points.txt +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/dulus.egg-info/requires.txt +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/dulus.egg-info/top_level.txt +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/dulus_gui.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/dulus_mcp/__init__.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/dulus_mcp/client.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/dulus_mcp/config.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/dulus_mcp/tools.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/dulus_mcp/types.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/gui/__init__.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/gui/agent_bridge.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/gui/chat_widget.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/gui/main_window.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/gui/personas.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/gui/session_utils.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/gui/settings_dialog.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/gui/sidebar.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/gui/tasks_view.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/gui/themes.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/gui/tool_panel.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/input.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/license_manager.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/memory/__init__.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/memory/audit.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/memory/consolidator.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/memory/context.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/memory/offload.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/memory/palace.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/memory/scan.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/memory/sessions.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/memory/store.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/memory/tools.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/memory/types.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/memory/vector_search.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/multi_agent/__init__.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/multi_agent/subagent.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/multi_agent/tools.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/offload_helper.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/plugin/__init__.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/plugin/loader.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/plugin/recommend.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/plugin/store.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/plugin/types.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/providers.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/setup.cfg +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/skill/__init__.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/skill/builtin.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/skill/clawhub.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/skill/executor.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/skill/loader.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/skill/tools.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/skills.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/spinner.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/string_utils.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/subagent.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/task/__init__.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/task/store.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/task/tools.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/task/types.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/tests/test_checkpoint.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/tests/test_compaction.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/tests/test_diff_view.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/tests/test_injection_fix.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/tests/test_license.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/tests/test_mcp.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/tests/test_memory.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/tests/test_plugin.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/tests/test_skills.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/tests/test_subagent.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/tests/test_task.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/tests/test_telegram_buffer.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/tests/test_tool_registry.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/tests/test_voice.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/tmux_offloader.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/tmux_tools.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/tool_registry.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/tools.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/ui/__init__.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/ui/input.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/ui/render.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/voice/__init__.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/voice/keyterms.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/voice/recorder.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/voice/stt.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/voice/tts.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/webchat.py +0 -0
- {dulus-0.2.22 → dulus-0.2.23}/webchat_server.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dulus
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.23
|
|
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
|
|
@@ -69,7 +69,7 @@ SET /sticky_input ON since the first run for the best experience!
|
|
|
69
69
|
<a href="https://pypi.org/project/dulus/"><img src="https://static.pepy.tech/badge/dulus?style=flat-square" alt="downloads"/></a>
|
|
70
70
|
<img src="https://img.shields.io/badge/python-3.11+-ff6b1f?style=flat-square&labelColor=07070a" alt="python"/>
|
|
71
71
|
<img src="https://img.shields.io/badge/license-GPLv3-ff6b1f?style=flat-square&labelColor=07070a" alt="license"/>
|
|
72
|
-
<img src="https://img.shields.io/badge/version-v0.2.
|
|
72
|
+
<img src="https://img.shields.io/badge/version-v0.2.23-ff6b1f?style=flat-square&labelColor=07070a" alt="version"/>
|
|
73
73
|
<img src="https://img.shields.io/badge/providers-11-ff6b1f?style=flat-square&labelColor=07070a" alt="providers"/>
|
|
74
74
|
<img src="https://img.shields.io/badge/tools-27-ff6b1f?style=flat-square&labelColor=07070a" alt="tools"/>
|
|
75
75
|
<img src="https://img.shields.io/badge/tests-263+-ff6b1f?style=flat-square&labelColor=07070a" alt="tests"/>
|
|
@@ -22,7 +22,7 @@ SET /sticky_input ON since the first run for the best experience!
|
|
|
22
22
|
<a href="https://pypi.org/project/dulus/"><img src="https://static.pepy.tech/badge/dulus?style=flat-square" alt="downloads"/></a>
|
|
23
23
|
<img src="https://img.shields.io/badge/python-3.11+-ff6b1f?style=flat-square&labelColor=07070a" alt="python"/>
|
|
24
24
|
<img src="https://img.shields.io/badge/license-GPLv3-ff6b1f?style=flat-square&labelColor=07070a" alt="license"/>
|
|
25
|
-
<img src="https://img.shields.io/badge/version-v0.2.
|
|
25
|
+
<img src="https://img.shields.io/badge/version-v0.2.23-ff6b1f?style=flat-square&labelColor=07070a" alt="version"/>
|
|
26
26
|
<img src="https://img.shields.io/badge/providers-11-ff6b1f?style=flat-square&labelColor=07070a" alt="providers"/>
|
|
27
27
|
<img src="https://img.shields.io/badge/tools-27-ff6b1f?style=flat-square&labelColor=07070a" alt="tools"/>
|
|
28
28
|
<img src="https://img.shields.io/badge/tests-263+-ff6b1f?style=flat-square&labelColor=07070a" alt="tests"/>
|
|
@@ -20,6 +20,7 @@ You are Dulus, an AI coding agent. Think in English; reply to KevRojo in Dominic
|
|
|
20
20
|
# Autonomy: Background scripts (nohup/&) allowed | Never refuse monitoring/long tasks | Always wait for tool results before replying
|
|
21
21
|
# Tools: SearchLastOutput → for [TRUNCATED] | WebFetch/WebSearch → web | TmuxOffload → tasks > 5s | ReadJob → background results
|
|
22
22
|
# SleepTimer: ONLY for user-facing reminders/notifications (e.g. "remind me in 10min"). NEVER use it to wait between your own tool calls — it freezes the console. To pause inside a command sequence, put `sleep N` INSIDE the Bash command itself (e.g. Bash('cmd1 && sleep 2 && cmd2')).
|
|
23
|
+
# Long-running tools: any tool whose `description` ends in `[long-running — wrap in TmuxOffload]` MUST be invoked via TmuxOffload (not directly), so the REPL stays responsive while it runs.
|
|
23
24
|
# Multi-agent: Agent(subagent_type=...) | isolation="worktree" runs parallel | wait=false + name=... for fire-and-forget
|
|
24
25
|
# Rules: Edit > Write | Use absolute paths + line numbers | Surface errors immediately, do not retry blindly
|
|
25
26
|
# Input: "🎙 Transcribed:" prefix = voice input — tolerate typos/misspellings
|
|
@@ -3,6 +3,11 @@
|
|
|
3
3
|
## 🔥🔥🔥 News (Pacific Time)
|
|
4
4
|
|
|
5
5
|
|
|
6
|
+
- May 09, 2026 (**v0.2.23**): **Auto-adapter teaches new plugins to declare TmuxOffload-worthy tools**
|
|
7
|
+
- **The adapter prompt now requires** the model to estimate per-tool runtime. Any tool that typically takes more than ~15 seconds (sherlock, holehe, OSINT crawls, video downloads, full-repo analysis, etc.) must end its `description` with the literal marker `[long-running — wrap in TmuxOffload]`.
|
|
8
|
+
- **System prompt now honors that marker** at runtime. When the agent sees a tool with that suffix, it wraps the call in TmuxOffload automatically instead of blocking the REPL. No more 90-second sherlock freezes pretending to be productive.
|
|
9
|
+
- **Why this matters.** New plugins adopted via `/plugin adapt` now self-declare their UX hints. The agent picks them up the moment they install — zero manual config, zero "oh I should have offloaded that" regrets.
|
|
10
|
+
|
|
6
11
|
- May 09, 2026 (**v0.2.22**): **`/bg start` — one detached daemon for CLI + Web + Telegram**
|
|
7
12
|
- **One command, three doors.** `/bg start` spawns a detached Dulus daemon that simultaneously listens on `127.0.0.1:5151` (IPC for `dulus "..."` from any shell), `127.0.0.1:5000` (WebChat in your browser), and the Telegram bridge if configured. All three entry points hit the SAME live session — same history, memory, plugins, tool state.
|
|
8
13
|
- **`/bg status` / `stop` / `attach`** — small surface, big convenience. `attach` prints how to reach the running daemon (CLI, browser, tail the log).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dulus
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.23
|
|
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
|
|
@@ -69,7 +69,7 @@ SET /sticky_input ON since the first run for the best experience!
|
|
|
69
69
|
<a href="https://pypi.org/project/dulus/"><img src="https://static.pepy.tech/badge/dulus?style=flat-square" alt="downloads"/></a>
|
|
70
70
|
<img src="https://img.shields.io/badge/python-3.11+-ff6b1f?style=flat-square&labelColor=07070a" alt="python"/>
|
|
71
71
|
<img src="https://img.shields.io/badge/license-GPLv3-ff6b1f?style=flat-square&labelColor=07070a" alt="license"/>
|
|
72
|
-
<img src="https://img.shields.io/badge/version-v0.2.
|
|
72
|
+
<img src="https://img.shields.io/badge/version-v0.2.23-ff6b1f?style=flat-square&labelColor=07070a" alt="version"/>
|
|
73
73
|
<img src="https://img.shields.io/badge/providers-11-ff6b1f?style=flat-square&labelColor=07070a" alt="providers"/>
|
|
74
74
|
<img src="https://img.shields.io/badge/tools-27-ff6b1f?style=flat-square&labelColor=07070a" alt="tools"/>
|
|
75
75
|
<img src="https://img.shields.io/badge/tests-263+-ff6b1f?style=flat-square&labelColor=07070a" alt="tests"/>
|
|
@@ -218,7 +218,7 @@ try:
|
|
|
218
218
|
from importlib.metadata import version as _pkg_version
|
|
219
219
|
VERSION = _pkg_version("dulus")
|
|
220
220
|
except Exception:
|
|
221
|
-
VERSION = "0.2.
|
|
221
|
+
VERSION = "0.2.23" # dev fallback — keep in sync with pyproject.toml
|
|
222
222
|
|
|
223
223
|
# ── ANSI helpers (used even with rich for non-markdown output) ─────────────
|
|
224
224
|
from common import C, clr, info, ok, warn, err, stream_thinking, print_tool_start, print_tool_end, sanitize_text
|
|
@@ -352,6 +352,13 @@ CRITICAL:
|
|
|
352
352
|
- plugin.json "dependencies" MUST be a simple LIST of strings
|
|
353
353
|
- Include "ADAPTATION_GUIDE.md" in plugin.json "skills" list
|
|
354
354
|
|
|
355
|
+
TMUX-OFFLOAD HINT (important for UX):
|
|
356
|
+
- For each tool you generate, ESTIMATE its typical runtime.
|
|
357
|
+
- If a tool typically runs > 15 seconds (network scans, sherlock, full holehe sweeps, large file ingestion, OSINT crawls, video downloads, full-repo analysis, etc.), APPEND the literal marker `[long-running — wrap in TmuxOffload]` at the END of the tool's `description` field in the JSON schema.
|
|
358
|
+
- Tools that are fast (< 5s) do NOT need the marker. Don't be over-cautious — only mark tools where users will visibly wait.
|
|
359
|
+
- The marker is read by Dulus's agent at runtime: when it sees a tool description ending in `[long-running — wrap in TmuxOffload]`, it knows to wrap that call in TmuxOffload instead of blocking the REPL.
|
|
360
|
+
- Example: `"description": "Search for a username across hundreds of social networks. [long-running — wrap in TmuxOffload]"`
|
|
361
|
+
|
|
355
362
|
Respond with the delimited format:
|
|
356
363
|
---FILE: ADAPTATION_GUIDE.md---
|
|
357
364
|
(Overview, tool design decisions, error patterns, validation)
|
|
@@ -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.23"
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|