@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
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  listReminders
3
- } from "./chunk-SEP5ITFQ.js";
3
+ } from "./chunk-636LKCKE.js";
4
4
 
5
5
  // src/mcp/tools/list-reminders.ts
6
6
  import { z } from "zod";
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-B6TI3TZT.js";
4
4
  import {
5
5
  loadEmployeesSync
6
- } from "./chunk-5DCCKHDY.js";
6
+ } from "./chunk-TAMDAOCU.js";
7
7
 
8
8
  // src/adapters/mcp-http-config.ts
9
9
  import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
@@ -39,9 +39,13 @@ function readOrCreateDaemonToken(homeDir = os.homedir()) {
39
39
  }
40
40
  }
41
41
  const token = randomBytes(32).toString("hex");
42
- mkdirSync(exeDir, { recursive: true });
42
+ mkdirSync(exeDir, { recursive: true, mode: 448 });
43
+ try {
44
+ chmodSync(exeDir, 448);
45
+ } catch {
46
+ }
43
47
  writeFileSync(tokenPath, `${token}
44
- `, "utf-8");
48
+ `, { encoding: "utf-8", mode: 384 });
45
49
  try {
46
50
  chmodSync(tokenPath, 384);
47
51
  } catch {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  processCRMEvent
3
- } from "./chunk-ADNBOKYZ.js";
3
+ } from "./chunk-GM7TLYOK.js";
4
4
 
5
5
  // src/gateway/adapters/crm-webhook.ts
6
6
  function parseTwentyWebhook(payload) {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  writeMemoryViaDaemon
3
- } from "./chunk-QZL6E4UB.js";
3
+ } from "./chunk-GOMQ7PVQ.js";
4
4
 
5
5
  // src/lib/auto-checkpoint.ts
6
6
  var FILE_RE = /(?:^|\s)([\w./-]+\.(?:ts|tsx|js|jsx|json|md|yml|yaml|sql|go|py|css|scss|html|sh))(?:\b|$)/g;
@@ -1,20 +1,22 @@
1
1
  import {
2
2
  SUPERVISED_ENV
3
- } from "./chunk-IVU3WN7S.js";
3
+ } from "./chunk-ZG62LIK3.js";
4
4
  import {
5
5
  ensureDaemonToken,
6
6
  readDaemonToken
7
- } from "./chunk-RIECV7SR.js";
7
+ } from "./chunk-EKYYMIVT.js";
8
+ import {
9
+ computeDaemonHeapCapMb
10
+ } from "./chunk-NLEW62VC.js";
11
+ import {
12
+ killIfSameProcess,
13
+ processStartedAt
14
+ } from "./chunk-SLLLOOEI.js";
8
15
  import {
9
16
  KILL_INTENT_LOOKBACK_MS,
10
17
  findRecentKillIntent,
11
- killIfSameProcess,
12
- processStartedAt,
13
18
  recordKillIntent
14
- } from "./chunk-LNOS24GV.js";
15
- import {
16
- computeDaemonHeapCapMb
17
- } from "./chunk-NLEW62VC.js";
19
+ } from "./chunk-V3WLC5TJ.js";
18
20
  import {
19
21
  SYSTEMD_DAEMON_UNIT,
20
22
  SYSTEMD_WATCHDOG_UNIT,
@@ -26,7 +28,7 @@ import {
26
28
  import {
27
29
  EXE_AI_DIR,
28
30
  resolveDataDir
29
- } from "./chunk-QMSEL5YS.js";
31
+ } from "./chunk-ZIG7VPJV.js";
30
32
 
31
33
  // src/lib/exe-daemon-client.ts
32
34
  import net from "net";
@@ -66,6 +66,21 @@ function listTmuxSessions() {
66
66
  }
67
67
  }
68
68
  var listTmuxWindows = listTmuxSessions;
69
+ async function listTmuxSessionsAsync() {
70
+ try {
71
+ const { promisify } = await import("util");
72
+ const { execFile } = await import("child_process");
73
+ const exec = promisify(execFile);
74
+ const { stdout } = await exec("tmux", ["list-sessions", "-F", "#{session_name}"], {
75
+ encoding: "utf8",
76
+ timeout: 3e3
77
+ });
78
+ return String(stdout ?? "").trim().split("\n").filter(Boolean);
79
+ } catch (err) {
80
+ warnTmuxAbsenceOnce(err);
81
+ return [];
82
+ }
83
+ }
69
84
  function capturePaneLines(windowName, lines = 10) {
70
85
  try {
71
86
  const out = execFileSync(
@@ -311,6 +326,7 @@ export {
311
326
  resetTmuxAbsenceWarning,
312
327
  listTmuxSessions,
313
328
  listTmuxWindows,
329
+ listTmuxSessionsAsync,
314
330
  capturePaneLines,
315
331
  capturePaneLinesAsync,
316
332
  getPaneCwd,
@@ -7,22 +7,23 @@ import {
7
7
  } from "./chunk-S2YTU74T.js";
8
8
  import {
9
9
  createTask
10
- } from "./chunk-HECXZGGZ.js";
10
+ } from "./chunk-ZCERWHY2.js";
11
11
  import {
12
12
  getActiveAgent
13
- } from "./chunk-KYFFVTGO.js";
13
+ } from "./chunk-55BEFF4V.js";
14
14
  import {
15
15
  ensureEmployeeAsync,
16
+ isEmployeeAlive,
16
17
  isExeSession,
17
18
  logTaskDispatch,
18
19
  resolveExeSession
19
- } from "./chunk-XHYHX6F7.js";
20
+ } from "./chunk-AKLQSC6W.js";
20
21
  import {
21
22
  isValidSessionScope
22
23
  } from "./chunk-BTSWFMEH.js";
23
24
  import {
24
25
  recordOrchestrationEventBestEffort
25
- } from "./chunk-E2WEFZOR.js";
26
+ } from "./chunk-W75GTHR3.js";
26
27
  import {
27
28
  releaseDispatchClaim,
28
29
  tryAcquireDispatchClaim,
@@ -32,21 +33,142 @@ import {
32
33
  import {
33
34
  getAgentRuntime,
34
35
  validateRuntimeModel
35
- } from "./chunk-XTWHNLGD.js";
36
+ } from "./chunk-GZOG2MAX.js";
36
37
  import {
37
38
  getLicenseSync
38
- } from "./chunk-HIIXCAEE.js";
39
+ } from "./chunk-6YVUR3OU.js";
39
40
  import {
40
41
  getAgentContext
41
42
  } from "./chunk-GJV3WDWM.js";
42
43
  import {
43
44
  isCoordinatorName
44
- } from "./chunk-5DCCKHDY.js";
45
+ } from "./chunk-TAMDAOCU.js";
46
+ import {
47
+ EXE_AI_DIR
48
+ } from "./chunk-ZIG7VPJV.js";
49
+ import {
50
+ atomicWriteJsonSync
51
+ } from "./chunk-HSGBZSCA.js";
45
52
 
46
53
  // src/mcp/tools/create-task.ts
47
54
  import { z } from "zod";
48
- import { existsSync, readdirSync, realpathSync, statSync, writeFileSync, mkdirSync } from "fs";
55
+ import { existsSync as existsSync2, readdirSync, realpathSync, statSync, writeFileSync, mkdirSync as mkdirSync2 } from "fs";
49
56
  import { basename, dirname, isAbsolute, join, sep } from "path";
57
+
58
+ // src/lib/project-dir-cache.ts
59
+ import path from "path";
60
+ import { existsSync, mkdirSync, readFileSync } from "fs";
61
+ var MAX_PROJECTS_PER_SCOPE = 64;
62
+ var MAX_SCOPES = 128;
63
+ function cacheDir() {
64
+ return process.env.EXE_OS_DIR || process.env.EXE_MEM_DIR || EXE_AI_DIR;
65
+ }
66
+ function cachePath() {
67
+ return path.join(cacheDir(), "project-dir-cache.json");
68
+ }
69
+ function keyFor(projectName) {
70
+ return projectName.trim().toLowerCase();
71
+ }
72
+ function readCache() {
73
+ try {
74
+ const raw = readFileSync(cachePath(), "utf8");
75
+ const parsed = JSON.parse(raw);
76
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
77
+ return parsed;
78
+ }
79
+ } catch {
80
+ }
81
+ return {};
82
+ }
83
+ function pruneScope(bucket) {
84
+ const entries = Object.entries(bucket);
85
+ if (entries.length <= MAX_PROJECTS_PER_SCOPE) return bucket;
86
+ entries.sort((a, b) => Date.parse(b[1].at) - Date.parse(a[1].at));
87
+ return Object.fromEntries(entries.slice(0, MAX_PROJECTS_PER_SCOPE));
88
+ }
89
+ function pruneScopes(cache) {
90
+ const scopes = Object.keys(cache);
91
+ if (scopes.length <= MAX_SCOPES) return cache;
92
+ const newest = (bucket) => Math.max(0, ...Object.values(bucket).map((e) => Date.parse(e.at) || 0));
93
+ scopes.sort((a, b) => newest(cache[b]) - newest(cache[a]));
94
+ const kept = {};
95
+ for (const s of scopes.slice(0, MAX_SCOPES)) kept[s] = cache[s];
96
+ return kept;
97
+ }
98
+ function rememberProjectDir(scope, projectName, dir, anchor) {
99
+ const s = scope.trim();
100
+ const p = keyFor(projectName);
101
+ const incarnation = anchor?.incarnation?.trim() ?? "";
102
+ const coordDir = anchor?.coordDir ?? "";
103
+ if (!s || !p || !dir || !incarnation || !coordDir) return;
104
+ try {
105
+ const cache = readCache();
106
+ const bucket = { ...cache[s] ?? {} };
107
+ bucket[p] = { dir, at: (/* @__PURE__ */ new Date()).toISOString(), incarnation, coordDir };
108
+ cache[s] = pruneScope(bucket);
109
+ const dirPath = cacheDir();
110
+ if (!existsSync(dirPath)) mkdirSync(dirPath, { recursive: true });
111
+ atomicWriteJsonSync(cachePath(), pruneScopes(cache));
112
+ } catch {
113
+ }
114
+ }
115
+ function recallProjectDir(scope, projectName, incarnation) {
116
+ const s = scope.trim();
117
+ const p = keyFor(projectName);
118
+ const inc = String(incarnation ?? "").trim();
119
+ if (!s || !p || !inc) return null;
120
+ const cache = readCache();
121
+ const entry = cache[s]?.[p];
122
+ if (!entry?.dir || !entry.coordDir) return null;
123
+ if (entry.incarnation !== inc) {
124
+ forgetProjectDir(s, p);
125
+ return null;
126
+ }
127
+ return { dir: entry.dir, coordDir: entry.coordDir };
128
+ }
129
+ function forgetProjectDir(scope, projectKey) {
130
+ try {
131
+ const cache = readCache();
132
+ const bucket = cache[scope];
133
+ if (!bucket || !(projectKey in bucket)) return;
134
+ delete bucket[projectKey];
135
+ if (Object.keys(bucket).length === 0) delete cache[scope];
136
+ else cache[scope] = bucket;
137
+ atomicWriteJsonSync(cachePath(), cache);
138
+ } catch {
139
+ }
140
+ }
141
+
142
+ // src/lib/session-incarnation.ts
143
+ import { execFile } from "child_process";
144
+ import { promisify } from "util";
145
+ var execFileAsync = promisify(execFile);
146
+ var SAFE_SESSION_NAME = /^[A-Za-z0-9._-]{1,64}$/;
147
+ var INCARNATION_FORMAT = "#{session_name} #{pid} #{session_id} #{session_created}";
148
+ function parseIncarnationLine(expectedName, stdout) {
149
+ const [echoedName, serverPid, sessionId, createdRaw] = String(stdout ?? "").trim().split(" ");
150
+ const created = Number.parseInt(String(createdRaw ?? "").trim(), 10);
151
+ if (echoedName !== expectedName) return null;
152
+ if (!serverPid || !sessionId) return null;
153
+ if (!Number.isFinite(created) || created <= 0) return null;
154
+ return `tmux:${serverPid}:${sessionId}:${created}`;
155
+ }
156
+ async function sessionIncarnationId(sessionName) {
157
+ const name = String(sessionName ?? "").trim();
158
+ if (!SAFE_SESSION_NAME.test(name)) return null;
159
+ try {
160
+ const { stdout } = await execFileAsync(
161
+ "tmux",
162
+ ["display-message", "-t", name, "-p", INCARNATION_FORMAT],
163
+ { encoding: "utf8", timeout: 2e3 }
164
+ );
165
+ return parseIncarnationLine(name, String(stdout));
166
+ } catch {
167
+ }
168
+ return null;
169
+ }
170
+
171
+ // src/mcp/tools/create-task.ts
50
172
  function rootFromSessionName(sessionName) {
51
173
  const raw = (sessionName ?? "").trim();
52
174
  if (!raw) return "";
@@ -58,13 +180,13 @@ function isRootSessionName(sessionName) {
58
180
  }
59
181
  function isDirectory(pathname) {
60
182
  try {
61
- return existsSync(pathname) && statSync(pathname).isDirectory();
183
+ return existsSync2(pathname) && statSync(pathname).isDirectory();
62
184
  } catch {
63
185
  return false;
64
186
  }
65
187
  }
66
188
  function isGitRepoDir(pathname) {
67
- return isDirectory(pathname) && existsSync(join(pathname, ".git"));
189
+ return isDirectory(pathname) && existsSync2(join(pathname, ".git"));
68
190
  }
69
191
  function realpathSafe(pathname) {
70
192
  try {
@@ -80,6 +202,16 @@ function isRealpathInside(candidate, scopedRoot) {
80
202
  const prefix = rr.endsWith(sep) ? rr : rr + sep;
81
203
  return rc.startsWith(prefix);
82
204
  }
205
+ function rememberedDirStillInScope(dir, coordDir, projectName) {
206
+ if (!dir || !coordDir) return false;
207
+ if (!existsSync2(dir) || !existsSync2(coordDir)) return false;
208
+ if (!projectDirMatches(dir, projectName)) return false;
209
+ if (isRealpathInside(coordDir, dir)) return true;
210
+ if (isRealpathInside(dir, coordDir)) return true;
211
+ const workspaceRoot = dirname(coordDir);
212
+ if (workspaceRoot !== coordDir && isRealpathInside(dir, workspaceRoot)) return true;
213
+ return false;
214
+ }
83
215
  function findNestedGitRepo(parentDir) {
84
216
  const preferred = ["website", "app", "repo", "src"];
85
217
  for (const child of preferred) {
@@ -141,7 +273,7 @@ function isSafeProjectName(projectName) {
141
273
  }
142
274
  function findProjectChildDir(parentDir, projectName) {
143
275
  if (!isSafeProjectName(projectName)) return null;
144
- if (!existsSync(parentDir)) return null;
276
+ if (!existsSync2(parentDir)) return null;
145
277
  const normalizedProject = projectName.toLowerCase();
146
278
  const aliases = /* @__PURE__ */ new Set([
147
279
  normalizedProject,
@@ -240,7 +372,7 @@ async function inferCoordinatorRootForProject(projectName) {
240
372
  try {
241
373
  const liveRoots = new Set(await listCoordinatorRoots());
242
374
  const { listSessions } = await import("./lib/session-registry.js");
243
- const matches = listSessions().filter((session) => isRootSessionName(session.windowName)).filter((session) => !liveRoots.size || liveRoots.has(session.windowName)).filter((session) => session.projectDir && existsSync(session.projectDir)).filter((session) => registeredProjectDirMatches(session.projectDir, projectName)).map((session) => session.windowName);
375
+ const matches = listSessions().filter((session) => isRootSessionName(session.windowName)).filter((session) => !liveRoots.size || liveRoots.has(session.windowName)).filter((session) => session.projectDir && existsSync2(session.projectDir)).filter((session) => registeredProjectDirMatches(session.projectDir, projectName)).map((session) => session.windowName);
244
376
  return [...new Set(matches)].length === 1 ? matches[0] : "";
245
377
  } catch {
246
378
  return "";
@@ -266,28 +398,36 @@ async function resolveProjectDir(projectName, callerSession) {
266
398
  return null;
267
399
  }
268
400
  if (callerSession) {
401
+ const coordName = callerSession.includes("-") ? callerSession.slice(callerSession.indexOf("-") + 1) : callerSession;
402
+ let coordinatorScopeWasAuthoritative = false;
403
+ let sessions = [];
404
+ const remember = async (dir, coordDir) => {
405
+ const incarnation = await sessionIncarnationId(coordName);
406
+ if (incarnation) rememberProjectDir(coordName, projectName, dir, { incarnation, coordDir });
407
+ return dir;
408
+ };
269
409
  try {
270
410
  const { listSessions } = await import("./lib/session-registry.js");
271
- const sessions = listSessions();
272
- const coordName = callerSession.includes("-") ? callerSession.slice(callerSession.indexOf("-") + 1) : callerSession;
411
+ sessions = listSessions();
273
412
  const coordSession = sessions.find((s) => s.windowName === coordName) ?? sessions.find((s) => s.windowName === callerSession);
274
- if (coordSession?.projectDir && existsSync(coordSession.projectDir)) {
413
+ if (coordSession?.projectDir && existsSync2(coordSession.projectDir)) {
275
414
  const coordDir = coordSession.projectDir;
415
+ coordinatorScopeWasAuthoritative = true;
276
416
  if (projectDirMatches(coordDir, projectName)) {
277
- return coordDir;
417
+ return await remember(coordDir, coordDir);
278
418
  }
279
419
  const ancestorRoot = findAncestorProjectDir(coordDir, projectName);
280
- if (ancestorRoot) return ancestorRoot;
420
+ if (ancestorRoot) return await remember(ancestorRoot, coordDir);
281
421
  const sameScopeCandidates = /* @__PURE__ */ new Set();
282
422
  for (const session of sessions) {
283
423
  if (!sessionBelongsToCoordinator(session, coordName, callerSession)) continue;
284
- if (!session.projectDir || !existsSync(session.projectDir)) continue;
424
+ if (!session.projectDir || !existsSync2(session.projectDir)) continue;
285
425
  if (registeredProjectDirMatches(session.projectDir, projectName)) {
286
426
  sameScopeCandidates.add(session.projectDir);
287
427
  }
288
428
  }
289
429
  const sortedSameScope = [...sameScopeCandidates].sort();
290
- if (sortedSameScope.length === 1) return sortedSameScope[0];
430
+ if (sortedSameScope.length === 1) return await remember(sortedSameScope[0], coordDir);
291
431
  if (sortedSameScope.length > 1) {
292
432
  process.stderr.write(
293
433
  `[create-task] ambiguous same-session project resolution for "${projectName}" in caller scope "${callerSession}": ${sortedSameScope.join(", ")}. Returning null.
