Commit graph

29 commits

Author SHA1 Message Date
05d12a1417 feat(avocet): LabelBucketGrid bucket-mode CSS — spring expansion, glow on drop 2026-03-03 16:19:29 -08:00
97437f39c9 feat(avocet): EmailCardStack — swipe gestures, depth shadows, dismissal classes 2026-03-03 16:16:09 -08:00
5f03db20dc feat(avocet): UndoToast — 5-second countdown, undo button, accessible 2026-03-03 16:13:02 -08:00
2fd101f382 feat(avocet): useLabelKeyboard — 1-9, h, S, D, U, ? shortcuts 2026-03-03 16:12:58 -08:00
452730bb98 feat(avocet): LabelBucketGrid — numpad layout, bucket-mode expansion, drag drop 2026-03-03 16:04:31 -08:00
f5aca77ff6 feat(avocet): EmailCard component — subject, from/date, body preview, expand/collapse 2026-03-03 16:03:01 -08:00
7edcb089a9 feat(avocet): useApi, useMotion, useHaptics, useEasterEgg (Konami/hacker mode)
- useApiFetch: typed fetch wrapper with network/http error discrimination
- useMotion: reactive localStorage override for rich-animation toggle, respects OS prefers-reduced-motion
- useHaptics: label/discard/skip/undo vibration patterns, gated on rich mode
- useKonamiCode + useHackerMode: 10-key Konami sequence → hacker theme, persisted in localStorage
- test-setup.ts: jsdom matchMedia stub so useMotion imports cleanly in Vitest
- smoke.test.ts: import smoke tests for all 4 composables (12 tests, all passing)
2026-03-03 15:58:43 -08:00
50dd4c2f45 feat(avocet): Pinia label store with queue, lastAction, easter egg counter 2026-03-03 15:54:44 -08:00
b10c337214 fix(avocet): align theme with Peregrine design system — full token set, dark mode, self-hosted fonts 2026-03-03 15:52:38 -08:00
a9e5c0d8f3 feat(avocet): CircuitForge base theme + Avocet Slate Teal/Russet colors 2026-03-03 15:49:07 -08:00
02efd5fb1d feat(avocet): Vite + Vue 3 + UnoCSS + Vitest scaffold 2026-03-03 15:46:58 -08:00
01cc908eab fix(avocet): undo — commit-then-clear order, empty-records guard, skip dedup, stronger test 2026-03-03 15:41:58 -08:00
f4facc6484 feat(avocet): discard, undo, labels config, static serving — backend complete 2026-03-03 15:35:01 -08:00
5912b73705 feat(avocet): POST /api/skip endpoint 2026-03-03 15:21:32 -08:00
efd9d69692 fix(avocet): store original item in _last_action; add requirements.txt 2026-03-03 15:16:54 -08:00
ce202d97ea feat(avocet): POST /api/label endpoint 2026-03-03 15:14:04 -08:00
6556e3fef0 fix(avocet): queue_with_items fixture uses api._DATA_DIR to avoid implicit tmp_path coupling 2026-03-03 15:03:57 -08:00
8898258055 feat(avocet): GET /api/queue endpoint 2026-03-03 15:00:59 -08:00
d36d0be166 fix(avocet): _write_jsonl empty-list writes empty file; add reset_last_action helper 2026-03-03 14:36:18 -08:00
f06114e648 feat(avocet): FastAPI skeleton + JSONL helpers 2026-03-03 13:30:28 -08:00
f48590f859 feat: discard button — removes email from queue without writing to score file 2026-02-27 15:48:40 -08:00
732564ae5e fix: manage.sh restart — exec bash $0 so script path resolves correctly 2026-02-27 15:41:53 -08:00
ab764cb8f6 feat: targeted fetch — date range + sender/subject filter for historical email pulls 2026-02-27 15:15:49 -08:00
f97ef32100 fix: RerankerAdapter falls back to label name when no LABEL_DESCRIPTIONS entry 2026-02-27 14:54:31 -08:00
4c346aa328 feat: 9 labels (add event_rescheduled/unrelated/digest), wildcard Other label, InvalidCharacterError fix 2026-02-27 14:34:15 -08:00
4c659033c9 fix: fetch log — overwrite per-email progress instead of appending
status.write() per email grows the log unboundedly on big pulls.
Now uses status.empty() to create one updatable slot; per-email
progress overwrites it, cleared after each account completes.
Per-account summaries still use status.write() (one line each).
2026-02-27 14:20:57 -08:00
260c7c0f96 feat: add Settings tab with IMAP account GUI + connection test
- ⚙️ Settings tab: add/edit/remove accounts without touching YAML
- Per-account: name, host, port, SSL, username, password (masked), folder, days back
- Test connection button: connect → login → select folder → report message count
- Save writes config/label_tool.yaml; Reload discards unsaved changes
- _sync_settings_to_state() prevents index-key drift on add/remove
- _test_imap_connection() helper shared with fetch tab indirectly
- CLAUDE.md: document new tab, Settings UI design notes
2026-02-27 14:18:51 -08:00
bd4911fe58 feat: add manage.sh with port collision detection
start/stop/restart/status/logs/open for the label tool UI;
benchmark/list-models/score/compare shortcuts for the harness.

Port scan: checks lsof → ss → /dev/tcp fallback, increments from
8503 until a free port is found. PID tracked in .avocet.pid,
assigned port persisted in .avocet.port.
2026-02-27 14:10:24 -08:00
d68754d432 feat: initial avocet repo — email classifier training tool
Scrape → Store → Process pipeline for building email classifier
benchmark data across the CircuitForge menagerie.

- app/label_tool.py — Streamlit card-stack UI, multi-account IMAP fetch,
  6-bucket labeling, undo/skip, keyboard shortcuts (1-6/S/U)
- scripts/classifier_adapters.py — ZeroShotAdapter (+ two_pass),
  GLiClassAdapter, RerankerAdapter; ABC with lazy model loading
- scripts/benchmark_classifier.py — 13-model registry, --score,
  --compare, --list-models, --export-db; uses label_tool.yaml for IMAP
- tests/ — 20 tests, all passing, zero model downloads required
- config/label_tool.yaml.example — multi-account IMAP template
- data/email_score.jsonl.example — sample labeled data for CI

Labels: interview_scheduled, offer_received, rejected,
        positive_response, survey_received, neutral
2026-02-27 14:07:38 -08:00