@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
@@ -0,0 +1,261 @@
1
+ import {
2
+ killIfSameProcess,
3
+ ownProcessStartedAt,
4
+ processStartedAt
5
+ } from "./chunk-SLLLOOEI.js";
6
+ import {
7
+ resolveDataDir
8
+ } from "./chunk-ZIG7VPJV.js";
9
+
10
+ // src/lib/mcp-child-registry.ts
11
+ import path from "path";
12
+ import {
13
+ existsSync,
14
+ mkdirSync,
15
+ readFileSync,
16
+ writeFileSync,
17
+ unlinkSync,
18
+ readdirSync
19
+ } from "fs";
20
+ var PID_IDENTITY_TOLERANCE_MS = 2e3;
21
+ function registryDir() {
22
+ return path.join(resolveDataDir(), "mcp-children");
23
+ }
24
+ function registryFile(sessionKey) {
25
+ const sanitized = sessionKey.replace(/[^A-Za-z0-9_.-]/g, "_");
26
+ return path.join(registryDir(), `mcp-children-${sanitized}.json`);
27
+ }
28
+ function defaultIsAlive(pid) {
29
+ try {
30
+ process.kill(pid, 0);
31
+ return true;
32
+ } catch {
33
+ return false;
34
+ }
35
+ }
36
+ function defaultSleep(ms) {
37
+ return new Promise((resolve) => setTimeout(resolve, ms));
38
+ }
39
+ function quantizeToPsResolution(ms) {
40
+ return Math.floor(ms / 1e3) * 1e3;
41
+ }
42
+ var _sessionKey;
43
+ function currentMcpSessionKey() {
44
+ if (_sessionKey === void 0) {
45
+ _sessionKey = `${process.pid}-${quantizeToPsResolution(ownProcessStartedAt())}`;
46
+ }
47
+ return _sessionKey;
48
+ }
49
+ function registerMcpChild(sessionKey, pid, command, ownerPid = process.pid, spawnedAtMs) {
50
+ try {
51
+ mkdirSync(registryDir(), { recursive: true });
52
+ const file = registryFile(sessionKey);
53
+ const ownerStartedAtMs = ownerPid === process.pid ? ownProcessStartedAt() : processStartedAt(ownerPid);
54
+ let record;
55
+ try {
56
+ record = JSON.parse(readFileSync(file, "utf8"));
57
+ } catch {
58
+ record = { sessionKey, owner: { pid: ownerPid, startedAtMs: null }, children: [] };
59
+ }
60
+ if (record.children.length > 0 && !(record.owner?.pid === ownerPid && sameOwnerIdentity(record.owner?.startedAtMs ?? null, ownerStartedAtMs))) {
61
+ const foreign = record.children.map((c) => c.pid);
62
+ try {
63
+ process.stderr.write(
64
+ `[mcp-child-registry] REFUSING to adopt session ${sessionKey}: the existing record belongs to owner pid ${record.owner?.pid ?? "unknown"}, not to this process (${ownerPid}). Discarding ${foreign.length} inherited child entry(ies) [${foreign.join(", ")}] rather than claiming ownership of processes we did not spawn \u2014 a record that lies about ownership is never reaped.
65
+ `
66
+ );
67
+ } catch {
68
+ }
69
+ record.children = [];
70
+ }
71
+ record.sessionKey = sessionKey;
72
+ record.owner = { pid: ownerPid, startedAtMs: ownerStartedAtMs };
73
+ record.children = record.children.filter((c) => c.pid !== pid);
74
+ const spawnFallback = quantizeToPsResolution(spawnedAtMs ?? Date.now());
75
+ record.children.push({
76
+ pid,
77
+ startedAtMs: processStartedAt(pid) ?? spawnFallback,
78
+ command
79
+ });
80
+ writeFileSync(file, JSON.stringify(record));
81
+ } catch {
82
+ }
83
+ }
84
+ function unregisterMcpChild(sessionKey, pid) {
85
+ try {
86
+ const file = registryFile(sessionKey);
87
+ if (!existsSync(file)) return;
88
+ let record;
89
+ try {
90
+ record = JSON.parse(readFileSync(file, "utf8"));
91
+ } catch {
92
+ return;
93
+ }
94
+ record.children = record.children.filter((c) => c.pid !== pid);
95
+ if (record.children.length === 0) {
96
+ try {
97
+ unlinkSync(file);
98
+ } catch {
99
+ }
100
+ return;
101
+ }
102
+ writeFileSync(file, JSON.stringify(record));
103
+ } catch {
104
+ }
105
+ }
106
+ function readSessionMcpChildren(sessionKey) {
107
+ try {
108
+ const raw = readFileSync(registryFile(sessionKey), "utf8");
109
+ return JSON.parse(raw);
110
+ } catch {
111
+ return null;
112
+ }
113
+ }
114
+ function clearSessionMcpChildren(sessionKey) {
115
+ try {
116
+ unlinkSync(registryFile(sessionKey));
117
+ } catch {
118
+ }
119
+ }
120
+ async function terminateSessionMcpChildren(sessionKey, opts = {}) {
121
+ const result = { sessionKey, terminated: [], sigkilled: [], skipped: [] };
122
+ const record = readSessionMcpChildren(sessionKey);
123
+ if (!record) {
124
+ clearSessionMcpChildren(sessionKey);
125
+ return result;
126
+ }
127
+ const graceMs = opts.graceMs ?? 3e3;
128
+ const kill = opts.kill;
129
+ const isAlive = opts.isAlive ?? defaultIsAlive;
130
+ const startedAt = opts.startedAt ?? processStartedAt;
131
+ const sleep = opts.sleep ?? defaultSleep;
132
+ const log = opts.log ?? ((m) => {
133
+ try {
134
+ process.stderr.write(m + "\n");
135
+ } catch {
136
+ }
137
+ });
138
+ const sentSigterm = [];
139
+ for (const child of record.children) {
140
+ const outcome = killIfSameProcess(child.pid, child.startedAtMs, "SIGTERM", {
141
+ sender: "mcp-child-registry",
142
+ reason: `session ${sessionKey} end`,
143
+ kill,
144
+ isAlive,
145
+ startedAt,
146
+ log
147
+ });
148
+ if (outcome === "sent") {
149
+ result.terminated.push(child.pid);
150
+ sentSigterm.push(child);
151
+ } else {
152
+ result.skipped.push(child.pid);
153
+ }
154
+ }
155
+ if (sentSigterm.length > 0) {
156
+ await sleep(graceMs);
157
+ for (const child of sentSigterm) {
158
+ let alive;
159
+ try {
160
+ alive = isAlive(child.pid);
161
+ } catch {
162
+ alive = false;
163
+ }
164
+ if (!alive) continue;
165
+ const outcome = killIfSameProcess(child.pid, child.startedAtMs, "SIGKILL", {
166
+ sender: "mcp-child-registry",
167
+ reason: `session ${sessionKey} end (SIGKILL escalation)`,
168
+ kill,
169
+ isAlive,
170
+ startedAt,
171
+ log
172
+ });
173
+ if (outcome === "sent") {
174
+ result.sigkilled.push(child.pid);
175
+ } else if (outcome === "skipped-identity") {
176
+ result.skipped.push(child.pid);
177
+ }
178
+ }
179
+ }
180
+ if (result.skipped.length === 0) {
181
+ clearSessionMcpChildren(sessionKey);
182
+ } else {
183
+ log(
184
+ `[mcp-child-registry] session ${sessionKey}: retaining registry record \u2014 ${result.skipped.length} child(ren) [${result.skipped.join(", ")}] could not be identity-verified and were NOT signalled. The record is kept so a later sweep can retry.`
185
+ );
186
+ }
187
+ return result;
188
+ }
189
+ function sameOwnerIdentity(expectedMs, actualMs) {
190
+ if (expectedMs === null || actualMs === null) return false;
191
+ return Math.abs(expectedMs - actualMs) <= PID_IDENTITY_TOLERANCE_MS;
192
+ }
193
+ async function reapOrphanedMcpChildren(opts = {}) {
194
+ const results = [];
195
+ let files;
196
+ try {
197
+ files = readdirSync(registryDir());
198
+ } catch {
199
+ return results;
200
+ }
201
+ const isAlive = opts.isAlive ?? defaultIsAlive;
202
+ const startedAt = opts.startedAt ?? processStartedAt;
203
+ const log = opts.log ?? ((m) => {
204
+ try {
205
+ process.stderr.write(m + "\n");
206
+ } catch {
207
+ }
208
+ });
209
+ for (const file of files) {
210
+ if (!file.startsWith("mcp-children-") || !file.endsWith(".json")) continue;
211
+ try {
212
+ const raw = readFileSync(path.join(registryDir(), file), "utf8");
213
+ const record = JSON.parse(raw);
214
+ if (!record || typeof record.sessionKey !== "string" || !Array.isArray(record.children)) {
215
+ continue;
216
+ }
217
+ let alive;
218
+ try {
219
+ alive = isAlive(record.owner.pid);
220
+ } catch {
221
+ alive = false;
222
+ }
223
+ if (alive && record.owner.startedAtMs == null) {
224
+ const childPids = record.children.map((c) => c.pid);
225
+ log(
226
+ `[mcp-child-registry] UNVERIFIABLE session ${record.sessionKey}: owner pid ${record.owner.pid} is alive but has NO recorded start time, so it cannot be confirmed as the original owner. Refusing to terminate its ${childPids.length} child(ren) [${childPids.join(", ")}] \u2014 signalling on unverified identity is how a recycled PID gets an innocent process killed. These children may be leaked; they will be reaped once that pid is gone.`
227
+ );
228
+ try {
229
+ opts.onUnverifiable?.({ sessionKey: record.sessionKey, ownerPid: record.owner.pid, childPids });
230
+ } catch {
231
+ }
232
+ continue;
233
+ }
234
+ let recycled = false;
235
+ if (alive && record.owner.startedAtMs != null) {
236
+ let actual;
237
+ try {
238
+ actual = startedAt(record.owner.pid);
239
+ } catch {
240
+ actual = null;
241
+ }
242
+ recycled = !sameOwnerIdentity(record.owner.startedAtMs, actual);
243
+ }
244
+ if (alive && !recycled) continue;
245
+ const result = await terminateSessionMcpChildren(record.sessionKey, opts);
246
+ results.push(result);
247
+ } catch {
248
+ }
249
+ }
250
+ return results;
251
+ }
252
+
253
+ export {
254
+ currentMcpSessionKey,
255
+ registerMcpChild,
256
+ unregisterMcpChild,
257
+ readSessionMcpChildren,
258
+ clearSessionMcpChildren,
259
+ terminateSessionMcpChildren,
260
+ reapOrphanedMcpChildren
261
+ };
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-SSC7EKY2.js";
4
4
  import {
5
5
  inventoryLocalSecretResidue
6
- } from "./chunk-E5HAY3DQ.js";
6
+ } from "./chunk-HDLAB7W3.js";
7
7
  import {
8
8
  CC_NATIVE_ONLY_CUTOFF,
9
9
  compareSemver,
@@ -12,22 +12,22 @@ import {
12
12
  import {
13
13
  readMcpHttpEvents,
14
14
  summarizeMcpTransport
15
- } from "./chunk-YYA5LXCT.js";
15
+ } from "./chunk-FNEZ4BWT.js";
16
16
  import {
17
17
  mcpHttpPort
18
- } from "./chunk-LDL3S7AC.js";
18
+ } from "./chunk-NKETJCB5.js";
19
19
  import {
20
20
  inspectKeyCustodySync
21
21
  } from "./chunk-HPXFKUGU.js";
