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.
- {bathys-0.9.0 → bathys-0.10.0}/.remember/logs/memory-2026-09-09.log +6 -0
- bathys-0.10.0/.remember/logs/memory-2026-09-13.log +2 -0
- bathys-0.10.0/.remember/logs/memory-2026-09-14.log +30 -0
- bathys-0.10.0/.remember/tmp/no-transcript-notice +1 -0
- {bathys-0.9.0 → bathys-0.10.0}/CHANGELOG.md +10 -0
- {bathys-0.9.0 → bathys-0.10.0}/PKG-INFO +4 -3
- {bathys-0.9.0 → bathys-0.10.0}/README.md +3 -2
- bathys-0.10.0/docs/product/library-docs-initiative.md +46 -0
- {bathys-0.9.0 → bathys-0.10.0}/pyproject.toml +2 -1
- {bathys-0.9.0 → bathys-0.10.0}/src/bathys/__init__.py +1 -1
- bathys-0.10.0/src/bathys/docs_index.json +33 -0
- bathys-0.10.0/src/bathys/library_docs.py +75 -0
- {bathys-0.9.0 → bathys-0.10.0}/src/bathys/server.py +31 -0
- bathys-0.9.0/.remember/tmp/no-transcript-notice +0 -1
- {bathys-0.9.0 → bathys-0.10.0}/.github/workflows/ci.yml +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/.gitignore +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/.remember/.gitignore +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/.remember/logs/hook-errors.log +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/.remember/logs/memory-2026-09-06.log +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/.remember/logs/memory-2026-09-07.log +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/.remember/logs/memory-2026-09-08.log +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/.remember/tmp/case-divergence +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/.remember/tmp/post-tool-ran +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/.remember/tmp/session-slug +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/Dockerfile +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/LICENSE +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/THIRD_PARTY_NOTICES.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/agents/HARNESS-DROPIN.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/agents/bathys-researcher.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/agents/skills/bathys-deep-dive/SKILL.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/agents/skills/bathys-source-audit/SKILL.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/adr/0001-python-crawl4ai.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/adr/0002-pin-mcp-sdk-v1.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/adr/0003-self-managed-searxng.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/adr/0004-bm25-distillation.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/adr/0005-cache-raw-before-distill.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/adr/0006-three-tool-string-surface.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/architecture/data-flow.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/architecture/overview.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/architecture/pipeline.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/assets/banner.svg +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/contracts/config.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/contracts/mcp-tools.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/contracts/module-contracts.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/contracts/output-format.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/getting-started/cases.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/getting-started/configure.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/getting-started/install.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/getting-started/integrate.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/index.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/integrations/claude-code.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/integrations/cursor.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/integrations/generic-mcp.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/integrations/overview.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/integrations/zcode.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/meta/glossary.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/meta/style-guide.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/operations/metrics.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/operations/runbook.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/product/api-engine-initiative.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/product/charter.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/product/competitive.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/product/features.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/product/ideas-borrowed.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/product/mind-initiative.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/product/ocr-initiative.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/docs/product/roadmap.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/gpu-llm-analysis-2026.html +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/gpu-llm-multiagent-2026.html +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/install.sh +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/integrations/README.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/integrations/hermes/README.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/integrations/hermes/install.py +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/integrations/pi/README.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/integrations/pi/assets/bathys-rules.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/integrations/zcode/README.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/npm/bathys-mcp/.remember/.gitignore +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/npm/bathys-mcp/.remember/logs/hook-errors.log +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/npm/bathys-mcp/.remember/logs/memory-2026-09-08.log +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/npm/bathys-mcp/.remember/logs/memory-2026-09-09.log +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/npm/bathys-mcp/.remember/tmp/no-transcript-notice +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/npm/bathys-mcp/.remember/tmp/post-tool-ran +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/npm/bathys-mcp/README.md +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/npm/bathys-mcp/bin/cli.js +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/npm/bathys-mcp/bin/postinstall.js +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/npm/bathys-mcp/package.json +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/scripts/acceptance_v02.py +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/scripts/batch_check.py +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/scripts/metrics_report.py +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/scripts/smoke.py +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/scripts/stdio_check.py +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/src/bathys/batch.py +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/src/bathys/cache.py +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/src/bathys/compose.yaml +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/src/bathys/config.py +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/src/bathys/core.py +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/src/bathys/crawler.py +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/src/bathys/distill.py +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/src/bathys/doctor.py +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/src/bathys/installer.py +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/src/bathys/searx.py +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/src/bathys/searxng-settings.yml +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/src/bathys/services.py +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/tests/test_batch.py +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/tests/test_cache.py +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/tests/test_config.py +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/tests/test_core.py +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/tests/test_distill.py +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/tests/test_installer.py +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/tests/test_searx.py +0 -0
- {bathys-0.9.0 → bathys-0.10.0}/tests/test_v04.py +0 -0
- {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.
|
|
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
|

|
|
36
|
-

|
|
37
37
|

|
|
38
38
|

|
|
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.
|
|
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
|

|
|
10
|
-

|
|
11
11
|

|
|
12
12
|

|
|
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.
|
|
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.
|
|
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"
|
|
@@ -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
|
|
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
|
|
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
|