Commit graph

320 commits

Author SHA1 Message Date
437a9c3f55 docs: add Survey Assistant Vue SPA design spec 2026-03-20 22:43:57 -07:00
e4f4b0c67f fix: contacts fetch error degrades partially, not full panel blank
Contacts 5xx no longer early-returns from fetchFor, leaving the entire
right panel blank. A new contactsError ref surfaces the failure message
in the Email tab only; JD tab, Cover Letter tab, and match score all
render normally. Adds test asserting partial degradation behavior.
2026-03-20 19:16:03 -07:00
fc645d276f fix: aria-label binding, dead import, guardAndLoad network error handling
- Fix 1: Add missing `:` binding prefix to aria-label on score badge
  (was emitting literal backtick template string to DOM)
- Fix 2: Remove unused `watch` import from InterviewPrepView.vue
- Fix 3: guardAndLoad now checks interviewsStore.error after fetchAll;
  shows pageError banner instead of silently redirecting to /interviews
  on network failure; job is now a ref set explicitly in the guard
- Fix 4: Remove unconditional research-badge from InterviewCard.vue
  (added in this branch; card has no access to prep store so badge
  always showed regardless of whether research exists)
2026-03-20 18:57:41 -07:00
048edb6cb4 fix: hide Prep button on hired stage cards 2026-03-20 18:51:18 -07:00
e89fe51041 feat: implement interview prep view with two-column layout
Two-column desktop layout (40/60 split, sticky left panel):
- Left: job header with stage badge, interview countdown chip, research
  controls (generate/spinner/refresh/retry), and research sections
  (talking points, company, leadership, tech, funding, red flags, A11y)
- Right: tabbed panel (JD + match score/keyword gaps, email history,
  cover letter) plus locally-persisted call notes via @vueuse/core
- Mobile (≤1023px): single-column, left content first
- Routing guard: redirects to /interviews if no id, job not found, or
  wrong status; calls prepStore.fetchFor on mount, clear on unmount
2026-03-20 18:48:38 -07:00
3aed304434 fix: guard generateResearch against POST failure, surface partial fetch errors
- Check error from POST /research/generate; only start pollTask on success to prevent unresolvable polling intervals
- Surface contacts and fullJob fetch errors in fetchFor; silently ignore research 404 (expected when no research yet)
- Remove redundant type assertions (as Contact[], as TaskStatus, as FullJobDetail)
- Add @internal JSDoc to pollTask
- Remove redundant vi.runAllTimersAsync() after vi.advanceTimersByTimeAsync(3000) in test
2026-03-20 18:44:11 -07:00
dc21e730d9 refactor: use existing useApi composable in prep store, remove duplicate
Delete useApiFetch.ts wrapper (returned T|null) and update prep.ts and
prep.test.ts to import useApiFetch from useApi.ts directly, destructuring
{ data, error } to match the established pattern used by all other stores.
2026-03-20 18:40:33 -07:00
44adfd6691 feat: add prep store with research polling
Adds usePrepStore (Pinia) for interview prep data: parallel fetch of
research brief, contacts, task status, and full job detail; setInterval-
based polling that stops on completion and re-fetches; clear() cancels
the interval and resets all state. Also adds useApiFetch composable
wrapper (returns T|null directly) used by the store.
2026-03-20 18:36:19 -07:00
0ef8547c99 refactor: use _get_db() pattern in get_research_brief, fix HTTPException style
- Replace lazy import + scripts.db.get_research with inline SQL via _get_db(),
  matching the pattern used by research_task_status and get_job_contacts
- Exclude raw_output from SELECT instead of post-fetch pop
- Change HTTPException in generate_research to positional-arg style
- Update test_get_research_found/not_found to patch dev_api._get_db
2026-03-20 18:32:02 -07:00
dc158ba802 feat: add research and contacts endpoints for interview prep 2026-03-20 18:18:39 -07:00
26484f111c docs: add interview prep Vue implementation plan 2026-03-20 18:00:07 -07:00
0e1dd29938 docs: add interview prep Vue SPA design spec 2026-03-20 17:46:05 -07:00
b9ef1f631e fix: prefer HTML body in imap_sync, strip head/style/script, remove 4000-char truncation
Some checks failed
CI / test (pull_request) Failing after 25s
- _parse_message now prefers text/html over text/plain so digest emails
  retain href attribute values needed for link extraction
- Strip <head>, <style>, <script> blocks before storing to remove CSS/JS
  garbage while keeping anchor tags intact
