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.
Files changed (90) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +146 -0
  3. package/SECURITY.md +9 -0
  4. package/dist/cli/commands.d.ts +3 -0
  5. package/dist/cli/commands.js +467 -0
  6. package/dist/cli/commands.js.map +1 -0
  7. package/dist/constants.d.ts +8 -0
  8. package/dist/constants.js +9 -0
  9. package/dist/constants.js.map +1 -0
  10. package/dist/index.d.ts +3 -0
  11. package/dist/index.js +153 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/prompts/nourish-prompts.d.ts +2 -0
  14. package/dist/prompts/nourish-prompts.js +17 -0
  15. package/dist/prompts/nourish-prompts.js.map +1 -0
  16. package/dist/providers/open-food-facts.d.ts +5 -0
  17. package/dist/providers/open-food-facts.js +141 -0
  18. package/dist/providers/open-food-facts.js.map +1 -0
  19. package/dist/providers/usda.d.ts +6 -0
  20. package/dist/providers/usda.js +157 -0
  21. package/dist/providers/usda.js.map +1 -0
  22. package/dist/resources/nourish-resources.d.ts +2 -0
  23. package/dist/resources/nourish-resources.js +26 -0
  24. package/dist/resources/nourish-resources.js.map +1 -0
  25. package/dist/schemas/common.d.ts +224 -0
  26. package/dist/schemas/common.js +224 -0
  27. package/dist/schemas/common.js.map +1 -0
  28. package/dist/services/agent-manifest.d.ts +27 -0
  29. package/dist/services/agent-manifest.js +80 -0
  30. package/dist/services/agent-manifest.js.map +1 -0
  31. package/dist/services/capabilities.d.ts +12 -0
  32. package/dist/services/capabilities.js +27 -0
  33. package/dist/services/capabilities.js.map +1 -0
  34. package/dist/services/config.d.ts +3 -0
  35. package/dist/services/config.js +32 -0
  36. package/dist/services/config.js.map +1 -0
  37. package/dist/services/connection-status.d.ts +13 -0
  38. package/dist/services/connection-status.js +34 -0
  39. package/dist/services/connection-status.js.map +1 -0
  40. package/dist/services/food-normalization.d.ts +3 -0
  41. package/dist/services/food-normalization.js +14 -0
  42. package/dist/services/food-normalization.js.map +1 -0
  43. package/dist/services/format.d.ts +13 -0
  44. package/dist/services/format.js +58 -0
  45. package/dist/services/format.js.map +1 -0
  46. package/dist/services/goals-store.d.ts +7 -0
  47. package/dist/services/goals-store.js +87 -0
  48. package/dist/services/goals-store.js.map +1 -0
  49. package/dist/services/hydration-store.d.ts +12 -0
  50. package/dist/services/hydration-store.js +96 -0
  51. package/dist/services/hydration-store.js.map +1 -0
  52. package/dist/services/intake-store.d.ts +15 -0
  53. package/dist/services/intake-store.js +170 -0
  54. package/dist/services/intake-store.js.map +1 -0
  55. package/dist/services/meal-estimator.d.ts +22 -0
  56. package/dist/services/meal-estimator.js +178 -0
  57. package/dist/services/meal-estimator.js.map +1 -0
  58. package/dist/services/nutrients.d.ts +4 -0
  59. package/dist/services/nutrients.js +31 -0
  60. package/dist/services/nutrients.js.map +1 -0
  61. package/dist/services/portion-engine.d.ts +4 -0
  62. package/dist/services/portion-engine.js +50 -0
  63. package/dist/services/portion-engine.js.map +1 -0
  64. package/dist/services/privacy-audit.d.ts +12 -0
  65. package/dist/services/privacy-audit.js +19 -0
  66. package/dist/services/privacy-audit.js.map +1 -0
  67. package/dist/services/summary.d.ts +28 -0
  68. package/dist/services/summary.js +84 -0
  69. package/dist/services/summary.js.map +1 -0
  70. package/dist/services/usage-guide.d.ts +12 -0
  71. package/dist/services/usage-guide.js +57 -0
  72. package/dist/services/usage-guide.js.map +1 -0
  73. package/dist/tools/nourish-tools.d.ts +2 -0
  74. package/dist/tools/nourish-tools.js +603 -0
  75. package/dist/tools/nourish-tools.js.map +1 -0
  76. package/dist/types.d.ts +97 -0
  77. package/dist/types.js +2 -0
  78. package/dist/types.js.map +1 -0
  79. package/examples/claude-desktop.json +13 -0
  80. package/examples/codex.json +13 -0
  81. package/examples/cursor.json +13 -0
  82. package/examples/hermes.md +18 -0
  83. package/examples/openclaw.md +18 -0
  84. package/examples/windsurf.json +13 -0
  85. package/fixtures/open-food-facts/barcode-peanut-butter.json +23 -0
  86. package/fixtures/usda/food-banana.json +16 -0
  87. package/fixtures/usda/search-banana.json +17 -0
  88. package/package.json +52 -0
  89. package/server.json +16 -0
  90. package/tsconfig.json +21 -0
