@askexenow/exe-os 0.9.239 → 0.9.243

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 (316) 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 +23 -4
  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/scan-tasks.js +13 -13
  65. package/dist/bin/setup.js +3 -3
  66. package/dist/bin/shard-migrate.js +8 -8
  67. package/dist/bin/stack-update.js +324 -20
  68. package/dist/bin/verify-stack.js +3 -383
  69. package/dist/bin/vps-backup.js +8 -160
  70. package/dist/bin/vps-health-gate.js +10 -220
  71. package/dist/{branding-I7YYX4FM.js → branding-XWMO5EDR.js} +1 -1
  72. package/dist/{capacity-monitor-IFCZKRPG.js → capacity-monitor-4CSBC7AP.js} +14 -14
  73. package/dist/{catchup-brief-PIDRWXOW.js → catchup-brief-LF5Z6Q6E.js} +17 -17
  74. package/dist/{chunk-FGJUGDNM.js → chunk-222SI7QC.js} +14 -14
  75. package/dist/{chunk-JZMVLAZ2.js → chunk-2WBBVEIB.js} +1 -1
  76. package/dist/{chunk-JDOE33C2.js → chunk-3V53HH5T.js} +4 -4
  77. package/dist/{chunk-2KZSKURT.js → chunk-57SULZJ2.js} +3 -3
  78. package/dist/{chunk-QI4IXJN7.js → chunk-5CHYEKMH.js} +7 -4
  79. package/dist/chunk-5DMAMQNU.js +168 -0
  80. package/dist/{chunk-PLQAFB3Z.js → chunk-5JIG2FP2.js} +1 -1
  81. package/dist/{chunk-UWQ3XCDG.js → chunk-5WK7X5CF.js} +2 -2
  82. package/dist/{chunk-DDPAQ4LT.js → chunk-6JAGJN77.js} +2 -2
  83. package/dist/{chunk-7F37NMKB.js → chunk-73UE2PHT.js} +1 -1
  84. package/dist/{chunk-JL3K5OTS.js → chunk-7IZWLMTP.js} +1 -1
  85. package/dist/{chunk-ELRRL2NC.js → chunk-A4K2ZT6N.js} +4 -4
  86. package/dist/{chunk-GWYADLIW.js → chunk-AHXEU5XB.js} +1 -1
  87. package/dist/{chunk-WSHMBME6.js → chunk-AWRL5FGM.js} +19 -78
  88. package/dist/{chunk-OMPCFLWA.js → chunk-BSPOEYAO.js} +1 -1
  89. package/dist/{chunk-DHVC4RN7.js → chunk-CBDPEJOR.js} +5 -5
  90. package/dist/{chunk-2H55BIV2.js → chunk-CEJO7244.js} +2 -2
  91. package/dist/{chunk-FKWZVO2T.js → chunk-CPXGLSIL.js} +3 -3
  92. package/dist/{chunk-HX5G4AS4.js → chunk-CWITU7DW.js} +2 -2
  93. package/dist/{chunk-5GG7MTRJ.js → chunk-DGBGIXCC.js} +4 -4
  94. package/dist/{chunk-IQXPMK46.js → chunk-DLZYAYVM.js} +60 -14
  95. package/dist/{chunk-PPYWQV2M.js → chunk-DR5BGWFR.js} +2 -2
  96. package/dist/{chunk-BZWKTFEB.js → chunk-ENVRFBTB.js} +2 -2
  97. package/dist/{chunk-DUVO2PUJ.js → chunk-F3GM6OOP.js} +4 -4
  98. package/dist/{chunk-HNLPLLE6.js → chunk-F7JLZXHC.js} +60 -26
  99. package/dist/{chunk-AL4DRC5H.js → chunk-FFLILAG6.js} +1 -1
  100. package/dist/{chunk-BZNI4OK5.js → chunk-GHEWRYMY.js} +18 -2
  101. package/dist/{chunk-C7SFJO5F.js → chunk-GHT4REOS.js} +5 -5
  102. package/dist/{chunk-FBWUJEXS.js → chunk-HANG6NLF.js} +4 -6
  103. package/dist/{chunk-5NJ4A4ZA.js → chunk-HCBMPZDT.js} +1 -1
  104. package/dist/chunk-HOGTZLVU.js +244 -0
  105. package/dist/{chunk-IQSCZDBQ.js → chunk-I5PIBL56.js} +3 -3
  106. package/dist/chunk-IRHNV4GY.js +388 -0
  107. package/dist/{chunk-F4TCKCKK.js → chunk-ITZVPCBQ.js} +33 -12
  108. package/dist/{chunk-4HROS3GJ.js → chunk-IZVKWBIP.js} +1 -1
  109. package/dist/{chunk-DKI5BTBC.js → chunk-J7V7LPPX.js} +2 -2
  110. package/dist/{chunk-TOZ5NN5V.js → chunk-JLKUVK5J.js} +1 -1
  111. package/dist/{chunk-4SC65UBG.js → chunk-JLNXKG3K.js} +1 -1
  112. package/dist/{chunk-KVSQOG3W.js → chunk-K2BDE2B5.js} +4 -4
  113. package/dist/{chunk-KDJRFJDL.js → chunk-K333WOW4.js} +30 -2
  114. package/dist/{chunk-6LBCUA2A.js → chunk-KEZXW3RP.js} +1 -1
  115. package/dist/{chunk-W7G3GY4I.js → chunk-KLQI7QY4.js} +3 -3
  116. package/dist/{chunk-UODVZGBQ.js → chunk-KN7LPTIB.js} +1 -1
  117. package/dist/{chunk-ESKBZN4Q.js → chunk-L4WRH3DL.js} +1 -1
  118. package/dist/{chunk-VFQKKMKE.js → chunk-LAOB5BKV.js} +2 -2
  119. package/dist/{chunk-MAN5LZQ4.js → chunk-LQSFP2BV.js} +1 -1
  120. package/dist/{chunk-EJ7LOTV2.js → chunk-LSFHEMVI.js} +9 -9
  121. package/dist/{chunk-RA2RO27E.js → chunk-MCESA5UW.js} +2 -2
  122. package/dist/{chunk-UPMHG7ET.js → chunk-MEIHREPM.js} +1 -1
  123. package/dist/{chunk-D5C56WO3.js → chunk-MOZ2YQ54.js} +1 -1
  124. package/dist/{chunk-CLGB3FGL.js → chunk-MPX3TRMQ.js} +2 -2
  125. package/dist/{chunk-5R75ODPS.js → chunk-NBY6R37W.js} +61 -232
  126. package/dist/{chunk-RWFGXC35.js → chunk-NEYQAEYU.js} +7 -7
  127. package/dist/{chunk-MBHZDXGN.js → chunk-NL35XNLI.js} +1 -1
  128. package/dist/{chunk-TPQVLYSV.js → chunk-NLGMHPEN.js} +1 -1
  129. package/dist/{chunk-5LMH4YHG.js → chunk-NRVV4Y5V.js} +4 -4
  130. package/dist/{chunk-GN5VHPPR.js → chunk-NVZR7T4E.js} +1 -1
  131. package/dist/{chunk-Y2L7RMGH.js → chunk-NWBHL5PI.js} +1 -1
  132. package/dist/{chunk-YPYDLW75.js → chunk-OEMX65EA.js} +1 -1
  133. package/dist/{chunk-UAFUGPKO.js → chunk-ONAQAL3O.js} +1 -1
  134. package/dist/{chunk-AVM7XZE4.js → chunk-OWQ3CCYJ.js} +7 -6
  135. package/dist/{chunk-K525WLL7.js → chunk-PI6V23GF.js} +5 -4
  136. package/dist/{chunk-AURM7FOT.js → chunk-Q2OAQPWY.js} +1 -1
  137. package/dist/{chunk-FB5VRO5S.js → chunk-QLDWASTX.js} +28 -32
  138. package/dist/{chunk-EPWDTS2Q.js → chunk-QMTGMCWB.js} +1 -1
  139. package/dist/{chunk-VI2FJY2M.js → chunk-QP4FHME2.js} +2 -2
  140. package/dist/{chunk-NJWK6J4N.js → chunk-QUNKPR6Y.js} +5 -5
  141. package/dist/{chunk-O6DAF2TY.js → chunk-QUZVAHO7.js} +2 -2
  142. package/dist/{chunk-VHKL4S4T.js → chunk-RRHSONV5.js} +2 -2
  143. package/dist/{chunk-GPF6X6HE.js → chunk-RYDHEWYY.js} +2 -2
  144. package/dist/{chunk-C2YS2AA6.js → chunk-U7WOVXBB.js} +2 -2
  145. package/dist/chunk-UIRWDGMB.js +230 -0
  146. package/dist/{chunk-FE45RXGC.js → chunk-V2GZMY6O.js} +1 -1
  147. package/dist/{chunk-PATCHPNY.js → chunk-VHALWCUO.js} +1 -1
  148. package/dist/{chunk-HLZSC5WK.js → chunk-VQAP35DA.js} +20 -18
  149. package/dist/{chunk-452XB7OZ.js → chunk-VRIMTCX2.js} +1 -1
  150. package/dist/{chunk-SUNYJ6YE.js → chunk-VT2B5BHM.js} +1 -1
  151. package/dist/{chunk-UZIJDYDA.js → chunk-VWVJVQDH.js} +2 -2
  152. package/dist/{chunk-TRZ5KA2R.js → chunk-VXIMSRTO.js} +2 -2
  153. package/dist/{chunk-DAZIV4QZ.js → chunk-WCXZF42W.js} +1 -1
  154. package/dist/{chunk-6OJJF4WP.js → chunk-XJUUWHVN.js} +1 -1
  155. package/dist/{chunk-F7LU65PQ.js → chunk-Y25OJWOQ.js} +14 -2
  156. package/dist/{chunk-2ORPA23Y.js → chunk-YMXXD2GW.js} +36 -8
  157. package/dist/{chunk-5WLMF6PL.js → chunk-YMZHTTOQ.js} +1 -1
  158. package/dist/{chunk-7DIDOQCX.js → chunk-YRVW57UW.js} +139 -125
  159. package/dist/{chunk-BRFH5X7G.js → chunk-Z7VDUS6L.js} +1 -1
  160. package/dist/{chunk-YFE6W75D.js → chunk-ZKFPHJIJ.js} +1 -1
  161. package/dist/{chunk-5WUTKDH6.js → chunk-ZVXJSQOR.js} +1 -1
  162. package/dist/{co-activation-VB4CJQZB.js → co-activation-L6I2LSJO.js} +3 -3
  163. package/dist/{co-occurrence-XZQJJIBM.js → co-occurrence-QARWYUAY.js} +3 -3
  164. package/dist/{code-context-index-FCQOPUEA.js → code-context-index-UIYQRDHD.js} +4 -4
  165. package/dist/{content-extractor-SPSH5X33.js → content-extractor-EYRVGD6O.js} +2 -2
  166. package/dist/{conversation-wiki-populator-YU35LNRK.js → conversation-wiki-populator-L7O6F3BB.js} +1 -1
  167. package/dist/{crdt-sync-KXETGV45.js → crdt-sync-R6YROKDH.js} +1 -1
  168. package/dist/{crm-webhook-JMOAHTJ6.js → crm-webhook-WK3PYJJK.js} +2 -2
  169. package/dist/{cto-delegation-gate-IJ3KQIKF.js → cto-delegation-gate-5JZORQIT.js} +12 -12
  170. package/dist/{daemon-auth-2IZACWSG.js → daemon-auth-2HEOL6VG.js} +2 -2
  171. package/dist/{daemon-orchestration-ZCY4GEI3.js → daemon-orchestration-BJ3T5MMF.js} +16 -15
  172. package/dist/{db-backup-HLX5OLIV.js → db-backup-EWS52P2W.js} +2 -2
  173. package/dist/{dreaming-2CJML3TU.js → dreaming-BOSBDRI3.js} +13 -13
  174. package/dist/{entity-boost-T5IYWWDZ.js → entity-boost-6ZVX7DFB.js} +26 -2
  175. package/dist/{exe-drift-P5OIRNSH.js → exe-drift-WRE6RADZ.js} +4 -4
  176. package/dist/{exe-export-QQL2H322.js → exe-export-7N5PBCMK.js} +8 -8
  177. package/dist/{exe-import-V4RJCUEP.js → exe-import-YOOE7S3H.js} +8 -8
  178. package/dist/{exe-key-MENJGDD7.js → exe-key-GXJSTCX2.js} +4 -4
  179. package/dist/{exe-org-3FNET2J7.js → exe-org-42YMQL75.js} +2 -2
  180. package/dist/{exe-snapshot-YRARQE7F.js → exe-snapshot-ODUCFW7G.js} +18 -18
  181. package/dist/{fast-db-init-HIJWWKAO.js → fast-db-init-YSR7RMVZ.js} +1 -1
  182. package/dist/{founder-context-BQ5NBDUV.js → founder-context-Q2HUCZX4.js} +2 -2
  183. package/dist/gateway/index.js +9 -9
  184. package/dist/{gateway-client-YGSA5QMC.js → gateway-client-4QXHKN5C.js} +1 -1
  185. package/dist/{git-staleness-IHTKCUMN.js → git-staleness-BJDTCDPC.js} +3 -3
  186. package/dist/{git-task-sweep-5ZPNQS7Y.js → git-task-sweep-L3U3T5HM.js} +13 -13
  187. package/dist/{global-procedures-XHDIZRJU.js → global-procedures-HCHEHKY2.js} +4 -4
  188. package/dist/{graph-auto-extract-5TPT67GP.js → graph-auto-extract-FP5C76LS.js} +3 -3
  189. package/dist/{hook-integrity-SB53Y7UK.js → hook-integrity-2OU3T6UC.js} +1 -1
  190. package/dist/hooks/bug-report-worker.js +15 -14
  191. package/dist/hooks/codex-stop-task-finalizer.js +15 -14
  192. package/dist/hooks/commit-complete.js +16 -16
  193. package/dist/hooks/error-recall.js +10 -10
  194. package/dist/hooks/exe-heartbeat-hook.js +5 -5
  195. package/dist/hooks/ingest-worker.js +8 -8
  196. package/dist/hooks/ingest.js +13 -13
  197. package/dist/hooks/instructions-loaded.js +7 -7
  198. package/dist/hooks/manifest.json +20 -20
  199. package/dist/hooks/notification.js +6 -6
  200. package/dist/hooks/post-compact.js +15 -15
  201. package/dist/hooks/post-tool-combined.js +7 -7
  202. package/dist/hooks/pre-compact.js +20 -20
  203. package/dist/hooks/pre-tool-use.js +28 -25
  204. package/dist/hooks/prompt-submit.js +62 -31
  205. package/dist/hooks/session-end.js +26 -26
  206. package/dist/hooks/session-start.js +39 -15
  207. package/dist/hooks/stop.js +22 -22
  208. package/dist/hooks/subagent-stop.js +15 -15
  209. package/dist/hooks/summary-worker.js +32 -27
  210. package/dist/index.js +21 -21
  211. package/dist/{installer-AMZM4MLS.js → installer-AWMUCRN4.js} +7 -7
  212. package/dist/{installer-KT5FW4CN.js → installer-HB3NH6FG.js} +9 -9
  213. package/dist/{installer-HW74W3IT.js → installer-RU6EVOBL.js} +6 -6
  214. package/dist/{intercom-queue-RNM6EPGA.js → intercom-queue-A6UJEFIF.js} +1 -1
  215. package/dist/{key-backup-status-OZ2CXUDW.js → key-backup-status-4YKCV4ZV.js} +1 -1
  216. package/dist/lib/agent-config.js +2 -2
  217. package/dist/lib/cloud-sync.js +10 -8
  218. package/dist/lib/config.js +1 -1
  219. package/dist/lib/consolidation.js +8 -8
  220. package/dist/lib/database.js +3 -3
  221. package/dist/lib/db-daemon-client.js +3 -3
  222. package/dist/lib/db.js +3 -3
  223. package/dist/lib/device-registry.js +1 -1
  224. package/dist/lib/embedder.js +4 -4
  225. package/dist/lib/employee-templates.js +5 -5
  226. package/dist/lib/employees.js +3 -3
  227. package/dist/lib/exe-daemon-client.js +3 -3
  228. package/dist/lib/exe-daemon.js +105 -74
  229. package/dist/lib/hybrid-search.js +8 -8
  230. package/dist/lib/identity.js +3 -3
  231. package/dist/lib/keychain.js +1 -1
  232. package/dist/lib/license.js +2 -2
  233. package/dist/lib/messaging.js +13 -13
  234. package/dist/lib/post-tool-memory.js +3 -3
  235. package/dist/lib/reminders.js +4 -4
  236. package/dist/lib/schedules.js +8 -8
  237. package/dist/lib/session-registry.js +5 -5
  238. package/dist/lib/skill-learning.js +5 -5
  239. package/dist/lib/store.js +7 -7
  240. package/dist/lib/task-router.js +4 -4
  241. package/dist/lib/tasks.js +14 -13
  242. package/dist/lib/tmux-routing.js +12 -12
  243. package/dist/lib/token-spend.js +4 -4
  244. package/dist/lib/ws-client.js +1 -1
  245. package/dist/{license-gate-XJDIL6OZ.js → license-gate-6JQQFBHS.js} +3 -3
  246. package/dist/mcp/register-tools.js +68 -67
  247. package/dist/mcp/server.js +70 -69
  248. package/dist/mcp/tools/complete-reminder.js +5 -5
  249. package/dist/mcp/tools/create-reminder.js +5 -5
  250. package/dist/mcp/tools/create-task.js +16 -15
  251. package/dist/mcp/tools/deactivate-behavior.js +6 -6
  252. package/dist/mcp/tools/list-reminders.js +5 -5
  253. package/dist/mcp/tools/list-tasks.js +16 -15
  254. package/dist/mcp/tools/send-message.js +15 -15
  255. package/dist/mcp/tools/update-task.js +15 -14
  256. package/dist/{mcp-http-config-BXX3RZPR.js → mcp-http-config-XIJR5P2Z.js} +4 -4
  257. package/dist/{memory-cards-KRTP5GFM.js → memory-cards-H4BJJ5OK.js} +3 -3
  258. package/dist/{memory-graph-extractor-G532PUHC.js → memory-graph-extractor-SDGM3GVR.js} +4 -4
  259. package/dist/{memory-poisoning-defense-HJM3FQA3.js → memory-poisoning-defense-UVU67DGJ.js} +3 -3
  260. package/dist/{memory-queue-FTNBWLS4.js → memory-queue-FNT5WHXP.js} +2 -2
  261. package/dist/{memory-queue-client-DHSHEIHQ.js → memory-queue-client-JZCFYTWQ.js} +5 -5
  262. package/dist/{memory-reflection-RANRFUQL.js → memory-reflection-GGB5K35L.js} +3 -3
  263. package/dist/{notifications-4P2PVEOT.js → notifications-P3XQZDTH.js} +12 -12
  264. package/dist/{orchestration-events-IYTASMSN.js → orchestration-events-25WEKUKH.js} +4 -4
  265. package/dist/{orchestration-phase-SGA7PJ5G.js → orchestration-phase-C26XVKLZ.js} +2 -2
  266. package/dist/{orchestrator-VKVHZ4MV.js → orchestrator-VIXTY4E4.js} +14 -14
  267. package/dist/{pipeline-router-E4L5BDXN.js → pipeline-router-S5PE5U6B.js} +4 -4
  268. package/dist/{plan-limits-5O5QG55H.js → plan-limits-DGIVM42H.js} +5 -5
  269. package/dist/{prediction-log-OMWHW7FL.js → prediction-log-DOEOHDHS.js} +1 -1
  270. package/dist/{project-boot-WMI6CWRX.js → project-boot-4ZL2W7DN.js} +12 -2
  271. package/dist/{projection-worker-54KRNQSO.js → projection-worker-GG2W5OM3.js} +3 -3
  272. package/dist/{push-notifications-E2XXEWJZ.js → push-notifications-AMHVR6DF.js} +2 -2
  273. package/dist/{reranker-4NTUFNYT.js → reranker-UCPLQZE2.js} +2 -2
  274. package/dist/{review-polling-BFRJDLUA.js → review-polling-P2MWEXLR.js} +13 -13
  275. package/dist/runtime/index.js +15 -15
  276. package/dist/{session-events-KCZCWGE4.js → session-events-5CD66R6U.js} +13 -13
  277. package/dist/{session-kill-telemetry-TMNIDYWY.js → session-kill-telemetry-7FBHTEDN.js} +4 -4
  278. package/dist/{session-scope-DRZBQ32Y.js → session-scope-VMIPAZU7.js} +12 -12
  279. package/dist/{setup-wizard-TQKGDAHO.js → setup-wizard-BNR47URR.js} +3 -3
  280. package/dist/{shard-manager-G6MHCO7X.js → shard-manager-VGA2TYHM.js} +2 -2
  281. package/dist/{skill-refinement-Z5SWD3AM.js → skill-refinement-NRG4WWRW.js} +3 -3
  282. package/dist/stack-release-PFZI22WC.js +521 -0
  283. package/dist/{stack-update-NO5MNARG.js → stack-update-JIWJGGLX.js} +3 -3
  284. package/dist/{steward-gate-7DWYS5AT.js → steward-gate-L7DJMF4C.js} +4 -4
  285. package/dist/{task-enforcement-2VL5J6JJ.js → task-enforcement-XQL77PZH.js} +52 -12
  286. package/dist/{task-scope-YHALISIB.js → task-scope-R3XKBIHL.js} +12 -12
  287. package/dist/{tasks-crud-JXZEBZFR.js → tasks-crud-DQOG2NPG.js} +12 -12
  288. package/dist/tasks-notify-4EQYG52H.js +37 -0
  289. package/dist/{tasks-review-PGPYJQF5.js → tasks-review-XPFJ4DSJ.js} +12 -12
  290. package/dist/{telemetry-upload-H7OJNBIF.js → telemetry-upload-OT5B5HUY.js} +7 -7
  291. package/dist/{token-budget-JJ7JQIA2.js → token-budget-D2LQKCAV.js} +3 -3
  292. package/dist/{tool-capability-index-WIV4K3FB.js → tool-capability-index-FAJ5ZHDF.js} +1 -1
  293. package/dist/{tool-telemetry-W4LFCHFT.js → tool-telemetry-QIF5BCLF.js} +1 -1
  294. package/dist/tui/App.js +26 -26
  295. package/dist/{tui-data-72U6N2DC.js → tui-data-UEV2QOR3.js} +108 -12
  296. package/dist/{whatsapp-config-W63RQ3AU.js → whatsapp-config-GOSELKTE.js} +7 -0
  297. package/dist/{worker-gate-SCSN6IHI.js → worker-gate-PRCKA23W.js} +2 -2
  298. package/dist/{workflow-engine-OICYBE4F.js → workflow-engine-7X6LLH3M.js} +2 -2
  299. package/dist/{worktree-JXN4RCWC.js → worktree-RICSCT2S.js} +5 -5
  300. package/package.json +1 -1
  301. package/release-notes.json +137 -297
  302. package/stack.release.json +4 -3
  303. package/dist/preflight-EAH2MI76.js +0 -287
  304. /package/dist/{chunk-H42LEGLB.js → chunk-AQBEG33D.js} +0 -0
  305. /package/dist/{chunk-AU5426YP.js → chunk-B7JGEDVE.js} +0 -0
  306. /package/dist/{chunk-YFDDTHNM.js → chunk-JXI4XUTV.js} +0 -0
  307. /package/dist/{chunk-SNYDRHV3.js → chunk-U3DUFHOT.js} +0 -0
  308. /package/dist/{chunk-N2XUH2HQ.js → chunk-VBPC7IC7.js} +0 -0
  309. /package/dist/{chunk-HTUJBTBM.js → chunk-VUS6WXQ3.js} +0 -0
  310. /package/dist/{chunk-NOLIN2YI.js → chunk-XAYRZHLV.js} +0 -0
  311. /package/dist/{core-memory-VOBGGB2Q.js → core-memory-4KAIKQRQ.js} +0 -0
  312. /package/dist/{message-queue-client-KAJN6TIJ.js → message-queue-client-S6W5VMJV.js} +0 -0
  313. /package/dist/{oauth-server-QEXRSXEP.js → oauth-server-2ESBZB7F.js} +0 -0
  314. /package/dist/{webhook-pipe-LY4XEDL7.js → webhook-pipe-ZRUVOG5H.js} +0 -0
  315. /package/dist/{wiki-acl-M3OR547L.js → wiki-acl-MFLSS6DE.js} +0 -0
  316. /package/dist/{wiki-client-MAFYBXCQ.js → wiki-client-GBPR45BQ.js} +0 -0
