bathys 0.9.0__tar.gz → 0.10.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. {bathys-0.9.0 → bathys-0.10.0}/.remember/logs/memory-2026-09-09.log +6 -0
  2. bathys-0.10.0/.remember/logs/memory-2026-09-13.log +2 -0
  3. bathys-0.10.0/.remember/logs/memory-2026-09-14.log +30 -0
  4. bathys-0.10.0/.remember/tmp/no-transcript-notice +1 -0
  5. {bathys-0.9.0 → bathys-0.10.0}/CHANGELOG.md +10 -0
  6. {bathys-0.9.0 → bathys-0.10.0}/PKG-INFO +4 -3
  7. {bathys-0.9.0 → bathys-0.10.0}/README.md +3 -2
  8. bathys-0.10.0/docs/product/library-docs-initiative.md +46 -0
  9. {bathys-0.9.0 → bathys-0.10.0}/pyproject.toml +2 -1
  10. {bathys-0.9.0 → bathys-0.10.0}/src/bathys/__init__.py +1 -1
  11. bathys-0.10.0/src/bathys/docs_index.json +33 -0
  12. bathys-0.10.0/src/bathys/library_docs.py +75 -0
  13. {bathys-0.9.0 → bathys-0.10.0}/src/bathys/server.py +31 -0
  14. bathys-0.9.0/.remember/tmp/no-transcript-notice +0 -1
  15. {bathys-0.9.0 → bathys-0.10.0}/.github/workflows/ci.yml +0 -0
  16. {bathys-0.9.0 → bathys-0.10.0}/.gitignore +0 -0
  17. {bathys-0.9.0 → bathys-0.10.0}/.remember/.gitignore +0 -0
  18. {bathys-0.9.0 → bathys-0.10.0}/.remember/logs/hook-errors.log +0 -0
  19. {bathys-0.9.0 → bathys-0.10.0}/.remember/logs/memory-2026-09-06.log +0 -0
  20. {bathys-0.9.0 → bathys-0.10.0}/.remember/logs/memory-2026-09-07.log +0 -0
  21. {bathys-0.9.0 → bathys-0.10.0}/.remember/logs/memory-2026-09-08.log +0 -0
  22. {bathys-0.9.0 → bathys-0.10.0}/.remember/tmp/case-divergence +0 -0
  23. {bathys-0.9.0 → bathys-0.10.0}/.remember/tmp/post-tool-ran +0 -0
  24. {bathys-0.9.0 → bathys-0.10.0}/.remember/tmp/session-slug +0 -0
  25. {bathys-0.9.0 → bathys-0.10.0}/Dockerfile +0 -0
  26. {bathys-0.9.0 → bathys-0.10.0}/LICENSE +0 -0
  27. {bathys-0.9.0 → bathys-0.10.0}/THIRD_PARTY_NOTICES.md +0 -0
  28. {bathys-0.9.0 → bathys-0.10.0}/agents/HARNESS-DROPIN.md +0 -0
  29. {bathys-0.9.0 → bathys-0.10.0}/agents/bathys-researcher.md +0 -0
  30. {bathys-0.9.0 → bathys-0.10.0}/agents/skills/bathys-deep-dive/SKILL.md +0 -0
  31. {bathys-0.9.0 → bathys-0.10.0}/agents/skills/bathys-source-audit/SKILL.md +0 -0
  32. {bathys-0.9.0 → bathys-0.10.0}/docs/adr/0001-python-crawl4ai.md +0 -0
  33. {bathys-0.9.0 → bathys-0.10.0}/docs/adr/0002-pin-mcp-sdk-v1.md +0 -0
  34. {bathys-0.9.0 → bathys-0.10.0}/docs/adr/0003-self-managed-searxng.md +0 -0
  35. {bathys-0.9.0 → bathys-0.10.0}/docs/adr/0004-bm25-distillation.md +0 -0
  36. {bathys-0.9.0 → bathys-0.10.0}/docs/adr/0005-cache-raw-before-distill.md +0 -0
  37. {bathys-0.9.0 → bathys-0.10.0}/docs/adr/0006-three-tool-string-surface.md +0 -0
  38. {bathys-0.9.0 → bathys-0.10.0}/docs/architecture/data-flow.md +0 -0
  39. {bathys-0.9.0 → bathys-0.10.0}/docs/architecture/overview.md +0 -0
  40. {bathys-0.9.0 → bathys-0.10.0}/docs/architecture/pipeline.md +0 -0
  41. {bathys-0.9.0 → bathys-0.10.0}/docs/assets/banner.svg +0 -0
  42. {bathys-0.9.0 → bathys-0.10.0}/docs/contracts/config.md +0 -0
  43. {bathys-0.9.0 → bathys-0.10.0}/docs/contracts/mcp-tools.md +0 -0
  44. {bathys-0.9.0 → bathys-0.10.0}/docs/contracts/module-contracts.md +0 -0
  45. {bathys-0.9.0 → bathys-0.10.0}/docs/contracts/output-format.md +0 -0
  46. {bathys-0.9.0 → bathys-0.10.0}/docs/getting-started/cases.md +0 -0
  47. {bathys-0.9.0 → bathys-0.10.0}/docs/getting-started/configure.md +0 -0
  48. {bathys-0.9.0 → bathys-0.10.0}/docs/getting-started/install.md +0 -0
  49. {bathys-0.9.0 → bathys-0.10.0}/docs/getting-started/integrate.md +0 -0
  50. {bathys-0.9.0 → bathys-0.10.0}/docs/index.md +0 -0
  51. {bathys-0.9.0 → bathys-0.10.0}/docs/integrations/claude-code.md +0 -0
  52. {bathys-0.9.0 → bathys-0.10.0}/docs/integrations/cursor.md +0 -0
  53. {bathys-0.9.0 → bathys-0.10.0}/docs/integrations/generic-mcp.md +0 -0
  54. {bathys-0.9.0 → bathys-0.10.0}/docs/integrations/overview.md +0 -0
  55. {bathys-0.9.0 → bathys-0.10.0}/docs/integrations/zcode.md +0 -0
  56. {bathys-0.9.0 → bathys-0.10.0}/docs/meta/glossary.md +0 -0
  57. {bathys-0.9.0 → bathys-0.10.0}/docs/meta/style-guide.md +0 -0
  58. {bathys-0.9.0 → bathys-0.10.0}/docs/operations/metrics.md +0 -0
  59. {bathys-0.9.0 → bathys-0.10.0}/docs/operations/runbook.md +0 -0
  60. {bathys-0.9.0 → bathys-0.10.0}/docs/product/api-engine-initiative.md +0 -0
  61. {bathys-0.9.0 → bathys-0.10.0}/docs/product/charter.md +0 -0
  62. {bathys-0.9.0 → bathys-0.10.0}/docs/product/competitive.md +0 -0
  63. {bathys-0.9.0 → bathys-0.10.0}/docs/product/features.md +0 -0
  64. {bathys-0.9.0 → bathys-0.10.0}/docs/product/ideas-borrowed.md +0 -0
  65. {bathys-0.9.0 → bathys-0.10.0}/docs/product/mind-initiative.md +0 -0
  66. {bathys-0.9.0 → bathys-0.10.0}/docs/product/ocr-initiative.md +0 -0
  67. {bathys-0.9.0 → bathys-0.10.0}/docs/product/roadmap.md +0 -0
  68. {bathys-0.9.0 → bathys-0.10.0}/gpu-llm-analysis-2026.html +0 -0
  69. {bathys-0.9.0 → bathys-0.10.0}/gpu-llm-multiagent-2026.html +0 -0
  70. {bathys-0.9.0 → bathys-0.10.0}/install.sh +0 -0
  71. {bathys-0.9.0 → bathys-0.10.0}/integrations/README.md +0 -0
  72. {bathys-0.9.0 → bathys-0.10.0}/integrations/hermes/README.md +0 -0
  73. {bathys-0.9.0 → bathys-0.10.0}/integrations/hermes/install.py +0 -0
  74. {bathys-0.9.0 → bathys-0.10.0}/integrations/pi/README.md +0 -0
  75. {bathys-0.9.0 → bathys-0.10.0}/integrations/pi/assets/bathys-rules.md +0 -0
  76. {bathys-0.9.0 → bathys-0.10.0}/integrations/zcode/README.md +0 -0
  77. {bathys-0.9.0 → bathys-0.10.0}/npm/bathys-mcp/.remember/.gitignore +0 -0
  78. {bathys-0.9.0 → bathys-0.10.0}/npm/bathys-mcp/.remember/logs/hook-errors.log +0 -0
  79. {bathys-0.9.0 → bathys-0.10.0}/npm/bathys-mcp/.remember/logs/memory-2026-09-08.log +0 -0
  80. {bathys-0.9.0 → bathys-0.10.0}/npm/bathys-mcp/.remember/logs/memory-2026-09-09.log +0 -0
  81. {bathys-0.9.0 → bathys-0.10.0}/npm/bathys-mcp/.remember/tmp/no-transcript-notice +0 -0
  82. {bathys-0.9.0 → bathys-0.10.0}/npm/bathys-mcp/.remember/tmp/post-tool-ran +0 -0
  83. {bathys-0.9.0 → bathys-0.10.0}/npm/bathys-mcp/README.md +0 -0
  84. {bathys-0.9.0 → bathys-0.10.0}/npm/bathys-mcp/bin/cli.js +0 -0
  85. {bathys-0.9.0 → bathys-0.10.0}/npm/bathys-mcp/bin/postinstall.js +0 -0
  86. {bathys-0.9.0 → bathys-0.10.0}/npm/bathys-mcp/package.json +0 -0
  87. {bathys-0.9.0 → bathys-0.10.0}/scripts/acceptance_v02.py +0 -0
  88. {bathys-0.9.0 → bathys-0.10.0}/scripts/batch_check.py +0 -0
  89. {bathys-0.9.0 → bathys-0.10.0}/scripts/metrics_report.py +0 -0
  90. {bathys-0.9.0 → bathys-0.10.0}/scripts/smoke.py +0 -0
  91. {bathys-0.9.0 → bathys-0.10.0}/scripts/stdio_check.py +0 -0
  92. {bathys-0.9.0 → bathys-0.10.0}/src/bathys/batch.py +0 -0
  93. {bathys-0.9.0 → bathys-0.10.0}/src/bathys/cache.py +0 -0
  94. {bathys-0.9.0 → bathys-0.10.0}/src/bathys/compose.yaml +0 -0
  95. {bathys-0.9.0 → bathys-0.10.0}/src/bathys/config.py +0 -0
  96. {bathys-0.9.0 → bathys-0.10.0}/src/bathys/core.py +0 -0
  97. {bathys-0.9.0 → bathys-0.10.0}/src/bathys/crawler.py +0 -0
  98. {bathys-0.9.0 → bathys-0.10.0}/src/bathys/distill.py +0 -0
  99. {bathys-0.9.0 → bathys-0.10.0}/src/bathys/doctor.py +0 -0
  100. {bathys-0.9.0 → bathys-0.10.0}/src/bathys/installer.py +0 -0
  101. {bathys-0.9.0 → bathys-0.10.0}/src/bathys/searx.py +0 -0
  102. {bathys-0.9.0 → bathys-0.10.0}/src/bathys/searxng-settings.yml +0 -0
  103. {bathys-0.9.0 → bathys-0.10.0}/src/bathys/services.py +0 -0
  104. {bathys-0.9.0 → bathys-0.10.0}/tests/test_batch.py +0 -0
  105. {bathys-0.9.0 → bathys-0.10.0}/tests/test_cache.py +0 -0
  106. {bathys-0.9.0 → bathys-0.10.0}/tests/test_config.py +0 -0
  107. {bathys-0.9.0 → bathys-0.10.0}/tests/test_core.py +0 -0
  108. {bathys-0.9.0 → bathys-0.10.0}/tests/test_distill.py +0 -0
  109. {bathys-0.9.0 → bathys-0.10.0}/tests/test_installer.py +0 -0
  110. {bathys-0.9.0 → bathys-0.10.0}/tests/test_searx.py +0 -0
  111. {bathys-0.9.0 → bathys-0.10.0}/tests/test_v04.py +0 -0
  112. {bathys-0.9.0 → bathys-0.10.0}/uv.lock +0 -0
