dulus 0.2.5__tar.gz → 0.2.6__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.5/dulus.egg-info → dulus-0.2.6}/PKG-INFO +1 -1
  2. {dulus-0.2.5 → dulus-0.2.6/dulus.egg-info}/PKG-INFO +1 -1
  3. {dulus-0.2.5 → dulus-0.2.6}/dulus.py +6 -8
  4. {dulus-0.2.5 → dulus-0.2.6}/pyproject.toml +1 -1
  5. {dulus-0.2.5 → dulus-0.2.6}/tools.py +1 -2
  6. {dulus-0.2.5 → dulus-0.2.6}/LICENSE +0 -0
  7. {dulus-0.2.5 → dulus-0.2.6}/MANIFEST.in +0 -0
  8. {dulus-0.2.5 → dulus-0.2.6}/README.md +0 -0
  9. {dulus-0.2.5 → dulus-0.2.6}/agent.py +0 -0
  10. {dulus-0.2.5 → dulus-0.2.6}/backend/__init__.py +0 -0
  11. {dulus-0.2.5 → dulus-0.2.6}/backend/compressor.py +0 -0
  12. {dulus-0.2.5 → dulus-0.2.6}/backend/context.py +0 -0
  13. {dulus-0.2.5 → dulus-0.2.6}/backend/githook.py +0 -0
  14. {dulus-0.2.5 → dulus-0.2.6}/backend/marketplace.py +0 -0
  15. {dulus-0.2.5 → dulus-0.2.6}/backend/mempalace_bridge.py +0 -0
  16. {dulus-0.2.5 → dulus-0.2.6}/backend/personas.py +0 -0
  17. {dulus-0.2.5 → dulus-0.2.6}/backend/plugins.py +0 -0
  18. {dulus-0.2.5 → dulus-0.2.6}/backend/server.py +0 -0
  19. {dulus-0.2.5 → dulus-0.2.6}/backend/tasks.py +0 -0
  20. {dulus-0.2.5 → dulus-0.2.6}/batch_api.py +0 -0
  21. {dulus-0.2.5 → dulus-0.2.6}/checkpoint/__init__.py +0 -0
  22. {dulus-0.2.5 → dulus-0.2.6}/checkpoint/hooks.py +0 -0
  23. {dulus-0.2.5 → dulus-0.2.6}/checkpoint/store.py +0 -0
  24. {dulus-0.2.5 → dulus-0.2.6}/checkpoint/types.py +0 -0
  25. {dulus-0.2.5 → dulus-0.2.6}/claude_code_watcher.py +0 -0
  26. {dulus-0.2.5 → dulus-0.2.6}/clipboard_utils.py +0 -0
  27. {dulus-0.2.5 → dulus-0.2.6}/cloudsave.py +0 -0
  28. {dulus-0.2.5 → dulus-0.2.6}/common.py +0 -0
  29. {dulus-0.2.5 → dulus-0.2.6}/compaction.py +0 -0
  30. {dulus-0.2.5 → dulus-0.2.6}/config.py +0 -0
  31. {dulus-0.2.5 → dulus-0.2.6}/context.py +0 -0
  32. {dulus-0.2.5 → dulus-0.2.6}/data/__init__.py +0 -0
  33. {dulus-0.2.5 → dulus-0.2.6}/data/active_persona.json +0 -0
  34. {dulus-0.2.5 → dulus-0.2.6}/data/context.json +0 -0
  35. {dulus-0.2.5 → dulus-0.2.6}/data/marketplace.json +0 -0
  36. {dulus-0.2.5 → dulus-0.2.6}/data/personas.json +0 -0
  37. {dulus-0.2.5 → dulus-0.2.6}/data/tasks.json +0 -0
  38. {dulus-0.2.5 → dulus-0.2.6}/docs/README.md +0 -0
  39. {dulus-0.2.5 → dulus-0.2.6}/docs/__init__.py +0 -0
  40. {dulus-0.2.5 → dulus-0.2.6}/docs/api.html +0 -0
  41. {dulus-0.2.5 → dulus-0.2.6}/docs/architecture.md +0 -0
  42. {dulus-0.2.5 → dulus-0.2.6}/docs/azure-speech-template.json +0 -0
  43. {dulus-0.2.5 → dulus-0.2.6}/docs/dashboard/index.html +0 -0
  44. {dulus-0.2.5 → dulus-0.2.6}/docs/divider.svg +0 -0
  45. {dulus-0.2.5 → dulus-0.2.6}/docs/generate.py +0 -0
  46. {dulus-0.2.5 → dulus-0.2.6}/docs/hero.svg +0 -0
  47. {dulus-0.2.5 → dulus-0.2.6}/docs/index.html +0 -0
  48. {dulus-0.2.5 → dulus-0.2.6}/docs/news.md +0 -0
  49. {dulus-0.2.5 → dulus-0.2.6}/docs/nvidia-models.svg +0 -0
  50. {dulus-0.2.5 → dulus-0.2.6}/docs/particle-playground.html +0 -0
  51. {dulus-0.2.5 → dulus-0.2.6}/docs/personas/index.html +0 -0
  52. {dulus-0.2.5 → dulus-0.2.6}/docs/preview.html +0 -0
  53. {dulus-0.2.5 → dulus-0.2.6}/docs/sec-agents.svg +0 -0
  54. {dulus-0.2.5 → dulus-0.2.6}/docs/sec-brainstorm.svg +0 -0
  55. {dulus-0.2.5 → dulus-0.2.6}/docs/sec-bridges.svg +0 -0
  56. {dulus-0.2.5 → dulus-0.2.6}/docs/sec-features.svg +0 -0
  57. {dulus-0.2.5 → dulus-0.2.6}/docs/sec-freetier.svg +0 -0
  58. {dulus-0.2.5 → dulus-0.2.6}/docs/sec-memory.svg +0 -0
  59. {dulus-0.2.5 → dulus-0.2.6}/docs/sec-models.svg +0 -0
  60. {dulus-0.2.5 → dulus-0.2.6}/docs/sec-perms.svg +0 -0
  61. {dulus-0.2.5 → dulus-0.2.6}/docs/sec-plugins.svg +0 -0
  62. {dulus-0.2.5 → dulus-0.2.6}/docs/sec-quickstart.svg +0 -0
  63. {dulus-0.2.5 → dulus-0.2.6}/docs/sec-ssj.svg +0 -0
  64. {dulus-0.2.5 → dulus-0.2.6}/docs/spinners.svg +0 -0
  65. {dulus-0.2.5 → dulus-0.2.6}/docs/split-pane.svg +0 -0
  66. {dulus-0.2.5 → dulus-0.2.6}/docs/terminal-boot.svg +0 -0
  67. {dulus-0.2.5 → dulus-0.2.6}/docs/uploads/particle-playground.html +0 -0
  68. {dulus-0.2.5 → dulus-0.2.6}/dulus.egg-info/SOURCES.txt +0 -0
  69. {dulus-0.2.5 → dulus-0.2.6}/dulus.egg-info/dependency_links.txt +0 -0
  70. {dulus-0.2.5 → dulus-0.2.6}/dulus.egg-info/entry_points.txt +0 -0
  71. {dulus-0.2.5 → dulus-0.2.6}/dulus.egg-info/requires.txt +0 -0
  72. {dulus-0.2.5 → dulus-0.2.6}/dulus.egg-info/top_level.txt +0 -0
  73. {dulus-0.2.5 → dulus-0.2.6}/dulus_gui.py +0 -0
  74. {dulus-0.2.5 → dulus-0.2.6}/dulus_mcp/__init__.py +0 -0
  75. {dulus-0.2.5 → dulus-0.2.6}/dulus_mcp/client.py +0 -0
  76. {dulus-0.2.5 → dulus-0.2.6}/dulus_mcp/config.py +0 -0
  77. {dulus-0.2.5 → dulus-0.2.6}/dulus_mcp/tools.py +0 -0
  78. {dulus-0.2.5 → dulus-0.2.6}/dulus_mcp/types.py +0 -0
  79. {dulus-0.2.5 → dulus-0.2.6}/gui/__init__.py +0 -0
  80. {dulus-0.2.5 → dulus-0.2.6}/gui/agent_bridge.py +0 -0
  81. {dulus-0.2.5 → dulus-0.2.6}/gui/chat_widget.py +0 -0
  82. {dulus-0.2.5 → dulus-0.2.6}/gui/main_window.py +0 -0
  83. {dulus-0.2.5 → dulus-0.2.6}/gui/personas.py +0 -0
  84. {dulus-0.2.5 → dulus-0.2.6}/gui/session_utils.py +0 -0
  85. {dulus-0.2.5 → dulus-0.2.6}/gui/settings_dialog.py +0 -0
  86. {dulus-0.2.5 → dulus-0.2.6}/gui/sidebar.py +0 -0
  87. {dulus-0.2.5 → dulus-0.2.6}/gui/tasks_view.py +0 -0
  88. {dulus-0.2.5 → dulus-0.2.6}/gui/themes.py +0 -0
  89. {dulus-0.2.5 → dulus-0.2.6}/gui/tool_panel.py +0 -0
  90. {dulus-0.2.5 → dulus-0.2.6}/input.py +0 -0
  91. {dulus-0.2.5 → dulus-0.2.6}/license_manager.py +0 -0
  92. {dulus-0.2.5 → dulus-0.2.6}/memory/__init__.py +0 -0
  93. {dulus-0.2.5 → dulus-0.2.6}/memory/audit.py +0 -0
  94. {dulus-0.2.5 → dulus-0.2.6}/memory/consolidator.py +0 -0
  95. {dulus-0.2.5 → dulus-0.2.6}/memory/context.py +0 -0
  96. {dulus-0.2.5 → dulus-0.2.6}/memory/offload.py +0 -0
  97. {dulus-0.2.5 → dulus-0.2.6}/memory/palace.py +0 -0
  98. {dulus-0.2.5 → dulus-0.2.6}/memory/scan.py +0 -0
  99. {dulus-0.2.5 → dulus-0.2.6}/memory/sessions.py +0 -0
  100. {dulus-0.2.5 → dulus-0.2.6}/memory/store.py +0 -0
  101. {dulus-0.2.5 → dulus-0.2.6}/memory/tools.py +0 -0
  102. {dulus-0.2.5 → dulus-0.2.6}/memory/types.py +0 -0
  103. {dulus-0.2.5 → dulus-0.2.6}/memory/vector_search.py +0 -0
  104. {dulus-0.2.5 → dulus-0.2.6}/multi_agent/__init__.py +0 -0
  105. {dulus-0.2.5 → dulus-0.2.6}/multi_agent/subagent.py +0 -0
  106. {dulus-0.2.5 → dulus-0.2.6}/multi_agent/tools.py +0 -0
  107. {dulus-0.2.5 → dulus-0.2.6}/offload_helper.py +0 -0
  108. {dulus-0.2.5 → dulus-0.2.6}/plugin/__init__.py +0 -0
  109. {dulus-0.2.5 → dulus-0.2.6}/plugin/autoadapter.py +0 -0
  110. {dulus-0.2.5 → dulus-0.2.6}/plugin/loader.py +0 -0
  111. {dulus-0.2.5 → dulus-0.2.6}/plugin/recommend.py +0 -0
  112. {dulus-0.2.5 → dulus-0.2.6}/plugin/store.py +0 -0
  113. {dulus-0.2.5 → dulus-0.2.6}/plugin/types.py +0 -0
  114. {dulus-0.2.5 → dulus-0.2.6}/providers.py +0 -0
  115. {dulus-0.2.5 → dulus-0.2.6}/setup.cfg +0 -0
  116. {dulus-0.2.5 → dulus-0.2.6}/skill/__init__.py +0 -0
  117. {dulus-0.2.5 → dulus-0.2.6}/skill/builtin.py +0 -0
  118. {dulus-0.2.5 → dulus-0.2.6}/skill/clawhub.py +0 -0
  119. {dulus-0.2.5 → dulus-0.2.6}/skill/executor.py +0 -0
  120. {dulus-0.2.5 → dulus-0.2.6}/skill/loader.py +0 -0
  121. {dulus-0.2.5 → dulus-0.2.6}/skill/tools.py +0 -0
  122. {dulus-0.2.5 → dulus-0.2.6}/skills.py +0 -0
  123. {dulus-0.2.5 → dulus-0.2.6}/spinner.py +0 -0
  124. {dulus-0.2.5 → dulus-0.2.6}/string_utils.py +0 -0
  125. {dulus-0.2.5 → dulus-0.2.6}/subagent.py +0 -0
  126. {dulus-0.2.5 → dulus-0.2.6}/task/__init__.py +0 -0
  127. {dulus-0.2.5 → dulus-0.2.6}/task/store.py +0 -0
  128. {dulus-0.2.5 → dulus-0.2.6}/task/tools.py +0 -0
  129. {dulus-0.2.5 → dulus-0.2.6}/task/types.py +0 -0
  130. {dulus-0.2.5 → dulus-0.2.6}/tests/test_checkpoint.py +0 -0
  131. {dulus-0.2.5 → dulus-0.2.6}/tests/test_compaction.py +0 -0
  132. {dulus-0.2.5 → dulus-0.2.6}/tests/test_diff_view.py +0 -0
  133. {dulus-0.2.5 → dulus-0.2.6}/tests/test_injection_fix.py +0 -0
  134. {dulus-0.2.5 → dulus-0.2.6}/tests/test_license.py +0 -0
  135. {dulus-0.2.5 → dulus-0.2.6}/tests/test_mcp.py +0 -0
  136. {dulus-0.2.5 → dulus-0.2.6}/tests/test_memory.py +0 -0
  137. {dulus-0.2.5 → dulus-0.2.6}/tests/test_plugin.py +0 -0
  138. {dulus-0.2.5 → dulus-0.2.6}/tests/test_skills.py +0 -0
  139. {dulus-0.2.5 → dulus-0.2.6}/tests/test_subagent.py +0 -0
  140. {dulus-0.2.5 → dulus-0.2.6}/tests/test_task.py +0 -0
  141. {dulus-0.2.5 → dulus-0.2.6}/tests/test_telegram_buffer.py +0 -0
  142. {dulus-0.2.5 → dulus-0.2.6}/tests/test_tool_registry.py +0 -0
  143. {dulus-0.2.5 → dulus-0.2.6}/tests/test_voice.py +0 -0
  144. {dulus-0.2.5 → dulus-0.2.6}/tmux_offloader.py +0 -0
  145. {dulus-0.2.5 → dulus-0.2.6}/tmux_tools.py +0 -0
  146. {dulus-0.2.5 → dulus-0.2.6}/tool_registry.py +0 -0
  147. {dulus-0.2.5 → dulus-0.2.6}/ui/__init__.py +0 -0
  148. {dulus-0.2.5 → dulus-0.2.6}/ui/input.py +0 -0
  149. {dulus-0.2.5 → dulus-0.2.6}/ui/render.py +0 -0
  150. {dulus-0.2.5 → dulus-0.2.6}/voice/__init__.py +0 -0
  151. {dulus-0.2.5 → dulus-0.2.6}/voice/keyterms.py +0 -0
  152. {dulus-0.2.5 → dulus-0.2.6}/voice/recorder.py +0 -0
  153. {dulus-0.2.5 → dulus-0.2.6}/voice/stt.py +0 -0
  154. {dulus-0.2.5 → dulus-0.2.6}/voice/tts.py +0 -0
  155. {dulus-0.2.5 → dulus-0.2.6}/webchat.py +0 -0
  156. {dulus-0.2.5 → dulus-0.2.6}/webchat_server.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dulus
