kiwi/app/services
pyr0ball e7ba305e63
Some checks are pending
CI / Backend (Python) (push) Waiting to run
CI / Frontend (Vue) (push) Waiting to run
Mirror / mirror (push) Waiting to run
feat: hierarchical subcategory navigation in recipe browser
Adds a two-level browse tree (domain → category → subcategory) to the
recipe browser, plus an "All" unfiltered option at the top of every
domain.

browser_domains.py:
- Category values now support list[str] (flat) or dict with "keywords"
  and "subcategories" keys — backward compatible with all existing flat
  categories
- Added subcategories to: Italian (Sicilian, Neapolitan, Tuscan, Roman,
  Venetian, Ligurian), Mexican (Oaxacan, Yucatecan, Veracruz, Street
  Food, Mole), Asian (Korean, Japanese, Chinese, Thai, Vietnamese,
  Filipino, Indonesian), Indian (North, South, Bengali, Gujarati),
  Mediterranean (Greek, Turkish, Moroccan, Lebanese, Israeli), American
  (Southern, Cajun/Creole, BBQ, Tex-Mex, New England), European
  (French, Spanish, German, British/Irish, Scandinavian), Latin American
  (Peruvian, Brazilian, Colombian, Cuban, Caribbean), Dinner, Lunch,
  Breakfast, Snack, Dessert, Chicken, Beef, Pork, Fish, Vegetables
- New helpers: category_has_subcategories, get_subcategory_names,
  get_keywords_for_subcategory

store.py:
- get_browser_categories now accepts has_subcategories_by_category and
  includes has_subcategories: bool in each result row
- New get_browser_subcategories method for subcategory count queries

recipes.py endpoints:
- GET /browse/{domain}/{category}/subcategories — returns subcategory
  list with recipe counts (registered before /{subcategory} to avoid
  path collision)
- GET /browse/{domain}/{category} gains optional ?subcategory=X param
  to narrow results within a category
- GET /browse/{domain}/{category}/_all — unfiltered paginated browse
  (landed in previous commit)

api.ts: BrowserCategory adds has_subcategories; new BrowserSubcategory
type; listSubcategories() call; browse() gains subcategory param

RecipeBrowserPanel.vue:
- Category pills show a › indicator when subcategories exist
- Selecting such a category fetches subcategories in the background
  (non-blocking — recipes load immediately at the category level)
- Subcategory row appears below the category list with an
  "All [Category]" pill + one pill per subcategory with count
- Active subcategory highlighted; clicking "All [Category]" resets
  to the full category view
2026-04-18 21:07:06 -07:00
..
community feat(community): KiwiCommunityStore + pseudonym helpers in per-user store 2026-04-13 10:54:13 -07:00
export chore: initial commit — kiwi Phase 2 complete 2026-03-30 22:20:48 -07:00
image_preprocessing chore: initial commit — kiwi Phase 2 complete 2026-03-30 22:20:48 -07:00
meal_plan docs(bsl): document cf-text/LLMRouter routing chain in llm_timing and llm_planner 2026-04-12 14:07:32 -07:00
ocr chore: bump circuitforge-core dep to >=0.8.0; fix stale resources imports 2026-04-04 22:39:04 -07:00
quality chore: initial commit — kiwi Phase 2 complete 2026-03-30 22:20:48 -07:00
recipe feat: hierarchical subcategory navigation in recipe browser 2026-04-18 21:07:06 -07:00
__init__.py chore: initial commit — kiwi Phase 2 complete 2026-03-30 22:20:48 -07:00
barcode_scanner.py feat: cloud auth bypass, VRAM leasing, barcode EXIF fix, pipeline improvements 2026-04-01 16:06:23 -07:00
expiration_predictor.py feat: wire secondary-use window hints into recipe engine (#83) 2026-04-18 19:06:53 -07:00
heimdall_orch.py feat(kiwi): add Heimdall orch budget client with fail-open semantics 2026-04-14 15:15:43 -07:00
inventory_service.py chore: initial commit — kiwi Phase 2 complete 2026-03-30 22:20:48 -07:00
openfoodfacts.py fix: barcode scan performance + timeout + success message 2026-04-16 09:57:53 -07:00
receipt_service.py chore: initial commit — kiwi Phase 2 complete 2026-03-30 22:20:48 -07:00
receipt_service_inmemory_backup.py chore: initial commit — kiwi Phase 2 complete 2026-03-30 22:20:48 -07:00