@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,535 @@
1
+ import {
2
+ cleanupGraphLinksForMemories
3
+ } from "./chunk-6OAAN25C.js";
4
+ import {
5
+ resolveAnthropicAuth
6
+ } from "./chunk-EJIF4FNT.js";
7
+ import {
8
+ vectorToBlob
9
+ } from "./chunk-4Z3FWLOE.js";
10
+ import {
11
+ extractKeywords,
12
+ keywordsToString
13
+ } from "./chunk-CHCA3ZM2.js";
14
+ import {
15
+ isCoordinatorName
16
+ } from "./chunk-XABJRAUW.js";
17
+
18
+ // src/lib/consolidation.ts
19
+ import { randomUUID } from "crypto";
20
+ async function selectUnconsolidated(client, limit = 200) {
21
+ const result = await client.execute({
22
+ sql: `SELECT id, agent_id, project_name, tool_name, raw_text, timestamp, memory_type, session_scope
23
+ FROM memories
24
+ WHERE consolidated = 0
25
+ AND COALESCE(memory_type, 'raw') != 'procedure'
26
+ ORDER BY timestamp DESC
27
+ LIMIT ?`,
28
+ args: [limit]
29
+ });
30
+ return result.rows.map((row) => ({
31
+ id: row.id,
32
+ agent_id: row.agent_id,
33
+ project_name: row.project_name,
34
+ tool_name: row.tool_name,
35
+ raw_text: row.raw_text,
36
+ timestamp: row.timestamp,
37
+ memory_type: row.memory_type ?? null,
38
+ session_scope: row.session_scope ?? null
39
+ }));
40
+ }
41
+ function dominantMemoryType(memories) {
42
+ const counts = /* @__PURE__ */ new Map();
43
+ for (const m of memories) {
44
+ const type = m.memory_type ?? "raw";
45
+ counts.set(type, (counts.get(type) ?? 0) + 1);
46
+ }
47
+ let best = "observation";
48
+ let bestCount = 0;
49
+ for (const [type, count] of counts) {
50
+ if (count > bestCount || count === bestCount && type !== "raw") {
51
+ best = type;
52
+ bestCount = count;
53
+ }
54
+ }
55
+ return best;
56
+ }
57
+ function groupMemories(memories) {
58
+ const byProject = /* @__PURE__ */ new Map();
59
+ for (const mem of memories) {
60
+ const key = `${mem.agent_id}::${mem.project_name}`;
61
+ const list = byProject.get(key) ?? [];
62
+ list.push(mem);
63
+ byProject.set(key, list);
64
+ }
65
+ const clusters = [];
66
+ for (const [key, projectMemories] of byProject) {
67
+ const [agentId, projectName] = key.split("::");
68
+ const byDay = /* @__PURE__ */ new Map();
69
+ for (const mem of projectMemories) {
70
+ const day = mem.timestamp.slice(0, 10);
71
+ const list = byDay.get(day) ?? [];
72
+ list.push(mem);
73
+ byDay.set(day, list);
74
+ }
75
+ for (const [day, dayMemories] of byDay) {
76
+ if (dayMemories.length < 3) continue;
77
+ if (dayMemories.length <= 15) {
78
+ clusters.push({
79
+ agentId,
80
+ projectName,
81
+ dateRange: day,
82
+ memories: dayMemories
83
+ });
84
+ } else {
85
+ for (let i = 0; i < dayMemories.length; i += 12) {
86
+ const chunk = dayMemories.slice(i, i + 12);
87
+ clusters.push({
88
+ agentId,
89
+ projectName,
90
+ dateRange: day,
91
+ memories: chunk
92
+ });
93
+ }
94
+ }
95
+ }
96
+ }
97
+ return clusters;
98
+ }
99
+ var ROLE_PROMPTS = {
100
+ "COO": `Extract EXACTLY THREE types of insights:
101
+ 1. KEY DECISIONS \u2014 choices that were made and why (at most 3)
102
+ 2. RECURRING PATTERNS \u2014 actions or approaches that repeated (at most 3)
103
+ 3. OPEN QUESTIONS \u2014 things that seem unresolved or risky (at most 2)`,
104
+ "CTO": `Extract EXACTLY THREE types of insights:
105
+ 1. ARCHITECTURE DECISIONS \u2014 design choices, tradeoffs, delegation patterns (at most 3)
106
+ 2. REVIEW OUTCOMES \u2014 what was approved, rejected, or flagged during code review (at most 3)
107
+ 3. TECHNICAL DEBT \u2014 unresolved issues, deferred work, risks identified (at most 2)`,
108
+ "Principal Engineer": `Extract EXACTLY THREE types of insights:
109
+ 1. CODE DECISIONS \u2014 implementation choices, patterns used, bugs fixed (at most 3)
110
+ 2. FILE CHANGES \u2014 key files modified and why (at most 3)
111
+ 3. BLOCKERS \u2014 things that slowed down or prevented progress (at most 2)`,
112
+ "Staff Code Reviewer": `Extract EXACTLY THREE types of insights:
113
+ 1. AUDIT FINDINGS \u2014 issues found, severity, fix status (at most 3)
114
+ 2. RECURRING ISSUES \u2014 patterns that keep appearing across reviews (at most 3)
115
+ 3. QUALITY SIGNALS \u2014 areas of the codebase that are strong or weak (at most 2)`,
116
+ "CMO": `Extract EXACTLY THREE types of insights:
117
+ 1. DESIGN DECISIONS \u2014 brand, layout, typography, or content choices made (at most 3)
118
+ 2. CONTENT STRATEGY \u2014 messaging, SEO, platform-specific decisions (at most 3)
119
+ 3. BRAND ALIGNMENT \u2014 consistency issues or guidelines established (at most 2)`,
120
+ "AI Product Lead": `Extract EXACTLY THREE types of insights:
121
+ 1. RESEARCH FINDINGS \u2014 tools, repos, or models evaluated with conclusions (at most 3)
122
+ 2. COMPETITIVE GAPS \u2014 features or patterns worth adopting from competitors (at most 3)
123
+ 3. BUILD RECOMMENDATIONS \u2014 what to build, skip, or watch (at most 2)`
124
+ };
125
+ var DEFAULT_ROLE_PROMPT = `Extract EXACTLY THREE types of insights:
126
+ 1. KEY DECISIONS \u2014 choices that were made and why (at most 3)
127
+ 2. RECURRING PATTERNS \u2014 actions or approaches that repeated (at most 3)
128
+ 3. OPEN QUESTIONS \u2014 things that seem unresolved or risky (at most 2)`;
129
+ function buildConsolidationPrompt(cluster, agentRole) {
130
+ const snippets = cluster.memories.map((m, i) => {
131
+ return `${i + 1}. [${m.tool_name}] ${m.raw_text}`;
132
+ }).join("\n");
133
+ const rolePrompt = agentRole && ROLE_PROMPTS[agentRole] || DEFAULT_ROLE_PROMPT;
134
+ return `You are reviewing a set of work memories from an AI coding agent.
135
+ These are raw tool call records from ${cluster.dateRange}.
136
+
137
+ Agent: ${cluster.agentId} | Project: ${cluster.projectName} | Date: ${cluster.dateRange}
138
+
139
+ MEMORIES:
140
+ ${snippets}
141
+
142
+ ${rolePrompt}
143
+
144
+ IMPORTANT: Preserve all specific names, file paths, technical terms, and proper nouns exactly as they appear. Front-load the most important terms in the first sentence of your summary. Never replace specific terms with generic descriptions (e.g. write "hybrid-search.ts" not "the search file", write "extractKeywords" not "the extraction function").
145
+
146
+ Format each as a single sentence. Be specific \u2014 include file names,
147
+ function names, and concrete details. Skip if no insight for a category.`;
148
+ }
149
+ var resolveAnthropicAuth2 = resolveAnthropicAuth;
150
+ async function consolidateCluster(cluster, model, agentRole) {
151
+ const auth = resolveAnthropicAuth2();
152
+ if (!auth) {
153
+ throw new Error(
154
+ "Could not resolve authentication method for consolidation model: set ANTHROPIC_API_KEY (API key) or ANTHROPIC_AUTH_TOKEN (Claude subscription/OAuth) in the daemon environment."
155
+ );
156
+ }
157
+ const Anthropic = (await import("@anthropic-ai/sdk")).default;
158
+ const client = new Anthropic(auth);
159
+ const prompt = buildConsolidationPrompt(cluster, agentRole);
160
+ const response = await client.messages.create({
161
+ model,
162
+ max_tokens: 300,
163
+ messages: [{ role: "user", content: prompt }]
164
+ });
165
+ const textBlock = response.content.find((b) => b.type === "text");
166
+ return textBlock?.text ?? "";
167
+ }
168
+ async function storeConsolidation(client, cluster, synthesisText, embedFn) {
169
+ const consolidatedId = randomUUID();
170
+ const now = (/* @__PURE__ */ new Date()).toISOString();
171
+ const rawText = `CONSOLIDATION [${cluster.dateRange}, ${cluster.projectName}]:
172
+
173
+ ${synthesisText}`;
174
+ let vector = null;
175
+ if (embedFn) {
176
+ try {
177
+ vector = await embedFn(rawText);
178
+ } catch {
179
+ }
180
+ }
181
+ const memoryType = dominantMemoryType(cluster.memories);
182
+ const scopes = new Set(cluster.memories.map((m) => m.session_scope ?? null));
183
+ const sessionScope = scopes.size === 1 ? cluster.memories[0]?.session_scope ?? null : null;
184
+ const keywords = keywordsToString(extractKeywords(rawText));
185
+ const insertSql = vector ? `INSERT INTO memories
186
+ (id, agent_id, agent_role, session_id, timestamp,
187
+ tool_name, project_name, has_error, raw_text, vector, version, consolidated, importance, memory_type, session_scope, keywords)
188
+ VALUES (?, ?, 'consolidation', 'daemon-consolidation', ?, 'consolidation', ?, 0, ?, vector32(?), 0, 1, 9, ?, ?, ?)` : `INSERT INTO memories
189
+ (id, agent_id, agent_role, session_id, timestamp,
190
+ tool_name, project_name, has_error, raw_text, vector, version, consolidated, importance, memory_type, session_scope, keywords)
191
+ VALUES (?, ?, 'consolidation', 'daemon-consolidation', ?, 'consolidation', ?, 0, ?, NULL, 0, 1, 9, ?, ?, ?)`;
192
+ const insertArgs = vector ? [consolidatedId, cluster.agentId, now, cluster.projectName, rawText, vectorToBlob(vector), memoryType, sessionScope, keywords] : [consolidatedId, cluster.agentId, now, cluster.projectName, rawText, memoryType, sessionScope, keywords];
193
+ await client.execute({ sql: insertSql, args: insertArgs });
194
+ const sourceIds = cluster.memories.map((m) => m.id);
195
+ const linkStmts = sourceIds.map((sourceId) => ({
196
+ sql: `INSERT INTO consolidations (id, consolidated_memory_id, source_memory_id, created_at)
197
+ VALUES (?, ?, ?, ?)`,
198
+ args: [randomUUID(), consolidatedId, sourceId, now]
199
+ }));
200
+ const placeholders = sourceIds.map(() => "?").join(",");
201
+ const markStmt = {
202
+ sql: `UPDATE memories SET consolidated = 1, status = 'archived' WHERE id IN (${placeholders})`,
203
+ args: sourceIds
204
+ };
205
+ await client.batch([...linkStmts, markStmt], "write");
206
+ return { consolidatedMemoryId: consolidatedId, sourceIds, rawText };
207
+ }
208
+ var WIKI_FETCH_TIMEOUT_MS = 1e4;
209
+ async function pushToWiki(consolidation, config) {
210
+ if (!config.wikiEnabled || !config.wikiAutoUpdate) {
211
+ return { updated: false };
212
+ }
213
+ const apiUrl = config.wikiUrl || process.env.EXE_WIKI_API_URL;
214
+ const apiKey = config.wikiApiKey || process.env.EXE_WIKI_API_KEY;
215
+ if (!apiUrl || !apiKey) {
216
+ return { updated: false };
217
+ }
218
+ const workspace = config.wikiWorkspaceMapping[consolidation.projectName] ?? consolidation.projectName;
219
+ try {
220
+ const listRes = await fetch(
221
+ `${apiUrl}/v1/workspace/${encodeURIComponent(workspace)}/documents`,
222
+ {
223
+ headers: { Authorization: `Bearer ${apiKey}` },
224
+ signal: AbortSignal.timeout(WIKI_FETCH_TIMEOUT_MS)
225
+ }
226
+ );
227
+ if (!listRes.ok) {
228
+ return { updated: false, error: `Workspace "${workspace}" not accessible (${listRes.status})` };
229
+ }
230
+ const listJson = await listRes.json();
231
+ const docs = listJson.documents ?? listJson.localFiles?.items ?? [];
232
+ const contentLines = consolidation.rawText.split("\n").filter((l) => l.trim() && !l.startsWith("CONSOLIDATION") && !l.match(/^[A-Z\s]+:$/)).join(" ");
233
+ const keywords = contentLines.toLowerCase().replace(/[^a-z0-9\s]/g, "").split(/\s+/).filter((w) => w.length > 3);
234
+ let bestMatch = null;
235
+ for (const doc of docs) {
236
+ if (!doc.id || !doc.title) continue;
237
+ const titleWords = doc.title.toLowerCase().replace(/[^a-z0-9\s]/g, "").split(/\s+/).filter((w) => w.length > 3);
238
+ if (titleWords.length === 0) continue;
239
+ const matchCount = titleWords.filter(
240
+ (tw) => keywords.some((k) => k.includes(tw) || tw.includes(k))
241
+ ).length;
242
+ const score = matchCount / titleWords.length;
243
+ if (score > (bestMatch?.score ?? 0)) {
244
+ bestMatch = { id: doc.id, title: doc.title, score };
245
+ }
246
+ }
247
+ if (bestMatch && bestMatch.score >= config.wikiAutoUpdateThreshold) {
248
+ const updateRes = await fetch(`${apiUrl}/v1/document/raw-text`, {
249
+ method: "POST",
250
+ headers: {
251
+ "Content-Type": "application/json",
252
+ Authorization: `Bearer ${apiKey}`
253
+ },
254
+ body: JSON.stringify({
255
+ textContent: consolidation.rawText,
256
+ metadata: { title: bestMatch.title, appendTo: bestMatch.id },
257
+ workspaceSlugs: [workspace]
258
+ }),
259
+ signal: AbortSignal.timeout(WIKI_FETCH_TIMEOUT_MS)
260
+ });
261
+ if (updateRes.ok) {
262
+ process.stderr.write(
263
+ `[consolidation] Wiki auto-updated: ${workspace}/${bestMatch.title}
264
+ `
265
+ );
266
+ return { updated: true, action: "updated", page: bestMatch.title };
267
+ }
268
+ return { updated: false, error: `Update failed (${updateRes.status})` };
269
+ }
270
+ if (config.wikiAutoUpdateCreateNew) {
271
+ const title = `Consolidated Insights \u2014 ${consolidation.projectName} (${(/* @__PURE__ */ new Date()).toISOString().slice(0, 10)})`;
272
+ const createRes = await fetch(`${apiUrl}/v1/document/raw-text`, {
273
+ method: "POST",
274
+ headers: {
275
+ "Content-Type": "application/json",
276
+ Authorization: `Bearer ${apiKey}`
277
+ },
278
+ body: JSON.stringify({
279
+ textContent: consolidation.rawText,
280
+ metadata: { title },
281
+ workspaceSlugs: [workspace]
282
+ }),
283
+ signal: AbortSignal.timeout(WIKI_FETCH_TIMEOUT_MS)
284
+ });
285
+ if (createRes.ok) {
286
+ process.stderr.write(
287
+ `[consolidation] Wiki page created: ${workspace}/${title}
288
+ `
289
+ );
290
+ return { updated: true, action: "created", page: title };
291
+ }
292
+ return { updated: false, error: `Create failed (${createRes.status})` };
293
+ }
294
+ return { updated: false };
295
+ } catch (err) {
296
+ const msg = err instanceof Error ? err.message : String(err);
297
+ process.stderr.write(`[consolidation] Wiki push failed: ${msg}
298
+ `);
299
+ return { updated: false, error: msg };
300
+ }
301
+ }
302
+ async function runConsolidation(client, options) {
303
+ if (!resolveAnthropicAuth2()) {
304
+ throw new Error(
305
+ "[consolidation] No Anthropic credentials resolvable (ANTHROPIC_API_KEY / ANTHROPIC_AUTH_TOKEN). Consolidation/dreaming layer cannot run. Skipping run."
306
+ );
307
+ }
308
+ const memories = await selectUnconsolidated(client);
309
+ if (memories.length < 20) {
310
+ return { clustersProcessed: 0, memoriesConsolidated: 0, clustersFailed: 0 };
311
+ }
312
+ const roleMap = {};
313
+ try {
314
+ const { loadEmployeesSync } = await import("./lib/employees.js");
315
+ const employees = loadEmployeesSync();
316
+ for (const e of employees) {
317
+ roleMap[e.name] = e.role;
318
+ }
319
+ } catch {
320
+ }
321
+ const clusters = groupMemories(memories);
322
+ let clustersProcessed = 0;
323
+ let memoriesConsolidated = 0;
324
+ let clustersFailed = 0;
325
+ let attemptedSynthesis = 0;
326
+ for (const cluster of clusters) {
327
+ if (clustersProcessed >= options.maxCalls) break;
328
+ if (cluster.memories.length < 3) continue;
329
+ try {
330
+ const isCoordinator = isCoordinatorName(cluster.agentId);
331
+ const agentRole = roleMap[cluster.agentId];
332
+ const dedupCount = await dedupCluster(client, cluster, options.embedFn);
333
+ memoriesConsolidated += dedupCount;
334
+ attemptedSynthesis++;
335
+ const synthesis = await consolidateCluster(cluster, options.model, agentRole);
336
+ if (!synthesis.trim()) {
337
+ if (dedupCount > 0) clustersProcessed++;
338
+ continue;
339
+ }
340
+ const result = await storeConsolidation(client, cluster, synthesis, options.embedFn);
341
+ if (isCoordinator && options.wikiConfig) {
342
+ await pushToWiki(
343
+ { ...result, projectName: cluster.projectName },
344
+ options.wikiConfig
345
+ ).catch((err) => {
346
+ process.stderr.write(
347
+ `[consolidation] Wiki push error (non-fatal): ${err instanceof Error ? err.message : String(err)}
348
+ `
349
+ );
350
+ });
351
+ }
352
+ if (isCoordinator) {
353
+ const sourceIds = result.sourceIds;
354
+ if (sourceIds.length > 0) {
355
+ const placeholders = sourceIds.map(() => "?").join(",");
356
+ await client.execute({
357
+ sql: `UPDATE memories SET status = 'archived' WHERE id IN (${placeholders})`,
358
+ args: sourceIds
359
+ });
360
+ }
361
+ }
362
+ clustersProcessed++;
363
+ memoriesConsolidated += cluster.memories.length;
364
+ } catch (err) {
365
+ clustersFailed++;
366
+ process.stderr.write(
367
+ `[consolidation] Cluster failed (${cluster.projectName}/${cluster.dateRange}): ${err instanceof Error ? err.message : String(err)}
368
+ `
369
+ );
370
+ }
371
+ }
372
+ if (attemptedSynthesis > 0 && clustersFailed >= attemptedSynthesis) {
373
+ throw new Error(
374
+ `[consolidation] All ${clustersFailed} synthesis cluster(s) failed \u2014 consolidation is non-functional. Check ANTHROPIC_API_KEY/ANTHROPIC_AUTH_TOKEN and consolidationModel (${options.model}).`
375
+ );
376
+ }
377
+ return { clustersProcessed, memoriesConsolidated, clustersFailed };
378
+ }
379
+ async function dedupCluster(client, cluster, embedFn) {
380
+ if (!embedFn || cluster.memories.length < 2) return 0;
381
+ const vectors = [];
382
+ for (const mem of cluster.memories) {
383
+ try {
384
+ const v = await embedFn(mem.raw_text);
385
+ vectors.push({ id: mem.id, vector: v });
386
+ } catch {
387
+ }
388
+ }
389
+ if (vectors.length < 2) return 0;
390
+ const toArchive = /* @__PURE__ */ new Set();
391
+ for (let i = 0; i < vectors.length; i++) {
392
+ if (toArchive.has(vectors[i].id)) continue;
393
+ for (let j = i + 1; j < vectors.length; j++) {
394
+ if (toArchive.has(vectors[j].id)) continue;
395
+ const sim = cosineSimilarity(vectors[i].vector, vectors[j].vector);
396
+ if (sim > 0.95) {
397
+ toArchive.add(vectors[j].id);
398
+ }
399
+ }
400
+ }
401
+ if (toArchive.size === 0) return 0;
402
+ const ids = [...toArchive];
403
+ const placeholders = ids.map(() => "?").join(",");
404
+ await client.execute({
405
+ sql: `UPDATE memories SET status = 'archived', consolidated = 1 WHERE id IN (${placeholders})`,
406
+ args: ids
407
+ });
408
+ const survivors = vectors.filter((v) => !toArchive.has(v.id)).map((v) => v.id);
409
+ if (survivors.length > 0) {
410
+ const survivorPlaceholders = survivors.map(() => "?").join(",");
411
+ await client.execute({
412
+ sql: `UPDATE memories SET confidence = MIN(1.0, COALESCE(confidence, 0.7) + 0.1) WHERE id IN (${survivorPlaceholders})`,
413
+ args: survivors
414
+ });
415
+ }
416
+ return ids.length;
417
+ }
418
+ function cosineSimilarity(a, b) {
419
+ let dot = 0, normA = 0, normB = 0;
420
+ for (let i = 0; i < a.length; i++) {
421
+ dot += a[i] * b[i];
422
+ normA += a[i] * a[i];
423
+ normB += b[i] * b[i];
424
+ }
425
+ const denom = Math.sqrt(normA) * Math.sqrt(normB);
426
+ return denom === 0 ? 0 : dot / denom;
427
+ }
428
+ async function isUserIdle(client, idleMinutes = 30) {
429
+ const result = await client.execute({
430
+ sql: `SELECT MAX(timestamp) as last_activity
431
+ FROM memories
432
+ WHERE tool_name != 'consolidation'
433
+ AND timestamp >= datetime('now', '-1 day')`,
434
+ args: []
435
+ });
436
+ const lastActivity = result.rows[0]?.last_activity;
437
+ if (!lastActivity) return true;
438
+ const lastMs = new Date(lastActivity).getTime();
439
+ const now = Date.now();
440
+ return now - lastMs >= idleMinutes * 60 * 1e3;
441
+ }
442
+ async function countUnconsolidated(client) {
443
+ const result = await client.execute({
444
+ sql: `SELECT COUNT(*) as cnt FROM memories
445
+ WHERE consolidated = 0
446
+ AND COALESCE(memory_type, 'raw') != 'procedure'`,
447
+ args: []
448
+ });
449
+ return Number(result.rows[0]?.cnt ?? 0);
450
+ }
451
+ var INTERCOM_NOISE_PATTERNS = [
452
+ /^\/exe-intercom\b/i,
453
+ /^You have pending notifications\.\s*Run list_tasks/i,
454
+ /^You have open tasks\.\s*Run list_tasks/i,
455
+ /^You have a new P\d+ task/i,
456
+ /^You have more open tasks to dispatch/i,
457
+ /^No new tasks\.\s*(Standing by|Idle|Dashboard)/i,
458
+ /^You have pending tasks\.\s*Start your/i
459
+ ];
460
+ async function deduplicateIntercomMemories(client) {
461
+ const noiseResult = await client.execute({
462
+ sql: `SELECT id, raw_text FROM memories
463
+ WHERE COALESCE(status, 'active') = 'active'
464
+ AND (
465
+ raw_text LIKE '/exe-intercom%'
466
+ OR raw_text LIKE 'You have pending notifications.%'
467
+ OR raw_text LIKE 'You have open tasks.%'
468
+ OR raw_text LIKE 'You have a new P_ task%'
469
+ OR raw_text LIKE 'You have more open tasks to dispatch%'
470
+ OR raw_text LIKE 'No new tasks.%'
471
+ OR raw_text LIKE 'You have pending tasks.%'
472
+ )`,
473
+ args: []
474
+ });
475
+ const toArchive = [];
476
+ for (const row of noiseResult.rows) {
477
+ const text = row.raw_text.trim();
478
+ if (INTERCOM_NOISE_PATTERNS.some((p) => p.test(text))) {
479
+ toArchive.push(row.id);
480
+ }
481
+ }
482
+ if (toArchive.length === 0) return 0;
483
+ const BATCH = 500;
484
+ for (let i = 0; i < toArchive.length; i += BATCH) {
485
+ const batch = toArchive.slice(i, i + BATCH);
486
+ const placeholders = batch.map(() => "?").join(",");
487
+ await client.execute({
488
+ sql: `UPDATE memories SET status = 'archived'
489
+ WHERE id IN (${placeholders})
490
+ AND COALESCE(status, 'active') = 'active'`,
491
+ args: batch
492
+ });
493
+ }
494
+ return toArchive.length;
495
+ }
496
+ var TRACE_TOOLS = ["Bash", "Read", "Edit", "Grep", "Write", "Glob", "apply_patch"];
497
+ async function sweepExpiredTraces(client) {
498
+ const placeholders = TRACE_TOOLS.map(() => "?").join(",");
499
+ const idsResult = await client.execute({
500
+ sql: `SELECT id FROM memories
501
+ WHERE tool_name IN (${placeholders})
502
+ AND COALESCE(memory_type, 'raw') = 'raw'
503
+ AND timestamp < datetime('now', '-7 days')
504
+ AND COALESCE(importance, 0) < 7`,
505
+ args: TRACE_TOOLS
506
+ });
507
+ const memoryIds = idsResult.rows.map((r) => String(r.id)).filter(Boolean);
508
+ if (memoryIds.length > 0) {
509
+ await cleanupGraphLinksForMemories(client, memoryIds);
510
+ }
511
+ const result = await client.execute({
512
+ sql: `DELETE FROM memories
513
+ WHERE tool_name IN (${placeholders})
514
+ AND COALESCE(memory_type, 'raw') = 'raw'
515
+ AND timestamp < datetime('now', '-7 days')
516
+ AND COALESCE(importance, 0) < 7`,
517
+ args: TRACE_TOOLS
518
+ });
519
+ return result.rowsAffected;
520
+ }
521
+
522
+ export {
523
+ selectUnconsolidated,
524
+ groupMemories,
525
+ buildConsolidationPrompt,
526
+ resolveAnthropicAuth2 as resolveAnthropicAuth,
527
+ consolidateCluster,
528
+ storeConsolidation,
529
+ pushToWiki,
530
+ runConsolidation,
531
+ isUserIdle,
532
+ countUnconsolidated,
533
+ deduplicateIntercomMemories,
534
+ sweepExpiredTraces
535
+ };
@@ -0,0 +1,123 @@
1
+ import {
2
+ getClient
3
+ } from "./chunk-XABJRAUW.js";
4
+
5
+ // src/lib/session-kill-telemetry.ts
6
+ import crypto from "crypto";
7
+ import { appendFileSync } from "fs";
8
+ import path from "path";
9
+ import os from "os";
10
+ var KILL_FILE_LOG = path.join(os.homedir(), ".exe-os", "logs", "session-kills.jsonl");
11
+ var TOKENS_PER_IDLE_MINUTE = 50;
12
+ async function recordSessionKill(input) {
13
+ const killedAt = (/* @__PURE__ */ new Date()).toISOString();
14
+ const id = crypto.randomUUID();
15
+ try {
16
+ const logEntry = JSON.stringify({
17
+ id,
18
+ timestamp: killedAt,
19
+ session: input.sessionName,
20
+ agent: input.agentId,
21
+ reason: input.reason,
22
+ ticksIdle: input.ticksIdle ?? null,
23
+ tokensSaved: input.estimatedTokensSaved ?? null
24
+ });
25
+ appendFileSync(KILL_FILE_LOG, logEntry + "\n");
26
+ } catch {
27
+ process.stderr.write(
28
+ `[session-kill-telemetry] file log write failed for ${input.sessionName}
29
+ `
30
+ );
31
+ }
32
+ try {
33
+ const client = getClient();
34
+ await client.execute({
35
+ sql: `INSERT INTO session_kills
36
+ (id, session_name, agent_id, killed_at, reason,
37
+ ticks_idle, estimated_tokens_saved)
38
+ VALUES (?, ?, ?, ?, ?, ?, ?)`,
39
+ args: [
40
+ id,
41
+ input.sessionName,
42
+ input.agentId,
43
+ killedAt,
44
+ input.reason,
45
+ input.ticksIdle ?? null,
46
+ input.estimatedTokensSaved ?? null
47
+ ]
48
+ });
49
+ } catch (err) {
50
+ process.stderr.write(
51
+ `[session-kill-telemetry] DB write failed: ${err instanceof Error ? err.message : String(err)}
52
+ `
53
+ );
54
+ }
55
+ }
56
+ async function countKillsSince(sinceISO) {
57
+ try {
58
+ const client = getClient();
59
+ const result = await client.execute({
60
+ sql: `SELECT COUNT(*) AS n FROM session_kills WHERE killed_at >= ?`,
61
+ args: [sinceISO]
62
+ });
63
+ const row = result.rows[0];
64
+ return row ? Number(row.n) : 0;
65
+ } catch {
66
+ return 0;
67
+ }
68
+ }
69
+ var IDLE_KILL_STREAK_META_KEY = "idle_kill_suspect_streak";
70
+ var IDLE_KILL_SUSPECT_DAY_THRESHOLD = 3;
71
+ var IDLE_KILL_MIN_LIVE_SESSIONS = 5;
72
+ function parseStreakState(raw) {
73
+ if (!raw) return { lastDate: null, streak: 0 };
74
+ try {
75
+ const parsed = JSON.parse(raw);
76
+ return {
77
+ lastDate: typeof parsed.lastDate === "string" ? parsed.lastDate : null,
78
+ streak: typeof parsed.streak === "number" ? parsed.streak : 0
79
+ };
80
+ } catch {
81
+ return { lastDate: null, streak: 0 };
82
+ }
83
+ }
84
+ function nextStreakState(prev, qualifiesToday, todayDate) {
85
+ if (!qualifiesToday) return { lastDate: todayDate, streak: 0 };
86
+ if (prev.lastDate === todayDate) return prev;
87
+ return { lastDate: todayDate, streak: prev.streak + 1 };
88
+ }
89
+ function computeIdleKillSuspectStreak(prev, killsToday, liveSessions, todayDate) {
90
+ const qualifies = killsToday === 0 && liveSessions >= IDLE_KILL_MIN_LIVE_SESSIONS;
91
+ const state = nextStreakState(prev, qualifies, todayDate);
92
+ return {
93
+ state,
94
+ suspect: state.streak >= IDLE_KILL_SUSPECT_DAY_THRESHOLD
95
+ };
96
+ }
97
+ async function sumTokensSavedSince(sinceISO) {
98
+ try {
99
+ const client = getClient();
100
+ const result = await client.execute({
101
+ sql: `SELECT COALESCE(SUM(estimated_tokens_saved), 0) AS total
102
+ FROM session_kills
103
+ WHERE killed_at >= ?`,
104
+ args: [sinceISO]
105
+ });
106
+ const row = result.rows[0];
107
+ return row ? Number(row.total) : 0;
108
+ } catch {
109
+ return 0;
110
+ }
111
+ }
112
+
113
+ export {
114
+ TOKENS_PER_IDLE_MINUTE,
115
+ recordSessionKill,
116
+ countKillsSince,
117
+ IDLE_KILL_STREAK_META_KEY,
118
+ IDLE_KILL_SUSPECT_DAY_THRESHOLD,
119
+ IDLE_KILL_MIN_LIVE_SESSIONS,
120
+ parseStreakState,
121
+ computeIdleKillSuspectStreak,
122
+ sumTokensSavedSince
123
+ };