9941227fae
chore: merge main into feature/meal-planner
...
Resolves three conflicts:
- app/api/routes.py: fixed saved_recipes-before-recipes ordering from main;
meal_plans and community_router from feature branch
- app/db/store.py: meal plan/prep session methods (feature) + community
pseudonym methods (main) -- both additive
- app/tiers.py: KIWI_BYOK_UNLOCKABLE includes meal_plan_llm,
meal_plan_llm_timing (feature) and community_fork_adapt (main)
2026-04-14 14:53:52 -07:00
c02e538cb2
feat: remove assembly results from suggest() -- moved to Build Your Own tab
2026-04-14 11:39:57 -07:00
da940ebaec
feat: add get_role_candidates() and build_from_selection() to assembly engine
...
Both functions are DB-free public API additions to assembly_recipes.py.
get_role_candidates() scores pantry candidates against a wizard step using
element-profile overlap with prior picks; build_from_selection() builds a
RecipeSuggestion from explicit role overrides with required-role validation.
2026-04-14 11:06:08 -07:00
1a5fb23dfd
feat: add slug/icon/descriptor to AssemblyTemplate and get_templates_for_api()
...
Extends AssemblyTemplate dataclass with slug, icon, descriptor, and
role_hints fields. Updates all 13 template instantiations with
appropriate values. Adds _TEMPLATE_BY_SLUG lookup dict and
get_templates_for_api() serialiser for the templates endpoint.
2026-04-14 10:36:58 -07:00
65ef65bb4c
feat: add Pydantic schemas for Build Your Own tab endpoints
2026-04-14 09:45:05 -07:00
81107ed238
feat(community): KiwiCommunityStore + pseudonym helpers in per-user store
2026-04-13 10:54:13 -07:00
b1ed369ea6
feat(community): mDNS advertisement via zeroconf — defaults OFF, opt-in per a11y audit
2026-04-13 09:59:50 -07:00
f12699349b
feat(community): RSS 2.0 feed generator + ActivityPub JSON-LD scaffold
2026-04-13 09:44:51 -07:00
74c7272a50
feat(community): element snapshot — SFAH scores, allergen detection, dietary tags
2026-04-13 09:19:57 -07:00
25027762cf
feat(services): add prep_scheduler — sequences batch cooking tasks by equipment priority
2026-04-12 13:14:54 -07:00
4459b1ab7e
feat(services): add shopping_list service with pantry diff
...
refs kiwi#68
2026-04-12 13:14:08 -07:00
3016efa65b
fix: address recipe/OCR quality issues from review
2026-04-02 12:41:59 -07:00
22e57118df
feat: add DocuvisionClient + cf-docuvision fast-path for OCR
...
Introduces a thin HTTP client for the cf-docuvision service and wires it
as a fast path in VisionLanguageOCR.extract_receipt_data(). When CF_ORCH_URL
is set, the pipeline attempts docuvision allocation via CFOrchClient before
loading the heavy local VLM; falls back gracefully if unavailable.
2026-04-02 12:33:05 -07:00
9371df1c95
feat: recipe engine Phase 3 — StyleAdapter, LLM levels 3-4, user settings
...
Task 13: StyleAdapter with 5 cuisine templates (Italian, Latin, East Asian,
Eastern European, Mediterranean). Each template includes weighted method_bias
(sums to 1.0), element-filtered aromatics/depth/structure helpers, and
seasoning/finishing-fat vectors. StyleTemplate is a fully immutable frozen
dataclass with tuple fields.
Task 14: LLMRecipeGenerator for Levels 3 and 4. Level 3 builds a structured
element-scaffold prompt; Level 4 generates a minimal wildcard prompt (<1500
chars). Allergy hard-exclusion wired through RecipeRequest.allergies into
both prompt builders and the generate() call path. Parsed LLM response
(title, ingredients, directions, notes) fully propagated to RecipeSuggestion.
Task 15: User settings key-value store. Migration 012 adds user_settings
table. Store.get_setting / set_setting with upsert. GET/PUT /settings/{key}
endpoints with Pydantic SettingBody, key allowlist, get_session dependency.
RecipeEngine reads cooking_equipment from settings when hard_day_mode=True.
55 tests passing.
2026-03-31 14:15:18 -07:00
0d65744cb6
feat: StyleAdapter — 5 cuisine templates with element dimension biasing
2026-03-31 12:54:42 -07:00
e8fb57f6a2
feat: RecipeEngine Level 1-2 — grocery links + affiliate deeplink builder
...
Add GroceryLink schema model and grocery_links field to RecipeResult.
Introduce GroceryLinkBuilder service (Amazon Fresh, Walmart, Instacart)
using env-var affiliate tags; no links emitted when tags are absent.
Wire link builder into RecipeEngine.suggest() for levels 1-2.
Add test_grocery_links_free_tier to verify structure contract.
35 tests passing.
2026-03-31 12:23:07 -07:00
37737b06de
feat: RecipeEngine Level 1-2 — corpus match, substitution, grocery list, hard day mode
2026-03-31 11:50:28 -07:00
3527d61655
fix: test fixture — add protein_delta to substitution_pairs inserts
2026-03-30 23:16:15 -07:00
96850c6d2a
feat: SubstitutionEngine — deterministic swap candidates with compensation hints
2026-03-30 23:13:49 -07:00
e57ae74e27
fix: staple library — consistent tofu_firm slug, load error handling, typed yield_formats, expanded test coverage
2026-03-30 23:10:51 -07:00
a03807951b
fix: ElementClassifier — guard empty input, safe JSON decode, dedup heuristic elements, strengthen test assertions
2026-03-30 23:10:49 -07:00
e377bd85aa
feat: ElementClassifier -- ingredient element tagging with heuristic fallback
2026-03-30 22:59:46 -07:00