@askexenow/exe-os 0.9.367 → 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 (344) 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-V3CUDNED.js → active-agent-6WNC756A.js} +3 -3
  8. package/dist/{active-agent-R6Q7UEUD.js → active-agent-RDTJGZHP.js} +3 -3
  9. package/dist/{agent-defs-generator-MLPRGY75.js → agent-defs-generator-M5AUL3WM.js} +2 -2
  10. package/dist/{agentic-ontology-5FMQWGDZ.js → agentic-ontology-ZJBRYETW.js} +1 -1
  11. package/dist/{backfill-metadata-YXUMCKRV.js → backfill-metadata-Q4X23XLR.js} +5 -5
  12. package/dist/{backup-verify-GYHKAX7K.js → backup-verify-UKLX6IEK.js} +1 -1
  13. package/dist/behavior-injection-C3HEKSJY.js +60 -0
  14. package/dist/{behaviors-O6HKTSOF.js → behaviors-UCMAREU3.js} +8 -6
  15. package/dist/bin/agentic-ontology-backfill.js +6 -6
  16. package/dist/bin/agentic-reflection-backfill.js +7 -7
  17. package/dist/bin/agentic-semantic-label.js +6 -6
  18. package/dist/bin/backfill-conversations.js +5 -5
  19. package/dist/bin/backfill-responses.js +5 -5
  20. package/dist/bin/backfill-vectors.js +6 -6
  21. package/dist/bin/bulk-sync-postgres.js +10 -10
  22. package/dist/bin/cc-doctor.js +4 -4
  23. package/dist/bin/cleanup-stale-review-tasks.js +14 -14
  24. package/dist/bin/cli.js +20 -20
  25. package/dist/bin/deferred-daemon-restart.js +83 -81
  26. package/dist/bin/exe-agent-config.js +2 -2
  27. package/dist/bin/exe-agent.js +11 -11
  28. package/dist/bin/exe-assign.js +6 -6
  29. package/dist/bin/exe-boot.js +30 -30
  30. package/dist/bin/exe-call.js +4 -4
  31. package/dist/bin/exe-cloud.js +11 -11
  32. package/dist/bin/exe-config-dump.js +2 -2
  33. package/dist/bin/exe-dispatch.js +15 -15
  34. package/dist/bin/exe-doctor.js +5 -5
  35. package/dist/bin/exe-export-behaviors.js +10 -8
  36. package/dist/bin/exe-forget.js +7 -7
  37. package/dist/bin/exe-gateway.js +7 -7
  38. package/dist/bin/exe-healthcheck.js +4 -4
  39. package/dist/bin/exe-heartbeat.js +17 -17
  40. package/dist/bin/exe-kill.js +18 -18
  41. package/dist/bin/exe-launch-agent.js +24 -23
  42. package/dist/bin/exe-mcp.js +3 -3
  43. package/dist/bin/exe-memory-reads.js +5 -5
  44. package/dist/bin/exe-new-employee.js +8 -8
  45. package/dist/bin/exe-os-mcp-proxy.js +3 -3
  46. package/dist/bin/exe-pending-messages.js +15 -15
  47. package/dist/bin/exe-pending-notifications.js +14 -14
  48. package/dist/bin/exe-pending-reviews.js +14 -14
  49. package/dist/bin/exe-rename.js +4 -4
  50. package/dist/bin/exe-review.js +17 -17
  51. package/dist/bin/exe-search.js +6 -6
  52. package/dist/bin/exe-session-cleanup.js +19 -18
  53. package/dist/bin/exe-settings.js +10 -10
  54. package/dist/bin/exe-start-codex.js +73 -19
  55. package/dist/bin/exe-start-opencode.js +11 -9
  56. package/dist/bin/exe-status.js +16 -16
  57. package/dist/bin/exe-support.js +3 -3
  58. package/dist/bin/exe-team.js +4 -4
  59. package/dist/bin/exe-verify-running-images.js +123 -4
  60. package/dist/bin/exe-watchdog.js +44 -3
  61. package/dist/bin/git-sweep.js +16 -15
  62. package/dist/bin/graph-backfill.js +7 -7
  63. package/dist/bin/graph-export.js +6 -6
  64. package/dist/bin/import-history.js +10 -10
  65. package/dist/bin/install.js +85 -83
  66. package/dist/bin/intercom-check.js +4 -4
  67. package/dist/bin/mcp-sessions.js +2 -2
  68. package/dist/bin/orchestration-metrics.js +4 -4
  69. package/dist/bin/postgres-agentic-reflection-backfill.js +4 -4
  70. package/dist/bin/postgres-agentic-semantic-backfill.js +4 -4
  71. package/dist/bin/reconcile-backlog.js +47 -6
  72. package/dist/bin/registry-proxy.js +1 -1
  73. package/dist/bin/scan-tasks.js +14 -14
  74. package/dist/bin/setup.js +1 -1
  75. package/dist/bin/shard-migrate.js +5 -5
  76. package/dist/bin/stack-update.js +6 -5
  77. package/dist/bin/verify-stack.js +6 -1
  78. package/dist/bin/vps-health-gate.js +1 -1
  79. package/dist/{boot-generation-EZ2Y74IG.js → boot-generation-7H7Y4KC2.js} +3 -3
  80. package/dist/{boot-review-sections-7CNQTAYR.js → boot-review-sections-4AGCECCP.js} +13 -13
  81. package/dist/build-manifest.json +808 -773
  82. package/dist/{capability-cards-ZTFMK4VJ.js → capability-cards-6KAC5D2Z.js} +2 -2
  83. package/dist/{capacity-monitor-B2XU4YHP.js → capacity-monitor-J2Y4SFLA.js} +15 -15
  84. package/dist/{catchup-brief-3BEOL7EV.js → catchup-brief-F2HKF2CU.js} +18 -18
  85. package/dist/{chunk-PR3AHVFW.js → chunk-2AS6FG6C.js} +3 -3
  86. package/dist/{chunk-WCDIDSLR.js → chunk-2UBMXN4D.js} +2 -2
  87. package/dist/{chunk-267QB6VB.js → chunk-2UGU3V63.js} +1 -1
  88. package/dist/{chunk-PQ6NRLKL.js → chunk-34BMZTWV.js} +1 -1
  89. package/dist/{chunk-XA4EU3CW.js → chunk-4DGIOK6T.js} +1 -1
  90. package/dist/{chunk-JJRZE2LD.js → chunk-4GVJIMMK.js} +12 -6
  91. package/dist/{chunk-2IZH6W73.js → chunk-4L732DE5.js} +3 -3
  92. package/dist/{chunk-ZSHLY5BS.js → chunk-4RRMZJLG.js} +1 -1
  93. package/dist/{chunk-MQ3N4KZY.js → chunk-5IVLOOJR.js} +1 -1
  94. package/dist/{chunk-PFR6EOUY.js → chunk-5YKNEL3W.js} +2 -2
  95. package/dist/{chunk-AE3PYLLS.js → chunk-6EXOW5ZA.js} +9 -9
  96. package/dist/{chunk-CTPG4KYZ.js → chunk-6P7DVFKA.js} +1 -1
  97. package/dist/{chunk-F3PIHVVY.js → chunk-6UZ3DEQI.js} +1 -1
  98. package/dist/{chunk-URHJDUWO.js → chunk-72JZQ7EV.js} +1 -1
  99. package/dist/{chunk-66BFQOWR.js → chunk-72QUZX6J.js} +4 -4
  100. package/dist/{chunk-JOKKIFRN.js → chunk-AAL6CDMQ.js} +7 -7
  101. package/dist/{chunk-FSIAGX55.js → chunk-AJGX4Z34.js} +1 -1
  102. package/dist/{chunk-OADOH45L.js → chunk-BEPO36MW.js} +3 -3
  103. package/dist/{chunk-UI3K73LD.js → chunk-BFL3UB77.js} +1 -1
  104. package/dist/{chunk-KDD26FUY.js → chunk-BFPQXPN3.js} +1 -1
  105. package/dist/{chunk-7W5LCREK.js → chunk-BJKC6ZJU.js} +40 -84
  106. package/dist/{chunk-OPS7KUFV.js → chunk-BLNSUBP3.js} +3 -3
  107. package/dist/{chunk-5CH6XKVC.js → chunk-BNDHQGOY.js} +1 -1
  108. package/dist/{chunk-Z5Z3MYUW.js → chunk-BPQWRR4H.js} +2 -2
  109. package/dist/{chunk-YA4PM3MV.js → chunk-BTGR55GX.js} +3 -3
  110. package/dist/{chunk-WYVBWDFY.js → chunk-C4IJ5IS5.js} +1 -1
  111. package/dist/{chunk-XVRQZCTS.js → chunk-C5FOA5GO.js} +14 -3
  112. package/dist/{chunk-XKFMNAJ7.js → chunk-CSBD7QLZ.js} +1 -1
  113. package/dist/{chunk-BY3V5CLX.js → chunk-CU2OUUSV.js} +25 -5
  114. package/dist/{chunk-Y4JVM3SI.js → chunk-CXHRNESJ.js} +1 -1
  115. package/dist/{chunk-SFKIZYKK.js → chunk-DRMGPZSC.js} +2 -2
  116. package/dist/{chunk-PFOJX6CR.js → chunk-DYPKSVB7.js} +5 -5
  117. package/dist/{chunk-PS4NA7PM.js → chunk-EDB3LXBQ.js} +268 -166
  118. package/dist/{chunk-TCR7NBHD.js → chunk-EDRXCUEP.js} +4 -4
  119. package/dist/{chunk-BQYQES2Z.js → chunk-ELY5WBZX.js} +10 -10
  120. package/dist/{chunk-ALYI3P5D.js → chunk-EZUSIF66.js} +1 -1
  121. package/dist/{chunk-CYNL3ZFD.js → chunk-FHYX64H3.js} +3 -3
  122. package/dist/{chunk-PWCZFIQH.js → chunk-FSALI4B7.js} +4 -4
  123. package/dist/{chunk-4DJDC4Y2.js → chunk-FWKTZURC.js} +4 -4
  124. package/dist/{chunk-53LCVVX5.js → chunk-FWVPGXHD.js} +5 -5
  125. package/dist/{chunk-O3F5P6Z5.js → chunk-GILYOIMP.js} +2 -2
  126. package/dist/{chunk-NPND34FS.js → chunk-GP3J3AOT.js} +4 -4
  127. package/dist/{chunk-6NJURKRG.js → chunk-H6J7N3BZ.js} +1 -1
  128. package/dist/{chunk-WSLFGJBA.js → chunk-HQSUXAB4.js} +1 -1
  129. package/dist/{chunk-XTEKGO44.js → chunk-HTLJHSN4.js} +1 -1
  130. package/dist/{chunk-AEVE654G.js → chunk-HXV3DGL7.js} +1 -1
  131. package/dist/{chunk-LW5WRSDD.js → chunk-IEE6X6R2.js} +1 -1
  132. package/dist/{chunk-V3ISR2QT.js → chunk-IKRIUEIF.js} +1 -1
  133. package/dist/{chunk-52CFP2AV.js → chunk-J44774XC.js} +1 -1
  134. package/dist/{chunk-TJSTWACD.js → chunk-J77ZIMH5.js} +5 -5
  135. package/dist/{chunk-Y7OK5PJE.js → chunk-JDPV7W2L.js} +1 -1
  136. package/dist/{chunk-7W6FDHHY.js → chunk-KGPWS4KE.js} +1 -1
  137. package/dist/{chunk-XAMLDTRA.js → chunk-KWQ7RHYD.js} +4 -4
  138. package/dist/{chunk-IIVFXD6P.js → chunk-KYVIV54Y.js} +1 -1
  139. package/dist/chunk-KZXMP6JG.js +319 -0
  140. package/dist/{chunk-ZZ3JQM5I.js → chunk-LJWCK2DR.js} +9 -9
  141. package/dist/{chunk-WBKIU6UJ.js → chunk-MCXYNYZI.js} +30 -2
  142. package/dist/{chunk-L2VZBPJJ.js → chunk-MWEIBVBS.js} +13 -1
  143. package/dist/{chunk-GUOMZ3JM.js → chunk-MXP27XTP.js} +2 -2
  144. package/dist/{chunk-EDZ5URGR.js → chunk-N3CGSO3S.js} +1 -1
  145. package/dist/{chunk-QWDZNQXA.js → chunk-NNXPIJRB.js} +1 -1
  146. package/dist/{chunk-OISZ2I4X.js → chunk-NWE3CFX7.js} +4 -4
  147. package/dist/{chunk-HSBKV5LB.js → chunk-OBESOWFJ.js} +3 -3
  148. package/dist/{chunk-XKZD5FGK.js → chunk-OL3QP3AU.js} +116 -1
  149. package/dist/{chunk-6MCUXRIP.js → chunk-P3PAD6AA.js} +1 -1
  150. package/dist/{chunk-N3JLNMPF.js → chunk-PGF5I7EV.js} +2 -2
  151. package/dist/{chunk-CX4MVEM3.js → chunk-PVWM2WMM.js} +1 -1
  152. package/dist/{chunk-JFOZHVNO.js → chunk-QCSAYYL6.js} +1 -1
  153. package/dist/{chunk-J6VQ7HYV.js → chunk-QE5KWKVU.js} +27 -6
  154. package/dist/{chunk-4WOOCTON.js → chunk-QKZEUCTS.js} +2 -2
  155. package/dist/{chunk-P5XER5QY.js → chunk-QT6CNCXO.js} +3 -3
  156. package/dist/{chunk-P76VYS6V.js → chunk-QZYYCPNL.js} +1 -1
  157. package/dist/{chunk-DTTISDTI.js → chunk-RDIZSXXD.js} +1 -1
  158. package/dist/{chunk-R4AROSYI.js → chunk-RFWOXKVL.js} +10 -179
  159. package/dist/chunk-S2YTU74T.js +76 -0
  160. package/dist/{chunk-K2OFS57E.js → chunk-TP7BFVQP.js} +2 -2
  161. package/dist/{chunk-LIZ3QQGK.js → chunk-TTJWPV4G.js} +1 -1
  162. package/dist/{chunk-XUGOVOID.js → chunk-UATT6BNO.js} +3 -3
  163. package/dist/{chunk-ALKYXAMB.js → chunk-UVM5ZXO2.js} +4 -4
  164. package/dist/{chunk-R3H3WW7H.js → chunk-V7E37GE3.js} +2 -2
  165. package/dist/{chunk-XSXZVKJ7.js → chunk-VD3CVNGB.js} +3 -3
  166. package/dist/{chunk-CKKLSY7B.js → chunk-VIW62NN5.js} +1 -1
  167. package/dist/{chunk-VY3QUSWS.js → chunk-VTOO5UB3.js} +9 -9
  168. package/dist/chunk-W5MCOZTW.js +304 -0
  169. package/dist/{chunk-TZFOWWPM.js → chunk-WJOJWRN5.js} +139 -33
  170. package/dist/{chunk-PS6VPW64.js → chunk-X4MRVNR3.js} +1 -1
  171. package/dist/{chunk-YYLVHUYZ.js → chunk-XBTQPQN7.js} +1 -1
  172. package/dist/{behavior-injection-7VGYY2KO.js → chunk-XOTDAKJL.js} +24 -38
  173. package/dist/{chunk-QX33D4CH.js → chunk-Y4AYNLXU.js} +25 -25
  174. package/dist/{chunk-BTMX2D4X.js → chunk-YGPJ7VSJ.js} +48 -10
  175. package/dist/{chunk-DXCTHNEF.js → chunk-ZR3VMM3X.js} +9 -9
  176. package/dist/{chunk-MLPPG2OG.js → chunk-ZWONQU5S.js} +1 -1
  177. package/dist/{cleanup-graph-garbage-XDIX3HLN.js → cleanup-graph-garbage-FBSQI33K.js} +8 -8
  178. package/dist/{cloud-sync-command-VPYE4FIH.js → cloud-sync-command-NHGVDTLM.js} +11 -3
  179. package/dist/{cloud-sync-db-init-NSDBTFGI.js → cloud-sync-db-init-I75VOTXC.js} +1 -1
  180. package/dist/{cloud-sync-shutdown-6OUYTG4T.js → cloud-sync-shutdown-JGOFGGET.js} +2 -2
  181. package/dist/{cloud-sync-state-5DFKLWNB.js → cloud-sync-state-QF3TMMJ4.js} +3 -1
  182. package/dist/{co-activation-EAAKGGZH.js → co-activation-AE5L2SJV.js} +2 -2
  183. package/dist/{co-occurrence-OFVF55RX.js → co-occurrence-O65D4SCN.js} +6 -6
  184. package/dist/{conversation-entity-extractor-ZR5GFKAI.js → conversation-entity-extractor-LFIDTD2O.js} +4 -4
  185. package/dist/{crdt-sync-FGH4SBFW.js → crdt-sync-NRWDBRSE.js} +1 -1
  186. package/dist/{crm-webhook-PJATR2DC.js → crm-webhook-XOQGX6DV.js} +2 -2
  187. package/dist/{cto-delegation-gate-PO4LSSQ4.js → cto-delegation-gate-ZGOAXQI2.js} +13 -13
  188. package/dist/{daemon-orchestration-IJFZFQUX.js → daemon-orchestration-ZMQWYYDT.js} +18 -18
  189. package/dist/dispatch-intent-journal-VV6HMZC4.js +17 -0
  190. package/dist/{doc-graph-extractor-CAYUAM5A.js → doc-graph-extractor-6C5JBKPP.js} +6 -6
  191. package/dist/{documents-W2G477QE.js → documents-FKSQGSO4.js} +6 -6
  192. package/dist/{dreaming-FVXSIIWV.js → dreaming-IB3H6NDZ.js} +17 -17
  193. package/dist/{employee-boot-brief-OYMSHFHA.js → employee-boot-brief-5YRTUEJH.js} +24 -21
  194. package/dist/{exe-drift-67RGJOBX.js → exe-drift-CUWUYX3O.js} +3 -3
  195. package/dist/{exe-export-SGYX6XZG.js → exe-export-XWENYJNM.js} +7 -7
  196. package/dist/{exe-import-UABVA5N3.js → exe-import-OWOMRF2S.js} +7 -7
  197. package/dist/{exe-key-XNYDCVFE.js → exe-key-P356FGK5.js} +83 -81
  198. package/dist/{exe-org-XJVSU5HN.js → exe-org-UKIVF3KE.js} +8 -8
  199. package/dist/{exe-snapshot-YXOGYZUX.js → exe-snapshot-AZI2WW5Y.js} +18 -18
  200. package/dist/{fast-db-init-GDFJY5UH.js → fast-db-init-FPAPF3GB.js} +1 -1
  201. package/dist/{founder-context-KUXSNXKS.js → founder-context-QTQ6V3B5.js} +2 -2
  202. package/dist/gateway/index.js +11 -11
  203. package/dist/{git-staleness-NN6RWNLW.js → git-staleness-6ACWLV5Q.js} +2 -2
  204. package/dist/{global-procedures-XDNA3TNA.js → global-procedures-RXIKBVLZ.js} +3 -3
  205. package/dist/{graph-auto-extract-KTOR45V4.js → graph-auto-extract-Q4A4QMOF.js} +6 -6
  206. package/dist/{graph-rag-L5NV5YWD.js → graph-rag-RLRQMY54.js} +4 -4
  207. package/dist/{hook-integrity-X3YAVGUW.js → hook-integrity-3X2JRLBM.js} +1 -1
  208. package/dist/{hook-prefetch-WE4MIXBM.js → hook-prefetch-DU44UZQP.js} +14 -14
  209. package/dist/hooks/bug-report-worker.js +18 -18
  210. package/dist/hooks/codex-stop-task-finalizer.js +19 -19
  211. package/dist/hooks/commit-complete.js +20 -18
  212. package/dist/hooks/error-recall.js +8 -8
  213. package/dist/hooks/exe-heartbeat-hook.js +4 -4
  214. package/dist/hooks/ingest-worker.js +2 -2
  215. package/dist/hooks/ingest.js +11 -11
  216. package/dist/hooks/instructions-loaded.js +5 -5
  217. package/dist/hooks/manifest.json +20 -20
  218. package/dist/hooks/notification.js +5 -5
  219. package/dist/hooks/post-compact.js +4 -4
  220. package/dist/hooks/post-tool-combined.js +11 -11
  221. package/dist/hooks/pre-compact.js +17 -17
  222. package/dist/hooks/pre-tool-use.js +44 -37
  223. package/dist/hooks/prompt-submit.js +35 -31
  224. package/dist/hooks/session-end.js +21 -21
  225. package/dist/hooks/session-start.js +16 -16
  226. package/dist/hooks/stop.js +20 -20
  227. package/dist/hooks/subagent-stop.js +18 -18
  228. package/dist/hooks/summary-worker.js +22 -22
  229. package/dist/index.js +25 -25
  230. package/dist/{installer-EAAYEEEF.js → installer-B7QYQE56.js} +7 -5
  231. package/dist/{installer-UDRMFY75.js → installer-EXR25DDG.js} +5 -5
  232. package/dist/{installer-EPQAOI6M.js → installer-TOPA7673.js} +5 -5
  233. package/dist/{intercom-queue-IBOAVT2I.js → intercom-queue-BZ4M3L4S.js} +13 -13
  234. package/dist/lib/cloud-sync.js +10 -10
  235. package/dist/lib/consolidation.js +8 -8
  236. package/dist/lib/database.js +2 -2
  237. package/dist/lib/db-backup.js +1 -1
  238. package/dist/lib/db-write-worker.js +3 -3
  239. package/dist/lib/db.js +2 -2
  240. package/dist/lib/delivery-truth.js +25 -0
  241. package/dist/lib/device-registry.js +1 -1
  242. package/dist/lib/employee-templates.js +4 -4
  243. package/dist/lib/employees.js +2 -2
  244. package/dist/lib/exe-daemon.js +181 -76
  245. package/dist/lib/hybrid-search.js +6 -6
  246. package/dist/lib/identity.js +2 -2
  247. package/dist/lib/license.js +2 -2
  248. package/dist/lib/messaging.js +14 -14
  249. package/dist/lib/registry-proxy.js +1 -1
  250. package/dist/lib/reminders.js +3 -3
  251. package/dist/lib/schedules.js +6 -6
  252. package/dist/lib/session-registry.js +4 -4
  253. package/dist/lib/skill-learning.js +7 -7
  254. package/dist/lib/store.js +5 -5
  255. package/dist/lib/task-router.js +3 -3
  256. package/dist/lib/tasks.js +15 -15
  257. package/dist/lib/tmux-routing.js +13 -13
  258. package/dist/lib/token-spend.js +3 -3
  259. package/dist/{license-gate-3TTWJABL.js → license-gate-YTIOLKVV.js} +3 -3
  260. package/dist/{license-sync-ZC6TPKVV.js → license-sync-5VE5OSTV.js} +2 -2
  261. package/dist/mcp/register-tools.js +82 -80
  262. package/dist/mcp/server.js +85 -83
  263. package/dist/mcp/tools/complete-reminder.js +4 -4
  264. package/dist/mcp/tools/create-reminder.js +4 -4
  265. package/dist/mcp/tools/create-task.js +25 -23
  266. package/dist/mcp/tools/deactivate-behavior.js +8 -8
  267. package/dist/mcp/tools/list-reminders.js +4 -4
  268. package/dist/mcp/tools/list-tasks.js +17 -17
  269. package/dist/mcp/tools/send-message.js +16 -16
  270. package/dist/mcp/tools/update-task.js +16 -16
  271. package/dist/{mcp-http-config-ROF5EPEF.js → mcp-http-config-XUNRIGQH.js} +3 -3
  272. package/dist/{mcp-session-identity-ERU6FEUB.js → mcp-session-identity-4UIG7KLK.js} +13 -13
  273. package/dist/{memory-cards-3QTXI2SG.js → memory-cards-R74YU4CO.js} +5 -5
  274. package/dist/{memory-graph-extractor-7GAILMYG.js → memory-graph-extractor-3B4QJUXI.js} +7 -7
  275. package/dist/{memory-poisoning-defense-TPXSRJTQ.js → memory-poisoning-defense-OAKFL5O2.js} +2 -2
  276. package/dist/{memory-pressure-watchdog-ZSOP6T2F.js → memory-pressure-watchdog-FFC2CHFJ.js} +14 -14
  277. package/dist/{memory-reflection-3AI4JBV2.js → memory-reflection-5IJ6RE2J.js} +2 -2
  278. package/dist/{notification-ledger-ZU7ZFJJX.js → notification-ledger-P5XBUYKO.js} +14 -14
  279. package/dist/{notifications-S4GU22GF.js → notifications-LLCCHRYV.js} +13 -13
  280. package/dist/{orchestration-events-HVG56HJ5.js → orchestration-events-VBGCIQSS.js} +3 -3
  281. package/dist/{orchestrator-UW3Q3WYG.js → orchestrator-EB3SCTAJ.js} +15 -15
  282. package/dist/{org-brief-session-G36TJBN4.js → org-brief-session-GDCDKBFF.js} +6 -6
  283. package/dist/{org-consent-policy-RMYVMM3X.js → org-consent-policy-HCD42NBN.js} +2 -2
  284. package/dist/{org-partner-runtime-KXMGEYFW.js → org-partner-runtime-TPVKFR6E.js} +6 -6
  285. package/dist/{org-row-visibility-UI5PGN76.js → org-row-visibility-ZZLOPZLH.js} +1 -1
  286. package/dist/{pipeline-router-IODWXDDI.js → pipeline-router-3JTL2KF6.js} +3 -3
  287. package/dist/{plan-limits-XMAQVEJZ.js → plan-limits-MTHRP4WY.js} +5 -5
  288. package/dist/{projection-worker-6LZUCI3B.js → projection-worker-FLASNERC.js} +2 -2
  289. package/dist/{prospective-memory-G5VK5GCD.js → prospective-memory-HI3WUY4U.js} +2 -2
  290. package/dist/{push-notifications-S2RYRXLF.js → push-notifications-DFSR6P7V.js} +14 -14
  291. package/dist/{reranker-EHQTAA3L.js → reranker-XHBKUDGG.js} +1 -1
  292. package/dist/{retrieval-health-WZ4ICGNF.js → retrieval-health-NYKSDS6M.js} +1 -1
  293. package/dist/{review-polling-MAWLRDSP.js → review-polling-UAV6DZIZ.js} +14 -14
  294. package/dist/runtime/index.js +21 -21
  295. package/dist/{session-events-BRUIZ5E4.js → session-events-YCYPLWPG.js} +14 -14
  296. package/dist/{session-kill-telemetry-PTZLHT33.js → session-kill-telemetry-UEJTHL65.js} +14 -14
  297. package/dist/{session-scope-G4RVJJGR.js → session-scope-LXDW7LJJ.js} +13 -13
  298. package/dist/{setup-wizard-WFEUB63Z.js → setup-wizard-OVJQYUUL.js} +1 -1
  299. package/dist/{skill-refinement-2OYPH7WD.js → skill-refinement-EWRJID73.js} +3 -3
  300. package/dist/{stack-promote-DLYYQXQI.js → stack-promote-4IJM36OG.js} +4 -4
  301. package/dist/{stack-release-OPWARLXI.js → stack-release-BAIRY65H.js} +4 -4
  302. package/dist/{stack-update-SJ43IEQE.js → stack-update-VDM5WXRS.js} +3 -3
  303. package/dist/stalled-dispatch-escalation-MHLYH2PT.js +80 -0
  304. package/dist/{steward-gate-V7PBGVFK.js → steward-gate-Y4N2XY3R.js} +3 -3
  305. package/dist/{subagent-brief-injection-BLCRI2AJ.js → subagent-brief-injection-7A6JEVTP.js} +21 -20
  306. package/dist/{support-inbox-6HOQYFD2.js → support-inbox-LT4WJECQ.js} +4 -3
  307. package/dist/{task-enforcement-EF6O2V26.js → task-enforcement-WOIZ5TLK.js} +14 -14
  308. package/dist/{task-request-inbox-OB2KIJWO.js → task-request-inbox-D65BPUKZ.js} +2 -2
  309. package/dist/{task-scope-74JBTKJN.js → task-scope-PQ67YRWP.js} +13 -13
  310. package/dist/{tasks-crud-ZU6RZDEZ.js → tasks-crud-TJNMUKKH.js} +13 -13
  311. package/dist/{tasks-notify-767DRYAA.js → tasks-notify-7UVC3VGI.js} +14 -14
  312. package/dist/{tasks-review-4F6PZZ3B.js → tasks-review-WDWYISZ2.js} +13 -13
  313. package/dist/{telemetry-upload-2JM6KIAB.js → telemetry-upload-6LBGRJUE.js} +7 -7
  314. package/dist/{token-budget-NH2RD4YX.js → token-budget-XO5XW6DL.js} +3 -3
  315. package/dist/{tool-telemetry-CHCBD4OQ.js → tool-telemetry-ZL6TTZWG.js} +1 -1
  316. package/dist/tui/App.js +21 -21
  317. package/dist/{tui-data-244GF3BI.js → tui-data-UK7ZPKN4.js} +13 -13
  318. package/dist/{update-support-P2LO3DAB.js → update-support-BGL5KAZO.js} +12 -12
  319. package/dist/{work-claims-4QOE7DT2.js → work-claims-XZL2DKQ3.js} +3 -3
  320. package/dist/{work-state-heartbeat-GX3VWWWK.js → work-state-heartbeat-267YQ75U.js} +1 -1
  321. package/dist/{worker-gate-62PZATOV.js → worker-gate-RUM6MLIR.js} +1 -1
  322. package/dist/{workflow-engine-7YIRU62F.js → workflow-engine-YQHGHKSJ.js} +2 -2
  323. package/dist/{worktree-3TUKIZWY.js → worktree-3FO6EQ4G.js} +4 -4
  324. package/dist/{worktree-sweep-MYQHUXDE.js → worktree-sweep-X7MUEEQS.js} +5 -5
  325. package/package.json +2 -1
  326. package/release-notes.json +29 -23
  327. /package/dist/{chunk-25EN7XXN.js → chunk-4AN2PWUK.js} +0 -0
  328. /package/dist/{chunk-WM7Y5ZV2.js → chunk-5U4UJGTW.js} +0 -0
  329. /package/dist/{chunk-62U63R3E.js → chunk-EYIX6JU7.js} +0 -0
  330. /package/dist/{chunk-JLYHJJHU.js → chunk-FDA45THL.js} +0 -0
  331. /package/dist/{chunk-JZBZI36P.js → chunk-GIO4VU4J.js} +0 -0
  332. /package/dist/{chunk-BTFDA3UJ.js → chunk-I76LRCNA.js} +0 -0
  333. /package/dist/{chunk-YNPOELAN.js → chunk-LBWEAQ6Z.js} +0 -0
  334. /package/dist/{chunk-65ZSFW3O.js → chunk-MQ5RUHNZ.js} +0 -0
  335. /package/dist/{chunk-XM7HJ5SS.js → chunk-PFCE4AXQ.js} +0 -0
  336. /package/dist/{chunk-FLP2BQOA.js → chunk-SXAERZL2.js} +0 -0
  337. /package/dist/{chunk-OUIEDJFO.js → chunk-TKTQRSSD.js} +0 -0
  338. /package/dist/{chunk-DAXFAXLN.js → chunk-U2AZUMBZ.js} +0 -0
  339. /package/dist/{chunk-GTOMDMJL.js → chunk-W6FVADZS.js} +0 -0
  340. /package/dist/{core-memory-EARETDZ6.js → core-memory-W5ZHHBRR.js} +0 -0
  341. /package/dist/{memory-isolation-XASOGA7G.js → memory-isolation-ZE7EDBO4.js} +0 -0
  342. /package/dist/{oauth-server-C3BXAKAW.js → oauth-server-3HG62YYJ.js} +0 -0
  343. /package/dist/{project-boot-LCFBQ6NB.js → project-boot-3OAWKYLO.js} +0 -0
  344. /package/dist/{wiki-acl-XQH4UBP2.js → wiki-acl-FQV4E6M4.js} +0 -0
