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 @@
1
+ {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/analysis/review.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAOhD,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAmB1D,wBAAgB,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,GAAE,SAAkB,EAAE,KAAK,GAAE,MAAmB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAchI;AAED,MAAM,WAAW,SAAS;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE;AAChJ,MAAM,WAAW,OAAO;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AAC5I,MAAM,WAAW,cAAc;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE;AAClE,MAAM,WAAW,cAAc;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,OAAO,EAAE,CAAA;CAAE;AAChL,MAAM,WAAW,OAAO;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE;AAC/F,MAAM,WAAW,QAAQ;IAAG,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,WAAW,EAAE,SAAS,EAAE,CAAC;IAAC,SAAS,EAAE,OAAO,EAAE,CAAC;IAAC,UAAU,EAAE,cAAc,EAAE,CAAC;IAAC,WAAW,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE;QAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,QAAQ,EAAE,OAAO,EAAE,CAAA;CAAE;AAMnW,wBAAgB,UAAU,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,QAAQ,CA+DjF;AAED,MAAM,WAAW,cAAc;IAAG,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AAEjH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc,CAa7G;AAED,MAAM,WAAW,UAAU;IAAG,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE;AAChI,MAAM,WAAW,aAAc,SAAQ,QAAQ;IAC7C,YAAY,EAAE;QAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;KAAE,CAAC;IACjE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACpI,WAAW,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IACtH,UAAU,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACrE,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,cAAc,EAAE,cAAc,CAAC;IAC/B,cAAc,EAAE,IAAI,CAAC;IACrB,eAAe,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,GAAE,MAAmB,GAAG,aAAa,CA0ExG"}
@@ -0,0 +1,195 @@
1
+ import { FetchError } from '../fetch/errors.js';
2
+ import { getActivityFactor, shiftISODate, todayISO } from './utils.js';
3
+ const round = (n) => Math.round(n);
4
+ const round1 = (n) => Math.round(n * 10) / 10;
5
+ function normalizeDate(s, refISO) {
6
+ const t = s.trim();
7
+ if (/^\d{4}-\d{2}-\d{2}$/.test(t)) {
8
+ if (Number.isNaN(Date.parse(t + 'T12:00:00Z')))
9
+ throw new FetchError('日期格式错误: ' + s);
10
+ return t;
11
+ }
12
+ if (t.includes('/')) {
13
+ const parts = t.split('/');
14
+ const m = Number(parts[0]);
15
+ const d = Number(parts[1]);
16
+ if (!Number.isInteger(m) || !Number.isInteger(d))
17
+ throw new FetchError('日期格式错误: ' + s);
18
+ return refISO.slice(0, 4) + '-' + String(m).padStart(2, '0') + '-' + String(d).padStart(2, '0');
19
+ }
20
+ if (/^\d{1,2}$/.test(t))
21
+ return refISO.slice(0, 8) + t.padStart(2, '0');
22
+ throw new FetchError('无法解析日期: ' + s);
23
+ }
24
+ export function parseRange(rangeArg, rangeType = 'week', today = todayISO()) {
25
+ if (rangeArg) {
26
+ if (rangeArg.includes(':')) {
27
+ const parts = rangeArg.split(':');
28
+ return [normalizeDate(parts[0], today), normalizeDate(parts[1], today)];
29
+ }
30
+ const d = normalizeDate(rangeArg, today);
31
+ return [d, d];
32
+ }
33
+ if (rangeType === 'day')
34
+ return [today, today];
35
+ if (rangeType === 'week')
36
+ return [shiftISODate(today, -6), today];
37
+ if (rangeType === 'month')
38
+ return [today.slice(0, 8) + '01', today];
39
+ if (rangeType === 'year')
40
+ return [today.slice(0, 4) + '-01-01', today];
41
+ throw new FetchError('未知 range_type: ' + rangeType);
42
+ }
43
+ function daysBetween(d1, d2) {
44
+ return Math.round((Date.parse(d2 + 'T12:00:00Z') - Date.parse(d1 + 'T12:00:00Z')) / 86400000);
45
+ }
46
+ export function query5dims(db, start, end) {
47
+ const dailyIntake = db.prepare("SELECT date, SUM(calories) AS totalCalorie, SUM(protein) AS totalProtein, SUM(carbs) AS totalCarbs, SUM(fat) AS totalFat, COUNT(*) AS mealCount" +
48
+ " FROM food_log WHERE food_name != '💧水' AND date BETWEEN ? AND ? GROUP BY date ORDER BY date").all(start, end);
49
+ const dailyBurn = db.prepare('SELECT date, SUM(calories_burned) AS totalBurned, SUM(duration_minutes) AS totalMinutes,' +
50
+ ' GROUP_CONCAT(DISTINCT exercise_type) AS types, GROUP_CONCAT(DISTINCT category) AS categories' +
51
+ ' FROM exercise_log WHERE date BETWEEN ? AND ? GROUP BY date ORDER BY date').all(start, end);
52
+ const weightLogs = db.prepare('SELECT date, weight_kg AS weightKg FROM weight_log WHERE date BETWEEN ? AND ? ORDER BY date').all(start, end);
53
+ const cfg = db.prepare('SELECT * FROM workout_plan_config WHERE id = 1').get();
54
+ let fitnessPlan = null;
55
+ if (cfg) {
56
+ const plans = db.prepare('SELECT * FROM workout_plans ORDER BY week_number, day_of_week, session_index').all();
57
+ const index = new Map();
58
+ for (const p of plans) {
59
+ const k = p.week_number + ':' + p.day_of_week;
60
+ if (!index.has(k))
61
+ index.set(k, []);
62
+ index.get(k).push(p);
63
+ }
64
+ fitnessPlan = [];
65
+ for (let d = start; d <= end; d = shiftISODate(d, 1)) {
66
+ const realWeek = Math.floor(dayDiff(cfg.start_date, d) / 7) + 1;
67
+ const planWeek = ((realWeek - 1) % cfg.total_weeks) + 1;
68
+ const dow = new Date(d + 'T12:00:00Z').getUTCDay();
69
+ const isoDow = dow === 0 ? 7 : dow;
70
+ for (const p of index.get(planWeek + ':' + isoDow) ?? []) {
71
+ fitnessPlan.push({
72
+ date: d, weekNumber: planWeek, dayOfWeek: isoDow, sessionLabel: p.session_label,
73
+ isRestDay: p.is_rest_day, totalSets: p.total_sets,
74
+ movements: p.movements ? JSON.parse(p.movements) : [],
75
+ });
76
+ }
77
+ }
78
+ }
79
+ const prof = db.prepare('SELECT height_cm, age, gender, activity_level FROM user_profile WHERE id = 1').get();
80
+ const goalRow = db.prepare('SELECT * FROM daily_goal WHERE id = 1').get();
81
+ const topRows = db.prepare("SELECT food_name AS n, SUM(calories) AS totalCal, COUNT(*) AS cnt FROM food_log WHERE food_name != '💧水' AND date BETWEEN ? AND ? GROUP BY food_name ORDER BY cnt DESC, totalCal DESC LIMIT 5").all(start, end);
82
+ return {
83
+ range: { start, end, days: daysBetween(start, end) + 1 },
84
+ dailyIntake,
85
+ dailyBurn,
86
+ weightLogs,
87
+ fitnessPlan,
88
+ userProfile: { heightCm: prof?.height_cm ?? null, age: prof?.age ?? 30, gender: prof?.gender ?? 'male', activityLevel: prof?.activity_level ?? 'moderate' },
89
+ nutritionTargets: goalRow ? { ...goalRow } : {},
90
+ topFoods: topRows.map((r) => ({ name: r.n, totalCal: r.totalCal, cnt: r.cnt, avgCalPerMeal: round(r.totalCal / Math.max(r.cnt, 1)) })),
91
+ };
92
+ function dayDiff(a, b) {
93
+ return Math.round((Date.parse(b + 'T12:00:00Z') - Date.parse(a + 'T12:00:00Z')) / 86400000);
94
+ }
95
+ }
96
+ export function nutritionMatchRate(dailyIntake, targets) {
97
+ if (dailyIntake.length === 0)
98
+ return { daysCount: 0, matchedDays: 0, matchRatePct: 0, summary: '无数据' };
99
+ const calGoal = targets['calorie_goal'];
100
+ const proGoal = targets['protein_goal'];
101
+ if (typeof calGoal !== 'number' || typeof proGoal !== 'number' || !calGoal || !proGoal) {
102
+ return { daysCount: dailyIntake.length, matchedDays: 0, matchRatePct: 0, summary: '无营养目标' };
103
+ }
104
+ let matched = 0;
105
+ for (const day of dailyIntake) {
106
+ if (Math.abs(day.totalCalorie - calGoal) <= calGoal * 0.1 && day.totalProtein >= proGoal * 0.8)
107
+ matched += 1;
108
+ }
109
+ const pct = round((matched / dailyIntake.length) * 100);
110
+ return { daysCount: dailyIntake.length, matchedDays: matched, matchRatePct: pct, summary: pct + '%(' + matched + '/' + dailyIntake.length + ' 天 配比达标)' };
111
+ }
112
+ export function deriveReview(db, dims, today = todayISO()) {
113
+ void db;
114
+ const completeIntake = dims.dailyIntake.filter((d) => d.date < today);
115
+ const todayIntake = dims.dailyIntake.find((d) => d.date === today) ?? null;
116
+ const completeBurn = dims.dailyBurn.filter((d) => d.date < today);
117
+ const todayBurn = dims.dailyBurn.find((d) => d.date === today) ?? null;
118
+ const latestWeight = dims.weightLogs.length > 0 ? dims.weightLogs[dims.weightLogs.length - 1].weightKg : null;
119
+ const prof = dims.userProfile;
120
+ const tdee = latestWeight && prof.heightCm
121
+ ? round((10 * latestWeight + 6.25 * prof.heightCm - 5 * prof.age + (prof.gender === 'male' ? 5 : -161)) * getActivityFactor(prof.activityLevel))
122
+ : 1800;
123
+ const intakeSummary = completeIntake.length > 0
124
+ ? {
125
+ daysCount: completeIntake.length,
126
+ avgCalorie: round1(completeIntake.reduce((a, d) => a + d.totalCalorie, 0) / completeIntake.length),
127
+ avgProtein: round1(completeIntake.reduce((a, d) => a + d.totalProtein, 0) / completeIntake.length),
128
+ avgCarbs: round1(completeIntake.reduce((a, d) => a + d.totalCarbs, 0) / completeIntake.length),
129
+ avgFat: round1(completeIntake.reduce((a, d) => a + d.totalFat, 0) / completeIntake.length),
130
+ }
131
+ : todayIntake
132
+ ? { daysCount: 1, isPartial: true, avgCalorie: todayIntake.totalCalorie, avgProtein: todayIntake.totalProtein, avgCarbs: todayIntake.totalCarbs, avgFat: todayIntake.totalFat }
133
+ : { daysCount: 0, avgCalorie: 0, avgProtein: 0, avgCarbs: 0, avgFat: 0 };
134
+ const burnSummary = completeBurn.length > 0
135
+ ? {
136
+ daysCount: completeBurn.length,
137
+ totalBurned: completeBurn.reduce((a, d) => a + d.totalBurned, 0),
138
+ avgBurned: round1(completeBurn.reduce((a, d) => a + d.totalBurned, 0) / completeBurn.length),
139
+ totalMinutes: completeBurn.reduce((a, d) => a + (d.totalMinutes ?? 0), 0),
140
+ }
141
+ : todayBurn
142
+ ? { daysCount: 1, isPartial: true, totalBurned: todayBurn.totalBurned, avgBurned: todayBurn.totalBurned, totalMinutes: todayBurn.totalMinutes ?? 0 }
143
+ : { daysCount: 0, totalBurned: 0, avgBurned: 0, totalMinutes: 0 };
144
+ const totalKcal = intakeSummary.avgProtein * 4 + intakeSummary.avgCarbs * 4 + intakeSummary.avgFat * 9;
145
+ const macroRatio = totalKcal > 0
146
+ ? { proteinPct: round((intakeSummary.avgProtein * 4) / totalKcal * 100), carbsPct: round((intakeSummary.avgCarbs * 4) / totalKcal * 100), fatPct: round((intakeSummary.avgFat * 9) / totalKcal * 100) }
147
+ : { proteinPct: 0, carbsPct: 0, fatPct: 0 };
148
+ const days = completeIntake.length > 0 ? completeIntake.length : (dims.range.days ?? 7);
149
+ const totalIntake = intakeSummary.avgCalorie * days;
150
+ const totalBurnedAll = burnSummary.totalBurned + tdee * days;
151
+ const weeklyDeficit = totalBurnedAll - totalIntake;
152
+ const nutritionMatch = nutritionMatchRate(completeIntake, dims.nutritionTargets);
153
+ const targets = dims.nutritionTargets;
154
+ const calGoal = typeof targets['calorie_goal'] === 'number' ? targets['calorie_goal'] : 1850;
155
+ const fatGoal = typeof targets['fat_goal'] === 'number' ? targets['fat_goal'] : 60;
156
+ const anomalyDays = [];
157
+ for (const d of completeIntake) {
158
+ if (d.totalCalorie > calGoal + 300)
159
+ anomalyDays.push({ date: d.date, type: 'intake_excess', value: d.totalCalorie, target: calGoal, diff: '+' + (d.totalCalorie - calGoal) + ' 卡', severity: 'warn' });
160
+ else if (d.totalCalorie < calGoal - 500)
161
+ anomalyDays.push({ date: d.date, type: 'intake_deficit', value: d.totalCalorie, target: calGoal, diff: (d.totalCalorie - calGoal) + ' 卡', severity: 'warn' });
162
+ if (d.totalFat > fatGoal * 1.5)
163
+ anomalyDays.push({ date: d.date, type: 'fat_excess', value: d.totalFat, target: fatGoal, diff: '+' + (d.totalFat - fatGoal) + 'g 脂肪', severity: 'info' });
164
+ }
165
+ const sortedBurn = [...completeBurn].sort((a, b) => (a.date < b.date ? -1 : 1));
166
+ let consec = 0;
167
+ let maxConsec = 0;
168
+ for (const d of sortedBurn) {
169
+ if ((d.totalBurned ?? 0) === 0) {
170
+ consec += 1;
171
+ maxConsec = Math.max(maxConsec, consec);
172
+ }
173
+ else
174
+ consec = 0;
175
+ }
176
+ if (maxConsec >= 3)
177
+ anomalyDays.push({ date: null, type: 'exercise_streak_miss', value: maxConsec, target: 1, diff: '连续 ' + maxConsec + ' 天未运动', severity: 'warn' });
178
+ return {
179
+ ...dims,
180
+ todayPartial: { intake: todayIntake, burn: todayBurn },
181
+ completeDaysCount: completeIntake.length,
182
+ tdee,
183
+ intakeSummary,
184
+ burnSummary,
185
+ macroRatio,
186
+ weeklyDeficit: round(weeklyDeficit),
187
+ avgDailyDeficit: days > 0 ? round(weeklyDeficit / days) : 0,
188
+ theoreticalWeightLoss: round1(weeklyDeficit / 7700),
189
+ nutritionMatch,
190
+ weightTrendSvg: null,
191
+ weightTrendMeta: { deferred: 'SVG 属渲染层,归 T8-T10(待裁决)' },
192
+ anomalyDays,
193
+ };
194
+ }
195
+ //# sourceMappingURL=review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/analysis/review.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEvE,MAAM,KAAK,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnD,MAAM,MAAM,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;AAI9D,SAAS,aAAa,CAAC,CAAS,EAAE,MAAc;IAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACnB,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAClC,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QACrF,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QACvF,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAClG,CAAC;IACD,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACxE,MAAM,IAAI,UAAU,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAwB,EAAE,YAAuB,MAAM,EAAE,QAAgB,QAAQ,EAAE;IAC5G,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAClC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAW,EAAE,KAAK,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,CAAW,EAAE,KAAK,CAAC,CAAC,CAAC;QAC9F,CAAC;QACD,MAAM,CAAC,GAAG,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACzC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChB,CAAC;IACD,IAAI,SAAS,KAAK,KAAK;QAAE,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC/C,IAAI,SAAS,KAAK,MAAM;QAAE,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAClE,IAAI,SAAS,KAAK,OAAO;QAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC;IACpE,IAAI,SAAS,KAAK,MAAM;QAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAC;IACvE,MAAM,IAAI,UAAU,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAAC;AACtD,CAAC;AASD,SAAS,WAAW,CAAC,EAAU,EAAE,EAAU;IACzC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,YAAY,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,YAAY,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;AAChG,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAgB,EAAE,KAAa,EAAE,GAAW;IACrE,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAC5B,iJAAiJ;QACjJ,8FAA8F,CAC/F,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAA2B,CAAC;IAC5C,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAC1B,0FAA0F;QAC1F,+FAA+F;QAC/F,2EAA2E,CAC5E,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAyB,CAAC;IAC1C,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAC3B,6FAA6F,CAC9F,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAgC,CAAC;IACjD,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC,GAAG,EAE/D,CAAC;IACd,IAAI,WAAW,GAA4B,IAAI,CAAC;IAChD,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,8EAA8E,CAAC,CAAC,GAAG,EAE1G,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,GAAG,EAAwB,CAAC;QAC9C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,GAAG,GAAG,GAAG,CAAC,CAAC,WAAW,CAAC;YAC9C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC;QACD,WAAW,GAAG,EAAE,CAAC;QACjB,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAChE,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACxD,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,SAAS,EAAE,CAAC;YACnD,MAAM,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACnC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,GAAG,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;gBACxD,WAAgC,CAAC,IAAI,CAAC;oBACrC,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,aAAa;oBAC/E,SAAS,EAAE,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,UAAU;oBACjD,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAc,CAAC,CAAC,CAAC,EAAE;iBACnE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,8EAA8E,CAAC,CAAC,GAAG,EAE9F,CAAC;IACd,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAC,GAAG,EAAyC,CAAC;IACjH,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CACxB,+LAA+L,CAChM,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAmE,CAAC;IACpF,OAAO;QACL,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE;QACxD,WAAW;QACX,SAAS;QACT,UAAU;QACV,WAAW;QACX,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,IAAI,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,IAAI,UAAU,EAAE;QAC3J,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE;QAC/C,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;KACvI,CAAC;IAEF,SAAS,OAAO,CAAC,CAAS,EAAE,CAAS;QACnC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,YAAY,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;IAC9F,CAAC;AACH,CAAC;AAID,MAAM,UAAU,kBAAkB,CAAC,WAAwB,EAAE,OAAgC;IAC3F,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACvG,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACxC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;QACvF,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAC9F,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,GAAG,OAAO,CAAC,IAAI,OAAO,GAAG,GAAG,IAAI,GAAG,CAAC,YAAY,IAAI,OAAO,GAAG,GAAG;YAAE,OAAO,IAAI,CAAC,CAAC;IAC/G,CAAC;IACD,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;IACxD,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,GAAG,IAAI,GAAG,OAAO,GAAG,GAAG,GAAG,WAAW,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;AAC3J,CAAC;AAmBD,MAAM,UAAU,YAAY,CAAC,EAAgB,EAAE,IAAc,EAAE,QAAgB,QAAQ,EAAE;IACvF,KAAK,EAAE,CAAC;IACR,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;IACtE,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC;IAC3E,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC;IACvE,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IAClI,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;IAC9B,MAAM,IAAI,GAAG,YAAY,IAAI,IAAI,CAAC,QAAQ;QACxC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,YAAY,GAAG,IAAI,GAAI,IAAI,CAAC,QAAmB,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5J,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,aAAa,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC;QAC7C,CAAC,CAAC;YACA,SAAS,EAAE,cAAc,CAAC,MAAM;YAChC,UAAU,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC;YAClG,UAAU,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC;YAClG,QAAQ,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC;YAC9F,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC;SAC3F;QACD,CAAC,CAAC,WAAW;YACX,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,IAAa,EAAE,UAAU,EAAE,WAAW,CAAC,YAAY,EAAE,UAAU,EAAE,WAAW,CAAC,YAAY,EAAE,QAAQ,EAAE,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC,QAAQ,EAAE;YACxL,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAC7E,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC;QACzC,CAAC,CAAC;YACA,SAAS,EAAE,YAAY,CAAC,MAAM;YAC9B,WAAW,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YAChE,SAAS,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC;YAC5F,YAAY,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;SAC1E;QACD,CAAC,CAAC,SAAS;YACT,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,IAAa,EAAE,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC,WAAW,EAAE,YAAY,EAAE,SAAS,CAAC,YAAY,IAAI,CAAC,EAAE;YAC7J,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;IACtE,MAAM,SAAS,GAAG,aAAa,CAAC,UAAU,GAAG,CAAC,GAAG,aAAa,CAAC,QAAQ,GAAG,CAAC,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;IACvG,MAAM,UAAU,GAAG,SAAS,GAAG,CAAC;QAC9B,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,aAAa,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,SAAS,GAAG,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,aAAa,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,SAAS,GAAG,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,SAAS,GAAG,GAAG,CAAC,EAAE;QACvM,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAC9C,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;IACxF,MAAM,WAAW,GAAG,aAAa,CAAC,UAAU,GAAG,IAAI,CAAC;IACpD,MAAM,cAAc,GAAG,WAAW,CAAC,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC;IAC7D,MAAM,aAAa,GAAG,cAAc,GAAG,WAAW,CAAC;IACnD,MAAM,cAAc,GAAG,kBAAkB,CAAC,cAAc,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC;IACtC,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,cAAc,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,OAAO,CAAC,cAAc,CAAY,CAAC,CAAC,CAAC,IAAI,CAAC;IACzG,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,UAAU,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,OAAO,CAAC,UAAU,CAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/F,MAAM,WAAW,GAAiB,EAAE,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;QAC/B,IAAI,CAAC,CAAC,YAAY,GAAG,OAAO,GAAG,GAAG;YAAE,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,YAAY,GAAG,OAAO,CAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;aAClM,IAAI,CAAC,CAAC,YAAY,GAAG,OAAO,GAAG,GAAG;YAAE,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,OAAO,CAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;QACvM,IAAI,CAAC,CAAC,QAAQ,GAAG,OAAO,GAAG,GAAG;YAAE,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5L,CAAC;IACD,MAAM,UAAU,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChF,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YAAC,MAAM,IAAI,CAAC,CAAC;YAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAAC,CAAC;;YACpF,MAAM,GAAG,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,SAAS,IAAI,CAAC;QAAE,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,GAAG,SAAS,GAAG,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IACrK,OAAO;QACL,GAAG,IAAI;QACP,YAAY,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE;QACtD,iBAAiB,EAAE,cAAc,CAAC,MAAM;QACxC,IAAI;QACJ,aAAa;QACb,WAAW;QACX,UAAU;QACV,aAAa,EAAE,KAAK,CAAC,aAAa,CAAC;QACnC,eAAe,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,qBAAqB,EAAE,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC;QACnD,cAAc;QACd,cAAc,EAAE,IAAI;QACpB,eAAe,EAAE,EAAE,QAAQ,EAAE,wBAAwB,EAAE;QACvD,WAAW;KACZ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,42 @@
1
+ /** T5 #24 · 日序列 series 构建器(对照老家 scripts/analysis/series.py)。
2
+ *
3
+ * ADR-0013 唯一真相源:多表按天对齐;deficit = (TDEE + 运动) − 摄入(正=缺口)。
4
+ * TDEE/目标全窗口静态值;无数据日字段为 null(不断言 0,不返空数组)。
5
+ * 键名驼峰化(老家 snake → TS camel),T8 渲染以此为准。
6
+ * today 可注入(默认 UTC 日,与 T3/T4 同口径)。
7
+ */
8
+ import type { DatabaseSync } from 'node:sqlite';
9
+ export declare const WATER_NAME = "\uD83D\uDCA7\u6C34";
10
+ export interface DaySeries {
11
+ date: string;
12
+ calories: number | null;
13
+ protein: number | null;
14
+ carbs: number | null;
15
+ fat: number | null;
16
+ sodiumMg: number | null;
17
+ sugarG: number | null;
18
+ fiberG: number | null;
19
+ waterMl: number | null;
20
+ exerciseKcal: number | null;
21
+ weightKg: number | null;
22
+ bodyFatPct: number | null;
23
+ waistCm: number | null;
24
+ tdee: number;
25
+ deficit: number | null;
26
+ calorieGoal: number;
27
+ waterGoal: number;
28
+ }
29
+ /** 窗口选择器:Nd / 本周/上周/今年…(老家别名 week_cur 等一并支持)/ custom / 默认 30d。 */
30
+ export declare function resolveWindow(window: string, start?: string | null, end?: string | null, today?: string): [string, string];
31
+ /** 档案 TDEE(体重恒 70.0 parity,见 utils 说明)。 */
32
+ export declare function loadProfileTdee(db: DatabaseSync): number;
33
+ export declare function buildSeries(db: DatabaseSync, start: string, end: string): DaySeries[];
34
+ /** 序列均值(null 跳过;全空回 null)。 */
35
+ export declare function seriesAvg(series: DaySeries[], field: keyof DaySeries): number | null;
36
+ /** 序列求和(null 按 0)。 */
37
+ export declare function seriesSum(series: DaySeries[], field: keyof DaySeries): number;
38
+ /** 序列非空计数。 */
39
+ export declare function seriesCount(series: DaySeries[], field: keyof DaySeries): number;
40
+ /** 序列净变化 = 最后非空 − 最前非空(不足 2 个回 null)。 */
41
+ export declare function seriesDelta(series: DaySeries[], field: keyof DaySeries): number | null;
42
+ //# sourceMappingURL=series.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"series.d.ts","sourceRoot":"","sources":["../../src/analysis/series.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD,eAAO,MAAM,UAAU,uBAAQ,CAAC;AAEhC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,kEAAkE;AAClE,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,GAAE,MAAmB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAqBtI;AASD,2CAA2C;AAC3C,wBAAgB,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,MAAM,CAOxD;AAMD,wBAAgB,WAAW,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,CAmErF;AAED,8BAA8B;AAC9B,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,SAAS,GAAG,MAAM,GAAG,IAAI,CAIpF;AAED,sBAAsB;AACtB,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,SAAS,GAAG,MAAM,CAE7E;AAED,cAAc;AACd,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,SAAS,GAAG,MAAM,CAE/E;AAED,yCAAyC;AACzC,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,SAAS,GAAG,MAAM,GAAG,IAAI,CAItF"}
@@ -0,0 +1,127 @@
1
+ import { FetchError } from '../fetch/errors.js';
2
+ import { calcTdee, shiftISODate, todayISO } from './utils.js';
3
+ export const WATER_NAME = '💧水';
4
+ const round1 = (n) => Math.round(n * 10) / 10;
5
+ /** 窗口选择器:Nd / 本周/上周/今年…(老家别名 week_cur 等一并支持)/ custom / 默认 30d。 */
6
+ export function resolveWindow(window, start, end, today = todayISO()) {
7
+ const t = Date.parse(today + 'T12:00:00Z');
8
+ if (Number.isNaN(t))
9
+ throw new FetchError('日期非法: ' + today);
10
+ const weekday = Math.floor(((t / 86400000) + 3) % 7);
11
+ const mondayOffset = -weekday;
12
+ if (window === 'custom') {
13
+ if (start && end)
14
+ return [start, end];
15
+ return [shiftISODate(today, -30), shiftISODate(today, -1)];
16
+ }
17
+ const m = /^([0-9]+)d$/.exec(window);
18
+ if (m)
19
+ return [shiftISODate(today, -(Number(m[1]) - 1)), today];
20
+ if (window === '本周' || window === 'week_cur')
21
+ return [shiftISODate(today, mondayOffset), today];
22
+ if (window === '上周' || window === 'week_prev')
23
+ return [shiftISODate(today, mondayOffset - 7), shiftISODate(today, mondayOffset - 1)];
24
+ if (window === '本月' || window === 'month_cur')
25
+ return [today.slice(0, 8) + '01', today];
26
+ if (window === '上月' || window === 'month_prev') {
27
+ const firstThis = today.slice(0, 8) + '01';
28
+ const lastLast = shiftISODate(firstThis, -1);
29
+ return [lastLast.slice(0, 8) + '01', lastLast];
30
+ }
31
+ if (window === '今年' || window === 'year_cur')
32
+ return [today.slice(0, 4) + '-01-01', today];
33
+ return [shiftISODate(today, -29), today];
34
+ }
35
+ /** 档案 TDEE(体重恒 70.0 parity,见 utils 说明)。 */
36
+ export function loadProfileTdee(db) {
37
+ try {
38
+ const prof = db.prepare('SELECT age, gender, height_cm, activity_level FROM user_profile WHERE id = 1').get();
39
+ return calcTdee(70.0, prof?.height_cm ?? 170.0, prof?.age ?? 30, prof?.gender ?? 'male', prof?.activity_level ?? 'moderate');
40
+ }
41
+ catch {
42
+ return 1800;
43
+ }
44
+ }
45
+ export function buildSeries(db, start, end) {
46
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(start) || !/^\d{4}-\d{2}-\d{2}$/.test(end)) {
47
+ throw new FetchError('起止日期非法: ' + start + ' ~ ' + end);
48
+ }
49
+ if (start > end)
50
+ throw new FetchError('start 不得晚于 end');
51
+ const tdee = loadProfileTdee(db);
52
+ const diet = db.prepare('SELECT date, SUM(calories) AS c, SUM(protein) AS p, SUM(carbs) AS cb, SUM(fat) AS f,' +
53
+ ' SUM(sodium_mg) AS na, SUM(sugar_g) AS su, SUM(fiber_g) AS fi' +
54
+ ' FROM food_log WHERE date BETWEEN ? AND ? AND food_name != ? GROUP BY date').all(start, end, WATER_NAME);
55
+ const water = db.prepare('SELECT date, SUM(grams) AS v FROM food_log WHERE date BETWEEN ? AND ? AND food_name = ? GROUP BY date').all(start, end, WATER_NAME);
56
+ const ex = db.prepare('SELECT date, SUM(calories_burned) AS v FROM exercise_log WHERE date BETWEEN ? AND ? GROUP BY date').all(start, end);
57
+ const wrows = db.prepare('SELECT date, weight_kg AS v FROM weight_log WHERE date BETWEEN ? AND ? ORDER BY date, time ASC, id ASC').all(start, end);
58
+ const bfrows = db.prepare('SELECT date, body_fat_pct AS v FROM body_composition WHERE date BETWEEN ? AND ? AND is_deprecated = 0 ORDER BY date, id ASC').all(start, end);
59
+ const bmrows = db.prepare('SELECT date, waist_cm AS waist, hip_cm AS hip FROM body_measurements WHERE date BETWEEN ? AND ? AND is_deprecated = 0 ORDER BY date, id ASC').all(start, end);
60
+ const goal = db.prepare('SELECT calorie_goal, water_goal FROM daily_goal WHERE id = 1').get();
61
+ const dietBy = new Map(diet.map((r) => [r.date, r]));
62
+ const waterBy = new Map(water.map((r) => [r.date, r.v]));
63
+ const exBy = new Map(ex.map((r) => [r.date, r.v]));
64
+ const weightFirst = new Map();
65
+ for (const r of wrows)
66
+ if (!weightFirst.has(r.date))
67
+ weightFirst.set(r.date, r.v);
68
+ const bfFirst = new Map();
69
+ for (const r of bfrows)
70
+ if (!bfFirst.has(r.date))
71
+ bfFirst.set(r.date, r.v);
72
+ const waistFirst = new Map();
73
+ for (const r of bmrows) {
74
+ if (!waistFirst.has(r.date))
75
+ waistFirst.set(r.date, r.waist ?? r.hip);
76
+ }
77
+ const out = [];
78
+ for (let d = start; d <= end; d = shiftISODate(d, 1)) {
79
+ const dr = dietBy.get(d);
80
+ const calories = dr ? dr.c : null;
81
+ const exerciseKcal = exBy.get(d) ?? null;
82
+ const deficit = calories === null || calories === undefined ? null : round1(tdee + (exerciseKcal ?? 0) - calories);
83
+ out.push({
84
+ date: d,
85
+ calories,
86
+ protein: dr ? dr.p : null,
87
+ carbs: dr ? dr.cb : null,
88
+ fat: dr ? dr.f : null,
89
+ sodiumMg: dr ? dr.na : null,
90
+ sugarG: dr ? dr.su : null,
91
+ fiberG: dr ? dr.fi : null,
92
+ waterMl: waterBy.get(d) ?? null,
93
+ exerciseKcal,
94
+ weightKg: weightFirst.get(d) ?? null,
95
+ bodyFatPct: bfFirst.get(d) ?? null,
96
+ waistCm: waistFirst.get(d) ?? null,
97
+ tdee,
98
+ deficit,
99
+ calorieGoal: goal?.calorie_goal ?? 1800,
100
+ waterGoal: goal?.water_goal ?? 2000,
101
+ });
102
+ }
103
+ return out;
104
+ }
105
+ /** 序列均值(null 跳过;全空回 null)。 */
106
+ export function seriesAvg(series, field) {
107
+ const vals = series.map((s) => s[field]).filter((v) => typeof v === 'number');
108
+ if (vals.length === 0)
109
+ return null;
110
+ return round1(vals.reduce((a, b) => a + b, 0) / vals.length);
111
+ }
112
+ /** 序列求和(null 按 0)。 */
113
+ export function seriesSum(series, field) {
114
+ return round1(series.reduce((a, s) => a + (typeof s[field] === 'number' ? s[field] : 0), 0));
115
+ }
116
+ /** 序列非空计数。 */
117
+ export function seriesCount(series, field) {
118
+ return series.filter((s) => s[field] !== null && s[field] !== undefined).length;
119
+ }
120
+ /** 序列净变化 = 最后非空 − 最前非空(不足 2 个回 null)。 */
121
+ export function seriesDelta(series, field) {
122
+ const vals = series.map((s) => s[field]).filter((v) => typeof v === 'number');
123
+ if (vals.length < 2)
124
+ return null;
125
+ return round1(vals[vals.length - 1] - vals[0]);
126
+ }
127
+ //# sourceMappingURL=series.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"series.js","sourceRoot":"","sources":["../../src/analysis/series.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { DaySeries } from './series.js';
2
+ export declare const SIM_MIN_DAYS = 14;
3
+ export declare const KCAL_PER_KG = 7700;
4
+ export declare const HEALTHY_RATE: [number, number];
5
+ export interface SimPoint {
6
+ date: string;
7
+ value: number;
8
+ lo?: number;
9
+ hi?: number;
10
+ }
11
+ export interface SimBase {
12
+ kind: string;
13
+ title: string;
14
+ degraded: boolean;
15
+ start?: string;
16
+ end?: string;
17
+ days?: number;
18
+ degradeMsg?: string;
19
+ insight: string;
20
+ }
21
+ export interface WeightForecast extends SimBase {
22
+ current?: number;
23
+ ratePerWeek?: number;
24
+ rateNote?: string;
25
+ assumption?: string;
26
+ forecast?: {
27
+ label: string;
28
+ horizonDays: number;
29
+ points: SimPoint[];
30
+ };
31
+ }
32
+ export declare function weightForecast(series: DaySeries[], horizonDays: number, title: string, kind?: string): WeightForecast;
33
+ export interface WeightTarget extends SimBase {
34
+ current?: number;
35
+ target?: number;
36
+ eta?: string;
37
+ daysLeft?: number;
38
+ ratePerWeek?: number;
39
+ feasible?: boolean;
40
+ assumption?: string;
41
+ }
42
+ export declare function weightTarget(series: DaySeries[], targetKg: number, title: string, kind?: string): WeightTarget;
43
+ //# sourceMappingURL=simulate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulate.d.ts","sourceRoot":"","sources":["../../src/analysis/simulate.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,eAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,eAAO,MAAM,WAAW,OAAO,CAAC;AAChC,eAAO,MAAM,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,CAAc,CAAC;AAMzD,MAAM,WAAW,QAAQ;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE;AACnF,MAAM,WAAW,OAAO;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AA0D9J,MAAM,WAAW,cAAe,SAAQ,OAAO;IAAG,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,QAAQ,EAAE,CAAA;KAAE,CAAA;CAAE;AAEzM,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,SAAoB,GAAG,cAAc,CAmBhI;AAED,MAAM,WAAW,YAAa,SAAQ,OAAO;IAAG,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE;AAEnL,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,SAAkB,GAAG,YAAY,CAsBvH"}
@@ -0,0 +1,109 @@
1
+ import { shiftISODate } from './utils.js';
2
+ export const SIM_MIN_DAYS = 14;
3
+ export const KCAL_PER_KG = 7700;
4
+ export const HEALTHY_RATE = [0.5, 1.0];
5
+ const round = (n) => Math.round(n);
6
+ const round1 = (n) => Math.round(n * 10) / 10;
7
+ const round2 = (n) => Math.round(n * 100) / 100;
8
+ function degrade(kind, title, series, need) {
9
+ return { kind, title, degraded: true, degradeMsg: '数据不足:需要 ' + need + ',当前只有 ' + series.length + ' 天。', insight: '数据不足,无法预测。' };
10
+ }
11
+ function linearRate(series, field) {
12
+ const vals = [];
13
+ for (const s of series) {
14
+ const v = s[field];
15
+ if (v === null || v === undefined)
16
+ continue;
17
+ vals.push([Date.parse(s.date + 'T12:00:00Z'), v]);
18
+ }
19
+ if (vals.length < 2)
20
+ return [null, vals.length > 0 ? vals[vals.length - 1][1] : null];
21
+ const days0 = vals[0][0];
22
+ const xs = vals.map(([t]) => (t - days0) / 86400000);
23
+ const ys = vals.map(([, v]) => v);
24
+ const n = xs.length;
25
+ const sx = xs.reduce((a, b) => a + b, 0);
26
+ const sy = ys.reduce((a, b) => a + b, 0);
27
+ const sxy = xs.reduce((a, x, i) => a + x * ys[i], 0);
28
+ const sx2 = xs.reduce((a, x) => a + x * x, 0);
29
+ const denom = n * sx2 - sx * sx;
30
+ if (denom === 0)
31
+ return [null, ys[ys.length - 1]];
32
+ return [(n * sxy - sx * sy) / denom, ys[ys.length - 1]];
33
+ }
34
+ function residualStd(series, field, slope) {
35
+ const vals = [];
36
+ for (const s of series) {
37
+ const v = s[field];
38
+ if (v === null || v === undefined)
39
+ continue;
40
+ vals.push([Date.parse(s.date + 'T12:00:00Z'), v]);
41
+ }
42
+ if (vals.length < 3)
43
+ return 0;
44
+ const base = vals[0][0];
45
+ const y0 = vals[0][1];
46
+ const resid = vals.map(([t, y]) => y - (y0 + slope * ((t - base) / 86400000)));
47
+ const m = resid.reduce((a, b) => a + b, 0) / resid.length;
48
+ return Math.sqrt(resid.reduce((a, r) => a + (r - m) * (r - m), 0) / (resid.length - 1));
49
+ }
50
+ function weightVals(series) {
51
+ return series.map((s) => s.weightKg).filter((v) => v !== null && v !== undefined);
52
+ }
53
+ function forecastSeries(current, ratePerDay, sigma, horizonDays, startDate, label) {
54
+ const pts = [{ date: startDate, value: round2(current), lo: round2(current), hi: round2(current) }];
55
+ for (let d = 7; d <= horizonDays; d += 7) {
56
+ const v = current + ratePerDay * d;
57
+ const band = ((2 * sigma * Math.sqrt(d)) / Math.sqrt(7));
58
+ pts.push({ date: shiftISODate(startDate, d), value: round2(v), lo: round2(v - band), hi: round2(v + band) });
59
+ }
60
+ return { label, horizonDays, points: pts };
61
+ }
62
+ export function weightForecast(series, horizonDays, title, kind = 'weight_forecast') {
63
+ const wv = weightVals(series);
64
+ if (wv.length < SIM_MIN_DAYS)
65
+ return degrade(kind, title, series, '≥' + SIM_MIN_DAYS + ' 天体重记录');
66
+ const [rate, latest] = linearRate(series, 'weightKg');
67
+ if (rate === null || latest === null)
68
+ return degrade(kind, title, series, '≥' + SIM_MIN_DAYS + ' 天有效体重记录');
69
+ const sigma = residualStd(series, 'weightKg', rate);
70
+ const last = series[series.length - 1];
71
+ const fc = forecastSeries(latest, rate, sigma, horizonDays, last.date, title);
72
+ const weekly = rate * 7;
73
+ const lastPt = fc.points[fc.points.length - 1];
74
+ return {
75
+ kind, title, degraded: false,
76
+ start: series[0].date, end: last.date, days: series.length,
77
+ current: round2(latest), ratePerWeek: round2(weekly),
78
+ rateNote: '按近 ' + series.length + ' 天线性趋势外推,当前 ' + (weekly >= 0 ? '+' : '') + weekly.toFixed(2) + ' kg/周',
79
+ assumption: '假设趋势延续:体重 = 当前值 + 日速率 × 天数;置信带按残差 σ 扩张',
80
+ forecast: fc,
81
+ insight: '按当前趋势,' + horizonDays + ' 天后体重约 ' + lastPt.value + ' kg(' + lastPt.lo + ' ~ ' + lastPt.hi + ',95% 置信带)。',
82
+ };
83
+ }
84
+ export function weightTarget(series, targetKg, title, kind = 'weight_target') {
85
+ const wv = weightVals(series);
86
+ if (wv.length < SIM_MIN_DAYS)
87
+ return degrade(kind, title, series, '≥' + SIM_MIN_DAYS + ' 天体重记录');
88
+ const [rate, latest] = linearRate(series, 'weightKg');
89
+ if (rate === null || latest === null || Math.abs(rate) < 1e-6)
90
+ return degrade(kind, title, series, '体重处于平台期(无趋势)');
91
+ // 有意偏离老家:老家 (latest-target)/rate 在正常趋近时恒为负→恒降级;此处用 (target-latest)/rate,趋近为正(待口径裁决 T7)。
92
+ const daysLeft = (targetKg - latest) / rate;
93
+ if (daysLeft < 0) {
94
+ return { kind, title, degraded: true, degradeMsg: '目标体重与当前趋势方向相反(当前在上涨)。', insight: '先纠正趋势再预测。' };
95
+ }
96
+ const last = series[series.length - 1];
97
+ const eta = shiftISODate(last.date, round(daysLeft));
98
+ const weekly = rate * 7;
99
+ const feasible = HEALTHY_RATE[0] <= weekly && weekly <= HEALTHY_RATE[1];
100
+ return {
101
+ kind, title, degraded: false,
102
+ start: series[0].date, end: last.date, days: series.length,
103
+ current: round2(latest), target: targetKg, eta,
104
+ daysLeft: round(daysLeft), ratePerWeek: round2(weekly), feasible,
105
+ assumption: '按当前速率 ' + (weekly >= 0 ? '+' : '') + weekly.toFixed(2) + ' kg/周 线性外推;健康范围 0.5-1.0 kg/周',
106
+ insight: '按当前趋势,预计 ' + eta + ' 前后达到 ' + targetKg + ' kg' + (feasible ? '。' : ';⚠️ 当前速率超出健康范围,建议调整目标或策略。'),
107
+ };
108
+ }
109
+ //# sourceMappingURL=simulate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simulate.js","sourceRoot":"","sources":["../../src/analysis/simulate.ts"],"names":[],"mappings":"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"}