@askexenow/exe-os 0.9.372 → 0.9.374

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 (470) hide show
  1. package/deploy/compose/.env.customer.example +45 -10
  2. package/deploy/compose/.env.example +46 -9
  3. package/deploy/compose/docker-compose.yml +136 -18
  4. package/deploy/compose/generate-env.ts +142 -34
  5. package/deploy/compose/sso-edge/default.conf.template +78 -7
  6. package/deploy/compose/sso-edge/sso-redirect.conf +109 -13
  7. package/deploy/stack-manifests/v0.9.30-apps.json +1 -1
  8. package/deploy/stack-manifests/v0.9.json +4 -4
  9. package/dist/.dist-verified.json +3 -3
  10. package/dist/{active-agent-GRT5MKD5.js → active-agent-ONPPEWQV.js} +7 -6
  11. package/dist/{active-agent-L2ZSSXDK.js → active-agent-UJKMG7LJ.js} +7 -6
  12. package/dist/{agent-defs-generator-M4ZNYIVX.js → agent-defs-generator-ZWI6DXOE.js} +6 -5
  13. package/dist/{agent-loop-FOK2IRZQ.js → agent-loop-OYHJKNYH.js} +1 -1
  14. package/dist/{agentic-ontology-DMPRDEUX.js → agentic-ontology-WHFJ3QFS.js} +1 -1
  15. package/dist/{artifact-backup-767STHSW.js → artifact-backup-WXZNB7KE.js} +2 -1
  16. package/dist/{backfill-gate-VX2RZTQV.js → backfill-gate-KWJQ35YX.js} +3 -2
  17. package/dist/{backfill-metadata-ZMEHJQ5M.js → backfill-metadata-3OUSQD5V.js} +8 -7
  18. package/dist/{background-jobs-LTPWCMA3.js → background-jobs-6VMD55PK.js} +3 -2
  19. package/dist/{backup-verify-EX2K732J.js → backup-verify-ZKTUYLTA.js} +4 -3
  20. package/dist/{behavior-injection-22AGMS25.js → behavior-injection-M6UYZCMW.js} +17 -15
  21. package/dist/{behaviors-DVFXAWF5.js → behaviors-ZJ45TFBJ.js} +21 -13
  22. package/dist/bin/age-ontology-load.js +3 -2
  23. package/dist/bin/agentic-ontology-backfill.js +10 -9
  24. package/dist/bin/agentic-reflection-backfill.js +11 -10
  25. package/dist/bin/agentic-semantic-label.js +10 -9
  26. package/dist/bin/backfill-conversations.js +13 -11
  27. package/dist/bin/backfill-responses.js +13 -11
  28. package/dist/bin/backfill-vectors.js +17 -15
  29. package/dist/bin/bulk-sync-postgres.js +22 -20
  30. package/dist/bin/cc-doctor.js +10 -9
  31. package/dist/bin/cleanup-stale-review-tasks.js +29 -26
  32. package/dist/bin/cli.js +36 -26
  33. package/dist/bin/deferred-daemon-restart.js +114 -110
  34. package/dist/bin/exe-agent-config.js +6 -5
  35. package/dist/bin/exe-agent.js +127 -33
  36. package/dist/bin/exe-assign.js +15 -13
  37. package/dist/bin/exe-boot.js +57 -54
  38. package/dist/bin/exe-call.js +8 -7
  39. package/dist/bin/exe-cloud.js +24 -22
  40. package/dist/bin/exe-config-dump.js +6 -5
  41. package/dist/bin/exe-dispatch.js +30 -27
  42. package/dist/bin/exe-doctor.js +14 -10
  43. package/dist/bin/exe-export-behaviors.js +19 -17
  44. package/dist/bin/exe-forget.js +10 -9
  45. package/dist/bin/exe-gateway.js +199 -19
  46. package/dist/bin/exe-grant.js +5 -5
  47. package/dist/bin/exe-healthcheck.js +10 -9
  48. package/dist/bin/exe-heartbeat.js +35 -32
  49. package/dist/bin/exe-kill.js +34 -31
  50. package/dist/bin/exe-launch-agent.js +126 -54
  51. package/dist/bin/exe-mcp.js +6 -5
  52. package/dist/bin/exe-memory-reads.js +8 -7
  53. package/dist/bin/exe-new-employee.js +12 -11
  54. package/dist/bin/exe-os-mcp-proxy.js +6 -5
  55. package/dist/bin/exe-pending-messages.js +30 -27
  56. package/dist/bin/exe-pending-notifications.js +29 -26
  57. package/dist/bin/exe-pending-reviews.js +30 -27
  58. package/dist/bin/exe-rename.js +8 -7
  59. package/dist/bin/exe-repo-truth.js +1 -1
  60. package/dist/bin/exe-review.js +33 -30
  61. package/dist/bin/exe-search.js +9 -8
  62. package/dist/bin/exe-session-cleanup.js +35 -32
  63. package/dist/bin/exe-settings.js +24 -22
  64. package/dist/bin/exe-start-codex.js +137 -55
  65. package/dist/bin/exe-start-opencode.js +121 -23
  66. package/dist/bin/exe-status.js +31 -28
  67. package/dist/bin/exe-support.js +5 -4
  68. package/dist/bin/exe-team.js +7 -6
  69. package/dist/bin/exe-watchdog.js +31 -11
  70. package/dist/bin/generate-hook-manifest.js +44 -7
  71. package/dist/bin/git-sweep.js +31 -28
  72. package/dist/bin/graph-backfill.js +89 -35
  73. package/dist/bin/graph-export.js +9 -8
  74. package/dist/bin/import-history.js +14 -13
  75. package/dist/bin/install.js +137 -113
  76. package/dist/bin/intercom-check.js +5 -5
  77. package/dist/bin/mcp-sessions.js +2 -2
  78. package/dist/bin/orchestration-metrics.js +7 -6
  79. package/dist/bin/postgres-agentic-reflection-backfill.js +5 -4
  80. package/dist/bin/postgres-agentic-semantic-backfill.js +4 -3
  81. package/dist/bin/pre-publish.js +1 -1
  82. package/dist/bin/reconcile-backlog.js +2 -2
  83. package/dist/bin/registry-proxy.js +1 -1
  84. package/dist/bin/scan-tasks.js +29 -26
  85. package/dist/bin/setup.js +5 -4
  86. package/dist/bin/shard-migrate.js +9 -8
  87. package/dist/bin/stack-update.js +40 -9
  88. package/dist/bin/verify-stack.js +2 -2
  89. package/dist/bin/vps-health-gate.js +1 -1
  90. package/dist/{boot-generation-OHXH4YC5.js → boot-generation-JKVZ4ZAT.js} +6 -5
  91. package/dist/{boot-review-sections-N5IXIGSS.js → boot-review-sections-2M6BTG73.js} +28 -25
  92. package/dist/{branch-hygiene-KCGXRAWP.js → branch-hygiene-U5GFRSTP.js} +31 -7
  93. package/dist/{branding-GH43W3PU.js → branding-I6KIMB7F.js} +3 -2
  94. package/dist/budget-fallback-XJRPMP2D.js +11 -0
  95. package/dist/build-manifest.json +1318 -1233
  96. package/dist/{capability-cards-4PXVLIVS.js → capability-cards-5IMJT6J7.js} +5 -4
  97. package/dist/{capacity-monitor-FKMQXORX.js → capacity-monitor-SAXCQK7O.js} +30 -27
  98. package/dist/{catchup-brief-SN5EKO4N.js → catchup-brief-U2TXBLHD.js} +34 -31
  99. package/dist/{chunk-CNC57JCS.js → chunk-23MVDXLY.js} +4 -4
  100. package/dist/{chunk-V4XAKXXF.js → chunk-2AJGV5UL.js} +1 -1
  101. package/dist/{chunk-FBYAXTDM.js → chunk-2ZOEC4KC.js} +10 -2
  102. package/dist/{chunk-ELXFSIIM.js → chunk-32YV32VA.js} +2 -2
  103. package/dist/{chunk-44C7QNZS.js → chunk-3KDCORDO.js} +1 -1
  104. package/dist/{chunk-JTB5V6BV.js → chunk-3SXHEQ7X.js} +1 -1
  105. package/dist/{chunk-HDW4XPDV.js → chunk-3UUX5OY4.js} +1 -1
  106. package/dist/{chunk-7PSLK36P.js → chunk-44TLJZJ5.js} +1 -1
  107. package/dist/{chunk-JTWTBX2M.js → chunk-4EN3IZ3Q.js} +2 -1
  108. package/dist/{chunk-KPMC7PY7.js → chunk-4HKTO2SV.js} +1 -1
  109. package/dist/{chunk-CDUB5Q6J.js → chunk-4IK2K3B3.js} +1 -1
  110. package/dist/{chunk-GH6YJOOC.js → chunk-4SJ4LK4V.js} +6 -6
  111. package/dist/{chunk-PVEM537A.js → chunk-4YLBKEL5.js} +2 -2
  112. package/dist/chunk-4YNA3CM6.js +872 -0
  113. package/dist/{chunk-KYFFVTGO.js → chunk-55BEFF4V.js} +3 -3
  114. package/dist/{chunk-SEP5ITFQ.js → chunk-636LKCKE.js} +2 -2
  115. package/dist/{chunk-QTI4QAWA.js → chunk-6EZQUNE6.js} +338 -5
  116. package/dist/{chunk-WAEKYKTK.js → chunk-6RKKVPYF.js} +1 -1
  117. package/dist/{chunk-VX2F4ZUY.js → chunk-6SCGLHJ7.js} +3 -3
  118. package/dist/{chunk-MEGRQ53A.js → chunk-6VHOQ3IM.js} +51 -6
  119. package/dist/{chunk-HIIXCAEE.js → chunk-6YVUR3OU.js} +3 -3
  120. package/dist/{chunk-L6ZNURWN.js → chunk-7GE2EQ23.js} +1 -1
  121. package/dist/{chunk-2CWS374F.js → chunk-7RI2CNXJ.js} +1 -1
  122. package/dist/{chunk-OL3QP3AU.js → chunk-7TSBV3SD.js} +1 -1
  123. package/dist/{chunk-DSOQUQTV.js → chunk-A27Q27CT.js} +27 -0
  124. package/dist/{chunk-5AHRZI3R.js → chunk-AETLDRZB.js} +1 -1
  125. package/dist/{chunk-RNLF3CBB.js → chunk-AKLJ4JH3.js} +1 -1
  126. package/dist/{chunk-XHYHX6F7.js → chunk-AKLQSC6W.js} +329 -164
  127. package/dist/chunk-ANLFH23R.js +261 -0
  128. package/dist/{chunk-QLA3RTH4.js → chunk-AWWKRZMB.js} +5 -5
  129. package/dist/{chunk-ERVQTR7P.js → chunk-BBSIEYF5.js} +17 -3
  130. package/dist/{chunk-IPMUWYRQ.js → chunk-BJ7AVSY6.js} +2 -2
  131. package/dist/{chunk-HV6Y6F4X.js → chunk-C2L622QJ.js} +89 -3
  132. package/dist/{chunk-TX3Q2GIL.js → chunk-C5HUMAA7.js} +24 -1
  133. package/dist/{chunk-QTYJPWJN.js → chunk-CBCGDEJA.js} +7 -7
  134. package/dist/{chunk-XXSNLM6R.js → chunk-DB55JZHU.js} +1 -1
  135. package/dist/{chunk-LAZKEJMS.js → chunk-DIXXEE3S.js} +840 -607
  136. package/dist/{chunk-FB343XQX.js → chunk-DJ7YXOTU.js} +2 -2
  137. package/dist/{chunk-YFCNWQAM.js → chunk-DJOIMFKV.js} +2 -2
  138. package/dist/{chunk-UTDMTQNH.js → chunk-DSJI76XL.js} +92 -14
  139. package/dist/{chunk-EEXX4UMQ.js → chunk-DZKPOSFD.js} +1 -1
  140. package/dist/{chunk-WSOA3WMC.js → chunk-E426DOSY.js} +161 -4
  141. package/dist/{chunk-ZISQOOER.js → chunk-EKE37MO4.js} +3 -3
  142. package/dist/{chunk-RIECV7SR.js → chunk-EKYYMIVT.js} +1 -1
  143. package/dist/{chunk-HIVZ53YB.js → chunk-EXTZSNWL.js} +2 -2
  144. package/dist/{chunk-YYA5LXCT.js → chunk-FNEZ4BWT.js} +1 -1
  145. package/dist/chunk-FTZET5YX.js +313 -0
  146. package/dist/chunk-GHR4ZPJ7.js +70 -0
  147. package/dist/{chunk-MINXPXAB.js → chunk-GJI77VDO.js} +3 -3
  148. package/dist/{chunk-AAMGHW5W.js → chunk-GLQEJOXE.js} +1 -0
  149. package/dist/{chunk-ADNBOKYZ.js → chunk-GM7TLYOK.js} +60 -18
  150. package/dist/{chunk-RUWWES2K.js → chunk-GNUAL43X.js} +2 -2
  151. package/dist/{chunk-QZL6E4UB.js → chunk-GOMQ7PVQ.js} +2 -2
  152. package/dist/{chunk-GB3AHV5F.js → chunk-GQOEWNVM.js} +1 -1
  153. package/dist/{chunk-NQZUSEAR.js → chunk-GS7LIT34.js} +246 -17
  154. package/dist/{chunk-XTWHNLGD.js → chunk-GZOG2MAX.js} +1 -1
  155. package/dist/{chunk-E5HAY3DQ.js → chunk-HDLAB7W3.js} +1 -1
  156. package/dist/{chunk-E5QQZDQN.js → chunk-HNWS7YHN.js} +358 -136
  157. package/dist/{chunk-VV5EZZNT.js → chunk-HTBEVCO2.js} +1 -1
  158. package/dist/{chunk-OZBII5E3.js → chunk-I4DNJFDR.js} +4 -4
  159. package/dist/{chunk-SI5SZAJA.js → chunk-IBS2FAI4.js} +21 -4
  160. package/dist/{chunk-J5EYOBFF.js → chunk-IHXW4VUI.js} +1 -1
  161. package/dist/{chunk-RUVO3NJC.js → chunk-IN6CAM4F.js} +9 -3
  162. package/dist/{chunk-53PYNYTW.js → chunk-IRVOXUSK.js} +5 -5
  163. package/dist/{chunk-THM7J6UI.js → chunk-JHI5WMK5.js} +5 -5
  164. package/dist/{chunk-3KTQWMHI.js → chunk-JSMDRKPJ.js} +12 -4
  165. package/dist/chunk-JTVIANUB.js +131 -0
  166. package/dist/{chunk-2ADYTOHQ.js → chunk-K4ESASPL.js} +1 -1
  167. package/dist/{chunk-YWUQVHDL.js → chunk-KTCXJWJG.js} +1 -1
  168. package/dist/{chunk-RGUDGC6A.js → chunk-KTU3EAWK.js} +5 -5
  169. package/dist/{chunk-DKBPCOU4.js → chunk-L6RXG36J.js} +2 -2
  170. package/dist/{chunk-T4EK56WI.js → chunk-LDNYSMPZ.js} +1 -1
  171. package/dist/{chunk-RIK5GRWI.js → chunk-LGS2V2XD.js} +3 -3
  172. package/dist/{chunk-JKXZGRWR.js → chunk-LP4GB656.js} +2 -2
  173. package/dist/{chunk-H74466TM.js → chunk-M7O7TGGU.js} +1 -1
  174. package/dist/chunk-MJCSEIFI.js +54 -0
  175. package/dist/{chunk-IDZPQG2D.js → chunk-MOGA4Q7F.js} +2 -2
  176. package/dist/{chunk-OYQNNKNS.js → chunk-MXPNVSXI.js} +37 -14
  177. package/dist/{chunk-UVW7YFAF.js → chunk-N7VEP5B3.js} +4 -4
  178. package/dist/{chunk-HHE2HV3V.js → chunk-NBXDXKLC.js} +1 -1
  179. package/dist/{chunk-LDL3S7AC.js → chunk-NKETJCB5.js} +7 -3
  180. package/dist/{chunk-ECHLVLA7.js → chunk-NMH5ZQPU.js} +1 -1
  181. package/dist/{chunk-U3XLRMJD.js → chunk-NT7W4RXD.js} +1 -1
  182. package/dist/{chunk-UQUUNGTP.js → chunk-NUK7EEN5.js} +11 -9
  183. package/dist/{chunk-GBNB4EWD.js → chunk-ORM7ZFKC.js} +16 -0
  184. package/dist/{chunk-O4ZFRK6W.js → chunk-OVEQE6YS.js} +244 -49
  185. package/dist/{chunk-4ZJ5BPY6.js → chunk-PB5S7YOF.js} +2 -2
  186. package/dist/{chunk-JR23BL74.js → chunk-PDVXWXTL.js} +4 -4
  187. package/dist/{chunk-3CIMDFXG.js → chunk-PFQ3VEEM.js} +1 -1
  188. package/dist/{chunk-SBJV2PCU.js → chunk-PHBU4LGO.js} +1 -1
  189. package/dist/{chunk-W25RLOQ2.js → chunk-PLZSZOZN.js} +3 -3
  190. package/dist/{chunk-THIJIOE2.js → chunk-PY3FOMRN.js} +18 -6
  191. package/dist/{chunk-AAUWFXOX.js → chunk-Q3AXXKDF.js} +3 -3
  192. package/dist/{chunk-VKXS2YGN.js → chunk-QHJR7IMX.js} +2 -2
  193. package/dist/chunk-QLZ46RCK.js +45 -0
  194. package/dist/{chunk-UHPMK6QZ.js → chunk-R3CZWFFC.js} +10 -2
  195. package/dist/{chunk-6XEYELCA.js → chunk-R4CBHKZ2.js} +1 -1
  196. package/dist/{chunk-5APCDDJZ.js → chunk-R522MWAR.js} +9 -9
  197. package/dist/chunk-RH4AH3YB.js +80 -0
  198. package/dist/{chunk-AMKSDKMK.js → chunk-S2WBS6BG.js} +22 -35
  199. package/dist/{chunk-WUKQVNLP.js → chunk-SEQIPGLU.js} +1 -1
  200. package/dist/{chunk-7WQRFSZI.js → chunk-SL6KQYDU.js} +26 -6
  201. package/dist/chunk-SLLLOOEI.js +103 -0
  202. package/dist/{chunk-5N4SG5NB.js → chunk-T35RCQFE.js} +3 -3
  203. package/dist/{chunk-7V6M3QUS.js → chunk-T3QUKNLI.js} +1 -1
  204. package/dist/{chunk-CW2UCKHS.js → chunk-TADAO3HV.js} +2 -2
  205. package/dist/{chunk-5DCCKHDY.js → chunk-TAMDAOCU.js} +109 -13
  206. package/dist/{chunk-ZXB56YR2.js → chunk-TFKCERAK.js} +101 -23
  207. package/dist/{chunk-RBYHJDAT.js → chunk-TQAZTRQ3.js} +3 -3
  208. package/dist/{chunk-OKGIOWOB.js → chunk-U6SUKSZR.js} +2 -2
  209. package/dist/{chunk-23QKEUF6.js → chunk-U73AC5AN.js} +34 -12
  210. package/dist/{chunk-PM6WSWVU.js → chunk-UBK7HK3J.js} +3 -3
  211. package/dist/{chunk-H37FSTF2.js → chunk-UBMZ3YQU.js} +1 -1
  212. package/dist/{chunk-JJUGI2YL.js → chunk-UCFC2AEI.js} +1 -1
  213. package/dist/{chunk-6IWLAQ7O.js → chunk-UCUOGVDX.js} +4 -0
  214. package/dist/{chunk-E7UCDSUE.js → chunk-UKLN57Q5.js} +2 -2
  215. package/dist/{chunk-ZYCLSEZT.js → chunk-ULIBLJ6W.js} +33 -11
  216. package/dist/{chunk-RLR6VVKV.js → chunk-UM3N6VND.js} +4 -4
  217. package/dist/{chunk-ZNUJFX7L.js → chunk-UQGSBM3U.js} +1 -1
  218. package/dist/{chunk-ZZXMB5F2.js → chunk-UZDF6FLJ.js} +1 -1
  219. package/dist/{chunk-LNOS24GV.js → chunk-V3WLC5TJ.js} +2 -95
  220. package/dist/{chunk-UXLO7VHX.js → chunk-VI4ATC6I.js} +1 -1
  221. package/dist/{chunk-77JP3LK4.js → chunk-VKJGHAZT.js} +92 -21
  222. package/dist/{chunk-7R73IAHU.js → chunk-VMTZ4RUW.js} +67 -150
  223. package/dist/{chunk-TGPQMMQP.js → chunk-VYQ7B7DI.js} +30 -17
  224. package/dist/{chunk-E2WEFZOR.js → chunk-W75GTHR3.js} +1 -1
  225. package/dist/{chunk-UKLF7F3Z.js → chunk-WJG344NC.js} +9 -9
  226. package/dist/{chunk-MBNIJXKI.js → chunk-WMEYJT4R.js} +18 -4
  227. package/dist/{chunk-R6FLELV6.js → chunk-XFTEX77S.js} +3 -3
  228. package/dist/{chunk-MDGYXUOV.js → chunk-XH7YL7JM.js} +1 -1
  229. package/dist/{chunk-JOO35RHR.js → chunk-XL5MFGMR.js} +3 -3
  230. package/dist/{chunk-OW5RZIDW.js → chunk-XNNECNDL.js} +95 -33
  231. package/dist/{chunk-5AHDQCTB.js → chunk-XXFKSJYA.js} +6 -6
  232. package/dist/{chunk-TGEPLJ66.js → chunk-XXOPG4BW.js} +3 -3
  233. package/dist/{chunk-PGLPUP37.js → chunk-XZ65ST2I.js} +1 -1
  234. package/dist/{chunk-3TTKAT6V.js → chunk-YKC7QDZH.js} +9 -4
  235. package/dist/{chunk-KXYFBBZR.js → chunk-YMP2QSOP.js} +20 -3
  236. package/dist/{chunk-TK4MI6F6.js → chunk-YSLGFPWX.js} +6 -6
  237. package/dist/{chunk-X2P43TB2.js → chunk-YTSXPJUQ.js} +1 -1
  238. package/dist/{chunk-HECXZGGZ.js → chunk-ZCERWHY2.js} +33 -35
  239. package/dist/{chunk-IVU3WN7S.js → chunk-ZG62LIK3.js} +74 -4
  240. package/dist/{chunk-GU62SNDH.js → chunk-ZGYNKA3O.js} +744 -111
  241. package/dist/{chunk-QMSEL5YS.js → chunk-ZIG7VPJV.js} +28 -76
  242. package/dist/{chunk-WZJVGA5I.js → chunk-ZL4AGWAH.js} +258 -13
  243. package/dist/{chunk-QR624DER.js → chunk-ZSODLMFV.js} +2 -2
  244. package/dist/{cleanup-graph-garbage-IPYDS5OX.js → cleanup-graph-garbage-DPJGO52H.js} +11 -10
  245. package/dist/{cloud-sync-command-JLNVG7H4.js → cloud-sync-command-JPNTT4OQ.js} +2 -2
  246. package/dist/{cloud-sync-db-init-JXUF6GI3.js → cloud-sync-db-init-V2LWIUQU.js} +1 -1
  247. package/dist/{cloud-sync-shutdown-Z4SBP6PL.js → cloud-sync-shutdown-BNALPWGX.js} +5 -4
  248. package/dist/{co-activation-74RDFTKS.js → co-activation-CMNSWS6B.js} +5 -4
  249. package/dist/{co-occurrence-CN3TBYVR.js → co-occurrence-WRI2NAN6.js} +9 -8
  250. package/dist/{code-context-index-D4MJ4VFX.js → code-context-index-NOJSHLPN.js} +12 -6
  251. package/dist/code-context-watcher-VZNZU3BO.js +118 -0
  252. package/dist/{codex-consolidation-PPXNBXCV.js → codex-consolidation-SH4UKFBQ.js} +2 -1
  253. package/dist/{conversation-entity-extractor-QGTLH4BP.js → conversation-entity-extractor-74252CAO.js} +4 -4
  254. package/dist/{conversation-wiki-populator-EBUZXYEU.js → conversation-wiki-populator-OS4C6W54.js} +1 -1
  255. package/dist/conversations-retention-C4BLKFEL.js +54 -0
  256. package/dist/coordinator-notice-MHUY7AQB.js +55 -0
  257. package/dist/{crdt-sync-7T4WCOKD.js → crdt-sync-B3JN6AIV.js} +1 -1
  258. package/dist/{crm-webhook-FTW3XZTO.js → crm-webhook-GYWQRFET.js} +2 -2
  259. package/dist/{cto-delegation-gate-SZCE34LB.js → cto-delegation-gate-LQHVLEMW.js} +29 -26
  260. package/dist/{daemon-auth-SSPY5ODS.js → daemon-auth-QZHEO7IQ.js} +3 -2
  261. package/dist/{daemon-orchestration-IGPHVNFR.js → daemon-orchestration-5HIQALZH.js} +36 -34
  262. package/dist/{daemon-ready-OT2VQLS7.js → daemon-ready-P2BR2XP5.js} +1 -1
  263. package/dist/{db-integrity-events-5DTASXJF.js → db-integrity-events-2DTFO37N.js} +3 -2
  264. package/dist/{db-restore-events-2FI4ZMKA.js → db-restore-events-G6NOQOVE.js} +2 -1
  265. package/dist/{destructive-data-guard-6I5MDFVD.js → destructive-data-guard-BVFWPPIS.js} +1 -1
  266. package/dist/doc-graph-extractor-PQHDHQPQ.js +367 -0
  267. package/dist/{documents-URULIXGM.js → documents-C4SSPJMC.js} +15 -13
  268. package/dist/{dreaming-VIZO3QDO.js → dreaming-XAO3FCBV.js} +33 -30
  269. package/dist/{employee-boot-brief-XLOG4ULP.js → employee-boot-brief-W4OHUMRQ.js} +37 -34
  270. package/dist/{exe-drift-TLQM3IHD.js → exe-drift-AG2KMKD5.js} +6 -5
  271. package/dist/{exe-export-7YWYWJHY.js → exe-export-IC5BT335.js} +17 -15
  272. package/dist/{exe-import-DW6VAUKW.js → exe-import-A35ZLDPG.js} +17 -15
  273. package/dist/{exe-key-TLJP2B4Y.js → exe-key-TCMJNYLA.js} +116 -112
  274. package/dist/{exe-org-LU46N36E.js → exe-org-JXCR3JYZ.js} +24 -23
  275. package/dist/{exe-snapshot-QHUZRS62.js → exe-snapshot-SV6SRIG6.js} +36 -33
  276. package/dist/{fast-db-init-SCTOOIUT.js → fast-db-init-L2RGKJWH.js} +1 -1
  277. package/dist/{founder-context-ZFZC4UHO.js → founder-context-D4HFIESJ.js} +4 -3
  278. package/dist/{founder-monitor-envelope-5KTKNL5G.js → founder-monitor-envelope-TFKRGCFE.js} +5 -4
  279. package/dist/{fts-integrity-LKAZEZJE.js → fts-integrity-4YB34KWX.js} +3 -2
  280. package/dist/gateway/index.js +19 -17
  281. package/dist/{git-main-guard-TN27QBAI.js → git-main-guard-VTW4N3CM.js} +7 -1
  282. package/dist/{git-staleness-GSGP344N.js → git-staleness-TN7CYGFG.js} +5 -4
  283. package/dist/{global-procedures-YAR7G4C6.js → global-procedures-YFDEIOG7.js} +7 -6
  284. package/dist/{graph-auto-extract-GNQS64F5.js → graph-auto-extract-3YR3TYRW.js} +9 -8
  285. package/dist/{graph-rag-RMSFLUOB.js → graph-rag-Z2KCJTPK.js} +6 -4
  286. package/dist/{hook-integrity-CF567MVN.js → hook-integrity-KGAV6ZC2.js} +14 -4
  287. package/dist/{hook-prefetch-36BK4F7U.js → hook-prefetch-K5DN3TOQ.js} +29 -26
  288. package/dist/hooks/bug-report-worker.js +34 -30
  289. package/dist/hooks/codex-stop-task-finalizer.js +36 -32
  290. package/dist/hooks/commit-complete.js +33 -30
  291. package/dist/hooks/error-recall.js +12 -11
  292. package/dist/hooks/exe-heartbeat-hook.js +8 -7
  293. package/dist/hooks/ingest-worker.js +23 -11
  294. package/dist/hooks/ingest.js +18 -17
  295. package/dist/hooks/instructions-loaded.js +10 -9
  296. package/dist/hooks/manifest.json +20 -20
  297. package/dist/hooks/notification.js +9 -8
  298. package/dist/hooks/post-compact.js +8 -7
  299. package/dist/hooks/post-tool-combined.js +26 -15
  300. package/dist/hooks/pre-compact.js +33 -30
  301. package/dist/hooks/pre-tool-use.js +404 -46
  302. package/dist/hooks/prompt-submit.js +57 -47
  303. package/dist/hooks/session-end.js +40 -41
  304. package/dist/hooks/session-start.js +21 -20
  305. package/dist/hooks/stop.js +40 -37
  306. package/dist/hooks/subagent-stop.js +38 -35
  307. package/dist/hooks/summary-worker.js +39 -36
  308. package/dist/hyde-MP4QNMU5.js +80 -0
  309. package/dist/index.js +44 -39
  310. package/dist/{installer-LUN4HQIC.js → installer-54HTN5RE.js} +8 -7
  311. package/dist/{installer-OC5VXNC7.js → installer-LK35OX6R.js} +8 -7
  312. package/dist/{installer-MPRFUQJE.js → installer-LLWKZI2S.js} +8 -7
  313. package/dist/intercom-ack-VCW755TN.js +13 -0
  314. package/dist/{intercom-queue-6DZ7BANV.js → intercom-queue-5NOT2RKI.js} +28 -25
  315. package/dist/{key-backup-status-6L2ARCXW.js → key-backup-status-LQPINQ3W.js} +2 -1
  316. package/dist/lib/agent-config.js +3 -2
  317. package/dist/lib/cloud-sync.js +26 -20
  318. package/dist/lib/config.js +2 -1
  319. package/dist/lib/consolidation.js +17 -10
  320. package/dist/lib/database.js +7 -4
  321. package/dist/lib/db-backup.js +17 -2
  322. package/dist/lib/db-daemon-client.js +8 -6
  323. package/dist/lib/db-write-worker-client.js +3 -1
  324. package/dist/lib/db-write-worker.js +20 -3
  325. package/dist/lib/db.js +7 -4
  326. package/dist/lib/device-registry.js +3 -2
  327. package/dist/lib/embed-worker.js +2 -1
  328. package/dist/lib/embedder.js +8 -6
  329. package/dist/lib/employee-templates.js +8 -7
  330. package/dist/lib/employees.js +5 -4
  331. package/dist/lib/exe-daemon-client.js +7 -5
  332. package/dist/lib/exe-daemon.js +467 -221
  333. package/dist/lib/hybrid-search.js +11 -8
  334. package/dist/lib/identity.js +5 -4
  335. package/dist/lib/license.js +4 -3
  336. package/dist/lib/messaging.js +29 -26
  337. package/dist/lib/post-tool-memory.js +16 -2
  338. package/dist/lib/registry-proxy.js +3 -1
  339. package/dist/lib/reminders.js +6 -5
  340. package/dist/lib/schedules.js +9 -8
  341. package/dist/lib/session-registry.js +7 -6
  342. package/dist/lib/skill-learning.js +16 -14
  343. package/dist/lib/stack-invariants.js +17 -1
  344. package/dist/lib/status-brief.js +5 -4
  345. package/dist/lib/store.js +10 -7
  346. package/dist/lib/task-router.js +6 -5
  347. package/dist/lib/tasks.js +31 -27
  348. package/dist/lib/tmux-routing.js +40 -25
  349. package/dist/lib/tmux-status.js +3 -1
  350. package/dist/lib/tmux-transport.js +2 -1
  351. package/dist/lib/token-spend.js +6 -5
  352. package/dist/lib/transport.js +3 -2
  353. package/dist/{license-gate-ESER24PJ.js → license-gate-JVMB6OFD.js} +5 -4
  354. package/dist/{license-sync-JVG5KNIY.js → license-sync-5VYS2F2W.js} +4 -3
  355. package/dist/mcp/register-tools.js +113 -109
  356. package/dist/mcp/server.js +118 -114
  357. package/dist/mcp/tools/complete-reminder.js +7 -6
  358. package/dist/mcp/tools/create-reminder.js +7 -6
  359. package/dist/mcp/tools/create-task.js +34 -30
  360. package/dist/mcp/tools/deactivate-behavior.js +18 -16
  361. package/dist/mcp/tools/list-reminders.js +7 -6
  362. package/dist/mcp/tools/list-tasks.js +34 -30
  363. package/dist/mcp/tools/send-message.js +32 -29
  364. package/dist/mcp/tools/update-task.js +32 -28
  365. package/dist/mcp-child-registry-OTG4MWO7.js +25 -0
  366. package/dist/{mcp-http-config-6K6IKH5F.js → mcp-http-config-DQWL7U2Z.js} +6 -5
  367. package/dist/{mcp-session-identity-LRC6WJSD.js → mcp-session-identity-277GASTQ.js} +28 -25
  368. package/dist/{memory-cards-V3OZHIYP.js → memory-cards-3S2ZQPR7.js} +17 -8
  369. package/dist/{memory-graph-extractor-JC2Z64L4.js → memory-graph-extractor-A6DFEFIN.js} +10 -9
  370. package/dist/{memory-poisoning-defense-YM4QJHCX.js → memory-poisoning-defense-ZVP4H6DY.js} +5 -4
  371. package/dist/{memory-pressure-watchdog-6F6KEQHN.js → memory-pressure-watchdog-6W5F6R7H.js} +29 -26
  372. package/dist/{memory-queue-QJNWKWKG.js → memory-queue-YF7IDSFY.js} +3 -2
  373. package/dist/{memory-queue-client-COA4ABEV.js → memory-queue-client-ADSDP6OX.js} +9 -7
  374. package/dist/{memory-reflection-QXHJPYPC.js → memory-reflection-BKB2YOE6.js} +52 -6
  375. package/dist/{monitor-grants-BW2WL4IU.js → monitor-grants-EV747HMW.js} +4 -3
  376. package/dist/{notification-ledger-6QRLQW4Q.js → notification-ledger-CLGM7ODF.js} +30 -27
  377. package/dist/{notifications-7B6D7Y5C.js → notifications-MACUZPYP.js} +28 -25
  378. package/dist/{oauth-server-TZFNQAFS.js → oauth-server-AYM37SQ4.js} +25 -4
  379. package/dist/{orchestration-events-GY5VP5LU.js → orchestration-events-N7LYMUGA.js} +6 -5
  380. package/dist/{orchestration-phase-UDS24CVQ.js → orchestration-phase-T2WD45UA.js} +3 -2
  381. package/dist/{orchestrator-JVPVOYWA.js → orchestrator-4X24EWHV.js} +30 -27
  382. package/dist/{org-brief-session-GRV5R5E3.js → org-brief-session-FZOFMO5U.js} +13 -12
  383. package/dist/{org-consent-policy-3FHHSYXV.js → org-consent-policy-O5E6HXBL.js} +1 -1
  384. package/dist/{org-join-BY4PV6UO.js → org-join-POWUG25F.js} +8 -7
  385. package/dist/{org-key-admin-WSCPT2CZ.js → org-key-admin-E7EMDOZZ.js} +9 -8
  386. package/dist/{org-key-pin-5WUSPGVN.js → org-key-pin-WHWHVWUO.js} +4 -3
  387. package/dist/{org-membership-ESALTLLN.js → org-membership-WRT2IHJK.js} +5 -4
  388. package/dist/{org-partner-config-YKHPDPZR.js → org-partner-config-B7T4CL2T.js} +7 -6
  389. package/dist/{org-partner-runtime-UJDGECZ4.js → org-partner-runtime-FODONVTM.js} +13 -12
  390. package/dist/{org-row-visibility-V5DXIHTE.js → org-row-visibility-VX4AVV5Q.js} +1 -1
  391. package/dist/{pipeline-router-YY5FQKTY.js → pipeline-router-6GGT2ZW3.js} +6 -5
  392. package/dist/{plan-limits-OVX6SN6B.js → plan-limits-FUN76LYY.js} +8 -7
  393. package/dist/{platform-procedures-I57ITMDC.js → platform-procedures-7YSCLF4Z.js} +1 -1
  394. package/dist/{postinstall-failure-B2JHNFPM.js → postinstall-failure-O6TSSNJB.js} +3 -2
  395. package/dist/{project-boot-LXLU2J32.js → project-boot-3Q65LCIP.js} +2 -1
  396. package/dist/project-name-LJVFMYTQ.js +30 -0
  397. package/dist/{projection-worker-D2472IOD.js → projection-worker-4OANGP5K.js} +5 -4
  398. package/dist/{prospective-memory-JXO2A6PL.js → prospective-memory-KR3P4T6N.js} +5 -4
  399. package/dist/{push-notifications-HR3FZRDI.js → push-notifications-NCZLH6DI.js} +29 -26
  400. package/dist/ref-provenance-gate-M4AQO4OT.js +269 -0
  401. package/dist/{reproject-worktree-memories-OSS3PGRF.js → reproject-worktree-memories-PWYKPB2U.js} +106 -23
  402. package/dist/{reranker-IMZRPYJ2.js → reranker-6V3C2AO4.js} +3 -2
  403. package/dist/resolve-image-labels-ZI6UBW5W.js +15 -0
  404. package/dist/{retrieval-health-W7OD44FE.js → retrieval-health-5D7O6VH6.js} +4 -3
  405. package/dist/{review-polling-2INP7H6M.js → review-polling-QW3LJ4KN.js} +29 -26
  406. package/dist/runtime/index.js +38 -34
  407. package/dist/{session-events-G4XUPVWV.js → session-events-T45SSTMF.js} +31 -26
  408. package/dist/{session-kill-telemetry-W7MHWJTQ.js → session-kill-telemetry-QSPVJGBF.js} +29 -26
  409. package/dist/{session-mcp-config-F7KATWOF.js → session-mcp-config-SC5BLWZG.js} +3 -2
  410. package/dist/{session-scope-LG2J4EMQ.js → session-scope-KRWE54C4.js} +28 -25
  411. package/dist/{setup-wizard-YQJI3SVM.js → setup-wizard-GP3TBTPF.js} +5 -4
  412. package/dist/{shard-manager-UROHZE46.js → shard-manager-OE36A4MY.js} +3 -2
  413. package/dist/{skill-refinement-RA37U756.js → skill-refinement-C7JTMLJG.js} +6 -5
  414. package/dist/stack-generate-manifest-MFMDWRUP.js +810 -0
  415. package/dist/{stack-promote-IYBRXHTA.js → stack-promote-EKSCYY63.js} +8 -6
  416. package/dist/{stack-release-OXWLVVG6.js → stack-release-2GZAAFO4.js} +8 -6
  417. package/dist/{stack-update-2CZEROPK.js → stack-update-J6JXSTAZ.js} +51 -5
  418. package/dist/{steward-gate-LTNFB3FY.js → steward-gate-BFCCMCSW.js} +6 -5
  419. package/dist/{subagent-brief-injection-OHLWLECQ.js → subagent-brief-injection-ED36PLYY.js} +44 -36
  420. package/dist/{subagent-spawn-ledger-USYZXU3M.js → subagent-spawn-ledger-E6U3OY6Z.js} +3 -2
  421. package/dist/{supervisor-handoff-CSJQMI53.js → supervisor-handoff-SGLEPOCY.js} +12 -3
  422. package/dist/{support-inbox-4KCEPAZQ.js → support-inbox-YW47SYJF.js} +20 -5
  423. package/dist/{task-enforcement-LGXWXGVZ.js → task-enforcement-CECTQX4U.js} +29 -26
  424. package/dist/{task-request-inbox-WHCOSUCP.js → task-request-inbox-Q5T4N5K7.js} +1 -1
  425. package/dist/{task-scope-KXF7Y6KA.js → task-scope-ERVEUEYU.js} +28 -25
  426. package/dist/{tasks-crud-5EM55WRZ.js → tasks-crud-ZRQNJXQ2.js} +28 -25
  427. package/dist/{tasks-notify-VFMAURTN.js → tasks-notify-MIZH4C2O.js} +29 -26
  428. package/dist/{tasks-review-MHGMBHUZ.js → tasks-review-Z7J2P6DG.js} +28 -25
  429. package/dist/{telemetry-upload-6NRTN7QJ.js → telemetry-upload-LVQUQYFP.js} +10 -9
  430. package/dist/{token-budget-LZPOYTRP.js → token-budget-BU4NOVZF.js} +6 -5
  431. package/dist/{tool-capability-index-ED5OAPMW.js → tool-capability-index-7F42MOJT.js} +1 -1
  432. package/dist/{tool-gates-7PLIOLAL.js → tool-gates-JWVSAYTW.js} +1 -1
  433. package/dist/{tool-gates-2OZY3GZM.js → tool-gates-VXITVRFQ.js} +1 -1
  434. package/dist/{tool-telemetry-ZX7VSAXK.js → tool-telemetry-O27EVMBR.js} +1 -1
  435. package/dist/tui/App.js +43 -40
  436. package/dist/{tui-data-CC5POSUV.js → tui-data-TPWWBIUQ.js} +28 -25
  437. package/dist/{update-support-KH6NSQON.js → update-support-F2F5537B.js} +22 -20
  438. package/dist/{whatsapp-QW3X7OCN.js → whatsapp-YM4A2CSK.js} +3 -1
  439. package/dist/{work-claims-MNK7PEPW.js → work-claims-B73X5NE7.js} +6 -5
  440. package/dist/{work-state-heartbeat-YEWT5NMZ.js → work-state-heartbeat-P4YX6E2R.js} +1 -1
  441. package/dist/{worker-gate-BOQSIU2Z.js → worker-gate-BEEIIVWA.js} +3 -2
  442. package/dist/{workflow-engine-MUUD7ZEX.js → workflow-engine-5X46PFCW.js} +4 -2
  443. package/dist/{worktree-GOGT2LZP.js → worktree-W47CIMJ6.js} +9 -6
  444. package/dist/worktree-ownership-guard-OUWJROW2.js +88 -0
  445. package/dist/{worktree-sweep-46VWPVQT.js → worktree-sweep-BNBD4RFX.js} +8 -7
  446. package/package.json +14 -5
  447. package/release-notes.json +5 -5
  448. package/src/commands/exe/call.md +1 -1
  449. package/stack.release.json +6 -0
  450. package/dist/chunk-KZXMP6JG.js +0 -319
  451. package/dist/chunk-TCTED52S.js +0 -120
  452. package/dist/chunk-W2IRQJ6R.js +0 -67
  453. package/dist/doc-graph-extractor-VPTRIEKN.js +0 -149
  454. package/dist/project-name-ILJTETUE.js +0 -14
  455. /package/dist/{chunk-3Y5THOU6.js → chunk-6WIFPD2P.js} +0 -0
  456. /package/dist/{chunk-7XGXRD22.js → chunk-AISULNGL.js} +0 -0
  457. /package/dist/{chunk-3F2UB4IQ.js → chunk-DN4YVV4Z.js} +0 -0
  458. /package/dist/{chunk-WV3TOOL7.js → chunk-KQ6RJWRW.js} +0 -0
  459. /package/dist/{chunk-HR2R2QER.js → chunk-M4IRPXSZ.js} +0 -0
  460. /package/dist/{chunk-ORA5BWCV.js → chunk-NRG7KZIP.js} +0 -0
  461. /package/dist/{chunk-7UTJA6HF.js → chunk-VZAFWPAY.js} +0 -0
  462. /package/dist/{chunk-VJSDGDNS.js → chunk-WSQASFLP.js} +0 -0
  463. /package/dist/{chunk-FZQWVQJG.js → chunk-YO4BO2CL.js} +0 -0
  464. /package/dist/{core-memory-6WBNT2HL.js → core-memory-7I7RE2SJ.js} +0 -0
  465. /package/dist/{entity-boost-MT336PI3.js → entity-boost-3UWGXG5O.js} +0 -0
  466. /package/dist/{memory-isolation-EJ45IXBH.js → memory-isolation-2TUZ7Z4K.js} +0 -0
  467. /package/dist/{message-queue-client-MVBTYCSV.js → message-queue-client-XQN7QABL.js} +0 -0
  468. /package/dist/{webhook-pipe-UQSEHFPO.js → webhook-pipe-W2FVXY7M.js} +0 -0
  469. /package/dist/{wiki-acl-WXRJGZ5Q.js → wiki-acl-IBQLLBTS.js} +0 -0
  470. /package/dist/{wiki-client-AXNM5FWY.js → wiki-client-W65IOSWF.js} +0 -0