@@ -1,3 +1,8 @@
1
+ import {
2
+ compareLiveArtifacts,
3
+ declaredArtifactsFromManifest,
4
+ parseDigest
5
+ } from "./chunk-W5MCOZTW.js";
1
6
  import {
2
7
  CANONICAL_SSO_COOKIE,
3
8
  evaluateSsoCookieContract
@@ -34,6 +39,7 @@ var SSO_GATED_URLS = {
34
39
  "exe-crm": "http://127.0.0.1:3000/"
35
40
  };
36
41
  var SSO_COOKIE_CONTRACT_CHECK_NAME = "SSO auth cookie contract";
42
+ var LIVE_ARTIFACT_CHECK_NAME = "Live artifact matches signed manifest";
37
43
  function parseComposeServiceNames(composeFile) {
38
44
  const names = /* @__PURE__ */ new Set();
39
45
  if (!existsSync(composeFile)) return names;
@@ -392,6 +398,109 @@ async function checkSsoCookieContract(deployed, urlOverrides) {
392
398
  message: `${Object.keys(urls).length} product(s) free of retired SSO cookie names`
393
399
  };
394
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
+ }
395
504
  async function runVerifyStack(options) {
396
505
  const composeFile = options?.composeFile ?? DEFAULT_COMPOSE;
397
506
  const envFile = options?.envFile ?? DEFAULT_ENV;
@@ -424,6 +533,8 @@ async function runVerifyStack(options) {
424
533
  addResult(await checkCrossServiceAuth(goTrueResult.jwt, deployed));
425
534
  if (Date.now() > deadline) return summarize(results);
426
535
  addResult(await checkSsoCookieContract(deployed));
536
+ if (Date.now() > deadline) return summarize(results);
537
+ addResult(await checkLiveArtifactMatchesManifest(composeFile));
427
538
  return summarize(results);
428
539
  }
429
540
  function summarize(results) {
@@ -451,7 +562,7 @@ function printUsage() {
451
562
  console.log(`
452
563
  Usage: exe-os verify-stack [options]
453
564
 
454
- Post-deploy verification \u2014 8 runtime checks after stack-update.
565
+ Post-deploy verification \u2014 10 runtime checks after stack-update.
455
566
 
456
567
  Options:
457
568
  --compose <path> Path to docker-compose.yml (default: ${DEFAULT_COMPOSE})
@@ -467,6 +578,8 @@ Checks:
467
578
  6. Monitor reports metrics
468
579
  7. Raw pipeline alive (recent raw_events)
469
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
470
583
  `);
471
584
  }
472
585
  if (isMainModule(import.meta.url) && process.argv[1]?.includes("verify-stack")) {
@@ -491,7 +604,9 @@ if (isMainModule(import.meta.url) && process.argv[1]?.includes("verify-stack"))
491
604
 
492
605
  export {
493
606
  SSO_COOKIE_CONTRACT_CHECK_NAME,
607
+ LIVE_ARTIFACT_CHECK_NAME,
494
608
  parseComposeServiceNames,
495
609
  checkSsoCookieContract,
610
+ checkLiveArtifactMatchesManifest,
496
611
  runVerifyStack
497
612
  };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  loadEmployees
3
- } from "./chunk-HSBKV5LB.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-HSBKV5LB.js";
6
+ } from "./chunk-OBESOWFJ.js";
7
7
  import {
8
8
  checkLicense,
9
9
  isFeatureAllowed,
10
10
  isPersonalFreeGrandfathered
11
- } from "./chunk-F3PIHVVY.js";
11
+ } from "./chunk-6UZ3DEQI.js";
12
12
  import {
13
13
  PLAN_LIMITS
14
14
  } from "./chunk-A7XLR3K7.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getClient
3
- } from "./chunk-HSBKV5LB.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-HSBKV5LB.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-WBKIU6UJ.js";
10
+ } from "./chunk-MCXYNYZI.js";
7
11
  import {
8
12
  lightweightSearch
9
- } from "./chunk-AE3PYLLS.js";
13
+ } from "./chunk-6EXOW5ZA.js";
10
14
  import {
11
15
  getCurrentSessionScope
12
- } from "./chunk-QX33D4CH.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-HSBKV5LB.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-WBKIU6UJ.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-HSBKV5LB.js";
9
+ } from "./chunk-OBESOWFJ.js";
10
10
  import {
11
11
  loadConfig
12
12
  } from "./chunk-QMSEL5YS.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  routeTask
