@murphai/murph 0.1.1 → 0.1.13

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 (100) hide show
  1. package/CHANGELOG.md +154 -0
  2. package/README.md +103 -60
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/assistant/ui/ink.d.ts.map +1 -1
  5. package/dist/assistant/ui/ink.js +2 -3
  6. package/dist/assistant/ui/ink.js.map +1 -1
  7. package/dist/assistant-runtime.d.ts +0 -2
  8. package/dist/assistant-runtime.d.ts.map +1 -1
  9. package/dist/assistant-runtime.js +0 -1
  10. package/dist/assistant-runtime.js.map +1 -1
  11. package/dist/commands/device.js +1 -1
  12. package/dist/commands/device.js.map +1 -1
  13. package/dist/commands/export-intake-read-helpers.d.ts +1 -1
  14. package/dist/commands/knowledge.d.ts +3 -0
  15. package/dist/commands/knowledge.d.ts.map +1 -0
  16. package/dist/commands/knowledge.js +164 -0
  17. package/dist/commands/knowledge.js.map +1 -0
  18. package/dist/commands/wearables.d.ts +4985 -0
  19. package/dist/commands/wearables.d.ts.map +1 -0
  20. package/dist/commands/wearables.js +355 -0
  21. package/dist/commands/wearables.js.map +1 -0
  22. package/dist/commands/workout.d.ts.map +1 -1
  23. package/dist/commands/workout.js +330 -28
  24. package/dist/commands/workout.js.map +1 -1
  25. package/dist/incur-error-bridge.d.ts +2 -0
  26. package/dist/incur-error-bridge.d.ts.map +1 -0
  27. package/dist/incur-error-bridge.js +25 -0
  28. package/dist/incur-error-bridge.js.map +1 -0
  29. package/dist/incur.generated.d.ts +118 -1
  30. package/dist/incur.generated.d.ts.map +1 -1
  31. package/dist/index.d.ts +2 -0
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +2 -0
  34. package/dist/index.js.map +1 -1
  35. package/dist/knowledge-cli-contracts.d.ts +179 -0
  36. package/dist/knowledge-cli-contracts.d.ts.map +1 -0
  37. package/dist/knowledge-cli-contracts.js +78 -0
  38. package/dist/knowledge-cli-contracts.js.map +1 -0
  39. package/dist/knowledge-documents.d.ts +44 -0
  40. package/dist/knowledge-documents.d.ts.map +1 -0
  41. package/dist/knowledge-documents.js +195 -0
  42. package/dist/knowledge-documents.js.map +1 -0
  43. package/dist/knowledge-lint.d.ts +11 -0
  44. package/dist/knowledge-lint.d.ts.map +1 -0
  45. package/dist/knowledge-lint.js +254 -0
  46. package/dist/knowledge-lint.js.map +1 -0
  47. package/dist/knowledge-runtime.d.ts +49 -0
  48. package/dist/knowledge-runtime.d.ts.map +1 -0
  49. package/dist/knowledge-runtime.js +227 -0
  50. package/dist/knowledge-runtime.js.map +1 -0
  51. package/dist/research-runtime.d.ts +3 -40
  52. package/dist/research-runtime.d.ts.map +1 -1
  53. package/dist/research-runtime.js +54 -253
  54. package/dist/research-runtime.js.map +1 -1
  55. package/dist/review-gpt-runtime.d.ts +85 -0
  56. package/dist/review-gpt-runtime.d.ts.map +1 -0
  57. package/dist/review-gpt-runtime.js +239 -0
  58. package/dist/review-gpt-runtime.js.map +1 -0
  59. package/dist/setup-assistant.d.ts +1 -0
  60. package/dist/setup-assistant.d.ts.map +1 -1
  61. package/dist/setup-assistant.js +2 -1
  62. package/dist/setup-assistant.js.map +1 -1
  63. package/dist/setup-cli.d.ts.map +1 -1
  64. package/dist/setup-cli.js +10 -1
  65. package/dist/setup-cli.js.map +1 -1
  66. package/dist/setup-wizard.d.ts.map +1 -1
  67. package/dist/setup-wizard.js +26 -7
  68. package/dist/setup-wizard.js.map +1 -1
  69. package/dist/usecases/workout-artifacts.d.ts +21 -0
  70. package/dist/usecases/workout-artifacts.d.ts.map +1 -0
  71. package/dist/usecases/workout-artifacts.js +149 -0
  72. package/dist/usecases/workout-artifacts.js.map +1 -0
  73. package/dist/usecases/workout-format.d.ts +92 -10
  74. package/dist/usecases/workout-format.d.ts.map +1 -1
  75. package/dist/usecases/workout-format.js +211 -391
  76. package/dist/usecases/workout-format.js.map +1 -1
  77. package/dist/usecases/workout-import.d.ts +36 -0
  78. package/dist/usecases/workout-import.d.ts.map +1 -0
  79. package/dist/usecases/workout-import.js +587 -0
  80. package/dist/usecases/workout-import.js.map +1 -0
  81. package/dist/usecases/workout-measurement.d.ts +66 -0
  82. package/dist/usecases/workout-measurement.d.ts.map +1 -0
  83. package/dist/usecases/workout-measurement.js +285 -0
  84. package/dist/usecases/workout-measurement.js.map +1 -0
  85. package/dist/usecases/workout-model.d.ts +15 -0
  86. package/dist/usecases/workout-model.d.ts.map +1 -0
  87. package/dist/usecases/workout-model.js +161 -0
  88. package/dist/usecases/workout-model.js.map +1 -0
  89. package/dist/usecases/workout.d.ts +57 -20
  90. package/dist/usecases/workout.d.ts.map +1 -1
  91. package/dist/usecases/workout.js +360 -214
  92. package/dist/usecases/workout.js.map +1 -1
  93. package/dist/vault-cli-command-manifest.d.ts +5179 -3
  94. package/dist/vault-cli-command-manifest.d.ts.map +1 -1
  95. package/dist/vault-cli-command-manifest.js +140 -3
  96. package/dist/vault-cli-command-manifest.js.map +1 -1
  97. package/dist/vault-cli.d.ts.map +1 -1
  98. package/dist/vault-cli.js +2 -0
  99. package/dist/vault-cli.js.map +1 -1
  100. package/package.json +22 -13
@@ -0,0 +1,587 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { basename, extname } from 'node:path';
3
+ import path from 'node:path';
4
+ import { readFile } from 'node:fs/promises';
5
+ import { CONTRACT_SCHEMA_VERSION, } from '@murphai/contracts';
6
+ import { applyCanonicalWriteBatch } from '@murphai/core';
7
+ import { parseDelimitedRows } from '@murphai/importers';
8
+ import { generateUlid } from '@murphai/runtime-state';
9
+ import { VaultCliError } from '@murphai/assistant-core/vault-cli-errors';
10
+ import { upsertEventRecord } from '@murphai/assistant-core/usecases/provider-event';
11
+ import { compactObject, normalizeOptionalText } from '@murphai/assistant-core/usecases/vault-usecase-helpers';
12
+ import { buildStructuredWorkoutEventPayload } from './workout.js';
13
+ const DEFAULT_SOURCE = 'strong';
14
+ const DEFAULT_DELIMITER = ',';
15
+ function normalizeHeaderName(value) {
16
+ return value.trim().toLowerCase().replace(/[^a-z0-9]+/gu, '');
17
+ }
18
+ function sanitizePathSegment(value, fallback) {
19
+ const normalized = value
20
+ .trim()
21
+ .toLowerCase()
22
+ .replace(/[^a-z0-9]+/gu, '-')
23
+ .replace(/^-+|-+$/gu, '');
24
+ return normalized.length > 0 ? normalized : fallback;
25
+ }
26
+ function sanitizeFileName(fileName) {
27
+ const ext = extname(fileName);
28
+ const stem = basename(fileName, ext)
29
+ .replace(/[^A-Za-z0-9._-]+/gu, '-')
30
+ .replace(/^-+|-+$/gu, '');
31
+ const safeStem = stem.length > 0 ? stem : 'workout-import';
32
+ return `${safeStem}${ext || '.csv'}`;
33
+ }
34
+ function valueAt(row, index) {
35
+ if (index === undefined) {
36
+ return undefined;
37
+ }
38
+ const value = row[index];
39
+ return typeof value === 'string' ? value.trim() : undefined;
40
+ }
41
+ function findHeaderIndex(headers, aliases) {
42
+ const normalizedHeaders = headers.map(normalizeHeaderName);
43
+ for (const alias of aliases) {
44
+ const aliasKey = normalizeHeaderName(alias);
45
+ const index = normalizedHeaders.indexOf(aliasKey);
46
+ if (index >= 0) {
47
+ return index;
48
+ }
49
+ }
50
+ return undefined;
51
+ }
52
+ function parseOptionalNumber(value) {
53
+ const normalized = normalizeOptionalText(value);
54
+ if (!normalized) {
55
+ return undefined;
56
+ }
57
+ const match = normalized.replace(/,/gu, '').match(/-?\d+(?:\.\d+)?/u);
58
+ if (!match) {
59
+ return undefined;
60
+ }
61
+ const parsed = Number.parseFloat(match[0]);
62
+ return Number.isFinite(parsed) ? parsed : undefined;
63
+ }
64
+ function parseBooleanLike(value) {
65
+ const normalized = normalizeOptionalText(value)?.toLowerCase();
66
+ return normalized === 'true' || normalized === 'yes' || normalized === 'y' || normalized === '1';
67
+ }
68
+ function parseOptionalInteger(value) {
69
+ const parsed = parseOptionalNumber(value);
70
+ if (parsed === undefined) {
71
+ return undefined;
72
+ }
73
+ return Math.round(parsed);
74
+ }
75
+ function normalizeLoadUnit(value) {
76
+ const normalized = normalizeOptionalText(value)?.toLowerCase();
77
+ if (!normalized) {
78
+ return undefined;
79
+ }
80
+ if (normalized.startsWith('lb') || normalized.startsWith('pound')) {
81
+ return 'lb';
82
+ }
83
+ if (normalized.startsWith('kg') || normalized.startsWith('kilo')) {
84
+ return 'kg';
85
+ }
86
+ return undefined;
87
+ }
88
+ function parseWeight(value) {
89
+ const normalized = normalizeOptionalText(value);
90
+ if (!normalized) {
91
+ return {};
92
+ }
93
+ return {
94
+ weight: parseOptionalNumber(normalized),
95
+ unit: normalizeLoadUnit(normalized),
96
+ };
97
+ }
98
+ function parseDistanceMeters(value) {
99
+ const normalized = normalizeOptionalText(value)?.toLowerCase();
100
+ if (!normalized) {
101
+ return undefined;
102
+ }
103
+ const amount = parseOptionalNumber(normalized);
104
+ if (amount === undefined) {
105
+ return undefined;
106
+ }
107
+ if (normalized.includes('km')) {
108
+ return amount * 1000;
109
+ }
110
+ if (normalized.includes('mi')) {
111
+ return amount * 1609.344;
112
+ }
113
+ if (normalized.includes('m')) {
114
+ return amount;
115
+ }
116
+ return amount;
117
+ }
118
+ function parseDistanceKm(value) {
119
+ const meters = parseDistanceMeters(value);
120
+ return meters !== undefined ? meters / 1000 : undefined;
121
+ }
122
+ function parseDurationSeconds(value) {
123
+ const normalized = normalizeOptionalText(value);
124
+ if (!normalized) {
125
+ return undefined;
126
+ }
127
+ const colonParts = normalized.split(':').map((part) => part.trim());
128
+ if (colonParts.length === 2 || colonParts.length === 3) {
129
+ const numbers = colonParts.map((part) => Number.parseInt(part, 10));
130
+ if (numbers.every((entry) => Number.isFinite(entry))) {
131
+ if (numbers.length === 2) {
132
+ const [minutes, seconds] = numbers;
133
+ return minutes * 60 + seconds;
134
+ }
135
+ const [hours, minutes, seconds] = numbers;
136
+ return hours * 3600 + minutes * 60 + seconds;
137
+ }
138
+ }
139
+ const amount = parseOptionalNumber(normalized);
140
+ if (amount === undefined) {
141
+ return undefined;
142
+ }
143
+ if (normalized.includes('hour')) {
144
+ return Math.round(amount * 3600);
145
+ }
146
+ if (normalized.includes('min')) {
147
+ return Math.round(amount * 60);
148
+ }
149
+ return Math.round(amount);
150
+ }
151
+ function parseDurationMinutes(value) {
152
+ const normalized = normalizeOptionalText(value);
153
+ if (!normalized) {
154
+ return undefined;
155
+ }
156
+ if (normalized.includes(':')) {
157
+ const seconds = parseDurationSeconds(normalized);
158
+ return seconds !== undefined ? Math.max(1, Math.round(seconds / 60)) : undefined;
159
+ }
160
+ const amount = parseOptionalNumber(normalized);
161
+ if (amount === undefined) {
162
+ return undefined;
163
+ }
164
+ if (normalized.includes('hour')) {
165
+ return Math.max(1, Math.round(amount * 60));
166
+ }
167
+ if (normalized.includes('sec')) {
168
+ return Math.max(1, Math.round(amount / 60));
169
+ }
170
+ return Math.max(1, Math.round(amount));
171
+ }
172
+ function normalizeSetType(value) {
173
+ const normalized = normalizeOptionalText(value)?.toLowerCase();
174
+ if (!normalized) {
175
+ return undefined;
176
+ }
177
+ if (normalized.includes('warm')) {
178
+ return 'warmup';
179
+ }
180
+ if (normalized.includes('drop')) {
181
+ return 'dropset';
182
+ }
183
+ if (normalized.includes('fail')) {
184
+ return 'failure';
185
+ }
186
+ return 'normal';
187
+ }
188
+ function normalizeTimestamp(dateValue, timeValue) {
189
+ const dateText = normalizeOptionalText(dateValue);
190
+ const timeText = normalizeOptionalText(timeValue);
191
+ if (dateText && timeText) {
192
+ const composite = `${dateText} ${timeText}`;
193
+ const parsed = new Date(composite);
194
+ if (Number.isFinite(parsed.getTime())) {
195
+ return parsed.toISOString();
196
+ }
197
+ }
198
+ if (dateText) {
199
+ if (/^\d{4}-\d{2}-\d{2}$/u.test(dateText)) {
200
+ return `${dateText}T12:00:00.000Z`;
201
+ }
202
+ const parsed = new Date(dateText);
203
+ if (Number.isFinite(parsed.getTime())) {
204
+ return parsed.toISOString();
205
+ }
206
+ }
207
+ return undefined;
208
+ }
209
+ function detectSource(headers) {
210
+ const normalizedHeaders = new Set(headers.map(normalizeHeaderName));
211
+ if (normalizedHeaders.has('exerciseimage')
212
+ || normalizedHeaders.has('primarymuscles')
213
+ || normalizedHeaders.has('secondarymuscles')) {
214
+ return 'hevy';
215
+ }
216
+ if (normalizedHeaders.has('workoutname')
217
+ || normalizedHeaders.has('exercisename')
218
+ || normalizedHeaders.has('setorder')) {
219
+ return 'strong';
220
+ }
221
+ return null;
222
+ }
223
+ function inspectWorkoutCsv(input) {
224
+ const delimiter = input.delimiter ?? DEFAULT_DELIMITER;
225
+ const rows = parseDelimitedRows(input.text, delimiter);
226
+ if (rows.length === 0) {
227
+ throw new VaultCliError('invalid_payload', 'Workout CSV is empty.');
228
+ }
229
+ const headerRow = rows[0] ?? [];
230
+ const headers = headerRow.map((cell) => cell.trim());
231
+ const dataRows = rows.slice(1).filter((row) => row.some((cell) => cell.trim().length > 0));
232
+ const detectedSource = detectSource(headers);
233
+ const workoutNameIndex = findHeaderIndex(headers, ['workout name', 'workout', 'routine name', 'routine', 'name']);
234
+ const dateIndex = findHeaderIndex(headers, ['date', 'workout date', 'session date', 'day']);
235
+ const startTimeIndex = findHeaderIndex(headers, ['start time', 'start', 'started at', 'started']);
236
+ const estimatedKeys = new Set();
237
+ for (const row of dataRows) {
238
+ const workoutName = valueAt(row, workoutNameIndex) ?? 'workout';
239
+ const occurredAt = normalizeTimestamp(valueAt(row, dateIndex), valueAt(row, startTimeIndex)) ?? `row-${estimatedKeys.size + 1}`;
240
+ estimatedKeys.add(`${occurredAt}::${workoutName}`);
241
+ }
242
+ const warnings = [];
243
+ if (headers.length === 0) {
244
+ warnings.push('The CSV header row did not contain any recognizable columns.');
245
+ }
246
+ if (findHeaderIndex(headers, ['exercise name', 'exercise', 'movement']) === undefined) {
247
+ warnings.push('No exercise column was detected; structured set import will be limited.');
248
+ }
249
+ return {
250
+ sourceFile: input.file,
251
+ source: input.source ?? detectedSource ?? DEFAULT_SOURCE,
252
+ detectedSource,
253
+ delimiter,
254
+ headers,
255
+ rowCount: dataRows.length,
256
+ estimatedWorkouts: estimatedKeys.size,
257
+ importable: dataRows.length > 0 && headers.length > 0,
258
+ warnings,
259
+ rows,
260
+ };
261
+ }
262
+ function resolveExerciseMode(exercise) {
263
+ const sets = exercise.sets;
264
+ if (sets.some((set) => typeof set.assistanceKg === 'number')) {
265
+ return 'assisted_bodyweight';
266
+ }
267
+ if (sets.some((set) => typeof set.addedWeightKg === 'number')) {
268
+ return 'weighted_bodyweight';
269
+ }
270
+ if (sets.some((set) => typeof set.bodyweightKg === 'number')) {
271
+ return 'bodyweight';
272
+ }
273
+ if (sets.some((set) => typeof set.distanceMeters === 'number') && sets.some((set) => typeof set.durationSeconds === 'number')) {
274
+ return 'cardio';
275
+ }
276
+ if (sets.every((set) => typeof set.durationSeconds === 'number' && set.reps === undefined && set.weight === undefined)) {
277
+ return 'duration';
278
+ }
279
+ return 'weight_reps';
280
+ }
281
+ function buildWorkoutSessionsFromCsv(headers, rows) {
282
+ const workoutNameIndex = findHeaderIndex(headers, ['workout name', 'workout', 'routine name', 'routine', 'name']);
283
+ const dateIndex = findHeaderIndex(headers, ['date', 'workout date', 'session date', 'day']);
284
+ const startTimeIndex = findHeaderIndex(headers, ['start time', 'start', 'started at', 'started']);
285
+ const endTimeIndex = findHeaderIndex(headers, ['end time', 'end', 'ended at', 'ended']);
286
+ const durationIndex = findHeaderIndex(headers, ['duration minutes', 'duration min', 'duration']);
287
+ const distanceIndex = findHeaderIndex(headers, ['distance', 'distance km']);
288
+ const workoutNoteIndex = findHeaderIndex(headers, ['note', 'notes', 'workout note', 'session note']);
289
+ const exerciseNameIndex = findHeaderIndex(headers, ['exercise name', 'exercise', 'movement']);
290
+ const exerciseNoteIndex = findHeaderIndex(headers, ['exercise note', 'movement note']);
291
+ const setOrderIndex = findHeaderIndex(headers, ['set order', 'set number', 'set']);
292
+ const repsIndex = findHeaderIndex(headers, ['reps', 'rep']);
293
+ const weightIndex = findHeaderIndex(headers, ['weight', 'load']);
294
+ const weightUnitIndex = findHeaderIndex(headers, ['weight unit', 'load unit', 'unit']);
295
+ const setTypeIndex = findHeaderIndex(headers, ['set type', 'type']);
296
+ const groupIndex = findHeaderIndex(headers, ['group', 'group id', 'superset', 'circuit']);
297
+ const rpeIndex = findHeaderIndex(headers, ['rpe']);
298
+ const durationSecondsIndex = findHeaderIndex(headers, ['duration seconds', 'seconds', 'time']);
299
+ const setDistanceIndex = findHeaderIndex(headers, ['set distance', 'distance meters', 'distance']);
300
+ const bodyweightIndex = findHeaderIndex(headers, ['bodyweight', 'body weight']);
301
+ const assistanceIndex = findHeaderIndex(headers, ['assistance', 'assisted weight']);
302
+ const addedWeightIndex = findHeaderIndex(headers, ['added weight', 'extra weight']);
303
+ const warmupIndex = findHeaderIndex(headers, ['warmup', 'warm up']);
304
+ const dropsetIndex = findHeaderIndex(headers, ['dropset', 'drop set']);
305
+ const failureIndex = findHeaderIndex(headers, ['failure']);
306
+ const sessions = new Map();
307
+ for (let rowIndex = 1; rowIndex < rows.length; rowIndex += 1) {
308
+ const row = rows[rowIndex];
309
+ if (!row || row.every((cell) => cell.trim().length === 0)) {
310
+ continue;
311
+ }
312
+ const workoutName = valueAt(row, workoutNameIndex) ?? 'Workout';
313
+ const occurredAt = normalizeTimestamp(valueAt(row, dateIndex), valueAt(row, startTimeIndex));
314
+ const key = `${occurredAt ?? `row-${rowIndex + 1}`}::${workoutName}`;
315
+ let session = sessions.get(key);
316
+ if (!session) {
317
+ session = {
318
+ key,
319
+ title: workoutName,
320
+ occurredAt,
321
+ startedAt: occurredAt,
322
+ endedAt: normalizeTimestamp(valueAt(row, dateIndex), valueAt(row, endTimeIndex)),
323
+ durationMinutes: parseDurationMinutes(valueAt(row, durationIndex)),
324
+ distanceKm: parseDistanceKm(valueAt(row, distanceIndex)),
325
+ note: valueAt(row, workoutNoteIndex),
326
+ rawRows: [],
327
+ exercises: [],
328
+ };
329
+ sessions.set(key, session);
330
+ }
331
+ session.rawRows.push(rowIndex + 1);
332
+ session.note = session.note ?? valueAt(row, workoutNoteIndex);
333
+ session.durationMinutes = session.durationMinutes ?? parseDurationMinutes(valueAt(row, durationIndex));
334
+ session.distanceKm = session.distanceKm ?? parseDistanceKm(valueAt(row, distanceIndex));
335
+ session.endedAt = session.endedAt ?? normalizeTimestamp(valueAt(row, dateIndex), valueAt(row, endTimeIndex));
336
+ const exerciseName = valueAt(row, exerciseNameIndex);
337
+ if (!exerciseName) {
338
+ continue;
339
+ }
340
+ let exercise = session.exercises.find((entry) => entry.name === exerciseName);
341
+ if (!exercise) {
342
+ exercise = {
343
+ name: exerciseName,
344
+ order: session.exercises.length + 1,
345
+ groupId: valueAt(row, groupIndex),
346
+ note: valueAt(row, exerciseNoteIndex),
347
+ sets: [],
348
+ };
349
+ session.exercises.push(exercise);
350
+ }
351
+ const parsedWeight = parseWeight(valueAt(row, weightIndex));
352
+ const explicitWeightUnit = normalizeLoadUnit(valueAt(row, weightUnitIndex));
353
+ const type = normalizeSetType(valueAt(row, setTypeIndex))
354
+ ?? (parseBooleanLike(valueAt(row, warmupIndex))
355
+ ? 'warmup'
356
+ : parseBooleanLike(valueAt(row, dropsetIndex))
357
+ ? 'dropset'
358
+ : parseBooleanLike(valueAt(row, failureIndex))
359
+ ? 'failure'
360
+ : 'normal');
361
+ const set = compactObject({
362
+ order: parseOptionalInteger(valueAt(row, setOrderIndex)) ?? exercise.sets.length + 1,
363
+ type,
364
+ reps: parseOptionalInteger(valueAt(row, repsIndex)),
365
+ weight: parsedWeight.weight,
366
+ weightUnit: explicitWeightUnit ?? parsedWeight.unit,
367
+ durationSeconds: parseDurationSeconds(valueAt(row, durationSecondsIndex)),
368
+ distanceMeters: parseDistanceMeters(valueAt(row, setDistanceIndex)),
369
+ rpe: parseOptionalNumber(valueAt(row, rpeIndex)),
370
+ bodyweightKg: parseOptionalNumber(valueAt(row, bodyweightIndex)),
371
+ assistanceKg: parseOptionalNumber(valueAt(row, assistanceIndex)),
372
+ addedWeightKg: parseOptionalNumber(valueAt(row, addedWeightIndex)),
373
+ });
374
+ if (set.reps === undefined
375
+ && set.weight === undefined
376
+ && set.durationSeconds === undefined
377
+ && set.distanceMeters === undefined
378
+ && set.rpe === undefined
379
+ && set.bodyweightKg === undefined
380
+ && set.assistanceKg === undefined
381
+ && set.addedWeightKg === undefined) {
382
+ continue;
383
+ }
384
+ exercise.sets.push(set);
385
+ exercise.groupId = exercise.groupId ?? valueAt(row, groupIndex);
386
+ exercise.note = exercise.note ?? valueAt(row, exerciseNoteIndex);
387
+ }
388
+ return [...sessions.values()].map((session) => ({
389
+ ...session,
390
+ durationMinutes: session.durationMinutes
391
+ ?? (session.startedAt && session.endedAt
392
+ ? Math.max(1, Math.round((new Date(session.endedAt).getTime() - new Date(session.startedAt).getTime()) / 60000))
393
+ : undefined),
394
+ exercises: session.exercises
395
+ .map((exercise) => ({
396
+ ...exercise,
397
+ mode: resolveExerciseMode(exercise),
398
+ unitOverride: exercise.sets.find((set) => set.weightUnit)?.weightUnit,
399
+ sets: exercise.sets.slice().sort((left, right) => left.order - right.order),
400
+ }))
401
+ .filter((exercise) => exercise.sets.length > 0),
402
+ }));
403
+ }
404
+ function summarizeSessionExercises(session) {
405
+ const summary = session.exercises.flatMap((exercise) => {
406
+ const repValues = exercise.sets
407
+ .map((set) => set.reps)
408
+ .filter((value) => typeof value === 'number' && value > 0);
409
+ if (repValues.length === 0) {
410
+ return [];
411
+ }
412
+ const loadSet = exercise.sets.find((set) => typeof set.weight === 'number' && set.weightUnit);
413
+ return [{
414
+ exercise: exercise.name,
415
+ setCount: exercise.sets.length,
416
+ repsPerSet: repValues[0] ?? 0,
417
+ load: loadSet?.weight,
418
+ loadUnit: loadSet?.weightUnit,
419
+ }];
420
+ });
421
+ return summary.length > 0 ? summary : undefined;
422
+ }
423
+ function buildManifest(input) {
424
+ return {
425
+ schemaVersion: CONTRACT_SCHEMA_VERSION.rawImportManifest,
426
+ importId: input.importId,
427
+ importKind: input.importKind,
428
+ importedAt: input.importedAt,
429
+ source: input.source,
430
+ rawDirectory: input.rawDirectory,
431
+ artifacts: [{
432
+ role: 'source',
433
+ relativePath: input.rawFile,
434
+ originalFileName: input.originalFileName,
435
+ mediaType: input.mediaType,
436
+ byteSize: Buffer.byteLength(input.content, 'utf8'),
437
+ sha256: createHash('sha256').update(input.content).digest('hex'),
438
+ }],
439
+ provenance: input.provenance,
440
+ };
441
+ }
442
+ export async function inspectWorkoutCsvImport(input) {
443
+ const text = await readFile(input.file, 'utf8');
444
+ const inspection = inspectWorkoutCsv({
445
+ file: input.file,
446
+ source: input.source,
447
+ delimiter: input.delimiter,
448
+ text,
449
+ });
450
+ return {
451
+ vault: input.vault,
452
+ sourceFile: input.file,
453
+ source: inspection.source,
454
+ detectedSource: inspection.detectedSource,
455
+ delimiter: inspection.delimiter,
456
+ headers: inspection.headers,
457
+ rowCount: inspection.rowCount,
458
+ estimatedWorkouts: inspection.estimatedWorkouts,
459
+ importable: inspection.importable,
460
+ warnings: inspection.warnings,
461
+ };
462
+ }
463
+ export async function importWorkoutCsv(input) {
464
+ const text = await readFile(input.file, 'utf8');
465
+ const inspection = inspectWorkoutCsv({
466
+ file: input.file,
467
+ source: input.source,
468
+ delimiter: input.delimiter,
469
+ text,
470
+ });
471
+ const importId = `wkimp_${generateUlid()}`;
472
+ const importedAt = new Date().toISOString();
473
+ const safeSource = sanitizePathSegment(inspection.source, DEFAULT_SOURCE);
474
+ const year = importedAt.slice(0, 4);
475
+ const month = importedAt.slice(5, 7);
476
+ const rawDirectory = path.posix.join('raw', 'workouts', safeSource, year, month, importId);
477
+ const safeFileName = sanitizeFileName(path.basename(input.file));
478
+ const rawFile = path.posix.join(rawDirectory, safeFileName);
479
+ const manifestFile = path.posix.join(rawDirectory, 'manifest.json');
480
+ const sessions = buildWorkoutSessionsFromCsv(inspection.headers, inspection.rows);
481
+ const warnings = [...inspection.warnings];
482
+ if (sessions.length === 0 && !input.storeRawOnly) {
483
+ warnings.push('No structured workouts were detected; only the raw CSV was stored.');
484
+ }
485
+ const manifest = buildManifest({
486
+ importId,
487
+ importKind: 'workout_batch',
488
+ importedAt,
489
+ source: inspection.source,
490
+ rawDirectory,
491
+ rawFile,
492
+ originalFileName: path.basename(input.file),
493
+ mediaType: 'text/csv',
494
+ content: text,
495
+ provenance: {
496
+ sourceFileName: path.basename(input.file),
497
+ delimiter: inspection.delimiter,
498
+ headers: inspection.headers,
499
+ rowCount: inspection.rowCount,
500
+ estimatedWorkouts: inspection.estimatedWorkouts,
501
+ warnings,
502
+ },
503
+ });
504
+ await applyCanonicalWriteBatch({
505
+ vaultRoot: input.vault,
506
+ operationType: 'workout_import_csv',
507
+ summary: `Import workout CSV ${path.basename(input.file)}`,
508
+ rawContents: [{
509
+ targetRelativePath: rawFile,
510
+ content: text,
511
+ originalFileName: path.basename(input.file),
512
+ mediaType: 'text/csv',
513
+ allowExistingMatch: true,
514
+ }],
515
+ textWrites: [{
516
+ relativePath: manifestFile,
517
+ content: `${JSON.stringify(manifest, null, 2)}\n`,
518
+ overwrite: false,
519
+ allowExistingMatch: true,
520
+ }],
521
+ });
522
+ const lookupIds = [];
523
+ const ledgerFiles = new Set();
524
+ if (!input.storeRawOnly) {
525
+ for (const session of sessions) {
526
+ if (session.exercises.length === 0) {
527
+ continue;
528
+ }
529
+ const workout = {
530
+ sourceApp: inspection.source,
531
+ sourceWorkoutId: session.key.slice(0, 200),
532
+ startedAt: session.startedAt,
533
+ endedAt: session.endedAt,
534
+ routineName: session.title,
535
+ sessionNote: session.note,
536
+ exercises: session.exercises.map((exercise) => ({
537
+ name: exercise.name,
538
+ order: exercise.order,
539
+ groupId: exercise.groupId,
540
+ mode: exercise.mode,
541
+ unitOverride: exercise.unitOverride,
542
+ note: exercise.note,
543
+ sets: exercise.sets,
544
+ })),
545
+ };
546
+ const payload = buildStructuredWorkoutEventPayload({
547
+ payload: compactObject({
548
+ title: session.title,
549
+ occurredAt: session.occurredAt,
550
+ source: 'import',
551
+ activityType: 'strength-training',
552
+ durationMinutes: session.durationMinutes,
553
+ distanceKm: session.distanceKm,
554
+ note: session.note,
555
+ rawRefs: [rawFile],
556
+ externalRef: {
557
+ system: safeSource,
558
+ resourceType: 'workout-session',
559
+ resourceId: session.key.slice(0, 200),
560
+ },
561
+ workout,
562
+ strengthExercises: summarizeSessionExercises(session),
563
+ }),
564
+ source: 'import',
565
+ });
566
+ const result = await upsertEventRecord({
567
+ vault: input.vault,
568
+ payload,
569
+ });
570
+ lookupIds.push(result.lookupId);
571
+ ledgerFiles.add(result.ledgerFile);
572
+ }
573
+ }
574
+ return {
575
+ vault: input.vault,
576
+ sourceFile: input.file,
577
+ rawFile,
578
+ manifestFile,
579
+ source: inspection.source,
580
+ importedCount: lookupIds.length,
581
+ rawOnly: input.storeRawOnly === true || lookupIds.length === 0,
582
+ lookupIds,
583
+ ledgerFiles: [...ledgerFiles],
584
+ warnings,
585
+ };
586
+ }
587
+ //# sourceMappingURL=workout-import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workout-import.js","sourceRoot":"","sources":["../../src/usecases/workout-import.ts"],"names":[],"mappings":"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"}