crow-cli 0.1.34__tar.gz → 0.1.37__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 (441) hide show
  1. crow_cli-0.1.37/.env.example +2 -0
  2. crow_cli-0.1.37/.github/workflows/build-binaries.yml +101 -0
  3. crow_cli-0.1.37/.github/workflows/publish-crow-cli.yml +42 -0
  4. crow_cli-0.1.37/.gitignore +36 -0
  5. crow_cli-0.1.37/AGENTS.md +3 -0
  6. crow_cli-0.1.37/LICENSE.md +21 -0
  7. {crow_cli-0.1.34 → crow_cli-0.1.37}/PKG-INFO +32 -23
  8. crow_cli-0.1.37/PLAN.md +263 -0
  9. crow_cli-0.1.37/PYINSTALLER_BUILD.md +112 -0
  10. {crow_cli-0.1.34 → crow_cli-0.1.37}/README.md +24 -20
  11. crow_cli-0.1.37/TODO.md +165 -0
  12. {crow_cli-0.1.34 → crow_cli-0.1.37}/agent.json +1 -1
  13. {crow_cli-0.1.34 → crow_cli-0.1.37}/crow-cli.spec +14 -2
  14. crow_cli-0.1.37/dev-crow-2.yaml +17 -0
  15. crow_cli-0.1.37/docs/CNAME +2 -0
  16. crow_cli-0.1.37/docs/crow-cli-docs/getting-started/installation.md +32 -0
  17. crow_cli-0.1.37/docs/crow-cli-docs/getting-started/quickstart.md +63 -0
  18. crow_cli-0.1.37/docs/crow-cli-docs/index.md +58 -0
  19. crow_cli-0.1.37/docs/crow-cli-docs/memory-tool-design.md +294 -0
  20. crow_cli-0.1.37/docs/crow-cli-docs/myst.yml +19 -0
  21. crow_cli-0.1.37/docs/crow-cli-docs/styles/purple.css +118 -0
  22. crow_cli-0.1.37/docs/crow-logo.svg +19 -0
  23. crow_cli-0.1.37/docs/get-llamacpp-working.md +1112 -0
  24. crow_cli-0.1.37/docs/getting-started/installation.md +32 -0
  25. crow_cli-0.1.37/docs/getting-started/quickstart.md +57 -0
  26. crow_cli-0.1.37/docs/icon.ico +0 -0
  27. crow_cli-0.1.37/docs/img/crow-icon-purple.svg +51 -0
  28. crow_cli-0.1.37/docs/img/crow-logo-crop.png +0 -0
  29. crow_cli-0.1.37/docs/img/icon.svg +9 -0
  30. crow_cli-0.1.37/docs/img/whiteboard_capture.png +0 -0
  31. crow_cli-0.1.37/docs/index.html +715 -0
  32. crow_cli-0.1.37/docs/index.md +40 -0
  33. crow_cli-0.1.37/docs/journal/03May2026.md +8 -0
  34. crow_cli-0.1.37/docs/journal/19Feb2026.md +46 -0
  35. crow_cli-0.1.37/docs/journal/20Feb2026.md +15 -0
  36. crow_cli-0.1.37/docs/journal/22Feb2026.md +91 -0
  37. crow_cli-0.1.37/docs/llm-wiki.md +75 -0
  38. crow_cli-0.1.37/docs/myst.yml +19 -0
  39. crow_cli-0.1.37/docs/styles/purple.css +118 -0
  40. {crow_cli-0.1.34 → crow_cli-0.1.37}/pyproject.toml +7 -7
  41. crow_cli-0.1.37/run_tests.sh +5 -0
  42. crow_cli-0.1.37/sandbox/agent-client/.python-version +1 -0
  43. crow_cli-0.1.37/sandbox/agent-client/README.md +309 -0
  44. crow_cli-0.1.37/sandbox/agent-client/SUCCESS.md +90 -0
  45. crow_cli-0.1.37/sandbox/agent-client/TODO.md +50 -0
  46. crow_cli-0.1.37/sandbox/agent-client/agent_client.py +867 -0
  47. crow_cli-0.1.37/sandbox/agent-client/echo_agent.py +85 -0
  48. crow_cli-0.1.37/sandbox/agent-client/fire_up_echo.py +71 -0
  49. crow_cli-0.1.37/sandbox/agent-client/fire_up_simple.py +58 -0
  50. crow_cli-0.1.37/sandbox/agent-client/main.py +6 -0
  51. crow_cli-0.1.37/sandbox/agent-client/pyproject.toml +11 -0
  52. crow_cli-0.1.37/sandbox/agent-client/run_bridge.py +79 -0
  53. crow_cli-0.1.37/sandbox/agent-client/simple_agent.py +111 -0
  54. crow_cli-0.1.37/sandbox/agent-client/stdio_to_ws.py +220 -0
  55. crow_cli-0.1.37/sandbox/agent-client/test_acp_ws_client.py +64 -0
  56. crow_cli-0.1.37/sandbox/agent-client/test_agent_client.py +74 -0
  57. crow_cli-0.1.37/sandbox/agent-client/test_bridge.py +48 -0
  58. crow_cli-0.1.37/sandbox/agent-client/test_bridge_and_client.py +193 -0
  59. crow_cli-0.1.37/sandbox/agent-client/test_bridge_direct.py +92 -0
  60. crow_cli-0.1.37/sandbox/agent-client/test_client.py +261 -0
  61. crow_cli-0.1.37/sandbox/agent-client/test_date_terminal.py +277 -0
  62. crow_cli-0.1.37/sandbox/agent-client/test_echo_agent.py +51 -0
  63. crow_cli-0.1.37/sandbox/agent-client/test_fs_terminal.py +78 -0
  64. crow_cli-0.1.37/sandbox/agent-client/test_http_multisession.py +151 -0
  65. crow_cli-0.1.37/sandbox/agent-client/test_raw_stdio.py +137 -0
  66. crow_cli-0.1.37/sandbox/agent-client/test_simple.py +133 -0
  67. crow_cli-0.1.37/sandbox/agent-client/test_ws_client.py +94 -0
  68. crow_cli-0.1.37/sandbox/agent-client/two_sessions_same_question.py +113 -0
  69. crow_cli-0.1.37/sandbox/agent-client/uv.lock +333 -0
  70. crow_cli-0.1.37/sandbox/async-react/.python-version +1 -0
  71. crow_cli-0.1.37/sandbox/async-react/README.md +3 -0
  72. crow_cli-0.1.37/sandbox/async-react/db_integrity_test.py +328 -0
  73. crow_cli-0.1.37/sandbox/async-react/e2e_tool_integrity.py +409 -0
  74. crow_cli-0.1.37/sandbox/async-react/persistence_integrity_test.py +599 -0
  75. crow_cli-0.1.37/sandbox/async-react/pyproject.toml +15 -0
  76. crow_cli-0.1.37/sandbox/async-react/streaming_async_react.py +255 -0
  77. crow_cli-0.1.37/sandbox/async-react/streaming_async_react_with_cancellation.py +405 -0
  78. crow_cli-0.1.37/sandbox/async-react/test_usage.py +161 -0
  79. crow_cli-0.1.37/sandbox/async-react/tool_call_integrity_test.py +287 -0
  80. crow_cli-0.1.37/sandbox/async-react/uv.lock +1646 -0
  81. crow_cli-0.1.37/sandbox/crow-acp-learning/agent.py +125 -0
  82. crow_cli-0.1.37/sandbox/crow-acp-learning/client.py +211 -0
  83. crow_cli-0.1.37/sandbox/crow-acp-learning/duet.py +43 -0
  84. crow_cli-0.1.37/sandbox/crow-acp-learning/echo_agent.py +418 -0
  85. crow_cli-0.1.37/sandbox/crow-acp-learning/fire_up_echo.py +75 -0
  86. crow_cli-0.1.37/sandbox/crow-acp-learning/gemini.py +394 -0
  87. crow_cli-0.1.37/sandbox/crow-acp-learning/pyproject.toml +10 -0
  88. crow_cli-0.1.37/sandbox/crow-acp-learning/terminal_agent.py +342 -0
  89. crow_cli-0.1.37/sandbox/crow-acp-learning/test_acp.py +89 -0
  90. crow_cli-0.1.37/sandbox/crow-acp-learning/uv.lock +299 -0
  91. crow_cli-0.1.37/sandbox/crow-test/.python-version +1 -0
  92. crow_cli-0.1.37/sandbox/crow-test/graph.png +0 -0
  93. crow_cli-0.1.37/sandbox/crow-test/graph.py +25 -0
  94. crow_cli-0.1.37/sandbox/crow-test/main.py +6 -0
  95. crow_cli-0.1.37/sandbox/crow-test/pyproject.toml +12 -0
  96. crow_cli-0.1.37/sandbox/crow-test/uv.lock +1658 -0
  97. crow_cli-0.1.37/sandbox/dirtree/.python-version +1 -0
  98. crow_cli-0.1.37/sandbox/dirtree/README.md +0 -0
  99. crow_cli-0.1.37/sandbox/dirtree/main.py +6 -0
  100. crow_cli-0.1.37/sandbox/dirtree/pyproject.toml +10 -0
  101. crow_cli-0.1.37/sandbox/dirtree/uv.lock +212 -0
  102. crow_cli-0.1.37/sandbox/docs/ancestors/00-architecture-overview.md +495 -0
  103. crow_cli-0.1.37/sandbox/docs/ancestors/01-parallel-tool-calling.md +220 -0
  104. crow_cli-0.1.37/sandbox/docs/ancestors/02-toad-integration.md +321 -0
  105. crow_cli-0.1.37/sandbox/docs/ancestors/03-session-persistence.md +468 -0
  106. crow_cli-0.1.37/sandbox/docs/ancestors/04-cancellation-and-state.md +436 -0
  107. crow_cli-0.1.37/sandbox/docs/ancestors/05-loop-detection.md +681 -0
  108. crow_cli-0.1.37/sandbox/docs/ancestors/06-finish-tool.md +685 -0
  109. crow_cli-0.1.37/sandbox/docs/ancestors/07-python-repl.md +701 -0
  110. crow_cli-0.1.37/sandbox/docs/ancestors/08-system-prompt-skills.md +631 -0
  111. crow_cli-0.1.37/sandbox/docs/ancestors/09-session-continuity-and-compaction.md +216 -0
  112. crow_cli-0.1.37/sandbox/docs/ancestors/AGENTS_OLD.md +1427 -0
  113. crow_cli-0.1.37/sandbox/docs/ancestors/ARCHITECTURE.md +288 -0
  114. crow_cli-0.1.37/sandbox/docs/ancestors/CANCELLATION_IMPLEMENTATION.md +361 -0
  115. crow_cli-0.1.37/sandbox/docs/ancestors/CANCELLATION_SANDBOX_COMPARISON.md +266 -0
  116. crow_cli-0.1.37/sandbox/docs/ancestors/CANCELLATION_SUMMARY.md +207 -0
  117. crow_cli-0.1.37/sandbox/docs/ancestors/CRITICAL_CLARIFICATIONS.md +506 -0
  118. crow_cli-0.1.37/sandbox/docs/ancestors/CROW_SDK_ANALYSIS.md +642 -0
  119. crow_cli-0.1.37/sandbox/docs/ancestors/EXTENSION_DISCUSSION.md +133 -0
  120. crow_cli-0.1.37/sandbox/docs/ancestors/IMPLEMENTATION_PLAN.md +903 -0
  121. crow_cli-0.1.37/sandbox/docs/ancestors/IMPLEMENTATION_SUMMARY.md +160 -0
  122. crow_cli-0.1.37/sandbox/docs/ancestors/IMPLEMENTATION_SUMMARY_ACP_SESSIONS.md +192 -0
  123. crow_cli-0.1.37/sandbox/docs/ancestors/INSTRUCTIONS_FOR_KIMI.md +106 -0
  124. crow_cli-0.1.37/sandbox/docs/ancestors/PROJECT_VISION.md +3 -0
  125. crow_cli-0.1.37/sandbox/docs/ancestors/PROMPT.md +148 -0
  126. crow_cli-0.1.37/sandbox/docs/ancestors/PULSE_CHECK.md +512 -0
  127. crow_cli-0.1.37/sandbox/docs/ancestors/REPL_GUIDE.md +148 -0
  128. crow_cli-0.1.37/sandbox/docs/ancestors/TABLE_SCHEMA.md +53 -0
  129. crow_cli-0.1.37/sandbox/docs/ancestors/THOUGHTS.md +25 -0
  130. crow_cli-0.1.37/sandbox/docs/ancestors/check_acp_agent.py +11 -0
  131. crow_cli-0.1.37/sandbox/docs/ancestors/conversation-wrapper-analysis.md +493 -0
  132. crow_cli-0.1.37/sandbox/docs/ancestors/crow-agent-good-stuff.md +5442 -0
  133. crow_cli-0.1.37/sandbox/docs/ancestors/crow_agent_example.py +113 -0
  134. crow_cli-0.1.37/sandbox/docs/ancestors/crow_inspect.py +223 -0
  135. crow_cli-0.1.37/sandbox/docs/ancestors/database.py +207 -0
  136. crow_cli-0.1.37/sandbox/docs/ancestors/essays/00-file-editor-semantics-and-fastmcp.md +495 -0
  137. crow_cli-0.1.37/sandbox/docs/ancestors/essays/01-mcp-server-package-structure.md +248 -0
  138. crow_cli-0.1.37/sandbox/docs/ancestors/essays/02-hooks-realization-and-agent-core.md +420 -0
  139. crow_cli-0.1.37/sandbox/docs/ancestors/essays/03-where-we-are-now-and-whats-next.md +498 -0
  140. crow_cli-0.1.37/sandbox/docs/ancestors/essays/04-acp-mcp-configuration.md +228 -0
  141. crow_cli-0.1.37/sandbox/docs/ancestors/essays/04-hooks-as-first-class-citizens.md +318 -0
  142. crow_cli-0.1.37/sandbox/docs/ancestors/essays/05-hook-design-analysis.md +461 -0
  143. crow_cli-0.1.37/sandbox/docs/ancestors/essays/05-python-sdk-that-emerged.md +460 -0
  144. crow_cli-0.1.37/sandbox/docs/ancestors/essays/06-acp-native-sessions.md +225 -0
  145. crow_cli-0.1.37/sandbox/docs/ancestors/essays/07-extension-api-design.md +308 -0
  146. crow_cli-0.1.37/sandbox/docs/ancestors/essays/08-flask-extension-pattern-with-context-variables.md +380 -0
  147. crow_cli-0.1.37/sandbox/docs/ancestors/essays/09-git-commit-violation-last-testament.md +146 -0
  148. crow_cli-0.1.37/sandbox/docs/ancestors/essays/10-monorepo-refactor-to-avoid-cyclic-dependencies.md +342 -0
  149. crow_cli-0.1.37/sandbox/docs/ancestors/essays/11-acp-terminal-tool-swapping.md +233 -0
  150. crow_cli-0.1.37/sandbox/docs/ancestors/essays/12-hook-based-architecture-and-the-frameworkless-framework.md +1100 -0
  151. crow_cli-0.1.37/sandbox/docs/ancestors/essays/13-acp-terminal-architecture.md +656 -0
  152. crow_cli-0.1.37/sandbox/docs/ancestors/essays/14-terminal-mcp-implementation.md +1116 -0
  153. crow_cli-0.1.37/sandbox/docs/ancestors/essays/15-terminal-mcp-complete.md +324 -0
  154. crow_cli-0.1.37/sandbox/docs/ancestors/essays/16-fractal-filesystem-sandbox-parallel-tool-calling.md +56 -0
  155. crow_cli-0.1.37/sandbox/docs/ancestors/essays/17-composition-over-inheritance-extension-design.md +279 -0
  156. crow_cli-0.1.37/sandbox/docs/ancestors/essays/18-self-injection-the-god-mode-pattern.md +458 -0
  157. crow_cli-0.1.37/sandbox/docs/ancestors/essays/19-pluggy-the-missing-piece.md +422 -0
  158. crow_cli-0.1.37/sandbox/docs/ancestors/essays/20-terminal-tool-failure-bug-report.md +145 -0
  159. crow_cli-0.1.37/sandbox/docs/ancestors/essays/21-callback-architecture-multi-agent-bridges.md +404 -0
  160. crow_cli-0.1.37/sandbox/docs/ancestors/essays/22-the-agent-was-always-here.md +432 -0
  161. crow_cli-0.1.37/sandbox/docs/ancestors/essays/23-cancellation-solid-plan.md +166 -0
  162. crow_cli-0.1.37/sandbox/docs/ancestors/essays/24-async-tool-hanging-debug-thoughts.md +153 -0
  163. crow_cli-0.1.37/sandbox/docs/ancestors/essays/25-acp-client-terminal-integration.md +272 -0
  164. crow_cli-0.1.37/sandbox/docs/ancestors/essays/26-graceful-cancellation-streaming.md +819 -0
  165. crow_cli-0.1.37/sandbox/docs/ancestors/essays/llms-txt-and-agent-skills.md +334 -0
  166. crow_cli-0.1.37/sandbox/docs/ancestors/fire_up_echo.py +148 -0
  167. crow_cli-0.1.37/sandbox/docs/ancestors/kernel_kernel.py +182 -0
  168. crow_cli-0.1.37/sandbox/docs/ancestors/merging-agents-guide.md +440 -0
  169. crow_cli-0.1.37/sandbox/docs/ancestors/plans/acp-tool-enhancements.md +464 -0
  170. crow_cli-0.1.37/sandbox/docs/ancestors/quick_test.py +69 -0
  171. crow_cli-0.1.37/sandbox/docs/ancestors/research-findings.md +479 -0
  172. crow_cli-0.1.37/sandbox/docs/ancestors/search.py +95 -0
  173. crow_cli-0.1.37/sandbox/docs/ancestors/simple_crow_agent.py +154 -0
  174. crow_cli-0.1.37/sandbox/docs/ancestors/streaming_async_react.py +225 -0
  175. crow_cli-0.1.37/sandbox/docs/ancestors/streaming_async_react_with_db.py +280 -0
  176. crow_cli-0.1.37/sandbox/docs/ancestors/streaming_react.py +201 -0
  177. crow_cli-0.1.37/sandbox/docs/ancestors/terminal_demo.py +283 -0
  178. crow_cli-0.1.37/sandbox/docs/ancestors/test_client_caps.py +151 -0
  179. crow_cli-0.1.37/sandbox/docs/ancestors/test_crow_e2e.py +62 -0
  180. crow_cli-0.1.37/sandbox/docs/ancestors/test_terminal_client.py +267 -0
  181. crow_cli-0.1.37/sandbox/docs/ancestors/zai_tool_integration.py +115 -0
  182. crow_cli-0.1.37/sandbox/fastmcp-test/.gitignore +10 -0
  183. crow_cli-0.1.37/sandbox/fastmcp-test/.python-version +1 -0
  184. crow_cli-0.1.37/sandbox/fastmcp-test/README.md +0 -0
  185. crow_cli-0.1.37/sandbox/fastmcp-test/client.py +38 -0
  186. crow_cli-0.1.37/sandbox/fastmcp-test/docs/essays/00-fractal-filesystem-sandbox-parallel-tool-calling.md +56 -0
  187. crow_cli-0.1.37/sandbox/fastmcp-test/pyproject.toml +20 -0
  188. crow_cli-0.1.37/sandbox/fastmcp-test/src/fastmcp_test/__init__.py +4 -0
  189. crow_cli-0.1.37/sandbox/fastmcp-test/src/fastmcp_test/server/__init__.py +3 -0
  190. crow_cli-0.1.37/sandbox/fastmcp-test/src/fastmcp_test/server/main.py +17 -0
  191. crow_cli-0.1.37/sandbox/fastmcp-test/src/fastmcp_test/tool/__init__.py +3 -0
  192. crow_cli-0.1.37/sandbox/fastmcp-test/src/fastmcp_test/tool/main.py +7 -0
  193. crow_cli-0.1.37/sandbox/fastmcp-test/uv.lock +1401 -0
  194. crow_cli-0.1.37/sandbox/lancedb-testing/.gitignore +4 -0
  195. crow_cli-0.1.37/sandbox/lancedb-testing/.python-version +1 -0
  196. crow_cli-0.1.37/sandbox/lancedb-testing/README.md +38 -0
  197. crow_cli-0.1.37/sandbox/lancedb-testing/bench_colpali.py +141 -0
  198. crow_cli-0.1.37/sandbox/lancedb-testing/bench_dual_model.py +78 -0
  199. crow_cli-0.1.37/sandbox/lancedb-testing/bench_latency.py +182 -0
  200. crow_cli-0.1.37/sandbox/lancedb-testing/lancedb_session.py +120 -0
  201. crow_cli-0.1.37/sandbox/lancedb-testing/load_crow_db.py +162 -0
  202. crow_cli-0.1.37/sandbox/lancedb-testing/main.py +31 -0
  203. crow_cli-0.1.37/sandbox/lancedb-testing/multivector.py +82 -0
  204. crow_cli-0.1.37/sandbox/lancedb-testing/pyproject.toml +15 -0
  205. crow_cli-0.1.37/sandbox/lancedb-testing/uv.lock +2090 -0
  206. crow_cli-0.1.37/sandbox/langfuse-test/.python-version +1 -0
  207. crow_cli-0.1.37/sandbox/langfuse-test/README.md +45 -0
  208. crow_cli-0.1.37/sandbox/langfuse-test/explore.py +280 -0
  209. crow_cli-0.1.37/sandbox/langfuse-test/main.py +22 -0
  210. crow_cli-0.1.37/sandbox/langfuse-test/pyproject.toml +11 -0
  211. crow_cli-0.1.37/sandbox/langfuse-test/uv.lock +536 -0
  212. crow_cli-0.1.37/sandbox/litellm-dashscope/.python-version +1 -0
  213. crow_cli-0.1.37/sandbox/litellm-dashscope/README.md +0 -0
  214. crow_cli-0.1.37/sandbox/litellm-dashscope/main.py +6 -0
  215. crow_cli-0.1.37/sandbox/litellm-dashscope/pyproject.toml +14 -0
  216. crow_cli-0.1.37/sandbox/litellm-dashscope/test_all_models_reasoning.py +176 -0
  217. crow_cli-0.1.37/sandbox/litellm-dashscope/test_fix_correctness.py +421 -0
  218. crow_cli-0.1.37/sandbox/litellm-dashscope/test_llamacpp_reasoning.py +298 -0
  219. crow_cli-0.1.37/sandbox/litellm-dashscope/test_rc_empty.py +142 -0
  220. crow_cli-0.1.37/sandbox/litellm-dashscope/test_reasoning_tool_transition.py +354 -0
  221. crow_cli-0.1.37/sandbox/litellm-dashscope/test_reasoning_transition.py +339 -0
  222. crow_cli-0.1.37/sandbox/litellm-dashscope/uv.lock +1654 -0
  223. crow_cli-0.1.37/sandbox/litellm-proxy/.python-version +1 -0
  224. crow_cli-0.1.37/sandbox/litellm-proxy/README.md +0 -0
  225. crow_cli-0.1.37/sandbox/litellm-proxy/config.yaml +6 -0
  226. crow_cli-0.1.37/sandbox/litellm-proxy/main.py +6 -0
  227. crow_cli-0.1.37/sandbox/litellm-proxy/pyproject.toml +9 -0
  228. crow_cli-0.1.37/sandbox/litellm-proxy/uv.lock +2368 -0
  229. crow_cli-0.1.37/sandbox/murder-architecture.md +18 -0
  230. crow_cli-0.1.37/sandbox/pathlib-test/.python-version +1 -0
  231. crow_cli-0.1.37/sandbox/pathlib-test/README.md +0 -0
  232. crow_cli-0.1.37/sandbox/pathlib-test/main.py +6 -0
  233. crow_cli-0.1.37/sandbox/pathlib-test/pyproject.toml +9 -0
  234. crow_cli-0.1.37/sandbox/pathlib-test/src/pathlib_test/test.py +3 -0
  235. crow_cli-0.1.37/sandbox/pathlib-test/uv.lock +199 -0
  236. crow_cli-0.1.37/sandbox/pyinstaller-async-test/.python-version +1 -0
  237. crow_cli-0.1.37/sandbox/pyinstaller-async-test/main.py +92 -0
  238. crow_cli-0.1.37/sandbox/pyinstaller-async-test/pyproject.toml +11 -0
  239. crow_cli-0.1.37/sandbox/pyinstaller-async-test/test.spec +42 -0
  240. crow_cli-0.1.37/sandbox/pyinstaller-async-test/uv.lock +116 -0
  241. crow_cli-0.1.37/sandbox/repl-agent/.crow/compose.yaml +25 -0
  242. crow_cli-0.1.37/sandbox/repl-agent/.crow/config.yaml +34 -0
  243. crow_cli-0.1.37/sandbox/repl-agent/.crow/litellm/config.yaml +29 -0
  244. crow_cli-0.1.37/sandbox/repl-agent/.crow/searxng/settings.yml +2799 -0
  245. crow_cli-0.1.37/sandbox/repl-agent/.gitignore +1 -0
  246. crow_cli-0.1.37/sandbox/repl-agent/.python-version +1 -0
  247. crow_cli-0.1.37/sandbox/repl-agent/AGENT_CLIENT_INTEGRATION.md +309 -0
  248. crow_cli-0.1.37/sandbox/repl-agent/README.md +393 -0
  249. crow_cli-0.1.37/sandbox/repl-agent/client.py +338 -0
  250. crow_cli-0.1.37/sandbox/repl-agent/compact_agent.py +31 -0
  251. crow_cli-0.1.37/sandbox/repl-agent/compact_e2e_test.py +88 -0
  252. crow_cli-0.1.37/sandbox/repl-agent/compact_fixtures/case_01_system_user_only.json +20 -0
  253. crow_cli-0.1.37/sandbox/repl-agent/compact_fixtures/case_02_reasoning_only.json +25 -0
  254. crow_cli-0.1.37/sandbox/repl-agent/compact_fixtures/case_03_content_only.json +25 -0
  255. crow_cli-0.1.37/sandbox/repl-agent/compact_fixtures/case_04_unexecuted_tools.json +43 -0
  256. crow_cli-0.1.37/sandbox/repl-agent/compact_fixtures/case_05_mid_conversation_all_responded.json +81 -0
  257. crow_cli-0.1.37/sandbox/repl-agent/compact_fixtures/case_06_partial_tool_responses.json +76 -0
  258. crow_cli-0.1.37/sandbox/repl-agent/compact_fixtures/case_07_complete_turn.json +91 -0
  259. crow_cli-0.1.37/sandbox/repl-agent/compact_fixtures/case_08_reasoning_ending.json +91 -0
  260. crow_cli-0.1.37/sandbox/repl-agent/compact_fixtures/case_09_content_ending.json +91 -0
  261. crow_cli-0.1.37/sandbox/repl-agent/compact_fixtures/chubby_full_conversation.jsonl +9 -0
  262. crow_cli-0.1.37/sandbox/repl-agent/docs/AGENT_CLIENT_PLAN.md +341 -0
  263. crow_cli-0.1.37/sandbox/repl-agent/docs/COMPACT_AND_SCHEMA_REWRITE.md +158 -0
  264. crow_cli-0.1.37/sandbox/repl-agent/docs/STRATEGIC_PIVOT.md +254 -0
  265. crow_cli-0.1.37/sandbox/repl-agent/generate_compact_fixtures.py +149 -0
  266. crow_cli-0.1.37/sandbox/repl-agent/iterative_refinement.py +295 -0
  267. crow_cli-0.1.37/sandbox/repl-agent/iterative_refinement_agent.py +768 -0
  268. crow_cli-0.1.37/sandbox/repl-agent/iterative_refinement_mcp.py +54 -0
  269. crow_cli-0.1.37/sandbox/repl-agent/main.py +46 -0
  270. crow_cli-0.1.37/sandbox/repl-agent/multi_compact.py +37 -0
  271. crow_cli-0.1.37/sandbox/repl-agent/orchestrator.py +275 -0
  272. crow_cli-0.1.37/sandbox/repl-agent/pyproject.toml +18 -0
  273. crow_cli-0.1.37/sandbox/repl-agent/run_iterative_refinement_agent.py +87 -0
  274. crow_cli-0.1.37/sandbox/repl-agent/run_repl_clients.py +73 -0
  275. crow_cli-0.1.37/sandbox/repl-agent/scratch_db.py +41 -0
  276. crow_cli-0.1.37/sandbox/repl-agent/task_description.yaml +7 -0
  277. crow_cli-0.1.37/sandbox/repl-agent/test_compact_fixtures.py +156 -0
  278. crow_cli-0.1.37/sandbox/repl-agent/test_compact_one.py +112 -0
  279. crow_cli-0.1.37/sandbox/repl-agent/test_compact_real.py +348 -0
  280. crow_cli-0.1.37/sandbox/repl-agent/test_compact_run.py +146 -0
  281. crow_cli-0.1.37/sandbox/repl-agent/test_drift_instrumentation.py +131 -0
  282. crow_cli-0.1.37/sandbox/repl-agent/test_hook.py +40 -0
  283. crow_cli-0.1.37/sandbox/repl-agent/test_iterative_refinement.py +256 -0
  284. crow_cli-0.1.37/sandbox/repl-agent/test_multi_compact_client.py +175 -0
  285. crow_cli-0.1.37/sandbox/repl-agent/test_refinement_agent.py +242 -0
  286. crow_cli-0.1.37/sandbox/repl-agent/test_repl_client.py +124 -0
  287. crow_cli-0.1.37/sandbox/repl-agent/uv.lock +1568 -0
  288. crow_cli-0.1.37/sandbox/yaml-configs/.python-version +1 -0
  289. crow_cli-0.1.37/sandbox/yaml-configs/README.md +0 -0
  290. crow_cli-0.1.37/sandbox/yaml-configs/main.py +6 -0
  291. crow_cli-0.1.37/sandbox/yaml-configs/pyproject.toml +7 -0
  292. crow_cli-0.1.37/scripts/consolidate_history.py +262 -0
  293. crow_cli-0.1.37/scripts/e2e_memory_live.py +216 -0
  294. crow_cli-0.1.37/scripts/mcp_ram_repro.py +149 -0
  295. crow_cli-0.1.37/scripts/merge_live_into_migrated.py +95 -0
  296. crow_cli-0.1.37/scripts/migrate_taskmaster.py +224 -0
  297. crow_cli-0.1.37/scripts/migrate_v5.py +191 -0
  298. crow_cli-0.1.37/src/crow_cli/__init__.py +22 -0
  299. crow_cli-0.1.37/src/crow_cli/agent/__init__.py +16 -0
  300. {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/agent/compact.py +5 -3
  301. {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/agent/llm.py +1 -1
  302. {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/agent/main.py +340 -118
  303. {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/agent/mcp_client.py +62 -38
  304. {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/agent/memory.py +39 -12
  305. {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/agent/model_routing.py +1 -1
  306. {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/agent/prompt.py +1 -1
  307. {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/agent/react.py +161 -10
  308. {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/agent/session.py +127 -32
  309. {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/agent/tools.py +85 -4
  310. crow_cli-0.1.37/src/crow_cli/cli/__init__.py +0 -0
  311. {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/cli/init_cmd.py +6 -5
  312. {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/cli/main.py +381 -63
  313. crow_cli-0.1.37/src/crow_cli/client/__init__.py +0 -0
  314. {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/client/main.py +21 -39
  315. crow_cli-0.1.37/src/crow_cli/client/subagent.py +184 -0
  316. crow_cli-0.1.37/src/crow_cli/config/__init__.py +55 -0
  317. crow_cli-0.1.34/src/crow_cli/agent/configure.py → crow_cli-0.1.37/src/crow_cli/config/config.py +138 -19
  318. {crow_cli-0.1.34/src/crow_cli/agent → crow_cli-0.1.37/src/crow_cli/config}/default/__init__.py +2 -2
  319. {crow_cli-0.1.34/src/crow_cli/agent → crow_cli-0.1.37/src/crow_cli/config}/default/defaults.py +29 -10
  320. crow_cli-0.1.37/src/crow_cli/mcp/__init__.py +35 -0
  321. crow_cli-0.1.37/src/crow_cli/mcp/editor/README.md +0 -0
  322. crow_cli-0.1.37/src/crow_cli/mcp/editor/__init__.py +0 -0
  323. crow_cli-0.1.37/src/crow_cli/mcp/editor/main.py +462 -0
  324. crow_cli-0.1.37/src/crow_cli/mcp/memory/__init__.py +0 -0
  325. crow_cli-0.1.37/src/crow_cli/mcp/memory/client.py +60 -0
  326. crow_cli-0.1.37/src/crow_cli/mcp/memory/main.py +508 -0
  327. crow_cli-0.1.37/src/crow_cli/mcp/memory/store.py +220 -0
  328. crow_cli-0.1.37/src/crow_cli/mcp/read/README.md +0 -0
  329. crow_cli-0.1.37/src/crow_cli/mcp/read/__init__.py +0 -0
  330. crow_cli-0.1.37/src/crow_cli/mcp/read/main.py +128 -0
  331. crow_cli-0.1.37/src/crow_cli/mcp/server/README.md +0 -0
  332. crow_cli-0.1.37/src/crow_cli/mcp/server/__init__.py +3 -0
  333. crow_cli-0.1.37/src/crow_cli/mcp/server/app.py +34 -0
  334. crow_cli-0.1.37/src/crow_cli/mcp/server/logger.py +56 -0
  335. crow_cli-0.1.37/src/crow_cli/mcp/server/main.py +79 -0
  336. crow_cli-0.1.37/src/crow_cli/mcp/task/__init__.py +0 -0
  337. crow_cli-0.1.37/src/crow_cli/mcp/task/main.py +329 -0
  338. crow_cli-0.1.37/src/crow_cli/mcp/terminal/README.md +0 -0
  339. crow_cli-0.1.37/src/crow_cli/mcp/terminal/__init__.py +3 -0
  340. crow_cli-0.1.37/src/crow_cli/mcp/terminal/backend.py +260 -0
  341. crow_cli-0.1.37/src/crow_cli/mcp/terminal/constants.py +37 -0
  342. crow_cli-0.1.37/src/crow_cli/mcp/terminal/logging_config.py +61 -0
  343. crow_cli-0.1.37/src/crow_cli/mcp/terminal/main.py +135 -0
  344. crow_cli-0.1.37/src/crow_cli/mcp/terminal/metadata.py +94 -0
  345. crow_cli-0.1.37/src/crow_cli/mcp/terminal/session.py +276 -0
  346. crow_cli-0.1.37/src/crow_cli/mcp/vision/__init__.py +0 -0
  347. crow_cli-0.1.37/src/crow_cli/mcp/vision/client.py +24 -0
  348. crow_cli-0.1.37/src/crow_cli/mcp/vision/main.py +105 -0
  349. crow_cli-0.1.37/src/crow_cli/mcp/web_fetch/README.md +0 -0
  350. crow_cli-0.1.37/src/crow_cli/mcp/web_fetch/__init__.py +3 -0
  351. crow_cli-0.1.37/src/crow_cli/mcp/web_fetch/main.py +102 -0
  352. crow_cli-0.1.37/src/crow_cli/mcp/web_search/README.md +23 -0
  353. crow_cli-0.1.37/src/crow_cli/mcp/web_search/__init__.py +3 -0
  354. crow_cli-0.1.37/src/crow_cli/mcp/web_search/main.py +101 -0
  355. crow_cli-0.1.37/src/crow_cli/mcp/write/README.md +0 -0
  356. crow_cli-0.1.37/src/crow_cli/mcp/write/__init__.py +0 -0
  357. crow_cli-0.1.37/src/crow_cli/mcp/write/main.py +41 -0
  358. crow_cli-0.1.37/src/crow_cli/memory/__init__.py +115 -0
  359. crow_cli-0.1.37/src/crow_cli/memory/db.py +77 -0
  360. crow_cli-0.1.37/src/crow_cli/memory/ids.py +37 -0
  361. crow_cli-0.1.37/src/crow_cli/memory/messages.py +100 -0
  362. crow_cli-0.1.37/src/crow_cli/memory/models.py +115 -0
  363. crow_cli-0.1.37/src/crow_cli/memory/reads.py +306 -0
  364. crow_cli-0.1.37/src/crow_cli/memory/writes.py +223 -0
  365. {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/conftest.py +113 -54
  366. {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/e2e/test_react_live.py +3 -3
  367. {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/e2e/test_session_update_transmission.py +18 -7
  368. crow_cli-0.1.37/tests/e2e/test_task_high_priority_preemption.py +264 -0
  369. crow_cli-0.1.37/tests/e2e/test_task_mcp_launch.py +351 -0
  370. crow_cli-0.1.37/tests/e2e/test_task_race_regression.py +284 -0
  371. {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/integration/test_acp_http.py +1 -1
  372. {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/integration/test_agent_init.py +1 -1
  373. {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/integration/test_react_loop_cancel_integrity.py +3 -2
  374. crow_cli-0.1.37/tests/integration/test_react_loop_delegation_hold.py +211 -0
  375. {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/integration/test_react_loop_tool_round.py +288 -1
  376. {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/integration/test_reasoning_effort_react_loop.py +1 -1
  377. crow_cli-0.1.37/tests/mcp/integration/test_server_stdio.py +88 -0
  378. crow_cli-0.1.37/tests/mcp/test_edit.py +401 -0
  379. crow_cli-0.1.37/tests/mcp/test_memory.py +167 -0
  380. crow_cli-0.1.37/tests/mcp/test_memory_store.py +160 -0
  381. crow_cli-0.1.37/tests/mcp/test_read.py +97 -0
  382. crow_cli-0.1.37/tests/mcp/test_server.py +53 -0
  383. crow_cli-0.1.37/tests/mcp/test_task_tool.py +108 -0
  384. crow_cli-0.1.37/tests/mcp/test_terminal.py +36 -0
  385. crow_cli-0.1.37/tests/mcp/test_vision.py +43 -0
  386. crow_cli-0.1.37/tests/mcp/test_web_fetch.py +62 -0
  387. crow_cli-0.1.37/tests/mcp/test_web_search.py +51 -0
  388. crow_cli-0.1.37/tests/mcp/test_write.py +35 -0
  389. crow_cli-0.1.37/tests/memory/test_migrate_taskmaster.py +231 -0
  390. crow_cli-0.1.37/tests/memory/test_migrate_v5.py +159 -0
  391. crow_cli-0.1.37/tests/memory/test_session_mcp_servers.py +154 -0
  392. crow_cli-0.1.37/tests/memory/test_store.py +266 -0
  393. crow_cli-0.1.37/tests/memory/test_task_state.py +255 -0
  394. crow_cli-0.1.37/tests/unit/test_cli_fork_flags.py +38 -0
  395. crow_cli-0.1.37/tests/unit/test_cli_telemetry.py +135 -0
  396. {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/unit/test_compact.py +7 -2
  397. {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/unit/test_configure.py +1 -1
  398. crow_cli-0.1.37/tests/unit/test_fork.py +218 -0
  399. crow_cli-0.1.37/tests/unit/test_mcp_client.py +105 -0
  400. crow_cli-0.1.37/tests/unit/test_model_override.py +137 -0
  401. {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/unit/test_model_routing.py +1 -1
  402. crow_cli-0.1.37/tests/unit/test_per_model_compact_threshold.py +106 -0
  403. {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/unit/test_react.py +7 -5
  404. {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/unit/test_reasoning_effort.py +141 -1
  405. {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/unit/test_session.py +46 -1
  406. crow_cli-0.1.37/tests/unit/test_session_mcp_servers_wiring.py +191 -0
  407. crow_cli-0.1.37/tests/unit/test_subagent_parse_servers.py +55 -0
  408. {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/unit/test_system_prompt_skills.py +1 -1
  409. crow_cli-0.1.37/tests/unit/test_task_tool_schema.py +203 -0
  410. crow_cli-0.1.37/tests/unit/test_version.py +19 -0
  411. {crow_cli-0.1.34 → crow_cli-0.1.37}/uv.lock +358 -40
  412. crow_cli-0.1.34/.gitignore +0 -7
  413. crow_cli-0.1.34/run_tests.sh +0 -4
  414. crow_cli-0.1.34/src/crow_cli/__init__.py +0 -1
  415. crow_cli-0.1.34/src/crow_cli/agent/__init__.py +0 -4
  416. crow_cli-0.1.34/tests/unit/test_model_override.py +0 -39
  417. {crow_cli-0.1.34 → crow_cli-0.1.37}/.python-version +0 -0
  418. {crow_cli-0.1.34 → crow_cli-0.1.37}/examples/mc_escher_loop.py +0 -0
  419. {crow_cli-0.1.34 → crow_cli-0.1.37}/examples/quick_test.py +0 -0
  420. /crow_cli-0.1.34/src/crow_cli/cli/__init__.py → /crow_cli-0.1.37/sandbox/crow-acp-learning/README.md +0 -0
  421. /crow_cli-0.1.34/src/crow_cli/client/__init__.py → /crow_cli-0.1.37/sandbox/crow-test/README.md +0 -0
  422. {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/agent/context.py +0 -0
  423. {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/agent/hooks.py +0 -0
  424. {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/agent/logger.py +0 -0
  425. {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/agent/slash.py +0 -0
  426. {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/agent_runner.py +0 -0
  427. {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/cli/install.py +0 -0
  428. {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/client/terminal.py +0 -0
  429. {crow_cli-0.1.34/src/crow_cli/agent → crow_cli-0.1.37/src/crow_cli/config}/default/searxng_settings.py +0 -0
  430. {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/__init__.py +0 -0
  431. {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/analyze_payload_cache_invalidation.py +0 -0
  432. {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/analyze_payload_deep.py +0 -0
  433. {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/integration/test_auth_validation.py +0 -0
  434. {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/unit/test_client_terminal.py +0 -0
  435. {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/unit/test_compact_last_messages_list_content.json +0 -0
  436. {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/unit/test_compact_last_messages_list_content.py +0 -0
  437. {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/unit/test_json_repair.py +0 -0
  438. {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/unit/test_request_logging.py +0 -0
  439. {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/unit/test_stream_processing.py +0 -0
  440. {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/unit/test_usage_update.py +0 -0
  441. {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/unit/test_uv_project_enforcement.py +0 -0
@@ -0,0 +1,2 @@
1
+ ZAI_API_KEY=lm-studio
2
+ ZAI_BASE_URL=http://coast-after-3:1234/v1
@@ -0,0 +1,101 @@
1
+ name: Build Binaries
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*" # Trigger on version tags like v0.1.13
7
+
8
+ jobs:
9
+ build:
10
+ name: Build ${{ matrix.os }}
11
+ runs-on: ${{ matrix.os }}
12
+ strategy:
13
+ matrix:
14
+ os:
15
+ [
16
+ ubuntu-22.04,
17
+ macos-15-intel,
18
+ macos-latest,
19
+ windows-latest,
20
+ ubuntu-24.04-arm,
21
+ ]
22
+ include:
23
+ - os: ubuntu-22.04
24
+ target: linux-x86_64
25
+ archive_name: crow-cli-linux-x86_64.tar.gz
26
+ - os: macos-15-intel
27
+ target: darwin-x86_64
28
+ archive_name: crow-cli-darwin-x86_64.tar.gz
29
+ - os: macos-latest
30
+ target: darwin-aarch64
31
+ archive_name: crow-cli-darwin-aarch64.tar.gz
32
+ - os: windows-latest
33
+ target: windows-x86_64
34
+ archive_name: crow-cli-windows-x86_64.zip
35
+ - os: ubuntu-24.04-arm
36
+ target: linux-aarch64
37
+ archive_name: crow-cli-linux-aarch64.tar.gz
38
+
39
+ steps:
40
+ - name: Checkout
41
+ uses: actions/checkout@v4
42
+
43
+ - name: Install uv
44
+ uses: astral-sh/setup-uv@v5
45
+ with:
46
+ enable-cache: true
47
+
48
+ - name: Set up Python
49
+ uses: actions/setup-python@v5
50
+ with:
51
+ python-version-file: "pyproject.toml"
52
+
53
+ - name: Install dependencies
54
+ run: |
55
+ uv pip install --system pyinstaller
56
+
57
+ - name: Build with PyInstaller
58
+ run: |
59
+ uv run pyinstaller crow-cli.spec --noconfirm
60
+
61
+ - name: Create archive
62
+ shell: bash
63
+ run: |
64
+ cd dist
65
+ if [ "${{ runner.os }}" == "Windows" ]; then
66
+ 7z a -tzip ${{ matrix.archive_name }} crow-cli.exe
67
+ else
68
+ tar -czvf ${{ matrix.archive_name }} crow-cli
69
+ fi
70
+
71
+ - name: Upload artifact
72
+ uses: actions/upload-artifact@v4
73
+ with:
74
+ name: crow-cli-${{ matrix.target }}
75
+ path: ${{ matrix.archive_name }}
76
+ retention-days: 30
77
+
78
+ release:
79
+ name: Create Release
80
+ needs: build
81
+ runs-on: ubuntu-latest
82
+ if: startsWith(github.ref, 'refs/tags/')
83
+ permissions:
84
+ contents: write
85
+
86
+ steps:
87
+ - name: Download all artifacts
88
+ uses: actions/download-artifact@v4
89
+ with:
90
+ pattern: crow-cli-*
91
+ merge-multiple: true
92
+
93
+ - name: Create Release
94
+ uses: softprops/action-gh-release@v1
95
+ with:
96
+ files: |
97
+ crow-cli-*.tar.gz
98
+ crow-cli-*.zip
99
+ draft: false
100
+ prerelease: false
101
+ generate_release_notes: true
@@ -0,0 +1,42 @@
1
+ name: Publish crow-cli to PyPI
2
+
3
+ # Manual-only publish of the single package in this repo. Idempotent: a
4
+ # version already live on PyPI is skipped, so a failed run can simply be
5
+ # re-dispatched.
6
+ on:
7
+ workflow_dispatch:
8
+
9
+ jobs:
10
+ publish:
11
+ runs-on: ubuntu-latest
12
+ environment:
13
+ name: pypi
14
+ url: https://pypi.org/p/crow-cli
15
+ permissions:
16
+ id-token: write # Required for trusted publishing
17
+ contents: read
18
+
19
+ steps:
20
+ - name: Checkout
21
+ uses: actions/checkout@v4
22
+
23
+ - name: Install uv
24
+ uses: astral-sh/setup-uv@v5
25
+ with:
26
+ enable-cache: true
27
+
28
+ - name: Set up Python
29
+ uses: actions/setup-python@v5
30
+ with:
31
+ python-version-file: "pyproject.toml"
32
+
33
+ - name: Build and publish (skip if already on PyPI)
34
+ run: |
35
+ set -euo pipefail
36
+ VERSION=$(grep -m1 '^version' pyproject.toml | sed -E 's/.*"(.*)".*/\1/')
37
+ if curl -fsS "https://pypi.org/pypi/crow-cli/$VERSION/json" -o /dev/null; then
38
+ echo "crow-cli $VERSION is already on PyPI — skipping publish"
39
+ else
40
+ uv build
41
+ uv publish
42
+ fi
@@ -0,0 +1,36 @@
1
+ # Python-generated files
2
+ __pycache__/
3
+ *.py[oc]
4
+ build/
5
+ dist/
6
+ wheels/
7
+ *.egg-info
8
+
9
+ # Virtual environments
10
+ .venv
11
+
12
+ # keys
13
+ .env
14
+
15
+ # test database
16
+ *.db
17
+ *.db*
18
+
19
+ # test caches
20
+ .pytest_cache
21
+ config/logs/*.log
22
+ config-done
23
+
24
+ # MyST build output
25
+ docs/_build/
26
+ _site/
27
+
28
+ crow-editor/frontend/node_modules
29
+
30
+ *.log
31
+ *.log*
32
+
33
+ sandbox/lancedb-testing/pylate_lancedb/
34
+
35
+ # Rust
36
+ target/
@@ -0,0 +1,3 @@
1
+ # RULES
2
+
3
+ - Never mention the user's emotional state. I'm here to work, NOT be psychoanalyzed by a machine.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 - present Thomas Wood
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -1,28 +1,37 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: crow-cli
3
- Version: 0.1.34
3
+ Version: 0.1.37
4
4
  Summary: Add your description here
5
5
  Project-URL: Homepage, https://github.com/crow-cli/crow-cli
6
6
  Project-URL: Repository, https://github.com/crow-cli/crow-cli
7
7
  Project-URL: Issues, https://github.com/crow-cli/crow-cli/issues
8
8
  Project-URL: Documentation, https://github.com/crow-cli/crow-cli#readme
9
+ License-File: LICENSE.md
9
10
  Requires-Python: >=3.14
10
11
  Requires-Dist: agent-client-protocol[http]<0.13.0,>=0.12.0
11
12
  Requires-Dist: coolname>=2.2.0
12
- Requires-Dist: crow-memory==0.1.34
13
13
  Requires-Dist: directory-tree>=1.0.0
14
14
  Requires-Dist: docker>=7.2.0
15
- Requires-Dist: fastmcp>=2.14.5
15
+ Requires-Dist: fastmcp>=3.4.2
16
16
  Requires-Dist: httpx>=0.28.1
17
17
  Requires-Dist: hypercorn>=0.17
18
18
  Requires-Dist: jinja2>=3.1.6
19
+ Requires-Dist: markdownify>=0.14.0
19
20
  Requires-Dist: openai>=2.21.0
21
+ Requires-Dist: opencv-python>=4.13.0.92
22
+ Requires-Dist: pydantic>=2.12.5
20
23
  Requires-Dist: pyyaml>=6.0.3
24
+ Requires-Dist: readabilipy>=0.3.0
21
25
  Requires-Dist: rich>=14.3.3
26
+ Requires-Dist: sqlalchemy>=2.0
22
27
  Requires-Dist: typer>=0.24.1
23
28
  Description-Content-Type: text/markdown
24
29
 
25
- # crow-cli
30
+ <p align="center">
31
+ <img src="https://github.com/crow-cli/crow-cli/blob/main/docs/img/crow-logo-crop.png?raw=true" alt="crow logo" width=500/>
32
+ </p>
33
+
34
+ # 🐦‍⬛ Crow
26
35
 
27
36
  <p>
28
37
  <a href="https://pypi.org/project/crow-cli/"><img src="https://img.shields.io/pypi/v/crow-cli" alt="PyPI version"></a>
@@ -55,7 +64,7 @@ Install the CLI:
55
64
  ```bash
56
65
  git clone https://github.com/crow-cli/crow-cli.git
57
66
  cd crow-cli
58
- uv tool install crow-cli --python 3.14 # or run without installing: uvx crow-cli --help
67
+ uv tool install . --python 3.14 # or run without installing: uvx --from . crow-cli --help
59
68
  ```
60
69
 
61
70
  Initialize your configuration and start the backing services:
@@ -109,15 +118,13 @@ The agent detects client capabilities (terminals, file read/write) and uses the
109
118
 
110
119
  ## What's in the box
111
120
 
112
- crow-cli is a monorepo. The pieces:
113
-
114
- ### crow-cli — the agent
121
+ ### The agent
115
122
 
116
- The ACP-native agent: a streaming ReAct loop with tool calling, cancellation, conversation compaction, and multimodal input. Provider and model configuration lives in `~/.agents/crow/config.yaml`.
123
+ An ACP-native agent: a streaming ReAct loop with tool calling, cancellation, conversation compaction, and multimodal input. Provider and model configuration lives in `~/.agents/crow/config.yaml`.
117
124
 
118
125
  ### Persistence — sqlite memory
119
126
 
120
- Sessions persist to a single sqlite database (`~/.agents/crow/crow.db`, schema v3, WAL mode) with an FTS5 index for BM25 keyword search. Images in messages are written to `~/.agents/crow/images/` and referenced by path; they are hydrated to base64 data URLs only when the conversation is sent to the LLM. The same database backs the memory API, exposed to agents as three tools:
127
+ Sessions persist to a single sqlite database (`~/.agents/crow/crow.db`, schema v5, WAL mode) with an FTS5 index for BM25 keyword search. Images in messages are written to `~/.agents/crow/images/` and referenced by path; they are hydrated to base64 data URLs only when the conversation is sent to the LLM. The same database backs the memory API, exposed to agents as three tools:
121
128
 
122
129
  - `list_sessions()` — sessions ordered by recent activity (who's working on what)
123
130
  - `query_memory(query)` — find which session discussed something, across all sessions
@@ -125,9 +132,9 @@ Sessions persist to a single sqlite database (`~/.agents/crow/crow.db`, schema v
125
132
 
126
133
  This is what makes multi-agent delegation work: launch a worker, then read its thoughts from any other agent. No service to run — the sqlite file is the integration point.
127
134
 
128
- ### crow-mcp — the tool server
135
+ ### Built-in MCP tool server
129
136
 
130
- The built-in [MCP](https://modelcontextprotocol.io/) server providing the agent's tools:
137
+ The bundled [MCP](https://modelcontextprotocol.io/) server (`crow-cli mcp`) providing the agent's tools:
131
138
 
132
139
  | Tool | What it does |
133
140
  |------|--------------|
@@ -139,11 +146,11 @@ The built-in [MCP](https://modelcontextprotocol.io/) server providing the agent'
139
146
 
140
147
  **Extensible by design:** register any MCP server in `~/.agents/crow/config.yaml` and its tools appear alongside these automatically.
141
148
 
142
- > ⚠️ **Tool names are not namespaced.** crow-mcp registers its tools as `read`, `edit`, `terminal`, … — not `crow-mcp_read`. When you add your own MCP servers, watch for name collisions.
149
+ > ⚠️ **Tool names are not namespaced.** The built-in server registers its tools as `read`, `edit`, `terminal`, … — not `crow_read`. When you add your own MCP servers, watch for name collisions.
143
150
 
144
151
  ### SearXNG — web search
145
152
 
146
- crow-cli ships a maintained SearXNG configuration (stored as JSON so the agent can drive it over MCP) so web search works out of the box, without hand-editing SearXNG settings.
153
+ crow-cli ships a maintained SearXNG configuration (stored as python so the agent works with PyInstaller — sorry) so web search works out of the box, without hand-editing SearXNG settings.
147
154
 
148
155
  ### Skills
149
156
 
@@ -169,28 +176,30 @@ models:
169
176
  ```bash
170
177
  git clone https://github.com/crow-cli/crow-cli.git
171
178
  cd crow-cli
172
- uv sync --project crow-cli
179
+ uv sync
173
180
  ```
174
181
 
175
- Run the unit tests — fast and hermetic, no services required (unit tests that touch sessions use an in-memory fake of the persistence client; the integration tier uses a real throwaway sqlite db):
182
+ Run the test suite — every tier runs unconditionally (unit + integration + e2e live LLM):
176
183
 
177
184
  ```bash
178
- uv run --project crow-cli pytest crow-cli/tests/unit
185
+ uv run pytest tests
179
186
  ```
180
187
 
181
- The persistence layer itself lives in the `crow-memory` package and is tested in `crow-memory/tests/test_store.py`. Integration and end-to-end tiers are opt-in:
188
+ The persistence layer itself lives in `src/crow_cli/memory` and is tested in `tests/memory/test_store.py`. To run a single tier, point pytest at its directory:
182
189
 
183
190
  ```bash
184
- uv run --project crow-cli pytest crow-cli/tests --run-integration # spawn the agent
185
- uv run --project crow-cli pytest crow-cli/tests --run-e2e # live LLM calls (costs $)
191
+ uv run pytest tests/unit # fast, hermetic
192
+ uv run pytest tests/integration # real sqlite, agent spawn
193
+ uv run pytest tests/e2e # live LLM calls (costs $)
186
194
  ```
187
195
 
188
196
  ## Project layout
189
197
 
190
198
  ```
191
- crow-cli/ the agent — ACP server, ReAct loop, CLI
192
- crow-mcp/ built-in MCP tool server
193
- crow-memory/ shared SQL persistence (sqlite default, postgres-ready)
199
+ src/crow_cli/ the agent — ACP server, ReAct loop, CLI
200
+ src/crow_cli/config/ config loading, defaults, overrides (shared by every layer)
201
+ src/crow_cli/mcp/ built-in MCP tool server (`crow-cli mcp`)
202
+ src/crow_cli/memory/ shared SQL persistence (sqlite default, postgres-ready)
194
203
  ```
195
204
 
196
205
  ## License
@@ -0,0 +1,263 @@
1
+ # PLAN — taskmaster sprint (bg-only task system)
2
+
3
+ ## **DO NOT ASK USER FOR FEEDBACK — THIS IS THE USER FEEDBACK.**
4
+ ## **DO NOT ASK USER FOR NEXT STEPS — THESE ARE THE NEXT STEPS.**
5
+
6
+ Build/test (ALL tiers mandatory, every run):
7
+
8
+ cd /home/thomas/src/crow-team/crow-cli-taskmaster
9
+ uv --project . run pytest tests -q
10
+
11
+ e2e uses the live model qwen3.8-max-preview (alibaba); the default
12
+ llamacpp host coast-after-3 is DOWN. Every commit ends with the agent's
13
+ `Session-Id:` trailer. Scope capture + the user's verbatim architecture
14
+ quotes: TODO.md. Current trajectory: 0 → 1 → 2 → 3 → 4 → 5 → 6.
15
+
16
+ One-liner: all tool calling is MCP JSON-RPC to a separate process; ACP is
17
+ the client↔agent contract; the coupling between the two is SHARED SQLITE
18
+ STATE, never in-process communication. Subagents are real ACP agents the
19
+ task tool spawns as subprocesses and drives as an ACP client. Priority
20
+ decides delivery: high = cancel→prompt, low = hold to end of prompt. No
21
+ run_mode, no park, no hostage, no fg.
22
+
23
+ ---
24
+
25
+ ## Phase 0 — mcpServers round trip through sqlite — DONE 2026-08-23
26
+
27
+ The user-designated critical path: the task tool (separate MCP server
28
+ process) must read the parent session's client-defined mcpServers from
29
+ sqlite to pass them through to the delegated agent.
30
+
31
+ - 0.1 `session_mcp_servers` table (session_id PK, servers JSON,
32
+ updated_at) + `set_session_mcp_servers` / `get_session_mcp_servers`
33
+ in memory writes/reads. Additive — create_all picks it up, zero
34
+ migration drama on live dbs.
35
+ - 0.2 `MemoryClient` async wrappers; `_mcp_servers_to_wire`
36
+ (model_dump(mode="json", exclude_none=True)) in agent/main.py;
37
+ persisted at session/new, session/load, fork_session — keyed by
38
+ WIRE id exactly like the in-process map. Hydration
39
+ (_provision_session) never overwrites the saved row.
40
+ - 0.3 FakeMemoryClient gains the same surface (+ query_messages,
41
+ get_max_fork_idx the fork path needs).
42
+
43
+ Verified: tests/memory/test_session_mcp_servers.py (5, incl. two-engine
44
+ cross-process + explicit-[] toolless) and
45
+ tests/unit/test_session_mcp_servers_wiring.py (9, incl. real ACP objects
46
+ → wire dicts → parse-back equality; real ACP shapes learned the hard way:
47
+ name required, env/headers are {name,value} lists, type const explicit).
48
+ 413 fast-tier tests green.
49
+
50
+ ## Phase 1 — `task` tool schema prototype (FastMCP experiment) — DONE 2026-08-23
51
+
52
+ EXPERIMENT FIRST: before any plumbing, prove the tool shape.
53
+
54
+ - 1.1 Prototype in tests/unit: FastMCP tool `task(updates:
55
+ list[PromptItem | CancelTurnItem])`. PromptItem{action="prompt",
56
+ prompt, session_id=None, priority="low", model=None};
57
+ CancelTurnItem{action="cancel", session_id, prompt=None}. The two
58
+ item types have OVERLAPPING fields ({prompt, session_id} both
59
+ optional-ish) — the hypothesis is an explicit discriminator is
60
+ REQUIRED; prove the ambiguity fails/misparses without it and the
61
+ discriminated union round-trips.
62
+ - 1.2 Dump the schema the model would see (FastMCP → tool parameters);
63
+ assert it names both variants and the discriminator.
64
+ - 1.3 Call the tool through FastMCP with model-shaped args (launch,
65
+ re-prompt, cancel+follow-up in ONE updates list) and assert the
66
+ parsed pydantic objects.
67
+
68
+ Verified when: the prototype tests are green and the generated schema is
69
+ something a model can follow (eyeball it in the test output once).
70
+
71
+ Verified: tests/unit/test_task_tool_schema.py — 8 green. Ambiguity proven
72
+ (one dict validates as BOTH naive variants); discriminated union parses
73
+ launch/re-prompt/cancel+follow-up; omitted action REJECTED (pydantic
74
+ discriminator is strict — the model must state intent, the schema marks
75
+ action const per variant); model-visible schema names PromptItem +
76
+ CancelTurn + action + high/low; mixed batch round-trips through the real
77
+ FastMCP call path; unknown action rejected, not guessed.
78
+
79
+ ## Phase 2 — task state in sqlite — DONE 2026-08-23
80
+
81
+ - 2.1 `tasks` + `task_deliveries` tables (additive v5): see TODO.md for
82
+ columns. deliveries = durable mailbox; status pending|delivered.
83
+ - 2.2 memory reads/writes: launch_task / finish_task (STATE FIRST:
84
+ update tasks row + insert delivery in ONE commit) /
85
+ pending_deliveries / mark_delivered / task_by_id / running_tasks.
86
+ - 2.3 Cross-process test: writer engine finishes a task, reader engine
87
+ sees the delivery (the MCP-server-process / agent-process split).
88
+
89
+ Verified when: unit tests green incl. the two-engine case and idempotent
90
+ double-finish (a second finish on a terminal task is a no-op).
91
+
92
+ Verified: tests/memory/test_task_state.py — 7 green: launch registers
93
+ running state cross-engine; finish flips status AND lands the delivery in
94
+ ONE commit (read back through a second engine); double-finish no-op;
95
+ unknown-task no-op; mark_delivered drains in arrival order; priority rides
96
+ both rows; mailboxes per-session.
97
+
98
+ ## Phase 3 — client driver + task tool + live e2e — DONE 2026-08-23
99
+
100
+ Placement (user-corrected, verbatim): "IT PROBABLY SHOULD BE SPLIT
101
+ INTELLIGENTLY BETWEEN CLIENT AND MCP" — client package owns the ACP
102
+ machinery (headless, no state knowledge), mcp package owns the `task`
103
+ tool (schema + sqlite coupling + dispatch), agent package gets NOTHING
104
+ new. The two couple through sqlite, never in-process.
105
+
106
+ - 3.1 WAKE EXPERIMENT — DONE (de4e6596): `_run_internal_round` in
107
+ agent/main.py, synthetic round with NO client request; live-model
108
+ e2e green (tests/e2e/test_wake_experiment.py). Race sentinel
109
+ converted (150s, expects the hang) — flips into the regression at
110
+ Phase 6.1.
111
+ - 3.2a CLIENT DRIVER — DONE (b139549e): src/crow_cli/client/subagent.py —
112
+ spawn_agent_process() free fn, HeadlessClient (swallows updates;
113
+ fs/permission = method_not_found), SubagentDriver (start/
114
+ new_session/load_session/prompt/cancel/close; terminal=False at
115
+ handshake). CrowClient.spawn_agent delegates to the shared spawn
116
+ fn — one spawn path.
117
+ - 3.2b THE TASK TOOL — DONE (a6211824): src/crow_cli/mcp/task/main.py —
118
+ ONE `task` tool, `updates: list[PromptItem | CancelTurn]`
119
+ discriminated on action (Phase 1 models promoted). Launch: STATE
120
+ FIRST → driver start → session/new with the OWNER's mcpServers
121
+ passthrough (Phase 0 round trip consumed) → watcher. Re-prompt:
122
+ live mid-turn refuses; terminal row reopens + session/load (the
123
+ agent implements load, NOT resume). Cancel: driver.cancel() →
124
+ pending prompt resolves cancelled; optional follow-up reopens the
125
+ row and the watcher loop continues. New state fns:
126
+ set_task_sub_session, reopen_task, task_by_sub_session,
127
+ count_tasks (task-N numbering). Owner attribution: the agent
128
+ intercepts tool_name == "task" and passes the calling session's
129
+ wire id through the tools/call _meta — execute_acp_task +
130
+ task(updates, ctx: Context), Context filtered out of the LLM
131
+ schema (be2317db; replaced env injection, which was a hack).
132
+ Config context for children still rides CROW_CONFIG_FILE/
133
+ CROW_CONFIG_DIR process env. Registered in server/main.py.
134
+ - 3.3 LIVE E2E — DONE (6d9316aa): tests/e2e/test_task_mcp_launch.py —
135
+ launch→completion (answer lands in the delivery), mcpServers
136
+ passthrough (child USES the passed-through terminal tool: date
137
+ output in its answer — [] cascade stays dead), cancel mid-turn,
138
+ cancel→follow-up (one delivery, follow-up answered). Isolation =
139
+ production shape: CROW_DB_URI for the tool, CROW_CONFIG_FILE
140
+ (same tmp db) for the child.
141
+ - 3.4 CRASH PATH — DONE (this commit): SIGKILL the child mid-turn →
142
+ watcher's prompt future breaks on the dead transport → failed
143
+ status + delivery, never hangs (test_child_crash_registers_failed).
144
+
145
+ Found en route (3.3): the SDK SILENTLY DROPS mcpServers request items
146
+ that fail validation (a stdio dict missing the required env list
147
+ vanished; the child came up toolless with no error anywhere). The driver
148
+ now parses wire dicts item-by-item BEFORE sending (_parse_mcp_servers —
149
+ loud failures, fills required-but-emptyable args/env); pinned by
150
+ tests/unit/test_subagent_parse_servers.py. Also observed: a child that
151
+ still carries DELEGATE_TOOL may delegate instead of using its
152
+ passed-through tools — structurally resolved by Phase 5.3's deletion.
153
+
154
+ ## Phase 4 — react loop: kill the hostage machinery, consult state — DONE 2026-08-23
155
+
156
+ The loop CONSULTS STATE at natural breakpoints — no polling in-loop, no
157
+ parking, no hostage. Completions register in sqlite (finish_task lands
158
+ them in task_deliveries the moment they arrive); the loop looks at the
159
+ mailbox at three points and the quiescent watcher covers the fourth.
160
+
161
+ - 4.1 DONE. park_until_completion, wake queues, drain_dead,
162
+ synthetic_completion_message, cancel_all propagation — all gone
163
+ from react.py. End-turn check: consult_deliveries() claims ALL
164
+ pending deliveries → inject as synthetic user messages + loop
165
+ continues; none → end_turn.
166
+ - 4.2 DONE. Prompt-start drain: consult_deliveries() before the first
167
+ model call — idle arrivals are known at prompt start.
168
+ - 4.3 DONE (breakpoint form). After each tool batch:
169
+ consult_deliveries(high_only=True) — highs inject at the next
170
+ batch boundary, lows stay pending for end of turn. Cancelling a
171
+ mid-STREAM model response would need polling in the streaming
172
+ loop (rejected), so the batch boundary is the earliest injection
173
+ point; a high that lands while the session is idle wakes it at
174
+ once via the watcher (below).
175
+ - 4.4 DONE. Parent cancel does NOT touch children — the react loop's
176
+ CancelledError handler persists history and re-raises; subagents
177
+ keep running, their completions still land in the mailbox, and
178
+ the model cancels them itself via task(CancelTurn) if it wants.
179
+ - 4.5 DONE (the out-of-loop half). AcpAgent._delivery_watcher: one
180
+ asyncio task per session (started at provisioning, cancelled at
181
+ cleanup), polls every DELIVERY_POLL_S=2s. Session lock held
182
+ (active turn) → skip, the in-loop consults own that window.
183
+ Idle + pending → atomic claim, then _run_internal_round with the
184
+ joined delivery contents (Phase 3.1's wake). The claim is a
185
+ single UPDATE...RETURNING (claim_deliveries in memory/writes.py):
186
+ watcher vs in-loop consult can race for the same rows and each
187
+ delivery is still injected EXACTLY ONCE.
188
+
189
+ Verified when: integration tests cover all three arrival states
190
+ (active-low, active-high, idle) with a controllable child; the old
191
+ park/wake tests are deleted, not adapted.
192
+ Evidence: tests/integration/test_react_loop_tool_round.py
193
+ (test_prompt_start_drains_idle_mailbox,
194
+ test_low_delivery_held_to_end_of_turn — real sqlite mailbox, scripted
195
+ LLM, real react_loop), tests/unit/test_delivery_watcher.py (wake,
196
+ skip-while-active, idempotent ensure, no double claim),
197
+ tests/memory/test_task_state.py (claim_deliveries: arrival order,
198
+ priority filter, cross-engine no-double-claim). 418 passed in the fast
199
+ tiers at this commit.
200
+
201
+ ## Phase 5 — kill delegate.py — DONE 2026-08-23
202
+
203
+ (The `task` tool shipped in Phase 3.2b and its session-context channel
204
+ shipped with be2317db: owner attribution rides the tools/call _meta,
205
+ injected by execute_acp_task in the react loop — the LLM never sees it
206
+ and cannot forge it. What remains is deleting the machinery `task`
207
+ replaces.)
208
+
209
+ - 5.1 DONE. DELETED src/crow_cli/agent/delegate.py and
210
+ src/crow_cli/agent/tasks.py; DELEGATE_TOOL imports, the
211
+ TaskRegistry, the _session_mcp_servers in-process map (sqlite's
212
+ session_mcp_servers row stays the cross-process authority), and
213
+ the registry/session_mcp_servers kwargs from react_loop +
214
+ execute_tool_calls + both react_loop call sites in agent/main.py.
215
+ Tests deleted: unit/test_delegate.py, unit/test_tasks.py,
216
+ e2e/test_delegate_live.py, e2e/test_delegate_true_e2e.py.
217
+ - 5.2 DONE (no rewrite needed). The model-facing recipe was
218
+ DELEGATE_TOOL.description itself — it died with the file. The
219
+ `task` tool's own description in mcp/task/main.py is the recipe
220
+ now (launch = PromptItem no session_id; re-prompt = PromptItem
221
+ with session_id; cancel = CancelTurn, optional follow-up). No
222
+ system prompt carried a delegation section (checked
223
+ config/default/defaults.py's SYSTEM_PROMPT and the user's live
224
+ ~/.agents/crow/prompts/system_prompt.jinja2). CLI help text
225
+ updated: agents launch subagents via `task`; `run -s` is the
226
+ human attach recipe.
227
+
228
+ Verified when: rg "delegate" finds no live code path; an agent with
229
+ crow-mcp launches a subagent through `task` with zero delegate code.
230
+ Evidence: rg delegate over src/ matches only docstrings/comments
231
+ (models.py task-table history note, mcp/memory tool descriptions,
232
+ mcp/task module docstring, mcp/editor "delegated to the OS"); zero
233
+ imports of the deleted modules anywhere.
234
+
235
+ ## Phase 6 — regression + live E2E + full suite — DONE 2026-08-23
236
+
237
+ - 6.1 DONE. tests/e2e/test_delegate_race_experiment.py (the sentinel that
238
+ asserted the hang) rewritten + renamed
239
+ tests/e2e/test_task_race_regression.py: fast child completes
240
+ mid-parent-turn → registered in state → delivered (low: end-turn
241
+ injection) → end_turn fires. The hang is structurally impossible:
242
+ nothing waits on unregistered work. GREEN live (90s) against
243
+ qwen3.8-max-preview. Two e2e isolation lessons baked into it:
244
+ (a) the ACP SDK SILENTLY DROPS mcpServers items that fail schema
245
+ validation — stdio needs name/command/args AND env (a list of
246
+ {name,value}); (b) the mcp stdio spawn gives the child ONLY
247
+ {**get_default_environment(), **server.env} — NOTHING is inherited
248
+ from the agent process, so db/config isolation must ride the wire
249
+ env (CROW_DB_URI / CROW_CONFIG_FILE), which the task tool then
250
+ forwards to the child it launches.
251
+ - 6.2 DONE. test_task_mcp_launch.py::
252
+ test_two_subagents_high_and_low_both_deliver — one `task` call
253
+ launches two subagents (high + low), both complete, both
254
+ deliveries land with their priorities (live, 12s). The loop-side
255
+ priority routing (high at batch boundary, low held to end-turn)
256
+ is covered by the integration consult tests; cancel mid-flight by
257
+ test_cancel_mid_turn / test_cancel_with_follow_up.
258
+ - 6.3 DONE. `uv --project . run pytest tests -q` from the worktree
259
+ root: 432 passed, 0 failed, 0 skipped (167s, 2026-08-23). The
260
+ merge to main is the user's call.
261
+
262
+ Verified when: `uv --project . run pytest tests -q` is all-green, zero
263
+ skipped, from a clean checkout of the branch.