@askexenow/exe-os 0.9.286 → 0.9.288

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 (458) hide show
  1. package/deploy/compose/.env.customer.example +10 -1
  2. package/deploy/compose/.env.example +8 -1
  3. package/deploy/compose/README.md +21 -0
  4. package/deploy/compose/docker-compose.yml +24 -1
  5. package/deploy/compose/generate-env.ts +16 -2
  6. package/deploy/compose/setup.sh +63 -0
  7. package/deploy/stack-manifests/v0.9.json +1 -1
  8. package/dist/active-agent-KB4346K6.js +26 -0
  9. package/dist/active-agent-LTYLGBJX.js +27 -0
  10. package/dist/active-agent-V4W557J4.js +26 -0
  11. package/dist/active-agent-XZVU5XBO.js +27 -0
  12. package/dist/agentic-ontology-4PNQX4YW.js +25 -0
  13. package/dist/agentic-ontology-WOTOTSR7.js +25 -0
  14. package/dist/backfill-metadata-O2BQIEVT.js +599 -0
  15. package/dist/backfill-metadata-PHXNTBNR.js +599 -0
  16. package/dist/background-jobs-RIECIYW5.js +25 -0
  17. package/dist/behaviors-MO5BWFPW.js +39 -0
  18. package/dist/behaviors-TMA2HRTL.js +39 -0
  19. package/dist/bin/age-ontology-load.js +2 -2
  20. package/dist/bin/agentic-ontology-backfill.js +7 -7
  21. package/dist/bin/agentic-reflection-backfill.js +8 -8
  22. package/dist/bin/agentic-semantic-label.js +7 -7
  23. package/dist/bin/backfill-conversations.js +7 -7
  24. package/dist/bin/backfill-responses.js +7 -7
  25. package/dist/bin/backfill-vectors.js +10 -10
  26. package/dist/bin/bulk-sync-postgres.js +8 -8
  27. package/dist/bin/cc-doctor.js +7 -6
  28. package/dist/bin/cleanup-stale-review-tasks.js +13 -13
  29. package/dist/bin/cli.js +20 -20
  30. package/dist/bin/exe-agent-config.js +4 -4
  31. package/dist/bin/exe-agent.js +9 -9
  32. package/dist/bin/exe-assign.js +9 -9
  33. package/dist/bin/exe-boot.js +32 -21
  34. package/dist/bin/exe-call.js +5 -5
  35. package/dist/bin/exe-cloud.js +7 -7
  36. package/dist/bin/exe-dispatch.js +13 -13
  37. package/dist/bin/exe-doctor.js +4 -1
  38. package/dist/bin/exe-export-behaviors.js +8 -8
  39. package/dist/bin/exe-forget.js +7 -7
  40. package/dist/bin/exe-gateway.js +8 -8
  41. package/dist/bin/exe-healthcheck.js +9 -6
  42. package/dist/bin/exe-heartbeat.js +13 -13
  43. package/dist/bin/exe-kill.js +16 -16
  44. package/dist/bin/exe-launch-agent.js +20 -20
  45. package/dist/bin/exe-new-employee.js +8 -8
  46. package/dist/bin/exe-pending-messages.js +14 -14
  47. package/dist/bin/exe-pending-notifications.js +13 -13
  48. package/dist/bin/exe-pending-reviews.js +13 -13
  49. package/dist/bin/exe-rename.js +5 -5
  50. package/dist/bin/exe-review.js +15 -15
  51. package/dist/bin/exe-search.js +6 -6
  52. package/dist/bin/exe-session-cleanup.js +18 -18
  53. package/dist/bin/exe-settings.js +7 -7
  54. package/dist/bin/exe-start-codex.js +12 -12
  55. package/dist/bin/exe-start-opencode.js +9 -9
  56. package/dist/bin/exe-status.js +14 -14
  57. package/dist/bin/exe-support.js +3 -3
  58. package/dist/bin/exe-team.js +4 -4
  59. package/dist/bin/git-sweep.js +14 -14
  60. package/dist/bin/graph-backfill.js +8 -8
  61. package/dist/bin/graph-export.js +6 -6
  62. package/dist/bin/import-history.js +10 -10
  63. package/dist/bin/install.js +7 -7
  64. package/dist/bin/intercom-check.js +4 -4
  65. package/dist/bin/mcp-sessions.js +2 -2
  66. package/dist/bin/orchestration-metrics.js +5 -5
  67. package/dist/bin/postgres-agentic-reflection-backfill.js +4 -4
  68. package/dist/bin/postgres-agentic-semantic-backfill.js +3 -3
  69. package/dist/bin/scan-tasks.js +13 -13
  70. package/dist/bin/setup.js +2 -2
  71. package/dist/bin/shard-migrate.js +6 -6
  72. package/dist/bin/stack-update.js +4 -4
  73. package/dist/bin/vps-health-gate.js +1 -1
  74. package/dist/branding-6PY5DNDC.js +97 -0
  75. package/dist/capability-cards-4NKVY6GD.js +88 -0
  76. package/dist/capability-cards-UD5TCSAZ.js +88 -0
  77. package/dist/capacity-monitor-AU7MVZED.js +50 -0
  78. package/dist/capacity-monitor-CV7PWPYR.js +50 -0
  79. package/dist/catchup-brief-AZND3EET.js +174 -0
  80. package/dist/catchup-brief-TFL6MYOZ.js +154 -0
  81. package/dist/chunk-22R3G3GD.js +297 -0
  82. package/dist/chunk-2CO47E5Q.js +210 -0
  83. package/dist/chunk-2F5UVNYP.js +167 -0
  84. package/dist/chunk-2IJCGYY2.js +30 -0
  85. package/dist/chunk-2V52EJI7.js +14365 -0
  86. package/dist/chunk-2WCXJVSN.js +456 -0
  87. package/dist/chunk-2X52UGP7.js +190 -0
  88. package/dist/chunk-3H5FNTXS.js +85 -0
  89. package/dist/chunk-3OC6MJIX.js +210 -0
  90. package/dist/chunk-3OSDE4Y2.js +1119 -0
  91. package/dist/chunk-43QFBQHT.js +1094 -0
  92. package/dist/chunk-4EBW3URQ.js +4318 -0
  93. package/dist/chunk-4KVMYS3U.js +280 -0
  94. package/dist/chunk-4UTH3H4H.js +128 -0
  95. package/dist/chunk-5BKYHLA3.js +411 -0
  96. package/dist/chunk-5RRYMKXN.js +150 -0
  97. package/dist/chunk-5TYYOPTD.js +50 -0
  98. package/dist/chunk-5XOAYMSU.js +4318 -0
  99. package/dist/chunk-6DQNLI55.js +240 -0
  100. package/dist/chunk-6GOT6FNJ.js +1352 -0
  101. package/dist/chunk-6KH24PJ7.js +221 -0
  102. package/dist/chunk-6TV66RAI.js +192 -0
  103. package/dist/chunk-6UD5CM2H.js +244 -0
  104. package/dist/chunk-6YR3J6WG.js +203 -0
  105. package/dist/chunk-77HA7ATH.js +89 -0
  106. package/dist/chunk-7G52QPUX.js +271 -0
  107. package/dist/chunk-7M5ZHD4E.js +214 -0
  108. package/dist/chunk-A3GC762G.js +333 -0
  109. package/dist/chunk-ALTFDYI6.js +97 -0
  110. package/dist/chunk-AN25OIRX.js +38 -0
  111. package/dist/chunk-AOWC2J6S.js +14225 -0
  112. package/dist/chunk-ASL5PHCT.js +1934 -0
  113. package/dist/chunk-AVTDW4L6.js +562 -0
  114. package/dist/chunk-BEQTE7GH.js +668 -0
  115. package/dist/chunk-BJTBA4XS.js +290 -0
  116. package/dist/chunk-BQBPNRUW.js +231 -0
  117. package/dist/chunk-BQD4XYWX.js +159 -0
  118. package/dist/chunk-BVFCZNJH.js +41 -0
  119. package/dist/chunk-BW7HTZMW.js +240 -0
  120. package/dist/chunk-BZP3ZSRI.js +97 -0
  121. package/dist/chunk-C2NCSKRZ.js +373 -0
  122. package/dist/chunk-C3AH5JAS.js +510 -0
  123. package/dist/chunk-CEKZ77KA.js +471 -0
  124. package/dist/chunk-CNTBRVYW.js +54 -0
  125. package/dist/chunk-CTJQX44O.js +271 -0
  126. package/dist/chunk-CVG2PBCO.js +1105 -0
  127. package/dist/chunk-CZ47BFAT.js +299 -0
  128. package/dist/chunk-CZHC3HIO.js +362 -0
  129. package/dist/chunk-DIZOFRZO.js +284 -0
  130. package/dist/chunk-DRX46W5O.js +1068 -0
  131. package/dist/chunk-DYICAAAM.js +630 -0
  132. package/dist/chunk-E4BXNYLD.js +128 -0
  133. package/dist/chunk-EKXOBH7F.js +227 -0
  134. package/dist/chunk-ELQZYKVN.js +394 -0
  135. package/dist/chunk-EVM22AGQ.js +382 -0
  136. package/dist/chunk-EY7TBDZ5.js +38 -0
  137. package/dist/chunk-FDOEMBUB.js +345 -0
  138. package/dist/chunk-FG2OXKU5.js +539 -0
  139. package/dist/chunk-FP6TDXIL.js +456 -0
  140. package/dist/chunk-FVWATWI2.js +377 -0
  141. package/dist/chunk-G2OW4LUS.js +55 -0
  142. package/dist/chunk-GAYD7KBH.js +836 -0
  143. package/dist/chunk-GETGWHCO.js +227 -0
  144. package/dist/chunk-GGLUKNFC.js +1350 -0
  145. package/dist/chunk-GLEE2MUJ.js +262 -0
  146. package/dist/chunk-GUODMEAR.js +42 -0
  147. package/dist/chunk-H6LA4UV5.js +735 -0
  148. package/dist/chunk-H6PW4LNY.js +129 -0
  149. package/dist/chunk-HEMJ5RDU.js +345 -0
  150. package/dist/chunk-HMP6KB4V.js +382 -0
  151. package/dist/chunk-I35KAK3E.js +458 -0
  152. package/dist/chunk-I4DA5D5Q.js +1922 -0
  153. package/dist/chunk-I53O26HI.js +1119 -0
  154. package/dist/chunk-IBLEQQDQ.js +181 -0
  155. package/dist/chunk-IS2BEXUC.js +2113 -0
  156. package/dist/chunk-ISCEGQHA.js +244 -0
  157. package/dist/chunk-JCERHH3L.js +85 -0
  158. package/dist/chunk-JCNCPBWU.js +97 -0
  159. package/dist/chunk-JEMLH7H2.js +1350 -0
  160. package/dist/chunk-JMR2X5FJ.js +630 -0
  161. package/dist/chunk-JR3MYBWG.js +2078 -0
  162. package/dist/chunk-JSEICUAL.js +197 -0
  163. package/dist/chunk-K3KOLZTH.js +123 -0
  164. package/dist/chunk-K4OH3B2I.js +14248 -0
  165. package/dist/chunk-KQ4Z2G24.js +260 -0
  166. package/dist/chunk-KVH5DSTA.js +369 -0
  167. package/dist/chunk-L4R5NOVT.js +81 -0
  168. package/dist/chunk-LCB6YCE6.js +70 -0
  169. package/dist/chunk-M543SLJZ.js +1352 -0
  170. package/dist/chunk-M6KDMU5P.js +2113 -0
  171. package/dist/chunk-MDAGRPZG.js +197 -0
  172. package/dist/chunk-MLNOSXRZ.js +402 -0
  173. package/dist/chunk-MNI5K34D.js +290 -0
  174. package/dist/chunk-MUDH7ZLR.js +129 -0
  175. package/dist/chunk-MUMBWV57.js +379 -0
  176. package/dist/chunk-NAQLGLOG.js +176 -0
  177. package/dist/chunk-NIBCUAEI.js +123 -0
  178. package/dist/chunk-NIZCTXYW.js +89 -0
  179. package/dist/chunk-NS5G36TN.js +712 -0
  180. package/dist/chunk-NSKQWLQL.js +76 -0
  181. package/dist/chunk-NUA3WRTO.js +1157 -0
  182. package/dist/chunk-O3IESEF6.js +85 -0
  183. package/dist/chunk-OAO2BK25.js +81 -0
  184. package/dist/chunk-OFY7RGLL.js +348 -0
  185. package/dist/chunk-OICU3UHF.js +181 -0
  186. package/dist/chunk-OK6HCC2Z.js +731 -0
  187. package/dist/chunk-ONTUBOYP.js +230 -0
  188. package/dist/chunk-OQB7TERT.js +54 -0
  189. package/dist/chunk-P362EYLO.js +106 -0
  190. package/dist/chunk-P4T4JOCE.js +192 -0
  191. package/dist/chunk-QAOWXQKA.js +333 -0
  192. package/dist/chunk-QEFT6G6J.js +2078 -0
  193. package/dist/chunk-QFVY5MHR.js +402 -0
  194. package/dist/chunk-QLMSROQC.js +604 -0
  195. package/dist/chunk-QNR4ZQDU.js +14365 -0
  196. package/dist/chunk-QQ3T45AO.js +348 -0
  197. package/dist/chunk-QV6HNEMH.js +230 -0
  198. package/dist/chunk-R5LCP56X.js +299 -0
  199. package/dist/chunk-RHTZA6X6.js +1922 -0
  200. package/dist/chunk-RL4RQIEI.js +731 -0
  201. package/dist/chunk-RW4EMKQF.js +185 -0
  202. package/dist/chunk-S35K4C6F.js +127 -0
  203. package/dist/chunk-SFQYQH5Z.js +50 -0
  204. package/dist/chunk-SLFB2RY6.js +133 -0
  205. package/dist/chunk-SSC7EKY2.js +133 -0
  206. package/dist/chunk-SWFFGWAF.js +262 -0
  207. package/dist/chunk-SXZCFZ5T.js +157 -0
  208. package/dist/chunk-T5LT62O5.js +14365 -0
  209. package/dist/chunk-TDGPZF5T.js +539 -0
  210. package/dist/chunk-TF6DEHEL.js +167 -0
  211. package/dist/chunk-TH7ZNVGB.js +33 -0
  212. package/dist/chunk-TTNYB6OH.js +33 -0
  213. package/dist/chunk-TUHR7Z7R.js +221 -0
  214. package/dist/chunk-UHKXYDBM.js +668 -0
  215. package/dist/chunk-UQBD2L52.js +128 -0
  216. package/dist/chunk-UTARH2WY.js +76 -0
  217. package/dist/chunk-UXYAQCIB.js +30 -0
  218. package/dist/chunk-UZHCPLB2.js +127 -0
  219. package/dist/chunk-VNJKA3K5.js +171 -0
  220. package/dist/chunk-VP4MDSUA.js +1156 -0
  221. package/dist/chunk-VWA7OCXI.js +58 -0
  222. package/dist/chunk-VWZZF3YB.js +70 -0
  223. package/dist/chunk-VYPKS352.js +214 -0
  224. package/dist/chunk-W6JB72KR.js +448 -0
  225. package/dist/chunk-WG4PSSI5.js +510 -0
  226. package/dist/chunk-WJPZPASS.js +373 -0
  227. package/dist/chunk-WLDBPKRL.js +3246 -0
  228. package/dist/chunk-WO2SPDUE.js +231 -0
  229. package/dist/chunk-WXEPPHDU.js +1094 -0
  230. package/dist/chunk-WXNSOT6K.js +82 -0
  231. package/dist/chunk-X2PSVVHB.js +448 -0
  232. package/dist/chunk-X5Y4JSD4.js +128 -0
  233. package/dist/chunk-X7VPB6Z5.js +621 -0
  234. package/dist/chunk-XA2GMH53.js +85 -0
  235. package/dist/chunk-XC2ZMYDN.js +204 -0
  236. package/dist/chunk-XFQJH67J.js +157 -0
  237. package/dist/chunk-XLF5F55U.js +230 -0
  238. package/dist/chunk-XQ5LT6UM.js +362 -0
  239. package/dist/chunk-XRMBKPIP.js +204 -0
  240. package/dist/chunk-XUC7YYW5.js +171 -0
  241. package/dist/chunk-XVDWHYIK.js +3276 -0
  242. package/dist/chunk-Y6CVAZ7T.js +97 -0
  243. package/dist/chunk-YA7WVZF5.js +377 -0
  244. package/dist/chunk-YACAOZVG.js +185 -0
  245. package/dist/chunk-YEHV3FN5.js +836 -0
  246. package/dist/chunk-YMZ6IGC3.js +284 -0
  247. package/dist/chunk-Z5P7AUFM.js +280 -0
  248. package/dist/chunk-Z5YFGOLZ.js +1068 -0
  249. package/dist/chunk-ZLYKY6GP.js +150 -0
  250. package/dist/chunk-ZOP7NAM2.js +58 -0
  251. package/dist/chunk-ZUNYZYKV.js +1157 -0
  252. package/dist/co-activation-54LO5GAA.js +73 -0
  253. package/dist/co-activation-ESPLEOMH.js +73 -0
  254. package/dist/co-occurrence-52ZTRX2I.js +94 -0
  255. package/dist/co-occurrence-O4G6VQUU.js +94 -0
  256. package/dist/code-context-index-OX3LN34G.js +30 -0
  257. package/dist/conversation-wiki-populator-IWSKIHQK.js +105 -0
  258. package/dist/core-memory-J6AEOYFN.js +110 -0
  259. package/dist/core-memory-XF4CLLDR.js +110 -0
  260. package/dist/cpu-steal-5YKTUPWF.js +23 -0
  261. package/dist/crdt-sync-5JOW6T2I.js +33 -0
  262. package/dist/crdt-sync-6L4OI4OA.js +33 -0
  263. package/dist/crm-webhook-BAXEYDPD.js +10 -0
  264. package/dist/crm-webhook-KVBGOUHU.js +10 -0
  265. package/dist/cto-delegation-gate-3WUTWBCT.js +279 -0
  266. package/dist/cto-delegation-gate-DZF3Z66I.js +279 -0
  267. package/dist/daemon-auth-M2G5PBME.js +13 -0
  268. package/dist/daemon-orchestration-3ANZVE7Y.js +138 -0
  269. package/dist/daemon-orchestration-APVUUNFB.js +138 -0
  270. package/dist/daemon-restart-report-F3P5AQS4.js +9 -0
  271. package/dist/db-backup-J7253HNV.js +33 -0
  272. package/dist/db-backup-M733ORYE.js +33 -0
  273. package/dist/db-restore-events-AIL6GSEK.js +76 -0
  274. package/dist/db-restore-events-LB3O46HH.js +76 -0
  275. package/dist/doc-graph-extractor-CF2WBSGL.js +132 -0
  276. package/dist/doc-graph-extractor-RSYHLOKD.js +132 -0
  277. package/dist/dreaming-L4FLJJO2.js +33 -0
  278. package/dist/dreaming-YKEKUE55.js +33 -0
  279. package/dist/entity-boost-ZKACOJKH.js +375 -0
  280. package/dist/exe-drift-AVJRXHCB.js +69 -0
  281. package/dist/exe-drift-MYT5NQ52.js +69 -0
  282. package/dist/exe-export-T2FHC5GC.js +75 -0
  283. package/dist/exe-export-TBV2JI4P.js +75 -0
  284. package/dist/exe-import-6UAKJF3Y.js +78 -0
  285. package/dist/exe-import-KJQO4PJX.js +78 -0
  286. package/dist/exe-key-KGQUC27D.js +580 -0
  287. package/dist/exe-key-Q772PMBM.js +580 -0
  288. package/dist/exe-org-KK22SSB3.js +73 -0
  289. package/dist/exe-snapshot-KF3HPOWJ.js +337 -0
  290. package/dist/exe-snapshot-SK6PMOFA.js +337 -0
  291. package/dist/fast-db-init-EXNYB2HK.js +7 -0
  292. package/dist/fast-db-init-FMECTLNS.js +7 -0
  293. package/dist/founder-context-N2VZ5MY2.js +96 -0
  294. package/dist/gateway/index.js +12 -12
  295. package/dist/git-staleness-2EOHIOMZ.js +111 -0
  296. package/dist/git-staleness-ZEYJXPFP.js +111 -0
  297. package/dist/git-task-sweep-I74JXGNT.js +41 -0
  298. package/dist/git-task-sweep-YKLOPYYV.js +41 -0
  299. package/dist/global-procedures-B23F4IQ3.js +21 -0
  300. package/dist/global-procedures-LUBLZ6WN.js +21 -0
  301. package/dist/graph-auto-extract-CSLZXRDY.js +182 -0
  302. package/dist/graph-auto-extract-DZRIETGW.js +182 -0
  303. package/dist/hook-integrity-HJBXTLQD.js +89 -0
  304. package/dist/hooks/bug-report-worker.js +15 -15
  305. package/dist/hooks/codex-stop-task-finalizer.js +15 -15
  306. package/dist/hooks/commit-complete.js +16 -16
  307. package/dist/hooks/error-recall.js +8 -8
  308. package/dist/hooks/exe-heartbeat-hook.js +5 -5
  309. package/dist/hooks/ingest-worker.js +5 -5
  310. package/dist/hooks/ingest.js +12 -12
  311. package/dist/hooks/instructions-loaded.js +6 -6
  312. package/dist/hooks/manifest.json +20 -20
  313. package/dist/hooks/notification.js +6 -6
  314. package/dist/hooks/post-compact.js +15 -15
  315. package/dist/hooks/post-tool-combined.js +7 -7
  316. package/dist/hooks/pre-compact.js +20 -20
  317. package/dist/hooks/pre-tool-use.js +19 -19
  318. package/dist/hooks/prompt-submit.js +27 -27
  319. package/dist/hooks/session-end.js +25 -25
  320. package/dist/hooks/session-start.js +37 -13
  321. package/dist/hooks/stop.js +22 -22
  322. package/dist/hooks/subagent-stop.js +15 -15
  323. package/dist/hooks/summary-worker.js +22 -22
  324. package/dist/index.js +23 -23
  325. package/dist/installer-AU5VMP4U.js +39 -0
  326. package/dist/installer-H7BIYSIK.js +39 -0
  327. package/dist/installer-L4NJWZGV.js +297 -0
  328. package/dist/installer-QE3LBMVF.js +343 -0
  329. package/dist/installer-QH75OOGL.js +297 -0
  330. package/dist/installer-XREYYGF2.js +343 -0
  331. package/dist/key-backup-status-IJCQT4NV.js +39 -0
  332. package/dist/lib/agent-config.js +2 -2
  333. package/dist/lib/cloud-sync.js +6 -6
  334. package/dist/lib/config.js +7 -3
  335. package/dist/lib/consolidation.js +8 -8
  336. package/dist/lib/database.js +3 -3
  337. package/dist/lib/db-daemon-client.js +3 -3
  338. package/dist/lib/db.js +3 -3
  339. package/dist/lib/device-registry.js +1 -1
  340. package/dist/lib/embed-worker.js +1 -1
  341. package/dist/lib/embedder.js +4 -4
  342. package/dist/lib/employee-templates.js +5 -5
  343. package/dist/lib/employees.js +3 -3
  344. package/dist/lib/exe-daemon-client.js +3 -3
  345. package/dist/lib/exe-daemon.js +51 -51
  346. package/dist/lib/hybrid-search.js +6 -6
  347. package/dist/lib/identity.js +3 -3
  348. package/dist/lib/license.js +2 -2
  349. package/dist/lib/messaging.js +13 -13
  350. package/dist/lib/reminders.js +4 -4
  351. package/dist/lib/schedules.js +6 -6
  352. package/dist/lib/session-registry.js +5 -5
  353. package/dist/lib/skill-learning.js +7 -7
  354. package/dist/lib/status-brief.js +1 -1
  355. package/dist/lib/store.js +5 -5
  356. package/dist/lib/task-router.js +4 -4
  357. package/dist/lib/tasks.js +14 -14
  358. package/dist/lib/tmux-routing.js +12 -12
  359. package/dist/lib/token-spend.js +4 -4
  360. package/dist/license-gate-X57APN2E.js +14 -0
  361. package/dist/mcp/register-tools.js +71 -69
  362. package/dist/mcp/server.js +73 -71
  363. package/dist/mcp/tools/complete-reminder.js +5 -5
  364. package/dist/mcp/tools/create-reminder.js +5 -5
  365. package/dist/mcp/tools/create-task.js +16 -16
  366. package/dist/mcp/tools/deactivate-behavior.js +8 -8
  367. package/dist/mcp/tools/list-reminders.js +5 -5
  368. package/dist/mcp/tools/list-tasks.js +16 -16
  369. package/dist/mcp/tools/send-message.js +15 -15
  370. package/dist/mcp/tools/update-task.js +15 -15
  371. package/dist/mcp-http-config-KMP55RXI.js +28 -0
  372. package/dist/mcp-http-config-XYHPQVRA.js +28 -0
  373. package/dist/memory-cards-AULW7ITU.js +179 -0
  374. package/dist/memory-cards-NLTRIBSD.js +179 -0
  375. package/dist/memory-graph-extractor-NGJQIKAA.js +21 -0
  376. package/dist/memory-graph-extractor-QWFPKSX5.js +21 -0
  377. package/dist/memory-poisoning-defense-5WWOLHUQ.js +223 -0
  378. package/dist/memory-poisoning-defense-742X4H52.js +223 -0
  379. package/dist/memory-queue-OXHHNDOC.js +19 -0
  380. package/dist/memory-queue-client-P4TZNVQB.js +16 -0
  381. package/dist/memory-reflection-6GF5OK2W.js +243 -0
  382. package/dist/memory-reflection-SGIE7OJ7.js +243 -0
  383. package/dist/message-queue-client-ELWCWKBO.js +92 -0
  384. package/dist/notifications-67M5SPLO.js +46 -0
  385. package/dist/notifications-HUH2H5WZ.js +46 -0
  386. package/dist/oauth-server-RKCMPBIP.js +437 -0
  387. package/dist/orchestration-events-MC3IZ46I.js +26 -0
  388. package/dist/orchestration-events-NZCUTMCJ.js +26 -0
  389. package/dist/orchestration-phase-FPAVQ57X.js +23 -0
  390. package/dist/orchestrator-3MJ6YJKT.js +34 -0
  391. package/dist/orchestrator-HOXFT4PP.js +34 -0
  392. package/dist/pipeline-router-NCUDK335.js +14 -0
  393. package/dist/pipeline-router-POLBFEBM.js +14 -0
  394. package/dist/plan-limits-DGAFE7V6.js +27 -0
  395. package/dist/plan-limits-J4WXJVDS.js +27 -0
  396. package/dist/project-boot-FRCQHQTF.js +299 -0
  397. package/dist/project-boot-QHXOUJGT.js +299 -0
  398. package/dist/projection-worker-QZW4DOY3.js +1034 -0
  399. package/dist/projection-worker-XDKC3GIZ.js +1034 -0
  400. package/dist/prospective-memory-JIGVZM2I.js +231 -0
  401. package/dist/push-notifications-ERC4SQSQ.js +15 -0
  402. package/dist/reranker-SF3LMYGY.js +19 -0
  403. package/dist/reranker-SOM2WMD6.js +19 -0
  404. package/dist/retrieval-health-7FRD2KLM.js +11 -0
  405. package/dist/retrieval-health-P6QHP263.js +11 -0
  406. package/dist/review-polling-66EJAMR3.js +125 -0
  407. package/dist/review-polling-SYKYNFRK.js +125 -0
  408. package/dist/runtime/index.js +19 -19
  409. package/dist/session-events-A6EDTM27.js +37 -0
  410. package/dist/session-events-DONPZ7DR.js +37 -0
  411. package/dist/session-kill-telemetry-NV2S2YZ2.js +30 -0
  412. package/dist/session-kill-telemetry-Y47QAFHP.js +30 -0
  413. package/dist/session-scope-H3FJVQ6E.js +87 -0
  414. package/dist/session-scope-I56DVQEY.js +87 -0
  415. package/dist/setup-wizard-MX3S3DVH.js +12 -0
  416. package/dist/setup-wizard-YRBCVPCU.js +12 -0
  417. package/dist/shard-manager-AX4W5B3N.js +30 -0
  418. package/dist/skill-refinement-57DCIDKT.js +158 -0
  419. package/dist/skill-refinement-XTBCHOMO.js +158 -0
  420. package/dist/stack-update-45SNTDZ6.js +76 -0
  421. package/dist/stack-update-CZ2QHS6T.js +76 -0
  422. package/dist/stack-update-XNEO4WQH.js +76 -0
  423. package/dist/steward-gate-J7VMPHEN.js +14 -0
  424. package/dist/steward-gate-PVUKWYED.js +14 -0
  425. package/dist/task-enforcement-G4MYUJ2E.js +439 -0
  426. package/dist/task-enforcement-QBF44BXN.js +439 -0
  427. package/dist/task-scope-D2VOYU3P.js +36 -0
  428. package/dist/task-scope-HGL6VACL.js +36 -0
  429. package/dist/tasks-crud-DFE4XOW7.js +78 -0
  430. package/dist/tasks-crud-J5TSLFQN.js +78 -0
  431. package/dist/tasks-notify-2VRKOK74.js +39 -0
  432. package/dist/tasks-notify-Q23MIKDA.js +39 -0
  433. package/dist/tasks-review-NRSVHN7V.js +48 -0
  434. package/dist/tasks-review-VV3RLPLT.js +48 -0
  435. package/dist/telemetry-upload-ISI6TEX4.js +740 -0
  436. package/dist/telemetry-upload-XML6WVPW.js +740 -0
  437. package/dist/token-budget-KVRHMY7V.js +85 -0
  438. package/dist/token-budget-WV2GIFYJ.js +85 -0
  439. package/dist/tool-capability-index-NOMFY27N.js +10 -0
  440. package/dist/tool-telemetry-6DGIQUV3.js +17 -0
  441. package/dist/tool-telemetry-NXPM2T5E.js +17 -0
  442. package/dist/tui/App.js +80 -38
  443. package/dist/tui-data-C4474APN.js +259 -0
  444. package/dist/tui-data-KP66NOW3.js +259 -0
  445. package/dist/webhook-pipe-ZAEPBTDB.js +114 -0
  446. package/dist/wiki-acl-4A3ZUPJK.js +111 -0
  447. package/dist/wiki-acl-DRTEVIHT.js +111 -0
  448. package/dist/wiki-client-AN52BINX.js +157 -0
  449. package/dist/worker-gate-EVSFKALM.js +21 -0
  450. package/dist/worker-gate-O2KXQN5T.js +21 -0
  451. package/dist/workflow-engine-MUO435MX.js +28 -0
  452. package/dist/workflow-engine-RV6JLGHQ.js +28 -0
  453. package/dist/worktree-36S7LYES.js +27 -0
  454. package/dist/worktree-WTNPY42O.js +27 -0
  455. package/dist/worktree-sweep-M5AXCSU7.js +20 -0
  456. package/dist/worktree-sweep-NKEGKQT3.js +20 -0
  457. package/package.json +1 -1
  458. package/release-notes.json +20 -20