@@ -0,0 +1,178 @@
1
+ import { addNutrients } from "./nutrients.js";
2
+ import { gramsForQuantity, nutrientsForGrams } from "./portion-engine.js";
3
+ const SIMPLE_FOODS = [
4
+ {
5
+ canonical: "egg",
6
+ aliases: ["eggs", "egg"],
7
+ servingGrams: 50,
8
+ nutrientsPer100g: {
9
+ calories_kcal: 143,
10
+ protein_g: 12.6,
11
+ carbohydrates_g: 0.7,
12
+ fat_g: 9.5,
13
+ },
14
+ },
15
+ {
16
+ canonical: "banana",
17
+ aliases: ["banana"],
18
+ servingGrams: 118,
19
+ nutrientsPer100g: {
20
+ calories_kcal: 89,
21
+ protein_g: 1.09,
22
+ carbohydrates_g: 22.84,
23
+ fat_g: 0.33,
24
+ fiber_g: 2.6,
25
+ sugar_g: 12.23,
26
+ },
27
+ },
28
+ {
29
+ canonical: "toast",
30
+ aliases: ["toast", "bread"],
31
+ servingGrams: 30,
32
+ nutrientsPer100g: {
33
+ calories_kcal: 313,
34
+ protein_g: 13,
35
+ carbohydrates_g: 55,
36
+ fat_g: 4,
37
+ },
38
+ },
39
+ {
40
+ canonical: "rice",
41
+ aliases: ["rice", "white rice", "brown rice"],
42
+ servingGrams: 158,
43
+ nutrientsPer100g: {
44
+ calories_kcal: 130,
45
+ protein_g: 2.7,
46
+ carbohydrates_g: 28,
47
+ fat_g: 0.3,
48
+ },
49
+ },
50
+ {
51
+ canonical: "chicken",
52
+ aliases: ["chicken", "chicken breast"],
53
+ servingGrams: 100,
54
+ nutrientsPer100g: {
55
+ calories_kcal: 165,
56
+ protein_g: 31,
57
+ carbohydrates_g: 0,
58
+ fat_g: 3.6,
59
+ },
60
+ },
61
+ {
62
+ canonical: "oatmeal",
63
+ aliases: ["oatmeal", "oats"],
64
+ servingGrams: 234,
65
+ nutrientsPer100g: {
66
+ calories_kcal: 71,
67
+ protein_g: 2.5,
68
+ carbohydrates_g: 12,
69
+ fat_g: 1.5,
70
+ fiber_g: 1.7,
71
+ },
72
+ },
73
+ {
74
+ canonical: "milk",
75
+ aliases: ["milk"],
76
+ servingGrams: 244,
77
+ nutrientsPer100g: {
78
+ calories_kcal: 61,
79
+ protein_g: 3.2,
80
+ carbohydrates_g: 4.8,
81
+ fat_g: 3.3,
82
+ },
83
+ },
84
+ {
85
+ canonical: "apple",
86
+ aliases: ["apple", "apples"],
87
+ servingGrams: 182,
88
+ nutrientsPer100g: {
89
+ calories_kcal: 52,
90
+ protein_g: 0.3,
91
+ carbohydrates_g: 13.8,
92
+ fat_g: 0.2,
93
+ fiber_g: 2.4,
94
+ sugar_g: 10.4,
95
+ },
96
+ },
97
+ ];
98
+ const FOOD_BY_ALIAS = new Map(SIMPLE_FOODS.flatMap((food) => food.aliases.map((alias) => [alias, food])));
99
+ const QUANTITY_PATTERN = String.raw `\d+(?:\.\d+)?(?:\/\d+(?:\.\d+)?)?`;
100
+ const UNIT_PATTERN = [
101
+ "tablespoons",
102
+ "tablespoon",
103
+ "teaspoons",
104
+ "teaspoon",
105
+ "servings",
106
+ "serving",
107
+ "slices",
108
+ "slice",
109
+ "pieces",
110
+ "piece",
111
+ "cups",
112
+ "cup",
113
+ "tbsp",
114
+ "tsp",
115
+ "ounces",
116
+ "ounce",
117
+ "oz",
118
+ "grams",
119
+ "gram",
120
+ "g",
121
+ "kg",
122
+ "lb",
123
+ "ml",
124
+ "l",
125
+ ].join("|");
126
+ const FOOD_PATTERN = new RegExp(String.raw `(?:^|(?<=[^\p{L}\p{N}_\/-]))(?:(${QUANTITY_PATTERN})\s+)?(?:(${UNIT_PATTERN})\s+)?(${[...FOOD_BY_ALIAS.keys()]
127
+ .sort((a, b) => b.length - a.length)
128
+ .join("|")})(?=$|[^\p{L}\p{N}_-])`, "giu");
129
+ export async function estimateMeal(input) {
130
+ const items = [];
131
+ for (const match of input.text.matchAll(FOOD_PATTERN)) {
132
+ const quantity = parseQuantity(match[1]);
133
+ const unit = match[2]?.toLowerCase();
134
+ const alias = match[3]?.toLowerCase();
135
+ const food = alias === undefined ? undefined : FOOD_BY_ALIAS.get(alias);
136
+ if (food === undefined) {
137
+ continue;
138
+ }
139
+ const grams = unit === undefined
140
+ ? food.servingGrams * quantity
141
+ : (gramsForQuantity(quantity, unit, food.servingGrams) ?? food.servingGrams * quantity);
142
+ items.push({
143
+ name: food.canonical,
144
+ quantity,
145
+ grams,
146
+ nutrients: nutrientsForGrams(food.nutrientsPer100g, grams),
147
+ });
148
+ }
149
+ const foundAny = items.length > 0;
150
+ return {
151
+ text: input.text,
152
+ locale: input.locale,
153
+ meal_type: input.meal_type,
154
+ items,
155
+ total_nutrients: addNutrients(items.map((item) => item.nutrients)),
156
+ confidence: foundAny ? 0.55 : 0.2,
157
+ unresolved: foundAny ? [] : [input.text],
158
+ warnings: [
159
+ foundAny
160
+ ? "Nutrition values are estimates from simple food defaults."
161
+ : "No simple foods matched; nutrition estimate is incomplete.",
162
+ ],
163
+ };
164
+ }
165
+ function parseQuantity(raw) {
166
+ if (raw === undefined) {
167
+ return 1;
168
+ }
169
+ const [numerator, denominator] = raw.split("/");
170
+ if (numerator === undefined) {
171
+ return 1;
172
+ }
173
+ const quantity = denominator === undefined
174
+ ? Number.parseFloat(numerator)
175
+ : Number.parseFloat(numerator) / Number.parseFloat(denominator);
176
+ return Number.isFinite(quantity) && quantity > 0 ? quantity : 1;
177
+ }
178
+ //# sourceMappingURL=meal-estimator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meal-estimator.js","sourceRoot":"","sources":["../../src/services/meal-estimator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { NutrientMap } from "../types.js";
2
+ export declare function roundNutrient(value: number): number;
3
+ export declare function scaleNutrients(nutrients: NutrientMap, factor: number): NutrientMap;
4
+ export declare function addNutrients(items: NutrientMap[]): NutrientMap;
@@ -0,0 +1,31 @@
1
+ export function roundNutrient(value) {
2
+ return Math.round((value + Number.EPSILON) * 100) / 100;
3
+ }
4
+ export function scaleNutrients(nutrients, factor) {
5
+ const scaled = {};
6
+ if (!Number.isFinite(factor)) {
7
+ return scaled;
8
+ }
9
+ for (const [key, value] of Object.entries(nutrients)) {
10
+ if (typeof value === "number" && Number.isFinite(value)) {
11
+ scaled[key] = roundNutrient(value * factor);
12
+ }
13
+ }
14
+ return scaled;
15
+ }
16
+ export function addNutrients(items) {
17
+ const totals = {};
18
+ for (const item of items) {
19
+ for (const [key, value] of Object.entries(item)) {
20
+ if (typeof value === "number" && Number.isFinite(value)) {
21
+ totals[key] = (totals[key] ?? 0) + value;
22
+ }
23
+ }
24
+ }
25
+ const summed = {};
26
+ for (const [key, value] of Object.entries(totals)) {
27
+ summed[key] = roundNutrient(value);
28
+ }
29
+ return summed;
30
+ }
31
+ //# sourceMappingURL=nutrients.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nutrients.js","sourceRoot":"","sources":["../../src/services/nutrients.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAsB,EAAE,MAAc;IACnE,MAAM,MAAM,GAAgB,EAAE,CAAC;IAE/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAmD,EAAE,CAAC;QACvG,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACxD,MAAM,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAoB;IAC/C,MAAM,MAAM,GAA+C,EAAE,CAAC;IAE9D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAmD,EAAE,CAAC;YAClG,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAuC,EAAE,CAAC;QACxF,MAAM,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { NutrientMap } from "../types.js";
2
+ export declare const UNIT_TO_GRAMS: Readonly<Record<string, number>>;
3
+ export declare function gramsForQuantity(quantity: number, unit: string, servingGrams?: number): number | undefined;
4
+ export declare function nutrientsForGrams(per100g: NutrientMap, grams: number): NutrientMap;
@@ -0,0 +1,50 @@
1
+ import { scaleNutrients } from "./nutrients.js";
2
+ export const UNIT_TO_GRAMS = {
3
+ g: 1,
4
+ gram: 1,
5
+ grams: 1,
6
+ kg: 1000,
7
+ oz: 28.35,
8
+ ounce: 28.35,
9
+ ounces: 28.35,
10
+ lb: 453.59,
11
+ ml: 1,
12
+ l: 1000,
13
+ cup: 240,
14
+ cups: 240,
15
+ tbsp: 15,
16
+ tablespoon: 15,
17
+ tablespoons: 15,
18
+ tsp: 5,
19
+ teaspoon: 5,
20
+ teaspoons: 5,
21
+ slice: 30,
22
+ slices: 30,
23
+ piece: 1,
24
+ pieces: 1,
25
+ };
26
+ export function gramsForQuantity(quantity, unit, servingGrams) {
27
+ if (!Number.isFinite(quantity)) {
28
+ return undefined;
29
+ }
30
+ const normalizedUnit = unit.trim().toLowerCase();
31
+ if (normalizedUnit === "serving" || normalizedUnit === "servings") {
32
+ return typeof servingGrams === "number" && Number.isFinite(servingGrams)
33
+ ? roundGrams(quantity * servingGrams)
34
+ : undefined;
35
+ }
36
+ if (normalizedUnit === "piece" || normalizedUnit === "pieces") {
37
+ return typeof servingGrams === "number" && Number.isFinite(servingGrams)
38
+ ? roundGrams(quantity * servingGrams)
39
+ : undefined;
40
+ }
41
+ const gramsPerUnit = UNIT_TO_GRAMS[normalizedUnit];
42
+ return gramsPerUnit === undefined ? undefined : roundGrams(quantity * gramsPerUnit);
43
+ }
44
+ export function nutrientsForGrams(per100g, grams) {
45
+ return scaleNutrients(per100g, grams / 100);
46
+ }
47
+ function roundGrams(value) {
48
+ return Math.round((value + Number.EPSILON) * 100) / 100;
49
+ }
50
+ //# sourceMappingURL=portion-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portion-engine.js","sourceRoot":"","sources":["../../src/services/portion-engine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,CAAC,MAAM,aAAa,GAAqC;IAC7D,CAAC,EAAE,CAAC;IACJ,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,KAAK;IACT,KAAK,EAAE,KAAK;IACZ,MAAM,EAAE,KAAK;IACb,EAAE,EAAE,MAAM;IACV,EAAE,EAAE,CAAC;IACL,CAAC,EAAE,IAAI;IACP,GAAG,EAAE,GAAG;IACR,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,EAAE;IACR,UAAU,EAAE,EAAE;IACd,WAAW,EAAE,EAAE;IACf,GAAG,EAAE,CAAC;IACN,QAAQ,EAAE,CAAC;IACX,SAAS,EAAE,CAAC;IACZ,KAAK,EAAE,EAAE;IACT,MAAM,EAAE,EAAE;IACV,KAAK,EAAE,CAAC;IACR,MAAM,EAAE,CAAC;CACV,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAC9B,QAAgB,EAChB,IAAY,EACZ,YAAqB;IAErB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACjD,IAAI,cAAc,KAAK,SAAS,IAAI,cAAc,KAAK,UAAU,EAAE,CAAC;QAClE,OAAO,OAAO,YAAY,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC;YACtE,CAAC,CAAC,UAAU,CAAC,QAAQ,GAAG,YAAY,CAAC;YACrC,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAED,IAAI,cAAc,KAAK,OAAO,IAAI,cAAc,KAAK,QAAQ,EAAE,CAAC;QAC9D,OAAO,OAAO,YAAY,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC;YACtE,CAAC,CAAC,UAAU,CAAC,QAAQ,GAAG,YAAY,CAAC;YACrC,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAED,MAAM,YAAY,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;IACnD,OAAO,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,GAAG,YAAY,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAoB,EAAE,KAAa;IACnE,OAAO,cAAc,CAAC,OAAO,EAAE,KAAK,GAAG,GAAG,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface NourishPrivacyAudit {
2
+ local_storage: string;
3
+ personal_data: string;
4
+ secrets_returned_by_tools: boolean;
5
+ raw_provider_tokens_returned_by_tools: boolean;
6
+ default_search_mode: string;
7
+ deletion: string;
8
+ medical_boundary: string;
9
+ source_license_boundary: string;
10
+ agent_safety: string[];
11
+ }
12
+ export declare function buildPrivacyAudit(): NourishPrivacyAudit;
@@ -0,0 +1,19 @@
1
+ import { getConfig } from "./config.js";
2
+ export function buildPrivacyAudit() {
3
+ const config = getConfig();
4
+ return {
5
+ local_storage: config.local_dir,
6
+ personal_data: "intake logs only when explicitly logged",
7
+ secrets_returned_by_tools: false,
8
+ raw_provider_tokens_returned_by_tools: false,
9
+ default_search_mode: "read-only",
10
+ deletion: "Local intake logs can be deleted by entry through nourish_delete_intake or by removing the local intake.jsonl file in the configured local storage directory.",
11
+ medical_boundary: "not medical advice/diagnosis/treatment/emergency",
12
+ source_license_boundary: "USDA FoodData Central is the primary source. Open Food Facts metadata is ODbL share-alike and must preserve attribution and share-alike obligations.",
13
+ agent_safety: [
14
+ "never ask users to paste secrets, raw health exports, provider tokens, or private food logs",
15
+ "return configuration booleans and paths, not secret values",
16
+ ],
17
+ };
18
+ }
19
+ //# sourceMappingURL=privacy-audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"privacy-audit.js","sourceRoot":"","sources":["../../src/services/privacy-audit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAcxC,MAAM,UAAU,iBAAiB;IAC/B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,OAAO;QACL,aAAa,EAAE,MAAM,CAAC,SAAS;QAC/B,aAAa,EAAE,yCAAyC;QACxD,yBAAyB,EAAE,KAAK;QAChC,qCAAqC,EAAE,KAAK;QAC5C,mBAAmB,EAAE,WAAW;QAChC,QAAQ,EACN,+JAA+J;QACjK,gBAAgB,EAAE,kDAAkD;QACpE,uBAAuB,EACrB,sJAAsJ;QACxJ,YAAY,EAAE;YACZ,6FAA6F;YAC7F,4DAA4D;SAC7D;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { MealType, NutrientMap } from "../types.js";
2
+ import { buildHydrationSummary } from "./hydration-store.js";
3
+ type ByMealSummary = Record<MealType, NutrientMap>;
4
+ export interface DailySummary {
5
+ date: string;
6
+ entry_count: number;
7
+ total_nutrients: NutrientMap;
8
+ by_meal: ByMealSummary;
9
+ hydration: Awaited<ReturnType<typeof buildHydrationSummary>>;
10
+ goal_progress: Record<string, GoalProgressEntry>;
11
+ confidence: number;
12
+ source_coverage: string[];
13
+ }
14
+ export interface WeeklySummary {
15
+ start_date: string;
16
+ end_date: string;
17
+ days: DailySummary[];
18
+ entry_count: number;
19
+ total_nutrients: NutrientMap;
20
+ }
21
+ interface GoalProgressEntry {
22
+ actual: number;
23
+ goal: number;
24
+ percent: number;
25
+ }
26
+ export declare function buildDailySummary(date?: string): Promise<DailySummary>;
27
+ export declare function buildWeeklySummary(startDate?: string): Promise<WeeklySummary>;
28
+ export {};
@@ -0,0 +1,84 @@
1
+ import { getGoals } from "./goals-store.js";
2
+ import { buildHydrationSummary } from "./hydration-store.js";
3
+ import { listIntakeEntries } from "./intake-store.js";
4
+ import { addNutrients, roundNutrient } from "./nutrients.js";
5
+ const MEAL_TYPES = ["breakfast", "lunch", "dinner", "snack", "other"];
6
+ export async function buildDailySummary(date = todayDate()) {
7
+ const entries = await listIntakeEntries({ date });
8
+ const byMeal = emptyByMeal();
9
+ const totalNutrients = addNutrients(entries.map((entry) => entry.nutrients));
10
+ const hydration = await buildHydrationSummary(date);
11
+ const goals = await getGoals();
12
+ for (const mealType of MEAL_TYPES) {
13
+ byMeal[mealType] = addNutrients(entries.filter((entry) => entry.meal_type === mealType).map((entry) => entry.nutrients));
14
+ }
15
+ return {
16
+ date,
17
+ entry_count: entries.length,
18
+ total_nutrients: totalNutrients,
19
+ by_meal: byMeal,
20
+ hydration,
21
+ goal_progress: buildGoalProgress(totalNutrients, hydration.total_ml, goals.daily, goals.hydration_ml),
22
+ confidence: averageConfidence(entries),
23
+ source_coverage: [...new Set(entries.map((entry) => entry.source_trace))],
24
+ };
25
+ }
26
+ export async function buildWeeklySummary(startDate = todayDate()) {
27
+ const dates = [...Array(7)].map((_, index) => addDays(startDate, index));
28
+ const days = await Promise.all(dates.map((date) => buildDailySummary(date)));
29
+ return {
30
+ start_date: dates[0] ?? startDate,
31
+ end_date: dates[6] ?? startDate,
32
+ days,
33
+ entry_count: days.reduce((total, day) => total + day.entry_count, 0),
34
+ total_nutrients: addNutrients(days.map((day) => day.total_nutrients)),
35
+ };
36
+ }
37
+ function emptyByMeal() {
38
+ return {
39
+ breakfast: {},
40
+ lunch: {},
41
+ dinner: {},
42
+ snack: {},
43
+ other: {},
44
+ };
45
+ }
46
+ function averageConfidence(entries) {
47
+ if (entries.length === 0) {
48
+ return 0;
49
+ }
50
+ const total = entries.reduce((sum, entry) => sum + entry.confidence, 0);
51
+ return roundNutrient(total / entries.length);
52
+ }
53
+ function buildGoalProgress(nutrients, hydrationMl, nutrientGoals, hydrationGoalMl) {
54
+ const progress = {};
55
+ for (const key of Object.keys(nutrientGoals)) {
56
+ const goal = nutrientGoals[key];
57
+ if (goal === undefined || goal <= 0) {
58
+ continue;
59
+ }
60
+ const actual = nutrients[key] ?? 0;
61
+ progress[key] = {
62
+ actual,
63
+ goal,
64
+ percent: roundNutrient((actual / goal) * 100),
65
+ };
66
+ }
67
+ if (hydrationGoalMl !== undefined && hydrationGoalMl > 0) {
68
+ progress.hydration_ml = {
69
+ actual: hydrationMl,
70
+ goal: hydrationGoalMl,
71
+ percent: roundNutrient((hydrationMl / hydrationGoalMl) * 100),
72
+ };
73
+ }
74
+ return progress;
75
+ }
76
+ function todayDate() {
77
+ return new Date().toISOString().slice(0, 10);
78
+ }
79
+ function addDays(date, days) {
80
+ const parsed = new Date(`${date}T00:00:00.000Z`);
81
+ parsed.setUTCDate(parsed.getUTCDate() + days);
82
+ return parsed.toISOString().slice(0, 10);
83
+ }
84
+ //# sourceMappingURL=summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/services/summary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface NourishUsageGuide {
2
+ name: string;
3
+ version: string;
4
+ first_minute: string[];
5
+ agent_workflows: Array<{
6
+ name: string;
7
+ steps: string[];
8
+ }>;
9
+ human_cli: Record<string, string>;
10
+ safety_rules: string[];
11
+ }
12
+ export declare function buildUsageGuide(): NourishUsageGuide;
@@ -0,0 +1,57 @@
1
+ import { SERVER_NAME, SERVER_VERSION } from "../constants.js";
2
+ export function buildUsageGuide() {
3
+ return {
4
+ name: SERVER_NAME,
5
+ version: SERVER_VERSION,
6
+ first_minute: [
7
+ "Call nourish_connection_status.",
8
+ "Call nourish_capabilities.",
9
+ "Read nourish://usage-guide.",
10
+ "Use nourish_search_food or nourish_lookup_barcode before estimating whenever possible.",
11
+ ],
12
+ agent_workflows: [
13
+ {
14
+ name: "preview before write",
15
+ steps: [
16
+ "Estimate with nourish_estimate_meal.",
17
+ "Show calories, confidence, source trace, and warnings to the user.",
18
+ "Call nourish_log_intake only after explicit user intent.",
19
+ ],
20
+ },
21
+ {
22
+ name: "review day",
23
+ steps: [
24
+ "Call nourish_daily_summary with response_format markdown for human review.",
25
+ "Use nourish_list_intake when the user wants to edit a specific item.",
26
+ "Use nourish_update_intake or nourish_delete_intake only for the selected id.",
27
+ ],
28
+ },
29
+ {
30
+ name: "goals and hydration",
31
+ steps: [
32
+ "Use nourish_get_goals before comparing totals to targets.",
33
+ "Call nourish_log_water only after explicit user intent.",
34
+ "Treat goals as local tracking preferences, not medical guidance.",
35
+ ],
36
+ },
37
+ ],
38
+ human_cli: {
39
+ setup: "nourish-mcp setup --client claude",
40
+ doctor: "nourish-mcp doctor",
41
+ preview: "nourish-mcp log --preview --meal breakfast \"2 eggs and banana\"",
42
+ list: "nourish-mcp list 2026-05-05",
43
+ edit: "nourish-mcp edit --entry intake_id --meal snack --notes \"corrected\"",
44
+ clear_day: "nourish-mcp clear-day 2026-05-05 --yes",
45
+ hydration: "nourish-mcp water 500 --date 2026-05-05",
46
+ goals: "nourish-mcp goals --set-calories 2200 --set-protein 120 --set-water 2500",
47
+ csv_export: "nourish-mcp export --format csv",
48
+ },
49
+ safety_rules: [
50
+ "Require explicit user intent for intake, hydration, goals, and deletion mutations.",
51
+ "Keep local food logs out of chat unless the user asks to inspect or export them.",
52
+ "Preserve source attribution and confidence values.",
53
+ "Do not present nutrition estimates as medical advice.",
54
+ ],
55
+ };
56
+ }
57
+ //# sourceMappingURL=usage-guide.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-guide.js","sourceRoot":"","sources":["../../src/services/usage-guide.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAc9D,MAAM,UAAU,eAAe;IAC7B,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,cAAc;QACvB,YAAY,EAAE;YACZ,iCAAiC;YACjC,4BAA4B;YAC5B,6BAA6B;YAC7B,wFAAwF;SACzF;QACD,eAAe,EAAE;YACf;gBACE,IAAI,EAAE,sBAAsB;gBAC5B,KAAK,EAAE;oBACL,sCAAsC;oBACtC,oEAAoE;oBACpE,0DAA0D;iBAC3D;aACF;YACD;gBACE,IAAI,EAAE,YAAY;gBAClB,KAAK,EAAE;oBACL,4EAA4E;oBAC5E,sEAAsE;oBACtE,8EAA8E;iBAC/E;aACF;YACD;gBACE,IAAI,EAAE,qBAAqB;gBAC3B,KAAK,EAAE;oBACL,2DAA2D;oBAC3D,yDAAyD;oBACzD,kEAAkE;iBACnE;aACF;SACF;QACD,SAAS,EAAE;YACT,KAAK,EAAE,mCAAmC;YAC1C,MAAM,EAAE,oBAAoB;YAC5B,OAAO,EAAE,kEAAkE;YAC3E,IAAI,EAAE,6BAA6B;YACnC,IAAI,EAAE,uEAAuE;YAC7E,SAAS,EAAE,wCAAwC;YACnD,SAAS,EAAE,yCAAyC;YACpD,KAAK,EAAE,0EAA0E;YACjF,UAAU,EAAE,iCAAiC;SAC9C;QACD,YAAY,EAAE;YACZ,oFAAoF;YACpF,kFAAkF;YAClF,oDAAoD;YACpD,uDAAuD;SACxD;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerNourishTools(server: McpServer): void;