@askexenow/exe-os 0.9.365 → 0.9.368

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 (357) hide show
  1. package/deploy/compose/.env.askexe-control-plane.example +3 -1
  2. package/deploy/compose/.env.customer.example +6 -2
  3. package/deploy/compose/.env.example +8 -2
  4. package/deploy/compose/docker-compose.yml +21 -2
  5. package/deploy/compose/generate-env.ts +21 -1
  6. package/dist/.dist-verified.json +3 -3
  7. package/dist/{active-agent-MGF7J3HB.js → active-agent-6WNC756A.js} +3 -3
  8. package/dist/{active-agent-C6DPH43L.js → active-agent-RDTJGZHP.js} +3 -3
  9. package/dist/{agent-defs-generator-X7TVMPVB.js → agent-defs-generator-M5AUL3WM.js} +2 -2
  10. package/dist/agent-heartbeat-CQPGJIFF.js +13 -0
  11. package/dist/{agent-loop-E7RZCFDB.js → agent-loop-FOK2IRZQ.js} +1 -1
  12. package/dist/{agentic-ontology-CARDCG37.js → agentic-ontology-ZJBRYETW.js} +1 -1
  13. package/dist/{backfill-metadata-ANCJA6LA.js → backfill-metadata-Q4X23XLR.js} +5 -5
  14. package/dist/{backup-verify-F7BHVEF7.js → backup-verify-UKLX6IEK.js} +1 -1
  15. package/dist/behavior-injection-C3HEKSJY.js +60 -0
  16. package/dist/{behaviors-R2IE3PEN.js → behaviors-UCMAREU3.js} +8 -6
  17. package/dist/bin/agentic-ontology-backfill.js +6 -6
  18. package/dist/bin/agentic-reflection-backfill.js +7 -7
  19. package/dist/bin/agentic-semantic-label.js +6 -6
  20. package/dist/bin/backfill-conversations.js +5 -5
  21. package/dist/bin/backfill-responses.js +5 -5
  22. package/dist/bin/backfill-vectors.js +6 -6
  23. package/dist/bin/bulk-sync-postgres.js +10 -10
  24. package/dist/bin/cc-doctor.js +5 -5
  25. package/dist/bin/cleanup-stale-review-tasks.js +15 -14
  26. package/dist/bin/cli.js +20 -20
  27. package/dist/bin/deferred-daemon-restart.js +88 -83
  28. package/dist/bin/exe-agent-config.js +2 -2
  29. package/dist/bin/exe-agent.js +252 -14
  30. package/dist/bin/exe-assign.js +6 -6
  31. package/dist/bin/exe-boot.js +33 -31
  32. package/dist/bin/exe-call.js +4 -4
  33. package/dist/bin/exe-cloud.js +11 -11
  34. package/dist/bin/exe-config-dump.js +2 -2
  35. package/dist/bin/exe-dispatch.js +16 -15
  36. package/dist/bin/exe-doctor.js +6 -6
  37. package/dist/bin/exe-export-behaviors.js +10 -8
  38. package/dist/bin/exe-forget.js +7 -7
  39. package/dist/bin/exe-gateway.js +7 -7
  40. package/dist/bin/exe-healthcheck.js +5 -5
  41. package/dist/bin/exe-heartbeat.js +18 -17
  42. package/dist/bin/exe-kill.js +19 -18
  43. package/dist/bin/exe-launch-agent.js +25 -23
  44. package/dist/bin/exe-mcp.js +3 -3
  45. package/dist/bin/exe-memory-reads.js +5 -5
  46. package/dist/bin/exe-new-employee.js +8 -8
  47. package/dist/bin/exe-os-mcp-proxy.js +3 -3
  48. package/dist/bin/exe-pending-messages.js +16 -15
  49. package/dist/bin/exe-pending-notifications.js +15 -14
  50. package/dist/bin/exe-pending-reviews.js +15 -14
  51. package/dist/bin/exe-rename.js +4 -4
  52. package/dist/bin/exe-review.js +18 -17
  53. package/dist/bin/exe-search.js +6 -6
  54. package/dist/bin/exe-session-cleanup.js +20 -18
  55. package/dist/bin/exe-settings.js +10 -10
  56. package/dist/bin/exe-start-codex.js +81 -19
  57. package/dist/bin/exe-start-opencode.js +11 -9
  58. package/dist/bin/exe-status.js +17 -16
  59. package/dist/bin/exe-support.js +3 -3
  60. package/dist/bin/exe-team.js +4 -4
  61. package/dist/bin/exe-verify-running-images.js +123 -4
  62. package/dist/bin/exe-watchdog.js +44 -3
  63. package/dist/bin/git-sweep.js +25 -15
  64. package/dist/bin/graph-backfill.js +7 -7
  65. package/dist/bin/graph-export.js +6 -6
  66. package/dist/bin/import-history.js +10 -10
  67. package/dist/bin/install.js +90 -85
  68. package/dist/bin/intercom-check.js +4 -4
  69. package/dist/bin/mcp-sessions.js +2 -2
  70. package/dist/bin/orchestration-metrics.js +4 -4
  71. package/dist/bin/postgres-agentic-reflection-backfill.js +4 -4
  72. package/dist/bin/postgres-agentic-semantic-backfill.js +4 -4
  73. package/dist/bin/reconcile-backlog.js +47 -6
  74. package/dist/bin/registry-proxy.js +1 -1
  75. package/dist/bin/scan-tasks.js +15 -14
  76. package/dist/bin/setup.js +1 -1
  77. package/dist/bin/shard-migrate.js +5 -5
  78. package/dist/bin/stack-update.js +35 -6
  79. package/dist/bin/verify-stack.js +11 -1
  80. package/dist/bin/vps-health-gate.js +1 -1
  81. package/dist/{boot-generation-X45BSVZY.js → boot-generation-7H7Y4KC2.js} +3 -3
  82. package/dist/{boot-review-sections-OBVRXXSF.js → boot-review-sections-4AGCECCP.js} +14 -13
  83. package/dist/build-manifest.json +910 -845
  84. package/dist/{capability-cards-57FURUMR.js → capability-cards-6KAC5D2Z.js} +2 -2
  85. package/dist/{capacity-monitor-QEL62JDO.js → capacity-monitor-J2Y4SFLA.js} +16 -15
  86. package/dist/{catchup-brief-PMXTCASA.js → catchup-brief-F2HKF2CU.js} +19 -18
  87. package/dist/{chunk-5CBGH6RA.js → chunk-2AS6FG6C.js} +3 -3
  88. package/dist/{chunk-TO6TB75E.js → chunk-2UBMXN4D.js} +2 -2
  89. package/dist/{chunk-J6I7X272.js → chunk-2UGU3V63.js} +1 -1
  90. package/dist/{chunk-45EQTS7B.js → chunk-34BMZTWV.js} +1 -1
  91. package/dist/{chunk-JYFYIGYK.js → chunk-4DGIOK6T.js} +1 -1
  92. package/dist/{chunk-T6S45OLV.js → chunk-4GVJIMMK.js} +12 -6
  93. package/dist/{chunk-IXEFO6HD.js → chunk-4L732DE5.js} +3 -3
  94. package/dist/{chunk-MXEIZUXG.js → chunk-4RRMZJLG.js} +1 -1
  95. package/dist/{chunk-3JNVB5LG.js → chunk-5IVLOOJR.js} +1 -1
  96. package/dist/chunk-5YKNEL3W.js +356 -0
  97. package/dist/{chunk-EMZHB767.js → chunk-6EXOW5ZA.js} +9 -9
  98. package/dist/{chunk-6Q263OZE.js → chunk-6P7DVFKA.js} +1 -1
  99. package/dist/{chunk-ZDUO6QBH.js → chunk-6UZ3DEQI.js} +1 -1
  100. package/dist/{chunk-DJK45U7B.js → chunk-72JZQ7EV.js} +1 -1
  101. package/dist/{chunk-22YQBVMO.js → chunk-72QUZX6J.js} +4 -4
  102. package/dist/{chunk-DYWGIPVP.js → chunk-AAL6CDMQ.js} +7 -7
  103. package/dist/{chunk-E6ORBQHP.js → chunk-AAMGHW5W.js} +1 -0
  104. package/dist/{chunk-EJ4522YM.js → chunk-AJGX4Z34.js} +1 -1
  105. package/dist/{chunk-M7EES2KM.js → chunk-BEPO36MW.js} +3 -3
  106. package/dist/{chunk-WR75WUEP.js → chunk-BFL3UB77.js} +1 -1
  107. package/dist/{chunk-NV6A5HDN.js → chunk-BFPQXPN3.js} +1 -1
  108. package/dist/{chunk-VGE6IHZB.js → chunk-BJKC6ZJU.js} +110 -86
  109. package/dist/{chunk-R7RM766N.js → chunk-BLNSUBP3.js} +3 -3
  110. package/dist/{chunk-52TIQJEQ.js → chunk-BNDHQGOY.js} +1 -1
  111. package/dist/{chunk-QYJANQWC.js → chunk-BPQWRR4H.js} +2 -2
  112. package/dist/{chunk-ANPE3TT3.js → chunk-BTGR55GX.js} +3 -3
  113. package/dist/chunk-BTSWFMEH.js +14 -0
  114. package/dist/{chunk-OPNROU5B.js → chunk-C4IJ5IS5.js} +1 -1
  115. package/dist/{chunk-BEHLIRRJ.js → chunk-C5FOA5GO.js} +14 -3
  116. package/dist/{chunk-EHHMNKOA.js → chunk-CSBD7QLZ.js} +1 -1
  117. package/dist/{chunk-EKVTRI3N.js → chunk-CU2OUUSV.js} +27 -6
  118. package/dist/{chunk-P47MPWNU.js → chunk-CXHRNESJ.js} +1 -1
  119. package/dist/{chunk-F2S3M5MB.js → chunk-DRMGPZSC.js} +2 -2
  120. package/dist/{chunk-KRUYQFSH.js → chunk-DYPKSVB7.js} +5 -5
  121. package/dist/{chunk-KSVLBATT.js → chunk-E5QQZDQN.js} +53 -0
  122. package/dist/{chunk-ODBRU6BF.js → chunk-EDB3LXBQ.js} +1542 -984
  123. package/dist/{chunk-IIZITKBV.js → chunk-EDRXCUEP.js} +4 -4
  124. package/dist/{chunk-4QKKLK3C.js → chunk-ELY5WBZX.js} +10 -10
  125. package/dist/{chunk-MPQXQ5IE.js → chunk-EZUSIF66.js} +1 -1
  126. package/dist/{chunk-DEFSN2FQ.js → chunk-FHYX64H3.js} +3 -3
  127. package/dist/{chunk-YMJOLEPE.js → chunk-FSALI4B7.js} +4 -4
  128. package/dist/{chunk-6GQYPJPG.js → chunk-FWKTZURC.js} +8 -8
  129. package/dist/{chunk-EWZYFG5Q.js → chunk-FWVPGXHD.js} +5 -5
  130. package/dist/{chunk-DWAQOEXL.js → chunk-GILYOIMP.js} +2 -2
  131. package/dist/{chunk-RZIKSE6N.js → chunk-GP3J3AOT.js} +4 -4
  132. package/dist/{chunk-LHOKWZKL.js → chunk-H6J7N3BZ.js} +1 -1
  133. package/dist/{chunk-EVPBYX2Z.js → chunk-HQSUXAB4.js} +1 -1
  134. package/dist/{chunk-IM2I7OOS.js → chunk-HTLJHSN4.js} +1 -1
  135. package/dist/{chunk-JUOZLXLH.js → chunk-HXV3DGL7.js} +1 -1
  136. package/dist/{chunk-OFGFRT5J.js → chunk-IEE6X6R2.js} +1 -1
  137. package/dist/{chunk-SP37DONS.js → chunk-IKRIUEIF.js} +1 -1
  138. package/dist/{chunk-RHX6MNWY.js → chunk-J44774XC.js} +1 -1
  139. package/dist/{chunk-7C4FUNVO.js → chunk-J77ZIMH5.js} +5 -5
  140. package/dist/{chunk-NO3M2AFM.js → chunk-JDPV7W2L.js} +1 -1
  141. package/dist/{chunk-FXPAUDCZ.js → chunk-KGPWS4KE.js} +1 -1
  142. package/dist/{chunk-L3TB7CC3.js → chunk-KM6XSFHP.js} +12 -2
  143. package/dist/{chunk-ZEKCHV43.js → chunk-KWQ7RHYD.js} +4 -4
  144. package/dist/{chunk-QFIVK3G5.js → chunk-KYVIV54Y.js} +1 -1
  145. package/dist/chunk-KZXMP6JG.js +319 -0
  146. package/dist/{chunk-AGQAGOQN.js → chunk-LJWCK2DR.js} +9 -9
  147. package/dist/{chunk-O2MEBF23.js → chunk-MCXYNYZI.js} +30 -2
  148. package/dist/{chunk-L2VZBPJJ.js → chunk-MWEIBVBS.js} +13 -1
  149. package/dist/{chunk-RVWALVDT.js → chunk-MXP27XTP.js} +2 -2
  150. package/dist/{chunk-DQ5KHWFD.js → chunk-N3CGSO3S.js} +1 -1
  151. package/dist/{chunk-ZNEBZCZR.js → chunk-NNXPIJRB.js} +1 -1
  152. package/dist/{chunk-MZJBUAC3.js → chunk-NWE3CFX7.js} +4 -4
  153. package/dist/{chunk-BRLS5OLZ.js → chunk-OBESOWFJ.js} +35 -4
  154. package/dist/{chunk-5KLQCGI5.js → chunk-OL3QP3AU.js} +171 -1
  155. package/dist/{chunk-ESTR7QUP.js → chunk-P3PAD6AA.js} +1 -1
  156. package/dist/{chunk-2FYIMTQE.js → chunk-PGF5I7EV.js} +2 -2
  157. package/dist/{agent-heartbeat-I5UPGXAU.js → chunk-PHUHIVD5.js} +4 -5
  158. package/dist/{chunk-C3UAQ3JG.js → chunk-PVWM2WMM.js} +1 -1
  159. package/dist/{chunk-EWCEUO65.js → chunk-QCSAYYL6.js} +1 -1
  160. package/dist/{chunk-SBAU735L.js → chunk-QE5KWKVU.js} +27 -6
  161. package/dist/{chunk-LZKYVMBY.js → chunk-QKZEUCTS.js} +2 -2
  162. package/dist/{chunk-POPRJKAY.js → chunk-QS6HI4B6.js} +6 -0
  163. package/dist/{chunk-JNVQGLPX.js → chunk-QT6CNCXO.js} +3 -3
  164. package/dist/{chunk-J4U5Z7VX.js → chunk-QZYYCPNL.js} +4 -4
  165. package/dist/{chunk-RD4E5G3B.js → chunk-RDIZSXXD.js} +1 -1
  166. package/dist/{chunk-2RQT7TED.js → chunk-RFWOXKVL.js} +55 -3
  167. package/dist/chunk-S2YTU74T.js +76 -0
  168. package/dist/{chunk-X6A2VWVJ.js → chunk-TP7BFVQP.js} +2 -2
  169. package/dist/{chunk-CKG6CVKI.js → chunk-TTJWPV4G.js} +1 -1
  170. package/dist/chunk-TX3Q2GIL.js +97 -0
  171. package/dist/{chunk-Q7BU5Q6I.js → chunk-UATT6BNO.js} +3 -3
  172. package/dist/{chunk-PPGPCWRC.js → chunk-UVM5ZXO2.js} +4 -4
  173. package/dist/{chunk-BATQKSLI.js → chunk-V7E37GE3.js} +2 -2
  174. package/dist/{chunk-U373MEF5.js → chunk-VD3CVNGB.js} +3 -3
  175. package/dist/{chunk-ZSZPMUNX.js → chunk-VIW62NN5.js} +126 -7
  176. package/dist/{chunk-EPNWEOOE.js → chunk-VTOO5UB3.js} +10 -10
  177. package/dist/chunk-W5MCOZTW.js +304 -0
  178. package/dist/{chunk-2ESB5SDP.js → chunk-WJOJWRN5.js} +139 -33
  179. package/dist/{chunk-CPILYY2K.js → chunk-X4MRVNR3.js} +1 -1
  180. package/dist/{chunk-EPDNWY5P.js → chunk-XBTQPQN7.js} +1 -1
  181. package/dist/{behavior-injection-XQ4B7DCF.js → chunk-XOTDAKJL.js} +24 -38
  182. package/dist/{chunk-ORNCMRIX.js → chunk-Y4AYNLXU.js} +31 -37
  183. package/dist/{chunk-WYLFDSIE.js → chunk-YGPJ7VSJ.js} +48 -10
  184. package/dist/{chunk-ZRKEUCUZ.js → chunk-ZR3VMM3X.js} +12 -10
  185. package/dist/{chunk-JITNFE4W.js → chunk-ZWONQU5S.js} +1 -1
  186. package/dist/{cleanup-graph-garbage-CAA625RJ.js → cleanup-graph-garbage-FBSQI33K.js} +8 -8
  187. package/dist/{cloud-sync-command-DBB7WRHL.js → cloud-sync-command-NHGVDTLM.js} +11 -3
  188. package/dist/{cloud-sync-db-init-V7IB23W5.js → cloud-sync-db-init-I75VOTXC.js} +1 -1
  189. package/dist/{cloud-sync-shutdown-2D3B73CJ.js → cloud-sync-shutdown-JGOFGGET.js} +2 -2
  190. package/dist/{cloud-sync-state-5DFKLWNB.js → cloud-sync-state-QF3TMMJ4.js} +3 -1
  191. package/dist/{co-activation-JVN7EBS6.js → co-activation-AE5L2SJV.js} +2 -2
  192. package/dist/{co-occurrence-526PTFGT.js → co-occurrence-O65D4SCN.js} +6 -6
  193. package/dist/codex-consolidation-PPXNBXCV.js +96 -0
  194. package/dist/{conversation-entity-extractor-JO56DB2E.js → conversation-entity-extractor-LFIDTD2O.js} +4 -4
  195. package/dist/{crdt-sync-LIJLZKFE.js → crdt-sync-NRWDBRSE.js} +1 -1
  196. package/dist/{crm-webhook-55F7Y6D2.js → crm-webhook-XOQGX6DV.js} +2 -2
  197. package/dist/{cto-delegation-gate-QIYV4KFO.js → cto-delegation-gate-ZGOAXQI2.js} +14 -13
  198. package/dist/{daemon-orchestration-Q3GJA2JJ.js → daemon-orchestration-ZMQWYYDT.js} +19 -18
  199. package/dist/dispatch-intent-journal-VV6HMZC4.js +17 -0
  200. package/dist/{doc-graph-extractor-P46R4QME.js → doc-graph-extractor-6C5JBKPP.js} +6 -6
  201. package/dist/{documents-7KFEREWO.js → documents-FKSQGSO4.js} +6 -6
  202. package/dist/{dreaming-JMUXBAPU.js → dreaming-IB3H6NDZ.js} +18 -17
  203. package/dist/{employee-boot-brief-HN63D2BY.js → employee-boot-brief-5YRTUEJH.js} +25 -21
  204. package/dist/{exe-drift-7J7GX7DP.js → exe-drift-CUWUYX3O.js} +3 -3
  205. package/dist/{exe-export-KJ7B2OBU.js → exe-export-XWENYJNM.js} +7 -7
  206. package/dist/{exe-import-HPZDWKGE.js → exe-import-OWOMRF2S.js} +7 -7
  207. package/dist/{exe-key-2PREP464.js → exe-key-P356FGK5.js} +88 -83
  208. package/dist/{exe-org-VEIISATF.js → exe-org-UKIVF3KE.js} +8 -8
  209. package/dist/{exe-snapshot-JXQFLUKA.js → exe-snapshot-AZI2WW5Y.js} +19 -18
  210. package/dist/{fast-db-init-SCXJXOYX.js → fast-db-init-FPAPF3GB.js} +1 -1
  211. package/dist/{founder-context-U2SZPLYV.js → founder-context-QTQ6V3B5.js} +2 -2
  212. package/dist/gateway/index.js +11 -11
  213. package/dist/{git-staleness-S4NDR7NX.js → git-staleness-6ACWLV5Q.js} +2 -2
  214. package/dist/{global-procedures-ZOFTOXIR.js → global-procedures-RXIKBVLZ.js} +3 -3
  215. package/dist/{graph-auto-extract-CLVTSUSB.js → graph-auto-extract-Q4A4QMOF.js} +6 -6
  216. package/dist/{graph-rag-LSJLWGXV.js → graph-rag-RLRQMY54.js} +4 -4
  217. package/dist/{hook-integrity-SGTKBL6W.js → hook-integrity-3X2JRLBM.js} +1 -1
  218. package/dist/{hook-prefetch-BDSLB6F4.js → hook-prefetch-DU44UZQP.js} +15 -14
  219. package/dist/hooks/bug-report-worker.js +19 -18
  220. package/dist/hooks/codex-stop-task-finalizer.js +20 -19
  221. package/dist/hooks/commit-complete.js +35 -19
  222. package/dist/hooks/error-recall.js +8 -8
  223. package/dist/hooks/exe-heartbeat-hook.js +4 -4
  224. package/dist/hooks/ingest-worker.js +2 -2
  225. package/dist/hooks/ingest.js +11 -11
  226. package/dist/hooks/instructions-loaded.js +5 -5
  227. package/dist/hooks/manifest.json +20 -20
  228. package/dist/hooks/notification.js +5 -5
  229. package/dist/hooks/post-compact.js +4 -4
  230. package/dist/hooks/post-tool-combined.js +12 -12
  231. package/dist/hooks/pre-compact.js +18 -17
  232. package/dist/hooks/pre-tool-use.js +86 -34
  233. package/dist/hooks/prompt-submit.js +36 -31
  234. package/dist/hooks/session-end.js +114 -100
  235. package/dist/hooks/session-start.js +16 -16
  236. package/dist/hooks/stop.js +83 -20
  237. package/dist/hooks/subagent-stop.js +19 -18
  238. package/dist/hooks/summary-worker.js +23 -22
  239. package/dist/index.js +27 -26
  240. package/dist/{installer-RC2JCKSE.js → installer-B7QYQE56.js} +8 -6
  241. package/dist/{installer-EA7T3PBD.js → installer-EXR25DDG.js} +6 -6
  242. package/dist/{installer-KCEM4RCG.js → installer-TOPA7673.js} +152 -8
  243. package/dist/{intercom-queue-6DZPHHQ2.js → intercom-queue-BZ4M3L4S.js} +14 -13
  244. package/dist/lib/cloud-sync.js +10 -10
  245. package/dist/lib/consolidation.js +8 -8
  246. package/dist/lib/database.js +2 -2
  247. package/dist/lib/db-backup.js +1 -1
  248. package/dist/lib/db-write-worker.js +3 -3
  249. package/dist/lib/db.js +2 -2
  250. package/dist/lib/delivery-truth.js +25 -0
  251. package/dist/lib/device-registry.js +1 -1
  252. package/dist/lib/employee-templates.js +4 -4
  253. package/dist/lib/employees.js +2 -2
  254. package/dist/lib/exe-daemon.js +185 -79
  255. package/dist/lib/hybrid-search.js +6 -6
  256. package/dist/lib/identity.js +2 -2
  257. package/dist/lib/license.js +2 -2
  258. package/dist/lib/messaging.js +15 -14
  259. package/dist/lib/registry-proxy.js +1 -1
  260. package/dist/lib/reminders.js +3 -3
  261. package/dist/lib/schedules.js +6 -6
  262. package/dist/lib/session-registry.js +4 -4
  263. package/dist/lib/skill-learning.js +7 -7
  264. package/dist/lib/status-brief.js +2 -1
  265. package/dist/lib/store.js +5 -5
  266. package/dist/lib/task-router.js +3 -3
  267. package/dist/lib/tasks.js +16 -15
  268. package/dist/lib/tmux-routing.js +14 -13
  269. package/dist/lib/token-spend.js +3 -3
  270. package/dist/{license-gate-HMSMUIAU.js → license-gate-YTIOLKVV.js} +3 -3
  271. package/dist/{license-sync-FBCMPC4J.js → license-sync-5VE5OSTV.js} +2 -2
  272. package/dist/mcp/register-tools.js +87 -82
  273. package/dist/mcp/server.js +90 -85
  274. package/dist/mcp/tools/complete-reminder.js +4 -4
  275. package/dist/mcp/tools/create-reminder.js +4 -4
  276. package/dist/mcp/tools/create-task.js +26 -23
  277. package/dist/mcp/tools/deactivate-behavior.js +8 -8
  278. package/dist/mcp/tools/list-reminders.js +4 -4
  279. package/dist/mcp/tools/list-tasks.js +18 -17
  280. package/dist/mcp/tools/send-message.js +17 -16
  281. package/dist/mcp/tools/update-task.js +17 -16
  282. package/dist/{mcp-http-config-YKJN52HG.js → mcp-http-config-XUNRIGQH.js} +3 -3
  283. package/dist/{mcp-session-identity-QLUVYWPR.js → mcp-session-identity-4UIG7KLK.js} +14 -13
  284. package/dist/{memory-cards-K2OSX4AW.js → memory-cards-R74YU4CO.js} +5 -5
  285. package/dist/{memory-graph-extractor-YLTSKLSY.js → memory-graph-extractor-3B4QJUXI.js} +7 -7
  286. package/dist/{memory-poisoning-defense-IPO4ADRL.js → memory-poisoning-defense-OAKFL5O2.js} +2 -2
  287. package/dist/{memory-pressure-watchdog-ZI3TH2OF.js → memory-pressure-watchdog-FFC2CHFJ.js} +15 -14
  288. package/dist/{memory-reflection-ZKVRU3NT.js → memory-reflection-5IJ6RE2J.js} +2 -2
  289. package/dist/{notification-ledger-4REL6M3T.js → notification-ledger-P5XBUYKO.js} +17 -15
  290. package/dist/{notifications-UXJUAP3C.js → notifications-LLCCHRYV.js} +14 -13
  291. package/dist/{orchestration-events-GMRGGBMN.js → orchestration-events-VBGCIQSS.js} +3 -3
  292. package/dist/{orchestrator-5TV75HDJ.js → orchestrator-EB3SCTAJ.js} +16 -15
  293. package/dist/{org-brief-session-7AZZEO3F.js → org-brief-session-GDCDKBFF.js} +6 -6
  294. package/dist/{org-consent-policy-XT6UZENB.js → org-consent-policy-HCD42NBN.js} +2 -2
  295. package/dist/{org-partner-runtime-WLZAZJIY.js → org-partner-runtime-TPVKFR6E.js} +6 -6
  296. package/dist/{org-row-visibility-A5XM4MVO.js → org-row-visibility-ZZLOPZLH.js} +1 -1
  297. package/dist/{pipeline-router-UEVXDUHR.js → pipeline-router-3JTL2KF6.js} +3 -3
  298. package/dist/{plan-limits-QEP32X4W.js → plan-limits-MTHRP4WY.js} +5 -5
  299. package/dist/{projection-worker-GMRC6SBH.js → projection-worker-FLASNERC.js} +2 -2
  300. package/dist/{prospective-memory-QLHSAPSG.js → prospective-memory-HI3WUY4U.js} +2 -2
  301. package/dist/{push-notifications-GKRPXOGI.js → push-notifications-DFSR6P7V.js} +15 -14
  302. package/dist/{reranker-GB4VEMUV.js → reranker-XHBKUDGG.js} +1 -1
  303. package/dist/{retrieval-health-QIBPBGN6.js → retrieval-health-NYKSDS6M.js} +1 -1
  304. package/dist/{review-polling-MU47NQ2N.js → review-polling-UAV6DZIZ.js} +15 -14
  305. package/dist/runtime/index.js +23 -22
  306. package/dist/{session-events-YMQ3VGBJ.js → session-events-YCYPLWPG.js} +15 -14
  307. package/dist/{session-kill-telemetry-VGPKE57M.js → session-kill-telemetry-UEJTHL65.js} +15 -14
  308. package/dist/{session-scope-P46KAHXQ.js → session-scope-LXDW7LJJ.js} +14 -13
  309. package/dist/{setup-wizard-BRNHSJ4U.js → setup-wizard-OVJQYUUL.js} +1 -1
  310. package/dist/{skill-refinement-NLYDSFEH.js → skill-refinement-EWRJID73.js} +3 -3
  311. package/dist/{stack-promote-NHFTNIM2.js → stack-promote-4IJM36OG.js} +5 -4
  312. package/dist/{stack-release-AQVKZUS7.js → stack-release-BAIRY65H.js} +5 -4
  313. package/dist/{stack-update-LLX5KT7G.js → stack-update-VDM5WXRS.js} +10 -3
  314. package/dist/stalled-dispatch-escalation-MHLYH2PT.js +80 -0
  315. package/dist/{steward-gate-JKHYFAHA.js → steward-gate-Y4N2XY3R.js} +3 -3
  316. package/dist/{subagent-brief-injection-VDVOHDOU.js → subagent-brief-injection-7A6JEVTP.js} +22 -20
  317. package/dist/{support-inbox-S6YO5YZU.js → support-inbox-LT4WJECQ.js} +4 -3
  318. package/dist/{task-enforcement-LXW45H5Z.js → task-enforcement-WOIZ5TLK.js} +15 -14
  319. package/dist/{task-request-inbox-UCSKDC3R.js → task-request-inbox-D65BPUKZ.js} +2 -2
  320. package/dist/{task-scope-GDLFE26E.js → task-scope-PQ67YRWP.js} +18 -16
  321. package/dist/{tasks-crud-W7VGWRUV.js → tasks-crud-TJNMUKKH.js} +14 -13
  322. package/dist/{tasks-notify-CT7NWCS4.js → tasks-notify-7UVC3VGI.js} +15 -14
  323. package/dist/{tasks-review-WCSKOUFW.js → tasks-review-WDWYISZ2.js} +14 -13
  324. package/dist/{telemetry-upload-FK5WKXVB.js → telemetry-upload-6LBGRJUE.js} +7 -7
  325. package/dist/{token-budget-GBNGSIU3.js → token-budget-XO5XW6DL.js} +3 -3
  326. package/dist/{tool-gates-3IC7DK4R.js → tool-gates-2OZY3GZM.js} +1 -1
  327. package/dist/{tool-gates-GXSYBVK4.js → tool-gates-7PLIOLAL.js} +1 -1
  328. package/dist/{tool-telemetry-VKMRS6MP.js → tool-telemetry-ZL6TTZWG.js} +1 -1
  329. package/dist/tui/App.js +23 -22
  330. package/dist/{tui-data-FTPV2XBQ.js → tui-data-UK7ZPKN4.js} +14 -13
  331. package/dist/{update-support-J6UWPUOC.js → update-support-BGL5KAZO.js} +12 -12
  332. package/dist/work-claims-XZL2DKQ3.js +53 -0
  333. package/dist/{work-state-heartbeat-4LDF6DSM.js → work-state-heartbeat-267YQ75U.js} +1 -1
  334. package/dist/{worker-gate-35VZINZG.js → worker-gate-RUM6MLIR.js} +1 -1
  335. package/dist/{workflow-engine-4DA6RSHI.js → workflow-engine-YQHGHKSJ.js} +2 -2
  336. package/dist/{worktree-H3YFJ3NU.js → worktree-3FO6EQ4G.js} +4 -4
  337. package/dist/{worktree-sweep-4EDLLQ2E.js → worktree-sweep-X7MUEEQS.js} +5 -5
  338. package/package.json +7 -2
  339. package/release-notes.json +93 -81
  340. /package/dist/{chunk-7Y6AQWVT.js → chunk-4AN2PWUK.js} +0 -0
  341. /package/dist/{chunk-7DMCAGSC.js → chunk-5U4UJGTW.js} +0 -0
  342. /package/dist/{chunk-3THNS2T7.js → chunk-EYIX6JU7.js} +0 -0
  343. /package/dist/{chunk-QYECRPGD.js → chunk-FDA45THL.js} +0 -0
  344. /package/dist/{chunk-MBBFL2SP.js → chunk-GIO4VU4J.js} +0 -0
  345. /package/dist/{chunk-LKYGSJ2E.js → chunk-I76LRCNA.js} +0 -0
  346. /package/dist/{chunk-UY6HRDB2.js → chunk-LBWEAQ6Z.js} +0 -0
  347. /package/dist/{chunk-VS4LPG66.js → chunk-MQ5RUHNZ.js} +0 -0
  348. /package/dist/{chunk-G2EAYH4U.js → chunk-PFCE4AXQ.js} +0 -0
  349. /package/dist/{chunk-3NBWARKC.js → chunk-SXAERZL2.js} +0 -0
  350. /package/dist/{chunk-BY7WWPRM.js → chunk-TKTQRSSD.js} +0 -0
  351. /package/dist/{chunk-JRPYLUXH.js → chunk-U2AZUMBZ.js} +0 -0
  352. /package/dist/{chunk-CMBF5WCL.js → chunk-W6FVADZS.js} +0 -0
  353. /package/dist/{core-memory-CMPPHJN5.js → core-memory-W5ZHHBRR.js} +0 -0
  354. /package/dist/{memory-isolation-ZB5S5HCO.js → memory-isolation-ZE7EDBO4.js} +0 -0
  355. /package/dist/{oauth-server-NP7KGF7N.js → oauth-server-3HG62YYJ.js} +0 -0
  356. /package/dist/{project-boot-LEZSK3W7.js → project-boot-3OAWKYLO.js} +0 -0
  357. /package/dist/{wiki-acl-5DKOWOIH.js → wiki-acl-FQV4E6M4.js} +0 -0
