feat: add context-aware meal fit engine

This commit is contained in:
OpenClaw Bot
2026-05-23 12:45:25 +02:00
parent 0bbbc1d154
commit 3ac82e65fe
5 changed files with 481 additions and 0 deletions
+23
View File
@@ -9,6 +9,7 @@ import crypto from 'node:crypto';
import * as db from '../db.js';
import { createLogger } from '../logger.js';
import { str, num, date, oneOf, collectErrors, MAX_TITLE, MAX_TEXT, MAX_SHORT } from '../middleware/validate.js';
import { generateGroceryList, scoreMealSuggestions } from '../services/meal-fit.js';
const log = createLogger('MealPlanning');
const router = express.Router();
@@ -254,6 +255,28 @@ router.put('/cook-assignments/:mealId', (req, res) => {
} catch (err) { handleError(res, err, 'PUT /cook-assignments/:mealId'); }
});
router.post('/suggestions', (req, res) => {
try {
const meals = Array.isArray(req.body?.meals) ? req.body.meals : [];
const selectedMeals = Array.isArray(req.body?.selectedMeals) ? req.body.selectedMeals : [];
const context = {
meals,
dayContext: req.body?.dayContext || req.body?.day_context || {},
preferences: Array.isArray(req.body?.preferences) ? req.body.preferences : [],
inventory: Array.isArray(req.body?.inventory) ? req.body.inventory : [],
recentMeals: Array.isArray(req.body?.recentMeals) ? req.body.recentMeals : [],
pantryStaples: Array.isArray(req.body?.pantryStaples) ? req.body.pantryStaples : [],
today: req.body?.today,
};
if (!meals.length) return res.status(400).json({ error: 'At least one meal is required.', code: 400 });
const suggestions = scoreMealSuggestions(context);
const groceryList = selectedMeals.length
? generateGroceryList(selectedMeals, { inventory: context.inventory, pantryStaples: context.pantryStaples })
: null;
res.json({ data: { suggestions, groceryList } });
} catch (err) { handleError(res, err, 'POST /suggestions'); }
});
router.get('/feedback', (req, res) => {
try {
const limit = Math.max(1, Math.min(200, Number(req.query.limit || 50)));