@askexenow/exe-os 0.9.299 → 0.9.301

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 (499) hide show
  1. package/deploy/compose/.env.customer.example +1 -1
  2. package/deploy/compose/.env.example +1 -1
  3. package/deploy/compose/docker-compose.yml +31 -5
  4. package/deploy/compose/erp-nginx/nginx.conf +6 -3
  5. package/deploy/compose/generate-env.ts +1 -1
  6. package/deploy/compose/observability/otel-collector-config.yaml +10 -1
  7. package/deploy/compose/setup.sh +1 -1
  8. package/dist/active-agent-56J56WW5.js +27 -0
  9. package/dist/active-agent-UNJO6AJ2.js +27 -0
  10. package/dist/active-agent-VDWK7TES.js +28 -0
  11. package/dist/active-agent-Y5LSIMVC.js +28 -0
  12. package/dist/agentic-ontology-MZ4WHFDE.js +25 -0
  13. package/dist/agentic-ontology-QEV7GI3T.js +25 -0
  14. package/dist/assets/com.askexe.exed.plist +6 -5
  15. package/dist/backfill-metadata-IHKI5GXV.js +600 -0
  16. package/dist/backfill-metadata-RQZ4BN7G.js +600 -0
  17. package/dist/backfill-metadata-ZU3SZNBD.js +600 -0
  18. package/dist/behaviors-A3L5CWMK.js +46 -0
  19. package/dist/behaviors-G4KWGS24.js +46 -0
  20. package/dist/behaviors-WO67R6C4.js +46 -0
  21. package/dist/bin/agentic-ontology-backfill.js +5 -5
  22. package/dist/bin/agentic-reflection-backfill.js +6 -6
  23. package/dist/bin/agentic-semantic-label.js +5 -5
  24. package/dist/bin/backfill-conversations.js +6 -6
  25. package/dist/bin/backfill-responses.js +6 -6
  26. package/dist/bin/backfill-vectors.js +8 -8
  27. package/dist/bin/bulk-sync-postgres.js +13 -7
  28. package/dist/bin/cc-doctor.js +5 -5
  29. package/dist/bin/cleanup-stale-review-tasks.js +10 -10
  30. package/dist/bin/cli.js +16 -16
  31. package/dist/bin/deferred-daemon-restart.js +1 -1
  32. package/dist/bin/exe-agent-config.js +2 -2
  33. package/dist/bin/exe-agent.js +10 -10
  34. package/dist/bin/exe-assign.js +8 -8
  35. package/dist/bin/exe-boot.js +36 -21
  36. package/dist/bin/exe-call.js +4 -4
  37. package/dist/bin/exe-cloud.js +13 -7
  38. package/dist/bin/exe-dispatch.js +10 -10
  39. package/dist/bin/exe-doctor.js +2 -2
  40. package/dist/bin/exe-export-behaviors.js +7 -7
  41. package/dist/bin/exe-forget.js +6 -6
  42. package/dist/bin/exe-gateway.js +7 -7
  43. package/dist/bin/exe-healthcheck.js +5 -5
  44. package/dist/bin/exe-heartbeat.js +10 -10
  45. package/dist/bin/exe-kill.js +13 -13
  46. package/dist/bin/exe-launch-agent.js +29 -19
  47. package/dist/bin/exe-new-employee.js +6 -6
  48. package/dist/bin/exe-pending-messages.js +11 -11
  49. package/dist/bin/exe-pending-notifications.js +10 -10
  50. package/dist/bin/exe-pending-reviews.js +10 -10
  51. package/dist/bin/exe-rename.js +4 -4
  52. package/dist/bin/exe-review.js +12 -12
  53. package/dist/bin/exe-search.js +5 -5
  54. package/dist/bin/exe-session-cleanup.js +15 -15
  55. package/dist/bin/exe-settings.js +13 -7
  56. package/dist/bin/exe-start-codex.js +11 -11
  57. package/dist/bin/exe-start-opencode.js +8 -8
  58. package/dist/bin/exe-status.js +11 -11
  59. package/dist/bin/exe-team.js +3 -3
  60. package/dist/bin/exe-watchdog.js +3 -3
  61. package/dist/bin/git-sweep.js +11 -11
  62. package/dist/bin/graph-backfill.js +6 -6
  63. package/dist/bin/graph-export.js +5 -5
  64. package/dist/bin/import-history.js +9 -9
  65. package/dist/bin/install-launchd.js +7 -3
  66. package/dist/bin/install.js +19 -15
  67. package/dist/bin/intercom-check.js +4 -4
  68. package/dist/bin/mcp-sessions.js +2 -2
  69. package/dist/bin/orchestration-metrics.js +4 -4
  70. package/dist/bin/postgres-agentic-reflection-backfill.js +2 -2
  71. package/dist/bin/postgres-agentic-semantic-backfill.js +1 -1
  72. package/dist/bin/pre-publish.js +24 -1
  73. package/dist/bin/scan-tasks.js +10 -10
  74. package/dist/bin/setup.js +1 -1
  75. package/dist/bin/shard-migrate.js +4 -4
  76. package/dist/bin/stack-update.js +123 -3
  77. package/dist/bin/vps-health-gate.js +1 -1
  78. package/dist/capability-cards-VTGDTOZ4.js +89 -0
  79. package/dist/capability-cards-XAQSL26B.js +89 -0
  80. package/dist/capacity-monitor-6MQLFFQT.js +51 -0
  81. package/dist/capacity-monitor-BB3LKJLE.js +51 -0
  82. package/dist/capacity-monitor-G2MAJPRP.js +51 -0
  83. package/dist/catchup-brief-BQSL5M5S.js +175 -0
  84. package/dist/catchup-brief-COALBX6L.js +175 -0
  85. package/dist/catchup-brief-VBGEJQRS.js +175 -0
  86. package/dist/cc-binary-detect-B5JDCJ5J.js +19 -0
  87. package/dist/chunk-22LDUTY7.js +14597 -0
  88. package/dist/chunk-24JVDLQJ.js +345 -0
  89. package/dist/chunk-24M4AJPG.js +128 -0
  90. package/dist/chunk-2B7RCTPT.js +85 -0
  91. package/dist/chunk-2QBA6YE6.js +127 -0
  92. package/dist/chunk-2RGDEBZC.js +731 -0
  93. package/dist/chunk-2T3OYZMR.js +1158 -0
  94. package/dist/chunk-32DBQWR5.js +333 -0
  95. package/dist/chunk-3ABY3QDX.js +199 -0
  96. package/dist/chunk-3EOPMTG2.js +128 -0
  97. package/dist/chunk-3G3ECFB5.js +668 -0
  98. package/dist/chunk-3LHOFGHT.js +280 -0
  99. package/dist/chunk-3NS4V4JW.js +382 -0
  100. package/dist/chunk-3NYY2NZ3.js +836 -0
  101. package/dist/chunk-3RA62PNQ.js +58 -0
  102. package/dist/chunk-3ROUD5WA.js +97 -0
  103. package/dist/chunk-3RY2ARDN.js +129 -0
  104. package/dist/chunk-3XRS5AVV.js +567 -0
  105. package/dist/chunk-3Y5IRIRU.js +290 -0
  106. package/dist/chunk-3YK7X5FD.js +1186 -0
  107. package/dist/chunk-3ZWWUKBI.js +210 -0
  108. package/dist/chunk-463G3VAH.js +122 -0
  109. package/dist/chunk-4L6PVYFE.js +54 -0
  110. package/dist/chunk-4LC7BFI2.js +76 -0
  111. package/dist/chunk-4O67LBMK.js +377 -0
  112. package/dist/chunk-4OIU3N6U.js +167 -0
  113. package/dist/chunk-4Z3FWLOE.js +836 -0
  114. package/dist/chunk-5BAU4T5G.js +208 -0
  115. package/dist/chunk-5FP7YHCG.js +1158 -0
  116. package/dist/chunk-5SYYMNPE.js +30 -0
  117. package/dist/chunk-5TO5PH7O.js +304 -0
  118. package/dist/chunk-5U3JZP62.js +1352 -0
  119. package/dist/chunk-5VNFXIGF.js +85 -0
  120. package/dist/chunk-5XD2Y463.js +402 -0
  121. package/dist/chunk-63AENHJC.js +123 -0
  122. package/dist/chunk-673IFJYB.js +731 -0
  123. package/dist/chunk-6UVUJNLY.js +1186 -0
  124. package/dist/chunk-7AWH47AR.js +448 -0
  125. package/dist/chunk-7KPWYWYL.js +290 -0
  126. package/dist/chunk-7P4B6AEP.js +227 -0
  127. package/dist/chunk-7URNGDEY.js +2145 -0
  128. package/dist/chunk-7VHOALNC.js +244 -0
  129. package/dist/chunk-ADZQBZOX.js +122 -0
  130. package/dist/chunk-APSZAEDO.js +1186 -0
  131. package/dist/chunk-ASHF6VO4.js +2265 -0
  132. package/dist/chunk-ASJHCAVL.js +38 -0
  133. package/dist/chunk-BT2LEHIW.js +448 -0
  134. package/dist/chunk-BTS5QUWB.js +50 -0
  135. package/dist/chunk-BWJDJ3BS.js +604 -0
  136. package/dist/chunk-CME46VWP.js +150 -0
  137. package/dist/chunk-D3ICCKXY.js +54 -0
  138. package/dist/chunk-D3IOU3NO.js +377 -0
  139. package/dist/chunk-DFGXRKI2.js +221 -0
  140. package/dist/chunk-DICIFTCS.js +150 -0
  141. package/dist/chunk-DIFI5JDC.js +76 -0
  142. package/dist/chunk-DO65VHQZ.js +128 -0
  143. package/dist/chunk-DPOIJ5SM.js +284 -0
  144. package/dist/chunk-E2OMUBXQ.js +567 -0
  145. package/dist/chunk-ECMXIV6N.js +97 -0
  146. package/dist/chunk-EDMVA3PT.js +727 -0
  147. package/dist/chunk-F5OSXH4A.js +4388 -0
  148. package/dist/chunk-F5OWHPRG.js +236 -0
  149. package/dist/chunk-F7MZA3QP.js +199 -0
  150. package/dist/chunk-FAZNXNA5.js +33 -0
  151. package/dist/chunk-FCHG5RC4.js +197 -0
  152. package/dist/chunk-FFKSPZO2.js +157 -0
  153. package/dist/chunk-FNHYH5U6.js +331 -0
  154. package/dist/chunk-FRNXQSB4.js +134 -0
  155. package/dist/chunk-FTAASABV.js +362 -0
  156. package/dist/chunk-FWPDAQ6Q.js +1350 -0
  157. package/dist/chunk-FZB73QOI.js +210 -0
  158. package/dist/chunk-GBL5QSTM.js +197 -0
  159. package/dist/chunk-GJBR6QLD.js +630 -0
  160. package/dist/chunk-GRSYAHKI.js +535 -0
  161. package/dist/chunk-GRXWINOW.js +244 -0
  162. package/dist/chunk-GUPNVUG5.js +348 -0
  163. package/dist/chunk-GY66UPMX.js +167 -0
  164. package/dist/chunk-HCCG67BY.js +43 -0
  165. package/dist/chunk-HCSZZXZZ.js +197 -0
  166. package/dist/chunk-HNGNZU62.js +240 -0
  167. package/dist/chunk-HP2D5LIE.js +214 -0
  168. package/dist/chunk-HUABQHDC.js +1352 -0
  169. package/dist/chunk-HYKO2LNW.js +157 -0
  170. package/dist/chunk-IFL6DG2K.js +181 -0
  171. package/dist/chunk-IKPQRHVQ.js +304 -0
  172. package/dist/chunk-J5HFRVNW.js +362 -0
  173. package/dist/chunk-J6SD7LT2.js +171 -0
  174. package/dist/chunk-JCWA3X6A.js +402 -0
  175. package/dist/chunk-JHPK33IP.js +2162 -0
  176. package/dist/chunk-JURL2S27.js +128 -0
  177. package/dist/chunk-JWGDH5I2.js +127 -0
  178. package/dist/chunk-KBXQFXYM.js +567 -0
  179. package/dist/chunk-KGY5QIOJ.js +1350 -0
  180. package/dist/chunk-KLES22FB.js +1094 -0
  181. package/dist/chunk-KPUYYOFS.js +122 -0
  182. package/dist/chunk-KY43UELJ.js +331 -0
  183. package/dist/chunk-L32V4O5Z.js +58 -0
  184. package/dist/chunk-LAFARYU5.js +456 -0
  185. package/dist/chunk-LC7ETNTJ.js +1350 -0
  186. package/dist/chunk-LEJ5FKIK.js +55 -0
  187. package/dist/chunk-LNLLCAI4.js +377 -0
  188. package/dist/chunk-LQWZYMNU.js +448 -0
  189. package/dist/chunk-LSDXEHKL.js +381 -0
  190. package/dist/chunk-LY3SOO73.js +76 -0
  191. package/dist/chunk-M6CIHXXB.js +159 -0
  192. package/dist/chunk-MJOQ35DX.js +427 -0
  193. package/dist/chunk-MO5HER5Y.js +345 -0
  194. package/dist/chunk-MS2EOZJQ.js +290 -0
  195. package/dist/chunk-MUIMJGSQ.js +128 -0
  196. package/dist/chunk-MY4TGLT6.js +284 -0
  197. package/dist/chunk-N3ARGCVG.js +345 -0
  198. package/dist/chunk-N4XG2M2U.js +735 -0
  199. package/dist/chunk-N72JNFJ4.js +535 -0
  200. package/dist/chunk-NJMPNYBS.js +427 -0
  201. package/dist/chunk-NM3AUMFE.js +2145 -0
  202. package/dist/chunk-NPPQ3TR4.js +735 -0
  203. package/dist/chunk-NTWF4DAF.js +581 -0
  204. package/dist/chunk-NXL3VKXM.js +331 -0
  205. package/dist/chunk-OJACH2JF.js +128 -0
  206. package/dist/chunk-OMSLHEEF.js +456 -0
  207. package/dist/chunk-OO4IFABD.js +382 -0
  208. package/dist/chunk-OYIP3QVN.js +167 -0
  209. package/dist/chunk-P2IOW54H.js +668 -0
  210. package/dist/chunk-P5KXQ3RN.js +731 -0
  211. package/dist/chunk-P5UXP53T.js +81 -0
  212. package/dist/chunk-PH6VRRFR.js +395 -0
  213. package/dist/chunk-Q3GKOF7Z.js +85 -0
  214. package/dist/chunk-Q65NCNL4.js +1352 -0
  215. package/dist/chunk-QIGS2LRT.js +735 -0
  216. package/dist/chunk-QKBN3CY2.js +381 -0
  217. package/dist/chunk-QNNAVMQH.js +1094 -0
  218. package/dist/chunk-QODDW4YI.js +171 -0
  219. package/dist/chunk-QPAYPTSH.js +2162 -0
  220. package/dist/chunk-QRWDJ5RI.js +381 -0
  221. package/dist/chunk-RBFZCHVB.js +105 -0
  222. package/dist/chunk-RCEULTPF.js +185 -0
  223. package/dist/chunk-RCGHXBCX.js +630 -0
  224. package/dist/chunk-ROSCLRTH.js +204 -0
  225. package/dist/chunk-RYAOSGUW.js +227 -0
  226. package/dist/chunk-S2SPGHPY.js +38 -0
  227. package/dist/chunk-S73ZAJ2S.js +262 -0
  228. package/dist/chunk-SBPEWD7Z.js +171 -0
  229. package/dist/chunk-SDPUWZP5.js +333 -0
  230. package/dist/chunk-SJ4UF7YK.js +1094 -0
  231. package/dist/chunk-SOZ7D77I.js +204 -0
  232. package/dist/chunk-SVLSHDNL.js +54 -0
  233. package/dist/chunk-SVUYBT5N.js +262 -0
  234. package/dist/chunk-T7PTLVJV.js +284 -0
  235. package/dist/chunk-TDX2LK2M.js +240 -0
  236. package/dist/chunk-TGUSLO4B.js +50 -0
  237. package/dist/chunk-TPJH6PE6.js +1158 -0
  238. package/dist/chunk-TVW7EDOJ.js +382 -0
  239. package/dist/chunk-TYRUIE6P.js +58 -0
  240. package/dist/chunk-U5RKGLV6.js +50 -0
  241. package/dist/chunk-UFGTHBHP.js +127 -0
  242. package/dist/chunk-ULCYWCPI.js +1079 -0
  243. package/dist/chunk-UN5EPVBN.js +14597 -0
  244. package/dist/chunk-URLH7ZVR.js +70 -0
  245. package/dist/chunk-USYRTGR7.js +402 -0
  246. package/dist/chunk-V4ABCEHM.js +30 -0
  247. package/dist/chunk-V6LOEOXG.js +3372 -0
  248. package/dist/chunk-VAZOVAW4.js +2162 -0
  249. package/dist/chunk-VEUQVKKT.js +185 -0
  250. package/dist/chunk-VIDDJ5RF.js +214 -0
  251. package/dist/chunk-VKCNXOQ6.js +214 -0
  252. package/dist/chunk-VNB4ROYG.js +348 -0
  253. package/dist/chunk-VWUQFZFB.js +395 -0
  254. package/dist/chunk-W77GRCNA.js +85 -0
  255. package/dist/chunk-WB2B25UM.js +230 -0
  256. package/dist/chunk-WCUZX7F7.js +204 -0
  257. package/dist/chunk-WL5RMOZQ.js +362 -0
  258. package/dist/chunk-WPAXAOHD.js +1079 -0
  259. package/dist/chunk-WVMG4ZRH.js +14597 -0
  260. package/dist/chunk-WYVOTRRZ.js +129 -0
  261. package/dist/chunk-XABJRAUW.js +3346 -0
  262. package/dist/chunk-XQQ7D4I4.js +85 -0
  263. package/dist/chunk-YDFY6YCH.js +280 -0
  264. package/dist/chunk-YGUMRYCN.js +33 -0
  265. package/dist/chunk-YHJPTIPR.js +836 -0
  266. package/dist/chunk-YJSP5PPG.js +128 -0
  267. package/dist/chunk-YLKS7KKC.js +2145 -0
  268. package/dist/chunk-YOMETWOJ.js +4388 -0
  269. package/dist/chunk-YU3KEVCO.js +333 -0
  270. package/dist/chunk-Z4FVFSE3.js +81 -0
  271. package/dist/chunk-Z4TLSNUW.js +244 -0
  272. package/dist/chunk-ZDPU3JTF.js +221 -0
  273. package/dist/chunk-ZDY4LYAJ.js +81 -0
  274. package/dist/chunk-ZG33AACD.js +70 -0
  275. package/dist/chunk-ZKHPZ6KN.js +181 -0
  276. package/dist/chunk-ZO2TM5N5.js +97 -0
  277. package/dist/chunk-ZP6T5K6I.js +535 -0
  278. package/dist/chunk-ZR6ZJT32.js +123 -0
  279. package/dist/chunk-ZSUACDQC.js +4388 -0
  280. package/dist/co-activation-JGF5YIDU.js +74 -0
  281. package/dist/co-activation-XM25BLZM.js +74 -0
  282. package/dist/co-occurrence-CKEMDPWO.js +95 -0
  283. package/dist/co-occurrence-HLLC6GT2.js +95 -0
  284. package/dist/co-occurrence-W2LIAPHI.js +95 -0
  285. package/dist/code-context-index-FCL47WKE.js +30 -0
  286. package/dist/conversation-entity-extractor-WC2RU6RS.js +114 -0
  287. package/dist/core-memory-CRSR2PSL.js +110 -0
  288. package/dist/core-memory-VSKFRMEV.js +110 -0
  289. package/dist/core-memory-ZDA76EU3.js +110 -0
  290. package/dist/crdt-sync-6VH2YDVY.js +33 -0
  291. package/dist/crdt-sync-BJKZB6T6.js +33 -0
  292. package/dist/crm-webhook-E5PAFAUN.js +10 -0
  293. package/dist/crm-webhook-RXFPZJXP.js +10 -0
  294. package/dist/crm-webhook-Z26LEFKG.js +10 -0
  295. package/dist/cto-delegation-gate-45IBLPTK.js +280 -0
  296. package/dist/cto-delegation-gate-EMY6ZZ2F.js +280 -0
  297. package/dist/cto-delegation-gate-SF4EUB2Q.js +280 -0
  298. package/dist/daemon-orchestration-VB3BLYIT.js +143 -0
  299. package/dist/daemon-orchestration-W66UYGUD.js +143 -0
  300. package/dist/daemon-orchestration-Y5Y6YNE3.js +143 -0
  301. package/dist/db-backup-HFJ53IBU.js +43 -0
  302. package/dist/db-backup-NVUTS7L5.js +43 -0
  303. package/dist/doc-graph-extractor-ID45AQ2P.js +133 -0
  304. package/dist/doc-graph-extractor-MLYQYT4B.js +133 -0
  305. package/dist/doc-graph-extractor-SVFSXKL6.js +133 -0
  306. package/dist/dreaming-AZYRAGKA.js +34 -0
  307. package/dist/dreaming-N6B7KBIE.js +34 -0
  308. package/dist/dreaming-WG5CDUHX.js +34 -0
  309. package/dist/entity-boost-XAFCDDB6.js +375 -0
  310. package/dist/exe-drift-3SGA53CL.js +70 -0
  311. package/dist/exe-drift-CPUEAPIU.js +70 -0
  312. package/dist/exe-export-4RTGDV53.js +77 -0
  313. package/dist/exe-export-APUNLKWF.js +77 -0
  314. package/dist/exe-export-NM4SXB3P.js +77 -0
  315. package/dist/exe-import-6GLNCP62.js +80 -0
  316. package/dist/exe-import-AZMIF34Z.js +80 -0
  317. package/dist/exe-import-U4H4ES3Z.js +80 -0
  318. package/dist/exe-key-FIPXUTMF.js +673 -0
  319. package/dist/exe-key-LJV23AJI.js +673 -0
  320. package/dist/exe-key-WTLCMOYJ.js +673 -0
  321. package/dist/exe-snapshot-ILO3WSEC.js +338 -0
  322. package/dist/exe-snapshot-IODRQLBX.js +338 -0
  323. package/dist/exe-snapshot-ZOZBW7V6.js +338 -0
  324. package/dist/fast-db-init-7LYYUCSJ.js +7 -0
  325. package/dist/fast-db-init-ATRZGHOL.js +7 -0
  326. package/dist/fast-db-init-IU7GYFWB.js +7 -0
  327. package/dist/gateway/index.js +11 -11
  328. package/dist/git-staleness-GGCFPHQ5.js +112 -0
  329. package/dist/git-staleness-XNOKI4D3.js +112 -0
  330. package/dist/git-task-sweep-3MO4OVND.js +42 -0
  331. package/dist/git-task-sweep-M3SWXFKJ.js +42 -0
  332. package/dist/git-task-sweep-Y6KNWB67.js +42 -0
  333. package/dist/global-procedures-626WAU3I.js +22 -0
  334. package/dist/global-procedures-EBAPPWGZ.js +22 -0
  335. package/dist/graph-auto-extract-TKHQ4OR3.js +183 -0
  336. package/dist/graph-auto-extract-VGFEWFZX.js +183 -0
  337. package/dist/graph-auto-extract-VJOUQBPK.js +183 -0
  338. package/dist/graph-rag-KECA5TE4.js +35 -0
  339. package/dist/hooks/bug-report-worker.js +12 -12
  340. package/dist/hooks/codex-stop-task-finalizer.js +12 -12
  341. package/dist/hooks/commit-complete.js +12 -12
  342. package/dist/hooks/error-recall.js +6 -6
  343. package/dist/hooks/exe-heartbeat-hook.js +3 -3
  344. package/dist/hooks/ingest-worker.js +3 -3
  345. package/dist/hooks/ingest.js +6 -6
  346. package/dist/hooks/instructions-loaded.js +4 -4
  347. package/dist/hooks/manifest.json +20 -20
  348. package/dist/hooks/notification.js +4 -4
  349. package/dist/hooks/post-compact.js +12 -12
  350. package/dist/hooks/post-tool-combined.js +6 -6
  351. package/dist/hooks/pre-compact.js +16 -16
  352. package/dist/hooks/pre-tool-use.js +15 -15
  353. package/dist/hooks/prompt-submit.js +28 -26
  354. package/dist/hooks/session-end.js +20 -20
  355. package/dist/hooks/session-start.js +12 -12
  356. package/dist/hooks/stop.js +18 -18
  357. package/dist/hooks/subagent-stop.js +11 -11
  358. package/dist/hooks/summary-worker.js +18 -18
  359. package/dist/index.js +20 -20
  360. package/dist/installer-37KFNAWE.js +344 -0
  361. package/dist/installer-3FB5EMPB.js +40 -0
  362. package/dist/installer-BRQ42CPB.js +344 -0
  363. package/dist/installer-F55NR4E2.js +298 -0
  364. package/dist/installer-KOYBUS4J.js +40 -0
  365. package/dist/installer-PXZJG256.js +298 -0
  366. package/dist/lib/cloud-sync.js +13 -7
  367. package/dist/lib/consolidation.js +7 -7
  368. package/dist/lib/database.js +6 -4
  369. package/dist/lib/db-daemon-client.js +11 -202
  370. package/dist/lib/db.js +6 -4
  371. package/dist/lib/embedder.js +3 -3
  372. package/dist/lib/employee-templates.js +4 -4
  373. package/dist/lib/employees.js +2 -2
  374. package/dist/lib/exe-daemon-client.js +2 -2
  375. package/dist/lib/exe-daemon.js +53 -51
  376. package/dist/lib/hybrid-search.js +5 -5
  377. package/dist/lib/identity.js +2 -2
  378. package/dist/lib/messaging.js +10 -10
  379. package/dist/lib/reminders.js +3 -3
  380. package/dist/lib/schedules.js +5 -5
  381. package/dist/lib/session-registry.js +4 -4
  382. package/dist/lib/skill-learning.js +6 -6
  383. package/dist/lib/store.js +4 -4
  384. package/dist/lib/task-router.js +3 -3
  385. package/dist/lib/tasks.js +11 -11
  386. package/dist/lib/tmux-routing.js +9 -9
  387. package/dist/lib/token-spend.js +3 -3
  388. package/dist/mcp/register-tools.js +65 -63
  389. package/dist/mcp/server.js +66 -64
  390. package/dist/mcp/tools/complete-reminder.js +4 -4
  391. package/dist/mcp/tools/create-reminder.js +4 -4
  392. package/dist/mcp/tools/create-task.js +13 -13
  393. package/dist/mcp/tools/deactivate-behavior.js +7 -7
  394. package/dist/mcp/tools/list-reminders.js +4 -4
  395. package/dist/mcp/tools/list-tasks.js +13 -13
  396. package/dist/mcp/tools/send-message.js +12 -12
  397. package/dist/mcp/tools/update-task.js +12 -12
  398. package/dist/mcp-http-config-7KJZI7UD.js +31 -0
  399. package/dist/mcp-http-config-OF3MB7M5.js +31 -0
  400. package/dist/memory-cards-CPIZVXWI.js +180 -0
  401. package/dist/memory-cards-ZIT7ZKL5.js +180 -0
  402. package/dist/memory-graph-extractor-JIYWLBFF.js +22 -0
  403. package/dist/memory-graph-extractor-LY2VORZT.js +22 -0
  404. package/dist/memory-graph-extractor-MDPSLZDM.js +22 -0
  405. package/dist/memory-poisoning-defense-5UZT3WWA.js +224 -0
  406. package/dist/memory-poisoning-defense-SEM25TY5.js +224 -0
  407. package/dist/memory-queue-client-WKWRFERJ.js +16 -0
  408. package/dist/memory-reflection-J2W7CJ7C.js +244 -0
  409. package/dist/memory-reflection-TA2VQYPH.js +244 -0
  410. package/dist/message-queue-client-IFQQ2HI7.js +92 -0
  411. package/dist/notifications-CZBQ3H5T.js +47 -0
  412. package/dist/notifications-EIIL2EQV.js +47 -0
  413. package/dist/notifications-RLMSI4YE.js +47 -0
  414. package/dist/orchestration-events-TGQYA72K.js +27 -0
  415. package/dist/orchestration-events-VUYR6MXE.js +27 -0
  416. package/dist/orchestrator-JQD5G3CW.js +35 -0
  417. package/dist/orchestrator-MAMR4C37.js +35 -0
  418. package/dist/orchestrator-VE5WHEJH.js +35 -0
  419. package/dist/pipeline-router-3Q3YBYSM.js +15 -0
  420. package/dist/pipeline-router-DKXD6DJO.js +15 -0
  421. package/dist/pipeline-router-YNW63BY5.js +15 -0
  422. package/dist/plan-limits-YGXTYCW4.js +28 -0
  423. package/dist/plan-limits-ZM4MNZKY.js +28 -0
  424. package/dist/project-boot-E2TWYTAC.js +299 -0
  425. package/dist/project-boot-TDOZKKDR.js +299 -0
  426. package/dist/projection-worker-TMKUSVGD.js +1084 -0
  427. package/dist/projection-worker-WFPRM4AI.js +1084 -0
  428. package/dist/projection-worker-YKV3PFCV.js +1084 -0
  429. package/dist/prospective-memory-CNJDBNWF.js +232 -0
  430. package/dist/prospective-memory-OAFZUODU.js +232 -0
  431. package/dist/reranker-AFU75HEX.js +19 -0
  432. package/dist/reranker-RYNSJNDF.js +19 -0
  433. package/dist/reranker-YQIRNGDM.js +19 -0
  434. package/dist/retrieval-health-M5BVB7EV.js +12 -0
  435. package/dist/retrieval-health-RSQEIYIB.js +12 -0
  436. package/dist/review-polling-LGX7DUNT.js +126 -0
  437. package/dist/review-polling-MJBCYV4I.js +126 -0
  438. package/dist/review-polling-ZMB3OBPC.js +126 -0
  439. package/dist/runtime/index.js +16 -16
  440. package/dist/services/codex-reviewd/index.js +855 -0
  441. package/dist/session-events-5N47BRFK.js +38 -0
  442. package/dist/session-events-PT6SVS2P.js +38 -0
  443. package/dist/session-events-UTMCKDIN.js +38 -0
  444. package/dist/session-kill-telemetry-FRQA5MVD.js +31 -0
  445. package/dist/session-kill-telemetry-HKL2NQMR.js +31 -0
  446. package/dist/session-scope-2BD6QLNI.js +88 -0
  447. package/dist/session-scope-GQNCM6UQ.js +88 -0
  448. package/dist/session-scope-MMGM232A.js +88 -0
  449. package/dist/setup-wizard-SELXXVLD.js +12 -0
  450. package/dist/setup-wizard-W64I6SHC.js +12 -0
  451. package/dist/setup-wizard-X7YSRDNQ.js +12 -0
  452. package/dist/skill-refinement-CCP4ULZ3.js +159 -0
  453. package/dist/skill-refinement-FXCXTUS2.js +159 -0
  454. package/dist/skill-refinement-WCPDNHZ5.js +159 -0
  455. package/dist/stack-update-5VSGG36W.js +84 -0
  456. package/dist/steward-gate-JDR3SLH3.js +15 -0
  457. package/dist/steward-gate-PIXNK4BK.js +15 -0
  458. package/dist/task-enforcement-LEBWCYZT.js +506 -0
  459. package/dist/task-enforcement-VOSQRAQB.js +506 -0
  460. package/dist/task-enforcement-WCEA4FZI.js +506 -0
  461. package/dist/task-scope-CQZ33PRU.js +37 -0
  462. package/dist/task-scope-JTTEZKDU.js +37 -0
  463. package/dist/task-scope-L5GDL2AV.js +37 -0
  464. package/dist/tasks-crud-DC4GCXQQ.js +79 -0
  465. package/dist/tasks-crud-S36AFYYM.js +79 -0
  466. package/dist/tasks-crud-T32IRPXF.js +79 -0
  467. package/dist/tasks-notify-OBFVHJDP.js +40 -0
  468. package/dist/tasks-notify-OUQWUM6W.js +40 -0
  469. package/dist/tasks-notify-W2W2BJRB.js +40 -0
  470. package/dist/tasks-review-34WV7BX2.js +49 -0
  471. package/dist/tasks-review-N33MTHWJ.js +49 -0
  472. package/dist/tasks-review-OSBG2YN2.js +49 -0
  473. package/dist/telemetry-upload-3CSVO3J7.js +741 -0
  474. package/dist/telemetry-upload-EYHEWTKG.js +741 -0
  475. package/dist/telemetry-upload-XLBW4DRP.js +741 -0
  476. package/dist/token-budget-I6FMMDFX.js +86 -0
  477. package/dist/token-budget-ZG2MQ5GD.js +86 -0
  478. package/dist/tool-capability-index-IWQBQKM7.js +10 -0
  479. package/dist/tool-telemetry-2E3Z7CRV.js +17 -0
  480. package/dist/tool-telemetry-ODL4F2CW.js +17 -0
  481. package/dist/tui/App.js +17 -17
  482. package/dist/tui-data-VWT4Q5UT.js +260 -0
  483. package/dist/tui-data-XFBFBSBE.js +260 -0
  484. package/dist/tui-data-Z5UF7KEI.js +260 -0
  485. package/dist/wiki-acl-EUOPNUIQ.js +111 -0
  486. package/dist/wiki-acl-SZFHCEC4.js +111 -0
  487. package/dist/worker-gate-OOO6BWZ6.js +21 -0
  488. package/dist/worker-gate-OQMKAMP7.js +21 -0
  489. package/dist/worker-gate-ZPP3SZK6.js +21 -0
  490. package/dist/workflow-engine-P7WYJP2B.js +28 -0
  491. package/dist/workflow-engine-QY3IFFR2.js +28 -0
  492. package/dist/workflow-engine-UYNB5RTB.js +28 -0
  493. package/dist/worktree-CNOQZBNT.js +28 -0
  494. package/dist/worktree-H5C4LMQR.js +28 -0
  495. package/dist/worktree-sweep-KFWF3XZD.js +21 -0
  496. package/dist/worktree-sweep-SE7ITXC4.js +21 -0
  497. package/package.json +1 -1
  498. package/release-notes.json +117 -191
  499. package/src/commands/exe.md +18 -1
