crow-cli 0.1.40__tar.gz → 0.1.41__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 (594) hide show
  1. crow_cli-0.1.41/.env.example +2 -0
  2. crow_cli-0.1.41/.github/workflows/build-binaries.yml +101 -0
  3. crow_cli-0.1.41/.github/workflows/publish-crow-cli.yml +42 -0
  4. crow_cli-0.1.41/.python-version +1 -0
  5. crow_cli-0.1.41/AGENTS.md +30 -0
  6. {crow_cli-0.1.40 → crow_cli-0.1.41}/PKG-INFO +1 -1
  7. crow_cli-0.1.41/PLAN.md +187 -0
  8. crow_cli-0.1.41/PYINSTALLER_BUILD.md +112 -0
  9. crow_cli-0.1.41/TERMINAL_STACK.md +120 -0
  10. crow_cli-0.1.41/TODO.md +74 -0
  11. crow_cli-0.1.41/agent.json +39 -0
  12. crow_cli-0.1.41/crow-cli.spec +95 -0
  13. crow_cli-0.1.41/dev-crow-2.yaml +17 -0
  14. crow_cli-0.1.41/docs/CNAME +2 -0
  15. crow_cli-0.1.41/docs/crow-cli-docs/getting-started/installation.md +32 -0
  16. crow_cli-0.1.41/docs/crow-cli-docs/getting-started/quickstart.md +63 -0
  17. crow_cli-0.1.41/docs/crow-cli-docs/index.md +58 -0
  18. crow_cli-0.1.41/docs/crow-cli-docs/memory-tool-design.md +294 -0
  19. crow_cli-0.1.41/docs/crow-cli-docs/myst.yml +19 -0
  20. crow_cli-0.1.41/docs/crow-cli-docs/styles/purple.css +118 -0
  21. crow_cli-0.1.41/docs/crow-logo.svg +19 -0
  22. crow_cli-0.1.41/docs/get-llamacpp-working.md +1112 -0
  23. crow_cli-0.1.41/docs/getting-started/installation.md +32 -0
  24. crow_cli-0.1.41/docs/getting-started/quickstart.md +57 -0
  25. crow_cli-0.1.41/docs/icon.ico +0 -0
  26. crow_cli-0.1.41/docs/img/crow-icon-purple.svg +51 -0
  27. crow_cli-0.1.41/docs/img/crow-logo-crop.png +0 -0
  28. crow_cli-0.1.41/docs/img/icon.svg +9 -0
  29. crow_cli-0.1.41/docs/img/whiteboard_capture.png +0 -0
  30. crow_cli-0.1.41/docs/index.html +715 -0
  31. crow_cli-0.1.41/docs/index.md +40 -0
  32. crow_cli-0.1.41/docs/journal/03May2026.md +8 -0
  33. crow_cli-0.1.41/docs/journal/19Feb2026.md +46 -0
  34. crow_cli-0.1.41/docs/journal/20Feb2026.md +15 -0
  35. crow_cli-0.1.41/docs/journal/22Feb2026.md +91 -0
  36. crow_cli-0.1.41/docs/journal/29Aug2026.md +7 -0
  37. crow_cli-0.1.41/docs/llm-wiki.md +75 -0
  38. crow_cli-0.1.41/docs/myst.yml +19 -0
  39. crow_cli-0.1.41/docs/styles/purple.css +118 -0
  40. crow_cli-0.1.41/examples/mc_escher_loop.py +49 -0
  41. crow_cli-0.1.41/examples/quick_test.py +75 -0
  42. {crow_cli-0.1.40 → crow_cli-0.1.41}/pyproject.toml +1 -19
  43. crow_cli-0.1.41/run_tests.sh +5 -0
  44. crow_cli-0.1.41/sandbox/agent-client/.python-version +1 -0
  45. crow_cli-0.1.41/sandbox/agent-client/README.md +309 -0
  46. crow_cli-0.1.41/sandbox/agent-client/SUCCESS.md +90 -0
  47. crow_cli-0.1.41/sandbox/agent-client/TODO.md +50 -0
  48. crow_cli-0.1.41/sandbox/agent-client/agent_client.py +867 -0
  49. crow_cli-0.1.41/sandbox/agent-client/echo_agent.py +85 -0
  50. crow_cli-0.1.41/sandbox/agent-client/fire_up_echo.py +71 -0
  51. crow_cli-0.1.41/sandbox/agent-client/fire_up_simple.py +58 -0
  52. crow_cli-0.1.41/sandbox/agent-client/main.py +6 -0
  53. crow_cli-0.1.41/sandbox/agent-client/pyproject.toml +11 -0
  54. crow_cli-0.1.41/sandbox/agent-client/run_bridge.py +79 -0
  55. crow_cli-0.1.41/sandbox/agent-client/simple_agent.py +111 -0
  56. crow_cli-0.1.41/sandbox/agent-client/stdio_to_ws.py +220 -0
  57. crow_cli-0.1.41/sandbox/agent-client/test_acp_ws_client.py +64 -0
  58. crow_cli-0.1.41/sandbox/agent-client/test_agent_client.py +74 -0
  59. crow_cli-0.1.41/sandbox/agent-client/test_bridge.py +48 -0
  60. crow_cli-0.1.41/sandbox/agent-client/test_bridge_and_client.py +193 -0
  61. crow_cli-0.1.41/sandbox/agent-client/test_bridge_direct.py +92 -0
  62. crow_cli-0.1.41/sandbox/agent-client/test_client.py +261 -0
  63. crow_cli-0.1.41/sandbox/agent-client/test_date_terminal.py +277 -0
  64. crow_cli-0.1.41/sandbox/agent-client/test_echo_agent.py +51 -0
  65. crow_cli-0.1.41/sandbox/agent-client/test_fs_terminal.py +78 -0
  66. crow_cli-0.1.41/sandbox/agent-client/test_http_multisession.py +151 -0
  67. crow_cli-0.1.41/sandbox/agent-client/test_raw_stdio.py +137 -0
  68. crow_cli-0.1.41/sandbox/agent-client/test_simple.py +133 -0
  69. crow_cli-0.1.41/sandbox/agent-client/test_ws_client.py +94 -0
  70. crow_cli-0.1.41/sandbox/agent-client/two_sessions_same_question.py +113 -0
  71. crow_cli-0.1.41/sandbox/agent-client/uv.lock +333 -0
  72. crow_cli-0.1.41/sandbox/async-react/.python-version +1 -0
  73. crow_cli-0.1.41/sandbox/async-react/README.md +3 -0
  74. crow_cli-0.1.41/sandbox/async-react/db_integrity_test.py +328 -0
  75. crow_cli-0.1.41/sandbox/async-react/e2e_tool_integrity.py +409 -0
  76. crow_cli-0.1.41/sandbox/async-react/persistence_integrity_test.py +599 -0
  77. crow_cli-0.1.41/sandbox/async-react/pyproject.toml +15 -0
  78. crow_cli-0.1.41/sandbox/async-react/streaming_async_react.py +255 -0
  79. crow_cli-0.1.41/sandbox/async-react/streaming_async_react_with_cancellation.py +405 -0
  80. crow_cli-0.1.41/sandbox/async-react/test_usage.py +161 -0
  81. crow_cli-0.1.41/sandbox/async-react/tool_call_integrity_test.py +287 -0
  82. crow_cli-0.1.41/sandbox/async-react/uv.lock +1646 -0
  83. crow_cli-0.1.41/sandbox/crow-acp-learning/agent.py +125 -0
  84. crow_cli-0.1.41/sandbox/crow-acp-learning/client.py +211 -0
  85. crow_cli-0.1.41/sandbox/crow-acp-learning/duet.py +43 -0
  86. crow_cli-0.1.41/sandbox/crow-acp-learning/echo_agent.py +418 -0
  87. crow_cli-0.1.41/sandbox/crow-acp-learning/fire_up_echo.py +75 -0
  88. crow_cli-0.1.41/sandbox/crow-acp-learning/gemini.py +394 -0
  89. crow_cli-0.1.41/sandbox/crow-acp-learning/pyproject.toml +10 -0
  90. crow_cli-0.1.41/sandbox/crow-acp-learning/terminal_agent.py +342 -0
  91. crow_cli-0.1.41/sandbox/crow-acp-learning/test_acp.py +89 -0
  92. crow_cli-0.1.41/sandbox/crow-acp-learning/uv.lock +299 -0
  93. crow_cli-0.1.41/sandbox/crow-test/.python-version +1 -0
  94. crow_cli-0.1.41/sandbox/crow-test/graph.png +0 -0
  95. crow_cli-0.1.41/sandbox/crow-test/graph.py +25 -0
  96. crow_cli-0.1.41/sandbox/crow-test/main.py +6 -0
  97. crow_cli-0.1.41/sandbox/crow-test/pyproject.toml +12 -0
  98. crow_cli-0.1.41/sandbox/crow-test/uv.lock +1658 -0
  99. crow_cli-0.1.41/sandbox/dirtree/.python-version +1 -0
  100. crow_cli-0.1.41/sandbox/dirtree/main.py +6 -0
  101. crow_cli-0.1.41/sandbox/dirtree/pyproject.toml +10 -0
  102. crow_cli-0.1.41/sandbox/dirtree/uv.lock +212 -0
  103. crow_cli-0.1.41/sandbox/docs/ancestors/00-architecture-overview.md +495 -0
  104. crow_cli-0.1.41/sandbox/docs/ancestors/01-parallel-tool-calling.md +220 -0
  105. crow_cli-0.1.41/sandbox/docs/ancestors/02-toad-integration.md +321 -0
  106. crow_cli-0.1.41/sandbox/docs/ancestors/03-session-persistence.md +468 -0
  107. crow_cli-0.1.41/sandbox/docs/ancestors/04-cancellation-and-state.md +436 -0
  108. crow_cli-0.1.41/sandbox/docs/ancestors/05-loop-detection.md +681 -0
  109. crow_cli-0.1.41/sandbox/docs/ancestors/06-finish-tool.md +685 -0
  110. crow_cli-0.1.41/sandbox/docs/ancestors/07-python-repl.md +701 -0
  111. crow_cli-0.1.41/sandbox/docs/ancestors/08-system-prompt-skills.md +631 -0
  112. crow_cli-0.1.41/sandbox/docs/ancestors/09-session-continuity-and-compaction.md +216 -0
  113. crow_cli-0.1.41/sandbox/docs/ancestors/AGENTS_OLD.md +1427 -0
  114. crow_cli-0.1.41/sandbox/docs/ancestors/ARCHITECTURE.md +288 -0
  115. crow_cli-0.1.41/sandbox/docs/ancestors/CANCELLATION_IMPLEMENTATION.md +361 -0
  116. crow_cli-0.1.41/sandbox/docs/ancestors/CANCELLATION_SANDBOX_COMPARISON.md +266 -0
  117. crow_cli-0.1.41/sandbox/docs/ancestors/CANCELLATION_SUMMARY.md +207 -0
  118. crow_cli-0.1.41/sandbox/docs/ancestors/CRITICAL_CLARIFICATIONS.md +506 -0
  119. crow_cli-0.1.41/sandbox/docs/ancestors/CROW_SDK_ANALYSIS.md +642 -0
  120. crow_cli-0.1.41/sandbox/docs/ancestors/EXTENSION_DISCUSSION.md +133 -0
  121. crow_cli-0.1.41/sandbox/docs/ancestors/IMPLEMENTATION_PLAN.md +903 -0
  122. crow_cli-0.1.41/sandbox/docs/ancestors/IMPLEMENTATION_SUMMARY.md +160 -0
  123. crow_cli-0.1.41/sandbox/docs/ancestors/IMPLEMENTATION_SUMMARY_ACP_SESSIONS.md +192 -0
  124. crow_cli-0.1.41/sandbox/docs/ancestors/INSTRUCTIONS_FOR_KIMI.md +106 -0
  125. crow_cli-0.1.41/sandbox/docs/ancestors/PROJECT_VISION.md +3 -0
  126. crow_cli-0.1.41/sandbox/docs/ancestors/PROMPT.md +148 -0
  127. crow_cli-0.1.41/sandbox/docs/ancestors/PULSE_CHECK.md +512 -0
  128. crow_cli-0.1.41/sandbox/docs/ancestors/REPL_GUIDE.md +148 -0
  129. crow_cli-0.1.41/sandbox/docs/ancestors/TABLE_SCHEMA.md +53 -0
  130. crow_cli-0.1.41/sandbox/docs/ancestors/THOUGHTS.md +25 -0
  131. crow_cli-0.1.41/sandbox/docs/ancestors/check_acp_agent.py +11 -0
  132. crow_cli-0.1.41/sandbox/docs/ancestors/conversation-wrapper-analysis.md +493 -0
  133. crow_cli-0.1.41/sandbox/docs/ancestors/crow-agent-good-stuff.md +5442 -0
  134. crow_cli-0.1.41/sandbox/docs/ancestors/crow_agent_example.py +113 -0
  135. crow_cli-0.1.41/sandbox/docs/ancestors/crow_inspect.py +223 -0
  136. crow_cli-0.1.41/sandbox/docs/ancestors/database.py +207 -0
  137. crow_cli-0.1.41/sandbox/docs/ancestors/essays/00-file-editor-semantics-and-fastmcp.md +495 -0
  138. crow_cli-0.1.41/sandbox/docs/ancestors/essays/01-mcp-server-package-structure.md +248 -0
  139. crow_cli-0.1.41/sandbox/docs/ancestors/essays/02-hooks-realization-and-agent-core.md +420 -0
  140. crow_cli-0.1.41/sandbox/docs/ancestors/essays/03-where-we-are-now-and-whats-next.md +498 -0
  141. crow_cli-0.1.41/sandbox/docs/ancestors/essays/04-acp-mcp-configuration.md +228 -0
  142. crow_cli-0.1.41/sandbox/docs/ancestors/essays/04-hooks-as-first-class-citizens.md +318 -0
  143. crow_cli-0.1.41/sandbox/docs/ancestors/essays/05-hook-design-analysis.md +461 -0
  144. crow_cli-0.1.41/sandbox/docs/ancestors/essays/05-python-sdk-that-emerged.md +460 -0
  145. crow_cli-0.1.41/sandbox/docs/ancestors/essays/06-acp-native-sessions.md +225 -0
  146. crow_cli-0.1.41/sandbox/docs/ancestors/essays/07-extension-api-design.md +308 -0
  147. crow_cli-0.1.41/sandbox/docs/ancestors/essays/08-flask-extension-pattern-with-context-variables.md +380 -0
  148. crow_cli-0.1.41/sandbox/docs/ancestors/essays/09-git-commit-violation-last-testament.md +146 -0
  149. crow_cli-0.1.41/sandbox/docs/ancestors/essays/10-monorepo-refactor-to-avoid-cyclic-dependencies.md +342 -0
  150. crow_cli-0.1.41/sandbox/docs/ancestors/essays/11-acp-terminal-tool-swapping.md +233 -0
  151. crow_cli-0.1.41/sandbox/docs/ancestors/essays/12-hook-based-architecture-and-the-frameworkless-framework.md +1100 -0
  152. crow_cli-0.1.41/sandbox/docs/ancestors/essays/13-acp-terminal-architecture.md +656 -0
  153. crow_cli-0.1.41/sandbox/docs/ancestors/essays/14-terminal-mcp-implementation.md +1116 -0
  154. crow_cli-0.1.41/sandbox/docs/ancestors/essays/15-terminal-mcp-complete.md +324 -0
  155. crow_cli-0.1.41/sandbox/docs/ancestors/essays/16-fractal-filesystem-sandbox-parallel-tool-calling.md +56 -0
  156. crow_cli-0.1.41/sandbox/docs/ancestors/essays/17-composition-over-inheritance-extension-design.md +279 -0
  157. crow_cli-0.1.41/sandbox/docs/ancestors/essays/18-self-injection-the-god-mode-pattern.md +458 -0
  158. crow_cli-0.1.41/sandbox/docs/ancestors/essays/19-pluggy-the-missing-piece.md +422 -0
  159. crow_cli-0.1.41/sandbox/docs/ancestors/essays/20-terminal-tool-failure-bug-report.md +145 -0
  160. crow_cli-0.1.41/sandbox/docs/ancestors/essays/21-callback-architecture-multi-agent-bridges.md +404 -0
  161. crow_cli-0.1.41/sandbox/docs/ancestors/essays/22-the-agent-was-always-here.md +432 -0
  162. crow_cli-0.1.41/sandbox/docs/ancestors/essays/23-cancellation-solid-plan.md +166 -0
  163. crow_cli-0.1.41/sandbox/docs/ancestors/essays/24-async-tool-hanging-debug-thoughts.md +153 -0
  164. crow_cli-0.1.41/sandbox/docs/ancestors/essays/25-acp-client-terminal-integration.md +272 -0
  165. crow_cli-0.1.41/sandbox/docs/ancestors/essays/26-graceful-cancellation-streaming.md +819 -0
  166. crow_cli-0.1.41/sandbox/docs/ancestors/essays/llms-txt-and-agent-skills.md +334 -0
  167. crow_cli-0.1.41/sandbox/docs/ancestors/fire_up_echo.py +148 -0
  168. crow_cli-0.1.41/sandbox/docs/ancestors/kernel_kernel.py +182 -0
  169. crow_cli-0.1.41/sandbox/docs/ancestors/merging-agents-guide.md +440 -0
  170. crow_cli-0.1.41/sandbox/docs/ancestors/plans/acp-tool-enhancements.md +464 -0
  171. crow_cli-0.1.41/sandbox/docs/ancestors/quick_test.py +69 -0
  172. crow_cli-0.1.41/sandbox/docs/ancestors/research-findings.md +479 -0
  173. crow_cli-0.1.41/sandbox/docs/ancestors/search.py +95 -0
  174. crow_cli-0.1.41/sandbox/docs/ancestors/simple_crow_agent.py +154 -0
  175. crow_cli-0.1.41/sandbox/docs/ancestors/streaming_async_react.py +225 -0
  176. crow_cli-0.1.41/sandbox/docs/ancestors/streaming_async_react_with_db.py +280 -0
  177. crow_cli-0.1.41/sandbox/docs/ancestors/streaming_react.py +201 -0
  178. crow_cli-0.1.41/sandbox/docs/ancestors/terminal_demo.py +283 -0
  179. crow_cli-0.1.41/sandbox/docs/ancestors/test_client_caps.py +151 -0
  180. crow_cli-0.1.41/sandbox/docs/ancestors/test_crow_e2e.py +62 -0
  181. crow_cli-0.1.41/sandbox/docs/ancestors/test_terminal_client.py +267 -0
  182. crow_cli-0.1.41/sandbox/docs/ancestors/zai_tool_integration.py +115 -0
  183. crow_cli-0.1.41/sandbox/fastmcp-test/.gitignore +10 -0
  184. crow_cli-0.1.41/sandbox/fastmcp-test/.python-version +1 -0
  185. crow_cli-0.1.41/sandbox/fastmcp-test/client.py +38 -0
  186. crow_cli-0.1.41/sandbox/fastmcp-test/docs/essays/00-fractal-filesystem-sandbox-parallel-tool-calling.md +56 -0
  187. crow_cli-0.1.41/sandbox/fastmcp-test/pyproject.toml +20 -0
  188. crow_cli-0.1.41/sandbox/fastmcp-test/src/fastmcp_test/__init__.py +4 -0
  189. crow_cli-0.1.41/sandbox/fastmcp-test/src/fastmcp_test/server/__init__.py +3 -0
  190. crow_cli-0.1.41/sandbox/fastmcp-test/src/fastmcp_test/server/main.py +17 -0
  191. crow_cli-0.1.41/sandbox/fastmcp-test/src/fastmcp_test/tool/__init__.py +3 -0
  192. crow_cli-0.1.41/sandbox/fastmcp-test/src/fastmcp_test/tool/main.py +7 -0
  193. crow_cli-0.1.41/sandbox/fastmcp-test/uv.lock +1401 -0
  194. crow_cli-0.1.41/sandbox/lancedb-testing/.gitignore +4 -0
  195. crow_cli-0.1.41/sandbox/lancedb-testing/.python-version +1 -0
  196. crow_cli-0.1.41/sandbox/lancedb-testing/README.md +38 -0
  197. crow_cli-0.1.41/sandbox/lancedb-testing/bench_colpali.py +141 -0
  198. crow_cli-0.1.41/sandbox/lancedb-testing/bench_dual_model.py +78 -0
  199. crow_cli-0.1.41/sandbox/lancedb-testing/bench_latency.py +182 -0
  200. crow_cli-0.1.41/sandbox/lancedb-testing/lancedb_session.py +120 -0
  201. crow_cli-0.1.41/sandbox/lancedb-testing/load_crow_db.py +162 -0
  202. crow_cli-0.1.41/sandbox/lancedb-testing/main.py +31 -0
  203. crow_cli-0.1.41/sandbox/lancedb-testing/multivector.py +82 -0
  204. crow_cli-0.1.41/sandbox/lancedb-testing/pyproject.toml +15 -0
  205. crow_cli-0.1.41/sandbox/lancedb-testing/uv.lock +2090 -0
  206. crow_cli-0.1.41/sandbox/langfuse-test/.python-version +1 -0
  207. crow_cli-0.1.41/sandbox/langfuse-test/README.md +45 -0
  208. crow_cli-0.1.41/sandbox/langfuse-test/explore.py +280 -0
  209. crow_cli-0.1.41/sandbox/langfuse-test/main.py +22 -0
  210. crow_cli-0.1.41/sandbox/langfuse-test/pyproject.toml +11 -0
  211. crow_cli-0.1.41/sandbox/langfuse-test/uv.lock +536 -0
  212. crow_cli-0.1.41/sandbox/litellm-dashscope/.python-version +1 -0
  213. crow_cli-0.1.41/sandbox/litellm-dashscope/main.py +6 -0
  214. crow_cli-0.1.41/sandbox/litellm-dashscope/pyproject.toml +14 -0
  215. crow_cli-0.1.41/sandbox/litellm-dashscope/test_all_models_reasoning.py +176 -0
  216. crow_cli-0.1.41/sandbox/litellm-dashscope/test_fix_correctness.py +421 -0
  217. crow_cli-0.1.41/sandbox/litellm-dashscope/test_llamacpp_reasoning.py +298 -0
  218. crow_cli-0.1.41/sandbox/litellm-dashscope/test_rc_empty.py +142 -0
  219. crow_cli-0.1.41/sandbox/litellm-dashscope/test_reasoning_tool_transition.py +354 -0
  220. crow_cli-0.1.41/sandbox/litellm-dashscope/test_reasoning_transition.py +339 -0
  221. crow_cli-0.1.41/sandbox/litellm-dashscope/uv.lock +1654 -0
  222. crow_cli-0.1.41/sandbox/litellm-proxy/.python-version +1 -0
  223. crow_cli-0.1.41/sandbox/litellm-proxy/config.yaml +6 -0
  224. crow_cli-0.1.41/sandbox/litellm-proxy/main.py +6 -0
  225. crow_cli-0.1.41/sandbox/litellm-proxy/pyproject.toml +9 -0
  226. crow_cli-0.1.41/sandbox/litellm-proxy/uv.lock +2368 -0
  227. crow_cli-0.1.41/sandbox/murder-architecture.md +18 -0
  228. crow_cli-0.1.41/sandbox/pathlib-test/.python-version +1 -0
  229. crow_cli-0.1.41/sandbox/pathlib-test/main.py +6 -0
  230. crow_cli-0.1.41/sandbox/pathlib-test/pyproject.toml +9 -0
  231. crow_cli-0.1.41/sandbox/pathlib-test/src/pathlib_test/test.py +3 -0
  232. crow_cli-0.1.41/sandbox/pathlib-test/uv.lock +199 -0
  233. crow_cli-0.1.41/sandbox/pyinstaller-async-test/.python-version +1 -0
  234. crow_cli-0.1.41/sandbox/pyinstaller-async-test/main.py +92 -0
  235. crow_cli-0.1.41/sandbox/pyinstaller-async-test/pyproject.toml +11 -0
  236. crow_cli-0.1.41/sandbox/pyinstaller-async-test/test.spec +42 -0
  237. crow_cli-0.1.41/sandbox/pyinstaller-async-test/uv.lock +116 -0
  238. crow_cli-0.1.41/sandbox/repl-agent/.crow/compose.yaml +25 -0
  239. crow_cli-0.1.41/sandbox/repl-agent/.crow/config.yaml +34 -0
  240. crow_cli-0.1.41/sandbox/repl-agent/.crow/litellm/config.yaml +29 -0
  241. crow_cli-0.1.41/sandbox/repl-agent/.crow/searxng/settings.yml +2799 -0
  242. crow_cli-0.1.41/sandbox/repl-agent/.gitignore +1 -0
  243. crow_cli-0.1.41/sandbox/repl-agent/.python-version +1 -0
  244. crow_cli-0.1.41/sandbox/repl-agent/AGENT_CLIENT_INTEGRATION.md +309 -0
  245. crow_cli-0.1.41/sandbox/repl-agent/README.md +393 -0
  246. crow_cli-0.1.41/sandbox/repl-agent/client.py +338 -0
  247. crow_cli-0.1.41/sandbox/repl-agent/compact_agent.py +31 -0
  248. crow_cli-0.1.41/sandbox/repl-agent/compact_e2e_test.py +88 -0
  249. crow_cli-0.1.41/sandbox/repl-agent/compact_fixtures/case_01_system_user_only.json +20 -0
  250. crow_cli-0.1.41/sandbox/repl-agent/compact_fixtures/case_02_reasoning_only.json +25 -0
  251. crow_cli-0.1.41/sandbox/repl-agent/compact_fixtures/case_03_content_only.json +25 -0
  252. crow_cli-0.1.41/sandbox/repl-agent/compact_fixtures/case_04_unexecuted_tools.json +43 -0
  253. crow_cli-0.1.41/sandbox/repl-agent/compact_fixtures/case_05_mid_conversation_all_responded.json +81 -0
  254. crow_cli-0.1.41/sandbox/repl-agent/compact_fixtures/case_06_partial_tool_responses.json +76 -0
  255. crow_cli-0.1.41/sandbox/repl-agent/compact_fixtures/case_07_complete_turn.json +91 -0
  256. crow_cli-0.1.41/sandbox/repl-agent/compact_fixtures/case_08_reasoning_ending.json +91 -0
  257. crow_cli-0.1.41/sandbox/repl-agent/compact_fixtures/case_09_content_ending.json +91 -0
  258. crow_cli-0.1.41/sandbox/repl-agent/compact_fixtures/chubby_full_conversation.jsonl +9 -0
  259. crow_cli-0.1.41/sandbox/repl-agent/docs/AGENT_CLIENT_PLAN.md +341 -0
  260. crow_cli-0.1.41/sandbox/repl-agent/docs/COMPACT_AND_SCHEMA_REWRITE.md +158 -0
  261. crow_cli-0.1.41/sandbox/repl-agent/docs/STRATEGIC_PIVOT.md +254 -0
  262. crow_cli-0.1.41/sandbox/repl-agent/generate_compact_fixtures.py +149 -0
  263. crow_cli-0.1.41/sandbox/repl-agent/iterative_refinement.py +295 -0
  264. crow_cli-0.1.41/sandbox/repl-agent/iterative_refinement_agent.py +768 -0
  265. crow_cli-0.1.41/sandbox/repl-agent/iterative_refinement_mcp.py +54 -0
  266. crow_cli-0.1.41/sandbox/repl-agent/main.py +46 -0
  267. crow_cli-0.1.41/sandbox/repl-agent/multi_compact.py +37 -0
  268. crow_cli-0.1.41/sandbox/repl-agent/orchestrator.py +275 -0
  269. crow_cli-0.1.41/sandbox/repl-agent/pyproject.toml +18 -0
  270. crow_cli-0.1.41/sandbox/repl-agent/run_iterative_refinement_agent.py +87 -0
  271. crow_cli-0.1.41/sandbox/repl-agent/run_repl_clients.py +73 -0
  272. crow_cli-0.1.41/sandbox/repl-agent/scratch_db.py +41 -0
  273. crow_cli-0.1.41/sandbox/repl-agent/task_description.yaml +7 -0
  274. crow_cli-0.1.41/sandbox/repl-agent/test_compact_fixtures.py +156 -0
  275. crow_cli-0.1.41/sandbox/repl-agent/test_compact_one.py +112 -0
  276. crow_cli-0.1.41/sandbox/repl-agent/test_compact_real.py +348 -0
  277. crow_cli-0.1.41/sandbox/repl-agent/test_compact_run.py +146 -0
  278. crow_cli-0.1.41/sandbox/repl-agent/test_drift_instrumentation.py +131 -0
  279. crow_cli-0.1.41/sandbox/repl-agent/test_hook.py +40 -0
  280. crow_cli-0.1.41/sandbox/repl-agent/test_iterative_refinement.py +256 -0
  281. crow_cli-0.1.41/sandbox/repl-agent/test_multi_compact_client.py +175 -0
  282. crow_cli-0.1.41/sandbox/repl-agent/test_refinement_agent.py +242 -0
  283. crow_cli-0.1.41/sandbox/repl-agent/test_repl_client.py +124 -0
  284. crow_cli-0.1.41/sandbox/repl-agent/uv.lock +1568 -0
  285. crow_cli-0.1.41/sandbox/textual-term-toy/bridge.py +116 -0
  286. crow_cli-0.1.41/sandbox/textual-term-toy/harness/index.html +21 -0
  287. crow_cli-0.1.41/sandbox/textual-term-toy/harness/main.js +32 -0
  288. crow_cli-0.1.41/sandbox/textual-term-toy/pyproject.toml +14 -0
  289. crow_cli-0.1.41/sandbox/textual-term-toy/sample.md +202 -0
  290. crow_cli-0.1.41/sandbox/textual-term-toy/toy.py +320 -0
  291. crow_cli-0.1.41/sandbox/textual-term-toy/uv.lock +276 -0
  292. crow_cli-0.1.41/sandbox/yaml-configs/.python-version +1 -0
  293. crow_cli-0.1.41/sandbox/yaml-configs/main.py +6 -0
  294. crow_cli-0.1.41/sandbox/yaml-configs/pyproject.toml +7 -0
  295. crow_cli-0.1.41/scripts/consolidate_history.py +262 -0
  296. crow_cli-0.1.41/scripts/e2e_compact_live.py +222 -0
  297. crow_cli-0.1.41/scripts/e2e_image_store_live.py +177 -0
  298. crow_cli-0.1.41/scripts/e2e_memory_live.py +216 -0
  299. crow_cli-0.1.41/scripts/e2e_postgres_live.py +204 -0
  300. crow_cli-0.1.41/scripts/mcp_ram_repro.py +149 -0
  301. crow_cli-0.1.41/scripts/merge_live_into_migrated.py +95 -0
  302. crow_cli-0.1.41/scripts/migrate_taskmaster.py +224 -0
  303. crow_cli-0.1.41/scripts/migrate_v5.py +191 -0
  304. crow_cli-0.1.41/scripts/migrate_v6.py +192 -0
  305. crow_cli-0.1.41/src/crow_cli/mcp/server/README.md +0 -0
  306. crow_cli-0.1.41/src/crow_cli/mcp/task/__init__.py +0 -0
  307. crow_cli-0.1.41/src/crow_cli/mcp/terminal/README.md +0 -0
  308. crow_cli-0.1.41/src/crow_cli/mcp/vision/__init__.py +0 -0
  309. crow_cli-0.1.41/src/crow_cli/mcp/web_fetch/README.md +0 -0
  310. crow_cli-0.1.41/src/crow_cli/mcp/write/README.md +0 -0
  311. crow_cli-0.1.41/src/crow_cli/mcp/write/__init__.py +0 -0
  312. crow_cli-0.1.41/src/crow_cli/tui/os.py +0 -0
  313. crow_cli-0.1.41/tests/__init__.py +1 -0
  314. crow_cli-0.1.41/tests/analyze_payload_cache_invalidation.py +242 -0
  315. crow_cli-0.1.41/tests/analyze_payload_deep.py +317 -0
  316. crow_cli-0.1.41/tests/conftest.py +334 -0
  317. crow_cli-0.1.41/tests/e2e/test_react_live.py +79 -0
  318. crow_cli-0.1.41/tests/e2e/test_session_update_transmission.py +262 -0
  319. crow_cli-0.1.41/tests/e2e/test_task_high_priority_preemption.py +264 -0
  320. crow_cli-0.1.41/tests/e2e/test_task_mcp_launch.py +351 -0
  321. crow_cli-0.1.41/tests/e2e/test_task_race_regression.py +284 -0
  322. crow_cli-0.1.41/tests/integration/test_acp_http.py +75 -0
  323. crow_cli-0.1.41/tests/integration/test_agent_init.py +65 -0
  324. crow_cli-0.1.41/tests/integration/test_auth_validation.py +290 -0
  325. crow_cli-0.1.41/tests/integration/test_react_loop_cancel_integrity.py +321 -0
  326. crow_cli-0.1.41/tests/integration/test_react_loop_delegation_hold.py +211 -0
  327. crow_cli-0.1.41/tests/integration/test_react_loop_tool_round.py +584 -0
  328. crow_cli-0.1.41/tests/integration/test_reasoning_effort_react_loop.py +97 -0
  329. crow_cli-0.1.41/tests/integration/test_slash_commands.py +148 -0
  330. crow_cli-0.1.41/tests/mcp/integration/test_server_stdio.py +88 -0
  331. crow_cli-0.1.41/tests/mcp/test_edit.py +401 -0
  332. crow_cli-0.1.41/tests/mcp/test_memory.py +167 -0
  333. crow_cli-0.1.41/tests/mcp/test_memory_store.py +160 -0
  334. crow_cli-0.1.41/tests/mcp/test_memtrim.py +123 -0
  335. crow_cli-0.1.41/tests/mcp/test_read.py +97 -0
  336. crow_cli-0.1.41/tests/mcp/test_server.py +53 -0
  337. crow_cli-0.1.41/tests/mcp/test_task_tool.py +108 -0
  338. crow_cli-0.1.41/tests/mcp/test_terminal.py +36 -0
  339. crow_cli-0.1.41/tests/mcp/test_vision.py +43 -0
  340. crow_cli-0.1.41/tests/mcp/test_web_fetch.py +62 -0
  341. crow_cli-0.1.41/tests/mcp/test_web_search.py +51 -0
  342. crow_cli-0.1.41/tests/mcp/test_write.py +35 -0
  343. crow_cli-0.1.41/tests/memory/test_db.py +53 -0
  344. crow_cli-0.1.41/tests/memory/test_image_store.py +136 -0
  345. crow_cli-0.1.41/tests/memory/test_migrate_taskmaster.py +231 -0
  346. crow_cli-0.1.41/tests/memory/test_migrate_v5.py +159 -0
  347. crow_cli-0.1.41/tests/memory/test_migrate_v6.py +116 -0
  348. crow_cli-0.1.41/tests/memory/test_session_mcp_servers.py +154 -0
  349. crow_cli-0.1.41/tests/memory/test_session_tabs.py +69 -0
  350. crow_cli-0.1.41/tests/memory/test_store.py +267 -0
  351. crow_cli-0.1.41/tests/memory/test_task_state.py +255 -0
  352. crow_cli-0.1.41/tests/unit/test_agent_store.py +60 -0
  353. crow_cli-0.1.41/tests/unit/test_cli_fork_flags.py +38 -0
  354. crow_cli-0.1.41/tests/unit/test_cli_telemetry.py +135 -0
  355. crow_cli-0.1.41/tests/unit/test_client_terminal.py +189 -0
  356. crow_cli-0.1.41/tests/unit/test_compact.py +197 -0
  357. crow_cli-0.1.41/tests/unit/test_compact_last_messages_list_content.json +213 -0
  358. crow_cli-0.1.41/tests/unit/test_compact_last_messages_list_content.py +34 -0
  359. crow_cli-0.1.41/tests/unit/test_configure.py +61 -0
  360. crow_cli-0.1.41/tests/unit/test_fork.py +218 -0
  361. crow_cli-0.1.41/tests/unit/test_init_postgres.py +133 -0
  362. crow_cli-0.1.41/tests/unit/test_init_rustfs.py +59 -0
  363. crow_cli-0.1.41/tests/unit/test_json_repair.py +196 -0
  364. crow_cli-0.1.41/tests/unit/test_mcp_client.py +105 -0
  365. crow_cli-0.1.41/tests/unit/test_model_override.py +137 -0
  366. crow_cli-0.1.41/tests/unit/test_model_routing.py +331 -0
  367. crow_cli-0.1.41/tests/unit/test_per_model_compact_threshold.py +106 -0
  368. crow_cli-0.1.41/tests/unit/test_prompt.py +280 -0
  369. crow_cli-0.1.41/tests/unit/test_react.py +424 -0
  370. crow_cli-0.1.41/tests/unit/test_reasoning_effort.py +417 -0
  371. crow_cli-0.1.41/tests/unit/test_request_logging.py +82 -0
  372. crow_cli-0.1.41/tests/unit/test_session.py +56 -0
  373. crow_cli-0.1.41/tests/unit/test_session_mcp_servers_wiring.py +191 -0
  374. crow_cli-0.1.41/tests/unit/test_stream_processing.py +337 -0
  375. crow_cli-0.1.41/tests/unit/test_subagent_parse_servers.py +55 -0
  376. crow_cli-0.1.41/tests/unit/test_system_prompt_skills.py +79 -0
  377. crow_cli-0.1.41/tests/unit/test_task_tool_schema.py +203 -0
  378. crow_cli-0.1.41/tests/unit/test_usage_update.py +40 -0
  379. crow_cli-0.1.41/tests/unit/test_uv_project_enforcement.py +119 -0
  380. crow_cli-0.1.41/tests/unit/test_version.py +19 -0
  381. crow_cli-0.1.41/tests/unit/tui/__init__.py +0 -0
  382. crow_cli-0.1.41/tests/unit/tui/test_agent_terminal.py +170 -0
  383. crow_cli-0.1.41/tests/unit/tui/test_ansi_resize.py +142 -0
  384. crow_cli-0.1.41/tests/unit/tui/test_editor_screen.py +195 -0
  385. crow_cli-0.1.41/tests/unit/tui/test_editor_terminal.py +95 -0
  386. crow_cli-0.1.41/uv.lock +3395 -0
  387. {crow_cli-0.1.40 → crow_cli-0.1.41}/.gitignore +0 -0
  388. {crow_cli-0.1.40 → crow_cli-0.1.41}/LICENSE.md +0 -0
  389. {crow_cli-0.1.40 → crow_cli-0.1.41}/README.md +0 -0
  390. {crow_cli-0.1.40/crow_cli/mcp/editor → crow_cli-0.1.41/sandbox/crow-acp-learning}/README.md +0 -0
  391. {crow_cli-0.1.40/crow_cli/mcp/read → crow_cli-0.1.41/sandbox/crow-test}/README.md +0 -0
  392. {crow_cli-0.1.40/crow_cli/mcp/server → crow_cli-0.1.41/sandbox/dirtree}/README.md +0 -0
  393. {crow_cli-0.1.40/crow_cli/mcp/terminal → crow_cli-0.1.41/sandbox/fastmcp-test}/README.md +0 -0
  394. {crow_cli-0.1.40/crow_cli/mcp/web_fetch → crow_cli-0.1.41/sandbox/litellm-dashscope}/README.md +0 -0
  395. {crow_cli-0.1.40/crow_cli/mcp/write → crow_cli-0.1.41/sandbox/litellm-proxy}/README.md +0 -0
  396. /crow_cli-0.1.40/crow_cli/cli/__init__.py → /crow_cli-0.1.41/sandbox/pathlib-test/README.md +0 -0
  397. /crow_cli-0.1.40/crow_cli/client/__init__.py → /crow_cli-0.1.41/sandbox/yaml-configs/README.md +0 -0
  398. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/__init__.py +0 -0
  399. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent/__init__.py +0 -0
  400. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent/compact.py +0 -0
  401. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent/context.py +0 -0
  402. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent/hooks.py +0 -0
  403. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent/llm.py +0 -0
  404. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent/logger.py +0 -0
  405. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent/main.py +0 -0
  406. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent/mcp_client.py +0 -0
  407. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent/memory.py +0 -0
  408. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent/model_routing.py +0 -0
  409. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent/prompt.py +0 -0
  410. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent/react.py +0 -0
  411. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent/session.py +0 -0
  412. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent/slash.py +0 -0
  413. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent/tools.py +0 -0
  414. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/agent_runner.py +0 -0
  415. {crow_cli-0.1.40/crow_cli/mcp/editor → crow_cli-0.1.41/src/crow_cli/cli}/__init__.py +0 -0
  416. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/cli/init_cmd.py +0 -0
  417. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/cli/install.py +0 -0
  418. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/cli/main.py +0 -0
  419. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/cli/tui_cmd.py +0 -0
  420. {crow_cli-0.1.40/crow_cli/mcp/memory → crow_cli-0.1.41/src/crow_cli/client}/__init__.py +0 -0
  421. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/client/main.py +0 -0
  422. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/client/subagent.py +0 -0
  423. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/client/terminal.py +0 -0
  424. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/config/__init__.py +0 -0
  425. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/config/config.py +0 -0
  426. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/config/default/__init__.py +0 -0
  427. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/config/default/defaults.py +0 -0
  428. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/config/default/searxng_settings.py +0 -0
  429. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/__init__.py +0 -0
  430. /crow_cli-0.1.40/crow_cli/mcp/read/__init__.py → /crow_cli-0.1.41/src/crow_cli/mcp/editor/README.md +0 -0
  431. {crow_cli-0.1.40/crow_cli/mcp/task → crow_cli-0.1.41/src/crow_cli/mcp/editor}/__init__.py +0 -0
  432. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/editor/main.py +0 -0
  433. {crow_cli-0.1.40/crow_cli/mcp/vision → crow_cli-0.1.41/src/crow_cli/mcp/memory}/__init__.py +0 -0
  434. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/memory/client.py +0 -0
  435. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/memory/main.py +0 -0
  436. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/memory/store.py +0 -0
  437. /crow_cli-0.1.40/crow_cli/mcp/write/__init__.py → /crow_cli-0.1.41/src/crow_cli/mcp/read/README.md +0 -0
  438. /crow_cli-0.1.40/crow_cli/tui/os.py → /crow_cli-0.1.41/src/crow_cli/mcp/read/__init__.py +0 -0
  439. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/read/main.py +0 -0
  440. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/server/__init__.py +0 -0
  441. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/server/app.py +0 -0
  442. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/server/logger.py +0 -0
  443. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/server/main.py +0 -0
  444. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/server/memtrim.py +0 -0
  445. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/task/main.py +0 -0
  446. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/terminal/__init__.py +0 -0
  447. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/terminal/backend.py +0 -0
  448. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/terminal/constants.py +0 -0
  449. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/terminal/logging_config.py +0 -0
  450. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/terminal/main.py +0 -0
  451. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/terminal/metadata.py +0 -0
  452. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/terminal/session.py +0 -0
  453. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/vision/client.py +0 -0
  454. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/vision/main.py +0 -0
  455. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/web_fetch/__init__.py +0 -0
  456. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/web_fetch/main.py +0 -0
  457. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/web_search/README.md +0 -0
  458. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/web_search/__init__.py +0 -0
  459. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/web_search/main.py +0 -0
  460. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/mcp/write/main.py +0 -0
  461. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/memory/__init__.py +0 -0
  462. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/memory/db.py +0 -0
  463. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/memory/fts.py +0 -0
  464. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/memory/ids.py +0 -0
  465. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/memory/image_store.py +0 -0
  466. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/memory/messages.py +0 -0
  467. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/memory/models.py +0 -0
  468. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/memory/reads.py +0 -0
  469. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/memory/session_tabs.py +0 -0
  470. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/memory/writes.py +0 -0
  471. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/NOTICE +0 -0
  472. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/__init__.py +0 -0
  473. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/_loop.py +0 -0
  474. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/_path_fuzzy_search.py +0 -0
  475. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/_path_match.py +0 -0
  476. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/acp/agent.py +0 -0
  477. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/acp/api.py +0 -0
  478. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/acp/encode_tool_call_id.py +0 -0
  479. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/acp/messages.py +0 -0
  480. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/acp/prompt.py +0 -0
  481. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/acp/protocol.py +0 -0
  482. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/agent.py +0 -0
  483. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/agent_schema.py +0 -0
  484. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/agent_terminal.py +0 -0
  485. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/agents.py +0 -0
  486. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/ansi/__init__.py +0 -0
  487. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/ansi/_ansi.py +0 -0
  488. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/ansi/_ansi_colors.py +0 -0
  489. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/ansi/_control_codes.py +0 -0
  490. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/ansi/_keys.py +0 -0
  491. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/ansi/_sgr_styles.py +0 -0
  492. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/ansi/_stream_parser.py +0 -0
  493. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/answer.py +0 -0
  494. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/app.py +0 -0
  495. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/atomic.py +0 -0
  496. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/code_analyze.py +0 -0
  497. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/complete.py +0 -0
  498. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/constants.py +0 -0
  499. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/conversation_markdown.py +0 -0
  500. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/danger.py +0 -0
  501. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/data/agents/crowai.dev.toml +0 -0
  502. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/data/images/crow.png +0 -0
  503. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/data/images/frog.png +0 -0
  504. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/data/sounds/question.wav +0 -0
  505. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/data/sounds/turn-over.wav +0 -0
  506. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/db.py +0 -0
  507. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/dec.py +0 -0
  508. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/directory.py +0 -0
  509. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/directory_suggester.py +0 -0
  510. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/directory_watcher.py +0 -0
  511. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/format_path.py +0 -0
  512. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/fuzzy.py +0 -0
  513. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/fuzzy_index.py +0 -0
  514. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/history.py +0 -0
  515. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/jsonrpc.py +0 -0
  516. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/mcp.py +0 -0
  517. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/menus.py +0 -0
  518. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/messages.py +0 -0
  519. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/option_content.py +0 -0
  520. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/path_complete.py +0 -0
  521. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/path_filter.py +0 -0
  522. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/paths.py +0 -0
  523. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/pill.py +0 -0
  524. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/prompt/extract.py +0 -0
  525. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/prompt/resource.py +0 -0
  526. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/protocol.py +0 -0
  527. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/action_modal.py +0 -0
  528. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/agent_modal.py +0 -0
  529. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/command_edit_modal.py +0 -0
  530. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/editor.py +0 -0
  531. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/editor.tcss +0 -0
  532. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/history.py +0 -0
  533. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/history.tcss +0 -0
  534. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/main.py +0 -0
  535. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/main.tcss +0 -0
  536. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/permissions.py +0 -0
  537. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/permissions.tcss +0 -0
  538. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/session_resume_modal.py +0 -0
  539. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/session_resume_modal.tcss +0 -0
  540. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/sessions.py +0 -0
  541. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/sessions.tcss +0 -0
  542. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/settings.py +0 -0
  543. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/settings.tcss +0 -0
  544. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/store.py +0 -0
  545. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/screens/store.tcss +0 -0
  546. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/session_list.py +0 -0
  547. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/session_tracker.py +0 -0
  548. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/settings.py +0 -0
  549. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/settings_schema.py +0 -0
  550. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/shell.py +0 -0
  551. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/shell_read.py +0 -0
  552. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/slash_command.py +0 -0
  553. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/themes.py +0 -0
  554. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/tui.tcss +0 -0
  555. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/visuals/columns.py +0 -0
  556. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/acp_content.py +0 -0
  557. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/agent_response.py +0 -0
  558. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/agent_thought.py +0 -0
  559. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/command_pane.py +0 -0
  560. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/condensed_path.py +0 -0
  561. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/conversation.py +0 -0
  562. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/danger_warning.py +0 -0
  563. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/diff_view.py +0 -0
  564. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/directory_input.py +0 -0
  565. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/editor_terminal.py +0 -0
  566. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/flash.py +0 -0
  567. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/future_text.py +0 -0
  568. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/grid_select.py +0 -0
  569. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/highlighted_textarea.py +0 -0
  570. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/mandelbrot.py +0 -0
  571. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/markdown_note.py +0 -0
  572. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/menu.py +0 -0
  573. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/non_selectable_label.py +0 -0
  574. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/note.py +0 -0
  575. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/path_search.py +0 -0
  576. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/plan.py +0 -0
  577. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/project_directory_tree.py +0 -0
  578. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/prompt.py +0 -0
  579. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/question.py +0 -0
  580. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/session_grid_select.py +0 -0
  581. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/session_summary.py +0 -0
  582. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/session_tabs.py +0 -0
  583. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/shell_result.py +0 -0
  584. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/shell_terminal.py +0 -0
  585. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/side_bar.py +0 -0
  586. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/slash_complete.py +0 -0
  587. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/strike_text.py +0 -0
  588. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/terminal.py +0 -0
  589. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/terminal_tool.py +0 -0
  590. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/throbber.py +0 -0
  591. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/tool_call.py +0 -0
  592. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/user_input.py +0 -0
  593. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/version.py +0 -0
  594. {crow_cli-0.1.40 → crow_cli-0.1.41/src}/crow_cli/tui/widgets/welcome.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 @@