22
22
  import {
23
23
  checkSingleGotrueInstance
24
- } from "./chunk-TCTED52S.js";
24
+ } from "./chunk-FTZET5YX.js";
25
25
  import {
26
26
  SYSTEMD_DAEMON_UNIT
27
27
  } from "./chunk-A7JYF4RG.js";
28
28
  import {
29
29
  EXE_AI_DIR
30
- } from "./chunk-QMSEL5YS.js";
30
+ } from "./chunk-ZIG7VPJV.js";
31
31
 
32
32
  // src/bin/exe-healthcheck.ts
33
33
  import { existsSync as existsSync2, readFileSync as readFileSync2, readdirSync } from "fs";
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  PLATFORM_PROCEDURE_TITLES
3
- } from "./chunk-THIJIOE2.js";
3
+ } from "./chunk-PY3FOMRN.js";
4
4
  import {
5
5
  isGhostBehaviorRow
6
- } from "./chunk-MBNIJXKI.js";
6
+ } from "./chunk-WMEYJT4R.js";
7
7
  import {
8
8
  getClient,
9
9
  getIdentity,
10
10
  listIdentities,
11
11
  updateIdentity
12
- } from "./chunk-5DCCKHDY.js";
12
+ } from "./chunk-TAMDAOCU.js";
13
13
  import {
14
14
  atomicWriteJsonSync
15
15
  } from "./chunk-HSGBZSCA.js";
