wellness-nourish 0.2.10 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +75 -0
- package/dist/constants.d.ts +3 -3
- package/dist/constants.js +1 -1
- package/dist/constants.js.map +1 -1
- package/dist/providers/br-local.js +2 -1
- package/dist/providers/br-local.js.map +1 -1
- package/dist/services/coach.js +142 -8
- package/dist/services/coach.js.map +1 -1
- package/dist/services/meal-estimator.d.ts +2 -0
- package/dist/services/meal-estimator.js +108 -21
- package/dist/services/meal-estimator.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/docs/audit-2026-05-08.md +385 -0
- package/package.json +4 -2
- package/server.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,81 @@ this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.3.1] - 2026-05-08
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- Refresh audited lockfile transitive dependencies after the `0.3.0`
|
|
14
|
+
merge train: `express-rate-limit` now resolves to `8.5.1` and
|
|
15
|
+
`ip-address` to `10.2.0`, clearing the production `npm audit` gate.
|
|
16
|
+
|
|
17
|
+
## [0.3.0] - 2026-05-08
|
|
18
|
+
|
|
19
|
+
🌱 **Cross-connector wellness coaching release.** Closes the audit-trail
|
|
20
|
+
gap from 2026-05-08 and lands the first MCP nutrition coach that
|
|
21
|
+
*reasons* over wearable signals (not just echoes them).
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
|
|
25
|
+
- 🆕 **Wearable-aware coach reasoning** (PR #16). `coach.ts` now reads
|
|
26
|
+
`wellness_context` / `training_context` from `wearable_context` and
|
|
27
|
+
routes suggestions through 4 wearable rules in precedence order
|
|
28
|
+
before falling through to existing logic:
|
|
29
|
+
- **Rule 1 — poor recovery** (`recovery_score < 50` OR
|
|
30
|
+
`body_battery < 30`): suggest light, anti-inflammatory,
|
|
31
|
+
easy-digestion meal. *"sopa de legumes com peito de frango
|
|
32
|
+
desfiado e gengibre."*
|
|
33
|
+
- **Rule 4 — high recent training load**: recovery-focused meal.
|
|
34
|
+
*"salmão grelhado, batata doce e brócolis no vapor."*
|
|
35
|
+
- **Rule 3 — high strain in pre_workout mode**: carb bias.
|
|
36
|
+
*"tapioca grande com banana e mel, cafezinho."*
|
|
37
|
+
- **Rule 2 — high recovery + protein focus or post-workout**: higher
|
|
38
|
+
protein. *"200g picanha grelhada, arroz, feijão e salada."*
|
|
39
|
+
- **Rules 5/6 — protein gap / mode defaults**: existing fallback.
|
|
40
|
+
- Reason text now mentions the signal that fired (e.g. "Recovery 35%
|
|
41
|
+
from whoop — choosing easy-digestion option") so the calling agent
|
|
42
|
+
stays honest about why the suggestion changed.
|
|
43
|
+
- `extractWearableSignals()` uses explicit `typeof === "number"`
|
|
44
|
+
guards; malformed input degrades to "no rule fires" instead of
|
|
45
|
+
throwing.
|
|
46
|
+
- **No schema changes** — `wearable_context` was already
|
|
47
|
+
`z.record(z.string(), z.unknown())`, so the new fields are
|
|
48
|
+
accepted as-is.
|
|
49
|
+
- 🆕 **`scripts/test-coach-wearable.mjs`** — covers all 4 wearable
|
|
50
|
+
rules, the precedence guard (poor recovery beats high training
|
|
51
|
+
load when both apply), and the empty-context fallback.
|
|
52
|
+
|
|
53
|
+
### Changed
|
|
54
|
+
|
|
55
|
+
- **`displayNamePtBr` 100% coverage** (PR #17). Moved from 12/35 →
|
|
56
|
+
35/35 entries in `SIMPLE_FOODS`. Every food now carries an explicit
|
|
57
|
+
pt-BR display name even when the canonical is already pt-BR. Added
|
|
58
|
+
pt-BR plural aliases: `ovos`, `maçãs`, `tapiocas`, `coxinhas`,
|
|
59
|
+
`brigadeiros`, `pães de queijo`, `fatias de pão`, `pães`,
|
|
60
|
+
`batatas doces`, `peixes grelhados`, `picanhas`, `costelas`,
|
|
61
|
+
`feijoadas`, `farofas`, `vinagretes`, `iogurtes naturais`,
|
|
62
|
+
`iogurtes`, `alcatras`, `cafezinhos`, `queijos minas`,
|
|
63
|
+
`queijos coalho`.
|
|
64
|
+
- **`scripts/test-display-names.mjs`** new test asserts every food
|
|
65
|
+
has non-empty `displayNamePtBr` and contains no English-only words
|
|
66
|
+
(chicken / rice / salad heuristic). Wired into the `test` chain.
|
|
67
|
+
|
|
68
|
+
### Documentation
|
|
69
|
+
|
|
70
|
+
- 📝 **`docs/audit-2026-05-08.md`** (PR #15) — 385-line deep quality
|
|
71
|
+
audit committed to the repo so the findings of the 2026-05-08
|
|
72
|
+
campaign survive context compaction. Covers 13 bugs, 5 features,
|
|
73
|
+
1 CVE-class fix, cross-MCP standard, test coverage assessment,
|
|
74
|
+
and 9 prioritized follow-up gaps.
|
|
75
|
+
|
|
76
|
+
### Notes
|
|
77
|
+
|
|
78
|
+
- All previous tests still pass — wearable reasoning is additive
|
|
79
|
+
and callers passing no `wearable_context` keep working unchanged.
|
|
80
|
+
- Tool count unchanged at 38 (no new tools, only smarter routing).
|
|
81
|
+
- `package.json` `test` chain extended with `test:coach-wearable`
|
|
82
|
+
and `test:display-names`; full chain remains green on Node 20/22/24.
|
|
83
|
+
|
|
9
84
|
## [0.2.10] - 2026-05-08
|
|
10
85
|
|
|
11
86
|
### Fixed
|
package/dist/constants.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
export declare const SERVER_NAME = "nourish-mcp";
|
|
2
|
-
export declare const SERVER_VERSION = "0.
|
|
2
|
+
export declare const SERVER_VERSION = "0.3.1";
|
|
3
3
|
export declare const NPM_PACKAGE_NAME = "wellness-nourish";
|
|
4
|
-
export declare const PINNED_NPM_PACKAGE = "wellness-nourish@0.
|
|
4
|
+
export declare const PINNED_NPM_PACKAGE = "wellness-nourish@0.3.1";
|
|
5
5
|
export declare const DEFAULT_HOST = "127.0.0.1";
|
|
6
6
|
export declare const DEFAULT_PORT = 3000;
|
|
7
7
|
export declare const LOCAL_DIR_NAME = ".wellness-nourish";
|
|
8
|
-
export declare const USER_AGENT = "wellness-nourish/0.
|
|
8
|
+
export declare const USER_AGENT = "wellness-nourish/0.3.1 (https://wellness.delx.ai; contact: david@delx.ai)";
|
|
9
9
|
export declare const USDA_BASE_URL = "https://api.nal.usda.gov/fdc/v1";
|
|
10
10
|
export declare const OFF_BASE_URL = "https://world.openfoodfacts.org";
|
package/dist/constants.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export const SERVER_NAME = "nourish-mcp";
|
|
2
|
-
export const SERVER_VERSION = "0.
|
|
2
|
+
export const SERVER_VERSION = "0.3.1";
|
|
3
3
|
export const NPM_PACKAGE_NAME = "wellness-nourish";
|
|
4
4
|
export const PINNED_NPM_PACKAGE = `${NPM_PACKAGE_NAME}@${SERVER_VERSION}`;
|
|
5
5
|
export const DEFAULT_HOST = "127.0.0.1";
|
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC;AACzC,MAAM,CAAC,MAAM,cAAc,GAAG,
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC;AACzC,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;AACtC,MAAM,CAAC,MAAM,gBAAgB,GAAG,kBAAkB,CAAC;AACnD,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,gBAAgB,IAAI,cAAc,EAAE,CAAC;AAC1E,MAAM,CAAC,MAAM,YAAY,GAAG,WAAW,CAAC;AACxC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC;AACjC,MAAM,CAAC,MAAM,cAAc,GAAG,mBAAmB,CAAC;AAClD,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,gBAAgB,IAAI,cAAc,qDAAqD,CAAC;AACrH,MAAM,CAAC,MAAM,aAAa,GAAG,iCAAiC,CAAC;AAC/D,MAAM,CAAC,MAAM,YAAY,GAAG,iCAAiC,CAAC"}
|
|
@@ -33,7 +33,8 @@ function mapSimpleFood(food) {
|
|
|
33
33
|
source: "estimate",
|
|
34
34
|
source_id: sourceId,
|
|
35
35
|
source_url: "https://wellness.delx.ai/nutrition",
|
|
36
|
-
name: food.canonical,
|
|
36
|
+
name: food.displayNamePtBr ?? food.canonical,
|
|
37
|
+
display_name_pt_br: food.displayNamePtBr ?? food.canonical,
|
|
37
38
|
locale: "pt-BR",
|
|
38
39
|
serving: {
|
|
39
40
|
quantity: 1,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"br-local.js","sourceRoot":"","sources":["../../src/providers/br-local.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,EAAE,eAAe,EAAmB,MAAM,+BAA+B,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAGlE,MAAM,gBAAgB,GAAG;IACvB,IAAI,EAAE,mCAAmC;IACzC,WAAW,EAAE,0GAA0G;IACvH,WAAW,EAAE,KAAK;IAClB,GAAG,EAAE,oCAAoC;CACjC,CAAC;AAQX,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,KAAa,EACb,KAAK,GAAG,EAAE;IAEV,MAAM,eAAe,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,eAAe,EAAE;SAC5B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACd,IAAI;QACJ,KAAK,EAAE,cAAc,CAAC,eAAe,EAAE,IAAI,CAAC;KAC7C,CAAC,CAAC;SACF,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC;SACpC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;SAC/C,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;SACf,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAE7C,OAAO;QACL,QAAQ,EAAE,UAAU;QACpB,KAAK;QACL,QAAQ,EAAE;YACR,0FAA0F;SAC3F;KACF,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,IAAgB;IACrC,MAAM,QAAQ,GAAG,YAAY,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;IAC9D,MAAM,QAAQ,GAAmC;QAC/C,EAAE,EAAE,UAAU,CAAC,UAAU,EAAE,QAAQ,CAAC;QACpC,MAAM,EAAE,UAAU;QAClB,SAAS,EAAE,QAAQ;QACnB,UAAU,EAAE,oCAAoC;QAChD,IAAI,EAAE,IAAI,CAAC,SAAS;
|
|
1
|
+
{"version":3,"file":"br-local.js","sourceRoot":"","sources":["../../src/providers/br-local.ts"],"names":[],"mappings":"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"}
|
package/dist/services/coach.js
CHANGED
|
@@ -25,11 +25,11 @@ export async function buildNutritionCoach(input) {
|
|
|
25
25
|
suggested_next_meal: {
|
|
26
26
|
text: suggestionText,
|
|
27
27
|
meal_type: input.meal_type ?? suggestedMealType(input.mode),
|
|
28
|
-
reason: suggestionReason(input
|
|
28
|
+
reason: suggestionReason(input, summary),
|
|
29
29
|
estimated_nutrients: suggestion.total_nutrients,
|
|
30
30
|
confidence: suggestion.confidence,
|
|
31
31
|
},
|
|
32
|
-
next_actions: nextActions(input
|
|
32
|
+
next_actions: nextActions(input, summary, memory.remembered_meals.length),
|
|
33
33
|
reminders: [
|
|
34
34
|
"Preview and confirm before logging any suggested meal.",
|
|
35
35
|
"Use this as personal tracking context, not medical advice.",
|
|
@@ -105,6 +105,11 @@ const SUGGESTION_TABLE = {
|
|
|
105
105
|
low_protein: "150g peito de frango grelhado, arroz branco e salada simples",
|
|
106
106
|
low_calories: "tapioca com queijo minas e banana",
|
|
107
107
|
default: "arroz branco, feijão carioca, frango grelhado e salada simples",
|
|
108
|
+
// Wearable-aware additions (delx-wellness-context/v1).
|
|
109
|
+
wearable_poor_recovery: "sopa de legumes com peito de frango desfiado e gengibre",
|
|
110
|
+
wearable_high_recovery_protein: "200g picanha grelhada, arroz, feijão e salada",
|
|
111
|
+
wearable_pre_workout_high_strain: "tapioca grande com banana e mel, cafezinho",
|
|
112
|
+
wearable_high_training_load: "salmão grelhado, batata doce e brócolis no vapor",
|
|
108
113
|
},
|
|
109
114
|
"en-US": {
|
|
110
115
|
pre_workout_nutrition: "banana, oats and black coffee",
|
|
@@ -113,6 +118,11 @@ const SUGGESTION_TABLE = {
|
|
|
113
118
|
low_protein: "150g grilled chicken breast, white rice and a simple salad",
|
|
114
119
|
low_calories: "oatmeal with peanut butter and banana",
|
|
115
120
|
default: "white rice, black beans, grilled chicken and a simple salad",
|
|
121
|
+
// Wearable-aware additions (delx-wellness-context/v1).
|
|
122
|
+
wearable_poor_recovery: "vegetable soup with shredded chicken breast and ginger",
|
|
123
|
+
wearable_high_recovery_protein: "200g grilled top sirloin, rice, beans and salad",
|
|
124
|
+
wearable_pre_workout_high_strain: "large tapioca with banana and honey, black coffee",
|
|
125
|
+
wearable_high_training_load: "grilled salmon, sweet potato and steamed broccoli",
|
|
116
126
|
},
|
|
117
127
|
};
|
|
118
128
|
function suggestionFor(locale, key) {
|
|
@@ -129,7 +139,120 @@ function normalizeLocale(locale) {
|
|
|
129
139
|
return "en-US";
|
|
130
140
|
return trimmed;
|
|
131
141
|
}
|
|
142
|
+
function extractWearableSignals(context) {
|
|
143
|
+
if (context === undefined) {
|
|
144
|
+
return {
|
|
145
|
+
source: undefined,
|
|
146
|
+
recoveryScore: undefined,
|
|
147
|
+
hrv: undefined,
|
|
148
|
+
strain: undefined,
|
|
149
|
+
bodyBattery: undefined,
|
|
150
|
+
trainingLoad: undefined,
|
|
151
|
+
relativeEffort: undefined,
|
|
152
|
+
contextType: undefined,
|
|
153
|
+
sorenessHint: undefined,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
const source = typeof context.source === "string" ? context.source : undefined;
|
|
157
|
+
const recoveryScore = typeof context.recovery_score === "number" ? context.recovery_score : undefined;
|
|
158
|
+
const hrv = typeof context.hrv_ms === "number" ? context.hrv_ms : undefined;
|
|
159
|
+
const strain = typeof context.strain_score === "number" ? context.strain_score : undefined;
|
|
160
|
+
const bodyBattery = typeof context.body_battery === "number" ? context.body_battery : undefined;
|
|
161
|
+
const relativeEffort = typeof context.relative_effort === "number" ? context.relative_effort : undefined;
|
|
162
|
+
const contextType = typeof context.context_type === "string" ? context.context_type : undefined;
|
|
163
|
+
const sorenessHint = typeof context.soreness_hint === "string" ? context.soreness_hint : undefined;
|
|
164
|
+
const rawLoad = context.recent_training_load;
|
|
165
|
+
const trainingLoad = rawLoad === "low" || rawLoad === "normal" || rawLoad === "high" || rawLoad === "unknown"
|
|
166
|
+
? rawLoad
|
|
167
|
+
: undefined;
|
|
168
|
+
return {
|
|
169
|
+
source,
|
|
170
|
+
recoveryScore,
|
|
171
|
+
hrv,
|
|
172
|
+
strain,
|
|
173
|
+
bodyBattery,
|
|
174
|
+
trainingLoad,
|
|
175
|
+
relativeEffort,
|
|
176
|
+
contextType,
|
|
177
|
+
sorenessHint,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
function applyWearableRules(input, signals) {
|
|
181
|
+
// Rule 1: poor recovery — highest precedence.
|
|
182
|
+
const poorRecovery = (signals.recoveryScore !== undefined && signals.recoveryScore < 50) ||
|
|
183
|
+
(signals.bodyBattery !== undefined && signals.bodyBattery < 30);
|
|
184
|
+
if (poorRecovery) {
|
|
185
|
+
return "poor_recovery";
|
|
186
|
+
}
|
|
187
|
+
// Rule 4: recent training load = high — recovery-focused regardless of mode.
|
|
188
|
+
if (signals.trainingLoad === "high") {
|
|
189
|
+
return "high_training_load";
|
|
190
|
+
}
|
|
191
|
+
// Rule 3: pre-workout + high strain → carb bias.
|
|
192
|
+
const highStrain = (signals.strain !== undefined && signals.strain > 17) ||
|
|
193
|
+
(signals.relativeEffort !== undefined && signals.relativeEffort > 200);
|
|
194
|
+
if (input.mode === "pre_workout_nutrition" && highStrain) {
|
|
195
|
+
return "pre_workout_high_strain";
|
|
196
|
+
}
|
|
197
|
+
// Rule 2: high recovery + protein focus / post-workout.
|
|
198
|
+
const highRecovery = (signals.recoveryScore !== undefined && signals.recoveryScore >= 75) ||
|
|
199
|
+
(signals.bodyBattery !== undefined && signals.bodyBattery >= 70);
|
|
200
|
+
const proteinOrPostWorkout = input.focus === "protein" || input.mode === "after_log_review";
|
|
201
|
+
if (highRecovery && proteinOrPostWorkout) {
|
|
202
|
+
return "high_recovery_protein";
|
|
203
|
+
}
|
|
204
|
+
return undefined;
|
|
205
|
+
}
|
|
206
|
+
function suggestionKeyForRule(rule) {
|
|
207
|
+
switch (rule) {
|
|
208
|
+
case "poor_recovery":
|
|
209
|
+
return "wearable_poor_recovery";
|
|
210
|
+
case "high_recovery_protein":
|
|
211
|
+
return "wearable_high_recovery_protein";
|
|
212
|
+
case "pre_workout_high_strain":
|
|
213
|
+
return "wearable_pre_workout_high_strain";
|
|
214
|
+
case "high_training_load":
|
|
215
|
+
return "wearable_high_training_load";
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
function reasonForWearableRule(rule, signals) {
|
|
219
|
+
const sourceLabel = signals.source ?? "wearable";
|
|
220
|
+
switch (rule) {
|
|
221
|
+
case "poor_recovery": {
|
|
222
|
+
if (signals.recoveryScore !== undefined) {
|
|
223
|
+
return `Recovery ${signals.recoveryScore}% from ${sourceLabel} — choosing easy-digestion, anti-inflammatory option.`;
|
|
224
|
+
}
|
|
225
|
+
if (signals.bodyBattery !== undefined) {
|
|
226
|
+
return `Body Battery ${signals.bodyBattery} from ${sourceLabel} — choosing easy-digestion, anti-inflammatory option.`;
|
|
227
|
+
}
|
|
228
|
+
return `Recovery indicators are low — choosing easy-digestion, anti-inflammatory option.`;
|
|
229
|
+
}
|
|
230
|
+
case "high_recovery_protein": {
|
|
231
|
+
const detail = signals.recoveryScore !== undefined
|
|
232
|
+
? `recovery ${signals.recoveryScore}%`
|
|
233
|
+
: signals.bodyBattery !== undefined
|
|
234
|
+
? `Body Battery ${signals.bodyBattery}`
|
|
235
|
+
: "high recovery";
|
|
236
|
+
return `High recovery and protein focus (${sourceLabel}, ${detail}) — supporting muscle synthesis.`;
|
|
237
|
+
}
|
|
238
|
+
case "pre_workout_high_strain": {
|
|
239
|
+
const detail = signals.strain !== undefined
|
|
240
|
+
? `strain ${signals.strain}`
|
|
241
|
+
: signals.relativeEffort !== undefined
|
|
242
|
+
? `relative effort ${signals.relativeEffort}`
|
|
243
|
+
: "elevated strain";
|
|
244
|
+
return `Pre-workout with elevated strain (${sourceLabel}, ${detail}) — bias to carbohydrate availability.`;
|
|
245
|
+
}
|
|
246
|
+
case "high_training_load":
|
|
247
|
+
return `Recent training load is high (${sourceLabel}) — supporting glycogen and protein recovery.`;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
132
250
|
function chooseSuggestionText(input, summary) {
|
|
251
|
+
const signals = extractWearableSignals(input.wearable_context);
|
|
252
|
+
const wearableRule = applyWearableRules(input, signals);
|
|
253
|
+
if (wearableRule !== undefined) {
|
|
254
|
+
return suggestionFor(input.locale, suggestionKeyForRule(wearableRule));
|
|
255
|
+
}
|
|
133
256
|
if (input.mode === "pre_workout_nutrition") {
|
|
134
257
|
return suggestionFor(input.locale, "pre_workout_nutrition");
|
|
135
258
|
}
|
|
@@ -145,11 +268,16 @@ function chooseSuggestionText(input, summary) {
|
|
|
145
268
|
}
|
|
146
269
|
return suggestionFor(input.locale, "default");
|
|
147
270
|
}
|
|
148
|
-
function suggestionReason(
|
|
149
|
-
|
|
271
|
+
function suggestionReason(input, summary) {
|
|
272
|
+
const signals = extractWearableSignals(input.wearable_context);
|
|
273
|
+
const wearableRule = applyWearableRules(input, signals);
|
|
274
|
+
if (wearableRule !== undefined) {
|
|
275
|
+
return reasonForWearableRule(wearableRule, signals);
|
|
276
|
+
}
|
|
277
|
+
if (input.mode === "pre_workout_nutrition") {
|
|
150
278
|
return "Light carbohydrate-focused option for training context.";
|
|
151
279
|
}
|
|
152
|
-
if (mode === "evening_checkin") {
|
|
280
|
+
if (input.mode === "evening_checkin") {
|
|
153
281
|
return "Late-day option chosen to close protein or hydration gaps without assuming a full meal.";
|
|
154
282
|
}
|
|
155
283
|
if ((summary.goal_progress.protein_g?.percent ?? 100) < 70) {
|
|
@@ -157,20 +285,26 @@ function suggestionReason(mode, summary) {
|
|
|
157
285
|
}
|
|
158
286
|
return "Balanced Brazilian meal pattern with trackable portions.";
|
|
159
287
|
}
|
|
160
|
-
function nextActions(
|
|
288
|
+
function nextActions(input, summary, rememberedMealCount) {
|
|
161
289
|
const actions = [
|
|
162
290
|
"Ask the user whether they want to log the suggested meal before calling nourish_log_intake.",
|
|
163
291
|
];
|
|
292
|
+
const signals = extractWearableSignals(input.wearable_context);
|
|
293
|
+
const wearableRule = applyWearableRules(input, signals);
|
|
294
|
+
if (wearableRule !== undefined) {
|
|
295
|
+
const sourceLabel = signals.source ?? "wearable";
|
|
296
|
+
actions.push(`Wearable signals were used in this suggestion (source: ${sourceLabel}); confirm before logging.`);
|
|
297
|
+
}
|
|
164
298
|
if (Object.keys(summary.goal_progress).length === 0) {
|
|
165
299
|
actions.push("Set calorie, protein, and hydration goals for better coaching.");
|
|
166
300
|
}
|
|
167
301
|
if (rememberedMealCount === 0) {
|
|
168
302
|
actions.push("Remember frequent meals so Telegram voice logs can use personal shortcuts.");
|
|
169
303
|
}
|
|
170
|
-
if (mode === "after_log_review") {
|
|
304
|
+
if (input.mode === "after_log_review") {
|
|
171
305
|
actions.push("Show what changed in daily totals and ask whether any portion needs correction.");
|
|
172
306
|
}
|
|
173
|
-
if (mode === "evening_checkin" && summary.hydration.total_ml === 0) {
|
|
307
|
+
if (input.mode === "evening_checkin" && summary.hydration.total_ml === 0) {
|
|
174
308
|
actions.push("Ask whether the user wants to log water for today.");
|
|
175
309
|
}
|
|
176
310
|
return actions;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coach.js","sourceRoot":"","sources":["../../src/services/coach.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"coach.js","sourceRoot":"","sources":["../../src/services/coach.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import type { MealType, NutrientMap } from "../types.js";
|
|
2
2
|
export interface SimpleFood {
|
|
3
3
|
canonical: string;
|
|
4
|
+
/** Human-friendly pt-BR label for foods whose canonical name is English. */
|
|
5
|
+
displayNamePtBr?: string;
|
|
4
6
|
aliases: string[];
|
|
5
7
|
servingGrams: number;
|
|
6
8
|
nutrientsPer100g: NutrientMap;
|