3
- Version: 0.2.5
3
+ Version: 0.2.6
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.5
3
+ Version: 0.2.6
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
@@ -2996,7 +2996,7 @@ def cmd_sticky_input(_args: str, _state, config) -> bool:
2996
2996
  Background notifications land where they land.
2997
2997
  """
2998
2998
  from config import save_config
2999
- config["sticky_input"] = not config.get("sticky_input", False)
2999
+ config["sticky_input"] = not config.get("sticky_input", True)
3000
3000
  state_str = "ON" if config["sticky_input"] else "OFF"
3001
3001
  ok(f"Sticky input bar: {state_str} (restart Dulus to take effect)")
3002
3002
  save_config(config)
@@ -7438,13 +7438,11 @@ def repl(config: dict, initial_prompt: str = None):
7438
7438
  sys.stdout.write("\x1b[?2004h") # enable bracketed paste mode
7439
7439
  sys.stdout.flush()
7440
7440
 
7441
- # ── Sticky input bar (opt-in) ─────────────────────────────────────────────
7442
- # prompt_toolkit can anchor the input line so background prints flow above
7443
- # it, but on Windows consoles it constantly redraws on every keystroke and
7444
- # that causes visible jitter / artifacts. Disabled by default the user
7445
- # can turn it on with `/sticky_input on` (or set `sticky_input: true` in
7446
- # config) if they want the anchored behavior.
7447
- _sticky_input_enabled = bool(config.get("sticky_input", False))
7441
+ # ── Sticky input bar (ON by default) ─────────────────────────────────────
7442
+ # prompt_toolkit anchors the input line so background prints flow above it.
7443
+ # On Windows consoles it can redraw on every keystroke (mild jitter), but
7444
+ # the UX win outweighs it. Toggle off with `/sticky_input` if needed.
7445
+ _sticky_input_enabled = bool(config.get("sticky_input", True))
7448
7446
  try:
7449
7447
  import common as _cm
7450
7448
  _cm.apply_theme(config.get("theme", "dulus"))
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "dulus"
7
- version = "0.2.5"
7
+ version = "0.2.6"
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"
@@ -896,8 +896,7 @@ def _rtk_binary() -> Optional[str]:
896
896
  here = Path(__file__).resolve().parent
897
897
  name = "rtk.exe" if _sys.platform == "win32" else "rtk"
898
898
  candidates = [here / "rtk" / name]
899
- if _sys.platform != "win32":
900
- candidates.append(Path.home() / ".local" / "bin" / "rtk")
899
+ candidates.append(Path.home() / ".local" / "bin" / name)
901
900
 
902
901
  for c in candidates:
903
902
  if c.exists() and c.is_file():
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes