dulus 0.2.9__tar.gz → 0.2.10__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.9/dulus.egg-info → dulus-0.2.10}/PKG-INFO +15 -2
  2. {dulus-0.2.9 → dulus-0.2.10}/README.md +13 -1
  3. {dulus-0.2.9 → dulus-0.2.10/dulus.egg-info}/PKG-INFO +15 -2
  4. {dulus-0.2.9 → dulus-0.2.10}/dulus.egg-info/requires.txt +1 -0
  5. {dulus-0.2.9 → dulus-0.2.10}/pyproject.toml +6 -1
  6. {dulus-0.2.9 → dulus-0.2.10}/LICENSE +0 -0
  7. {dulus-0.2.9 → dulus-0.2.10}/MANIFEST.in +0 -0
  8. {dulus-0.2.9 → dulus-0.2.10}/agent.py +0 -0
  9. {dulus-0.2.9 → dulus-0.2.10}/backend/__init__.py +0 -0
  10. {dulus-0.2.9 → dulus-0.2.10}/backend/compressor.py +0 -0
  11. {dulus-0.2.9 → dulus-0.2.10}/backend/context.py +0 -0
  12. {dulus-0.2.9 → dulus-0.2.10}/backend/githook.py +0 -0
  13. {dulus-0.2.9 → dulus-0.2.10}/backend/marketplace.py +0 -0
  14. {dulus-0.2.9 → dulus-0.2.10}/backend/mempalace_bridge.py +0 -0
  15. {dulus-0.2.9 → dulus-0.2.10}/backend/personas.py +0 -0
  16. {dulus-0.2.9 → dulus-0.2.10}/backend/plugins.py +0 -0
  17. {dulus-0.2.9 → dulus-0.2.10}/backend/server.py +0 -0
  18. {dulus-0.2.9 → dulus-0.2.10}/backend/tasks.py +0 -0
  19. {dulus-0.2.9 → dulus-0.2.10}/batch_api.py +0 -0
  20. {dulus-0.2.9 → dulus-0.2.10}/checkpoint/__init__.py +0 -0
  21. {dulus-0.2.9 → dulus-0.2.10}/checkpoint/hooks.py +0 -0
  22. {dulus-0.2.9 → dulus-0.2.10}/checkpoint/store.py +0 -0
  23. {dulus-0.2.9 → dulus-0.2.10}/checkpoint/types.py +0 -0
  24. {dulus-0.2.9 → dulus-0.2.10}/claude_code_watcher.py +0 -0
  25. {dulus-0.2.9 → dulus-0.2.10}/clipboard_utils.py +0 -0
  26. {dulus-0.2.9 → dulus-0.2.10}/cloudsave.py +0 -0
  27. {dulus-0.2.9 → dulus-0.2.10}/common.py +0 -0
  28. {dulus-0.2.9 → dulus-0.2.10}/compaction.py +0 -0
  29. {dulus-0.2.9 → dulus-0.2.10}/config.py +0 -0
  30. {dulus-0.2.9 → dulus-0.2.10}/context.py +0 -0
  31. {dulus-0.2.9 → dulus-0.2.10}/data/__init__.py +0 -0
  32. {dulus-0.2.9 → dulus-0.2.10}/data/active_persona.json +0 -0
  33. {dulus-0.2.9 → dulus-0.2.10}/data/context.json +0 -0
  34. {dulus-0.2.9 → dulus-0.2.10}/data/marketplace.json +0 -0
  35. {dulus-0.2.9 → dulus-0.2.10}/data/personas.json +0 -0
  36. {dulus-0.2.9 → dulus-0.2.10}/data/tasks.json +0 -0
  37. {dulus-0.2.9 → dulus-0.2.10}/docs/README.md +0 -0
  38. {dulus-0.2.9 → dulus-0.2.10}/docs/__init__.py +0 -0
  39. {dulus-0.2.9 → dulus-0.2.10}/docs/api.html +0 -0
  40. {dulus-0.2.9 → dulus-0.2.10}/docs/architecture.md +0 -0
  41. {dulus-0.2.9 → dulus-0.2.10}/docs/azure-speech-template.json +0 -0
  42. {dulus-0.2.9 → dulus-0.2.10}/docs/dashboard/index.html +0 -0
  43. {dulus-0.2.9 → dulus-0.2.10}/docs/divider.svg +0 -0
  44. {dulus-0.2.9 → dulus-0.2.10}/docs/generate.py +0 -0
  45. {dulus-0.2.9 → dulus-0.2.10}/docs/hero.svg +0 -0
  46. {dulus-0.2.9 → dulus-0.2.10}/docs/index.html +0 -0
  47. {dulus-0.2.9 → dulus-0.2.10}/docs/news.md +0 -0
  48. {dulus-0.2.9 → dulus-0.2.10}/docs/nvidia-models.svg +0 -0
  49. {dulus-0.2.9 → dulus-0.2.10}/docs/particle-playground.html +0 -0
  50. {dulus-0.2.9 → dulus-0.2.10}/docs/personas/index.html +0 -0
  51. {dulus-0.2.9 → dulus-0.2.10}/docs/preview.html +0 -0
  52. {dulus-0.2.9 → dulus-0.2.10}/docs/sec-agents.svg +0 -0
  53. {dulus-0.2.9 → dulus-0.2.10}/docs/sec-brainstorm.svg +0 -0
  54. {dulus-0.2.9 → dulus-0.2.10}/docs/sec-bridges.svg +0 -0
  55. {dulus-0.2.9 → dulus-0.2.10}/docs/sec-features.svg +0 -0
  56. {dulus-0.2.9 → dulus-0.2.10}/docs/sec-freetier.svg +0 -0
  57. {dulus-0.2.9 → dulus-0.2.10}/docs/sec-memory.svg +0 -0
  58. {dulus-0.2.9 → dulus-0.2.10}/docs/sec-models.svg +0 -0
  59. {dulus-0.2.9 → dulus-0.2.10}/docs/sec-perms.svg +0 -0
  60. {dulus-0.2.9 → dulus-0.2.10}/docs/sec-plugins.svg +0 -0
  61. {dulus-0.2.9 → dulus-0.2.10}/docs/sec-quickstart.svg +0 -0
  62. {dulus-0.2.9 → dulus-0.2.10}/docs/sec-ssj.svg +0 -0
  63. {dulus-0.2.9 → dulus-0.2.10}/docs/spinners.svg +0 -0
  64. {dulus-0.2.9 → dulus-0.2.10}/docs/split-pane.svg +0 -0
  65. {dulus-0.2.9 → dulus-0.2.10}/docs/terminal-boot.svg +0 -0
  66. {dulus-0.2.9 → dulus-0.2.10}/docs/uploads/particle-playground.html +0 -0
  67. {dulus-0.2.9 → dulus-0.2.10}/dulus.egg-info/SOURCES.txt +0 -0
  68. {dulus-0.2.9 → dulus-0.2.10}/dulus.egg-info/dependency_links.txt +0 -0
  69. {dulus-0.2.9 → dulus-0.2.10}/dulus.egg-info/entry_points.txt +0 -0
  70. {dulus-0.2.9 → dulus-0.2.10}/dulus.egg-info/top_level.txt +0 -0
  71. {dulus-0.2.9 → dulus-0.2.10}/dulus.py +0 -0
  72. {dulus-0.2.9 → dulus-0.2.10}/dulus_gui.py +0 -0
  73. {dulus-0.2.9 → dulus-0.2.10}/dulus_mcp/__init__.py +0 -0
  74. {dulus-0.2.9 → dulus-0.2.10}/dulus_mcp/client.py +0 -0
  75. {dulus-0.2.9 → dulus-0.2.10}/dulus_mcp/config.py +0 -0
  76. {dulus-0.2.9 → dulus-0.2.10}/dulus_mcp/tools.py +0 -0
  77. {dulus-0.2.9 → dulus-0.2.10}/dulus_mcp/types.py +0 -0
  78. {dulus-0.2.9 → dulus-0.2.10}/gui/__init__.py +0 -0
  79. {dulus-0.2.9 → dulus-0.2.10}/gui/agent_bridge.py +0 -0
  80. {dulus-0.2.9 → dulus-0.2.10}/gui/chat_widget.py +0 -0
  81. {dulus-0.2.9 → dulus-0.2.10}/gui/main_window.py +0 -0
  82. {dulus-0.2.9 → dulus-0.2.10}/gui/personas.py +0 -0
  83. {dulus-0.2.9 → dulus-0.2.10}/gui/session_utils.py +0 -0
  84. {dulus-0.2.9 → dulus-0.2.10}/gui/settings_dialog.py +0 -0
  85. {dulus-0.2.9 → dulus-0.2.10}/gui/sidebar.py +0 -0
  86. {dulus-0.2.9 → dulus-0.2.10}/gui/tasks_view.py +0 -0
  87. {dulus-0.2.9 → dulus-0.2.10}/gui/themes.py +0 -0
  88. {dulus-0.2.9 → dulus-0.2.10}/gui/tool_panel.py +0 -0
  89. {dulus-0.2.9 → dulus-0.2.10}/input.py +0 -0
  90. {dulus-0.2.9 → dulus-0.2.10}/license_manager.py +0 -0
  91. {dulus-0.2.9 → dulus-0.2.10}/memory/__init__.py +0 -0
  92. {dulus-0.2.9 → dulus-0.2.10}/memory/audit.py +0 -0
  93. {dulus-0.2.9 → dulus-0.2.10}/memory/consolidator.py +0 -0
  94. {dulus-0.2.9 → dulus-0.2.10}/memory/context.py +0 -0
  95. {dulus-0.2.9 → dulus-0.2.10}/memory/offload.py +0 -0
  96. {dulus-0.2.9 → dulus-0.2.10}/memory/palace.py +0 -0
  97. {dulus-0.2.9 → dulus-0.2.10}/memory/scan.py +0 -0
  98. {dulus-0.2.9 → dulus-0.2.10}/memory/sessions.py +0 -0
  99. {dulus-0.2.9 → dulus-0.2.10}/memory/store.py +0 -0
  100. {dulus-0.2.9 → dulus-0.2.10}/memory/tools.py +0 -0
  101. {dulus-0.2.9 → dulus-0.2.10}/memory/types.py +0 -0
  102. {dulus-0.2.9 → dulus-0.2.10}/memory/vector_search.py +0 -0
  103. {dulus-0.2.9 → dulus-0.2.10}/multi_agent/__init__.py +0 -0
  104. {dulus-0.2.9 → dulus-0.2.10}/multi_agent/subagent.py +0 -0
  105. {dulus-0.2.9 → dulus-0.2.10}/multi_agent/tools.py +0 -0
  106. {dulus-0.2.9 → dulus-0.2.10}/offload_helper.py +0 -0
  107. {dulus-0.2.9 → dulus-0.2.10}/plugin/__init__.py +0 -0
  108. {dulus-0.2.9 → dulus-0.2.10}/plugin/autoadapter.py +0 -0
  109. {dulus-0.2.9 → dulus-0.2.10}/plugin/loader.py +0 -0
  110. {dulus-0.2.9 → dulus-0.2.10}/plugin/recommend.py +0 -0
  111. {dulus-0.2.9 → dulus-0.2.10}/plugin/store.py +0 -0
  112. {dulus-0.2.9 → dulus-0.2.10}/plugin/types.py +0 -0
  113. {dulus-0.2.9 → dulus-0.2.10}/providers.py +0 -0
  114. {dulus-0.2.9 → dulus-0.2.10}/setup.cfg +0 -0
  115. {dulus-0.2.9 → dulus-0.2.10}/skill/__init__.py +0 -0
  116. {dulus-0.2.9 → dulus-0.2.10}/skill/builtin.py +0 -0
  117. {dulus-0.2.9 → dulus-0.2.10}/skill/clawhub.py +0 -0
  118. {dulus-0.2.9 → dulus-0.2.10}/skill/executor.py +0 -0
  119. {dulus-0.2.9 → dulus-0.2.10}/skill/loader.py +0 -0
  120. {dulus-0.2.9 → dulus-0.2.10}/skill/tools.py +0 -0
  121. {dulus-0.2.9 → dulus-0.2.10}/skills.py +0 -0
  122. {dulus-0.2.9 → dulus-0.2.10}/spinner.py +0 -0
  123. {dulus-0.2.9 → dulus-0.2.10}/string_utils.py +0 -0
  124. {dulus-0.2.9 → dulus-0.2.10}/subagent.py +0 -0
  125. {dulus-0.2.9 → dulus-0.2.10}/task/__init__.py +0 -0
  126. {dulus-0.2.9 → dulus-0.2.10}/task/store.py +0 -0
  127. {dulus-0.2.9 → dulus-0.2.10}/task/tools.py +0 -0
  128. {dulus-0.2.9 → dulus-0.2.10}/task/types.py +0 -0
  129. {dulus-0.2.9 → dulus-0.2.10}/tests/test_checkpoint.py +0 -0
  130. {dulus-0.2.9 → dulus-0.2.10}/tests/test_compaction.py +0 -0
  131. {dulus-0.2.9 → dulus-0.2.10}/tests/test_diff_view.py +0 -0
  132. {dulus-0.2.9 → dulus-0.2.10}/tests/test_injection_fix.py +0 -0
  133. {dulus-0.2.9 → dulus-0.2.10}/tests/test_license.py +0 -0
  134. {dulus-0.2.9 → dulus-0.2.10}/tests/test_mcp.py +0 -0
  135. {dulus-0.2.9 → dulus-0.2.10}/tests/test_memory.py +0 -0
  136. {dulus-0.2.9 → dulus-0.2.10}/tests/test_plugin.py +0 -0
  137. {dulus-0.2.9 → dulus-0.2.10}/tests/test_skills.py +0 -0
  138. {dulus-0.2.9 → dulus-0.2.10}/tests/test_subagent.py +0 -0
  139. {dulus-0.2.9 → dulus-0.2.10}/tests/test_task.py +0 -0
  140. {dulus-0.2.9 → dulus-0.2.10}/tests/test_telegram_buffer.py +0 -0
  141. {dulus-0.2.9 → dulus-0.2.10}/tests/test_tool_registry.py +0 -0
  142. {dulus-0.2.9 → dulus-0.2.10}/tests/test_voice.py +0 -0
  143. {dulus-0.2.9 → dulus-0.2.10}/tmux_offloader.py +0 -0
  144. {dulus-0.2.9 → dulus-0.2.10}/tmux_tools.py +0 -0
  145. {dulus-0.2.9 → dulus-0.2.10}/tool_registry.py +0 -0
  146. {dulus-0.2.9 → dulus-0.2.10}/tools.py +0 -0
  147. {dulus-0.2.9 → dulus-0.2.10}/ui/__init__.py +0 -0
  148. {dulus-0.2.9 → dulus-0.2.10}/ui/input.py +0 -0
  149. {dulus-0.2.9 → dulus-0.2.10}/ui/render.py +0 -0
  150. {dulus-0.2.9 → dulus-0.2.10}/voice/__init__.py +0 -0
  151. {dulus-0.2.9 → dulus-0.2.10}/voice/keyterms.py +0 -0
  152. {dulus-0.2.9 → dulus-0.2.10}/voice/recorder.py +0 -0
  153. {dulus-0.2.9 → dulus-0.2.10}/voice/stt.py +0 -0
  154. {dulus-0.2.9 → dulus-0.2.10}/voice/tts.py +0 -0
  155. {dulus-0.2.9 → dulus-0.2.10}/webchat.py +0 -0
  156. {dulus-0.2.9 → dulus-0.2.10}/webchat_server.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dulus