@@ -181,3 +181,9 @@
181
181
  13:50:50 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
182
182
  13:51:03 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
183
183
  13:51:16 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
184
+ 13:51:24 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
185
+ 13:51:38 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
186
+ 14:21:06 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
187
+ 14:21:06 [hook] WARNING: no session dir for this project: /var/home/abyss/.distrobox/ubuntu/home/.claude/projects/-var-home-abyss-LABs-MCP-deepreserch (slug of /var/home/abyss/LABs/MCP/deepreserch). Memory cannot save until it matches a directory under /var/home/abyss/.distrobox/ubuntu/home/.claude/projects/
188
+ 14:21:11 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
189
+ 14:21:15 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
@@ -0,0 +1,2 @@
1
+ 17:47:30 [hook] session-start: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
2
+ 17:47:40 [hook] session-start: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
@@ -0,0 +1,30 @@
1
+ 03:11:28 [hook] session-start: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
2
+ 03:11:35 [hook] session-start: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
3
+ 12:41:39 [hook] session-start: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
4
+ 16:14:09 [hook] session-start: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
5
+ 16:19:35 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
6
+ 16:19:35 [hook] WARNING: no session dir for this project: /var/home/abyss/.distrobox/ubuntu/home/.claude/projects/-var-home-abyss-LABs-MCP-deepreserch (slug of /var/home/abyss/LABs/MCP/deepreserch). Memory cannot save until it matches a directory under /var/home/abyss/.distrobox/ubuntu/home/.claude/projects/
7
+ 16:19:46 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
8
+ 16:19:55 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
9
+ 16:20:09 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
10
+ 16:20:18 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
11
+ 16:20:23 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
12
+ 16:20:34 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
13
+ 16:21:25 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
14
+ 16:22:10 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
15
+ 16:22:54 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
16
+ 16:23:05 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
17
+ 16:23:34 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
18
+ 16:23:50 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
19
+ 16:24:19 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
20
+ 16:24:31 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
21
+ 16:25:25 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
22
+ 16:26:51 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
23
+ 16:26:51 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
24
+ 16:27:05 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
25
+ 16:27:16 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
26
+ 16:27:27 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
27
+ 16:27:36 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
28
+ 16:27:53 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
29
+ 16:28:13 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
30
+ 16:28:29 [hook] post-tool: PROJECT_DIR=/var/home/abyss/LABs/MCP/deepreserch PIPELINE_DIR=/var/home/abyss/.distrobox/ubuntu/home/.zcode/cli/plugins/cache/claude-plugins-official/remember/0.20.0 PYTHON=python3 REMEMBER_DIR=/var/home/abyss/LABs/MCP/deepreserch/.remember
@@ -0,0 +1 @@
1
+ 1789391975
@@ -2,6 +2,16 @@
2
2
 