- Remove [:4000] truncation — digest emails need full body for URL regex
- Update test: large body should NOT be truncated (assert len == 10_000)
2026-03-20 13:35:30 -07:00
8c3c0340ff fix: bootstrap digest store on app mount for correct badge count on load
Some checks failed
CI / test (pull_request) Failing after 36s
2026-03-20 10:27:13 -07:00
dd790615e0 fix: add error feedback and keyboard accessibility to DigestView 2026-03-20 10:16:24 -07:00
d624bc5d77 feat: add DigestView with expand/extract/queue UI 2026-03-20 10:12:45 -07:00
394261cde1 fix: bind aria-label on nav badge span (was static string, not template expression) 2026-03-20 10:10:10 -07:00
16b0e51654 feat: add Digest tab to nav and router 2026-03-20 10:07:12 -07:00
d76e74c200 style: use void instead of .catch on fire-and-forget digest-queue call 2026-03-20 10:06:04 -07:00
4cf1e53901 feat: fire digest-queue add call from digest chip handler 2026-03-20 09:58:16 -07:00
30d668f692 fix: add error rollback and error state hygiene in digest store 2026-03-20 09:56:22 -07:00
bc4d6df8f0 feat: add digest Pinia store 2026-03-20 09:52:52 -07:00
dcd41d74fc style: pass Path(DB_PATH) to insert_job for type consistency 2026-03-20 09:51:35 -07:00
12ff809bd5 feat: add queue-jobs and delete digest endpoints 2026-03-20 07:44:19 -07:00
4873201242 fix: guard extract_digest_links db.close(), remove domain-in-path false positive, add hint assertion 2026-03-20 07:04:24 -07:00
aee8038be9 feat: add /extract-links endpoint with URL scoring 2026-03-20 06:59:26 -07:00
b718439c54 fix: guard db.close() in add_to_digest_queue with try/finally 2026-03-20 06:54:50 -07:00
641ea3da53 feat: add GET/POST /api/digest-queue endpoints 2026-03-20 02:51:17 -07:00
7d9be91aab fix: fix indentation and add try/finally in digest startup 2026-03-20 02:36:23 -07:00
b56ad40c9e feat: add digest_queue table to schema and dev-api startup 2026-03-20 02:34:41 -07:00
11a8441fed docs: add digest queue implementation plan 2026-03-20 02:19:44 -07:00
24a16ee4b0 docs: add digest scrape queue design spec 2026-03-19 20:28:23 -07:00
d2dd902482 feat(signals): add Unrelated and Digest reclassify chips to InterviewsView 2026-03-19 20:01:08 -07:00
9d03cb55a9 feat(signals): add Unrelated and Digest reclassify chips to InterviewCard 2026-03-19 20:00:27 -07:00
d10093cfa0 feat(signals): strip HTML and normalize whitespace from email bodies 2026-03-19 19:59:59 -07:00
eff68791f4 feat(interviews): paginate applied list (10 per page) 2026-03-19 19:45:59 -07:00
fbb1b1ef3b fix(signals): add .stop modifiers and aria-labels to pre-list signal banner buttons 2026-03-19 19:35:15 -07:00
f62c103654 feat(signals): expandable body + reclassify chips in InterviewsView pre-list 2026-03-19 19:31:23 -07:00
b52d7c0f5b fix(signals): per-signal expand state, error rollback, type safety in InterviewCard 2026-03-19 19:26:36 -07:00
b973469bc4 feat(signals): expandable body + reclassify chips in InterviewCard 2026-03-19 19:22:10 -07:00
b20fef6c03 feat(signals): add body and from_addr to StageSignal interface 2026-03-19 19:19:27 -07:00
353c07cf92 fix(signals): capture rowcount after commit in reclassify_signal (consistency) 2026-03-19 19:18:43 -07:00
86d56ee2eb feat(signals): add body/from_addr to signal query; add reclassify endpoint 2026-03-19 19:14:11 -07:00
e8b47fa60a plan: signal banner redesign — expandable email + reclassify chips 2026-03-19 17:22:46 -07:00
f4dd99a136 docs: fix signal banner spec — neutral two-call path, Map reactivity, type union notes 2026-03-19 17:12:19 -07:00
168d2b7a4a docs: spec for signal banner expandable email and re-classification UI 2026-03-19 17:07:55 -07:00
22e45575b7 feat(interviews): collapsible Applied section, email sync pill, pre-list signal banners 2026-03-19 16:38:05 -07:00
fb3e5b7532 feat(interviews): add stage signal banners and extend move emit in InterviewCard 2026-03-19 16:31:33 -07:00
dd151f1afc feat(interviews): add preSelectedStage prop to MoveToSheet 2026-03-19 16:25:48 -07:00
6ea2fc5346 feat(interviews): export StageSignal interface; add stage_signals to PipelineJob 2026-03-19 16:22:59 -07:00