@askexenow/exe-os 0.9.227 → 0.9.229

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 (446) hide show
  1. package/dist/active-agent-GJDG4CAW.js +24 -0
  2. package/dist/active-agent-WOP3ZHLN.js +25 -0
  3. package/dist/agent-context-ZPDQOAD2.js +9 -0
  4. package/dist/agent-heartbeat-AWTVGE4C.js +60 -0
  5. package/dist/agent-loop-7UM2ENGU.js +10 -0
  6. package/dist/agentic-ontology-ASORFII6.js +25 -0
  7. package/dist/asana-JN2UF47A.js +129 -0
  8. package/dist/assets/ghostty.conf +83 -0
  9. package/dist/assets/statusline-command.sh +44 -0
  10. package/dist/assets/tmux.conf +56 -0
  11. package/dist/assets/wezterm.lua +68 -0
  12. package/dist/backfill-metadata-JRWUECUS.js +596 -0
  13. package/dist/background-jobs-VTOMOTNA.js +25 -0
  14. package/dist/bash-XA65M6T6.js +8 -0
  15. package/dist/behaviors-36T3O2DC.js +24 -0
  16. package/dist/bin/age-ontology-load.js +85 -0
  17. package/dist/bin/agentic-ontology-backfill.js +84 -0
  18. package/dist/bin/agentic-reflection-backfill.js +45 -0
  19. package/dist/bin/agentic-semantic-label.js +193 -0
  20. package/dist/bin/backfill-conversations.js +399 -0
  21. package/dist/bin/backfill-responses.js +227 -0
  22. package/dist/bin/backfill-vectors.js +149 -0
  23. package/dist/bin/bulk-sync-postgres.js +92 -0
  24. package/dist/bin/cc-doctor.js +51 -0
  25. package/dist/bin/cleanup-stale-review-tasks.js +139 -0
  26. package/dist/bin/cli.js +1076 -0
  27. package/dist/bin/customer-readiness.js +389 -0
  28. package/dist/bin/deferred-daemon-restart.js +123 -0
  29. package/dist/bin/exe-agent-config.js +87 -0
  30. package/dist/bin/exe-agent.js +190 -0
  31. package/dist/bin/exe-assign.js +93 -0
  32. package/dist/bin/exe-boot.js +1114 -0
  33. package/dist/bin/exe-call.js +127 -0
  34. package/dist/bin/exe-cloud.js +484 -0
  35. package/dist/bin/exe-dispatch.js +72 -0
  36. package/dist/bin/exe-doctor.js +48 -0
  37. package/dist/bin/exe-export-behaviors.js +48 -0
  38. package/dist/bin/exe-forget.js +204 -0
  39. package/dist/bin/exe-gateway.js +1137 -0
  40. package/dist/bin/exe-healthcheck.js +14 -0
  41. package/dist/bin/exe-heartbeat.js +233 -0
  42. package/dist/bin/exe-kill.js +126 -0
  43. package/dist/bin/exe-launch-agent.js +678 -0
  44. package/dist/bin/exe-new-employee.js +160 -0
  45. package/dist/bin/exe-pending-messages.js +60 -0
  46. package/dist/bin/exe-pending-notifications.js +107 -0
  47. package/dist/bin/exe-pending-reviews.js +81 -0
  48. package/dist/bin/exe-rename.js +219 -0
  49. package/dist/bin/exe-repo-drift.js +95 -0
  50. package/dist/bin/exe-review.js +251 -0
  51. package/dist/bin/exe-search.js +65 -0
  52. package/dist/bin/exe-session-cleanup.js +331 -0
  53. package/dist/bin/exe-settings.js +364 -0
  54. package/dist/bin/exe-start-codex.js +404 -0
  55. package/dist/bin/exe-start-opencode.js +233 -0
  56. package/dist/bin/exe-start.sh +194 -0
  57. package/dist/bin/exe-status.js +34 -0
  58. package/dist/bin/exe-support.js +17 -0
  59. package/dist/bin/exe-team.js +83 -0
  60. package/dist/bin/generate-hook-manifest.js +30 -0
  61. package/dist/bin/git-sweep.js +74 -0
  62. package/dist/bin/graph-backfill.js +78 -0
  63. package/dist/bin/graph-export.js +66 -0
  64. package/dist/bin/graph-layer-benchmark.js +113 -0
  65. package/dist/bin/import-history.js +84 -0
  66. package/dist/bin/install-launchd.js +41 -0
  67. package/dist/bin/install.js +422 -0
  68. package/dist/bin/intercom-check.js +137 -0
  69. package/dist/bin/list-providers.js +128 -0
  70. package/dist/bin/mcp-sessions.js +194 -0
  71. package/dist/bin/orchestration-metrics.js +61 -0
  72. package/dist/bin/postgres-agentic-reflection-backfill.js +123 -0
  73. package/dist/bin/postgres-agentic-semantic-backfill.js +126 -0
  74. package/dist/bin/pre-build-guard.js +98 -0
  75. package/dist/bin/pre-publish.js +224 -0
  76. package/dist/bin/registry-proxy.js +44 -0
  77. package/dist/bin/scan-tasks.js +265 -0
  78. package/dist/bin/setup.js +19 -0
  79. package/dist/bin/shard-migrate.js +162 -0
  80. package/dist/bin/stack-update.js +372 -0
  81. package/dist/bin/update.js +354 -0
  82. package/dist/bin/verify-stack.js +389 -0
  83. package/dist/bin/vps-backup.js +170 -0
  84. package/dist/bin/vps-health-gate.js +232 -0
  85. package/dist/branding-I2TDZFUH.js +97 -0
  86. package/dist/browser-sanitizer-MRSSEJZE.js +229 -0
  87. package/dist/browser-session-store-RF45DSJR.js +232 -0
  88. package/dist/capacity-monitor-HZPAFQZH.js +48 -0
  89. package/dist/catchup-brief-CDG4KD5Y.js +150 -0
  90. package/dist/chunk-26PUEPOY.js +290 -0
  91. package/dist/chunk-2VZ6SY2R.js +142 -0
  92. package/dist/chunk-36DAY227.js +297 -0
  93. package/dist/chunk-3A5BZETG.js +463 -0
  94. package/dist/chunk-3DQ3IPPO.js +50 -0
  95. package/dist/chunk-3JP3FY33.js +258 -0
  96. package/dist/chunk-3MK3R5E6.js +85 -0
  97. package/dist/chunk-46SQTBQW.js +207 -0
  98. package/dist/chunk-4JERP7NT.js +132 -0
  99. package/dist/chunk-557C2IGL.js +0 -0
  100. package/dist/chunk-5BS5ELMC.js +85 -0
  101. package/dist/chunk-5NFBE376.js +391 -0
  102. package/dist/chunk-6A7P74QV.js +53 -0
  103. package/dist/chunk-6KFICEAT.js +20 -0
  104. package/dist/chunk-6MP5NOOR.js +151 -0
  105. package/dist/chunk-6Y4B3QF6.js +19 -0
  106. package/dist/chunk-7BPKHR4O.js +171 -0
  107. package/dist/chunk-7DNX45WB.js +244 -0
  108. package/dist/chunk-7EZCYO76.js +128 -0
  109. package/dist/chunk-7NNXBDOO.js +541 -0
  110. package/dist/chunk-ADJXHBEU.js +667 -0
  111. package/dist/chunk-AHMUF6RO.js +147 -0
  112. package/dist/chunk-AJWFPKQS.js +573 -0
  113. package/dist/chunk-AVE2B4DQ.js +140 -0
  114. package/dist/chunk-AZSCW64F.js +190 -0
  115. package/dist/chunk-BZAQ4UG7.js +614 -0
  116. package/dist/chunk-CHCA3ZM2.js +167 -0
  117. package/dist/chunk-CHT3THVG.js +240 -0
  118. package/dist/chunk-CLGB3FGL.js +48 -0
  119. package/dist/chunk-CQDSTBKT.js +1919 -0
  120. package/dist/chunk-CTFKTUYN.js +627 -0
  121. package/dist/chunk-CVYC6DUW.js +78 -0
  122. package/dist/chunk-CX6GL3ZJ.js +274 -0
  123. package/dist/chunk-D4IVTUNN.js +377 -0
  124. package/dist/chunk-DGOGCPYU.js +390 -0
  125. package/dist/chunk-DKRTWILB.js +81 -0
  126. package/dist/chunk-DLXTKVBO.js +183 -0
  127. package/dist/chunk-E6ORBQHP.js +225 -0
  128. package/dist/chunk-ECGTESAP.js +236 -0
  129. package/dist/chunk-ECQBG62Y.js +363 -0
  130. package/dist/chunk-ECSNSHZ7.js +431 -0
  131. package/dist/chunk-EEAKFEEA.js +221 -0
  132. package/dist/chunk-EGWPJQRQ.js +159 -0
  133. package/dist/chunk-EHKIJPVX.js +30 -0
  134. package/dist/chunk-EIT6J37V.js +119 -0
  135. package/dist/chunk-EQSQ4HBW.js +9 -0
  136. package/dist/chunk-ETSREHYC.js +55 -0
  137. package/dist/chunk-F2GUJW5O.js +1090 -0
  138. package/dist/chunk-F7LU65PQ.js +33 -0
  139. package/dist/chunk-FF62UWIJ.js +90 -0
  140. package/dist/chunk-FIPU4BDF.js +123 -0
  141. package/dist/chunk-FLSASUV3.js +177 -0
  142. package/dist/chunk-FWFFZGSC.js +94 -0
  143. package/dist/chunk-FXU7JOXK.js +6 -0
  144. package/dist/chunk-G4LLKD4Z.js +147 -0
  145. package/dist/chunk-GFCQJZTO.js +1051 -0
  146. package/dist/chunk-GGV3PFUW.js +41 -0
  147. package/dist/chunk-GJV3WDWM.js +14 -0
  148. package/dist/chunk-GKM7RYN3.js +1020 -0
  149. package/dist/chunk-GNHN5HRQ.js +40 -0
  150. package/dist/chunk-GP6G6EQI.js +632 -0
  151. package/dist/chunk-GUMRIUI5.js +63 -0
  152. package/dist/chunk-GVP5U4WL.js +113 -0
  153. package/dist/chunk-HF25XPZE.js +83 -0
  154. package/dist/chunk-HFJNYSTQ.js +1088 -0
  155. package/dist/chunk-HO5SBL4B.js +97 -0
  156. package/dist/chunk-HOKOOBDL.js +52 -0
  157. package/dist/chunk-HQMEOIUJ.js +69 -0
  158. package/dist/chunk-HTCBLSIB.js +813 -0
  159. package/dist/chunk-HYZV25LY.js +34 -0
  160. package/dist/chunk-I2CDSGQW.js +280 -0
  161. package/dist/chunk-I7AW4237.js +251 -0
  162. package/dist/chunk-IKTMX6N7.js +495 -0
  163. package/dist/chunk-IQT43SDJ.js +357 -0
  164. package/dist/chunk-IW53DAYO.js +210 -0
  165. package/dist/chunk-JBKA7F5V.js +2017 -0
  166. package/dist/chunk-JJNXFW7M.js +330 -0
  167. package/dist/chunk-JKGAJAM7.js +214 -0
  168. package/dist/chunk-JQ6TLNIV.js +133 -0
  169. package/dist/chunk-JSH5MAMM.js +284 -0
  170. package/dist/chunk-KCUYRZSX.js +72 -0
  171. package/dist/chunk-KH5Y6RR4.js +360 -0
  172. package/dist/chunk-L24HYX62.js +498 -0
  173. package/dist/chunk-L3TB7CC3.js +170 -0
  174. package/dist/chunk-LHOIY5LQ.js +58 -0
  175. package/dist/chunk-LWVZLTMD.js +412 -0
  176. package/dist/chunk-LYH5HE24.js +73 -0
  177. package/dist/chunk-M37HYGAG.js +346 -0
  178. package/dist/chunk-MJXEOKIW.js +54 -0
  179. package/dist/chunk-MKVFPQH2.js +1051 -0
  180. package/dist/chunk-MLXJ5EZG.js +90 -0
  181. package/dist/chunk-MP2AFCGL.js +53 -0
  182. package/dist/chunk-MSCB4ACU.js +356 -0
  183. package/dist/chunk-MVW62NIZ.js +20 -0
  184. package/dist/chunk-MZIGUUDQ.js +42 -0
  185. package/dist/chunk-N5RRQOAC.js +134 -0
  186. package/dist/chunk-NFB4N53K.js +159 -0
  187. package/dist/chunk-NGP6LSV2.js +25 -0
  188. package/dist/chunk-NGVOA6ZQ.js +84 -0
  189. package/dist/chunk-NRFVWJHP.js +575 -0
  190. package/dist/chunk-NUVDSQNY.js +1345 -0
  191. package/dist/chunk-O377P7GM.js +100 -0
  192. package/dist/chunk-OE6SYHTC.js +157 -0
  193. package/dist/chunk-OHPRXEUA.js +75 -0
  194. package/dist/chunk-OI6MVDSY.js +33 -0
  195. package/dist/chunk-ONKIWA3R.js +249 -0
  196. package/dist/chunk-OPU3NYOO.js +55 -0
  197. package/dist/chunk-ORCCI2VV.js +140 -0
  198. package/dist/chunk-OSMMWGJ2.js +204 -0
  199. package/dist/chunk-OYNKIAVW.js +181 -0
  200. package/dist/chunk-PRKVT4KN.js +90 -0
  201. package/dist/chunk-PW2YH2ZR.js +403 -0
  202. package/dist/chunk-PWMMIGVQ.js +332 -0
  203. package/dist/chunk-Q3V7K4ME.js +149 -0
  204. package/dist/chunk-Q5GUJUDW.js +348 -0
  205. package/dist/chunk-Q7RGLXQO.js +574 -0
  206. package/dist/chunk-Q7XA3SQ4.js +13097 -0
  207. package/dist/chunk-QGGH7LOU.js +93 -0
  208. package/dist/chunk-QHIGMP2M.js +237 -0
  209. package/dist/chunk-QI4IXJN7.js +132 -0
  210. package/dist/chunk-R2E4TV5V.js +56 -0
  211. package/dist/chunk-R4WMF32C.js +81 -0
  212. package/dist/chunk-R5U7XKVJ.js +16 -0
  213. package/dist/chunk-RJT7H2KR.js +349 -0
  214. package/dist/chunk-RMPAMMYW.js +70 -0
  215. package/dist/chunk-RTXGUKY3.js +731 -0
  216. package/dist/chunk-SH45SJQW.js +0 -0
  217. package/dist/chunk-SUNYJ6YE.js +204 -0
  218. package/dist/chunk-SVXDCELZ.js +163 -0
  219. package/dist/chunk-TMEE7AT7.js +72 -0
  220. package/dist/chunk-TNTFEWU5.js +361 -0
  221. package/dist/chunk-TOQZO2XX.js +76 -0
  222. package/dist/chunk-UBMGUX6T.js +3753 -0
  223. package/dist/chunk-UJOSFVWG.js +3511 -0
  224. package/dist/chunk-UPSZ2VKV.js +197 -0
  225. package/dist/chunk-UV4ZHXUP.js +38 -0
  226. package/dist/chunk-UWISNP4U.js +1073 -0
  227. package/dist/chunk-V3QAAU2U.js +129 -0
  228. package/dist/chunk-V4TZI6EO.js +60 -0
  229. package/dist/chunk-W6TC6A73.js +77 -0
  230. package/dist/chunk-WA67SFFZ.js +227 -0
  231. package/dist/chunk-WWPX2LLP.js +262 -0
  232. package/dist/chunk-WZ2RVKRO.js +121 -0
  233. package/dist/chunk-X2Z5GT3V.js +118 -0
  234. package/dist/chunk-X3AVWFWW.js +294 -0
  235. package/dist/chunk-XEKO37NM.js +43 -0
  236. package/dist/chunk-YADYM2DE.js +42 -0
  237. package/dist/chunk-YCTCKUZE.js +128 -0
  238. package/dist/chunk-YGAAZN3E.js +47 -0
  239. package/dist/chunk-YKIPAQZG.js +333 -0
  240. package/dist/chunk-YSU7JB7H.js +0 -0
  241. package/dist/chunk-YZFZDJWZ.js +107 -0
  242. package/dist/chunk-YZKJLGWL.js +169 -0
  243. package/dist/chunk-Z3TT2SVJ.js +135 -0
  244. package/dist/chunk-Z3ZCLTP7.js +382 -0
  245. package/dist/chunk-ZVSG2KKG.js +106 -0
  246. package/dist/co-activation-AJZTQHI3.js +71 -0
  247. package/dist/co-occurrence-FGEJIMMV.js +73 -0
  248. package/dist/code-context-index-KHUYATRB.js +29 -0
  249. package/dist/content-extractor-CUJOBFBU.js +9 -0
  250. package/dist/conversation-entity-extractor-TW4W57K4.js +114 -0
  251. package/dist/conversation-wiki-populator-GNFRTS7X.js +105 -0
  252. package/dist/core-memory-R7QBLN4C.js +110 -0
  253. package/dist/crdt-sync-K25AKQAD.js +33 -0
  254. package/dist/crm-bridge-NG5WJMGF.js +19 -0
  255. package/dist/crm-webhook-3ODT32F7.js +10 -0
  256. package/dist/cto-delegation-gate-4XDMTK6H.js +205 -0
  257. package/dist/daemon-auth-WFQMMNSD.js +13 -0
  258. package/dist/daemon-orchestration-5I7RLXCP.js +133 -0
  259. package/dist/daemon-protocol-4FUHT5NH.js +17 -0
  260. package/dist/db-backup-MSQKO6M5.js +25 -0
  261. package/dist/devtools-J4QYYO7U.js +8 -0
  262. package/dist/discord-7UHIZNJ3.js +7 -0
  263. package/dist/dispatch-ack-RMVFHO4I.js +13 -0
  264. package/dist/dreaming-UL7T5ZXA.js +12 -0
  265. package/dist/email-T6PQUUY6.js +137 -0
  266. package/dist/entity-boost-7MB2IYAE.js +332 -0
  267. package/dist/exe-drift-2KHRPBUK.js +67 -0
  268. package/dist/exe-export-UZN6EFOR.js +72 -0
  269. package/dist/exe-import-OSM3U36A.js +75 -0
  270. package/dist/exe-key-OG35WPBA.js +573 -0
  271. package/dist/exe-org-JRBBON5H.js +73 -0
  272. package/dist/exe-snapshot-7TQIN7XI.js +145 -0
  273. package/dist/factory-UQSRMKJW.js +67 -0
  274. package/dist/fast-db-init-4VXDSFUY.js +7 -0
  275. package/dist/file-edit-YORRFENG.js +8 -0
  276. package/dist/file-read-RMQFDE5L.js +8 -0
  277. package/dist/file-write-VO4MQW5Y.js +8 -0
  278. package/dist/founder-context-3N6BMG7B.js +96 -0
  279. package/dist/gateway/index.js +148 -0
  280. package/dist/gateway-client-V7NH35Q2.js +11 -0
  281. package/dist/git-staleness-JW57ZGEJ.js +109 -0
  282. package/dist/git-task-sweep-HYAPIM44.js +39 -0
  283. package/dist/glob-2LXRC3F5.js +7 -0
  284. package/dist/global-procedures-NY3W7L5Q.js +19 -0
  285. package/dist/graph-auto-extract-5GZ34NXS.js +161 -0
  286. package/dist/graph-query-YZ4RZEIL.js +26 -0
  287. package/dist/graph-rag-S5SBJW5J.js +29 -0
  288. package/dist/grep-OY7KCRLQ.js +7 -0
  289. package/dist/hook-integrity-OKSYTGVP.js +89 -0
  290. package/dist/hooks/bug-report-worker.js +179 -0
  291. package/dist/hooks/codex-stop-task-finalizer.js +258 -0
  292. package/dist/hooks/commit-complete.js +162 -0
  293. package/dist/hooks/error-recall.js +129 -0
  294. package/dist/hooks/exe-heartbeat-hook.js +78 -0
  295. package/dist/hooks/ingest-worker.js +51 -0
  296. package/dist/hooks/ingest.js +491 -0
  297. package/dist/hooks/instructions-loaded.js +119 -0
  298. package/dist/hooks/manifest.json +25 -0
  299. package/dist/hooks/notification.js +67 -0
  300. package/dist/hooks/post-compact.js +138 -0
  301. package/dist/hooks/post-tool-combined.js +152 -0
  302. package/dist/hooks/pre-compact.js +159 -0
  303. package/dist/hooks/pre-tool-use.js +512 -0
  304. package/dist/hooks/prompt-submit.js +699 -0
  305. package/dist/hooks/session-end.js +482 -0
  306. package/dist/hooks/session-start.js +362 -0
  307. package/dist/hooks/stop.js +332 -0
  308. package/dist/hooks/subagent-stop.js +85 -0
  309. package/dist/hooks/summary-worker.js +298 -0
  310. package/dist/hooks-RPTZV5KX.js +9 -0
  311. package/dist/imessage-CE5USLTI.js +7 -0
  312. package/dist/index.js +60 -0
  313. package/dist/installer-GMIVB2JS.js +341 -0
  314. package/dist/installer-OBYQ6O3C.js +295 -0
  315. package/dist/installer-UAMA6ZVH.js +37 -0
  316. package/dist/intercom-queue-USIXVVJQ.js +17 -0
  317. package/dist/key-backup-status-TVFMMWTT.js +39 -0
  318. package/dist/keyword-extractor-OGQRRVTB.js +11 -0
  319. package/dist/lib/agent-config.js +30 -0
  320. package/dist/lib/cloud-sync.js +103 -0
  321. package/dist/lib/cloudflare-dns.js +13 -0
  322. package/dist/lib/config.js +32 -0
  323. package/dist/lib/consolidation.js +38 -0
  324. package/dist/lib/crypto.js +13 -0
  325. package/dist/lib/database.js +31 -0
  326. package/dist/lib/db-daemon-client.js +141 -0
  327. package/dist/lib/db.js +31 -0
  328. package/dist/lib/device-registry.js +70 -0
  329. package/dist/lib/embed-worker.js +165 -0
  330. package/dist/lib/embedder.js +19 -0
  331. package/dist/lib/employee-templates.js +34 -0
  332. package/dist/lib/employees.js +63 -0
  333. package/dist/lib/error-detector.js +16 -0
  334. package/dist/lib/exe-daemon-client.js +25 -0
  335. package/dist/lib/exe-daemon.js +4454 -0
  336. package/dist/lib/file-grep.js +242 -0
  337. package/dist/lib/hybrid-search.js +28 -0
  338. package/dist/lib/identity-templates.js +650 -0
  339. package/dist/lib/identity.js +19 -0
  340. package/dist/lib/keychain.js +17 -0
  341. package/dist/lib/license.js +35 -0
  342. package/dist/lib/messaging.js +59 -0
  343. package/dist/lib/post-tool-memory.js +13 -0
  344. package/dist/lib/registry-proxy.js +15 -0
  345. package/dist/lib/reminders.js +16 -0
  346. package/dist/lib/runtime-table.js +9 -0
  347. package/dist/lib/schedules.js +24 -0
  348. package/dist/lib/session-registry.js +21 -0
  349. package/dist/lib/session-wrappers.js +7 -0
  350. package/dist/lib/skill-learning.js +29 -0
  351. package/dist/lib/status-brief.js +7 -0
  352. package/dist/lib/store.js +43 -0
  353. package/dist/lib/task-router.js +22 -0
  354. package/dist/lib/tasks.js +66 -0
  355. package/dist/lib/tmux-routing.js +70 -0
  356. package/dist/lib/tmux-status.js +29 -0
  357. package/dist/lib/tmux-transport.js +7 -0
  358. package/dist/lib/token-spend.js +12 -0
  359. package/dist/lib/transport.js +10 -0
  360. package/dist/lib/ws-auth.js +11 -0
  361. package/dist/lib/ws-client.js +190 -0
  362. package/dist/license-gate-7QVCYARF.js +14 -0
  363. package/dist/mcp/register-tools.js +102 -0
  364. package/dist/mcp/server.js +370 -0
  365. package/dist/mcp/tools/complete-reminder.js +13 -0
  366. package/dist/mcp/tools/create-reminder.js +13 -0
  367. package/dist/mcp/tools/create-task.js +34 -0
  368. package/dist/mcp/tools/deactivate-behavior.js +16 -0
  369. package/dist/mcp/tools/list-reminders.js +13 -0
  370. package/dist/mcp/tools/list-tasks.js +33 -0
  371. package/dist/mcp/tools/send-message.js +33 -0
  372. package/dist/mcp/tools/update-task.js +32 -0
  373. package/dist/mcp-diagnostics-5T5OZ52S.js +200 -0
  374. package/dist/mcp-disconnect-tracker-VINUVEZJ.js +79 -0
  375. package/dist/mcp-http-config-YPF4WGU5.js +26 -0
  376. package/dist/memory-cards-XHZEOX7Q.js +173 -0
  377. package/dist/memory-graph-extractor-J3K7B4GC.js +16 -0
  378. package/dist/memory-poisoning-defense-I76FGNHK.js +224 -0
  379. package/dist/memory-queue-WEVFXPZO.js +19 -0
  380. package/dist/memory-queue-client-5XBHYAQR.js +15 -0
  381. package/dist/memory-reflection-YJGI6IDI.js +237 -0
  382. package/dist/message-queue-client-FUKX43JD.js +92 -0
  383. package/dist/notifications-H4F77BYT.js +44 -0
  384. package/dist/oauth-server-CCZPDTZJ.js +437 -0
  385. package/dist/orchestration-events-LXVPJL6S.js +24 -0
  386. package/dist/orchestration-phase-HXRKMZXM.js +23 -0
  387. package/dist/orchestrator-HXUZ6LYM.js +32 -0
  388. package/dist/permission-presets-UPVLJWZD.js +25 -0
  389. package/dist/permissions-C4EMHPDD.js +14 -0
  390. package/dist/pg-ssl-GD3332YS.js +7 -0
  391. package/dist/pipeline-router-QRJQWMFF.js +12 -0
  392. package/dist/plan-limits-NFQVRHS5.js +25 -0
  393. package/dist/prediction-log-C2BD3AHR.js +120 -0
  394. package/dist/preferences-5ARPMYE7.js +10 -0
  395. package/dist/preflight-TZOGLBZU.js +287 -0
  396. package/dist/project-boot-JIGOSGCN.js +254 -0
  397. package/dist/project-name-4SKOH2UO.js +10 -0
  398. package/dist/projection-worker-JZQTL4NU.js +877 -0
  399. package/dist/push-notifications-3GNJ5SZS.js +15 -0
  400. package/dist/reranker-U6DEAT4S.js +19 -0
  401. package/dist/review-gate-I66GDXNR.js +120 -0
  402. package/dist/review-polling-W2S3XAAU.js +123 -0
  403. package/dist/runtime/index.js +129 -0
  404. package/dist/self-query-router-QMK5ZSZR.js +188 -0
  405. package/dist/session-events-MNWHGZY5.js +35 -0
  406. package/dist/session-kill-telemetry-JHSI7D3F.js +28 -0
  407. package/dist/session-scope-SMT225X3.js +85 -0
  408. package/dist/setup-wizard-RBUTEZB2.js +12 -0
  409. package/dist/shard-manager-ON2WWCRM.js +29 -0
  410. package/dist/signal-KF2LIO7Y.js +7 -0
  411. package/dist/signal-paths-5ZTWCBUX.js +19 -0
  412. package/dist/skill-refinement-LKJHUW2U.js +156 -0
  413. package/dist/slack-JRDUD5Z7.js +7 -0
  414. package/dist/stack-update-ZIMV4OEQ.js +50 -0
  415. package/dist/steward-gate-6IKH335D.js +12 -0
  416. package/dist/support-outbox-HIJVUDA2.js +206 -0
  417. package/dist/task-enforcement-UIEWTA6H.js +292 -0
  418. package/dist/task-scanner-5OQBNC2N.js +11 -0
  419. package/dist/task-scope-DNQURKOQ.js +34 -0
  420. package/dist/tasks-crud-CLAYZZ4O.js +76 -0
  421. package/dist/tasks-review-OHR2P4QE.js +46 -0
  422. package/dist/telegram-COCYUCT7.js +7 -0
  423. package/dist/telemetry-QKWQKAUC.js +9 -0
  424. package/dist/telemetry-upload-APVDPCEV.js +609 -0
  425. package/dist/token-budget-6IQNYKLR.js +83 -0
  426. package/dist/tool-capability-index-UUNF7VPA.js +10 -0
  427. package/dist/tool-gates-6A6LE4DZ.js +14 -0
  428. package/dist/tool-gates-RNWEH5IK.js +13 -0
  429. package/dist/tool-registry-KL24CAFR.js +11 -0
  430. package/dist/tool-telemetry-SJSIL5M5.js +17 -0
  431. package/dist/tui/App.js +10223 -0
  432. package/dist/tui-data-L6XG4Z52.js +161 -0
  433. package/dist/typed-messages-53Q7L3LB.js +17 -0
  434. package/dist/update-check-5IL5I3E2.js +11 -0
  435. package/dist/webhook-VXGIH7PN.js +96 -0
  436. package/dist/webhook-pipe-4WPFGGFD.js +114 -0
  437. package/dist/whatsapp-PSMKCDS7.js +9 -0
  438. package/dist/whatsapp-accounts-4OKWFRWL.js +15 -0
  439. package/dist/whatsapp-config-ZG5LX4O4.js +125 -0
  440. package/dist/wiki-acl-XCT6QQGP.js +111 -0
  441. package/dist/wiki-client-KE622HKY.js +157 -0
  442. package/dist/worker-gate-GFKXZ6V5.js +21 -0
  443. package/dist/workflow-engine-6HTKI2ZE.js +28 -0
  444. package/dist/working-memory-Z3EB3FW6.js +77 -0
  445. package/dist/worktree-BO7QQ32T.js +25 -0
  446. package/package.json +1 -1