@@ -1,3 +1,12 @@
1
+ import {
2
+ compareLiveArtifacts,
3
+ declaredArtifactsFromManifest,
4
+ parseDigest
5
+ } from "./chunk-W5MCOZTW.js";
6
+ import {
7
+ CANONICAL_SSO_COOKIE,
8
+ evaluateSsoCookieContract
9
+ } from "./chunk-TCTED52S.js";
1
10
  import {
2
11
  isMainModule
3
12
  } from "./chunk-6Y4B3QF6.js";
@@ -24,6 +33,13 @@ var FRONTEND_URLS = {
24
33
  "exe-monitor-hub": "http://127.0.0.1:8090"
25
34
  };
26
35
  var GOTRUE_TOKEN_URL = "http://127.0.0.1:9999/token?grant_type=password";
36
+ var SSO_GATED_URLS = {
37
+ "exe-erp": "http://127.0.0.1:8069/login",
38
+ "exe-wiki": "http://127.0.0.1:3001/",
39
+ "exe-crm": "http://127.0.0.1:3000/"
40
+ };
41
+ var SSO_COOKIE_CONTRACT_CHECK_NAME = "SSO auth cookie contract";
42
+ var LIVE_ARTIFACT_CHECK_NAME = "Live artifact matches signed manifest";
27
43
  function parseComposeServiceNames(composeFile) {
28
44
  const names = /* @__PURE__ */ new Set();
29
45
  if (!existsSync(composeFile)) return names;
@@ -341,6 +357,150 @@ async function checkCrossServiceAuth(jwt, deployed) {
341
357
  }
342
358
  return { check, status: "pass", message: "JWT accepted by wiki + CRM" };
343
359
  }
