@askexenow/exe-os 0.9.239 → 0.9.244

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 (319) hide show
  1. package/deploy/compose/.env.customer.example +12 -0
  2. package/deploy/compose/.env.example +13 -1
  3. package/deploy/compose/cloudflared/config.yml.example +29 -5
  4. package/deploy/compose/docker-compose.yml +27 -7
  5. package/deploy/compose/generate-env.ts +49 -1
  6. package/deploy/compose/init-db.sql +10 -2
  7. package/deploy/stack-manifests/v0.9.json +113 -9
  8. package/dist/{active-agent-7MIVNARP.js → active-agent-KO4ZWDXE.js} +4 -4
  9. package/dist/{active-agent-55C5Y3XL.js → active-agent-KP2O52HA.js} +4 -4
  10. package/dist/{agentic-ontology-NCAQIQQI.js → agentic-ontology-DXE5J6I5.js} +1 -1
  11. package/dist/{backfill-metadata-3JP7EZ2U.js → backfill-metadata-DFTIGPXP.js} +7 -7
  12. package/dist/{background-jobs-RWL46VRD.js → background-jobs-CRXY7T4Y.js} +2 -2
  13. package/dist/{behaviors-6BGALYGW.js → behaviors-BL3QCHBT.js} +4 -4
  14. package/dist/bin/age-ontology-load.js +2 -2
  15. package/dist/bin/agentic-ontology-backfill.js +9 -9
  16. package/dist/bin/agentic-reflection-backfill.js +10 -10
  17. package/dist/bin/agentic-semantic-label.js +9 -9
  18. package/dist/bin/backfill-conversations.js +9 -9
  19. package/dist/bin/backfill-responses.js +9 -9
  20. package/dist/bin/backfill-vectors.js +11 -11
  21. package/dist/bin/bulk-sync-postgres.js +10 -10
  22. package/dist/bin/cc-doctor.js +3 -3
  23. package/dist/bin/cleanup-stale-review-tasks.js +13 -13
  24. package/dist/bin/cli.js +27 -22
  25. package/dist/bin/exe-agent-config.js +4 -4
  26. package/dist/bin/exe-agent.js +8 -8
  27. package/dist/bin/exe-assign.js +11 -11
  28. package/dist/bin/exe-boot.js +22 -22
  29. package/dist/bin/exe-call.js +5 -5
  30. package/dist/bin/exe-cloud.js +8 -8
  31. package/dist/bin/exe-dispatch.js +13 -13
  32. package/dist/bin/exe-doctor.js +1 -1
  33. package/dist/bin/exe-export-behaviors.js +10 -10
  34. package/dist/bin/exe-forget.js +9 -9
  35. package/dist/bin/exe-gateway.js +8 -8
  36. package/dist/bin/exe-healthcheck.js +3 -3
  37. package/dist/bin/exe-heartbeat.js +13 -13
  38. package/dist/bin/exe-kill.js +18 -18
  39. package/dist/bin/exe-launch-agent.js +22 -22
  40. package/dist/bin/exe-new-employee.js +8 -8
  41. package/dist/bin/exe-pending-messages.js +14 -14
  42. package/dist/bin/exe-pending-notifications.js +13 -13
  43. package/dist/bin/exe-pending-reviews.js +13 -13
  44. package/dist/bin/exe-rename.js +5 -5
  45. package/dist/bin/exe-review.js +17 -17
  46. package/dist/bin/exe-search.js +8 -8
  47. package/dist/bin/exe-session-cleanup.js +20 -20
  48. package/dist/bin/exe-settings.js +7 -7
  49. package/dist/bin/exe-start-codex.js +14 -14
  50. package/dist/bin/exe-start-opencode.js +11 -11
  51. package/dist/bin/exe-status.js +14 -14
  52. package/dist/bin/exe-support.js +3 -3
  53. package/dist/bin/exe-team.js +4 -4
  54. package/dist/bin/git-sweep.js +13 -13
  55. package/dist/bin/graph-backfill.js +8 -8
  56. package/dist/bin/graph-export.js +8 -8
  57. package/dist/bin/import-history.js +10 -10
  58. package/dist/bin/install.js +7 -7
  59. package/dist/bin/intercom-check.js +4 -4
  60. package/dist/bin/mcp-sessions.js +2 -2
  61. package/dist/bin/orchestration-metrics.js +5 -5
  62. package/dist/bin/postgres-agentic-reflection-backfill.js +4 -4
  63. package/dist/bin/postgres-agentic-semantic-backfill.js +3 -3
  64. package/dist/bin/registry-proxy.js +1 -1
  65. package/dist/bin/scan-tasks.js +13 -13
  66. package/dist/bin/setup.js +3 -3
  67. package/dist/bin/shard-migrate.js +8 -8
  68. package/dist/bin/stack-update.js +348 -20
  69. package/dist/bin/verify-stack.js +3 -383
  70. package/dist/bin/vps-backup.js +8 -160
  71. package/dist/bin/vps-health-gate.js +10 -220
  72. package/dist/{branding-I7YYX4FM.js → branding-XWMO5EDR.js} +1 -1
  73. package/dist/{capacity-monitor-IFCZKRPG.js → capacity-monitor-4CSBC7AP.js} +14 -14
  74. package/dist/{catchup-brief-PIDRWXOW.js → catchup-brief-LF5Z6Q6E.js} +17 -17
  75. package/dist/{chunk-FGJUGDNM.js → chunk-222SI7QC.js} +14 -14
  76. package/dist/{chunk-JZMVLAZ2.js → chunk-2WBBVEIB.js} +1 -1
  77. package/dist/{chunk-JDOE33C2.js → chunk-3V53HH5T.js} +4 -4
  78. package/dist/{chunk-2KZSKURT.js → chunk-57SULZJ2.js} +3 -3
  79. package/dist/{chunk-QI4IXJN7.js → chunk-5CHYEKMH.js} +7 -4
  80. package/dist/chunk-5DMAMQNU.js +168 -0
  81. package/dist/{chunk-PLQAFB3Z.js → chunk-5JIG2FP2.js} +1 -1
  82. package/dist/{chunk-UWQ3XCDG.js → chunk-5WK7X5CF.js} +2 -2
  83. package/dist/{chunk-DDPAQ4LT.js → chunk-6JAGJN77.js} +2 -2
  84. package/dist/{chunk-7F37NMKB.js → chunk-73UE2PHT.js} +1 -1
  85. package/dist/{chunk-JL3K5OTS.js → chunk-7IZWLMTP.js} +1 -1
  86. package/dist/{chunk-ELRRL2NC.js → chunk-A4K2ZT6N.js} +4 -4
  87. package/dist/{chunk-GWYADLIW.js → chunk-AHXEU5XB.js} +1 -1
  88. package/dist/{chunk-WSHMBME6.js → chunk-AWRL5FGM.js} +19 -78
  89. package/dist/{chunk-OMPCFLWA.js → chunk-BSPOEYAO.js} +1 -1
  90. package/dist/{chunk-F4TCKCKK.js → chunk-BYCNUKII.js} +47 -12
  91. package/dist/{chunk-DHVC4RN7.js → chunk-CBDPEJOR.js} +5 -5
  92. package/dist/{chunk-2H55BIV2.js → chunk-CEJO7244.js} +2 -2
  93. package/dist/{chunk-FKWZVO2T.js → chunk-CPXGLSIL.js} +3 -3
  94. package/dist/{chunk-HX5G4AS4.js → chunk-CWITU7DW.js} +2 -2
  95. package/dist/{chunk-5GG7MTRJ.js → chunk-DGBGIXCC.js} +4 -4
  96. package/dist/{chunk-IQXPMK46.js → chunk-DLZYAYVM.js} +60 -14
  97. package/dist/{chunk-PPYWQV2M.js → chunk-DR5BGWFR.js} +2 -2
  98. package/dist/{chunk-BZWKTFEB.js → chunk-ENVRFBTB.js} +2 -2
  99. package/dist/{chunk-DUVO2PUJ.js → chunk-F3GM6OOP.js} +4 -4
  100. package/dist/{chunk-HNLPLLE6.js → chunk-F7JLZXHC.js} +60 -26
  101. package/dist/{chunk-AL4DRC5H.js → chunk-FFLILAG6.js} +1 -1
  102. package/dist/{chunk-BZNI4OK5.js → chunk-GHEWRYMY.js} +18 -2
  103. package/dist/{chunk-C7SFJO5F.js → chunk-GHT4REOS.js} +5 -5
  104. package/dist/{chunk-FBWUJEXS.js → chunk-HANG6NLF.js} +4 -6
  105. package/dist/{chunk-5NJ4A4ZA.js → chunk-HCBMPZDT.js} +1 -1
  106. package/dist/chunk-HOGTZLVU.js +244 -0
  107. package/dist/{chunk-IQSCZDBQ.js → chunk-I5PIBL56.js} +3 -3
  108. package/dist/chunk-IRHNV4GY.js +388 -0
  109. package/dist/{chunk-4HROS3GJ.js → chunk-IZVKWBIP.js} +1 -1
  110. package/dist/{chunk-DKI5BTBC.js → chunk-J7V7LPPX.js} +2 -2
  111. package/dist/{chunk-TOZ5NN5V.js → chunk-JLKUVK5J.js} +1 -1
  112. package/dist/{chunk-4SC65UBG.js → chunk-JLNXKG3K.js} +1 -1
  113. package/dist/{chunk-KVSQOG3W.js → chunk-K2BDE2B5.js} +4 -4
  114. package/dist/{chunk-KDJRFJDL.js → chunk-K333WOW4.js} +30 -2
  115. package/dist/{chunk-6LBCUA2A.js → chunk-KEZXW3RP.js} +1 -1
  116. package/dist/{chunk-W7G3GY4I.js → chunk-KLQI7QY4.js} +3 -3
  117. package/dist/{chunk-UODVZGBQ.js → chunk-KN7LPTIB.js} +1 -1
  118. package/dist/{chunk-ESKBZN4Q.js → chunk-L4WRH3DL.js} +1 -1
  119. package/dist/{chunk-VFQKKMKE.js → chunk-LAOB5BKV.js} +2 -2
  120. package/dist/{chunk-MAN5LZQ4.js → chunk-LQSFP2BV.js} +1 -1
  121. package/dist/{chunk-EJ7LOTV2.js → chunk-LSFHEMVI.js} +9 -9
  122. package/dist/{chunk-RA2RO27E.js → chunk-MCESA5UW.js} +2 -2
  123. package/dist/{chunk-UPMHG7ET.js → chunk-MEIHREPM.js} +1 -1
  124. package/dist/{chunk-D5C56WO3.js → chunk-MOZ2YQ54.js} +1 -1
  125. package/dist/{chunk-CLGB3FGL.js → chunk-MPX3TRMQ.js} +2 -2
  126. package/dist/{chunk-5R75ODPS.js → chunk-NBY6R37W.js} +61 -232
  127. package/dist/{chunk-RWFGXC35.js → chunk-NEYQAEYU.js} +7 -7
  128. package/dist/{chunk-MBHZDXGN.js → chunk-NL35XNLI.js} +1 -1
  129. package/dist/{chunk-TPQVLYSV.js → chunk-NLGMHPEN.js} +1 -1
  130. package/dist/{chunk-5LMH4YHG.js → chunk-NRVV4Y5V.js} +4 -4
  131. package/dist/{chunk-GN5VHPPR.js → chunk-NVZR7T4E.js} +1 -1
  132. package/dist/{chunk-Y2L7RMGH.js → chunk-NWBHL5PI.js} +1 -1
  133. package/dist/{chunk-YPYDLW75.js → chunk-OEMX65EA.js} +1 -1
  134. package/dist/{chunk-UAFUGPKO.js → chunk-ONAQAL3O.js} +1 -1
  135. package/dist/{chunk-AVM7XZE4.js → chunk-OWQ3CCYJ.js} +7 -6
  136. package/dist/{chunk-K525WLL7.js → chunk-PI6V23GF.js} +5 -4
  137. package/dist/{chunk-AURM7FOT.js → chunk-Q2OAQPWY.js} +1 -1
  138. package/dist/{chunk-FB5VRO5S.js → chunk-QLDWASTX.js} +28 -32
  139. package/dist/{chunk-EPWDTS2Q.js → chunk-QMTGMCWB.js} +1 -1
  140. package/dist/{chunk-VI2FJY2M.js → chunk-QP4FHME2.js} +2 -2
  141. package/dist/{chunk-NJWK6J4N.js → chunk-QUNKPR6Y.js} +5 -5
  142. package/dist/{chunk-O6DAF2TY.js → chunk-QUZVAHO7.js} +2 -2
  143. package/dist/{chunk-VHKL4S4T.js → chunk-RRHSONV5.js} +2 -2
  144. package/dist/{chunk-GPF6X6HE.js → chunk-RYDHEWYY.js} +2 -2
  145. package/dist/{chunk-SVXDCELZ.js → chunk-SHN5O73O.js} +32 -4
  146. package/dist/chunk-TD5CADZ5.js +230 -0
  147. package/dist/{chunk-C2YS2AA6.js → chunk-U7WOVXBB.js} +2 -2
  148. package/dist/{chunk-FE45RXGC.js → chunk-V2GZMY6O.js} +1 -1
  149. package/dist/{chunk-PATCHPNY.js → chunk-VHALWCUO.js} +1 -1
  150. package/dist/{chunk-HLZSC5WK.js → chunk-VQAP35DA.js} +20 -18
  151. package/dist/{chunk-452XB7OZ.js → chunk-VRIMTCX2.js} +1 -1
  152. package/dist/{chunk-SUNYJ6YE.js → chunk-VT2B5BHM.js} +1 -1
  153. package/dist/{chunk-UZIJDYDA.js → chunk-VWVJVQDH.js} +2 -2
  154. package/dist/{chunk-TRZ5KA2R.js → chunk-VXIMSRTO.js} +2 -2
  155. package/dist/{chunk-DAZIV4QZ.js → chunk-WCXZF42W.js} +1 -1
  156. package/dist/{chunk-6OJJF4WP.js → chunk-XJUUWHVN.js} +1 -1
  157. package/dist/{chunk-F7LU65PQ.js → chunk-Y25OJWOQ.js} +14 -2
  158. package/dist/{chunk-2ORPA23Y.js → chunk-YMXXD2GW.js} +36 -8
  159. package/dist/{chunk-5WLMF6PL.js → chunk-YMZHTTOQ.js} +1 -1
  160. package/dist/{chunk-7DIDOQCX.js → chunk-YRVW57UW.js} +139 -125
  161. package/dist/{chunk-BRFH5X7G.js → chunk-Z7VDUS6L.js} +1 -1
  162. package/dist/{chunk-YFE6W75D.js → chunk-ZKFPHJIJ.js} +1 -1
  163. package/dist/{chunk-5WUTKDH6.js → chunk-ZVXJSQOR.js} +1 -1
  164. package/dist/{co-activation-VB4CJQZB.js → co-activation-L6I2LSJO.js} +3 -3
  165. package/dist/{co-occurrence-XZQJJIBM.js → co-occurrence-QARWYUAY.js} +3 -3
  166. package/dist/{code-context-index-FCQOPUEA.js → code-context-index-UIYQRDHD.js} +4 -4
  167. package/dist/{content-extractor-SPSH5X33.js → content-extractor-EYRVGD6O.js} +2 -2
  168. package/dist/{conversation-wiki-populator-YU35LNRK.js → conversation-wiki-populator-L7O6F3BB.js} +1 -1
  169. package/dist/{crdt-sync-KXETGV45.js → crdt-sync-R6YROKDH.js} +1 -1
  170. package/dist/{crm-webhook-JMOAHTJ6.js → crm-webhook-WK3PYJJK.js} +2 -2
  171. package/dist/{cto-delegation-gate-IJ3KQIKF.js → cto-delegation-gate-5JZORQIT.js} +12 -12
  172. package/dist/{daemon-auth-2IZACWSG.js → daemon-auth-2HEOL6VG.js} +2 -2
  173. package/dist/{daemon-orchestration-ZCY4GEI3.js → daemon-orchestration-BJ3T5MMF.js} +16 -15
  174. package/dist/{db-backup-HLX5OLIV.js → db-backup-EWS52P2W.js} +2 -2
  175. package/dist/{dreaming-2CJML3TU.js → dreaming-BOSBDRI3.js} +13 -13
  176. package/dist/{entity-boost-T5IYWWDZ.js → entity-boost-6ZVX7DFB.js} +26 -2
  177. package/dist/{exe-drift-P5OIRNSH.js → exe-drift-WRE6RADZ.js} +4 -4
  178. package/dist/{exe-export-QQL2H322.js → exe-export-7N5PBCMK.js} +8 -8
  179. package/dist/{exe-import-V4RJCUEP.js → exe-import-YOOE7S3H.js} +8 -8
  180. package/dist/{exe-key-MENJGDD7.js → exe-key-GXJSTCX2.js} +4 -4
  181. package/dist/{exe-org-3FNET2J7.js → exe-org-42YMQL75.js} +2 -2
  182. package/dist/{exe-snapshot-YRARQE7F.js → exe-snapshot-ODUCFW7G.js} +18 -18
  183. package/dist/{fast-db-init-HIJWWKAO.js → fast-db-init-YSR7RMVZ.js} +1 -1
  184. package/dist/{founder-context-BQ5NBDUV.js → founder-context-Q2HUCZX4.js} +2 -2
  185. package/dist/gateway/index.js +9 -9
  186. package/dist/{gateway-client-YGSA5QMC.js → gateway-client-4QXHKN5C.js} +1 -1
  187. package/dist/{git-staleness-IHTKCUMN.js → git-staleness-BJDTCDPC.js} +3 -3
  188. package/dist/{git-task-sweep-5ZPNQS7Y.js → git-task-sweep-L3U3T5HM.js} +13 -13
  189. package/dist/{global-procedures-XHDIZRJU.js → global-procedures-HCHEHKY2.js} +4 -4
  190. package/dist/{graph-auto-extract-5TPT67GP.js → graph-auto-extract-FP5C76LS.js} +3 -3
  191. package/dist/{hook-integrity-SB53Y7UK.js → hook-integrity-2OU3T6UC.js} +1 -1
  192. package/dist/hooks/bug-report-worker.js +15 -14
  193. package/dist/hooks/codex-stop-task-finalizer.js +15 -14
  194. package/dist/hooks/commit-complete.js +16 -16
  195. package/dist/hooks/error-recall.js +10 -10
  196. package/dist/hooks/exe-heartbeat-hook.js +5 -5
  197. package/dist/hooks/ingest-worker.js +8 -8
  198. package/dist/hooks/ingest.js +13 -13
  199. package/dist/hooks/instructions-loaded.js +7 -7
  200. package/dist/hooks/manifest.json +20 -20
  201. package/dist/hooks/notification.js +6 -6
  202. package/dist/hooks/post-compact.js +15 -15
  203. package/dist/hooks/post-tool-combined.js +7 -7
  204. package/dist/hooks/pre-compact.js +20 -20
  205. package/dist/hooks/pre-tool-use.js +28 -25
  206. package/dist/hooks/prompt-submit.js +62 -31
  207. package/dist/hooks/session-end.js +26 -26
  208. package/dist/hooks/session-start.js +39 -15
  209. package/dist/hooks/stop.js +22 -22
  210. package/dist/hooks/subagent-stop.js +15 -15
  211. package/dist/hooks/summary-worker.js +32 -27
  212. package/dist/index.js +21 -21
  213. package/dist/{installer-AMZM4MLS.js → installer-AWMUCRN4.js} +7 -7
  214. package/dist/{installer-KT5FW4CN.js → installer-HB3NH6FG.js} +9 -9
  215. package/dist/{installer-HW74W3IT.js → installer-RU6EVOBL.js} +6 -6
  216. package/dist/{intercom-queue-RNM6EPGA.js → intercom-queue-A6UJEFIF.js} +1 -1
  217. package/dist/{key-backup-status-OZ2CXUDW.js → key-backup-status-4YKCV4ZV.js} +1 -1
  218. package/dist/lib/agent-config.js +2 -2
  219. package/dist/lib/cloud-sync.js +10 -8
  220. package/dist/lib/config.js +1 -1
  221. package/dist/lib/consolidation.js +8 -8
  222. package/dist/lib/database.js +3 -3
  223. package/dist/lib/db-daemon-client.js +3 -3
  224. package/dist/lib/db.js +3 -3
  225. package/dist/lib/device-registry.js +1 -1
  226. package/dist/lib/embedder.js +4 -4
  227. package/dist/lib/employee-templates.js +5 -5
  228. package/dist/lib/employees.js +3 -3
  229. package/dist/lib/exe-daemon-client.js +3 -3
  230. package/dist/lib/exe-daemon.js +105 -74
  231. package/dist/lib/hybrid-search.js +8 -8
  232. package/dist/lib/identity.js +3 -3
  233. package/dist/lib/keychain.js +1 -1
  234. package/dist/lib/license.js +2 -2
  235. package/dist/lib/messaging.js +13 -13
  236. package/dist/lib/post-tool-memory.js +3 -3
  237. package/dist/lib/registry-proxy.js +1 -1
  238. package/dist/lib/reminders.js +4 -4
  239. package/dist/lib/schedules.js +8 -8
  240. package/dist/lib/session-registry.js +5 -5
  241. package/dist/lib/skill-learning.js +5 -5
  242. package/dist/lib/store.js +7 -7
  243. package/dist/lib/task-router.js +4 -4
  244. package/dist/lib/tasks.js +14 -13
  245. package/dist/lib/tmux-routing.js +12 -12
  246. package/dist/lib/token-spend.js +4 -4
  247. package/dist/lib/ws-client.js +1 -1
  248. package/dist/{license-gate-XJDIL6OZ.js → license-gate-6JQQFBHS.js} +3 -3
  249. package/dist/mcp/register-tools.js +68 -67
  250. package/dist/mcp/server.js +70 -69
  251. package/dist/mcp/tools/complete-reminder.js +5 -5
  252. package/dist/mcp/tools/create-reminder.js +5 -5
  253. package/dist/mcp/tools/create-task.js +16 -15
  254. package/dist/mcp/tools/deactivate-behavior.js +6 -6
  255. package/dist/mcp/tools/list-reminders.js +5 -5
  256. package/dist/mcp/tools/list-tasks.js +16 -15
  257. package/dist/mcp/tools/send-message.js +15 -15
  258. package/dist/mcp/tools/update-task.js +15 -14
  259. package/dist/{mcp-http-config-BXX3RZPR.js → mcp-http-config-XIJR5P2Z.js} +4 -4
  260. package/dist/{memory-cards-KRTP5GFM.js → memory-cards-H4BJJ5OK.js} +3 -3
  261. package/dist/{memory-graph-extractor-G532PUHC.js → memory-graph-extractor-SDGM3GVR.js} +4 -4
  262. package/dist/{memory-poisoning-defense-HJM3FQA3.js → memory-poisoning-defense-UVU67DGJ.js} +3 -3
  263. package/dist/{memory-queue-FTNBWLS4.js → memory-queue-FNT5WHXP.js} +2 -2
  264. package/dist/{memory-queue-client-DHSHEIHQ.js → memory-queue-client-JZCFYTWQ.js} +5 -5
  265. package/dist/{memory-reflection-RANRFUQL.js → memory-reflection-GGB5K35L.js} +3 -3
  266. package/dist/{notifications-4P2PVEOT.js → notifications-P3XQZDTH.js} +12 -12
  267. package/dist/{orchestration-events-IYTASMSN.js → orchestration-events-25WEKUKH.js} +4 -4
  268. package/dist/{orchestration-phase-SGA7PJ5G.js → orchestration-phase-C26XVKLZ.js} +2 -2
  269. package/dist/{orchestrator-VKVHZ4MV.js → orchestrator-VIXTY4E4.js} +14 -14
  270. package/dist/{pipeline-router-E4L5BDXN.js → pipeline-router-S5PE5U6B.js} +4 -4
  271. package/dist/{plan-limits-5O5QG55H.js → plan-limits-DGIVM42H.js} +5 -5
  272. package/dist/{prediction-log-OMWHW7FL.js → prediction-log-DOEOHDHS.js} +1 -1
  273. package/dist/{project-boot-WMI6CWRX.js → project-boot-4ZL2W7DN.js} +12 -2
  274. package/dist/{projection-worker-54KRNQSO.js → projection-worker-GG2W5OM3.js} +3 -3
  275. package/dist/{push-notifications-E2XXEWJZ.js → push-notifications-AMHVR6DF.js} +2 -2
  276. package/dist/{reranker-4NTUFNYT.js → reranker-UCPLQZE2.js} +2 -2
  277. package/dist/{review-polling-BFRJDLUA.js → review-polling-P2MWEXLR.js} +13 -13
  278. package/dist/runtime/index.js +15 -15
  279. package/dist/{session-events-KCZCWGE4.js → session-events-5CD66R6U.js} +13 -13
  280. package/dist/{session-kill-telemetry-TMNIDYWY.js → session-kill-telemetry-7FBHTEDN.js} +4 -4
  281. package/dist/{session-scope-DRZBQ32Y.js → session-scope-VMIPAZU7.js} +12 -12
  282. package/dist/{setup-wizard-TQKGDAHO.js → setup-wizard-BNR47URR.js} +3 -3
  283. package/dist/{shard-manager-G6MHCO7X.js → shard-manager-VGA2TYHM.js} +2 -2
  284. package/dist/{skill-refinement-Z5SWD3AM.js → skill-refinement-NRG4WWRW.js} +3 -3
  285. package/dist/stack-release-PFZI22WC.js +521 -0
  286. package/dist/{stack-update-NO5MNARG.js → stack-update-7F2E2MBJ.js} +3 -3
  287. package/dist/{steward-gate-7DWYS5AT.js → steward-gate-L7DJMF4C.js} +4 -4
  288. package/dist/{task-enforcement-2VL5J6JJ.js → task-enforcement-XQL77PZH.js} +52 -12
  289. package/dist/{task-scope-YHALISIB.js → task-scope-R3XKBIHL.js} +12 -12
  290. package/dist/{tasks-crud-JXZEBZFR.js → tasks-crud-DQOG2NPG.js} +12 -12
  291. package/dist/tasks-notify-4EQYG52H.js +37 -0
  292. package/dist/{tasks-review-PGPYJQF5.js → tasks-review-XPFJ4DSJ.js} +12 -12
  293. package/dist/{telemetry-upload-H7OJNBIF.js → telemetry-upload-OT5B5HUY.js} +7 -7
  294. package/dist/{token-budget-JJ7JQIA2.js → token-budget-D2LQKCAV.js} +3 -3
  295. package/dist/{tool-capability-index-WIV4K3FB.js → tool-capability-index-FAJ5ZHDF.js} +1 -1
  296. package/dist/{tool-telemetry-W4LFCHFT.js → tool-telemetry-QIF5BCLF.js} +1 -1
  297. package/dist/tui/App.js +26 -26
  298. package/dist/{tui-data-72U6N2DC.js → tui-data-UEV2QOR3.js} +108 -12
  299. package/dist/{whatsapp-config-W63RQ3AU.js → whatsapp-config-GOSELKTE.js} +7 -0
  300. package/dist/{worker-gate-SCSN6IHI.js → worker-gate-PRCKA23W.js} +2 -2
  301. package/dist/{workflow-engine-OICYBE4F.js → workflow-engine-7X6LLH3M.js} +2 -2
  302. package/dist/{worktree-JXN4RCWC.js → worktree-RICSCT2S.js} +5 -5
  303. package/package.json +1 -1
  304. package/release-notes.json +210 -298
  305. package/stack.release.json +4 -3
  306. package/dist/preflight-EAH2MI76.js +0 -287
  307. /package/dist/{chunk-H42LEGLB.js → chunk-AQBEG33D.js} +0 -0
  308. /package/dist/{chunk-AU5426YP.js → chunk-B7JGEDVE.js} +0 -0
  309. /package/dist/{chunk-YFDDTHNM.js → chunk-JXI4XUTV.js} +0 -0
  310. /package/dist/{chunk-SNYDRHV3.js → chunk-U3DUFHOT.js} +0 -0
  311. /package/dist/{chunk-N2XUH2HQ.js → chunk-VBPC7IC7.js} +0 -0
  312. /package/dist/{chunk-HTUJBTBM.js → chunk-VUS6WXQ3.js} +0 -0
  313. /package/dist/{chunk-NOLIN2YI.js → chunk-XAYRZHLV.js} +0 -0
  314. /package/dist/{core-memory-VOBGGB2Q.js → core-memory-4KAIKQRQ.js} +0 -0
  315. /package/dist/{message-queue-client-KAJN6TIJ.js → message-queue-client-S6W5VMJV.js} +0 -0
  316. /package/dist/{oauth-server-QEXRSXEP.js → oauth-server-2ESBZB7F.js} +0 -0
  317. /package/dist/{webhook-pipe-LY4XEDL7.js → webhook-pipe-ZRUVOG5H.js} +0 -0
  318. /package/dist/{wiki-acl-M3OR547L.js → wiki-acl-MFLSS6DE.js} +0 -0
  319. /package/dist/{wiki-client-MAFYBXCQ.js → wiki-client-GBPR45BQ.js} +0 -0
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  deactivateBehavior
3
- } from "./chunk-UAFUGPKO.js";
3
+ } from "./chunk-ONAQAL3O.js";
4
4
  import {
5
5
  getActiveAgent
6
- } from "./chunk-RA2RO27E.js";
6
+ } from "./chunk-MCESA5UW.js";
7
7
  import {
8
8
  canCoordinate,
9
9
  getClient
10
- } from "./chunk-2H55BIV2.js";
10
+ } from "./chunk-CEJO7244.js";
11
11
 
