forge-openclaw-plugin 0.2.101 → 0.2.103

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 (227) hide show
  1. package/dist/assets/activity-page-Dv6X5ZCV.js +1 -0
  2. package/dist/assets/ai-surface-workspace-CutiG6uS.js +1 -0
  3. package/dist/assets/atlas-panel-jgMRyaHn.js +1 -0
  4. package/dist/assets/{board-BkDRaMp6.js → board-dIX6etHh.js} +1 -1
  5. package/dist/assets/calendar-page-q7Nm5E2U.js +1 -0
  6. package/dist/assets/calendar-rules-DPFsfiRl.js +1 -0
  7. package/dist/assets/calendar-week-toolbar-nVhgB-0s.js +1 -0
  8. package/dist/assets/{charts-P7EVhIog.js → charts-DFnEuIMB.js} +8 -8
  9. package/dist/assets/companion-sync-lab-page-CJ8UTij8.js +1 -0
  10. package/dist/assets/daily-metrics-dashboard-CiJkkkd1.js +1 -0
  11. package/dist/assets/entity-note-count-link-RzBB6ujx.js +1 -0
  12. package/dist/assets/entity-notes-surface-Djz50HvD.js +1 -0
  13. package/dist/assets/execution-board-CtPhI-58.js +1 -0
  14. package/dist/assets/faceted-token-search-DEC6ANa9.js +1 -0
  15. package/dist/assets/flagship-signal-deck-CtHC3mql.js +1 -0
  16. package/dist/assets/floating-action-menu-CKQRhff9.js +1 -0
  17. package/dist/assets/{forms-BFlTgZ3W.js → forms-hB0SqEh-.js} +1 -1
  18. package/dist/assets/goal-detail-page-CF5fNQeR.js +1 -0
  19. package/dist/assets/goals-page-fsY8NzGB.js +1 -0
  20. package/dist/assets/{graph-D6JLqDbD.js → graph-DDUZNRsO.js} +14 -14
  21. package/dist/assets/habits-page-COoGz4kj.js +1 -0
  22. package/dist/assets/index-BAXYM89v.css +1 -0
  23. package/dist/assets/index-EqQsXoat.js +19 -0
  24. package/dist/assets/insight-flow-dialog-DtX_5W7g.js +1 -0
  25. package/dist/assets/insights-page-cBd74ObU.js +8 -0
  26. package/dist/assets/kanban-page-CYav9THw.js +1 -0
  27. package/dist/assets/knowledge-graph-page-D2A-W1jE.js +1 -0
  28. package/dist/assets/{life-force-page-Dy0JTS2G.js → life-force-page-CACGlNhq.js} +1 -1
  29. package/dist/assets/life-force-workspace-BJ4N1I78.js +1 -0
  30. package/dist/assets/{maps-ClgJoCjz.js → maps-C-yOWiDN.js} +1 -1
  31. package/dist/assets/metric-tile-CMadwnGz.js +1 -0
  32. package/dist/assets/{motion-BeD44FeG.js → motion-Lt5B1XuE.js} +1 -1
  33. package/dist/assets/movement-page-D5VqFd2q.js +1 -0
  34. package/dist/assets/note-markdown-BzK2Qlgr.js +3 -0
  35. package/dist/assets/note-tags-input-CZzqJMLc.js +1 -0
  36. package/dist/assets/notes-page-D3Hsh90C.js +1 -0
  37. package/dist/assets/{open-in-graph-button-IXe9SGth.js → open-in-graph-button-BFPKfyK3.js} +1 -1
  38. package/dist/assets/orbit-map-CnyfSmOG.js +1 -0
  39. package/dist/assets/overview-page-CXdWrOV1.js +1 -0
  40. package/dist/assets/page-hero-ffKzgyW3.js +1 -0
  41. package/dist/assets/pill-cluster-C2D0h3lx.js +1 -0
  42. package/dist/assets/{preference-entity-handoff-button-5PzUn42S.js → preference-entity-handoff-button-Dj3V6VxL.js} +1 -1
  43. package/dist/assets/preferences-page-Jo8Gw386.js +1 -0
  44. package/dist/assets/project-collections-qSqp90HN.js +1 -0
  45. package/dist/assets/{project-detail-page-BXK5-4xW.js → project-detail-page-BifhiLQX.js} +1 -1
  46. package/dist/assets/project-management-hierarchy-page-DZ_9klIc.js +1 -0
  47. package/dist/assets/project-management-section-nav-BImLCVvf.js +1 -0
  48. package/dist/assets/projects-page-ptcx6H38.js +1 -0
  49. package/dist/assets/psyche-behaviors-page-BDwXyDta.js +5 -0
  50. package/dist/assets/psyche-flashcards-page-DL1BP1jX.js +1 -0
  51. package/dist/assets/psyche-goal-map-page-ovcpisx1.js +1 -0
  52. package/dist/assets/psyche-graph-EP5GL612.js +1 -0
  53. package/dist/assets/{psyche-metrics-page-CuR9oqEy.js → psyche-metrics-page-Bcu813Rg.js} +1 -1
  54. package/dist/assets/psyche-mode-guide-page-C0g27Xpt.js +1 -0
  55. package/dist/assets/psyche-modes-page-BjKjX5MR.js +1 -0
  56. package/dist/assets/psyche-page-F4tF2W70.js +1 -0
  57. package/dist/assets/psyche-patterns-page-B-14hukK.js +5 -0
  58. package/dist/assets/psyche-questionnaire-builder-page-BdXmoHvK.js +1 -0
  59. package/dist/assets/psyche-questionnaire-detail-page-Cu5uwlJu.js +1 -0
  60. package/dist/assets/psyche-questionnaire-run-detail-page-C3R4PClg.js +1 -0
  61. package/dist/assets/psyche-questionnaire-run-page-Div3iDdt.js +1 -0
  62. package/dist/assets/psyche-questionnaires-page-DpqAPQCp.js +1 -0
  63. package/dist/assets/psyche-report-detail-page-BvWVDKP3.js +3 -0
  64. package/dist/assets/psyche-reports-page-BrbWUlAq.js +1 -0
  65. package/dist/assets/{psyche-schemas-HFmg37Wj.js → psyche-schemas-Dxj554nU.js} +1 -1
  66. package/dist/assets/psyche-schemas-beliefs-page-DYKvAtSD.js +9 -0
  67. package/dist/assets/psyche-screen-time-page-CAOKCyQw.js +1 -0
  68. package/dist/assets/psyche-self-observation-page-F0MVA0UH.js +1 -0
  69. package/dist/assets/psyche-values-page-DyvX-d0o.js +5 -0
  70. package/dist/assets/report-chain-fields-CeC1cJFS.js +1 -0
  71. package/dist/assets/rewards-page-C2loyODo.js +1 -0
  72. package/dist/assets/scheduling-rules-editor-D40AC2jR.js +1 -0
  73. package/dist/assets/schema-badge-FY7818qB.js +1 -0
  74. package/dist/assets/schema-visuals-CvC9a3i6.js +1 -0
  75. package/dist/assets/select-menu-DJsCG6rM.js +1 -0
  76. package/dist/assets/settings-agents-page-BFkJ5AAD.js +6 -0
  77. package/dist/assets/settings-bin-page-D3-Ab-iA.js +1 -0
  78. package/dist/assets/settings-calendar-page-ly_mSTAD.js +5 -0
  79. package/dist/assets/settings-data-page-D7QOqNf-.js +1 -0
  80. package/dist/assets/settings-logs-page-Ca87HEUx.js +1 -0
  81. package/dist/assets/settings-mobile-page-D0jejZot.js +1 -0
  82. package/dist/assets/settings-models-page-DPDsZjSc.js +1 -0
  83. package/dist/assets/settings-page-1cArlSPM.js +1 -0
  84. package/dist/assets/settings-rewards-page-Db4BV1DC.js +1 -0
  85. package/dist/assets/{settings-section-nav-DSOuht_F.js → settings-section-nav-DP9o4peU.js} +1 -1
  86. package/dist/assets/settings-users-page-BHFyDSsd.js +1 -0
  87. package/dist/assets/settings-wiki-page-BNaiupBm.js +1 -0
  88. package/dist/assets/sleep-page-BmOPF0yD.js +1 -0
  89. package/dist/assets/sports-page-BldIiclr.js +1 -0
  90. package/dist/assets/{state-B-4sS1xO.js → state-vCcAT5Hq.js} +1 -1
  91. package/dist/assets/strategies-page-CaTN99qj.js +1 -0
  92. package/dist/assets/strategy-detail-page-DsgFTd-U.js +1 -0
  93. package/dist/assets/strategy-dialog-7X7peRzu.js +1 -0
  94. package/dist/assets/surface-CJI17F3n.js +1 -0
  95. package/dist/assets/{table-WfAPUppN.js → table-BNqMG3_S.js} +1 -1
  96. package/dist/assets/task-detail-page-M1sIIPA8.js +1 -0
  97. package/dist/assets/timebox-planning-dialog-ByojN0AN.js +1 -0
  98. package/dist/assets/today-page-BjDijtn8.js +1 -0
  99. package/dist/assets/training-load-page-BPRmaWmF.js +1 -0
  100. package/dist/assets/{ui-C13Nbgas.js → ui-C1iwpj2-.js} +4 -4
  101. package/dist/assets/use-psyche-focus-target-Ct-acS9G.js +1 -0
  102. package/dist/assets/vendor-Dnkkx2co.js +1067 -0
  103. package/dist/assets/{vitals-page-qre17Nw8.js → vitals-page-CE9zdGLF.js} +1 -1
  104. package/dist/assets/weekly-review-page-CzhTv90n.js +1 -0
  105. package/dist/assets/weight-loss-page-Bp_cIk78.js +5 -0
  106. package/dist/assets/wiki-article-markdown-Dok2uy2p.js +4 -0
  107. package/dist/assets/wiki-editor-page-BuW32Y3f.js +26 -0
  108. package/dist/assets/wiki-ingest-history-page-DZKSBNHV.js +1 -0
  109. package/dist/assets/wiki-ingest-modal-DyqBEZcC.js +1 -0
  110. package/dist/assets/wiki-page-DqxlbLKG.js +1 -0
  111. package/dist/assets/workbench-flow-page-C4nc9jUg.js +5 -0
  112. package/dist/assets/workbench-page-BnyR7SL0.js +1 -0
  113. package/dist/assets/workout-detail-page-DT-c5cHL.js +2 -0
  114. package/dist/index.html +9 -9
  115. package/dist/openclaw/local-runtime.js +41 -14
  116. package/dist/server/server/migrations/067_weight_loss_daily_active_overrides.sql +13 -0
  117. package/dist/server/server/src/app.js +125 -33
  118. package/dist/server/server/src/health-weight-loss.js +554 -77
  119. package/dist/server/server/src/health.js +12 -4
  120. package/dist/server/server/src/movement.js +84 -1
  121. package/dist/server/server/src/openapi.js +123 -18
  122. package/dist/server/server/src/repositories/model-settings.js +21 -12
  123. package/dist/server/server/src/repositories/settings.js +19 -5
  124. package/dist/server/src/components/ui/info-tooltip.js +6 -6
  125. package/dist/server/src/components/workbench-boxes/shared/generic-node-view.js +13 -5
  126. package/dist/server/src/lib/api.js +24 -5
  127. package/dist/server/src/lib/theme-system.js +8 -0
  128. package/openclaw.plugin.json +1 -1
  129. package/package.json +3 -3
  130. package/server/migrations/067_weight_loss_daily_active_overrides.sql +13 -0
  131. package/skills/forge-openclaw/SKILL.md +13 -0
  132. package/skills/forge-openclaw/entity_conversation_playbooks.md +7 -1
  133. package/dist/assets/activity-page-CpjuNSHw.js +0 -1
  134. package/dist/assets/ai-surface-workspace-DEAFZruS.js +0 -1
  135. package/dist/assets/atlas-panel-CdVNPotj.js +0 -1
  136. package/dist/assets/calendar-page-DNNt6lfz.js +0 -1
  137. package/dist/assets/calendar-rules-DNJFNsxi.js +0 -1
  138. package/dist/assets/calendar-week-toolbar-BbPwYeN0.js +0 -1
  139. package/dist/assets/companion-sync-lab-page-KxEDigM6.js +0 -1
  140. package/dist/assets/daily-metrics-dashboard-B3cqJgDt.js +0 -1
  141. package/dist/assets/entity-note-count-link-DrhjJZ4i.js +0 -1
  142. package/dist/assets/entity-notes-surface-CkcRsKJQ.js +0 -1
  143. package/dist/assets/execution-board-D07gOocB.js +0 -1
  144. package/dist/assets/faceted-token-search-BxRRcM3q.js +0 -1
  145. package/dist/assets/flagship-signal-deck-cmy82b8_.js +0 -1
  146. package/dist/assets/floating-action-menu-Fs_ZiUMo.js +0 -1
  147. package/dist/assets/goal-detail-page-CqLiNz4f.js +0 -1
  148. package/dist/assets/goals-page-BTk7mg_T.js +0 -1
  149. package/dist/assets/habits-page-BJxagdzx.js +0 -1
  150. package/dist/assets/index-CF4J4R9L.js +0 -19
  151. package/dist/assets/index-CZbuZQjw.css +0 -1
  152. package/dist/assets/insight-flow-dialog-8f3D0GuC.js +0 -1
  153. package/dist/assets/insights-page-D6rOa7uk.js +0 -8
  154. package/dist/assets/kanban-page-XQ7Se6dH.js +0 -1
  155. package/dist/assets/knowledge-graph-page-BtAg8iv3.js +0 -1
  156. package/dist/assets/life-force-workspace-OfyB9HJM.js +0 -1
  157. package/dist/assets/metric-tile-DKpo-8xw.js +0 -1
  158. package/dist/assets/movement-page-Bg_T_Stx.js +0 -1
  159. package/dist/assets/note-markdown-N-uxD3Xt.js +0 -3
  160. package/dist/assets/note-tags-input-Cdu7wiw6.js +0 -1
  161. package/dist/assets/notes-page-CKXnF_KU.js +0 -1
  162. package/dist/assets/orbit-map-Dzi6KliQ.js +0 -1
  163. package/dist/assets/overview-page-1miYqaVS.js +0 -1
  164. package/dist/assets/page-hero-DRy5b2MU.js +0 -1
  165. package/dist/assets/pill-cluster-C9QczVJ2.js +0 -1
  166. package/dist/assets/preferences-page-DtNaF5Q3.js +0 -1
  167. package/dist/assets/project-collections-xPz2mlRr.js +0 -1
  168. package/dist/assets/project-management-hierarchy-page-DtRpMABw.js +0 -1
  169. package/dist/assets/project-management-section-nav-P3ixzPa-.js +0 -1
  170. package/dist/assets/projects-page-C5ViRuf4.js +0 -1
  171. package/dist/assets/psyche-behaviors-page-Dco46sC4.js +0 -5
  172. package/dist/assets/psyche-flashcards-page-ZcoEB8gV.js +0 -1
  173. package/dist/assets/psyche-goal-map-page-CLBAQOI0.js +0 -1
  174. package/dist/assets/psyche-graph-k4tX2tdp.js +0 -1
  175. package/dist/assets/psyche-mode-guide-page-hIVXcCnE.js +0 -1
  176. package/dist/assets/psyche-modes-page-0lYtBlhO.js +0 -1
  177. package/dist/assets/psyche-page-VZ9k9ISp.js +0 -1
  178. package/dist/assets/psyche-patterns-page-gx5nmdGq.js +0 -5
  179. package/dist/assets/psyche-questionnaire-builder-page-Bn0TOISd.js +0 -1
  180. package/dist/assets/psyche-questionnaire-detail-page-CmVzSd_s.js +0 -1
  181. package/dist/assets/psyche-questionnaire-run-detail-page-BsMbmXCG.js +0 -1
  182. package/dist/assets/psyche-questionnaire-run-page-CgkRL2vi.js +0 -1
  183. package/dist/assets/psyche-questionnaires-page-D7V8uLXM.js +0 -1
  184. package/dist/assets/psyche-report-detail-page-OlFq57eL.js +0 -3
  185. package/dist/assets/psyche-reports-page-dVUZjna1.js +0 -1
  186. package/dist/assets/psyche-schemas-beliefs-page-BCgc8FUd.js +0 -9
  187. package/dist/assets/psyche-screen-time-page-B_6BT_WN.js +0 -1
  188. package/dist/assets/psyche-self-observation-page-CEG5mluK.js +0 -1
  189. package/dist/assets/psyche-values-page-DRbRfEd6.js +0 -5
  190. package/dist/assets/report-chain-fields-CALCV3V5.js +0 -1
  191. package/dist/assets/rewards-page-DmC4R_Ps.js +0 -1
  192. package/dist/assets/scheduling-rules-editor-D02s70hr.js +0 -1
  193. package/dist/assets/schema-badge-BZO-qNhO.js +0 -1
  194. package/dist/assets/schema-visuals-D6nxjbYC.js +0 -1
  195. package/dist/assets/select-menu-fYyreSdQ.js +0 -1
  196. package/dist/assets/settings-agents-page-C_v_hMJF.js +0 -6
  197. package/dist/assets/settings-bin-page-DY5bg81n.js +0 -1
  198. package/dist/assets/settings-calendar-page-D1CzE6cg.js +0 -5
  199. package/dist/assets/settings-data-page-CHRQFU9H.js +0 -1
  200. package/dist/assets/settings-logs-page-B04pUwEv.js +0 -1
  201. package/dist/assets/settings-mobile-page-D9kTlYDS.js +0 -1
  202. package/dist/assets/settings-models-page-D26270R2.js +0 -1
  203. package/dist/assets/settings-page-DYDTFlnv.js +0 -1
  204. package/dist/assets/settings-rewards-page-cl4vqqO_.js +0 -1
  205. package/dist/assets/settings-users-page-BU79JB_T.js +0 -1
  206. package/dist/assets/settings-wiki-page-DwAUlyA3.js +0 -1
  207. package/dist/assets/sleep-page-D8NbdhyS.js +0 -1
  208. package/dist/assets/sports-page-CV4Cnzwn.js +0 -1
  209. package/dist/assets/strategies-page-C4qvXnql.js +0 -1
  210. package/dist/assets/strategy-detail-page-DJLo5rfy.js +0 -1
  211. package/dist/assets/strategy-dialog-D3AuUlVz.js +0 -1
  212. package/dist/assets/task-detail-page-z-9u9rF0.js +0 -1
  213. package/dist/assets/timebox-planning-dialog-DB6FLqmI.js +0 -1
  214. package/dist/assets/today-page-BKlu6gx5.js +0 -1
  215. package/dist/assets/training-load-page-CyJQqo_3.js +0 -1
  216. package/dist/assets/use-psyche-focus-target-C1C_XjYG.js +0 -1
  217. package/dist/assets/vendor-DHkYh85p.js +0 -1052
  218. package/dist/assets/weekly-review-page-Cz4vkRcx.js +0 -1
  219. package/dist/assets/weight-loss-page-BQrnOI0y.js +0 -1
  220. package/dist/assets/wiki-article-markdown-DdiR2TJE.js +0 -4
  221. package/dist/assets/wiki-editor-page-DqwoqVFb.js +0 -26
  222. package/dist/assets/wiki-ingest-history-page--evBLbOw.js +0 -1
  223. package/dist/assets/wiki-ingest-modal--ohzFnj2.js +0 -1
  224. package/dist/assets/wiki-page-B_VJFBPA.js +0 -1
  225. package/dist/assets/workbench-flow-page-Du62mtJU.js +0 -5
  226. package/dist/assets/workbench-page-4MKr3iRm.js +0 -1
  227. package/dist/assets/workout-detail-page-DfUbYYw1.js +0 -2
@@ -67,7 +67,7 @@ import { createManagerRuntime } from "./managers/runtime.js";
67
67
  import { isManagerError } from "./managers/type-guards.js";
68
68
  import { buildCompanionPairingTransport, getCompanionIrohStatus, stopCompanionIroh } from "./services/companion-iroh.js";
69
69
  import { createCompanionPairingSession, createCompanionPairingSessionSchema, createSleepSession, createSleepSessionSchema, createWorkoutSession, createWorkoutSessionSchema, deleteSleepSession, deleteWorkoutSession, getCompanionPairingSessionById, getCompanionOverview, getFitnessViewData, getSleepSessionById, getSleepSessionDetailById, getSleepTimelineOverlaysForRange, getSleepViewData, getTrainingLoadViewData, getVitalsViewData, getHealthZoneProfileForUser, getMobileHealthSyncSessionStatus, getWorkoutSessionById, getWorkoutSessionDetailById, heartbeatCompanionPairing, heartbeatCompanionPairingSchema, healthZoneProfilePatchSchema, abortMobileHealthSyncSession, completeMobileHealthSyncSession, ingestMobileHealthSync, ingestMobileHealthSyncChunk, mobileHealthSyncChunkSchema, mobileHealthSyncSessionCompleteSchema, mobileHealthSyncSessionStartSchema, mobileHealthSyncSchema, patchHealthZoneProfileForUser, patchCompanionPairingSourceState, patchCompanionPairingSourceStateSchema, companionSourceKeySchema, requireValidPairing, startMobileHealthSyncSession, revokeAllCompanionPairingSessions, revokeAllCompanionPairingSessionsSchema, revokeCompanionPairingSession, updateMobileCompanionSourceState, updateMobileCompanionSourceStateSchema, verifyCompanionPairing, verifyCompanionPairingSchema, updateSleepMetadata, updateSleepMetadataSchema, updateWorkoutMetadata, updateWorkoutMetadataSchema } from "./health.js";
70
- import { createNutritionAppearanceCheckin, createNutritionBodyCheckin, createNutritionExperiment, createNutritionFoodLog, createNutritionGutCheckin, createNutritionSubjectiveCheckin, deleteNutritionFoodLog, getWeightLossViewData, lookupNutritionBarcode, nutritionAppearanceCheckinCreateSchema, nutritionBarcodeLookupSchema, nutritionBodyCheckinCreateSchema, nutritionExperimentCreateSchema, nutritionExperimentPatchSchema, nutritionFoodLogCreateSchema, nutritionFoodLogPatchSchema, nutritionFoodSearchSchema, nutritionGutCheckinCreateSchema, nutritionParseRequestSchema, nutritionSubjectiveCheckinCreateSchema, nutritionTargetUpdateSchema, parseNutritionFoodLogWithChatGpt, patchNutritionExperiment, patchNutritionFoodLog, searchNutritionFoods, updateNutritionTarget } from "./health-weight-loss.js";
70
+ import { createNutritionAppearanceCheckin, createNutritionBodyCheckin, createNutritionExperiment, createNutritionFoodLog, createNutritionGutCheckin, createNutritionSubjectiveCheckin, deleteNutritionFoodLog, getWeightLossViewData, lookupNutritionBarcode, nutritionAppearanceCheckinCreateSchema, nutritionBarcodeLookupSchema, nutritionBodyCheckinCreateSchema, nutritionExperimentCreateSchema, nutritionExperimentPatchSchema, nutritionFoodLogCreateSchema, nutritionFoodLogPatchSchema, nutritionFoodSearchSchema, nutritionGutCheckinCreateSchema, nutritionParseRequestSchema, nutritionSubjectiveCheckinCreateSchema, nutritionDailyActiveCaloriesUpdateSchema, nutritionTargetUpdateSchema, parseNutritionFoodLogWithChatGpt, patchNutritionExperiment, patchNutritionFoodLog, searchNutritionFoods, updateNutritionDailyActiveCalories, updateNutritionTarget } from "./health-weight-loss.js";
71
71
  import { analyzeMovementUserBoxPreflight, createMovementUserBox, createMovementPlace, deleteMovementUserBox, getMovementAllTimeSummary, getMovementBoxDetail, getMovementDayDetail, getMovementMobileBootstrap, getMovementTimeline, getMovementSelectionAggregate, getMovementSettings, getMovementTripDetail, getMovementMonthSummary, invalidateAutomaticMovementBox, listMovementPlaces, movementAutomaticBoxInvalidateSchema, movementMobileBootstrapSchema, movementMobilePlaceMutationSchema, movementMobileStayPatchSchema, movementMobileUserBoxCreateSchema, movementMobileUserBoxPreflightSchema, movementMobileUserBoxPatchSchema, movementMobileAutomaticBoxInvalidateSchema, movementMobileTimelineSchema, movementPlaceMutationSchema, movementPlacePatchSchema, movementSelectionAggregateSchema, movementStayPatchSchema, movementTripPatchSchema, movementUserBoxCreateSchema, movementUserBoxPreflightSchema, movementUserBoxPatchSchema, movementSettingsPatchSchema, movementTimelineQuerySchema, movementTripPointPatchSchema, deleteMovementStay, deleteMovementTrip, deleteMovementTripPoint, updateMovementPlace, updateMovementSettings, updateMovementStay, updateMovementTrip, updateMovementUserBox, updateMovementTripPoint, resolveMovementTimelineSegmentForBox } from "./movement.js";