3
- Version: 0.2.9
3
+ Version: 0.2.10
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
@@ -35,6 +35,7 @@ Requires-Dist: bubblewrap-cli>=1.0.0
35
35
  Requires-Dist: sounddevice
36
36
  Requires-Dist: customtkinter>=5.2.0
37
37
  Requires-Dist: Pillow>=10.0.0
38
+ Requires-Dist: typing-extensions>=4.10.0
38
39
  Dynamic: license-file
39
40
 
40
41
  # ▲ DULUS
@@ -84,7 +85,7 @@ SET /sticky_input ON since the first run for the best experience!
84
85
 
85
86
  Dulus is a **lightweight Python reimplementation of Claude Code** that isn't locked to Claude. It ships the whole loop — REPL, tool dispatch, streaming, context compaction, checkpoints, sub-agents, voice, Telegram bridge, MCP, plugins — in roughly **12K lines you can actually read**. Fork it. Bend it. Run it offline against Qwen on your M2.
86
87
 
87
- > **v0.2.9 — May 8, 2026** — Per-turn injection now queries the real MemPalace (`~/.mempalace/palace`) instead of the small local memory dir, so deep context (bond, soul, sessions) actually surfaces. `/theme` palette upgraded to 4 semantic roles (accent / ok / warn / err) with a live preview swatch in the listing. TmuxOffload accepts `tool_input` as alias of `tool_params`, sends an explicit second Enter on Windows so commands containing `&&`/`||`/`;` don't sit typed-but-unexecuted.
88
+ > **v0.2.10 — May 8, 2026** — Pin `typing-extensions>=4.10` to keep pip's resolver from blowing up (`dependency resolution exceeded maximum depth`) when reconciling anthropic / openai / pydantic / chromadb floors. New Termux/Android section in the README with a `--no-deps` workaround for the NumPy build.
88
89
  > Type `/news` to see what changed.
