@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
@@ -4,6 +4,9 @@ import {
4
4
  atomicWriteJsonSync,
5
5
  ensurePrivateDir
6
6
  } from "./chunk-HSGBZSCA.js";
7
+ import {
8
+ assertHermeticPath
9
+ } from "./chunk-RH4AH3YB.js";
7
10
  import {
8
11
  currentKeyDirContext,
9
12
  refusedQuarantineDir,
@@ -13,61 +16,8 @@ import {
13
16
  // src/lib/config.ts
14
17
  import { readFile } from "fs/promises";
15
18
  import { readFileSync, existsSync, renameSync } from "fs";
16
- import path2 from "path";
17
- import os2 from "os";
18
-
19
- // src/lib/hermetic-guard.ts
20
- import { realpathSync } from "fs";
21
- import os from "os";
22
19
  import path from "path";
23
- var SHARED_TMP_BASES = ["/tmp", os.tmpdir()];
24
- function isHermeticTestEnv() {
25
- return process.env.EXE_TEST_HERMETIC === "1";
26
- }
27
- function harnessRealHome() {
28
- const v = process.env.EXE_HERMETIC_REAL_HOME ?? process.env.EXE_REAL_HOME;
29
- return v && v.trim() ? v : null;
30
- }
31
- function harnessSandboxRoot() {
32
- const v = process.env.EXE_HERMETIC_SANDBOX_ROOT;
33
- return v && v.trim() ? v : null;
34
- }
35
- function canonical(p) {
36
- let dir = path.resolve(p);
37
- const tail = [];
38
- for (; ; ) {
39
- try {
40
- return path.join(realpathSync(dir), ...tail);
41
- } catch {
42
- }
43
- const parent = path.dirname(dir);
44
- if (parent === dir) return path.resolve(p);
45
- tail.unshift(path.basename(dir));
46
- dir = parent;
47
- }
48
- }
49
- function isInside(candidate, base) {
50
- const rel = path.relative(canonical(base), canonical(candidate));
51
- return rel === "" || !rel.startsWith("..") && !path.isAbsolute(rel);
52
- }
53
- function realInstallDirs(realHome) {
54
- return [path.join(realHome, ".exe-os"), path.join(realHome, ".exe-mem")];
55
- }
56
- function assertHermeticPath(what, resolved) {
57
- if (!isHermeticTestEnv()) return;
58
- const realHome = harnessRealHome();
59
- if (!realHome) return;
60
- const sandboxRoot = harnessSandboxRoot();
61
- if (sandboxRoot && isInside(resolved, sandboxRoot)) return;
62
- const breached = realInstallDirs(realHome).find((dir) => isInside(resolved, dir));
63
- if (!breached) return;
64
- throw new Error(
65
- `[hermetic-guard] Test isolation breach: ${what} resolved to ${resolved}, which is the REAL exe-os install at ${breached}.
66
- This process runs under the hermetic test harness (EXE_TEST_HERMETIC=1) but is operating on the LIVE install. Real product code reached from here can and does kill the production daemon (bug 2b7072a7 / 7a915790).
67
- Cause is almost always a spawn that overrode the sandbox: an explicit env: {...} that dropped EXE_OS_DIR/EXE_MEM_DIR, or HOME: os.homedir() captured outside the sandbox.
68
- Fix: inherit ...process.env, or use the hermetic HOME (process.env.HOME), never os.homedir().`
69
- );
70
- }
20
+ import os from "os";
71
21
 
72
22
  // src/lib/theme.ts
73
23
  var THEME_MODES = ["dark", "light", "system"];
@@ -151,7 +101,7 @@ function resolveDataDir() {
151
101
  return dir;
152
102
  }
153
103
  if (!existsSync(dir)) {
154
- const legacyDir = path2.join(path2.dirname(dir), ".exe-mem");
104
+ const legacyDir = path.join(path.dirname(dir), ".exe-mem");
155
105
  if (existsSync(legacyDir)) {
156
106
  try {
157
107
  renameSync(legacyDir, dir);
@@ -166,9 +116,9 @@ function resolveDataDir() {
166
116
  return dir;
167
117
  }
168
118
  var EXE_AI_DIR = resolveDataDir();
169
- var DB_PATH = path2.join(EXE_AI_DIR, "memories.db");
170
- var MODELS_DIR = path2.join(EXE_AI_DIR, "models");
171
- var CONFIG_PATH = path2.join(EXE_AI_DIR, "config.json");
119
+ var DB_PATH = path.join(EXE_AI_DIR, "memories.db");
120
+ var MODELS_DIR = path.join(EXE_AI_DIR, "models");
121
+ var CONFIG_PATH = path.join(EXE_AI_DIR, "config.json");
172
122
  var CANONICAL_EMBED_MODEL_FILE = "exe-embeddings-v1-q4_k_m.gguf";
173
123
  var LEGACY_EMBED_MODEL_FILES = [
174
124
  "jina-embeddings-v5-small-q4_k_m.gguf",
@@ -178,14 +128,14 @@ var LEGACY_EMBED_MODEL_FILES = [
178
128
  function resolveEmbedModelFile(dir = MODELS_DIR, preferred = CANONICAL_EMBED_MODEL_FILE) {
179
129
  const candidates = [preferred, CANONICAL_EMBED_MODEL_FILE, ...LEGACY_EMBED_MODEL_FILES];
180
130
  for (const name of candidates) {
181
- if (name && existsSync(path2.join(dir, name))) return name;
131
+ if (name && existsSync(path.join(dir, name))) return name;
182
132
  }
183
133
  return preferred || CANONICAL_EMBED_MODEL_FILE;
184
134
  }
185
135
  function isDbAuthorityEnabled() {
186
136
  return (process.env.EXE_DB_AUTHORITY ?? "") === "1";
187
137
  }
188
- var LEGACY_LANCE_PATH = path2.join(EXE_AI_DIR, "local.lance");
138
+ var LEGACY_LANCE_PATH = path.join(EXE_AI_DIR, "local.lance");
189
139
  var CURRENT_CONFIG_VERSION = 1;
190
140
  var DEFAULT_CONFIG = {
191
141
  config_version: CURRENT_CONFIG_VERSION,
@@ -223,6 +173,8 @@ var DEFAULT_CONFIG = {
223
173
  consolidationMaxCallsPerRun: 20,
224
174
  selfQueryRouter: true,
225
175
  selfQueryModel: "claude-haiku-4-5-20251001",
176
+ hyde: false,
177
+ hydeModel: "claude-haiku-4-5-20251001",
226
178
  rerankerEnabled: true,
227
179
  scalingRoadmap: {
228
180
  rerankerAutoTrigger: {
@@ -428,7 +380,7 @@ function normalizeCloudEndpoint(raw) {
428
380
  }
429
381
  try {
430
382
  const cfgDir = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? EXE_AI_DIR;
431
- const cfgPath = path2.join(cfgDir, "config.json");
383
+ const cfgPath = path.join(cfgDir, "config.json");
432
384
  if (existsSync(cfgPath)) {
433
385
  const onDisk = JSON.parse(readFileSync(cfgPath, "utf8"));
434
386
  const diskCloud = onDisk.cloud;
@@ -443,9 +395,9 @@ function normalizeCloudEndpoint(raw) {
443
395
  async function loadConfig() {
444
396
  const dir = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? EXE_AI_DIR;
445
397
  await ensurePrivateDir(dir);
446
- const configPath = path2.join(dir, "config.json");
398
+ const configPath = path.join(dir, "config.json");
447
399
  if (!existsSync(configPath)) {
448
- return { ...DEFAULT_CONFIG, dbPath: path2.join(dir, "memories.db") };
400
+ return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db") };
449
401
  }
450
402
  let raw;
451
403
  try {
@@ -461,11 +413,11 @@ async function loadConfig() {
461
413
  await atomicWrite(configPath, raw);
462
414
  } catch {
463
415
  process.stderr.write("[exe-os] config.json.bak also corrupt \u2014 using defaults\n");
464
- return { ...DEFAULT_CONFIG, dbPath: path2.join(dir, "memories.db") };
416
+ return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db") };
465
417
  }
466
418
  } else {
467
419
  process.stderr.write("[exe-os] config.json corrupt, no backup available \u2014 using defaults\n");
468
- return { ...DEFAULT_CONFIG, dbPath: path2.join(dir, "memories.db") };
420
+ return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db") };
469
421
  }
470
422
  }
471
423
  try {
@@ -491,24 +443,24 @@ async function loadConfig() {
491
443
  normalizeEmbeddingPrefixes(migratedCfg);
492
444
  normalizeAppearance(migratedCfg);
493
445
  normalizeCloudEndpoint(migratedCfg);
494
- const config = { ...DEFAULT_CONFIG, dbPath: path2.join(dir, "memories.db"), ...migratedCfg };
446
+ const config = { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db"), ...migratedCfg };
495
447
  if (config.dbPath.startsWith("~")) {
496
- config.dbPath = config.dbPath.replace(/^~/, os2.homedir());
448
+ config.dbPath = config.dbPath.replace(/^~/, os.homedir());
497
449
  }
498
- const envDbPath = path2.join(dir, "memories.db");
450
+ const envDbPath = path.join(dir, "memories.db");
499
451
  if (process.env.EXE_OS_DIR && config.dbPath !== envDbPath && !existsSync(config.dbPath) && existsSync(envDbPath)) {
500
452
  config.dbPath = envDbPath;
501
453
  }
502
454
  return config;
503
455
  } catch {
504
- return { ...DEFAULT_CONFIG, dbPath: path2.join(dir, "memories.db") };
456
+ return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db") };
505
457
  }
506
458
  }
507
459
  function loadConfigSync() {
508
460
  const dir = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? EXE_AI_DIR;
509
- const configPath = path2.join(dir, "config.json");
461
+ const configPath = path.join(dir, "config.json");
510
462
  if (!existsSync(configPath)) {
511
- return { ...DEFAULT_CONFIG, dbPath: path2.join(dir, "memories.db") };
463
+ return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db") };
512
464
  }
513
465
  try {
514
466
  const raw = readFileSync(configPath, "utf-8");
@@ -526,23 +478,23 @@ function loadConfigSync() {
526
478
  normalizeEmbeddingPrefixes(migratedCfg);
527
479
  normalizeAppearance(migratedCfg);
528
480
  normalizeCloudEndpoint(migratedCfg);
529
- const config = { ...DEFAULT_CONFIG, dbPath: path2.join(dir, "memories.db"), ...migratedCfg };
481
+ const config = { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db"), ...migratedCfg };
530
482
  if (config.dbPath.startsWith("~")) {
531
- config.dbPath = config.dbPath.replace(/^~/, os2.homedir());
483
+ config.dbPath = config.dbPath.replace(/^~/, os.homedir());
532
484
  }
533
- const envDbPath = path2.join(dir, "memories.db");
485
+ const envDbPath = path.join(dir, "memories.db");
534
486
  if (process.env.EXE_OS_DIR && config.dbPath !== envDbPath && !existsSync(config.dbPath) && existsSync(envDbPath)) {
535
487
  config.dbPath = envDbPath;
536
488
  }
537
489
  return config;
538
490
  } catch {
539
- return { ...DEFAULT_CONFIG, dbPath: path2.join(dir, "memories.db") };
491
+ return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db") };
540
492
  }
541
493
  }
542
494
  async function saveConfig(config) {
543
495
  const dir = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? EXE_AI_DIR;
544
496
  await ensurePrivateDir(dir);
545
- const configPath = path2.join(dir, "config.json");
497
+ const configPath = path.join(dir, "config.json");
546
498
  await atomicWriteJson(configPath, config);
547
499
  }
548
500
  async function loadConfigFrom(configPath) {
@@ -6,8 +6,15 @@ import {
6
6
  supportVersionSchema
7
7
  } from "./chunk-5H47VHB7.js";
8
8
  import {
9
- buildVerificationArtifact
10
- } from "./chunk-KZXMP6JG.js";
9
+ assessAttribution,
10
+ assessDisposition,
11
+ buildVerificationArtifact,
12
+ isPlaceholderIdentity,
13
+ isUnresolvedIdentity
14
+ } from "./chunk-4YNA3CM6.js";
15
+ import {
16
+ getActiveAgent
17
+ } from "./chunk-55BEFF4V.js";
11
18
  import {
12
19
  SUPPORT_PRODUCTS,
13
20
  sanitizeProductFilter,
@@ -17,7 +24,7 @@ import {
17
24
  import {
18
25
  loadLicense,
19
26
  readCachedLicenseToken
20
- } from "./chunk-DKBPCOU4.js";
27
+ } from "./chunk-L6RXG36J.js";
21
28
 
22
29
  // src/mcp/tools/support-inbox.ts
23
30
  import { z as z2 } from "zod";
@@ -27,23 +34,183 @@ import { homedir } from "os";
27
34
 
28
35
  // src/lib/support-verification-input.ts
29
36
  import { z } from "zod";
37
+
38
+ // src/lib/attribution-resolve.ts
39
+ import { execFileSync } from "child_process";
40
+ function resolveModelFromEnvironment() {
41
+ const candidates = [
42
+ process.env.EXE_ATTRIBUTION_MODEL,
43
+ process.env.ANTHROPIC_MODEL,
44
+ process.env.CLAUDE_MODEL,
45
+ process.env.EXE_MODEL
46
+ ];
47
+ for (const candidate of candidates) {
48
+ const value = candidate?.trim();
49
+ if (value && !isPlaceholderIdentity(value)) return value;
50
+ }
51
+ return null;
52
+ }
53
+ function resolveRef(ref, cwd) {
54
+ try {
55
+ const out = execFileSync("git", ["rev-parse", "--verify", `${ref}^{commit}`], {
56
+ cwd,
57
+ encoding: "utf8",
58
+ timeout: 1e4
59
+ }).trim();
60
+ return /^[0-9a-f]{40}$/i.test(out) ? out : null;
61
+ } catch {
62
+ return null;
63
+ }
64
+ }
65
+ var MODEL_HELP = "Set ANTHROPIC_MODEL (employee sessions get it automatically at launch) or pass attribution_model explicitly. It is NOT guessed: a wrong model on the record is worse than no record at all, because it points at the wrong suspect.";
66
+ function resolveAttribution(purpose, input = {}) {
67
+ const stated = input.agent?.trim() ?? "";
68
+ let observed = "";
69
+ try {
70
+ observed = getActiveAgent().agentId?.trim() ?? "";
71
+ } catch {
72
+ observed = "";
73
+ }
74
+ let agent;
75
+ if (purpose === "verdict") {
76
+ const observedIsReal = observed !== "" && !isUnresolvedIdentity(observed);
77
+ if (observedIsReal && stated && stated.toLowerCase() !== observed.toLowerCase()) {
78
+ return {
79
+ ok: false,
80
+ code: "attribution_agent_conflict",
81
+ message: `Refused locally [attribution_agent_conflict]: attribution_agent was given as "${stated}", but this session resolves to "${observed}". A verdict is signed by whoever actually made it \u2014 attribution_agent is a fallback for a session that cannot observe its own identity (the MCP daemon), not a way to record the call under another employee's name. Omit attribution_agent to sign as "${observed}", or make the call from that employee's session.`
82
+ };
83
+ }
84
+ agent = observedIsReal ? observed : stated;
85
+ } else {
86
+ agent = stated || observed;
87
+ }
88
+ if (purpose === "verdict" && isUnresolvedIdentity(agent)) {
89
+ agent = "";
90
+ }
91
+ if (!agent) {
92
+ const message = purpose === "verdict" ? "Refused locally [attribution_agent_missing]: could not resolve which agent is producing this verdict, and it will not be invented. The MCP tools run in the launchd daemon, which carries no active-agent marker, no tmux session and no AGENT_ID, so the session identity is not observable from there. Pass attribution_agent with your own employee name exactly as it appears in the roster \u2014 never a role like 'admin'." : `Refused locally [attribution_agent_missing]: could not resolve which agent is producing this ${purpose}, and it will not be invented. Restore the active-agent marker or set AGENT_ID to your real employee name.`;
93
+ return {
94
+ ok: false,
95
+ code: "attribution_agent_missing",
96
+ // Every refusal out of this function names its machine-stable code in the message,
97
+ // including the ones below that come back from `assessAttribution`. A caller only
98
+ // ever sees the message, so a code that appears in some refusals and not others is
99
+ // a code the caller cannot rely on.
100
+ message
101
+ };
102
+ }
103
+ const model = input.model?.trim() || resolveModelFromEnvironment();
104
+ if (!model) {
105
+ return {
106
+ ok: false,
107
+ code: "attribution_model_missing",
108
+ message: `Refused locally [attribution_model_missing]: could not resolve which model is producing this record. ${MODEL_HELP}`
109
+ };
110
+ }
111
+ const observedAt = input.observed_at?.trim() || (/* @__PURE__ */ new Date()).toISOString();
112
+ const attribution = {
113
+ agent,
114
+ model,
115
+ observed_at: observedAt
116
+ };
117
+ if (purpose === "verdict") {
118
+ const repo = input.repo_path?.trim() || process.cwd();
119
+ const requested = input.evidence_ref?.trim() || "HEAD";
120
+ const resolved = resolveRef(requested, repo);
121
+ if (!resolved) {
122
+ return {
123
+ ok: false,
124
+ code: "attribution_evidence_ref_invalid",
125
+ message: `Refused locally [attribution_evidence_ref_invalid]: evidence_ref "${requested}" does not resolve to a commit in ${repo}. A verdict is only meaningful against a ref someone else can check out \u2014 name the commit you actually read; if the repository is wrong, pass repo_path for the repository that contains the commit.`
126
+ };
127
+ }
128
+ attribution.evidence_ref = resolved;
129
+ }
130
+ if (input.second_opinion_model || input.second_opinion_verdict) {
131
+ attribution.second_opinion = {
132
+ model: input.second_opinion_model?.trim() ?? "",
133
+ verdict: input.second_opinion_verdict ?? "confirmed"
134
+ };
135
+ }
136
+ const assessed = assessAttribution(attribution, purpose);
137
+ if (!assessed.ok) {
138
+ return { ok: false, code: assessed.code, message: `Refused locally [${assessed.code}]: ${assessed.message}` };
139
+ }
140
+ return { ok: true, attribution };
141
+ }
142
+
143
+ // src/lib/support-verification-input.ts
30
144
  function isVerifiedStatus(status) {
31
145
  return status === "fixed" || status === "closed";
32
146
  }
33
147
  var verificationArtifactInputSchema = {
34
- verification_kind: z.enum(["regression_test", "manual"]).optional().describe(
35
- "REQUIRED to set status=fixed or closed. 'regression_test' when you actually RAN a test that fails at the parent commit and passes at the fix. 'manual' when a named person reproduced the original defect and confirmed it is gone."
148
+ verification_kind: z.enum(["regression_test", "manual", "ops_transcript"]).optional().describe(
149
+ "REQUIRED to set status=fixed or closed (unless closing with a non-'fixed' disposition). 'regression_test' when you actually RAN a test that fails at the parent commit and passes at the fix. 'manual' when a named person reproduced the original defect and confirmed it is gone. 'ops_transcript' when the defect was settled by running commands against a live system and there is no commit (CI state, a VPS config edit, an ops confirmation)."
150
+ ),
151
+ defect_layer: z.enum(["production", "test_harness"]).optional().describe(
152
+ "Where the DEFECT lives. Omit for the normal case (production source). Declare 'test_harness' ONLY when the filed defect IS the test/harness \u2014 a flaky fixture, a leaked singleton, a test that spawns a hook wrong \u2014 so that a production diff would be the WRONG fix. This costs MORE evidence, not less: it additionally requires regression_test_id and reverted_result. It is NOT a way past a refused substance check; if your fix was supposed to change production code and did not, the honest answer is that it is not finished."
153
+ ),
154
+ reverted_result: z.enum(["fail", "pass", "error"]).optional().describe(
155
+ "defect_layer=test_harness only: the result you OBSERVED re-running the named test with the fix reverted. Must be 'fail' \u2014 a test-only diff that does not go red when removed evidences nothing."
156
+ ),
157
+ claim_type: z.enum(["point_in_time", "ongoing_state"]).optional().describe(
158
+ "ops_transcript only. 'point_in_time' for a fact true when observed (a config now routes correctly). 'ongoing_state' for a claim that a condition HOLDS (an agent is reporting, CI is green) \u2014 that requires at least two probes taken at two distinct times, because one sample cannot evidence a continuing condition."
159
+ ),
160
+ ops_probes: z.string().optional().describe(
161
+ `ops_transcript only. JSON array of probes, each {"command","output","host","ran_at"}. VERBATIM: the command as typed, its real output, the host/system it ran against, and an ISO timestamp. Summaries are refused \u2014 'checked the VPS and it looks fine' is not a probe.`
36
162
  ),
37
163
  fix_commit: supportCommitSchema.optional().describe("SHA of the merged commit containing the fix. Its diff is measured locally \u2014 a comment-only or test-only commit is refused."),
38
164
  repo_path: z.string().optional().describe("Absolute path to the repository containing fix_commit. Required when the fix landed outside the current working repo (e.g. exe-gateway, exe-crm). Defaults to the current directory."),
39
165
  regression_test_id: z.string().optional().describe("regression_test only: the test that detects the defect, e.g. 'tests/raw-event-backlog.test.ts::counts unprocessed events'."),
40
166
  parent_result: z.enum(["fail", "pass", "error"]).optional().describe("regression_test only: the result you OBSERVED running that test at the parent commit. Must be 'fail' \u2014 a test that already passed does not detect the defect."),
41
167
  fix_result: z.enum(["fail", "pass", "error"]).optional().describe("regression_test only: the result you OBSERVED running that test at the fix commit. Must be 'pass'."),
42
- verifier: z.string().optional().describe("manual only: the identity of the person or employee who confirmed the defect is gone. Checked server-side against the bug's filer and assignee \u2014 it may not be either. Placeholders ('me', 'agent') are refused."),
168
+ verifier: z.string().optional().describe("manual and ops_transcript: the identity of the person or employee who confirmed the defect is gone. Checked server-side against the bug's filer and assignee \u2014 it may not be either. Placeholders ('me', 'agent') are refused."),
169
+ disposition: z.enum(["fixed", "not_a_defect", "superseded", "wontfix"]).optional().describe(
170
+ "WHY the record is closing. Omit (or 'fixed') for the normal case: a defect was repaired, and a verification artifact is required. Use 'not_a_defect' when there was nothing to fix (a smoke-test record, a misfiled report), 'superseded' when another record covers it, 'wontfix' when it is a deliberate decline. Those three require NO fix_commit but DO require disposition_reason \u2014 and they are recorded as closed, not as fixed, because asserting a repair that never happened is its own kind of false record."
171
+ ),
172
+ disposition_reason: z.string().optional().describe(
173
+ "REQUIRED for any disposition other than 'fixed': what makes this record a non-defect. Explain the call \u2014 a bare label or a hedge is refused."
174
+ ),
175
+ superseded_by: z.string().optional().describe("REQUIRED for disposition='superseded': the id of the record that replaces this one, so the claim is checkable."),
176
+ superseded_coverage: z.string().optional().describe(
177
+ `REQUIRED for disposition='superseded': JSON array of {"id","evidence"} \u2014 one entry per declared symptom, each naming where the superseding record covers it. PARTIAL COVERAGE SUPERSEDES NOTHING: if the other record covers three of five symptoms, the honest outcome is to keep this record open with the two survivors as its remaining scope, not to close it. The refusal names the survivors.`
178
+ ),
179
+ symptoms: z.string().optional().describe(
180
+ `JSON array of the distinct defects this record claims, as ids or {"id"} objects. Required to close as 'superseded' so coverage can be checked one by one.`
181
+ ),
182
+ observed_at: z.string().optional().describe(
183
+ "ISO timestamp of when you actually READ the evidence. Defaults to now. Set it explicitly when the evidence was observed earlier than this call."
184
+ ),
185
+ evidence_ref: z.string().optional().describe(
186
+ "The git ref you read the evidence at (defaults to HEAD of repo_path, resolved locally and refused if it does not exist). main moves several times a day, so a verdict against an unnamed ref cannot be reproduced."
187
+ ),
188
+ attribution_agent: z.string().optional().describe(
189
+ "The employee identity producing this verdict \u2014 your own name as it appears in the roster. Normally OMITTED: it is resolved from the session's active-agent marker. Supply it when the call is made through the MCP daemon (which has no marker, no tmux and no AGENT_ID and would otherwise sign the record 'default') or from a harness. It is never guessed, and a role ('admin', 'agent', 'support') is refused \u2014 the whole point is that a verdict can be traced to someone."
190
+ ),
191
+ attribution_model: z.string().optional().describe(
192
+ "The model producing this verdict, e.g. 'claude-opus-5'. Normally OMITTED: it is read from ANTHROPIC_MODEL, which employee launches set automatically. Supply it only when the session carries no such variable \u2014 a session launched outside the employee router, or a harness. It is still never guessed: omit it with no environment model and the close is refused, naming the variable."
193
+ ),
194
+ second_opinion_model: z.string().optional().describe("Optional adversarial review: the OTHER model that checked this verdict. Must differ from the model producing it."),
195
+ second_opinion_verdict: z.enum(["confirmed", "refuted"]).optional().describe("Optional adversarial review: what the second model concluded. A 'refuted' verdict cannot be closed over."),
196
+ disposition_verifier: z.string().optional().describe(
197
+ "REQUIRED for disposition='not_a_defect' or 'superseded': a named identity, not the record's filer or assignee, who agrees that what was filed is not a defect. Same identity rule as a manual verification."
198
+ ),
43
199
  verification_method: z.string().optional().describe("manual only: how it was verified, in enough detail for someone else to repeat it."),
44
200
  verification_observation: z.string().optional().describe("manual only: what was observed that shows the DEFECT IS ABSENT \u2014 not what the change did. 'It is fixed' is refused."),
45
201
  delivery_proof: z.string().optional().describe('Optional JSON delivery declaration, e.g. {"channel":"npm","version":"0.9.364","tarball_shasum":"\u2026","fix_path_published":true}. Recorded, not required \u2014 delivery does not gate closing. A declaration that is present must still be true.')
46
202
  };
203
+ function buildVerdictAttribution(input) {
204
+ return resolveAttribution("verdict", {
205
+ agent: input.attribution_agent,
206
+ model: input.attribution_model,
207
+ observed_at: input.observed_at,
208
+ evidence_ref: input.evidence_ref,
209
+ repo_path: input.repo_path,
210
+ second_opinion_model: input.second_opinion_model,
211
+ second_opinion_verdict: input.second_opinion_verdict
212
+ });
213
+ }
47
214
  var NO_ARTIFACT_HELP = [
48
215
  "Refused locally: setting status=fixed or closed requires evidence that the defect is ABSENT.",
49
216
  "",
@@ -58,33 +225,94 @@ var NO_ARTIFACT_HELP = [
58
225
  "The fix commit's diff is measured from the repository; substance is never taken from the caller.",
59
226
  "If you have not verified the defect is absent, do not close it \u2014 record what you found with notes instead."
60
227
  ].join("\n");
228
+ var ATTRIBUTION_REQUIRED_HELP = [
229
+ "Refused locally [attribution_missing]: a close carries WHO made the call, with WHAT model, at WHICH commit \u2014 and it did not resolve here, so it will not be sent unattributed for the server to refuse with an opaque 422.",
230
+ "",
231
+ "Supply the parts that could not be resolved from this session:",
232
+ " attribution_agent \u2014 your real employee name (the MCP daemon has no session identity to read).",
233
+ " attribution_model \u2014 the model producing this verdict, e.g. 'claude-opus-5'.",
234
+ " evidence_ref / repo_path \u2014 the commit you actually read the evidence at, in the repo it lives in.",
235
+ "",
236
+ "None of these are guessed: a verdict signed with the wrong agent or model is a record pointing at the wrong suspect."
237
+ ].join("\n");
238
+ function assertVerdictAttribution(status, resolved) {
239
+ if (!isVerifiedStatus(status) || !resolved.ok || resolved.attribution) return { ok: true };
240
+ return { ok: false, message: ATTRIBUTION_REQUIRED_HELP };
241
+ }
61
242
  function resolveVerificationArtifact(status, input, context = {}) {
62
243
  if (!isVerifiedStatus(status)) return { ok: true };
244
+ const disposition = input.disposition ?? "fixed";
245
+ if (disposition !== "fixed") {
246
+ const assessed = assessDisposition(disposition, {
247
+ status: typeof status === "string" ? status : "closed",
248
+ disposition,
249
+ disposition_reason: input.disposition_reason,
250
+ superseded_by: input.superseded_by,
251
+ disposition_verifier: input.disposition_verifier,
252
+ superseded_coverage: input.superseded_coverage,
253
+ symptoms: input.symptoms,
254
+ context
255
+ });
256
+ if (!assessed.ok) return { ok: false, message: `Refused locally [${assessed.code}]: ${assessed.message}` };
257
+ const dispositionAttribution = buildVerdictAttribution(input);
258
+ if (!dispositionAttribution.ok) return { ok: false, message: dispositionAttribution.message };
259
+ return { ok: true, attribution: dispositionAttribution.attribution };
260
+ }
63
261
  if (!input.verification_kind && !input.fix_commit) {
64
262
  return { ok: false, message: NO_ARTIFACT_HELP };
65
263
  }
66
264
  if (!input.verification_kind) {
67
- return { ok: false, message: "verification_kind is required (regression_test or manual) when setting status=fixed or closed." };
265
+ return { ok: false, message: "verification_kind is required (regression_test, manual or ops_transcript) when setting status=fixed or closed." };
68
266
  }
69
- if (!input.fix_commit) {
267
+ if (!input.fix_commit && input.verification_kind !== "ops_transcript") {
70
268
  return { ok: false, message: "fix_commit is required when setting status=fixed or closed \u2014 the diff is measured, not described." };
71
269
  }
270
+ let probes;
271
+ if (input.verification_kind === "ops_transcript") {
272
+ const parsed = parseOpsProbes(input.ops_probes);
273
+ if (!parsed.ok) return { ok: false, message: parsed.message };
274
+ probes = parsed.probes;
275
+ }
72
276
  const request = {
73
277
  kind: input.verification_kind,
74
- fix_commit: input.fix_commit,
278
+ fix_commit: input.fix_commit ?? "",
75
279
  repo_path: input.repo_path?.trim() || process.cwd(),
76
280
  test_id: input.regression_test_id,
77
281
  parent_result: input.parent_result,
78
282
  fix_result: input.fix_result,
79
283
  verifier: input.verifier,
80
284
  method: input.verification_method,
81
- observation: input.verification_observation
285
+ observation: input.verification_observation,
286
+ defect_layer: input.defect_layer,
287
+ reverted_result: input.reverted_result,
288
+ claim_type: input.claim_type,
289
+ probes
82
290
  };
83
291
  const built = buildVerificationArtifact(request, context);
84
292
  if (!built.ok) {
85
293
  return { ok: false, message: `Refused locally [${built.code}]: ${built.message}` };
86
294
  }
87
- return { ok: true, artifact: built.artifact };
295
+ const attribution = buildVerdictAttribution(input);
296
+ if (!attribution.ok) return { ok: false, message: attribution.message };
297
+ return { ok: true, artifact: built.artifact, attribution: attribution.attribution };
298
+ }
299
+ function parseOpsProbes(raw) {
300
+ if (raw === void 0 || !raw.trim()) {
301
+ return {
302
+ ok: false,
303
+ message: "ops_probes is required for verification_kind='ops_transcript': a JSON array of {command, output, host, ran_at}, all verbatim."
304
+ };
305
+ }
306
+ let parsed;
307
+ try {
308
+ parsed = JSON.parse(raw);
309
+ } catch {
310
+ return { ok: false, message: "ops_probes must be valid JSON: an array of {command, output, host, ran_at}." };
311
+ }
312
+ if (!Array.isArray(parsed) || parsed.length === 0) {
313
+ return { ok: false, message: "ops_probes must be a non-empty JSON array of {command, output, host, ran_at}." };
314
+ }
315
+ return { ok: true, probes: parsed };
88
316
  }
89
317
  function parseDeliveryProof(raw) {
90
318
  if (raw === void 0 || !raw.trim()) return { ok: true };
@@ -336,8 +564,9 @@ function registerTriageBugReport(server) {
336
564
  },
337
565
  async ({ id, status, triage_notes, add_note, linked_task_id, linked_commit, fixed_version, product, ...verification }) => {
338
566
  const bugUrl = `${endpoint()}/${encodeURIComponent(sanitizeUpstreamId(id))}`;
567
+ const attestsByIdentity = verification.verification_kind === "manual" || verification.verification_kind === "ops_transcript" || verification.disposition !== void 0 && verification.disposition !== "fixed";
339
568
  let authorIdentities = [];
340
- if (isVerifiedStatus(status) && verification.verification_kind === "manual") {
569
+ if (isVerifiedStatus(status) && attestsByIdentity) {
341
570
  try {
342
571
  const row = await requestJson(bugUrl);
343
572
  authorIdentities = [row?.agent_id, row?.license_email];
@@ -348,6 +577,10 @@ function registerTriageBugReport(server) {
348
577
  if (!resolved.ok) {
349
578
  return { isError: true, content: [{ type: "text", text: resolved.message }] };
350
579
  }
580
+ const attribution = assertVerdictAttribution(status, resolved);
581
+ if (!attribution.ok) {
582
+ return { isError: true, content: [{ type: "text", text: attribution.message }] };
583
+ }
351
584
  const delivery = parseDeliveryProof(verification.delivery_proof);
352
585
  if (!delivery.ok) {
353
586
  return { isError: true, content: [{ type: "text", text: delivery.message }] };
@@ -363,7 +596,17 @@ function registerTriageBugReport(server) {
363
596
  fixed_version,
364
597
  product,
365
598
  verification_artifact: resolved.artifact,
366
- delivery_proof: delivery.value
599
+ delivery_proof: delivery.value,
600
+ // The disposition travels with the close: the server gates on it, and stores
601
+ // it so the record reads as "closed because there was nothing to fix" rather
602
+ // than as an unexplained close.
603
+ disposition: verification.disposition,
604
+ disposition_reason: verification.disposition_reason,
605
+ superseded_by: verification.superseded_by,
606
+ disposition_verifier: verification.disposition_verifier,
607
+ superseded_coverage: verification.superseded_coverage,
608
+ symptoms: verification.symptoms,
609
+ attribution: resolved.attribution
367
610
  }, "support-inbox:triage_bug")
368
611
  });
369
612
  const response = fixed_version && !status ? withStatusNotice(
@@ -521,7 +764,9 @@ function registerTriageReview(server) {
521
764
  }
522
765
 
523
766
  export {
767
+ resolveAttribution,
524
768
  verificationArtifactInputSchema,
769
+ assertVerdictAttribution,
525
770
  resolveVerificationArtifact,
526
771
  parseDeliveryProof,
527
772
  registerListBugReports,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  EXE_AI_DIR
3
- } from "./chunk-QMSEL5YS.js";
3
+ } from "./chunk-ZIG7VPJV.js";
4
4
 
5
5
  // src/lib/worker-gate.ts
6
6
  import { readdirSync, writeFileSync, unlinkSync, mkdirSync, existsSync, readFileSync } from "fs";
@@ -119,7 +119,7 @@ function releaseBackfillLock() {
119
119
  }
120
120
  async function getTaskAwareCapacity() {
121
121
  const { getClient } = await import("./lib/database.js");
122
- const { sessionScopeFilter } = await import("./task-scope-KXF7Y6KA.js");
122
+ const { sessionScopeFilter } = await import("./task-scope-ERVEUEYU.js");
123
123
  const client = getClient();
124
124
  const scope = sessionScopeFilter();
125
125
  const result = await client.execute({
@@ -1,34 +1,35 @@
1
1
  #!/usr/bin/env node
2
- import "./chunk-RIK5GRWI.js";
2
+ import "./chunk-LGS2V2XD.js";
3
3
  import {
4
4
  isGarbageEntity
5
- } from "./chunk-ZYCLSEZT.js";
6
- import "./chunk-Z6BZQHP5.js";
5
+ } from "./chunk-ULIBLJ6W.js";
7
6
  import "./chunk-GUMRIUI5.js";
7
+ import "./chunk-Z6BZQHP5.js";
8
8
  import "./chunk-VGMACSEV.js";
9
- import "./chunk-7UTJA6HF.js";
9
+ import "./chunk-VZAFWPAY.js";
10
10
  import "./chunk-CHCA3ZM2.js";
11
- import "./chunk-3F2UB4IQ.js";
11
+ import "./chunk-DN4YVV4Z.js";
12
12
  import {
13
13
  fastDbInit
14
- } from "./chunk-HR2R2QER.js";
14
+ } from "./chunk-M4IRPXSZ.js";
15
15
  import "./chunk-5MOYSU5A.js";
16
16
  import "./chunk-4QCFFW2H.js";
17
17
  import "./chunk-76CJBM36.js";
18
18
  import {
19
19
  getClient
20
- } from "./chunk-5DCCKHDY.js";
21
- import "./chunk-TKDITWDN.js";
20
+ } from "./chunk-TAMDAOCU.js";
22
21
  import "./chunk-BBMTVAE3.js";
22
+ import "./chunk-TKDITWDN.js";
23
23
  import "./chunk-5YEUPUV4.js";
24
- import "./chunk-UTDMTQNH.js";
24
+ import "./chunk-DSJI76XL.js";
25
25
  import "./chunk-YYB5PMTK.js";
26
26
  import "./chunk-NJFJWQNN.js";
27
27
  import "./chunk-V3W3SATA.js";
28
28
  import "./chunk-JY5GAZYC.js";
29
29
  import "./chunk-FXU7JOXK.js";
30
- import "./chunk-QMSEL5YS.js";
30
+ import "./chunk-ZIG7VPJV.js";
31
31
  import "./chunk-HSGBZSCA.js";
32
+ import "./chunk-RH4AH3YB.js";
32
33
  import {
33
34
  isMainModule
34
35
  } from "./chunk-6Y4B3QF6.js";
@@ -23,7 +23,7 @@ async function runCloudSyncCli() {
23
23
  const { getMasterKey } = await import("./lib/keychain.js");
24
24
  const { initSyncCrypto } = await import("./lib/crypto.js");
25
25
  const { assertCloudSyncReachable, withTimeout } = await import("./bin/exe-cloud.js");
26
- const { runCloudSyncShutdown } = await import("./cloud-sync-shutdown-Z4SBP6PL.js");
26
+ const { runCloudSyncShutdown } = await import("./cloud-sync-shutdown-BNALPWGX.js");
27
27
  const { disconnectClient } = await import("./lib/exe-daemon-client.js");
28
28
  let shuttingDown = false;
29
29
  const handleShutdown = (signal) => {
@@ -48,7 +48,7 @@ async function runCloudSyncCli() {
48
48
  const { initPostgresOnlyDatabase } = await import("./lib/database.js");
49
49
  await initPostgresOnlyDatabase();
50
50
  } else {
51
- const { initCloudSyncDatabase } = await import("./cloud-sync-db-init-JXUF6GI3.js");
51
+ const { initCloudSyncDatabase } = await import("./cloud-sync-db-init-V2LWIUQU.js");
52
52
  await initCloudSyncDatabase();
53
53
  }
54
54
  const masterKey = await getMasterKey();