@@ -3,13 +3,45 @@ import {
3
3
  buildRawVisibilityFilter,
4
4
  buildWikiScopeFilter,
5
5
  searchMemories
6
- } from "./chunk-FGJUGDNM.js";
6
+ } from "./chunk-222SI7QC.js";
7
7
  import {
8
8
  getClient
9
- } from "./chunk-2H55BIV2.js";
9
+ } from "./chunk-CEJO7244.js";
10
10
 
11
11
  // src/lib/hybrid-search.ts
12
12
  var RRF_K = 60;
13
+ var DAEMON_SAFE_FTS_TERM_THRESHOLD = 3;
14
+ var DAEMON_SAFE_FTS_MAX_TERMS = 5;
15
+ var _daemonBroadFtsSkipLogged = false;
16
+ var _daemonGraphFtsSkipLogged = false;
17
+ function isDaemonProcess() {
18
+ return process.env.EXE_IS_DAEMON === "1";
19
+ }
20
+ function daemonSafeFtsTerms(terms) {
21
+ return isDaemonProcess() ? terms.slice(0, DAEMON_SAFE_FTS_MAX_TERMS) : terms;
22
+ }
23
+ function shouldUseFtsPrefix(terms) {
24
+ return !(isDaemonProcess() && terms.length >= DAEMON_SAFE_FTS_TERM_THRESHOLD);
25
+ }
26
+ function ftsTerm(term, usePrefix) {
27
+ return usePrefix ? `${term}*` : term;
28
+ }
29
+ function logDaemonBroadFtsSkipOnce(terms) {
30
+ if (_daemonBroadFtsSkipLogged || process.env.VITEST) return;
31
+ _daemonBroadFtsSkipLogged = true;
32
+ process.stderr.write(
33
+ `[hybrid-search] Daemon-safe FTS: skipped broad OR fallback for ${terms.length} terms to keep MCP responsive.
34
+ `
35
+ );
36
+ }
37
+ function logDaemonGraphFtsSkipOnce(terms) {
38
+ if (_daemonGraphFtsSkipLogged || process.env.VITEST) return;
39
+ _daemonGraphFtsSkipLogged = true;
40
+ process.stderr.write(
41
+ `[hybrid-search] Daemon-safe FTS: skipped graph/entity FTS for ${terms.length} terms to keep MCP responsive.
42
+ `
43
+ );
44
+ }
13
45
  var _cardinalityCache = /* @__PURE__ */ new Map();
14
46
  var CARDINALITY_TTL_MS = 6e4;
15
47
  setInterval(() => {
@@ -19,6 +51,10 @@ setInterval(() => {
19
51
  }
20
52
  }, 5 * 60 * 1e3).unref();
21
53
  async function getCachedCardinality(agentId) {
54
+ if (process.env.VITEST === "true" || process.env.NODE_ENV === "test") {
55
+ const { getMemoryCardinality: getMemoryCardinality2 } = await import("./lib/store.js");
56
+ return getMemoryCardinality2(agentId);
57
+ }
22
58
  const cached = _cardinalityCache.get(agentId);
23
59
  if (cached && Date.now() < cached.expires) return cached.count;
24
60
  const { getMemoryCardinality } = await import("./lib/store.js");
@@ -58,9 +94,15 @@ async function graphSearch(query, agentId, _options, limit) {
58
94
  const client = getClient();
59
95
  const queryWords = query.toLowerCase().split(/\s+/).filter((w) => w.length >= 3).map((w) => w.replace(/[^a-z0-9_-]/g, "")).filter((w) => w.length >= 3);
60
96
  if (queryWords.length === 0) return [];
97
+ if (isDaemonProcess() && queryWords.length >= DAEMON_SAFE_FTS_TERM_THRESHOLD) {
98
+ logDaemonGraphFtsSkipOnce(queryWords);
99
+ return [];
100
+ }
61
101
  let entityIds = [];
62
102
  try {
63
- const matchExpr = queryWords.map((w) => `${w}*`).join(" OR ");
103
+ const safeWords = daemonSafeFtsTerms(queryWords);
104
+ const usePrefix = shouldUseFtsPrefix(safeWords);
105
+ const matchExpr = safeWords.map((w) => ftsTerm(w, usePrefix)).join(" OR ");
64
106
  const ftsResult = await client.execute({
65
107
  sql: `SELECT e.id FROM entities e
66
108
  JOIN entities_fts fts ON e.rowid = fts.rowid
@@ -246,7 +288,7 @@ async function hybridSearch(queryText, agentId, options) {
246
288
  let rerankerAvailable = false;
247
289
  if (process.env.EXE_IS_DAEMON === "1") {
248
290
  try {
249
- const { isRerankerAvailable } = await import("./reranker-4NTUFNYT.js");
291
+ const { isRerankerAvailable } = await import("./reranker-UCPLQZE2.js");
250
292
  rerankerAvailable = isRerankerAvailable();
251
293
  } catch {
252
294
  }
@@ -301,7 +343,7 @@ async function hybridSearch(queryText, agentId, options) {
301
343
  ]).catch(() => []),
302
344
  includeStructuredCards ? (async () => {
303
345
  try {
304
- const { searchMemoryCards } = await import("./memory-cards-KRTP5GFM.js");
346
+ const { searchMemoryCards } = await import("./memory-cards-H4BJJ5OK.js");
305
347
  return await searchMemoryCards(effectiveQuery, agentId, fetchOptions);
306
348
  } catch {
307
349
  return [];
@@ -310,7 +352,7 @@ async function hybridSearch(queryText, agentId, options) {
310
352
  // Reflection insights: patterns, contradictions, summaries across sessions
311
353
  includeStructuredCards ? (async () => {
312
354
  try {
313
- const { searchReflections } = await import("./memory-reflection-RANRFUQL.js");
355
+ const { searchReflections } = await import("./memory-reflection-GGB5K35L.js");
314
356
  const insights = await searchReflections(effectiveQuery, agentId, 5);
315
357
  return insights.map((ins) => ({
316
358
  id: ins.id,
@@ -386,7 +428,7 @@ async function hybridSearch(queryText, agentId, options) {
386
428
  let entityBoostRan = false;
387
429
  if (merged.length > 0) {
388
430
  try {
389
- const { applyEntityBoost } = await import("./entity-boost-T5IYWWDZ.js");
431
+ const { applyEntityBoost } = await import("./entity-boost-6ZVX7DFB.js");
390
432
  const boosted = await applyEntityBoost(merged, effectiveQuery, getClient());
391
433
  merged = boosted.results;
392
434
  graphContextMap = boosted.graphContext;
@@ -410,7 +452,7 @@ async function hybridSearch(queryText, agentId, options) {
410
452
  try {
411
453
  let rerankedRecords;
412
454
  if (graphContextMap.size > 0) {
413
- const { rerankWithContext } = await import("./reranker-4NTUFNYT.js");
455
+ const { rerankWithContext } = await import("./reranker-UCPLQZE2.js");
414
456
  const candidates = merged.map((m) => ({
415
457
  text: m.raw_text,
416
458
  context: graphContextMap.get(m.id)
@@ -418,7 +460,7 @@ async function hybridSearch(queryText, agentId, options) {
418
460
  const scored = await rerankWithContext(effectiveQuery, candidates, rerankReturnLimit);
419
461
  rerankedRecords = scored.map((s) => merged[s.index]);
420
462
  } else {
421
- const { rerank } = await import("./reranker-4NTUFNYT.js");
463
+ const { rerank } = await import("./reranker-UCPLQZE2.js");
422
464
  rerankedRecords = await rerank(effectiveQuery, merged, rerankReturnLimit);
423
465
  }
424
466
  if (rerankedRecords.length > 0) {
@@ -714,16 +756,18 @@ async function lightweightSearch(queryText, agentId, options) {
714
756
  }
715
757
  const allTerms = queryText.toLowerCase().split(/\s+/).filter((t) => t.length >= 3).map((t) => t.replace(/[^a-z0-9_]/g, "")).filter((t) => t.length >= 3 && !FTS_STOP_WORDS.has(t));
716
758
  const contentTerms = allTerms.filter((t) => !nameTermsSet.has(t));
717
- const terms = contentTerms.length > 0 ? contentTerms : allTerms;
759
+ const terms = daemonSafeFtsTerms(contentTerms.length > 0 ? contentTerms : allTerms);
718
760
  if (terms.length === 0) {
719
761
  return recentRecords(agentId, options, limit);
720
762
  }
721
- const prefixTerms = terms.map((t) => `${t}*`);
763
+ const usePrefixTerms = shouldUseFtsPrefix(terms);
764
+ const prefixTerms = terms.map((t) => ftsTerm(t, usePrefixTerms));
722
765
  const useAnd = terms.length >= 3;
723
766
  const innerExpr = useAnd ? prefixTerms.join(" AND ") : prefixTerms.join(" OR ");
724
767
  const matchExpr = `{raw_text keywords}: ${innerExpr}`;
725
768
  const results = await ftsQuery(client, matchExpr, agentId, options, limit);
726
- if (useAnd && results.length < limit) {
769
+ const broadOrFallbackIsSafe = !isDaemonProcess() || terms.length < DAEMON_SAFE_FTS_TERM_THRESHOLD;
770
+ if (useAnd && results.length < limit && broadOrFallbackIsSafe) {
727
771
  const orExpr = `{raw_text keywords}: ${prefixTerms.join(" OR ")}`;
728
772
  const orResults = await ftsQuery(client, orExpr, agentId, options, limit);
729
773
  const seen = new Set(results.map((r) => r.id));
@@ -733,13 +777,15 @@ async function lightweightSearch(queryText, agentId, options) {
733
777
  seen.add(r.id);
734
778
  }
735
779
  }
780
+ } else if (useAnd && results.length < limit && !broadOrFallbackIsSafe) {
781
+ logDaemonBroadFtsSkipOnce(terms);
736
782
  }
737
783
  if (options?.includeSource && results.length > 0) {
738
784
  await attachDocumentMetadata(results);
739
785
  }
740
786
  if (results.length >= 2) {
741
787
  try {
742
- const { recordCoActivations } = await import("./co-activation-VB4CJQZB.js");
788
+ const { recordCoActivations } = await import("./co-activation-L6I2LSJO.js");
743
789
  const ids = results.slice(0, 10).map((r) => r.id);
744
790
  void recordCoActivations(ids);
745
791
  } catch {
@@ -747,7 +793,7 @@ async function lightweightSearch(queryText, agentId, options) {
747
793
  }
748
794
  if (options?.includeStructuredCards !== true) return results;
749
795
  try {
750
- const { searchMemoryCards } = await import("./memory-cards-KRTP5GFM.js");
796
+ const { searchMemoryCards } = await import("./memory-cards-H4BJJ5OK.js");
751
797
  const cardResults = await searchMemoryCards(queryText, agentId, options);
752
798
  if (cardResults.length > 0) {
753
799
  return rrfMergeMulti([results, cardResults], limit, RRF_K, [1, 0.85]);
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  initStore
3
- } from "./chunk-FGJUGDNM.js";
3
+ } from "./chunk-222SI7QC.js";
4
4
  import {
5
5
  getClient,
6
6
  isInitialized
7
- } from "./chunk-2H55BIV2.js";
7
+ } from "./chunk-CEJO7244.js";
8
8
 
9
9
  // src/lib/schedules.ts
10
10
  import crypto from "crypto";
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  enqueueMemory
3
- } from "./chunk-UPMHG7ET.js";
3
+ } from "./chunk-MEIHREPM.js";
4
4
  import {
5
5
  isClientConnected,
6
6
  sendDaemonRequest
7
- } from "./chunk-VHKL4S4T.js";
7
+ } from "./chunk-RRHSONV5.js";
8
8
 
9
9
  // src/lib/memory-queue-client.ts
10
10
  async function writeMemoryViaDaemon(entry) {
@@ -1,9 +1,9 @@
1
- import {
2
- buildClaudeHttpMcpEntry
3
- } from "./chunk-5WUTKDH6.js";
4
1
  import {
5
2
  loadPreferences
6
3
  } from "./chunk-GNHN5HRQ.js";
4
+ import {
5
+ buildClaudeHttpMcpEntry
6
+ } from "./chunk-ZVXJSQOR.js";
7
7
  import {
8
8
  EXE_HOOKS,
9
9
  isLegacyHomeDirHookCommand,
@@ -11,7 +11,7 @@ import {
11
11
  } from "./chunk-L3TB7CC3.js";
12
12
  import {
13
13
  ensureAllAgentSymlinks
14
- } from "./chunk-4SC65UBG.js";
14
+ } from "./chunk-JLNXKG3K.js";
15
15
  import {
16
16
  MCP_LEGACY_KEY,
17
17
  MCP_PRIMARY_KEY
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  ensureWorktree
3
- } from "./chunk-YFE6W75D.js";
3
+ } from "./chunk-ZKFPHJIJ.js";
4
4
  import {
5
5
  queueIntercom
6
- } from "./chunk-QI4IXJN7.js";
6
+ } from "./chunk-5CHYEKMH.js";
7
7
  import {
8
8
  buildTaskResult,
9
9
  serializeMessage
10
10
  } from "./chunk-4JERP7NT.js";
11
11
  import {
12
12
  registerSession
13
- } from "./chunk-BZNI4OK5.js";
13
+ } from "./chunk-GHEWRYMY.js";
14
14
  import {
15
15
  getTransport
16
16
  } from "./chunk-MVW62NIZ.js";
@@ -19,18 +19,18 @@ import {
19
19
  } from "./chunk-CX6GL3ZJ.js";
20
20
  import {
21
21
  recordOrchestrationEventBestEffort
22
- } from "./chunk-5NJ4A4ZA.js";
22
+ } from "./chunk-HCBMPZDT.js";
23
23
  import {
24
24
  getAgentRuntime,
25
25
  normalizeCcModelName
26
- } from "./chunk-6OJJF4WP.js";
26
+ } from "./chunk-XJUUWHVN.js";
27
27
  import {
28
28
  RUNTIME_TABLE
29
29
  } from "./chunk-NGP6LSV2.js";
30
30
  import {
31
31
  PlanLimitError,
32
32
  assertEmployeeLimitSync
33
- } from "./chunk-IQSCZDBQ.js";
33
+ } from "./chunk-I5PIBL56.js";
34
34
  import {
35
35
  getSessionKey
36
36
  } from "./chunk-CVYC6DUW.js";
@@ -45,7 +45,7 @@ import {
45
45
  } from "./chunk-MP2AFCGL.js";
46
46
  import {
47
47
  ensureAgentSymlink
48
- } from "./chunk-4SC65UBG.js";
48
+ } from "./chunk-JLNXKG3K.js";
49
49
  import {
50
50
  expandDualPrefixTools
51
51
  } from "./chunk-HYZV25LY.js";
@@ -57,13 +57,13 @@ import {
57
57
  isCoordinatorName,
58
58
  loadEmployees,
59
59
  loadEmployeesSync
60
- } from "./chunk-2H55BIV2.js";
60
+ } from "./chunk-CEJO7244.js";
61
61
  import {
62
62
  loadDeviceId
63
- } from "./chunk-D5C56WO3.js";
63
+ } from "./chunk-MOZ2YQ54.js";
64
64
  import {
65
65
  EXE_AI_DIR
66
- } from "./chunk-TRZ5KA2R.js";
66
+ } from "./chunk-VXIMSRTO.js";
67
67
  import {
68
68
  atomicWriteJsonSync,
69
69
  atomicWriteSync
@@ -527,7 +527,7 @@ async function createTaskCore(input) {
527
527
  if (isCoordinatorSession) {
528
528
  earlySessionScope = resolved;
529
529
  } else {
530
- const { getSessionProject } = await import("./session-scope-DRZBQ32Y.js");
530
+ const { getSessionProject } = await import("./session-scope-VMIPAZU7.js");
531
531
  const sessionProject = getSessionProject(resolved);
532
532
  if (sessionProject && sessionProject !== input.projectName) {
533
533
  scopeMismatchWarning = `session/project mismatch: session "${resolved}" owns "${sessionProject}" but task targets "${input.projectName}". Routed to default scope.`;
@@ -549,7 +549,7 @@ async function createTaskCore(input) {
549
549
  let blockedById = null;
550
550
  const initialStatus = input.blockedBy ? "blocked" : "open";
551
551
  if (input.blockedBy) {
552
- const blocker = await resolveTask(client, input.blockedBy);
552
+ const blocker = await resolveTask(client, input.blockedBy, earlySessionScope);
553
553
  blockedById = String(blocker.id);
554
554
  }
555
555
  let parentTaskId = null;
@@ -565,7 +565,7 @@ async function createTaskCore(input) {
565
565
  }
566
566
  if (parentRef) {
567
567
  try {
568
- const parent = await resolveTask(client, parentRef);
568
+ const parent = await resolveTask(client, parentRef, earlySessionScope);
569
569
  parentTaskId = String(parent.id);
570
570
  } catch (err) {
571
571
  if (!input.parentTaskId) {
@@ -776,7 +776,7 @@ async function queryTaskRows(opts) {
776
776
  }
777
777
  if (opts.founderId !== null) {
778
778
  try {
779
- const { founderScopeFilter } = await import("./founder-context-BQ5NBDUV.js");
779
+ const { founderScopeFilter } = await import("./founder-context-Q2HUCZX4.js");
780
780
  const founderFilter = founderScopeFilter(opts.founderId);
781
781
  const cleaned = founderFilter.sql.replace(/^\s*AND\s+/, "");
782
782
  conditions.push(cleaned);
@@ -811,7 +811,16 @@ async function listTasks(input) {
811
811
  const queryOpts = {
812
812
  assignedTo: input.assignedTo,
813
813
  status: input.status || void 0,
814
- projectName: input.projectName === void 0 ? void 0 : input.projectName || null,
814
+ // Public listTasks() must not silently scope to process.cwd().
815
+ // MCP/tool callers resolve project scope explicitly before calling here.
816
+ // Auto-detecting from this library made isolated test DB rows invisible
817
+ // (fixtures use arbitrary project names) and, in the daemon, could hide
818
+ // real cross-project tasks because the shared daemon cwd is exe-os.
819
+ //
820
+ // Lower-level queryTaskRows() keeps its historical auto-detect behavior for
821
+ // daemon/hook callers that deliberately omit projectName. listTasks()
822
+ // defaults to project-unscoped unless the caller provides a project.
823
+ projectName: input.projectName === void 0 ? null : input.projectName || null,
815
824
  // Skip session scope when querying your own tasks — agents must ALWAYS see
816
825
  // their own work regardless of which coordinator session created the task.
817
826
  // Bug: bob-exe1 couldn't see tasks created by exe1 because session_scope='exe1'
@@ -985,7 +994,7 @@ async function updateTaskStatus(input) {
985
994
  } catch {
986
995
  }
987
996
  try {
988
- const { writeNotification: writeNotification2 } = await import("./notifications-4P2PVEOT.js");
997
+ const { writeNotification: writeNotification2 } = await import("./notifications-P3XQZDTH.js");
989
998
  await writeNotification2({
990
999
  agentId: reviewer,
991
1000
  agentRole: isCoordinatorName(reviewer) ? "COO" : "manager",
@@ -1400,7 +1409,7 @@ ${input.result ?? ""}`;
1400
1409
  }
1401
1410
  if (shouldWriteCompletionMemory && input.result) {
1402
1411
  try {
1403
- const { writeMemoryViaDaemon } = await import("./memory-queue-client-DHSHEIHQ.js");
1412
+ const { writeMemoryViaDaemon } = await import("./memory-queue-client-JZCFYTWQ.js");
1404
1413
  await writeMemoryViaDaemon({
1405
1414
  raw_text: input.result,
1406
1415
  agent_id: String(row.assigned_to),
@@ -1503,7 +1512,7 @@ ${input.result ?? ""}`;
1503
1512
  }
1504
1513
  if (input.status === "done" || input.status === "needs_review") {
1505
1514
  try {
1506
- const { incrementSkillSuccess } = await import("./skill-refinement-Z5SWD3AM.js");
1515
+ const { incrementSkillSuccess } = await import("./skill-refinement-NRG4WWRW.js");
1507
1516
  await incrementSkillSuccess(
1508
1517
  String(row.assigned_to),
1509
1518
  row.project_name ? String(row.project_name) : null
@@ -1513,7 +1522,7 @@ ${input.result ?? ""}`;
1513
1522
  }
1514
1523
  if (input.status === "done" || input.status === "needs_review" || input.status === "cancelled" || input.status === "closed") {
1515
1524
  try {
1516
- const { clearQueueForAgent } = await import("./intercom-queue-RNM6EPGA.js");
1525
+ const { clearQueueForAgent } = await import("./intercom-queue-A6UJEFIF.js");
1517
1526
  clearQueueForAgent(String(row.assigned_to));
1518
1527
  } catch {
1519
1528
  }
@@ -2138,9 +2147,9 @@ async function markDoneTaskNotificationsAsRead(sessionScope) {
2138
2147
  AND task_file IS NOT NULL
2139
2148
  ${scope.sql}
2140
2149
  AND task_file IN (
2141
- SELECT task_file FROM tasks WHERE status = 'done'${scope.sql}
2150
+ SELECT task_file FROM tasks WHERE status IN ('done', 'closed', 'cancelled')
2142
2151
  )`,
2143
- args: [...scope.args, ...scope.args]
2152
+ args: [...scope.args]
2144
2153
  });
2145
2154
  return result.rowsAffected;
2146
2155
  } catch {
@@ -2461,7 +2470,8 @@ async function createReviewForCompletedTask(row, result, _baseDir, now) {
2461
2470
  event: "task_complete",
2462
2471
  project: String(row.project_name),
2463
2472
  summary: `completed "${taskTitle}" \u2014 ready for review`,
2464
- taskFile
2473
+ taskFile,
2474
+ sessionScope: row.session_scope ? String(row.session_scope) : void 0
2465
2475
  });
2466
2476
  const autoApprove = false;
2467
2477
  if (!autoApprove) {
@@ -2560,6 +2570,22 @@ async function cleanupReviewFile(row, taskFile, _baseDir) {
2560
2570
  }
2561
2571
  }
2562
2572
 
2573
+ // src/lib/intercom-prompts.ts
2574
+ function formatIntercomPrompt(reason = "nudge") {
2575
+ switch (reason) {
2576
+ case "completion":
2577
+ return "An employee completed work. Run task(action='list', status='needs_review') to review it.";
2578
+ case "message":
2579
+ return "You have a new message. Run message(action='acknowledge') after reading it, and check task(action='list') only if the message references work.";
2580
+ case "notification":
2581
+ return "You have pending notifications. Run task(action='list', status='needs_review') and task(action='list', status='open') to check actionable work.";
2582
+ case "signal":
2583
+ case "nudge":
2584
+ default:
2585
+ return "P0: You have a new task dispatched. Run task(action='list', status='open') to find it. Start immediately.";
2586
+ }
2587
+ }
2588
+
2563
2589
  // src/lib/tmux-routing.ts
2564
2590
  var SPAWN_LOCK_DIR = path5.join(os4.homedir(), ".exe-os", "spawn-locks");
2565
2591
  function spawnLockPath(sessionName) {
@@ -2971,7 +2997,7 @@ async function verifyPaneAtCapacity(sessionName) {
2971
2997
  reason: `capture-pane failed: ${err instanceof Error ? err.message : String(err)}`
2972
2998
  };
2973
2999
  }
2974
- const { isAtCapacity } = await import("./capacity-monitor-IFCZKRPG.js");
3000
+ const { isAtCapacity } = await import("./capacity-monitor-4CSBC7AP.js");
2975
3001
  if (!isAtCapacity(pane)) {
2976
3002
  return {
2977
3003
  atCapacity: false,
@@ -3116,6 +3142,13 @@ function sendIntercom(targetSession, opts) {
3116
3142
  tmuxSession: targetSession,
3117
3143
  payload: { reason, force: Boolean(opts?.force) }
3118
3144
  });
3145
+ const isVitest = process.env.VITEST === "true" || process.env.NODE_ENV === "test";
3146
+ const transportName = transport.constructor?.name ?? "";
3147
+ if (isVitest && transportName === "TmuxTransport" && process.env.EXE_TEST_ALLOW_REAL_INTERCOM !== "1") {
3148
+ logIntercom(`SUPPRESSED_TEST \u2192 ${targetSession} (real tmux intercom disabled under Vitest)`);
3149
+ recordResult("debounced", "test_real_tmux_suppressed");
3150
+ return "debounced";
3151
+ }
3119
3152
  try {
3120
3153
  const callerScope = resolveExeSession();
3121
3154
  if (callerScope && isExeSession(callerScope) && targetSession.includes("-")) {
@@ -3156,14 +3189,14 @@ function sendIntercom(targetSession, opts) {
3156
3189
  }
3157
3190
  const sessionState = getSessionState(targetSession);
3158
3191
  if (sessionState === "no_claude") {
3159
- queueIntercom(targetSession, "claude not running in session");
3192
+ queueIntercom(targetSession, "claude not running in session", reason);
3160
3193
  const batched2 = recordDebounce(targetSession);
3161
3194
  logIntercom(`QUEUED \u2192 ${targetSession} (no claude process)${batched2 > 0 ? ` [${batched2} batched]` : ""}`);
3162
3195
  recordResult("queued", "no_claude");
3163
3196
  return "queued";
3164
3197
  }
3165
3198
  if (!opts?.force && (sessionState === "thinking" || sessionState === "tool")) {
3166
- queueIntercom(targetSession, "session busy at send time");
3199
+ queueIntercom(targetSession, "session busy at send time", reason);
3167
3200
  const batched2 = recordDebounce(targetSession);
3168
3201
  logIntercom(`QUEUED \u2192 ${targetSession} (session busy)${batched2 > 0 ? ` [${batched2} batched]` : ""}`);
3169
3202
  recordResult("queued", "session_busy");
@@ -3186,7 +3219,7 @@ function sendIntercom(targetSession, opts) {
3186
3219
  logIntercom(`COPY_MODE \u2192 ${targetSession} (exiting copy mode first)`);
3187
3220
  transport.sendKeys(targetSession, "q");
3188
3221
  }
3189
- const msg = reason === "completion" ? `An employee completed work. Run task(action='list', status='needs_review') to review it.` : `P0: You have a new task dispatched. Run task(action='list', status='open') to find it. Start immediately.`;
3222
+ const msg = formatIntercomPrompt(reason);
3190
3223
  transport.sendKeysLiteral(targetSession, msg);
3191
3224
  const batched = recordDebounce(targetSession);
3192
3225
  logIntercom(`DELIVERED \u2192 ${targetSession}${batched > 0 ? ` [${batched} nudges batched during debounce]` : ""} (fire-and-forget)`);
@@ -3787,6 +3820,7 @@ export {
3787
3820
  getReviewChecklist,
3788
3821
  createReviewForCompletedTask,
3789
3822
  cleanupReviewFile,
3823
+ formatIntercomPrompt,
3790
3824
  acquireSpawnLock,
3791
3825
  releaseSpawnLock,
3792
3826
  getMySession,
@@ -2,7 +2,7 @@ import {
2
2
  getClient,
3
3
  isCoordinatorName,
4
4
  loadEmployeesSync
5
- } from "./chunk-2H55BIV2.js";
5
+ } from "./chunk-CEJO7244.js";
6
6
 
7
7
  // src/lib/steward-gate.ts
8
8
  import crypto from "crypto";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  recordOrchestrationEventBestEffort
3
- } from "./chunk-5NJ4A4ZA.js";
3
+ } from "./chunk-HCBMPZDT.js";
4
4
 
5
5
  // src/lib/session-registry.ts
6
6
  import { readFileSync, writeFileSync, mkdirSync, existsSync } from "fs";
@@ -135,7 +135,23 @@ function checkSessionRegistryConsistency(liveSessionsOverride) {
135
135
  return result;
136
136
  }
137
137
  function looksLikeExeOsSession(sessionName) {
138
- return /^exe\d*$/.test(sessionName) || /-exe\d*$/.test(sessionName);
138
+ const coordName = getCoordinatorNameCached();
139
+ const escaped = coordName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
140
+ const coordPattern = new RegExp(`^${escaped}\\d*$`);
141
+ const employeePattern = new RegExp(`-${escaped}\\d*$`);
142
+ return coordPattern.test(sessionName) || employeePattern.test(sessionName);
143
+ }
144
+ function getCoordinatorNameCached() {
145
+ try {
146
+ const rosterPath = path.join(os.homedir(), ".exe-os", "exe-employees.json");
147
+ if (existsSync(rosterPath)) {
148
+ const roster = JSON.parse(readFileSync(rosterPath, "utf8"));
149
+ const coo = roster.find((e) => (e.role ?? "").toUpperCase() === "COO");
150
+ if (coo?.name) return coo.name;
151
+ }
152
+ } catch {
153
+ }
154
+ return "exe";
139
155
  }
140
156
 
141
157
  export {
@@ -1,24 +1,24 @@
1
1
  import {
2
2
  recordSessionKill
3
- } from "./chunk-452XB7OZ.js";
3
+ } from "./chunk-VRIMTCX2.js";
4
4
  import {
5
5
  sessionScopeFilter,
6
6
  verifyPaneAtCapacity,
7
7
  writeNotification
8
- } from "./chunk-HNLPLLE6.js";
8
+ } from "./chunk-F7JLZXHC.js";
9
9
  import {
10
10
  listSessions
11
- } from "./chunk-BZNI4OK5.js";
11
+ } from "./chunk-GHEWRYMY.js";
12
12
  import {
13
13
  getTransport
14
14
  } from "./chunk-MVW62NIZ.js";
15
15
  import {
16
16
  recordOrchestrationEventBestEffort
17
- } from "./chunk-5NJ4A4ZA.js";
17
+ } from "./chunk-HCBMPZDT.js";
18
18
  import {
19
19
  getClient,
20
20
  isCoordinatorName
21
- } from "./chunk-2H55BIV2.js";
21
+ } from "./chunk-CEJO7244.js";
22
22
 
23
23
  // src/lib/capacity-monitor.ts
24
24
  var CAPACITY_PATTERNS = [
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  getActiveAgent
3
- } from "./chunk-RA2RO27E.js";
3
+ } from "./chunk-MCESA5UW.js";
4
4
  import {
5
5
  listTasks
6
- } from "./chunk-HNLPLLE6.js";
6
+ } from "./chunk-F7JLZXHC.js";
7
7
 
8
8
  // src/mcp/tools/list-tasks.ts
9
9
  import { z } from "zod";
@@ -23,12 +23,10 @@ function registerListTasks(server) {
23
23
  },
24
24
  async ({ assigned_to, status, project_name, priority, cross_session }) => {
25
25
  try {
26
- const { agentId, agentRole } = getActiveAgent();
26
+ const { agentId } = getActiveAgent();
27
27
  const isOwnQuery = assigned_to && assigned_to === agentId;
28
28
  const resolvedProject = project_name && project_name !== "all" ? project_name : null;
29
- const { canCoordinate: canCoord } = await import("./lib/employees.js");
30
- const isCoord = canCoord(agentId, agentRole);
31
- const effectiveCrossSession = isCoord ? cross_session ?? true : false;
29
+ const effectiveCrossSession = cross_session === true;
32
30
  const tasks = await listTasks({
33
31
  assignedTo: assigned_to,
34
32
  status,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getClient
3
- } from "./chunk-2H55BIV2.js";
3
+ } from "./chunk-CEJO7244.js";
4
4
 
5
5
  // src/lib/orchestration-events.ts
6
6
  import crypto from "crypto";