89
90
 
90
91
  ---
@@ -133,6 +134,18 @@ pip install -e . # editable install
133
134
  dulus
134
135
  ```
135
136
 
137
+ ### Termux / Android
138
+
139
+ The default install pulls `mempalace` and `sounddevice`, both of which need a NumPy that has no prebuilt wheel for `aarch64-android` — pip will try to build NumPy from source and fail. Install around it:
140
+
141
+ ```bash
142
+ pkg install python python-numpy python-pillow build-essential
143
+ pip install --no-deps dulus
144
+ pip install anthropic openai httpx requests rich prompt_toolkit Flask bubblewrap-cli mempalace
145
+ ```
146
+
147
+ Skip `sounddevice` (no usable PortAudio on Android — voice features won't work anyway). Dulus's runtime is graceful: voice / MemPalace just degrade if their deps aren't there, the CLI still boots and chats fine.
148
+
136
149
  ### Pick a model
137
150
 
138
151
  ```bash
@@ -45,7 +45,7 @@ SET /sticky_input ON since the first run for the best experience!
45
45
 
46
46
  Dulus is a **lightweight Python reimplementation of Claude Code** that isn't locked to Claude. It ships the whole loop — REPL, tool dispatch, streaming, context compaction, checkpoints, sub-agents, voice, Telegram bridge, MCP, plugins — in roughly **12K lines you can actually read**. Fork it. Bend it. Run it offline against Qwen on your M2.