12
12
  // src/mcp/tools/deactivate-behavior.ts
13
13
  import { z } from "zod";
@@ -24,7 +24,7 @@ function registerDeactivateBehavior(server) {
24
24
  async ({ behavior_id }) => {
25
25
  const caller = getActiveAgent();
26
26
  try {
27
- const { StewardGate } = await import("./steward-gate-7DWYS5AT.js");
27
+ const { StewardGate } = await import("./steward-gate-L7DJMF4C.js");
28
28
  const steward = new StewardGate();
29
29
  const gateDecision = await steward.checkAuthority(caller.agentId || "unknown", "deactivate_behavior", behavior_id);
30
30
  if (!gateDecision.allowed) {
@@ -1,6 +1,6 @@
1
1
  // src/lib/keychain.ts
2
2
  import { readFile, writeFile, unlink, mkdir, chmod, rename, copyFile } from "fs/promises";
3
- import { existsSync, statSync, writeFileSync, readFileSync } from "fs";
3
+ import { existsSync, statSync, writeFileSync, readFileSync, readdirSync } from "fs";
4
4
  import { execSync, execFileSync, spawnSync } from "child_process";
5
5
  import crypto from "crypto";
6
6
  import path from "path";
@@ -17,7 +17,35 @@ function warnPlaintextFallback() {
17
17
  var LEGACY_SERVICE = "exe-mem";
18
18
  var ACCOUNT = "master-key";
19
19
  function getKeyDir() {
20
- return process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? path.join(os.homedir(), ".exe-os");
20
+ if (process.env.EXE_OS_DIR) return process.env.EXE_OS_DIR;
21
+ if (process.env.EXE_MEM_DIR) return process.env.EXE_MEM_DIR;
22
+ const homeDir = os.homedir();
23
+ const defaultDir = path.join(homeDir, ".exe-os");
24
+ if (process.getuid?.() === 0) {
25
+ const sudoUser = process.env.SUDO_USER ?? "";
26
+ if (sudoUser) {
27
+ try {
28
+ const sudoHome = execSync(`getent passwd ${sudoUser} | cut -d: -f6`, { encoding: "utf8", timeout: 3e3 }).trim();
29
+ const sudoDir = path.join(sudoHome, ".exe-os");
30
+ if (existsSync(sudoDir)) return sudoDir;
31
+ } catch {
32
+ }
33
+ }
34
+ try {
35
+ if (existsSync("/home")) {
36
+ const candidates = [];
37
+ for (const user of readdirSync("/home")) {
38
+ const candidate = path.join("/home", user, ".exe-os");
39
+ if (existsSync(path.join(candidate, "master.key")) || existsSync(path.join(candidate, "config.json"))) {
40
+ candidates.push(candidate);
41
+ }
42
+ }
43
+ if (candidates.length === 1) return candidates[0];
44
+ }
45
+ } catch {
46
+ }
47
+ }
48
+ return defaultDir;
21
49
  }
22
50
  function getKeyPath() {
23
51
  return path.join(getKeyDir(), "master.key");
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  getCurrentSessionScope,
3
3
  strictSessionScopeFilter
4
- } from "./chunk-HNLPLLE6.js";
4
+ } from "./chunk-F7JLZXHC.js";
5
5
  import {
6
6
  getProjectName
7
7
  } from "./chunk-OPU3NYOO.js";
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  fastDbInit
3
- } from "./chunk-H42LEGLB.js";
3
+ } from "./chunk-AQBEG33D.js";
4
4
  import {
5
5
  sessionScopeFilter
6
- } from "./chunk-HNLPLLE6.js";
6
+ } from "./chunk-F7JLZXHC.js";
7
7
  import {
8
8
  formatStatusAll,
9
9
  formatStatusDeep,
@@ -14,7 +14,7 @@ import {
14
14
  getClient,
15
15
  isCoordinatorRole,
16
16
  loadEmployees
17
- } from "./chunk-2H55BIV2.js";
17
+ } from "./chunk-CEJO7244.js";
18
18
  import {
19
19
  isMainModule
20
20
  } from "./chunk-6Y4B3QF6.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  EXE_AI_DIR
3
- } from "./chunk-TRZ5KA2R.js";
3
+ } from "./chunk-VXIMSRTO.js";
4
4
 