3
3
  Формат: Keep a Changelog; версии — semver. Дата — дата выпуска версии.
4
4
 
5
+ ## [0.10.0] — 2026-09-14
6
+
7
+ Тема: «Library Docs» — Context7-функциональность локально и без лимитов. Разведка Context7 (живьём через Bathys): parsing/crawling-движки у него приватные, free-tier урезан до ~1000 req/мес, офлайна нет. Наш ответ — инициатива library-docs: источники доков открыты сами по себе, наш конвейер уже содержит «parsing engine» (двухъярусное извлечение + BM25-дистилляция + кэш сырца).
8
+
9
+ ### Добавлено
10
+
11
+ - **`library_docs(library, query)`** — 6-й MCP-инструмент: актуальная документация библиотеки из первоисточника, дистиллированная под вопрос. Резолв: seed-индекс (`docs_index.json`, 30+ библиотек: react, fastapi, pytorch, kubernetes, searxng, crawl4ai…) → живой `web_search` «official documentation» → GitHub-slug. Повторные вопросы по той же библиотеке — мгновенно, офлайн, бесплатно (кэш сырца — то, чего нет у Context7). Live: `trio` резолвлен поиском (triodocs.org), `fastapi` из индекса; 153k ch → дистиллят под query.
12
+ - Инициатива `docs/product/library-docs-initiative.md`: архитектура, честная таблица отличий от Context7 (без лимитов/офлайн/любой сайт доков), фазы 2–3 (версионность через GitHub-теги, догрузка подстраниц, авторастущий индекс).
13
+ - Фаза 2 (задел): ограничение Фазы 1 зафиксировано честно — главная страница доксайта часто навигационная; полнота придёт с догрузкой релевантных подстраниц.
14
+
5
15
  ## [0.9.0] — 2026-09-09