360
+ async function checkSsoCookieContract(deployed, urlOverrides) {
361
+ const check = SSO_COOKIE_CONTRACT_CHECK_NAME;
362
+ const urls = urlOverrides ?? filterToDeployed(SSO_GATED_URLS, deployed);
363
+ if (Object.keys(urls).length === 0) {
364
+ return { check, status: "skip", message: "No SSO-gated products deployed in this selection" };
365
+ }
366
+ const violations = [];
367
+ const reviews = [];
368
+ const unreachable = [];
369
+ for (const [service, url] of Object.entries(urls)) {
370
+ let html;
371
+ try {
372
+ const res = await httpGet(url, CHECK_TIMEOUT_MS);
373
+ html = res.body;
374
+ } catch (err) {
375
+ unreachable.push(`${service}: ${err instanceof Error ? err.message : String(err)}`);
376
+ continue;
377
+ }
378
+ const verdict = evaluateSsoCookieContract(service, url, html);
379
+ if (verdict.severity === "violation") violations.push(`${service} (${url}) ${verdict.detail}`);
380
+ else if (verdict.severity === "review") reviews.push(`${service} (${url})`);
381
+ }
382
+ if (violations.length > 0) {
383
+ return {
384
+ check,
385
+ status: "fail",
386
+ message: `${violations.length} product(s) serve a RETIRED SSO cookie name \u2014 every login bounces forever. Canonical cookie: \`${CANONICAL_SSO_COOKIE}\`. ${violations.join("; ")}`
387
+ };
388
+ }
389
+ if (unreachable.length > 0 || reviews.length > 0) {
390
+ const parts = [];
391
+ if (unreachable.length > 0) parts.push(`unreachable: ${unreachable.join("; ")}`);
392
+ if (reviews.length > 0) parts.push(`needs review: ${reviews.join(", ")}`);
393
+ return { check, status: "warn", message: parts.join(" | ") };
394
+ }
395
+ return {
396
+ check,
397
+ status: "pass",
398
+ message: `${Object.keys(urls).length} product(s) free of retired SSO cookie names`
399
+ };
400
+ }
401
+ async function checkLiveArtifactMatchesManifest(composeFile, manifestPath) {
402
+ const check = LIVE_ARTIFACT_CHECK_NAME;
403
+ const candidates = manifestPath ? [manifestPath] : ["/opt/exe-stack/stack-manifest.json", "deploy/stack-manifests/v0.9.json"];
404
+ let declared = [];
405
+ let source = "";
406
+ for (const candidate of candidates) {
407
+ if (!existsSync(candidate)) continue;
408
+ try {
409
+ declared = declaredArtifactsFromManifest(JSON.parse(readFileSync(candidate, "utf8")));
410
+ source = candidate;
411
+ break;
412
+ } catch {
413
+ }
414
+ }
415
+ if (declared.length === 0) {
416
+ return {
417
+ check,
418
+ status: "warn",
419
+ message: "no readable signed manifest found \u2014 live-vs-declared comparison did NOT run. This is an unknown, not a pass."
420
+ };
421
+ }
422
+ const names = [];
423
+ try {
424
+ const dir = path.dirname(composeFile);
425
+ const file = path.basename(composeFile);
426
+ const raw = execSync(`docker compose -f "${file}" ps --format json`, {
427
+ cwd: dir,
428
+ timeout: CHECK_TIMEOUT_MS,
429
+ encoding: "utf8",
430
+ stdio: ["pipe", "pipe", "pipe"]
431
+ });
432
+ for (const line of raw.trim().split("\n").filter(Boolean)) {
433
+ try {
434
+ const c = JSON.parse(line);
435
+ const name = c.Name || c.name;
436
+ if (name) names.push(name);
437
+ } catch {
438
+ }
439
+ }
440
+ } catch (err) {
441
+ return {
442
+ check,
443
+ status: "warn",
444
+ message: `could not enumerate containers: ${err instanceof Error ? err.message : String(err)} \u2014 comparison did NOT run`
445
+ };
446
+ }
447
+ if (names.length === 0) {
448
+ return { check, status: "warn", message: "no containers enumerated \u2014 comparison did NOT run" };
449
+ }
450
+ const inspect = (args) => {
451
+ try {
452
+ return execSync(`docker inspect ${args.map((a) => `"${a}"`).join(" ")}`, {
453
+ timeout: CHECK_TIMEOUT_MS,
454
+ encoding: "utf8",
455
+ stdio: ["pipe", "pipe", "pipe"]
456
+ }).trim();
457
+ } catch {
458
+ return "";
459
+ }
460
+ };
461
+ const observed = [];
462
+ for (const name of names) {
463
+ const configured = inspect([name, "--format", "{{ .Config.Image }}"]);
464
+ if (!configured) continue;
465
+ const imageId = inspect([name, "--format", "{{ .Image }}"]);
466
+ let ref = configured;
467
+ if (imageId) {
468
+ const digestsRaw = inspect([imageId, "--format", "{{ json .RepoDigests }}"]);
469
+ try {
470
+ const parsed = JSON.parse(digestsRaw || "[]");
471
+ if (Array.isArray(parsed) && parsed.length > 0) {
472
+ const repo = (configured.split("@")[0] ?? "").replace(/:[^/:]+$/, "");
473
+ const list = parsed.filter((x) => typeof x === "string");
474
+ ref = list.find((d) => d.startsWith(`${repo}@`)) ?? list[0] ?? configured;
475
+ }
476
+ } catch {
477
+ }
478
+ }
479
+ observed.push({ container: name, ref });
480
+ }
481
+ const byRef = /* @__PURE__ */ new Map();
482
+ for (const o of observed) {
483
+ const existing = byRef.get(o.ref);
484
+ if (existing) {
485
+ existing.containers.push(o.container);
486
+ continue;
487
+ }
488
+ byRef.set(o.ref, { containers: [o.container], ref: o.ref, digest: parseDigest(o.ref) });
489
+ }
490
+ const report = compareLiveArtifacts([...byRef.values()], declared, { source });
491
+ if (report.findings.length === 0) {
492
+ return {
493
+ check,
494
+ status: "pass",
495
+ message: `${report.counts.agrees} artifact(s) match the digests pinned by ${source}`
496
+ };
497
+ }
498
+ return {
499
+ check,
500
+ status: "fail",
501
+ message: `${report.findings.length} artifact(s) are not what ${source} pins: ` + report.findings.map((f) => `${f.service} [${f.verdict}]`).join(", ") + `. Running: ${report.findings.map((f) => `${f.service}=${f.running?.digest ?? f.running?.ref ?? "(nothing running)"}`).join(", ")}`
502
+ };
503
+ }
344
504
  async function runVerifyStack(options) {
345
505
  const composeFile = options?.composeFile ?? DEFAULT_COMPOSE;
346
506
  const envFile = options?.envFile ?? DEFAULT_ENV;
@@ -371,6 +531,10 @@ async function runVerifyStack(options) {
371
531
  addResult(await checkRawPipeline(env));
372
532
  if (Date.now() > deadline) return summarize(results);
373
533
  addResult(await checkCrossServiceAuth(goTrueResult.jwt, deployed));
534
+ if (Date.now() > deadline) return summarize(results);
535
+ addResult(await checkSsoCookieContract(deployed));
536
+ if (Date.now() > deadline) return summarize(results);
537
+ addResult(await checkLiveArtifactMatchesManifest(composeFile));
374
538
  return summarize(results);
375
539
  }
376
540
  function summarize(results) {
@@ -398,7 +562,7 @@ function printUsage() {
398
562
  console.log(`
399
563
  Usage: exe-os verify-stack [options]
400
564
 
401
- Post-deploy verification \u2014 8 runtime checks after stack-update.
565
+ Post-deploy verification \u2014 10 runtime checks after stack-update.
402
566
 
403
567
  Options:
404
568
  --compose <path> Path to docker-compose.yml (default: ${DEFAULT_COMPOSE})
@@ -414,6 +578,8 @@ Checks:
414
578
  6. Monitor reports metrics
415
579
  7. Raw pipeline alive (recent raw_events)
416
580
  8. Cross-service auth (JWT \u2192 wiki + CRM)
581
+ 9. SSO auth cookie contract (no retired cookie name in served HTML)
582
+ 10. Live artifact matches the digest pinned by the signed manifest
417
583
  `);
418
584
  }
419
585
  if (isMainModule(import.meta.url) && process.argv[1]?.includes("verify-stack")) {
@@ -437,6 +603,10 @@ if (isMainModule(import.meta.url) && process.argv[1]?.includes("verify-stack"))
437
603
  }
438
604
 
439
605
  export {
606
+ SSO_COOKIE_CONTRACT_CHECK_NAME,
607
+ LIVE_ARTIFACT_CHECK_NAME,
440
608
  parseComposeServiceNames,
609
+ checkSsoCookieContract,
610
+ checkLiveArtifactMatchesManifest,
441
611
  runVerifyStack
442
612
  };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  loadEmployees
3
- } from "./chunk-BRLS5OLZ.js";
3
+ } from "./chunk-OBESOWFJ.js";
4
4
 
5
5
  // src/lib/agent-symlinks.ts
6
6
  import os from "os";
@@ -3,12 +3,12 @@ import {
3
3
  getClient,
4
4
  isInitialized,
5
5
  loadEmployees
6
- } from "./chunk-BRLS5OLZ.js";
6
+ } from "./chunk-OBESOWFJ.js";
7
7
  import {
8
8
  checkLicense,
9
9
  isFeatureAllowed,
10
10
  isPersonalFreeGrandfathered
11
- } from "./chunk-ZDUO6QBH.js";
11
+ } from "./chunk-6UZ3DEQI.js";
12
12
  import {
13
13
  PLAN_LIMITS
14
14
  } from "./chunk-A7XLR3K7.js";
@@ -1,5 +1,3 @@
1
- import "./chunk-MLKGABMK.js";
2
-
3
1
  // src/lib/agent-heartbeat.ts
4
2
  import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
5
3
  import path from "path";
@@ -52,9 +50,10 @@ function getAgentLivenessReport() {
52
50
  };
53
51
  });
54
52
  }
53
+
55
54
  export {
56
- classifyLiveness,
57
- getAgentLivenessReport,
58
55
  loadHeartbeats,
59
- recordHeartbeat
56
+ recordHeartbeat,
57
+ classifyLiveness,
58
+ getAgentLivenessReport
60
59
  };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getClient
3
- } from "./chunk-BRLS5OLZ.js";
3
+ } from "./chunk-OBESOWFJ.js";
4
4
 
5
5
  // src/lib/skill-refinement.ts
6
6
  import crypto from "crypto";
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-B6TI3TZT.js";
4
4
  import {
5
5
  loadEmployeesSync
6
- } from "./chunk-BRLS5OLZ.js";
6
+ } from "./chunk-OBESOWFJ.js";
7
7
 
8
8
  // src/adapters/mcp-http-config.ts
9
9
  import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
@@ -2,20 +2,24 @@ import {
2
2
  readWorkingMemory
3
3
  } from "./chunk-HSFBNCNC.js";
4
4
  import {
5
+ behaviorTruncationNotice
6
+ } from "./chunk-XOTDAKJL.js";
7
+ import {
8
+ countActiveBehaviors,
5
9
  listBehaviors
6
- } from "./chunk-O2MEBF23.js";
10
+ } from "./chunk-MCXYNYZI.js";
7
11
  import {
8
12
  lightweightSearch
9
- } from "./chunk-EMZHB767.js";
13
+ } from "./chunk-6EXOW5ZA.js";
10
14
  import {
11
15
  getCurrentSessionScope
12
- } from "./chunk-ORNCMRIX.js";
16
+ } from "./chunk-Y4AYNLXU.js";
13
17
  import {
14
18
  getProjectName
15
19
  } from "./chunk-W2IRQJ6R.js";