@@ -126,13 +126,27 @@ function buildImportedRosterEntries(roster, timestamp) {
126
126
  ...entry.templateVersion != null ? { templateVersion: entry.templateVersion } : {}
127
127
  }));
128
128
  }
129
+ var behaviorKey = (agentId, content) => `${agentId}::${content}`;
129
130
  async function insertBehaviors(behaviors, timestamp) {
130
131
  const client = getClient();
132
+ const seen = /* @__PURE__ */ new Set();
133
+ const existing = await client.execute({
134
+ sql: "SELECT agent_id, content FROM behaviors WHERE active = 1",
135
+ args: []
136
+ });
137
+ for (const row of existing.rows) {
138
+ seen.add(behaviorKey(String(row.agent_id), String(row.content)));
139
+ }
131
140
  let inserted = 0;
132
141
  for (const behavior of behaviors) {
133
142
  if (isGhostBehaviorRow({ id: "import", content: behavior.content, agent_id: behavior.agent_id })) {
134
143
  continue;
135
144
  }
145
+ const key = behaviorKey(behavior.agent_id, behavior.content);
146
+ if (seen.has(key)) {
147
+ continue;
148
+ }
149
+ seen.add(key);
136
150
  await client.execute({
137
151
  sql: `INSERT INTO behaviors (id, agent_id, project_name, domain, priority, content, active, created_at, updated_at)
138
152
  VALUES (?, ?, ?, ?, ?, ?, 1, ?, ?)`,
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  sendMessage
3
- } from "./chunk-7WQRFSZI.js";
3
+ } from "./chunk-SL6KQYDU.js";
4
4
  import {
5
5
  getActiveAgent
6
- } from "./chunk-KYFFVTGO.js";
6
+ } from "./chunk-55BEFF4V.js";
7
7
 
8
8
  // src/mcp/tools/send-message.ts
9
9
  import { z } from "zod";
@@ -130,12 +130,65 @@ function basename(tok) {
130
130
  function isGitProgram(tok) {
131
131
  return tok === "git" || /(?:^|\/)git$/.test(tok);
132
132
  }
133
+ function isGhProgram(tok) {
134
+ return tok === "gh" || /(?:^|\/)gh$/.test(tok);
135
+ }
136
+ function ghHasDeleteMethod(tokens) {
137
+ for (let i = 0; i < tokens.length; i++) {
138
+ const t = tokens[i];
139
+ if ((t === "-X" || t === "--method") && (tokens[i + 1] ?? "").toUpperCase() === "DELETE") return true;
140
+ const attached = /^(?:-X|--method)=(.+)$/.exec(t);
141
+ if (attached && attached[1].toUpperCase() === "DELETE") return true;
142
+ const combined = /^-X(.+)$/.exec(t);
143
+ if (combined && combined[1].toUpperCase() === "DELETE") return true;
144
+ }
145
+ return false;
146
+ }
147
+ function endpointRefPath(tok) {
148
+ const cut = tok.search(/[?#]/);
149
+ return cut >= 0 ? tok.slice(0, cut) : tok;
150
+ }
151
+ function classifyGhSegment(tokens) {
152
+ const ghIdx = tokens.findIndex(isGhProgram);
153
+ if (ghIdx === -1) return "none";
154
+ const hasApi = tokens.slice(ghIdx + 1).includes("api");
155
+ if (!hasApi) return "none";
156
+ if (!ghHasDeleteMethod(tokens)) return "none";
157
+ const endpoint = tokens.find(
158
+ (t, i) => i > ghIdx && !t.startsWith("-") && // not a flag / attached flag (-X, --method=..., --field=...)
159
+ !/^[A-Za-z_][\w.-]*=/.test(t) && // not a key=value field/header value
160
+ /git\/refs\//.test(endpointRefPath(t))
161
+ );
162
+ if (endpoint === void 0) return "none";
163
+ const refPath = endpointRefPath(endpoint);
164
+ if (/git\/refs\/tags\//.test(refPath)) return "tag";
165
+ return "block";
166
+ }
133
167
  function isShellProgram(tok) {
134
168
  return SHELLS.has(basename(tok));
135
169
  }
136
170
  function isDashC(tok) {
137
171
  return /^-[a-z]*c[a-z]*$/i.test(tok) && tok.includes("c");
138
172
  }
173
+ var SHELL_VALUE_OPTS = /* @__PURE__ */ new Set(["-o", "+o", "-O", "+O", "--rcfile", "--init-file"]);
174
+ function shellDashCScriptIndex(tokens, i) {
175
+ if (!isShellProgram(tokens[i])) return -1;
176
+ let j = i + 1;
177
+ while (j < tokens.length) {
178
+ const t = tokens[j];
179
+ if (isDashC(t)) return j + 1 < tokens.length ? j + 1 : -1;
180
+ if (SHELL_VALUE_OPTS.has(t)) {
181
+ j += 2;
182
+ continue;
183
+ }
184
+ if (t.startsWith("-")) {
185
+ j++;
186
+ continue;
187
+ }
188
+ return -1;
189
+ }
190
+ return -1;
191
+ }
139
192
  function isLeadingAssignment(tok) {
140
193
  return /^[A-Za-z_][A-Za-z0-9_]*=/.test(tok);
141
194
  }
@@ -240,8 +293,9 @@ function containsDestructiveGitCandidate(command, depth = 0) {
240
293
  if (depth > 3) return true;
241
294
  const { tokens } = tokenizeShell(command);
242
295
  for (let i = 0; i < tokens.length; i++) {
243
- if (isShellProgram(tokens[i]) && tokens[i + 1] && isDashC(tokens[i + 1])) {
244
- const script = tokens[i + 2];
296
+ const si = shellDashCScriptIndex(tokens, i);
297
+ if (si >= 0) {
298
+ const script = tokens[si];
245
299
  if (script && containsDestructiveGitCandidate(script, depth + 1)) return true;
246
300
  }
247
301
  }
@@ -259,6 +313,24 @@ function containsDestructiveGitCandidate(command, depth = 0) {
259
313
  if (tokens.some((t) => /^alias\./.test(t))) return true;
260
314
  return hasDestructiveVerbTokens(tokens);
261
315
  }
316
+ function ghApiRefDeleteVerdict(command, depth = 0) {
317
+ if (depth > 3) return "block";
318
+ const { tokens } = tokenizeShell(command);
319
+ for (let i = 0; i < tokens.length; i++) {
320
+ const si = shellDashCScriptIndex(tokens, i);
321
+ if (si >= 0) {
322
+ const script = tokens[si];
323
+ if (script && ghApiRefDeleteVerdict(script, depth + 1) === "block") return "block";
324
+ }
325
+ }
326
+ let sawTag = false;
327
+ for (const seg of splitShellSegments(command)) {
328
+ const v = classifyGhSegment(tokenizeShell(seg).tokens);
329
+ if (v === "block") return "block";
330
+ if (v === "tag") sawTag = true;
331
+ }
332
+ return sawTag ? "tag" : "none";
333
+ }
262
334
  var PUSH_VALUE_OPTS = /* @__PURE__ */ new Set(["-o", "--push-option", "--repo", "--receive-pack", "--exec", "--recurse-submodules"]);
263
335
  var REBASE_VALUE_OPTS = /* @__PURE__ */ new Set(["--onto", "-s", "--strategy", "-X", "--strategy-option", "--exec", "-x", "--whitespace"]);
264
336
  function parseSingleGitCommand(tokens) {
@@ -572,7 +644,7 @@ function getCurrentBranch(cwd) {
572
644
  }
573
645
  function hasEmergencyOverride(command, env = process.env) {
574
646
  if (env[MAIN_GUARD_OVERRIDE_ENV] === "1") return true;
575
- return new RegExp(String.raw`^\s*${MAIN_GUARD_OVERRIDE_ENV}=1\s+git\b`).test(command);
647
+ return new RegExp(String.raw`^\s*${MAIN_GUARD_OVERRIDE_ENV}=1\s+(?:git|gh)\b`).test(command);
576
648
  }
577
649
  function normalizeCleanGit(tokens) {
578
650
  const first = tokens[0];
@@ -586,6 +658,9 @@ function evaluateMainGuard(command, opts = {}) {
586
658
  const env = opts.env ?? process.env;
587
659
  const cwd = opts.cwd ?? process.cwd();
588
660
  if (hasEmergencyOverride(command, env)) return { block: false, overridden: true };
661
+ if (ghApiRefDeleteVerdict(command) === "block") {
662
+ return { block: true, message: formatGhApiRefDeleteBlockMessage() };
663
+ }
589
664
  if (!containsDestructiveGitCandidate(command)) return { block: false };
590
665
  const { tokens, hasShellControl } = tokenizeShell(command);
591
666
  if (hasShellControl) {
@@ -661,6 +736,14 @@ SAFE ALTERNATIVES:
661
736
  \u2022 Resetting a NON-${info.branch} branch onto its own ancestor is allowed \u2014 check that branch out first (git checkout -B <branch> <sha>); this guard only fires when ${info.branch} itself moves.
662
737
  ${OVERRIDE_LINE}`;
663
738
  }
739
+ function formatGhApiRefDeleteBlockMessage() {
740
+ return `\u{1F6AB} BLOCKED: deleting a remote ref via \`gh api -X DELETE .../git/refs/...\`.
741
+ WHY: this is the same destructive operation as \`git push --delete <branch>\`, which this guard gates. Routing the deletion through the REST API does not make it safe \u2014 a remote branch ref is being destroyed.
742
+ WHAT TO DO:
743
+ \u2022 Deleting a TAG is fine \u2014 target refs/tags explicitly: gh api -X DELETE .../git/refs/tags/<tag>
744
+ \u2022 If you truly intend to delete a remote BRANCH, do it deliberately and auditably with the documented override.
745
+ ${OVERRIDE_LINE}`;
746
+ }
664
747
  function formatForcePushBlockMessage(verb = "force/delete push to main") {
665
748
  return `\u{1F6AB} BLOCKED: ${verb} would overwrite SHARED history on origin \u2014 it can silently discard commits other people (and other agents) pushed.
666
749
  WHY: --force / --force-with-lease / --mirror / +refspec / --delete rewrites the remote branch everyone builds on (bug 6aaea78f).
@@ -696,8 +779,10 @@ export {
696
779
  MAIN_GUARD_OVERRIDE_ENV,
697
780
  tokenizeShell,
698
781
  isGitProgram,
782
+ isGhProgram,
699
783
  splitShellSegments,
700
784
  containsDestructiveGitCandidate,
785
+ ghApiRefDeleteVerdict,
701
786
  parseSingleGitCommand,
702
787
  resolveRepoState,
703
788
  isResolvableRefName,
@@ -710,6 +795,7 @@ export {
710
795
  hasEmergencyOverride,
711
796
  evaluateMainGuard,
712
797
  formatMainAheadBlockMessage,
798
+ formatGhApiRefDeleteBlockMessage,
713
799
  formatForcePushBlockMessage,
714
800
  formatUnprovableDeleteBlockMessage,
715
801
  formatUnverifiableBlockMessage,
@@ -65,6 +65,28 @@ function readDeployStalenessAlert(alertPath = deployStalenessAlertPath()) {
65
65
  return null;
66
66
  }
67
67
  }
68
+ function stackLockCandidatePaths() {
69
+ const override = process.env.EXE_STACK_LOCK_FILE;
70
+ if (override) return [override];
71
+ return [
72
+ path.join("/opt/exe-stack", ".exe-stack-lock.json"),
73
+ path.join(process.cwd(), ".exe-stack-lock.json")
74
+ ];
75
+ }
76
+ function readStackLockSnapshot(candidates = stackLockCandidatePaths()) {
77
+ for (const candidate of candidates) {
78
+ try {
79
+ if (!existsSync(candidate)) continue;
80
+ const parsed = JSON.parse(readFileSync(candidate, "utf8"));
81
+ if (parsed && typeof parsed === "object") return parsed;
82
+ } catch {
83
+ }
84
+ }
85
+ return null;
86
+ }
87
+ function resolveDeployStalenessAlert(alertPath = deployStalenessAlertPath(), candidates = stackLockCandidatePaths(), now = () => /* @__PURE__ */ new Date()) {
88
+ return readDeployStalenessAlert(alertPath) ?? evaluateDeployStaleness(readStackLockSnapshot(candidates), now);
89
+ }
68
90
  function buildDeployStalenessBanner(alert) {
69
91
  if (!alert) return [];
70
92
  const lines = [];
@@ -90,8 +112,9 @@ function buildDeployStalenessBanner(alert) {
90
112
 
91
113
  export {
92
114
  evaluateDeployStaleness,
115
+ deployStalenessAlertPath,
93
116
  writeDeployStalenessAlert,
94
117
  clearDeployStalenessAlert,
95
- readDeployStalenessAlert,
118
+ resolveDeployStalenessAlert,
96
119
  buildDeployStalenessBanner
97
120
  };
@@ -6,20 +6,20 @@ import {
6
6
  queryTaskRows,
7
7
  resolveExeSession,
8
8
  sendIntercom
9
- } from "./chunk-XHYHX6F7.js";
9
+ } from "./chunk-AKLQSC6W.js";
10
10
  import {
11
11
  getTransport
12
- } from "./chunk-UXLO7VHX.js";
12
+ } from "./chunk-VI4ATC6I.js";
13
13
  import {
14
14
  recordOrchestrationEventBestEffort
15
- } from "./chunk-E2WEFZOR.js";
15
+ } from "./chunk-W75GTHR3.js";
16
16
  import {
17
17
  releaseDispatchClaim,
18
18
  tryAcquireDispatchClaim
19
19
  } from "./chunk-AJIXH5JF.js";
20
20
  import {
21
21
  getAgentRuntime
22
- } from "./chunk-XTWHNLGD.js";
22
+ } from "./chunk-GZOG2MAX.js";
23
23
  import {
24
24
  getSessionKey
25
25
  } from "./chunk-CVYC6DUW.js";
@@ -27,7 +27,7 @@ import {
27
27
  isCoordinatorName,
28
28
  isMultiInstance,
29
29
  shouldAutoInstance
30
- } from "./chunk-5DCCKHDY.js";
30
+ } from "./chunk-TAMDAOCU.js";
31
31
 
32
32
  // src/lib/tasks-notify.ts
33
33
  var VERIFY_DELAY_MS = 1e4;
@@ -89,7 +89,7 @@ async function dispatchTaskToEmployee(input) {
89
89
  let crossProject = false;
90
90
  if (input.projectName) {
91
91
  try {
92
- const { assertSessionScope } = await import("./session-scope-LG2J4EMQ.js");
92
+ const { assertSessionScope } = await import("./session-scope-KRWE54C4.js");
93
93
  const check = assertSessionScope("dispatch_task", input.projectName);
94
94
  if (check.reason === "cross_session_denied") {
95
95
  crossProject = true;
@@ -227,7 +227,7 @@ async function dispatchTaskToEmployee(input) {
227
227
  return { dispatched: "skipped", session: sessionName, crossProject };
228
228
  }
229
229
  const result = sendIntercom(sessionName, { force: true });
230
- const dispatched = result === "acknowledged" || result === "debounced" || result === "queued" ? "verified" : result === "delivered" ? "sent_unverified" : "session_dead";
230
+ const dispatched = result === "acknowledged" || result === "debounced" || result === "queued" ? "verified" : result === "delivered" || result === "sent" ? "sent_unverified" : "session_dead";
231
231
  process.stderr.write(
232
232
  `[dispatch-audit] intercom \u2192 ${sessionName} | task="${input.title}" [${input.priority}] | result=${dispatched} (sendIntercom=${result})
233
233
  `
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  checkLicense,
3
3
  loadLicense
4
- } from "./chunk-DKBPCOU4.js";
4
+ } from "./chunk-L6RXG36J.js";
5
5
 
6
6
  // src/lib/license-gate.ts
7
7
  var _cachedLicense = null;