@askexenow/exe-os 0.9.384 → 0.9.389

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 (481) hide show
  1. package/deploy/compose/.env.askexe-control-plane.example +6 -0
  2. package/deploy/compose/.env.customer.example +1 -1
  3. package/deploy/compose/.env.example +1 -1
  4. package/deploy/compose/docker-compose.yml +16 -0
  5. package/deploy/compose/generate-env.ts +1 -1
  6. package/deploy/compose/sso-edge/sso-redirect.conf +18 -3
  7. package/deploy/stack-manifests/v0.9.json +1160 -1
  8. package/dist/.dist-verified.json +3 -3
  9. package/dist/{active-agent-F5V4E4UL.js → active-agent-RZ24KSJN.js} +8 -6
  10. package/dist/{active-agent-YTBB4ZQM.js → active-agent-YWSWPIEA.js} +8 -6
  11. package/dist/{agent-defs-generator-7TFISIJQ.js → agent-defs-generator-GY3UBREJ.js} +8 -6
  12. package/dist/{agent-heartbeat-CQPGJIFF.js → agent-heartbeat-GUVUUQVM.js} +1 -1
  13. package/dist/{agent-loop-EZ7LDAGD.js → agent-loop-HPNCH3HK.js} +1 -1
  14. package/dist/{agentic-ontology-XVTUVV7W.js → agentic-ontology-RHYNXEKE.js} +1 -1
  15. package/dist/{artifact-backup-TF6YWQT2.js → artifact-backup-HGUFSIJH.js} +19 -6
  16. package/dist/{backfill-metadata-J6MXIDCW.js → backfill-metadata-XLFASEOD.js} +11 -9
  17. package/dist/{backup-verify-6DVBQMDP.js → backup-verify-TUQEICWA.js} +1 -1
  18. package/dist/{behavior-injection-XDA7ZCYN.js → behavior-injection-GXO7ERGN.js} +14 -12
  19. package/dist/{behavior-promotion-4VLQ7LXK.js → behavior-promotion-V63WIZ4N.js} +13 -11
  20. package/dist/{behaviors-SCCZP7RZ.js → behaviors-RMLDPLOF.js} +18 -11
  21. package/dist/bin/agentic-ontology-backfill.js +12 -10
  22. package/dist/bin/agentic-reflection-backfill.js +13 -11
  23. package/dist/bin/agentic-semantic-label.js +12 -10
  24. package/dist/bin/backfill-conversations.js +11 -9
  25. package/dist/bin/backfill-responses.js +11 -9
  26. package/dist/bin/backfill-vectors.js +13 -11
  27. package/dist/bin/bulk-sync-postgres.js +20 -18
  28. package/dist/bin/cc-doctor.js +15 -13
  29. package/dist/bin/cleanup-stale-review-tasks.js +44 -32
  30. package/dist/bin/cli.js +109 -30
  31. package/dist/bin/customer-readiness.js +55 -25
  32. package/dist/bin/deferred-daemon-restart.js +111 -108
  33. package/dist/bin/exe-actions.js +7 -1
  34. package/dist/bin/exe-agent-config.js +8 -6
  35. package/dist/bin/exe-agent.js +18 -16
  36. package/dist/bin/exe-assign.js +13 -11
  37. package/dist/bin/exe-boot.js +49 -47
  38. package/dist/bin/exe-call.js +9 -7
  39. package/dist/bin/exe-cicd.js +19 -8
  40. package/dist/bin/exe-cloud.js +59 -25
  41. package/dist/bin/exe-config-dump.js +8 -6
  42. package/dist/bin/exe-dispatch.js +23 -21
  43. package/dist/bin/exe-doctor.js +11 -8
  44. package/dist/bin/exe-export-behaviors.js +16 -14
  45. package/dist/bin/exe-forget.js +14 -12
  46. package/dist/bin/exe-gateway.js +12 -10
  47. package/dist/bin/exe-grant.js +6 -6
  48. package/dist/bin/exe-healthcheck.js +15 -13
  49. package/dist/bin/exe-heartbeat.js +28 -26
  50. package/dist/bin/exe-kill.js +28 -26
  51. package/dist/bin/exe-launch-agent.js +35 -33
  52. package/dist/bin/exe-mcp.js +9 -7
  53. package/dist/bin/exe-memory-reads.js +11 -9
  54. package/dist/bin/exe-new-employee.js +13 -11
  55. package/dist/bin/exe-os-mcp-proxy.js +9 -7
  56. package/dist/bin/exe-pending-messages.js +23 -21
  57. package/dist/bin/exe-pending-notifications.js +22 -20
  58. package/dist/bin/exe-pending-reviews.js +23 -21
  59. package/dist/bin/exe-preflight.js +1 -1
  60. package/dist/bin/exe-rename.js +9 -7
  61. package/dist/bin/exe-review.js +59 -55
  62. package/dist/bin/exe-search-quality.js +16 -3
  63. package/dist/bin/exe-search.js +13 -11
  64. package/dist/bin/exe-session-cleanup.js +29 -27
  65. package/dist/bin/exe-settings.js +22 -20
  66. package/dist/bin/exe-start-codex.js +23 -21
  67. package/dist/bin/exe-start-opencode.js +21 -19
  68. package/dist/bin/exe-status.js +24 -22
  69. package/dist/bin/exe-support.js +3 -3
  70. package/dist/bin/exe-team.js +8 -6
  71. package/dist/bin/exe-verify-running-images.js +644 -17
  72. package/dist/bin/git-sweep.js +24 -22
  73. package/dist/bin/graph-backfill.js +12 -10
  74. package/dist/bin/graph-export.js +12 -10
  75. package/dist/bin/hooks-cli.js +4 -4
  76. package/dist/bin/import-history.js +16 -14
  77. package/dist/bin/install.js +113 -110
  78. package/dist/bin/intercom-check.js +5 -5
  79. package/dist/bin/mcp-sessions.js +2 -2
  80. package/dist/bin/orchestration-metrics.js +8 -6
  81. package/dist/bin/postgres-agentic-reflection-backfill.js +2 -2
  82. package/dist/bin/postgres-agentic-semantic-backfill.js +1 -1
  83. package/dist/bin/pre-build-guard.js +55 -16
  84. package/dist/bin/pre-publish.js +1 -1
  85. package/dist/bin/prune-orphan-chunks.js +154 -28
  86. package/dist/bin/reconcile-backlog.js +5 -3
  87. package/dist/bin/registry-proxy.js +1 -1
  88. package/dist/bin/repair-document-chunks.js +11 -9
  89. package/dist/bin/scan-tasks.js +23 -21
  90. package/dist/bin/setup.js +3 -3
  91. package/dist/bin/shard-migrate.js +12 -10
  92. package/dist/bin/stack-update.js +622 -43
  93. package/dist/bin/verify-stack.js +2 -2
  94. package/dist/bin/vps-health-gate.js +1 -1
  95. package/dist/{boot-generation-Q7LGQ3AO.js → boot-generation-VCQXVYGT.js} +7 -5
  96. package/dist/{boot-review-sections-G5774FR5.js → boot-review-sections-3QO6Q7MP.js} +21 -19
  97. package/dist/{branch-hygiene-44WLSOZR.js → branch-hygiene-DDXXI6ZA.js} +59 -21
  98. package/dist/bug-landed-reconciler-TQVNOUCU.js +353 -0
  99. package/dist/build-manifest.json +1269 -1194
  100. package/dist/{capability-cards-I3RHCF4F.js → capability-cards-XPDLT6LU.js} +6 -4
  101. package/dist/{capacity-monitor-7I7GDONU.js → capacity-monitor-N3AW242L.js} +23 -21
  102. package/dist/{catchup-brief-3T5PARIR.js → catchup-brief-3PKX7FUP.js} +29 -27
  103. package/dist/{chunk-C5ISP5FO.js → chunk-2BKJAOO4.js} +11 -1
  104. package/dist/{chunk-JJTPPAZY.js → chunk-2CUQHG6H.js} +1609 -1356
  105. package/dist/{chunk-HU3VD4MQ.js → chunk-2Q2GGYBX.js} +1 -1
  106. package/dist/{chunk-CHIUS5QB.js → chunk-36LMIOVU.js} +9 -9
  107. package/dist/{chunk-46VSBDUW.js → chunk-3DCBDG4T.js} +2 -2
  108. package/dist/{chunk-W3KPQE7H.js → chunk-3GL3E4TD.js} +3 -3
  109. package/dist/{chunk-GL47M7NY.js → chunk-3UD3OF3X.js} +202 -117
  110. package/dist/{chunk-WNBZJSQT.js → chunk-3VW5ZP2F.js} +1 -1
  111. package/dist/{chunk-JDDM6C57.js → chunk-3X74IQBU.js} +1 -1
  112. package/dist/{chunk-NVFNADTX.js → chunk-3ZL4MDQ6.js} +18 -4
  113. package/dist/{chunk-R5E7WNAC.js → chunk-4ESNDGMB.js} +3 -3
  114. package/dist/{chunk-CYCIX7AW.js → chunk-4FLLIQRQ.js} +2 -2
  115. package/dist/{chunk-3RGTLZNO.js → chunk-4GAKF7KR.js} +99 -74
  116. package/dist/{chunk-RVO5O5SR.js → chunk-4S3A52AV.js} +38 -10
  117. package/dist/{chunk-7J2ZQ4XN.js → chunk-4VQ3QR6B.js} +29 -28
  118. package/dist/{chunk-MROSARM5.js → chunk-5BJBTFFQ.js} +7 -1
  119. package/dist/chunk-5LQZABW5.js +6 -0
  120. package/dist/chunk-5ONMHTNI.js +236 -0
  121. package/dist/{chunk-APL7HUE3.js → chunk-5QQJUO3F.js} +200 -31
  122. package/dist/{chunk-UOPCVFVR.js → chunk-5RK75SWH.js} +205 -278
  123. package/dist/{chunk-T5FEAQES.js → chunk-5TYJYGS5.js} +1 -1
  124. package/dist/{chunk-P3QQ52QK.js → chunk-5U6EOTZV.js} +3 -3
  125. package/dist/{chunk-ALRHGEAJ.js → chunk-637FL62O.js} +1 -1
  126. package/dist/{chunk-PUBA5B4M.js → chunk-6L4VIYLZ.js} +33 -19
  127. package/dist/{chunk-VF2KRROX.js → chunk-754P2UXM.js} +1 -1
  128. package/dist/{chunk-CM7N5MBY.js → chunk-7FZG7WP4.js} +5 -5
  129. package/dist/{chunk-NYLJQ2M2.js → chunk-7NEBFB3L.js} +4 -4
  130. package/dist/{chunk-E7C2WNR5.js → chunk-AEIOFFFX.js} +5 -5
  131. package/dist/{chunk-VOVFUKEB.js → chunk-AIB2EWO2.js} +5 -5
  132. package/dist/{chunk-EGOEB42T.js → chunk-AP2C4OGS.js} +3 -3
  133. package/dist/{chunk-MPZ2AVNS.js → chunk-ATNV3BVZ.js} +1 -1
  134. package/dist/{chunk-F4BBMIPG.js → chunk-B4XJQBQB.js} +2 -2
  135. package/dist/{chunk-BPVFZ6Q4.js → chunk-B5EGDNG6.js} +2 -2
  136. package/dist/{chunk-AGC2V7JS.js → chunk-B6CBN6EF.js} +1 -1
  137. package/dist/{chunk-KTKIFXIP.js → chunk-B7FDRN7G.js} +1 -1
  138. package/dist/{chunk-C5HUMAA7.js → chunk-B7WVYLAQ.js} +67 -15
  139. package/dist/chunk-BGVP5RMT.js +185 -0
  140. package/dist/{chunk-FVLNNNH6.js → chunk-BNI4LIU5.js} +35 -4
  141. package/dist/{chunk-P4XLIPB7.js → chunk-BU5JRLZT.js} +1 -1
  142. package/dist/{chunk-PHUHIVD5.js → chunk-C6U7XWOC.js} +34 -5
  143. package/dist/chunk-C7GHNJPW.js +8 -0
  144. package/dist/{chunk-4AR5XKCH.js → chunk-CL2MU3OX.js} +1 -1
  145. package/dist/{chunk-ZPP63JSQ.js → chunk-CL3AB7Z2.js} +1 -1
  146. package/dist/{chunk-FHIFTSPL.js → chunk-CP7XUSOF.js} +8 -3
  147. package/dist/{chunk-3OX34OC3.js → chunk-CUDNRHHT.js} +30 -10
  148. package/dist/chunk-CYUUNIEL.js +21 -0
  149. package/dist/{chunk-P2UY34XE.js → chunk-D4C57S2H.js} +5 -5
  150. package/dist/{chunk-XSUALA32.js → chunk-DDYFNBYV.js} +3 -3
  151. package/dist/{chunk-LSNBTGW4.js → chunk-DPYZW42H.js} +1 -1
  152. package/dist/{chunk-FMIYFHLE.js → chunk-E2PRXEZK.js} +9 -3
  153. package/dist/{chunk-L63V25HS.js → chunk-E54SPUYJ.js} +3 -3
  154. package/dist/{chunk-DMUOTCDN.js → chunk-E5CKRHIZ.js} +1 -1
  155. package/dist/{chunk-BV2IET6B.js → chunk-EVMOKRBC.js} +15 -2
  156. package/dist/{chunk-YLFCH3VA.js → chunk-FDWI3T6I.js} +133 -31
  157. package/dist/{chunk-PWC3C5ME.js → chunk-FNJTCJGY.js} +4 -4
  158. package/dist/{chunk-TNS63ATU.js → chunk-FWRPDSO3.js} +350 -50
  159. package/dist/{chunk-JA3Y5TV6.js → chunk-GDLB6BPM.js} +141 -74
  160. package/dist/{chunk-IGJMS7C5.js → chunk-GOVGG7HU.js} +2 -2
  161. package/dist/{chunk-MB47DRF5.js → chunk-GP7CTIUK.js} +2 -2
  162. package/dist/{chunk-L5EPGGDP.js → chunk-GWAN2BDB.js} +4 -4
  163. package/dist/{chunk-YRQ26MNP.js → chunk-H3YF7X4J.js} +12 -5
  164. package/dist/{chunk-VLBHZ6TF.js → chunk-H6PLIFUE.js} +2 -2
  165. package/dist/{chunk-GSLFH4AI.js → chunk-HRNM3N4Y.js} +6 -15
  166. package/dist/chunk-IG2ISRTF.js +48 -0
  167. package/dist/{chunk-MWEIBVBS.js → chunk-IJCWBYA5.js} +14 -1
  168. package/dist/{chunk-NKEFYE4R.js → chunk-IPTUKX3N.js} +1 -1
  169. package/dist/{chunk-RB3J2WYQ.js → chunk-IVE7H6KA.js} +1 -1
  170. package/dist/{chunk-HA63SH5W.js → chunk-IWY2OGQG.js} +1 -1
  171. package/dist/{chunk-BQEZPRUC.js → chunk-IZWMWJZT.js} +64 -46
  172. package/dist/{chunk-AHESD3KW.js → chunk-J4UVI652.js} +1 -1
  173. package/dist/{chunk-PLII76NJ.js → chunk-JBUCA4OX.js} +33 -6
  174. package/dist/{chunk-2PZTMSMG.js → chunk-JOF4HQDF.js} +5 -5
  175. package/dist/{chunk-OBBO6EJR.js → chunk-JQN3QGSF.js} +1 -1
  176. package/dist/{chunk-P4PIZOL2.js → chunk-JWYIH5DR.js} +3 -3
  177. package/dist/{chunk-3XY57PKT.js → chunk-KZLKE7I3.js} +210 -48
  178. package/dist/{chunk-DYVLEMKS.js → chunk-L3GXMYBK.js} +1 -1
  179. package/dist/{chunk-72V3S44T.js → chunk-LUA4SLJY.js} +46 -19
  180. package/dist/{chunk-ZT4LFTUJ.js → chunk-LW3JCBXP.js} +20 -3
  181. package/dist/{chunk-YLB365YX.js → chunk-M5XHN4OM.js} +3 -3
  182. package/dist/{chunk-VHHX4UCP.js → chunk-MDTWARSF.js} +22 -93
  183. package/dist/{chunk-JFJP6ATJ.js → chunk-MWKXQSF6.js} +3 -2
  184. package/dist/{chunk-VJEJ7JNB.js → chunk-N32DVIKY.js} +1 -1
  185. package/dist/{chunk-MUCNYSJP.js → chunk-NRLJOV7M.js} +32 -4
  186. package/dist/{chunk-PL4CFSQ7.js → chunk-NSXJOSH7.js} +1 -1
  187. package/dist/{chunk-NF5FOSLD.js → chunk-NVTG66CK.js} +1 -1
  188. package/dist/chunk-O45GBJEH.js +1500 -0
  189. package/dist/{chunk-4AAMFWJT.js → chunk-OHZSTZXN.js} +4 -2
  190. package/dist/chunk-OSIS7ZQW.js +344 -0
  191. package/dist/{chunk-E3ZM32LF.js → chunk-P22VFGFK.js} +14 -5
  192. package/dist/{chunk-KILR4FBR.js → chunk-PAFLR7WD.js} +3 -3
  193. package/dist/{chunk-R3CZWFFC.js → chunk-PEYQ6MWO.js} +15 -3
  194. package/dist/{chunk-RDWIKDMY.js → chunk-PZR54BEI.js} +8 -20
  195. package/dist/{chunk-2FKU4ZEO.js → chunk-QDBKMEYY.js} +9 -9
  196. package/dist/{chunk-7UHZBVP3.js → chunk-QDVLVLXP.js} +97 -31
  197. package/dist/{chunk-PRDDPQLC.js → chunk-QLXEQRHD.js} +5 -5
  198. package/dist/{chunk-MUAWCFW6.js → chunk-QNPDXV5V.js} +5 -2
  199. package/dist/{chunk-LR5O2XWZ.js → chunk-QUZYLDNJ.js} +5 -5
  200. package/dist/chunk-RBQUXHYK.js +48 -0
  201. package/dist/{chunk-3SUPEE6H.js → chunk-RDMBSHGG.js} +3 -3
  202. package/dist/{chunk-I5XIW2BP.js → chunk-RGUM474V.js} +7 -7
  203. package/dist/{chunk-OAFENIHN.js → chunk-RJ67XAJU.js} +76 -28
  204. package/dist/{chunk-LFUBEHFW.js → chunk-RT57D7C4.js} +39 -1
  205. package/dist/{chunk-MKM6D7JM.js → chunk-RWG7DLOG.js} +42 -5
  206. package/dist/{chunk-P3UX5EH4.js → chunk-RWKAHHIX.js} +3 -3
  207. package/dist/{chunk-XEBKIWI7.js → chunk-RYNT3HB7.js} +12 -12
  208. package/dist/{chunk-EUGEFBGV.js → chunk-S2V272KJ.js} +3 -3
  209. package/dist/{chunk-W6BZ4UGA.js → chunk-SGYEM2PD.js} +1 -1
  210. package/dist/{chunk-VROK4X2L.js → chunk-SJP57MQM.js} +1 -1
  211. package/dist/{chunk-5MVKTNZP.js → chunk-SL4JWAMQ.js} +54 -4
  212. package/dist/{chunk-MOANZQXF.js → chunk-SLMKLEU6.js} +1 -1
  213. package/dist/{chunk-RZN2LEAK.js → chunk-SQA7XCYI.js} +3 -3
  214. package/dist/{chunk-4YNA3CM6.js → chunk-SSFS4NCH.js} +262 -56
  215. package/dist/{chunk-6FIC57PH.js → chunk-T4P2G3PO.js} +1 -1
  216. package/dist/{chunk-5U2IJBFV.js → chunk-TA3B4N24.js} +1 -1
  217. package/dist/{chunk-ZOTTYCP5.js → chunk-TEWWBVQP.js} +40 -4
  218. package/dist/{chunk-SDYWZRPN.js → chunk-TLSFGXXE.js} +1 -1
  219. package/dist/{chunk-L3VUW5M4.js → chunk-TQS2YHLB.js} +1 -1
  220. package/dist/{chunk-KXYKSLW4.js → chunk-TU4M757W.js} +399 -116
  221. package/dist/{chunk-MC4IM2CC.js → chunk-TYD4F4XU.js} +6 -6
  222. package/dist/{chunk-TKS5GMYA.js → chunk-U44Y7RC7.js} +2 -0
  223. package/dist/{chunk-B7AMNZTC.js → chunk-UKBPEEEQ.js} +2 -2
  224. package/dist/{chunk-ZBPZDADW.js → chunk-UWVXQEQQ.js} +467 -78
  225. package/dist/{chunk-P2VVMGMI.js → chunk-V4WH3FV7.js} +35 -16
  226. package/dist/{worktree-ownership-guard-O6JQF2CL.js → chunk-V6F4I2XY.js} +13 -14
  227. package/dist/{chunk-JFTUAV4J.js → chunk-VBKUESIW.js} +1 -1
  228. package/dist/{chunk-AZSTIAVL.js → chunk-VBPYYJPC.js} +1 -1
  229. package/dist/{chunk-LKTN22L6.js → chunk-VIP4LKLO.js} +57 -24
  230. package/dist/{chunk-L5CGXEZC.js → chunk-WAAGVFFN.js} +63 -71
  231. package/dist/{chunk-D3LXVAIQ.js → chunk-WC7AE3PT.js} +244 -103
  232. package/dist/{chunk-EOTZSAQL.js → chunk-WUCUDHKR.js} +1 -1
  233. package/dist/{chunk-VF3BZOZK.js → chunk-X7HZHKY4.js} +50 -3
  234. package/dist/{chunk-LFBLQE2P.js → chunk-XCAKYVKI.js} +1 -1
  235. package/dist/{chunk-UXN4BICC.js → chunk-XMX5J52Z.js} +1 -1
  236. package/dist/{chunk-6YDY6ZTD.js → chunk-XTCXGWTV.js} +9 -4
  237. package/dist/{chunk-XUZK23V7.js → chunk-XW2FW6LS.js} +2 -2
  238. package/dist/{chunk-CH7BUBP3.js → chunk-XWVHUDEK.js} +5 -4
  239. package/dist/{chunk-S26CV7BE.js → chunk-YA5LK6KB.js} +45 -8
  240. package/dist/{chunk-ELCRJGCH.js → chunk-YMRQIENV.js} +2 -2
  241. package/dist/{chunk-QNZ4562V.js → chunk-Z3LXWCB7.js} +1 -1
  242. package/dist/{chunk-EYMFVITZ.js → chunk-Z7I6NQMA.js} +2 -2
  243. package/dist/{chunk-6BJCDWSM.js → chunk-ZB4FS2EG.js} +1 -1
  244. package/dist/{chunk-ZAEUEDTN.js → chunk-ZD6FZ3WL.js} +1 -1
  245. package/dist/{chunk-FEU6QEEL.js → chunk-ZM6EZAVY.js} +1 -0
  246. package/dist/{chunk-2KY7WZZF.js → chunk-ZPA4R2UI.js} +1 -1
  247. package/dist/chunk-ZPPPHVSU.js +285 -0
  248. package/dist/{chunk-ELEGH4DX.js → chunk-ZUGQPYUY.js} +51 -4
  249. package/dist/{chunk-UX2EO653.js → chunk-ZZWFZ46U.js} +66 -8
  250. package/dist/{cleanup-graph-garbage-VQAJ2RBT.js → cleanup-graph-garbage-HFUD5ZQT.js} +12 -10
  251. package/dist/{cloud-sync-command-J7NEFUY7.js → cloud-sync-command-3JHJJKPN.js} +25 -3
  252. package/dist/{cloud-sync-db-init-KWEMNMGA.js → cloud-sync-db-init-2LHIQOSF.js} +1 -1
  253. package/dist/{cloud-sync-shutdown-P63AUTUI.js → cloud-sync-shutdown-ZXAXA3Z7.js} +6 -4
  254. package/dist/{cloud-sync-state-QF3TMMJ4.js → cloud-sync-state-VSQFGPP6.js} +1 -1
  255. package/dist/{co-activation-7IHRPBZN.js → co-activation-NX4EH4AP.js} +6 -4
  256. package/dist/{co-occurrence-R5AG4OAU.js → co-occurrence-5LBYCW3U.js} +10 -8
  257. package/dist/{consent-passphrase-5ZBDJ5G7.js → consent-passphrase-65W3DJIJ.js} +2 -2
  258. package/dist/{content-extractor-ZLXC6GNR.js → content-extractor-OGXETBOX.js} +2 -2
  259. package/dist/{conversation-entity-extractor-7FRKLLBD.js → conversation-entity-extractor-FQCOAH4F.js} +5 -4
  260. package/dist/conversations-retention-XTBFJBUM.js +166 -0
  261. package/dist/{crdt-sync-IFRZOEIS.js → crdt-sync-7TDUBTLH.js} +4 -4
  262. package/dist/{crm-webhook-L2S63ASV.js → crm-webhook-776JTY55.js} +2 -2
  263. package/dist/{cto-delegation-gate-3WU7OHX7.js → cto-delegation-gate-ZNUWVYCN.js} +25 -23
  264. package/dist/{daemon-orchestration-3VQYKLOR.js → daemon-orchestration-76BOFDEP.js} +30 -24
  265. package/dist/{doc-graph-extractor-YIR5E7OF.js → doc-graph-extractor-F724KZJX.js} +10 -8
  266. package/dist/{documents-QEHPTYIY.js → documents-Q24V4GRD.js} +13 -11
  267. package/dist/{dreaming-LNFE7DTN.js → dreaming-IY6NQTSP.js} +27 -25
  268. package/dist/{employee-boot-brief-ZTXDYNWM.js → employee-boot-brief-CCTXO5DQ.js} +35 -29
  269. package/dist/{entity-boost-R5N6JWXD.js → entity-boost-XGOB7HDM.js} +1 -1
  270. package/dist/{exe-drift-WYSJVZFO.js → exe-drift-NEPXLNGP.js} +7 -5
  271. package/dist/{exe-export-GOLNAEAV.js → exe-export-ZHJQFKR2.js} +14 -12
  272. package/dist/{exe-import-U4BSI6OH.js → exe-import-7SVNI4FW.js} +14 -12
  273. package/dist/{exe-key-V42G3NGO.js → exe-key-QJKU56WZ.js} +119 -108
  274. package/dist/{exe-org-U4GLQ6OP.js → exe-org-SJXHLV6K.js} +76 -51
  275. package/dist/{exe-snapshot-U7ONBYNY.js → exe-snapshot-EFWPXTXE.js} +45 -36
  276. package/dist/{fast-db-init-W3NGKAEU.js → fast-db-init-BQZOQNT3.js} +1 -1
  277. package/dist/{founder-context-ZSIBRVDM.js → founder-context-KG2ZAOXY.js} +2 -2
  278. package/dist/{founder-monitor-envelope-L3IWZLFY.js → founder-monitor-envelope-NYB5LLU4.js} +4 -4
  279. package/dist/gateway/index.js +20 -18
  280. package/dist/{gateway-client-DJFCVIPT.js → gateway-client-ODMUXUL3.js} +1 -1
  281. package/dist/{git-staleness-OF24QXFZ.js → git-staleness-OPGEAJA7.js} +6 -4
  282. package/dist/{global-procedures-WSIOWO43.js → global-procedures-3KXY4LL6.js} +8 -6
  283. package/dist/{graph-auto-extract-IEVVN3L3.js → graph-auto-extract-I7H2F5NJ.js} +10 -8
  284. package/dist/{graph-query-JDZWAVCU.js → graph-query-E7JBSNY5.js} +1 -1
  285. package/dist/{graph-rag-BKAD2XQA.js → graph-rag-H24CMFP2.js} +5 -4
  286. package/dist/{hook-integrity-TPWDGX2M.js → hook-integrity-PGQ3OX4S.js} +1 -1
  287. package/dist/{hook-prefetch-FD6VGJJA.js → hook-prefetch-7AZJER6Z.js} +23 -21
  288. package/dist/hook-registration-liveness-NGQRFKAA.js +11 -0
  289. package/dist/hooks/bug-report-worker.js +26 -24
  290. package/dist/hooks/codex-stop-task-finalizer.js +28 -26
  291. package/dist/hooks/commit-complete.js +26 -24
  292. package/dist/hooks/error-recall.js +16 -14
  293. package/dist/hooks/exe-heartbeat-hook.js +9 -7
  294. package/dist/hooks/ingest-worker.js +12 -10
  295. package/dist/hooks/ingest.js +22 -17
  296. package/dist/hooks/instructions-loaded.js +11 -9
  297. package/dist/hooks/manifest.json +20 -20
  298. package/dist/hooks/notification.js +10 -8
  299. package/dist/hooks/post-compact.js +9 -7
  300. package/dist/hooks/post-tool-combined.js +14 -14
  301. package/dist/hooks/pre-compact.js +26 -24
  302. package/dist/hooks/pre-tool-use.js +2 -2
  303. package/dist/hooks/prompt-submit.js +47 -41
  304. package/dist/hooks/session-end.js +38 -42
  305. package/dist/hooks/session-start.js +26 -18
  306. package/dist/hooks/stop.js +29 -27
  307. package/dist/hooks/subagent-stop.js +29 -27
  308. package/dist/hooks/summary-worker.js +32 -30
  309. package/dist/index.js +37 -35
  310. package/dist/{installer-OTI5SA43.js → installer-2ZS3LHCU.js} +12 -9
  311. package/dist/{installer-NMOBSEZ2.js → installer-NH3A3HWC.js} +14 -9
  312. package/dist/{installer-SRJGE4GU.js → installer-UJ73PGRD.js} +21 -9
  313. package/dist/{intercom-queue-4FFXCBHO.js → intercom-queue-OE25GJF2.js} +21 -19
  314. package/dist/lib/agent-config.js +2 -2
  315. package/dist/lib/cloud-sync.js +24 -18
  316. package/dist/lib/consolidation.js +13 -11
  317. package/dist/lib/crypto.js +3 -3
  318. package/dist/lib/database.js +6 -4
  319. package/dist/lib/db-backup.js +1 -1
  320. package/dist/lib/db-write-worker-client.js +3 -1
  321. package/dist/lib/db-write-worker.js +65 -89
  322. package/dist/lib/db.js +6 -4
  323. package/dist/lib/delivery-truth.js +5 -1
  324. package/dist/lib/device-registry.js +1 -1
  325. package/dist/lib/embedder.js +2 -2
  326. package/dist/lib/employee-templates.js +9 -7
  327. package/dist/lib/employees.js +6 -4
  328. package/dist/lib/exe-daemon.js +425 -314
  329. package/dist/lib/file-grep.js +15 -21
  330. package/dist/lib/hybrid-search.js +19 -13
  331. package/dist/lib/identity-templates.js +1 -1
  332. package/dist/lib/identity.js +6 -4
  333. package/dist/lib/keychain.js +1 -1
  334. package/dist/lib/license.js +22 -6
  335. package/dist/lib/messaging.js +22 -20
  336. package/dist/lib/post-tool-memory.js +10 -8
  337. package/dist/lib/registry-proxy.js +1 -1
  338. package/dist/lib/reminders.js +7 -5
  339. package/dist/lib/runtime-table.js +1 -1
  340. package/dist/lib/schedules.js +12 -10
  341. package/dist/lib/session-registry.js +8 -6
  342. package/dist/lib/skill-learning.js +13 -11
  343. package/dist/lib/status-brief.js +2 -2
  344. package/dist/lib/store.js +17 -9
  345. package/dist/lib/task-router.js +7 -5
  346. package/dist/lib/tasks.js +23 -21
  347. package/dist/lib/tmux-routing.js +21 -19
  348. package/dist/lib/tmux-status.js +4 -1
  349. package/dist/lib/token-spend.js +7 -5
  350. package/dist/lib/ws-client.js +1 -1
  351. package/dist/{license-gate-R4JWTWM4.js → license-gate-XQ2KN5I5.js} +3 -3
  352. package/dist/{license-recheck-3MBJ4IJX.js → license-recheck-IIBKR2V5.js} +1 -1
  353. package/dist/{license-sync-BVSG3WMW.js → license-sync-76JVI2M5.js} +151 -8
  354. package/dist/{local-secret-inventory-JWNBHZZ4.js → local-secret-inventory-MJT7NJLY.js} +2 -2
  355. package/dist/{mailbox-inbox-MTAT4MXX.js → mailbox-inbox-BPZP4GIZ.js} +1 -1
  356. package/dist/maintenance-worker-54VZTFIK.js +371 -0
  357. package/dist/mcp/register-tools.js +110 -107
  358. package/dist/mcp/server.js +113 -110
  359. package/dist/mcp/tools/complete-reminder.js +8 -6
  360. package/dist/mcp/tools/create-reminder.js +8 -6
  361. package/dist/mcp/tools/create-task.js +26 -24
  362. package/dist/mcp/tools/deactivate-behavior.js +15 -13
  363. package/dist/mcp/tools/list-reminders.js +8 -6
  364. package/dist/mcp/tools/list-tasks.js +26 -24
  365. package/dist/mcp/tools/send-message.js +25 -23
  366. package/dist/mcp/tools/update-task.js +24 -22
  367. package/dist/{mcp-child-registry-TIZERM7O.js → mcp-child-registry-5VUG5ATZ.js} +1 -1
  368. package/dist/{mcp-http-config-VUMSFWFH.js → mcp-http-config-SKXESWHA.js} +9 -7
  369. package/dist/{mcp-session-identity-DZHWEJRV.js → mcp-session-identity-HYMLJXXA.js} +21 -19
  370. package/dist/{memory-cards-JVXTMSAT.js → memory-cards-PAZDUQ3B.js} +16 -32
  371. package/dist/{memory-graph-extractor-PPBJMYFJ.js → memory-graph-extractor-BC6QKBY6.js} +11 -9
  372. package/dist/{memory-poisoning-defense-K5Q74XQ4.js → memory-poisoning-defense-BRGIHF6J.js} +9 -7
  373. package/dist/{memory-pressure-watchdog-YMJH5CSA.js → memory-pressure-watchdog-HR6TPOMT.js} +22 -20
  374. package/dist/{memory-reflection-7BZWIHRE.js → memory-reflection-LO7VFBL3.js} +38 -59
  375. package/dist/memory-write-repository-J25USX63.js +16 -0
  376. package/dist/{monitor-grants-Q7X3MYQP.js → monitor-grants-YQTO6NWR.js} +3 -3
  377. package/dist/{monitor-identity-ZQB4IXEE.js → monitor-identity-POVTG76Y.js} +2 -2
  378. package/dist/{notification-ledger-XRAXL5OI.js → notification-ledger-KLD6GZTG.js} +22 -20
  379. package/dist/{notifications-JE3PX55X.js → notifications-3R6HNHDR.js} +21 -19
  380. package/dist/{orchestration-events-JCQ5F5IJ.js → orchestration-events-CHY3GOJD.js} +7 -5
  381. package/dist/{orchestrator-X65INDTR.js → orchestrator-GAL3HOAD.js} +23 -21
  382. package/dist/{org-brief-session-3PQ22UIX.js → org-brief-session-LQ2DBYVF.js} +17 -15
  383. package/dist/{org-consent-policy-VGELJ7K7.js → org-consent-policy-KFUP7QPG.js} +5 -5
  384. package/dist/{org-join-6TO5ZYUZ.js → org-join-MXZCIQWX.js} +8 -8
  385. package/dist/{org-key-admin-XHYVRRAZ.js → org-key-admin-4UK6QUT7.js} +9 -9
  386. package/dist/{org-key-pin-TTTYGTQL.js → org-key-pin-ZOX4OM3O.js} +3 -3
  387. package/dist/{org-membership-Y7T2BS57.js → org-membership-D5TPN45F.js} +4 -4
  388. package/dist/{org-partner-config-OP4NEUNF.js → org-partner-config-3FXSYPQA.js} +7 -7
  389. package/dist/{org-partner-runtime-YNVUNT2R.js → org-partner-runtime-TH3LMPII.js} +20 -16
  390. package/dist/{org-row-visibility-JBBXNYXD.js → org-row-visibility-Y5R33C5U.js} +1 -1
  391. package/dist/{pipeline-router-EIBB7QNG.js → pipeline-router-E2JZLDK6.js} +7 -5
  392. package/dist/{plan-limits-MEWXYLEN.js → plan-limits-NYI6R4IK.js} +9 -7
  393. package/dist/{platform-procedures-Z7ZGBJWN.js → platform-procedures-RTD5E3BD.js} +5 -3
  394. package/dist/{pre-tool-use-impl-C6KJY22W.js → pre-tool-use-impl-LT4FRXBP.js} +127 -83
  395. package/dist/{project-boot-VEYFCCSL.js → project-boot-LIMXQKAF.js} +25 -17
  396. package/dist/{project-name-UYORSNGE.js → project-name-V62GWALX.js} +7 -5
  397. package/dist/{projection-worker-WYFDWS57.js → projection-worker-KLE3IZQ2.js} +5 -2
  398. package/dist/{prospective-memory-E6XBQFJA.js → prospective-memory-HRN7JFT2.js} +6 -4
  399. package/dist/{push-notifications-M7YU63FY.js → push-notifications-XC6EQEXF.js} +22 -20
  400. package/dist/{reproject-worktree-memories-B5XMGJSD.js → reproject-worktree-memories-4CAVZSFE.js} +21 -19
  401. package/dist/{reranker-SRA4BR7N.js → reranker-2RU6IIX2.js} +1 -1
  402. package/dist/{retrieval-health-P2JPZUPV.js → retrieval-health-4Q5TOV2S.js} +1 -1
  403. package/dist/{review-polling-KQPN7IQE.js → review-polling-WOWIMBCL.js} +22 -20
  404. package/dist/runtime/index.js +30 -28
  405. package/dist/{session-events-6LDDKKY3.js → session-events-OPMS2C5F.js} +22 -20
  406. package/dist/{session-kill-telemetry-5DSRGWCL.js → session-kill-telemetry-3GWATSIX.js} +22 -20
  407. package/dist/{session-scope-XG5R3P3D.js → session-scope-TIRGR4MH.js} +21 -19
  408. package/dist/{setup-wizard-7QFLZIKT.js → setup-wizard-B2JBVGNH.js} +3 -3
  409. package/dist/{shard-manager-HHHHV2KZ.js → shard-manager-C7LYX6E4.js} +5 -1
  410. package/dist/{skill-refinement-I5RMAHSC.js → skill-refinement-FWQFYNBI.js} +7 -5
  411. package/dist/skill-retrieval-PPLFC5RY.js +166 -0
  412. package/dist/skill-usage-NDB67PU2.js +25 -0
  413. package/dist/{stack-generate-manifest-AKMZ3AUX.js → stack-generate-manifest-AXI55MEQ.js} +6 -6
  414. package/dist/{stack-promote-34CE2HHF.js → stack-promote-6N23OGZY.js} +6 -6
  415. package/dist/stack-release-2CXFYVWM.js +2770 -0
  416. package/dist/{stack-update-ZQQ5YYPJ.js → stack-update-U53FBVCQ.js} +13 -5
  417. package/dist/{steward-gate-AQJ6KT2C.js → steward-gate-TUA3QCN7.js} +7 -5
  418. package/dist/{subagent-brief-injection-3GU7YAWY.js → subagent-brief-injection-N52RWYFZ.js} +34 -32
  419. package/dist/{subagent-spawn-ledger-52I66CLW.js → subagent-spawn-ledger-OI23OT4I.js} +1 -1
  420. package/dist/support-bug-actions-XWCJI6S5.js +30 -0
  421. package/dist/support-inbox-MMVTCXRX.js +77 -0
  422. package/dist/{support-outbox-KNI3FR3G.js → support-outbox-2TG2UV6J.js} +2 -2
  423. package/dist/{task-enforcement-CAA6D2MH.js → task-enforcement-JDMBAAOY.js} +22 -20
  424. package/dist/{task-request-inbox-QBZVU66E.js → task-request-inbox-PKJCYKJV.js} +9 -5
  425. package/dist/{task-scope-NHXB4ZRN.js → task-scope-32HQEV6W.js} +27 -19
  426. package/dist/{tasks-crud-JHSWL5NM.js → tasks-crud-CYKUKS3F.js} +21 -19
  427. package/dist/{tasks-notify-7PBE4U7T.js → tasks-notify-YND5MKWJ.js} +22 -20
  428. package/dist/{tasks-review-PPPVEE62.js → tasks-review-CG2A5GM3.js} +23 -19
  429. package/dist/{telemetry-upload-YU2VRNHX.js → telemetry-upload-WLUMEFAB.js} +11 -9
  430. package/dist/{token-budget-QCMWKG3K.js → token-budget-3YHAY5LL.js} +7 -5
  431. package/dist/{tool-capability-index-7AWQAJRP.js → tool-capability-index-2ADOWH43.js} +2 -2
  432. package/dist/{tool-gates-5Q3RSQEG.js → tool-gates-7ENOOYMR.js} +5 -3
  433. package/dist/{tool-gates-QD26D2NE.js → tool-gates-EKJTLVGN.js} +1 -1
  434. package/dist/{tool-telemetry-LTOIC64I.js → tool-telemetry-VUP7S6HC.js} +1 -1
  435. package/dist/tui/App.js +59 -35
  436. package/dist/{tui-data-NDBXD6U7.js → tui-data-BOQTOW2G.js} +25 -23
  437. package/dist/{update-support-BMJM4NG7.js → update-support-WT3S3AQ4.js} +21 -21
  438. package/dist/{whatsapp-QQLDAHUX.js → whatsapp-OZGIF2EM.js} +2 -2
  439. package/dist/{wiki-acl-W6WDCVCP.js → wiki-acl-LTEQJVDA.js} +1 -1
  440. package/dist/{work-claims-6DM32MGO.js → work-claims-CMV2GWIW.js} +8 -6
  441. package/dist/{work-state-heartbeat-HG7D4AWJ.js → work-state-heartbeat-S45TXK4M.js} +1 -1
  442. package/dist/{worker-gate-FTMW7GBB.js → worker-gate-7Z6NMM3G.js} +1 -1
  443. package/dist/{workflow-engine-ZWC6CCXE.js → workflow-engine-ZSQDXZQ7.js} +2 -2
  444. package/dist/{worktree-EMQCPGFE.js → worktree-NMWDVT6N.js} +8 -6
  445. package/dist/worktree-ownership-guard-ZVIWJAOP.js +35 -0
  446. package/dist/{worktree-sweep-XVUJZBXV.js → worktree-sweep-Q62ZIT3U.js} +9 -7
  447. package/package.json +14 -8
  448. package/release-notes.json +7 -41
  449. package/src/commands/exe/afk.md +6 -0
  450. package/src/commands/exe/call.md +6 -0
  451. package/src/commands/exe/employee-heartbeat.md +6 -0
  452. package/src/commands/exe/intercom.md +6 -0
  453. package/src/commands/exe/kill.md +6 -0
  454. package/src/commands/exe/launch.md +6 -0
  455. package/src/commands/exe/logs.md +1 -1
  456. package/src/commands/exe/sessions.md +6 -0
  457. package/src/commands/exe/setup.md +7 -3
  458. package/src/commands/exe/status.md +6 -0
  459. package/src/commands/exe-reference.md +25 -36
  460. package/src/commands/exe.md +19 -28
  461. package/stack.release.json +11 -11
  462. package/dist/chunk-3B6FLNLV.js +0 -30
  463. package/dist/chunk-FXU7JOXK.js +0 -6
  464. package/dist/chunk-QFAFKEB5.js +0 -820
  465. package/dist/conversations-retention-C4BLKFEL.js +0 -54
  466. package/dist/stack-release-5PGWV5D4.js +0 -1607
  467. package/dist/support-inbox-NY5TB3FN.js +0 -51
  468. /package/dist/{chunk-U2D6PJ5T.js → chunk-65G7ZTGE.js} +0 -0
  469. /package/dist/{chunk-DN3ZR3UE.js → chunk-CP7Z35MJ.js} +0 -0
  470. /package/dist/{chunk-XDVOGDBC.js → chunk-KBBWALJV.js} +0 -0
  471. /package/dist/{chunk-JRIH6I7D.js → chunk-LZXYPTY4.js} +0 -0
  472. /package/dist/{chunk-GIRD7O5X.js → chunk-MCWEW2SG.js} +0 -0
  473. /package/dist/{chunk-TKAU7IJ2.js → chunk-MQHUJLCA.js} +0 -0
  474. /package/dist/{chunk-M4XY4JRK.js → chunk-O53LTOXK.js} +0 -0
  475. /package/dist/{chunk-DZN7SDY2.js → chunk-OSVTH3SG.js} +0 -0
  476. /package/dist/{chunk-AJK2PVQW.js → chunk-QXXEXGX3.js} +0 -0
  477. /package/dist/{chunk-AWWDKF22.js → chunk-SFWNTO2F.js} +0 -0
  478. /package/dist/{chunk-2Q2CD6CD.js → chunk-WC5HF2FN.js} +0 -0
  479. /package/dist/{core-memory-O6D5UC3T.js → core-memory-MMMW3TF3.js} +0 -0
  480. /package/dist/{memory-isolation-EBFFC6HF.js → memory-isolation-67ACKQ2M.js} +0 -0
  481. /package/dist/{oauth-server-ZKBUHDFI.js → oauth-server-OILIKR7D.js} +0 -0
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-MMS2HBRT.js";
4
4
 
5
5
  // src/lib/worker-gate.ts
6
- import { readdirSync, writeFileSync, unlinkSync, mkdirSync, existsSync, readFileSync } from "fs";
6
+ import { readdirSync, writeFileSync, unlinkSync, mkdirSync, readFileSync } from "fs";
7
7
  import path from "path";
8
8
  import { totalmem, cpus } from "os";
9
9
  var WORKER_PID_DIR = path.join(EXE_AI_DIR, "worker-pids");
@@ -15,11 +15,31 @@ function computeMaxWorkers() {
15
15
  return Math.max(2, Math.min(8, Math.min(byRam, byCpu)));
16
16
  }
17
17
  var MAX_CONCURRENT_WORKERS = process.env.EXE_MAX_WORKERS ? Math.max(1, parseInt(process.env.EXE_MAX_WORKERS, 10) || 3) : computeMaxWorkers();
18
+ function errnoOf(err) {
19
+ return err?.code;
20
+ }
21
+ function describe(err) {
22
+ const code = errnoOf(err);
23
+ const msg = err instanceof Error ? err.message : String(err);
24
+ return code ? `${code}: ${msg}` : msg;
25
+ }
26
+ function pidLiveness(pid) {
27
+ try {
28
+ process.kill(pid, 0);
29
+ return true;
30
+ } catch (err) {
31
+ const code = errnoOf(err);
32
+ if (code === "ESRCH") return false;
33
+ if (code === "EPERM") return true;
34
+ return null;
35
+ }
36
+ }
18
37
  function tryAcquireWorkerSlot() {
38
+ let reservationPath = null;
19
39
  try {
20
40
  mkdirSync(WORKER_PID_DIR, { recursive: true });
21
41
  const reservationId = `res-${process.pid}-${Date.now()}`;
22
- const reservationPath = path.join(WORKER_PID_DIR, `${reservationId}.pid`);
42
+ reservationPath = path.join(WORKER_PID_DIR, `${reservationId}.pid`);
23
43
  writeFileSync(reservationPath, String(process.pid));
24
44
  const files = readdirSync(WORKER_PID_DIR);
25
45
  let alive = 0;
@@ -29,14 +49,13 @@ function tryAcquireWorkerSlot() {
29
49
  const resParts = f.replace(".pid", "").split("-");
30
50
  const resPid = parseInt(resParts[1] ?? "", 10);
31
51
  if (!isNaN(resPid) && resPid > 0) {
32
- try {
33
- process.kill(resPid, 0);
34
- alive++;
35
- } catch {
52
+ if (pidLiveness(resPid) === false) {
36
53
  try {
37
54
  unlinkSync(path.join(WORKER_PID_DIR, f));
38
55
  } catch {
39
56
  }
57
+ } else {
58
+ alive++;
40
59
  }
41
60
  } else {
42
61
  alive++;
@@ -46,14 +65,13 @@ function tryAcquireWorkerSlot() {
46
65
  const dashIdx = f.lastIndexOf("-");
47
66
  const pid = parseInt(f.slice(dashIdx + 1).replace(".pid", ""), 10);
48
67
  if (isNaN(pid)) continue;
49
- try {
50
- process.kill(pid, 0);
51
- alive++;
52
- } catch {
68
+ if (pidLiveness(pid) === false) {
53
69
  try {
54
70
  unlinkSync(path.join(WORKER_PID_DIR, f));
55
71
  } catch {
56
72
  }
73
+ } else {
74
+ alive++;
57
75
  }
58
76
  }
59
77
  if (alive >= MAX_CONCURRENT_WORKERS) {
@@ -68,15 +86,27 @@ function tryAcquireWorkerSlot() {
68
86
  } catch {
69
87
  }
70
88
  return true;
71
- } catch {
72
- return true;
89
+ } catch (err) {
90
+ if (reservationPath) {
91
+ try {
92
+ unlinkSync(reservationPath);
93
+ } catch {
94
+ }
95
+ }
96
+ console.error(
97
+ `[worker-gate] Cannot count worker slots in ${WORKER_PID_DIR} (${describe(err)}) - refusing this spawn rather than bypassing MAX_CONCURRENT_WORKERS.`
98
+ );
99
+ return false;
73
100
  }
74
101
  }
75
102
  function registerWorkerPid(pid) {
76
103
  try {
77
104
  mkdirSync(WORKER_PID_DIR, { recursive: true });
78
105
  writeFileSync(path.join(WORKER_PID_DIR, `worker-${pid}.pid`), String(pid));
79
- } catch {
106
+ } catch (err) {
107
+ console.error(
108
+ `[worker-gate] Failed to record worker pid ${pid} in ${WORKER_PID_DIR} (${describe(err)}) \u2014 it will not count toward MAX_CONCURRENT_WORKERS.`
109
+ );
80
110
  }
81
111
  }
82
112
  function cleanupWorkerPid() {
@@ -89,26 +119,44 @@ var BACKFILL_LOCK = path.join(WORKER_PID_DIR, "backfill.lock");
89
119
  function tryAcquireBackfillLock() {
90
120
  try {
91
121
  mkdirSync(WORKER_PID_DIR, { recursive: true });
92
- if (existsSync(BACKFILL_LOCK)) {
93
- try {
94
- const pid = parseInt(
95
- readFileSync(BACKFILL_LOCK, "utf8").trim(),
96
- 10
122
+ let raw;
123
+ try {
124
+ raw = readFileSync(BACKFILL_LOCK, "utf8");
125
+ } catch (err) {
126
+ const code = errnoOf(err);
127
+ if (code === "ENOENT" || code === "ENOTDIR") {
128
+ raw = null;
129
+ } else {
130
+ console.error(
131
+ `[worker-gate] Backfill lock ${BACKFILL_LOCK} exists but could not be read (${describe(err)}) - refusing to start a second backfill.`
97
132
  );
98
- if (!isNaN(pid) && pid > 0) {
99
- try {
100
- process.kill(pid, 0);
101
- return false;
102
- } catch {
103
- }
104
- }
105
- } catch {
133
+ return false;
134
+ }
135
+ }
136
+ if (raw !== null) {
137
+ const pid = parseInt(raw.trim(), 10);
138
+ if (isNaN(pid) || pid <= 0) {
139
+ console.error(
140
+ `[worker-gate] Backfill lock ${BACKFILL_LOCK} holds no readable pid - refusing to start a second backfill. Delete that file if no backfill is running.`
141
+ );
142
+ return false;
143
+ }
144
+ const live = pidLiveness(pid);
145
+ if (live === true) return false;
146
+ if (live === null) {
147
+ console.error(
148
+ `[worker-gate] Could not determine whether backfill pid ${pid} is alive - refusing to start a second backfill.`
149
+ );
150
+ return false;
106
151
  }
107
152
  }
108
153
  writeFileSync(BACKFILL_LOCK, String(process.pid));
109
154
  return true;
110
- } catch {
111
- return true;
155
+ } catch (err) {
156
+ console.error(
157
+ `[worker-gate] Cannot evaluate the backfill lock in ${WORKER_PID_DIR} (${describe(err)}) - refusing to start a backfill.`
158
+ );
159
+ return false;
112
160
  }
113
161
  }
114
162
  function releaseBackfillLock() {
@@ -126,8 +126,32 @@ function declaredArtifactsFromManifest(manifest, options) {
126
126
  }
127
127
  return out;
128
128
  }
129
+ var OBSERVATION_MAX_AGE_HOURS = 24;
130
+ function creditObservation(obs, nowMs, maxAgeHours = OBSERVATION_MAX_AGE_HOURS) {
131
+ if (!obs || typeof obs !== "object") {
132
+ return { credited: false, why: "no observation was supplied" };
133
+ }
134
+ const source = typeof obs.source === "string" && obs.source.trim() !== "" ? obs.source : "<unnamed source>";
135
+ if (obs.ok !== true) {
136
+ return { credited: false, why: `${source} did not report success` };
137
+ }
138
+ const atMs = typeof obs.at === "string" ? Date.parse(obs.at) : Number.NaN;
139
+ if (!Number.isFinite(atMs)) {
140
+ return { credited: false, why: `${source} reported success at an unreadable time (${String(obs.at)})` };
141
+ }
142
+ const ageH = (nowMs - atMs) / 36e5;
143
+ if (!(ageH <= maxAgeHours)) {
144
+ return {
145
+ credited: false,
146
+ why: `${source} last succeeded ${ageH.toFixed(1)}h ago, older than the ${maxAgeHours}h window`
147
+ };
148
+ }
149
+ return { credited: true, why: `${source} succeeded ${Math.max(0, ageH).toFixed(1)}h ago` };
150
+ }
129
151
  function evaluateDeliveryChannels(input) {
130
152
  const { detected, registry, npmFiles } = input;
153
+ const observations = input.observations ?? {};
154
+ const nowMs = input.now ?? Date.now();
131
155
  const normalizedFiles = npmFiles.map((f) => f.replace(/^\.\//, "").replace(/\/+$/, ""));
132
156
  const covered = (p) => {
133
157
  const path = p.replace(/^\.\//, "").replace(/\/+$/, "");
@@ -180,13 +204,25 @@ function evaluateDeliveryChannels(input) {
180
204
  });
181
205
  continue;
182
206
  }
207
+ const credit = creditObservation(observations[d.path], nowMs);
208
+ if (credit.credited) {
209
+ out.push({
210
+ path: d.path,
211
+ channel,
212
+ verdict: "channel-declared",
213
+ evidence: "observation",
214
+ observed: true,
215
+ detail: `${d.path} declares the ${channel} channel, passes the checks that declaration implies, and a deployment WAS observed: ${credit.why}.`
216
+ });
217
+ continue;
218
+ }
183
219
  out.push({
184
220
  path: d.path,
185
221
  channel,
186
222
  verdict: "channel-declared",
187
223
  evidence: "declaration",
188
224
  observed: false,
189
- detail: `${d.path} declares the ${channel} channel and passes the checks that declaration implies. No deployment was observed \u2014 this says where a change WOULD go, not that it went.`
225
+ detail: `${d.path} declares the ${channel} channel and passes the checks that declaration implies. No deployment was observed (${credit.why}) \u2014 this says where a change WOULD go, not that it went.`
190
226
  });
191
227
  }
192
228
  return out;
@@ -305,6 +341,8 @@ export {
305
341
  repositoryKey,
306
342
  compareLiveArtifacts,
307
343
  declaredArtifactsFromManifest,
344
+ OBSERVATION_MAX_AGE_HOURS,
345
+ creditObservation,
308
346
  evaluateDeliveryChannels,
309
347
  extractGateCookieNames,
310
348
  evaluateAnonymousGate,
@@ -2,10 +2,10 @@ import {
2
2
  BUSY_PATTERN,
3
3
  sendIntercom,
4
4
  updateTaskStatus
5
- } from "./chunk-7UHZBVP3.js";
5
+ } from "./chunk-QDVLVLXP.js";
6
6
  import {
7
7
  recordOrchestrationEventBestEffort
8
- } from "./chunk-LSNBTGW4.js";
8
+ } from "./chunk-DPYZW42H.js";
9
9
  import {
10
10
  hasPassed
11
11
  } from "./chunk-YRUZK2QA.js";
@@ -13,7 +13,7 @@ import {
13
13
  baseAgentName,
14
14
  getCoordinatorName,
15
15
  isCoordinatorName
16
- } from "./chunk-GL47M7NY.js";
16
+ } from "./chunk-3UD3OF3X.js";
17
17
  import {
18
18
  isAutonomousTmuxSpawnEnabled
19
19
  } from "./chunk-MMS2HBRT.js";
@@ -338,7 +338,7 @@ async function surfaceStaleDispatchPendingSignals(scopeList, now, thresholdMs =
338
338
  const sessionScope = signalScope ?? (scopeList.length === 1 ? scopeList[0] : null);
339
339
  if (allowedScopes.size > 0 && sessionScope && !allowedScopes.has(sessionScope)) continue;
340
340
  try {
341
- const { writeNotification } = await import("./notifications-JE3PX55X.js");
341
+ const { writeNotification } = await import("./notifications-3R6HNHDR.js");
342
342
  await writeNotification({
343
343
  agentId: getCoordinatorName(),
344
344
  agentRole: "COO",
@@ -475,8 +475,32 @@ async function runTaskEnforcementTick(deps) {
475
475
  source: "task-enforcement.runTaskEnforcementTick",
476
476
  payload: { sessionCount: sessions.length }
477
477
  });
478
+ if (deps.scopeFilter.failClosed) {
479
+ const why = deps.scopeFilter.reason ?? "session scope could not be resolved";
480
+ writeAuditEntry({
481
+ timestamp: new Date(now).toISOString(),
482
+ session: "-",
483
+ agent: "-",
484
+ role: "daemon",
485
+ action: "scope_unresolved",
486
+ reason: `enforcement REFUSED this tick \u2014 ${why}; no session was evaluated and no conclusion about open tasks was reached`
487
+ });
488
+ process.stderr.write(
489
+ `[exed] Task enforcement REFUSED this tick: ${why}. No session was evaluated \u2014 this is NOT a finding that agents have no open tasks. Resolve the coordinator scope (EXE_SESSION_SCOPE) or run one daemon per coordinator.
490
+ `
491
+ );
492
+ recordOrchestrationEventBestEffort({
493
+ eventType: "daemon.tick.refused",
494
+ source: "task-enforcement.runTaskEnforcementTick",
495
+ severity: "warn",
496
+ result: "refused",
497
+ payload: { reason: why }
498
+ });
499
+ return;
500
+ }
478
501
  const hasScopeRestriction = deps.scopeFilter.sql.length > 0;
479
502
  const allowedScope = hasScopeRestriction && deps.scopeFilter.args.length > 0 ? String(deps.scopeFilter.args[deps.scopeFilter.args.length - 1]) : null;
503
+ const scopeSkipped = [];
480
504
  for (const session of sessions) {
481
505
  if (!session.includes("-")) continue;
482
506
  const rawAgent = session.split("-")[0];
@@ -484,7 +508,10 @@ async function runTaskEnforcementTick(deps) {
484
508
  if (!agentName) continue;
485
509
  if (allowedScope) {
486
510
  const sessionSuffix = session.slice(session.indexOf("-") + 1);
487
- if (sessionSuffix !== allowedScope) continue;
511
+ if (sessionSuffix !== allowedScope) {
512
+ scopeSkipped.push(session);
513
+ continue;
514
+ }
488
515
  }
489
516
  if ("isAlive" in transport && typeof transport.isAlive === "function") {
490
517
  if (!transport.isAlive(session)) continue;
@@ -656,6 +683,16 @@ async function runTaskEnforcementTick(deps) {
656
683
  } catch {
657
684
  }
658
685
  }
686
+ if (scopeSkipped.length > 0) {
687
+ writeAuditEntry({
688
+ timestamp: new Date(now).toISOString(),
689
+ session: scopeSkipped.join(","),
690
+ agent: "-",
691
+ role: "daemon",
692
+ action: "scope_skipped",
693
+ reason: `${scopeSkipped.length} live session(s) not evaluated \u2014 outside this daemon's coordinator scope "${allowedScope}"`
694
+ });
695
+ }
659
696
  if (processedAnyEmployee) {
660
697
  try {
661
698
  const scopeList = allowedScope ? [...processedScopes].filter((s) => s === allowedScope) : [...processedScopes];
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  isExeSession
3
- } from "./chunk-7UHZBVP3.js";
3
+ } from "./chunk-QDVLVLXP.js";
4
4
  import {
5
5
  recordOrchestrationEventBestEffort
6
- } from "./chunk-LSNBTGW4.js";
6
+ } from "./chunk-DPYZW42H.js";
7
7
  import {
8
8
  getClient,
9
9
  isCoordinatorName
10
- } from "./chunk-GL47M7NY.js";
10
+ } from "./chunk-3UD3OF3X.js";
11
11
  import {
12
12
  isDaemonAlive
13
13
  } from "./chunk-QH5ZQ5SJ.js";
@@ -1,23 +1,23 @@
1
1
  import {
2
2
  MultiAgentOrchestrator
3
- } from "./chunk-W3KPQE7H.js";
3
+ } from "./chunk-3GL3E4TD.js";
4
4
  import {
5
5
  createTokenBudgetMiddleware
6
- } from "./chunk-SDYWZRPN.js";
6
+ } from "./chunk-TLSFGXXE.js";
7
7
  import {
8
8
  createQuietRenderer,
9
9
  createTerminalRenderer,
10
10
  renderAgentEvents
11
11
  } from "./chunk-YZFZDJWZ.js";
12
- import {
13
- checkDangerousPatterns,
14
- hasCriticalPattern
15
- } from "./chunk-CMCYL2JC.js";
16
12
  import {
17
13
  checkPathSafety,
18
14
  checkReadPathSafety,
19
15
  containsPathTraversal
20
16
  } from "./chunk-NGVOA6ZQ.js";
17
+ import {
18
+ checkDangerousPatterns,
19
+ hasCriticalPattern
20
+ } from "./chunk-CMCYL2JC.js";
21
21
  import {
22
22
  ContextManager,
23
23
  agentLoop,
@@ -30,7 +30,7 @@ import {
30
30
  recordDenial,
31
31
  recordSuccess,
32
32
  shouldFallbackToAsk
33
- } from "./chunk-TKS5GMYA.js";
33
+ } from "./chunk-U44Y7RC7.js";
34
34
  import {
35
35
  composeHooks,
36
36
  createDefaultHooks
@@ -212,7 +212,7 @@ function createExeOSHooks(config) {
212
212
  );
213
213
  }
214
214
  try {
215
- const { listBehaviors } = await import("./behaviors-SCCZP7RZ.js");
215
+ const { listBehaviors } = await import("./behaviors-RMLDPLOF.js");
216
216
  const behaviors = await listBehaviors(config.agentId, config.projectName, 12);
217
217
  if (behaviors.length > 0) {
218
218
  process.stderr.write(
@@ -250,7 +250,7 @@ function createExeOSHooks(config) {
250
250
  const ALLOWED_RE = /^(Bash|Edit|Write|Read|Glob|Grep|Agent|mcp__.*)$/;
251
251
  if (!ALLOWED_RE.test(toolName)) return;
252
252
  try {
253
- const { extractSemanticText } = await import("./content-extractor-ZLXC6GNR.js");
253
+ const { extractSemanticText } = await import("./content-extractor-OGXETBOX.js");
254
254
  const { writeMemory } = await import("./lib/store.js");
255
255
  const toolInput = block.input ?? {};
256
256
  const toolResponse = result.isError ? { error: result.content } : { output: result.content };
@@ -333,7 +333,7 @@ function createExeOSHooks(config) {
333
333
  async onSubagentStop(_reason) {
334
334
  try {
335
335
  const { getClient } = await import("./lib/database.js");
336
- const { sessionScopeFilter } = await import("./task-scope-NHXB4ZRN.js");
336
+ const { sessionScopeFilter } = await import("./task-scope-32HQEV6W.js");
337
337
  const client = getClient();
338
338
  const ehScope = sessionScopeFilter();
339
339
  const tasks = await client.execute({
@@ -373,7 +373,7 @@ function createExeOSHooks(config) {
373
373
  setAt: (/* @__PURE__ */ new Date()).toISOString()
374
374
  });
375
375
  try {
376
- const { writeNotification } = await import("./notifications-JE3PX55X.js");
376
+ const { writeNotification } = await import("./notifications-3R6HNHDR.js");
377
377
  await writeNotification({
378
378
  agentId: config.agentId,
379
379
  agentRole: "employee",
@@ -444,7 +444,7 @@ function createExeOSHooks(config) {
444
444
  try {
445
445
  const { writeMemory, flushBatch } = await import("./lib/store.js");
446
446
  const { getClient } = await import("./lib/database.js");
447
- const { sessionScopeFilter: cpScopeFilter } = await import("./task-scope-NHXB4ZRN.js");
447
+ const { sessionScopeFilter: cpScopeFilter } = await import("./task-scope-32HQEV6W.js");
448
448
  const client = getClient();
449
449
  const cpScope = cpScopeFilter();
450
450
  const tasks = await client.execute({
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  extractSemanticText
3
- } from "./chunk-HA63SH5W.js";
3
+ } from "./chunk-IWY2OGQG.js";
4
4
  import {
5
5
  detectError
6
6
  } from "./chunk-G2M7WQ2M.js";
@@ -9,10 +9,10 @@ import {
9
9
  } from "./chunk-5MOYSU5A.js";
10
10
  import {
11
11
  redactSecrets
12
- } from "./chunk-ELEGH4DX.js";
12
+ } from "./chunk-ZUGQPYUY.js";
13
13
  import {
14
14
  getProjectName
15
- } from "./chunk-UX2EO653.js";
15
+ } from "./chunk-ZZWFZ46U.js";
16
16
 
17
17
  // src/lib/post-tool-memory.ts
18
18
  var NON_INGESTIBLE_TOOLS = /* @__PURE__ */ new Set([
@@ -132,7 +132,7 @@ async function verifyOrBlock(hookPath) {
132
132
  process.stderr.write(`[SECURITY] Hook tamper detected: ${filename} \u2014 ${result.reason}
133
133
  `);
134
134
  try {
135
- const { pushNotifyAsync } = await import("./push-notifications-M7YU63FY.js");
135
+ const { pushNotifyAsync } = await import("./push-notifications-XC6EQEXF.js");
136
136
  pushNotifyAsync({
137
137
  event: "security_alert",
138
138
  title: "Hook tamper detected",
@@ -2,7 +2,7 @@ import {
2
2
  decryptSyncBlob,
3
3
  encryptSyncBlob,
4
4
  isSyncCryptoInitialized
5
- } from "./chunk-ZPP63JSQ.js";
5
+ } from "./chunk-CL3AB7Z2.js";
6
6
 
7
7
  // src/lib/crdt-sync.ts
8
8
  import * as Y from "yjs";
@@ -38,6 +38,21 @@ var TOOL_GATES = {
38
38
  * person is actually talking to.
39
39
  */
40
40
  "org-member": [],
41
+ /**
42
+ * DECLARED unrestricted, not accidentally unrestricted.
43
+ *
44
+ * `isToolAllowed` now refuses a tool with no category (see below), so every
45
+ * registered tool must name one. These are the tools that were reachable by
46
+ * every role because they were simply MISSING from the map — the baseline
47
+ * `tests/tool-category-coverage.test.ts` used to carry. Declaring them here
48
+ * preserves exactly the access they have today while removing the fail-open
49
+ * default that made that access invisible.
50
+ *
51
+ * This is a holding category, not a verdict: each entry still deserves a real
52
+ * one. Moving an entry out of here is a deliberate, reviewable change to who
53
+ * can reach it — which is the whole point of it being written down.
54
+ */
55
+ unrestricted: [],
41
56
  admin: ["COO"],
42
57
  // deploy, backup, daemon health, auto-wake, worker gate, memory audit, consolidation, cloud sync, agent config, list employees, agent spend, sessions, session kills
43
58
  licensing: ["COO"],
@@ -66,6 +81,13 @@ var TOOL_CATEGORIES = {
66
81
  // The member's own consent, refusal and exit. See the "org-member" gate.
67
82
  registerOrgPartner: "org-member",
68
83
  registerOrgMemoryConsent: "org-member",
84
+ // LEAVING IS A MEMBER ACTION, NOT AN ADMIN ONE. org_self is how a person
85
+ // reads their own roster row and WALKS OUT. Admin-gating it would mean an
86
+ // employee's own agent could not end their own membership — the exit would
87
+ // belong to the employer, which inverts the thing the org design exists to
88
+ // protect. `[]` here is the same deliberate choice as the other org-member
89
+ // surfaces, not a default that happened to land in the right place.
90
+ registerOrgSelf: "org-member",
69
91
  // org_owner is the OWNER's half of delegation: assign work into a member's
70
92
  // install, read what members report, poll the org's own inbox. `admin`, and
71
93
  // deliberately NOT "org-member" — that category is `[]` (every role) on
@@ -210,7 +232,24 @@ var TOOL_CATEGORIES = {
210
232
  registerGlobalProcedure: "orchestration",
211
233
  registerStoreGlobalProcedure: "orchestration",
212
234
  registerListGlobalProcedures: "orchestration",
213
- registerDeactivateGlobalProcedure: "orchestration"
235
+ registerDeactivateGlobalProcedure: "orchestration",
236
+ // ── declared unrestricted (see the "unrestricted" gate) ──────────────────
237
+ // Previously absent from this map, and therefore reachable by every role via
238
+ // the fail-open default. Listed so the access is stated rather than implied.
239
+ registerCreateFeatureRequest: "unrestricted",
240
+ registerDependencyTree: "unrestricted",
241
+ registerDreaming: "unrestricted",
242
+ registerGetFeatureRequest: "unrestricted",
243
+ registerImportConversations: "unrestricted",
244
+ registerListFeatureRequests: "unrestricted",
245
+ registerPipeline: "unrestricted",
246
+ registerReactivateBehavior: "unrestricted",
247
+ registerResonance: "unrestricted",
248
+ registerSteward: "unrestricted",
249
+ registerTriageFeatureRequest: "unrestricted",
250
+ registerUpdateBugReport: "unrestricted",
251
+ registerUpdateFeatureRequest: "unrestricted",
252
+ registerWikiDocSeal: "unrestricted"
214
253
  };
215
254
  var PLAN_TIERS = {
216
255
  free: 0,
@@ -234,14 +273,24 @@ var PLAN_GATES = {
234
273
  documents: "pro",
235
274
  gateway: "pro",
236
275
  admin: "pro",
237
- orchestration: "pro"
276
+ orchestration: "pro",
277
+ unrestricted: "free"
278
+ // exactly the plan tier these had while unmapped
238
279
  };
239
280
  function isToolAllowedForPlan(registerFnName, plan) {
240
281
  const category = TOOL_CATEGORIES[registerFnName];
241
- if (!category) return true;
282
+ if (!category) return false;
242
283
  const requiredPlan = PLAN_GATES[category] ?? "free";
243
284
  return PLAN_TIERS[plan] >= PLAN_TIERS[requiredPlan];
244
285
  }
286
+ function resolveToolCategory(toolName) {
287
+ if (!toolName) return void 0;
288
+ const direct = TOOL_CATEGORIES[toolName];
289
+ if (direct) return direct;
290
+ const pascal = toolName.split(/[_\-.]+/).filter((part) => part.length > 0).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join("");
291
+ if (!pascal) return void 0;
292
+ return TOOL_CATEGORIES[`register${pascal}`];
293
+ }
245
294
  var CHIEF_OF_STAFF_READ_TOOLS = /* @__PURE__ */ new Set([
246
295
  "registerRecallMyMemory",
247
296
  "registerAskTeamMemory",
@@ -270,7 +319,7 @@ function isToolAllowed(registerFnName) {
270
319
  return CHIEF_OF_STAFF_READ_TOOLS.has(registerFnName);
271
320
  }
272
321
  const category = TOOL_CATEGORIES[registerFnName];
273
- if (!category) return true;
322
+ if (!category) return false;
274
323
  const allowedRoles = TOOL_GATES[category];
275
324
  if (!allowedRoles || allowedRoles.length === 0) return true;
276
325
  return allowedRoles.includes(role);
@@ -280,5 +329,6 @@ export {
280
329
  TOOL_GATES,
281
330
  TOOL_CATEGORIES,
282
331
  isToolAllowedForPlan,
332
+ resolveToolCategory,
283
333
  isToolAllowed
284
334
  };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  canonicalizeStackManifest
3
- } from "./chunk-ZBPZDADW.js";
3
+ } from "./chunk-UWVXQEQQ.js";
4
4
 
5
5
  // src/lib/stack-manifest-write.ts
6
6
  import { readFileSync, statSync, writeFileSync } from "fs";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getClient
3
- } from "./chunk-GL47M7NY.js";
3
+ } from "./chunk-3UD3OF3X.js";
4
4
 
5
5
  // src/lib/pipeline-router.ts
6
6
  import crypto from "crypto";
@@ -140,8 +140,8 @@ Agent response: ${agentResponse}` : ""
140
140
  }
141
141
  async function sinkEntityExtraction(msg, agentResponse, agentName) {
142
142
  try {
143
- const { extractFromConversation } = await import("./conversation-entity-extractor-7FRKLLBD.js");
144
- const { storeExtraction } = await import("./graph-rag-BKAD2XQA.js");
143
+ const { extractFromConversation } = await import("./conversation-entity-extractor-FQCOAH4F.js");
144
+ const { storeExtraction } = await import("./graph-rag-H24CMFP2.js");
145
145
  if ((msg.text?.length ?? 0) < 20) return false;
146
146
  if (msg.isHistorical) return false;
147
147
  const extraction = await extractFromConversation(msg, agentResponse, agentName);