feat: web_read (trafilatura), session_read, http_fetch max_chars
web_read(url, max_chars=16000) — fetches a URL and extracts clean article text via trafilatura, stripping ads/nav/boilerplate. Returns markdown. session_read(date) — reads a full session log by YYYY-MM-DD date; lists available dates if the requested one is not found. http_fetch gains a max_chars param (default 8192, max 32768) so the cap is configurable instead of hardcoded. Tool count: 45 → 47. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -230,6 +230,34 @@ def _sync_file_write(path: str, content: str, mode: str) -> str:
|
||||
_SEARCH_EXCERPT_CHARS = 150
|
||||
|
||||
|
||||
async def session_read(date: str) -> str:
|
||||
"""Read a full session log by date (YYYY-MM-DD).
|
||||
|
||||
Returns the complete session log for that date. If the date is not found,
|
||||
lists the most recent available dates instead.
|
||||
Only reads the current user's own sessions (per-persona isolation via ContextVars).
|
||||
"""
|
||||
return await asyncio.to_thread(_sync_session_read, date.strip())
|
||||
|
||||
|
||||
def _sync_session_read(date: str) -> str:
|
||||
from persona import persona_path
|
||||
sessions_dir = persona_path() / "sessions"
|
||||
if not sessions_dir.exists():
|
||||
return "No session logs found."
|
||||
|
||||
target = sessions_dir / f"{date}.md"
|
||||
if target.exists():
|
||||
content = target.read_text()
|
||||
return f"Session log for {date} ({len(content)} chars):\n\n{content}"
|
||||
|
||||
available = sorted([f.stem for f in sessions_dir.glob("*.md")], reverse=True)
|
||||
if not available:
|
||||
return "No session logs found."
|
||||
recent = "\n".join(f" {d}" for d in available[:15])
|
||||
return f"No session log found for '{date}'. Available dates (most recent first):\n{recent}"
|
||||
|
||||
|
||||
async def session_search(query: str, limit: int = 5) -> str:
|
||||
"""Search past session logs for a keyword or phrase.
|
||||
|
||||
@@ -329,6 +357,22 @@ DECLARATIONS = [
|
||||
required=["path", "content"],
|
||||
),
|
||||
),
|
||||
types.FunctionDeclaration(
|
||||
name="session_read",
|
||||
description=(
|
||||
"Read a full session log by date (YYYY-MM-DD). Returns the complete conversation "
|
||||
"from that session — useful for continuity, recalling decisions, or reviewing "
|
||||
"what was discussed on a specific day. If the date is not found, lists available dates. "
|
||||
"Only reads this user's own sessions."
|
||||
),
|
||||
parameters=types.Schema(
|
||||
type=types.Type.OBJECT,
|
||||
properties={
|
||||
"date": types.Schema(type=types.Type.STRING, description="Date in YYYY-MM-DD format (e.g. '2026-05-08')"),
|
||||
},
|
||||
required=["date"],
|
||||
),
|
||||
),
|
||||
types.FunctionDeclaration(
|
||||
name="session_search",
|
||||
description=(
|
||||
|
||||
Reference in New Issue
Block a user