3
- } from "./chunk-LIZ3QQGK.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-QX33D4CH.js";
12
+ } from "./chunk-Y4AYNLXU.js";
13
13
  import {
14
14
  DEFAULT_COORDINATOR_TEMPLATE_NAME,
15
15
  getCoordinatorName
16
- } from "./chunk-HSBKV5LB.js";
16
+ } from "./chunk-OBESOWFJ.js";
17
17
 
18
18
  // src/runtime/orchestrator.ts
19
19
  var STALE_THRESHOLD_MS = 2 * 60 * 60 * 1e3;
@@ -15,7 +15,7 @@ import {
15
15
  } from "./chunk-YYA5LXCT.js";
16
16
  import {
17
17
  mcpHttpPort
18
- } from "./chunk-JFOZHVNO.js";
18
+ } from "./chunk-QCSAYYL6.js";
19
19
  import {
20
20
  inspectKeyCustodySync
21
21
  } from "./chunk-HPXFKUGU.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getClient
3
- } from "./chunk-HSBKV5LB.js";
3
+ } from "./chunk-OBESOWFJ.js";
4
4
  import {
5
5
  loadConfig
6
6
  } from "./chunk-QMSEL5YS.js";
@@ -1,179 +1,11 @@
1
+ import {
2
+ assessVerificationArtifact,
3
+ isSubstantiveCommit,
4
+ measureCommitSubstance
5
+ } from "./chunk-KZXMP6JG.js";
1
6
  import {
2
7
  sessionScopeFilter
3
- } from "./chunk-QX33D4CH.js";
4
-
5
- // src/lib/verification-evidence.ts
6
- import { execFileSync } from "child_process";
7
- var TEST_PATH = /(?:^|\/)(?:tests?|__tests__|__mocks__|e2e|fixtures)\//i;
8
- var TEST_FILE = /\.(?:test|spec)\.[cm]?[jt]sx?$/i;
9
- var NON_SOURCE_FILE = /\.(?:md|mdx|txt|rst|adoc|snap|lock)$/i;
10
- var COMMENT_LINE = /^(?:\/\/|\/\*|\*\/|\*(?!\/)|#|--|<!--|-->)/;
11
- function isTestPath(path) {
12
- return TEST_PATH.test(path) || TEST_FILE.test(path);
13
- }
14
- function isNonSourcePath(path) {
15
- return NON_SOURCE_FILE.test(path);
16
- }
17
- function isCommentOrBlank(line) {
18
- const trimmed = line.trim();
19
- if (!trimmed) return true;
20
- return COMMENT_LINE.test(trimmed);
21
- }
22
- function measureUnifiedDiff(diff) {
23
- let added = 0;
24
- let deleted = 0;
25
- let substantiveAdded = 0;
26
- const sourceFiles = /* @__PURE__ */ new Set();
27
- let currentPath = "";
28
- let currentIsSource = false;
29
- for (const line of diff.split(/\r?\n/)) {
30
- if (line.startsWith("+++ ")) {
31
- const path = line.slice(4).replace(/^b\//, "").trim();
32
- currentPath = path === "/dev/null" ? "" : path;
33
- currentIsSource = Boolean(currentPath) && !isTestPath(currentPath) && !isNonSourcePath(currentPath);
34
- continue;
35
- }
36
- if (line.startsWith("--- ") || line.startsWith("diff ") || line.startsWith("index ") || line.startsWith("@@")) {
37
- continue;
38
- }
39
- if (line.startsWith("+")) {
40
- added += 1;
41
- if (currentIsSource) {
42
- const content = line.slice(1);
43
- if (!isCommentOrBlank(content)) {
44
- substantiveAdded += 1;
45
- sourceFiles.add(currentPath);
46
- }
47
- }
48
- } else if (line.startsWith("-")) {
49
- deleted += 1;
50
- if (currentIsSource) {
51
- const content = line.slice(1);
52
- if (!isCommentOrBlank(content)) sourceFiles.add(currentPath);
53
- }
54
- }
55
- }
56
- return {
57
- added,
58
- deleted,
59
- substantive_added: substantiveAdded,
60
- source_files: sourceFiles.size
61
- };
62
- }
63
- function measureCommitSubstance(sha, cwd) {
64
- if (!/^[0-9a-f]{7,64}$/i.test(sha)) return null;
65
- try {
66
- const diff = execFileSync(
67
- "git",
68
- ["show", "--format=", "--unified=0", "--no-color", sha],
69
- { cwd, encoding: "utf8", timeout: 15e3, maxBuffer: 32 * 1024 * 1024 }
70
- );
71
- return measureUnifiedDiff(diff);
72
- } catch {
73
- return null;
74
- }
75
- }
76
-
77
- // src/shared/verification-artifact.ts
78
- var ok = { ok: true, code: "ok", message: "verified" };
79
- function deny(code, message) {
80
- return { ok: false, code, message };
81
- }
82
- var HEX_SHA = /^[0-9a-f]{7,64}$/i;
83
- var MIN_OBSERVATION_CHARS = 40;
84
- function isRecord(value) {
85
- return typeof value === "object" && value !== null && !Array.isArray(value);
86
- }
87
- function str(value) {
88
- return typeof value === "string" ? value.trim() : "";
89
- }
90
- function num(value) {
91
- return typeof value === "number" && Number.isFinite(value) ? value : null;
92
- }
93
- function isSubstantiveCommit(substance) {
94
- if (!isRecord(substance)) return false;
95
- const added = num(substance.added);
96
- const deleted = num(substance.deleted);
97
- const substantive = num(substance.substantive_added);
98
- const sourceFiles = num(substance.source_files);
99
- if (added === null || deleted === null || substantive === null || sourceFiles === null) return false;
100
- if (added < 0 || deleted < 0 || substantive < 0 || sourceFiles < 0) return false;
101
- if (substantive > added) return false;
102
- if (sourceFiles < 1) return false;
103
- if (substantive < 1 && deleted < 1) return false;
104
- return true;
105
- }
106
- function assessVerificationArtifact(raw, context = {}) {
107
- if (raw === void 0 || raw === null || raw === "") {
108
- return deny("artifact_missing", "closing requires a verification artifact showing the defect is absent");
109
- }
110
- let artifact = raw;
111
- if (typeof raw === "string") {
112
- try {
113
- artifact = JSON.parse(raw);
114
- } catch {
115
- return deny("artifact_malformed", "verification artifact must be valid JSON");
116
- }
117
- }
118
- if (!isRecord(artifact)) {
119
- return deny("artifact_malformed", "verification artifact must be an object");
120
- }
121
- const kind = str(artifact.kind);
122
- if (kind !== "regression_test" && kind !== "manual") {
123
- return deny("artifact_unknown_kind", "verification artifact kind must be regression_test or manual");
124
- }
125
- if (!isSubstantiveCommit(artifact.substance)) {
126
- return deny(
127
- "commit_not_substantive",
128
- "the fix commit changes no executable production source (comment-only, whitespace-only, or test-only diffs are not fixes)"
129
- );
130
- }
131
- if (kind === "regression_test") {
132
- const testId = str(artifact.test_id);
133
- const fixCommit = str(artifact.fix_commit);
134
- const parentCommit = str(artifact.parent_commit);
135
- if (!testId || !HEX_SHA.test(fixCommit) || !HEX_SHA.test(parentCommit)) {
136
- return deny("artifact_malformed", "regression_test requires test_id, fix_commit and parent_commit");
137
- }
138
- if (fixCommit.toLowerCase() === parentCommit.toLowerCase()) {
139
- return deny("parent_equals_fix", "parent_commit must be the commit BEFORE the fix");
140
- }
141
- if (str(artifact.parent_result) !== "fail") {
142
- return deny(
143
- "test_did_not_fail_at_parent",
144
- "the named test must FAIL at the parent commit \u2014 a test that already passed does not detect the defect"
145
- );
146
- }
147
- if (str(artifact.fix_result) !== "pass") {
148
- return deny("test_did_not_pass_at_fix", "the named test must PASS at the fix commit");
149
- }
150
- return ok;
151
- }
152
- const verifier = str(artifact.verifier);
153
- if (!verifier) {
154
- return deny("manual_verifier_missing", "manual verification requires a named verifier");
155
- }
156
- const authors = (context.authorIdentities ?? []).map((a) => str(a).toLowerCase()).filter(Boolean);
157
- if (authors.includes(verifier.toLowerCase())) {
158
- return deny(
159
- "manual_verifier_is_author",
160
- "manual verification must be attested by someone other than the bug's author or assignee"
161
- );
162
- }
163
- if (!str(artifact.method)) {
164
- return deny("artifact_malformed", "manual verification requires a method");
165
- }
166
- if (str(artifact.observation).length < MIN_OBSERVATION_CHARS) {
167
- return deny(
168
- "manual_observation_too_thin",
169
- "manual verification requires an observation describing the defect's absence"
170
- );
171
- }
172
- if (!HEX_SHA.test(str(artifact.fix_commit))) {
173
- return deny("artifact_malformed", "manual verification requires a fix_commit");
174
- }
175
- return ok;
176
- }
8
+ } from "./chunk-Y4AYNLXU.js";
177
9
 
178
10
  // src/shared/task-completion-gate.ts
179
11
  var COMPLETION_CLAIM_STATUSES = ["done", "needs_review", "closed"];
@@ -181,9 +13,9 @@ function isCompletionClaim(status) {
181
13
  const normalized = typeof status === "string" ? status.trim() : "";
182
14
  return COMPLETION_CLAIM_STATUSES.includes(normalized);
183
15
  }
184
- var ok2 = { ok: true, code: "ok", message: "verified" };
16
+ var ok = { ok: true, code: "ok", message: "verified" };
185
17
  function assessAutomatedTaskCompletion(input) {
186
- if (!isCompletionClaim(input.status)) return ok2;
18
+ if (!isCompletionClaim(input.status)) return ok;
187
19
  if (!isSubstantiveCommit(input.substance)) {
188
20
  return {
189
21
  ok: false,
@@ -194,7 +26,7 @@ function assessAutomatedTaskCompletion(input) {
194
26
  if (input.verificationArtifact !== void 0 && input.verificationArtifact !== null) {
195
27
  return assessVerificationArtifact(input.verificationArtifact, input.context ?? {});
196
28
  }
197
- return ok2;
29
+ return ok;
198
30
  }
199
31
 
200
32
  // src/lib/git-task-sweep.ts
@@ -457,7 +289,7 @@ async function sweepTasks(projectName, options = {}) {
457
289
  }
458
290
  if (!dryRun) {
459
291
  try {
460
- const { updateTaskStatus } = await import("./tasks-crud-ZU6RZDEZ.js");
292
+ const { updateTaskStatus } = await import("./tasks-crud-TJNMUKKH.js");
461
293
  await updateTaskStatus({
462
294
  taskId: task.id,
463
295
  status: "needs_review",
@@ -485,7 +317,6 @@ async function sweepTasks(projectName, options = {}) {
485
317
  }
486
318
 
487
319
  export {
488
- measureCommitSubstance,
489
320
  assessAutomatedTaskCompletion,
490
321
  extractKeywords,
491
322
  matchScore,
@@ -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-2IZH6W73.js";
3
+ } from "./chunk-4L732DE5.js";
4
4
  import {
5
5
  getActiveAgent
6
- } from "./chunk-QWDZNQXA.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-HSBKV5LB.js";
3
+ } from "./chunk-OBESOWFJ.js";
4
4
 
5
5
  // src/lib/task-router.ts
6
6
  import { randomUUID } from "crypto";
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  extractMemoryGraph
3
- } from "./chunk-OADOH45L.js";
3
+ } from "./chunk-BEPO36MW.js";
4
4
  import {
5
5
  flushBatch,
6
6
  writeMemory
7
- } from "./chunk-BQYQES2Z.js";
7
+ } from "./chunk-ELY5WBZX.js";
8
8
  import {
9
9
  extractKeywords
10
10
  } from "./chunk-CHCA3ZM2.js";
11
11
  import {
12
12
  getActiveAgent
13
- } from "./chunk-QWDZNQXA.js";
13
+ } from "./chunk-NNXPIJRB.js";
14
14
 
15
15
  // src/mcp/tools/import-conversations.ts
16
16
  import { z } from "zod";