Maestro task: 0698ae2c-f65e-408e-a9c6-198edc2c5696 (Feature 11 - Settings Home and Admin AI Assistant).
Done-condition
The AI assistant screen gains a Recipe search card: provider segmented control (SearXNG | Brave); the SearXNG URL field or a Brave API key field (masked last4 + Replace, never echoed); a Test button calling the recipe-search test endpoint that shows "Found N recipes for 'chicken tikka masala'" or the error. Saving PATCHes /api/v1/settings/recipe-search. Vitest tests with stubbed APIs cover switching providers, saving, key masking and both test outcomes. Typecheck, test and build pass.
Evidence
New Recipe search card wired to GET/PATCH /api/v1/settings/recipe-search and POST /settings/recipe-search/test; reuses the Segmented control, TextInput, Sheet and Button primitives; the Brave key is masked (last4) and never echoed.
lint:colors, typecheck, test and build pass; gofmt -l . empty; headless Chrome at 390px with faked APIs exercised Test/Brave/Add key/Save with the full key never appearing.
Notes: the SearXNG field shows the URL saved in the DB (the server exposes no separate default URL; a real default would need a backend change). No Remove key for Brave because the server refuses Brave without a key. Not tested against the real server (needs Authentik login).
Maestro task: 0698ae2c-f65e-408e-a9c6-198edc2c5696 (Feature 11 - Settings Home and Admin AI Assistant).
## Done-condition
The AI assistant screen gains a Recipe search card: provider segmented control (SearXNG | Brave); the SearXNG URL field or a Brave API key field (masked last4 + Replace, never echoed); a Test button calling the recipe-search test endpoint that shows "Found N recipes for 'chicken tikka masala'" or the error. Saving PATCHes /api/v1/settings/recipe-search. Vitest tests with stubbed APIs cover switching providers, saving, key masking and both test outcomes. Typecheck, test and build pass.
## Evidence
- New Recipe search card wired to GET/PATCH /api/v1/settings/recipe-search and POST /settings/recipe-search/test; reuses the Segmented control, TextInput, Sheet and Button primitives; the Brave key is masked (last4) and never echoed.
- lint:colors, typecheck, test and build pass; gofmt -l . empty; headless Chrome at 390px with faked APIs exercised Test/Brave/Add key/Save with the full key never appearing.
Notes: the SearXNG field shows the URL saved in the DB (the server exposes no separate default URL; a real default would need a backend change). No Remove key for Brave because the server refuses Brave without a key. Not tested against the real server (needs Authentik login).
Add a Recipe search card to /settings/ai: a SearXNG | Brave segmented
control, the SearXNG URL pre-filled from the saved settings, or the Brave
API key shown masked (last four characters) with Replace. The provider,
URL and new key are a draft saved together with PATCH
/api/v1/settings/recipe-search; Test calls the recipe-search test
endpoint and shows "Found N recipes for 'chicken tikka masala'" or the
error.
The leave-without-saving guard moves to page level so it covers both the
AI assistant form and the card; the shell test now renders in a data
router as main.tsx does.
Maestro task: 0698ae2c-f65e-408e-a9c6-198edc2c5696
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add a Recipe search card to /settings/ai: a SearXNG | Brave segmented
control, the SearXNG URL pre-filled from the saved settings, or the Brave
API key shown masked (last four characters) with Replace. The provider,
URL and new key are a draft saved together with PATCH
/api/v1/settings/recipe-search; Test calls the recipe-search test
endpoint and shows "Found N recipes for 'chicken tikka masala'" or the
error.
The leave-without-saving guard moves to page level so it covers both the
AI assistant form and the card; the shell test now renders in a data
router as main.tsx does.
Maestro task: 0698ae2c-f65e-408e-a9c6-198edc2c5696
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The service now reads the optional MEALQUEST_SEARXNG_URL, validates it at
startup like any SearXNG URL, and returns it in the recipe search settings
as the read-only default_base_url. base_url stays the saved URL only, and
PATCH is unchanged: nothing is stored until the household saves.
The recipe search card pre-fills the SearXNG URL from default_base_url
while no URL is saved, and an edit now clears the last Test result so a
stale count or error never sits beside "Save your changes to test them."
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Before recipe search is set up the card suggests SearXNG and the
deployment's URL, which differ from the unset saved values. That
suggestion marked the card dirty, so the leave guard warned about
unsaved changes the household never made. The leave guard now fires
only when the draft differs from the loaded baseline, which includes
the suggestion. Save stays enabled so the suggestion can still be
stored.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Maestro task: 0698ae2c-f65e-408e-a9c6-198edc2c5696 (Feature 11 - Settings Home and Admin AI Assistant).
Done-condition
The AI assistant screen gains a Recipe search card: provider segmented control (SearXNG | Brave); the SearXNG URL field or a Brave API key field (masked last4 + Replace, never echoed); a Test button calling the recipe-search test endpoint that shows "Found N recipes for 'chicken tikka masala'" or the error. Saving PATCHes /api/v1/settings/recipe-search. Vitest tests with stubbed APIs cover switching providers, saving, key masking and both test outcomes. Typecheck, test and build pass.
Evidence
Notes: the SearXNG field shows the URL saved in the DB (the server exposes no separate default URL; a real default would need a backend change). No Remove key for Brave because the server refuses Brave without a key. Not tested against the real server (needs Authentik login).
Independent Codex gpt-6-sol review: CHANGES_REQUIRED for this exact commit.
Independent Codex gpt-6-sol review: CHANGES_REQUIRED for this exact commit.
Independent Codex gpt-6-sol review: APPROVED for this exact commit.