forge-openclaw-plugin 0.3.15 → 0.3.17

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 (415) hide show
  1. package/README.md +6 -6
  2. package/dist/assets/{action-bar-B9MYlps2.js → action-bar-D3CEYlj4.js} +1 -1
  3. package/dist/assets/{activity-page-DbzbChcE.js → activity-page-Ce1pHIu5.js} +1 -1
  4. package/dist/assets/{ai-surface-workspace-CF0257Hs.js → ai-surface-workspace-DEliwOjF.js} +1 -1
  5. package/dist/assets/artifacts-page-BgyFVIVM.js +2 -0
  6. package/dist/assets/{atlas-panel-CO3RYAKn.js → atlas-panel-VZOnJa1c.js} +1 -1
  7. package/dist/assets/{board-CuxQRKPJ.js → board-DprRipIG.js} +1 -1
  8. package/dist/assets/{calendar-page-BuuHKEHC.js → calendar-page-Zstsn4uG.js} +1 -1
  9. package/dist/assets/{calendar-rules-DKftgNx5.js → calendar-rules-BGIBuEDk.js} +1 -1
  10. package/dist/assets/{calendar-week-toolbar-ChIpkT-G.js → calendar-week-toolbar-DXFkMkbq.js} +1 -1
  11. package/dist/assets/{charts-BzT4pUPg.js → charts-C5S0-BL7.js} +1 -1
  12. package/dist/assets/{companion-sync-lab-page-BZRX4Btw.js → companion-sync-lab-page-DIPPLFKt.js} +1 -1
  13. package/dist/assets/{daily-metrics-dashboard-CXDsaAQd.js → daily-metrics-dashboard-CG-OOCJz.js} +1 -1
  14. package/dist/assets/{define-workbench-box-CpG0Zb1L.js → define-workbench-box-BEEdtBkQ.js} +1 -1
  15. package/dist/assets/{entity-link-multiselect-Dl4rZqdg.js → entity-link-multiselect-BfDAROHB.js} +1 -1
  16. package/dist/assets/{entity-note-count-link-Bs1aKYyD.js → entity-note-count-link-BGOiaash.js} +1 -1
  17. package/dist/assets/{entity-notes-surface-B56XSw7M.js → entity-notes-surface-DPsJwqQa.js} +1 -1
  18. package/dist/assets/execution-board-Dg-2GSKv.js +1 -0
  19. package/dist/assets/{faceted-token-search-Dg2rjknH.js → faceted-token-search-DV7MSVYb.js} +1 -1
  20. package/dist/assets/{flagship-signal-deck-C6KVPhmM.js → flagship-signal-deck-D3wVL3bC.js} +1 -1
  21. package/dist/assets/{floating-action-menu-DAFAEBcA.js → floating-action-menu-BUs382px.js} +1 -1
  22. package/dist/assets/{forms-D1qJ3oOP.js → forms-ByKjodjN.js} +1 -1
  23. package/dist/assets/{generic-node-view-C6DK5hJ6.js → generic-node-view-BY5dbPXJ.js} +1 -1
  24. package/dist/assets/{goal-detail-page-CC4VXud6.js → goal-detail-page-MYr6j2B4.js} +1 -1
  25. package/dist/assets/{goal-dialog-15hD8EBp.js → goal-dialog-nkdME5Uy.js} +1 -1
  26. package/dist/assets/goals-page-BsFeBzU1.js +1 -0
  27. package/dist/assets/{graph-BF4IsheG.js → graph-CHVj0Z7n.js} +1 -1
  28. package/dist/assets/habits-page-wO461EVU.js +1 -0
  29. package/dist/assets/{health-boxes-DqgvIYoL.js → health-boxes-BphMeSJj.js} +1 -1
  30. package/dist/assets/index-CSd8ylsy.css +1 -0
  31. package/dist/assets/index-gmPaoLN-.js +2 -0
  32. package/dist/assets/{inline-note-fields-COgzxr_7.js → inline-note-fields-BvQwmMAv.js} +1 -1
  33. package/dist/assets/{insight-flow-dialog-Dmb6NSGp.js → insight-flow-dialog-H_eaOmst.js} +1 -1
  34. package/dist/assets/{insights-page-OnqR4cYI.js → insights-page-DINYe3cB.js} +3 -3
  35. package/dist/assets/{kanban-boxes-BWUzntCV.js → kanban-boxes-oACOTDYG.js} +1 -1
  36. package/dist/assets/{kanban-page-BI16Gzp_.js → kanban-page-BGLXH91f.js} +1 -1
  37. package/dist/assets/knowledge-graph-page-VfMvw5jL.js +1 -0
  38. package/dist/assets/{life-force-page-CDEXEQai.js → life-force-page-DQPb6UL-.js} +1 -1
  39. package/dist/assets/{life-force-workspace-C7UOnJEf.js → life-force-workspace-BJ1aI3JE.js} +1 -1
  40. package/dist/assets/{maps-BTVHALP8.js → maps-CvEHVkBk.js} +1 -1
  41. package/dist/assets/{metric-tile-boeHB1R1.js → metric-tile-CbEe19Gd.js} +1 -1
  42. package/dist/assets/{motion-DcgUnXhY.js → motion-BibSzp57.js} +1 -1
  43. package/dist/assets/{movement-boxes-BUSqaTL2.js → movement-boxes-dtDYhw5c.js} +1 -1
  44. package/dist/assets/{movement-page-DcbO0497.js → movement-page-BhmwCHjs.js} +1 -1
  45. package/dist/assets/{note-markdown-DXXI3W3V.js → note-markdown-CG8u2d6p.js} +1 -1
  46. package/dist/assets/{note-tags-input-CYh3TVW2.js → note-tags-input-D_conqDO.js} +1 -1
  47. package/dist/assets/{notes-boxes-CMJXX2K0.js → notes-boxes-BLKucFqW.js} +1 -1
  48. package/dist/assets/notes-page-CafVxWjb.js +1 -0
  49. package/dist/assets/{open-in-graph-button-4UYrp1XP.js → open-in-graph-button-DFQ4r6SN.js} +1 -1
  50. package/dist/assets/{orbit-map-BwK7sDaC.js → orbit-map-DsEl3ori.js} +1 -1
  51. package/dist/assets/overview-page-BffcX-pM.js +1 -0
  52. package/dist/assets/page-hero-U603l9rQ.js +1 -0
  53. package/dist/assets/pill-cluster-BYVFNppV.js +1 -0
  54. package/dist/assets/{preference-entity-handoff-button-C2ATjvws.js → preference-entity-handoff-button-cPrTpHsV.js} +1 -1
  55. package/dist/assets/{preferences-page-BAexXHye.js → preferences-page-DQjFIOmt.js} +1 -1
  56. package/dist/assets/{project-collections-B9nr-Ts-.js → project-collections-B9OGHGqm.js} +1 -1
  57. package/dist/assets/project-detail-page-r1Sw2kcO.js +1 -0
  58. package/dist/assets/{project-dialog-CBA-D65n.js → project-dialog-B2_PcXAf.js} +1 -1
  59. package/dist/assets/project-management-hierarchy-page-qLNG8hsh.js +1 -0
  60. package/dist/assets/{project-management-section-nav-DJ3QKCtr.js → project-management-section-nav-DFUlmMEB.js} +1 -1
  61. package/dist/assets/{projects-boxes-iBu_PRqe.js → projects-boxes-BA7_XaqX.js} +1 -1
  62. package/dist/assets/projects-page-B6ggXWFw.js +1 -0
  63. package/dist/assets/psyche-behaviors-page-ByWpXlLq.js +5 -0
  64. package/dist/assets/{psyche-flashcards-page-DQaw_vUQ.js → psyche-flashcards-page-B9nSc0mk.js} +1 -1
  65. package/dist/assets/{psyche-goal-map-page-C-ZTVOEP.js → psyche-goal-map-page-BQU7qI88.js} +1 -1
  66. package/dist/assets/{psyche-graph-DYzeClxn.js → psyche-graph-DCeP7r2b.js} +1 -1
  67. package/dist/assets/{psyche-metrics-page-C9hKn10A.js → psyche-metrics-page-DD2lOP-J.js} +1 -1
  68. package/dist/assets/psyche-mode-guide-page-DbtZgnjr.js +1 -0
  69. package/dist/assets/psyche-modes-page-3zFJWFQf.js +1 -0
  70. package/dist/assets/psyche-page-D5vXYkfB.js +1 -0
  71. package/dist/assets/psyche-patterns-page-BneAAeKS.js +5 -0
  72. package/dist/assets/{psyche-questionnaire-builder-page-gRwdGXde.js → psyche-questionnaire-builder-page-BH1la5C9.js} +1 -1
  73. package/dist/assets/{psyche-questionnaire-detail-page-CIP9b2UI.js → psyche-questionnaire-detail-page-DYav634P.js} +1 -1
  74. package/dist/assets/psyche-questionnaire-run-detail-page-9VaijhJm.js +1 -0
  75. package/dist/assets/{psyche-questionnaire-run-page-CXiJyd5i.js → psyche-questionnaire-run-page-e1T6k_dS.js} +1 -1
  76. package/dist/assets/{psyche-questionnaires-page-CFPKwA3O.js → psyche-questionnaires-page-Dyv367z9.js} +1 -1
  77. package/dist/assets/{psyche-report-detail-page-dU30a2WE.js → psyche-report-detail-page-hqxHIXw2.js} +3 -3
  78. package/dist/assets/psyche-reports-page-DhIfcGbt.js +1 -0
  79. package/dist/assets/{psyche-schemas-DDol0j-g.js → psyche-schemas-Cg51Ztxz.js} +1 -1
  80. package/dist/assets/psyche-schemas-beliefs-page-Dgb5o9vx.js +9 -0
  81. package/dist/assets/{psyche-screen-time-page-lIe6GQxJ.js → psyche-screen-time-page-D6MnJGNa.js} +1 -1
  82. package/dist/assets/{psyche-self-observation-page-BTE3KfIl.js → psyche-self-observation-page-C1Vyezbv.js} +1 -1
  83. package/dist/assets/{psyche-values-page-DclBZ9xw.js → psyche-values-page-B_JWVw1Q.js} +2 -2
  84. package/dist/assets/{question-flow-dialog-Ded2E85L.js → question-flow-dialog-yMYVk998.js} +2 -2
  85. package/dist/assets/{report-chain-fields-DY640iqL.js → report-chain-fields-D4NM9a6I.js} +1 -1
  86. package/dist/assets/rewards-page-B5-bcL4R.js +1 -0
  87. package/dist/assets/{scheduling-rules-editor-jakFfxqF.js → scheduling-rules-editor-De72IUax.js} +1 -1
  88. package/dist/assets/{schema-badge-30B5syHA.js → schema-badge-jX28kUa6.js} +1 -1
  89. package/dist/assets/{schemas-Db29G8NU.js → schemas-BlFy-uPR.js} +1 -1
  90. package/dist/assets/{select-menu-BF2zI3RW.js → select-menu-BXv1rsVc.js} +1 -1
  91. package/dist/assets/{settings-agents-page-Bh-Bv6FQ.js → settings-agents-page-DN_np10S.js} +1 -1
  92. package/dist/assets/settings-bin-page-BM5BpK_i.js +1 -0
  93. package/dist/assets/{settings-calendar-page-BA4_Qqiu.js → settings-calendar-page-Cg0gSSFs.js} +3 -3
  94. package/dist/assets/{settings-data-page-K4kpmQJY.js → settings-data-page-Dwmp2rLy.js} +1 -1
  95. package/dist/assets/{settings-logs-page-DkuNPAZo.js → settings-logs-page-DQNM21Re.js} +1 -1
  96. package/dist/assets/{settings-mobile-page-4pCNwD91.js → settings-mobile-page-DQdiRa-a.js} +1 -1
  97. package/dist/assets/settings-models-page-CAEPpuHF.js +1 -0
  98. package/dist/assets/{settings-page-B_Be0vOY.js → settings-page-Cl2KiCFg.js} +1 -1
  99. package/dist/assets/{settings-rewards-page-C6nFTWJu.js → settings-rewards-page-DoIUumhe.js} +1 -1
  100. package/dist/assets/{settings-section-nav-Lo-VKCfZ.js → settings-section-nav-D_N87IG0.js} +1 -1
  101. package/dist/assets/{settings-users-page-CVzNp4-m.js → settings-users-page-CPesR62N.js} +1 -1
  102. package/dist/assets/{settings-wiki-page-DXM--7BB.js → settings-wiki-page-BxMQM5Vi.js} +1 -1
  103. package/dist/assets/{sleep-page-DvPdZMKx.js → sleep-page-DUYmQKrg.js} +1 -1
  104. package/dist/assets/{sports-page-DjuZlOur.js → sports-page-Bzi5TF9T.js} +1 -1
  105. package/dist/assets/{state-Bpe5dF3T.js → state-BFyKSULP.js} +1 -1
  106. package/dist/assets/{strategies-page-PE1IlatS.js → strategies-page-C-T2MZx4.js} +1 -1
  107. package/dist/assets/{strategy-detail-page-C4KiEGCI.js → strategy-detail-page-3tYuSZu-.js} +1 -1
  108. package/dist/assets/{strategy-dialog-Cwf7Y3P5.js → strategy-dialog-BWm4slo4.js} +1 -1
  109. package/dist/assets/{surface-ubuOfukq.js → surface-BJObZeRw.js} +1 -1
  110. package/dist/assets/{table-U7otr5go.js → table-CTLroJKN.js} +1 -1
  111. package/dist/assets/task-detail-page-ZZOXSpSF.js +1 -0
  112. package/dist/assets/{task-dialog-CI_Fy_FW.js → task-dialog-2wy0xI7f.js} +5 -5
  113. package/dist/assets/timebox-planning-dialog-C6h0Hp71.js +1 -0
  114. package/dist/assets/{today-boxes-CYuxSkZf.js → today-boxes-B_TdgSDz.js} +1 -1
  115. package/dist/assets/today-page-Dipns9tl.js +1 -0
  116. package/dist/assets/training-load-page-B78e1-o-.js +1 -0
  117. package/dist/assets/{ui-B9TWEtCx.js → ui-uo_bNP7c.js} +1 -1
  118. package/dist/assets/{use-anchored-overlay-position-BY4kNzPj.js → use-anchored-overlay-position-BSxFX6Hi.js} +1 -1
  119. package/dist/assets/{use-psyche-focus-target-BhNedCZB.js → use-psyche-focus-target-1GLkhYiv.js} +1 -1
  120. package/dist/assets/{user-badge-ByhC6bMU.js → user-badge-C4eZu1e_.js} +1 -1
  121. package/dist/assets/{user-select-field-fx129Uh6.js → user-select-field-CmKwcbZt.js} +1 -1
  122. package/dist/assets/{utility-widgets-ilORjDmg.js → utility-widgets-B06wQFrd.js} +2 -2
  123. package/dist/assets/{vendor-BwL6m4SE.js → vendor-B7FKSwHK.js} +222 -212
  124. package/dist/assets/{vitals-page-mdEqIm_9.js → vitals-page-BC7QFsm2.js} +1 -1
  125. package/dist/assets/{weekly-review-page-C8W-yg5r.js → weekly-review-page-BjNsNoWj.js} +1 -1
  126. package/dist/assets/{weight-loss-page-BApTknCn.js → weight-loss-page-BOahGY9r.js} +1 -1
  127. package/dist/assets/{wiki-article-markdown-DBccllQg.js → wiki-article-markdown-DO47HnZf.js} +2 -2
  128. package/dist/assets/{wiki-editor-page-BfRfH1O3.js → wiki-editor-page-OWRUHl4O.js} +5 -5
  129. package/dist/assets/{wiki-ingest-history-page-C-6H3MU6.js → wiki-ingest-history-page-CuHpg2lZ.js} +1 -1
  130. package/dist/assets/{wiki-ingest-modal-DnlhByD_.js → wiki-ingest-modal-EZ3kX-vA.js} +1 -1
  131. package/dist/assets/wiki-page-BPV3HIgu.js +1 -0
  132. package/dist/assets/{workbench-flow-page-_-NKIx5R.js → workbench-flow-page-C53KueEz.js} +3 -3
  133. package/dist/assets/{workbench-page-NIAzggwX.js → workbench-page-DJ7nT2JQ.js} +1 -1
  134. package/dist/assets/workout-detail-page-Dhyu0q7o.js +2 -0
  135. package/dist/index.html +8 -8
  136. package/dist/openclaw/api-client.js +28 -2
  137. package/dist/openclaw/local-runtime.js +31 -14
  138. package/dist/openclaw/parity.d.ts +1 -1
  139. package/dist/openclaw/parity.js +10 -0
  140. package/dist/openclaw/routes.js +78 -0
  141. package/dist/openclaw/tools.js +42 -0
  142. package/dist/server/apps/api/migrations/072_artifact_store.sql +106 -0
  143. package/dist/server/{server → apps/api}/src/app.js +365 -4
  144. package/dist/server/{server → apps/api}/src/connectors/box-registry.js +3 -3
  145. package/dist/server/{server → apps/api}/src/db.js +23 -4
  146. package/dist/server/{server → apps/api}/src/health-weight-loss.js +1 -1
  147. package/dist/server/{server → apps/api}/src/openapi.js +570 -1
  148. package/dist/server/{server → apps/api}/src/questionnaire-seeds.js +1 -1
  149. package/dist/server/{server → apps/api}/src/repositories/ai-connectors.js +1 -1
  150. package/dist/server/apps/api/src/repositories/entity-links.js +66 -0
  151. package/dist/server/{server → apps/api}/src/repositories/habits.js +1 -1
  152. package/dist/server/apps/api/src/services/artifacts.js +1059 -0
  153. package/dist/server/{server → apps/api}/src/services/companion-iroh.js +4 -1
  154. package/dist/server/{server → apps/api}/src/services/doctor.js +3 -3
  155. package/dist/server/{server → apps/api}/src/services/entity-crud.js +22 -0
  156. package/dist/server/{server → apps/api}/src/services/gamification-assets.js +1 -1
  157. package/dist/server/{server → apps/api}/src/services/gamification.js +1 -1
  158. package/dist/server/{server → apps/api}/src/services/knowledge-graph.js +48 -3
  159. package/dist/server/{server → apps/api}/src/services/psyche-observation-calendar.js +1 -0
  160. package/dist/server/{server → apps/api}/src/types.js +4 -2
  161. package/dist/server/{server → apps/api}/src/watch-mobile.js +1 -1
  162. package/dist/server/{src → apps/web/src}/lib/api.js +69 -0
  163. package/dist/server/{src → apps/web/src}/lib/entity-visuals.js +10 -1
  164. package/dist/server/{src → apps/web/src}/lib/knowledge-graph-types.js +9 -0
  165. package/openclaw.plugin.json +2 -1
  166. package/package.json +3 -3
  167. package/server/index.js +3 -3
  168. package/server/migrations/072_artifact_store.sql +106 -0
  169. package/skills/forge-openclaw/SKILL.md +60 -7
  170. package/skills/forge-openclaw/entity_conversation_playbooks.md +212 -14
  171. package/skills/forge-openclaw/psyche_entity_playbooks.md +20 -0
  172. package/dist/assets/execution-board-D66C_ikW.js +0 -1
  173. package/dist/assets/goals-page-CQ2lJMzI.js +0 -1
  174. package/dist/assets/habits-page-a7KVPaQp.js +0 -1
  175. package/dist/assets/index-ClJbJhca.css +0 -1
  176. package/dist/assets/index-FpGANF9S.js +0 -2
  177. package/dist/assets/knowledge-graph-page-DxEBaEke.js +0 -1
  178. package/dist/assets/notes-page-DvHMcQey.js +0 -1
  179. package/dist/assets/overview-page-Z5vaUTm3.js +0 -1
  180. package/dist/assets/page-hero-DvrM83_C.js +0 -1
  181. package/dist/assets/pill-cluster-DYI3Ibj8.js +0 -1
  182. package/dist/assets/project-detail-page-B9PqyPu9.js +0 -1
  183. package/dist/assets/project-management-hierarchy-page-DXK14jn0.js +0 -1
  184. package/dist/assets/projects-page-CdAk-ByT.js +0 -1
  185. package/dist/assets/psyche-behaviors-page-CbhhTfU2.js +0 -5
  186. package/dist/assets/psyche-mode-guide-page-CR8e984W.js +0 -1
  187. package/dist/assets/psyche-modes-page-lQdpAcY3.js +0 -1
  188. package/dist/assets/psyche-page-CTdIDkw9.js +0 -1
  189. package/dist/assets/psyche-patterns-page-Drgm-f7I.js +0 -5
  190. package/dist/assets/psyche-questionnaire-run-detail-page-SYndwtF3.js +0 -1
  191. package/dist/assets/psyche-reports-page-Cn0EBndy.js +0 -1
  192. package/dist/assets/psyche-schemas-beliefs-page-Bab4xSWv.js +0 -9
  193. package/dist/assets/rewards-page-FxUXB76B.js +0 -1
  194. package/dist/assets/settings-bin-page-DT8JJero.js +0 -1
  195. package/dist/assets/settings-models-page-CZHG3t7W.js +0 -1
  196. package/dist/assets/task-detail-page-B3SMFZQ3.js +0 -1
  197. package/dist/assets/timebox-planning-dialog-BtFuVoA1.js +0 -1
  198. package/dist/assets/today-page-CHGpLEZ3.js +0 -1
  199. package/dist/assets/training-load-page-GZJF-Yy5.js +0 -1
  200. package/dist/assets/wiki-page-DPZ55e3x.js +0 -1
  201. package/dist/assets/workout-detail-page-3fxr6HL4.js +0 -2
  202. /package/dist/server/{server → apps/api}/migrations/001_core.sql +0 -0
  203. /package/dist/server/{server → apps/api}/migrations/002_psyche.sql +0 -0
  204. /package/dist/server/{server → apps/api}/migrations/003_habits.sql +0 -0
  205. /package/dist/server/{server → apps/api}/migrations/004_habit_links.sql +0 -0
  206. /package/dist/server/{server → apps/api}/migrations/005_habit_psyche_links.sql +0 -0
  207. /package/dist/server/{server → apps/api}/migrations/006_work_adjustments.sql +0 -0
  208. /package/dist/server/{server → apps/api}/migrations/007_weekly_review_closures.sql +0 -0
  209. /package/dist/server/{server → apps/api}/migrations/008_calendar_execution.sql +0 -0
  210. /package/dist/server/{server → apps/api}/migrations/009_true_calendar_events.sql +0 -0
  211. /package/dist/server/{server → apps/api}/migrations/010_calendar_selection_state.sql +0 -0
  212. /package/dist/server/{server → apps/api}/migrations/011_calendar_timezone_backfill.sql +0 -0
  213. /package/dist/server/{server → apps/api}/migrations/012_work_block_ranges.sql +0 -0
  214. /package/dist/server/{server → apps/api}/migrations/013_microsoft_local_auth_settings.sql +0 -0
  215. /package/dist/server/{server → apps/api}/migrations/014_note_tags_and_ephemeral.sql +0 -0
  216. /package/dist/server/{server → apps/api}/migrations/015_multi_user_and_strategies.sql +0 -0
  217. /package/dist/server/{server → apps/api}/migrations/016_health_companion.sql +0 -0
  218. /package/dist/server/{server → apps/api}/migrations/016_strategy_contracts_and_user_graph.sql +0 -0
  219. /package/dist/server/{server → apps/api}/migrations/017_preferences.sql +0 -0
  220. /package/dist/server/{server → apps/api}/migrations/018_preference_catalogs.sql +0 -0
  221. /package/dist/server/{server → apps/api}/migrations/019_wiki_memory.sql +0 -0
  222. /package/dist/server/{server → apps/api}/migrations/020_wiki_page_hierarchy.sql +0 -0
  223. /package/dist/server/{server → apps/api}/migrations/021_hide_evidence_from_wiki_index.sql +0 -0
  224. /package/dist/server/{server → apps/api}/migrations/022_wiki_ingest_background.sql +0 -0
  225. /package/dist/server/{server → apps/api}/migrations/023_diagnostic_logs.sql +0 -0
  226. /package/dist/server/{server → apps/api}/migrations/024_questionnaires.sql +0 -0
  227. /package/dist/server/{server → apps/api}/migrations/025_ai_model_connections.sql +0 -0
  228. /package/dist/server/{server → apps/api}/migrations/026_custom_theme_settings.sql +0 -0
  229. /package/dist/server/{server → apps/api}/migrations/027_ai_processors.sql +0 -0
  230. /package/dist/server/{server → apps/api}/migrations/028_movement_domain.sql +0 -0
  231. /package/dist/server/{server → apps/api}/migrations/029_watch_micro_capture.sql +0 -0
  232. /package/dist/server/{server → apps/api}/migrations/030_surface_layouts.sql +0 -0
  233. /package/dist/server/{server → apps/api}/migrations/031_ai_processor_runtime_upgrades.sql +0 -0
  234. /package/dist/server/{server → apps/api}/migrations/032_ai_connectors.sql +0 -0
  235. /package/dist/server/{server → apps/api}/migrations/033_movement_trip_point_sync.sql +0 -0
  236. /package/dist/server/{server → apps/api}/migrations/034_movement_segment_sync.sql +0 -0
  237. /package/dist/server/{server → apps/api}/migrations/035_google_local_auth_settings.sql +0 -0
  238. /package/dist/server/{server → apps/api}/migrations/036_google_local_auth_client_secret.sql +0 -0
  239. /package/dist/server/{server → apps/api}/migrations/037_workbench_public_inputs_and_run_inputs.sql +0 -0
  240. /package/dist/server/{server → apps/api}/migrations/038_data_management_settings.sql +0 -0
  241. /package/dist/server/{server → apps/api}/migrations/039_life_force_and_action_points.sql +0 -0
  242. /package/dist/server/{server → apps/api}/migrations/040_screen_time_domain.sql +0 -0
  243. /package/dist/server/{server → apps/api}/migrations/041_companion_source_states.sql +0 -0
  244. /package/dist/server/{server → apps/api}/migrations/042_movement_boxes.sql +0 -0
  245. /package/dist/server/{server → apps/api}/migrations/043_movement_box_overlap_overrides.sql +0 -0
  246. /package/dist/server/{server → apps/api}/migrations/044_macos_local_calendar_provider.sql +0 -0
  247. /package/dist/server/{server → apps/api}/migrations/045_sleep_nights_and_raw_segments.sql +0 -0
  248. /package/dist/server/{server → apps/api}/migrations/046_work_item_hierarchy.sql +0 -0
  249. /package/dist/server/{server → apps/api}/migrations/047_sleep_source_records.sql +0 -0
  250. /package/dist/server/{server → apps/api}/migrations/048_task_run_git_context.sql +0 -0
  251. /package/dist/server/{server → apps/api}/migrations/049_agent_runtime_sessions.sql +0 -0
  252. /package/dist/server/{server → apps/api}/migrations/050_agent_token_bootstrap_policy.sql +0 -0
  253. /package/dist/server/{server → apps/api}/migrations/051_agent_token_scope_policy.sql +0 -0
  254. /package/dist/server/{server → apps/api}/migrations/052_agent_identity_tightening.sql +0 -0
  255. /package/dist/server/{server → apps/api}/migrations/053_agent_runtime_session_canonical_labels.sql +0 -0
  256. /package/dist/server/{server → apps/api}/migrations/054_sqlite_backed_wiki_memory.sql +0 -0
  257. /package/dist/server/{server → apps/api}/migrations/055_gamification_progression.sql +0 -0
  258. /package/dist/server/{server → apps/api}/migrations/056_gamification_equipment.sql +0 -0
  259. /package/dist/server/{server → apps/api}/migrations/057_gamification_catalog_cleanup.sql +0 -0
  260. /package/dist/server/{server → apps/api}/migrations/058_gamification_theme_preference.sql +0 -0
  261. /package/dist/server/{server → apps/api}/migrations/059_data_backup_retention.sql +0 -0
  262. /package/dist/server/{server → apps/api}/migrations/060_psyche_devrage_metrics.sql +0 -0
  263. /package/dist/server/{server → apps/api}/migrations/061_health_workout_raw_evidence.sql +0 -0
  264. /package/dist/server/{server → apps/api}/migrations/062_health_mobile_sync_sessions.sql +0 -0
  265. /package/dist/server/{server → apps/api}/migrations/063_psyche_flashcards.sql +0 -0
  266. /package/dist/server/{server → apps/api}/migrations/064_health_workout_time_series_identity.sql +0 -0
  267. /package/dist/server/{server → apps/api}/migrations/065_weight_loss_nutrition_insights.sql +0 -0
  268. /package/dist/server/{server → apps/api}/migrations/066_watch_action_receipts.sql +0 -0
  269. /package/dist/server/{server → apps/api}/migrations/067_weight_loss_daily_active_overrides.sql +0 -0
  270. /package/dist/server/{server → apps/api}/migrations/068_remove_generated_movement_wiki_logs.sql +0 -0
  271. /package/dist/server/{server → apps/api}/migrations/069_psyche_devrage_cumulative_rage.sql +0 -0
  272. /package/dist/server/{server → apps/api}/migrations/070_health_mobile_sync_completion_index.sql +0 -0
  273. /package/dist/server/{server → apps/api}/migrations/071_agent_runtime_claude_identity.sql +0 -0
  274. /package/dist/server/{server → apps/api}/src/data-management-types.js +0 -0
  275. /package/dist/server/{server → apps/api}/src/debug.js +0 -0
  276. /package/dist/server/{server → apps/api}/src/demo-data.js +0 -0
  277. /package/dist/server/{server → apps/api}/src/discovery-advertiser.js +0 -0
  278. /package/dist/server/{server → apps/api}/src/e2e-server.js +0 -0
  279. /package/dist/server/{server → apps/api}/src/errors.js +0 -0
  280. /package/dist/server/{server → apps/api}/src/health-workout-adapters.js +0 -0
  281. /package/dist/server/{server → apps/api}/src/health-workout-analytics.js +0 -0
  282. /package/dist/server/{server → apps/api}/src/health.js +0 -0
  283. /package/dist/server/{server → apps/api}/src/index.js +0 -0
  284. /package/dist/server/{server → apps/api}/src/managers/base.js +0 -0
  285. /package/dist/server/{server → apps/api}/src/managers/contracts.js +0 -0
  286. /package/dist/server/{server → apps/api}/src/managers/platform/api-gateway-manager.js +0 -0
  287. /package/dist/server/{server → apps/api}/src/managers/platform/audit-manager.js +0 -0
  288. /package/dist/server/{server → apps/api}/src/managers/platform/authentication-manager.js +0 -0
  289. /package/dist/server/{server → apps/api}/src/managers/platform/authorization-manager.js +0 -0
  290. /package/dist/server/{server → apps/api}/src/managers/platform/background-job-manager.js +0 -0
  291. /package/dist/server/{server → apps/api}/src/managers/platform/configuration-manager.js +0 -0
  292. /package/dist/server/{server → apps/api}/src/managers/platform/database-manager.js +0 -0
  293. /package/dist/server/{server → apps/api}/src/managers/platform/event-bus-manager.js +0 -0
  294. /package/dist/server/{server → apps/api}/src/managers/platform/external-service-manager.js +0 -0
  295. /package/dist/server/{server → apps/api}/src/managers/platform/health-manager.js +0 -0
  296. /package/dist/server/{server → apps/api}/src/managers/platform/llm-manager.js +0 -0
  297. /package/dist/server/{server → apps/api}/src/managers/platform/migration-manager.js +0 -0
  298. /package/dist/server/{server → apps/api}/src/managers/platform/mock-workbench-provider.js +0 -0
  299. /package/dist/server/{server → apps/api}/src/managers/platform/openai-responses-provider.js +0 -0
  300. /package/dist/server/{server → apps/api}/src/managers/platform/search-index-manager.js +0 -0
  301. /package/dist/server/{server → apps/api}/src/managers/platform/secrets-manager.js +0 -0
  302. /package/dist/server/{server → apps/api}/src/managers/platform/session-manager.js +0 -0
  303. /package/dist/server/{server → apps/api}/src/managers/platform/storage-manager.js +0 -0
  304. /package/dist/server/{server → apps/api}/src/managers/platform/token-manager.js +0 -0
  305. /package/dist/server/{server → apps/api}/src/managers/platform/transaction-manager.js +0 -0
  306. /package/dist/server/{server → apps/api}/src/managers/platform/trusted-network.js +0 -0
  307. /package/dist/server/{server → apps/api}/src/managers/runtime.js +0 -0
  308. /package/dist/server/{server → apps/api}/src/managers/type-guards.js +0 -0
  309. /package/dist/server/{server → apps/api}/src/movement.js +0 -0
  310. /package/dist/server/{server → apps/api}/src/preferences-seeds.js +0 -0
  311. /package/dist/server/{server → apps/api}/src/preferences-types.js +0 -0
  312. /package/dist/server/{server → apps/api}/src/psyche-types.js +0 -0
  313. /package/dist/server/{server → apps/api}/src/questionnaire-flow.js +0 -0
  314. /package/dist/server/{server → apps/api}/src/questionnaire-types.js +0 -0
  315. /package/dist/server/{server → apps/api}/src/repositories/activity-events.js +0 -0
  316. /package/dist/server/{server → apps/api}/src/repositories/agent-runtime-sessions.js +0 -0
  317. /package/dist/server/{server → apps/api}/src/repositories/ai-processors.js +0 -0
  318. /package/dist/server/{server → apps/api}/src/repositories/calendar.js +0 -0
  319. /package/dist/server/{server → apps/api}/src/repositories/collaboration.js +0 -0
  320. /package/dist/server/{server → apps/api}/src/repositories/deleted-entities.js +0 -0
  321. /package/dist/server/{server → apps/api}/src/repositories/diagnostic-logs.js +0 -0
  322. /package/dist/server/{server → apps/api}/src/repositories/domains.js +0 -0
  323. /package/dist/server/{server → apps/api}/src/repositories/entity-ownership.js +0 -0
  324. /package/dist/server/{server → apps/api}/src/repositories/event-log.js +0 -0
  325. /package/dist/server/{server → apps/api}/src/repositories/gamification.js +0 -0
  326. /package/dist/server/{server → apps/api}/src/repositories/goals.js +0 -0
  327. /package/dist/server/{server → apps/api}/src/repositories/model-settings.js +0 -0
  328. /package/dist/server/{server → apps/api}/src/repositories/notes.js +0 -0
  329. /package/dist/server/{server → apps/api}/src/repositories/preferences.js +0 -0
  330. /package/dist/server/{server → apps/api}/src/repositories/projects.js +0 -0
  331. /package/dist/server/{server → apps/api}/src/repositories/psyche.js +0 -0
  332. /package/dist/server/{server → apps/api}/src/repositories/questionnaires.js +0 -0
  333. /package/dist/server/{server → apps/api}/src/repositories/rewards.js +0 -0
  334. /package/dist/server/{server → apps/api}/src/repositories/settings.js +0 -0
  335. /package/dist/server/{server → apps/api}/src/repositories/strategies.js +0 -0
  336. /package/dist/server/{server → apps/api}/src/repositories/surface-layouts.js +0 -0
  337. /package/dist/server/{server → apps/api}/src/repositories/tags.js +0 -0
  338. /package/dist/server/{server → apps/api}/src/repositories/task-runs.js +0 -0
  339. /package/dist/server/{server → apps/api}/src/repositories/tasks.js +0 -0
  340. /package/dist/server/{server → apps/api}/src/repositories/users.js +0 -0
  341. /package/dist/server/{server → apps/api}/src/repositories/weekly-reviews.js +0 -0
  342. /package/dist/server/{server → apps/api}/src/repositories/wiki-memory.js +0 -0
  343. /package/dist/server/{server → apps/api}/src/repositories/work-adjustments.js +0 -0
  344. /package/dist/server/{server → apps/api}/src/runtime-data-root.js +0 -0
  345. /package/dist/server/{server → apps/api}/src/screen-time.js +0 -0
  346. /package/dist/server/{server → apps/api}/src/seed-demo.js +0 -0
  347. /package/dist/server/{server → apps/api}/src/services/calendar-runtime.js +0 -0
  348. /package/dist/server/{server → apps/api}/src/services/context.js +0 -0
  349. /package/dist/server/{server → apps/api}/src/services/dashboard.js +0 -0
  350. /package/dist/server/{server → apps/api}/src/services/data-management.js +0 -0
  351. /package/dist/server/{server → apps/api}/src/services/devrage-scanner.js +0 -0
  352. /package/dist/server/{server → apps/api}/src/services/devrage.js +0 -0
  353. /package/dist/server/{server → apps/api}/src/services/git-helper.js +0 -0
  354. /package/dist/server/{server → apps/api}/src/services/google-calendar-oauth-config.js +0 -0
  355. /package/dist/server/{server → apps/api}/src/services/insights.js +0 -0
  356. /package/dist/server/{server → apps/api}/src/services/legacy-wiki-markdown-import.js +0 -0
  357. /package/dist/server/{server → apps/api}/src/services/life-force-model.js +0 -0
  358. /package/dist/server/{server → apps/api}/src/services/life-force.js +0 -0
  359. /package/dist/server/{server → apps/api}/src/services/macos-calendar-helper.js +0 -0
  360. /package/dist/server/{server → apps/api}/src/services/openai-codex-oauth.js +0 -0
  361. /package/dist/server/{server → apps/api}/src/services/projects.js +0 -0
  362. /package/dist/server/{server → apps/api}/src/services/psyche.js +0 -0
  363. /package/dist/server/{server → apps/api}/src/services/relations.js +0 -0
  364. /package/dist/server/{server → apps/api}/src/services/reviews.js +0 -0
  365. /package/dist/server/{server → apps/api}/src/services/run-recovery.js +0 -0
  366. /package/dist/server/{server → apps/api}/src/services/tagging.js +0 -0
  367. /package/dist/server/{server → apps/api}/src/services/task-run-watchdog.js +0 -0
  368. /package/dist/server/{server → apps/api}/src/services/work-time.js +0 -0
  369. /package/dist/server/{server → apps/api}/src/web.js +0 -0
  370. /package/dist/server/{src → apps/web/src}/components/customization/utility-widgets.js +0 -0
  371. /package/dist/server/{src → apps/web/src}/components/ui/info-tooltip.js +0 -0
  372. /package/dist/server/{src → apps/web/src}/components/workbench-boxes/calendar/calendar-boxes.js +0 -0
  373. /package/dist/server/{src → apps/web/src}/components/workbench-boxes/goals/goals-boxes.js +0 -0
  374. /package/dist/server/{src → apps/web/src}/components/workbench-boxes/habits/habits-boxes.js +0 -0
  375. /package/dist/server/{src → apps/web/src}/components/workbench-boxes/health/health-boxes.js +0 -0
  376. /package/dist/server/{src → apps/web/src}/components/workbench-boxes/insights/insights-boxes.js +0 -0
  377. /package/dist/server/{src → apps/web/src}/components/workbench-boxes/kanban/kanban-boxes.js +0 -0
  378. /package/dist/server/{src → apps/web/src}/components/workbench-boxes/movement/movement-boxes.js +0 -0
  379. /package/dist/server/{src → apps/web/src}/components/workbench-boxes/notes/notes-boxes.js +0 -0
  380. /package/dist/server/{src → apps/web/src}/components/workbench-boxes/overview/overview-boxes.js +0 -0
  381. /package/dist/server/{src → apps/web/src}/components/workbench-boxes/preferences/preferences-boxes.js +0 -0
  382. /package/dist/server/{src → apps/web/src}/components/workbench-boxes/projects/projects-boxes.js +0 -0
  383. /package/dist/server/{src → apps/web/src}/components/workbench-boxes/psyche/psyche-boxes.js +0 -0
  384. /package/dist/server/{src → apps/web/src}/components/workbench-boxes/questionnaires/questionnaires-boxes.js +0 -0
  385. /package/dist/server/{src → apps/web/src}/components/workbench-boxes/review/review-boxes.js +0 -0
  386. /package/dist/server/{src → apps/web/src}/components/workbench-boxes/shared/define-workbench-box.js +0 -0
  387. /package/dist/server/{src → apps/web/src}/components/workbench-boxes/shared/generic-node-view.js +0 -0
  388. /package/dist/server/{src → apps/web/src}/components/workbench-boxes/strategies/strategies-boxes.js +0 -0
  389. /package/dist/server/{src → apps/web/src}/components/workbench-boxes/tasks/tasks-boxes.js +0 -0
  390. /package/dist/server/{src → apps/web/src}/components/workbench-boxes/today/today-boxes.js +0 -0
  391. /package/dist/server/{src → apps/web/src}/components/workbench-boxes/wiki/wiki-boxes.js +0 -0
  392. /package/dist/server/{src → apps/web/src}/lib/api-error.js +0 -0
  393. /package/dist/server/{src → apps/web/src}/lib/calendar-name-deduper.js +0 -0
  394. /package/dist/server/{src → apps/web/src}/lib/data-management-types.js +0 -0
  395. /package/dist/server/{src → apps/web/src}/lib/date-keys.js +0 -0
  396. /package/dist/server/{src → apps/web/src}/lib/diagnostics.js +0 -0
  397. /package/dist/server/{src → apps/web/src}/lib/gamification-catalog.js +0 -0
  398. /package/dist/server/{src → apps/web/src}/lib/knowledge-graph.js +0 -0
  399. /package/dist/server/{src → apps/web/src}/lib/psyche-schemas.js +0 -0
  400. /package/dist/server/{src → apps/web/src}/lib/psyche-types.js +0 -0
  401. /package/dist/server/{src → apps/web/src}/lib/questionnaire-types.js +0 -0
  402. /package/dist/server/{src → apps/web/src}/lib/runtime-paths.js +0 -0
  403. /package/dist/server/{src → apps/web/src}/lib/schemas.js +0 -0
  404. /package/dist/server/{src → apps/web/src}/lib/snapshot-normalizer.js +0 -0
  405. /package/dist/server/{src → apps/web/src}/lib/theme-system.js +0 -0
  406. /package/dist/server/{src → apps/web/src}/lib/types.js +0 -0
  407. /package/dist/server/{src → apps/web/src}/lib/utils.js +0 -0
  408. /package/dist/server/{src → apps/web/src}/lib/weight-loss-energy-model.js +0 -0
  409. /package/dist/server/{src → apps/web/src}/lib/weight-loss-types.js +0 -0
  410. /package/dist/server/{src → apps/web/src}/lib/workbench/boxes.js +0 -0
  411. /package/dist/server/{src → apps/web/src}/lib/workbench/contracts.js +0 -0
  412. /package/dist/server/{src → apps/web/src}/lib/workbench/nodes.js +0 -0
  413. /package/dist/server/{src → apps/web/src}/lib/workbench/registry.js +0 -0
  414. /package/dist/server/{src → apps/web/src}/lib/workbench/runtime.js +0 -0
  415. /package/dist/server/{src → apps/web/src}/lib/workbench/tool-catalog.js +0 -0
@@ -317,19 +317,22 @@ function candidateIrohBinaries() {
317
317
  const binaryName = process.platform === "win32" ? "forge-companion-iroh.exe" : "forge-companion-iroh";
318
318
  const platformKey = `${process.platform}-${process.arch}`;
319
319
  return candidateIrohAssetRoots().flatMap((root) => [
320
+ path.join(root, "packages", "companion-iroh", "target", "release", binaryName),
321
+ path.join(root, "packages", "companion-iroh", "target", "debug", binaryName),
320
322
  path.join(root, "companion-iroh", "target", "release", binaryName),
321
323
  path.join(root, "companion-iroh", "target", "debug", binaryName),
322
324
  path.join(root, "companion-iroh-src", "target", "release", binaryName),
323
325
  path.join(root, "companion-iroh-src", "target", "debug", binaryName),
324
326
  path.join(root, "dist", "companion-iroh-src", "target", "release", binaryName),
325
327
  path.join(root, "dist", "companion-iroh-src", "target", "debug", binaryName),
326
- path.join(root, "openclaw-plugin", "dist", "companion-iroh", platformKey, binaryName),
328
+ path.join(root, "plugins/openclaw", "dist", "companion-iroh", platformKey, binaryName),
327
329
  path.join(root, "companion-iroh", platformKey, binaryName),
328
330
  path.join(root, "companion-iroh", binaryName)
329
331
  ]);
330
332
  }
331
333
  function resolveCompanionIrohManifestPath() {
332
334
  const candidates = candidateIrohAssetRoots().flatMap((root) => [
335
+ path.join(root, "packages", "companion-iroh", "Cargo.toml"),
333
336
  path.join(root, "companion-iroh", "Cargo.toml"),
334
337
  path.join(root, "companion-iroh-src", "Cargo.toml"),
335
338
  path.join(root, "dist", "companion-iroh-src", "Cargo.toml")
@@ -2,9 +2,9 @@ import { access, readdir } from "node:fs/promises";
2
2
  import path from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
4
  import { getDatabase, runInTransaction } from "../db.js";
5
- import { GAMIFICATION_CATALOG } from "../../../src/lib/gamification-catalog.js";
6
- const projectRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..", "..");
7
- const migrationsDir = path.join(projectRoot, "server", "migrations");
5
+ import { GAMIFICATION_CATALOG } from "../../../web/src/lib/gamification-catalog.js";
6
+ const apiRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..");
7
+ const migrationsDir = path.join(apiRoot, "migrations");
8
8
  const safeIntegrityRefreshFix = {
9
9
  id: "settings.integrity.refresh",
10
10
  kind: "safe_auto_fix",
@@ -1,6 +1,7 @@
1
1
  import { z, ZodError } from "zod";
2
2
  import { getDatabase, runInTransaction } from "../db.js";
3
3
  import { createSleepSession, createSleepSessionSchema, createWorkoutSession, createWorkoutSessionSchema, deleteSleepSession, deleteWorkoutSession, getSleepSessionById, getWorkoutSessionById, listSleepSessions, listWorkoutSessions, updateSleepSession, updateSleepSessionSchema, updateWorkoutSession, updateWorkoutSessionSchema } from "../health.js";
4
+ import { artifactMetadataCreateSchema, artifactMetadataPatchSchema, createArtifactMetadata, deleteArtifactMetadata, getArtifactById, listArtifacts, updateArtifactMetadata } from "./artifacts.js";
4
5
  import { createInsight, deleteInsight, getInsightById, listInsights, updateInsight } from "../repositories/collaboration.js";
5
6
  import { createCalendarEvent, createTaskTimebox, createWorkBlockTemplate, deleteCalendarEvent, deleteTaskTimebox, deleteWorkBlockTemplate, getCalendarEventById, getTaskTimeboxById, getWorkBlockTemplateById, listCalendarEvents, listTaskTimeboxes, listWorkBlockTemplates, updateCalendarEvent, updateTaskTimebox, updateWorkBlockTemplate } from "../repositories/calendar.js";
6
7
  import { createNote, deleteNote, getNoteById, listNotes, unlinkNotesForEntity, updateNote } from "../repositories/notes.js";
@@ -157,6 +158,17 @@ const CRUD_ENTITY_CAPABILITIES = {
157
158
  update: (id, patch) => updateTaskTimebox(id, patch),
158
159
  hardDelete: (id) => deleteTaskTimebox(id)
159
160
  },
161
+ artifact: {
162
+ entityType: "artifact",
163
+ routeBase: "/api/v1/artifacts",
164
+ deleteMode: "soft_default",
165
+ inBin: true,
166
+ list: () => listArtifacts(),
167
+ get: (id) => getArtifactById(id),
168
+ create: () => createArtifactMetadata(),
169
+ update: (id, patch, context) => updateArtifactMetadata(id, patch, context),
170
+ hardDelete: (id, context) => deleteArtifactMetadata(id, context)
171
+ },
160
172
  sleep_session: {
161
173
  entityType: "sleep_session",
162
174
  routeBase: "/api/v1/health/sleep",
@@ -370,6 +382,7 @@ const CREATE_ENTITY_SCHEMAS = {
370
382
  calendar_event: createCalendarEventSchema,
371
383
  work_block_template: createWorkBlockTemplateSchema,
372
384
  task_timebox: createTaskTimeboxSchema,
385
+ artifact: artifactMetadataCreateSchema,
373
386
  sleep_session: createSleepSessionSchema,
374
387
  workout_session: createWorkoutSessionSchema,
375
388
  psyche_value: createPsycheValueSchema,
@@ -400,6 +413,7 @@ const UPDATE_ENTITY_SCHEMAS = {
400
413
  calendar_event: updateCalendarEventSchema,
401
414
  work_block_template: updateWorkBlockTemplateSchema,
402
415
  task_timebox: updateTaskTimeboxSchema,
416
+ artifact: artifactMetadataPatchSchema,
403
417
  sleep_session: updateSleepSessionSchema,
404
418
  workout_session: updateWorkoutSessionSchema,
405
419
  psyche_value: updatePsycheValueSchema,
@@ -702,6 +716,14 @@ function matchesLinkedTo(entityType, entity, linkedTo) {
702
716
  case "task_timebox":
703
717
  return ((linkedTo.entityType === "task" && entity.taskId === linkedTo.id) ||
704
718
  (linkedTo.entityType === "project" && entity.projectId === linkedTo.id));
719
+ case "artifact":
720
+ return (Array.isArray(entity.links) &&
721
+ entity.links.some((link) => typeof link === "object" &&
722
+ link !== null &&
723
+ "entityType" in link &&
724
+ "entityId" in link &&
725
+ link.entityType === linkedTo.entityType &&
726
+ link.entityId === linkedTo.id));
705
727
  case "psyche_value":
706
728
  return ((linkedTo.entityType === "goal" && Array.isArray(entity.linkedGoalIds) && entity.linkedGoalIds.includes(linkedTo.id)) ||
707
729
  (linkedTo.entityType === "project" && Array.isArray(entity.linkedProjectIds) && entity.linkedProjectIds.includes(linkedTo.id)) ||
@@ -5,7 +5,7 @@ import { access, mkdir, readFile, rm, writeFile } from "node:fs/promises";
5
5
  import path from "node:path";
6
6
  import AdmZip from "adm-zip";
7
7
  import { getEffectiveDataRoot } from "../db.js";
8
- import { GAMIFICATION_CATALOG, GAMIFICATION_MASCOT_KEYS } from "../../../src/lib/gamification-catalog.js";
8
+ import { GAMIFICATION_CATALOG, GAMIFICATION_MASCOT_KEYS } from "../../../web/src/lib/gamification-catalog.js";
9
9
  const assetVersion = "0.2.59";
10
10
  const defaultReleaseBaseUrl = "https://github.com/albertbuchard/forge/releases/download/forge-gamification-assets-v0.2.59";
11
11
  const styleDefinitions = [
@@ -2,7 +2,7 @@ import { getDatabase } from "../db.js";
2
2
  import { enqueueGamificationCelebration, getGamificationEquipment, insertGamificationUnlock, listGamificationDailyActivity, listGamificationUnlocks, listUnseenGamificationCelebrations, replaceGamificationDailyActivity, upsertGamificationEquipment } from "../repositories/gamification.js";
3
3
  import { getDailyAmbientXp, listRewardRules, recordEntityCreationReward } from "../repositories/rewards.js";
4
4
  import { getDefaultUser, listUsers, listUsersByIds } from "../repositories/users.js";
5
- import { GAMIFICATION_CATALOG, GAMIFICATION_STREAK_AWAY_DAY_KEYS, GAMIFICATION_STREAK_POWER_DAY_KEYS } from "../../../src/lib/gamification-catalog.js";
5
+ import { GAMIFICATION_CATALOG, GAMIFICATION_STREAK_AWAY_DAY_KEYS, GAMIFICATION_STREAK_POWER_DAY_KEYS } from "../../../web/src/lib/gamification-catalog.js";
6
6
  import { achievementSignalSchema, gamificationCatalogPayloadSchema, gamificationProfileSchema, milestoneRewardSchema } from "../types.js";
7
7
  const XP_CURVE_VERSION = "smith-forge";
8
8
  const ENTITY_CREATION_REWARD_SOURCES = [
@@ -12,9 +12,10 @@ import { listTasks } from "../repositories/tasks.js";
12
12
  import { listWikiSpaces } from "../repositories/wiki-memory.js";
13
13
  import { listProjectSummaries } from "./projects.js";
14
14
  import { listAiConnectors } from "../repositories/ai-connectors.js";
15
- import { buildKnowledgeGraphFacets, buildKnowledgeGraphFocusPayload, filterKnowledgeGraphData, selectKnowledgeGraphVisibleNodeIds } from "../../../src/lib/knowledge-graph.js";
16
- import { getEntityVisual } from "../../../src/lib/entity-visuals.js";
17
- import { KNOWLEDGE_GRAPH_RELATION_FAMILY_MAP, buildKnowledgeGraphFocusHref, buildKnowledgeGraphNodeId, getKnowledgeGraphEntityHref } from "../../../src/lib/knowledge-graph-types.js";
15
+ import { buildKnowledgeGraphFacets, buildKnowledgeGraphFocusPayload, filterKnowledgeGraphData, selectKnowledgeGraphVisibleNodeIds } from "../../../web/src/lib/knowledge-graph.js";
16
+ import { getEntityVisual } from "../../../web/src/lib/entity-visuals.js";
17
+ import { listArtifacts } from "./artifacts.js";
18
+ import { KNOWLEDGE_GRAPH_RELATION_FAMILY_MAP, buildKnowledgeGraphFocusHref, buildKnowledgeGraphNodeId, getKnowledgeGraphEntityHref } from "../../../web/src/lib/knowledge-graph-types.js";
18
19
  const GRAPH_RANGE = {
19
20
  from: "2000-01-01T00:00:00.000Z",
20
21
  to: "2100-01-01T00:00:00.000Z"
@@ -34,6 +35,7 @@ const BASE_NODE_SIZE = {
34
35
  calendar_event: 34,
35
36
  work_block: 32,
36
37
  timebox: 33,
38
+ artifact: 36,
37
39
  value: 38,
38
40
  pattern: 38,
39
41
  behavior: 38,
@@ -243,6 +245,13 @@ export function buildKnowledgeGraph(userIds, query = {}) {
243
245
  const calendarEvents = listCalendarEvents({ ...GRAPH_RANGE, userIds });
244
246
  const workBlocks = listWorkBlockTemplates({ userIds });
245
247
  const timeboxes = listTaskTimeboxes({ ...GRAPH_RANGE, userIds });
248
+ const artifacts = listArtifacts().filter((artifact) => {
249
+ if (selectedUserIds.size === 0) {
250
+ return true;
251
+ }
252
+ return Boolean((artifact.uploadedByUserId && selectedUserIds.has(artifact.uploadedByUserId)) ||
253
+ (artifact.actingForUserId && selectedUserIds.has(artifact.actingForUserId)));
254
+ });
246
255
  const eventTypes = filterOwnedEntities("event_type", listEventTypes(), userIds);
247
256
  const emotions = filterOwnedEntities("emotion_definition", listEmotionDefinitions(), userIds);
248
257
  const values = filterOwnedEntities("psyche_value", listPsycheValues(), userIds);
@@ -808,6 +817,42 @@ export function buildKnowledgeGraph(userIds, query = {}) {
808
817
  });
809
818
  }
810
819
  }
820
+ for (const artifact of artifacts) {
821
+ nodes.set(buildKnowledgeGraphNodeId("artifact", artifact.id), makeNode({
822
+ entityType: "artifact",
823
+ entityId: artifact.id,
824
+ entityKind: "artifact",
825
+ title: artifact.title,
826
+ subtitle: `${artifact.detectedExtension.toUpperCase()} · ${artifact.dangerLevel}`,
827
+ description: artifact.shortDescription || artifact.description,
828
+ searchText: JSON.stringify({
829
+ title: artifact.title,
830
+ shortDescription: artifact.shortDescription,
831
+ description: artifact.description,
832
+ originalFileName: artifact.originalFileName,
833
+ sourceLabel: artifact.sourceLabel,
834
+ metadata: artifact.metadata
835
+ }),
836
+ previewStats: [
837
+ { label: "Format", value: artifact.formatFamily },
838
+ { label: "Danger", value: `${artifact.dangerScore}/100` },
839
+ { label: "Links", value: artifact.links.length }
840
+ ],
841
+ href: getKnowledgeGraphEntityHref("artifact", artifact.id),
842
+ updatedAt: artifact.updatedAt
843
+ }));
844
+ for (const link of artifact.links) {
845
+ addEdge(edges, {
846
+ source: buildKnowledgeGraphNodeId("artifact", artifact.id),
847
+ target: buildKnowledgeGraphNodeId(link.targetEntityType, link.targetEntityId),
848
+ relationKind: "entity_link",
849
+ label: link.relationship || "Entity link",
850
+ strength: 0.7,
851
+ directional: true,
852
+ structural: false
853
+ });
854
+ }
855
+ }
811
856
  for (const eventType of eventTypes) {
812
857
  nodes.set(buildKnowledgeGraphNodeId("event_type", eventType.id), makeNode({
813
858
  entityType: "event_type",
@@ -40,6 +40,7 @@ const ACTIVITY_ENTITY_LABELS = {
40
40
  work_block: "Work block",
41
41
  work_block_template: "Work block template",
42
42
  task_timebox: "Task timebox",
43
+ artifact: "Artifact",
43
44
  preference_catalog: "Preference catalog",
44
45
  preference_catalog_item: "Preference concept",
45
46
  preference_context: "Preference context",
@@ -1,6 +1,6 @@
1
1
  import { z } from "zod";
2
- import { LEGACY_WORKBENCH_PORT_KINDS, WORKBENCH_PORT_KINDS, normalizeWorkbenchPortKind } from "../../src/lib/workbench/nodes.js";
3
- import { formatLocalDateKey } from "../../src/lib/date-keys.js";
2
+ import { LEGACY_WORKBENCH_PORT_KINDS, WORKBENCH_PORT_KINDS, normalizeWorkbenchPortKind } from "../../web/src/lib/workbench/nodes.js";
3
+ import { formatLocalDateKey } from "../../web/src/lib/date-keys.js";
4
4
  export const taskStatusSchema = z.enum([
5
5
  "backlog",
6
6
  "focus",
@@ -172,6 +172,7 @@ export const activityEntityTypeSchema = z.enum([
172
172
  "work_block",
173
173
  "work_block_template",
174
174
  "task_timebox",
175
+ "artifact",
175
176
  "sleep_session",
176
177
  "workout_session"
177
178
  ]);
@@ -358,6 +359,7 @@ export const crudEntityTypeSchema = z.enum([
358
359
  "calendar_event",
359
360
  "work_block_template",
360
361
  "task_timebox",
362
+ "artifact",
361
363
  "psyche_value",
362
364
  "behavior_pattern",
363
365
  "behavior",
@@ -11,7 +11,7 @@ import { listProjectSummaries } from "./services/projects.js";
11
11
  import { listTasks, updateTask } from "./repositories/tasks.js";
12
12
  import { claimTaskRun, completeTaskRun, focusTaskRun, heartbeatTaskRun, listTaskRuns, releaseTaskRun } from "./repositories/task-runs.js";
13
13
  import { createTriggerReport, listBehaviorPatterns, listBehaviors, listEmotionDefinitions, listEventTypes, listModeProfiles, listPsycheValues, listTriggerReports } from "./repositories/psyche.js";
14
- import { formatLocalDateKey } from "../../src/lib/date-keys.js";
14
+ import { formatLocalDateKey } from "../../web/src/lib/date-keys.js";
15
15
  const watchHistoryStateSchema = z.enum(["aligned", "unaligned", "unknown"]);
16
16
  const watchPromptKindSchema = z.enum([
17
17
  "new_place",
@@ -890,6 +890,75 @@ export function createNote(input) {
890
890
  body: JSON.stringify(input)
891
891
  });
892
892
  }
893
+ export async function listArtifacts(options = {}) {
894
+ const search = new URLSearchParams();
895
+ if (options.query?.trim()) {
896
+ search.set("query", options.query.trim());
897
+ }
898
+ if (options.artifactState) {
899
+ search.set("artifactState", options.artifactState);
900
+ }
901
+ if (options.dangerLevel) {
902
+ search.set("dangerLevel", options.dangerLevel);
903
+ }
904
+ if (options.formatFamily) {
905
+ search.set("formatFamily", options.formatFamily);
906
+ }
907
+ if (options.linkedEntityType?.trim() && options.linkedEntityId?.trim()) {
908
+ search.set("linkedEntityType", options.linkedEntityType.trim());
909
+ search.set("linkedEntityId", options.linkedEntityId.trim());
910
+ }
911
+ if (options.limit) {
912
+ search.set("limit", String(options.limit));
913
+ }
914
+ const suffix = search.size > 0 ? `?${search.toString()}` : "";
915
+ return request(`/api/v1/artifacts${suffix}`);
916
+ }
917
+ export function getArtifact(artifactId) {
918
+ return request(`/api/v1/artifacts/${encodeURIComponent(artifactId)}`);
919
+ }
920
+ export function uploadArtifact(input) {
921
+ return request("/api/v1/artifacts", {
922
+ method: "POST",
923
+ body: JSON.stringify(input)
924
+ });
925
+ }
926
+ export function patchArtifact(artifactId, patch) {
927
+ return request(`/api/v1/artifacts/${encodeURIComponent(artifactId)}`, {
928
+ method: "PATCH",
929
+ body: JSON.stringify(patch)
930
+ });
931
+ }
932
+ export function downloadArtifact(artifactId) {
933
+ return requestBlob(`/api/v1/artifacts/${encodeURIComponent(artifactId)}/download`);
934
+ }
935
+ export function rescanArtifact(artifactId) {
936
+ return request(`/api/v1/artifacts/${encodeURIComponent(artifactId)}/scan`, { method: "POST" });
937
+ }
938
+ export function enrichArtifact(artifactId, input = {}) {
939
+ return request(`/api/v1/artifacts/${encodeURIComponent(artifactId)}/enrich`, {
940
+ method: "POST",
941
+ body: JSON.stringify(input)
942
+ });
943
+ }
944
+ export function replaceArtifactEntityLinks(artifactId, links) {
945
+ return request(`/api/v1/artifacts/${encodeURIComponent(artifactId)}/links`, {
946
+ method: "POST",
947
+ body: JSON.stringify({ links })
948
+ });
949
+ }
950
+ export function patchArtifactTrust(artifactId, input) {
951
+ return request(`/api/v1/artifacts/${encodeURIComponent(artifactId)}/trust`, {
952
+ method: "POST",
953
+ body: JSON.stringify(input)
954
+ });
955
+ }
956
+ export function listArtifactVersions(artifactId) {
957
+ return request(`/api/v1/artifacts/${encodeURIComponent(artifactId)}/versions`);
958
+ }
959
+ export function listArtifactAuditEvents(artifactId) {
960
+ return request(`/api/v1/artifacts/${encodeURIComponent(artifactId)}/audit`);
961
+ }
893
962
  export function getNote(noteId) {
894
963
  return request(`/api/v1/notes/${noteId}`);
895
964
  }
@@ -1,4 +1,4 @@
1
- import { Bot, CalendarDays, Compass, FileText, FolderOpen, GitBranch, Heart, ListTodo, Network, NotebookPen, PanelTop, Quote, RefreshCw, Repeat, Route, Shapes, Sparkles, StickyNote, Target, Timer, Workflow } from "lucide-react";
1
+ import { Archive, Bot, CalendarDays, Compass, FileText, FolderOpen, GitBranch, Heart, ListTodo, Network, NotebookPen, PanelTop, Quote, RefreshCw, Repeat, Route, Shapes, Sparkles, StickyNote, Target, Timer, Workflow } from "lucide-react";
2
2
  export const ENTITY_KINDS = [
3
3
  "goal",
4
4
  "project",
@@ -14,6 +14,7 @@ export const ENTITY_KINDS = [
14
14
  "calendar_event",
15
15
  "work_block",
16
16
  "timebox",
17
+ "artifact",
17
18
  "value",
18
19
  "pattern",
19
20
  "behavior",
@@ -127,6 +128,13 @@ const ENTITY_VISUAL_SEEDS = [
127
128
  iconName: "Timer",
128
129
  accentRgb: [244, 114, 182]
129
130
  },
131
+ {
132
+ kind: "artifact",
133
+ label: "Artifact",
134
+ icon: Archive,
135
+ iconName: "Archive",
136
+ accentRgb: [45, 212, 191]
137
+ },
130
138
  {
131
139
  kind: "value",
132
140
  label: "Value",
@@ -259,6 +267,7 @@ const CRUD_ENTITY_KIND_MAP = {
259
267
  calendar_event: "calendar_event",
260
268
  work_block_template: "work_block",
261
269
  task_timebox: "timebox",
270
+ artifact: "artifact",
262
271
  psyche_value: "value",
263
272
  behavior_pattern: "pattern",
264
273
  behavior: "behavior",
@@ -39,6 +39,11 @@ export const KNOWLEDGE_GRAPH_HIERARCHY_LANES = [
39
39
  label: "Calendar",
40
40
  kinds: ["calendar_event", "work_block", "timebox"]
41
41
  },
42
+ {
43
+ id: "artifacts",
44
+ label: "Artifacts",
45
+ kinds: ["artifact"]
46
+ },
42
47
  {
43
48
  id: "values",
44
49
  label: "Values",
@@ -95,6 +100,7 @@ export const KNOWLEDGE_GRAPH_RELATION_LABELS = {
95
100
  strategy_step: "Strategy step",
96
101
  strategy_link: "Strategy context",
97
102
  habit_link: "Habit link",
103
+ entity_link: "Entity link",
98
104
  note_link: "Note link",
99
105
  wiki_parent: "Wiki parent",
100
106
  wiki_link: "Wiki link",
@@ -156,6 +162,7 @@ export const KNOWLEDGE_GRAPH_RELATION_FAMILY_MAP = {
156
162
  strategy_step: "structural",
157
163
  strategy_link: "contextual",
158
164
  habit_link: "contextual",
165
+ entity_link: "contextual",
159
166
  note_link: "contextual",
160
167
  wiki_parent: "structural",
161
168
  wiki_link: "contextual",
@@ -236,6 +243,8 @@ export function getKnowledgeGraphEntityHref(entityType, entityId, options) {
236
243
  case "work_block_template":
237
244
  case "task_timebox":
238
245
  return `/calendar`;
246
+ case "artifact":
247
+ return `/artifacts/${encodeURIComponent(entityId)}`;
239
248
  case "event_type":
240
249
  case "emotion_definition":
241
250
  return "/psyche/reports";
@@ -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.15",
5
+ "version": "0.3.17",
6
6
  "activation": {
7
7
  "onStartup": true,
8
8
  "onCapabilities": [
@@ -24,6 +24,7 @@
24
24
  "tools": [
25
25
  "forge_adjust_work_minutes",
26
26
  "forge_apply_doctor_fix",
27
+ "forge_call_artifact_route",
27
28
  "forge_call_life_force_route",
28
29
  "forge_call_movement_route",
29
30
  "forge_call_workbench_route",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "forge-openclaw-plugin",
3
- "version": "0.3.15",
3
+ "version": "0.3.17",
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",
@@ -8,9 +8,9 @@
8
8
  "repository": {
9
9
  "type": "git",
10
10
  "url": "git+https://github.com/albertbuchard/forge.git",
11
- "directory": "openclaw-plugin"
11
+ "directory": "plugins/openclaw"
12
12
  },
13
- "homepage": "https://github.com/albertbuchard/forge/tree/main/openclaw-plugin#readme",
13
+ "homepage": "https://github.com/albertbuchard/forge/tree/main/plugins/openclaw#readme",
14
14
  "bugs": {
15
15
  "url": "https://github.com/albertbuchard/forge/issues"
16
16
  },
package/server/index.js CHANGED
@@ -4,9 +4,9 @@ import path from "node:path";
4
4
  import { fileURLToPath, pathToFileURL } from "node:url";
5
5
 
6
6
  const packageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
7
- const repoRoot = path.resolve(packageRoot, "..");
8
- const builtRuntimeEntry = path.join(packageRoot, "dist", "server", "server", "src", "index.js");
9
- const devRuntimeEntry = path.join(repoRoot, "server", "src", "index.ts");
7
+ const repoRoot = path.resolve(packageRoot, "..", "..");
8
+ const builtRuntimeEntry = path.join(packageRoot, "dist", "server", "apps", "api", "src", "index.js");
9
+ const devRuntimeEntry = path.join(repoRoot, "apps", "api", "src", "index.ts");
10
10
  const devDataRootWrapper = path.join(
11
11
  repoRoot,
12
12
  "scripts",
@@ -0,0 +1,106 @@
1
+ CREATE TABLE IF NOT EXISTS artifact_blobs (
2
+ content_sha256 TEXT PRIMARY KEY,
3
+ storage_key TEXT NOT NULL UNIQUE,
4
+ byte_size INTEGER NOT NULL,
5
+ detected_mime_type TEXT NOT NULL DEFAULT '',
6
+ created_at TEXT NOT NULL
7
+ );
8
+
9
+ CREATE TABLE IF NOT EXISTS artifacts (
10
+ id TEXT PRIMARY KEY,
11
+ title TEXT NOT NULL,
12
+ short_description TEXT NOT NULL DEFAULT '',
13
+ description TEXT NOT NULL DEFAULT '',
14
+ original_file_name TEXT NOT NULL,
15
+ storage_key TEXT NOT NULL,
16
+ storage_path TEXT NOT NULL,
17
+ content_sha256 TEXT NOT NULL,
18
+ byte_size INTEGER NOT NULL,
19
+ detected_extension TEXT NOT NULL,
20
+ declared_mime_type TEXT NOT NULL DEFAULT '',
21
+ detected_mime_type TEXT NOT NULL DEFAULT '',
22
+ format_family TEXT NOT NULL,
23
+ source_kind TEXT NOT NULL DEFAULT 'upload',
24
+ source_label TEXT NOT NULL DEFAULT '',
25
+ uploaded_by_user_id TEXT,
26
+ uploaded_by_agent_id TEXT,
27
+ acting_for_user_id TEXT,
28
+ artifact_state TEXT NOT NULL DEFAULT 'active',
29
+ danger_score INTEGER NOT NULL DEFAULT 0,
30
+ danger_level TEXT NOT NULL DEFAULT 'low',
31
+ download_policy TEXT NOT NULL DEFAULT 'human_only',
32
+ scan_results_json TEXT NOT NULL DEFAULT '{}',
33
+ enrichment_results_json TEXT NOT NULL DEFAULT '{}',
34
+ metadata_json TEXT NOT NULL DEFAULT '{}',
35
+ created_at TEXT NOT NULL,
36
+ updated_at TEXT NOT NULL,
37
+ FOREIGN KEY (content_sha256) REFERENCES artifact_blobs(content_sha256)
38
+ );
39
+
40
+ CREATE INDEX IF NOT EXISTS idx_artifacts_updated
41
+ ON artifacts (updated_at DESC);
42
+
43
+ CREATE INDEX IF NOT EXISTS idx_artifacts_state_danger
44
+ ON artifacts (artifact_state, danger_level, updated_at DESC);
45
+
46
+ CREATE INDEX IF NOT EXISTS idx_artifacts_sha
47
+ ON artifacts (content_sha256, updated_at DESC);
48
+
49
+ CREATE TABLE IF NOT EXISTS artifact_versions (
50
+ id TEXT PRIMARY KEY,
51
+ artifact_id TEXT NOT NULL,
52
+ version_number INTEGER NOT NULL,
53
+ content_sha256 TEXT NOT NULL,
54
+ storage_key TEXT NOT NULL,
55
+ byte_size INTEGER NOT NULL,
56
+ original_file_name TEXT NOT NULL,
57
+ scan_results_json TEXT NOT NULL DEFAULT '{}',
58
+ enrichment_results_json TEXT NOT NULL DEFAULT '{}',
59
+ created_by_actor TEXT,
60
+ created_at TEXT NOT NULL,
61
+ FOREIGN KEY (artifact_id) REFERENCES artifacts(id) ON DELETE CASCADE,
62
+ FOREIGN KEY (content_sha256) REFERENCES artifact_blobs(content_sha256),
63
+ UNIQUE (artifact_id, version_number)
64
+ );
65
+
66
+ CREATE INDEX IF NOT EXISTS idx_artifact_versions_artifact
67
+ ON artifact_versions (artifact_id, version_number DESC);
68
+
69
+ CREATE TABLE IF NOT EXISTS entity_links (
70
+ source_entity_type TEXT NOT NULL,
71
+ source_entity_id TEXT NOT NULL,
72
+ target_entity_type TEXT NOT NULL,
73
+ target_entity_id TEXT NOT NULL,
74
+ anchor_key TEXT NOT NULL DEFAULT '',
75
+ relationship TEXT NOT NULL DEFAULT 'related',
76
+ created_by_actor TEXT,
77
+ created_at TEXT NOT NULL,
78
+ PRIMARY KEY (
79
+ source_entity_type,
80
+ source_entity_id,
81
+ target_entity_type,
82
+ target_entity_id,
83
+ anchor_key,
84
+ relationship
85
+ )
86
+ );
87
+
88
+ CREATE INDEX IF NOT EXISTS idx_entity_links_source
89
+ ON entity_links (source_entity_type, source_entity_id, created_at DESC);
90
+
91
+ CREATE INDEX IF NOT EXISTS idx_entity_links_target
92
+ ON entity_links (target_entity_type, target_entity_id, created_at DESC);
93
+
94
+ CREATE TABLE IF NOT EXISTS artifact_audit_events (
95
+ id TEXT PRIMARY KEY,
96
+ artifact_id TEXT NOT NULL,
97
+ event_type TEXT NOT NULL,
98
+ actor TEXT,
99
+ source TEXT NOT NULL,
100
+ metadata_json TEXT NOT NULL DEFAULT '{}',
101
+ created_at TEXT NOT NULL,
102
+ FOREIGN KEY (artifact_id) REFERENCES artifacts(id) ON DELETE CASCADE
103
+ );
104
+
105
+ CREATE INDEX IF NOT EXISTS idx_artifact_audit_events_artifact
106
+ ON artifact_audit_events (artifact_id, created_at DESC);