47
47
 
48
- > **v0.2.9 — May 8, 2026** — Per-turn injection now queries the real MemPalace (`~/.mempalace/palace`) instead of the small local memory dir, so deep context (bond, soul, sessions) actually surfaces. `/theme` palette upgraded to 4 semantic roles (accent / ok / warn / err) with a live preview swatch in the listing. TmuxOffload accepts `tool_input` as alias of `tool_params`, sends an explicit second Enter on Windows so commands containing `&&`/`||`/`;` don't sit typed-but-unexecuted.
48
+ > **v0.2.10 — May 8, 2026** — Pin `typing-extensions>=4.10` to keep pip's resolver from blowing up (`dependency resolution exceeded maximum depth`) when reconciling anthropic / openai / pydantic / chromadb floors. New Termux/Android section in the README with a `--no-deps` workaround for the NumPy build.
49
49
  > Type `/news` to see what changed.
50
50
 
51
51
  ---
@@ -94,6 +94,18 @@ pip install -e . # editable install
94
94
  dulus
95
95
  ```
96
96
 
97
+ ### Termux / Android
98
+
99
+ The default install pulls `mempalace` and `sounddevice`, both of which need a NumPy that has no prebuilt wheel for `aarch64-android` — pip will try to build NumPy from source and fail. Install around it:
100
+
101
+ ```bash
102
+ pkg install python python-numpy python-pillow build-essential
103
+ pip install --no-deps dulus
104
+ pip install anthropic openai httpx requests rich prompt_toolkit Flask bubblewrap-cli mempalace
105
+ ```
106
+
107
+ Skip `sounddevice` (no usable PortAudio on Android — voice features won't work anyway). Dulus's runtime is graceful: voice / MemPalace just degrade if their deps aren't there, the CLI still boots and chats fine.
108
+
97
109
  ### Pick a model
98
110
 
99
111
  ```bash
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dulus
3
- Version: 0.2.9
3
+ Version: 0.2.10
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
@@ -35,6 +35,7 @@ Requires-Dist: bubblewrap-cli>=1.0.0
35
35
  Requires-Dist: sounddevice