@@ -0,0 +1,157 @@
1
+ import {
2
+ clean,
3
+ stableId
4
+ } from "./chunk-SVUYBT5N.js";
5
+
6
+ // src/lib/reflection-checkpoints.ts
7
+ function parsePayload(payload) {
8
+ if (!payload) return {};
9
+ try {
10
+ return JSON.parse(payload);
11
+ } catch {
12
+ return {};
13
+ }
14
+ }
15
+ function semanticArray(event, key) {
16
+ const payload = parsePayload(event.payload);
17
+ const semantic = payload.semantic;
18
+ const value = semantic?.[key];
19
+ return Array.isArray(value) ? value.map(String).filter(Boolean) : [];
20
+ }
21
+ function buildReflectionCheckpoint(events) {
22
+ if (!events.length) return null;
23
+ const sorted = [...events].sort((a, b) => a.occurred_at.localeCompare(b.occurred_at));
24
+ const first = sorted[0];
25
+ const last = sorted[sorted.length - 1];
26
+ const goals = /* @__PURE__ */ new Set();
27
+ const successes = [];
28
+ const failures = [];
29
+ const risks = [];
30
+ const nextActions = [];
31
+ const decisions = [];
32
+ for (const event of sorted) {
33
+ for (const goal of semanticArray(event, "goals")) goals.add(goal);
34
+ for (const item of semanticArray(event, "successSignals")) successes.push(item);
35
+ for (const item of semanticArray(event, "failureSignals")) failures.push(item);
36
+ for (const item of semanticArray(event, "nextActions")) nextActions.push(item);
37
+ for (const item of semanticArray(event, "decisions")) decisions.push(item);
38
+ if (event.impact === "negative" || event.outcome === "failure_signal" || event.event_type === "problem" || event.event_type === "error") {
39
+ failures.push(event.outcome || event.intention || event.event_type);
40
+ }
41
+ if (event.outcome === "risk_signal") risks.push(event.intention || event.outcome);
42
+ if (event.impact === "positive" || event.outcome === "success_signal" || event.event_type === "milestone") {
43
+ successes.push(event.outcome || event.intention || event.event_type);
44
+ }
45
+ }
46
+ const uniqueGoals = [...goals].slice(0, 6);
47
+ const uniqueSuccesses = [...new Set(successes.map((x) => clean(x, 180)).filter(Boolean))].slice(0, 6);
48
+ const uniqueFailures = [...new Set(failures.map((x) => clean(x, 180)).filter(Boolean))].slice(0, 6);
49
+ const uniqueRisks = [...new Set(risks.map((x) => clean(x, 180)).filter(Boolean))].slice(0, 6);
50
+ const uniqueNext = [...new Set(nextActions.map((x) => clean(x, 180)).filter(Boolean))].slice(0, 6);
51
+ const uniqueDecisions = [...new Set(decisions.map((x) => clean(x, 180)).filter(Boolean))].slice(0, 6);
52
+ const learnings = [
53
+ uniqueSuccesses.length ? `Working: ${uniqueSuccesses.slice(0, 3).join("; ")}` : "Working: no strong success signal yet",
54
+ uniqueFailures.length ? `Improve: ${uniqueFailures.slice(0, 3).join("; ")}` : "Improve: no strong failure signal in this window",
55
+ uniqueDecisions.length ? `Decision context: ${uniqueDecisions.slice(0, 2).join("; ")}` : "Decision context: no explicit decision signal"
56
+ ];
57
+ const summary = clean([
58
+ `Window ${first.occurred_at} \u2192 ${last.occurred_at}`,
59
+ `${sorted.length} events`,
60
+ uniqueGoals.length ? `goals: ${uniqueGoals.join("; ")}` : "goals: inferred from event trajectory",
61
+ uniqueSuccesses.length ? `successes: ${uniqueSuccesses.slice(0, 2).join("; ")}` : "successes: none explicit",
62
+ uniqueFailures.length ? `failures: ${uniqueFailures.slice(0, 2).join("; ")}` : "failures: none explicit"
63
+ ].join(". "), 1200);
64
+ return {
65
+ id: stableId("reflection", first.project_name ?? "", first.session_id ?? "", first.occurred_at, last.occurred_at, sorted.length),
66
+ projectName: first.project_name ?? null,
67
+ sessionId: first.session_id ?? null,
68
+ windowStartAt: first.occurred_at,
69
+ windowEndAt: last.occurred_at,
70
+ eventCount: sorted.length,
71
+ goalCount: uniqueGoals.length,
72
+ successCount: uniqueSuccesses.length,
73
+ failureCount: uniqueFailures.length,
74
+ riskCount: uniqueRisks.length,
75
+ summary,
76
+ learnings,
77
+ nextActions: uniqueNext.length ? uniqueNext : ["Continue from latest successful event and resolve highest-impact failure/risk first."],
78
+ evidenceEventIds: sorted.slice(-25).map((e) => e.id),
79
+ confidence: Math.min(0.95, 0.5 + Math.min(sorted.length, 100) / 250 + uniqueGoals.length * 0.03)
80
+ };
81
+ }
82
+ async function resolveClient(client) {
83
+ if (client) return client;
84
+ const { getClient } = await import("./lib/database.js");
85
+ return getClient();
86
+ }
87
+ async function insertReflectionCheckpoint(checkpoint, client) {
88
+ const db = await resolveClient(client);
89
+ const now = (/* @__PURE__ */ new Date()).toISOString();
90
+ await db.execute({
91
+ sql: `INSERT INTO agent_reflection_checkpoints
92
+ (id, project_name, session_id, window_start_at, window_end_at, event_count, goal_count,
93
+ success_count, failure_count, risk_count, summary, learnings, next_actions, evidence_event_ids,
94
+ confidence, created_at)
95
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
96
+ ON CONFLICT(id) DO UPDATE SET summary = excluded.summary, learnings = excluded.learnings,
97
+ next_actions = excluded.next_actions, confidence = excluded.confidence`,
98
+ args: [
99
+ checkpoint.id,
100
+ checkpoint.projectName,
101
+ checkpoint.sessionId,
102
+ checkpoint.windowStartAt,
103
+ checkpoint.windowEndAt,
104
+ checkpoint.eventCount,
105
+ checkpoint.goalCount,
106
+ checkpoint.successCount,
107
+ checkpoint.failureCount,
108
+ checkpoint.riskCount,
109
+ checkpoint.summary,
110
+ JSON.stringify(checkpoint.learnings),
111
+ JSON.stringify(checkpoint.nextActions),
112
+ JSON.stringify(checkpoint.evidenceEventIds),
113
+ checkpoint.confidence,
114
+ now
115
+ ]
116
+ });
117
+ }
118
+ async function generateReflectionCheckpoints(opts = {}) {
119
+ const db = await resolveClient(opts.client);
120
+ const windowSize = opts.windowSize ?? 100;
121
+ const minEvents = opts.minEvents ?? 20;
122
+ const limit = opts.limit ?? 5e3;
123
+ const where = opts.projectName ? "WHERE project_name = ?" : "";
124
+ const args = opts.projectName ? [opts.projectName] : [];
125
+ const result = await db.execute({
126
+ sql: `SELECT id, event_type, occurred_at, actor_agent_id, project_name, session_id, intention, outcome, impact, evidence_memory_id, payload
127
+ FROM agent_events ${where}
128
+ ORDER BY project_name, session_id, occurred_at, sequence_index
129
+ LIMIT ?`,
130
+ args: [...args, limit]
131
+ });
132
+ const groups = /* @__PURE__ */ new Map();
133
+ for (const row of result.rows) {
134
+ const event = row;
135
+ const key = `${event.project_name ?? ""}::${event.session_id ?? ""}`;
136
+ const bucket = groups.get(key) ?? [];
137
+ bucket.push(event);
138
+ groups.set(key, bucket);
139
+ }
140
+ let inserted = 0;
141
+ for (const events of groups.values()) {
142
+ for (let i = 0; i < events.length; i += windowSize) {
143
+ const window = events.slice(i, i + windowSize);
144
+ if (window.length < minEvents) continue;
145
+ const checkpoint = buildReflectionCheckpoint(window);
146
+ if (!checkpoint) continue;
147
+ await insertReflectionCheckpoint(checkpoint, db);
148
+ inserted++;
149
+ }
150
+ }
151
+ return inserted;
152
+ }
153
+
154
+ export {
155
+ buildReflectionCheckpoint,
156
+ generateReflectionCheckpoints
157
+ };
@@ -0,0 +1,181 @@
1
+ import {
2
+ getClient
3
+ } from "./chunk-XABJRAUW.js";
4
+ import {
5
+ loadConfig
6
+ } from "./chunk-R36FAN53.js";
7
+
8
+ // src/lib/reminders.ts
9
+ import crypto from "crypto";
10
+ async function getCloudConfig() {
11
+ try {
12
+ const config = await loadConfig();
13
+ if (config.cloud?.apiKey && config.cloud?.endpoint) {
14
+ return { apiKey: config.cloud.apiKey, endpoint: config.cloud.endpoint };
15
+ }
16
+ } catch {
17
+ }
18
+ return null;
19
+ }
20
+ function apiBaseUrl(cloud) {
21
+ try {
22
+ const url = new URL(cloud.endpoint);
23
+ if (url.hostname.startsWith("sync.")) {
24
+ url.hostname = url.hostname.replace(/^sync\./, "api.");
25
+ return url.origin;
26
+ }
27
+ } catch {
28
+ }
29
+ return "https://api.askexe.com";
30
+ }
31
+ async function cloudPushReminder(cloud, text, dueDate) {
32
+ try {
33
+ const base = apiBaseUrl(cloud);
34
+ await fetch(`${base}/v1/reminders`, {
35
+ method: "POST",
36
+ headers: {
37
+ "Authorization": `Bearer ${cloud.apiKey}`,
38
+ "Content-Type": "application/json"
39
+ },
40
+ body: JSON.stringify({ text, due_date: dueDate })
41
+ });
42
+ } catch (err) {
43
+ process.stderr.write(`[reminders] cloud push failed: ${err instanceof Error ? err.message : String(err)}
44
+ `);
45
+ }
46
+ }
47
+ async function cloudFetchReminders(cloud) {
48
+ try {
49
+ const base = apiBaseUrl(cloud);
50
+ const res = await fetch(`${base}/v1/reminders`, {
51
+ method: "GET",
52
+ headers: {
53
+ "Authorization": `Bearer ${cloud.apiKey}`
54
+ }
55
+ });
56
+ if (!res.ok) return [];
57
+ const data = await res.json();
58
+ if (!Array.isArray(data.items)) return [];
59
+ return data.items.map((r) => ({
60
+ id: r.id,
61
+ text: r.text,
62
+ createdAt: r.created_at,
63
+ dueDate: r.due_date,
64
+ completedAt: r.completed_at,
65
+ source: "cloud"
66
+ }));
67
+ } catch (err) {
68
+ process.stderr.write(`[reminders] cloud fetch failed: ${err instanceof Error ? err.message : String(err)}
69
+ `);
70
+ return [];
71
+ }
72
+ }
73
+ async function cloudDeleteReminder(cloud, id) {
74
+ try {
75
+ const base = apiBaseUrl(cloud);
76
+ await fetch(`${base}/v1/reminders/${encodeURIComponent(id)}`, {
77
+ method: "DELETE",
78
+ headers: {
79
+ "Authorization": `Bearer ${cloud.apiKey}`
80
+ }
81
+ });
82
+ } catch (err) {
83
+ process.stderr.write(`[reminders] cloud delete failed: ${err instanceof Error ? err.message : String(err)}
84
+ `);
85
+ }
86
+ }
87
+ function dedup(local, cloud) {
88
+ const localKeys = /* @__PURE__ */ new Set();
89
+ for (const r of local) {
90
+ localKeys.add(`${r.text.trim().toLowerCase()}|${r.dueDate ?? ""}`);
91
+ }
92
+ const merged = local.map((r) => ({ ...r, source: "local" }));
93
+ for (const r of cloud) {
94
+ const key = `${r.text.trim().toLowerCase()}|${r.dueDate ?? ""}`;
95
+ if (localKeys.has(key)) {
96
+ const existing = merged.find(
97
+ (m) => m.text.trim().toLowerCase() === r.text.trim().toLowerCase() && (m.dueDate ?? "") === (r.dueDate ?? "")
98
+ );
99
+ if (existing) existing.source = "both";
100
+ } else {
101
+ merged.push({ ...r, source: "cloud" });
102
+ }
103
+ }
104
+ return merged;
105
+ }
106
+ async function createReminder(text, dueDate) {
107
+ const client = getClient();
108
+ const id = crypto.randomUUID();
109
+ const now = (/* @__PURE__ */ new Date()).toISOString();
110
+ await client.execute({
111
+ sql: `INSERT INTO reminders (id, text, created_at, due_date) VALUES (?, ?, ?, ?)`,
112
+ args: [id, text, now, dueDate ?? null]
113
+ });
114
+ const cloud = await getCloudConfig();
115
+ if (cloud) {
116
+ cloudPushReminder(cloud, text, dueDate ?? null).catch(() => {
117
+ });
118
+ }
119
+ return { id, text, createdAt: now, dueDate: dueDate ?? null, completedAt: null };
120
+ }
121
+ async function listReminders(includeCompleted = false) {
122
+ const client = getClient();
123
+ const sql = includeCompleted ? `SELECT id, text, created_at, due_date, completed_at FROM reminders ORDER BY due_date ASC NULLS LAST LIMIT 500` : `SELECT id, text, created_at, due_date, completed_at FROM reminders WHERE completed_at IS NULL ORDER BY due_date ASC NULLS LAST LIMIT 500`;
124
+ const result = await client.execute(sql);
125
+ const local = result.rows.map((row) => ({
126
+ id: String(row.id),
127
+ text: String(row.text),
128
+ createdAt: String(row.created_at),
129
+ dueDate: row.due_date ? String(row.due_date) : null,
130
+ completedAt: row.completed_at ? String(row.completed_at) : null
131
+ }));
132
+ const cloud = await getCloudConfig();
133
+ if (cloud) {
134
+ const cloudReminders = await cloudFetchReminders(cloud);
135
+ return dedup(local, cloudReminders);
136
+ }
137
+ return local;
138
+ }
139
+ async function completeReminder(idOrText) {
140
+ const client = getClient();
141
+ const now = (/* @__PURE__ */ new Date()).toISOString();
142
+ let result = await client.execute({
143
+ sql: `SELECT id, text FROM reminders WHERE id = ? AND completed_at IS NULL`,
144
+ args: [idOrText]
145
+ });
146
+ if (result.rows.length === 0) {
147
+ result = await client.execute({
148
+ sql: `SELECT id, text FROM reminders WHERE completed_at IS NULL AND text LIKE '%' || ? || '%' LIMIT 1`,
149
+ args: [idOrText]
150
+ });
151
+ }
152
+ if (result.rows.length === 0) return null;
153
+ const row = result.rows[0];
154
+ const id = String(row.id);
155
+ const text = String(row.text);
156
+ await client.execute({
157
+ sql: `UPDATE reminders SET completed_at = ? WHERE id = ?`,
158
+ args: [now, id]
159
+ });
160
+ const cloud = await getCloudConfig();
161
+ if (cloud) {
162
+ cloudDeleteReminder(cloud, id).catch(() => {
163
+ });
164
+ cloudFetchReminders(cloud).then((cloudReminders) => {
165
+ for (const cr of cloudReminders) {
166
+ if (cr.text.trim().toLowerCase() === text.trim().toLowerCase()) {
167
+ cloudDeleteReminder(cloud, cr.id).catch(() => {
168
+ });
169
+ }
170
+ }
171
+ }).catch(() => {
172
+ });
173
+ }
174
+ return { id, text, createdAt: "", dueDate: null, completedAt: now };
175
+ }
176
+
177
+ export {
178
+ createReminder,
179
+ listReminders,
180
+ completeReminder
181
+ };
@@ -0,0 +1,304 @@
1
+ import {
2
+ recordOrchestrationEventBestEffort
3
+ } from "./chunk-RCGHXBCX.js";
4
+ import {
5
+ atomicWriteJsonSync
6
+ } from "./chunk-LYH5HE24.js";
7
+
8
+ // src/lib/session-registry.ts
9
+ import { readFileSync, mkdirSync, existsSync, openSync, closeSync, writeSync, unlinkSync, constants } from "fs";
10
+ import { execFileSync } from "child_process";
11
+ import path from "path";
12
+ import os from "os";
13
+ var REGISTRY_PATH = path.join(os.homedir(), ".exe-os", "session-registry.json");
14
+ var REGISTRY_LOCK_PATH = `${REGISTRY_PATH}.lock`;
15
+ var REGISTRY_CACHE_TTL_MS = 100;
16
+ var registryCache = null;
17
+ function acquireRegistryLock() {
18
+ const dir = path.dirname(REGISTRY_PATH);
19
+ if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
20
+ const data = JSON.stringify({ pid: process.pid, timestamp: Date.now() });
21
+ const deadline = Date.now() + 250;
22
+ while (Date.now() < deadline) {
23
+ try {
24
+ const fd = openSync(REGISTRY_LOCK_PATH, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL, 384);
25
+ writeSync(fd, data);
26
+ closeSync(fd);
27
+ return true;
28
+ } catch (err) {
29
+ if (err.code !== "EEXIST") return false;
30
+ try {
31
+ const lock = JSON.parse(readFileSync(REGISTRY_LOCK_PATH, "utf8"));
32
+ if (Date.now() - Number(lock.timestamp ?? 0) > 3e4) unlinkSync(REGISTRY_LOCK_PATH);
33
+ } catch {
34
+ try {
35
+ unlinkSync(REGISTRY_LOCK_PATH);
36
+ } catch {
37
+ }
38
+ }
39
+ }
40
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 25);
41
+ }
42
+ return false;
43
+ }
44
+ function releaseRegistryLock() {
45
+ try {
46
+ unlinkSync(REGISTRY_LOCK_PATH);
47
+ } catch {
48
+ }
49
+ }
50
+ function readSessionsUncached() {
51
+ try {
52
+ const raw = readFileSync(REGISTRY_PATH, "utf8");
53
+ return JSON.parse(raw);
54
+ } catch {
55
+ return [];
56
+ }
57
+ }
58
+ function writeSessions(sessions) {
59
+ atomicWriteJsonSync(REGISTRY_PATH, sessions);
60
+ registryCache = { at: Date.now(), sessions };
61
+ }
62
+ function registerSession(entry) {
63
+ const dir = path.dirname(REGISTRY_PATH);
64
+ if (!existsSync(dir)) {
65
+ mkdirSync(dir, { recursive: true });
66
+ }
67
+ const _locked = acquireRegistryLock();
68
+ try {
69
+ const sessions = readSessionsUncached();
70
+ const idx = sessions.findIndex((s) => s.windowName === entry.windowName);
71
+ if (idx >= 0) {
72
+ sessions[idx] = entry;
73
+ } else {
74
+ sessions.push(entry);
75
+ }
76
+ writeSessions(sessions);
77
+ } finally {
78
+ if (_locked) releaseRegistryLock();
79
+ }
80
+ recordOrchestrationEventBestEffort({
81
+ eventType: "registry.registered",
82
+ source: "session-registry.registerSession",
83
+ agentId: entry.agentId,
84
+ sessionScope: entry.parentExe,
85
+ tmuxSession: entry.windowName,
86
+ payload: { hasProjectDir: Boolean(entry.projectDir) }
87
+ });
88
+ }
89
+ function refreshSessionProject(windowName, projectDir) {
90
+ if (!acquireRegistryLock()) return;
91
+ try {
92
+ const sessions = readSessionsUncached();
93
+ const entry = sessions.find((s) => s.windowName === windowName);
94
+ if (!entry || entry.projectDir === projectDir) return;
95
+ entry.projectDir = projectDir;
96
+ writeSessions(sessions);
97
+ } catch {
98
+ } finally {
99
+ releaseRegistryLock();
100
+ }
101
+ }
102
+ function listSessions() {
103
+ const now = Date.now();
104
+ if (registryCache && now - registryCache.at < REGISTRY_CACHE_TTL_MS) {
105
+ return registryCache.sessions;
106
+ }
107
+ const sessions = readSessionsUncached();
108
+ registryCache = { at: now, sessions };
109
+ return sessions;
110
+ }
111
+ function pruneStaleSessions() {
112
+ if (!acquireRegistryLock()) return 0;
113
+ const sessions = readSessionsUncached();
114
+ if (sessions.length === 0) {
115
+ releaseRegistryLock();
116
+ return 0;
117
+ }
118
+ let liveSessions = [];
119
+ try {
120
+ liveSessions = execFileSync("tmux", ["list-sessions", "-F", "#{session_name}"], {
121
+ encoding: "utf8",
122
+ stdio: ["pipe", "pipe", "pipe"]
123
+ }).trim().split("\n").filter(Boolean);
124
+ } catch {
125
+ releaseRegistryLock();
126
+ return 0;
127
+ }
128
+ const liveSet = new Set(liveSessions);
129
+ const alive = sessions.filter((s) => liveSet.has(s.windowName));
130
+ const staleSessions = sessions.filter((s) => !liveSet.has(s.windowName));
131
+ if (staleSessions.length > 0) {
132
+ recordOrchestrationEventBestEffort({
133
+ eventType: "registry.missing_tmux",
134
+ source: "session-registry.pruneStaleSessions",
135
+ severity: "warn",
136
+ attempt: staleSessions.length,
137
+ payload: {
138
+ count: staleSessions.length,
139
+ examples: staleSessions.slice(0, 5).map((s) => s.windowName)
140
+ }
141
+ });
142
+ }
143
+ const pruned = sessions.length - alive.length;
144
+ if (pruned > 0) {
145
+ writeSessions(alive);
146
+ }
147
+ releaseRegistryLock();
148
+ return pruned;
149
+ }
150
+ function checkSessionRegistryConsistency(liveSessionsOverride) {
151
+ const sessions = listSessions();
152
+ const result = { missingTmux: 0, missingRegistry: 0 };
153
+ let liveSessions = liveSessionsOverride;
154
+ if (!liveSessions) {
155
+ try {
156
+ liveSessions = execFileSync("tmux", ["list-sessions", "-F", "#{session_name}"], {
157
+ encoding: "utf8",
158
+ stdio: ["pipe", "pipe", "pipe"]
159
+ }).trim().split("\n").filter(Boolean);
160
+ } catch {
161
+ return result;
162
+ }
163
+ }
164
+ const liveSet = new Set(liveSessions);
165
+ const registeredSet = new Set(sessions.map((s) => s.windowName));
166
+ const missingTmuxExamples = [];
167
+ const missingRegistryExamples = [];
168
+ for (const entry of sessions) {
169
+ if (liveSet.has(entry.windowName)) continue;
170
+ result.missingTmux++;
171
+ if (missingTmuxExamples.length < 5) missingTmuxExamples.push(entry.windowName);
172
+ }
173
+ for (const live of liveSessions) {
174
+ if (registeredSet.has(live)) continue;
175
+ if (!looksLikeExeOsSession(live)) continue;
176
+ result.missingRegistry++;
177
+ if (missingRegistryExamples.length < 5) missingRegistryExamples.push(live);
178
+ }
179
+ if (result.missingTmux > 0) {
180
+ recordOrchestrationEventBestEffort({
181
+ eventType: "registry.missing_tmux",
182
+ source: "session-registry.checkSessionRegistryConsistency",
183
+ severity: "warn",
184
+ attempt: result.missingTmux,
185
+ payload: {
186
+ count: result.missingTmux,
187
+ examples: missingTmuxExamples
188
+ }
189
+ });
190
+ }
191
+ if (result.missingRegistry > 0) {
192
+ recordOrchestrationEventBestEffort({
193
+ eventType: "registry.missing_entry",
194
+ source: "session-registry.checkSessionRegistryConsistency",
195
+ severity: "warn",
196
+ attempt: result.missingRegistry,
197
+ payload: {
198
+ count: result.missingRegistry,
199
+ examples: missingRegistryExamples
200
+ }
201
+ });
202
+ }
203
+ return result;
204
+ }
205
+ function deregisterSession(windowName) {
206
+ if (!acquireRegistryLock()) return null;
207
+ try {
208
+ const sessions = readSessionsUncached();
209
+ const idx = sessions.findIndex((s) => s.windowName === windowName);
210
+ if (idx < 0) return null;
211
+ const removed = sessions.splice(idx, 1)[0];
212
+ writeSessions(sessions);
213
+ recordOrchestrationEventBestEffort({
214
+ eventType: "registry.deregistered",
215
+ source: "session-registry.deregisterSession",
216
+ agentId: removed.agentId,
217
+ sessionScope: removed.parentExe,
218
+ tmuxSession: windowName,
219
+ payload: { reason: "admin_force_deregister" }
220
+ });
221
+ return removed;
222
+ } finally {
223
+ releaseRegistryLock();
224
+ }
225
+ }
226
+ function cleanupDeadSessions(liveTmuxOverride) {
227
+ if (!acquireRegistryLock()) return { pruned: 0, remaining: 0, removed: [] };
228
+ try {
229
+ const sessions = readSessionsUncached();
230
+ if (sessions.length === 0) return { pruned: 0, remaining: 0, removed: [] };
231
+ let liveTmux;
232
+ if (liveTmuxOverride) {
233
+ if (liveTmuxOverride.length === 0) return { pruned: 0, remaining: sessions.length, removed: [] };
234
+ liveTmux = new Set(liveTmuxOverride.filter(Boolean));
235
+ } else {
236
+ try {
237
+ const raw = execFileSync("tmux", ["list-sessions", "-F", "#{session_name}"], {
238
+ encoding: "utf8",
239
+ stdio: ["pipe", "pipe", "pipe"]
240
+ }).trim();
241
+ liveTmux = new Set(raw.split("\n").filter(Boolean));
242
+ } catch {
243
+ liveTmux = /* @__PURE__ */ new Set();
244
+ }
245
+ }
246
+ const alive = [];
247
+ const removed = [];
248
+ for (const s of sessions) {
249
+ const tmuxAlive = liveTmux.has(s.windowName);
250
+ let pidAlive = false;
251
+ try {
252
+ process.kill(s.pid, 0);
253
+ pidAlive = true;
254
+ } catch {
255
+ }
256
+ if (tmuxAlive || pidAlive) {
257
+ alive.push(s);
258
+ } else {
259
+ removed.push(s.windowName);
260
+ }
261
+ }
262
+ if (removed.length > 0) {
263
+ writeSessions(alive);
264
+ recordOrchestrationEventBestEffort({
265
+ eventType: "registry.cleanup",
266
+ source: "session-registry.cleanupDeadSessions",
267
+ severity: "info",
268
+ payload: { pruned: removed.length, remaining: alive.length, examples: removed.slice(0, 10) }
269
+ });
270
+ }
271
+ return { pruned: removed.length, remaining: alive.length, removed };
272
+ } finally {
273
+ releaseRegistryLock();
274
+ }
275
+ }
276
+ function looksLikeExeOsSession(sessionName) {
277
+ const coordName = getCoordinatorNameCached();
278
+ const escaped = coordName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
279
+ const coordPattern = new RegExp(`^${escaped}\\d*$`);
280
+ const employeePattern = new RegExp(`-${escaped}\\d*$`);
281
+ return coordPattern.test(sessionName) || employeePattern.test(sessionName);
282
+ }
283
+ function getCoordinatorNameCached() {
284
+ try {
285
+ const rosterPath = path.join(os.homedir(), ".exe-os", "exe-employees.json");
286
+ if (existsSync(rosterPath)) {
287
+ const roster = JSON.parse(readFileSync(rosterPath, "utf8"));
288
+ const coo = roster.find((e) => (e.role ?? "").toUpperCase() === "COO");
289
+ if (coo?.name) return coo.name;
290
+ }
291
+ } catch {
292
+ }
293
+ return "exe";
294
+ }
295
+
296
+ export {
297
+ registerSession,
298
+ refreshSessionProject,
299
+ listSessions,
300
+ pruneStaleSessions,
301
+ checkSessionRegistryConsistency,
302
+ deregisterSession,
303
+ cleanupDeadSessions
304
+ };