72
72
  import { getScreenTimeAllTimeSummary, getScreenTimeDayDetail, getScreenTimeMonthSummary, getScreenTimeSettings, screenTimeSettingsPatchSchema, updateScreenTimeSettings } from "./screen-time.js";
73
73
  import { assertWatchReady, buildWatchBootstrap, ingestWatchCommandBatch, ingestWatchCaptureBatch, mobileWatchBootstrapSchema, mobileWatchCommandBatchSchema, mobileWatchCaptureBatchSchema, mobileWatchHabitCheckInSchema } from "./watch-mobile.js";
@@ -3408,6 +3408,18 @@ const AGENT_ONBOARDING_ENTITY_CONVERSATION_PLAYBOOKS = [
3408
3408
  "Move to a workout_session write only when one specific workout needs reflective context, tags, notes, or links."
3409
3409
  ]
3410
3410
  },
3411
+ {
3412
+ focus: "weight_loss",
3413
+ openingQuestion: "What food-body link are you trying to test or understand right now?",
3414
+ coachingGoal: "Review nutrition, body-composition, sport-fueling, appearance, gut-comfort, craving, and subjective-energy evidence before logging or changing anything.",
3415
+ askSequence: [
3416
+ "Ask whether the question is fat-loss pace, food intake, protein/fiber sufficiency, sport fuel, visual look, water retention, cravings, gut comfort, energy, or one meal reaction.",
3417
+ "Use forge_get_weight_loss_overview before asking the user to reconstruct recent food, weight, workouts, or subjective state from memory.",
3418
+ "Use forge_parse_food_log_with_chatgpt only for rough meal text or photo descriptions through Forge's configured openai-codex ChatGPT subscription connection, not a metered OpenAI Platform API path.",
3419
+ "Use the dedicated nutrition tools for food logs, body check-ins, appearance check-ins, subjective food effects, gut check-ins, nutrition patterns, and N-of-1 experiments instead of generic batch CRUD.",
3420
+ "Ask for the one outcome metric that would make a nutrition experiment interpretable before turning repeated observations into a hypothesis."
3421
+ ]
3422
+ },
3411
3423
  {
3412
3424
  focus: "preference_catalog",
3413
3425
  openingQuestion: "What decision or taste question should this catalog help with?",
@@ -4021,7 +4033,9 @@ function buildPlaybookRouteInfo(focus) {
4021
4033
  ? `Mutation: ${guide.preferredMutationPath}.`
4022
4034
  : null,
4023
4035
  guide?.preferredReadPath ? `Read: ${guide.preferredReadPath}.` : null,
4024
- guide?.preferredMutationTool ? `Tool: ${guide.preferredMutationTool}.` : null,
4036
+ guide?.preferredMutationTool
4037
+ ? `Tool: ${guide.preferredMutationTool}.`
4038
+ : null,
4025
4039
  `Entity type: ${focus}.`
4026
4040
  ]
4027
4041
  .filter(Boolean)
@@ -4696,6 +4710,7 @@ function buildAgentOnboardingPayload(request) {
4696
4710
  movement: "Forge Movement is the first-class mobility surface. It is a timeline of stays and trips: stays capture time spent in the same place, and trips capture travel between places. Use it for time-in-place questions, travel-history review, specific stay or trip edits, selected-span aggregates, known places, and links to other Forge records rather than pretending stays and trips are normal batch CRUD entities.",
4697
4711
  lifeForce: "Life Force is Forge's energy-budget and fatigue model. Read it through the dedicated life-force state and update it through focused profile, weekday-template, and fatigue-signal routes rather than generic entity CRUD.",
4698
4712
  workbench: "Workbench is Forge's graph-flow execution system. Treat flows, runs, published outputs, node results, and latest-node-output reads as a dedicated API family instead of a normal entity-batch surface.",
4713
+ weightLoss: "Weight Loss is Forge's nutrition, body-composition, sport-fueling, appearance, gut-comfort, craving, and subjective-energy surface. Read it through the health overview route and use the dedicated nutrition tools for food logs, body check-ins, appearance check-ins, subjective effects, gut check-ins, and N-of-1 experiments instead of inventing batch CRUD records.",
4699
4714
  psyche: "Forge Psyche is the reflective domain for values, patterns, behaviors, beliefs, modes, flashcards, and trigger reports. It is sensitive and should be handled deliberately."
4700
4715
  },
4701
4716
  psycheSubmoduleModel: {
@@ -4961,7 +4976,12 @@ function buildAgentOnboardingPayload(request) {
4961
4976
  classification: "specialized_domain_surface",
4962
4977
  aliases: ["life_force", "life-force", "Life Force"],
4963
4978
  summary: "Dedicated life-force API. Use it to read the current energy budget, drains, recommendations, and warnings, then patch only the parts that are meant to be user-controlled.",
4964
- routeKeys: ["overview", "profile", "weekdayTemplate", "fatigueSignal"],
4979
+ routeKeys: [
4980
+ "overview",
4981
+ "profile",
4982
+ "weekdayTemplate",
4983
+ "fatigueSignal"
4984
+ ],
4965
4985
  routeSelectionQuestions: [
4966
4986
  "Is the user trying to understand the overview, change durable profile assumptions, change a weekday curve, or log a right-now fatigue signal?",
4967
4987
  "What planning decision should the overview or correction change: workload, recovery, timeboxes, meetings, or task choice?",
@@ -4998,7 +5018,12 @@ function buildAgentOnboardingPayload(request) {
4998
5018
  classification: "specialized_domain_surface",
4999
5019
  aliases: ["lifeForce", "life-force", "Life Force"],
5000
5020
  summary: "Alias for the dedicated Life Force API keyed to the entity-style name `life_force`. Use the same overview, profile, weekday-template, and fatigue-signal routes as `lifeForce`.",
5001
- routeKeys: ["overview", "profile", "weekdayTemplate", "fatigueSignal"],
5021
+ routeKeys: [
5022
+ "overview",
5023
+ "profile",
5024
+ "weekdayTemplate",
5025
+ "fatigueSignal"
5026
+ ],
5002
5027
  routeSelectionQuestions: [
5003
5028
  "Is the user trying to understand the overview, change durable profile assumptions, change a weekday curve, or log a right-now fatigue signal?",
5004
5029
  "What planning decision should the overview or correction change: workload, recovery, timeboxes, meetings, or task choice?",
@@ -5274,7 +5299,21 @@ function buildAgentOnboardingPayload(request) {
5274
5299
  psycheSchemaCatalog: "/api/v1/psyche/schema-catalog",
5275
5300
  psycheEventTypes: "/api/v1/psyche/event-types",
5276
5301
  psycheEmotions: "/api/v1/psyche/emotions",
5277
- weightLoss: "/api/v1/health/weight-loss"
5302
+ weightLoss: "/api/v1/health/weight-loss",
5303
+ weightLossTarget: "/api/v1/health/weight-loss/target",
5304
+ weightLossDailyActiveCalories: "/api/v1/health/weight-loss/daily-active-calories",
5305
+ weightLossFoodsSearch: "/api/v1/health/weight-loss/foods/search",
5306
+ weightLossFoodsBarcode: "/api/v1/health/weight-loss/foods/barcode",
5307
+ weightLossFoodLogs: "/api/v1/health/weight-loss/food-logs",
5308
+ weightLossFoodLogDetail: "/api/v1/health/weight-loss/food-logs/:id",
5309
+ weightLossParse: "/api/v1/health/weight-loss/parse",
5310
+ weightLossBodyCheckins: "/api/v1/health/weight-loss/body-checkins",
5311
+ weightLossAppearanceCheckins: "/api/v1/health/weight-loss/appearance-checkins",
5312
+ weightLossSubjectiveCheckins: "/api/v1/health/weight-loss/subjective-checkins",
5313
+ weightLossGutCheckins: "/api/v1/health/weight-loss/gut-checkins",
5314
+ weightLossPatterns: "/api/v1/health/weight-loss/patterns",
5315
+ weightLossExperiments: "/api/v1/health/weight-loss/experiments",
5316
+ weightLossExperimentDetail: "/api/v1/health/weight-loss/experiments/:id"
5278
5317
  },
5279
5318
  recommendedPluginTools: {
5280
5319
  bootstrap: ["forge_get_operator_overview"],
@@ -5643,7 +5682,9 @@ function resolveEffectiveReadScope(query, auth) {
5643
5682
  : [...tokenUserIds]
5644
5683
  : requestedUserIds;
5645
5684
  return {
5646
- userIds: effectiveUserIds !== undefined ? Array.from(new Set(effectiveUserIds)) : undefined,
5685
+ userIds: effectiveUserIds !== undefined
5686
+ ? Array.from(new Set(effectiveUserIds))
5687
+ : undefined,
5647
5688
  enforceUserIds: tokenUserIds.length > 0,
5648
5689
  projectIds: auth.token?.scopePolicy.projectIds ?? [],
5649
5690
  tagIds: auth.token?.scopePolicy.tagIds ?? []
@@ -5678,8 +5719,7 @@ function applyProjectScope(projects, scope) {
5678
5719
  return projects;
5679
5720
  }
5680
5721
  return projects.filter((project) => {
5681
- if (scope.projectIds.length > 0 &&
5682
- !scope.projectIds.includes(project.id)) {
5722
+ if (scope.projectIds.length > 0 && !scope.projectIds.includes(project.id)) {
5683
5723
  return false;
5684
5724
  }
5685
5725
  if (scope.tagIds.length > 0 &&
@@ -5775,8 +5815,10 @@ function buildV1Context(scope = {
5775
5815
  });
5776
5816
  const projects = applyProjectScope(listProjectSummaries({ userIds: scopedUserIdsForReads }), scope);
5777
5817
  const tasks = applyTaskScope(filterOwnedEntities("task", listTasks(), scopedUserIdsForReads), scope);
5778
- const goals = applyGoalScope(filterOwnedEntities("goal", listGoals(), scopedUserIdsForReads), scope, new Set([...projects.map((project) => project.goalId), ...tasks.map((task) => task.goalId)]
5779
- .filter((value) => typeof value === "string" && value.length > 0)));
5818
+ const goals = applyGoalScope(filterOwnedEntities("goal", listGoals(), scopedUserIdsForReads), scope, new Set([
5819
+ ...projects.map((project) => project.goalId),
5820
+ ...tasks.map((task) => task.goalId)
5821
+ ].filter((value) => typeof value === "string" && value.length > 0)));
5780
5822
  const habits = applyHabitScope(filterOwnedEntities("habit", listHabits(), scopedUserIdsForReads), scope, new Set(goals.map((goal) => goal.id)), new Set(tasks.map((task) => task.id)));
5781
5823
  const strategies = applyStrategyScope(listStrategies({ userIds: scopedUserIdsForReads }), scope, new Set(goals.map((goal) => goal.id)));
5782
5824
  const dashboard = getDashboard({ userIds: scopedUserIdsForReads });
@@ -5822,7 +5864,11 @@ function buildV1Context(scope = {
5822
5864
  validScopedUserIds !== undefined &&
5823
5865
  validScopedUserIds.length === 0
5824
5866
  ? []
5825
- : listTaskRuns({ active: true, limit: 25, userIds: scopedUserIdsForReads }),
5867
+ : listTaskRuns({
5868
+ active: true,
5869
+ limit: 25,
5870
+ userIds: scopedUserIdsForReads
5871
+ }),
5826
5872
  activity: dashboard.recentActivity,
5827
5873
  lifeForce: buildLifeForcePayload(now, scopedUserIdsForReads)
5828
5874
  };
@@ -5897,8 +5943,10 @@ function buildOperatorContext(scope = {
5897
5943
  status: "active",
5898
5944
  userIds: scopedUserIdsForReads
5899
5945
  }), scope).filter((project) => project.activeTaskCount > 0 || project.completedTaskCount > 0);
5900
- const goals = applyGoalScope(filterOwnedEntities("goal", listGoals(), scopedUserIdsForReads), scope, new Set([...activeProjects.map((project) => project.goalId), ...tasks.map((task) => task.goalId)]
5901
- .filter((value) => typeof value === "string" && value.length > 0)));
5946
+ const goals = applyGoalScope(filterOwnedEntities("goal", listGoals(), scopedUserIdsForReads), scope, new Set([
5947
+ ...activeProjects.map((project) => project.goalId),
5948
+ ...tasks.map((task) => task.goalId)
5949
+ ].filter((value) => typeof value === "string" && value.length > 0)));
5902
5950
  const scopedHabits = applyHabitScope(dueHabits, scope, new Set(goals.map((goal) => goal.id)), new Set(tasks.map((task) => task.id))).slice(0, 12);
5903
5951
  const focusTasks = tasks.filter((task) => task.status === "focus" || task.status === "in_progress");
5904
5952
  const recommendedNextTask = focusTasks[0] ??
@@ -6283,7 +6331,9 @@ function compactOperatorContext(context) {
6283
6331
  tasks: tasks.slice(0, 5).map(compactTask)
6284
6332
  }
6285
6333
  ])),
6286
- recentActivity: context.recentActivity.slice(0, 10).map(compactActivityEvent),
6334
+ recentActivity: context.recentActivity
6335
+ .slice(0, 10)
6336
+ .map(compactActivityEvent),
6287
6337
  recentTaskRuns: context.recentTaskRuns.slice(0, 8).map(compactTaskRun),
6288
6338
  recommendedNextTask: context.recommendedNextTask
6289
6339
  ? compactTask(context.recommendedNextTask)
@@ -6339,7 +6389,9 @@ function compactFitness(fitness) {
6339
6389
  typeBreakdown: fitness.typeBreakdown.slice(0, 8),
6340
6390
  sessions: fitness.sessions.slice(0, 8).map((session) => ({
6341
6391
  id: session.id,
6342
- title: compactText(session.plannedContext || session.workoutTypeLabel || session.workoutType, 100),
6392
+ title: compactText(session.plannedContext ||
6393
+ session.workoutTypeLabel ||
6394
+ session.workoutType, 100),
6343
6395
  workoutType: session.workoutType,
6344
6396
  workoutTypeLabel: session.workoutTypeLabel,
6345
6397
  activityFamily: session.activityFamily,
@@ -6494,7 +6546,9 @@ function compactPsyche(psyche) {
6494
6546
  summaryFields: ["eventSituation", "customEventType"]
6495
6547
  })),
6496
6548
  schemaPressure: psyche.schemaPressure,
6497
- committedActions: psyche.committedActions.slice(0, 12).map((action) => compactText(action, 120)),
6549
+ committedActions: psyche.committedActions
6550
+ .slice(0, 12)
6551
+ .map((action) => compactText(action, 120)),
6498
6552
  detailRoute: "/api/v1/psyche/overview"
6499
6553
  };
6500
6554
  }
@@ -6672,7 +6726,9 @@ function buildOperatorOverview(request) {
6672
6726
  const canReadPsyche = auth.token
6673
6727
  ? hasTokenScope(auth.token, "psyche.read")
6674
6728
  : true;
6675
- const requestedDetailMode = typeof request.query?.detail === "string" ? request.query.detail : "compact";
6729
+ const requestedDetailMode = typeof request.query?.detail === "string"
6730
+ ? request.query.detail
6731
+ : "compact";
6676
6732
  const warnings = canReadPsyche
6677
6733
  ? []
6678
6734
  : [
@@ -6686,8 +6742,10 @@ function buildOperatorOverview(request) {
6686
6742
  const yesterdayRange = localDayRange(addDays(now, -1));
6687
6743
  const projects = applyProjectScope(listProjectSummaries({ userIds }), readScope);
6688
6744
  const tasks = applyTaskScope(filterOwnedEntities("task", listTasks(), userIds), readScope);
6689
- const goals = applyGoalScope(filterOwnedEntities("goal", listGoals(), userIds), readScope, new Set([...projects.map((project) => project.goalId), ...tasks.map((task) => task.goalId)]
6690
- .filter((value) => typeof value === "string" && value.length > 0)));
6745
+ const goals = applyGoalScope(filterOwnedEntities("goal", listGoals(), userIds), readScope, new Set([
6746
+ ...projects.map((project) => project.goalId),
6747
+ ...tasks.map((task) => task.goalId)
6748
+ ].filter((value) => typeof value === "string" && value.length > 0)));
6691
6749
  const habits = applyHabitScope(filterOwnedEntities("habit", listHabits(), userIds), readScope, new Set(goals.map((goal) => goal.id)), new Set(tasks.map((task) => task.id)));
6692
6750
  const operator = compactOperatorContext(buildOperatorContext(readScope));
6693
6751
  const overview = getOverviewContext(now, { userIds });
@@ -6699,7 +6757,9 @@ function buildOperatorOverview(request) {
6699
6757
  const vitals = compactVitals(getVitalsViewData(userIds));
6700
6758
  const weightLoss = compactWeightLoss(getWeightLossViewData(userIds));
6701
6759
  const lifeForce = compactLifeForce(buildLifeForcePayload(now, userIds));
6702
- const psyche = canReadPsyche ? compactPsyche(getPsycheOverview(userIds)) : null;
6760
+ const psyche = canReadPsyche
6761
+ ? compactPsyche(getPsycheOverview(userIds))
6762
+ : null;
6703
6763
  const onboarding = compactOnboardingPayload(buildAgentOnboardingPayload(request));
6704
6764
  const calendar = compactCalendarForDays(readCalendarOverview({
6705
6765
  from: yesterdayRange.from,
@@ -6737,8 +6797,7 @@ function buildOperatorOverview(request) {
6737
6797
  goals: goals.length,
6738
6798
  activeGoals: goals.filter((goal) => goal.status === "active").length,
6739
6799
  projects: projects.length,
6740
- activeProjects: projects.filter((project) => project.status === "active")
6741
- .length,
6800
+ activeProjects: projects.filter((project) => project.status === "active").length,
6742
6801
  tasks: tasks.length,
6743
6802
  focusTasks: tasks.filter((task) => task.status === "focus" || task.status === "in_progress").length,
6744
6803
  habits: habits.length
@@ -7285,7 +7344,9 @@ export async function buildServer(options = {}) {
7285
7344
  };
7286
7345
  });
7287
7346
  app.post("/api/v1/doctor/fixes", async (request) => {
7288
- requireScopedAccess(request.headers, ["write"], { route: "/api/v1/doctor/fixes" });
7347
+ requireScopedAccess(request.headers, ["write"], {
7348
+ route: "/api/v1/doctor/fixes"
7349
+ });
7289
7350
  const parsed = z
7290
7351
  .object({
7291
7352
  fixIds: z.array(z.string().min(1)).optional(),
@@ -7464,9 +7525,28 @@ export async function buildServer(options = {}) {
7464
7525
  app.get("/api/v1/health/vitals", async (request) => ({
7465
7526
  vitals: getVitalsViewData(resolveScopedUserIds(request.query))
7466
7527
  }));
7467
- app.get("/api/v1/health/weight-loss", async (request) => ({
7468
- weightLoss: getWeightLossViewData(resolveScopedUserIds(request.query))
7469
- }));
7528
+ app.get("/api/v1/health/weight-loss", async (request) => {
7529
+ const query = request.query;
7530
+ const dateKey = typeof query.dateKey === "string" &&
7531
+ /^\d{4}-\d{2}-\d{2}$/.test(query.dateKey)
7532
+ ? query.dateKey
7533
+ : undefined;
7534
+ const dayStartAt = typeof query.dayStartAt === "string" &&
7535
+ z.string().datetime().safeParse(query.dayStartAt).success
7536
+ ? query.dayStartAt
7537
+ : undefined;
7538
+ const dayEndAt = typeof query.dayEndAt === "string" &&
7539
+ z.string().datetime().safeParse(query.dayEndAt).success
7540
+ ? query.dayEndAt
7541
+ : undefined;
7542
+ return {
7543
+ weightLoss: getWeightLossViewData(resolveScopedUserIds(query), {
7544
+ dateKey,
7545
+ dayStartAt,
7546
+ dayEndAt
7547
+ })
7548
+ };
7549
+ });
7470
7550
  app.patch("/api/v1/health/weight-loss/target", async (request) => {
7471
7551
  requireScopedAccess(request.headers, ["write"], {
7472
7552
  route: "/api/v1/health/weight-loss/target"
@@ -7475,6 +7555,12 @@ export async function buildServer(options = {}) {
7475
7555
  target: updateNutritionTarget(nutritionTargetUpdateSchema.parse(request.body ?? {}))
7476
7556
  };
7477
7557
  });
7558
+ app.patch("/api/v1/health/weight-loss/daily-active-calories", async (request) => {
7559
+ requireScopedAccess(request.headers, ["write"], {
7560
+ route: "/api/v1/health/weight-loss/daily-active-calories"
7561
+ });
7562
+ return updateNutritionDailyActiveCalories(nutritionDailyActiveCaloriesUpdateSchema.parse(request.body ?? {}));
7563
+ });
7478
7564
  app.post("/api/v1/health/weight-loss/foods/search", async (request) => ({
7479
7565
  ...(await searchNutritionFoods(nutritionFoodSearchSchema.parse(request.body ?? {})))
7480
7566
  }));
@@ -7675,7 +7761,8 @@ export async function buildServer(options = {}) {
7675
7761
  const parsed = movementTimelineQuerySchema.parse(request.query ?? {});
7676
7762
  const userIds = parsed.userIds.length > 0
7677
7763
  ? parsed.userIds
7678
- : (resolveScopedUserIds(request.query) ?? []);
7764
+ : (resolveScopedUserIds(request.query) ??
7765
+ []);
7679
7766
  const movement = getMovementTimeline({
7680
7767
  ...parsed,
7681
7768
  userIds
@@ -7735,7 +7822,9 @@ export async function buildServer(options = {}) {
7735
7822
  };
7736
7823
  });
7737
7824
  app.post("/api/v1/movement/user-boxes/preflight", async (request) => {
7738
- requireScopedAccess(request.headers, ["write"], { route: "/api/v1/movement/user-boxes/preflight" });
7825
+ requireScopedAccess(request.headers, ["write"], {
7826
+ route: "/api/v1/movement/user-boxes/preflight"
7827
+ });
7739
7828
  const userId = resolveScopedUserIds(request.query)?.[0] ??
7740
7829
  getDefaultUser().id;
7741
7830
  return {
@@ -7764,7 +7853,9 @@ export async function buildServer(options = {}) {
7764
7853
  const userId = resolveScopedUserIds(request.query)?.[0] ??
7765
7854
  getDefaultUser().id;
7766
7855
  const { id } = request.params;
7767
- const result = deleteMovementUserBox(id, toActivityContext(auth), { userId });
7856
+ const result = deleteMovementUserBox(id, toActivityContext(auth), {
7857
+ userId
7858
+ });
7768
7859
  if (!result) {
7769
7860
  reply.code(404);
7770
7861
  return { error: "Movement user box not found" };
@@ -7783,7 +7874,8 @@ export async function buildServer(options = {}) {
7783
7874
  }
7784
7875
  reply.code(201);
7785
7876
  return {
7786
- box: resolveMovementTimelineSegmentForBox(userId, result.box.id) ?? result.box
7877
+ box: resolveMovementTimelineSegmentForBox(userId, result.box.id) ??
7878
+ result.box
7787
7879
  };
7788
7880
  });
7789
7881
  app.patch("/api/v1/movement/stays/:id", async (request, reply) => {
@@ -7998,7 +8090,8 @@ export async function buildServer(options = {}) {
7998
8090
  source: "system"
7999
8091
  });
8000
8092
  return {
8001
- box: resolveMovementTimelineSegmentForBox(pairing.user_id, created.id) ?? created
8093
+ box: resolveMovementTimelineSegmentForBox(pairing.user_id, created.id) ??
8094
+ created
8002
8095
  };
8003
8096
  });
8004
8097
  app.post("/api/v1/mobile/movement/user-boxes/preflight", async (request) => {
@@ -8055,8 +8148,7 @@ export async function buildServer(options = {}) {
8055
8148
  }
8056
8149
  reply.code(201);
8057
8150
  return {
8058
- box: resolveMovementTimelineSegmentForBox(pairing.user_id, result.box.id) ??
8059
- result.box
8151
+ box: resolveMovementTimelineSegmentForBox(pairing.user_id, result.box.id) ?? result.box
8060
8152
  };
8061
8153
  });
8062
8154
  app.patch("/api/v1/mobile/movement/stays/:id", async (request, reply) => {