@@ -5,6 +5,9 @@ import {
5
5
  checkPermission
6
6
  } from "./chunk-2O2UKMUE.js";
7
7
 
8
+ // src/runtime/agent-loop.ts
9
+ import { basename } from "path";
10
+
8
11
  // src/runtime/stall-detection.ts
9
12
  import { createHash } from "crypto";
10
13
  var STALL_LIMITS = {
@@ -291,6 +294,8 @@ var ContextManager = class {
291
294
  */
292
295
  async postCompact(removedCount, summaryLength) {
293
296
  this.state.estimatedTokens = 0;
297
+ this.state.inputTokens = 0;
298
+ this.state.outputTokens = 0;
294
299
  const currentPercent = this.percentUsed;
295
300
  for (const threshold of PRESSURE_THRESHOLDS) {
296
301
  if (currentPercent < threshold) {
@@ -347,176 +352,393 @@ function shouldWarnDenials(state) {
347
352
  }
348
353
 
349
354
  // src/runtime/agent-loop.ts
355
+ var DeadlineExceededError = class extends Error {
356
+ constructor() {
357
+ super("agent loop deadline exceeded");
358
+ this.name = "DeadlineExceededError";
359
+ }
360
+ };
361
+ async function raceDeadline(work, remainingMs, onDeadline) {
362
+ if (remainingMs <= 0) {
363
+ onDeadline();
364
+ throw new DeadlineExceededError();
365
+ }
366
+ let timer;
367
+ const deadline = new Promise((_, reject) => {
368
+ timer = setTimeout(() => {
369
+ onDeadline();
370
+ reject(new DeadlineExceededError());
371
+ }, remainingMs);
372
+ timer.unref?.();
373
+ });
374
+ try {
375
+ return await Promise.race([work, deadline]);
376
+ } finally {
377
+ if (timer) clearTimeout(timer);
378
+ }
379
+ }
380
+ var TIMED_OUT = /* @__PURE__ */ Symbol("timed-out");
381
+ function withTimeout(p, ms) {
382
+ let timer;
383
+ const timeout = new Promise((resolve) => {
384
+ timer = setTimeout(() => resolve(TIMED_OUT), ms);
385
+ timer.unref?.();
386
+ });
387
+ return Promise.race([p, timeout]).finally(() => {
388
+ if (timer) clearTimeout(timer);
389
+ });
390
+ }
391
+ async function settleMutationAtDeadline(work, remainingMs, graceMs, onDeadline) {
392
+ const settled = work.then(
393
+ (value) => ({ status: "fulfilled", value }),
394
+ (reason) => ({ status: "rejected", reason })
395
+ );
396
+ if (remainingMs > 0) {
397
+ const first = await withTimeout(settled, remainingMs);
398
+ if (first !== TIMED_OUT) return { pastDeadline: false, settlement: first };
399
+ }
400
+ onDeadline();
401
+ if (graceMs > 0) {
402
+ const second = await withTimeout(settled, graceMs);
403
+ if (second !== TIMED_OUT) return { pastDeadline: true, settlement: second };
404
+ }
405
+ return { pastDeadline: true, settlement: { status: "indeterminate" } };
406
+ }
407
+ function createRunAbortController(parent) {
408
+ const controller = new AbortController();
409
+ if (!parent) return { controller, dispose: () => {
410
+ } };
411
+ if (parent.aborted) {
412
+ controller.abort(parent.reason);
413
+ return { controller, dispose: () => {
414
+ } };
415
+ }
416
+ const onParentAbort = () => controller.abort(parent.reason);
417
+ parent.addEventListener("abort", onParentAbort, { once: true });
418
+ return {
419
+ controller,
420
+ dispose: () => parent.removeEventListener("abort", onParentAbort)
421
+ };
422
+ }
350
423
  async function* agentLoop(userMessage, history, config) {
351
424
  const messages = [
352
425
  ...history,
353
426
  { role: "user", content: userMessage }
354
427
  ];
355
428
  const totalUsage = { inputTokens: 0, outputTokens: 0 };
356
- const abortController = config.abortController ?? new AbortController();
429
+ const userAbortSignal = config.abortController?.signal;
430
+ const { controller: abortController, dispose: disposeRunAbort } = createRunAbortController(userAbortSignal);
357
431
  const context = {
358
432
  cwd: config.cwd,
359
433
  agentId: config.agentId,
360
434
  abortSignal: abortController.signal,
361
435
  sessionState: /* @__PURE__ */ new Map()
362
436
  };
363
- const allowedTools = config.tools.toAllowedNormalizedTools(config.permissions);
364
- const contextManager = createContextManager(config.model, config.hooks);
365
- let denialState = createDenialTrackingState();
366
- let stallState = createStallState();
367
- let turns = 0;
368
- let activeModel = config.model;
369
- let routedToFallback = false;
370
- while (turns < config.maxTurns) {
371
- turns++;
372
- if (abortController.signal.aborted) {
373
- yield { type: "aborted", reason: "Agent stopped by user" };
374
- break;
375
- }
376
- if (config.maxTokenBudget && totalUsage.inputTokens + totalUsage.outputTokens >= config.maxTokenBudget) {
377
- yield { type: "error", error: new Error("Token budget exceeded") };
378
- break;
379
- }
380
- let response;
381
- try {
382
- response = await config.provider.createMessage({
383
- model: activeModel,
384
- system: config.systemPrompt,
385
- messages,
386
- tools: allowedTools.length > 0 ? allowedTools : void 0,
387
- maxTokens: 4096
388
- });
389
- } catch (err) {
390
- const error = err instanceof Error ? err : new Error(String(err));
391
- yield { type: "error", error };
392
- if (config.hooks.onError) await config.hooks.onError(error, context);
393
- break;
394
- }
395
- totalUsage.inputTokens += response.usage.inputTokens;
396
- totalUsage.outputTokens += response.usage.outputTokens;
397
- if (config.tokenBudgetMiddleware) {
398
- const result = await config.tokenBudgetMiddleware.onTokenUsed(
399
- response.usage.inputTokens,
400
- response.usage.outputTokens
401
- );
402
- if (result.warned && config.hooks.onNotification) {
403
- await config.hooks.onNotification(
404
- `\u26A0\uFE0F Token budget at ${result.percentUsed}%. Fallback model: ${result.fallback ?? "none (task will terminate at 100%)"}.`
437
+ try {
438
+ const allowedTools = config.tools.toAllowedNormalizedTools(config.permissions);
439
+ const contextManager = createContextManager(config.model, config.hooks);
440
+ let denialState = createDenialTrackingState();
441
+ let stallState = createStallState();
442
+ let turns = 0;
443
+ let activeModel = config.model;
444
+ let routedToFallback = false;
445
+ const loopStartedAt = Date.now();
446
+ const maxDurationMs = config.maxDurationMs ?? 30 * 6e4;
447
+ const maxConsecutiveFailures = config.maxConsecutiveFailures ?? 6;
448
+ const mutationGraceMs = config.mutationGraceMs ?? 3e4;
449
+ let consecutiveFailedTurns = 0;
450
+ while (turns < config.maxTurns) {
451
+ turns++;
452
+ if (Date.now() - loopStartedAt >= maxDurationMs) {
453
+ yield {
454
+ type: "error",
455
+ error: new Error(
456
+ `Agent loop exceeded max duration (${maxDurationMs}ms) after ${turns - 1} turns \u2014 terminating to avoid an unbounded fetch loop.`
457
+ )
458
+ };
459
+ break;
460
+ }
461
+ if (abortController.signal.aborted) {
462
+ yield {
463
+ type: "aborted",
464
+ reason: userAbortSignal?.aborted ? "Agent stopped by user" : "Agent run aborted (internal wall-clock deadline or token cap)"
465
+ };
466
+ break;
467
+ }
468
+ if (config.maxTokenBudget && totalUsage.inputTokens + totalUsage.outputTokens >= config.maxTokenBudget) {
469
+ yield { type: "error", error: new Error("Token budget exceeded") };
470
+ break;
471
+ }
472
+ let response;
473
+ try {
474
+ response = await raceDeadline(
475
+ config.provider.createMessage({
476
+ model: activeModel,
477
+ system: config.systemPrompt,
478
+ messages,
479
+ tools: allowedTools.length > 0 ? allowedTools : void 0,
480
+ maxTokens: 4096,
481
+ abortSignal: abortController.signal
482
+ }),
483
+ maxDurationMs - (Date.now() - loopStartedAt),
484
+ () => abortController.abort()
405
485
  );
486
+ } catch (err) {
487
+ if (err instanceof DeadlineExceededError) {
488
+ yield {
489
+ type: "error",
490
+ error: new Error(
491
+ `Agent loop exceeded max duration (${maxDurationMs}ms) during a provider call after ${turns - 1} completed turns \u2014 aborted the in-flight request to enforce the wall-clock ceiling.`
492
+ )
493
+ };
494
+ break;
495
+ }
496
+ const error = err instanceof Error ? err : new Error(String(err));
497
+ yield { type: "error", error };
498
+ if (config.hooks.onError) await config.hooks.onError(error, context);
499
+ break;
406
500
  }
407
- if (result.exceeded && !routedToFallback) {
408
- if (config.hooks.onTokenBudgetExceeded) {
409
- await config.hooks.onTokenBudgetExceeded(context, result.fallback);
501
+ totalUsage.inputTokens += response.usage.inputTokens;
502
+ totalUsage.outputTokens += response.usage.outputTokens;
503
+ if (config.tokenBudgetMiddleware) {
504
+ const result = await config.tokenBudgetMiddleware.onTokenUsed(
505
+ response.usage.inputTokens,
506
+ response.usage.outputTokens
507
+ );
508
+ if (result.warned && config.hooks.onNotification) {
509
+ await config.hooks.onNotification(
510
+ `\u26A0\uFE0F Token budget at ${result.percentUsed}%. Fallback model: ${result.fallback ?? "none (task will terminate at 100%)"}.`
511
+ );
410
512
  }
411
- if (result.fallback && result.fallback !== activeModel) {
412
- routedToFallback = true;
413
- activeModel = result.fallback;
414
- if (config.hooks.onNotification) {
415
- await config.hooks.onNotification(
416
- `\u{1F53B} Token budget exceeded \u2014 routing to fallback model ${result.fallback} to finish the task.`
417
- );
513
+ if (result.exceeded && !routedToFallback) {
514
+ if (config.hooks.onTokenBudgetExceeded) {
515
+ await config.hooks.onTokenBudgetExceeded(context, result.fallback);
516
+ }
517
+ if (result.fallback && result.fallback !== activeModel) {
518
+ routedToFallback = true;
519
+ activeModel = result.fallback;
520
+ if (config.hooks.onNotification) {
521
+ await config.hooks.onNotification(
522
+ `\u{1F53B} Token budget exceeded \u2014 routing to fallback model ${result.fallback} to finish the task.`
523
+ );
524
+ }
525
+ } else {
526
+ abortController.abort();
527
+ yield { type: "error", error: new Error("Token budget exceeded. Task requires manual continuation.") };
528
+ break;
418
529
  }
419
- } else {
420
- abortController.abort();
421
- yield { type: "error", error: new Error("Token budget exceeded. Task requires manual continuation.") };
422
- break;
423
530
  }
424
531
  }
425
- }
426
- contextManager.updateFromApiUsage(response.usage.inputTokens, response.usage.outputTokens);
427
- contextManager.updateFromMessages(messages);
428
- await contextManager.checkPressure();
429
- if (contextManager.shouldCompact() && messages.length > 12) {
430
- const { memoriesToExtract } = await contextManager.preCompact(
431
- messages.slice(0, -10)
432
- );
433
- if (memoriesToExtract.length > 0 && config.hooks.onNotification) {
434
- await config.hooks.onNotification(
435
- `Pre-compaction: extracted ${memoriesToExtract.length} key decisions to memory`
532
+ contextManager.updateFromApiUsage(response.usage.inputTokens, response.usage.outputTokens);
533
+ contextManager.updateFromMessages(messages);
534
+ await contextManager.checkPressure();
535
+ if (contextManager.shouldCompact() && messages.length > 12) {
536
+ const { memoriesToExtract } = await contextManager.preCompact(
537
+ messages.slice(0, -10)
436
538
  );
539
+ if (memoriesToExtract.length > 0) {
540
+ const persist = config.persistMemory ?? (await import("./memory-queue-client-ADSDP6OX.js")).writeMemoryViaDaemon;
541
+ const projectName = basename(config.cwd) || "unknown";
542
+ const sessionId = `exe-agent-${loopStartedAt}`;
543
+ let persistedCount = 0;
544
+ for (const decision of memoriesToExtract) {
545
+ try {
546
+ await persist({
547
+ raw_text: decision,
548
+ agent_id: config.agentId,
549
+ tool_name: "pre-compaction",
550
+ project_name: projectName,
551
+ session_id: sessionId,
552
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
553
+ importance: 7,
554
+ memory_type: "decision"
555
+ });
556
+ persistedCount++;
557
+ } catch {
558
+ }
559
+ }
560
+ if (persistedCount > 0 && config.hooks.onNotification) {
561
+ await config.hooks.onNotification(
562
+ `Pre-compaction: extracted ${persistedCount} key decisions to memory`
563
+ );
564
+ }
565
+ }
566
+ const compacted = await compactMessages(messages, config.provider, config.model);
567
+ const removedCount = compacted.removedCount;
568
+ if (removedCount > 0) {
569
+ messages.length = 0;
570
+ messages.push(...compacted.messages);
571
+ await contextManager.postCompact(removedCount, messages[0]?.content?.toString().length ?? 0);
572
+ }
437
573
  }
438
- const compacted = await compactMessages(messages, config.provider, config.model);
439
- const removedCount = compacted.removedCount;
440
- if (removedCount > 0) {
441
- messages.length = 0;
442
- messages.push(...compacted.messages);
443
- await contextManager.postCompact(removedCount, messages[0]?.content?.toString().length ?? 0);
574
+ for (const block of response.content) {
575
+ if (block.type === "text" && block.text) {
576
+ yield { type: "text", text: block.text };
577
+ }
444
578
  }
445
- }
446
- for (const block of response.content) {
447
- if (block.type === "text" && block.text) {
448
- yield { type: "text", text: block.text };
579
+ messages.push({ role: "assistant", content: response.content });
580
+ if (response.stopReason === "end_turn" || response.stopReason === "max_tokens") {
581
+ yield { type: "turn_complete", turn: turns, usage: response.usage };
582
+ break;
449
583
  }
450
- }
451
- messages.push({ role: "assistant", content: response.content });
452
- if (response.stopReason === "end_turn" || response.stopReason === "max_tokens") {
453
- yield { type: "turn_complete", turn: turns, usage: response.usage };
454
- break;
455
- }
456
- const toolUseBlocks = response.content.filter(
457
- (b) => b.type === "tool_use"
458
- );
459
- if (toolUseBlocks.length === 0) {
460
- yield { type: "turn_complete", turn: turns, usage: response.usage };
461
- break;
462
- }
463
- const { concurrent, sequential } = partitionTools(toolUseBlocks, config.tools);
464
- const toolResults = [];
465
- if (concurrent.length > 0) {
466
- const concurrentResults = await Promise.all(
467
- concurrent.map(
468
- (block) => executeToolBlock(
469
- block,
470
- config,
471
- context,
472
- denialState
473
- )
474
- )
584
+ const toolUseBlocks = response.content.filter(
585
+ (b) => b.type === "tool_use"
475
586
  );
476
- for (let i = 0; i < concurrent.length; i++) {
477
- const block = concurrent[i];
478
- const execResult = concurrentResults[i];
587
+ if (toolUseBlocks.length === 0) {
588
+ yield { type: "turn_complete", turn: turns, usage: response.usage };
589
+ break;
590
+ }
591
+ const { concurrent, sequential } = partitionTools(toolUseBlocks, config.tools);
592
+ const toolResults = [];
593
+ if (concurrent.length > 0) {
594
+ let concurrentResults;
595
+ try {
596
+ concurrentResults = await raceDeadline(
597
+ Promise.all(
598
+ concurrent.map(
599
+ (block) => executeToolBlock(
600
+ block,
601
+ config,
602
+ context,
603
+ denialState
604
+ )
605
+ )
606
+ ),
607
+ maxDurationMs - (Date.now() - loopStartedAt),
608
+ () => abortController.abort()
609
+ );
610
+ } catch (err) {
611
+ if (err instanceof DeadlineExceededError) {
612
+ yield {
613
+ type: "error",
614
+ error: new Error(
615
+ `Agent loop exceeded max duration (${maxDurationMs}ms) during read-only tool execution after ${turns - 1} completed turns \u2014 abandoned the in-flight read-only calls to enforce the wall-clock ceiling.`
616
+ )
617
+ };
618
+ break;
619
+ }
620
+ throw err;
621
+ }
622
+ for (let i = 0; i < concurrent.length; i++) {
623
+ const block = concurrent[i];
624
+ const execResult = concurrentResults[i];
625
+ denialState = execResult.denialState;
626
+ yield execResult.event;
627
+ if (execResult.permissionEvent) yield execResult.permissionEvent;
628
+ yield { type: "tool_result", name: block.name, id: block.id, result: execResult.result };
629
+ toolResults.push({
630
+ type: "tool_result",
631
+ tool_use_id: block.id,
632
+ content: execResult.result.content,
633
+ is_error: execResult.result.isError
634
+ });
635
+ }
636
+ }
637
+ let sequentialTimedOut = false;
638
+ let indeterminateTool = null;
639
+ for (const block of sequential) {
640
+ const typedBlock = block;
641
+ const isMutating = !(config.tools.get(typedBlock.name)?.isReadOnly === true);
642
+ const remainingMs = maxDurationMs - (Date.now() - loopStartedAt);
643
+ let execResult;
644
+ if (!isMutating) {
645
+ try {
646
+ execResult = await raceDeadline(
647
+ executeToolBlock(typedBlock, config, context, denialState),
648
+ remainingMs,
649
+ () => abortController.abort()
650
+ );
651
+ } catch (err) {
652
+ if (err instanceof DeadlineExceededError) {
653
+ sequentialTimedOut = true;
654
+ break;
655
+ }
656
+ throw err;
657
+ }
658
+ } else {
659
+ const { pastDeadline, settlement } = await settleMutationAtDeadline(
660
+ executeToolBlock(typedBlock, config, context, denialState),
661
+ remainingMs,
662
+ mutationGraceMs,
663
+ () => abortController.abort()
664
+ );
665
+ if (settlement.status === "indeterminate") {
666
+ indeterminateTool = typedBlock.name;
667
+ const result = {
668
+ content: `INDETERMINATE: "${typedBlock.name}" was still running when the agent loop's wall-clock deadline (${maxDurationMs}ms) and the ${mutationGraceMs}ms mutation grace window both elapsed. It is a mutating tool, so it may or may not have applied its changes. Do NOT assume it did not happen \u2014 verify the target state before retrying.`,
669
+ isError: true
670
+ };
671
+ yield { type: "tool_result", name: typedBlock.name, id: typedBlock.id, result };
672
+ toolResults.push({
673
+ type: "tool_result",
674
+ tool_use_id: typedBlock.id,
675
+ content: result.content,
676
+ is_error: true
677
+ });
678
+ sequentialTimedOut = true;
679
+ break;
680
+ }
681
+ if (settlement.status === "rejected") {
682
+ const reason = settlement.reason;
683
+ throw reason instanceof Error ? reason : new Error(String(reason));
684
+ }
685
+ execResult = settlement.value;
686
+ if (pastDeadline) sequentialTimedOut = true;
687
+ }
479
688
  denialState = execResult.denialState;
480
689
  yield execResult.event;
481
690
  if (execResult.permissionEvent) yield execResult.permissionEvent;
482
- yield { type: "tool_result", name: block.name, id: block.id, result: execResult.result };
691
+ yield { type: "tool_result", name: typedBlock.name, id: typedBlock.id, result: execResult.result };
483
692
  toolResults.push({
484
693
  type: "tool_result",
485
- tool_use_id: block.id,
694
+ tool_use_id: typedBlock.id,
486
695
  content: execResult.result.content,
487
696
  is_error: execResult.result.isError
488
697
  });
698
+ if (sequentialTimedOut) break;
699
+ }
700
+ if (sequentialTimedOut) {
701
+ yield {
702
+ type: "error",
703
+ error: new Error(
704
+ indeterminateTool ? `Agent loop exceeded max duration (${maxDurationMs}ms) during tool execution after ${turns - 1} completed turns. The mutating tool "${indeterminateTool}" did not finish within the ${mutationGraceMs}ms grace window, so its outcome is INDETERMINATE \u2014 it may still apply changes.` : `Agent loop exceeded max duration (${maxDurationMs}ms) during tool execution after ${turns - 1} completed turns \u2014 in-flight read-only calls were abandoned; any in-flight mutation was awaited to completion and its result recorded.`
705
+ )
706
+ };
707
+ break;
708
+ }
709
+ messages.push({ role: "user", content: toolResults });
710
+ yield { type: "turn_complete", turn: turns, usage: response.usage };
711
+ stallState = recordTurn(stallState, turnSignature(
712
+ toolUseBlocks.map((b) => ({ name: b.name, input: b.input })),
713
+ toolResults.map((r) => ({
714
+ content: typeof r.content === "string" ? r.content : "",
715
+ isError: Boolean(r.is_error)
716
+ }))
717
+ ));
718
+ if (isStalled(stallState)) {
719
+ yield { type: "error", error: new Error(stallReason(stallState, toolUseBlocks.map((b) => b.name))) };
720
+ break;
721
+ }
722
+ const allToolsFailed = toolUseBlocks.length > 0 && toolResults.length > 0 && toolResults.every((r) => Boolean(r.is_error));
723
+ if (allToolsFailed) {
724
+ consecutiveFailedTurns++;
725
+ } else {
726
+ consecutiveFailedTurns = 0;
727
+ }
728
+ if (consecutiveFailedTurns >= maxConsecutiveFailures) {
729
+ yield {
730
+ type: "error",
731
+ error: new Error(
732
+ `Agent loop circuit breaker tripped: ${consecutiveFailedTurns} consecutive turns with only failing tool calls \u2014 terminating to avoid an unbounded fetch loop.`
733
+ )
734
+ };
735
+ break;
489
736
  }
490
737
  }
491
- for (const block of sequential) {
492
- const typedBlock = block;
493
- const execResult = await executeToolBlock(typedBlock, config, context, denialState);
494
- denialState = execResult.denialState;
495
- yield execResult.event;
496
- if (execResult.permissionEvent) yield execResult.permissionEvent;
497
- yield { type: "tool_result", name: typedBlock.name, id: typedBlock.id, result: execResult.result };
498
- toolResults.push({
499
- type: "tool_result",
500
- tool_use_id: typedBlock.id,
501
- content: execResult.result.content,
502
- is_error: execResult.result.isError
503
- });
504
- }
505
- messages.push({ role: "user", content: toolResults });
506
- yield { type: "turn_complete", turn: turns, usage: response.usage };
507
- stallState = recordTurn(stallState, turnSignature(
508
- toolUseBlocks.map((b) => ({ name: b.name, input: b.input })),
509
- toolResults.map((r) => ({
510
- content: typeof r.content === "string" ? r.content : "",
511
- isError: Boolean(r.is_error)
512
- }))
513
- ));
514
- if (isStalled(stallState)) {
515
- yield { type: "error", error: new Error(stallReason(stallState, toolUseBlocks.map((b) => b.name))) };
516
- break;
517
- }
738
+ yield { type: "done", totalUsage, turns };
739
+ } finally {
740
+ disposeRunAbort();
518
741
  }
519
- yield { type: "done", totalUsage, turns };
520
742
  }
521
743
  async function executeToolBlock(block, config, context, denialState) {
522
744
  const startEvent = { type: "tool_use_start", name: block.name, id: block.id };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveExeDataDir
3
- } from "./chunk-JTB5V6BV.js";
3
+ } from "./chunk-3SXHEQ7X.js";
4
4
  import {
5
5
  isValidX25519Recipient,
6
6
  pubKeyHash
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  deactivateBehavior
3
- } from "./chunk-MBNIJXKI.js";
3
+ } from "./chunk-WMEYJT4R.js";
4
4
  import {
5
5
  getActiveAgent
6
- } from "./chunk-KYFFVTGO.js";
6
+ } from "./chunk-55BEFF4V.js";
7
7
  import {
8
8
  canCoordinate,
9
9
  getClient
10
- } from "./chunk-5DCCKHDY.js";
10
+ } from "./chunk-TAMDAOCU.js";
11
11
 
12
12
  // src/mcp/tools/deactivate-behavior.ts
13
13
  import { z } from "zod";
@@ -24,7 +24,7 @@ function registerDeactivateBehavior(server) {
24
24
  async ({ behavior_id }) => {
25
25
  const caller = getActiveAgent();
26
26
  try {
27
- const { StewardGate } = await import("./steward-gate-LTNFB3FY.js");
27
+ const { StewardGate } = await import("./steward-gate-BFCCMCSW.js");
28
28
  const steward = new StewardGate();
29
29
  const gateDecision = await steward.checkAuthority(caller.agentId || "unknown", "deactivate_behavior", behavior_id);
30
30
  if (!gateDecision.allowed) {
@@ -95,6 +95,11 @@ function parsePrJson(raw) {
95
95
  return [];
96
96
  }
97
97
  }
98
+ function parseSupersededByTrailer(body) {
99
+ if (!body) return null;
100
+ const m = /^\s*(?:superseded-by|closed-in-favor-of|replaced-by)\s*:\s*#(\d+)\s*$/im.exec(body);
101
+ return m ? parseInt(m[1], 10) : null;
102
+ }
98
103
  async function mapPool(items, concurrency, fn) {
99
104
  const results = new Array(items.length);
100
105
  let next = 0;
@@ -123,15 +128,20 @@ var ghPrStateLookup = async (repoRoot, branchNames) => {
123
128
  "--limit",
124
129
  String(BULK_PR_LIMIT),
125
130
  "--json",
126
- "number,state,mergedAt,headRefName"
131
+ "number,state,mergedAt,headRefName,body"
127
132
  ],
128
133
  repoRoot
129
134
  );
130
135
  } catch {
131
136
  return null;
132
137
  }
138
+ const allPrs = parsePrJson(bulkRaw);
139
+ const mergedByNumber = /* @__PURE__ */ new Map();
140
+ for (const pr of allPrs) {
141
+ if (typeof pr.number === "number") mergedByNumber.set(pr.number, !!pr.mergedAt);
142
+ }
133
143
  const best = /* @__PURE__ */ new Map();
134
- for (const pr of parsePrJson(bulkRaw)) {
144
+ for (const pr of allPrs) {
135
145
  const head = pr.headRefName;
136
146
  if (!head) continue;
137
147
  const cur = best.get(head);
@@ -141,8 +151,15 @@ var ghPrStateLookup = async (repoRoot, branchNames) => {
141
151
  const missing = [];
142
152
  for (const name of branchNames) {
143
153
  const pr = best.get(name);
144
- if (pr) result.set(name, { state: toState(pr), number: pr.number ?? null });
145
- else missing.push(name);
154
+ if (pr) {
155
+ const state = toState(pr);
156
+ let supersededByMerged = false;
157
+ if (state === "closed_unmerged") {
158
+ const target = parseSupersededByTrailer(pr.body);
159
+ if (target !== null && mergedByNumber.get(target) === true) supersededByMerged = true;
160
+ }
161
+ result.set(name, { state, number: pr.number ?? null, supersededByMerged });
162
+ } else missing.push(name);
146
163
  }
147
164
  const targeted = missing.slice(0, MAX_TARGETED_PR_LOOKUPS);
148
165
  const overflow = missing.slice(MAX_TARGETED_PR_LOOKUPS);
@@ -2,7 +2,7 @@ import {
2
2
  MODELS_DIR,
3
3
  loadConfigSync,
4
4
  resolveEmbedModelFile
5
- } from "./chunk-QMSEL5YS.js";
5
+ } from "./chunk-ZIG7VPJV.js";
6
6
 
7
7
  // src/lib/backfill-gate.ts
8
8
  import { existsSync } from "fs";