36
36
  Requires-Dist: customtkinter>=5.2.0
37
37
  Requires-Dist: Pillow>=10.0.0
38
+ Requires-Dist: typing-extensions>=4.10.0
38
39
  Dynamic: license-file
39
40
 
40
41
  # ▲ DULUS
@@ -84,7 +85,7 @@ SET /sticky_input ON since the first run for the best experience!
84
85
 
85
86
  Dulus is a **lightweight Python reimplementation of Claude Code** that isn't locked to Claude. It ships the whole loop — REPL, tool dispatch, streaming, context compaction, checkpoints, sub-agents, voice, Telegram bridge, MCP, plugins — in roughly **12K lines you can actually read**. Fork it. Bend it. Run it offline against Qwen on your M2.
86
87
 
87
- > **v0.2.9 — May 8, 2026** — Per-turn injection now queries the real MemPalace (`~/.mempalace/palace`) instead of the small local memory dir, so deep context (bond, soul, sessions) actually surfaces. `/theme` palette upgraded to 4 semantic roles (accent / ok / warn / err) with a live preview swatch in the listing. TmuxOffload accepts `tool_input` as alias of `tool_params`, sends an explicit second Enter on Windows so commands containing `&&`/`||`/`;` don't sit typed-but-unexecuted.
88
+ > **v0.2.10 — May 8, 2026** — Pin `typing-extensions>=4.10` to keep pip's resolver from blowing up (`dependency resolution exceeded maximum depth`) when reconciling anthropic / openai / pydantic / chromadb floors. New Termux/Android section in the README with a `--no-deps` workaround for the NumPy build.
88
89
  > Type `/news` to see what changed.
