skill-calorie 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 (373) hide show
  1. package/dist/analysis/anomaly/common.d.ts +53 -0
  2. package/dist/analysis/anomaly/common.d.ts.map +1 -0
  3. package/dist/analysis/anomaly/common.js +69 -0
  4. package/dist/analysis/anomaly/common.js.map +1 -0
  5. package/dist/analysis/anomaly/diet.d.ts +8 -0
  6. package/dist/analysis/anomaly/diet.d.ts.map +1 -0
  7. package/dist/analysis/anomaly/diet.js +95 -0
  8. package/dist/analysis/anomaly/diet.js.map +1 -0
  9. package/dist/analysis/anomaly/exercise.d.ts +9 -0
  10. package/dist/analysis/anomaly/exercise.d.ts.map +1 -0
  11. package/dist/analysis/anomaly/exercise.js +116 -0
  12. package/dist/analysis/anomaly/exercise.js.map +1 -0
  13. package/dist/analysis/anomaly/index.d.ts +19 -0
  14. package/dist/analysis/anomaly/index.d.ts.map +1 -0
  15. package/dist/analysis/anomaly/index.js +51 -0
  16. package/dist/analysis/anomaly/index.js.map +1 -0
  17. package/dist/analysis/anomaly/overall.d.ts +13 -0
  18. package/dist/analysis/anomaly/overall.d.ts.map +1 -0
  19. package/dist/analysis/anomaly/overall.js +128 -0
  20. package/dist/analysis/anomaly/overall.js.map +1 -0
  21. package/dist/analysis/anomaly/overall2.d.ts +5 -0
  22. package/dist/analysis/anomaly/overall2.d.ts.map +1 -0
  23. package/dist/analysis/anomaly/overall2.js +94 -0
  24. package/dist/analysis/anomaly/overall2.js.map +1 -0
  25. package/dist/analysis/anomaly/weight.d.ts +8 -0
  26. package/dist/analysis/anomaly/weight.d.ts.map +1 -0
  27. package/dist/analysis/anomaly/weight.js +106 -0
  28. package/dist/analysis/anomaly/weight.js.map +1 -0
  29. package/dist/analysis/anomaly/weight2.d.ts +4 -0
  30. package/dist/analysis/anomaly/weight2.d.ts.map +1 -0
  31. package/dist/analysis/anomaly/weight2.js +59 -0
  32. package/dist/analysis/anomaly/weight2.js.map +1 -0
  33. package/dist/analysis/contraindications.d.ts +63 -0
  34. package/dist/analysis/contraindications.d.ts.map +1 -0
  35. package/dist/analysis/contraindications.js +121 -0
  36. package/dist/analysis/contraindications.js.map +1 -0
  37. package/dist/analysis/cross.d.ts +75 -0
  38. package/dist/analysis/cross.d.ts.map +1 -0
  39. package/dist/analysis/cross.js +283 -0
  40. package/dist/analysis/cross.js.map +1 -0
  41. package/dist/analysis/dashboard.d.ts +18 -0
  42. package/dist/analysis/dashboard.d.ts.map +1 -0
  43. package/dist/analysis/dashboard.js +48 -0
  44. package/dist/analysis/dashboard.js.map +1 -0
  45. package/dist/analysis/deficit.d.ts +44 -0
  46. package/dist/analysis/deficit.d.ts.map +1 -0
  47. package/dist/analysis/deficit.js +54 -0
  48. package/dist/analysis/deficit.js.map +1 -0
  49. package/dist/analysis/diet.d.ts +76 -0
  50. package/dist/analysis/diet.d.ts.map +1 -0
  51. package/dist/analysis/diet.js +164 -0
  52. package/dist/analysis/diet.js.map +1 -0
  53. package/dist/analysis/exercise.d.ts +98 -0
  54. package/dist/analysis/exercise.d.ts.map +1 -0
  55. package/dist/analysis/exercise.js +298 -0
  56. package/dist/analysis/exercise.js.map +1 -0
  57. package/dist/analysis/exerciseReview.d.ts +36 -0
  58. package/dist/analysis/exerciseReview.d.ts.map +1 -0
  59. package/dist/analysis/exerciseReview.js +50 -0
  60. package/dist/analysis/exerciseReview.js.map +1 -0
  61. package/dist/analysis/precision.d.ts +15 -0
  62. package/dist/analysis/precision.d.ts.map +1 -0
  63. package/dist/analysis/precision.js +38 -0
  64. package/dist/analysis/precision.js.map +1 -0
  65. package/dist/analysis/result.d.ts +15 -0
  66. package/dist/analysis/result.d.ts.map +1 -0
  67. package/dist/analysis/result.js +13 -0
  68. package/dist/analysis/result.js.map +1 -0
  69. package/dist/analysis/review.d.ts +118 -0
  70. package/dist/analysis/review.d.ts.map +1 -0
  71. package/dist/analysis/review.js +195 -0
  72. package/dist/analysis/review.js.map +1 -0
  73. package/dist/analysis/series.d.ts +42 -0
  74. package/dist/analysis/series.d.ts.map +1 -0
  75. package/dist/analysis/series.js +127 -0
  76. package/dist/analysis/series.js.map +1 -0
  77. package/dist/analysis/simulate.d.ts +43 -0
  78. package/dist/analysis/simulate.d.ts.map +1 -0
  79. package/dist/analysis/simulate.js +109 -0
  80. package/dist/analysis/simulate.js.map +1 -0
  81. package/dist/analysis/simulate2.d.ts +65 -0
  82. package/dist/analysis/simulate2.d.ts.map +1 -0
  83. package/dist/analysis/simulate2.js +173 -0
  84. package/dist/analysis/simulate2.js.map +1 -0
  85. package/dist/analysis/trend.d.ts +39 -0
  86. package/dist/analysis/trend.d.ts.map +1 -0
  87. package/dist/analysis/trend.js +48 -0
  88. package/dist/analysis/trend.js.map +1 -0
  89. package/dist/analysis/utils.d.ts +17 -0
  90. package/dist/analysis/utils.d.ts.map +1 -0
  91. package/dist/analysis/utils.js +52 -0
  92. package/dist/analysis/utils.js.map +1 -0
  93. package/dist/analysis/volatility.d.ts +43 -0
  94. package/dist/analysis/volatility.d.ts.map +1 -0
  95. package/dist/analysis/volatility.js +96 -0
  96. package/dist/analysis/volatility.js.map +1 -0
  97. package/dist/analysis/weight.d.ts +86 -0
  98. package/dist/analysis/weight.d.ts.map +1 -0
  99. package/dist/analysis/weight.js +219 -0
  100. package/dist/analysis/weight.js.map +1 -0
  101. package/dist/analysis/weightCompare.d.ts +63 -0
  102. package/dist/analysis/weightCompare.d.ts.map +1 -0
  103. package/dist/analysis/weightCompare.js +212 -0
  104. package/dist/analysis/weightCompare.js.map +1 -0
  105. package/dist/analysis/weightCompare2.d.ts +63 -0
  106. package/dist/analysis/weightCompare2.d.ts.map +1 -0
  107. package/dist/analysis/weightCompare2.js +211 -0
  108. package/dist/analysis/weightCompare2.js.map +1 -0
  109. package/dist/analysis/weightCompare3.d.ts +13 -0
  110. package/dist/analysis/weightCompare3.d.ts.map +1 -0
  111. package/dist/analysis/weightCompare3.js +199 -0
  112. package/dist/analysis/weightCompare3.js.map +1 -0
  113. package/dist/cli/cmd_read.d.ts +8 -0
  114. package/dist/cli/cmd_read.d.ts.map +1 -0
  115. package/dist/cli/cmd_read.js +719 -0
  116. package/dist/cli/cmd_read.js.map +1 -0
  117. package/dist/cli/keys.d.ts +333 -0
  118. package/dist/cli/keys.d.ts.map +1 -0
  119. package/dist/cli/keys.js +103 -0
  120. package/dist/cli/keys.js.map +1 -0
  121. package/dist/cli/write.d.ts +24 -0
  122. package/dist/cli/write.d.ts.map +1 -0
  123. package/dist/cli/write.js +832 -0
  124. package/dist/cli/write.js.map +1 -0
  125. package/dist/fetch/audit.d.ts +25 -0
  126. package/dist/fetch/audit.d.ts.map +1 -0
  127. package/dist/fetch/audit.js +46 -0
  128. package/dist/fetch/audit.js.map +1 -0
  129. package/dist/fetch/batch.d.ts +68 -0
  130. package/dist/fetch/batch.d.ts.map +1 -0
  131. package/dist/fetch/batch.js +183 -0
  132. package/dist/fetch/batch.js.map +1 -0
  133. package/dist/fetch/body.d.ts +89 -0
  134. package/dist/fetch/body.d.ts.map +1 -0
  135. package/dist/fetch/body.js +217 -0
  136. package/dist/fetch/body.js.map +1 -0
  137. package/dist/fetch/cli.d.ts +3 -0
  138. package/dist/fetch/cli.d.ts.map +1 -0
  139. package/dist/fetch/cli.js +195 -0
  140. package/dist/fetch/cli.js.map +1 -0
  141. package/dist/fetch/cross-skill.d.ts +29 -0
  142. package/dist/fetch/cross-skill.d.ts.map +1 -0
  143. package/dist/fetch/cross-skill.js +42 -0
  144. package/dist/fetch/cross-skill.js.map +1 -0
  145. package/dist/fetch/db.d.ts +5 -0
  146. package/dist/fetch/db.d.ts.map +1 -0
  147. package/dist/fetch/db.js +4 -0
  148. package/dist/fetch/db.js.map +1 -0
  149. package/dist/fetch/diet.d.ts +174 -0
  150. package/dist/fetch/diet.d.ts.map +1 -0
  151. package/dist/fetch/diet.js +239 -0
  152. package/dist/fetch/diet.js.map +1 -0
  153. package/dist/fetch/errors.d.ts +5 -0
  154. package/dist/fetch/errors.d.ts.map +1 -0
  155. package/dist/fetch/errors.js +8 -0
  156. package/dist/fetch/errors.js.map +1 -0
  157. package/dist/fetch/exercise.d.ts +72 -0
  158. package/dist/fetch/exercise.d.ts.map +1 -0
  159. package/dist/fetch/exercise.js +270 -0
  160. package/dist/fetch/exercise.js.map +1 -0
  161. package/dist/fetch/goal.d.ts +48 -0
  162. package/dist/fetch/goal.d.ts.map +1 -0
  163. package/dist/fetch/goal.js +73 -0
  164. package/dist/fetch/goal.js.map +1 -0
  165. package/dist/fetch/goalHistory.d.ts +24 -0
  166. package/dist/fetch/goalHistory.d.ts.map +1 -0
  167. package/dist/fetch/goalHistory.js +51 -0
  168. package/dist/fetch/goalHistory.js.map +1 -0
  169. package/dist/fetch/history.d.ts +28 -0
  170. package/dist/fetch/history.d.ts.map +1 -0
  171. package/dist/fetch/history.js +29 -0
  172. package/dist/fetch/history.js.map +1 -0
  173. package/dist/fetch/index.d.ts +23 -0
  174. package/dist/fetch/index.d.ts.map +1 -0
  175. package/dist/fetch/index.js +16 -0
  176. package/dist/fetch/index.js.map +1 -0
  177. package/dist/fetch/nutritionGoal.d.ts +115 -0
  178. package/dist/fetch/nutritionGoal.d.ts.map +1 -0
  179. package/dist/fetch/nutritionGoal.js +154 -0
  180. package/dist/fetch/nutritionGoal.js.map +1 -0
  181. package/dist/fetch/photos.d.ts +76 -0
  182. package/dist/fetch/photos.d.ts.map +1 -0
  183. package/dist/fetch/photos.js +193 -0
  184. package/dist/fetch/photos.js.map +1 -0
  185. package/dist/fetch/plan.d.ts +145 -0
  186. package/dist/fetch/plan.d.ts.map +1 -0
  187. package/dist/fetch/plan.js +258 -0
  188. package/dist/fetch/plan.js.map +1 -0
  189. package/dist/fetch/products.d.ts +62 -0
  190. package/dist/fetch/products.d.ts.map +1 -0
  191. package/dist/fetch/products.js +73 -0
  192. package/dist/fetch/products.js.map +1 -0
  193. package/dist/fetch/profile.d.ts +46 -0
  194. package/dist/fetch/profile.d.ts.map +1 -0
  195. package/dist/fetch/profile.js +105 -0
  196. package/dist/fetch/profile.js.map +1 -0
  197. package/dist/fetch/shapes.d.ts +41 -0
  198. package/dist/fetch/shapes.d.ts.map +1 -0
  199. package/dist/fetch/shapes.js +38 -0
  200. package/dist/fetch/shapes.js.map +1 -0
  201. package/dist/fetch/validate.d.ts +11 -0
  202. package/dist/fetch/validate.d.ts.map +1 -0
  203. package/dist/fetch/validate.js +64 -0
  204. package/dist/fetch/validate.js.map +1 -0
  205. package/dist/fetch/weight.d.ts +109 -0
  206. package/dist/fetch/weight.d.ts.map +1 -0
  207. package/dist/fetch/weight.js +210 -0
  208. package/dist/fetch/weight.js.map +1 -0
  209. package/dist/fetch/xunji-catalog.d.ts +17 -0
  210. package/dist/fetch/xunji-catalog.d.ts.map +1 -0
  211. package/dist/fetch/xunji-catalog.js +57 -0
  212. package/dist/fetch/xunji-catalog.js.map +1 -0
  213. package/dist/index.d.ts +17 -0
  214. package/dist/index.d.ts.map +1 -0
  215. package/dist/index.js +12 -0
  216. package/dist/index.js.map +1 -0
  217. package/dist/kcal.d.ts +21 -0
  218. package/dist/kcal.d.ts.map +1 -0
  219. package/dist/kcal.js +27 -0
  220. package/dist/kcal.js.map +1 -0
  221. package/dist/migrate/migrate.d.ts +71 -0
  222. package/dist/migrate/migrate.d.ts.map +1 -0
  223. package/dist/migrate/migrate.js +450 -0
  224. package/dist/migrate/migrate.js.map +1 -0
  225. package/dist/paths.d.ts +6 -0
  226. package/dist/paths.d.ts.map +1 -0
  227. package/dist/paths.js +34 -0
  228. package/dist/paths.js.map +1 -0
  229. package/dist/render/analysisPlate.d.ts +49 -0
  230. package/dist/render/analysisPlate.d.ts.map +1 -0
  231. package/dist/render/analysisPlate.js +149 -0
  232. package/dist/render/analysisPlate.js.map +1 -0
  233. package/dist/render/bodyPlate.d.ts +55 -0
  234. package/dist/render/bodyPlate.d.ts.map +1 -0
  235. package/dist/render/bodyPlate.js +97 -0
  236. package/dist/render/bodyPlate.js.map +1 -0
  237. package/dist/render/diet.d.ts +47 -0
  238. package/dist/render/diet.d.ts.map +1 -0
  239. package/dist/render/diet.js +94 -0
  240. package/dist/render/diet.js.map +1 -0
  241. package/dist/render/envelope.d.ts +60 -0
  242. package/dist/render/envelope.d.ts.map +1 -0
  243. package/dist/render/envelope.js +111 -0
  244. package/dist/render/envelope.js.map +1 -0
  245. package/dist/render/errors.d.ts +10 -0
  246. package/dist/render/errors.d.ts.map +1 -0
  247. package/dist/render/errors.js +9 -0
  248. package/dist/render/errors.js.map +1 -0
  249. package/dist/render/exercise.d.ts +20 -0
  250. package/dist/render/exercise.d.ts.map +1 -0
  251. package/dist/render/exercise.js +32 -0
  252. package/dist/render/exercise.js.map +1 -0
  253. package/dist/render/goal.d.ts +24 -0
  254. package/dist/render/goal.d.ts.map +1 -0
  255. package/dist/render/goal.js +23 -0
  256. package/dist/render/goal.js.map +1 -0
  257. package/dist/render/goalExtra.d.ts +45 -0
  258. package/dist/render/goalExtra.d.ts.map +1 -0
  259. package/dist/render/goalExtra.js +94 -0
  260. package/dist/render/goalExtra.js.map +1 -0
  261. package/dist/render/goalPlate.d.ts +66 -0
  262. package/dist/render/goalPlate.d.ts.map +1 -0
  263. package/dist/render/goalPlate.js +110 -0
  264. package/dist/render/goalPlate.js.map +1 -0
  265. package/dist/render/health.d.ts +21 -0
  266. package/dist/render/health.d.ts.map +1 -0
  267. package/dist/render/health.js +41 -0
  268. package/dist/render/health.js.map +1 -0
  269. package/dist/render/help.d.ts +18 -0
  270. package/dist/render/help.d.ts.map +1 -0
  271. package/dist/render/help.js +58 -0
  272. package/dist/render/help.js.map +1 -0
  273. package/dist/render/home.d.ts +30 -0
  274. package/dist/render/home.d.ts.map +1 -0
  275. package/dist/render/home.js +73 -0
  276. package/dist/render/home.js.map +1 -0
  277. package/dist/render/html.d.ts +66 -0
  278. package/dist/render/html.d.ts.map +1 -0
  279. package/dist/render/html.js +510 -0
  280. package/dist/render/html.js.map +1 -0
  281. package/dist/render/index.d.ts +47 -0
  282. package/dist/render/index.d.ts.map +1 -0
  283. package/dist/render/index.js +26 -0
  284. package/dist/render/index.js.map +1 -0
  285. package/dist/render/insightPlate.d.ts +55 -0
  286. package/dist/render/insightPlate.d.ts.map +1 -0
  287. package/dist/render/insightPlate.js +97 -0
  288. package/dist/render/insightPlate.js.map +1 -0
  289. package/dist/render/library.d.ts +32 -0
  290. package/dist/render/library.d.ts.map +1 -0
  291. package/dist/render/library.js +54 -0
  292. package/dist/render/library.js.map +1 -0
  293. package/dist/render/photo.d.ts +101 -0
  294. package/dist/render/photo.d.ts.map +1 -0
  295. package/dist/render/photo.js +241 -0
  296. package/dist/render/photo.js.map +1 -0
  297. package/dist/render/planPlate.d.ts +40 -0
  298. package/dist/render/planPlate.d.ts.map +1 -0
  299. package/dist/render/planPlate.js +72 -0
  300. package/dist/render/planPlate.js.map +1 -0
  301. package/dist/render/profilePlate.d.ts +17 -0
  302. package/dist/render/profilePlate.d.ts.map +1 -0
  303. package/dist/render/profilePlate.js +18 -0
  304. package/dist/render/profilePlate.js.map +1 -0
  305. package/dist/render/ranking.d.ts +22 -0
  306. package/dist/render/ranking.d.ts.map +1 -0
  307. package/dist/render/ranking.js +63 -0
  308. package/dist/render/ranking.js.map +1 -0
  309. package/dist/render/receipt.d.ts +71 -0
  310. package/dist/render/receipt.d.ts.map +1 -0
  311. package/dist/render/receipt.js +65 -0
  312. package/dist/render/receipt.js.map +1 -0
  313. package/dist/render/weightPlate.d.ts +54 -0
  314. package/dist/render/weightPlate.d.ts.map +1 -0
  315. package/dist/render/weightPlate.js +110 -0
  316. package/dist/render/weightPlate.js.map +1 -0
  317. package/dist/schema.d.ts +25 -0
  318. package/dist/schema.d.ts.map +1 -0
  319. package/dist/schema.js +281 -0
  320. package/dist/schema.js.map +1 -0
  321. package/dist/triggers/help-lookup.d.ts +28 -0
  322. package/dist/triggers/help-lookup.d.ts.map +1 -0
  323. package/dist/triggers/help-lookup.js +163 -0
  324. package/dist/triggers/help-lookup.js.map +1 -0
  325. package/dist/triggers/index.d.ts +24 -0
  326. package/dist/triggers/index.d.ts.map +1 -0
  327. package/dist/triggers/index.js +78 -0
  328. package/dist/triggers/index.js.map +1 -0
  329. package/dist/triggers/scene-01-home.d.ts +4 -0
  330. package/dist/triggers/scene-01-home.d.ts.map +1 -0
  331. package/dist/triggers/scene-01-home.js +13 -0
  332. package/dist/triggers/scene-01-home.js.map +1 -0
  333. package/dist/triggers/scene-02-diet.d.ts +4 -0
  334. package/dist/triggers/scene-02-diet.d.ts.map +1 -0
  335. package/dist/triggers/scene-02-diet.js +74 -0
  336. package/dist/triggers/scene-02-diet.js.map +1 -0
  337. package/dist/triggers/scene-03-weight.d.ts +4 -0
  338. package/dist/triggers/scene-03-weight.d.ts.map +1 -0
  339. package/dist/triggers/scene-03-weight.js +62 -0
  340. package/dist/triggers/scene-03-weight.js.map +1 -0
  341. package/dist/triggers/scene-04-exercise.d.ts +4 -0
  342. package/dist/triggers/scene-04-exercise.d.ts.map +1 -0
  343. package/dist/triggers/scene-04-exercise.js +43 -0
  344. package/dist/triggers/scene-04-exercise.js.map +1 -0
  345. package/dist/triggers/scene-05-workout.d.ts +4 -0
  346. package/dist/triggers/scene-05-workout.d.ts.map +1 -0
  347. package/dist/triggers/scene-05-workout.js +36 -0
  348. package/dist/triggers/scene-05-workout.js.map +1 -0
  349. package/dist/triggers/scene-06-goal.d.ts +4 -0
  350. package/dist/triggers/scene-06-goal.d.ts.map +1 -0
  351. package/dist/triggers/scene-06-goal.js +29 -0
  352. package/dist/triggers/scene-06-goal.js.map +1 -0
  353. package/dist/triggers/scene-07-profile.d.ts +4 -0
  354. package/dist/triggers/scene-07-profile.d.ts.map +1 -0
  355. package/dist/triggers/scene-07-profile.js +8 -0
  356. package/dist/triggers/scene-07-profile.js.map +1 -0
  357. package/dist/triggers/scene-08-body.d.ts +4 -0
  358. package/dist/triggers/scene-08-body.d.ts.map +1 -0
  359. package/dist/triggers/scene-08-body.js +17 -0
  360. package/dist/triggers/scene-08-body.js.map +1 -0
  361. package/dist/triggers/scene-09-photo.d.ts +4 -0
  362. package/dist/triggers/scene-09-photo.d.ts.map +1 -0
  363. package/dist/triggers/scene-09-photo.js +14 -0
  364. package/dist/triggers/scene-09-photo.js.map +1 -0
  365. package/dist/triggers/scene-10-analysis.d.ts +4 -0
  366. package/dist/triggers/scene-10-analysis.d.ts.map +1 -0
  367. package/dist/triggers/scene-10-analysis.js +180 -0
  368. package/dist/triggers/scene-10-analysis.js.map +1 -0
  369. package/dist/triggers/types.d.ts +66 -0
  370. package/dist/triggers/types.d.ts.map +1 -0
  371. package/dist/triggers/types.js +3 -0
  372. package/dist/triggers/types.js.map +1 -0
  373. package/package.json +35 -0
@@ -0,0 +1,174 @@
1
+ /** T3 #22 · 饮食取数(对照老家 scripts/diet.py)。
2
+ *
3
+ * 偏离老家:失败抛 FetchError(缺失阻断不返空),不 print(打印归 T11 CLI);
4
+ * 目标值直接读 daily_goal id=1(等价 nutrition_goal.get_nutrition_goal 同表同行)。
5
+ */
6
+ import type { DatabaseSync } from 'node:sqlite';
7
+ export declare const WATER_NAME = "\uD83D\uDCA7\u6C34";
8
+ export declare const MEALS: readonly ["早餐", "午餐", "下午茶", "晚餐", "夜宵"];
9
+ export type MealName = (typeof MEALS)[number];
10
+ /** 餐别时间窗(deleteMealsByType 口径,与 inferMealType 同源)。加餐 = 下午茶 + 夜宵。 */
11
+ export declare const MEAL_WINDOWS: Record<string, [number, number] | [number, number, number, number]>;
12
+ export declare function inferMealType(timeStr: string): string;
13
+ export interface MealRow {
14
+ id: number;
15
+ date: string;
16
+ time: string | null;
17
+ food_name: string;
18
+ grams: number;
19
+ calories: number;
20
+ protein: number;
21
+ carbs: number;
22
+ fat: number;
23
+ note: string | null;
24
+ }
25
+ export interface MealInput {
26
+ foodName: string;
27
+ calories: number;
28
+ protein: number;
29
+ carbs?: number;
30
+ fat?: number;
31
+ grams?: number;
32
+ note?: string;
33
+ date?: string;
34
+ time?: string;
35
+ mealOverride?: string;
36
+ }
37
+ export interface DailyGoalRow {
38
+ calorie_goal: number;
39
+ protein_goal: number;
40
+ carbs_goal: number;
41
+ fat_goal: number;
42
+ water_goal: number | null;
43
+ }
44
+ export declare function readGoal(db: DatabaseSync): DailyGoalRow | null;
45
+ export interface AddMealResult {
46
+ id: number | null;
47
+ duplicate: boolean;
48
+ dupId?: number;
49
+ date: string;
50
+ time: string;
51
+ food_name: string;
52
+ meal: string;
53
+ dateLabel: string;
54
+ rowsAffected: number;
55
+ message?: string;
56
+ todayTotals?: {
57
+ cal: number;
58
+ pro: number;
59
+ carbs: number;
60
+ fat: number;
61
+ count: number;
62
+ };
63
+ goals?: {
64
+ cal: number | null;
65
+ pro: number | null;
66
+ carbs: number | null;
67
+ fat: number | null;
68
+ };
69
+ remainingCal?: number | null;
70
+ }
71
+ export declare function addMeal(db: DatabaseSync, input: MealInput): AddMealResult;
72
+ export declare const MEAL_UPDATABLE: Set<string>;
73
+ export interface UpdateMealResult {
74
+ ok: true;
75
+ before: MealRow;
76
+ after: MealRow;
77
+ changed: string[];
78
+ }
79
+ export declare function updateMeal(db: DatabaseSync, entryId: number, fields: Record<string, unknown>): UpdateMealResult;
80
+ export declare function deleteMeal(db: DatabaseSync, entryId: number): {
81
+ id: number;
82
+ food_name: string;
83
+ calories: number;
84
+ deleted: number;
85
+ };
86
+ export interface CopyMealsResult {
87
+ ok: true;
88
+ copied: number;
89
+ skipped: number;
90
+ fromDate: string;
91
+ toDate: string;
92
+ copiedItems: {
93
+ time: string | null;
94
+ food_name: string;
95
+ grams: number;
96
+ calories: number;
97
+ }[];
98
+ skippedItems: {
99
+ time: string | null;
100
+ food_name: string;
101
+ grams: number;
102
+ calories: number;
103
+ }[];
104
+ }
105
+ export declare function copyMeals(db: DatabaseSync, fromDate: string, toDate?: string): CopyMealsResult;
106
+ export interface BatchMealItem {
107
+ date?: string;
108
+ time?: string;
109
+ food_name?: string;
110
+ grams?: number;
111
+ calories?: number;
112
+ protein?: number;
113
+ carbs?: number;
114
+ fat?: number;
115
+ note?: string;
116
+ }
117
+ export declare function addMealsBatch(db: DatabaseSync, entries: BatchMealItem[]): {
118
+ ok: true;
119
+ added: number;
120
+ skipped: number;
121
+ failed: number;
122
+ failures: [number, string][];
123
+ };
124
+ export declare function updateMealsByDate(db: DatabaseSync, targetDate: string, fields: Record<string, unknown>): {
125
+ ok: true;
126
+ matched: number;
127
+ updated: number;
128
+ before: Record<string, unknown>[];
129
+ after: Record<string, unknown>[];
130
+ changedFields: string[];
131
+ };
132
+ export declare function deleteMealsByDate(db: DatabaseSync, targetDate: string): {
133
+ date: string;
134
+ ok: true;
135
+ deleted: number;
136
+ before: Record<string, unknown>[];
137
+ };
138
+ export declare function deleteMealsByRange(db: DatabaseSync, startDate: string, endDate: string): {
139
+ start: string;
140
+ end: string;
141
+ ok: true;
142
+ deleted: number;
143
+ before: Record<string, unknown>[];
144
+ };
145
+ export declare function deleteMealsByType(db: DatabaseSync, targetDate: string, mealType: string): {
146
+ date: string;
147
+ meal: string;
148
+ ok: true;
149
+ deleted: number;
150
+ before: Record<string, unknown>[];
151
+ };
152
+ export declare function listMeals(db: DatabaseSync, targetDate?: string): MealRow[];
153
+ export interface DailySummary {
154
+ date: string;
155
+ entryCount: number;
156
+ totals: {
157
+ cal: number;
158
+ pro: number;
159
+ carbs: number;
160
+ fat: number;
161
+ };
162
+ waterMl: number;
163
+ goal: DailyGoalRow | null;
164
+ remaining: {
165
+ cal: number;
166
+ pro: number;
167
+ carbs: number;
168
+ fat: number;
169
+ water: number;
170
+ } | null;
171
+ overCal: boolean;
172
+ }
173
+ export declare function getDailySummary(db: DatabaseSync, targetDate?: string): DailySummary;
174
+ //# sourceMappingURL=diet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diet.d.ts","sourceRoot":"","sources":["../../src/fetch/diet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,239 @@
1
+ import { sql } from './db.js';
2
+ import { FetchError } from './errors.js';
3
+ export const WATER_NAME = '💧水';
4
+ export const MEALS = ['早餐', '午餐', '下午茶', '晚餐', '夜宵'];
5
+ /** 餐别时间窗(deleteMealsByType 口径,与 inferMealType 同源)。加餐 = 下午茶 + 夜宵。 */
6
+ export const MEAL_WINDOWS = {
7
+ 早餐: [6, 10], 午餐: [10, 14], 下午茶: [14, 18], 晚餐: [18, 22], 夜宵: [0, 6],
8
+ 加餐: [14, 22, 0, 6],
9
+ };
10
+ export function inferMealType(timeStr) {
11
+ const hour = parseInt(String(timeStr).split(':')[0], 10);
12
+ if (Number.isNaN(hour))
13
+ return '其他';
14
+ if (hour >= 6 && hour < 10)
15
+ return '早餐';
16
+ if (hour >= 10 && hour < 14)
17
+ return '午餐';
18
+ if (hour >= 14 && hour < 18)
19
+ return '下午茶';
20
+ if (hour >= 18 && hour < 22)
21
+ return '晚餐';
22
+ return '夜宵';
23
+ }
24
+ function todayStr() { return new Date().toISOString().slice(0, 10); }
25
+ function nowStr() { return new Date().toTimeString().slice(0, 8); }
26
+ function num(v, field) {
27
+ const n = typeof v === 'number' ? v : parseFloat(String(v));
28
+ if (!Number.isFinite(n))
29
+ throw new FetchError(`${field} 必须是数字: ${String(v)}`);
30
+ return n;
31
+ }
32
+ export function readGoal(db) {
33
+ const row = db.prepare('SELECT calorie_goal, protein_goal, carbs_goal, fat_goal, water_goal FROM daily_goal WHERE id = 1').get();
34
+ return row ?? null;
35
+ }
36
+ export function addMeal(db, input) {
37
+ const foodName = String(input.foodName ?? '').trim();
38
+ if (!foodName)
39
+ throw new FetchError('食物名必填');
40
+ const calories = num(input.calories, 'calories');
41
+ const protein = num(input.protein, 'protein');
42
+ const carbs = input.carbs === undefined ? 0 : num(input.carbs, 'carbs');
43
+ const fat = input.fat === undefined ? 0 : num(input.fat, 'fat');
44
+ const grams = input.grams === undefined ? 100 : num(input.grams, 'grams');
45
+ if (calories < 0 || protein < 0 || carbs < 0 || fat < 0 || grams <= 0) {
46
+ throw new FetchError('营养值不能为负,克数必须为正');
47
+ }
48
+ if (input.mealOverride !== undefined && !MEALS.includes(input.mealOverride)) {
49
+ throw new FetchError(`--meal 必须是以下值之一:${MEALS.join('、')}`);
50
+ }
51
+ const today = input.date ?? todayStr();
52
+ const now = input.time ?? nowStr();
53
+ // 幂等防重(老家 2026-08-11 #262):同 date+time+food_name+grams+calories 跳过。
54
+ const dup = db.prepare('SELECT id FROM food_log WHERE date=? AND time=? AND food_name=? AND grams=? AND calories=? LIMIT 1').get(today, now, foodName, grams, calories);
55
+ const meal = input.mealOverride ?? inferMealType(now);
56
+ if (dup) {
57
+ return {
58
+ id: null, duplicate: true, dupId: dup.id, date: today, time: now,
59
+ food_name: foodName, meal, dateLabel: input.date ? today : '今日', rowsAffected: 0,
60
+ message: `重复记录已跳过(同日期/时间/食物名/克数/热量已存在: ${today} ${now} ${foodName} ${grams}g ${calories}kcal)`,
61
+ };
62
+ }
63
+ const info = db.prepare('INSERT INTO food_log (date, time, food_name, grams, calories, protein, carbs, fat, note) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)').run(today, now, foodName, grams, calories, protein, carbs, fat, input.note ?? '');
64
+ const totals = db.prepare('SELECT SUM(calories), SUM(protein), SUM(carbs), SUM(fat), COUNT(*) FROM food_log WHERE date = ?').get(today);
65
+ const goal = readGoal(db);
66
+ return {
67
+ id: Number(info.lastInsertRowid), duplicate: false, date: today, time: now,
68
+ food_name: foodName, meal, dateLabel: input.date ? today : '今日', rowsAffected: 1,
69
+ todayTotals: {
70
+ cal: totals['SUM(calories)'] ?? 0, pro: totals['SUM(protein)'] ?? 0,
71
+ carbs: totals['SUM(carbs)'] ?? 0, fat: totals['SUM(fat)'] ?? 0, count: totals['COUNT(*)'] ?? 0,
72
+ },
73
+ goals: goal ? { cal: goal.calorie_goal, pro: goal.protein_goal, carbs: goal.carbs_goal, fat: goal.fat_goal } : undefined,
74
+ remainingCal: goal ? goal.calorie_goal - (totals['SUM(calories)'] ?? 0) : null,
75
+ };
76
+ }
77
+ export const MEAL_UPDATABLE = new Set([
78
+ 'food_name', 'grams', 'note', 'date', 'time', 'calories', 'protein', 'carbs', 'fat',
79
+ ]);
80
+ export function updateMeal(db, entryId, fields) {
81
+ const id = Number(entryId);
82
+ if (!Number.isInteger(id))
83
+ throw new FetchError('Entry ID 必须是数字');
84
+ const bad = Object.keys(fields).filter((k) => !MEAL_UPDATABLE.has(k));
85
+ if (bad.length)
86
+ throw new FetchError(`不支持字段: ${bad.join(', ')}; 支持: ${[...MEAL_UPDATABLE].join(', ')}`);
87
+ if (!Object.keys(fields).length)
88
+ throw new FetchError('至少传 1 个字段');
89
+ const before = db.prepare('SELECT id, date, time, food_name, grams, calories, protein, carbs, fat, note FROM food_log WHERE id = ?').get(id);
90
+ if (!before)
91
+ throw new FetchError(`Entry ID ${id} 不存在`);
92
+ const typed = {};
93
+ for (const [k, v] of Object.entries(fields)) {
94
+ if (['grams', 'calories', 'protein', 'carbs', 'fat'].includes(k)) {
95
+ const n = num(v, k);
96
+ if (n < 0)
97
+ throw new FetchError(`${k} 不能为负: ${String(v)}`);
98
+ typed[k] = n;
99
+ }
100
+ else
101
+ typed[k] = v;
102
+ }
103
+ const sets = Object.keys(typed).map((k) => `${k} = ?`).join(', ');
104
+ db.prepare(`UPDATE food_log SET ${sets} WHERE id = ?`).run(...Object.values(typed).map(sql), id);
105
+ const after = db.prepare('SELECT id, date, time, food_name, grams, calories, protein, carbs, fat, note FROM food_log WHERE id = ?').get(id);
106
+ const changed = Object.keys(typed).filter((k) => before[k] !== after[k]);
107
+ return { ok: true, before, after, changed };
108
+ }
109
+ export function deleteMeal(db, entryId) {
110
+ const id = Number(entryId);
111
+ if (!Number.isInteger(id))
112
+ throw new FetchError('Entry ID 必须是数字');
113
+ const row = db.prepare('SELECT food_name, calories FROM food_log WHERE id = ?').get(id);
114
+ if (!row)
115
+ throw new FetchError(`Entry ID ${id} 不存在`);
116
+ db.prepare('DELETE FROM food_log WHERE id = ?').run(id);
117
+ return { id, food_name: row.food_name, calories: row.calories, deleted: 1 };
118
+ }
119
+ export function copyMeals(db, fromDate, toDate) {
120
+ const target = toDate ?? todayStr();
121
+ const rows = db.prepare(`SELECT time, food_name, grams, calories, protein, carbs, fat, note FROM food_log
122
+ WHERE date = ? AND food_name != ? ORDER BY time`).all(fromDate, WATER_NAME);
123
+ let copied = 0, skipped = 0;
124
+ const copiedItems = [];
125
+ const skippedItems = [];
126
+ for (const r of rows) {
127
+ const hit = db.prepare('SELECT COUNT(*) AS n FROM food_log WHERE date = ? AND time = ? AND food_name = ?').get(target, r.time, r.food_name);
128
+ if (hit.n > 0) {
129
+ skipped++;
130
+ skippedItems.push({ time: r.time, food_name: r.food_name, grams: r.grams, calories: r.calories });
131
+ continue;
132
+ }
133
+ db.prepare('INSERT INTO food_log (date, time, food_name, grams, calories, protein, carbs, fat, note) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)').run(target, r.time, r.food_name, r.grams, r.calories, r.protein, r.carbs, r.fat, r.note ?? '');
134
+ copied++;
135
+ copiedItems.push({ time: r.time, food_name: r.food_name, grams: r.grams, calories: r.calories });
136
+ }
137
+ return { ok: true, copied, skipped, fromDate, toDate: target, copiedItems, skippedItems };
138
+ }
139
+ export function addMealsBatch(db, entries) {
140
+ let added = 0, skipped = 0;
141
+ const failures = [];
142
+ entries.forEach((e, i) => {
143
+ try {
144
+ const food = String(e.food_name ?? '').trim();
145
+ const cal = num(e.calories ?? NaN, 'calories');
146
+ const pro = num(e.protein ?? NaN, 'protein');
147
+ if (!food || cal < 0 || pro < 0) {
148
+ skipped++;
149
+ failures.push([i, '食物名必填,营养值不能为负']);
150
+ return;
151
+ }
152
+ const d = String(e.date ?? todayStr());
153
+ const t = String(e.time ?? nowStr());
154
+ const g = e.grams === undefined || e.grams === null ? 100 : num(e.grams, 'grams');
155
+ const dup = db.prepare('SELECT id FROM food_log WHERE date=? AND time=? AND food_name=? AND grams=? AND calories=? LIMIT 1').get(d, t, food, g, cal);
156
+ if (dup) {
157
+ skipped++;
158
+ failures.push([i, `重复记录已跳过: ${d} ${t} ${food} ${g}g ${cal}kcal`]);
159
+ return;
160
+ }
161
+ db.prepare('INSERT INTO food_log (date, time, food_name, grams, calories, protein, carbs, fat, note) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)').run(d, t, food, g, cal, pro, e.carbs === undefined || e.carbs === null ? 0 : num(e.carbs, 'carbs'), e.fat === undefined || e.fat === null ? 0 : num(e.fat, 'fat'), String(e.note ?? ''));
162
+ added++;
163
+ }
164
+ catch (err) {
165
+ skipped++;
166
+ failures.push([i, `数值非法: ${err instanceof Error ? err.message : String(err)}`]);
167
+ }
168
+ });
169
+ return { ok: true, added, skipped, failed: failures.length, failures };
170
+ }
171
+ export function updateMealsByDate(db, targetDate, fields) {
172
+ const bad = Object.keys(fields).filter((k) => !MEAL_UPDATABLE.has(k));
173
+ if (bad.length)
174
+ throw new FetchError(`不支持字段: ${bad.join(', ')}`);
175
+ if (!Object.keys(fields).length)
176
+ throw new FetchError('至少传 1 个字段');
177
+ const ids = db.prepare('SELECT id FROM food_log WHERE date = ? AND food_name != ?').all(targetDate, WATER_NAME)
178
+ .map((r) => r.id);
179
+ const snap = (id) => db.prepare('SELECT food_name, grams, calories, protein, carbs, fat, note, time FROM food_log WHERE id = ?').get(id);
180
+ const before = ids.map(snap);
181
+ const typed = {};
182
+ for (const [k, v] of Object.entries(fields)) {
183
+ typed[k] = ['grams', 'calories', 'protein', 'carbs', 'fat'].includes(k) ? num(v, k) : v;
184
+ if (typeof typed[k] === 'number' && typed[k] < 0)
185
+ throw new FetchError(`${k} 不能为负`);
186
+ }
187
+ if (ids.length) {
188
+ const sets = Object.keys(typed).map((k) => `${k} = ?`).join(', ');
189
+ db.prepare(`UPDATE food_log SET ${sets} WHERE date = ? AND food_name != ?`).run(...Object.values(typed).map(sql), targetDate, WATER_NAME);
190
+ }
191
+ return { ok: true, matched: ids.length, updated: ids.length, before, after: ids.map(snap), changedFields: Object.keys(typed).sort() };
192
+ }
193
+ function deleteMealsWhere(db, where, params) {
194
+ const before = db.prepare(`SELECT date, time, food_name, grams, calories, note FROM food_log WHERE ${where}`).all(...params);
195
+ db.prepare(`DELETE FROM food_log WHERE ${where}`).run(...params);
196
+ return { ok: true, deleted: before.length, before };
197
+ }
198
+ export function deleteMealsByDate(db, targetDate) {
199
+ return { ...deleteMealsWhere(db, 'date = ? AND food_name != ?', [targetDate, WATER_NAME]), date: targetDate };
200
+ }
201
+ export function deleteMealsByRange(db, startDate, endDate) {
202
+ return { ...deleteMealsWhere(db, 'date BETWEEN ? AND ? AND food_name != ?', [startDate, endDate, WATER_NAME]), start: startDate, end: endDate };
203
+ }
204
+ export function deleteMealsByType(db, targetDate, mealType) {
205
+ const w = MEAL_WINDOWS[mealType];
206
+ if (!w)
207
+ throw new FetchError(`餐别必须是 ${Object.keys(MEAL_WINDOWS).join('/')} 之一`);
208
+ const hourExpr = "CAST(strftime('%H', time) AS INT)";
209
+ const where = w.length === 4
210
+ ? `date = ? AND food_name != ? AND ((${hourExpr} >= ? AND ${hourExpr} < ?) OR (${hourExpr} >= ? AND ${hourExpr} < ?))`
211
+ : `date = ? AND food_name != ? AND (${hourExpr} >= ? AND ${hourExpr} < ?)`;
212
+ return { ...deleteMealsWhere(db, where, [targetDate, WATER_NAME, ...w]), date: targetDate, meal: mealType };
213
+ }
214
+ export function listMeals(db, targetDate) {
215
+ const date = targetDate ?? todayStr();
216
+ return db.prepare('SELECT id, date, time, food_name, grams, calories, protein, carbs, fat, note FROM food_log WHERE date = ? ORDER BY time').all(date);
217
+ }
218
+ export function getDailySummary(db, targetDate) {
219
+ const date = targetDate ?? todayStr();
220
+ const t = db.prepare(`SELECT SUM(calories), SUM(protein), SUM(carbs), SUM(fat), COUNT(*) FROM food_log WHERE date = ? AND food_name != ?`).get(date, WATER_NAME);
221
+ const w = db.prepare('SELECT COALESCE(SUM(grams), 0) AS w FROM food_log WHERE date = ? AND food_name = ?').get(date, WATER_NAME);
222
+ const totals = {
223
+ cal: t['SUM(calories)'] ?? 0, pro: t['SUM(protein)'] ?? 0,
224
+ carbs: t['SUM(carbs)'] ?? 0, fat: t['SUM(fat)'] ?? 0,
225
+ };
226
+ const goal = readGoal(db);
227
+ const waterGoal = goal?.water_goal ?? 2000;
228
+ return {
229
+ date, entryCount: t['COUNT(*)'] ?? 0, totals, waterMl: w.w,
230
+ goal,
231
+ remaining: goal ? {
232
+ cal: goal.calorie_goal - totals.cal, pro: goal.protein_goal - totals.pro,
233
+ carbs: goal.carbs_goal - totals.carbs, fat: goal.fat_goal - totals.fat,
234
+ water: waterGoal - w.w,
235
+ } : null,
236
+ overCal: goal ? goal.calorie_goal - totals.cal < 0 : false,
237
+ };
238
+ }
239
+ //# sourceMappingURL=diet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diet.js","sourceRoot":"","sources":["../../src/fetch/diet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** T4 #23 · 取数层统一错误:失败抛错(缺失阻断不返空),打印归 CLI(T11)。 */
2
+ export declare class FetchError extends Error {
3
+ constructor(message: string);
4
+ }
5
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/fetch/errors.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,qBAAa,UAAW,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM;CAI5B"}
@@ -0,0 +1,8 @@
1
+ /** T4 #23 · 取数层统一错误:失败抛错(缺失阻断不返空),打印归 CLI(T11)。 */
2
+ export class FetchError extends Error {
3
+ constructor(message) {
4
+ super(message);
5
+ this.name = 'FetchError';
6
+ }
7
+ }
8
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/fetch/errors.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,72 @@
1
+ /** T3 #22 · 运动取数(对照老家 scripts/exercise.py + exercise_tracker.py)。
2
+ *
3
+ * 删除为软删除(is_deleted=1,老家 ticket #5 语义);列表默认排除已软删除。
4
+ * 失败抛 FetchError;MET 关键词表与公式逐字对照老家(含 '中' 原样口径)。
5
+ */
6
+ import type { DatabaseSync } from 'node:sqlite';
7
+ export declare function lookupMet(exerciseType: string | null | undefined): number;
8
+ export declare function inferCategory(exerciseType: string | null | undefined): string;
9
+ export declare function estimateCaloriesMet(exerciseType: string, bodyWeight: number, durationMinutes?: number, sets?: number): [number, number];
10
+ export declare function estimateDifficultyMet(met: number | null | undefined): string | null;
11
+ /** 口语难度映射(老家原样口径:中等档返回 '中',非 'normal')。 */
12
+ export declare function parseUserDifficulty(userText: string | null | undefined): string | null;
13
+ export declare function combinedCalories(userReported: number | null | undefined, estimated: number, warnAt?: number): [number | null, string | null, number];
14
+ export declare function estimateCaloriesFromTraining(totalVolumeKg: number): number;
15
+ export declare function convertLoadKg(weightStr: unknown, unitStr: unknown): number;
16
+ export type WindowName = 'today' | 'yesterday' | 'week' | 'last-week' | 'month' | 'last-month';
17
+ export declare function resolveWindow(opts?: {
18
+ window?: string;
19
+ days?: number;
20
+ fromDate?: string;
21
+ toDate?: string;
22
+ now?: Date;
23
+ }): [string, string];
24
+ export declare function parseTimeStr(timeStr?: string): string;
25
+ export interface ExerciseRecordInput {
26
+ date: string;
27
+ exerciseType: string;
28
+ caloriesBurned: number;
29
+ minutes?: number | null;
30
+ timeStr?: string;
31
+ note?: string;
32
+ reps?: number | null;
33
+ category?: string | null;
34
+ difficulty?: string | null;
35
+ distance?: number | null;
36
+ heartRate?: number | null;
37
+ maxHeartRate?: number | null;
38
+ steps?: number | null;
39
+ setIndex?: number | null;
40
+ loadKg?: number | null;
41
+ isBackfill?: boolean;
42
+ }
43
+ export type ExerciseRow = Record<string, unknown>;
44
+ export declare function addRecord(db: DatabaseSync, input: ExerciseRecordInput): {
45
+ id: number;
46
+ record: ExerciseRow;
47
+ };
48
+ export declare function updateRecord(db: DatabaseSync, recordId: number, fields: Record<string, unknown>): {
49
+ old: ExerciseRow;
50
+ new: ExerciseRow;
51
+ };
52
+ export declare function deleteRecord(db: DatabaseSync, recordId: number): ExerciseRow;
53
+ export declare function deleteDay(db: DatabaseSync, date: string): number;
54
+ export declare function deleteRange(db: DatabaseSync, fromDate: string, toDate: string): number;
55
+ export declare function updateDay(db: DatabaseSync, date: string, fields: Record<string, unknown>): {
56
+ matched: number;
57
+ pairs: {
58
+ old: ExerciseRow;
59
+ new: ExerciseRow;
60
+ }[];
61
+ };
62
+ export declare function copyYesterday(db: DatabaseSync, targetDate?: string): {
63
+ copied: number;
64
+ skipped: number;
65
+ rows: ExerciseRow[];
66
+ };
67
+ export declare function batchAdd(db: DatabaseSync, items: ExerciseRecordInput[]): {
68
+ added: number;
69
+ ids: number[];
70
+ };
71
+ export declare function listWindow(db: DatabaseSync, start: string, end: string): ExerciseRow[];
72
+ //# sourceMappingURL=exercise.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exercise.d.ts","sourceRoot":"","sources":["../../src/fetch/exercise.ts"],"names":[],"mappings":"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"}