1
+ 3.14
@@ -0,0 +1,30 @@
1
+ # RULES
2
+
3
+ - Never mention the user's emotional state. I'm here to work, NOT be psychoanalyzed by a machine.
4
+
5
+ # TUI TERMINAL KNOWLEDGE (verified, don't re-derive)
6
+
7
+ - ANSI emulator resize semantics ARE the product: alternate-screen buffers
8
+ must resize like pyte/real terminals (truncate columns on width shrink,
9
+ top-trim/pad on height change, 1:1 grid rows <-> buffer lines, clamp
10
+ cursor) — folding stale wide lines breaks CUP row addressing = garble.
11
+ Scrollback (normal) screen keeps folding. Oracle test: pyte dev dep.
12
+ - Two terminal pathways by mandate: `tui/agent_terminal.py::AgentTerminal`
13
+ (headless PTY + raw byte capture) backs the ACP terminal tool; the
14
+ human-facing emulator (TerminalTool/EditorTerminal) is separate. A
15
+ suspended conversation has window size 0 — never size a PTY from it.
16
+ - Textual gotchas: `Widget.screen` is a Textual property (name pyte
17
+ screens `pyte_screen`); `Strip` API is cell-based in Textual 8
18
+ (`crop_extend(0, w, None)`, `adjust_cell_length`); Textual 8.2.x breaks
19
+ on rich>=15 (uses Style internals rich dropped) — pin rich<15.
20
+ - pyte color values are "default", ANSI names, or 6-char hex strings for
21
+ BOTH 256-color and truecolor — never numeric palette indices (an
22
+ all-digit hex like "281733" is truecolor).
23
+ - A TUI only sends DIFFS: any fresh out-of-process terminal client
24
+ (riotermjs, reconnect) sees a blank/stale screen unless the child is
25
+ forced to full-repaint (winsize nudge: set cols-1 then cols).
26
+ - sandbox/textual-term-toy: the terminal-in-a-column experiment + the
27
+ riotermjs browser harness (bridge.py = PTY<->websocket; harness/ = page
28
+ with importmap to ~/src/riotermjs dist). How to view the TUI in a
29
+ browser: run bridge.py + `python -m http.server --directory harness`,
30
+ open the page, screenshot via playwright-cli.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: crow-cli
3
- Version: 0.1.40
3
+ Version: 0.1.41
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
@@ -0,0 +1,187 @@
1
+ # PLAN — open files in helix inside a terminal tab
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
+ ### The unlock (user, 30Aug2026)
7
+ Clicking a file in the TUI's project explorer must open **helix editing that
8
+ file inside a new session tab**, where the tab body is a **real terminal
9
+ emulator running the `hx` process**. NOT a fullscreen takeover of the TUI,
10
+ NOT an external editor — a terminal-shaped emulator *inside* the tab, as
11
+ pass-through as possible ("open the space for helix to fill like a good TUI
12
+ app"). `:wq!` (helix quitting) closes the tab. The tab model becomes generic:
13
+ `SessionTab: AcpClientChat | Terminal | Editor` (decoupled from session-id).
14
+ The `!command` fire-and-get-text-back shell stays as-is for now — do NOT
15
+ revolutionize the chat interface this sprint.
16
+
17
+ ### Reuse, don't hand-roll
18
+ - `widgets/terminal_tool.py::TerminalTool(Terminal)` already does the full PTY
19
+ dance (openpty, subprocess, read loop, `write_stdin`, `resize_pty`,
20
+ `wait_for_exit`, `kill`). EditorTerminal subclasses it.
21
+ - Tabs are Textual **modes**: `CrowApp.new_session_screen(get_screen, title)`
22
+ registers a mode + screen and tracks it in `SessionTracker`; the
23
+ `SessionsTabs` widget renders tabs from `session_tracker` (it reads
24
+ `app.session_tracker` + `app.current_mode`, so it works on ANY screen).
25
+ - `SessionClose` message + `MainScreen.on_session_close` already implement
26
+ "switch to neighbour, close tracker entry, remove mode".
27
+
28
+ ### Build/test gate
29
+ `uv --project . run pytest tests/unit -q` after each step (there is no TUI
30
+ test dir yet — create `tests/unit/tui/`). Live smoke in tmux session
31
+ `crowtui-test` (NEVER touch other sessions / the user's live rio windows;
32
+ this agent is itself a crow-cli instance — do not kill crow processes).
33
+ Commit when green, `Session-Id: terrific-heron-of-splendid-greatness` trailer.
34
+
35
+ ## Steps
36
+
37
+ > STATUS (30Aug2026): steps 1–7 DONE. Steps 1–6 committed (a52e3d41,
38
+ > 296a568c, 3d8597e5); step 7 (slice 2) committed this segment. Live smoke
39
+ > green end-to-end: file click → helix renders inside the tab in the chat's
40
+ > column with the sidebar visible, keys pass through, `:wq!` writes & closes
41
+ > the tab; the tab `✕` affordance closes an editor tab gracefully (sends
42
+ > `:wq!\r`, helix exits, no orphan process) and a chat tab directly. Full
43
+ > gate green: 518 passed (unit + integration + e2e + memory).
44
+ >
45
+ > Root-cause fix landed in 3d8597e5: the child PTY was never made the
46
+ > controlling terminal, so helix read /dev/tty size from the OUTER terminal
47
+ > (187 cols) and never got SIGWINCH — that, not the ANSI state, caused the
48
+ > blank/garbled editor. Fixed via preexec setsid()+TIOCSCTTY + pre-spawn
49
+ > PTY sizing.
50
+ >
51
+ > Slice-2 notes: programmatic keys to helix must end in `\r` (TERMINAL_KEY_MAP
52
+ > maps `enter`→`\r`, and helix ignores `\n`). `kill()` now kills the whole
53
+ > process group (os.killpg) and `EditorTerminal.on_unmount` calls it, so a
54
+ > closed tab never leaks `sh`/`hx`.
55
+
56
+ 1. ✅ **`tui/widgets/editor_terminal.py::EditorTerminal(TerminalTool)`**
57
+ - Pure pass-through `on_key`: forward EVERY key incl. `escape` immediately
58
+ (no double-tap-to-blur — helix needs ESC). `event.prevent_default();
59
+ event.stop()` then `state.key_event_to_stdin` → `write_process_stdin`.
60
+ - Override `update_size` to also `resize_pty(self._shell_fd, w, h)` so
61
+ helix redraws on tab/window resize (TerminalTool only sizes once).
62
+ - Post `Exited(return_code)` Message when the process exits.
63
+ - CSS: fill the tab (`width:100%; height:1fr;`), no border/`-success` noise.
64
+ - Verify: headless run_test with a trivial program (`cat`/`printf`) →
65
+ output lands in the buffer; ESC/key bytes reach stdin; Exited fires.
66
+
67
+ 2. ✅ **`tui/screens/editor.py::EditorScreen(Screen)` + `editor.tcss`**
68
+ - compose: `SessionsTabs()`, `EditorTerminal`, `Footer()`.
69
+ - on_mount: `terminal.start(w,h)` with the `hx <path>` command, focus it.
70
+ - Handle `EditorTerminal.Exited` → post `SessionClose(self.id)` (tab closes
71
+ when helix quits). Reuse the close semantics of MainScreen.on_session_close.
72
+ - Session-nav bindings (`ctrl+[` / `ctrl+]`) so you can leave the tab;
73
+ a `ctrl+q` binding → `quit_editor()` sends `:wq!\r` to stdin.
74
+ - Verify: headless test opens EditorScreen with a quick-exit command →
75
+ mounts, focuses terminal, closes on exit.
76
+
77
+ 3. ✅ **Generic tab model** — `session_tracker.SessionDetails` gains
78
+ `kind: Literal["chat","editor"]="chat"`; thread through
79
+ `SessionTracker.new_session(title, kind)` and
80
+ `CrowApp.new_session_screen(get_screen, title, kind)`. SessionsTabs may
81
+ render an editor glyph by kind (keep minimal).
82
+ - Verify: existing unit tests green; kind defaults to chat.
83
+
84
+ 4. ✅ **`CrowApp.open_file_in_editor(path)`** — build `Command(editor.command,
85
+ [str(path)], env, cwd=project)` and `new_session_screen(get_screen,
86
+ title=f"hx {path.name}", kind="editor")`. Editor command from settings key
87
+ `editor.command` (default `hx`) — add to `settings_schema.py` SCHEMA.
88
+ - Verify: headless — call it, assert a new editor mode/screen exists.
89
+
90
+ 5. ✅ **Rewire the explorer click** — `MainScreen.on_project_directory_tree_selected`
91
+ → `self.app.open_file_in_editor(data.path)` (instead of
92
+ `insert_path_into_prompt`). `@file` path-insert via path_search is unchanged.
93
+ - Verify: simulate `DirectoryTree.FileSelected` → open_file_in_editor called.
94
+
95
+ 6. ✅ **Live smoke (tmux `crowtui-test`)** — launch TUI, open a file from the
96
+ explorer, confirm helix renders inside the tab, keys pass through, `:wq!`
97
+ closes the tab and returns to chat. Capture frames to verify rendering.
98
+
99
+ 7. ✅ **(slice 2) tab `x` close affordance** — every tab label renders a
100
+ trailing `✕` (`session_tabs.CLOSE_GLYPH`); `SessionLabel.on_click`
101
+ hit-tests `offset.x >= content_region.width` and posts
102
+ `messages.SessionRequestClose(mode)`. `CrowApp.on_session_request_close`
103
+ is graceful for editor tabs (sends `:wq!\r` — `\r`, not `\n` — and lets
104
+ the resulting Exited→SessionClose cascade remove the tab) and direct for
105
+ chat tabs. `terminal_tool.kill()` kills the process group and
106
+ `EditorTerminal.on_unmount` calls it, so closing never orphans `sh`/`hx`.
107
+ - Verify: unit `test_x_affordance_gracefully_closes_editor_tab` (asserts
108
+ the editor received `:wq!` and the tab closes on exit) + live tmux
109
+ smoke (click `✕` → helix exits, no orphan). Both green.
110
+
111
+ ---
112
+
113
+ # PLAN — mature the ANSI emulator + editor tab = chat page
114
+
115
+ ## **DO NOT ASK USER FOR FEEDBACK — THIS IS THE USER FEEDBACK.**
116
+ ## **DO NOT ASK USER FOR NEXT STEPS — THESE ARE THE NEXT STEPS.**
117
+
118
+ ### The unlock (user, this segment)
119
+ Two user reports with screenshots:
120
+ 1. **Editor tab must be the SAME page as the chat page** — "they're really
121
+ the same page… align completely". Chat: tab bar INSIDE the right column
122
+ (right of sidebar, top of the Conversation widget). Editor: tab bar
123
+ full-width ABOVE the sidebar. Fix = move `SessionsTabs()` inside
124
+ `#editor-body` and mirror Conversation's column CSS exactly.
125
+ 2. **Holding `down` in helix garbles the display** — jumbled line numbers,
126
+ statusline fragments scattered at the right edge, scroll dead.
127
+
128
+ ### Research done (verified, don't redo)
129
+ - **pyte oracle**: our `TerminalState` matches pyte with 0 mismatches at
130
+ fixed size (120×40, 100 downs) AND under the app's real resize sequence
131
+ (headless 150×50 and user's 187×50). Core emulation is CORRECT.
132
+ - **The divergence is resize semantics**: our `TerminalState.update_size` →
133
+ `_reflow()` FOLDS stale wide lines on width shrink; pyte `Screen.resize`
134
+ TRUNCATES columns at the right and deletes rows from the TOP on height
135
+ shrink. Folded stale alt-screen lines break CUP row addressing
136
+ (fold-index ≠ row-index) → exactly the garble the user saw.
137
+ - **Copied notes from mitosch/textual-terminal** (the project doing exactly
138
+ this — pyte inside a Textual widget): `on_resize` sets ncol/nrow from the
139
+ widget size, tells the PTY via set_size, and calls `screen.resize(nrow,
140
+ ncol)` — real-terminal semantics, NO folding, NO buffer wipes. Renders by
141
+ iterating `screen.buffer[y][x]` Char cells; mouse toggled by sniffing
142
+ DECSET 1000h/l (we already do the equivalent). Also noted:
143
+ par-term-emu-tui-rust (Textual widget over Rust core) as the mature/perf
144
+ option; neovim :terminal uses libvterm and still has resize-drift bugs.
145
+ - Widget mitigation (`update_size` wipes alt buffer on alt+size change)
146
+ exists but is a lossy band-aid; the state itself must be grid-faithful.
147
+
148
+ ## Steps
149
+
150
+ 1. ✅ **pyte-semantics resize in `tui/ansi/_ansi.py::TerminalState.update_size`**
151
+ - Alternate screen: width shrink → TRUNCATE every line at the new width
152
+ (never fold — grid rows must stay 1:1 with buffer lines); height
153
+ shrink → delete rows from the TOP; height grow → pad blank rows at the
154
+ bottom; clamp the cursor; rebuild fold index; mark all lines updated.
155
+ - Scrollback (normal) screen: keep the existing fold/reflow behavior
156
+ (presentation wrapping is a chat feature).
157
+ - Fix the `width is None` bug (compared `previous_width != width` with
158
+ `width=None` → spurious reflow).
159
+ - `widgets/terminal.py::update_size`: pass `self._height` (not the raw
160
+ arg) to `state.update_size`; drop the lossy alt-buffer wipe — with
161
+ grid-faithful resize the truncated content is exactly what a real
162
+ terminal shows until the program's SIGWINCH repaint lands.
163
+ - Verify: `tests/unit/tui/test_ansi_resize.py` — pyte-oracle regression
164
+ (helix-shaped paint → shrink → repaint, 0 mismatches), CUP addressing
165
+ after shrink lands on the right row, scrollback still folds.
166
+
167
+ 2. ✅ **Editor tab = chat page** — `screens/editor.py` compose: move
168
+ `SessionsTabs()` inside `#editor-body` (above EditorTerminal);
169
+ `editor.tcss`: `#editor-body` gets Conversation's chrome (`padding-left:
170
+ 1`, `&.-column { max-width: 100; background: black 7%; }`) and
171
+ `_apply_column_width` toggles `-column` exactly like MainScreen's
172
+ `watch_column`. Verify: unit test asserts SessionsTabs is a descendant of
173
+ #editor-body; live smoke compares both tabs' tab bars.
174
+
175
+ 3. ✅ **Gate + live smoke** — `pytest tests/unit -q`, full gate, tmux
176
+ `crowtui-test`: open file in helix, hold down (100 downs via SGR keys or
177
+ repeated sends), resize the window, verify no garble; compare chat vs
178
+ editor tab bar placement via capture-pane.
179
+
180
+ 4. ✅ **Commit** (Session-Id trailer) + PLAN/TODO status updates.
181
+
182
+ ## Deferred (still open, not this sprint)
183
+ - TUI image attachments as ACP image content (previous PLAN, steps preserved
184
+ in TODO.md item).
185
+ - TUI ACP-client migration onto the official `acp` SDK (TODO.md item).
186
+ - `!command` shell UX improvements (reveal/scroll lag) — fire-and-forget is
187
+ acceptable for now per user.
@@ -0,0 +1,112 @@
1
+ # PyInstaller Binary Build Setup
2
+
3
+ ## ✅ What's Been Created
4
+
5
+ ### 1. GitHub Workflow: `.github/workflows/build-binaries.yml`
6
+
7
+ Builds crow-cli binaries for:
8
+ - **Linux x86_64** (ubuntu-22.04)
9
+ - **macOS x86_64** (macos-13)
10
+ - **macOS ARM64** (macos-latest - Apple Silicon)
11
+
12
+ **Trigger:** Push version tags (e.g., `v0.1.13`)
13
+
14
+ **Output:** Creates GitHub release with attached archives:
15
+ - `crow-cli-linux-x86_64.tar.gz`
16
+ - `crow-cli-darwin-x86_64.tar.gz`
17
+ - `crow-cli-darwin-aarch64.tar.gz`
18
+
19
+ ### 2. PyInstaller Spec File: `crow-cli.spec`
20
+
21
+ Configured with:
22
+ - **Metadata copying** for all packages using `importlib.metadata` (fastmcp, agent-client-protocol, typer, rich, openai, etc.)
23
+ - **Hidden imports** for dynamic imports (coolname.data, etc.)
24
+ - **Data files** included (config.yaml, system_prompt.jinja2, settings.yml, etc.)
25
+ - **One-file executable** with UPX compression
26
+
27
+ ### 3. Dependencies: `pyproject.toml`
28
+
29
+ Added `pyinstaller>=6.0.0` to dev dependency group
30
+
31
+ ## 🧪 Local Testing
32
+
33
+ ```bash
34
+ cd crow-cli
35
+ uv --project . pip install pyinstaller
36
+ uv --project . run pyinstaller crow-cli.spec --noconfirm
37
+ dist/crow-cli --help
38
+ ```
39
+
40
+ ## 🚀 Usage
41
+
42
+ ### To trigger a build:
43
+
44
+ 1. Commit and push the workflow:
45
+ ```bash
46
+ git add .github/workflows/build-binaries.yml
47
+ git add crow-cli.spec
48
+ git add pyproject.toml
49
+ git commit -m "Add PyInstaller binary build workflow"
50
+ git push
51
+ ```
52
+
53
+ 2. Create a test tag:
54
+ ```bash
55
+ git tag v0.1.13-test
56
+ git push origin v0.1.13-test
57
+ ```
58
+
59
+ 3. GitHub Actions will build all platforms and create a release
60
+
61
+ ### To update the ACP Registry:
62
+
63
+ After binaries are built, update `agent.json`:
64
+
65
+ ```json
66
+ {
67
+ "distribution": {
68
+ "uvx": {...},
69
+ "binary": {
70
+ "darwin-aarch64": {
71
+ "archive": "https://github.com/crow-cli/crow-cli/releases/download/v0.1.13/crow-cli-darwin-aarch64.tar.gz",
72
+ "cmd": "./crow-cli",
73
+ "args": ["acp"]
74
+ },
75
+ "darwin-x86_64": {...},
76
+ "linux-x86_64": {...}
77
+ }
78
+ }
79
+ }
80
+ ```
81
+
82
+ Then submit PR to [agentclientprotocol/registry](https://github.com/agentclientprotocol/registry)
83
+
84
+ ## ⚠️ Known Issues & Solutions
85
+
86
+ ### Package Metadata Errors
87
+ If you see `importlib.metadata.PackageNotFoundError`, add the package to the `copy_metadata()` calls in the spec file:
88
+
89
+ ```python
90
+ datas=[
91
+ ...
92
+ ] + copy_metadata('packagename')
93
+ ```
94
+
95
+ ### Missing Module Errors
96
+ If you see `ModuleNotFoundError` for submodules, add to `hiddenimports`:
97
+
98
+ ```python
99
+ hiddenimports=[
100
+ 'packagename.submodule',
101
+ ...
102
+ ]
103
+ ```
104
+
105
+ ### Build Size
106
+ Current Linux build: ~80MB (compressed with UPX)
107
+
108
+ ## 📝 Notes
109
+
110
+ - The spec file handles all metadata copying, so no command-line flags needed
111
+ - macOS builds use different runners for Intel (macos-13) vs Apple Silicon (macos-latest)
112
+ - Artifacts are retained for 30 days, but releases are permanent
@@ -0,0 +1,120 @@
1
+ # Terminal Stack — crow spaceship edition
2
+
3
+ The dev terminal stack on this box, documented 2026-08-29. Everything is
4
+ installed without sudo (user-local), and rio is built from source — which
5
+ is the whole point, see below.
6
+
7
+ ## Rio terminal (built from source — `~/src/rio`, v0.5.26)
8
+
9
+ Installed at `~/.cargo/bin/rio`. Config: `~/.config/rio/config.toml`
10
+ (shades-of-dracula crow flavor — chrome accents are Dracula purple
11
+ `#BD93F9`, matching `src/crow_cli/tui/themes.py`; ANSI yellow stays
12
+ yellow for program output). Font: DejaVu Sans Mono 12px, deliberately
13
+ NOT a Nerd Font (won the bake-off against Lilex; tested against Zed).
14
+ All prompt/tool symbols in this stack are DejaVu-safe.
15
+
16
+ ### What building from source buys
17
+
18
+ The default Linux build uses the native Vulkan backend. Two cargo
19
+ features are off by default and only reachable with a source build
20
+ (`frontends/rioterm/Cargo.toml`):
21
+
22
+ 1. **`wgpu` — RetroArch shader filters.** The librashader filter chain
23
+ (https://rioterm.com/docs/features/retroarch-shaders) only runs on
24
+ the wgpu backend. Post-processing for the whole terminal: built-in
25
+ `newpixiecrt`, or any `.slangp` from libretro/slang-shaders (CRT,
26
+ bloom, scanlines — the spaceship-cockpit look).
27
+ 2. **`audio` — real audio bell** via cpal (`handle_audio_bell` in
28
+ `frontends/rioterm/src/application.rs`).
29
+
30
+ Also available in config regardless of build: `[renderer] strategy =
31
+ "Game"` (continuous game-loop rendering) vs the default event-based.
32
+
33
+ ### Rebuild with shaders enabled
34
+
35
+ ```bash
36
+ cd ~/src/rio
37
+ cargo install --path frontends/rioterm --features wgpu,audio --force
38
+ ```
39
+
40
+ Then in `~/.config/rio/config.toml`:
41
+
42
+ ```toml
43
+ [renderer]
44
+ backend = "Webgpu"
45
+ filters = ["newpixiecrt"] # or a path to any .slangp
46
+ ```
47
+
48
+ Note: wgpu-on-Linux translates through to Vulkan (slightly heavier than
49
+ the native backend); filters cost some GPU. If `filters` is set but the
50
+ backend is native Vulkan, rio accepts the config and silently skips the
51
+ chain — you must set `backend = "Webgpu"`.
52
+
53
+ Being upstream-from-source also means we can patch rio itself when the
54
+ zellji integration (below) needs something rio doesn't do yet.
55
+
56
+ ## Shell stack (bash 5.2 — no shell switch, bash gets the upgrades)
57
+
58
+ All user-local; `~/.bashrc` is the spaceship (original at `~/.bashrc.bak`).
59
+
60
+ | Tool | What it does | Lives at |
61
+ |---|---|---|
62
+ | **starship** | prompt — git/lang/duration, Dracula palette | `~/.local/bin/starship`, config `~/.config/starship.toml` |
63
+ | **ble.sh** | readline replacement: syntax highlighting, autosuggestions, menu completion | `~/.local/share/ble-nightly/`, config `~/.blerc` |
64
+ | **eza** | ls with git status + tree | `~/.local/bin/eza` |
65
+ | **bat** | cat with syntax highlighting | `~/.local/bin/bat` |
66
+ | **zoxide** | `z foo` frecency directory jumps (`zi` interactive) | `~/.local/bin/zoxide` |
67
+ | **fzf** | Ctrl-R fuzzy history, Ctrl-T files, Alt-C dirs (fd-backed) | `~/.local/bin/fzf` + `~/.local/share/fzf/*.bash` |
68
+ | **delta** | git diff pager (wire via `git config --global core.pager delta` when wanted) | `~/.local/bin/delta` |
69
+ | **fd / rg** | already present via cargo | `~/.cargo/bin` |
70
+ | **hx** | helix editor, `$EDITOR` | system |
71
+
72
+ Update paths: starship re-runs its installer; ble.sh = re-download the
73
+ nightly tarball (`ble.sh/releases/download/nightly/ble-nightly.tar.xz`
74
+ → extract to `~/.local/share`, no gawk/make needed for the prebuilt
75
+ tarball); the rest are GitHub-release binaries (x86_64).
76
+
77
+ ### `CROW_TERMINAL` — machine-driven PTY convention
78
+
79
+ The MCP terminal tool (`mcp/terminal/backend.py`) spawns interactive
80
+ bash in a PTY and owns the prompt via a JSON-in-PS1 protocol
81
+ (`###PS1JSON###` markers, exit code in `$__crow_ec`). It sets
82
+ `CROW_TERMINAL=1` in the child env. Prompt frameworks must respect it:
83
+
84
+ - **starship / ble.sh**: stay OFF under `CROW_TERMINAL` (they re-render
85
+ PS1 / take over line editing and clobber the protocol).
86
+ - **PROMPT_COMMAND hooks** (zoxide, fnm, ...): fine — the backend
87
+ captures `$?` into `$__crow_ec` before any hook runs.
88
+
89
+ Any future shell decoration in `~/.bashrc` must keep the gate.
90
+
91
+ ### bashrc load order (matters)
92
+
93
+ 1. interactive guard → 2. ble.sh `--attach=none` (first) → 3. history →
94
+ 4. env (hx, LESS_TERMCAP, GCC_COLORS) → 5. toolchain PATH blocks
95
+ (cargo/fnm/bun/juliaup) → 6. aliases (eza/bat/git) → 7. fzf bindings →
96
+ 8. bash-completion → 9. `starship init` + `zoxide init` → 10.
97
+ `ble-attach` (LAST — ble.sh takes over line editing).
98
+
99
+ ## The zellji vision (why this is documented in crow-cli)
100
+
101
+ Goal: crow-cli grows into the glue of a full terminal IDE, replacing
102
+ the pile of bash scripts in https://github.com/josephschmitt/zide
103
+ (zellij layouts + `zide-pick` yazi wrapper + `zide-edit` editor
104
+ launcher) with Python.
105
+
106
+ - **zellij** = window/pane manager (the "IDE frame")
107
+ - **yazi** = filesystem pane
108
+ - **helix** (`hx`) = editor pane
109
+ - **crow-cli TUI** = the agent pane AND the orchestrator: spawns the
110
+ layout, routes "open file" events from yazi into helix, drives the
111
+ agent — i.e. `crow-cli ide` instead of `zide` + `zide-pick` +
112
+ `zide-edit`.
113
+
114
+ Stepping stones: crow-cli already speaks ACP to its own agent and has
115
+ a TUI that drives it; the zide behaviors to absorb are (1) layout
116
+ launch with working-dir propagation, (2) filepicker → editor IPC
117
+ (zide uses zellij's pipe/message), (3) pane auto-resize for the picker.
118
+ Rio-from-source is the display layer: if the IDE glue needs something
119
+ from the terminal (keycodes, shader states, notifications), we patch
120
+ rio rather than work around it.