16
20
  import {
17
21
  getClient
18
- } from "./chunk-BRLS5OLZ.js";
22
+ } from "./chunk-OBESOWFJ.js";
19
23
 
20
24
  // src/lib/session-summary.ts
21
25
  var MAX_CHARS = 800;
@@ -262,9 +266,25 @@ function renderBehaviorLine(row) {
262
266
  const scope = row.project_name ? ` (${row.project_name})` : "";
263
267
  return `- ${clip(`${tag}${row.content}${scope}`, BEHAVIOR_LINE_CAP)}`;
264
268
  }
269
+ function renderBehaviorSection(behaviors, counts) {
270
+ const lines = behaviors.map(renderBehaviorLine).join("\n");
271
+ const notice = behaviorTruncationNotice(behaviors, counts);
272
+ return notice ? `${lines}
273
+ ${notice}` : lines;
274
+ }
265
275
  async function activeBehaviorBrief(agentId, projectName) {
266
- const behaviors = await listBehaviors(agentId, projectName, BEHAVIOR_LIMIT);
267
- return behaviors.slice(0, BEHAVIOR_LIMIT).map(renderBehaviorLine).join("\n");
276
+ const safeCounts = async () => {
277
+ try {
278
+ return await countActiveBehaviors(agentId, projectName);
279
+ } catch {
280
+ return { total: 0, p0: 0 };
281
+ }
282
+ };
283
+ const [behaviors, counts] = await Promise.all([
284
+ listBehaviors(agentId, projectName, BEHAVIOR_LIMIT),
285
+ safeCounts()
286
+ ]);
287
+ return renderBehaviorSection(behaviors.slice(0, BEHAVIOR_LIMIT), counts);
268
288
  }
269
289
  async function buildEmployeeBootBriefInner(input, degraded) {
270
290
  const agentId = input.agentId.trim();
@@ -324,5 +344,6 @@ ${notice}`;
324
344
  }
325
345
 
326
346
  export {
347
+ renderBehaviorSection,
327
348
  buildEmployeeBootBrief
328
349
  };
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  storeBehavior
3
- } from "./chunk-O2MEBF23.js";
3
+ } from "./chunk-MCXYNYZI.js";
4
4
  import {
5
5
  resolveAnthropicAuth
6
6
  } from "./chunk-VGMACSEV.js";
7
7
  import {
8
8
  getClient
9
- } from "./chunk-BRLS5OLZ.js";
9
+ } from "./chunk-OBESOWFJ.js";
10
10
  import {
11
11
  loadConfig
12
12
  } from "./chunk-QMSEL5YS.js";
@@ -1,6 +1,10 @@
1
1
  import {
2
2
  getBrandName
3
3
  } from "./chunk-2CWS374F.js";
4
+ import {
5
+ buildDeployStalenessBanner,
6
+ readDeployStalenessAlert
7
+ } from "./chunk-TX3Q2GIL.js";
4
8
 
5
9
  // src/lib/status-brief.ts
6
10
  import pathMod from "path";
@@ -114,6 +118,8 @@ async function generateStatusBrief(employees, data, _activeAgentIds) {
114
118
  sections.push([` EXE STATUS BRIEF \u2014 ${dateStr}${sessionTag}`]);
115
119
  const degradedLines = buildDegradedBanner(data);
116
120
  if (degradedLines.length > 0) sections.push(degradedLines);
121
+ const staleDeployLines = buildDeployStalenessBanner(readDeployStalenessAlert());
122
+ if (staleDeployLines.length > 0) sections.push(staleDeployLines);
117
123
  const orchestrationLines = buildOrchestrationPhase(data, employees);
118
124
  if (orchestrationLines.length > 0) sections.push(orchestrationLines);
119
125
  sections.push(buildDispatchLadder(data));
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  routeTask
3
- } from "./chunk-CKG6CVKI.js";
3
+ } from "./chunk-TTJWPV4G.js";
4
4
  import {
5
5
  createTaskCore,
6
6
  employeeSessionName,
@@ -9,11 +9,11 @@ import {
9
9
  isEmployeeAlive,
10
10
  sessionScopeFilter,
11
11
  updateTaskStatus
12
- } from "./chunk-ORNCMRIX.js";
12
+ } from "./chunk-Y4AYNLXU.js";
13
13
  import {
14
14
  DEFAULT_COORDINATOR_TEMPLATE_NAME,
15
15
  getCoordinatorName
16
- } from "./chunk-BRLS5OLZ.js";
16
+ } from "./chunk-OBESOWFJ.js";
17
17
 
18
18
  // src/runtime/orchestrator.ts
19
19
  var STALE_THRESHOLD_MS = 2 * 60 * 60 * 1e3;
@@ -9,19 +9,19 @@ import {
9
9
  compareSemver,
10
10
  detectAutoupdaterVar
11
11
  } from "./chunk-75H4R62K.js";
12
- import {
13
- checkSingleGotrueInstance
14
- } from "./chunk-TCTED52S.js";
15
12
  import {
16
13
  readMcpHttpEvents,
17
14
  summarizeMcpTransport
18
15
  } from "./chunk-YYA5LXCT.js";
19
16
  import {
20
17
  mcpHttpPort
21
- } from "./chunk-EWCEUO65.js";
18
+ } from "./chunk-QCSAYYL6.js";
22
19
  import {
23
20
  inspectKeyCustodySync
24
21
  } from "./chunk-HPXFKUGU.js";
22
+ import {
23
+ checkSingleGotrueInstance
24
+ } from "./chunk-TCTED52S.js";
25
25
  import {
26
26
  SYSTEMD_DAEMON_UNIT
27
27
  } from "./chunk-QILQ5FCG.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getClient
3
- } from "./chunk-BRLS5OLZ.js";
3
+ } from "./chunk-OBESOWFJ.js";
4
4
  import {
5
5
  loadConfig
6
6
  } from "./chunk-QMSEL5YS.js";
@@ -1,6 +1,33 @@
1
+ import {
2
+ assessVerificationArtifact,
3
+ isSubstantiveCommit,
4
+ measureCommitSubstance
5
+ } from "./chunk-KZXMP6JG.js";
1
6
  import {
2
7
  sessionScopeFilter
3
- } from "./chunk-ORNCMRIX.js";
8
+ } from "./chunk-Y4AYNLXU.js";
9
+
10
+ // src/shared/task-completion-gate.ts
11
+ var COMPLETION_CLAIM_STATUSES = ["done", "needs_review", "closed"];
12
+ function isCompletionClaim(status) {
13
+ const normalized = typeof status === "string" ? status.trim() : "";
14
+ return COMPLETION_CLAIM_STATUSES.includes(normalized);
15
+ }
16
+ var ok = { ok: true, code: "ok", message: "verified" };
17
+ function assessAutomatedTaskCompletion(input) {
18
+ if (!isCompletionClaim(input.status)) return ok;
19
+ if (!isSubstantiveCommit(input.substance)) {
20
+ return {
21
+ ok: false,
22
+ code: "commit_not_substantive",
23
+ message: "the matched commit changes no executable production source (comment-only, whitespace-only, docs-only or test-only diffs are not work)"
24
+ };
25
+ }
26
+ if (input.verificationArtifact !== void 0 && input.verificationArtifact !== null) {
27
+ return assessVerificationArtifact(input.verificationArtifact, input.context ?? {});
28
+ }
29
+ return ok;
30
+ }
4
31
 
5
32
  // src/lib/git-task-sweep.ts
6
33
  import { execSync } from "child_process";
@@ -181,7 +208,17 @@ async function sweepTasks(projectName, options = {}) {
181
208
  const commitLimit = options.commitLimit ?? DEFAULT_COMMIT_LIMIT;
182
209
  const staleMinutes = options.staleMinutes ?? DEFAULT_STALE_MINUTES;
183
210
  const dryRun = options.dryRun ?? false;
184
- const result = { escalated: [], unchanged: 0, errors: [] };
211
+ const result = { escalated: [], rejected: [], unchanged: 0, errors: [] };
212
+ const substanceCache = /* @__PURE__ */ new Map();
213
+ const commitIsAdmissible = (hash) => {
214
+ if (!substanceCache.has(hash)) {
215
+ substanceCache.set(hash, measureCommitSubstance(hash, process.cwd()));
216
+ }
217
+ return assessAutomatedTaskCompletion({
218
+ status: "needs_review",
219
+ substance: substanceCache.get(hash) ?? null
220
+ }).ok;
221
+ };
185
222
  const commits = getRecentCommits(commitLimit);
186
223
  if (commits.length === 0) {
187
224
  result.errors.push("No git commits found (not a git repo or empty history)");
@@ -236,9 +273,23 @@ async function sweepTasks(projectName, options = {}) {
236
273
  result.unchanged++;
237
274
  continue;
238
275
  }
276
+ if (!commitIsAdmissible(match.commit.hash)) {
277
+ result.rejected.push({
278
+ taskId: task.id,
279
+ title: task.title,
280
+ matchedCommit: match.commit.hash,
281
+ score: match.score
282
+ });
283
+ result.unchanged++;
284
+ process.stderr.write(
285
+ `[git-sweep] Rejected task ${task.id} \u2192 commit ${match.commit.hash} (score: ${match.score.toFixed(2)}) \u2014 commit changes no executable production source
286
+ `
287
+ );
288
+ continue;
289
+ }
239
290
  if (!dryRun) {
240
291
  try {
241
- const { updateTaskStatus } = await import("./tasks-crud-W7VGWRUV.js");
292
+ const { updateTaskStatus } = await import("./tasks-crud-TJNMUKKH.js");
242
293
  await updateTaskStatus({
243
294
  taskId: task.id,
244
295
  status: "needs_review",
@@ -266,6 +317,7 @@ async function sweepTasks(projectName, options = {}) {
266
317
  }
267
318
 
268
319
  export {
320
+ assessAutomatedTaskCompletion,
269
321
  extractKeywords,
270
322
  matchScore,
271
323
  getRecentCommits,
@@ -0,0 +1,76 @@
1
+ // src/lib/dispatch-intent-journal.ts
2
+ import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, unlinkSync, writeFileSync } from "fs";
3
+ import { join } from "path";
4
+ import { homedir } from "os";
5
+ var DISPATCH_JOURNAL_ORPHAN_AGE_MS = 6e4;
6
+ function dispatchJournalDir() {
7
+ const base = process.env.EXE_OS_DIR || process.env.EXE_MEM_DIR || join(homedir(), ".exe-os");
8
+ return join(base, "dispatch-journal");
9
+ }
10
+ function dispatchJournalSlug(title) {
11
+ const slug = title.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 40);
12
+ return slug || "task";
13
+ }
14
+ function journalDispatchIntent(title, payload, caller) {
15
+ const dir = dispatchJournalDir();
16
+ mkdirSync(dir, { recursive: true });
17
+ const file = join(dir, `${Date.now()}-${dispatchJournalSlug(title)}.json`);
18
+ const entry = {
19
+ version: 1,
20
+ journaledAt: (/* @__PURE__ */ new Date()).toISOString(),
21
+ status: "pending",
22
+ payload,
23
+ caller
24
+ };
25
+ writeFileSync(file, JSON.stringify(entry, null, 2), "utf-8");
26
+ return file;
27
+ }
28
+ function updateDispatchJournalEntry(file, patch) {
29
+ const entry = JSON.parse(readFileSync(file, "utf-8"));
30
+ writeFileSync(file, JSON.stringify({ ...entry, ...patch }, null, 2), "utf-8");
31
+ }
32
+ function clearDispatchJournalEntry(file) {
33
+ try {
34
+ unlinkSync(file);
35
+ } catch {
36
+ }
37
+ }
38
+ function findOrphanedDispatchIntents(sessionScope, olderThanMs = DISPATCH_JOURNAL_ORPHAN_AGE_MS) {
39
+ const dir = dispatchJournalDir();
40
+ if (!existsSync(dir)) return [];
41
+ let names;
42
+ try {
43
+ names = readdirSync(dir);
44
+ } catch {
45
+ return [];
46
+ }
47
+ const cutoff = Date.now() - olderThanMs;
48
+ const orphans = [];
49
+ for (const name of names) {
50
+ if (!name.endsWith(".json")) continue;
51
+ const file = join(dir, name);
52
+ try {
53
+ if (statSync(file).mtimeMs > cutoff) continue;
54
+ } catch {
55
+ continue;
56
+ }
57
+ let entry = null;
58
+ try {
59
+ entry = JSON.parse(readFileSync(file, "utf-8"));
60
+ } catch {
61
+ }
62
+ const entryScope = entry?.caller?.sessionScope ?? null;
63
+ if (sessionScope && entryScope && entryScope !== sessionScope) continue;
64
+ orphans.push({ file, entry });
65
+ }
66
+ return orphans;
67
+ }
68
+
69
+ export {
70
+ DISPATCH_JOURNAL_ORPHAN_AGE_MS,
71
+ dispatchJournalDir,
72
+ journalDispatchIntent,
73
+ updateDispatchJournalEntry,
74
+ clearDispatchJournalEntry,
75
+ findOrphanedDispatchIntents
76
+ };
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  sendMessage
3
- } from "./chunk-IXEFO6HD.js";
3
+ } from "./chunk-4L732DE5.js";
4
4
  import {
5
5
  getActiveAgent
6
- } from "./chunk-ZNEBZCZR.js";
6
+ } from "./chunk-NNXPIJRB.js";
7
7
 
8
8
  // src/mcp/tools/send-message.ts
9
9
  import { z } from "zod";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  isCoordinatorRole
3
- } from "./chunk-BRLS5OLZ.js";
3
+ } from "./chunk-OBESOWFJ.js";
4
4
 
5
5
  // src/lib/task-router.ts
6
6
  import { randomUUID } from "crypto";