5
5
  // src/lib/mcp-transport-health.ts
6
6
  import { appendFileSync, closeSync, existsSync, mkdirSync, openSync, readFileSync, readSync, statSync, writeFileSync } from "fs";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  loadConfigSync
3
- } from "./chunk-TRZ5KA2R.js";
3
+ } from "./chunk-VXIMSRTO.js";
4
4
 
5
5
  // src/lib/push-notifications.ts
6
6
  import { execSync } from "child_process";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  EXE_AI_DIR
3
- } from "./chunk-TRZ5KA2R.js";
3
+ } from "./chunk-VXIMSRTO.js";
4
4
 
5
5
  // src/lib/worker-gate.ts
6
6
  import { readdirSync, writeFileSync, unlinkSync, mkdirSync, existsSync, readFileSync } from "fs";
@@ -111,7 +111,7 @@ function releaseBackfillLock() {
111
111
  }
112
112
  async function getTaskAwareCapacity() {
113
113
  const { getClient } = await import("./lib/database.js");
114
- const { sessionScopeFilter } = await import("./task-scope-YHALISIB.js");
114
+ const { sessionScopeFilter } = await import("./task-scope-R3XKBIHL.js");
115
115
  const client = getClient();
116
116
  const scope = sessionScopeFilter();
117
117
  const result = await client.execute({
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  processCRMEvent
3
- } from "./chunk-AU5426YP.js";
3
+ } from "./chunk-B7JGEDVE.js";
4
4
 
5
5
  // src/gateway/adapters/crm-webhook.ts
6
6
  function parseTwentyWebhook(payload) {
@@ -3,30 +3,30 @@ import {
3
3
  } from "./chunk-MLXJ5EZG.js";
4
4
  import {
5
5
  createTask
6
- } from "./chunk-5R75ODPS.js";
6
+ } from "./chunk-NBY6R37W.js";
7
7
  import {
8
8
  getActiveAgent
9
- } from "./chunk-RA2RO27E.js";
9
+ } from "./chunk-MCESA5UW.js";
10
10
  import {
11
11
  ensureEmployee,
12
12
  logTaskDispatch,
13
13
  resolveExeSession
14
- } from "./chunk-HNLPLLE6.js";
14
+ } from "./chunk-F7JLZXHC.js";
15
15
  import {
16
16
  recordOrchestrationEventBestEffort
17
- } from "./chunk-5NJ4A4ZA.js";
17
+ } from "./chunk-HCBMPZDT.js";
18
18
  import {
19
19
  getAgentRuntime
20
- } from "./chunk-6OJJF4WP.js";
20
+ } from "./chunk-XJUUWHVN.js";
21
21
  import {
22
22
  getLicenseSync
23
- } from "./chunk-IQSCZDBQ.js";
23
+ } from "./chunk-I5PIBL56.js";
24
24
  import {
25
25
  getAgentContext
26
26
  } from "./chunk-GJV3WDWM.js";
27
27
  import {
28
28
  isCoordinatorName
29
- } from "./chunk-2H55BIV2.js";
29
+ } from "./chunk-CEJO7244.js";
30
30
 
31
31
  // src/mcp/tools/create-task.ts
32
32
  import { z } from "zod";
@@ -275,7 +275,7 @@ function registerCreateTask(server) {
275
275
  session_scope: sessionScope,
276
276
  created_at: (/* @__PURE__ */ new Date()).toISOString()
277
277
  }), "utf-8");
278
- const { recordOrchestrationEventBestEffort: recordOE } = await import("./orchestration-events-IYTASMSN.js");
278
+ const { recordOrchestrationEventBestEffort: recordOE } = await import("./orchestration-events-25WEKUKH.js");
279
279
  recordOE({
280
280
  eventType: "signal.created",
281
281
  source: "create-task.mcp",
@@ -307,7 +307,7 @@ function registerCreateTask(server) {
307
307
  let projectConflictOpts = {};
308
308
  try {
309
309
  const { getClient } = await import("./lib/database.js");
310
- const { sessionScopeFilter } = await import("./task-scope-YHALISIB.js");
310
+ const { sessionScopeFilter } = await import("./task-scope-R3XKBIHL.js");
311
311
  const client = getClient();
312
312
  const scope = sessionScopeFilter(task.sessionScope || callerRoot || exeSession || null);
313
313
  const existing = await client.execute({
@@ -9,10 +9,10 @@ import {
9
9
  getCoordinatorEmployee,
10
10
  getEmployee,
11
11
  loadEmployeesSync
12
- } from "./chunk-2H55BIV2.js";
12
+ } from "./chunk-CEJO7244.js";
13
13
  import {
14
14
  EXE_AI_DIR
15
- } from "./chunk-TRZ5KA2R.js";
15
+ } from "./chunk-VXIMSRTO.js";
16
16
 
17
17
  // src/lib/active-agent.ts
18
18
  import { readFileSync, writeFileSync, mkdirSync, unlinkSync, readdirSync } from "fs";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  EXE_AI_DIR
3
- } from "./chunk-TRZ5KA2R.js";
3
+ } from "./chunk-VXIMSRTO.js";
4
4
 
5
5
  // src/lib/memory-queue.ts
6
6
  import {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  EXE_AI_DIR
3
- } from "./chunk-TRZ5KA2R.js";
3
+ } from "./chunk-VXIMSRTO.js";
4
4
 
5
5
  // src/lib/license.ts
6
6
  import { readFileSync, writeFileSync, existsSync, mkdirSync, statSync } from "fs";
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  extractSemanticText
3
- } from "./chunk-SUNYJ6YE.js";
3
+ } from "./chunk-VT2B5BHM.js";
4
4
  import {
5
5
  detectError
6
6
  } from "./chunk-AHMUF6RO.js";
