henchman-ai 0.1.12__tar.gz → 0.1.14__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.
- henchman_ai-0.1.14/.github/workflows/docs.yml +56 -0
- henchman_ai-0.1.14/BETA_TESTING_ISSUES3.md +35 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/CHANGELOG.md +20 -0
- henchman_ai-0.1.14/CONTRIBUTING.md +220 -0
- henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/134508855764000/b0c5ce5844ad8acc/.rag.lock +0 -0
- henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/134604944477792/b0c5ce5844ad8acc/.rag.lock +0 -0
- henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/134604945877536/b0c5ce5844ad8acc/.rag.lock +0 -0
- henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/134604946059776/b0c5ce5844ad8acc/.rag.lock +0 -0
- henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/134605456585744/b0c5ce5844ad8acc/.rag.lock +0 -0
- henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/134618534097648/b0c5ce5844ad8acc/.rag.lock +0 -0
- henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/134618535070656/b0c5ce5844ad8acc/.rag.lock +0 -0
- henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/134619942883056/b0c5ce5844ad8acc/.rag.lock +0 -0
- henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/134620110571280/b0c5ce5844ad8acc/.rag.lock +0 -0
- henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/138555538485184/b0c5ce5844ad8acc/.rag.lock +0 -0
- henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/138555538874752/b0c5ce5844ad8acc/.rag.lock +0 -0
- henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/138555539451408/b0c5ce5844ad8acc/.rag.lock +0 -0
- henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/138556062045760/b0c5ce5844ad8acc/.rag.lock +0 -0
- henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/139088593563008/b0c5ce5844ad8acc/.rag.lock +0 -0
- henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/139088594086144/b0c5ce5844ad8acc/.rag.lock +0 -0
- henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/139088594201216/b0c5ce5844ad8acc/.rag.lock +0 -0
- henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/139088659820192/b0c5ce5844ad8acc/.rag.lock +0 -0
- henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/139391159286624/b0c5ce5844ad8acc/.rag.lock +0 -0
- henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/139391160298352/b0c5ce5844ad8acc/.rag.lock +0 -0
- henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/139391160361968/b0c5ce5844ad8acc/.rag.lock +0 -0
- henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/139391778658240/b0c5ce5844ad8acc/.rag.lock +0 -0
- henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/140323476876816/b0c5ce5844ad8acc/.rag.lock +0 -0
- henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/140323493157376/b0c5ce5844ad8acc/.rag.lock +0 -0
- henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/140323629475472/b0c5ce5844ad8acc/.rag.lock +0 -0
- henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/140324020609984/b0c5ce5844ad8acc/.rag.lock +0 -0
- henchman_ai-0.1.14/PKG-INFO +317 -0
- henchman_ai-0.1.14/README.md +260 -0
- henchman_ai-0.1.14/README_enhanced.md +260 -0
- henchman_ai-0.1.14/RELEASE_CHECKLIST.md +106 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/pyproject.toml +12 -2
- henchman_ai-0.1.14/scripts/build_docs.py +151 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/cli/input.py +2 -2
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/cli/repl.py +44 -8
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/core/session.py +18 -4
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/tools/builtins/__init__.py +2 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/tools/builtins/shell.py +4 -0
- henchman_ai-0.1.14/src/henchman/tools/builtins/web_search.py +129 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/version.py +1 -1
- henchman_ai-0.1.14/tests/MagicMock/mock.rag.cache_dir/125572362825280/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/link_lists.bin +0 -0
- henchman_ai-0.1.14/tests/MagicMock/mock.rag.cache_dir/125572765096208/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/link_lists.bin +0 -0
- henchman_ai-0.1.14/tests/MagicMock/mock.rag.cache_dir/125572822401392/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/link_lists.bin +0 -0
- henchman_ai-0.1.14/tests/MagicMock/mock.rag.cache_dir/125572896176320/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/link_lists.bin +0 -0
- henchman_ai-0.1.14/tests/MagicMock/mock.rag.cache_dir/135520285986352/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/link_lists.bin +0 -0
- henchman_ai-0.1.14/tests/MagicMock/mock.rag.cache_dir/135520286228656/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/link_lists.bin +0 -0
- henchman_ai-0.1.14/tests/MagicMock/mock.rag.cache_dir/135520287933552/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/link_lists.bin +0 -0
- henchman_ai-0.1.14/tests/MagicMock/mock.rag.cache_dir/135520588106160/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/link_lists.bin +0 -0
- henchman_ai-0.1.14/tests/__init__.py +0 -0
- henchman_ai-0.1.14/tests/cli/__init__.py +0 -0
- henchman_ai-0.1.14/tests/cli/commands/test_session_resume_id.py +53 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/cli/test_app_extended.py +1 -1
- henchman_ai-0.1.14/tests/cli/test_interrupt.py +84 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/cli/test_keyboard_fixes.py +1 -1
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/cli/test_keyboard_interrupt.py +2 -2
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/cli/test_loop_protection.py +4 -3
- henchman_ai-0.1.14/tests/config/__init__.py +0 -0
- henchman_ai-0.1.14/tests/core/__init__.py +0 -0
- henchman_ai-0.1.14/tests/e2e/test_plan_mode_workflow.py +59 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/e2e/test_tool_fix.py +4 -0
- henchman_ai-0.1.14/tests/mcp/__init__.py +0 -0
- henchman_ai-0.1.14/tests/providers/__init__.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/rag/test_rag_command.py +5 -5
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/smoke/test_escape_key_behavior.py +30 -25
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/test_version.py +2 -2
- henchman_ai-0.1.14/tests/tools/__init__.py +0 -0
- henchman_ai-0.1.14/tests/tools/test_shell_advanced.py +38 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/ui_integration/test_tool_calls.py +9 -0
- henchman_ai-0.1.12/PKG-INFO +0 -144
- henchman_ai-0.1.12/README.md +0 -97
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/.github/copilot-instructions.md +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/.github/workflows/ci.yml +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/.github/workflows/publish.yml +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/.gitignore +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/ALPHA_TEST_LOG.md +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/BETA_TESTING_ISSUES.md +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/BETA_TESTING_ISSUES2.md +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/LICENSE +0 -0
- {henchman_ai-0.1.12/MagicMock/mock.rag.cache_dir/131782863223120 → henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/125050554038512}/b0c5ce5844ad8acc/.rag.lock +0 -0
- {henchman_ai-0.1.12/MagicMock/mock.rag.cache_dir/131782952758032 → henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/125050555035824}/b0c5ce5844ad8acc/.rag.lock +0 -0
- {henchman_ai-0.1.12/MagicMock/mock.rag.cache_dir/131782953186608 → henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/125050555125200}/b0c5ce5844ad8acc/.rag.lock +0 -0
- {henchman_ai-0.1.12/MagicMock/mock.rag.cache_dir/131783467925184 → henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/125051893219152}/b0c5ce5844ad8acc/.rag.lock +0 -0
- {henchman_ai-0.1.12/MagicMock/mock.rag.cache_dir/131953655609296 → henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/125080879298512}/b0c5ce5844ad8acc/.rag.lock +0 -0
- {henchman_ai-0.1.12/MagicMock/mock.rag.cache_dir/131953656855104 → henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/125080879878832}/b0c5ce5844ad8acc/.rag.lock +0 -0
- {henchman_ai-0.1.12/MagicMock/mock.rag.cache_dir/131954146008512 → henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/125080880913088}/b0c5ce5844ad8acc/.rag.lock +0 -0
- {henchman_ai-0.1.12/MagicMock/mock.rag.cache_dir/131954155550192 → henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/125081401798976}/b0c5ce5844ad8acc/.rag.lock +0 -0
- {henchman_ai-0.1.12/MagicMock/mock.rag.cache_dir/134508512171968 → henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/125246043105824}/b0c5ce5844ad8acc/.rag.lock +0 -0
- {henchman_ai-0.1.12/MagicMock/mock.rag.cache_dir/134508512231200 → henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/125246043924496}/b0c5ce5844ad8acc/.rag.lock +0 -0
- {henchman_ai-0.1.12/MagicMock/mock.rag.cache_dir/134508512485616 → henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/125246044001472}/b0c5ce5844ad8acc/.rag.lock +0 -0
- {henchman_ai-0.1.12/MagicMock/mock.rag.cache_dir/134508855764000 → henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/125247627445840}/b0c5ce5844ad8acc/.rag.lock +0 -0
- {henchman_ai-0.1.12/MagicMock/mock.rag.cache_dir/139391159286624 → henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/131782863223120}/b0c5ce5844ad8acc/.rag.lock +0 -0
- {henchman_ai-0.1.12/MagicMock/mock.rag.cache_dir/139391160298352 → henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/131782952758032}/b0c5ce5844ad8acc/.rag.lock +0 -0
- {henchman_ai-0.1.12/MagicMock/mock.rag.cache_dir/139391160361968 → henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/131782953186608}/b0c5ce5844ad8acc/.rag.lock +0 -0
- {henchman_ai-0.1.12/MagicMock/mock.rag.cache_dir/139391778658240 → henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/131783467925184}/b0c5ce5844ad8acc/.rag.lock +0 -0
- /henchman_ai-0.1.12/tests/MagicMock/mock.rag.cache_dir/125572362825280/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/link_lists.bin → /henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/131953655609296/b0c5ce5844ad8acc/.rag.lock +0 -0
- /henchman_ai-0.1.12/tests/MagicMock/mock.rag.cache_dir/125572765096208/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/link_lists.bin → /henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/131953656855104/b0c5ce5844ad8acc/.rag.lock +0 -0
- /henchman_ai-0.1.12/tests/MagicMock/mock.rag.cache_dir/125572822401392/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/link_lists.bin → /henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/131954146008512/b0c5ce5844ad8acc/.rag.lock +0 -0
- /henchman_ai-0.1.12/tests/MagicMock/mock.rag.cache_dir/125572896176320/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/link_lists.bin → /henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/131954155550192/b0c5ce5844ad8acc/.rag.lock +0 -0
- /henchman_ai-0.1.12/tests/MagicMock/mock.rag.cache_dir/135520285986352/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/link_lists.bin → /henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/133226809006208/b0c5ce5844ad8acc/.rag.lock +0 -0
- /henchman_ai-0.1.12/tests/MagicMock/mock.rag.cache_dir/135520286228656/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/link_lists.bin → /henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/133226810375248/b0c5ce5844ad8acc/.rag.lock +0 -0
- /henchman_ai-0.1.12/tests/MagicMock/mock.rag.cache_dir/135520287933552/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/link_lists.bin → /henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/133226812410672/b0c5ce5844ad8acc/.rag.lock +0 -0
- /henchman_ai-0.1.12/tests/MagicMock/mock.rag.cache_dir/135520588106160/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/link_lists.bin → /henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/133227143444000/b0c5ce5844ad8acc/.rag.lock +0 -0
- /henchman_ai-0.1.12/tests/__init__.py → /henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/133999527639808/b0c5ce5844ad8acc/.rag.lock +0 -0
- /henchman_ai-0.1.12/tests/cli/__init__.py → /henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/133999929687216/b0c5ce5844ad8acc/.rag.lock +0 -0
- /henchman_ai-0.1.12/tests/config/__init__.py → /henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/133999955332368/b0c5ce5844ad8acc/.rag.lock +0 -0
- /henchman_ai-0.1.12/tests/core/__init__.py → /henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/134000027622176/b0c5ce5844ad8acc/.rag.lock +0 -0
- /henchman_ai-0.1.12/tests/mcp/__init__.py → /henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/134508512171968/b0c5ce5844ad8acc/.rag.lock +0 -0
- /henchman_ai-0.1.12/tests/providers/__init__.py → /henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/134508512231200/b0c5ce5844ad8acc/.rag.lock +0 -0
- /henchman_ai-0.1.12/tests/tools/__init__.py → /henchman_ai-0.1.14/MagicMock/mock.rag.cache_dir/134508512485616/b0c5ce5844ad8acc/.rag.lock +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/PROJECT_PLAN.md +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/TASK_COMPLETION_SUMMARY.md +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/debug_compaction.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/docs/api.md +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/docs/configuration.md +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/docs/extensions.md +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/docs/getting-started.md +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/docs/index.md +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/docs/mcp.md +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/docs/providers.md +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/docs/tools.md +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/evals/README.md +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/evals/__init__.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/evals/conftest.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/evals/helpers.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/evals/test_answer_vs_action.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/evals/test_coding_tasks.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/evals/test_edit_precision.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/evals/test_skills_memory.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/evals/test_tool_selection.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/fix_repl.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/fix_repl_simple.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/mkdocs.yml +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/replace_method.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/reproduce_400_error.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/run_interactive_tests.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/scripts/ci.sh +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/scripts/run_evals.sh +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/__init__.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/__main__.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/cli/__init__.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/cli/app.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/cli/commands/__init__.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/cli/commands/builtins.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/cli/commands/chat.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/cli/commands/extensions.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/cli/commands/mcp.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/cli/commands/plan.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/cli/commands/rag.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/cli/commands/skill.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/cli/commands/unlimited.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/cli/console.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/cli/json_output.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/cli/prompts.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/cli/repl.py.backup +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/cli/repl.py.backup2 +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/config/__init__.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/config/context.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/config/schema.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/config/settings.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/core/__init__.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/core/agent.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/core/agent.py.backup +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/core/events.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/core/turn.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/extensions/__init__.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/extensions/base.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/extensions/manager.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/mcp/__init__.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/mcp/client.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/mcp/config.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/mcp/manager.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/mcp/tool.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/providers/__init__.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/providers/anthropic.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/providers/base.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/providers/deepseek.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/providers/ollama.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/providers/openai_compat.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/providers/openai_compat.py.backup +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/providers/registry.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/rag/__init__.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/rag/chunker.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/rag/concurrency.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/rag/embedder.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/rag/indexer.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/rag/repo_id.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/rag/store.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/rag/system.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/skills/__init__.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/skills/executor.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/skills/learner.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/skills/models.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/skills/store.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/tools/__init__.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/tools/base.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/tools/builtins/ask_user.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/tools/builtins/file_edit.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/tools/builtins/file_read.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/tools/builtins/file_write.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/tools/builtins/glob_tool.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/tools/builtins/grep.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/tools/builtins/ls.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/tools/builtins/rag_search.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/tools/builtins/web_fetch.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/tools/registry.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/utils/__init__.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/utils/compaction.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/utils/retry.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/utils/tokens.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/src/henchman/utils/validation.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/test_compaction.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/test_compaction_fix.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/test_fixes.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/test_output.txt +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/test_run.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/125572362825280/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/data_level0.bin +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/125572362825280/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/header.bin +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/125572362825280/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/length.bin +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/125572362825280/b0c5ce5844ad8acc/chroma/chroma.sqlite3 +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/125572362825280/b0c5ce5844ad8acc/manifest.json +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/125572765096208/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/data_level0.bin +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/125572765096208/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/header.bin +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/125572765096208/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/length.bin +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/125572765096208/b0c5ce5844ad8acc/chroma/chroma.sqlite3 +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/125572765096208/b0c5ce5844ad8acc/manifest.json +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/125572822401392/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/data_level0.bin +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/125572822401392/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/header.bin +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/125572822401392/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/length.bin +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/125572822401392/b0c5ce5844ad8acc/chroma/chroma.sqlite3 +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/125572822401392/b0c5ce5844ad8acc/manifest.json +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/125572896176320/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/data_level0.bin +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/125572896176320/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/header.bin +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/125572896176320/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/length.bin +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/125572896176320/b0c5ce5844ad8acc/chroma/chroma.sqlite3 +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/125572896176320/b0c5ce5844ad8acc/manifest.json +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/135520285986352/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/data_level0.bin +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/135520285986352/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/header.bin +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/135520285986352/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/length.bin +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/135520285986352/b0c5ce5844ad8acc/chroma/chroma.sqlite3 +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/135520285986352/b0c5ce5844ad8acc/manifest.json +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/135520286228656/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/data_level0.bin +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/135520286228656/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/header.bin +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/135520286228656/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/length.bin +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/135520286228656/b0c5ce5844ad8acc/chroma/chroma.sqlite3 +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/135520286228656/b0c5ce5844ad8acc/manifest.json +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/135520287933552/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/data_level0.bin +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/135520287933552/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/header.bin +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/135520287933552/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/length.bin +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/135520287933552/b0c5ce5844ad8acc/chroma/chroma.sqlite3 +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/135520287933552/b0c5ce5844ad8acc/manifest.json +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/135520588106160/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/data_level0.bin +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/135520588106160/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/header.bin +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/135520588106160/b0c5ce5844ad8acc/chroma/88b10860-7f3a-42c9-a3aa-20e09850b445/length.bin +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/135520588106160/b0c5ce5844ad8acc/chroma/chroma.sqlite3 +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/MagicMock/mock.rag.cache_dir/135520588106160/b0c5ce5844ad8acc/manifest.json +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/cli/commands/test_plan.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/cli/commands/test_skill.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/cli/commands/test_skill_extended.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/cli/commands/test_unlimited.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/cli/test_app.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/cli/test_builtins.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/cli/test_chat_command.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/cli/test_cli_smoke.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/cli/test_commands.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/cli/test_commands_repro.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/cli/test_console.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/cli/test_enhanced_tool_display.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/cli/test_input.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/cli/test_input_bindings.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/cli/test_json_output.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/cli/test_keyboard_integration.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/cli/test_keyboard_verification.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/cli/test_mcp_command.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/cli/test_repl.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/cli/test_repl_attribute_fix.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/cli/test_repl_startup_message.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/cli/test_repl_toolbar.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/config/test_context.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/config/test_schema.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/config/test_settings.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/conftest.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/core/test_automatic_compaction.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/core/test_events.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/core/test_session.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/core/test_session_manager.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/core/test_streaming_tool_calls.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/core/test_turn_state.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/e2e/test_context_safety.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/empty_message_validation/test_empty_messages.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/extensions/__init__.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/extensions/test_base.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/extensions/test_command.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/extensions/test_manager.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/integration/test_context_limits.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/integration/test_tool_integration.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/mcp/test_client.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/mcp/test_config.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/mcp/test_manager.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/mcp/test_tool.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/providers/test_413_error_handling.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/providers/test_anthropic.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/providers/test_base.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/providers/test_deepseek.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/providers/test_ollama.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/providers/test_openai_compat.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/providers/test_registry.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/rag/__init__.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/rag/test_chunker.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/rag/test_concurrency.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/rag/test_concurrency_smoke.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/rag/test_embedder.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/rag/test_indexer.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/rag/test_rag_concurrency_integration.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/rag/test_rag_search_tool.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/rag/test_repo_id.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/rag/test_store.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/rag/test_system.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/skills/test_executor.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/skills/test_learner.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/skills/test_markdown_skills.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/skills/test_models.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/skills/test_store.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/skills/test_store_extended.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/smoke/test_large_file_handling.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/test_coverage_suite.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/test_main.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/tools/test_ask_user_tool.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/tools/test_base.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/tools/test_directory_tools.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/tools/test_file_tools.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/tools/test_grep_tool.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/tools/test_plan_mode_enforcement.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/tools/test_registry.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/tools/test_shell_tool.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/tools/test_web_fetch_tool.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/ui_integration/INTERACTIVE_SESSION_TESTS.md +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/ui_integration/__init__.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/ui_integration/conftest.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/ui_integration/test_agent.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/ui_integration/test_compaction_llm.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/ui_integration/test_events.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/ui_integration/test_llm.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/ui_integration/test_mcp.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/ui_integration/test_plan_mode.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/ui_integration/test_repl_e2e.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/ui_integration/test_repl_integration.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/ui_integration/test_session.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/ui_integration/test_skills.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/ui_integration/test_slash_commands.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/ui_integration/test_tokens_llm.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/ui_integration/test_tool_integration.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/utils/test_compaction.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/utils/test_compaction_edge_cases.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/utils/test_compaction_validation.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/utils/test_multi_turn_tool_calls.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/utils/test_protected_zone.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/utils/test_retry.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/utils/test_summarization.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/utils/test_tiktoken_integration.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/utils/test_token_counter_extended.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/utils/test_tool_sequence_compaction.py +0 -0
- {henchman_ai-0.1.12 → henchman_ai-0.1.14}/tests/utils/test_validation.py +0 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
name: Deploy Documentation
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ main ]
|
|
6
|
+
paths: ['docs/**', 'mkdocs.yml', 'README.md']
|
|
7
|
+
pull_request:
|
|
8
|
+
branches: [ main ]
|
|
9
|
+
paths: ['docs/**', 'mkdocs.yml', 'README.md']
|
|
10
|
+
workflow_dispatch:
|
|
11
|
+
|
|
12
|
+
permissions:
|
|
13
|
+
contents: write
|
|
14
|
+
pages: write
|
|
15
|
+
id-token: write
|
|
16
|
+
|
|
17
|
+
concurrency:
|
|
18
|
+
group: "pages"
|
|
19
|
+
cancel-in-progress: false
|
|
20
|
+
|
|
21
|
+
jobs:
|
|
22
|
+
build:
|
|
23
|
+
runs-on: ubuntu-latest
|
|
24
|
+
steps:
|
|
25
|
+
- name: Checkout
|
|
26
|
+
uses: actions/checkout@v4
|
|
27
|
+
|
|
28
|
+
- name: Setup Python
|
|
29
|
+
uses: actions/setup-python@v5
|
|
30
|
+
with:
|
|
31
|
+
python-version: '3.11'
|
|
32
|
+
|
|
33
|
+
- name: Install dependencies
|
|
34
|
+
run: |
|
|
35
|
+
python -m pip install --upgrade pip
|
|
36
|
+
pip install mkdocs mkdocs-material mkdocstrings[python] mkdocs-autorefs
|
|
37
|
+
|
|
38
|
+
- name: Build documentation
|
|
39
|
+
run: mkdocs build
|
|
40
|
+
|
|
41
|
+
- name: Upload artifact
|
|
42
|
+
uses: actions/upload-pages-artifact@v3
|
|
43
|
+
with:
|
|
44
|
+
path: ./site
|
|
45
|
+
|
|
46
|
+
deploy:
|
|
47
|
+
environment:
|
|
48
|
+
name: github-pages
|
|
49
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
50
|
+
runs-on: ubuntu-latest
|
|
51
|
+
needs: build
|
|
52
|
+
if: github.ref == 'refs/heads/main'
|
|
53
|
+
steps:
|
|
54
|
+
- name: Deploy to GitHub Pages
|
|
55
|
+
id: deployment
|
|
56
|
+
uses: actions/deploy-pages@v4
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
1. **Esc should immediately halt processing and return to the prompt.**
|
|
2
|
+
* **Fix:** `Repl.run()` was updated to distinguish between `KeyboardInterrupt` (Ctrl+C, which exits the REPL) and `KeyMonitor.stop_requested` (Esc key, which interrupts the current agent operation and returns to the prompt). Related tests were refactored to simulate Esc using `monitor.stop_requested = True` in `_run_agent`.
|
|
3
|
+
|
|
4
|
+
2. **Web Search Tool Integration.**
|
|
5
|
+
* **Fix:** Integrated `DuckDuckGoSearchTool` using `aiohttp` and `beautifulsoup4` to provide web search functionality. `pyproject.toml` was updated with the new dependency.
|
|
6
|
+
|
|
7
|
+
3. **UI Issues - Input prompt writes over output.**
|
|
8
|
+
* **Fix:** Added `self.console.print()` before `prompt_async` in `_get_input` within `src/henchman/cli/repl.py` to ensure the prompt always appears on a new line.
|
|
9
|
+
|
|
10
|
+
4. **UI Issues - Bottom bar disappears.**
|
|
11
|
+
* **Fix:** Implemented `_get_rich_status_message` and integrated it with `rich.status.Status` in `_run_agent` and `_process_agent_stream` to maintain a persistent status bar during agent processing.
|
|
12
|
+
|
|
13
|
+
5. **Loading sessions does not work correctly.**
|
|
14
|
+
* **Fix:** Modified the `load` method in `src/henchman/core/session.py` to support loading sessions by ID prefix in addition to exact UUIDs, enabling resumption with truncated IDs displayed in `/chat list`.
|
|
15
|
+
|
|
16
|
+
6. **Functional testing of the `/plan` tool.**
|
|
17
|
+
* **Fix:** An E2E test (`tests/e2e/test_plan_mode_workflow.py`) was added to verify `/plan` command behavior, ensuring writes are blocked/allowed correctly based on plan mode status. The `test_cli_plan_flag` assertion was updated to reflect the new `_run_interactive` signature.
|
|
18
|
+
|
|
19
|
+
7. **Tool execution - Shell commands hanging indefinitely.**
|
|
20
|
+
* **Fix:** Added `asyncio.CancelledError` handling to `ShellTool.execute` to ensure subprocesses are killed if the shell tool execution is interrupted. Tests were added (`tests/tools/test_shell_advanced.py`) to verify shell tool handling of pipes, redirection, and timeouts.
|
|
21
|
+
|
|
22
|
+
8. **`AttributeError: 'Repl' object has no attribute '_get_rich_status'` failures.**
|
|
23
|
+
* **Fix:** This was primarily a Python import caching issue after refactoring `_get_rich_status` to `_get_rich_status_message`. Clearing `__pycache__` directories resolved the widespread `AttributeError`s.
|
|
24
|
+
|
|
25
|
+
9. **`OSError: pytest: reading from stdin while output is captured!` in tool execution tests.**
|
|
26
|
+
* **Fix:** Modified relevant test setups in `tests/e2e/test_tool_fix.py` and `tests/ui_integration/test_tool_calls.py` to set `repl.config.auto_approve_tools = True`, preventing interactive confirmation prompts during automated testing.
|
|
27
|
+
|
|
28
|
+
10. **`test_version.py::test_version_tuple` version mismatch.**
|
|
29
|
+
* **Fix:** Updated the expected version tuple in `tests/test_version.py` from `(0, 1, 11)` to `(0, 1, 13)` to align with the current project version.
|
|
30
|
+
|
|
31
|
+
11. **`test_rag_command.py::TestRagCommand::test_reindex_with_rag_system` failure.**
|
|
32
|
+
* **Fix:** Corrected the mocking logic in the test to ensure `mock_repl.rag_system.index` was properly configured and its `is_indexing` attribute was set to `False`, allowing the `index` method to be called and asserted.
|
|
33
|
+
|
|
34
|
+
12. **`test_loop_protection.py::TestSpinningDetection::test_consecutive_duplicate_detection` failure.**
|
|
35
|
+
* **Fix:** Modified the test case to use a non-read-only tool (`write_file`) and increased the number of calls to correctly trigger the consecutive duplicate detection logic within `TurnState.is_spinning()`.
|
|
@@ -7,6 +7,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.1.14] - 2025-02-12
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- **Enhanced PyPI Documentation**
|
|
14
|
+
- Improved README.md with badges, better structure, and detailed examples
|
|
15
|
+
- Added comprehensive CONTRIBUTING.md guide for contributors
|
|
16
|
+
- Updated project metadata with better classifiers and documentation URLs
|
|
17
|
+
- Added local documentation build script for offline viewing
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
- **Project Metadata**
|
|
21
|
+
- Updated pyproject.toml with additional Python version classifiers
|
|
22
|
+
- Added more specific topic classifiers (AI, Scientific/Engineering)
|
|
23
|
+
- Enhanced project URLs with better documentation links
|
|
24
|
+
|
|
25
|
+
### Fixed
|
|
26
|
+
- **Documentation**
|
|
27
|
+
- Fixed documentation URLs to point to GitHub docs directory
|
|
28
|
+
- Improved installation and usage instructions in README
|
|
29
|
+
|
|
10
30
|
## [0.1.11] - 2026-01-30
|
|
11
31
|
|
|
12
32
|
### Fixed
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
# Contributing to Henchman-AI
|
|
2
|
+
|
|
3
|
+
Thank you for your interest in contributing to Henchman-AI! This document provides guidelines and instructions for contributing.
|
|
4
|
+
|
|
5
|
+
## 🎯 How to Contribute
|
|
6
|
+
|
|
7
|
+
### 1. Reporting Bugs
|
|
8
|
+
- Check if the bug has already been reported in [Issues](https://github.com/MGPowerlytics/henchman-ai/issues)
|
|
9
|
+
- Use the bug report template
|
|
10
|
+
- Include steps to reproduce, expected vs actual behavior, and environment details
|
|
11
|
+
|
|
12
|
+
### 2. Suggesting Features
|
|
13
|
+
- Check if the feature has already been suggested
|
|
14
|
+
- Explain the use case and benefits
|
|
15
|
+
- Consider if it aligns with the project's goals
|
|
16
|
+
|
|
17
|
+
### 3. Contributing Code
|
|
18
|
+
- Fork the repository
|
|
19
|
+
- Create a feature branch (`git checkout -b feature/amazing-feature`)
|
|
20
|
+
- Make your changes
|
|
21
|
+
- Add or update tests
|
|
22
|
+
- Ensure code passes linting and type checking
|
|
23
|
+
- Submit a pull request
|
|
24
|
+
|
|
25
|
+
## 🏗️ Development Setup
|
|
26
|
+
|
|
27
|
+
### Prerequisites
|
|
28
|
+
- Python 3.10 or higher
|
|
29
|
+
- Git
|
|
30
|
+
- (Optional) uv for faster dependency management
|
|
31
|
+
|
|
32
|
+
### Installation
|
|
33
|
+
```bash
|
|
34
|
+
# Clone your fork
|
|
35
|
+
git clone https://github.com/your-username/henchman-ai.git
|
|
36
|
+
cd henchman-ai
|
|
37
|
+
|
|
38
|
+
# Create virtual environment
|
|
39
|
+
python -m venv venv
|
|
40
|
+
source venv/bin/activate # On Windows: venv\Scripts\activate
|
|
41
|
+
|
|
42
|
+
# Install with development dependencies
|
|
43
|
+
pip install -e ".[dev]"
|
|
44
|
+
|
|
45
|
+
# Install pre-commit hooks (optional but recommended)
|
|
46
|
+
pre-commit install
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Running Tests
|
|
50
|
+
```bash
|
|
51
|
+
# Run all tests
|
|
52
|
+
pytest
|
|
53
|
+
|
|
54
|
+
# Run with coverage
|
|
55
|
+
pytest --cov=henchman --cov-report=term-missing
|
|
56
|
+
|
|
57
|
+
# Run specific test files
|
|
58
|
+
pytest tests/test_cli.py -v
|
|
59
|
+
|
|
60
|
+
# Run integration tests
|
|
61
|
+
pytest -m integration
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Code Quality
|
|
65
|
+
```bash
|
|
66
|
+
# Format code
|
|
67
|
+
ruff format src/ tests/
|
|
68
|
+
|
|
69
|
+
# Check linting
|
|
70
|
+
ruff check src/ tests/
|
|
71
|
+
|
|
72
|
+
# Type checking
|
|
73
|
+
mypy src/
|
|
74
|
+
|
|
75
|
+
# Security audit
|
|
76
|
+
bandit -r src/
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## 📁 Project Structure
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
henchman-ai/
|
|
83
|
+
├── src/henchman/ # Source code
|
|
84
|
+
│ ├── cli/ # CLI interface
|
|
85
|
+
│ ├── core/ # Core functionality
|
|
86
|
+
│ ├── providers/ # LLM provider implementations
|
|
87
|
+
│ ├── tools/ # Tool implementations
|
|
88
|
+
│ └── utils/ # Utility functions
|
|
89
|
+
├── tests/ # Test suite
|
|
90
|
+
├── docs/ # Documentation
|
|
91
|
+
├── scripts/ # Development scripts
|
|
92
|
+
└── evals/ # Evaluation scripts
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## 📝 Code Style
|
|
96
|
+
|
|
97
|
+
### Python Style Guide
|
|
98
|
+
- Follow [PEP 8](https://peps.python.org/pep-0008/)
|
|
99
|
+
- Use type hints for all functions and methods
|
|
100
|
+
- Document public APIs with docstrings (Google style)
|
|
101
|
+
- Keep functions focused and small (< 50 lines when possible)
|
|
102
|
+
|
|
103
|
+
### Docstring Format (Google Style)
|
|
104
|
+
```python
|
|
105
|
+
def process_file(filepath: str, mode: str = "read") -> str:
|
|
106
|
+
"""Process a file with the given mode.
|
|
107
|
+
|
|
108
|
+
Args:
|
|
109
|
+
filepath: Path to the file to process
|
|
110
|
+
mode: Processing mode ('read', 'write', 'append')
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
The processed content as a string
|
|
114
|
+
|
|
115
|
+
Raises:
|
|
116
|
+
FileNotFoundError: If the file doesn't exist
|
|
117
|
+
ValueError: If mode is invalid
|
|
118
|
+
"""
|
|
119
|
+
# Implementation
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Commit Messages
|
|
123
|
+
Follow [Conventional Commits](https://www.conventionalcommits.org/):
|
|
124
|
+
```
|
|
125
|
+
feat: add new provider for Gemini
|
|
126
|
+
fix: handle API rate limiting properly
|
|
127
|
+
docs: update installation instructions
|
|
128
|
+
test: add unit tests for file tools
|
|
129
|
+
refactor: simplify configuration loading
|
|
130
|
+
chore: update dependencies
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## 🧪 Testing Guidelines
|
|
134
|
+
|
|
135
|
+
### Unit Tests
|
|
136
|
+
- Test one thing per test function
|
|
137
|
+
- Use descriptive test names
|
|
138
|
+
- Mock external dependencies
|
|
139
|
+
- Aim for high coverage (> 80%)
|
|
140
|
+
|
|
141
|
+
### Integration Tests
|
|
142
|
+
- Test end-to-end functionality
|
|
143
|
+
- Use real API calls (with test credentials)
|
|
144
|
+
- Clean up after tests
|
|
145
|
+
|
|
146
|
+
### Example Test
|
|
147
|
+
```python
|
|
148
|
+
import pytest
|
|
149
|
+
from henchman.core.processor import process_prompt
|
|
150
|
+
|
|
151
|
+
def test_process_prompt_with_valid_input():
|
|
152
|
+
"""Test prompt processing with valid input."""
|
|
153
|
+
result = process_prompt("Hello, world!")
|
|
154
|
+
assert isinstance(result, str)
|
|
155
|
+
assert len(result) > 0
|
|
156
|
+
|
|
157
|
+
def test_process_prompt_with_empty_input():
|
|
158
|
+
"""Test prompt processing with empty input raises error."""
|
|
159
|
+
with pytest.raises(ValueError):
|
|
160
|
+
process_prompt("")
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## 🔌 Adding New Providers
|
|
164
|
+
|
|
165
|
+
1. Create a new file in `src/henchman/providers/`
|
|
166
|
+
2. Implement the `BaseProvider` interface
|
|
167
|
+
3. Add tests in `tests/providers/`
|
|
168
|
+
4. Update documentation
|
|
169
|
+
5. Add to provider registry
|
|
170
|
+
|
|
171
|
+
## 🛠️ Adding New Tools
|
|
172
|
+
|
|
173
|
+
1. Create a new file in `src/henchman/tools/`
|
|
174
|
+
2. Implement the `BaseTool` interface
|
|
175
|
+
3. Add safety checks and user confirmation
|
|
176
|
+
4. Add tests
|
|
177
|
+
5. Update documentation
|
|
178
|
+
|
|
179
|
+
## 📚 Documentation
|
|
180
|
+
|
|
181
|
+
### Updating Documentation
|
|
182
|
+
- Documentation is in the `docs/` directory
|
|
183
|
+
- Use Markdown with MkDocs
|
|
184
|
+
- Build locally: `mkdocs serve`
|
|
185
|
+
- Update API documentation when changing interfaces
|
|
186
|
+
|
|
187
|
+
### Adding Examples
|
|
188
|
+
- Add practical examples to relevant documentation
|
|
189
|
+
- Include code snippets that can be copied
|
|
190
|
+
- Show common use cases and edge cases
|
|
191
|
+
|
|
192
|
+
## 🚀 Release Process
|
|
193
|
+
|
|
194
|
+
### Versioning
|
|
195
|
+
We follow [Semantic Versioning](https://semver.org/):
|
|
196
|
+
- **MAJOR**: Breaking changes
|
|
197
|
+
- **MINOR**: New features (backward compatible)
|
|
198
|
+
- **PATCH**: Bug fixes (backward compatible)
|
|
199
|
+
|
|
200
|
+
### Release Checklist
|
|
201
|
+
1. Update version in `pyproject.toml`
|
|
202
|
+
2. Update `CHANGELOG.md`
|
|
203
|
+
3. Run full test suite
|
|
204
|
+
4. Update documentation
|
|
205
|
+
5. Create release tag
|
|
206
|
+
6. Build and publish to PyPI
|
|
207
|
+
|
|
208
|
+
## ❓ Getting Help
|
|
209
|
+
|
|
210
|
+
- Check the [documentation](https://mgpowerlytics.github.io/henchman-ai/)
|
|
211
|
+
- Search existing [issues](https://github.com/MGPowerlytics/henchman-ai/issues)
|
|
212
|
+
- Join discussions in [GitHub Discussions](https://github.com/MGPowerlytics/henchman-ai/discussions)
|
|
213
|
+
|
|
214
|
+
## 📄 License
|
|
215
|
+
|
|
216
|
+
By contributing, you agree that your contributions will be licensed under the project's MIT License.
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
Thank you for contributing to make Henchman-AI better! 🎉
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|