89
90
 
90
91
  ---
@@ -133,6 +134,18 @@ pip install -e . # editable install
133
134
  dulus
134
135
  ```
135
136
 
137
+ ### Termux / Android
138
+
139
+ The default install pulls `mempalace` and `sounddevice`, both of which need a NumPy that has no prebuilt wheel for `aarch64-android` — pip will try to build NumPy from source and fail. Install around it:
140
+
141
+ ```bash
142
+ pkg install python python-numpy python-pillow build-essential
143
+ pip install --no-deps dulus
144
+ pip install anthropic openai httpx requests rich prompt_toolkit Flask bubblewrap-cli mempalace
145
+ ```
146
+
147
+ Skip `sounddevice` (no usable PortAudio on Android — voice features won't work anyway). Dulus's runtime is graceful: voice / MemPalace just degrade if their deps aren't there, the CLI still boots and chats fine.
148
+
136
149
  ### Pick a model
137
150
 
138
151
  ```bash
@@ -10,3 +10,4 @@ bubblewrap-cli>=1.0.0
10
10
  sounddevice
11
11
  customtkinter>=5.2.0
12
12
  Pillow>=10.0.0
13
+ typing-extensions>=4.10.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "dulus"
7
- version = "0.2.9"
7
+ version = "0.2.10"
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"
@@ -40,6 +40,11 @@ dependencies = [
40
40
  "sounddevice",
41
41
  "customtkinter>=5.2.0",
42
42
  "Pillow>=10.0.0",
43
+ # Pin typing-extensions floor: anthropic, openai, pydantic, chromadb (via
44
+ # mempalace) each pull it with different lower bounds — without an explicit
45
+ # floor here pip's resolver explodes with "dependency resolution exceeded
46
+ # maximum depth" trying to reconcile them.
47
+ "typing-extensions>=4.10.0",
43
48
  ]
44
49
 
45
50
  [project.scripts]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes