@askexenow/exe-os 0.9.287 → 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 (454) 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/dist/active-agent-KB4346K6.js +26 -0
  8. package/dist/active-agent-LTYLGBJX.js +27 -0
  9. package/dist/active-agent-V4W557J4.js +26 -0
  10. package/dist/active-agent-XZVU5XBO.js +27 -0
  11. package/dist/agentic-ontology-4PNQX4YW.js +25 -0
  12. package/dist/agentic-ontology-WOTOTSR7.js +25 -0
  13. package/dist/backfill-metadata-O2BQIEVT.js +599 -0
  14. package/dist/backfill-metadata-PHXNTBNR.js +599 -0
  15. package/dist/background-jobs-RIECIYW5.js +25 -0
  16. package/dist/behaviors-MO5BWFPW.js +39 -0
  17. package/dist/behaviors-TMA2HRTL.js +39 -0
  18. package/dist/bin/age-ontology-load.js +2 -2
  19. package/dist/bin/agentic-ontology-backfill.js +7 -7
  20. package/dist/bin/agentic-reflection-backfill.js +8 -8
  21. package/dist/bin/agentic-semantic-label.js +7 -7
  22. package/dist/bin/backfill-conversations.js +7 -7
  23. package/dist/bin/backfill-responses.js +7 -7
  24. package/dist/bin/backfill-vectors.js +10 -10
  25. package/dist/bin/bulk-sync-postgres.js +8 -8
  26. package/dist/bin/cc-doctor.js +7 -6
  27. package/dist/bin/cleanup-stale-review-tasks.js +13 -13
  28. package/dist/bin/cli.js +20 -20
  29. package/dist/bin/exe-agent-config.js +4 -4
  30. package/dist/bin/exe-agent.js +9 -9
  31. package/dist/bin/exe-assign.js +9 -9
  32. package/dist/bin/exe-boot.js +32 -21
  33. package/dist/bin/exe-call.js +5 -5
  34. package/dist/bin/exe-cloud.js +7 -7
  35. package/dist/bin/exe-dispatch.js +13 -13
  36. package/dist/bin/exe-doctor.js +4 -1
  37. package/dist/bin/exe-export-behaviors.js +8 -8
  38. package/dist/bin/exe-forget.js +7 -7
  39. package/dist/bin/exe-gateway.js +8 -8
  40. package/dist/bin/exe-healthcheck.js +9 -6
  41. package/dist/bin/exe-heartbeat.js +13 -13
  42. package/dist/bin/exe-kill.js +16 -16
  43. package/dist/bin/exe-launch-agent.js +20 -20
  44. package/dist/bin/exe-new-employee.js +8 -8
  45. package/dist/bin/exe-pending-messages.js +14 -14
  46. package/dist/bin/exe-pending-notifications.js +13 -13
  47. package/dist/bin/exe-pending-reviews.js +13 -13
  48. package/dist/bin/exe-rename.js +5 -5
  49. package/dist/bin/exe-review.js +15 -15
  50. package/dist/bin/exe-search.js +6 -6
  51. package/dist/bin/exe-session-cleanup.js +18 -18
  52. package/dist/bin/exe-settings.js +7 -7
  53. package/dist/bin/exe-start-codex.js +12 -12
  54. package/dist/bin/exe-start-opencode.js +9 -9
  55. package/dist/bin/exe-status.js +14 -14
  56. package/dist/bin/exe-support.js +3 -3
  57. package/dist/bin/exe-team.js +4 -4
  58. package/dist/bin/git-sweep.js +14 -14
  59. package/dist/bin/graph-backfill.js +8 -8
  60. package/dist/bin/graph-export.js +6 -6
  61. package/dist/bin/import-history.js +10 -10
  62. package/dist/bin/install.js +7 -7
  63. package/dist/bin/intercom-check.js +4 -4
  64. package/dist/bin/mcp-sessions.js +2 -2
  65. package/dist/bin/orchestration-metrics.js +5 -5
  66. package/dist/bin/postgres-agentic-reflection-backfill.js +4 -4
  67. package/dist/bin/postgres-agentic-semantic-backfill.js +3 -3
  68. package/dist/bin/scan-tasks.js +13 -13
  69. package/dist/bin/setup.js +2 -2
  70. package/dist/bin/shard-migrate.js +6 -6
  71. package/dist/bin/stack-update.js +4 -4
  72. package/dist/bin/vps-health-gate.js +1 -1
  73. package/dist/branding-6PY5DNDC.js +97 -0
  74. package/dist/capability-cards-4NKVY6GD.js +88 -0
  75. package/dist/capability-cards-UD5TCSAZ.js +88 -0
  76. package/dist/capacity-monitor-AU7MVZED.js +50 -0
  77. package/dist/capacity-monitor-CV7PWPYR.js +50 -0
  78. package/dist/catchup-brief-AZND3EET.js +174 -0
  79. package/dist/catchup-brief-TFL6MYOZ.js +154 -0
  80. package/dist/chunk-22R3G3GD.js +297 -0
  81. package/dist/chunk-2CO47E5Q.js +210 -0
  82. package/dist/chunk-2F5UVNYP.js +167 -0
  83. package/dist/chunk-2IJCGYY2.js +30 -0
  84. package/dist/chunk-2V52EJI7.js +14365 -0
  85. package/dist/chunk-2WCXJVSN.js +456 -0
  86. package/dist/chunk-2X52UGP7.js +190 -0
  87. package/dist/chunk-3H5FNTXS.js +85 -0
  88. package/dist/chunk-3OC6MJIX.js +210 -0
  89. package/dist/chunk-3OSDE4Y2.js +1119 -0
  90. package/dist/chunk-43QFBQHT.js +1094 -0
  91. package/dist/chunk-4EBW3URQ.js +4318 -0
  92. package/dist/chunk-4KVMYS3U.js +280 -0
  93. package/dist/chunk-4UTH3H4H.js +128 -0
  94. package/dist/chunk-5BKYHLA3.js +411 -0
  95. package/dist/chunk-5RRYMKXN.js +150 -0
  96. package/dist/chunk-5TYYOPTD.js +50 -0
  97. package/dist/chunk-5XOAYMSU.js +4318 -0
  98. package/dist/chunk-6DQNLI55.js +240 -0
  99. package/dist/chunk-6GOT6FNJ.js +1352 -0
  100. package/dist/chunk-6KH24PJ7.js +221 -0
  101. package/dist/chunk-6TV66RAI.js +192 -0
  102. package/dist/chunk-6UD5CM2H.js +244 -0
  103. package/dist/chunk-6YR3J6WG.js +203 -0
  104. package/dist/chunk-77HA7ATH.js +89 -0
  105. package/dist/chunk-7G52QPUX.js +271 -0
  106. package/dist/chunk-7M5ZHD4E.js +214 -0
  107. package/dist/chunk-A3GC762G.js +333 -0
  108. package/dist/chunk-ALTFDYI6.js +97 -0
  109. package/dist/chunk-AN25OIRX.js +38 -0
  110. package/dist/chunk-AOWC2J6S.js +14225 -0
  111. package/dist/chunk-AVTDW4L6.js +562 -0
  112. package/dist/chunk-BEQTE7GH.js +668 -0
  113. package/dist/chunk-BJTBA4XS.js +290 -0
  114. package/dist/chunk-BQBPNRUW.js +231 -0
  115. package/dist/chunk-BQD4XYWX.js +159 -0
  116. package/dist/chunk-BVFCZNJH.js +41 -0
  117. package/dist/chunk-BW7HTZMW.js +240 -0
  118. package/dist/chunk-BZP3ZSRI.js +97 -0
  119. package/dist/chunk-C2NCSKRZ.js +373 -0
  120. package/dist/chunk-C3AH5JAS.js +510 -0
  121. package/dist/chunk-CEKZ77KA.js +471 -0
  122. package/dist/chunk-CNTBRVYW.js +54 -0
  123. package/dist/chunk-CTJQX44O.js +271 -0
  124. package/dist/chunk-CVG2PBCO.js +1105 -0
  125. package/dist/chunk-CZ47BFAT.js +299 -0
  126. package/dist/chunk-CZHC3HIO.js +362 -0
  127. package/dist/chunk-DIZOFRZO.js +284 -0
  128. package/dist/chunk-DRX46W5O.js +1068 -0
  129. package/dist/chunk-DYICAAAM.js +630 -0
  130. package/dist/chunk-E4BXNYLD.js +128 -0
  131. package/dist/chunk-EKXOBH7F.js +227 -0
  132. package/dist/chunk-ELQZYKVN.js +394 -0
  133. package/dist/chunk-EVM22AGQ.js +382 -0
  134. package/dist/chunk-EY7TBDZ5.js +38 -0
  135. package/dist/chunk-FDOEMBUB.js +345 -0
  136. package/dist/chunk-FG2OXKU5.js +539 -0
  137. package/dist/chunk-FP6TDXIL.js +456 -0
  138. package/dist/chunk-FVWATWI2.js +377 -0
  139. package/dist/chunk-G2OW4LUS.js +55 -0
  140. package/dist/chunk-GAYD7KBH.js +836 -0
  141. package/dist/chunk-GETGWHCO.js +227 -0
  142. package/dist/chunk-GGLUKNFC.js +1350 -0
  143. package/dist/chunk-GLEE2MUJ.js +262 -0
  144. package/dist/chunk-GUODMEAR.js +42 -0
  145. package/dist/chunk-H6LA4UV5.js +735 -0
  146. package/dist/chunk-H6PW4LNY.js +129 -0
  147. package/dist/chunk-HEMJ5RDU.js +345 -0
  148. package/dist/chunk-HMP6KB4V.js +382 -0
  149. package/dist/chunk-I35KAK3E.js +458 -0
  150. package/dist/chunk-I4DA5D5Q.js +1922 -0
  151. package/dist/chunk-I53O26HI.js +1119 -0
  152. package/dist/chunk-IBLEQQDQ.js +181 -0
  153. package/dist/chunk-IS2BEXUC.js +2113 -0
  154. package/dist/chunk-ISCEGQHA.js +244 -0
  155. package/dist/chunk-JCERHH3L.js +85 -0
  156. package/dist/chunk-JCNCPBWU.js +97 -0
  157. package/dist/chunk-JEMLH7H2.js +1350 -0
  158. package/dist/chunk-JMR2X5FJ.js +630 -0
  159. package/dist/chunk-JR3MYBWG.js +2078 -0
  160. package/dist/chunk-JSEICUAL.js +197 -0
  161. package/dist/chunk-K3KOLZTH.js +123 -0
  162. package/dist/chunk-K4OH3B2I.js +14248 -0
  163. package/dist/chunk-KQ4Z2G24.js +260 -0
  164. package/dist/chunk-KVH5DSTA.js +369 -0
  165. package/dist/chunk-L4R5NOVT.js +81 -0
  166. package/dist/chunk-LCB6YCE6.js +70 -0
  167. package/dist/chunk-M543SLJZ.js +1352 -0
  168. package/dist/chunk-M6KDMU5P.js +2113 -0
  169. package/dist/chunk-MDAGRPZG.js +197 -0
  170. package/dist/chunk-MLNOSXRZ.js +402 -0
  171. package/dist/chunk-MNI5K34D.js +290 -0
  172. package/dist/chunk-MUDH7ZLR.js +129 -0
  173. package/dist/chunk-MUMBWV57.js +379 -0
  174. package/dist/chunk-NAQLGLOG.js +176 -0
  175. package/dist/chunk-NIBCUAEI.js +123 -0
  176. package/dist/chunk-NIZCTXYW.js +89 -0
  177. package/dist/chunk-NS5G36TN.js +712 -0
  178. package/dist/chunk-NSKQWLQL.js +76 -0
  179. package/dist/chunk-NUA3WRTO.js +1157 -0
  180. package/dist/chunk-O3IESEF6.js +85 -0
  181. package/dist/chunk-OAO2BK25.js +81 -0
  182. package/dist/chunk-OFY7RGLL.js +348 -0
  183. package/dist/chunk-OICU3UHF.js +181 -0
  184. package/dist/chunk-OK6HCC2Z.js +731 -0
  185. package/dist/chunk-ONTUBOYP.js +230 -0
  186. package/dist/chunk-OQB7TERT.js +54 -0
  187. package/dist/chunk-P362EYLO.js +106 -0
  188. package/dist/chunk-P4T4JOCE.js +192 -0
  189. package/dist/chunk-QAOWXQKA.js +333 -0
  190. package/dist/chunk-QEFT6G6J.js +2078 -0
  191. package/dist/chunk-QFVY5MHR.js +402 -0
  192. package/dist/chunk-QLMSROQC.js +604 -0
  193. package/dist/chunk-QNR4ZQDU.js +14365 -0
  194. package/dist/chunk-QQ3T45AO.js +348 -0
  195. package/dist/chunk-QV6HNEMH.js +230 -0
  196. package/dist/chunk-R5LCP56X.js +299 -0
  197. package/dist/chunk-RHTZA6X6.js +1922 -0
  198. package/dist/chunk-RL4RQIEI.js +731 -0
  199. package/dist/chunk-RW4EMKQF.js +185 -0
  200. package/dist/chunk-S35K4C6F.js +127 -0
  201. package/dist/chunk-SFQYQH5Z.js +50 -0
  202. package/dist/chunk-SLFB2RY6.js +133 -0
  203. package/dist/chunk-SSC7EKY2.js +133 -0
  204. package/dist/chunk-SWFFGWAF.js +262 -0
  205. package/dist/chunk-SXZCFZ5T.js +157 -0
  206. package/dist/chunk-T5LT62O5.js +14365 -0
  207. package/dist/chunk-TDGPZF5T.js +539 -0
  208. package/dist/chunk-TF6DEHEL.js +167 -0
  209. package/dist/chunk-TH7ZNVGB.js +33 -0
  210. package/dist/chunk-TTNYB6OH.js +33 -0
  211. package/dist/chunk-TUHR7Z7R.js +221 -0
  212. package/dist/chunk-UHKXYDBM.js +668 -0
  213. package/dist/chunk-UQBD2L52.js +128 -0
  214. package/dist/chunk-UTARH2WY.js +76 -0
  215. package/dist/chunk-UXYAQCIB.js +30 -0
  216. package/dist/chunk-UZHCPLB2.js +127 -0
  217. package/dist/chunk-VNJKA3K5.js +171 -0
  218. package/dist/chunk-VP4MDSUA.js +1156 -0
  219. package/dist/chunk-VWA7OCXI.js +58 -0
  220. package/dist/chunk-VWZZF3YB.js +70 -0
  221. package/dist/chunk-VYPKS352.js +214 -0
  222. package/dist/chunk-W6JB72KR.js +448 -0
  223. package/dist/chunk-WG4PSSI5.js +510 -0
  224. package/dist/chunk-WJPZPASS.js +373 -0
  225. package/dist/chunk-WLDBPKRL.js +3246 -0
  226. package/dist/chunk-WO2SPDUE.js +231 -0
  227. package/dist/chunk-WXEPPHDU.js +1094 -0
  228. package/dist/chunk-WXNSOT6K.js +82 -0
  229. package/dist/chunk-X2PSVVHB.js +448 -0
  230. package/dist/chunk-X5Y4JSD4.js +128 -0
  231. package/dist/chunk-X7VPB6Z5.js +621 -0
  232. package/dist/chunk-XA2GMH53.js +85 -0
  233. package/dist/chunk-XC2ZMYDN.js +204 -0
  234. package/dist/chunk-XFQJH67J.js +157 -0
  235. package/dist/chunk-XQ5LT6UM.js +362 -0
  236. package/dist/chunk-XRMBKPIP.js +204 -0
  237. package/dist/chunk-XUC7YYW5.js +171 -0
  238. package/dist/chunk-XVDWHYIK.js +3276 -0
  239. package/dist/chunk-Y6CVAZ7T.js +97 -0
  240. package/dist/chunk-YA7WVZF5.js +377 -0
  241. package/dist/chunk-YACAOZVG.js +185 -0
  242. package/dist/chunk-YEHV3FN5.js +836 -0
  243. package/dist/chunk-YMZ6IGC3.js +284 -0
  244. package/dist/chunk-Z5P7AUFM.js +280 -0
  245. package/dist/chunk-Z5YFGOLZ.js +1068 -0
  246. package/dist/chunk-ZLYKY6GP.js +150 -0
  247. package/dist/chunk-ZOP7NAM2.js +58 -0
  248. package/dist/chunk-ZUNYZYKV.js +1157 -0
  249. package/dist/co-activation-54LO5GAA.js +73 -0
  250. package/dist/co-activation-ESPLEOMH.js +73 -0
  251. package/dist/co-occurrence-52ZTRX2I.js +94 -0
  252. package/dist/co-occurrence-O4G6VQUU.js +94 -0
  253. package/dist/code-context-index-OX3LN34G.js +30 -0
  254. package/dist/conversation-wiki-populator-IWSKIHQK.js +105 -0
  255. package/dist/core-memory-J6AEOYFN.js +110 -0
  256. package/dist/core-memory-XF4CLLDR.js +110 -0
  257. package/dist/cpu-steal-5YKTUPWF.js +23 -0
  258. package/dist/crdt-sync-5JOW6T2I.js +33 -0
  259. package/dist/crdt-sync-6L4OI4OA.js +33 -0
  260. package/dist/crm-webhook-BAXEYDPD.js +10 -0
  261. package/dist/crm-webhook-KVBGOUHU.js +10 -0
  262. package/dist/cto-delegation-gate-3WUTWBCT.js +279 -0
  263. package/dist/cto-delegation-gate-DZF3Z66I.js +279 -0
  264. package/dist/daemon-auth-M2G5PBME.js +13 -0
  265. package/dist/daemon-orchestration-3ANZVE7Y.js +138 -0
  266. package/dist/daemon-orchestration-APVUUNFB.js +138 -0
  267. package/dist/daemon-restart-report-F3P5AQS4.js +9 -0
  268. package/dist/db-backup-J7253HNV.js +33 -0
  269. package/dist/db-backup-M733ORYE.js +33 -0
  270. package/dist/db-restore-events-AIL6GSEK.js +76 -0
  271. package/dist/db-restore-events-LB3O46HH.js +76 -0
  272. package/dist/doc-graph-extractor-CF2WBSGL.js +132 -0
  273. package/dist/doc-graph-extractor-RSYHLOKD.js +132 -0
  274. package/dist/dreaming-L4FLJJO2.js +33 -0
  275. package/dist/dreaming-YKEKUE55.js +33 -0
  276. package/dist/entity-boost-ZKACOJKH.js +375 -0
  277. package/dist/exe-drift-AVJRXHCB.js +69 -0
  278. package/dist/exe-drift-MYT5NQ52.js +69 -0
  279. package/dist/exe-export-T2FHC5GC.js +75 -0
  280. package/dist/exe-export-TBV2JI4P.js +75 -0
  281. package/dist/exe-import-6UAKJF3Y.js +78 -0
  282. package/dist/exe-import-KJQO4PJX.js +78 -0
  283. package/dist/exe-key-KGQUC27D.js +580 -0
  284. package/dist/exe-key-Q772PMBM.js +580 -0
  285. package/dist/exe-org-KK22SSB3.js +73 -0
  286. package/dist/exe-snapshot-KF3HPOWJ.js +337 -0
  287. package/dist/exe-snapshot-SK6PMOFA.js +337 -0
  288. package/dist/fast-db-init-EXNYB2HK.js +7 -0
  289. package/dist/fast-db-init-FMECTLNS.js +7 -0
  290. package/dist/founder-context-N2VZ5MY2.js +96 -0
  291. package/dist/gateway/index.js +12 -12
  292. package/dist/git-staleness-2EOHIOMZ.js +111 -0
  293. package/dist/git-staleness-ZEYJXPFP.js +111 -0
  294. package/dist/git-task-sweep-I74JXGNT.js +41 -0
  295. package/dist/git-task-sweep-YKLOPYYV.js +41 -0
  296. package/dist/global-procedures-B23F4IQ3.js +21 -0
  297. package/dist/global-procedures-LUBLZ6WN.js +21 -0
  298. package/dist/graph-auto-extract-CSLZXRDY.js +182 -0
  299. package/dist/graph-auto-extract-DZRIETGW.js +182 -0
  300. package/dist/hook-integrity-HJBXTLQD.js +89 -0
  301. package/dist/hooks/bug-report-worker.js +15 -15
  302. package/dist/hooks/codex-stop-task-finalizer.js +15 -15
  303. package/dist/hooks/commit-complete.js +16 -16
  304. package/dist/hooks/error-recall.js +8 -8
  305. package/dist/hooks/exe-heartbeat-hook.js +5 -5
  306. package/dist/hooks/ingest-worker.js +5 -5
  307. package/dist/hooks/ingest.js +12 -12
  308. package/dist/hooks/instructions-loaded.js +6 -6
  309. package/dist/hooks/manifest.json +20 -20
  310. package/dist/hooks/notification.js +6 -6
  311. package/dist/hooks/post-compact.js +15 -15
  312. package/dist/hooks/post-tool-combined.js +7 -7
  313. package/dist/hooks/pre-compact.js +20 -20
  314. package/dist/hooks/pre-tool-use.js +19 -19
  315. package/dist/hooks/prompt-submit.js +27 -27
  316. package/dist/hooks/session-end.js +25 -25
  317. package/dist/hooks/session-start.js +37 -13
  318. package/dist/hooks/stop.js +22 -22
  319. package/dist/hooks/subagent-stop.js +15 -15
  320. package/dist/hooks/summary-worker.js +22 -22
  321. package/dist/index.js +23 -23
  322. package/dist/installer-AU5VMP4U.js +39 -0
  323. package/dist/installer-H7BIYSIK.js +39 -0
  324. package/dist/installer-L4NJWZGV.js +297 -0
  325. package/dist/installer-QE3LBMVF.js +343 -0
  326. package/dist/installer-QH75OOGL.js +297 -0
  327. package/dist/installer-XREYYGF2.js +343 -0
  328. package/dist/key-backup-status-IJCQT4NV.js +39 -0
  329. package/dist/lib/agent-config.js +2 -2
  330. package/dist/lib/cloud-sync.js +6 -6
  331. package/dist/lib/config.js +7 -3
  332. package/dist/lib/consolidation.js +8 -8
  333. package/dist/lib/database.js +3 -3
  334. package/dist/lib/db-daemon-client.js +3 -3
  335. package/dist/lib/db.js +3 -3
  336. package/dist/lib/device-registry.js +1 -1
  337. package/dist/lib/embed-worker.js +1 -1
  338. package/dist/lib/embedder.js +4 -4
  339. package/dist/lib/employee-templates.js +5 -5
  340. package/dist/lib/employees.js +3 -3
  341. package/dist/lib/exe-daemon-client.js +3 -3
  342. package/dist/lib/exe-daemon.js +51 -51
  343. package/dist/lib/hybrid-search.js +6 -6
  344. package/dist/lib/identity.js +3 -3
  345. package/dist/lib/license.js +2 -2
  346. package/dist/lib/messaging.js +13 -13
  347. package/dist/lib/reminders.js +4 -4
  348. package/dist/lib/schedules.js +6 -6
  349. package/dist/lib/session-registry.js +5 -5
  350. package/dist/lib/skill-learning.js +7 -7
  351. package/dist/lib/status-brief.js +1 -1
  352. package/dist/lib/store.js +5 -5
  353. package/dist/lib/task-router.js +4 -4
  354. package/dist/lib/tasks.js +14 -14
  355. package/dist/lib/tmux-routing.js +12 -12
  356. package/dist/lib/token-spend.js +4 -4
  357. package/dist/license-gate-X57APN2E.js +14 -0
  358. package/dist/mcp/register-tools.js +71 -69
  359. package/dist/mcp/server.js +73 -71
  360. package/dist/mcp/tools/complete-reminder.js +5 -5
  361. package/dist/mcp/tools/create-reminder.js +5 -5
  362. package/dist/mcp/tools/create-task.js +16 -16
  363. package/dist/mcp/tools/deactivate-behavior.js +8 -8
  364. package/dist/mcp/tools/list-reminders.js +5 -5
  365. package/dist/mcp/tools/list-tasks.js +16 -16
  366. package/dist/mcp/tools/send-message.js +15 -15
  367. package/dist/mcp/tools/update-task.js +15 -15
  368. package/dist/mcp-http-config-KMP55RXI.js +28 -0
  369. package/dist/mcp-http-config-XYHPQVRA.js +28 -0
  370. package/dist/memory-cards-AULW7ITU.js +179 -0
  371. package/dist/memory-cards-NLTRIBSD.js +179 -0
  372. package/dist/memory-graph-extractor-NGJQIKAA.js +21 -0
  373. package/dist/memory-graph-extractor-QWFPKSX5.js +21 -0
  374. package/dist/memory-poisoning-defense-5WWOLHUQ.js +223 -0
  375. package/dist/memory-poisoning-defense-742X4H52.js +223 -0
  376. package/dist/memory-queue-OXHHNDOC.js +19 -0
  377. package/dist/memory-queue-client-P4TZNVQB.js +16 -0
  378. package/dist/memory-reflection-6GF5OK2W.js +243 -0
  379. package/dist/memory-reflection-SGIE7OJ7.js +243 -0
  380. package/dist/message-queue-client-ELWCWKBO.js +92 -0
  381. package/dist/notifications-67M5SPLO.js +46 -0
  382. package/dist/notifications-HUH2H5WZ.js +46 -0
  383. package/dist/oauth-server-RKCMPBIP.js +437 -0
  384. package/dist/orchestration-events-MC3IZ46I.js +26 -0
  385. package/dist/orchestration-events-NZCUTMCJ.js +26 -0
  386. package/dist/orchestration-phase-FPAVQ57X.js +23 -0
  387. package/dist/orchestrator-3MJ6YJKT.js +34 -0
  388. package/dist/orchestrator-HOXFT4PP.js +34 -0
  389. package/dist/pipeline-router-NCUDK335.js +14 -0
  390. package/dist/pipeline-router-POLBFEBM.js +14 -0
  391. package/dist/plan-limits-DGAFE7V6.js +27 -0
  392. package/dist/plan-limits-J4WXJVDS.js +27 -0
  393. package/dist/project-boot-FRCQHQTF.js +299 -0
  394. package/dist/project-boot-QHXOUJGT.js +299 -0
  395. package/dist/projection-worker-QZW4DOY3.js +1034 -0
  396. package/dist/projection-worker-XDKC3GIZ.js +1034 -0
  397. package/dist/prospective-memory-JIGVZM2I.js +231 -0
  398. package/dist/push-notifications-ERC4SQSQ.js +15 -0
  399. package/dist/reranker-SF3LMYGY.js +19 -0
  400. package/dist/reranker-SOM2WMD6.js +19 -0
  401. package/dist/retrieval-health-7FRD2KLM.js +11 -0
  402. package/dist/retrieval-health-P6QHP263.js +11 -0
  403. package/dist/review-polling-66EJAMR3.js +125 -0
  404. package/dist/review-polling-SYKYNFRK.js +125 -0
  405. package/dist/runtime/index.js +19 -19
  406. package/dist/session-events-A6EDTM27.js +37 -0
  407. package/dist/session-events-DONPZ7DR.js +37 -0
  408. package/dist/session-kill-telemetry-NV2S2YZ2.js +30 -0
  409. package/dist/session-kill-telemetry-Y47QAFHP.js +30 -0
  410. package/dist/session-scope-H3FJVQ6E.js +87 -0
  411. package/dist/session-scope-I56DVQEY.js +87 -0
  412. package/dist/setup-wizard-MX3S3DVH.js +12 -0
  413. package/dist/setup-wizard-YRBCVPCU.js +12 -0
  414. package/dist/shard-manager-AX4W5B3N.js +30 -0
  415. package/dist/skill-refinement-57DCIDKT.js +158 -0
  416. package/dist/skill-refinement-XTBCHOMO.js +158 -0
  417. package/dist/stack-update-CZ2QHS6T.js +76 -0
  418. package/dist/stack-update-XNEO4WQH.js +76 -0
  419. package/dist/steward-gate-J7VMPHEN.js +14 -0
  420. package/dist/steward-gate-PVUKWYED.js +14 -0
  421. package/dist/task-enforcement-G4MYUJ2E.js +439 -0
  422. package/dist/task-enforcement-QBF44BXN.js +439 -0
  423. package/dist/task-scope-D2VOYU3P.js +36 -0
  424. package/dist/task-scope-HGL6VACL.js +36 -0
  425. package/dist/tasks-crud-DFE4XOW7.js +78 -0
  426. package/dist/tasks-crud-J5TSLFQN.js +78 -0
  427. package/dist/tasks-notify-2VRKOK74.js +39 -0
  428. package/dist/tasks-notify-Q23MIKDA.js +39 -0
  429. package/dist/tasks-review-NRSVHN7V.js +48 -0
  430. package/dist/tasks-review-VV3RLPLT.js +48 -0
  431. package/dist/telemetry-upload-ISI6TEX4.js +740 -0
  432. package/dist/telemetry-upload-XML6WVPW.js +740 -0
  433. package/dist/token-budget-KVRHMY7V.js +85 -0
  434. package/dist/token-budget-WV2GIFYJ.js +85 -0
  435. package/dist/tool-capability-index-NOMFY27N.js +10 -0
  436. package/dist/tool-telemetry-6DGIQUV3.js +17 -0
  437. package/dist/tool-telemetry-NXPM2T5E.js +17 -0
  438. package/dist/tui/App.js +80 -38
  439. package/dist/tui-data-C4474APN.js +259 -0
  440. package/dist/tui-data-KP66NOW3.js +259 -0
  441. package/dist/webhook-pipe-ZAEPBTDB.js +114 -0
  442. package/dist/wiki-acl-4A3ZUPJK.js +111 -0
  443. package/dist/wiki-acl-DRTEVIHT.js +111 -0
  444. package/dist/wiki-client-AN52BINX.js +157 -0
  445. package/dist/worker-gate-EVSFKALM.js +21 -0
  446. package/dist/worker-gate-O2KXQN5T.js +21 -0
  447. package/dist/workflow-engine-MUO435MX.js +28 -0
  448. package/dist/workflow-engine-RV6JLGHQ.js +28 -0
  449. package/dist/worktree-36S7LYES.js +27 -0
  450. package/dist/worktree-WTNPY42O.js +27 -0
  451. package/dist/worktree-sweep-M5AXCSU7.js +20 -0
  452. package/dist/worktree-sweep-NKEGKQT3.js +20 -0
  453. package/package.json +1 -1
  454. package/release-notes.json +54 -54
@@ -0,0 +1,299 @@
1
+ import {
2
+ EXE_AI_DIR
3
+ } from "./chunk-CEKZ77KA.js";
4
+
5
+ // src/lib/db-backup.ts
6
+ import { existsSync, readdirSync, unlinkSync, statSync, statfsSync } from "fs";
7
+ import { copyFile, mkdir, unlink, rename } from "fs/promises";
8
+ import path from "path";
9
+ var BACKUP_DIR = path.join(EXE_AI_DIR, "backups");
10
+ var DEFAULT_KEEP_DAYS = 3;
11
+ var DB_NAMES = ["memories.db", "exe-mem.db", "exe-os.db", "exe.db"];
12
+ var REASON_COUNT_CAP = {
13
+ "pre-restart": 5,
14
+ "pre-consolidation": 5,
15
+ "pre-fix": 5,
16
+ "pre-restore": 5
17
+ };
18
+ var MIN_FREE_BYTES = 5 * 1024 * 1024 * 1024;
19
+ function findActiveDb() {
20
+ for (const name of DB_NAMES) {
21
+ const p = path.join(EXE_AI_DIR, name);
22
+ if (existsSync(p)) return p;
23
+ }
24
+ return null;
25
+ }
26
+ async function createBackup(reason = "manual") {
27
+ return createBackupAsync(reason);
28
+ }
29
+ async function createBackupAsync(reason = "manual", opts = {}) {
30
+ const dbPath = findActiveDb();
31
+ if (!dbPath) return null;
32
+ await mkdir(BACKUP_DIR, { recursive: true });
33
+ try {
34
+ let dbSize = 0;
35
+ try {
36
+ dbSize = statSync(dbPath).size;
37
+ } catch {
38
+ }
39
+ const freeBytes = getFreeBytes(BACKUP_DIR);
40
+ if (!hasEnoughDiskSpace(freeBytes, dbSize)) {
41
+ process.stderr.write(
42
+ `[db-backup] DISK GUARD: skipping "${reason}" backup \u2014 ${Math.round(freeBytes / 1024 / 1024)}MB free, need >${Math.round(Math.max(MIN_FREE_BYTES, dbSize * 2) / 1024 / 1024)}MB. Disk is nearly full; refusing to make it worse.
43
+ `
44
+ );
45
+ return null;
46
+ }
47
+ } catch {
48
+ }
49
+ const dbName = path.basename(dbPath, ".db");
50
+ const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-").slice(0, 19);
51
+ const backupName = `${dbName}-${reason}-${timestamp}.db`;
52
+ const backupPath = path.join(BACKUP_DIR, backupName);
53
+ const tmpBackupPath = `${backupPath}.tmp`;
54
+ const checkpointMode = opts.checkpointMode ?? "TRUNCATE";
55
+ try {
56
+ const { getClient } = await import("./lib/database.js");
57
+ const client = getClient();
58
+ await client.execute(`PRAGMA wal_checkpoint(${checkpointMode})`);
59
+ } catch {
60
+ try {
61
+ const { execFile: execFileCb } = await import("child_process");
62
+ const { promisify } = await import("util");
63
+ const execFileAsync = promisify(execFileCb);
64
+ await execFileAsync("sqlite3", [dbPath, `PRAGMA wal_checkpoint(${checkpointMode});`], { timeout: 3e4 });
65
+ } catch {
66
+ process.stderr.write(`[db-backup] WAL checkpoint skipped \u2014 proceeding with copy (backup may include stale WAL)
67
+ `);
68
+ }
69
+ }
70
+ try {
71
+ await unlink(tmpBackupPath);
72
+ } catch {
73
+ }
74
+ await copyFile(dbPath, tmpBackupPath);
75
+ await rename(tmpBackupPath, backupPath);
76
+ try {
77
+ const { getClient } = await import("./lib/database.js");
78
+ const client = getClient();
79
+ const chk = await client.execute("PRAGMA quick_check;");
80
+ const result = String(chk.rows[0]?.quick_check ?? chk.rows[0]?.[0] ?? "").trim();
81
+ if (result && result !== "ok") {
82
+ process.stderr.write(`[db-backup] WARNING: backup source failed quick_check (${reason}): ${result}
83
+ `);
84
+ try {
85
+ await unlink(backupPath);
86
+ } catch {
87
+ }
88
+ return null;
89
+ }
90
+ } catch {
91
+ process.stderr.write(`[db-backup] Backup validation skipped (encrypted DB or CLI context) \u2014 proceeding with checkpoint-consistent copy.
92
+ `);
93
+ }
94
+ const walPath = dbPath + "-wal";
95
+ if (existsSync(walPath)) {
96
+ try {
97
+ await copyFile(walPath, backupPath + "-wal.tmp");
98
+ await rename(backupPath + "-wal.tmp", backupPath + "-wal");
99
+ } catch {
100
+ }
101
+ }
102
+ const shmPath = dbPath + "-shm";
103
+ if (existsSync(shmPath)) {
104
+ try {
105
+ await copyFile(shmPath, backupPath + "-shm.tmp");
106
+ await rename(backupPath + "-shm.tmp", backupPath + "-shm");
107
+ } catch {
108
+ }
109
+ }
110
+ return backupPath;
111
+ }
112
+ function rotateBackups(keepDays = DEFAULT_KEEP_DAYS) {
113
+ if (!existsSync(BACKUP_DIR)) return 0;
114
+ const cutoff = Date.now() - keepDays * 24 * 60 * 60 * 1e3;
115
+ let deleted = 0;
116
+ try {
117
+ const files = readdirSync(BACKUP_DIR);
118
+ for (const file of files) {
119
+ if (file.endsWith(".tmp")) continue;
120
+ if (!file.endsWith(".db") && !file.endsWith(".db-wal") && !file.endsWith(".db-shm")) continue;
121
+ const filePath = path.join(BACKUP_DIR, file);
122
+ try {
123
+ const stat = statSync(filePath);
124
+ if (stat.mtimeMs < cutoff) {
125
+ unlinkSync(filePath);
126
+ deleted++;
127
+ }
128
+ } catch {
129
+ }
130
+ }
131
+ } catch {
132
+ }
133
+ return deleted;
134
+ }
135
+ function selectBackupsToDelete(backups, keep) {
136
+ if (keep < 0) keep = 0;
137
+ const sorted = [...backups].sort((a, b) => b.mtimeMs - a.mtimeMs);
138
+ return sorted.slice(keep).map((b) => b.path);
139
+ }
140
+ function hasEnoughDiskSpace(freeBytes, backupSizeBytes, minFreeBytes = MIN_FREE_BYTES) {
141
+ const required = Math.max(minFreeBytes, backupSizeBytes * 2);
142
+ return freeBytes >= required;
143
+ }
144
+ function getFreeBytes(dir) {
145
+ try {
146
+ const s = statfsSync(dir);
147
+ return s.bavail * s.bsize;
148
+ } catch {
149
+ return Number.POSITIVE_INFINITY;
150
+ }
151
+ }
152
+ async function quickCheckBackupSource(source) {
153
+ try {
154
+ const { execFile: execFileCb } = await import("child_process");
155
+ const { promisify } = await import("util");
156
+ const execFileAsync = promisify(execFileCb);
157
+ const { stdout } = await execFileAsync("sqlite3", [source, "PRAGMA quick_check;"], { timeout: 3e4 });
158
+ const result = String(stdout ?? "").trim();
159
+ if (result !== "ok") {
160
+ throw new Error(result || "quick_check returned no result");
161
+ }
162
+ } catch (err) {
163
+ const msg = err instanceof Error ? err.message : String(err);
164
+ if (/file is not a database|not an error/i.test(msg)) {
165
+ process.stderr.write(`[db-backup] Backup source quick_check unavailable for encrypted backup (${path.basename(source)}); proceeding with atomic restore.
166
+ `);
167
+ return;
168
+ }
169
+ throw new Error(`Backup source failed quick_check: ${msg}`);
170
+ }
171
+ }
172
+ function rotateBackupsByReason(reason, keep) {
173
+ if (!existsSync(BACKUP_DIR)) return 0;
174
+ let deleted = 0;
175
+ try {
176
+ const files = readdirSync(BACKUP_DIR);
177
+ const matches = [];
178
+ for (const file of files) {
179
+ if (file.endsWith(".tmp")) continue;
180
+ if (!file.endsWith(".db")) continue;
181
+ if (!file.includes(`-${reason}-`)) continue;
182
+ const filePath = path.join(BACKUP_DIR, file);
183
+ try {
184
+ matches.push({ path: filePath, mtimeMs: statSync(filePath).mtimeMs });
185
+ } catch {
186
+ }
187
+ }
188
+ for (const target of selectBackupsToDelete(matches, keep)) {
189
+ for (const p of [target, target + "-wal", target + "-shm"]) {
190
+ try {
191
+ if (existsSync(p)) {
192
+ unlinkSync(p);
193
+ if (p === target) deleted++;
194
+ }
195
+ } catch {
196
+ }
197
+ }
198
+ }
199
+ } catch {
200
+ }
201
+ return deleted;
202
+ }
203
+ function enforceRetention(reason, keepDays = DEFAULT_KEEP_DAYS) {
204
+ let deleted = rotateBackups(keepDays);
205
+ const cap = REASON_COUNT_CAP[reason];
206
+ if (typeof cap === "number") {
207
+ deleted += rotateBackupsByReason(reason, cap);
208
+ }
209
+ return deleted;
210
+ }
211
+ function listBackups() {
212
+ if (!existsSync(BACKUP_DIR)) return [];
213
+ try {
214
+ const files = readdirSync(BACKUP_DIR).filter((f) => f.endsWith(".db") && !f.endsWith(".tmp") && !f.endsWith("-wal") && !f.endsWith("-shm"));
215
+ return files.map((name) => {
216
+ const p = path.join(BACKUP_DIR, name);
217
+ const stat = statSync(p);
218
+ return { path: p, name, size: stat.size, date: stat.mtime };
219
+ }).sort((a, b) => b.date.getTime() - a.date.getTime());
220
+ } catch {
221
+ return [];
222
+ }
223
+ }
224
+ function hasBackupToday(reason) {
225
+ const today = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
226
+ const backups = listBackups();
227
+ return backups.some((b) => b.name.includes(reason) && b.name.includes(today.replace(/-/g, "-")));
228
+ }
229
+ function getLatestBackup() {
230
+ const backups = listBackups();
231
+ return backups.length > 0 ? backups[0].path : null;
232
+ }
233
+ async function restoreBackup(backupPath) {
234
+ const dbPath = findActiveDb();
235
+ if (!dbPath) {
236
+ const target = path.join(EXE_AI_DIR, DB_NAMES[0]);
237
+ const source2 = backupPath ?? getLatestBackup();
238
+ if (!source2 || !existsSync(source2)) return null;
239
+ await copyFile(source2, target);
240
+ return { restored: path.basename(source2), preRestoreBackup: null };
241
+ }
242
+ const source = backupPath ?? getLatestBackup();
243
+ if (!source || !existsSync(source)) return null;
244
+ if (path.resolve(source) === path.resolve(dbPath)) return null;
245
+ await quickCheckBackupSource(source);
246
+ const preRestoreBackup = await createBackup("pre-restore");
247
+ const stamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
248
+ const tmpDb = `${dbPath}.restore-${stamp}.tmp`;
249
+ const oldDb = `${dbPath}.pre-restore-active-${stamp}`;
250
+ await copyFile(source, tmpDb);
251
+ const walPath = source + "-wal";
252
+ const shmPath = source + "-shm";
253
+ const tmpWal = `${tmpDb}-wal`;
254
+ const tmpShm = `${tmpDb}-shm`;
255
+ if (existsSync(walPath)) {
256
+ try {
257
+ await copyFile(walPath, tmpWal);
258
+ } catch {
259
+ }
260
+ }
261
+ if (existsSync(shmPath)) {
262
+ try {
263
+ await copyFile(shmPath, tmpShm);
264
+ } catch {
265
+ }
266
+ }
267
+ try {
268
+ unlinkSync(dbPath + "-wal");
269
+ } catch {
270
+ }
271
+ try {
272
+ unlinkSync(dbPath + "-shm");
273
+ } catch {
274
+ }
275
+ await rename(dbPath, oldDb);
276
+ await rename(tmpDb, dbPath);
277
+ if (existsSync(tmpWal)) await rename(tmpWal, dbPath + "-wal");
278
+ if (existsSync(tmpShm)) await rename(tmpShm, dbPath + "-shm");
279
+ return { restored: path.basename(source), preRestoreBackup };
280
+ }
281
+ function getBackupDir() {
282
+ return BACKUP_DIR;
283
+ }
284
+
285
+ export {
286
+ findActiveDb,
287
+ createBackup,
288
+ createBackupAsync,
289
+ rotateBackups,
290
+ selectBackupsToDelete,
291
+ hasEnoughDiskSpace,
292
+ rotateBackupsByReason,
293
+ enforceRetention,
294
+ listBackups,
295
+ hasBackupToday,
296
+ getLatestBackup,
297
+ restoreBackup,
298
+ getBackupDir
299
+ };
@@ -0,0 +1,362 @@
1
+ import {
2
+ recordSessionKill
3
+ } from "./chunk-NIBCUAEI.js";
4
+ import {
5
+ sessionScopeFilter,
6
+ verifyPaneAtCapacity,
7
+ writeNotification
8
+ } from "./chunk-5XOAYMSU.js";
9
+ import {
10
+ listSessions
11
+ } from "./chunk-WO2SPDUE.js";
12
+ import {
13
+ getTransport
14
+ } from "./chunk-MVW62NIZ.js";
15
+ import {
16
+ recordOrchestrationEventBestEffort
17
+ } from "./chunk-JMR2X5FJ.js";
18
+ import {
19
+ getClient,
20
+ isCoordinatorName
21
+ } from "./chunk-WLDBPKRL.js";
22
+
23
+ // src/lib/capacity-monitor.ts
24
+ var CAPACITY_PATTERNS = [
25
+ /conversation is too long/i,
26
+ /maximum context length/i,
27
+ /context window.*(?:limit|exceed|full)/i,
28
+ /reached.*(?:token|context).*limit/i
29
+ ];
30
+ var CONTENT_LINE_PREFIX = /^[\s>#\-*[]/;
31
+ var CONTENT_LINE_MARKERS = [
32
+ "RESUME:",
33
+ "intercom",
34
+ "capacity-monitor",
35
+ "CAPACITY_PATTERNS",
36
+ "isAtCapacity",
37
+ "CONTENT_LINE_MARKERS",
38
+ "pollCapacityDead",
39
+ "confirmCapacityKill",
40
+ "session_kills",
41
+ "capacity-monitor.test"
42
+ ];
43
+ var SOURCE_CODE_MARKERS = [
44
+ /["'`/].*(?:maximum context length|conversation is too long)/i,
45
+ /(?:maximum context length|conversation is too long).*["'`/]/i
46
+ ];
47
+ var RELAUNCH_COOLDOWN_MS = 5 * 60 * 1e3;
48
+ var _lastRelaunch = /* @__PURE__ */ new Map();
49
+ var RESUME_TITLE_PREFIX = "RESUME:";
50
+ var RESUME_TITLE_LIKE_PATTERN = `${RESUME_TITLE_PREFIX} % hit context capacity%`;
51
+ var RESUME_ACTIVE_STATUSES = ["open", "in_progress"];
52
+ function resumeTaskTitle(agentId) {
53
+ return `${RESUME_TITLE_PREFIX} ${agentId} hit context capacity \u2014 continue open tasks`;
54
+ }
55
+ function buildResumeContext(agentId, openTasks) {
56
+ const taskList = openTasks.map(
57
+ (r, i) => `${i + 1}. [${String(r.priority).toUpperCase()}] ${String(r.title)} (${String(r.task_file)})`
58
+ ).join("\n");
59
+ return [
60
+ "## Context",
61
+ "",
62
+ `${agentId} hit context capacity and was auto-relaunched by the capacity monitor.`,
63
+ "Call recall_my_memory first \u2014 search for 'CONTEXT CHECKPOINT'. Pick up where the previous session stopped.",
64
+ "",
65
+ `You have ${openTasks.length} open task(s). Work through them in priority order:`,
66
+ "",
67
+ taskList,
68
+ "",
69
+ "Read each task file and chain through them. Build and commit after each one."
70
+ ].join("\n");
71
+ }
72
+ var CONFIRMATION_WINDOW_MS = 3 * 60 * 1e3;
73
+ var _pendingCapacityKill = /* @__PURE__ */ new Map();
74
+ function filterPaneContent(paneOutput) {
75
+ return paneOutput.split("\n").filter((line) => {
76
+ if (CONTENT_LINE_PREFIX.test(line)) return false;
77
+ for (const marker of CONTENT_LINE_MARKERS) {
78
+ if (line.includes(marker)) return false;
79
+ }
80
+ for (const re of SOURCE_CODE_MARKERS) {
81
+ if (re.test(line)) return false;
82
+ }
83
+ return true;
84
+ }).join("\n");
85
+ }
86
+ var CC_CONTEXT_BAR_RE = /([\u2588\u2591\u2592\u2593]{10})\s+(\d+)%/;
87
+ var CTX_FLOOR_PERCENT = 50;
88
+ function extractContextPercent(paneOutput) {
89
+ const match = paneOutput.match(CC_CONTEXT_BAR_RE);
90
+ if (!match) return null;
91
+ const parsed = Number.parseInt(match[2], 10);
92
+ return Number.isFinite(parsed) ? parsed : null;
93
+ }
94
+ function isAtCapacity(paneOutput) {
95
+ const filtered = filterPaneContent(paneOutput);
96
+ return CAPACITY_PATTERNS.some((p) => p.test(filtered));
97
+ }
98
+ function confirmCapacityKill(agentId, now = Date.now()) {
99
+ const pendingSince = _pendingCapacityKill.get(agentId);
100
+ if (pendingSince === void 0) {
101
+ _pendingCapacityKill.set(agentId, now);
102
+ return false;
103
+ }
104
+ if (now - pendingSince > CONFIRMATION_WINDOW_MS) {
105
+ _pendingCapacityKill.set(agentId, now);
106
+ return false;
107
+ }
108
+ _pendingCapacityKill.delete(agentId);
109
+ return true;
110
+ }
111
+ function _resetPendingCapacityKills() {
112
+ _pendingCapacityKill.clear();
113
+ }
114
+ function _resetLastRelaunchCache() {
115
+ _lastRelaunch.clear();
116
+ }
117
+ async function lastResumeCreatedAtMs(agentId, sessionScope) {
118
+ const client = getClient();
119
+ const cmScope = sessionScopeFilter(sessionScope ?? null);
120
+ const result = await client.execute({
121
+ sql: `SELECT MAX(created_at) AS last_created_at
122
+ FROM tasks
123
+ WHERE assigned_to = ? AND title LIKE ?${cmScope.sql}`,
124
+ args: [agentId, `${RESUME_TITLE_PREFIX} %`, ...cmScope.args]
125
+ });
126
+ const raw = result.rows[0]?.last_created_at;
127
+ if (raw === null || raw === void 0) return null;
128
+ const parsed = Date.parse(String(raw));
129
+ return Number.isNaN(parsed) ? null : parsed;
130
+ }
131
+ async function isWithinRelaunchCooldown(agentId, now = Date.now(), sessionScope) {
132
+ const cacheKey = sessionScope ? `${agentId}::${sessionScope}` : agentId;
133
+ const cached = _lastRelaunch.get(cacheKey);
134
+ if (cached !== void 0) return now - cached < RELAUNCH_COOLDOWN_MS;
135
+ const persisted = await lastResumeCreatedAtMs(agentId, sessionScope);
136
+ if (persisted === null) return false;
137
+ if (now - persisted >= RELAUNCH_COOLDOWN_MS) return false;
138
+ _lastRelaunch.set(cacheKey, persisted);
139
+ return true;
140
+ }
141
+ async function createOrRefreshResumeTask(agentId, projectDir, openTasks, sessionScope) {
142
+ const client = getClient();
143
+ const now = (/* @__PURE__ */ new Date()).toISOString();
144
+ const context = buildResumeContext(agentId, openTasks);
145
+ const rdScope = sessionScopeFilter(sessionScope ?? null);
146
+ const existing = await client.execute({
147
+ sql: `SELECT id FROM tasks
148
+ WHERE assigned_to = ?
149
+ AND title LIKE ?
150
+ AND status IN (${RESUME_ACTIVE_STATUSES.map(() => "?").join(", ")})${rdScope.sql}
151
+ ORDER BY created_at DESC
152
+ LIMIT 1`,
153
+ args: [agentId, RESUME_TITLE_LIKE_PATTERN, ...RESUME_ACTIVE_STATUSES, ...rdScope.args]
154
+ });
155
+ if (existing.rows.length > 0) {
156
+ const taskId = String(existing.rows[0].id);
157
+ await client.execute({
158
+ sql: `UPDATE tasks SET context = ?, updated_at = ? WHERE id = ?`,
159
+ args: [context, now, taskId]
160
+ });
161
+ recordOrchestrationEventBestEffort({
162
+ eventType: "session.resumed",
163
+ source: "capacity-monitor.createOrRefreshResumeTask",
164
+ agentId,
165
+ taskId,
166
+ payload: { created: false, action: "refreshed" }
167
+ });
168
+ return { created: false, taskId };
169
+ }
170
+ try {
171
+ const staleResumes = await client.execute({
172
+ sql: `SELECT id FROM tasks
173
+ WHERE assigned_to = ?
174
+ AND title LIKE ?
175
+ AND status IN (${RESUME_ACTIVE_STATUSES.map(() => "?").join(", ")})`,
176
+ args: [agentId, RESUME_TITLE_LIKE_PATTERN, ...RESUME_ACTIVE_STATUSES]
177
+ });
178
+ for (const row of staleResumes.rows) {
179
+ await client.execute({
180
+ sql: `UPDATE tasks SET status = 'cancelled', result = ?, updated_at = ? WHERE id = ?`,
181
+ args: ["Auto-cancelled: superseded by new RESUME task.", now, String(row.id)]
182
+ });
183
+ }
184
+ } catch {
185
+ }
186
+ const { createTask } = await import("./lib/tasks.js");
187
+ const task = await createTask({
188
+ title: resumeTaskTitle(agentId),
189
+ assignedTo: agentId,
190
+ assignedBy: "system",
191
+ projectName: projectDir.split("/").pop() ?? "unknown",
192
+ priority: "p0",
193
+ context,
194
+ baseDir: projectDir
195
+ });
196
+ recordOrchestrationEventBestEffort({
197
+ eventType: "session.resumed",
198
+ source: "capacity-monitor.createOrRefreshResumeTask",
199
+ agentId,
200
+ taskId: task.id,
201
+ payload: { created: true, action: "created", openTaskCount: openTasks.length }
202
+ });
203
+ return { created: true, taskId: task.id };
204
+ }
205
+ async function pollCapacityDead() {
206
+ const transport = getTransport();
207
+ const relaunched = [];
208
+ const registered = listSessions();
209
+ if (registered.length === 0) return [];
210
+ let liveSessions;
211
+ try {
212
+ liveSessions = transport.listSessions();
213
+ } catch {
214
+ return [];
215
+ }
216
+ for (const entry of registered) {
217
+ const { windowName, agentId, projectDir } = entry;
218
+ if (!liveSessions.includes(windowName)) continue;
219
+ const cmDashIdx = windowName.indexOf("-");
220
+ const cmDerivedScope = cmDashIdx >= 0 ? windowName.slice(cmDashIdx + 1) : null;
221
+ if (await isWithinRelaunchCooldown(agentId, Date.now(), cmDerivedScope)) continue;
222
+ let pane;
223
+ try {
224
+ pane = transport.capturePane(windowName, 15);
225
+ } catch {
226
+ continue;
227
+ }
228
+ if (!isAtCapacity(pane)) continue;
229
+ const ctxPct = extractContextPercent(pane);
230
+ if (ctxPct !== null && ctxPct < CTX_FLOOR_PERCENT) {
231
+ process.stderr.write(
232
+ `[capacity-monitor] ctx-floor: ${agentId} at ${ctxPct}% in ${windowName} \u2014 below ${CTX_FLOOR_PERCENT}%. Skipping capacity kill (likely self-referential content or false positive).
233
+ `
234
+ );
235
+ continue;
236
+ }
237
+ if (!confirmCapacityKill(agentId)) {
238
+ process.stderr.write(
239
+ `[capacity-monitor] ${agentId} matched capacity pattern once in ${windowName}. Awaiting confirmation on next tick.
240
+ `
241
+ );
242
+ continue;
243
+ }
244
+ const verify = await verifyPaneAtCapacity(windowName);
245
+ if (!verify.atCapacity) {
246
+ process.stderr.write(
247
+ `[capacity-monitor] verifyPaneAtCapacity rejected kill for ${agentId} in ${windowName} (reason: ${verify.reason}). Skipping.
248
+ `
249
+ );
250
+ void recordSessionKill({
251
+ sessionName: windowName,
252
+ agentId,
253
+ reason: "capacity_false_positive_blocked"
254
+ });
255
+ continue;
256
+ }
257
+ process.stderr.write(
258
+ `[capacity-monitor] Detected ${agentId} at capacity in session ${windowName} (confirmed). Auto-relaunching.
259
+ `
260
+ );
261
+ if (isCoordinatorName(agentId)) {
262
+ try {
263
+ const { loadConfigSync } = await import("./lib/config.js");
264
+ const cfg = loadConfigSync();
265
+ if (cfg.sessionLifecycle.autoRelaunchCoordinator !== false) {
266
+ const fs = await import("fs");
267
+ const path = await import("path");
268
+ const os = await import("os");
269
+ const markerDir = path.join(os.homedir(), ".exe-os", "session-cache");
270
+ fs.mkdirSync(markerDir, { recursive: true });
271
+ const markerPath = path.join(markerDir, `relaunch-${windowName}.json`);
272
+ fs.writeFileSync(markerPath, JSON.stringify({
273
+ reason: "context_full",
274
+ agentId,
275
+ projectDir,
276
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
277
+ }));
278
+ process.stderr.write(
279
+ `[capacity-monitor] Coordinator relaunch marker written: ${markerPath}
280
+ `
281
+ );
282
+ }
283
+ transport.kill(windowName);
284
+ void recordSessionKill({ sessionName: windowName, agentId, reason: "capacity" });
285
+ const coordCacheKey = cmDerivedScope ? `${agentId}::${cmDerivedScope}` : agentId;
286
+ _lastRelaunch.set(coordCacheKey, Date.now());
287
+ relaunched.push(agentId);
288
+ } catch (err) {
289
+ process.stderr.write(
290
+ `[capacity-monitor] Coordinator relaunch marker write failed: ${err instanceof Error ? err.message : String(err)}
291
+ `
292
+ );
293
+ }
294
+ continue;
295
+ }
296
+ try {
297
+ transport.kill(windowName);
298
+ void recordSessionKill({
299
+ sessionName: windowName,
300
+ agentId,
301
+ reason: "capacity"
302
+ });
303
+ const client = getClient();
304
+ const dashIdx = windowName.indexOf("-");
305
+ const derivedScope = dashIdx >= 0 ? windowName.slice(dashIdx + 1) : null;
306
+ const rlScope = sessionScopeFilter(derivedScope);
307
+ const openTasks = await client.execute({
308
+ sql: `SELECT id, title, priority, task_file, status
309
+ FROM tasks
310
+ WHERE assigned_to = ? AND status IN ('open', 'in_progress')${rlScope.sql}
311
+ ORDER BY
312
+ CASE priority WHEN 'p0' THEN 0 WHEN 'p1' THEN 1 WHEN 'p2' THEN 2 ELSE 3 END,
313
+ created_at ASC
314
+ LIMIT 10`,
315
+ args: [agentId, ...rlScope.args]
316
+ });
317
+ if (openTasks.rows.length === 0) {
318
+ process.stderr.write(
319
+ `[capacity-monitor] ${agentId} has no open tasks \u2014 skipping relaunch.
320
+ `
321
+ );
322
+ continue;
323
+ }
324
+ const { created } = await createOrRefreshResumeTask(
325
+ agentId,
326
+ projectDir,
327
+ openTasks.rows,
328
+ derivedScope
329
+ );
330
+ if (created) {
331
+ await writeNotification({
332
+ agentId: "system",
333
+ agentRole: "daemon",
334
+ event: "capacity_relaunch",
335
+ project: projectDir.split("/").pop() ?? "unknown",
336
+ summary: `${agentId} hit context capacity. Auto-relaunched with ${openTasks.rows.length} open task(s).`
337
+ });
338
+ }
339
+ const cacheKey = derivedScope ? `${agentId}::${derivedScope}` : agentId;
340
+ _lastRelaunch.set(cacheKey, Date.now());
341
+ if (created) relaunched.push(agentId);
342
+ } catch (err) {
343
+ process.stderr.write(
344
+ `[capacity-monitor] Failed to relaunch ${agentId}: ${err instanceof Error ? err.message : String(err)}
345
+ `
346
+ );
347
+ }
348
+ }
349
+ return relaunched;
350
+ }
351
+
352
+ export {
353
+ CTX_FLOOR_PERCENT,
354
+ extractContextPercent,
355
+ isAtCapacity,
356
+ confirmCapacityKill,
357
+ _resetPendingCapacityKills,
358
+ _resetLastRelaunchCache,
359
+ isWithinRelaunchCooldown,
360
+ createOrRefreshResumeTask,
361
+ pollCapacityDead
362
+ };