@askexenow/exe-os 0.9.229 → 0.9.232

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 (293) hide show
  1. package/dist/{active-agent-GJDG4CAW.js → active-agent-QFQKXG3F.js} +4 -4
  2. package/dist/{active-agent-WOP3ZHLN.js → active-agent-Z5MLNWDB.js} +4 -4
  3. package/dist/{agentic-ontology-ASORFII6.js → agentic-ontology-GBRFTYFS.js} +1 -1
  4. package/dist/{backfill-metadata-JRWUECUS.js → backfill-metadata-KT6XR5QQ.js} +6 -6
  5. package/dist/{background-jobs-VTOMOTNA.js → background-jobs-53U6HSUF.js} +2 -2
  6. package/dist/{behaviors-36T3O2DC.js → behaviors-KZZE732K.js} +4 -4
  7. package/dist/bin/age-ontology-load.js +2 -2
  8. package/dist/bin/agentic-ontology-backfill.js +8 -8
  9. package/dist/bin/agentic-reflection-backfill.js +9 -9
  10. package/dist/bin/agentic-semantic-label.js +8 -8
  11. package/dist/bin/backfill-conversations.js +8 -8
  12. package/dist/bin/backfill-responses.js +8 -8
  13. package/dist/bin/backfill-vectors.js +10 -10
  14. package/dist/bin/bulk-sync-postgres.js +9 -9
  15. package/dist/bin/cc-doctor.js +3 -3
  16. package/dist/bin/cleanup-stale-review-tasks.js +12 -12
  17. package/dist/bin/cli.js +23 -20
  18. package/dist/bin/exe-agent-config.js +4 -4
  19. package/dist/bin/exe-agent.js +5 -5
  20. package/dist/bin/exe-assign.js +10 -10
  21. package/dist/bin/exe-boot.js +20 -20
  22. package/dist/bin/exe-call.js +5 -5
  23. package/dist/bin/exe-cloud.js +8 -8
  24. package/dist/bin/exe-dispatch.js +12 -12
  25. package/dist/bin/exe-doctor.js +1 -1
  26. package/dist/bin/exe-export-behaviors.js +9 -9
  27. package/dist/bin/exe-forget.js +8 -8
  28. package/dist/bin/exe-gateway.js +8 -8
  29. package/dist/bin/exe-healthcheck.js +3 -3
  30. package/dist/bin/exe-heartbeat.js +12 -12
  31. package/dist/bin/exe-kill.js +16 -16
  32. package/dist/bin/exe-launch-agent.js +20 -20
  33. package/dist/bin/exe-new-employee.js +9 -9
  34. package/dist/bin/exe-pending-messages.js +13 -13
  35. package/dist/bin/exe-pending-notifications.js +12 -12
  36. package/dist/bin/exe-pending-reviews.js +12 -12
  37. package/dist/bin/exe-rename.js +5 -5
  38. package/dist/bin/exe-review.js +15 -15
  39. package/dist/bin/exe-search.js +7 -7
  40. package/dist/bin/exe-session-cleanup.js +18 -18
  41. package/dist/bin/exe-settings.js +7 -7
  42. package/dist/bin/exe-start-codex.js +13 -13
  43. package/dist/bin/exe-start-opencode.js +10 -10
  44. package/dist/bin/exe-status.js +13 -13
  45. package/dist/bin/exe-support.js +3 -3
  46. package/dist/bin/exe-team.js +4 -4
  47. package/dist/bin/git-sweep.js +12 -12
  48. package/dist/bin/graph-backfill.js +7 -7
  49. package/dist/bin/graph-export.js +7 -7
  50. package/dist/bin/import-history.js +9 -9
  51. package/dist/bin/install.js +34 -21
  52. package/dist/bin/intercom-check.js +4 -4
  53. package/dist/bin/mcp-sessions.js +2 -2
  54. package/dist/bin/orchestration-metrics.js +5 -5
  55. package/dist/bin/postgres-agentic-reflection-backfill.js +4 -4
  56. package/dist/bin/postgres-agentic-semantic-backfill.js +3 -3
  57. package/dist/bin/scan-tasks.js +12 -12
  58. package/dist/bin/setup.js +3 -3
  59. package/dist/bin/shard-migrate.js +7 -7
  60. package/dist/bin/stack-update.js +3 -3
  61. package/dist/bin/update.js +3 -12
  62. package/dist/bin/vps-health-gate.js +1 -1
  63. package/dist/{branding-I2TDZFUH.js → branding-CLWTOGDU.js} +1 -1
  64. package/dist/{capacity-monitor-HZPAFQZH.js → capacity-monitor-GGTPFYQG.js} +13 -13
  65. package/dist/{catchup-brief-CDG4KD5Y.js → catchup-brief-5HRROAN7.js} +15 -15
  66. package/dist/{chunk-L24HYX62.js → chunk-2L6GV2VS.js} +2 -2
  67. package/dist/{chunk-CTFKTUYN.js → chunk-2OFB7NQW.js} +1 -1
  68. package/dist/{chunk-X3AVWFWW.js → chunk-3KIULH4N.js} +1 -1
  69. package/dist/{chunk-YCTCKUZE.js → chunk-3LTFCIMU.js} +1 -1
  70. package/dist/{chunk-V3QAAU2U.js → chunk-4E2XAON5.js} +3 -3
  71. package/dist/{chunk-JJNXFW7M.js → chunk-4GAN7BGG.js} +3 -3
  72. package/dist/{chunk-OHPRXEUA.js → chunk-4KYGTWQ2.js} +1 -1
  73. package/dist/{chunk-W6TC6A73.js → chunk-5B5DRXBQ.js} +2 -2
  74. package/dist/{chunk-Q5GUJUDW.js → chunk-63KZ3LV4.js} +1 -1
  75. package/dist/{chunk-JKGAJAM7.js → chunk-6SKF42BO.js} +2 -2
  76. package/dist/{chunk-YADYM2DE.js → chunk-72GRCS2I.js} +1 -1
  77. package/dist/{chunk-TOQZO2XX.js → chunk-7GCZAO22.js} +3 -3
  78. package/dist/{chunk-R2E4TV5V.js → chunk-7ZOFRNMG.js} +1 -1
  79. package/dist/{chunk-3DQ3IPPO.js → chunk-AKYXKCDN.js} +2 -2
  80. package/dist/{chunk-YZKJLGWL.js → chunk-ALSWBA34.js} +1 -1
  81. package/dist/{chunk-OSMMWGJ2.js → chunk-AQSGZ3DL.js} +4 -4
  82. package/dist/{chunk-JSH5MAMM.js → chunk-ASWHNMK5.js} +3 -3
  83. package/dist/{chunk-7BPKHR4O.js → chunk-AWHANCZN.js} +1 -1
  84. package/dist/{chunk-CHT3THVG.js → chunk-BYBACXPV.js} +1 -1
  85. package/dist/{chunk-ADJXHBEU.js → chunk-CYWD6JN3.js} +1 -1
  86. package/dist/{chunk-ZVSG2KKG.js → chunk-D6MAKN4A.js} +1 -1
  87. package/dist/{chunk-3A5BZETG.js → chunk-DHV2DGH2.js} +9 -9
  88. package/dist/{chunk-DLXTKVBO.js → chunk-DUBO7325.js} +2 -2
  89. package/dist/{chunk-GFCQJZTO.js → chunk-EDPL7RUE.js} +1 -1
  90. package/dist/{chunk-GVP5U4WL.js → chunk-EEAY2YNU.js} +1 -1
  91. package/dist/{chunk-RTXGUKY3.js → chunk-ERG2BYEY.js} +4 -4
  92. package/dist/{chunk-IQT43SDJ.js → chunk-ESQCAAOT.js} +2 -2
  93. package/dist/{chunk-FIPU4BDF.js → chunk-FZOXXQ34.js} +1 -1
  94. package/dist/{chunk-2VZ6SY2R.js → chunk-GBCZXOWU.js} +7 -3
  95. package/dist/{chunk-UJOSFVWG.js → chunk-IYHYMEEV.js} +8 -4
  96. package/dist/{chunk-ECQBG62Y.js → chunk-JO5H3IVP.js} +1 -1
  97. package/dist/{chunk-JBKA7F5V.js → chunk-JR6S6JD7.js} +470 -445
  98. package/dist/{chunk-NUVDSQNY.js → chunk-K4KJEH4Y.js} +2 -2
  99. package/dist/{chunk-7NNXBDOO.js → chunk-KDJRFJDL.js} +26 -16
  100. package/dist/{chunk-GKM7RYN3.js → chunk-KHEX4NY3.js} +6 -5
  101. package/dist/{chunk-UPSZ2VKV.js → chunk-KQBSNOJL.js} +2 -2
  102. package/dist/{chunk-IKTMX6N7.js → chunk-KXOX7SDE.js} +2 -2
  103. package/dist/{chunk-UV4ZHXUP.js → chunk-L55G65Q2.js} +1 -1
  104. package/dist/{chunk-HQMEOIUJ.js → chunk-LHY4ZRZV.js} +1 -1
  105. package/dist/{chunk-MJXEOKIW.js → chunk-LOLA7VLN.js} +1 -1
  106. package/dist/{chunk-WA67SFFZ.js → chunk-LZHNW2TW.js} +1 -1
  107. package/dist/{chunk-OE6SYHTC.js → chunk-M44DCO63.js} +1 -1
  108. package/dist/{chunk-UBMGUX6T.js → chunk-M6W3HYEK.js} +16 -16
  109. package/dist/{chunk-3MK3R5E6.js → chunk-MJYZJP7O.js} +4 -4
  110. package/dist/{chunk-Z3TT2SVJ.js → chunk-NV3WPNBM.js} +1 -1
  111. package/dist/{chunk-WZ2RVKRO.js → chunk-O7A2X7MH.js} +3 -3
  112. package/dist/{chunk-MSCB4ACU.js → chunk-OANEAQ7F.js} +26 -4
  113. package/dist/{chunk-OI6MVDSY.js → chunk-OE6XFO2J.js} +1 -1
  114. package/dist/{chunk-ETSREHYC.js → chunk-OVG7IQTZ.js} +2 -2
  115. package/dist/{chunk-D4IVTUNN.js → chunk-OZCZNEYI.js} +1 -1
  116. package/dist/{chunk-FF62UWIJ.js → chunk-P6Z6TTQZ.js} +1 -1
  117. package/dist/{chunk-26PUEPOY.js → chunk-PBFEGM26.js} +3 -3
  118. package/dist/{chunk-HTCBLSIB.js → chunk-PQV5FL3N.js} +18 -18
  119. package/dist/{chunk-QHIGMP2M.js → chunk-QDDPNZBG.js} +1 -1
  120. package/dist/{chunk-7DNX45WB.js → chunk-QHFTK5EF.js} +1 -1
  121. package/dist/{chunk-6MP5NOOR.js → chunk-QU3ULJBC.js} +1 -1
  122. package/dist/{chunk-G4LLKD4Z.js → chunk-QWRRM2BE.js} +1 -1
  123. package/dist/{chunk-F2GUJW5O.js → chunk-RMIJ5G7P.js} +2 -2
  124. package/dist/{chunk-Q7RGLXQO.js → chunk-RRSTE5AR.js} +1 -1
  125. package/dist/{chunk-NFB4N53K.js → chunk-RZQ4QPV5.js} +2 -2
  126. package/dist/{chunk-EHKIJPVX.js → chunk-S5K7OGFP.js} +1 -1
  127. package/dist/{chunk-I2CDSGQW.js → chunk-SBUSQBPP.js} +1 -1
  128. package/dist/{chunk-LHOIY5LQ.js → chunk-SOU6SIMY.js} +1 -1
  129. package/dist/{chunk-UWISNP4U.js → chunk-SU7NR5JA.js} +6 -6
  130. package/dist/{chunk-YKIPAQZG.js → chunk-TCUOOFBS.js} +1 -1
  131. package/dist/{chunk-CQDSTBKT.js → chunk-TPG4TR43.js} +10 -10
  132. package/dist/{chunk-M37HYGAG.js → chunk-UESS3A4X.js} +5 -5
  133. package/dist/{chunk-BZAQ4UG7.js → chunk-V5QHETEF.js} +9 -9
  134. package/dist/{chunk-Q7XA3SQ4.js → chunk-WCLWK2GI.js} +97 -91
  135. package/dist/{chunk-RMPAMMYW.js → chunk-WUHYKL36.js} +1 -1
  136. package/dist/{chunk-TNTFEWU5.js → chunk-XBXKLACW.js} +8 -1
  137. package/dist/{chunk-AZSCW64F.js → chunk-XIQZTFQQ.js} +1 -1
  138. package/dist/{chunk-HO5SBL4B.js → chunk-XM2B73ES.js} +2 -2
  139. package/dist/{chunk-DGOGCPYU.js → chunk-XQ6YKRLZ.js} +2 -2
  140. package/dist/{chunk-36DAY227.js → chunk-XUBNHBQE.js} +2 -2
  141. package/dist/{chunk-MKVFPQH2.js → chunk-XW57NQDY.js} +2 -2
  142. package/dist/{chunk-GGV3PFUW.js → chunk-YHPULREH.js} +1 -1
  143. package/dist/{chunk-HFJNYSTQ.js → chunk-YKR4AM5K.js} +24 -10
  144. package/dist/{chunk-NRFVWJHP.js → chunk-ZDO2PPFL.js} +2 -2
  145. package/dist/{chunk-PW2YH2ZR.js → chunk-ZPTGXNUS.js} +1 -1
  146. package/dist/{co-activation-AJZTQHI3.js → co-activation-LHVIX5DN.js} +3 -3
  147. package/dist/{co-occurrence-FGEJIMMV.js → co-occurrence-34TI6766.js} +3 -3
  148. package/dist/{code-context-index-KHUYATRB.js → code-context-index-TPJZBS6M.js} +4 -4
  149. package/dist/{conversation-wiki-populator-GNFRTS7X.js → conversation-wiki-populator-7ZQUMJTL.js} +1 -1
  150. package/dist/{crdt-sync-K25AKQAD.js → crdt-sync-UDQLFKQ4.js} +1 -1
  151. package/dist/{crm-webhook-3ODT32F7.js → crm-webhook-ALFLLQQZ.js} +2 -2
  152. package/dist/{cto-delegation-gate-4XDMTK6H.js → cto-delegation-gate-PDL77V7U.js} +11 -11
  153. package/dist/{daemon-auth-WFQMMNSD.js → daemon-auth-YJ7XBUR3.js} +2 -2
  154. package/dist/{daemon-orchestration-5I7RLXCP.js → daemon-orchestration-3QCHGFYF.js} +14 -14
  155. package/dist/{db-backup-MSQKO6M5.js → db-backup-3ZQQPS5G.js} +2 -2
  156. package/dist/{dreaming-UL7T5ZXA.js → dreaming-MNQ3UIMT.js} +4 -4
  157. package/dist/{exe-drift-2KHRPBUK.js → exe-drift-GHZD7CP6.js} +4 -4
  158. package/dist/{exe-export-UZN6EFOR.js → exe-export-CEC3JASW.js} +7 -7
  159. package/dist/{exe-import-OSM3U36A.js → exe-import-LJNVTJUJ.js} +7 -7
  160. package/dist/{exe-key-OG35WPBA.js → exe-key-4VYTLMXT.js} +4 -4
  161. package/dist/{exe-org-JRBBON5H.js → exe-org-2FN2JADE.js} +2 -2
  162. package/dist/{exe-snapshot-7TQIN7XI.js → exe-snapshot-MOU536LX.js} +8 -8
  163. package/dist/{fast-db-init-4VXDSFUY.js → fast-db-init-3ZWHPYUQ.js} +1 -1
  164. package/dist/{founder-context-3N6BMG7B.js → founder-context-ZNGQ5NGW.js} +2 -2
  165. package/dist/gateway/index.js +9 -9
  166. package/dist/{gateway-client-V7NH35Q2.js → gateway-client-TBA6RKLN.js} +1 -1
  167. package/dist/{git-staleness-JW57ZGEJ.js → git-staleness-3XLWI33K.js} +3 -3
  168. package/dist/{git-task-sweep-HYAPIM44.js → git-task-sweep-SNJG4T4E.js} +12 -12
  169. package/dist/{global-procedures-NY3W7L5Q.js → global-procedures-OC5C7BWJ.js} +4 -4
  170. package/dist/{graph-auto-extract-5GZ34NXS.js → graph-auto-extract-B4Z66POP.js} +3 -3
  171. package/dist/{hook-integrity-OKSYTGVP.js → hook-integrity-R7EIWBUF.js} +1 -1
  172. package/dist/hooks/bug-report-worker.js +13 -13
  173. package/dist/hooks/codex-stop-task-finalizer.js +13 -13
  174. package/dist/hooks/commit-complete.js +15 -15
  175. package/dist/hooks/error-recall.js +9 -9
  176. package/dist/hooks/exe-heartbeat-hook.js +5 -5
  177. package/dist/hooks/ingest-worker.js +5 -5
  178. package/dist/hooks/ingest.js +12 -12
  179. package/dist/hooks/instructions-loaded.js +6 -6
  180. package/dist/hooks/manifest.json +20 -20
  181. package/dist/hooks/notification.js +6 -6
  182. package/dist/hooks/post-compact.js +14 -14
  183. package/dist/hooks/post-tool-combined.js +6 -6
  184. package/dist/hooks/pre-compact.js +19 -19
  185. package/dist/hooks/pre-tool-use.js +18 -18
  186. package/dist/hooks/prompt-submit.js +26 -26
  187. package/dist/hooks/session-end.js +24 -24
  188. package/dist/hooks/session-start.js +13 -13
  189. package/dist/hooks/stop.js +21 -21
  190. package/dist/hooks/subagent-stop.js +14 -14
  191. package/dist/hooks/summary-worker.js +22 -22
  192. package/dist/index.js +20 -20
  193. package/dist/{installer-GMIVB2JS.js → installer-KAKAR5WI.js} +6 -6
  194. package/dist/{installer-OBYQ6O3C.js → installer-KK2CS2CK.js} +6 -6
  195. package/dist/{installer-UAMA6ZVH.js → installer-RV2QVZTK.js} +6 -6
  196. package/dist/{key-backup-status-TVFMMWTT.js → key-backup-status-DRZO77KR.js} +1 -1
  197. package/dist/lib/agent-config.js +2 -2
  198. package/dist/lib/cloud-sync.js +8 -6
  199. package/dist/lib/config.js +1 -1
  200. package/dist/lib/consolidation.js +7 -7
  201. package/dist/lib/database.js +3 -3
  202. package/dist/lib/db-daemon-client.js +3 -3
  203. package/dist/lib/db.js +3 -3
  204. package/dist/lib/device-registry.js +1 -1
  205. package/dist/lib/embedder.js +4 -4
  206. package/dist/lib/employee-templates.js +5 -5
  207. package/dist/lib/employees.js +3 -3
  208. package/dist/lib/exe-daemon-client.js +3 -3
  209. package/dist/lib/exe-daemon.js +97 -43
  210. package/dist/lib/hybrid-search.js +7 -7
  211. package/dist/lib/identity.js +3 -3
  212. package/dist/lib/keychain.js +1 -1
  213. package/dist/lib/license.js +2 -2
  214. package/dist/lib/messaging.js +12 -12
  215. package/dist/lib/reminders.js +4 -4
  216. package/dist/lib/schedules.js +7 -7
  217. package/dist/lib/session-registry.js +5 -5
  218. package/dist/lib/session-wrappers.js +1 -1
  219. package/dist/lib/skill-learning.js +5 -5
  220. package/dist/lib/store.js +6 -6
  221. package/dist/lib/task-router.js +4 -4
  222. package/dist/lib/tasks.js +12 -12
  223. package/dist/lib/tmux-routing.js +11 -11
  224. package/dist/lib/token-spend.js +4 -4
  225. package/dist/lib/ws-client.js +1 -1
  226. package/dist/{license-gate-7QVCYARF.js → license-gate-67W2K667.js} +3 -3
  227. package/dist/mcp/register-tools.js +64 -64
  228. package/dist/mcp/server.js +86 -65
  229. package/dist/mcp/tools/complete-reminder.js +5 -5
  230. package/dist/mcp/tools/create-reminder.js +5 -5
  231. package/dist/mcp/tools/create-task.js +14 -14
  232. package/dist/mcp/tools/deactivate-behavior.js +6 -6
  233. package/dist/mcp/tools/list-reminders.js +5 -5
  234. package/dist/mcp/tools/list-tasks.js +14 -14
  235. package/dist/mcp/tools/send-message.js +14 -14
  236. package/dist/mcp/tools/update-task.js +13 -13
  237. package/dist/{mcp-http-config-YPF4WGU5.js → mcp-http-config-ZKOV5TEB.js} +4 -4
  238. package/dist/{memory-cards-XHZEOX7Q.js → memory-cards-P4ELKIBQ.js} +3 -3
  239. package/dist/{memory-graph-extractor-J3K7B4GC.js → memory-graph-extractor-LTOZ7QRR.js} +4 -4
  240. package/dist/{memory-poisoning-defense-I76FGNHK.js → memory-poisoning-defense-RNLXBWNU.js} +3 -3
  241. package/dist/{memory-queue-WEVFXPZO.js → memory-queue-PQRE4A62.js} +2 -2
  242. package/dist/{memory-queue-client-5XBHYAQR.js → memory-queue-client-MGXFQ62G.js} +5 -5
  243. package/dist/{memory-reflection-YJGI6IDI.js → memory-reflection-RIGWBNZJ.js} +3 -3
  244. package/dist/{notifications-H4F77BYT.js → notifications-TNCGZ5W2.js} +11 -11
  245. package/dist/{orchestration-events-LXVPJL6S.js → orchestration-events-TMN37OEJ.js} +4 -4
  246. package/dist/{orchestration-phase-HXRKMZXM.js → orchestration-phase-7VYG3L7X.js} +2 -2
  247. package/dist/{orchestrator-HXUZ6LYM.js → orchestrator-3I2ZWCBE.js} +13 -13
  248. package/dist/{pipeline-router-QRJQWMFF.js → pipeline-router-IWKIZSDC.js} +4 -4
  249. package/dist/{plan-limits-NFQVRHS5.js → plan-limits-4EPTLSIU.js} +5 -5
  250. package/dist/{prediction-log-C2BD3AHR.js → prediction-log-2Z6XD4EZ.js} +1 -1
  251. package/dist/{project-boot-JIGOSGCN.js → project-boot-6KWZPQNQ.js} +1 -1
  252. package/dist/{projection-worker-JZQTL4NU.js → projection-worker-5CSBJILA.js} +3 -3
  253. package/dist/{push-notifications-3GNJ5SZS.js → push-notifications-WR6QLWR3.js} +2 -2
  254. package/dist/{reranker-U6DEAT4S.js → reranker-2IHJEYIB.js} +2 -2
  255. package/dist/{review-polling-W2S3XAAU.js → review-polling-L5P2KMBI.js} +12 -12
  256. package/dist/runtime/index.js +14 -14
  257. package/dist/{session-events-MNWHGZY5.js → session-events-5FHQPX6H.js} +12 -12
  258. package/dist/{session-kill-telemetry-JHSI7D3F.js → session-kill-telemetry-GKNTJ6BY.js} +4 -4
  259. package/dist/{session-scope-SMT225X3.js → session-scope-DWIP4IKM.js} +11 -11
  260. package/dist/{setup-wizard-RBUTEZB2.js → setup-wizard-UHXMO2FP.js} +3 -3
  261. package/dist/{shard-manager-ON2WWCRM.js → shard-manager-PWSOXHZ4.js} +2 -2
  262. package/dist/{skill-refinement-LKJHUW2U.js → skill-refinement-X2MCBDTB.js} +3 -3
  263. package/dist/{stack-update-ZIMV4OEQ.js → stack-update-WFO774SS.js} +3 -3
  264. package/dist/{steward-gate-6IKH335D.js → steward-gate-PR2N5XHY.js} +4 -4
  265. package/dist/{task-enforcement-UIEWTA6H.js → task-enforcement-AATKSKSX.js} +11 -11
  266. package/dist/{task-scope-DNQURKOQ.js → task-scope-C24XH5SU.js} +11 -11
  267. package/dist/{tasks-crud-CLAYZZ4O.js → tasks-crud-3FBWU6GS.js} +11 -11
  268. package/dist/{tasks-review-OHR2P4QE.js → tasks-review-PLWP7Y6K.js} +11 -11
  269. package/dist/{telemetry-upload-APVDPCEV.js → telemetry-upload-SQOU3PMH.js} +7 -7
  270. package/dist/{token-budget-6IQNYKLR.js → token-budget-GL3TMPSU.js} +3 -3
  271. package/dist/{tool-capability-index-UUNF7VPA.js → tool-capability-index-H3YVB4WH.js} +1 -1
  272. package/dist/{tool-telemetry-SJSIL5M5.js → tool-telemetry-25KPRGFS.js} +1 -1
  273. package/dist/tui/App.js +25 -25
  274. package/dist/{tui-data-L6XG4Z52.js → tui-data-Y4U6LD4V.js} +11 -11
  275. package/dist/{worker-gate-GFKXZ6V5.js → worker-gate-NFZWLPCT.js} +2 -2
  276. package/dist/{workflow-engine-6HTKI2ZE.js → workflow-engine-BGLW3NCF.js} +2 -2
  277. package/dist/{worktree-BO7QQ32T.js → worktree-DJB52IZE.js} +5 -5
  278. package/package.json +2 -2
  279. /package/dist/{chunk-DKRTWILB.js → chunk-5CDLCKFP.js} +0 -0
  280. /package/dist/{chunk-EGWPJQRQ.js → chunk-73AHWU3R.js} +0 -0
  281. /package/dist/{chunk-IW53DAYO.js → chunk-HBVVFXTS.js} +0 -0
  282. /package/dist/{chunk-Z3ZCLTP7.js → chunk-OAOBUDO3.js} +0 -0
  283. /package/dist/{chunk-WWPX2LLP.js → chunk-P6346JIK.js} +0 -0
  284. /package/dist/{chunk-EEAKFEEA.js → chunk-TPOWVHXP.js} +0 -0
  285. /package/dist/{chunk-7EZCYO76.js → chunk-V32QD5JJ.js} +0 -0
  286. /package/dist/{chunk-3JP3FY33.js → chunk-VITYTNHD.js} +0 -0
  287. /package/dist/{core-memory-R7QBLN4C.js → core-memory-GS3UTWJA.js} +0 -0
  288. /package/dist/{entity-boost-7MB2IYAE.js → entity-boost-BQEHHM3I.js} +0 -0
  289. /package/dist/{message-queue-client-FUKX43JD.js → message-queue-client-NPOYVISO.js} +0 -0
  290. /package/dist/{oauth-server-CCZPDTZJ.js → oauth-server-TVI5S5GG.js} +0 -0
  291. /package/dist/{webhook-pipe-4WPFGGFD.js → webhook-pipe-GB7YZIKE.js} +0 -0
  292. /package/dist/{wiki-acl-XCT6QQGP.js → wiki-acl-WZ4YRL3B.js} +0 -0
  293. /package/dist/{wiki-client-KE622HKY.js → wiki-client-WRO5PRMD.js} +0 -0
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  isCrdtSyncEnabled
3
- } from "./chunk-EEAKFEEA.js";
3
+ } from "./chunk-TPOWVHXP.js";
4
4
  import {
5
5
  decryptSyncBlob,
6
6
  encryptSyncBlob,
@@ -12,13 +12,13 @@ import {
12
12
  loadEmployees,
13
13
  registerBinSymlinks,
14
14
  saveEmployees
15
- } from "./chunk-UJOSFVWG.js";
15
+ } from "./chunk-IYHYMEEV.js";
16
16
  import {
17
17
  loadDeviceId
18
- } from "./chunk-D4IVTUNN.js";
18
+ } from "./chunk-OZCZNEYI.js";
19
19
  import {
20
20
  EXE_AI_DIR
21
- } from "./chunk-TNTFEWU5.js";
21
+ } from "./chunk-XBXKLACW.js";
22
22
  import {
23
23
  atomicWriteJsonSync,
24
24
  atomicWriteSync,
@@ -48,6 +48,7 @@ function decompress(input) {
48
48
  }
49
49
 
50
50
  // src/lib/cloud-sync.ts
51
+ var _cloudSyncInProgress = false;
51
52
  function sqlSafe(v) {
52
53
  return v === void 0 ? null : v;
53
54
  }
@@ -155,6 +156,16 @@ function loadPgClient() {
155
156
  }
156
157
  return _pgPromise;
157
158
  }
159
+ async function disposeCloudSync() {
160
+ if (_pgPromise) {
161
+ try {
162
+ const pg = await _pgPromise;
163
+ if (pg.$disconnect) await pg.$disconnect();
164
+ } catch {
165
+ }
166
+ _pgPromise = null;
167
+ }
168
+ }
158
169
  async function pushToPostgres(records) {
159
170
  const loader = loadPgClient();
160
171
  if (!loader) return 0;
@@ -441,76 +452,82 @@ async function markCloudReuploadRequired(client = getClient()) {
441
452
  await client.execute("INSERT INTO sync_meta (key, value) VALUES ('cloud_reupload_required', '1') ON CONFLICT(key) DO UPDATE SET value = excluded.value");
442
453
  }
443
454
  async function cloudSync(config) {
444
- config = { ...config, endpoint: migrateEndpoint(config.endpoint) };
445
- if (!isSyncCryptoInitialized()) {
446
- try {
447
- const { getMasterKey } = await import("./lib/keychain.js");
448
- const masterKey = await getMasterKey();
449
- if (masterKey) {
450
- initSyncCrypto(masterKey);
451
- } else {
452
- throw new Error("No master key found");
455
+ if (_cloudSyncInProgress) {
456
+ process.stderr.write("[cloud-sync] Sync already in progress \u2014 skipping concurrent call.\n");
457
+ return { pushed: 0, pulled: 0, totalMemories: 0, behaviors: { pushed: 0, pulled: 0 }, graphrag: { pushed: 0, pulled: 0 }, tasks: { pushed: 0, pulled: 0 }, conversations: { pushed: 0, pulled: 0 }, documents: { pushed: 0, pulled: 0 }, roster: { employees: 0, identities: 0 } };
458
+ }
459
+ _cloudSyncInProgress = true;
460
+ try {
461
+ config = { ...config, endpoint: migrateEndpoint(config.endpoint) };
462
+ if (!isSyncCryptoInitialized()) {
463
+ try {
464
+ const { getMasterKey } = await import("./lib/keychain.js");
465
+ const masterKey = await getMasterKey();
466
+ if (masterKey) {
467
+ initSyncCrypto(masterKey);
468
+ } else {
469
+ throw new Error("No master key found");
470
+ }
471
+ } catch (err) {
472
+ throw new Error(`[cloud-sync] Cannot initialize encryption: ${err instanceof Error ? err.message : String(err)}`);
453
473
  }
474
+ }
475
+ let client;
476
+ try {
477
+ client = getClient();
478
+ } catch (e) {
479
+ process.stderr.write("[cloud-sync] getClient() failed: " + (e instanceof Error ? e.message : String(e)) + "\n");
480
+ throw new Error("[cloud-sync] Database not initialized. Call initStore() before cloudSync().");
481
+ }
482
+ try {
483
+ if (await getCloudReuploadRequired(client)) throw new Error(CLOUD_REUPLOAD_REQUIRED_MESSAGE);
454
484
  } catch (err) {
455
- throw new Error(`[cloud-sync] Cannot initialize encryption: ${err instanceof Error ? err.message : String(err)}`);
485
+ const msg = err instanceof Error ? err.message : String(err);
486
+ if (msg === CLOUD_REUPLOAD_REQUIRED_MESSAGE || msg.includes("key rotation")) throw err;
456
487
  }
457
- }
458
- let client;
459
- try {
460
- client = getClient();
461
- } catch (e) {
462
- process.stderr.write("[cloud-sync] getClient() failed: " + (e instanceof Error ? e.message : String(e)) + "\n");
463
- throw new Error("[cloud-sync] Database not initialized. Call initStore() before cloudSync().");
464
- }
465
- try {
466
- if (await getCloudReuploadRequired(client)) throw new Error(CLOUD_REUPLOAD_REQUIRED_MESSAGE);
467
- } catch (err) {
468
- const msg = err instanceof Error ? err.message : String(err);
469
- if (msg === CLOUD_REUPLOAD_REQUIRED_MESSAGE || msg.includes("key rotation")) throw err;
470
- }
471
- try {
472
- const { getRawClient } = await import("./lib/database.js");
473
- await getRawClient().execute("PRAGMA wal_checkpoint(PASSIVE)");
474
- } catch (e) {
475
- process.stderr.write("[cloud-sync] WAL checkpoint failed: " + (e instanceof Error ? e.message : String(e)) + "\n");
476
- }
477
- try {
478
- await client.execute(
479
- "CREATE TABLE IF NOT EXISTS sync_meta (key TEXT PRIMARY KEY, value TEXT NOT NULL)"
480
- );
481
- } catch (e) {
482
- logError(`[cloud-sync] sync_meta CREATE failed: ${e instanceof Error ? e.message : String(e)}`);
483
- }
484
- const pullMeta = await client.execute(
485
- "SELECT value FROM sync_meta WHERE key = 'last_cloud_pull_version'"
486
- );
487
- const lastPullVersion = pullMeta.rows.length > 0 ? Number(pullMeta.rows[0].value) : 0;
488
- const pullResult = await cloudPull(lastPullVersion, config);
489
- let pulled = 0;
490
- if (pullResult.records.length > 0) {
491
- if (isCrdtSyncEnabled()) {
492
- const { initCrdtDoc, importExistingMemories, readAllMemories } = await import("./crdt-sync-K25AKQAD.js");
493
- initCrdtDoc();
494
- importExistingMemories(
495
- pullResult.records.map((rec) => ({
496
- id: String(rec.id ?? ""),
497
- agent_id: rec.agent_id,
498
- agent_role: rec.agent_role,
499
- session_id: rec.session_id,
500
- timestamp: rec.timestamp,
501
- tool_name: rec.tool_name,
502
- project_name: rec.project_name,
503
- has_error: rec.has_error ?? 0,
504
- raw_text: rec.raw_text ?? "",
505
- version: rec.version ?? 0,
506
- author_device_id: rec.author_device_id,
507
- scope: rec.scope ?? "business"
508
- }))
488
+ try {
489
+ const { getRawClient } = await import("./lib/database.js");
490
+ await getRawClient().execute("PRAGMA wal_checkpoint(PASSIVE)");
491
+ } catch (e) {
492
+ process.stderr.write("[cloud-sync] WAL checkpoint failed: " + (e instanceof Error ? e.message : String(e)) + "\n");
493
+ }
494
+ try {
495
+ await client.execute(
496
+ "CREATE TABLE IF NOT EXISTS sync_meta (key TEXT PRIMARY KEY, value TEXT NOT NULL)"
509
497
  );
510
- const pulledIds = new Set(pullResult.records.map((r) => String(r.id ?? "")));
511
- const merged = readAllMemories().filter((rec) => pulledIds.has(rec.id));
512
- const stmts = merged.map((rec) => ({
513
- sql: `INSERT INTO memories
498
+ } catch (e) {
499
+ logError(`[cloud-sync] sync_meta CREATE failed: ${e instanceof Error ? e.message : String(e)}`);
500
+ }
501
+ const pullMeta = await client.execute(
502
+ "SELECT value FROM sync_meta WHERE key = 'last_cloud_pull_version'"
503
+ );
504
+ const lastPullVersion = pullMeta.rows.length > 0 ? Number(pullMeta.rows[0].value) : 0;
505
+ const pullResult = await cloudPull(lastPullVersion, config);
506
+ let pulled = 0;
507
+ if (pullResult.records.length > 0) {
508
+ if (isCrdtSyncEnabled()) {
509
+ const { initCrdtDoc, importExistingMemories, readAllMemories } = await import("./crdt-sync-UDQLFKQ4.js");
510
+ initCrdtDoc();
511
+ importExistingMemories(
512
+ pullResult.records.map((rec) => ({
513
+ id: String(rec.id ?? ""),
514
+ agent_id: rec.agent_id,
515
+ agent_role: rec.agent_role,
516
+ session_id: rec.session_id,
517
+ timestamp: rec.timestamp,
518
+ tool_name: rec.tool_name,
519
+ project_name: rec.project_name,
520
+ has_error: rec.has_error ?? 0,
521
+ raw_text: rec.raw_text ?? "",
522
+ version: rec.version ?? 0,
523
+ author_device_id: rec.author_device_id,
524
+ scope: rec.scope ?? "business"
525
+ }))
526
+ );
527
+ const pulledIds = new Set(pullResult.records.map((r) => String(r.id ?? "")));
528
+ const merged = readAllMemories().filter((rec) => pulledIds.has(rec.id));
529
+ const stmts = merged.map((rec) => ({
530
+ sql: `INSERT INTO memories
514
531
  (id, agent_id, agent_role, session_id, timestamp,
515
532
  tool_name, project_name, has_error, raw_text, version,
516
533
  author_device_id, scope, memory_type, session_scope)
@@ -534,74 +551,74 @@ async function cloudSync(config) {
534
551
  confidence = COALESCE(memories.confidence, excluded.confidence),
535
552
  tier = COALESCE(memories.tier, excluded.tier),
536
553
  strength = COALESCE(memories.strength, excluded.strength)`,
537
- args: [
538
- sqlSafe(rec.id),
539
- sqlSafe(rec.agent_id),
540
- sqlSafe(rec.agent_role),
541
- sqlSafe(rec.session_id),
542
- sqlSafe(rec.timestamp),
543
- sqlSafe(rec.tool_name),
544
- sqlSafe(rec.project_name),
545
- sqlSafe(rec.has_error ?? 0),
546
- sqlSafe(rec.raw_text ?? ""),
547
- sqlSafe(rec.version ?? 0),
548
- sqlSafe(rec.author_device_id),
549
- sqlSafe(rec.scope ?? "business"),
550
- sqlSafe(rec.memory_type),
551
- sqlSafe(rec.session_scope)
552
- ]
553
- }));
554
- if (stmts.length > 0) await client.batch(stmts, "write");
555
- pulled = pullResult.records.length;
556
- } else {
557
- try {
558
- const incomingIds = pullResult.records.map((r) => sqlSafe(r.id));
559
- if (incomingIds.length > 0) {
560
- const ph = incomingIds.map(() => "?").join(",");
561
- const existing = await client.execute({
562
- sql: `SELECT id, version, timestamp FROM memories WHERE id IN (${ph})`,
563
- args: incomingIds
564
- });
565
- const localMap = new Map(existing.rows.map((r) => [String(r.id), r]));
566
- for (const rec of pullResult.records) {
567
- const local = localMap.get(String(rec.id));
568
- if (local && Number(local.version) > 0 && Number(local.version) !== Number(rec.version ?? 0)) {
569
- process.stderr.write(
570
- `[cloud-sync] CONFLICT: memory ${String(rec.id).slice(0, 8)} \u2014 local v${local.version} vs remote v${rec.version ?? 0}. Remote wins (LWW).
554
+ args: [
555
+ sqlSafe(rec.id),
556
+ sqlSafe(rec.agent_id),
557
+ sqlSafe(rec.agent_role),
558
+ sqlSafe(rec.session_id),
559
+ sqlSafe(rec.timestamp),
560
+ sqlSafe(rec.tool_name),
561
+ sqlSafe(rec.project_name),
562
+ sqlSafe(rec.has_error ?? 0),
563
+ sqlSafe(rec.raw_text ?? ""),
564
+ sqlSafe(rec.version ?? 0),
565
+ sqlSafe(rec.author_device_id),
566
+ sqlSafe(rec.scope ?? "business"),
567
+ sqlSafe(rec.memory_type),
568
+ sqlSafe(rec.session_scope)
569
+ ]
570
+ }));
571
+ if (stmts.length > 0) await client.batch(stmts, "write");
572
+ pulled = pullResult.records.length;
573
+ } else {
574
+ try {
575
+ const incomingIds = pullResult.records.map((r) => sqlSafe(r.id));
576
+ if (incomingIds.length > 0) {
577
+ const ph = incomingIds.map(() => "?").join(",");
578
+ const existing = await client.execute({
579
+ sql: `SELECT id, version, timestamp FROM memories WHERE id IN (${ph})`,
580
+ args: incomingIds
581
+ });
582
+ const localMap = new Map(existing.rows.map((r) => [String(r.id), r]));
583
+ for (const rec of pullResult.records) {
584
+ const local = localMap.get(String(rec.id));
585
+ if (local && Number(local.version) > 0 && Number(local.version) !== Number(rec.version ?? 0)) {
586
+ process.stderr.write(
587
+ `[cloud-sync] CONFLICT: memory ${String(rec.id).slice(0, 8)} \u2014 local v${local.version} vs remote v${rec.version ?? 0}. Remote wins (LWW).
571
588
  `
572
- );
573
- client.execute({
574
- sql: `INSERT OR IGNORE INTO sync_conflicts (id, memory_id, local_version, remote_version, local_timestamp, remote_timestamp, local_device_id, resolution, created_at)
589
+ );
590
+ client.execute({
591
+ sql: `INSERT OR IGNORE INTO sync_conflicts (id, memory_id, local_version, remote_version, local_timestamp, remote_timestamp, local_device_id, resolution, created_at)
575
592
  VALUES (?, ?, ?, ?, ?, ?, ?, 'remote_wins', ?)`,
576
- args: [
577
- `conflict-${String(rec.id).slice(0, 8)}-${Date.now()}`,
578
- String(rec.id),
579
- Number(local.version),
580
- Number(rec.version ?? 0),
581
- String(local.timestamp ?? ""),
582
- String(rec.timestamp ?? ""),
583
- process.env.EXE_DEVICE_ID ?? "",
584
- (/* @__PURE__ */ new Date()).toISOString()
585
- ]
586
- }).catch((err) => {
587
- process.stderr.write(`[cloud-sync] conflict audit insert failed: ${err instanceof Error ? err.message : String(err)}
593
+ args: [
594
+ `conflict-${String(rec.id).slice(0, 8)}-${Date.now()}`,
595
+ String(rec.id),
596
+ Number(local.version),
597
+ Number(rec.version ?? 0),
598
+ String(local.timestamp ?? ""),
599
+ String(rec.timestamp ?? ""),
600
+ process.env.EXE_DEVICE_ID ?? "",
601
+ (/* @__PURE__ */ new Date()).toISOString()
602
+ ]
603
+ }).catch((err) => {
604
+ process.stderr.write(`[cloud-sync] conflict audit insert failed: ${err instanceof Error ? err.message : String(err)}
588
605
  `);
589
- });
606
+ });
607
+ }
590
608
  }
591
609
  }
610
+ } catch (e) {
611
+ process.stderr.write("[cloud-sync] conflict detection query failed: " + (e instanceof Error ? e.message : String(e)) + "\n");
592
612
  }
593
- } catch (e) {
594
- process.stderr.write("[cloud-sync] conflict detection query failed: " + (e instanceof Error ? e.message : String(e)) + "\n");
595
- }
596
- const localDeviceId = loadDeviceId();
597
- const deviceFilteredRecords = pullResult.records.filter((rec) => {
598
- const authorDevice = rec.author_device_id;
599
- if (!authorDevice) return true;
600
- if (String(authorDevice) === localDeviceId) return true;
601
- return true;
602
- });
603
- const stmts = deviceFilteredRecords.map((rec) => ({
604
- sql: `INSERT INTO memories
613
+ const localDeviceId = loadDeviceId();
614
+ const deviceFilteredRecords = pullResult.records.filter((rec) => {
615
+ const authorDevice = rec.author_device_id;
616
+ if (!authorDevice) return true;
617
+ if (String(authorDevice) === localDeviceId) return true;
618
+ return true;
619
+ });
620
+ const stmts = deviceFilteredRecords.map((rec) => ({
621
+ sql: `INSERT INTO memories
605
622
  (id, agent_id, agent_role, session_id, timestamp,
606
623
  tool_name, project_name, has_error, raw_text, version,
607
624
  author_device_id, scope, memory_type, session_scope)
@@ -625,79 +642,79 @@ async function cloudSync(config) {
625
642
  confidence = COALESCE(memories.confidence, excluded.confidence),
626
643
  tier = COALESCE(memories.tier, excluded.tier),
627
644
  strength = COALESCE(memories.strength, excluded.strength)`,
628
- args: [
629
- sqlSafe(rec.id),
630
- sqlSafeRequired(rec.agent_id, "unknown"),
631
- sqlSafeRequired(rec.agent_role, "employee"),
632
- sqlSafeRequired(rec.session_id, "cloud-sync"),
633
- sqlSafeRequired(rec.timestamp, (/* @__PURE__ */ new Date()).toISOString()),
634
- sqlSafeRequired(rec.tool_name, "cloud_sync"),
635
- sqlSafeRequired(rec.project_name, "unknown"),
636
- sqlSafe(rec.has_error ?? 0),
637
- sqlSafe(rec.raw_text ?? ""),
638
- sqlSafe(rec.version ?? 0),
639
- sqlSafe(rec.author_device_id),
640
- sqlSafe(rec.scope ?? "business"),
641
- sqlSafe(rec.memory_type),
642
- sqlSafe(rec.session_scope)
643
- ]
644
- }));
645
- let syncErrors = 0;
646
- const BATCH_SIZE = 100;
647
- for (let i = 0; i < stmts.length; i += BATCH_SIZE) {
648
- const batch = stmts.slice(i, i + BATCH_SIZE);
649
- try {
650
- await client.batch(batch, "write");
651
- } catch (batchErr) {
652
- for (const stmt of batch) {
653
- try {
654
- await client.execute(stmt);
655
- } catch (recErr) {
656
- syncErrors++;
657
- process.stderr.write(
658
- `[cloud-sync] Skipped bad record (${recErr instanceof Error ? recErr.message : String(recErr)})
645
+ args: [
646
+ sqlSafe(rec.id),
647
+ sqlSafeRequired(rec.agent_id, "unknown"),
648
+ sqlSafeRequired(rec.agent_role, "employee"),
649
+ sqlSafeRequired(rec.session_id, "cloud-sync"),
650
+ sqlSafeRequired(rec.timestamp, (/* @__PURE__ */ new Date()).toISOString()),
651
+ sqlSafeRequired(rec.tool_name, "cloud_sync"),
652
+ sqlSafeRequired(rec.project_name, "unknown"),
653
+ sqlSafe(rec.has_error ?? 0),
654
+ sqlSafe(rec.raw_text ?? ""),
655
+ sqlSafe(rec.version ?? 0),
656
+ sqlSafe(rec.author_device_id),
657
+ sqlSafe(rec.scope ?? "business"),
658
+ sqlSafe(rec.memory_type),
659
+ sqlSafe(rec.session_scope)
660
+ ]
661
+ }));
662
+ let syncErrors = 0;
663
+ const BATCH_SIZE = 100;
664
+ for (let i = 0; i < stmts.length; i += BATCH_SIZE) {
665
+ const batch = stmts.slice(i, i + BATCH_SIZE);
666
+ try {
667
+ await client.batch(batch, "write");
668
+ } catch (batchErr) {
669
+ for (const stmt of batch) {
670
+ try {
671
+ await client.execute(stmt);
672
+ } catch (recErr) {
673
+ syncErrors++;
674
+ process.stderr.write(
675
+ `[cloud-sync] Skipped bad record (${recErr instanceof Error ? recErr.message : String(recErr)})
659
676
  `
660
- );
677
+ );
678
+ }
661
679
  }
662
680
  }
681
+ if (i + BATCH_SIZE < stmts.length) {
682
+ await new Promise((resolve) => setImmediate(resolve));
683
+ }
663
684
  }
664
- if (i + BATCH_SIZE < stmts.length) {
665
- await new Promise((resolve) => setImmediate(resolve));
685
+ pulled = stmts.length - syncErrors;
686
+ if (syncErrors > 0) {
687
+ process.stderr.write(`[cloud-sync] Pull completed with ${syncErrors} skipped record(s)
688
+ `);
666
689
  }
667
690
  }
668
- pulled = stmts.length - syncErrors;
669
- if (syncErrors > 0) {
670
- process.stderr.write(`[cloud-sync] Pull completed with ${syncErrors} skipped record(s)
671
- `);
691
+ }
692
+ if (pulled > 0) {
693
+ try {
694
+ await pushToPostgres(pullResult.records);
695
+ } catch (e) {
696
+ process.stderr.write("[cloud-sync] Postgres push of pulled records failed: " + (e instanceof Error ? e.message : String(e)) + "\n");
672
697
  }
673
698
  }
674
- }
675
- if (pulled > 0) {
676
- try {
677
- await pushToPostgres(pullResult.records);
678
- } catch (e) {
679
- process.stderr.write("[cloud-sync] Postgres push of pulled records failed: " + (e instanceof Error ? e.message : String(e)) + "\n");
699
+ if (pullResult.maxVersion > lastPullVersion) {
700
+ await client.execute({
701
+ sql: "INSERT INTO sync_meta (key, value) VALUES ('last_cloud_pull_version', ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value",
702
+ args: [String(pullResult.maxVersion)]
703
+ });
680
704
  }
681
- }
682
- if (pullResult.maxVersion > lastPullVersion) {
683
- await client.execute({
684
- sql: "INSERT INTO sync_meta (key, value) VALUES ('last_cloud_pull_version', ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value",
685
- args: [String(pullResult.maxVersion)]
686
- });
687
- }
688
- const pushMeta = await client.execute(
689
- "SELECT value FROM sync_meta WHERE key = 'last_cloud_push_version'"
690
- );
691
- const lastPushVersion = pushMeta.rows.length > 0 ? Number(pushMeta.rows[0].value) : 0;
692
- let pushed = 0;
693
- let batchCursor = lastPushVersion;
694
- const nowMs = Date.now();
695
- const pushCooldownActive = lastPushVersion > 0 && lastPushVersion === _lastSyncPushVersion && nowMs - _lastSyncPushTimestamp < SYNC_COOLDOWN_MS;
696
- if (pushCooldownActive) {
697
- } else {
698
- while (true) {
699
- const recordsResult = await client.execute({
700
- sql: `SELECT id, agent_id, agent_role, session_id, timestamp,
705
+ const pushMeta = await client.execute(
706
+ "SELECT value FROM sync_meta WHERE key = 'last_cloud_push_version'"
707
+ );
708
+ const lastPushVersion = pushMeta.rows.length > 0 ? Number(pushMeta.rows[0].value) : 0;
709
+ let pushed = 0;
710
+ let batchCursor = lastPushVersion;
711
+ const nowMs = Date.now();
712
+ const pushCooldownActive = lastPushVersion > 0 && lastPushVersion === _lastSyncPushVersion && nowMs - _lastSyncPushTimestamp < SYNC_COOLDOWN_MS;
713
+ if (pushCooldownActive) {
714
+ } else {
715
+ while (true) {
716
+ const recordsResult = await client.execute({
717
+ sql: `SELECT id, agent_id, agent_role, session_id, timestamp,
701
718
  tool_name, project_name, has_error, raw_text, version,
702
719
  author_device_id, scope, session_scope
703
720
  FROM memories
@@ -705,266 +722,273 @@ async function cloudSync(config) {
705
722
  AND (scope IS NULL OR scope != 'personal')
706
723
  ORDER BY version ASC
707
724
  LIMIT ?`,
708
- args: [batchCursor, PUSH_BATCH_SIZE]
709
- });
710
- if (recordsResult.rows.length === 0) break;
711
- const records = recordsResult.rows.map((row) => ({
712
- id: row.id,
713
- agent_id: row.agent_id,
714
- agent_role: row.agent_role,
715
- session_id: row.session_id,
716
- timestamp: row.timestamp,
717
- tool_name: row.tool_name,
718
- project_name: row.project_name,
719
- has_error: row.has_error,
720
- raw_text: row.raw_text,
721
- version: row.version,
722
- author_device_id: row.author_device_id,
723
- scope: row.scope,
724
- session_scope: row.session_scope
725
- }));
726
- const maxVersion = Number(records[records.length - 1].version);
727
- const pushOk = await cloudPush(records, maxVersion, config);
728
- if (!pushOk) break;
725
+ args: [batchCursor, PUSH_BATCH_SIZE]
726
+ });
727
+ if (recordsResult.rows.length === 0) break;
728
+ const records = recordsResult.rows.map((row) => ({
729
+ id: row.id,
730
+ agent_id: row.agent_id,
731
+ agent_role: row.agent_role,
732
+ session_id: row.session_id,
733
+ timestamp: row.timestamp,
734
+ tool_name: row.tool_name,
735
+ project_name: row.project_name,
736
+ has_error: row.has_error,
737
+ raw_text: row.raw_text,
738
+ version: row.version,
739
+ author_device_id: row.author_device_id,
740
+ scope: row.scope,
741
+ session_scope: row.session_scope
742
+ }));
743
+ const maxVersion = Number(records[records.length - 1].version);
744
+ let pushOk = await cloudPush(records, maxVersion, config);
745
+ if (!pushOk) {
746
+ await cloudPull(lastPullVersion, config);
747
+ pushOk = await cloudPush(records, maxVersion, config);
748
+ if (!pushOk) break;
749
+ }
750
+ try {
751
+ await pushToPostgres(records);
752
+ } catch (e) {
753
+ process.stderr.write("[cloud-sync] Postgres push of local records failed: " + (e instanceof Error ? e.message : String(e)) + "\n");
754
+ }
755
+ await client.execute({
756
+ sql: "INSERT INTO sync_meta (key, value) VALUES ('last_cloud_push_version', ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value",
757
+ args: [String(maxVersion)]
758
+ });
759
+ pushed += records.length;
760
+ batchCursor = maxVersion;
761
+ _lastSyncPushVersion = maxVersion;
762
+ _lastSyncPushTimestamp = Date.now();
763
+ if (recordsResult.rows.length < PUSH_BATCH_SIZE) break;
764
+ await new Promise((resolve) => setImmediate(resolve));
765
+ }
766
+ }
767
+ try {
768
+ await cloudPushRoster(config);
769
+ } catch (err) {
770
+ logError(`[cloud-sync] Roster push: ${err instanceof Error ? err.message : String(err)}`);
771
+ }
772
+ try {
773
+ await cloudPullRoster(config);
774
+ } catch (err) {
775
+ logError(`[cloud-sync] Roster pull: ${err instanceof Error ? err.message : String(err)}`);
776
+ }
777
+ try {
778
+ await cloudPushGlobalProcedures(config);
779
+ } catch (err) {
780
+ logError(`[cloud-sync] Company procedures push: ${err instanceof Error ? err.message : String(err)}`);
781
+ }
782
+ try {
783
+ await cloudPullGlobalProcedures(config);
784
+ } catch (err) {
785
+ logError(`[cloud-sync] Company procedures pull: ${err instanceof Error ? err.message : String(err)}`);
786
+ }
787
+ const countRows = async (sql) => {
729
788
  try {
730
- await pushToPostgres(records);
789
+ return Number((await client.execute(sql)).rows[0]?.cnt ?? 0);
731
790
  } catch (e) {
732
- process.stderr.write("[cloud-sync] Postgres push of local records failed: " + (e instanceof Error ? e.message : String(e)) + "\n");
791
+ process.stderr.write("[cloud-sync] countRows failed: " + (e instanceof Error ? e.message : String(e)) + "\n");
792
+ return 0;
733
793
  }
734
- await client.execute({
735
- sql: "INSERT INTO sync_meta (key, value) VALUES ('last_cloud_push_version', ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value",
736
- args: [String(maxVersion)]
737
- });
738
- pushed += records.length;
739
- batchCursor = maxVersion;
740
- _lastSyncPushVersion = maxVersion;
741
- _lastSyncPushTimestamp = Date.now();
742
- if (recordsResult.rows.length < PUSH_BATCH_SIZE) break;
743
- await new Promise((resolve) => setImmediate(resolve));
794
+ };
795
+ const behaviorsResult = { pushed: 0, pulled: 0 };
796
+ try {
797
+ await cloudPushBehaviors(config);
798
+ behaviorsResult.pushed = await countRows("SELECT COUNT(*) as cnt FROM behaviors WHERE active = 1");
799
+ } catch (err) {
800
+ logError(`[cloud-sync] Behaviors push: ${err instanceof Error ? err.message : String(err)}`);
744
801
  }
745
- }
746
- try {
747
- await cloudPushRoster(config);
748
- } catch (err) {
749
- logError(`[cloud-sync] Roster push: ${err instanceof Error ? err.message : String(err)}`);
750
- }
751
- try {
752
- await cloudPullRoster(config);
753
- } catch (err) {
754
- logError(`[cloud-sync] Roster pull: ${err instanceof Error ? err.message : String(err)}`);
755
- }
756
- try {
757
- await cloudPushGlobalProcedures(config);
758
- } catch (err) {
759
- logError(`[cloud-sync] Company procedures push: ${err instanceof Error ? err.message : String(err)}`);
760
- }
761
- try {
762
- await cloudPullGlobalProcedures(config);
763
- } catch (err) {
764
- logError(`[cloud-sync] Company procedures pull: ${err instanceof Error ? err.message : String(err)}`);
765
- }
766
- const countRows = async (sql) => {
767
802
  try {
768
- return Number((await client.execute(sql)).rows[0]?.cnt ?? 0);
769
- } catch (e) {
770
- process.stderr.write("[cloud-sync] countRows failed: " + (e instanceof Error ? e.message : String(e)) + "\n");
771
- return 0;
803
+ const pullResult2 = await cloudPullBehaviors(config);
804
+ behaviorsResult.pulled = pullResult2.pulled;
805
+ } catch (err) {
806
+ logError(`[cloud-sync] Behaviors pull: ${err instanceof Error ? err.message : String(err)}`);
772
807
  }
773
- };
774
- const behaviorsResult = { pushed: 0, pulled: 0 };
775
- try {
776
- await cloudPushBehaviors(config);
777
- behaviorsResult.pushed = await countRows("SELECT COUNT(*) as cnt FROM behaviors WHERE active = 1");
778
- } catch (err) {
779
- logError(`[cloud-sync] Behaviors push: ${err instanceof Error ? err.message : String(err)}`);
780
- }
781
- try {
782
- const pullResult2 = await cloudPullBehaviors(config);
783
- behaviorsResult.pulled = pullResult2.pulled;
784
- } catch (err) {
785
- logError(`[cloud-sync] Behaviors pull: ${err instanceof Error ? err.message : String(err)}`);
786
- }
787
- const graphragResult = { pushed: 0, pulled: 0 };
788
- try {
789
- await cloudPushGraphRAG(config);
790
- graphragResult.pushed = await countRows("SELECT COUNT(*) as cnt FROM entities");
791
- } catch (err) {
792
- logError(`[cloud-sync] GraphRAG push: ${err instanceof Error ? err.message : String(err)}`);
793
- }
794
- try {
795
- const pullResult2 = await cloudPullGraphRAG(config);
796
- graphragResult.pulled = pullResult2.pulled;
797
- } catch (err) {
798
- logError(`[cloud-sync] GraphRAG pull: ${err instanceof Error ? err.message : String(err)}`);
799
- }
800
- const tasksResult = { pushed: 0, pulled: 0 };
801
- try {
802
- await cloudPushTasks(config);
803
- tasksResult.pushed = await countRows("SELECT COUNT(*) as cnt FROM tasks");
804
- } catch (err) {
805
- logError(`[cloud-sync] Tasks push: ${err instanceof Error ? err.message : String(err)}`);
806
- }
807
- try {
808
- const pullResult2 = await cloudPullTasks(config);
809
- tasksResult.pulled = pullResult2.pulled;
810
- } catch (err) {
811
- logError(`[cloud-sync] Tasks pull: ${err instanceof Error ? err.message : String(err)}`);
812
- }
813
- const conversationsResult = { pushed: 0, pulled: 0 };
814
- try {
815
- await cloudPushConversations(config);
816
- conversationsResult.pushed = await countRows("SELECT COUNT(*) as cnt FROM conversations");
817
- } catch (err) {
818
- logError(`[cloud-sync] Conversations push: ${err instanceof Error ? err.message : String(err)}`);
819
- }
820
- try {
821
- const pullResult2 = await cloudPullConversations(config);
822
- conversationsResult.pulled = pullResult2.pulled;
823
- } catch (err) {
824
- logError(`[cloud-sync] Conversations pull: ${err instanceof Error ? err.message : String(err)}`);
825
- }
826
- const schedulesResult = { pushed: 0, pulled: 0 };
827
- try {
828
- await cloudPushSchedules(config);
829
- schedulesResult.pushed = await countRows("SELECT COUNT(*) as cnt FROM schedules");
830
- } catch (err) {
831
- logError(`[cloud-sync] Schedules push: ${err instanceof Error ? err.message : String(err)}`);
832
- }
833
- try {
834
- const pullResult2 = await cloudPullSchedules(config);
835
- schedulesResult.pulled = pullResult2.pulled;
836
- } catch (err) {
837
- logError(`[cloud-sync] Schedules pull: ${err instanceof Error ? err.message : String(err)}`);
838
- }
839
- const trajectoriesResult = { pushed: 0, pulled: 0 };
840
- try {
841
- await cloudPushTrajectories(config);
842
- trajectoriesResult.pushed = await countRows("SELECT COUNT(*) as cnt FROM trajectories");
843
- } catch (err) {
844
- logError(`[cloud-sync] Trajectories push: ${err instanceof Error ? err.message : String(err)}`);
845
- }
846
- try {
847
- const pullResult2 = await cloudPullTrajectories(config);
848
- trajectoriesResult.pulled = pullResult2.pulled;
849
- } catch (err) {
850
- logError(`[cloud-sync] Trajectories pull: ${err instanceof Error ? err.message : String(err)}`);
851
- }
852
- const consolidationsResult = { pushed: 0, pulled: 0 };
853
- try {
854
- await cloudPushConsolidations(config);
855
- consolidationsResult.pushed = await countRows("SELECT COUNT(*) as cnt FROM consolidations");
856
- } catch (err) {
857
- logError(`[cloud-sync] Consolidations push: ${err instanceof Error ? err.message : String(err)}`);
858
- }
859
- try {
860
- const pullResult2 = await cloudPullConsolidations(config);
861
- consolidationsResult.pulled = pullResult2.pulled;
862
- } catch (err) {
863
- logError(`[cloud-sync] Consolidations pull: ${err instanceof Error ? err.message : String(err)}`);
864
- }
865
- const identityResult = { pushed: 0, pulled: 0 };
866
- try {
867
- await cloudPushIdentityMeta(config);
868
- identityResult.pushed = await countRows("SELECT COUNT(*) as cnt FROM identity");
869
- } catch (err) {
870
- logError(`[cloud-sync] Identity push: ${err instanceof Error ? err.message : String(err)}`);
871
- }
872
- try {
873
- const pullResult2 = await cloudPullIdentityMeta(config);
874
- identityResult.pulled = pullResult2.pulled;
875
- } catch (err) {
876
- logError(`[cloud-sync] Identity pull: ${err instanceof Error ? err.message : String(err)}`);
877
- }
878
- const documentsResult = { pushed: 0, pulled: 0 };
879
- try {
880
- await cloudPushDocuments(config);
881
- documentsResult.pushed = await countRows("SELECT COUNT(*) as cnt FROM documents");
882
- } catch (err) {
883
- logError(`[cloud-sync] Documents push: ${err instanceof Error ? err.message : String(err)}`);
884
- }
885
- try {
886
- const pullResult2 = await cloudPullDocuments(config);
887
- documentsResult.pulled = pullResult2.pulled;
888
- } catch (err) {
889
- logError(`[cloud-sync] Documents pull: ${err instanceof Error ? err.message : String(err)}`);
890
- }
891
- const coreMemoryResult = { pushed: 0, pulled: 0 };
892
- try {
893
- await cloudPushCoreMemory(config);
894
- coreMemoryResult.pushed = await countRows("SELECT COUNT(*) as cnt FROM core_memory");
895
- } catch (err) {
896
- logError(`[cloud-sync] Core memory push: ${err instanceof Error ? err.message : String(err)}`);
897
- }
898
- try {
899
- const pullResult2 = await cloudPullCoreMemory(config);
900
- coreMemoryResult.pulled = pullResult2.pulled;
901
- } catch (err) {
902
- logError(`[cloud-sync] Core memory pull: ${err instanceof Error ? err.message : String(err)}`);
903
- }
904
- const rosterResult = { employees: 0, identities: 0 };
905
- try {
906
- const employees = await loadEmployees();
907
- rosterResult.employees = employees.length;
908
- const idDir = path.join(EXE_AI_DIR, "identity");
909
- if (existsSync(idDir)) {
910
- rosterResult.identities = readdirSync(idDir).filter((f) => f.endsWith(".md")).length;
808
+ const graphragResult = { pushed: 0, pulled: 0 };
809
+ try {
810
+ await cloudPushGraphRAG(config);
811
+ graphragResult.pushed = await countRows("SELECT COUNT(*) as cnt FROM entities");
812
+ } catch (err) {
813
+ logError(`[cloud-sync] GraphRAG push: ${err instanceof Error ? err.message : String(err)}`);
911
814
  }
912
- } catch (e) {
913
- process.stderr.write("[cloud-sync] roster count failed: " + (e instanceof Error ? e.message : String(e)) + "\n");
914
- }
915
- const totalMemories = await countRows("SELECT COUNT(*) as cnt FROM memories WHERE status = 'active' OR status IS NULL");
916
- try {
917
- const { getLatestBackup } = await import("./db-backup-MSQKO6M5.js");
918
- const latestBackup = getLatestBackup();
919
- if (latestBackup) {
920
- const backupSize = statSync(latestBackup).size;
921
- const MAX_CLOUD_BACKUP_BYTES = 50 * 1024 * 1024;
922
- if (backupSize <= MAX_CLOUD_BACKUP_BYTES) {
923
- const backupData = readFileSync(latestBackup);
924
- const deviceId = loadDeviceId() ?? "unknown";
925
- const encrypted = encryptSyncBlob(backupData);
926
- const backupRes = await fetchWithRetry(`${config.endpoint}/sync/push-db-backup`, {
927
- method: "POST",
928
- headers: { "Content-Type": "application/json", Authorization: `Bearer ${config.apiKey}` },
929
- body: JSON.stringify({
930
- device_id: deviceId,
931
- filename: path.basename(latestBackup),
932
- blob: encrypted,
933
- size: backupData.length
934
- })
935
- });
936
- if (backupRes && !backupRes.ok) {
937
- logError(`[cloud-sync] DB backup upload failed: ${backupRes.status}`);
815
+ try {
816
+ const pullResult2 = await cloudPullGraphRAG(config);
817
+ graphragResult.pulled = pullResult2.pulled;
818
+ } catch (err) {
819
+ logError(`[cloud-sync] GraphRAG pull: ${err instanceof Error ? err.message : String(err)}`);
820
+ }
821
+ const tasksResult = { pushed: 0, pulled: 0 };
822
+ try {
823
+ await cloudPushTasks(config);
824
+ tasksResult.pushed = await countRows("SELECT COUNT(*) as cnt FROM tasks");
825
+ } catch (err) {
826
+ logError(`[cloud-sync] Tasks push: ${err instanceof Error ? err.message : String(err)}`);
827
+ }
828
+ try {
829
+ const pullResult2 = await cloudPullTasks(config);
830
+ tasksResult.pulled = pullResult2.pulled;
831
+ } catch (err) {
832
+ logError(`[cloud-sync] Tasks pull: ${err instanceof Error ? err.message : String(err)}`);
833
+ }
834
+ const conversationsResult = { pushed: 0, pulled: 0 };
835
+ try {
836
+ await cloudPushConversations(config);
837
+ conversationsResult.pushed = await countRows("SELECT COUNT(*) as cnt FROM conversations");
838
+ } catch (err) {
839
+ logError(`[cloud-sync] Conversations push: ${err instanceof Error ? err.message : String(err)}`);
840
+ }
841
+ try {
842
+ const pullResult2 = await cloudPullConversations(config);
843
+ conversationsResult.pulled = pullResult2.pulled;
844
+ } catch (err) {
845
+ logError(`[cloud-sync] Conversations pull: ${err instanceof Error ? err.message : String(err)}`);
846
+ }
847
+ const schedulesResult = { pushed: 0, pulled: 0 };
848
+ try {
849
+ await cloudPushSchedules(config);
850
+ schedulesResult.pushed = await countRows("SELECT COUNT(*) as cnt FROM schedules");
851
+ } catch (err) {
852
+ logError(`[cloud-sync] Schedules push: ${err instanceof Error ? err.message : String(err)}`);
853
+ }
854
+ try {
855
+ const pullResult2 = await cloudPullSchedules(config);
856
+ schedulesResult.pulled = pullResult2.pulled;
857
+ } catch (err) {
858
+ logError(`[cloud-sync] Schedules pull: ${err instanceof Error ? err.message : String(err)}`);
859
+ }
860
+ const trajectoriesResult = { pushed: 0, pulled: 0 };
861
+ try {
862
+ await cloudPushTrajectories(config);
863
+ trajectoriesResult.pushed = await countRows("SELECT COUNT(*) as cnt FROM trajectories");
864
+ } catch (err) {
865
+ logError(`[cloud-sync] Trajectories push: ${err instanceof Error ? err.message : String(err)}`);
866
+ }
867
+ try {
868
+ const pullResult2 = await cloudPullTrajectories(config);
869
+ trajectoriesResult.pulled = pullResult2.pulled;
870
+ } catch (err) {
871
+ logError(`[cloud-sync] Trajectories pull: ${err instanceof Error ? err.message : String(err)}`);
872
+ }
873
+ const consolidationsResult = { pushed: 0, pulled: 0 };
874
+ try {
875
+ await cloudPushConsolidations(config);
876
+ consolidationsResult.pushed = await countRows("SELECT COUNT(*) as cnt FROM consolidations");
877
+ } catch (err) {
878
+ logError(`[cloud-sync] Consolidations push: ${err instanceof Error ? err.message : String(err)}`);
879
+ }
880
+ try {
881
+ const pullResult2 = await cloudPullConsolidations(config);
882
+ consolidationsResult.pulled = pullResult2.pulled;
883
+ } catch (err) {
884
+ logError(`[cloud-sync] Consolidations pull: ${err instanceof Error ? err.message : String(err)}`);
885
+ }
886
+ const identityResult = { pushed: 0, pulled: 0 };
887
+ try {
888
+ await cloudPushIdentityMeta(config);
889
+ identityResult.pushed = await countRows("SELECT COUNT(*) as cnt FROM identity");
890
+ } catch (err) {
891
+ logError(`[cloud-sync] Identity push: ${err instanceof Error ? err.message : String(err)}`);
892
+ }
893
+ try {
894
+ const pullResult2 = await cloudPullIdentityMeta(config);
895
+ identityResult.pulled = pullResult2.pulled;
896
+ } catch (err) {
897
+ logError(`[cloud-sync] Identity pull: ${err instanceof Error ? err.message : String(err)}`);
898
+ }
899
+ const documentsResult = { pushed: 0, pulled: 0 };
900
+ try {
901
+ await cloudPushDocuments(config);
902
+ documentsResult.pushed = await countRows("SELECT COUNT(*) as cnt FROM documents");
903
+ } catch (err) {
904
+ logError(`[cloud-sync] Documents push: ${err instanceof Error ? err.message : String(err)}`);
905
+ }
906
+ try {
907
+ const pullResult2 = await cloudPullDocuments(config);
908
+ documentsResult.pulled = pullResult2.pulled;
909
+ } catch (err) {
910
+ logError(`[cloud-sync] Documents pull: ${err instanceof Error ? err.message : String(err)}`);
911
+ }
912
+ const coreMemoryResult = { pushed: 0, pulled: 0 };
913
+ try {
914
+ await cloudPushCoreMemory(config);
915
+ coreMemoryResult.pushed = await countRows("SELECT COUNT(*) as cnt FROM core_memory");
916
+ } catch (err) {
917
+ logError(`[cloud-sync] Core memory push: ${err instanceof Error ? err.message : String(err)}`);
918
+ }
919
+ try {
920
+ const pullResult2 = await cloudPullCoreMemory(config);
921
+ coreMemoryResult.pulled = pullResult2.pulled;
922
+ } catch (err) {
923
+ logError(`[cloud-sync] Core memory pull: ${err instanceof Error ? err.message : String(err)}`);
924
+ }
925
+ const rosterResult = { employees: 0, identities: 0 };
926
+ try {
927
+ const employees = await loadEmployees();
928
+ rosterResult.employees = employees.length;
929
+ const idDir = path.join(EXE_AI_DIR, "identity");
930
+ if (existsSync(idDir)) {
931
+ rosterResult.identities = readdirSync(idDir).filter((f) => f.endsWith(".md")).length;
932
+ }
933
+ } catch (e) {
934
+ process.stderr.write("[cloud-sync] roster count failed: " + (e instanceof Error ? e.message : String(e)) + "\n");
935
+ }
936
+ const totalMemories = await countRows("SELECT COUNT(*) as cnt FROM memories WHERE status = 'active' OR status IS NULL");
937
+ try {
938
+ const { getLatestBackup } = await import("./db-backup-3ZQQPS5G.js");
939
+ const latestBackup = getLatestBackup();
940
+ if (latestBackup) {
941
+ const backupSize = statSync(latestBackup).size;
942
+ const MAX_CLOUD_BACKUP_BYTES = 50 * 1024 * 1024;
943
+ if (backupSize <= MAX_CLOUD_BACKUP_BYTES) {
944
+ const backupData = readFileSync(latestBackup);
945
+ const deviceId = loadDeviceId() ?? "unknown";
946
+ const encrypted = encryptSyncBlob(backupData);
947
+ const backupRes = await fetchWithRetry(`${config.endpoint}/sync/push-db-backup`, {
948
+ method: "POST",
949
+ headers: { "Content-Type": "application/json", Authorization: `Bearer ${config.apiKey}` },
950
+ body: JSON.stringify({
951
+ device_id: deviceId,
952
+ filename: path.basename(latestBackup),
953
+ blob: encrypted,
954
+ size: backupData.length
955
+ })
956
+ });
957
+ if (backupRes && !backupRes.ok) {
958
+ logError(`[cloud-sync] DB backup upload failed: ${backupRes.status}`);
959
+ }
938
960
  }
939
961
  }
962
+ } catch (err) {
963
+ logError(`[cloud-sync] DB backup upload error: ${err instanceof Error ? err.message : String(err)}`);
940
964
  }
941
- } catch (err) {
942
- logError(`[cloud-sync] DB backup upload error: ${err instanceof Error ? err.message : String(err)}`);
943
- }
944
- const codeContextResult = { pushed: 0, pulled: 0 };
945
- try {
946
- codeContextResult.pushed = await cloudPushCodeContext(config);
947
- } catch (err) {
948
- logError(`[cloud-sync] Code context push: ${err instanceof Error ? err.message : String(err)}`);
949
- }
950
- try {
951
- codeContextResult.pulled = await cloudPullCodeContext(config);
952
- } catch (err) {
953
- logError(`[cloud-sync] Code context pull: ${err instanceof Error ? err.message : String(err)}`);
965
+ const codeContextResult = { pushed: 0, pulled: 0 };
966
+ try {
967
+ codeContextResult.pushed = await cloudPushCodeContext(config);
968
+ } catch (err) {
969
+ logError(`[cloud-sync] Code context push: ${err instanceof Error ? err.message : String(err)}`);
970
+ }
971
+ try {
972
+ codeContextResult.pulled = await cloudPullCodeContext(config);
973
+ } catch (err) {
974
+ logError(`[cloud-sync] Code context pull: ${err instanceof Error ? err.message : String(err)}`);
975
+ }
976
+ return {
977
+ pushed,
978
+ pulled,
979
+ totalMemories,
980
+ behaviors: behaviorsResult,
981
+ graphrag: graphragResult,
982
+ tasks: tasksResult,
983
+ conversations: conversationsResult,
984
+ documents: documentsResult,
985
+ coreMemory: coreMemoryResult,
986
+ roster: rosterResult,
987
+ codeContext: codeContextResult
988
+ };
989
+ } finally {
990
+ _cloudSyncInProgress = false;
954
991
  }
955
- return {
956
- pushed,
957
- pulled,
958
- totalMemories,
959
- behaviors: behaviorsResult,
960
- graphrag: graphragResult,
961
- tasks: tasksResult,
962
- conversations: conversationsResult,
963
- documents: documentsResult,
964
- coreMemory: coreMemoryResult,
965
- roster: rosterResult,
966
- codeContext: codeContextResult
967
- };
968
992
  }
969
993
  var ROSTER_DELETIONS_PATH = path.join(EXE_AI_DIR, "roster-deletions.json");
970
994
  function recordRosterDeletion(name) {
@@ -1969,6 +1993,7 @@ async function cloudPullCoreMemory(config) {
1969
1993
  }
1970
1994
 
1971
1995
  export {
1996
+ disposeCloudSync,
1972
1997
  pushToPostgres,
1973
1998
  migrateEndpoint,
1974
1999
  assertSecureEndpoint,