Cybersecurity-Projects/PROJECTS/intermediate/security-news-scraper/internal/ai
CarterPerez-dev d57bcc15b6 feat(nadezhda): M6 AI ideation layer (ideate + TUI i-key)
Add an opt-in ideation layer that turns ranked story clusters into content angles. A Provider interface backs four models: qwen (default, local Ollama), OpenAI, and Gemini share one OpenAI-compatible client; an Anthropic Messages client is written against raw net/http (no vendor SDK, uniform + dep-light). Results persist in ai_notes with a UNIQUE(cluster_id, provider) index (migration 0003), so re-ideation upserts in place.

The ideate command skips any (cluster, provider) that already has a note unless --force is passed; benign classifier refusals get their own counter and never fail the run. In the TUI, i ideates the selected cluster inline and renders an AI IDEAS section in the dossier; it is a no-op unless AI is enabled and only acts in the detail view.
2026-07-06 21:26:52 -04:00
..
anthropic.go feat(nadezhda): M6 AI ideation layer (ideate + TUI i-key) 2026-07-06 21:26:52 -04:00
client_test.go feat(nadezhda): M6 AI ideation layer (ideate + TUI i-key) 2026-07-06 21:26:52 -04:00
factory_test.go feat(nadezhda): M6 AI ideation layer (ideate + TUI i-key) 2026-07-06 21:26:52 -04:00
http.go feat(nadezhda): M6 AI ideation layer (ideate + TUI i-key) 2026-07-06 21:26:52 -04:00
mock.go feat(nadezhda): M6 AI ideation layer (ideate + TUI i-key) 2026-07-06 21:26:52 -04:00
mock_test.go feat(nadezhda): M6 AI ideation layer (ideate + TUI i-key) 2026-07-06 21:26:52 -04:00
openai.go feat(nadezhda): M6 AI ideation layer (ideate + TUI i-key) 2026-07-06 21:26:52 -04:00
prompt.go feat(nadezhda): M6 AI ideation layer (ideate + TUI i-key) 2026-07-06 21:26:52 -04:00
prompt_test.go feat(nadezhda): M6 AI ideation layer (ideate + TUI i-key) 2026-07-06 21:26:52 -04:00
provider.go feat(nadezhda): M6 AI ideation layer (ideate + TUI i-key) 2026-07-06 21:26:52 -04:00