6
16
 
7
17
  Тема: «Borrowed Ideas» — три фичи, заимствованные из pi-web-access (реализация наша; разведка самого источника проведена живьём через Bathys).
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: bathys
3
- Version: 0.9.0
3
+ Version: 0.10.0
4
4
  Summary: Unified local deep-research search service for AI agents — one pipeline (search → extraction → query distillation → cache), zero cloud quotas. MCP stdio server with native harness integration (bathys install).
5
5
  Project-URL: Homepage, https://github.com/Korrnals/bathys
6
6
  Project-URL: Repository, https://github.com/Korrnals/bathys
@@ -33,7 +33,7 @@ Description-Content-Type: text/markdown
33
33
  Сонар находит координаты, батискаф ныряет за полными текстами, дистиллятор поднимает на палубу только то, что отвечает на вопрос.
34
34
 
35
35
  ![python](https://img.shields.io/badge/python-3.10%2B-blue)
36
- ![version](https://img.shields.io/badge/version-0.9.0-9cf)
36
+ ![version](https://img.shields.io/badge/version-0.10.0-9cf)
37
37
  ![mcp](https://img.shields.io/badge/MCP-stdio%20server-6f42c1)
38
38
  ![license](https://img.shields.io/badge/license-MIT-green)
39
39
 
@@ -172,6 +172,7 @@ Bathys — stdio MCP-сервер: блок `mcpServers` один и тот же
172
172
  | `deep_research(query, max_sources=3, …)` | ищет, параллельно читает топ-источники, возвращает слитый дистиллят под запрос. Первый вызов для любого ресёрч-вопроса. |
173
173
  | `web_search(query, max_results=8, …)` | ранжированный список ссылок со сниппетами без содержимого страниц; `as_json=true` — чистый JSON для программ. |
174
174
  | `read_url(url, query=None, find=None)` | читает страницу (включая текстовые PDF); с `query` — релевантные пассажи; с `find` — точный поиск по кэшу сырца без сети. |
175
+ | `library_docs(library, query)` | актуальная документация библиотеки из первоисточника, дистиллированная под вопрос; повторы бесплатны (кэш). |
175
176
  | `read_urls(urls, query=None, total_chars=12000)` | пакетно читает до 10 известных страниц; бюджет делится между успешными, сбой страницы — одна строка, не сорванный вызов. |
176
177
 
177
178
  Поиск сужается общими фильтрами `time_range`, `category`, `engines`, `language`. Живой футер ответа показывает сжатие и кэш: `[bathys: 41 raw hits, top 3 considered · dove 3 pages · 35669 ch fetched → 7508 ch returned · 3.2s]`.
@@ -210,7 +211,7 @@ Bathys — stdio MCP-сервер: блок `mcpServers` один и тот же
210
211
 
211
212
  ## 📍 Статус
212
213
 
213
- **0.9.0.** Выпускная история: v0.2 «Качество выдачи» (ретраи, здоровье движков), v0.3 «Паритет с Tavily» (`read_urls`, JSON-режим), v0.4 «Эксплуатация» (robots-этика, метрики, `bathys-doctor`), v0.5 «Identity & Harness» (репозиционирование, промпты, субагент), v0.6 «Native Install» (`bathys install`), v0.7 «Ship & Setup» (двухъярусное извлечение, `bathys setup`, однострочник, uninstall) — итоги в [CHANGELOG.md](CHANGELOG.md).
214
+ **0.10.0.** Выпускная история: v0.2 «Качество выдачи» (ретраи, здоровье движков), v0.3 «Паритет с Tavily» (`read_urls`, JSON-режим), v0.4 «Эксплуатация» (robots-этика, метрики, `bathys-doctor`), v0.5 «Identity & Harness» (репозиционирование, промпты, субагент), v0.6 «Native Install» (`bathys install`), v0.7 «Ship & Setup» (двухъярусное извлечение, `bathys setup`, однострочник, uninstall) — итоги в [CHANGELOG.md](CHANGELOG.md).
214
215
 
215
216
  Репозиторий: `github.com/Korrnals/bathys`. Пакет опубликован: [PyPI `bathys`](https://pypi.org/project/bathys/) (pip install), однострочник установки — выше. До 1.0: публикация npm-обёртки `bathys-mcp` и первый прогон Docker-образа; CI (matrix 3.10–3.12 + shellcheck) уже в репозитории.
216
217
 
@@ -7,7 +7,7 @@
7
7
  Сонар находит координаты, батискаф ныряет за полными текстами, дистиллятор поднимает на палубу только то, что отвечает на вопрос.
8
8
 
9
9
  ![python](https://img.shields.io/badge/python-3.10%2B-blue)
10
- ![version](https://img.shields.io/badge/version-0.9.0-9cf)
10
+ ![version](https://img.shields.io/badge/version-0.10.0-9cf)
11
11
  ![mcp](https://img.shields.io/badge/MCP-stdio%20server-6f42c1)
12
12
  ![license](https://img.shields.io/badge/license-MIT-green)
13
13
 
@@ -146,6 +146,7 @@ Bathys — stdio MCP-сервер: блок `mcpServers` один и тот же
146
146
  | `deep_research(query, max_sources=3, …)` | ищет, параллельно читает топ-источники, возвращает слитый дистиллят под запрос. Первый вызов для любого ресёрч-вопроса. |
147
147
  | `web_search(query, max_results=8, …)` | ранжированный список ссылок со сниппетами без содержимого страниц; `as_json=true` — чистый JSON для программ. |
148
148
  | `read_url(url, query=None, find=None)` | читает страницу (включая текстовые PDF); с `query` — релевантные пассажи; с `find` — точный поиск по кэшу сырца без сети. |
149
+ | `library_docs(library, query)` | актуальная документация библиотеки из первоисточника, дистиллированная под вопрос; повторы бесплатны (кэш). |
149
150
  | `read_urls(urls, query=None, total_chars=12000)` | пакетно читает до 10 известных страниц; бюджет делится между успешными, сбой страницы — одна строка, не сорванный вызов. |
150
151
 
151
152
  Поиск сужается общими фильтрами `time_range`, `category`, `engines`, `language`. Живой футер ответа показывает сжатие и кэш: `[bathys: 41 raw hits, top 3 considered · dove 3 pages · 35669 ch fetched → 7508 ch returned · 3.2s]`.
@@ -184,7 +185,7 @@ Bathys — stdio MCP-сервер: блок `mcpServers` один и тот же
184
185
 
185
186
  ## 📍 Статус
186
187
 
187
- **0.9.0.** Выпускная история: v0.2 «Качество выдачи» (ретраи, здоровье движков), v0.3 «Паритет с Tavily» (`read_urls`, JSON-режим), v0.4 «Эксплуатация» (robots-этика, метрики, `bathys-doctor`), v0.5 «Identity & Harness» (репозиционирование, промпты, субагент), v0.6 «Native Install» (`bathys install`), v0.7 «Ship & Setup» (двухъярусное извлечение, `bathys setup`, однострочник, uninstall) — итоги в [CHANGELOG.md](CHANGELOG.md).
188
+ **0.10.0.** Выпускная история: v0.2 «Качество выдачи» (ретраи, здоровье движков), v0.3 «Паритет с Tavily» (`read_urls`, JSON-режим), v0.4 «Эксплуатация» (robots-этика, метрики, `bathys-doctor`), v0.5 «Identity & Harness» (репозиционирование, промпты, субагент), v0.6 «Native Install» (`bathys install`), v0.7 «Ship & Setup» (двухъярусное извлечение, `bathys setup`, однострочник, uninstall) — итоги в [CHANGELOG.md](CHANGELOG.md).
188
189
 
189
190
  Репозиторий: `github.com/Korrnals/bathys`. Пакет опубликован: [PyPI `bathys`](https://pypi.org/project/bathys/) (pip install), однострочник установки — выше. До 1.0: публикация npm-обёртки `bathys-mcp` и первый прогон Docker-образа; CI (matrix 3.10–3.12 + shellcheck) уже в репозитории.
190
191
 
@@ -0,0 +1,46 @@
1
+ # Инициатива: library_docs — «Context7, но локально и без лимитов»
2
+
3
+ | Поле | Значение |
4
+ |---|---|
5
+ | Статус | Утверждена владельцем 2026-09-14 («важная задача — добавить функциональность Context7: актуальная документация по коду, бесплатно, без лимитов запросов»); разведка проведена живьём через Bathys |
6
+ | Источник-референс | [Context7](https://github.com/upstash/context7) (62k★, Upstash): MCP-инструменты `resolve-library-id` + `query-docs`; **parsing/crawling-движки приватные** (в репо только обёртка); free-tier урезан до ~1000 запросов/мес (январь 2026); офлайн-режима нет |
7
+ | Принцип | Источники доков открыты сами по себе (официальные сайты, GitHub-репозитории). Пайплайн Bathys уже содержит «parsing engine» Context7: двухъярусное извлечение + BM25-дистилляция + кэш сырца. Недостаёт только резолв имени → источник. Никаких API-ключей, никаких лимитов, повторные запросы бесплатны (кэш). |
8
+
9
+ ## Архитектура
10
+
11
+ ```mermaid
12
+ flowchart LR
13
+ Q["library_docs(library, query)"] --> R{"Резолв: локальный индекс?"}
14
+ R -- hit --> F["Док-сайт (URL из индекса)"]
15
+ R -- miss --> S["web_search: '<library> official docs' (1 запрос)"]
16
+ S --> F
17
+ F --> E1["HTTP-ярус: главная + страница-оглавление"]
18
+ E1 -- JS-shell --> E2["Браузерный ярус"]
19
+ E1 --> D["Дистилляция под query (BM25, бюджет)"]
20
+ E2 --> D
21
+ D --> OUT["Компактный срез доков + URL-цитаты"]
22
+ E1 -. сырец .-> C[("Кэш сырца — повторы бесплатны")]
23
+ ```
24
+
25
+ - **Резолв**: (1) seed-индекс популярных библиотек (JSON в пакете, `src/bathys/docs_index.json`); (2) fallback — один живой `web_search` через SearXNG («{library} official documentation»); (3) GitHub-паттерн `github.com/{library}` если похож на slug.
26
+ - **Извлечение**: существующие ярусы. Доксайты часто JS-ные (docusaurus/vitepress) — браузерный ярус их берёт; статические (mkdocs/sphinx/readthedocs) — HTTP-ярус за миллисекунды.
27
+ - **Дистилляция**: существующий `passages()` под query — то самое «компактный срез, который не раздувает счёт за токены».
28
+ - **Кэш сырца**: существующий; повторный вопрос по той же библиотеке = 0 сети, мгновенно, **без лимитов** — то, чего нет у Context7.
29
+ - Версионность (фаза 2): `{version}` → GitHub-тег репозитория (`raw.githubusercontent.com/{owner}/{repo}/v{N}/docs/…`).
30
+
31
+ ## Отличия от Context7 (честная таблица)
32
+
33
+ | Ось | Context7 | Bathys library_docs |
34
+ |---|---|---|
35
+ | Цена | free ~1000 req/мес, Pro $7 | без лимитов (кэш + живой поиск бесплатны) |
36
+ | Офлайн | нет | да, после первого чтения (кэш сырца) |
37
+ | Индекс | их закрытая база | seed-индекс + живой поиск: любой сайт доков, даже не в базе |
38
+ | Parsing engine | приватный | наш открытый (двухъярусный) |
39
+ | Дистилляция | их 5-стадийный конвейер | наш BM25 + бюджеты |
40
+ | Свежесть | их цикл обновления | «из первых рук» при каждом cache-miss |
41
+
42
+ ## Фазы
43
+
44
+ - **Фаза 1** (текущая): инструмент `library_docs(library, query)`; seed-индекс ~20 топ-библиотек; резолв через индекс→поиск; извлечение главной+подстраниц; дистилляция; кэш.
45
+ - **Фаза 2**: версионность (GitHub-теги); догрузка релевантных подстраниц (не только главная); `docs`-категория поиска SearXNG для резолва.
46
+ - **Фаза 3**: seed-индекс расширяется автоматически (успешные резолвы пишутся в пользовательский индекс).
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "bathys"
7
- version = "0.9.0"
7
+ version = "0.10.0"
8
8
  description = "Unified local deep-research search service for AI agents — one pipeline (search → extraction → query distillation → cache), zero cloud quotas. MCP stdio server with native harness integration (bathys install)."
9
9
  keywords = ["mcp", "deep-research", "search", "web-search", "ai-agents", "llm", "local-first", "distillation", "searxng", "crawl4ai"]
10
10
  classifiers = [
@@ -46,3 +46,4 @@ packages = ["src/bathys"]
46
46
  # --with-agent` works from a PyPI install, not only from a repo clone.
47
47
  [tool.hatch.build.targets.wheel.force-include]
48
48
  "agents" = "bathys/agents"
49
+ "src/bathys/docs_index.json" = "bathys/docs_index.json"
@@ -5,4 +5,4 @@ a query-focused distiller keeps only what answers the question. Built to spend
5
5
  the model's tokens on answers, not on boilerplate.
6
6
  """
7
7
 
8
- __version__ = "0.9.0"
8
+ __version__ = "0.10.0"
@@ -0,0 +1,33 @@
1
+ {
2
+ "_comment": "Seed index: popular libraries -> official docs sites. Bathys library_docs resolver: exact/alias match first, then live web_search fallback.",
3
+ "react": "https://react.dev/learn",
4
+ "nextjs": "https://nextjs.org/docs",
5
+ "vue": "https://vuejs.org/guide/introduction.html",
6
+ "nuxt": "https://nuxt.com/docs",
7
+ "svelte": "https://svelte.dev/docs/svelte/getting-started",
8
+ "angular": "https://angular.dev/",
9
+ "typescript": "https://www.typescriptlang.org/docs/handbook/intro.html",
10
+ "nodejs": "https://nodejs.org/docs/latest/api/",
11
+ "python": "https://docs.python.org/3/",
12
+ "django": "https://docs.djangoproject.com/en/stable/",
13
+ "flask": "https://flask.palletsprojects.com/en/stable/quickstart/",
14
+ "fastapi": "https://fastapi.tiangolo.com/",
15
+ "sqlalchemy": "https://docs.sqlalchemy.org/en/stable/",
16
+ "numpy": "https://numpy.org/doc/stable/",
17
+ "pandas": "https://pandas.pydata.org/docs/",
18
+ "pytorch": "https://docs.pytorch.org/docs/stable/",
19
+ "tensorflow": "https://www.tensorflow.org/guide",
20
+ "scikit-learn": "https://scikit-learn.org/stable/user_guide.html",
21
+ "docker": "https://docs.docker.com/",
22
+ "kubernetes": "https://kubernetes.io/docs/home/",
23
+ "rust": "https://doc.rust-lang.org/book/",
24
+ "go": "https://go.dev/doc/",
25
+ "postgresql": "https://www.postgresql.org/docs/current/",
26
+ "redis": "https://redis.io/docs/latest/",
27
+ "searxng": "https://docs.searxng.org/",
28
+ "crawl4ai": "https://docs.crawl4ai.com/",
29
+ "httpx": "https://www.python-httpx.org/",
30
+ "mcp": "https://modelcontextprotocol.io/docs/getting-started/overview",
31
+ "playwright": "https://playwright.dev/python/docs/intro",
32
+ "pymupdf": "https://pymupdf.readthedocs.io/en/stable/"
33
+ }
@@ -0,0 +1,75 @@
1
+ """library_docs — up-to-date library documentation for agents, Context7-style
2
+ but local and unlimited (initiative: docs/product/library-docs-initiative.md).
3
+
4
+ Resolution chain: seed index (docs_index.json) -> one live web_search
5
+ ("<library> official documentation") -> GitHub slug guess. Extraction reuses
6
+ the two-tier crawler; distillation reuses the BM25 passage engine; the raw
7
+ page lands in the existing page cache, so follow-up questions on the same
8
+ library are instant, offline and free.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import json
14
+ from pathlib import Path
15
+
16
+ from . import distill
17
+
18
+ _INDEX_PATH = Path(__file__).resolve().parent / "docs_index.json"
19
+
20
+
21
+ def _seed_index() -> dict[str, str]:
22
+ try:
23
+ return json.loads(_INDEX_PATH.read_text(encoding="utf-8"))
24
+ except (OSError, json.JSONDecodeError):
25
+ return {}
26
+
27
+
28
+ def _normalize(name: str) -> str:
29
+ return (name or "").strip().lower().lstrip("/").rstrip("/")
30
+
31
+
32
+ async def resolve_docs_url(engine, library: str) -> tuple[str, str]:
33
+ """Return (docs_url, source) for a library name.
34
+
35
+ source: 'index' | 'search' | 'github' — provenance for the answer header.
36
+ Raises RuntimeError when nothing plausible is found.
37
+ """
38
+ idx = _seed_index()
39
+ key = _normalize(library)
40
+ if key in idx:
41
+ return idx[key], "index"
42
+ # try a few common alias shapes (js suffix, -python, etc.)
43
+ for suffix in ("js", "-js", ".js", "-python", "py", "-dev"):
44
+ if key + suffix in idx:
45
+ return idx[key + suffix], "index"
46
+
47
+ # live search fallback: one web_search call
48
+ raw = await engine.search(f"{library} official documentation", max_results=5, refresh=False)
49
+ lines = raw.splitlines()
50
+ for ln in lines:
51
+ s = ln.strip()
52
+ if s.startswith("http://") or s.startswith("https://"):
53
+ low = s.lower()
54
+ if any(b in low for b in ("docs.", "/docs", "documentation.", "developer.")):
55
+ return s.split()[0], "search"
56
+ # last resort: github slug
57
+ if " " not in key and "/" not in key:
58
+ return f"https://github.com/{key}", "github"
59
+ raise RuntimeError(f"library_docs: не удалось найти документацию для {library!r}")
60
+
61
+
62
+ async def library_docs(engine, library: str, query: str, max_chars: int = 6000,
63
+ refresh: bool = False) -> str:
64
+ """Fetch and distill official docs for `library` under `query`."""
65
+ url, source = await resolve_docs_url(engine, library)
66
+ res = await engine._read(url, query=query, max_chars=max_chars, refresh=refresh)
67
+ slim = distill.slim_markdown(res.page.text)
68
+ distilled = distill.passages(slim, query, max_chars)
69
+ head = f"# Документация: {library}\n{url}\n(источник: {source})"
70
+ from .core import _ch
71
+
72
+ footer = (f"[bathys: docs {_ch(res.page.raw_chars)} ch → "
73
+ f"{_ch(len(distilled))} ch · cache {'HIT' if res.cache_hit else 'MISS'}] "
74
+ f"— повторы бесплатны: read_url(url, query=…)")
75
+ return head + "\n\n" + distilled + "\n\n" + footer
@@ -196,6 +196,37 @@ async def read_url(
196
196
  refresh=refresh, find=find)
197
197
 
198
198
 
199
+ @mcp.tool(annotations=ToolAnnotations(
200
+ title="Документация библиотеки (актуальная, из первоисточника)",
201
+ readOnlyHint=True,
202
+ openWorldHint=True,
203
+ ))
204
+ async def library_docs(
205
+ library: str,
206
+ query: str,
207
+ max_chars: int = 6000,
208
+ refresh: bool = False,
209
+ ctx: Context = None,
210
+ ) -> str:
211
+ """Fetch up-to-date official documentation for a library and distill it under your question.
212
+
213
+ Context7-style, but local and unlimited: the docs site is resolved from a
214
+ built-in index (or one live web search), fetched from the primary source,
215
+ and distilled to passages relevant to `query`. Repeated questions about
216
+ the same library are instant, offline and free (raw-page cache).
217
+ Args:
218
+ library: library name, e.g. "fastapi", "react", "postgresql", "crawl4ai"
219
+ query: your concrete question about the library (used for distillation)
220
+ max_chars: output character budget (300-20000)
221
+ refresh: re-fetch the docs page even if cached
222
+ """
223
+ from . import library_docs as _ld
224
+
225
+ eng = _engine(ctx)
226
+ return await _ld.library_docs(eng, library, query, max_chars=max_chars,
227
+ refresh=refresh)
228
+
229
+
199
230
  @mcp.tool(annotations=ToolAnnotations(
200
231
  title="Пакетное чтение до 10 страниц",
201
232
  readOnlyHint=True,
@@ -1 +0,0 @@
1
- 1788947863
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes