- _user_yaml_path(): remove dangerous fallback to /devl/job-seeker/
config/user.yaml (Meg's legacy profile); a missing user.yaml now
returns an empty dict via load_user_profile, never another user's data
- RESUME_PATH: replace hardcoded relative Path('config/plain_text_
resume.yaml') with _resume_path() that derives from _user_yaml_path()
so resume file is always co-located with the correct user.yaml
- upload_resume: was passing a file path string to structure_resume()
which expects raw text; now extracts bytes, dispatches to the correct
extractor (pdf/odt/docx), then passes text — matches Streamlit wizard
- WizardResumeStep.vue: upload response is {ok, data: {experience…}}
but component was reading data.experience (top level); fixed to
read resp.data.experience to match the actual API envelope
New endpoints:
- GET /api/wizard/status — resume-after-refresh; returns wizard_step + saved_data
- POST /api/wizard/step — persist step data; side effects per step
(step 3: plain_text_resume.yaml, step 5: .env keys,
step 6: search_profiles.yaml)
- GET /api/wizard/hardware — GPU detection + profile suggestion
- POST /api/wizard/inference/test — soft-fail Ollama/LLM connectivity check
- POST /api/wizard/complete — set wizard_complete=true, apply service URLs
Updated:
- GET /api/config/app now includes wizardComplete (from user.yaml) and isDemo
(from DEMO_MODE env) so the Vue nav guard can gate on a single config fetch
30 tests, all passing