forge-openclaw-plugin 0.3.5 → 0.3.8

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 (157) hide show
  1. package/dist/assets/{action-bar-DBZ38L_6.js → action-bar-BFjWjRIM.js} +1 -1
  2. package/dist/assets/{activity-page-BJxUR9bD.js → activity-page-D-6yBWuZ.js} +1 -1
  3. package/dist/assets/{ai-surface-workspace-ehzBjTsW.js → ai-surface-workspace-BEfo9bRO.js} +1 -1
  4. package/dist/assets/{atlas-panel-BFUeVT69.js → atlas-panel-BfMyJXxQ.js} +1 -1
  5. package/dist/assets/{board-CLOHbg6t.js → board-CuxQRKPJ.js} +1 -1
  6. package/dist/assets/{calendar-page-Bg8W-YQ-.js → calendar-page-D4tQNJ2V.js} +1 -1
  7. package/dist/assets/{calendar-rules-9XQLoI96.js → calendar-rules-C-6O_uGU.js} +1 -1
  8. package/dist/assets/{calendar-week-toolbar-BeYnx1pE.js → calendar-week-toolbar-_NzeKsYx.js} +1 -1
  9. package/dist/assets/{charts-DwTguE_x.js → charts-BzT4pUPg.js} +1 -1
  10. package/dist/assets/{companion-sync-lab-page-BRKYkIrs.js → companion-sync-lab-page-D1Oqsf6M.js} +1 -1
  11. package/dist/assets/{daily-metrics-dashboard-Jt0nAHU5.js → daily-metrics-dashboard-DtE3pVOl.js} +1 -1
  12. package/dist/assets/date-keys-BnZV4PNO.js +1 -0
  13. package/dist/assets/{define-workbench-box-5h-dyvJY.js → define-workbench-box-D-32C8nM.js} +1 -1
  14. package/dist/assets/{entity-link-multiselect-Bb4De_e3.js → entity-link-multiselect-DcCvkesQ.js} +1 -1
  15. package/dist/assets/{entity-note-count-link-BzWnsOmI.js → entity-note-count-link-Cjsk5oT2.js} +1 -1
  16. package/dist/assets/{entity-notes-surface-CagOwdng.js → entity-notes-surface-DQQPLjxd.js} +1 -1
  17. package/dist/assets/{execution-board-DTmAtmqZ.js → execution-board-agWQbN-y.js} +1 -1
  18. package/dist/assets/{faceted-token-search-DJPRm9AY.js → faceted-token-search-DldM3-ru.js} +1 -1
  19. package/dist/assets/{flagship-signal-deck-CJbGZF7I.js → flagship-signal-deck-BlLYW9Kz.js} +1 -1
  20. package/dist/assets/{floating-action-menu-K77jh8XZ.js → floating-action-menu-D9-psbha.js} +1 -1
  21. package/dist/assets/{forms-C5d5hTf2.js → forms-D1qJ3oOP.js} +1 -1
  22. package/dist/assets/{generic-node-view-p5ePSFuG.js → generic-node-view-CcepUVhP.js} +1 -1
  23. package/dist/assets/{goal-detail-page-DGu_khEK.js → goal-detail-page-DP1n5-Hk.js} +1 -1
  24. package/dist/assets/{goal-dialog-BWD7cOv9.js → goal-dialog-Oxx8WqbZ.js} +1 -1
  25. package/dist/assets/{goals-page-Bgj3sj0f.js → goals-page-CUt1a4Y2.js} +1 -1
  26. package/dist/assets/{graph-Cd5WF3lw.js → graph-BF4IsheG.js} +1 -1
  27. package/dist/assets/{habits-page-Ctut1tuX.js → habits-page-5REbWAlo.js} +1 -1
  28. package/dist/assets/{health-boxes-Ie3horXx.js → health-boxes-sHNML3tm.js} +1 -1
  29. package/dist/assets/index-CQ5r7ZUz.js +2 -0
  30. package/dist/assets/index-FxgNSuZX.css +1 -0
  31. package/dist/assets/{inline-note-fields-DE6WM9uM.js → inline-note-fields-Bql_KfR9.js} +1 -1
  32. package/dist/assets/{insight-flow-dialog-XL8I74eJ.js → insight-flow-dialog-CN-CMSB7.js} +1 -1
  33. package/dist/assets/{insights-page-Bz1FLbp5.js → insights-page-B1u6ONtQ.js} +1 -1
  34. package/dist/assets/{kanban-boxes-BBziel7P.js → kanban-boxes-DB1kuUlY.js} +1 -1
  35. package/dist/assets/{kanban-page-DdQP73I3.js → kanban-page-BBW9_vMu.js} +1 -1
  36. package/dist/assets/{knowledge-graph-page-DdHWj4Dj.js → knowledge-graph-page-CoJaydZb.js} +1 -1
  37. package/dist/assets/{life-force-page-BRN-93cI.js → life-force-page-DBYbA1GF.js} +1 -1
  38. package/dist/assets/{life-force-workspace-BowvP5R4.js → life-force-workspace-BiD9xOEt.js} +1 -1
  39. package/dist/assets/{maps-D0Mm6WPG.js → maps-BTVHALP8.js} +1 -1
  40. package/dist/assets/{metric-tile-B6aJueRo.js → metric-tile-CuP9DOYm.js} +1 -1
  41. package/dist/assets/{motion-DwjmC9aq.js → motion-DcgUnXhY.js} +1 -1
  42. package/dist/assets/{movement-boxes-5cjWjIdR.js → movement-boxes-DZg_qPPg.js} +1 -1
  43. package/dist/assets/{movement-page-Dy53RWtB.js → movement-page-CmwsQGR_.js} +1 -1
  44. package/dist/assets/{note-markdown-CvEQCfoi.js → note-markdown-B82ncnFt.js} +1 -1
  45. package/dist/assets/{note-tags-input-Cg5zBXos.js → note-tags-input-C_x5WdK5.js} +1 -1
  46. package/dist/assets/{notes-boxes-CgZyf7mV.js → notes-boxes-BEFlp9yd.js} +1 -1
  47. package/dist/assets/{notes-page-Cbdcv0Ej.js → notes-page-B6Vl-GPf.js} +1 -1
  48. package/dist/assets/{open-in-graph-button-D31ZOEhA.js → open-in-graph-button-C-bJekoH.js} +1 -1
  49. package/dist/assets/{orbit-map-8eNDWek8.js → orbit-map-DHeTM15g.js} +1 -1
  50. package/dist/assets/{overview-page-CZ6q52Qj.js → overview-page-BRWje1F9.js} +1 -1
  51. package/dist/assets/{page-hero-C0MpI3MM.js → page-hero-8bITsx_x.js} +1 -1
  52. package/dist/assets/pill-cluster-XQjm-wPc.js +1 -0
  53. package/dist/assets/{preference-entity-handoff-button-CJhr5AXl.js → preference-entity-handoff-button-DwYF_5i3.js} +1 -1
  54. package/dist/assets/{preferences-page-8vszDNFX.js → preferences-page-C7DBPpNb.js} +1 -1
  55. package/dist/assets/{project-collections-sC7eAAhS.js → project-collections-mtxanSMf.js} +1 -1
  56. package/dist/assets/{project-detail-page-BKdnMjJy.js → project-detail-page-BT87Goqc.js} +1 -1
  57. package/dist/assets/{project-dialog-BiHZpOo1.js → project-dialog-DnZe757y.js} +1 -1
  58. package/dist/assets/{project-management-hierarchy-page-VW-hykAI.js → project-management-hierarchy-page-B3R2lNFI.js} +1 -1
  59. package/dist/assets/{project-management-section-nav-BEZ5zihs.js → project-management-section-nav-DyBWxHbe.js} +1 -1
  60. package/dist/assets/{projects-boxes-Ca6rpYeE.js → projects-boxes-CxZj3P29.js} +1 -1
  61. package/dist/assets/{projects-page-D86pjpTf.js → projects-page-Bec11c0x.js} +1 -1
  62. package/dist/assets/{psyche-behaviors-page-YLJB6CRU.js → psyche-behaviors-page-DWRpYvl1.js} +1 -1
  63. package/dist/assets/{psyche-flashcards-page-D3gdHLUw.js → psyche-flashcards-page-CX4rcsXZ.js} +1 -1
  64. package/dist/assets/{psyche-goal-map-page-DJiqSiCx.js → psyche-goal-map-page-Y6b3lCvV.js} +1 -1
  65. package/dist/assets/{psyche-graph-Tke0qFdt.js → psyche-graph-CQuCWKIp.js} +1 -1
  66. package/dist/assets/{psyche-metrics-page-DoLnvmC2.js → psyche-metrics-page-DadDJOnm.js} +1 -1
  67. package/dist/assets/{psyche-mode-guide-page-_Zbvg_HL.js → psyche-mode-guide-page-B1nz0uCg.js} +1 -1
  68. package/dist/assets/{psyche-modes-page-eAkaAzJc.js → psyche-modes-page-i3uSuhKA.js} +1 -1
  69. package/dist/assets/{psyche-page-CwmuBVjA.js → psyche-page-Y_s-BE2m.js} +1 -1
  70. package/dist/assets/{psyche-patterns-page-D7B4Ykjq.js → psyche-patterns-page-DaaOLIlN.js} +1 -1
  71. package/dist/assets/{psyche-questionnaire-builder-page-CHJlvCzX.js → psyche-questionnaire-builder-page-CuF7rXOv.js} +1 -1
  72. package/dist/assets/{psyche-questionnaire-detail-page-Bg3ll-D4.js → psyche-questionnaire-detail-page-BfFEMkRY.js} +1 -1
  73. package/dist/assets/{psyche-questionnaire-run-detail-page-CIEerczF.js → psyche-questionnaire-run-detail-page-BoQTvd7Q.js} +1 -1
  74. package/dist/assets/{psyche-questionnaire-run-page-DyxIk6Qx.js → psyche-questionnaire-run-page-C0qKiNZN.js} +1 -1
  75. package/dist/assets/{psyche-questionnaires-page-ZlqUxuIl.js → psyche-questionnaires-page-B6hfD448.js} +1 -1
  76. package/dist/assets/{psyche-report-detail-page-B2jgYnQ5.js → psyche-report-detail-page-BlFL8moM.js} +1 -1
  77. package/dist/assets/{psyche-reports-page-DlXr52yr.js → psyche-reports-page-DAAcYENp.js} +1 -1
  78. package/dist/assets/{psyche-schemas-Dtskzvv1.js → psyche-schemas-DDol0j-g.js} +1 -1
  79. package/dist/assets/{psyche-schemas-beliefs-page-BhrTZN9B.js → psyche-schemas-beliefs-page-CsxKSrKM.js} +1 -1
  80. package/dist/assets/{psyche-screen-time-page-WNGcdusx.js → psyche-screen-time-page-n4b0e58x.js} +1 -1
  81. package/dist/assets/{psyche-self-observation-page-XsCOglo4.js → psyche-self-observation-page-BaxEQ2-3.js} +1 -1
  82. package/dist/assets/{psyche-values-page-NvHI6zWK.js → psyche-values-page-DTv5NMSU.js} +1 -1
  83. package/dist/assets/{question-flow-dialog-Bj4PxpjS.js → question-flow-dialog-CskCt5NZ.js} +1 -1
  84. package/dist/assets/{report-chain-fields-mWFikZzT.js → report-chain-fields-D132-EMh.js} +1 -1
  85. package/dist/assets/{rewards-page-DyjwXsQN.js → rewards-page-C533lVP-.js} +1 -1
  86. package/dist/assets/{scheduling-rules-editor-C6FEYOxd.js → scheduling-rules-editor-CDpontGp.js} +1 -1
  87. package/dist/assets/{schema-badge-CCe4zkSN.js → schema-badge-B3DiMnjB.js} +1 -1
  88. package/dist/assets/{schemas-Cjwn6ooR.js → schemas-CH1_ngUX.js} +1 -1
  89. package/dist/assets/{select-menu-DeJhCsd8.js → select-menu-BOF-k4Ln.js} +1 -1
  90. package/dist/assets/{settings-agents-page-DYDxyKu-.js → settings-agents-page-B5OQtlZX.js} +1 -1
  91. package/dist/assets/{settings-bin-page-BWLfKVW1.js → settings-bin-page-D_bk3Kcu.js} +1 -1
  92. package/dist/assets/{settings-calendar-page-Ci-wXhCv.js → settings-calendar-page-PuSj9_kM.js} +1 -1
  93. package/dist/assets/{settings-data-page-DxIw-fWn.js → settings-data-page-EwFMaeq6.js} +1 -1
  94. package/dist/assets/{settings-logs-page-inpyIdu6.js → settings-logs-page-BKkse0DX.js} +1 -1
  95. package/dist/assets/{settings-mobile-page-BcJGLax8.js → settings-mobile-page-BrIVmdeB.js} +1 -1
  96. package/dist/assets/{settings-models-page-OWTRhfkj.js → settings-models-page-Mg84D_0K.js} +1 -1
  97. package/dist/assets/{settings-page-DXxF3qK2.js → settings-page-D-kul92f.js} +1 -1
  98. package/dist/assets/{settings-rewards-page-CCXin1n_.js → settings-rewards-page-waNyCcX_.js} +1 -1
  99. package/dist/assets/{settings-section-nav-CwSDNC3W.js → settings-section-nav-BmJWnrYk.js} +1 -1
  100. package/dist/assets/{settings-users-page-B4NEACwR.js → settings-users-page-DBgC6y56.js} +1 -1
  101. package/dist/assets/{settings-wiki-page-BNRK1SYc.js → settings-wiki-page-CM0te9dI.js} +1 -1
  102. package/dist/assets/sleep-page-C_krRE59.js +1 -0
  103. package/dist/assets/{sports-page-BawekFKD.js → sports-page-eg5Rfc_E.js} +1 -1
  104. package/dist/assets/{state-BtwEvpO6.js → state-Bpe5dF3T.js} +1 -1
  105. package/dist/assets/{strategies-page-BEl3NGAU.js → strategies-page-D4AqvFNW.js} +1 -1
  106. package/dist/assets/{strategy-detail-page-DPPI_8Ub.js → strategy-detail-page-BlYVkXaW.js} +1 -1
  107. package/dist/assets/{strategy-dialog-DU6wbBkQ.js → strategy-dialog-FO9Oa0dB.js} +1 -1
  108. package/dist/assets/{surface-BVYp-Wq9.js → surface-MVeeZGKB.js} +1 -1
  109. package/dist/assets/{table-BuONJH1s.js → table-U7otr5go.js} +1 -1
  110. package/dist/assets/{task-detail-page-BsMVAsbb.js → task-detail-page-Dy-aRyY6.js} +1 -1
  111. package/dist/assets/{task-dialog-BGzPc6TW.js → task-dialog-DrA9pba7.js} +1 -1
  112. package/dist/assets/{timebox-planning-dialog-4_XWuqkw.js → timebox-planning-dialog-C_gnfxFx.js} +1 -1
  113. package/dist/assets/{today-boxes-5pCvh5zS.js → today-boxes-BFOws_iC.js} +1 -1
  114. package/dist/assets/{today-page-BGurICpl.js → today-page-BoPj6a6q.js} +1 -1
  115. package/dist/assets/{training-load-page-BkoYKZ9_.js → training-load-page-DGU40Zfl.js} +1 -1
  116. package/dist/assets/{ui-B9O-eUim.js → ui-B9TWEtCx.js} +1 -1
  117. package/dist/assets/{use-anchored-overlay-position-BrQ4cqKn.js → use-anchored-overlay-position-BY4kNzPj.js} +1 -1
  118. package/dist/assets/{use-psyche-focus-target-Cuxni3SK.js → use-psyche-focus-target-BhNedCZB.js} +1 -1
  119. package/dist/assets/{user-badge-DfDv87j7.js → user-badge-CZWtYeMw.js} +1 -1
  120. package/dist/assets/{user-select-field-BNqv8-wd.js → user-select-field-fx129Uh6.js} +1 -1
  121. package/dist/assets/{utility-widgets-CbYj32he.js → utility-widgets-B3wWGxQc.js} +1 -1
  122. package/dist/assets/{vendor-Cpmju3nw.js → vendor-BwL6m4SE.js} +216 -211
  123. package/dist/assets/{vitals-page-DlxMk-L7.js → vitals-page-BXRZEP_8.js} +1 -1
  124. package/dist/assets/{weekly-review-page-VrEvAl1T.js → weekly-review-page-D5cebA5x.js} +1 -1
  125. package/dist/assets/weight-loss-page-BuUdFh9z.js +5 -0
  126. package/dist/assets/{wiki-article-markdown-DxTkiQRy.js → wiki-article-markdown-CvaCjg_t.js} +1 -1
  127. package/dist/assets/{wiki-editor-page-Beu92YnZ.js → wiki-editor-page-Dco79SLY.js} +1 -1
  128. package/dist/assets/{wiki-ingest-history-page-Cq_soygm.js → wiki-ingest-history-page-uvKRkRDF.js} +1 -1
  129. package/dist/assets/{wiki-ingest-modal-D6xs2sEn.js → wiki-ingest-modal-BW6AJPea.js} +1 -1
  130. package/dist/assets/{wiki-page-yF3Flgtg.js → wiki-page-BIL5zMqv.js} +1 -1
  131. package/dist/assets/{workbench-flow-page-CZZGg3a8.js → workbench-flow-page-Dx_nq8R_.js} +1 -1
  132. package/dist/assets/{workbench-page-DKENZ5Nz.js → workbench-page-BJnt_Zzf.js} +1 -1
  133. package/dist/assets/{workout-detail-page-CeN4QiYQ.js → workout-detail-page-CKgqyB-y.js} +2 -2
  134. package/dist/index.html +8 -8
  135. package/dist/server/server/migrations/070_health_mobile_sync_completion_index.sql +16 -0
  136. package/dist/server/server/src/app.js +139 -13
  137. package/dist/server/server/src/health-weight-loss.js +48 -6
  138. package/dist/server/server/src/health.js +345 -96
  139. package/dist/server/server/src/openapi.js +62 -0
  140. package/dist/server/server/src/repositories/gamification.js +25 -0
  141. package/dist/server/server/src/repositories/tasks.js +82 -17
  142. package/dist/server/server/src/services/dashboard.js +5 -4
  143. package/dist/server/server/src/services/gamification.js +47 -19
  144. package/dist/server/server/src/services/life-force.js +99 -0
  145. package/dist/server/src/lib/api.js +4 -0
  146. package/dist/server/src/lib/snapshot-normalizer.js +42 -23
  147. package/openclaw.plugin.json +1 -1
  148. package/package.json +1 -1
  149. package/server/migrations/070_health_mobile_sync_completion_index.sql +16 -0
  150. package/skills/forge-openclaw/SKILL.md +1 -0
  151. package/skills/forge-openclaw/psyche_entity_playbooks.md +8 -0
  152. package/dist/assets/date-keys-Cj1G3TOn.js +0 -1
  153. package/dist/assets/index-BaiwtAgo.js +0 -2
  154. package/dist/assets/index-CEgIwgk9.css +0 -1
  155. package/dist/assets/pill-cluster-DGwKZQKF.js +0 -1
  156. package/dist/assets/sleep-page-Bara54nB.js +0 -1
  157. package/dist/assets/weight-loss-page-DJDnjxKF.js +0 -5
@@ -10,7 +10,22 @@ const EMPTY_CALENDAR_RULES = {
10
10
  allowAvailability: [],
11
11
  blockAvailability: []
12
12
  };
13
- function normalizeTask(task) {
13
+ function findUser(usersById, userId) {
14
+ return userId ? (usersById?.get(userId) ?? null) : null;
15
+ }
16
+ function normalizeTask(task, usersById) {
17
+ const userId = task?.userId ?? null;
18
+ const ownerUserId = task?.ownerUserId ?? task?.userId ?? null;
19
+ const user = task?.user ??
20
+ findUser(usersById, userId);
21
+ const ownerUser = task?.ownerUser ??
22
+ (task?.user ??
23
+ findUser(usersById, ownerUserId));
24
+ const assigneeUserIds = task?.assigneeUserIds ?? [];
25
+ const assignees = task?.assignees ??
26
+ assigneeUserIds
27
+ .map((assigneeUserId) => findUser(usersById, assigneeUserId))
28
+ .filter((assignee) => assignee !== null);
14
29
  return {
15
30
  id: task?.id ?? "",
16
31
  title: task?.title ?? "",
@@ -41,13 +56,12 @@ function normalizeTask(task) {
41
56
  createdAt: task?.createdAt ?? new Date(0).toISOString(),
42
57
  updatedAt: task?.updatedAt ?? new Date(0).toISOString(),
43
58
  tagIds: task?.tagIds ?? [],
44
- userId: task?.userId ?? null,
45
- user: task?.user ?? null,
46
- ownerUserId: task?.ownerUserId ?? task?.userId ?? null,
47
- ownerUser: task?.ownerUser ??
48
- (task?.user ?? null),
49
- assigneeUserIds: task?.assigneeUserIds ?? [],
50
- assignees: task?.assignees ?? [],
59
+ userId,
60
+ user,
61
+ ownerUserId,
62
+ ownerUser,
63
+ assigneeUserIds,
64
+ assignees,
51
65
  time: task?.time ?? {
52
66
  totalTrackedSeconds: 0,
53
67
  totalCreditedSeconds: 0,
@@ -258,6 +272,11 @@ function normalizeStrategy(strategy) {
258
272
  }
259
273
  export function normalizeForgeSnapshot(raw) {
260
274
  const legacy = raw;
275
+ const rootUsers = (raw.users ?? []).map(normalizeUser);
276
+ const usersById = new Map(rootUsers.map((user) => [user.id, user]));
277
+ const rootTasks = (raw.tasks ?? []).map((task) => normalizeTask(task, usersById));
278
+ const rootTags = (raw.tags ?? []).map(normalizeTag);
279
+ const rootHabits = (raw.habits ?? raw.dashboard?.habits ?? []).map(normalizeHabit);
261
280
  const rootProjects = (legacy.projects ?? legacy.campaigns ?? []).map(normalizeProject);
262
281
  const dashboardProjects = (legacy.dashboard?.projects ??
263
282
  legacy.dashboard?.campaigns ??
@@ -292,7 +311,7 @@ export function normalizeForgeSnapshot(raw) {
292
311
  topGoalId: raw.metrics?.topGoalId ?? null,
293
312
  topGoalTitle: raw.metrics?.topGoalTitle ?? null
294
313
  },
295
- users: (raw.users ?? []).map(normalizeUser),
314
+ users: rootUsers,
296
315
  strategies: (raw.strategies ?? []).map(normalizeStrategy),
297
316
  userScope: {
298
317
  selectedUserIds: raw.userScope?.selectedUserIds ?? [],
@@ -313,14 +332,14 @@ export function normalizeForgeSnapshot(raw) {
313
332
  ...normalizeGoal(goal)
314
333
  })),
315
334
  projects: dashboardProjects,
316
- tasks: (raw.dashboard?.tasks ?? []).map(normalizeTask),
317
- habits: (raw.dashboard?.habits ?? raw.habits ?? []).map(normalizeHabit),
318
- tags: (raw.dashboard?.tags ?? []).map(normalizeTag),
335
+ tasks: (raw.dashboard?.tasks ?? rootTasks).map((task) => normalizeTask(task, usersById)),
336
+ habits: (raw.dashboard?.habits ?? rootHabits).map(normalizeHabit),
337
+ tags: (raw.dashboard?.tags ?? rootTags).map(normalizeTag),
319
338
  suggestedTags: (raw.dashboard?.suggestedTags ?? []).map(normalizeTag),
320
339
  owners: raw.dashboard?.owners ?? [],
321
340
  executionBuckets: (raw.dashboard?.executionBuckets ?? []).map((bucket) => ({
322
341
  ...bucket,
323
- tasks: (bucket.tasks ?? []).map(normalizeTask)
342
+ tasks: (bucket.tasks ?? []).map((task) => normalizeTask(task, usersById))
324
343
  })),
325
344
  gamification: raw.dashboard?.gamification ?? {
326
345
  totalXp: raw.metrics?.totalXp ?? 0,
@@ -342,7 +361,7 @@ export function normalizeForgeSnapshot(raw) {
342
361
  },
343
362
  achievements: raw.dashboard?.achievements ?? [],
344
363
  milestoneRewards: raw.dashboard?.milestoneRewards ?? [],
345
- recentActivity: raw.dashboard?.recentActivity ?? [],
364
+ recentActivity: raw.dashboard?.recentActivity ?? raw.activity ?? [],
346
365
  notesSummaryByEntity: raw.dashboard?.notesSummaryByEntity ?? {}
347
366
  },
348
367
  overview: {
@@ -370,7 +389,7 @@ export function normalizeForgeSnapshot(raw) {
370
389
  ...goal,
371
390
  ...normalizeGoal(goal)
372
391
  })),
373
- topTasks: (raw.overview?.topTasks ?? []).map(normalizeTask),
392
+ topTasks: (raw.overview?.topTasks ?? []).map((task) => normalizeTask(task, usersById)),
374
393
  dueHabits: (raw.overview?.dueHabits ??
375
394
  raw.today?.dueHabits ??
376
395
  raw.dashboard?.habits ??
@@ -384,7 +403,7 @@ export function normalizeForgeSnapshot(raw) {
384
403
  generatedAt: raw.today?.generatedAt ?? new Date().toISOString(),
385
404
  directive: {
386
405
  task: raw.today?.directive?.task
387
- ? normalizeTask(raw.today.directive.task)
406
+ ? normalizeTask(raw.today.directive.task, usersById)
388
407
  : null,
389
408
  goalTitle: raw.today?.directive?.goalTitle ?? null,
390
409
  rewardXp: raw.today?.directive?.rewardXp ?? 0,
@@ -392,7 +411,7 @@ export function normalizeForgeSnapshot(raw) {
392
411
  },
393
412
  timeline: (raw.today?.timeline ?? []).map((bucket) => ({
394
413
  ...bucket,
395
- tasks: (bucket.tasks ?? []).map(normalizeTask)
414
+ tasks: (bucket.tasks ?? []).map((task) => normalizeTask(task, usersById))
396
415
  })),
397
416
  dueHabits: (raw.today?.dueHabits ??
398
417
  raw.overview?.dueHabits ??
@@ -409,17 +428,17 @@ export function normalizeForgeSnapshot(raw) {
409
428
  },
410
429
  risk: {
411
430
  generatedAt: raw.risk?.generatedAt ?? new Date().toISOString(),
412
- overdueTasks: (raw.risk?.overdueTasks ?? []).map(normalizeTask),
413
- blockedTasks: (raw.risk?.blockedTasks ?? []).map(normalizeTask),
431
+ overdueTasks: (raw.risk?.overdueTasks ?? []).map((task) => normalizeTask(task, usersById)),
432
+ blockedTasks: (raw.risk?.blockedTasks ?? []).map((task) => normalizeTask(task, usersById)),
414
433
  neglectedGoals: raw.risk?.neglectedGoals ?? [],
415
434
  summary: raw.risk?.summary ?? ""
416
435
  },
417
436
  goals: (raw.goals ?? []).map(normalizeGoal),
418
437
  projects: rootProjects,
419
- tags: (raw.tags ?? []).map(normalizeTag),
420
- tasks: (raw.tasks ?? []).map(normalizeTask),
421
- habits: (raw.habits ?? raw.dashboard?.habits ?? []).map(normalizeHabit),
422
- activity: raw.activity ?? [],
438
+ tags: rootTags,
439
+ tasks: rootTasks,
440
+ habits: rootHabits,
441
+ activity: raw.activity ?? raw.dashboard?.recentActivity ?? [],
423
442
  activeTaskRuns: raw.activeTaskRuns ?? [],
424
443
  lifeForce: raw.lifeForce ?? {
425
444
  userId: "",
@@ -2,7 +2,7 @@
2
2
  "id": "forge-openclaw-plugin",
3
3
  "name": "Forge",
4
4
  "description": "Curated OpenClaw adapter for the Forge collaboration API, UI entrypoint, and localhost auto-start runtime.",
5
- "version": "0.3.5",
5
+ "version": "0.3.8",
6
6
  "activation": {
7
7
  "onStartup": true,
8
8
  "onCapabilities": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "forge-openclaw-plugin",
3
- "version": "0.3.5",
3
+ "version": "0.3.8",
4
4
  "description": "Curated OpenClaw adapter for the Forge collaboration API, UI entrypoint, and localhost auto-start runtime.",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -0,0 +1,16 @@
1
+ CREATE INDEX IF NOT EXISTS idx_health_mobile_sync_chunks_completion_cover
2
+ ON health_mobile_sync_chunks(
3
+ sync_session_id,
4
+ sequence,
5
+ id,
6
+ chunk_id,
7
+ family,
8
+ checksum_sha256,
9
+ record_count,
10
+ byte_count,
11
+ payload_summary_json,
12
+ received_at,
13
+ applied_at,
14
+ created_at,
15
+ updated_at
16
+ );
@@ -300,6 +300,7 @@ Psyche interview rule:
300
300
  - After the first real answer, choose one follow-up lane at a time: situation, sequence, meaning, protection, cost, longing/value, or tentative name.
301
301
  - Do not minimize functional analysis, trigger chains, behavior patterns, modes, beliefs, or schema themes. Once at least one concrete example is clear, offer one careful interpretive hypothesis when it would help the user understand the function, protection, cost, belief, mode, or schema theme.
302
302
  - Phrase interpretive hypotheses as collaborative and testable, not as verdicts. A good hypothesis says what the reaction may be protecting, predicting, relieving, or costing, then asks whether that lands or needs correction.
303
+ - Do not keep asking broad exploratory Psyche questions after the cue, meaning, protection, payoff, or cost is already visible. For `behavior_pattern`, `belief_entry`, `mode_profile`, `mode_guide_session`, and `trigger_report`, the next helpful move is usually one active formulation plus one correction question, not another passive reflection.
303
304
  - Use the hypothesis timing checkpoint before asking a second or third deepening question: offer a hypothesis when one concrete episode, body cue, belief sentence, behavior, or mode voice is visible and the hypothesis would change the record shape, wording, links, or next action. Do not hypothesize yet when no concrete moment is visible, the user only wants a direct mechanical save, the user is flooded or unsafe, or the only available interpretation would be diagnosis-like, an origin story, or a certainty claim.
304
305
  - If several Psyche containers are plausible, do not ask the user to choose from a taxonomy menu first. Reflect the lived difference, offer one careful hypothesis when a concrete example is visible, then distinguish the options in plain language: one episode as a `trigger_report`, a recurring loop as a `behavior_pattern`, one repeated move as `behavior`, one sentence as `belief_entry`, a part-state as `mode_profile` or `mode_guide_session`, or reusable future-labeling as `event_type` or `emotion_definition`.
305
306
  - For Psyche updates, start with what feels newly true, newly visible, or newly inaccurate, then ask what should stay true before changing the formulation.
@@ -196,6 +196,14 @@ material without a usable formulation.
196
196
  question that tests or corrects it.
197
197
  - Do not make the user supply every interpretation alone. If the sequence is clear
198
198
  enough, do the formulation work in plain language and invite correction.
199
+ - Do not keep asking broad exploratory questions after the cue, meaning, protection,
200
+ payoff, or cost is already visible. In those moments, the next helpful move is
201
+ usually one active formulation: "one hypothesis is..." followed by one correction
202
+ question.
203
+ - Active formulation is especially important for `behavior_pattern`, `belief_entry`,
204
+ `mode_profile`, `mode_guide_session`, and `trigger_report`; those records should
205
+ not stop at empathic reflection when the user's example already supports a
206
+ functional interpretation.
199
207
 
200
208
  ## Hypothesis Timing Checkpoint
201
209
 
@@ -1 +0,0 @@
1
- function a(e,n){var t;return((t=e.find(o=>o.type===n))==null?void 0:t.value)??""}function m(){return Intl.DateTimeFormat().resolvedOptions().timeZone||"UTC"}function u(e,n){const t=new Intl.DateTimeFormat("en-CA",{timeZone:n,year:"numeric",month:"2-digit",day:"2-digit"}).formatToParts(e),o=a(t,"year"),r=a(t,"month"),i=a(t,"day");return`${o}-${r}-${i}`}function c(e=new Date){return u(e,m())}export{c as f};