bvandeusen
278927ec40
feat(tools): add read_article tool for fetching full article content
...
Adds read_article tool definition and execute_tool handler. Uses
_fetch_full_article (trafilatura) from rss.py, caps tool output at
40K chars to keep context window manageable. Always registered
(not gated on SearXNG). Tests cover success, failure, truncation,
empty URL, and history builder replay.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-05 19:33:11 -04:00
bvandeusen
f7d54a15c0
feat(rss): remove article content character cap
...
Trafilatura extracts only article body text (typically 2K–15K chars),
so storing the full content is safe without an artificial ceiling.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-05 19:32:17 -04:00
bvandeusen
b5106441dd
fix(tests): add missing start_dt/end_dt to mock event to_dict in test_list_events
2026-04-05 00:05:27 -04:00
bvandeusen
c2d81e04b9
fix: update tests for briefing rewrite and raised content cap
...
- Remove test_slot_greeting — slot_greeting() was removed in the
conversational briefing rewrite
- Update test_extract_item_truncates_content to use CONTENT_MAX_CHARS
rather than a hardcoded 2000 (cap raised to 50000 for full articles)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-30 17:42:48 -04:00
bvandeusen
260103d533
feat: inject briefing article content for deep article Q&A
...
Add _build_briefing_article_context() helper to llm.py that reads
rss_item_ids from briefing message metadata and injects article content
into the system prompt. Pass conv_id through build_context() and
generation_task.py.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 00:31:43 -04:00
bvandeusen
57bf63e576
feat: extend RSS item retention from 14 to 90 days
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-28 00:29:32 -04:00
bvandeusen
6557fef6a2
feat: support multi-value status and priority filters in list_notes
2026-03-27 23:01:24 -04:00
bvandeusen
a24257aeed
feat: add recurrence service (validate, calculate_next_due, spawn_recurring_tasks)
2026-03-27 22:52:18 -04:00
bvandeusen
c92f4944cc
feat: auto-set started_at/completed_at on task status transitions
2026-03-27 22:49:21 -04:00
bvandeusen
8d330afc6d
feat(calendar): events REST API blueprint and registration
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-25 12:53:52 -04:00
bvandeusen
90ca667df2
feat(calendar): implement events service with CalDAV push
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-25 12:49:57 -04:00
bvandeusen
b547f47f54
feat(calendar): update Event model and patch caldav.create_event with uid param
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-25 12:48:40 -04:00
bvandeusen
e3c1e97cfa
feat(briefing): add task change detection helpers and task_id to _gather_internal
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-25 10:36:52 -04:00
bvandeusen
2ad07b5e06
feat(briefing): add rss_classifier service for LLM-based topic tagging
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-25 10:34:37 -04:00
bvandeusen
9e1615bd32
feat(briefing): add past_days/current_weather to Open-Meteo; add parse_weather_card_data()
...
Also adds get_cached_weather_rows() for parallel gather in briefing pipeline.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-25 10:32:59 -04:00
bvandeusen
e44eb185d5
feat(briefing): extend post_message() to accept optional metadata dict
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-25 10:31:25 -04:00
bvandeusen
5665f484ed
feat(briefing): add Message.msg_metadata and RssItem.topics/classified_at columns
...
msg_metadata maps to the 'metadata' DB column ('metadata' is reserved
by SQLAlchemy Declarative API). to_dict() exposes the key as 'metadata'
for frontend compatibility.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-25 10:30:37 -04:00
bvandeusen
47b4af281b
feat: API key routes, search endpoint, conversation type wiring
...
- GET/POST/DELETE /api/api-keys blueprint registered
- GET /api/search?q=&content_type=&limit= semantic search endpoint
- create_conversation gains conversation_type param (default "chat")
- cleanup_old_conversations excludes mcp type from retention sweep
- POST /api/chat/conversations accepts conversation_type body field
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-23 21:01:04 -04:00
bvandeusen
583a140485
feat: add ApiKey service with create/list/revoke/lookup
...
SHA-256 hashed keys, fmcp_ prefix, soft-delete revocation. Tests cover
pure logic (hash, prefix, format, uniqueness, scope validation) and
auth middleware bearer token path (pending auth.py update).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-23 20:56:51 -04:00
bvandeusen
bc2119c067
feat: briefing profile note service
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-11 20:07:05 -04:00
bvandeusen
9bb054f3d5
feat: RSS service — feedparser fetch, cache, prune
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-11 19:46:01 -04:00
bvandeusen
bbdcea57a7
feat: weather service — geocoding, Open-Meteo forecast, cache, change detection
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-11 19:45:59 -04:00
bvandeusen
fa81509c9f
feat: add conversation_type and briefing_date to Conversation model
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-11 19:45:47 -04:00
bvandeusen
e128406790
Add Forgejo Actions CI/CD, ruff linting, and test foundation
...
- .forgejo/workflows/ci.yml: fast checks on every push (TS typecheck,
Python lint via ruff, pytest) — no Docker build, ~30s with cache
- .forgejo/workflows/build.yml: Docker build with registry-side layer
caching + SSH deploy on main branch pushes only
- pyproject.toml: add ruff to dev deps, configure pytest and ruff rules
- tests/: conftest.py + first unit tests for _safe_filename (no DB needed)
- Makefile: add lint, fmt, typecheck, test, check targets for local use
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-08 18:46:54 -04:00