@@ -0,0 +1,154 @@
1
+ import {
2
+ lightweightSearch
3
+ } from "./chunk-6GOT6FNJ.js";
4
+ import "./chunk-AB4PAQYK.js";
5
+ import "./chunk-YEHV3FN5.js";
6
+ import "./chunk-CHCA3ZM2.js";
7
+ import "./chunk-OTVEIJUQ.js";
8
+ import "./chunk-2CO47E5Q.js";
9
+ import "./chunk-Y25OJWOQ.js";
10
+ import {
11
+ sessionScopeFilter,
12
+ strictSessionScopeFilter
13
+ } from "./chunk-5XOAYMSU.js";
14
+ import "./chunk-Z5P7AUFM.js";
15
+ import "./chunk-4JERP7NT.js";
16
+ import "./chunk-4FVVJ7ME.js";
17
+ import "./chunk-WO2SPDUE.js";
18
+ import "./chunk-MVW62NIZ.js";
19
+ import "./chunk-OYNKIAVW.js";
20
+ import "./chunk-SSTLTIF3.js";
21
+ import "./chunk-JMR2X5FJ.js";
22
+ import "./chunk-PMVOUPTY.js";
23
+ import "./chunk-NGP6LSV2.js";
24
+ import "./chunk-MUDH7ZLR.js";
25
+ import "./chunk-CVYC6DUW.js";
26
+ import "./chunk-OPU3NYOO.js";
27
+ import "./chunk-GJV3WDWM.js";
28
+ import "./chunk-MP2AFCGL.js";
29
+ import "./chunk-VWZZF3YB.js";
30
+ import "./chunk-HYZV25LY.js";
31
+ import {
32
+ getClient
33
+ } from "./chunk-WLDBPKRL.js";
34
+ import "./chunk-2I23RPSI.js";
35
+ import "./chunk-R5LCP56X.js";
36
+ import "./chunk-5DNJPRDW.js";
37
+ import "./chunk-FXU7JOXK.js";
38
+ import "./chunk-Z42MXYWW.js";
39
+ import "./chunk-YMKUXZIG.js";
40
+ import "./chunk-T3B5RK4H.js";
41
+ import "./chunk-LYH5HE24.js";
42
+ import "./chunk-MLKGABMK.js";
43
+
44
+ // src/lib/catchup-brief.ts
45
+ import { execSync } from "child_process";
46
+ var HEADER = "## Catchup Brief\nHere's what happened while you were offline:";
47
+ var DEFAULT_LOOKBACK_MS = 60 * 60 * 1e3;
48
+ var MAX_BRIEF_CHARS = 2e3;
49
+ var MAX_CHECKPOINT_CHARS = 500;
50
+ var MAX_MESSAGE_CHARS = 100;
51
+ function clipText(text, maxChars) {
52
+ if (text.length <= maxChars) return text;
53
+ if (maxChars <= 1) return "\u2026";
54
+ return `${text.slice(0, maxChars - 1).trimEnd()}\u2026`;
55
+ }
56
+ function clampSections(header, sections, maxChars) {
57
+ const bounded = [];
58
+ let remaining = Math.max(0, maxChars - header.length);
59
+ for (const section of sections) {
60
+ const separatorChars = 2;
61
+ if (remaining <= separatorChars) break;
62
+ remaining -= separatorChars;
63
+ if (section.length <= remaining) {
64
+ bounded.push(section);
65
+ remaining -= section.length;
66
+ continue;
67
+ }
68
+ const clipped = clipText(section, remaining);
69
+ if (clipped.trim().length > 0) bounded.push(clipped);
70
+ break;
71
+ }
72
+ return bounded;
73
+ }
74
+ async function buildCatchupBrief(agentId, projectName, cwd, sessionScope) {
75
+ const sections = [];
76
+ let lastTimestamp = new Date(Date.now() - DEFAULT_LOOKBACK_MS).toISOString();
77
+ try {
78
+ const checkpointMemories = await lightweightSearch(
79
+ "CONTEXT CHECKPOINT",
80
+ agentId,
81
+ { projectName, limit: 1 }
82
+ );
83
+ const checkpoint = checkpointMemories[0];
84
+ if (checkpoint?.timestamp) {
85
+ lastTimestamp = checkpoint.timestamp;
86
+ }
87
+ if (checkpoint?.raw_text) {
88
+ sections.push(
89
+ `### Last Checkpoint
90
+ ${clipText(checkpoint.raw_text, MAX_CHECKPOINT_CHARS)}`
91
+ );
92
+ }
93
+ } catch {
94
+ }
95
+ try {
96
+ const gitLog = execSync(
97
+ `git log --oneline --since=${JSON.stringify(lastTimestamp)} --format="%h %an: %s" | head -10`,
98
+ { cwd, timeout: 3e3, encoding: "utf-8" }
99
+ ).trim();
100
+ if (gitLog) {
101
+ sections.push(`### Git Activity Since You Left
102
+ \`\`\`
103
+ ${gitLog}
104
+ \`\`\``);
105
+ }
106
+ } catch {
107
+ }
108
+ try {
109
+ const client = getClient();
110
+ const taskScope = sessionScopeFilter(sessionScope);
111
+ const taskChanges = await client.execute({
112
+ sql: `SELECT title, status, priority FROM tasks
113
+ WHERE assigned_to = ? AND project_name = ?
114
+ AND updated_at > ? AND status IN ('open', 'in_progress')${taskScope.sql}
115
+ ORDER BY priority ASC, updated_at DESC LIMIT 5`,
116
+ args: [agentId, projectName, lastTimestamp, ...taskScope.args]
117
+ });
118
+ if (taskChanges.rows.length > 0) {
119
+ const taskLines = taskChanges.rows.map((row) => {
120
+ const record = row;
121
+ return `- [${String(record.priority).toUpperCase()}] ${String(record.title)} (${String(record.status)})`;
122
+ }).join("\n");
123
+ sections.push(`### Your Task Queue
124
+ ${taskLines}`);
125
+ }
126
+ } catch {
127
+ }
128
+ try {
129
+ const client = getClient();
130
+ const messageScope = strictSessionScopeFilter(sessionScope);
131
+ const messages = await client.execute({
132
+ sql: `SELECT from_agent, content, created_at FROM messages
133
+ WHERE target_agent = ? AND status = 'pending'${messageScope.sql}
134
+ ORDER BY created_at DESC LIMIT 3`,
135
+ args: [agentId, ...messageScope.args]
136
+ });
137
+ if (messages.rows.length > 0) {
138
+ const msgLines = messages.rows.map((row) => {
139
+ const record = row;
140
+ return `- From ${String(record.from_agent)}: ${clipText(String(record.content ?? ""), MAX_MESSAGE_CHARS)}`;
141
+ }).join("\n");
142
+ sections.push(`### Unread Messages
143
+ ${msgLines}`);
144
+ }
145
+ } catch {
146
+ }
147
+ return {
148
+ header: HEADER,
149
+ sections: clampSections(HEADER, sections, MAX_BRIEF_CHARS)
150
+ };
151
+ }
152
+ export {
153
+ buildCatchupBrief
154
+ };
@@ -0,0 +1,297 @@
1
+ import {
2
+ EXE_AI_DIR
3
+ } from "./chunk-CEKZ77KA.js";
4
+ import {
5
+ atomicWriteJsonSync
6
+ } from "./chunk-LYH5HE24.js";
7
+
8
+ // src/lib/background-jobs.ts
9
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from "fs";
10
+ import { execFileSync } from "child_process";
11
+ import os from "os";
12
+ import path from "path";
13
+ var JOB_DIR = path.join(EXE_AI_DIR, "jobs");
14
+ var JOBS_FILE = path.join(JOB_DIR, "jobs.json");
15
+ var LOCK_DIR = path.join(JOB_DIR, "locks");
16
+ var DEFAULT_LOCK_TTL_MS = 6 * 60 * 60 * 1e3;
17
+ var MAX_HISTORY = 200;
18
+ function ensureDirs() {
19
+ mkdirSync(LOCK_DIR, { recursive: true });
20
+ }
21
+ function now() {
22
+ return (/* @__PURE__ */ new Date()).toISOString();
23
+ }
24
+ function isAlive(pid) {
25
+ if (!pid || pid <= 0) return false;
26
+ try {
27
+ process.kill(pid, 0);
28
+ return true;
29
+ } catch {
30
+ return false;
31
+ }
32
+ }
33
+ function readJobsRaw() {
34
+ ensureDirs();
35
+ if (!existsSync(JOBS_FILE)) return [];
36
+ try {
37
+ const parsed = JSON.parse(readFileSync(JOBS_FILE, "utf8"));
38
+ return Array.isArray(parsed) ? parsed : [];
39
+ } catch {
40
+ return [];
41
+ }
42
+ }
43
+ function writeJobsRaw(jobs) {
44
+ ensureDirs();
45
+ const running = jobs.filter((j) => j.status === "running");
46
+ const rest = jobs.filter((j) => j.status !== "running").slice(-MAX_HISTORY);
47
+ atomicWriteJsonSync(JOBS_FILE, [...rest, ...running]);
48
+ }
49
+ function listBackgroundJobs() {
50
+ const jobs = readJobsRaw();
51
+ let changed = false;
52
+ for (const job of jobs) {
53
+ if (job.status === "running" && !isAlive(job.pid)) {
54
+ job.status = "stale";
55
+ job.updatedAt = now();
56
+ changed = true;
57
+ }
58
+ }
59
+ if (changed) writeJobsRaw(jobs);
60
+ return jobs;
61
+ }
62
+ function lockPath(type) {
63
+ return path.join(LOCK_DIR, `${type.replace(/[^a-zA-Z0-9_.-]/g, "_")}.lock`);
64
+ }
65
+ function acquireJobLock(type, ttlMs = DEFAULT_LOCK_TTL_MS) {
66
+ ensureDirs();
67
+ const file = lockPath(type);
68
+ if (existsSync(file)) {
69
+ try {
70
+ const lock = JSON.parse(readFileSync(file, "utf8"));
71
+ const age = Date.now() - Date.parse(lock.updatedAt ?? "");
72
+ if (lock.pid && isAlive(lock.pid) && Number.isFinite(age) && age < ttlMs) return false;
73
+ } catch {
74
+ }
75
+ try {
76
+ unlinkSync(file);
77
+ } catch {
78
+ }
79
+ }
80
+ try {
81
+ writeFileSync(file, JSON.stringify({ pid: process.pid, updatedAt: now() }, null, 2) + "\n", { flag: "wx" });
82
+ return true;
83
+ } catch {
84
+ return false;
85
+ }
86
+ }
87
+ function releaseJobLock(type) {
88
+ const file = lockPath(type);
89
+ try {
90
+ if (!existsSync(file)) return;
91
+ const lock = JSON.parse(readFileSync(file, "utf8"));
92
+ if (lock.pid === process.pid || !lock.pid || !isAlive(lock.pid)) unlinkSync(file);
93
+ } catch (e) {
94
+ process.stderr.write("[bg-jobs] releaseJobLock read/parse: " + (e instanceof Error ? e.message : String(e)) + "\n");
95
+ try {
96
+ unlinkSync(file);
97
+ } catch {
98
+ }
99
+ }
100
+ }
101
+ function startManagedJob(options) {
102
+ const lowPriority = options.lowPriority ?? true;
103
+ if (!acquireJobLock(options.type, options.lockTtlMs)) return null;
104
+ if (lowPriority) {
105
+ try {
106
+ os.setPriority(process.pid, 10);
107
+ } catch {
108
+ }
109
+ }
110
+ const id = `${options.type}-${Date.now()}-${process.pid}`.replace(/[^a-zA-Z0-9_.-]/g, "_");
111
+ const record = {
112
+ id,
113
+ type: options.type,
114
+ name: options.name,
115
+ pid: process.pid,
116
+ command: options.command ?? process.argv.join(" "),
117
+ cwd: process.cwd(),
118
+ status: "running",
119
+ startedAt: now(),
120
+ updatedAt: now(),
121
+ lastHeartbeatAt: now(),
122
+ cancelCommand: `exe-os jobs cancel ${id}`,
123
+ lowPriority
124
+ };
125
+ const upsert = (patch) => {
126
+ const jobs = readJobsRaw().filter((j) => j.id !== id);
127
+ Object.assign(record, patch, { updatedAt: now() });
128
+ writeJobsRaw([...jobs, record]);
129
+ const file = lockPath(options.type);
130
+ try {
131
+ writeFileSync(file, JSON.stringify({ pid: process.pid, jobId: id, updatedAt: record.updatedAt }, null, 2) + "\n");
132
+ } catch {
133
+ }
134
+ };
135
+ upsert({});
136
+ const timer = setInterval(() => upsert({ lastHeartbeatAt: now() }), 3e4);
137
+ timer.unref?.();
138
+ const cleanup = (status, error) => {
139
+ clearInterval(timer);
140
+ upsert({ status, error, lastHeartbeatAt: now() });
141
+ releaseJobLock(options.type);
142
+ };
143
+ process.once("SIGTERM", () => {
144
+ cleanup("cancelled");
145
+ process.exit(0);
146
+ });
147
+ process.once("SIGINT", () => {
148
+ cleanup("cancelled");
149
+ process.exit(130);
150
+ });
151
+ process.once("exit", () => releaseJobLock(options.type));
152
+ return {
153
+ id,
154
+ update(progress) {
155
+ upsert({ progressCurrent: progress.current, progressTotal: progress.total, progressLabel: progress.label, lastHeartbeatAt: now() });
156
+ },
157
+ complete() {
158
+ cleanup("completed");
159
+ },
160
+ fail(err) {
161
+ cleanup("failed", err instanceof Error ? err.message : String(err));
162
+ },
163
+ cancel() {
164
+ cleanup("cancelled");
165
+ }
166
+ };
167
+ }
168
+ async function politeBatchPause(ms = 250) {
169
+ await new Promise((resolve) => setTimeout(resolve, ms));
170
+ }
171
+ function cancelBackgroundJob(id) {
172
+ const jobs = listBackgroundJobs();
173
+ const job = jobs.find((j) => j.id === id || String(j.pid) === id);
174
+ if (!job) return null;
175
+ if (job.status === "running" && isAlive(job.pid)) {
176
+ try {
177
+ process.kill(job.pid, "SIGTERM");
178
+ } catch {
179
+ }
180
+ }
181
+ job.status = "cancelled";
182
+ job.updatedAt = now();
183
+ writeJobsRaw(jobs.map((j) => j.id === job.id ? job : j));
184
+ releaseJobLock(job.type);
185
+ return job;
186
+ }
187
+ function formatJobs(jobs = listBackgroundJobs()) {
188
+ if (jobs.length === 0) return "No exe-os background jobs found.";
189
+ const recent = [...jobs].sort((a, b) => b.startedAt.localeCompare(a.startedAt)).slice(0, 30);
190
+ const lines = ["EXE OS BACKGROUND JOBS", ""];
191
+ for (const job of recent) {
192
+ const progress = job.progressTotal ? ` ${job.progressCurrent ?? 0}/${job.progressTotal}` : job.progressCurrent != null ? ` ${job.progressCurrent}` : "";
193
+ lines.push(`${job.status === "running" ? "\u25CF" : "\u25CB"} ${job.name} [${job.status}]${progress}`);
194
+ lines.push(` id: ${job.id}`);
195
+ lines.push(` pid: ${job.pid} started: ${job.startedAt}`);
196
+ if (job.progressLabel) lines.push(` ${job.progressLabel}`);
197
+ if (job.status === "running") lines.push(` cancel: exe-os jobs cancel ${job.id}`);
198
+ if (job.error) lines.push(` error: ${job.error}`);
199
+ }
200
+ return lines.join("\n");
201
+ }
202
+ function reniceCurrentProcess(priority = 10) {
203
+ try {
204
+ os.setPriority(process.pid, priority);
205
+ return;
206
+ } catch {
207
+ }
208
+ try {
209
+ execFileSync("renice", [String(priority), "-p", String(process.pid)], { stdio: "ignore" });
210
+ } catch {
211
+ }
212
+ }
213
+ function readCpuPercent(pid) {
214
+ try {
215
+ const out = execFileSync("ps", ["-p", String(pid), "-o", "%cpu="], { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim();
216
+ const cpu = Number.parseFloat(out);
217
+ return Number.isFinite(cpu) ? cpu : null;
218
+ } catch {
219
+ return null;
220
+ }
221
+ }
222
+ function renicePid(pid, priority = 15) {
223
+ try {
224
+ execFileSync("renice", [String(priority), "-p", String(pid)], { stdio: "ignore" });
225
+ } catch {
226
+ }
227
+ }
228
+ function enforceBackgroundJobGuardrails(options = {}) {
229
+ const reniceAt = options.reniceCpuPercent ?? 80;
230
+ const cancelAt = options.cancelCpuPercent ?? 180;
231
+ const cancelAfter = options.cancelAfterStrikes ?? 2;
232
+ const staleAfter = options.heartbeatStaleMs ?? 5 * 6e4;
233
+ const jobs = readJobsRaw();
234
+ const actions = [];
235
+ let changed = false;
236
+ const ts = now();
237
+ for (const job of jobs) {
238
+ if (job.status !== "running") continue;
239
+ if (!isAlive(job.pid)) {
240
+ job.status = "stale";
241
+ job.updatedAt = ts;
242
+ actions.push({ jobId: job.id, name: job.name, pid: job.pid, action: "marked-stale" });
243
+ changed = true;
244
+ continue;
245
+ }
246
+ const heartbeatAge = Date.now() - Date.parse(job.lastHeartbeatAt || job.updatedAt || job.startedAt);
247
+ if (Number.isFinite(heartbeatAge) && heartbeatAge > staleAfter) {
248
+ job.status = "stale";
249
+ job.updatedAt = ts;
250
+ actions.push({ jobId: job.id, name: job.name, pid: job.pid, action: "marked-stale" });
251
+ changed = true;
252
+ continue;
253
+ }
254
+ const cpu = readCpuPercent(job.pid);
255
+ if (cpu == null) continue;
256
+ job.lastCpuPercent = cpu;
257
+ if (cpu >= cancelAt) {
258
+ job.heatStrikes = (job.heatStrikes ?? 0) + 1;
259
+ if (job.heatStrikes >= cancelAfter) {
260
+ try {
261
+ process.kill(job.pid, "SIGTERM");
262
+ } catch {
263
+ }
264
+ job.status = "cancelled";
265
+ job.updatedAt = ts;
266
+ job.progressLabel = `Cancelled by heat guardrail after sustained high CPU (${cpu.toFixed(1)}%).`;
267
+ releaseJobLock(job.type);
268
+ actions.push({ jobId: job.id, name: job.name, pid: job.pid, action: "cancelled-hot", cpuPercent: cpu, heatStrikes: job.heatStrikes });
269
+ changed = true;
270
+ continue;
271
+ }
272
+ } else if (cpu < reniceAt / 2) {
273
+ job.heatStrikes = 0;
274
+ }
275
+ if (cpu >= reniceAt) {
276
+ renicePid(job.pid, 15);
277
+ job.updatedAt = ts;
278
+ job.progressLabel = `Throttled by heat guardrail (${cpu.toFixed(1)}% CPU).`;
279
+ actions.push({ jobId: job.id, name: job.name, pid: job.pid, action: "reniced", cpuPercent: cpu, heatStrikes: job.heatStrikes });
280
+ changed = true;
281
+ }
282
+ }
283
+ if (changed) writeJobsRaw(jobs);
284
+ return actions;
285
+ }
286
+
287
+ export {
288
+ listBackgroundJobs,
289
+ acquireJobLock,
290
+ releaseJobLock,
291
+ startManagedJob,
292
+ politeBatchPause,
293
+ cancelBackgroundJob,
294
+ formatJobs,
295
+ reniceCurrentProcess,
296
+ enforceBackgroundJobGuardrails
297
+ };
@@ -0,0 +1,210 @@
1
+ import {
2
+ redactSecrets
3
+ } from "./chunk-Y25OJWOQ.js";
4
+
5
+ // src/lib/memory-write-governor.ts
6
+ import { createHash } from "crypto";
7
+ var HIGH_VALUE_SUPERSESSION_TYPES = /* @__PURE__ */ new Set([
8
+ "decision",
9
+ "adr",
10
+ "behavior",
11
+ "procedure"
12
+ ]);
13
+ var NOISE_DROP_PATTERNS = [
14
+ /^\s*\[📋\s+\d+\s+reviews?\s+pending\b/im,
15
+ /^\s*<system-reminder>[\s\S]*?<\/system-reminder>\s*$/im,
16
+ /^\s*The UserPromptSubmit hook checks the DB for new tasks/im,
17
+ /^\s*Intercom is a speedup, not delivery/im,
18
+ /^\s*Context bar reads as USAGE not remaining/im,
19
+ // Intercom noise — these repeat on every prompt and cause 18K+ duplicates
20
+ /^\/exe-intercom\b/i,
21
+ /^You have pending notifications\.\s*Run list_tasks/i,
22
+ /^You have open tasks\.\s*Run list_tasks/i,
23
+ /^You have a new P\d+ task/i,
24
+ /^You have more open tasks to dispatch/i,
25
+ /^No new tasks\.\s*(Standing by|Idle|Dashboard)/i
26
+ ];
27
+ var SKIP_EMBED_PATTERNS = [
28
+ /tmux capture-pane\b/i,
29
+ /docker ps\b/i,
30
+ /docker images\b/i,
31
+ /git status\b/i,
32
+ /grep .*node_modules/i,
33
+ /npm (install|ci)\b[\s\S]*(added \d+ packages|audited \d+ packages)/i
34
+ ];
35
+ function normalizeMemoryText(text) {
36
+ return text.replace(/\r\n/g, "\n").replace(/[ \t]+$/gm, "").replace(/\n{4,}/g, "\n\n\n").trim();
37
+ }
38
+ function classifyMemoryType(input) {
39
+ if (input.memory_type && input.memory_type.trim()) return input.memory_type.trim();
40
+ const tool = input.tool_name.toLowerCase();
41
+ const text = input.raw_text.toLowerCase();
42
+ if (tool.includes("store_decision") || tool.includes("decision")) return "decision";
43
+ if (tool.includes("commit") || text.includes("adr-") || text.includes("architectural decision")) return "adr";
44
+ if (tool.includes("store_behavior") || tool.includes("behavior")) return "behavior";
45
+ if (tool.includes("global_procedure") || text.includes("organization-wide procedures")) return "procedure";
46
+ if (tool.includes("checkpoint") || text.startsWith("context checkpoint")) return "checkpoint";
47
+ if (tool.includes("sessionsummary") || tool.includes("session-summary")) return "summary";
48
+ if (tool.includes("sessionend") || text.startsWith("session ended")) return "summary";
49
+ if (tool.includes("send_whatsapp") || tool.includes("conversation")) return "conversation";
50
+ if (tool === "store_memory" || tool === "manual") return "observation";
51
+ if (tool === "userprompt" || tool === "slashcommand") return "conversation";
52
+ return "raw";
53
+ }
54
+ function shouldDropMemory(text) {
55
+ const normalized = normalizeMemoryText(text);
56
+ if (normalized.length < 10) return { drop: true, reason: "too_short" };
57
+ if (NOISE_DROP_PATTERNS.some((pattern) => pattern.test(normalized))) {
58
+ return { drop: true, reason: "known_boilerplate_noise" };
59
+ }
60
+ return { drop: false };
61
+ }
62
+ function shouldSkipEmbedding(input) {
63
+ const type = classifyMemoryType(input);
64
+ if (HIGH_VALUE_SUPERSESSION_TYPES.has(type)) return false;
65
+ if (type === "raw" && input.raw_text.length > 2e4) return true;
66
+ if (SKIP_EMBED_PATTERNS.some((pattern) => pattern.test(input.raw_text))) return true;
67
+ return false;
68
+ }
69
+ function hashMemoryContent(text) {
70
+ return createHash("sha256").update(normalizeMemoryText(text)).digest("hex");
71
+ }
72
+ function scopedDedupArgs(input) {
73
+ return [input.contentHash, input.agentId, input.projectName, input.memoryType];
74
+ }
75
+ function governMemoryRecord(record) {
76
+ const redacted = redactSecrets(record.raw_text);
77
+ const normalized = normalizeMemoryText(redacted.text);
78
+ const memoryType = classifyMemoryType({
79
+ raw_text: normalized,
80
+ agent_id: record.agent_id,
81
+ project_name: record.project_name,
82
+ tool_name: record.tool_name,
83
+ memory_type: record.memory_type
84
+ });
85
+ const drop = shouldDropMemory(normalized);
86
+ const skipEmbedding = shouldSkipEmbedding({
87
+ raw_text: normalized,
88
+ agent_id: record.agent_id,
89
+ project_name: record.project_name,
90
+ tool_name: record.tool_name,
91
+ memory_type: memoryType
92
+ });
93
+ const trajectoryValue = record.trajectory;
94
+ const redactedTrajectory = typeof trajectoryValue === "string" ? redactSecrets(trajectoryValue).text : record.trajectory;
95
+ return {
96
+ record: {
97
+ ...record,
98
+ raw_text: normalized,
99
+ memory_type: memoryType,
100
+ vector: skipEmbedding ? null : record.vector,
101
+ keywords: record.keywords ? redactSecrets(record.keywords).text : record.keywords,
102
+ trajectory: redactedTrajectory
103
+ },
104
+ contentHash: hashMemoryContent(normalized),
105
+ shouldDrop: drop.drop,
106
+ dropReason: drop.reason,
107
+ skipEmbedding,
108
+ hygiene: {
109
+ dedup: true,
110
+ supersession: HIGH_VALUE_SUPERSESSION_TYPES.has(memoryType)
111
+ }
112
+ };
113
+ }
114
+ async function findScopedDuplicate(input) {
115
+ const { getClient } = await import("./lib/database.js");
116
+ const client = getClient();
117
+ const args = scopedDedupArgs(input);
118
+ let sql = `SELECT id FROM memories
119
+ WHERE content_hash = ?
120
+ AND agent_id = ?
121
+ AND project_name = ?
122
+ AND COALESCE(memory_type, 'raw') = ?
123
+ AND COALESCE(status, 'active') != 'deleted'`;
124
+ if (input.excludeId) {
125
+ sql += " AND id != ?";
126
+ args.push(input.excludeId);
127
+ }
128
+ sql += " ORDER BY timestamp DESC LIMIT 1";
129
+ const result = await client.execute({ sql, args });
130
+ return result.rows[0]?.id ? String(result.rows[0].id) : null;
131
+ }
132
+ async function runPostWriteMemoryHygiene(memoryId) {
133
+ try {
134
+ const { getClient } = await import("./lib/database.js");
135
+ const client = getClient();
136
+ const current = await client.execute({
137
+ sql: `SELECT id, agent_id, project_name, memory_type, content_hash, supersedes_id,
138
+ importance, timestamp
139
+ FROM memories
140
+ WHERE id = ?
141
+ LIMIT 1`,
142
+ args: [memoryId]
143
+ });
144
+ const row = current.rows[0];
145
+ if (!row) return;
146
+ const memoryType = String(row.memory_type ?? "raw");
147
+ const contentHash = row.content_hash ? String(row.content_hash) : null;
148
+ const agentId = String(row.agent_id);
149
+ const projectName = String(row.project_name);
150
+ if (contentHash) {
151
+ await client.execute({
152
+ sql: `UPDATE memories
153
+ SET status = 'deleted',
154
+ outcome = COALESCE(outcome, 'superseded')
155
+ WHERE id != ?
156
+ AND content_hash = ?
157
+ AND agent_id = ?
158
+ AND project_name = ?
159
+ AND COALESCE(memory_type, 'raw') = ?
160
+ AND COALESCE(status, 'active') = 'active'`,
161
+ args: [memoryId, contentHash, agentId, projectName, memoryType]
162
+ });
163
+ }
164
+ const supersedesId = row.supersedes_id ? String(row.supersedes_id) : null;
165
+ if (supersedesId && HIGH_VALUE_SUPERSESSION_TYPES.has(memoryType)) {
166
+ const old = await client.execute({
167
+ sql: `SELECT importance FROM memories WHERE id = ? LIMIT 1`,
168
+ args: [supersedesId]
169
+ });
170
+ const oldImportance = Number(old.rows[0]?.importance ?? 0);
171
+ const newImportance = Number(row.importance ?? 0);
172
+ await client.batch([
173
+ {
174
+ sql: `UPDATE memories
175
+ SET status = 'archived',
176
+ outcome = COALESCE(outcome, 'superseded')
177
+ WHERE id = ?`,
178
+ args: [supersedesId]
179
+ },
180
+ {
181
+ sql: `UPDATE memories
182
+ SET importance = MAX(COALESCE(importance, 5), ?),
183
+ parent_memory_id = COALESCE(parent_memory_id, ?)
184
+ WHERE id = ?`,
185
+ args: [Math.max(oldImportance, newImportance), supersedesId, memoryId]
186
+ }
187
+ ], "write");
188
+ }
189
+ } catch (err) {
190
+ process.stderr.write(
191
+ `[memory-governor] post-write hygiene failed for ${memoryId}: ${err instanceof Error ? err.message : String(err)}
192
+ `
193
+ );
194
+ }
195
+ }
196
+ function schedulePostWriteMemoryHygiene(memoryIds) {
197
+ if (process.env.EXE_SKIP_MEMORY_HYGIENE === "1") return;
198
+ if (memoryIds.length === 0) return;
199
+ const run = () => {
200
+ void Promise.all(memoryIds.map((id) => runPostWriteMemoryHygiene(id)));
201
+ };
202
+ if (typeof setImmediate === "function") setImmediate(run);
203
+ else setTimeout(run, 0);
204
+ }
205
+
206
+ export {
207
+ governMemoryRecord,
208
+ findScopedDuplicate,
209
+ schedulePostWriteMemoryHygiene
210
+ };