7
7
  import {
8
8
  redactSecrets
9
- } from "./chunk-F7LU65PQ.js";
9
+ } from "./chunk-Y25OJWOQ.js";
10
10
  import {
11
11
  getProjectName
12
12
  } from "./chunk-OPU3NYOO.js";
@@ -1,42 +1,28 @@
1
+ import {
2
+ dispatchTaskToEmployee,
3
+ markTaskNotificationsRead,
4
+ notifyTaskDone
5
+ } from "./chunk-HOGTZLVU.js";
1
6
  import {
2
7
  cleanupReviewFile,
3
8
  createTaskCore,
4
9
  deleteTaskCore,
5
- employeeSessionName,
6
- ensureEmployee,
7
10
  markAsReadByTaskFile,
8
- notifyParentExe,
9
- resolveExeSession,
10
- sendIntercom,
11
11
  sessionScopeFilter,
12
12
  updateTaskStatus,
13
13
  writeNotification
14
- } from "./chunk-HNLPLLE6.js";
15
- import {
16
- getTransport
17
- } from "./chunk-MVW62NIZ.js";
18
- import {
19
- recordOrchestrationEventBestEffort
20
- } from "./chunk-5NJ4A4ZA.js";
21
- import {
22
- getAgentRuntime
23
- } from "./chunk-6OJJF4WP.js";
24
- import {
25
- getSessionKey
26
- } from "./chunk-CVYC6DUW.js";
14
+ } from "./chunk-F7JLZXHC.js";
27
15
  import {
28
16
  orgBus
29
17
  } from "./chunk-MP2AFCGL.js";