@@ -296,9 +436,9 @@ async function resolveProjectDir(projectName, callerSession) {
296
436
  return null;
297
437
  }
298
438
  const childUnderCoord = findProjectChildDir(coordDir, projectName);
299
- if (childUnderCoord) return childUnderCoord;
439
+ if (childUnderCoord) return await remember(childUnderCoord, coordDir);
300
440
  const automationChildUnderCoord = findAutomationChildDir(coordDir, projectName);
301
- if (automationChildUnderCoord) return automationChildUnderCoord;
441
+ if (automationChildUnderCoord) return await remember(automationChildUnderCoord, coordDir);
302
442
  const workspaceRoot = dirname(coordDir);
303
443
  if (workspaceRoot !== coordDir) {
304
444
  const sibling = findProjectChildDir(workspaceRoot, projectName);
@@ -313,13 +453,14 @@ async function resolveProjectDir(projectName, callerSession) {
313
453
  );
314
454
  return null;
315
455
  }
316
- return sibling;
456
+ return await remember(sibling, coordDir);
317
457
  }
318
458
  }
319
459
  process.stderr.write(
320
- `[create-task] project "${projectName}" not found within caller scope "${callerSession}" (coordinator dir "${coordDir}"). Not scanning other scopes.
460
+ `[create-task] project "${projectName}" not found within caller scope "${callerSession}" (coordinator dir "${coordDir}"). Not scanning other scopes and not consulting the resolution memo \u2014 this is a scope refusal, not registry churn.
321
461
  `
322
462
  );
463
+ return null;
323
464
  }
324
465
  } catch (err) {
325
466
  process.stderr.write(
@@ -327,6 +468,28 @@ async function resolveProjectDir(projectName, callerSession) {
327
468
  `
328
469
  );
