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.
- crow_cli-0.1.37/.env.example +2 -0
- crow_cli-0.1.37/.github/workflows/build-binaries.yml +101 -0
- crow_cli-0.1.37/.github/workflows/publish-crow-cli.yml +42 -0
- crow_cli-0.1.37/.gitignore +36 -0
- crow_cli-0.1.37/AGENTS.md +3 -0
- crow_cli-0.1.37/LICENSE.md +21 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/PKG-INFO +32 -23
- crow_cli-0.1.37/PLAN.md +263 -0
- crow_cli-0.1.37/PYINSTALLER_BUILD.md +112 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/README.md +24 -20
- crow_cli-0.1.37/TODO.md +165 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/agent.json +1 -1
- {crow_cli-0.1.34 → crow_cli-0.1.37}/crow-cli.spec +14 -2
- crow_cli-0.1.37/dev-crow-2.yaml +17 -0
- crow_cli-0.1.37/docs/CNAME +2 -0
- crow_cli-0.1.37/docs/crow-cli-docs/getting-started/installation.md +32 -0
- crow_cli-0.1.37/docs/crow-cli-docs/getting-started/quickstart.md +63 -0
- crow_cli-0.1.37/docs/crow-cli-docs/index.md +58 -0
- crow_cli-0.1.37/docs/crow-cli-docs/memory-tool-design.md +294 -0
- crow_cli-0.1.37/docs/crow-cli-docs/myst.yml +19 -0
- crow_cli-0.1.37/docs/crow-cli-docs/styles/purple.css +118 -0
- crow_cli-0.1.37/docs/crow-logo.svg +19 -0
- crow_cli-0.1.37/docs/get-llamacpp-working.md +1112 -0
- crow_cli-0.1.37/docs/getting-started/installation.md +32 -0
- crow_cli-0.1.37/docs/getting-started/quickstart.md +57 -0
- crow_cli-0.1.37/docs/icon.ico +0 -0
- crow_cli-0.1.37/docs/img/crow-icon-purple.svg +51 -0
- crow_cli-0.1.37/docs/img/crow-logo-crop.png +0 -0
- crow_cli-0.1.37/docs/img/icon.svg +9 -0
- crow_cli-0.1.37/docs/img/whiteboard_capture.png +0 -0
- crow_cli-0.1.37/docs/index.html +715 -0
- crow_cli-0.1.37/docs/index.md +40 -0
- crow_cli-0.1.37/docs/journal/03May2026.md +8 -0
- crow_cli-0.1.37/docs/journal/19Feb2026.md +46 -0
- crow_cli-0.1.37/docs/journal/20Feb2026.md +15 -0
- crow_cli-0.1.37/docs/journal/22Feb2026.md +91 -0
- crow_cli-0.1.37/docs/llm-wiki.md +75 -0
- crow_cli-0.1.37/docs/myst.yml +19 -0
- crow_cli-0.1.37/docs/styles/purple.css +118 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/pyproject.toml +7 -7
- crow_cli-0.1.37/run_tests.sh +5 -0
- crow_cli-0.1.37/sandbox/agent-client/.python-version +1 -0
- crow_cli-0.1.37/sandbox/agent-client/README.md +309 -0
- crow_cli-0.1.37/sandbox/agent-client/SUCCESS.md +90 -0
- crow_cli-0.1.37/sandbox/agent-client/TODO.md +50 -0
- crow_cli-0.1.37/sandbox/agent-client/agent_client.py +867 -0
- crow_cli-0.1.37/sandbox/agent-client/echo_agent.py +85 -0
- crow_cli-0.1.37/sandbox/agent-client/fire_up_echo.py +71 -0
- crow_cli-0.1.37/sandbox/agent-client/fire_up_simple.py +58 -0
- crow_cli-0.1.37/sandbox/agent-client/main.py +6 -0
- crow_cli-0.1.37/sandbox/agent-client/pyproject.toml +11 -0
- crow_cli-0.1.37/sandbox/agent-client/run_bridge.py +79 -0
- crow_cli-0.1.37/sandbox/agent-client/simple_agent.py +111 -0
- crow_cli-0.1.37/sandbox/agent-client/stdio_to_ws.py +220 -0
- crow_cli-0.1.37/sandbox/agent-client/test_acp_ws_client.py +64 -0
- crow_cli-0.1.37/sandbox/agent-client/test_agent_client.py +74 -0
- crow_cli-0.1.37/sandbox/agent-client/test_bridge.py +48 -0
- crow_cli-0.1.37/sandbox/agent-client/test_bridge_and_client.py +193 -0
- crow_cli-0.1.37/sandbox/agent-client/test_bridge_direct.py +92 -0
- crow_cli-0.1.37/sandbox/agent-client/test_client.py +261 -0
- crow_cli-0.1.37/sandbox/agent-client/test_date_terminal.py +277 -0
- crow_cli-0.1.37/sandbox/agent-client/test_echo_agent.py +51 -0
- crow_cli-0.1.37/sandbox/agent-client/test_fs_terminal.py +78 -0
- crow_cli-0.1.37/sandbox/agent-client/test_http_multisession.py +151 -0
- crow_cli-0.1.37/sandbox/agent-client/test_raw_stdio.py +137 -0
- crow_cli-0.1.37/sandbox/agent-client/test_simple.py +133 -0
- crow_cli-0.1.37/sandbox/agent-client/test_ws_client.py +94 -0
- crow_cli-0.1.37/sandbox/agent-client/two_sessions_same_question.py +113 -0
- crow_cli-0.1.37/sandbox/agent-client/uv.lock +333 -0
- crow_cli-0.1.37/sandbox/async-react/.python-version +1 -0
- crow_cli-0.1.37/sandbox/async-react/README.md +3 -0
- crow_cli-0.1.37/sandbox/async-react/db_integrity_test.py +328 -0
- crow_cli-0.1.37/sandbox/async-react/e2e_tool_integrity.py +409 -0
- crow_cli-0.1.37/sandbox/async-react/persistence_integrity_test.py +599 -0
- crow_cli-0.1.37/sandbox/async-react/pyproject.toml +15 -0
- crow_cli-0.1.37/sandbox/async-react/streaming_async_react.py +255 -0
- crow_cli-0.1.37/sandbox/async-react/streaming_async_react_with_cancellation.py +405 -0
- crow_cli-0.1.37/sandbox/async-react/test_usage.py +161 -0
- crow_cli-0.1.37/sandbox/async-react/tool_call_integrity_test.py +287 -0
- crow_cli-0.1.37/sandbox/async-react/uv.lock +1646 -0
- crow_cli-0.1.37/sandbox/crow-acp-learning/agent.py +125 -0
- crow_cli-0.1.37/sandbox/crow-acp-learning/client.py +211 -0
- crow_cli-0.1.37/sandbox/crow-acp-learning/duet.py +43 -0
- crow_cli-0.1.37/sandbox/crow-acp-learning/echo_agent.py +418 -0
- crow_cli-0.1.37/sandbox/crow-acp-learning/fire_up_echo.py +75 -0
- crow_cli-0.1.37/sandbox/crow-acp-learning/gemini.py +394 -0
- crow_cli-0.1.37/sandbox/crow-acp-learning/pyproject.toml +10 -0
- crow_cli-0.1.37/sandbox/crow-acp-learning/terminal_agent.py +342 -0
- crow_cli-0.1.37/sandbox/crow-acp-learning/test_acp.py +89 -0
- crow_cli-0.1.37/sandbox/crow-acp-learning/uv.lock +299 -0
- crow_cli-0.1.37/sandbox/crow-test/.python-version +1 -0
- crow_cli-0.1.37/sandbox/crow-test/graph.png +0 -0
- crow_cli-0.1.37/sandbox/crow-test/graph.py +25 -0
- crow_cli-0.1.37/sandbox/crow-test/main.py +6 -0
- crow_cli-0.1.37/sandbox/crow-test/pyproject.toml +12 -0
- crow_cli-0.1.37/sandbox/crow-test/uv.lock +1658 -0
- crow_cli-0.1.37/sandbox/dirtree/.python-version +1 -0
- crow_cli-0.1.37/sandbox/dirtree/README.md +0 -0
- crow_cli-0.1.37/sandbox/dirtree/main.py +6 -0
- crow_cli-0.1.37/sandbox/dirtree/pyproject.toml +10 -0
- crow_cli-0.1.37/sandbox/dirtree/uv.lock +212 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/00-architecture-overview.md +495 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/01-parallel-tool-calling.md +220 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/02-toad-integration.md +321 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/03-session-persistence.md +468 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/04-cancellation-and-state.md +436 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/05-loop-detection.md +681 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/06-finish-tool.md +685 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/07-python-repl.md +701 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/08-system-prompt-skills.md +631 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/09-session-continuity-and-compaction.md +216 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/AGENTS_OLD.md +1427 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/ARCHITECTURE.md +288 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/CANCELLATION_IMPLEMENTATION.md +361 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/CANCELLATION_SANDBOX_COMPARISON.md +266 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/CANCELLATION_SUMMARY.md +207 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/CRITICAL_CLARIFICATIONS.md +506 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/CROW_SDK_ANALYSIS.md +642 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/EXTENSION_DISCUSSION.md +133 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/IMPLEMENTATION_PLAN.md +903 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/IMPLEMENTATION_SUMMARY.md +160 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/IMPLEMENTATION_SUMMARY_ACP_SESSIONS.md +192 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/INSTRUCTIONS_FOR_KIMI.md +106 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/PROJECT_VISION.md +3 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/PROMPT.md +148 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/PULSE_CHECK.md +512 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/REPL_GUIDE.md +148 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/TABLE_SCHEMA.md +53 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/THOUGHTS.md +25 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/check_acp_agent.py +11 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/conversation-wrapper-analysis.md +493 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/crow-agent-good-stuff.md +5442 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/crow_agent_example.py +113 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/crow_inspect.py +223 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/database.py +207 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/essays/00-file-editor-semantics-and-fastmcp.md +495 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/essays/01-mcp-server-package-structure.md +248 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/essays/02-hooks-realization-and-agent-core.md +420 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/essays/03-where-we-are-now-and-whats-next.md +498 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/essays/04-acp-mcp-configuration.md +228 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/essays/04-hooks-as-first-class-citizens.md +318 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/essays/05-hook-design-analysis.md +461 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/essays/05-python-sdk-that-emerged.md +460 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/essays/06-acp-native-sessions.md +225 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/essays/07-extension-api-design.md +308 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/essays/08-flask-extension-pattern-with-context-variables.md +380 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/essays/09-git-commit-violation-last-testament.md +146 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/essays/10-monorepo-refactor-to-avoid-cyclic-dependencies.md +342 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/essays/11-acp-terminal-tool-swapping.md +233 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/essays/12-hook-based-architecture-and-the-frameworkless-framework.md +1100 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/essays/13-acp-terminal-architecture.md +656 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/essays/14-terminal-mcp-implementation.md +1116 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/essays/15-terminal-mcp-complete.md +324 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/essays/16-fractal-filesystem-sandbox-parallel-tool-calling.md +56 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/essays/17-composition-over-inheritance-extension-design.md +279 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/essays/18-self-injection-the-god-mode-pattern.md +458 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/essays/19-pluggy-the-missing-piece.md +422 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/essays/20-terminal-tool-failure-bug-report.md +145 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/essays/21-callback-architecture-multi-agent-bridges.md +404 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/essays/22-the-agent-was-always-here.md +432 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/essays/23-cancellation-solid-plan.md +166 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/essays/24-async-tool-hanging-debug-thoughts.md +153 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/essays/25-acp-client-terminal-integration.md +272 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/essays/26-graceful-cancellation-streaming.md +819 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/essays/llms-txt-and-agent-skills.md +334 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/fire_up_echo.py +148 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/kernel_kernel.py +182 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/merging-agents-guide.md +440 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/plans/acp-tool-enhancements.md +464 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/quick_test.py +69 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/research-findings.md +479 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/search.py +95 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/simple_crow_agent.py +154 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/streaming_async_react.py +225 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/streaming_async_react_with_db.py +280 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/streaming_react.py +201 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/terminal_demo.py +283 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/test_client_caps.py +151 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/test_crow_e2e.py +62 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/test_terminal_client.py +267 -0
- crow_cli-0.1.37/sandbox/docs/ancestors/zai_tool_integration.py +115 -0
- crow_cli-0.1.37/sandbox/fastmcp-test/.gitignore +10 -0
- crow_cli-0.1.37/sandbox/fastmcp-test/.python-version +1 -0
- crow_cli-0.1.37/sandbox/fastmcp-test/README.md +0 -0
- crow_cli-0.1.37/sandbox/fastmcp-test/client.py +38 -0
- crow_cli-0.1.37/sandbox/fastmcp-test/docs/essays/00-fractal-filesystem-sandbox-parallel-tool-calling.md +56 -0
- crow_cli-0.1.37/sandbox/fastmcp-test/pyproject.toml +20 -0
- crow_cli-0.1.37/sandbox/fastmcp-test/src/fastmcp_test/__init__.py +4 -0
- crow_cli-0.1.37/sandbox/fastmcp-test/src/fastmcp_test/server/__init__.py +3 -0
- crow_cli-0.1.37/sandbox/fastmcp-test/src/fastmcp_test/server/main.py +17 -0
- crow_cli-0.1.37/sandbox/fastmcp-test/src/fastmcp_test/tool/__init__.py +3 -0
- crow_cli-0.1.37/sandbox/fastmcp-test/src/fastmcp_test/tool/main.py +7 -0
- crow_cli-0.1.37/sandbox/fastmcp-test/uv.lock +1401 -0
- crow_cli-0.1.37/sandbox/lancedb-testing/.gitignore +4 -0
- crow_cli-0.1.37/sandbox/lancedb-testing/.python-version +1 -0
- crow_cli-0.1.37/sandbox/lancedb-testing/README.md +38 -0
- crow_cli-0.1.37/sandbox/lancedb-testing/bench_colpali.py +141 -0
- crow_cli-0.1.37/sandbox/lancedb-testing/bench_dual_model.py +78 -0
- crow_cli-0.1.37/sandbox/lancedb-testing/bench_latency.py +182 -0
- crow_cli-0.1.37/sandbox/lancedb-testing/lancedb_session.py +120 -0
- crow_cli-0.1.37/sandbox/lancedb-testing/load_crow_db.py +162 -0
- crow_cli-0.1.37/sandbox/lancedb-testing/main.py +31 -0
- crow_cli-0.1.37/sandbox/lancedb-testing/multivector.py +82 -0
- crow_cli-0.1.37/sandbox/lancedb-testing/pyproject.toml +15 -0
- crow_cli-0.1.37/sandbox/lancedb-testing/uv.lock +2090 -0
- crow_cli-0.1.37/sandbox/langfuse-test/.python-version +1 -0
- crow_cli-0.1.37/sandbox/langfuse-test/README.md +45 -0
- crow_cli-0.1.37/sandbox/langfuse-test/explore.py +280 -0
- crow_cli-0.1.37/sandbox/langfuse-test/main.py +22 -0
- crow_cli-0.1.37/sandbox/langfuse-test/pyproject.toml +11 -0
- crow_cli-0.1.37/sandbox/langfuse-test/uv.lock +536 -0
- crow_cli-0.1.37/sandbox/litellm-dashscope/.python-version +1 -0
- crow_cli-0.1.37/sandbox/litellm-dashscope/README.md +0 -0
- crow_cli-0.1.37/sandbox/litellm-dashscope/main.py +6 -0
- crow_cli-0.1.37/sandbox/litellm-dashscope/pyproject.toml +14 -0
- crow_cli-0.1.37/sandbox/litellm-dashscope/test_all_models_reasoning.py +176 -0
- crow_cli-0.1.37/sandbox/litellm-dashscope/test_fix_correctness.py +421 -0
- crow_cli-0.1.37/sandbox/litellm-dashscope/test_llamacpp_reasoning.py +298 -0
- crow_cli-0.1.37/sandbox/litellm-dashscope/test_rc_empty.py +142 -0
- crow_cli-0.1.37/sandbox/litellm-dashscope/test_reasoning_tool_transition.py +354 -0
- crow_cli-0.1.37/sandbox/litellm-dashscope/test_reasoning_transition.py +339 -0
- crow_cli-0.1.37/sandbox/litellm-dashscope/uv.lock +1654 -0
- crow_cli-0.1.37/sandbox/litellm-proxy/.python-version +1 -0
- crow_cli-0.1.37/sandbox/litellm-proxy/README.md +0 -0
- crow_cli-0.1.37/sandbox/litellm-proxy/config.yaml +6 -0
- crow_cli-0.1.37/sandbox/litellm-proxy/main.py +6 -0
- crow_cli-0.1.37/sandbox/litellm-proxy/pyproject.toml +9 -0
- crow_cli-0.1.37/sandbox/litellm-proxy/uv.lock +2368 -0
- crow_cli-0.1.37/sandbox/murder-architecture.md +18 -0
- crow_cli-0.1.37/sandbox/pathlib-test/.python-version +1 -0
- crow_cli-0.1.37/sandbox/pathlib-test/README.md +0 -0
- crow_cli-0.1.37/sandbox/pathlib-test/main.py +6 -0
- crow_cli-0.1.37/sandbox/pathlib-test/pyproject.toml +9 -0
- crow_cli-0.1.37/sandbox/pathlib-test/src/pathlib_test/test.py +3 -0
- crow_cli-0.1.37/sandbox/pathlib-test/uv.lock +199 -0
- crow_cli-0.1.37/sandbox/pyinstaller-async-test/.python-version +1 -0
- crow_cli-0.1.37/sandbox/pyinstaller-async-test/main.py +92 -0
- crow_cli-0.1.37/sandbox/pyinstaller-async-test/pyproject.toml +11 -0
- crow_cli-0.1.37/sandbox/pyinstaller-async-test/test.spec +42 -0
- crow_cli-0.1.37/sandbox/pyinstaller-async-test/uv.lock +116 -0
- crow_cli-0.1.37/sandbox/repl-agent/.crow/compose.yaml +25 -0
- crow_cli-0.1.37/sandbox/repl-agent/.crow/config.yaml +34 -0
- crow_cli-0.1.37/sandbox/repl-agent/.crow/litellm/config.yaml +29 -0
- crow_cli-0.1.37/sandbox/repl-agent/.crow/searxng/settings.yml +2799 -0
- crow_cli-0.1.37/sandbox/repl-agent/.gitignore +1 -0
- crow_cli-0.1.37/sandbox/repl-agent/.python-version +1 -0
- crow_cli-0.1.37/sandbox/repl-agent/AGENT_CLIENT_INTEGRATION.md +309 -0
- crow_cli-0.1.37/sandbox/repl-agent/README.md +393 -0
- crow_cli-0.1.37/sandbox/repl-agent/client.py +338 -0
- crow_cli-0.1.37/sandbox/repl-agent/compact_agent.py +31 -0
- crow_cli-0.1.37/sandbox/repl-agent/compact_e2e_test.py +88 -0
- crow_cli-0.1.37/sandbox/repl-agent/compact_fixtures/case_01_system_user_only.json +20 -0
- crow_cli-0.1.37/sandbox/repl-agent/compact_fixtures/case_02_reasoning_only.json +25 -0
- crow_cli-0.1.37/sandbox/repl-agent/compact_fixtures/case_03_content_only.json +25 -0
- crow_cli-0.1.37/sandbox/repl-agent/compact_fixtures/case_04_unexecuted_tools.json +43 -0
- crow_cli-0.1.37/sandbox/repl-agent/compact_fixtures/case_05_mid_conversation_all_responded.json +81 -0
- crow_cli-0.1.37/sandbox/repl-agent/compact_fixtures/case_06_partial_tool_responses.json +76 -0
- crow_cli-0.1.37/sandbox/repl-agent/compact_fixtures/case_07_complete_turn.json +91 -0
- crow_cli-0.1.37/sandbox/repl-agent/compact_fixtures/case_08_reasoning_ending.json +91 -0
- crow_cli-0.1.37/sandbox/repl-agent/compact_fixtures/case_09_content_ending.json +91 -0
- crow_cli-0.1.37/sandbox/repl-agent/compact_fixtures/chubby_full_conversation.jsonl +9 -0
- crow_cli-0.1.37/sandbox/repl-agent/docs/AGENT_CLIENT_PLAN.md +341 -0
- crow_cli-0.1.37/sandbox/repl-agent/docs/COMPACT_AND_SCHEMA_REWRITE.md +158 -0
- crow_cli-0.1.37/sandbox/repl-agent/docs/STRATEGIC_PIVOT.md +254 -0
- crow_cli-0.1.37/sandbox/repl-agent/generate_compact_fixtures.py +149 -0
- crow_cli-0.1.37/sandbox/repl-agent/iterative_refinement.py +295 -0
- crow_cli-0.1.37/sandbox/repl-agent/iterative_refinement_agent.py +768 -0
- crow_cli-0.1.37/sandbox/repl-agent/iterative_refinement_mcp.py +54 -0
- crow_cli-0.1.37/sandbox/repl-agent/main.py +46 -0
- crow_cli-0.1.37/sandbox/repl-agent/multi_compact.py +37 -0
- crow_cli-0.1.37/sandbox/repl-agent/orchestrator.py +275 -0
- crow_cli-0.1.37/sandbox/repl-agent/pyproject.toml +18 -0
- crow_cli-0.1.37/sandbox/repl-agent/run_iterative_refinement_agent.py +87 -0
- crow_cli-0.1.37/sandbox/repl-agent/run_repl_clients.py +73 -0
- crow_cli-0.1.37/sandbox/repl-agent/scratch_db.py +41 -0
- crow_cli-0.1.37/sandbox/repl-agent/task_description.yaml +7 -0
- crow_cli-0.1.37/sandbox/repl-agent/test_compact_fixtures.py +156 -0
- crow_cli-0.1.37/sandbox/repl-agent/test_compact_one.py +112 -0
- crow_cli-0.1.37/sandbox/repl-agent/test_compact_real.py +348 -0
- crow_cli-0.1.37/sandbox/repl-agent/test_compact_run.py +146 -0
- crow_cli-0.1.37/sandbox/repl-agent/test_drift_instrumentation.py +131 -0
- crow_cli-0.1.37/sandbox/repl-agent/test_hook.py +40 -0
- crow_cli-0.1.37/sandbox/repl-agent/test_iterative_refinement.py +256 -0
- crow_cli-0.1.37/sandbox/repl-agent/test_multi_compact_client.py +175 -0
- crow_cli-0.1.37/sandbox/repl-agent/test_refinement_agent.py +242 -0
- crow_cli-0.1.37/sandbox/repl-agent/test_repl_client.py +124 -0
- crow_cli-0.1.37/sandbox/repl-agent/uv.lock +1568 -0
- crow_cli-0.1.37/sandbox/yaml-configs/.python-version +1 -0
- crow_cli-0.1.37/sandbox/yaml-configs/README.md +0 -0
- crow_cli-0.1.37/sandbox/yaml-configs/main.py +6 -0
- crow_cli-0.1.37/sandbox/yaml-configs/pyproject.toml +7 -0
- crow_cli-0.1.37/scripts/consolidate_history.py +262 -0
- crow_cli-0.1.37/scripts/e2e_memory_live.py +216 -0
- crow_cli-0.1.37/scripts/mcp_ram_repro.py +149 -0
- crow_cli-0.1.37/scripts/merge_live_into_migrated.py +95 -0
- crow_cli-0.1.37/scripts/migrate_taskmaster.py +224 -0
- crow_cli-0.1.37/scripts/migrate_v5.py +191 -0
- crow_cli-0.1.37/src/crow_cli/__init__.py +22 -0
- crow_cli-0.1.37/src/crow_cli/agent/__init__.py +16 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/agent/compact.py +5 -3
- {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/agent/llm.py +1 -1
- {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/agent/main.py +340 -118
- {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/agent/mcp_client.py +62 -38
- {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/agent/memory.py +39 -12
- {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/agent/model_routing.py +1 -1
- {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/agent/prompt.py +1 -1
- {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/agent/react.py +161 -10
- {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/agent/session.py +127 -32
- {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/agent/tools.py +85 -4
- crow_cli-0.1.37/src/crow_cli/cli/__init__.py +0 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/cli/init_cmd.py +6 -5
- {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/cli/main.py +381 -63
- crow_cli-0.1.37/src/crow_cli/client/__init__.py +0 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/client/main.py +21 -39
- crow_cli-0.1.37/src/crow_cli/client/subagent.py +184 -0
- crow_cli-0.1.37/src/crow_cli/config/__init__.py +55 -0
- crow_cli-0.1.34/src/crow_cli/agent/configure.py → crow_cli-0.1.37/src/crow_cli/config/config.py +138 -19
- {crow_cli-0.1.34/src/crow_cli/agent → crow_cli-0.1.37/src/crow_cli/config}/default/__init__.py +2 -2
- {crow_cli-0.1.34/src/crow_cli/agent → crow_cli-0.1.37/src/crow_cli/config}/default/defaults.py +29 -10
- crow_cli-0.1.37/src/crow_cli/mcp/__init__.py +35 -0
- crow_cli-0.1.37/src/crow_cli/mcp/editor/README.md +0 -0
- crow_cli-0.1.37/src/crow_cli/mcp/editor/__init__.py +0 -0
- crow_cli-0.1.37/src/crow_cli/mcp/editor/main.py +462 -0
- crow_cli-0.1.37/src/crow_cli/mcp/memory/__init__.py +0 -0
- crow_cli-0.1.37/src/crow_cli/mcp/memory/client.py +60 -0
- crow_cli-0.1.37/src/crow_cli/mcp/memory/main.py +508 -0
- crow_cli-0.1.37/src/crow_cli/mcp/memory/store.py +220 -0
- crow_cli-0.1.37/src/crow_cli/mcp/read/README.md +0 -0
- crow_cli-0.1.37/src/crow_cli/mcp/read/__init__.py +0 -0
- crow_cli-0.1.37/src/crow_cli/mcp/read/main.py +128 -0
- crow_cli-0.1.37/src/crow_cli/mcp/server/README.md +0 -0
- crow_cli-0.1.37/src/crow_cli/mcp/server/__init__.py +3 -0
- crow_cli-0.1.37/src/crow_cli/mcp/server/app.py +34 -0
- crow_cli-0.1.37/src/crow_cli/mcp/server/logger.py +56 -0
- crow_cli-0.1.37/src/crow_cli/mcp/server/main.py +79 -0
- crow_cli-0.1.37/src/crow_cli/mcp/task/__init__.py +0 -0
- crow_cli-0.1.37/src/crow_cli/mcp/task/main.py +329 -0
- crow_cli-0.1.37/src/crow_cli/mcp/terminal/README.md +0 -0
- crow_cli-0.1.37/src/crow_cli/mcp/terminal/__init__.py +3 -0
- crow_cli-0.1.37/src/crow_cli/mcp/terminal/backend.py +260 -0
- crow_cli-0.1.37/src/crow_cli/mcp/terminal/constants.py +37 -0
- crow_cli-0.1.37/src/crow_cli/mcp/terminal/logging_config.py +61 -0
- crow_cli-0.1.37/src/crow_cli/mcp/terminal/main.py +135 -0
- crow_cli-0.1.37/src/crow_cli/mcp/terminal/metadata.py +94 -0
- crow_cli-0.1.37/src/crow_cli/mcp/terminal/session.py +276 -0
- crow_cli-0.1.37/src/crow_cli/mcp/vision/__init__.py +0 -0
- crow_cli-0.1.37/src/crow_cli/mcp/vision/client.py +24 -0
- crow_cli-0.1.37/src/crow_cli/mcp/vision/main.py +105 -0
- crow_cli-0.1.37/src/crow_cli/mcp/web_fetch/README.md +0 -0
- crow_cli-0.1.37/src/crow_cli/mcp/web_fetch/__init__.py +3 -0
- crow_cli-0.1.37/src/crow_cli/mcp/web_fetch/main.py +102 -0
- crow_cli-0.1.37/src/crow_cli/mcp/web_search/README.md +23 -0
- crow_cli-0.1.37/src/crow_cli/mcp/web_search/__init__.py +3 -0
- crow_cli-0.1.37/src/crow_cli/mcp/web_search/main.py +101 -0
- crow_cli-0.1.37/src/crow_cli/mcp/write/README.md +0 -0
- crow_cli-0.1.37/src/crow_cli/mcp/write/__init__.py +0 -0
- crow_cli-0.1.37/src/crow_cli/mcp/write/main.py +41 -0
- crow_cli-0.1.37/src/crow_cli/memory/__init__.py +115 -0
- crow_cli-0.1.37/src/crow_cli/memory/db.py +77 -0
- crow_cli-0.1.37/src/crow_cli/memory/ids.py +37 -0
- crow_cli-0.1.37/src/crow_cli/memory/messages.py +100 -0
- crow_cli-0.1.37/src/crow_cli/memory/models.py +115 -0
- crow_cli-0.1.37/src/crow_cli/memory/reads.py +306 -0
- crow_cli-0.1.37/src/crow_cli/memory/writes.py +223 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/conftest.py +113 -54
- {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/e2e/test_react_live.py +3 -3
- {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/e2e/test_session_update_transmission.py +18 -7
- crow_cli-0.1.37/tests/e2e/test_task_high_priority_preemption.py +264 -0
- crow_cli-0.1.37/tests/e2e/test_task_mcp_launch.py +351 -0
- crow_cli-0.1.37/tests/e2e/test_task_race_regression.py +284 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/integration/test_acp_http.py +1 -1
- {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/integration/test_agent_init.py +1 -1
- {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/integration/test_react_loop_cancel_integrity.py +3 -2
- crow_cli-0.1.37/tests/integration/test_react_loop_delegation_hold.py +211 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/integration/test_react_loop_tool_round.py +288 -1
- {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/integration/test_reasoning_effort_react_loop.py +1 -1
- crow_cli-0.1.37/tests/mcp/integration/test_server_stdio.py +88 -0
- crow_cli-0.1.37/tests/mcp/test_edit.py +401 -0
- crow_cli-0.1.37/tests/mcp/test_memory.py +167 -0
- crow_cli-0.1.37/tests/mcp/test_memory_store.py +160 -0
- crow_cli-0.1.37/tests/mcp/test_read.py +97 -0
- crow_cli-0.1.37/tests/mcp/test_server.py +53 -0
- crow_cli-0.1.37/tests/mcp/test_task_tool.py +108 -0
- crow_cli-0.1.37/tests/mcp/test_terminal.py +36 -0
- crow_cli-0.1.37/tests/mcp/test_vision.py +43 -0
- crow_cli-0.1.37/tests/mcp/test_web_fetch.py +62 -0
- crow_cli-0.1.37/tests/mcp/test_web_search.py +51 -0
- crow_cli-0.1.37/tests/mcp/test_write.py +35 -0
- crow_cli-0.1.37/tests/memory/test_migrate_taskmaster.py +231 -0
- crow_cli-0.1.37/tests/memory/test_migrate_v5.py +159 -0
- crow_cli-0.1.37/tests/memory/test_session_mcp_servers.py +154 -0
- crow_cli-0.1.37/tests/memory/test_store.py +266 -0
- crow_cli-0.1.37/tests/memory/test_task_state.py +255 -0
- crow_cli-0.1.37/tests/unit/test_cli_fork_flags.py +38 -0
- crow_cli-0.1.37/tests/unit/test_cli_telemetry.py +135 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/unit/test_compact.py +7 -2
- {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/unit/test_configure.py +1 -1
- crow_cli-0.1.37/tests/unit/test_fork.py +218 -0
- crow_cli-0.1.37/tests/unit/test_mcp_client.py +105 -0
- crow_cli-0.1.37/tests/unit/test_model_override.py +137 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/unit/test_model_routing.py +1 -1
- crow_cli-0.1.37/tests/unit/test_per_model_compact_threshold.py +106 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/unit/test_react.py +7 -5
- {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/unit/test_reasoning_effort.py +141 -1
- {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/unit/test_session.py +46 -1
- crow_cli-0.1.37/tests/unit/test_session_mcp_servers_wiring.py +191 -0
- crow_cli-0.1.37/tests/unit/test_subagent_parse_servers.py +55 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/unit/test_system_prompt_skills.py +1 -1
- crow_cli-0.1.37/tests/unit/test_task_tool_schema.py +203 -0
- crow_cli-0.1.37/tests/unit/test_version.py +19 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/uv.lock +358 -40
- crow_cli-0.1.34/.gitignore +0 -7
- crow_cli-0.1.34/run_tests.sh +0 -4
- crow_cli-0.1.34/src/crow_cli/__init__.py +0 -1
- crow_cli-0.1.34/src/crow_cli/agent/__init__.py +0 -4
- crow_cli-0.1.34/tests/unit/test_model_override.py +0 -39
- {crow_cli-0.1.34 → crow_cli-0.1.37}/.python-version +0 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/examples/mc_escher_loop.py +0 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/examples/quick_test.py +0 -0
- /crow_cli-0.1.34/src/crow_cli/cli/__init__.py → /crow_cli-0.1.37/sandbox/crow-acp-learning/README.md +0 -0
- /crow_cli-0.1.34/src/crow_cli/client/__init__.py → /crow_cli-0.1.37/sandbox/crow-test/README.md +0 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/agent/context.py +0 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/agent/hooks.py +0 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/agent/logger.py +0 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/agent/slash.py +0 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/agent_runner.py +0 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/cli/install.py +0 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/src/crow_cli/client/terminal.py +0 -0
- {crow_cli-0.1.34/src/crow_cli/agent → crow_cli-0.1.37/src/crow_cli/config}/default/searxng_settings.py +0 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/__init__.py +0 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/analyze_payload_cache_invalidation.py +0 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/analyze_payload_deep.py +0 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/integration/test_auth_validation.py +0 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/unit/test_client_terminal.py +0 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/unit/test_compact_last_messages_list_content.json +0 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/unit/test_compact_last_messages_list_content.py +0 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/unit/test_json_repair.py +0 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/unit/test_request_logging.py +0 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/unit/test_stream_processing.py +0 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/unit/test_usage_update.py +0 -0
- {crow_cli-0.1.34 → crow_cli-0.1.37}/tests/unit/test_uv_project_enforcement.py +0 -0
|
@@ -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,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.
|
|
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>=
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
113
|
-
|
|
114
|
-
### crow-cli — the agent
|
|
121
|
+
### The agent
|
|
115
122
|
|
|
116
|
-
|
|
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
|
|
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
|
-
###
|
|
135
|
+
### Built-in MCP tool server
|
|
129
136
|
|
|
130
|
-
The
|
|
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.**
|
|
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
|
|
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
|
|
179
|
+
uv sync
|
|
173
180
|
```
|
|
174
181
|
|
|
175
|
-
Run the
|
|
182
|
+
Run the test suite — every tier runs unconditionally (unit + integration + e2e live LLM):
|
|
176
183
|
|
|
177
184
|
```bash
|
|
178
|
-
uv run
|
|
185
|
+
uv run pytest tests
|
|
179
186
|
```
|
|
180
187
|
|
|
181
|
-
The persistence layer itself lives 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
|
|
185
|
-
uv run
|
|
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
|
-
|
|
192
|
-
|
|
193
|
-
|
|
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
|
crow_cli-0.1.37/PLAN.md
ADDED
|
@@ -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.
|