30
18
  import {
31
19
  getClient,
32
20
  getCoordinatorName,
33
- isCoordinatorName,
34
- isMultiInstance,
35
- shouldAutoInstance
36
- } from "./chunk-2H55BIV2.js";
21
+ isCoordinatorName
22
+ } from "./chunk-CEJO7244.js";
37
23
  import {
38
24
  EXE_AI_DIR
39
- } from "./chunk-TRZ5KA2R.js";
25
+ } from "./chunk-VXIMSRTO.js";
40
26
 
41
27
  // src/lib/tasks.ts
42
28
  import path2 from "path";
@@ -49,7 +35,7 @@ async function cascadeUnblock(taskId, baseDir, now) {
49
35
  const client = getClient();
50
36
  const ubScope = sessionScopeFilter();
51
37
  const blockedRows = await client.execute({
52
- sql: `SELECT id, title, assigned_to, priority, task_file FROM tasks WHERE blocked_by = ? AND status = 'blocked'${ubScope.sql}`,
38
+ sql: `SELECT id, title, assigned_to, priority, task_file, project_name FROM tasks WHERE blocked_by = ? AND status = 'blocked'${ubScope.sql}`,
53
39
  args: [taskId, ...ubScope.args]
54
40
  });
55
41
  if (blockedRows.rows.length === 0) return;
@@ -75,15 +61,41 @@ async function cascadeUnblock(taskId, baseDir, now) {
75
61
  }
76
62
  if (unblockedRows.rows.length > 0 && !process.env.VITEST) {
77
63
  try {
78
- const { queueIntercom } = await import("./intercom-queue-RNM6EPGA.js");
64
+ const { dispatchTaskToEmployee: dispatchTaskToEmployee2 } = await import("./tasks-notify-4EQYG52H.js");
79
65
  const dispatched = /* @__PURE__ */ new Set();
80
66
  for (const ur of unblockedRows.rows) {
81
67
  const assignee = String(ur.assigned_to);
82
68
  if (dispatched.has(assignee)) continue;
83
69
  dispatched.add(assignee);
84
- queueIntercom(`${assignee}`, `unblocked: "${String(ur.title)}" is now ready`);
70
+ const unblockedId = String(ur.id);
71
+ const title = String(ur.title);
72
+ const priority = String(ur.priority ?? "P2");
73
+ const taskFile = String(ur.task_file ?? "");
74
+ const projectName = ur.project_name != null ? String(ur.project_name) : void 0;
75
+ dispatchTaskToEmployee2({
76
+ assignedTo: assignee,
77
+ taskId: unblockedId,
78
+ title,
79
+ priority,
80
+ taskFile,
81
+ initialStatus: "open",
82
+ projectDir: baseDir,
83
+ projectName
84
+ }).catch(() => {
85
+ });
85
86
  }
86
87
  } catch {
88
+ try {
89
+ const { queueIntercom } = await import("./intercom-queue-A6UJEFIF.js");
90
+ const dispatched = /* @__PURE__ */ new Set();
91
+ for (const ur of unblockedRows.rows) {
92
+ const assignee = String(ur.assigned_to);
93
+ if (dispatched.has(assignee)) continue;
94
+ dispatched.add(assignee);
95
+ queueIntercom(`${assignee}`, `unblocked: "${String(ur.title)}" is now ready`);
96
+ }
97
+ } catch {
98
+ }
87
99
  }
88
100
  }
89
101
  }