329
470
  }
471
+ if (!coordinatorScopeWasAuthoritative) {
472
+ const incarnation = await sessionIncarnationId(coordName);
473
+ const remembered = incarnation ? recallProjectDir(coordName, projectName, incarnation) : null;
474
+ if (remembered) {
475
+ const inScope = rememberedDirStillInScope(remembered.dir, remembered.coordDir, projectName);
476
+ const owner = !inScope ? null : sessions.find(
477
+ (s) => s.windowName !== coordName && s.windowName !== callerSession && s.projectDir && isRealpathInside(remembered.dir, s.projectDir)
478
+ );
479
+ if (inScope && !owner) {
480
+ process.stderr.write(
481
+ `[create-task] recovered project "${projectName}" for caller scope "${callerSession}" from the in-scope resolution memo (${remembered.dir}, incarnation ${incarnation}) after the live session registry missed \u2014 transient registry churn, not an out-of-scope project.
482
+ `
483
+ );
484
+ return remembered.dir;
485
+ }
486
+ const reason = owner ? `it is now owned by coordinator scope "${owner.windowName}"` : `it is no longer in scope of its anchor "${remembered.coordDir}"`;
487
+ process.stderr.write(
488
+ `[create-task] DISCARDING remembered dir ${remembered.dir} for project "${projectName}" in caller scope "${callerSession}": ${reason}. Refusing rather than misrouting.
489
+ `
490
+ );
491
+ }
492
+ }
330
493
  process.stderr.write(
331
494
  `[create-task] could not resolve project "${projectName}" within caller scope "${callerSession}". Returning null \u2014 dispatch will be refused (no $HOME/cwd fallback for a scoped caller).
332
495
  `
@@ -338,7 +501,7 @@ async function resolveProjectDir(projectName, callerSession) {
338
501
  const candidates = /* @__PURE__ */ new Set();
339
502
  for (const session of listSessions()) {
340
503
  if (!isRootSessionName(session.windowName)) continue;
341
- if (!session.projectDir || !existsSync(session.projectDir)) continue;
504
+ if (!session.projectDir || !existsSync2(session.projectDir)) continue;
342
505
  if (registeredProjectDirMatches(session.projectDir, projectName)) {
343
506
  candidates.add(session.projectDir);
344
507
  }
@@ -378,7 +541,7 @@ async function resolveCoordinatorOwnProjectDir(callerRoot) {
378
541
  const coordName = callerRoot.includes("-") ? callerRoot.slice(callerRoot.indexOf("-") + 1) : callerRoot;
379
542
  const sessions = listSessions();
380
543
  const coordSession = sessions.find((s) => s.windowName === coordName) ?? sessions.find((s) => s.windowName === callerRoot);
381
- if (coordSession?.projectDir && existsSync(coordSession.projectDir)) {
544
+ if (coordSession?.projectDir && existsSync2(coordSession.projectDir)) {
382
545
  return coordSession.projectDir;
383
546
  }
384
547
  } catch {
@@ -541,7 +704,7 @@ function registerCreateTask(server) {
541
704
  let claimWarning = "";
542
705
  const claimRefRaw = (work_ref ?? "").trim();
543
706
  try {
544
- const { findConflicts, findConflictsInText, describeConflict, normalizeTarget } = await import("./work-claims-MNK7PEPW.js");
707
+ const { findConflicts, findConflictsInText, describeConflict, normalizeTarget } = await import("./work-claims-B73X5NE7.js");
545
708
  const conflicts = claimRefRaw ? await findConflicts(
546
709
  [normalizeTarget({ kind: "work_ref", value: claimRefRaw })],
547
710
  callerRoot
@@ -720,7 +883,7 @@ Nothing was created or dispatched. Either pick different work, or \u2014 if that
720
883
  }
721
884
  if (claimRefRaw) {
722
885
  try {
723
- const { acquireClaim } = await import("./work-claims-MNK7PEPW.js");
886
+ const { acquireClaim } = await import("./work-claims-B73X5NE7.js");
724
887
  const acquired = await acquireClaim({
725
888
  targets: [{ kind: "work_ref", value: claimRefRaw }],
726
889
  holderSession: callerRoot,
@@ -739,10 +902,10 @@ Claimed ${claimRefRaw} for session ${callerRoot} (claim_group ${acquired.claimGr
739
902
  }
740
903
  }
741
904
  try {
742
- const { existsSync: existsSync2, mkdirSync: mkdirSync2, writeFileSync: writeFileSync2 } = await import("fs");
905
+ const { existsSync: existsSync3, mkdirSync: mkdirSync3, writeFileSync: writeFileSync2 } = await import("fs");
743
906
  const { identityPath } = await import("./lib/identity.js");
744
907
  const idPath = identityPath(assigned_to);
745
- if (!existsSync2(idPath)) {
908
+ if (!existsSync3(idPath)) {
746
909
  const { loadEmployees } = await import("./lib/employees.js");
747
910
  const employees = await loadEmployees();
748
911
  const emp = employees.find((e) => e.name === assigned_to);
@@ -751,7 +914,7 @@ Claimed ${claimRefRaw} for session ${callerRoot} (claim_group ${acquired.claimGr
751
914
  const template = getTemplateForTitle(emp.role);
752
915
  if (template) {
753
916
  const dir = (await import("path")).dirname(idPath);
754
- if (!existsSync2(dir)) mkdirSync2(dir, { recursive: true });
917
+ if (!existsSync3(dir)) mkdirSync3(dir, { recursive: true });
755
918
  writeFileSync2(idPath, template.replace(/^agent_id: \w+/m, `agent_id: ${assigned_to}`), "utf-8");
756
919
  }
757
920
  }
@@ -763,7 +926,7 @@ Claimed ${claimRefRaw} for session ${callerRoot} (claim_group ${acquired.claimGr
763
926
  const { taskSignalPath: getSignalPath } = await import("./signal-paths-4G53QTII.js");
764
927
  const { taskSignalDir } = await import("./signal-paths-4G53QTII.js");
765
928
  const signalDir = taskSignalDir(sessionScope);
766
- mkdirSync(signalDir, { recursive: true });
929
+ mkdirSync2(signalDir, { recursive: true });
767
930
  const signalPath = getSignalPath(sessionScope, assigned_to, task.id);
768
931
  writeFileSync(signalPath, JSON.stringify({
769
932
  task_id: task.id,
@@ -773,7 +936,7 @@ Claimed ${claimRefRaw} for session ${callerRoot} (claim_group ${acquired.claimGr
773
936
  session_scope: sessionScope,
774
937
  created_at: (/* @__PURE__ */ new Date()).toISOString()
775
938
  }), "utf-8");
776
- const { recordOrchestrationEventBestEffort: recordOE } = await import("./orchestration-events-GY5VP5LU.js");
939
+ const { recordOrchestrationEventBestEffort: recordOE } = await import("./orchestration-events-N7LYMUGA.js");
777
940
  recordOE({
778
941
  eventType: "signal.created",
779
942
  source: "create-task.mcp",
@@ -805,7 +968,7 @@ Claimed ${claimRefRaw} for session ${callerRoot} (claim_group ${acquired.claimGr
805
968
  let projectConflictOpts = {};
806
969
  try {
807
970
  const { getClient } = await import("./lib/database.js");
808
- const { sessionScopeFilter } = await import("./task-scope-KXF7Y6KA.js");
971
+ const { sessionScopeFilter } = await import("./task-scope-ERVEUEYU.js");
809
972
  const client = getClient();
810
973
  const scope = sessionScopeFilter(task.sessionScope || callerRoot || exeSession || null);
811
974
  const existing = await client.execute({
@@ -873,30 +1036,60 @@ Dispatched: spawned ${result.sessionName}`;
873
1036
  Dispatch failed: ${result.error ?? "unknown"}`;
874
1037
  break;
875
1038
  }
876
- if (result.status === "failed") dispatchOutcome = "failed";
877
- if (result.status === "failed") {
1039
+ let livenessDemoted = false;
1040
+ if (result.status === "spawned" && result.sessionName) {
1041
+ const reprobeCapMs = Number(process.env.EXE_SPAWN_REPROBE_CAP_MS) || 4e3;
1042
+ const reprobeIntervalMs = Number(process.env.EXE_SPAWN_REPROBE_INTERVAL_MS) || 500;
1043
+ const reprobeIterations = Math.max(1, Math.ceil(reprobeCapMs / reprobeIntervalMs));
1044
+ let confirmedLive = false;
1045
+ for (let i = 0; i < reprobeIterations; i++) {
1046
+ try {
1047
+ if (isEmployeeAlive(result.sessionName)) {
1048
+ confirmedLive = true;
1049
+ break;
1050
+ }
1051
+ } catch {
1052
+ }
1053
+ if (i < reprobeIterations - 1) {
1054
+ await new Promise((r) => setTimeout(r, reprobeIntervalMs));
1055
+ }
1056
+ }
1057
+ if (!confirmedLive) {
1058
+ livenessDemoted = true;
1059
+ dispatchStatus = `
1060
+ Dispatch failed: spawn reported "spawned ${result.sessionName}" but the tmux session never came alive within ${reprobeCapMs / 1e3}s (post-spawn liveness re-probe). The agent was NOT started \u2014 re-dispatch required.`;
1061
+ process.stderr.write(
1062
+ `[create_task] SPAWN LIVENESS DEMOTION: ${result.sessionName} reported "spawned" but the re-probe found no live session \u2014 reporting dispatch FAILURE instead of a phantom success (bug 1c3ab704)
1063
+ `
1064
+ );
1065
+ }
1066
+ }
1067
+ const dispatchFailed = result.status === "failed" || livenessDemoted;
1068
+ if (dispatchFailed) dispatchOutcome = "failed";
1069
+ const dispatchFailureError = result.error ?? (livenessDemoted ? "spawn reported success but tmux session never came alive (liveness re-probe)" : "spawn failed");
1070
+ if (dispatchFailed) {
878
1071
  try {
879
- releaseDispatchClaim(task.id, assigned_to, result.error ?? "spawn failed");
1072
+ releaseDispatchClaim(task.id, assigned_to, dispatchFailureError);
880
1073
  } catch {
881
1074
  }
882
1075
  try {
883
- writeDispatchFailed(task.id, assigned_to, result.error ?? "spawn failed", result.sessionName);
1076
+ writeDispatchFailed(task.id, assigned_to, dispatchFailureError, result.sessionName);
884
1077
  } catch {
885
1078
  }
886
1079
  }
887
1080
  recordOrchestrationEventBestEffort({
888
- eventType: result.status === "failed" ? "dispatch.failed" : "dispatch.completed",
1081
+ eventType: dispatchFailed ? "dispatch.failed" : "dispatch.completed",
889
1082
  source: "create-task.mcp",
890
- severity: result.status === "failed" ? "warn" : "info",
1083
+ severity: dispatchFailed ? "warn" : "info",
891
1084
  taskId: task.id,
892
1085
  agentId: assigned_to,
893
1086
  sessionScope: task.sessionScope || callerRoot || exeSession,
894
1087
  projectName: project_name,
895
1088
  tmuxSession: result.sessionName || null,
896
1089
  runtime: dispatchRuntime,
897
- result: result.status,
898
- errorCode: result.status === "failed" ? "ensure_employee_failed" : null,
899
- payload: { priority, error: result.error ?? null }
1090
+ result: dispatchFailed ? "failed" : result.status,
1091
+ errorCode: dispatchFailed ? livenessDemoted ? "spawn_liveness_reprobe_failed" : "ensure_employee_failed" : null,
1092
+ payload: { priority, error: dispatchFailed ? dispatchFailureError : result.error ?? null }
900
1093
  });
901
1094
  try {
902
1095
  const { sendIntercom: si } = await import("./lib/tmux-routing.js");
@@ -912,7 +1105,7 @@ Dispatch failed: ${result.error ?? "unknown"}`;
912
1105
  }
913
1106
  } catch {
914
1107
  }
915
- if (result.sessionName && result.status !== "failed") {
1108
+ if (result.sessionName && !dispatchFailed) {
916
1109
  try {
917
1110
  const { getClient: gc } = await import("./lib/database.js");
918
1111
  await gc().execute({
@@ -945,9 +1138,11 @@ Dispatch failed: ${result.error ?? "unknown"}`;
945
1138
  } catch {
946
1139
  }
947
1140
  }
948
- try {
949
- writeDispatchPending(task.id, assigned_to, result.sessionName);
950
- } catch {
1141
+ if (!dispatchFailed) {
1142
+ try {
1143
+ writeDispatchPending(task.id, assigned_to, result.sessionName);
1144
+ } catch {
1145
+ }
951
1146
  }
952
1147
  logTaskDispatch({
953
1148
  taskId: task.id,
@@ -955,9 +1150,9 @@ Dispatch failed: ${result.error ?? "unknown"}`;
955
1150
  callerRoot,
956
1151
  exeSession,
957
1152
  callerSource,
958
- dispatchResult: result.status,
1153
+ dispatchResult: dispatchFailed ? "failed" : result.status,
959
1154
  sessionName: result.sessionName,
960
- error: result.error
1155
+ error: dispatchFailed ? dispatchFailureError : result.error
961
1156
  });
962
1157
  }
963
1158
  } else {
@@ -1006,7 +1201,7 @@ ${dispatchErr instanceof Error ? dispatchErr.stack : ""}
1006
1201
  }
1007
1202
  let dupWarning = "";
1008
1203
  try {
1009
- const { findMatchingBranches } = await import("./branch-hygiene-KCGXRAWP.js");
1204
+ const { findMatchingBranches } = await import("./branch-hygiene-U5GFRSTP.js");
1010
1205
  const matches = await findMatchingBranches(resolvedProjectDir, { title });
1011
1206
  if (matches.length > 0) {
1012
1207
  const top = matches.slice(0, 3).map((m) => {
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  getClient
3
- } from "./chunk-5DCCKHDY.js";
3
+ } from "./chunk-TAMDAOCU.js";
4
4
  import {
5
5
  loadConfigSync
6
- } from "./chunk-QMSEL5YS.js";
6
+ } from "./chunk-ZIG7VPJV.js";
7
7
 
8
8
  // src/lib/token-spend.ts
9
9
  import { readdir, stat } from "fs/promises";