wellness-nourish 0.1.0
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/LICENSE +21 -0
- package/README.md +146 -0
- package/SECURITY.md +9 -0
- package/dist/cli/commands.d.ts +3 -0
- package/dist/cli/commands.js +467 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/constants.d.ts +8 -0
- package/dist/constants.js +9 -0
- package/dist/constants.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +153 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/nourish-prompts.d.ts +2 -0
- package/dist/prompts/nourish-prompts.js +17 -0
- package/dist/prompts/nourish-prompts.js.map +1 -0
- package/dist/providers/open-food-facts.d.ts +5 -0
- package/dist/providers/open-food-facts.js +141 -0
- package/dist/providers/open-food-facts.js.map +1 -0
- package/dist/providers/usda.d.ts +6 -0
- package/dist/providers/usda.js +157 -0
- package/dist/providers/usda.js.map +1 -0
- package/dist/resources/nourish-resources.d.ts +2 -0
- package/dist/resources/nourish-resources.js +26 -0
- package/dist/resources/nourish-resources.js.map +1 -0
- package/dist/schemas/common.d.ts +224 -0
- package/dist/schemas/common.js +224 -0
- package/dist/schemas/common.js.map +1 -0
- package/dist/services/agent-manifest.d.ts +27 -0
- package/dist/services/agent-manifest.js +80 -0
- package/dist/services/agent-manifest.js.map +1 -0
- package/dist/services/capabilities.d.ts +12 -0
- package/dist/services/capabilities.js +27 -0
- package/dist/services/capabilities.js.map +1 -0
- package/dist/services/config.d.ts +3 -0
- package/dist/services/config.js +32 -0
- package/dist/services/config.js.map +1 -0
- package/dist/services/connection-status.d.ts +13 -0
- package/dist/services/connection-status.js +34 -0
- package/dist/services/connection-status.js.map +1 -0
- package/dist/services/food-normalization.d.ts +3 -0
- package/dist/services/food-normalization.js +14 -0
- package/dist/services/food-normalization.js.map +1 -0
- package/dist/services/format.d.ts +13 -0
- package/dist/services/format.js +58 -0
- package/dist/services/format.js.map +1 -0
- package/dist/services/goals-store.d.ts +7 -0
- package/dist/services/goals-store.js +87 -0
- package/dist/services/goals-store.js.map +1 -0
- package/dist/services/hydration-store.d.ts +12 -0
- package/dist/services/hydration-store.js +96 -0
- package/dist/services/hydration-store.js.map +1 -0
- package/dist/services/intake-store.d.ts +15 -0
- package/dist/services/intake-store.js +170 -0
- package/dist/services/intake-store.js.map +1 -0
- package/dist/services/meal-estimator.d.ts +22 -0
- package/dist/services/meal-estimator.js +178 -0
- package/dist/services/meal-estimator.js.map +1 -0
- package/dist/services/nutrients.d.ts +4 -0
- package/dist/services/nutrients.js +31 -0
- package/dist/services/nutrients.js.map +1 -0
- package/dist/services/portion-engine.d.ts +4 -0
- package/dist/services/portion-engine.js +50 -0
- package/dist/services/portion-engine.js.map +1 -0
- package/dist/services/privacy-audit.d.ts +12 -0
- package/dist/services/privacy-audit.js +19 -0
- package/dist/services/privacy-audit.js.map +1 -0
- package/dist/services/summary.d.ts +28 -0
- package/dist/services/summary.js +84 -0
- package/dist/services/summary.js.map +1 -0
- package/dist/services/usage-guide.d.ts +12 -0
- package/dist/services/usage-guide.js +57 -0
- package/dist/services/usage-guide.js.map +1 -0
- package/dist/tools/nourish-tools.d.ts +2 -0
- package/dist/tools/nourish-tools.js +603 -0
- package/dist/tools/nourish-tools.js.map +1 -0
- package/dist/types.d.ts +97 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/examples/claude-desktop.json +13 -0
- package/examples/codex.json +13 -0
- package/examples/cursor.json +13 -0
- package/examples/hermes.md +18 -0
- package/examples/openclaw.md +18 -0
- package/examples/windsurf.json +13 -0
- package/fixtures/open-food-facts/barcode-peanut-butter.json +23 -0
- package/fixtures/usda/food-banana.json +16 -0
- package/fixtures/usda/search-banana.json +17 -0
- package/package.json +52 -0
- package/server.json +16 -0
- package/tsconfig.json +21 -0
|
@@ -0,0 +1,603 @@
|
|
|
1
|
+
import { AgentManifestInputSchema, BarcodeLookupInputSchema, ClearDayInputSchema, ExportInputSchema, FoodGetInputSchema, FoodSearchInputSchema, GoalsSetInputSchema, HydrationLogInputSchema, IntakeDeleteInputSchema, IntakeListInputSchema, IntakeLogInputSchema, IntakeUpdateInputSchema, MealEstimateInputSchema, ResponseOnlyInputSchema, SummaryInputSchema, WeeklySummaryInputSchema, } from "../schemas/common.js";
|
|
2
|
+
import { getUsdaFood, searchUsdaFoods } from "../providers/usda.js";
|
|
3
|
+
import { lookupOpenFoodFactsBarcode } from "../providers/open-food-facts.js";
|
|
4
|
+
import { buildAgentManifest } from "../services/agent-manifest.js";
|
|
5
|
+
import { buildCapabilities } from "../services/capabilities.js";
|
|
6
|
+
import { buildConnectionStatus } from "../services/connection-status.js";
|
|
7
|
+
import { makeError, makeResponse, bulletList, compactTable } from "../services/format.js";
|
|
8
|
+
import { addIntakeEntry, clearIntakeDay, deleteIntakeEntry, exportIntakeCsvData, exportIntakeData, listIntakeEntries, updateIntakeEntry, } from "../services/intake-store.js";
|
|
9
|
+
import { buildHydrationSummary, logWater } from "../services/hydration-store.js";
|
|
10
|
+
import { getGoals, updateGoals } from "../services/goals-store.js";
|
|
11
|
+
import { estimateMeal } from "../services/meal-estimator.js";
|
|
12
|
+
import { buildPrivacyAudit } from "../services/privacy-audit.js";
|
|
13
|
+
import { buildDailySummary, buildWeeklySummary } from "../services/summary.js";
|
|
14
|
+
export function registerNourishTools(server) {
|
|
15
|
+
server.registerTool("nourish_agent_manifest", {
|
|
16
|
+
title: "Nourish agent manifest",
|
|
17
|
+
description: "Return agent-facing install, safety, resource, and first-call guidance.",
|
|
18
|
+
inputSchema: AgentManifestInputSchema.shape,
|
|
19
|
+
annotations: readOnlyAnnotation(),
|
|
20
|
+
}, async (input) => {
|
|
21
|
+
try {
|
|
22
|
+
const params = AgentManifestInputSchema.parse(input);
|
|
23
|
+
const manifest = buildAgentManifest(params.client);
|
|
24
|
+
const firstTools = manifest.recommended_first_calls.join(", ");
|
|
25
|
+
const markdown = bulletList("Nourish Agent Manifest", {
|
|
26
|
+
name: manifest.name,
|
|
27
|
+
version: manifest.version,
|
|
28
|
+
client: manifest.client,
|
|
29
|
+
first_tools: firstTools,
|
|
30
|
+
});
|
|
31
|
+
return toolResponse(makeResponse(manifest, params.response_format, markdown));
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
return toolError(error);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
server.registerTool("nourish_capabilities", {
|
|
38
|
+
title: "Nourish capabilities",
|
|
39
|
+
description: "Describe supported nutrition workflows, providers, and recommended first tools.",
|
|
40
|
+
inputSchema: ResponseOnlyInputSchema.shape,
|
|
41
|
+
annotations: readOnlyAnnotation(),
|
|
42
|
+
}, async (input) => {
|
|
43
|
+
try {
|
|
44
|
+
const params = ResponseOnlyInputSchema.parse(input);
|
|
45
|
+
return toolResponse(makeResponse(buildCapabilities(), params.response_format));
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
return toolError(error);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
server.registerTool("nourish_connection_status", {
|
|
52
|
+
title: "Nourish connection status",
|
|
53
|
+
description: "Report local storage, fixture, USDA, and Open Food Facts readiness without returning secrets.",
|
|
54
|
+
inputSchema: ResponseOnlyInputSchema.shape,
|
|
55
|
+
annotations: readOnlyAnnotation(),
|
|
56
|
+
}, async (input) => {
|
|
57
|
+
try {
|
|
58
|
+
const params = ResponseOnlyInputSchema.parse(input);
|
|
59
|
+
return toolResponse(makeResponse(buildConnectionStatus(), params.response_format));
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
return toolError(error);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
server.registerTool("nourish_privacy_audit", {
|
|
66
|
+
title: "Nourish privacy audit",
|
|
67
|
+
description: "Describe local storage, secret handling, source licensing, and safety boundaries.",
|
|
68
|
+
inputSchema: ResponseOnlyInputSchema.shape,
|
|
69
|
+
annotations: readOnlyAnnotation(),
|
|
70
|
+
}, async (input) => {
|
|
71
|
+
try {
|
|
72
|
+
const params = ResponseOnlyInputSchema.parse(input);
|
|
73
|
+
return toolResponse(makeResponse(buildPrivacyAudit(), params.response_format));
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
return toolError(error);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
server.registerTool("nourish_search_food", {
|
|
80
|
+
title: "Search foods",
|
|
81
|
+
description: "Search USDA FoodData Central foods by query and return compact nutrition/source data.",
|
|
82
|
+
inputSchema: FoodSearchInputSchema.shape,
|
|
83
|
+
annotations: readOnlyOpenWorldAnnotation(),
|
|
84
|
+
}, async (input) => {
|
|
85
|
+
try {
|
|
86
|
+
const params = FoodSearchInputSchema.parse(input);
|
|
87
|
+
const result = await searchUsdaFoods(params.query, params.limit);
|
|
88
|
+
const markdown = compactFoodTable(result.foods);
|
|
89
|
+
return toolResponse(makeResponse(result, params.response_format, markdown));
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
return toolError(error);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
server.registerTool("nourish_lookup_barcode", {
|
|
96
|
+
title: "Lookup barcode",
|
|
97
|
+
description: "Lookup a packaged food barcode in Open Food Facts.",
|
|
98
|
+
inputSchema: BarcodeLookupInputSchema.shape,
|
|
99
|
+
annotations: readOnlyOpenWorldAnnotation(),
|
|
100
|
+
}, async (input) => {
|
|
101
|
+
try {
|
|
102
|
+
const params = BarcodeLookupInputSchema.parse(input);
|
|
103
|
+
const result = await lookupOpenFoodFactsBarcode(params.barcode);
|
|
104
|
+
return toolResponse(makeResponse(result, params.response_format));
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
return toolError(error);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
server.registerTool("nourish_get_food", {
|
|
111
|
+
title: "Get food",
|
|
112
|
+
description: "Fetch a USDA food by source_id or an Open Food Facts food by barcode source_id.",
|
|
113
|
+
inputSchema: FoodGetInputSchema.shape,
|
|
114
|
+
annotations: readOnlyOpenWorldAnnotation(),
|
|
115
|
+
}, async (input) => {
|
|
116
|
+
try {
|
|
117
|
+
const params = FoodGetInputSchema.parse(input);
|
|
118
|
+
const result = params.source === "usda"
|
|
119
|
+
? { provider: "usda", food: await getUsdaFood(params.source_id) }
|
|
120
|
+
: await lookupOpenFoodFactsBarcode(params.source_id);
|
|
121
|
+
return toolResponse(makeResponse(result, params.response_format));
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
return toolError(error);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
server.registerTool("nourish_estimate_meal", {
|
|
128
|
+
title: "Estimate meal",
|
|
129
|
+
description: "Estimate nutrition for a short meal text using local deterministic defaults.",
|
|
130
|
+
inputSchema: MealEstimateInputSchema.shape,
|
|
131
|
+
annotations: readOnlyAnnotation(),
|
|
132
|
+
}, async (input) => {
|
|
133
|
+
try {
|
|
134
|
+
const params = MealEstimateInputSchema.parse(input);
|
|
135
|
+
const estimate = await estimateMeal(params);
|
|
136
|
+
return toolResponse(makeResponse(estimate, params.response_format));
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
return toolError(error);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
server.registerTool("nourish_log_intake", {
|
|
143
|
+
title: "Log intake",
|
|
144
|
+
description: "Log an intake entry only after explicit user intent, using meal text or structured food data.",
|
|
145
|
+
inputSchema: IntakeLogInputSchema.shape,
|
|
146
|
+
annotations: {
|
|
147
|
+
readOnlyHint: false,
|
|
148
|
+
destructiveHint: false,
|
|
149
|
+
idempotentHint: false,
|
|
150
|
+
openWorldHint: false,
|
|
151
|
+
},
|
|
152
|
+
}, async (input) => {
|
|
153
|
+
try {
|
|
154
|
+
const params = IntakeLogInputSchema.parse(input);
|
|
155
|
+
if (params.explicit_user_intent !== true) {
|
|
156
|
+
return toolResponse(makeError("explicit_user_intent must be true to log intake."));
|
|
157
|
+
}
|
|
158
|
+
const entry = await addIntakeEntry(await buildIntakeEntryInput(params));
|
|
159
|
+
return toolResponse(makeResponse(entry, params.response_format));
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
return toolError(error);
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
server.registerTool("nourish_update_intake", {
|
|
166
|
+
title: "Update intake",
|
|
167
|
+
description: "Update non-nutrition metadata for a local intake entry by id.",
|
|
168
|
+
inputSchema: IntakeUpdateInputSchema.shape,
|
|
169
|
+
annotations: {
|
|
170
|
+
readOnlyHint: false,
|
|
171
|
+
destructiveHint: false,
|
|
172
|
+
idempotentHint: true,
|
|
173
|
+
openWorldHint: false,
|
|
174
|
+
},
|
|
175
|
+
}, async (input) => {
|
|
176
|
+
try {
|
|
177
|
+
const params = IntakeUpdateInputSchema.parse(input);
|
|
178
|
+
const patch = {};
|
|
179
|
+
if (params.meal_type !== undefined) {
|
|
180
|
+
patch.meal_type = params.meal_type;
|
|
181
|
+
}
|
|
182
|
+
if (params.quantity !== undefined) {
|
|
183
|
+
patch.quantity = params.quantity;
|
|
184
|
+
}
|
|
185
|
+
if (params.unit !== undefined) {
|
|
186
|
+
patch.unit = params.unit;
|
|
187
|
+
}
|
|
188
|
+
if (params.timestamp !== undefined) {
|
|
189
|
+
patch.timestamp = params.timestamp;
|
|
190
|
+
}
|
|
191
|
+
if (params.notes !== undefined) {
|
|
192
|
+
patch.notes = params.notes;
|
|
193
|
+
}
|
|
194
|
+
if (params.tags !== undefined) {
|
|
195
|
+
patch.tags = params.tags;
|
|
196
|
+
}
|
|
197
|
+
const entry = await updateIntakeEntry(params.id, patch);
|
|
198
|
+
return toolResponse(makeResponse(entry, params.response_format));
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
return toolError(error);
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
server.registerTool("nourish_list_intake", {
|
|
205
|
+
title: "List intake",
|
|
206
|
+
description: "List local intake entries, optionally filtered by date.",
|
|
207
|
+
inputSchema: IntakeListInputSchema.shape,
|
|
208
|
+
annotations: readOnlyAnnotation(),
|
|
209
|
+
}, async (input) => {
|
|
210
|
+
try {
|
|
211
|
+
const params = IntakeListInputSchema.parse(input);
|
|
212
|
+
const entries = await listIntakeEntries(params.date === undefined ? {} : { date: params.date });
|
|
213
|
+
const markdown = compactIntakeTable(entries);
|
|
214
|
+
return toolResponse(makeResponse({ entries }, params.response_format, markdown));
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
return toolError(error);
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
server.registerTool("nourish_delete_intake", {
|
|
221
|
+
title: "Delete intake",
|
|
222
|
+
description: "Delete a local intake entry by id.",
|
|
223
|
+
inputSchema: IntakeDeleteInputSchema.shape,
|
|
224
|
+
annotations: {
|
|
225
|
+
readOnlyHint: false,
|
|
226
|
+
destructiveHint: true,
|
|
227
|
+
idempotentHint: true,
|
|
228
|
+
openWorldHint: false,
|
|
229
|
+
},
|
|
230
|
+
}, async (input) => {
|
|
231
|
+
try {
|
|
232
|
+
const params = IntakeDeleteInputSchema.parse(input);
|
|
233
|
+
const deleted = await deleteIntakeEntry(params.id);
|
|
234
|
+
return toolResponse(makeResponse({ ok: true, deleted, id: params.id }, params.response_format));
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
return toolError(error);
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
server.registerTool("nourish_clear_day", {
|
|
241
|
+
title: "Clear day",
|
|
242
|
+
description: "Delete all local intake entries for a date after explicit user intent.",
|
|
243
|
+
inputSchema: ClearDayInputSchema.shape,
|
|
244
|
+
annotations: {
|
|
245
|
+
readOnlyHint: false,
|
|
246
|
+
destructiveHint: true,
|
|
247
|
+
idempotentHint: true,
|
|
248
|
+
openWorldHint: false,
|
|
249
|
+
},
|
|
250
|
+
}, async (input) => {
|
|
251
|
+
try {
|
|
252
|
+
const params = ClearDayInputSchema.parse(input);
|
|
253
|
+
const result = await clearIntakeDay(params.date);
|
|
254
|
+
return toolResponse(makeResponse(result, params.response_format));
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
return toolError(error);
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
server.registerTool("nourish_log_water", {
|
|
261
|
+
title: "Log water",
|
|
262
|
+
description: "Log local hydration in milliliters after explicit user intent.",
|
|
263
|
+
inputSchema: HydrationLogInputSchema.shape,
|
|
264
|
+
annotations: {
|
|
265
|
+
readOnlyHint: false,
|
|
266
|
+
destructiveHint: false,
|
|
267
|
+
idempotentHint: false,
|
|
268
|
+
openWorldHint: false,
|
|
269
|
+
},
|
|
270
|
+
}, async (input) => {
|
|
271
|
+
try {
|
|
272
|
+
const params = HydrationLogInputSchema.parse(input);
|
|
273
|
+
const waterInput = {
|
|
274
|
+
amount_ml: params.amount_ml,
|
|
275
|
+
source: "agent",
|
|
276
|
+
};
|
|
277
|
+
const timestamp = params.timestamp ?? dateToNoonTimestamp(params.date);
|
|
278
|
+
if (timestamp !== undefined) {
|
|
279
|
+
waterInput.timestamp = timestamp;
|
|
280
|
+
}
|
|
281
|
+
if (params.notes !== undefined) {
|
|
282
|
+
waterInput.notes = params.notes;
|
|
283
|
+
}
|
|
284
|
+
const entry = await logWater(waterInput);
|
|
285
|
+
return toolResponse(makeResponse(entry, params.response_format));
|
|
286
|
+
}
|
|
287
|
+
catch (error) {
|
|
288
|
+
return toolError(error);
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
server.registerTool("nourish_hydration_summary", {
|
|
292
|
+
title: "Hydration summary",
|
|
293
|
+
description: "Summarize local hydration for a date.",
|
|
294
|
+
inputSchema: SummaryInputSchema.shape,
|
|
295
|
+
annotations: readOnlyAnnotation(),
|
|
296
|
+
}, async (input) => {
|
|
297
|
+
try {
|
|
298
|
+
const params = SummaryInputSchema.parse(input);
|
|
299
|
+
const summary = await buildHydrationSummary(params.date);
|
|
300
|
+
return toolResponse(makeResponse(summary, params.response_format));
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
return toolError(error);
|
|
304
|
+
}
|
|
305
|
+
});
|
|
306
|
+
server.registerTool("nourish_get_goals", {
|
|
307
|
+
title: "Get goals",
|
|
308
|
+
description: "Read local calorie, macro, and hydration goals.",
|
|
309
|
+
inputSchema: ResponseOnlyInputSchema.shape,
|
|
310
|
+
annotations: readOnlyAnnotation(),
|
|
311
|
+
}, async (input) => {
|
|
312
|
+
try {
|
|
313
|
+
const params = ResponseOnlyInputSchema.parse(input);
|
|
314
|
+
return toolResponse(makeResponse(await getGoals(), params.response_format));
|
|
315
|
+
}
|
|
316
|
+
catch (error) {
|
|
317
|
+
return toolError(error);
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
server.registerTool("nourish_set_goals", {
|
|
321
|
+
title: "Set goals",
|
|
322
|
+
description: "Set local calorie, macro, and hydration goals after explicit user intent.",
|
|
323
|
+
inputSchema: GoalsSetInputSchema.shape,
|
|
324
|
+
annotations: {
|
|
325
|
+
readOnlyHint: false,
|
|
326
|
+
destructiveHint: false,
|
|
327
|
+
idempotentHint: true,
|
|
328
|
+
openWorldHint: false,
|
|
329
|
+
},
|
|
330
|
+
}, async (input) => {
|
|
331
|
+
try {
|
|
332
|
+
const params = GoalsSetInputSchema.parse(input);
|
|
333
|
+
const result = await updateGoals({
|
|
334
|
+
...(params.daily === undefined ? {} : { daily: cleanNutrients(params.daily) }),
|
|
335
|
+
...(params.hydration_ml === undefined ? {} : { hydration_ml: params.hydration_ml }),
|
|
336
|
+
});
|
|
337
|
+
return toolResponse(makeResponse(result, params.response_format));
|
|
338
|
+
}
|
|
339
|
+
catch (error) {
|
|
340
|
+
return toolError(error);
|
|
341
|
+
}
|
|
342
|
+
});
|
|
343
|
+
server.registerTool("nourish_daily_summary", {
|
|
344
|
+
title: "Daily summary",
|
|
345
|
+
description: "Summarize local intake totals, confidence, and source coverage for a date.",
|
|
346
|
+
inputSchema: SummaryInputSchema.shape,
|
|
347
|
+
annotations: readOnlyAnnotation(),
|
|
348
|
+
}, async (input) => {
|
|
349
|
+
try {
|
|
350
|
+
const params = SummaryInputSchema.parse(input);
|
|
351
|
+
const summary = await buildDailySummary(params.date);
|
|
352
|
+
return toolResponse(makeResponse(summary, params.response_format));
|
|
353
|
+
}
|
|
354
|
+
catch (error) {
|
|
355
|
+
return toolError(error);
|
|
356
|
+
}
|
|
357
|
+
});
|
|
358
|
+
server.registerTool("nourish_weekly_summary", {
|
|
359
|
+
title: "Weekly summary",
|
|
360
|
+
description: "Summarize seven days of local intake totals from a start date.",
|
|
361
|
+
inputSchema: WeeklySummaryInputSchema.shape,
|
|
362
|
+
annotations: readOnlyAnnotation(),
|
|
363
|
+
}, async (input) => {
|
|
364
|
+
try {
|
|
365
|
+
const params = WeeklySummaryInputSchema.parse(input);
|
|
366
|
+
const summary = await buildWeeklySummary(params.start_date);
|
|
367
|
+
return toolResponse(makeResponse(summary, params.response_format));
|
|
368
|
+
}
|
|
369
|
+
catch (error) {
|
|
370
|
+
return toolError(error);
|
|
371
|
+
}
|
|
372
|
+
});
|
|
373
|
+
server.registerTool("nourish_export_data", {
|
|
374
|
+
title: "Export intake data",
|
|
375
|
+
description: "Export local intake data as JSONL or CSV without provider secrets or tokens.",
|
|
376
|
+
inputSchema: ExportInputSchema.shape,
|
|
377
|
+
annotations: readOnlyAnnotation(),
|
|
378
|
+
}, async (input) => {
|
|
379
|
+
try {
|
|
380
|
+
const params = ExportInputSchema.parse(input);
|
|
381
|
+
const exportText = params.export_format === "csv" ? await exportIntakeCsvData() : await exportIntakeData();
|
|
382
|
+
return toolResponse(makeResponse(params.export_format === "csv" ? { csv: exportText } : { jsonl: exportText }, params.response_format, exportText));
|
|
383
|
+
}
|
|
384
|
+
catch (error) {
|
|
385
|
+
return toolError(error);
|
|
386
|
+
}
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
function readOnlyAnnotation() {
|
|
390
|
+
return {
|
|
391
|
+
readOnlyHint: true,
|
|
392
|
+
destructiveHint: false,
|
|
393
|
+
idempotentHint: true,
|
|
394
|
+
openWorldHint: false,
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
function readOnlyOpenWorldAnnotation() {
|
|
398
|
+
return {
|
|
399
|
+
...readOnlyAnnotation(),
|
|
400
|
+
openWorldHint: true,
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
function compactFoodTable(foods) {
|
|
404
|
+
return compactTable(foods.map((food) => ({
|
|
405
|
+
name: food.name,
|
|
406
|
+
source: food.source,
|
|
407
|
+
calories: food.nutrients_per_100g.calories_kcal,
|
|
408
|
+
protein: food.nutrients_per_100g.protein_g,
|
|
409
|
+
})), ["name", "source", "calories", "protein"]);
|
|
410
|
+
}
|
|
411
|
+
function compactIntakeTable(entries) {
|
|
412
|
+
return compactTable(entries.map((entry) => ({
|
|
413
|
+
id: entry.id,
|
|
414
|
+
date: entry.date,
|
|
415
|
+
meal: entry.meal_type,
|
|
416
|
+
food: entry.food_ref?.name ?? entry.custom_food?.name ?? "",
|
|
417
|
+
calories: entry.nutrients.calories_kcal,
|
|
418
|
+
confidence: entry.confidence,
|
|
419
|
+
})), ["id", "date", "meal", "food", "calories", "confidence"]);
|
|
420
|
+
}
|
|
421
|
+
function toolResponse(response) {
|
|
422
|
+
return response;
|
|
423
|
+
}
|
|
424
|
+
async function buildIntakeEntryInput(params) {
|
|
425
|
+
if (params.text !== undefined) {
|
|
426
|
+
const estimate = await estimateMeal({
|
|
427
|
+
text: params.text,
|
|
428
|
+
meal_type: params.meal_type,
|
|
429
|
+
locale: "en-US",
|
|
430
|
+
});
|
|
431
|
+
const input = {
|
|
432
|
+
meal_type: params.meal_type,
|
|
433
|
+
food_ref: {
|
|
434
|
+
source: "estimate",
|
|
435
|
+
source_id: stableEstimateId(params.text),
|
|
436
|
+
name: params.text,
|
|
437
|
+
},
|
|
438
|
+
quantity: params.quantity ?? 1,
|
|
439
|
+
unit: params.unit ?? "meal",
|
|
440
|
+
nutrients: cleanNutrients(estimate.total_nutrients),
|
|
441
|
+
confidence: params.confidence ?? estimate.confidence,
|
|
442
|
+
source_trace: "estimate",
|
|
443
|
+
tags: params.tags,
|
|
444
|
+
wellness_context_refs: params.wellness_context_refs,
|
|
445
|
+
};
|
|
446
|
+
if (params.timestamp !== undefined) {
|
|
447
|
+
input.timestamp = params.timestamp;
|
|
448
|
+
}
|
|
449
|
+
if (params.grams_estimate !== undefined) {
|
|
450
|
+
input.grams_estimate = params.grams_estimate;
|
|
451
|
+
}
|
|
452
|
+
else {
|
|
453
|
+
const grams = sumGrams(estimate.items);
|
|
454
|
+
if (grams !== undefined) {
|
|
455
|
+
input.grams_estimate = grams;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
if (params.notes !== undefined) {
|
|
459
|
+
input.notes = params.notes;
|
|
460
|
+
}
|
|
461
|
+
return input;
|
|
462
|
+
}
|
|
463
|
+
const customFood = asFoodItem(params.custom_food);
|
|
464
|
+
const customFoodRef = foodRefFromUnknown(params.custom_food);
|
|
465
|
+
const foodNutrients = nutrientsFromUnknown(params.food);
|
|
466
|
+
const foodRef = params.food_ref ?? foodRefFromUnknown(params.food) ?? foodRefFromFood(customFood) ?? customFoodRef;
|
|
467
|
+
const nutrients = params.nutrients ?? bestFoodNutrients(customFood) ?? nutrientsFromUnknown(params.custom_food) ?? foodNutrients;
|
|
468
|
+
const clean = cleanNutrients(nutrients);
|
|
469
|
+
if (!hasMeaningfulNutrients(clean)) {
|
|
470
|
+
throw new Error("Non-text intake logs require meaningful nutrients. Provide nutrients, custom_food.nutrients_per_100g, or a food object with nutrients.");
|
|
471
|
+
}
|
|
472
|
+
const input = {
|
|
473
|
+
meal_type: params.meal_type,
|
|
474
|
+
quantity: params.quantity ?? 1,
|
|
475
|
+
unit: params.unit ?? "serving",
|
|
476
|
+
nutrients: clean,
|
|
477
|
+
confidence: params.confidence ?? customFood?.data_quality.confidence ?? 0.5,
|
|
478
|
+
source_trace: sourceTraceFor(foodRef, customFood),
|
|
479
|
+
tags: params.tags,
|
|
480
|
+
wellness_context_refs: params.wellness_context_refs,
|
|
481
|
+
};
|
|
482
|
+
if (params.timestamp !== undefined) {
|
|
483
|
+
input.timestamp = params.timestamp;
|
|
484
|
+
}
|
|
485
|
+
if (foodRef !== undefined) {
|
|
486
|
+
input.food_ref = foodRef;
|
|
487
|
+
}
|
|
488
|
+
if (customFood !== undefined) {
|
|
489
|
+
input.custom_food = customFood;
|
|
490
|
+
}
|
|
491
|
+
if (params.grams_estimate !== undefined) {
|
|
492
|
+
input.grams_estimate = params.grams_estimate;
|
|
493
|
+
}
|
|
494
|
+
if (params.notes !== undefined) {
|
|
495
|
+
input.notes = params.notes;
|
|
496
|
+
}
|
|
497
|
+
return input;
|
|
498
|
+
}
|
|
499
|
+
function bestFoodNutrients(food) {
|
|
500
|
+
return food?.nutrients_per_serving ?? food?.nutrients_per_100g;
|
|
501
|
+
}
|
|
502
|
+
function nutrientsFromUnknown(value) {
|
|
503
|
+
if (!isRecord(value)) {
|
|
504
|
+
return undefined;
|
|
505
|
+
}
|
|
506
|
+
if (isRecord(value.nutrients_per_100g)) {
|
|
507
|
+
return cleanNutrients(value.nutrients_per_100g);
|
|
508
|
+
}
|
|
509
|
+
if (isRecord(value.nutrients)) {
|
|
510
|
+
return cleanNutrients(value.nutrients);
|
|
511
|
+
}
|
|
512
|
+
return undefined;
|
|
513
|
+
}
|
|
514
|
+
function hasMeaningfulNutrients(nutrients) {
|
|
515
|
+
return Object.values(nutrients).some((value) => typeof value === "number" && Number.isFinite(value));
|
|
516
|
+
}
|
|
517
|
+
function sourceTraceFor(foodRef, customFood) {
|
|
518
|
+
if (customFood !== undefined || foodRef?.source === "usda") {
|
|
519
|
+
return "exact_food";
|
|
520
|
+
}
|
|
521
|
+
if (foodRef?.source === "open_food_facts") {
|
|
522
|
+
return "barcode";
|
|
523
|
+
}
|
|
524
|
+
if (foodRef?.source === "estimate") {
|
|
525
|
+
return "estimate";
|
|
526
|
+
}
|
|
527
|
+
return "manual";
|
|
528
|
+
}
|
|
529
|
+
function cleanNutrients(nutrients) {
|
|
530
|
+
if (nutrients === undefined) {
|
|
531
|
+
return {};
|
|
532
|
+
}
|
|
533
|
+
const clean = {};
|
|
534
|
+
for (const key of Object.keys(nutrients)) {
|
|
535
|
+
const value = nutrients[key];
|
|
536
|
+
if (value !== undefined) {
|
|
537
|
+
clean[key] = value;
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
return clean;
|
|
541
|
+
}
|
|
542
|
+
function foodRefFromFood(food) {
|
|
543
|
+
if (food === undefined) {
|
|
544
|
+
return undefined;
|
|
545
|
+
}
|
|
546
|
+
return {
|
|
547
|
+
source: food.source,
|
|
548
|
+
source_id: food.source_id,
|
|
549
|
+
name: food.name,
|
|
550
|
+
};
|
|
551
|
+
}
|
|
552
|
+
function foodRefFromUnknown(food) {
|
|
553
|
+
if (!isRecord(food)) {
|
|
554
|
+
return undefined;
|
|
555
|
+
}
|
|
556
|
+
const source = food.source;
|
|
557
|
+
const sourceId = food.source_id;
|
|
558
|
+
const name = food.name;
|
|
559
|
+
if (!isProviderSource(source) || typeof sourceId !== "string" || typeof name !== "string") {
|
|
560
|
+
return undefined;
|
|
561
|
+
}
|
|
562
|
+
return {
|
|
563
|
+
source,
|
|
564
|
+
source_id: sourceId,
|
|
565
|
+
name,
|
|
566
|
+
};
|
|
567
|
+
}
|
|
568
|
+
function asFoodItem(value) {
|
|
569
|
+
return isRecord(value) &&
|
|
570
|
+
typeof value.id === "string" &&
|
|
571
|
+
isProviderSource(value.source) &&
|
|
572
|
+
typeof value.source_id === "string" &&
|
|
573
|
+
typeof value.name === "string" &&
|
|
574
|
+
isRecord(value.nutrients_per_100g) &&
|
|
575
|
+
Array.isArray(value.available_portions) &&
|
|
576
|
+
isRecord(value.data_quality) &&
|
|
577
|
+
isRecord(value.license)
|
|
578
|
+
? value
|
|
579
|
+
: undefined;
|
|
580
|
+
}
|
|
581
|
+
function isRecord(value) {
|
|
582
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
583
|
+
}
|
|
584
|
+
function isProviderSource(value) {
|
|
585
|
+
return value === "usda" || value === "open_food_facts" || value === "manual" || value === "estimate";
|
|
586
|
+
}
|
|
587
|
+
function sumGrams(items) {
|
|
588
|
+
if (items.length === 0) {
|
|
589
|
+
return undefined;
|
|
590
|
+
}
|
|
591
|
+
return items.reduce((total, item) => total + item.grams, 0);
|
|
592
|
+
}
|
|
593
|
+
function stableEstimateId(text) {
|
|
594
|
+
return `estimate:${Buffer.from(text).toString("base64url").slice(0, 48)}`;
|
|
595
|
+
}
|
|
596
|
+
function dateToNoonTimestamp(date) {
|
|
597
|
+
return date === undefined ? undefined : `${date}T12:00:00.000Z`;
|
|
598
|
+
}
|
|
599
|
+
function toolError(error, responseFormat = "json") {
|
|
600
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
601
|
+
return toolResponse(makeError("NOURISH_ERROR", message, responseFormat));
|
|
602
|
+
}
|
|
603
|
+
//# sourceMappingURL=nourish-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nourish-tools.js","sourceRoot":"","sources":["../../src/tools/nourish-tools.ts"],"names":[],"mappings":"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"}
|