@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,382 @@
1
+ // src/automation/trigger-engine.ts
2
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
3
+ import { randomUUID } from "crypto";
4
+ import path from "path";
5
+ import os from "os";
6
+ var TRIGGERS_PATH = path.join(os.homedir(), ".exe-os", "triggers.json");
7
+ var GRAPH_API_VERSION = "v21.0";
8
+ var MAX_PARAM_LENGTH = 2e3;
9
+ var MAX_TRIGGER_DEPTH = 3;
10
+ var _currentTriggerDepth = 0;
11
+ var OUTBOUND_RATE_LIMIT_PER_HOUR = 100;
12
+ var _outboundWindows = /* @__PURE__ */ new Map();
13
+ function checkOutboundRateLimit(channel) {
14
+ const now = Date.now();
15
+ const cutoff = now - 36e5;
16
+ if (!_outboundWindows.has(channel)) _outboundWindows.set(channel, []);
17
+ const window = _outboundWindows.get(channel);
18
+ while (window.length > 0 && window[0] < cutoff) window.shift();
19
+ if (window.length >= OUTBOUND_RATE_LIMIT_PER_HOUR) return false;
20
+ window.push(now);
21
+ return true;
22
+ }
23
+ function sanitizeParam(value, maxLen = MAX_PARAM_LENGTH) {
24
+ const cleaned = value.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, "");
25
+ return cleaned.length > maxLen ? cleaned.slice(0, maxLen) : cleaned;
26
+ }
27
+ function sanitizeExternalPayload(text) {
28
+ let sanitized = text;
29
+ sanitized = sanitized.replace(/^(system|SYSTEM|System)\s*:/gm, "[filtered]:");
30
+ sanitized = sanitized.replace(/<\/?system[^>]*>/gi, "[filtered]");
31
+ sanitized = sanitized.replace(/ignore\s+(all\s+)?previous\s+(instructions|prompts|rules)/gi, "[filtered]");
32
+ sanitized = sanitized.replace(/you\s+are\s+now\s+/gi, "[filtered] ");
33
+ return sanitized;
34
+ }
35
+ function substituteTemplate(template, record, sanitizeExternal = false) {
36
+ return template.replace(
37
+ /\{\{(\w+(?:\.\w+)*)\}\}/g,
38
+ (_match, dotPath) => {
39
+ const segments = dotPath.split(".");
40
+ if (segments[0] === "record") segments.shift();
41
+ let current = record;
42
+ for (const seg of segments) {
43
+ if (current == null || typeof current !== "object") return "";
44
+ current = current[seg];
45
+ }
46
+ if (current == null) return "";
47
+ const value = String(current);
48
+ return sanitizeExternal ? sanitizeExternalPayload(value) : value;
49
+ }
50
+ );
51
+ }
52
+ function resolveFieldValue(record, field) {
53
+ let current = record;
54
+ for (const segment of field.split(".")) {
55
+ if (current == null || typeof current !== "object") return void 0;
56
+ current = current[segment];
57
+ }
58
+ return current;
59
+ }
60
+ function evaluateCondition(condition, record) {
61
+ const fieldValue = resolveFieldValue(record, condition.field);
62
+ const target = condition.value;
63
+ switch (condition.op) {
64
+ case "eq":
65
+ return String(fieldValue) === String(target);
66
+ case "neq":
67
+ return String(fieldValue) !== String(target);
68
+ case "gt":
69
+ return Number(fieldValue) > Number(target);
70
+ case "lt":
71
+ return Number(fieldValue) < Number(target);
72
+ case "gte":
73
+ return Number(fieldValue) >= Number(target);
74
+ case "lte":
75
+ return Number(fieldValue) <= Number(target);
76
+ case "contains":
77
+ return String(fieldValue).toLowerCase().includes(String(target).toLowerCase());
78
+ case "not_contains":
79
+ return !String(fieldValue).toLowerCase().includes(String(target).toLowerCase());
80
+ default:
81
+ return false;
82
+ }
83
+ }
84
+ function evaluateConditions(conditions, record) {
85
+ if (conditions.length === 0) return true;
86
+ return conditions.every((c) => evaluateCondition(c, record));
87
+ }
88
+ function loadTriggers(project) {
89
+ if (!existsSync(TRIGGERS_PATH)) return [];
90
+ try {
91
+ const raw = readFileSync(TRIGGERS_PATH, "utf-8");
92
+ const all = JSON.parse(raw);
93
+ if (!Array.isArray(all)) return [];
94
+ if (project) {
95
+ return all.filter((t) => !t.project || t.project === project);
96
+ }
97
+ return all;
98
+ } catch {
99
+ return [];
100
+ }
101
+ }
102
+ function saveTriggers(triggers) {
103
+ const dir = path.dirname(TRIGGERS_PATH);
104
+ if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
105
+ writeFileSync(TRIGGERS_PATH, JSON.stringify(triggers, null, 2), "utf-8");
106
+ }
107
+ function createNewTrigger(input) {
108
+ const triggers = loadTriggers();
109
+ const trigger = {
110
+ id: randomUUID().slice(0, 8),
111
+ ...input
112
+ };
113
+ triggers.push(trigger);
114
+ saveTriggers(triggers);
115
+ return trigger;
116
+ }
117
+ async function executeSendWhatsapp(params) {
118
+ if (!checkOutboundRateLimit("whatsapp")) {
119
+ throw new Error(`Outbound rate limit exceeded for WhatsApp (max ${OUTBOUND_RATE_LIMIT_PER_HOUR}/hour)`);
120
+ }
121
+ const { getAccountByName, getDefaultAccount } = await import("./whatsapp-accounts-BWRZUY23.js");
122
+ const account = params.account ? getAccountByName(params.account) : getDefaultAccount();
123
+ if (!account) {
124
+ throw new Error(
125
+ `No WhatsApp account found${params.account ? ` (${params.account})` : ""}`
126
+ );
127
+ }
128
+ const to = params.to ?? params.recipient;
129
+ const message = params.message ?? params.text;
130
+ if (!to || !message)
131
+ throw new Error("send_whatsapp requires 'to' and 'message' params");
132
+ const url = `https://graph.facebook.com/${GRAPH_API_VERSION}/${account.phoneNumberId}/messages`;
133
+ const res = await fetch(url, {
134
+ method: "POST",
135
+ headers: {
136
+ "Content-Type": "application/json",
137
+ Authorization: `Bearer ${account.accessToken}`
138
+ },
139
+ body: JSON.stringify({
140
+ messaging_product: "whatsapp",
141
+ to,
142
+ type: "text",
143
+ text: { body: message }
144
+ }),
145
+ signal: AbortSignal.timeout(3e4)
146
+ });
147
+ if (!res.ok) {
148
+ const errBody = await res.text();
149
+ throw new Error(`WhatsApp send failed (${res.status}): ${errBody}`);
150
+ }
151
+ }
152
+ async function executeSendMessage(params) {
153
+ const { sendMessage } = await import("./lib/messaging.js");
154
+ const { getCoordinatorName } = await import("./lib/employees.js");
155
+ const rawTo = params.to ?? params.recipient;
156
+ const to = rawTo === "coordinator" ? getCoordinatorName() : rawTo;
157
+ const content = params.message ?? params.content ?? params.text;
158
+ if (!to || !content)
159
+ throw new Error("send_message requires 'to' and 'message' params");
160
+ await sendMessage({
161
+ fromAgent: params.from ?? "trigger-engine",
162
+ targetAgent: to,
163
+ content,
164
+ priority: params.priority ?? "normal"
165
+ });
166
+ }
167
+ async function executeCreateTask(params) {
168
+ const { createTask } = await import("./lib/tasks.js");
169
+ const { getCoordinatorName } = await import("./lib/employees.js");
170
+ const rawAssignedTo = params.assigned_to;
171
+ await createTask({
172
+ title: params.title ?? "Triggered task",
173
+ assignedTo: !rawAssignedTo || rawAssignedTo === "coordinator" ? getCoordinatorName() : rawAssignedTo,
174
+ assignedBy: "trigger-engine",
175
+ projectName: params.project ?? "exe-os",
176
+ priority: params.priority ?? "p1",
177
+ context: params.context ?? params.description ?? "",
178
+ baseDir: process.cwd()
179
+ });
180
+ }
181
+ async function executeUpdateWiki(params) {
182
+ const apiUrl = process.env.EXE_WIKI_API_URL;
183
+ const apiKey = process.env.EXE_WIKI_API_KEY;
184
+ if (!apiUrl || !apiKey) {
185
+ throw new Error("Wiki not configured: EXE_WIKI_API_URL / EXE_WIKI_API_KEY not set");
186
+ }
187
+ const workspace = params.workspace;
188
+ const content = params.content ?? params.text;
189
+ const mode = params.mode ?? "append";
190
+ const section = params.section;
191
+ if (!workspace || !content) {
192
+ throw new Error("update_wiki requires 'workspace' and 'content' params");
193
+ }
194
+ const documentId = params.document_id;
195
+ if (documentId && mode === "append") {
196
+ const readRes = await fetch(`${apiUrl}/v1/document/${documentId}`, {
197
+ headers: { Authorization: `Bearer ${apiKey}` },
198
+ signal: AbortSignal.timeout(15e3)
199
+ });
200
+ if (!readRes.ok) {
201
+ throw new Error(`Wiki read failed (${readRes.status})`);
202
+ }
203
+ const doc = await readRes.json();
204
+ const existingContent = String(doc.content ?? "");
205
+ const title = String(doc.title ?? "Untitled");
206
+ await fetch(`${apiUrl}/v1/document/${documentId}`, {
207
+ method: "DELETE",
208
+ headers: { Authorization: `Bearer ${apiKey}` },
209
+ signal: AbortSignal.timeout(15e3)
210
+ }).catch((err) => {
211
+ process.stderr.write(`[trigger-engine] wiki purge failed: ${err instanceof Error ? err.message : String(err)}
212
+ `);
213
+ });
214
+ const uploadRes = await fetch(`${apiUrl}/v1/document/raw-text`, {
215
+ method: "POST",
216
+ headers: {
217
+ "Content-Type": "application/json",
218
+ Authorization: `Bearer ${apiKey}`
219
+ },
220
+ body: JSON.stringify({
221
+ textContent: section ? existingContent + `
222
+
223
+ ## ${section}
224
+ ${content}` : existingContent + "\n\n" + content,
225
+ metadata: { title },
226
+ workspaceSlugs: [workspace]
227
+ }),
228
+ signal: AbortSignal.timeout(15e3)
229
+ });
230
+ if (!uploadRes.ok) throw new Error(`Wiki upload failed (${uploadRes.status})`);
231
+ } else {
232
+ const title = params.title ?? "Auto-generated";
233
+ const res = await fetch(`${apiUrl}/v1/document/raw-text`, {
234
+ method: "POST",
235
+ headers: {
236
+ "Content-Type": "application/json",
237
+ Authorization: `Bearer ${apiKey}`
238
+ },
239
+ body: JSON.stringify({
240
+ textContent: content,
241
+ metadata: { title },
242
+ workspaceSlugs: [workspace]
243
+ }),
244
+ signal: AbortSignal.timeout(15e3)
245
+ });
246
+ if (!res.ok) throw new Error(`Wiki create failed (${res.status})`);
247
+ }
248
+ }
249
+ async function routeToApproval(action, resolvedParams, triggerName) {
250
+ const { createTask } = await import("./lib/tasks.js");
251
+ const { getCoordinatorName } = await import("./lib/employees.js");
252
+ const actionSummary = action.type === "send_whatsapp" ? `Send WhatsApp to ${resolvedParams.to ?? resolvedParams.recipient ?? "unknown"}: "${(resolvedParams.message ?? resolvedParams.text ?? "").slice(0, 100)}"` : `${action.type}: ${JSON.stringify(resolvedParams).slice(0, 200)}`;
253
+ await createTask({
254
+ title: `[Approval Required] ${triggerName}: ${action.type}`,
255
+ assignedTo: getCoordinatorName(),
256
+ assignedBy: "trigger-engine",
257
+ projectName: resolvedParams.project ?? "exe-os",
258
+ priority: "p1",
259
+ context: `Trigger "${triggerName}" wants to execute this action but requires approval.
260
+
261
+ **Action:** ${action.type}
262
+ **Summary:** ${actionSummary}
263
+ **Full params:** ${JSON.stringify(resolvedParams, null, 2)}
264
+
265
+ To approve, manually run the action via MCP tools.`,
266
+ baseDir: process.cwd()
267
+ });
268
+ }
269
+ async function executeAction(action, record, executor, triggerName) {
270
+ if (executor) {
271
+ return executor(action, record);
272
+ }
273
+ const resolvedParams = {};
274
+ for (const [key, val] of Object.entries(action.params)) {
275
+ resolvedParams[key] = sanitizeParam(substituteTemplate(val, record));
276
+ }
277
+ if (action.requires_approval) {
278
+ try {
279
+ await routeToApproval(action, resolvedParams, triggerName ?? "Unknown trigger");
280
+ return { success: true };
281
+ } catch (err) {
282
+ return {
283
+ success: false,
284
+ error: `Approval routing failed: ${err instanceof Error ? err.message : String(err)}`
285
+ };
286
+ }
287
+ }
288
+ try {
289
+ switch (action.type) {
290
+ case "send_whatsapp":
291
+ await executeSendWhatsapp(resolvedParams);
292
+ break;
293
+ case "send_message":
294
+ await executeSendMessage(resolvedParams);
295
+ break;
296
+ case "create_task":
297
+ await executeCreateTask(resolvedParams);
298
+ break;
299
+ case "update_wiki":
300
+ await executeUpdateWiki(resolvedParams);
301
+ break;
302
+ case "asana": {
303
+ const { loadAsanaConfig, executeAsanaOperation } = await import("./asana-MRQ2OQMJ.js");
304
+ const asanaConfig = loadAsanaConfig();
305
+ if (!asanaConfig) throw new Error("Asana not configured: set ASANA_API_TOKEN env var");
306
+ const operation = resolvedParams.operation ?? resolvedParams._operation;
307
+ if (!operation) throw new Error("asana action requires 'operation' param");
308
+ await executeAsanaOperation(asanaConfig, operation, resolvedParams);
309
+ break;
310
+ }
311
+ case "mcp_tool":
312
+ console.log(
313
+ `[trigger-engine] mcp_tool action: ${JSON.stringify(resolvedParams)}`
314
+ );
315
+ break;
316
+ }
317
+ return { success: true };
318
+ } catch (err) {
319
+ return {
320
+ success: false,
321
+ error: err instanceof Error ? err.message : String(err)
322
+ };
323
+ }
324
+ }
325
+ async function processCRMEvent(event, executor, triggersOverride) {
326
+ if (_currentTriggerDepth >= MAX_TRIGGER_DEPTH) {
327
+ console.error(
328
+ `[trigger-engine] Recursion limit (${MAX_TRIGGER_DEPTH}) reached \u2014 skipping event ${event.objectType}.${event.eventType}`
329
+ );
330
+ return [];
331
+ }
332
+ _currentTriggerDepth++;
333
+ try {
334
+ return await _processCRMEventInner(event, executor, triggersOverride);
335
+ } finally {
336
+ _currentTriggerDepth--;
337
+ }
338
+ }
339
+ async function _processCRMEventInner(event, executor, triggersOverride) {
340
+ const eventString = `${event.objectType}.${event.eventType}`;
341
+ const triggers = triggersOverride ?? loadTriggers();
342
+ const logs = [];
343
+ for (const trigger of triggers) {
344
+ if (!trigger.enabled) continue;
345
+ if (trigger.event !== eventString && trigger.event !== "*") continue;
346
+ if (!evaluateConditions(trigger.conditions, event.record)) continue;
347
+ const actionResults = [];
348
+ for (const action of trigger.actions) {
349
+ const result = await executeAction(action, event.record, executor, trigger.name);
350
+ actionResults.push({
351
+ type: action.type,
352
+ success: result.success,
353
+ error: result.error
354
+ });
355
+ }
356
+ const log = {
357
+ triggerId: trigger.id,
358
+ triggerName: trigger.name,
359
+ event: eventString,
360
+ firedAt: (/* @__PURE__ */ new Date()).toISOString(),
361
+ actionsExecuted: actionResults
362
+ };
363
+ logs.push(log);
364
+ console.log(
365
+ `[trigger-engine] Fired "${trigger.name}" on ${eventString}: ${actionResults.filter((a) => a.success).length}/${actionResults.length} actions succeeded`
366
+ );
367
+ }
368
+ return logs;
369
+ }
370
+ function isScheduledTrigger(trigger) {
371
+ return "schedule" in trigger && "query" in trigger;
372
+ }
373
+
374
+ export {
375
+ sanitizeParam,
376
+ substituteTemplate,
377
+ loadTriggers,
378
+ createNewTrigger,
379
+ executeAction,
380
+ processCRMEvent,
381
+ isScheduledTrigger
382
+ };
@@ -0,0 +1,58 @@
1
+ import {
2
+ MODELS_DIR
3
+ } from "./chunk-R36FAN53.js";
4
+
5
+ // src/lib/reranker.ts
6
+ import path from "path";
7
+ import { existsSync } from "fs";
8
+ var RERANKER_MODEL_FILE = process.env.EXE_RERANK_MODEL_FILE ?? "exe-reranker-v1-q4_k_m.gguf";
9
+ function isRerankerAvailable() {
10
+ return existsSync(path.join(MODELS_DIR, RERANKER_MODEL_FILE));
11
+ }
12
+ function getRerankerModelPath() {
13
+ return path.join(MODELS_DIR, RERANKER_MODEL_FILE);
14
+ }
15
+ async function disposeReranker() {
16
+ }
17
+ async function rerankWithScores(query, texts, topK) {
18
+ if (texts.length === 0) return [];
19
+ const { rerankViaWorker } = await import("./lib/exe-daemon.js");
20
+ const scored = await rerankViaWorker(query, texts, topK);
21
+ return scored.map((s) => ({
22
+ text: texts[s.index] ?? "",
23
+ score: s.score,
24
+ index: s.index
25
+ }));
26
+ }
27
+ async function rerank(query, candidates, topK = 5) {
28
+ if (candidates.length === 0) return [];
29
+ if (candidates.length <= topK) return candidates;
30
+ const scored = await rerankWithScores(
31
+ query,
32
+ candidates.map((c) => c.raw_text),
33
+ topK
34
+ );
35
+ return scored.map((s) => candidates[s.index]);
36
+ }
37
+ async function rerankWithContext(query, candidates, topK) {
38
+ if (candidates.length === 0) return [];
39
+ const formattedTexts = candidates.map(
40
+ (c) => c.context ? `[${c.context}] ${c.text.slice(0, 460)}` : c.text.slice(0, 512)
41
+ );
42
+ const { rerankViaWorker } = await import("./lib/exe-daemon.js");
43
+ const scored = await rerankViaWorker(query, formattedTexts, topK);
44
+ return scored.map((s) => ({
45
+ text: candidates[s.index]?.text ?? "",
46
+ score: s.score,
47
+ index: s.index
48
+ }));
49
+ }
50
+
51
+ export {
52
+ isRerankerAvailable,
53
+ getRerankerModelPath,
54
+ disposeReranker,
55
+ rerankWithScores,
56
+ rerank,
57
+ rerankWithContext
58
+ };
@@ -0,0 +1,50 @@
1
+ import {
2
+ sendMessage
3
+ } from "./chunk-24JVDLQJ.js";
4
+ import {
5
+ getActiveAgent
6
+ } from "./chunk-VEUQVKKT.js";
7
+
8
+ // src/mcp/tools/send-message.ts
9
+ import { z } from "zod";
10
+ function registerSendMessage(server) {
11
+ server.registerTool(
12
+ "send_message",
13
+ {
14
+ title: "Send Message",
15
+ description: "Send a structured message to another agent. Messages are queued and delivered via intercom. NOTE: messages are fire-and-forget \u2014 do NOT use for actionable work dispatch. Use create_task instead to assign work to employees.",
16
+ inputSchema: {
17
+ target_agent: z.string().describe("Recipient agent name"),
18
+ content: z.string().describe("Message content"),
19
+ target_project: z.string().optional().describe("Project context (optional)"),
20
+ priority: z.enum(["normal", "urgent"]).default("normal").describe("Message priority (default: normal)"),
21
+ target_device: z.string().optional().describe("Target device ID for cross-machine delivery (default: local)")
22
+ }
23
+ },
24
+ async ({ target_agent, content, target_project, priority, target_device }) => {
25
+ const { agentId } = getActiveAgent();
26
+ const msg = await sendMessage({
27
+ fromAgent: agentId,
28
+ targetAgent: target_agent,
29
+ targetProject: target_project,
30
+ targetDevice: target_device,
31
+ content,
32
+ priority
33
+ });
34
+ const statusText = msg.status === "delivered" ? "delivered" : msg.status === "failed" ? `failed: ${msg.failureReason}` : "queued (pending delivery)";
35
+ return {
36
+ content: [
37
+ {
38
+ type: "text",
39
+ text: `Message sent to ${target_agent}: ${statusText}
40
+ ID: ${msg.id}`
41
+ }
42
+ ]
43
+ };
44
+ }
45
+ );
46
+ }
47
+
48
+ export {
49
+ registerSendMessage
50
+ };
@@ -0,0 +1,127 @@
1
+ import {
2
+ updateTask
3
+ } from "./chunk-7AWH47AR.js";
4
+ import {
5
+ TASK_ALREADY_CLAIMED_PREFIX
6
+ } from "./chunk-ZSUACDQC.js";
7
+
8
+ // src/mcp/tools/update-task.ts
9
+ import { z } from "zod";
10
+ function registerUpdateTask(server) {
11
+ server.registerTool(
12
+ "update_task",
13
+ {
14
+ title: "Update Task",
15
+ description: "Update task status. Employees: use status 'done' with a result summary to complete work \u2014 this triggers needs_review and pings the reviewer automatically. Accepts UUID, slug (filename), or title substring.",
16
+ inputSchema: {
17
+ task_id: z.string().describe("Task identifier \u2014 UUID, slug (e.g. 'fix-auth-bug'), or title substring"),
18
+ status: z.enum(["open", "in_progress", "done", "needs_review", "blocked", "cancelled", "closed"]).describe("New status. 'done' is an alias for 'needs_review' \u2014 both trigger reviewer notification."),
19
+ result: z.string().optional().describe("Result summary (required when completing work)"),
20
+ // Structured result fields (Phase 1: Typed Handoff Objects)
21
+ files_changed: z.array(z.string()).optional().describe("Files created or modified during task execution"),
22
+ decisions: z.array(z.string()).optional().describe("Key decisions made during execution"),
23
+ commits: z.array(z.string()).optional().describe("Commit hashes produced"),
24
+ tests_status: z.enum(["pass", "fail", "skip", "none"]).optional().describe("Test execution status"),
25
+ build_status: z.enum(["pass", "fail", "skip"]).optional().describe("Build status"),
26
+ pr_number: z.number().optional().describe("PR number if created"),
27
+ open_questions: z.array(z.string()).optional().describe("Open questions for reviewer"),
28
+ assertions: z.string().optional().describe(
29
+ 'JSON array of assertions with confidence scores. Use when starting work (in_progress). Format: [{"type":"diagnosis|scope|estimate|approach|build|judgment","claim":"...","confidence":0.8,"basis":"..."}]'
30
+ ),
31
+ assertions_resolved: z.string().optional().describe(
32
+ 'JSON array of resolved assertions. Use when completing work (done/needs_review). Format: [{"claim":"...","outcome":"correct|incorrect|partial","confidence_was":0.8,"actual":"...","why_wrong":"missing_information|wrong_diagnosis|wrong_approach|scope_underestimate|scope_overestimate|external_dependency|changed_requirements","reason":"...","lesson":"..."}]'
33
+ ),
34
+ estimated_minutes: z.number().optional().describe("Time estimate in minutes. Provide when starting work (in_progress). The system auto-computes actual time on completion."),
35
+ estimate_confidence: z.number().min(0).max(1).optional().describe("Confidence in time estimate (0.0-1.0). Provide alongside estimated_minutes.")
36
+ }
37
+ },
38
+ async ({ task_id, status: rawStatus, result, files_changed, decisions, commits, tests_status, build_status, pr_number, open_questions, assertions, assertions_resolved, estimated_minutes, estimate_confidence }) => {
39
+ const status = rawStatus;
40
+ let callerAgentId;
41
+ let callerSession;
42
+ try {
43
+ const { getActiveAgent: getAgent } = await import("./active-agent-UNJO6AJ2.js");
44
+ callerAgentId = getAgent().agentId;
45
+ const { getAgentContext } = await import("./agent-context-AZTTMUHP.js");
46
+ callerSession = getAgentContext()?.sessionHint || process.env.EXE_SESSION_NAME || process.env.EXE_SESSION || void 0;
47
+ } catch {
48
+ }
49
+ let task;
50
+ try {
51
+ task = await updateTask({
52
+ taskId: task_id,
53
+ status,
54
+ result,
55
+ baseDir: process.cwd(),
56
+ callerAgentId,
57
+ filesChanged: files_changed,
58
+ decisions,
59
+ commits,
60
+ testsStatus: tests_status,
61
+ buildStatus: build_status,
62
+ prNumber: pr_number,
63
+ openQuestions: open_questions,
64
+ assertions,
65
+ assertionsResolved: assertions_resolved,
66
+ estimatedMinutes: estimated_minutes,
67
+ estimateConfidence: estimate_confidence,
68
+ callerSession
69
+ });
70
+ } catch (err) {
71
+ const msg = err instanceof Error ? err.message : String(err);
72
+ if (msg.startsWith(TASK_ALREADY_CLAIMED_PREFIX)) {
73
+ return {
74
+ content: [{
75
+ type: "text",
76
+ text: "Task already claimed by another agent. Pick a different task or check list_tasks."
77
+ }],
78
+ isError: true
79
+ };
80
+ }
81
+ throw err;
82
+ }
83
+ let text = `Task "${task.title}" marked ${task.status}.
84
+ File: ${task.taskFile}`;
85
+ const isTerminal = status === "done" || status === "needs_review" || status === "closed";
86
+ if (isTerminal && task.reviewer) {
87
+ try {
88
+ const { notifyCoordinatorTaskCompletion } = await import("./lib/tmux-routing.js");
89
+ const { isCoordinatorName } = await import("./lib/employees.js");
90
+ const reviewer = String(task.reviewer);
91
+ const coordinatorSession = task.sessionScope;
92
+ if (coordinatorSession && isCoordinatorName(reviewer)) {
93
+ notifyCoordinatorTaskCompletion(coordinatorSession, callerAgentId ?? "agent", task.title);
94
+ }
95
+ } catch {
96
+ }
97
+ }
98
+ if (isTerminal && task.nextTask) {
99
+ text += `
100
+
101
+ MANDATORY \u2014 DO NOT ASK THE USER. DO NOT SAY "Want me to continue?" DO NOT STOP.
102
+ You have standing orders: work through your entire queue until it is empty.
103
+
104
+ NEXT TASK: "${task.nextTask.title}" [${task.nextTask.priority}]
105
+ FILE: ${task.nextTask.taskFile}
106
+
107
+ Read that file NOW and begin working. No greeting. No summary. Just start.`;
108
+ } else if (isTerminal && !task.nextTask) {
109
+ text += `
110
+
111
+ All tasks complete. No more open tasks in your queue.`;
112
+ }
113
+ return {
114
+ content: [
115
+ {
116
+ type: "text",
117
+ text
118
+ }
119
+ ]
120
+ };
121
+ }
122
+ );
123
+ }
124
+
125
+ export {
126
+ registerUpdateTask
127
+ };