@@ -0,0 +1,135 @@
1
+ import {
2
+ isCoordinatorRole
3
+ } from "./chunk-UJOSFVWG.js";
4
+
5
+ // src/lib/task-router.ts
6
+ import { randomUUID } from "crypto";
7
+ var DEFAULT_BLOOM_CONFIG = {
8
+ complexityToTier: {
9
+ routine: "junior",
10
+ standard: "standard",
11
+ complex: "senior",
12
+ critical: "specialist"
13
+ },
14
+ tierRules: {
15
+ junior: {
16
+ eligible: [],
17
+ // resolved dynamically from roster (Principal Engineer role)
18
+ reviewRequired: false,
19
+ manualOnly: false
20
+ },
21
+ standard: {
22
+ eligible: [],
23
+ // resolved dynamically from roster (Principal Engineer role)
24
+ reviewRequired: false,
25
+ manualOnly: false
26
+ },
27
+ senior: {
28
+ eligible: [],
29
+ // any specialist, but review required
30
+ reviewRequired: true,
31
+ manualOnly: false
32
+ },
33
+ specialist: {
34
+ eligible: [],
35
+ reviewRequired: true,
36
+ manualOnly: true
37
+ }
38
+ }
39
+ };
40
+ function resolveBloomRouting(complexity, config = DEFAULT_BLOOM_CONFIG) {
41
+ const tier = config.complexityToTier[complexity];
42
+ const rule = config.tierRules[tier];
43
+ return {
44
+ tier,
45
+ reviewRequired: rule.reviewRequired,
46
+ manualOnly: rule.manualOnly,
47
+ eligible: rule.eligible
48
+ };
49
+ }
50
+ async function scoreEmployee(taskVector, agentId, searchFn) {
51
+ const results = await searchFn(taskVector, agentId, { limit: 5 });
52
+ if (results.length === 0) {
53
+ return { agentId, score: 0 };
54
+ }
55
+ const distances = results.map((r) => r["_distance"]).filter((d) => typeof d === "number");
56
+ if (distances.length > 0) {
57
+ const avgDistance = distances.reduce((sum, d) => sum + d, 0) / distances.length;
58
+ return { agentId, score: 1 / (1 + avgDistance) };
59
+ }
60
+ return { agentId, score: results.length / 5 };
61
+ }
62
+ async function routeTask(taskDescription, employees, embedFn, searchFn, options) {
63
+ let specialists = employees.filter((e) => !isCoordinatorRole(e.role));
64
+ if (specialists.length === 0) {
65
+ throw new Error(
66
+ "No specialist employees available. Create one with /exe-new-employee."
67
+ );
68
+ }
69
+ let bloomRouting;
70
+ if (options?.complexity) {
71
+ bloomRouting = resolveBloomRouting(options.complexity, options.bloomConfig);
72
+ if (bloomRouting.manualOnly) {
73
+ throw new Error(
74
+ `Task complexity "${options.complexity}" requires manual assignment (tier: ${bloomRouting.tier}).`
75
+ );
76
+ }
77
+ if (bloomRouting.eligible.length > 0) {
78
+ const eligible = new Set(bloomRouting.eligible);
79
+ const filtered = specialists.filter((e) => eligible.has(e.name));
80
+ if (filtered.length > 0) {
81
+ specialists = filtered;
82
+ }
83
+ }
84
+ }
85
+ const taskVector = await embedFn(taskDescription);
86
+ const scored = await Promise.all(
87
+ specialists.map(async (emp) => {
88
+ const { score } = await scoreEmployee(taskVector, emp.name, searchFn);
89
+ return { employee: emp, score };
90
+ })
91
+ );
92
+ scored.sort((a, b) => b.score - a.score);
93
+ return { ...scored[0], bloomRouting };
94
+ }
95
+ function createAssignmentMemory(taskDescription, assignedTo, assignedBy) {
96
+ return {
97
+ id: randomUUID(),
98
+ agent_id: assignedTo.name,
99
+ agent_role: assignedTo.role,
100
+ session_id: `assign-${Date.now()}`,
101
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
102
+ tool_name: "assignment",
103
+ project_name: "",
104
+ has_error: false,
105
+ raw_text: `Task assigned by ${assignedBy}: ${taskDescription}`,
106
+ vector: null
107
+ // Will be backfilled
108
+ };
109
+ }
110
+ function formatAssignmentOutput(employee, task, score, mode, bloomRouting) {
111
+ const modeLabel = mode === "auto" ? "auto-routed" : "direct";
112
+ const percent = Math.round(score * 100);
113
+ const lines = [
114
+ `Assigned to ${employee.name} (${employee.role})`,
115
+ `Mode: ${modeLabel}`,
116
+ `Relevance: ${percent}%`,
117
+ `Task: ${task}`
118
+ ];
119
+ if (bloomRouting) {
120
+ lines.push(`Complexity tier: ${bloomRouting.tier}`);
121
+ if (bloomRouting.reviewRequired) {
122
+ lines.push(`Review: required`);
123
+ }
124
+ }
125
+ return lines.join("\n");
126
+ }
127
+
128
+ export {
129
+ DEFAULT_BLOOM_CONFIG,
130
+ resolveBloomRouting,
131
+ scoreEmployee,
132
+ routeTask,
133
+ createAssignmentMemory,
134
+ formatAssignmentOutput
135
+ };
@@ -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-4OKWFRWL.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-JN2UF47A.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,106 @@
1
+ import {
2
+ loadConfig,
3
+ saveConfig
4
+ } from "./chunk-TNTFEWU5.js";
5
+
6
+ // src/lib/orchestration-phase.ts
7
+ var ORCHESTRATION_PHASES = [
8
+ "phase_1_coo",
9
+ "phase_2_executives",
10
+ "phase_3_parallel_org"
11
+ ];
12
+ var PHASE_INFO = {
13
+ phase_1_coo: {
14
+ phase: "phase_1_coo",
15
+ shortLabel: "Phase 1 \u2014 Coordinator mode",
16
+ label: "Phase 1 \u2014 Coordinator / Chief of Staff mode",
17
+ focus: "building company context before delegation",
18
+ nextSuggestion: "Unlock executives when technical, marketing, ops, legal, or finance work repeats."
19
+ },
20
+ phase_2_executives: {
21
+ phase: "phase_2_executives",
22
+ shortLabel: "Phase 2 \u2014 Executive bench",
23
+ label: "Phase 2 \u2014 Executive bench",
24
+ focus: "Coordinator works with domain executives like CTO/CMO before specialist fan-out",
25
+ nextSuggestion: "Unlock parallel execution when review gates, permissions, and workflows are ready."
26
+ },
27
+ phase_3_parallel_org: {
28
+ phase: "phase_3_parallel_org",
29
+ shortLabel: "Phase 3 \u2014 Parallel org",
30
+ label: "Phase 3 \u2014 Parallel execution org",
31
+ focus: "executives can delegate to specialists in parallel with review gates",
32
+ nextSuggestion: "Keep review/CI/permission gates healthy; downgrade anytime if you want simpler coordinator-only mode."
33
+ }
34
+ };
35
+ function normalizeOrchestrationPhase(input) {
36
+ if (typeof input !== "string") return "phase_1_coo";
37
+ const normalized = input.trim().toLowerCase().replace(/\s+/g, "_");
38
+ if (["1", "phase1", "phase_1", "coo", "coo_mode", "chief_of_staff", "phase_1_coo"].includes(normalized)) {
39
+ return "phase_1_coo";
40
+ }
41
+ if (["2", "phase2", "phase_2", "executives", "executive", "executive_bench", "phase_2_executives"].includes(normalized)) {
42
+ return "phase_2_executives";
43
+ }
44
+ if (["3", "phase3", "phase_3", "parallel", "parallel_org", "parallel_execution", "phase_3_parallel_org"].includes(normalized)) {
45
+ return "phase_3_parallel_org";
46
+ }
47
+ if (ORCHESTRATION_PHASES.includes(normalized)) return normalized;
48
+ return "phase_1_coo";
49
+ }
50
+ function getOrchestrationPhaseInfo(phase) {
51
+ return PHASE_INFO[normalizeOrchestrationPhase(phase)];
52
+ }
53
+ function getConfigOrchestrationPhase(config) {
54
+ const orchestration = config.orchestration;
55
+ return normalizeOrchestrationPhase(orchestration?.phase);
56
+ }
57
+ function applyDefaultOrchestrationPhase(config) {
58
+ if (!config.orchestration) {
59
+ config.orchestration = {
60
+ phase: "phase_1_coo",
61
+ phaseSetAt: (/* @__PURE__ */ new Date()).toISOString(),
62
+ phaseSetBy: "setup-default"
63
+ };
64
+ return config;
65
+ }
66
+ if (!config.orchestration.phase) {
67
+ config.orchestration = {
68
+ ...config.orchestration,
69
+ phase: "phase_1_coo",
70
+ phaseSetAt: config.orchestration.phaseSetAt ?? (/* @__PURE__ */ new Date()).toISOString(),
71
+ phaseSetBy: config.orchestration.phaseSetBy ?? "setup-default"
72
+ };
73
+ }
74
+ return config;
75
+ }
76
+ async function loadOrchestrationPhase() {
77
+ const config = await loadConfig();
78
+ return getOrchestrationPhaseInfo(config.orchestration?.phase);
79
+ }
80
+ async function setOrchestrationPhase(phaseInput, setBy = "user") {
81
+ const config = await loadConfig();
82
+ const phase = normalizeOrchestrationPhase(phaseInput);
83
+ config.orchestration = {
84
+ ...config.orchestration ?? {},
85
+ phase,
86
+ phaseSetAt: (/* @__PURE__ */ new Date()).toISOString(),
87
+ phaseSetBy: setBy
88
+ };
89
+ await saveConfig(config);
90
+ return getOrchestrationPhaseInfo(phase);
91
+ }
92
+ function phaseReminderLine(phase) {
93
+ const info = getOrchestrationPhaseInfo(phase);
94
+ return `${info.shortLabel}: ${info.focus}. ${info.nextSuggestion}`;
95
+ }
96
+
97
+ export {
98
+ ORCHESTRATION_PHASES,
99
+ normalizeOrchestrationPhase,
100
+ getOrchestrationPhaseInfo,
101
+ getConfigOrchestrationPhase,
102
+ applyDefaultOrchestrationPhase,
103
+ loadOrchestrationPhase,
104
+ setOrchestrationPhase,
105
+ phaseReminderLine
106
+ };
@@ -0,0 +1,71 @@
1
+ import {
2
+ getClient
3
+ } from "./chunk-UJOSFVWG.js";
4
+ import "./chunk-QHIGMP2M.js";
5
+ import "./chunk-FXU7JOXK.js";
6
+ import "./chunk-TNTFEWU5.js";
7
+ import "./chunk-LYH5HE24.js";
8
+ import "./chunk-R5U7XKVJ.js";
9
+
10
+ // src/lib/co-activation.ts
11
+ async function recordCoActivations(entityIds) {
12
+ if (entityIds.length < 2) return;
13
+ const unique = [...new Set(entityIds)].slice(0, 20);
14
+ const client = getClient();
15
+ const pairs = [];
16
+ for (let i = 0; i < unique.length; i++) {
17
+ for (let j = i + 1; j < unique.length; j++) {
18
+ const idI = unique[i];
19
+ const idJ = unique[j];
20
+ const pair = idI < idJ ? [idI, idJ] : [idJ, idI];
21
+ pairs.push(pair);
22
+ }
23
+ }
24
+ for (const [a, b] of pairs) {
25
+ await client.execute({
26
+ sql: `INSERT INTO co_activations (entity_a_id, entity_b_id, count, last_activated_at)
27
+ VALUES (?, ?, 1, datetime('now'))
28
+ ON CONFLICT (entity_a_id, entity_b_id)
29
+ DO UPDATE SET count = count + 1, last_activated_at = datetime('now')`,
30
+ args: [a, b]
31
+ });
32
+ }
33
+ }
34
+ async function getHotPairs(limit = 20) {
35
+ const client = getClient();
36
+ const result = await client.execute({
37
+ sql: `SELECT entity_a_id, entity_b_id, count, last_activated_at
38
+ FROM co_activations
39
+ ORDER BY count DESC
40
+ LIMIT ?`,
41
+ args: [limit]
42
+ });
43
+ return result.rows.map((r) => ({
44
+ entity_a_id: String(r.entity_a_id),
45
+ entity_b_id: String(r.entity_b_id),
46
+ count: Number(r.count),
47
+ last_activated_at: String(r.last_activated_at)
48
+ }));
49
+ }
50
+ async function getCoActivationNeighbors(entityId, limit = 20) {
51
+ const client = getClient();
52
+ const result = await client.execute({
53
+ sql: `SELECT entity_a_id, entity_b_id, count, last_activated_at
54
+ FROM co_activations
55
+ WHERE entity_a_id = ? OR entity_b_id = ?
56
+ ORDER BY count DESC
57
+ LIMIT ?`,
58
+ args: [entityId, entityId, limit]
59
+ });
60
+ return result.rows.map((r) => ({
61
+ entity_a_id: String(r.entity_a_id),
62
+ entity_b_id: String(r.entity_b_id),
63
+ count: Number(r.count),
64
+ last_activated_at: String(r.last_activated_at)
65
+ }));
66
+ }
67
+ export {
68
+ getCoActivationNeighbors,
69
+ getHotPairs,
70
+ recordCoActivations
71
+ };