@@ -112,13 +124,13 @@ async function checkSubtaskCompletion(parentTaskId, projectName) {
112
124
  const scScope = sessionScopeFilter();
113
125
  const remaining = await client.execute({
114
126
  sql: `SELECT COUNT(*) as cnt FROM tasks
115
- WHERE parent_task_id = ? AND status NOT IN ('done', 'cancelled', 'closed')${scScope.sql}`,
127
+ WHERE parent_task_id = ? AND status NOT IN ('done', 'needs_review', 'cancelled', 'closed')${scScope.sql}`,
116
128
  args: [parentTaskId, ...scScope.args]
117
129
  });
118
130
  const cnt = Number(remaining.rows[0]?.cnt ?? 1);
119
131
  if (cnt === 0) {
120
132
  const parentRow = await client.execute({
121
- sql: `SELECT assigned_to, title, task_file, project_name FROM tasks WHERE id = ?`,
133
+ sql: `SELECT assigned_to, title, task_file, project_name, session_scope FROM tasks WHERE id = ?`,
122
134
  args: [parentTaskId]
123
135
  });
124
136
  if (parentRow.rows.length === 1) {
@@ -130,200 +142,12 @@ async function checkSubtaskCompletion(parentTaskId, projectName) {
130
142
  event: "subtasks_complete",
131
143
  project: parentProject,
132
144
  summary: `All subtasks complete for "${String(pr.title)}" \u2014 ready for rollup review`,
133
- taskFile: String(pr.task_file)
134
- });
135
- }
136
- }
137
- }
138
-
139
- // src/lib/tasks-notify.ts
140
- function resolveDispatchRuntime(agentId, override) {
141
- if (override) return override;
142
- try {
143
- return getAgentRuntime(agentId).runtime ?? null;
144
- } catch {
145
- return null;
146
- }
147
- }
148
- async function dispatchTaskToEmployee(input) {
149
- if (isCoordinatorName(input.assignedTo)) return { dispatched: "skipped" };
150
- const dispatchRuntime = resolveDispatchRuntime(input.assignedTo, input.spawnRuntime);
151
- recordOrchestrationEventBestEffort({
152
- eventType: "dispatch.attempted",
153
- source: "tasks-notify.dispatchTaskToEmployee",
154
- taskId: input.taskId ?? null,
155
- agentId: input.assignedTo,
156
- runtime: dispatchRuntime,
157
- payload: { priority: input.priority, projectName: input.projectName }
158
- });
159
- let crossProject = false;
160
- if (input.projectName) {
161
- try {
162
- const { assertSessionScope } = await import("./session-scope-DRZBQ32Y.js");
163
- const check = assertSessionScope("dispatch_task", input.projectName);
164
- if (check.reason === "cross_session_denied") {
165
- crossProject = true;
166
- recordOrchestrationEventBestEffort({
167
- eventType: "dispatch.failed",
168
- source: "tasks-notify.dispatchTaskToEmployee",
169
- taskId: input.taskId ?? null,
170
- agentId: input.assignedTo,
171
- runtime: dispatchRuntime,
172
- errorCode: "cross_session_denied",
173
- payload: { projectName: input.projectName }
174
- });
175
- return { dispatched: "skipped", crossProject: true };
176
- }
177
- } catch {
178
- }
179
- }
180
- try {
181
- const transport = getTransport();
182
- const exeSession = resolveExeSession();
183
- if (!exeSession) {
184
- recordOrchestrationEventBestEffort({
185
- eventType: "dispatch.failed",
186
- source: "tasks-notify.dispatchTaskToEmployee",
187
- taskId: input.taskId ?? null,
188
- agentId: input.assignedTo,
189
- runtime: dispatchRuntime,
190
- errorCode: "no_exe_session"
145
+ taskFile: String(pr.task_file),
146
+ // Scope the notification to the parent task's coordinator session —
147
+ // prevents subtask-complete notifications from leaking to other coordinator lanes.
148
+ sessionScope: pr.session_scope ? String(pr.session_scope) : void 0
191
149
  });
192
- return { dispatched: "session_missing" };
193
150
  }
194
- const multiInstance = isMultiInstance(input.assignedTo);
195
- if (multiInstance) {
196
- const projectDir = input.projectDir ?? process.cwd();
197
- const autoOpts = shouldAutoInstance(input.assignedTo);
198
- const result = ensureEmployee(input.assignedTo, exeSession, projectDir, {
199
- ...autoOpts,
200
- runtimeOverride: input.spawnRuntime,
201
- modelOverride: input.spawnModel
202
- });
203
- if (result.status === "failed") {
204
- process.stderr.write(
205
- `[dispatch-audit] SPAWN FAILED \u2192 ${input.assignedTo} | task="${input.title}" [${input.priority}] | error=${result.error}
206
- `
207
- );
208
- recordOrchestrationEventBestEffort({
209
- eventType: "dispatch.failed",
210
- source: "tasks-notify.dispatchTaskToEmployee",
211
- taskId: input.taskId ?? null,
212
- agentId: input.assignedTo,
213
- sessionScope: exeSession,
214
- runtime: dispatchRuntime,
215
- errorCode: "spawn_failed",
216
- payload: { path: "multi_instance", error: result.error }
217
- });
218
- return { dispatched: "session_missing" };
219
- }
220
- const dispatched = result.status === "intercom_sent" || result.status === "intercom_unprocessed" ? "sent_unverified" : "spawned";
221
- process.stderr.write(
222
- `[dispatch-audit] ${dispatched === "spawned" ? "SPAWNED" : "INTERCOM"} \u2192 ${result.sessionName} | task="${input.title}" [${input.priority}]
223
- `
224
- );
225
- recordOrchestrationEventBestEffort({
226
- eventType: "dispatch.completed",
227
- source: "tasks-notify.dispatchTaskToEmployee",
228
- taskId: input.taskId ?? null,
229
- agentId: input.assignedTo,
230
- sessionScope: exeSession,
231
- tmuxSession: result.sessionName,
232
- runtime: dispatchRuntime,
233
- result: dispatched,
234
- payload: { path: "multi_instance", priority: input.priority }
235
- });
236
- return { dispatched, session: result.sessionName, crossProject };
237
- }
238
- const sessionName = employeeSessionName(input.assignedTo, exeSession);
239
- if (transport.isAlive(sessionName)) {
240
- const result = sendIntercom(sessionName, { force: true });
241
- const dispatched = result === "acknowledged" || result === "debounced" || result === "queued" ? "verified" : result === "delivered" ? "sent_unverified" : "session_dead";
242
- process.stderr.write(
243
- `[dispatch-audit] intercom \u2192 ${sessionName} | task="${input.title}" [${input.priority}] | result=${dispatched} (sendIntercom=${result})
244
- `
245
- );
246
- recordOrchestrationEventBestEffort({
247
- eventType: "dispatch.completed",
248
- source: "tasks-notify.dispatchTaskToEmployee",
249
- taskId: input.taskId ?? null,
250
- agentId: input.assignedTo,
251
- sessionScope: exeSession,
252
- tmuxSession: sessionName,
253
- runtime: dispatchRuntime,
254
- result: dispatched,
255
- payload: { path: "single_instance_intercom", priority: input.priority }
256
- });
257
- return { dispatched, session: sessionName, crossProject };
258
- } else {
259
- const projectDir = input.projectDir ?? process.cwd();
260
- const result = ensureEmployee(input.assignedTo, exeSession, projectDir, {
261
- runtimeOverride: input.spawnRuntime,
262
- modelOverride: input.spawnModel
263
- });
264
- if (result.status === "failed") {
265
- process.stderr.write(
266
- `[dispatch-audit] SPAWN FAILED \u2192 ${input.assignedTo} | task="${input.title}" [${input.priority}] | error=${result.error}
267
- `
268
- );
269
- recordOrchestrationEventBestEffort({
270
- eventType: "dispatch.failed",
271
- source: "tasks-notify.dispatchTaskToEmployee",
272
- taskId: input.taskId ?? null,
273
- agentId: input.assignedTo,
274
- sessionScope: exeSession,
275
- runtime: dispatchRuntime,
276
- errorCode: "spawn_failed",
277
- payload: { path: "single_instance_spawn", error: result.error }
278
- });
279
- return { dispatched: "session_missing" };
280
- }
281
- process.stderr.write(
282
- `[dispatch-audit] SPAWNED \u2192 ${result.sessionName} | task="${input.title}" [${input.priority}]
283
- `
284
- );
285
- recordOrchestrationEventBestEffort({
286
- eventType: "dispatch.completed",
287
- source: "tasks-notify.dispatchTaskToEmployee",
288
- taskId: input.taskId ?? null,
289
- agentId: input.assignedTo,
290
- sessionScope: exeSession,
291
- tmuxSession: result.sessionName,
292
- runtime: dispatchRuntime,
293
- result: "spawned",
294
- payload: { path: "single_instance_spawn", priority: input.priority }
295
- });
296
- return { dispatched: "spawned", session: result.sessionName, crossProject };
297
- }
298
- } catch {
299
- recordOrchestrationEventBestEffort({
300
- eventType: "dispatch.failed",
301
- source: "tasks-notify.dispatchTaskToEmployee",
302
- taskId: input.taskId ?? null,
303
- agentId: input.assignedTo,
304
- runtime: dispatchRuntime,
305
- errorCode: "exception"
306
- });
307
- return { dispatched: "session_missing" };
308
- }
309
- }
310
- function notifyTaskDone() {
311
- try {
312
- const key = getSessionKey();
313
- if (key && !process.env.VITEST) {
314
- notifyParentExe(key);
315
- process.stderr.write(
316
- `[dispatch-audit] notifyTaskDone \u2192 parent coordinator (session=${key})
317
- `
318
- );
319
- }
320
- } catch {
321
- }
322
- }
323
- async function markTaskNotificationsRead(taskFile) {
324
- try {
325
- await markAsReadByTaskFile(taskFile);
326
- } catch {
327
151
  }
328
152
  }
329
153
 
@@ -434,17 +258,17 @@ async function updateTask(input) {
434
258
  const taskTitle = String(row.title);
435
259
  let delivered = false;
436
260
  try {
437
- const { sendIntercom: sendIntercom2, resolveExeSession: resolveExeSession2 } = await import("./lib/tmux-routing.js");
438
- const exeSession = row.session_scope ? String(row.session_scope) : resolveExeSession2();
261
+ const { sendIntercom, resolveExeSession } = await import("./lib/tmux-routing.js");
262
+ const exeSession = row.session_scope ? String(row.session_scope) : resolveExeSession();
439
263
  if (exeSession) {
440
264
  const reviewerSession = `${reviewer}-${exeSession}`;
441
- const result = sendIntercom2(reviewerSession, { reason: "completion" });
265
+ const result = sendIntercom(reviewerSession, { reason: "completion" });
442
266
  if (result !== "failed") {
443
267
  delivered = true;
444
268
  process.stderr.write(`[tasks] EVENT: notified reviewer "${reviewer}" via tmux for "${taskTitle}"
445
269
  `);
446
270
  } else if (isCoordinatorName(reviewer)) {
447
- const cooResult = sendIntercom2(exeSession, { reason: "completion" });
271
+ const cooResult = sendIntercom(exeSession, { reason: "completion" });
448
272
  if (cooResult !== "failed") {
449
273
  delivered = true;
450
274
  process.stderr.write(`[tasks] EVENT: notified coordinator "${reviewer}" for "${taskTitle}"
@@ -460,12 +284,16 @@ async function updateTask(input) {
460
284
  try {
461
285
  process.stderr.write(`[tasks] EVENT: tmux delivery failed for reviewer="${reviewer}". Queueing for daemon delivery.
462
286
  `);
463
- const { queueIntercom } = await import("./intercom-queue-RNM6EPGA.js");
464
- const { resolveExeSession: resolveExeSession2 } = await import("./lib/tmux-routing.js");
465
- const exeSession = row.session_scope ? String(row.session_scope) : resolveExeSession2();
287
+ const { queueIntercom } = await import("./intercom-queue-A6UJEFIF.js");
288
+ const { resolveExeSession } = await import("./lib/tmux-routing.js");
289
+ const exeSession = row.session_scope ? String(row.session_scope) : resolveExeSession();
466
290
  if (exeSession) {
467
291
  const reviewerSession = isCoordinatorName(reviewer) ? exeSession : `${reviewer}-${exeSession}`;
468
- queueIntercom(reviewerSession, `Review ready: "${taskTitle}" by ${String(row.assigned_to)}. Run /exe-review.`);
292
+ queueIntercom(
293
+ reviewerSession,
294
+ `Review ready: "${taskTitle}" by ${String(row.assigned_to)}. Run /exe-review.`,
295
+ "completion"
296
+ );
469
297
  }
470
298
  } catch (e) {
471
299
  process.stderr.write(`[tasks] EVENT: intercom queue failed: ${e instanceof Error ? e.message : String(e)}
@@ -473,7 +301,7 @@ async function updateTask(input) {
473
301
  }
474
302
  }
475
303
  try {
476
- const { pushNotifyAsync } = await import("./push-notifications-E2XXEWJZ.js");
304
+ const { pushNotifyAsync } = await import("./push-notifications-AMHVR6DF.js");
477
305
  pushNotifyAsync({
478
306
  event: "review_ready",
479
307
  title: `Review ready: ${taskTitle.slice(0, 50)}`,
@@ -485,7 +313,7 @@ async function updateTask(input) {
485
313
  }
486
314
  if (!isCoordinator) {
487
315
  try {
488
- const { pushNotifyAsync } = await import("./push-notifications-E2XXEWJZ.js");
316
+ const { pushNotifyAsync } = await import("./push-notifications-AMHVR6DF.js");
489
317
  const event = input.status === "needs_review" ? "review_ready" : "task_complete";
490
318
  pushNotifyAsync({
491
319
  event,
@@ -500,14 +328,15 @@ async function updateTask(input) {
500
328
  await markTaskNotificationsRead(taskFile);
501
329
  if (input.status === "needs_review" && !isCoordinator) {
502
330
  try {
503
- const { writeNotification: writeNotification2 } = await import("./notifications-4P2PVEOT.js");
331
+ const { writeNotification: writeNotification2 } = await import("./notifications-P3XQZDTH.js");
504
332
  await writeNotification2({
505
333
  agentId: String(row.assigned_to),
506
334
  agentRole: String(row.assigned_to),
507
335
  event: "task_complete",
508
336
  project: String(row.project_name),
509
337
  summary: `"${String(row.title)}" is ready for review`,
510
- taskFile
338
+ taskFile,
339
+ sessionScope: row.session_scope ? String(row.session_scope) : void 0
511
340
  });
512
341
  } catch (e) {
513
342
  process.stderr.write(`[tasks] needs_review notification failed: ${e instanceof Error ? e.message : String(e)}