@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,18 +1,19 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  exportBehaviorsForAgent
4
- } from "../chunk-BEHLIRRJ.js";
5
- import "../chunk-O2MEBF23.js";
4
+ } from "../chunk-C5FOA5GO.js";
5
+ import "../chunk-XOTDAKJL.js";
6
+ import "../chunk-MCXYNYZI.js";
6
7
  import "../chunk-VMJ2UH4S.js";
7
8
  import "../chunk-QGGH7LOU.js";
8
9
  import {
9
10
  disposeStore,
10
11
  initStore
11
- } from "../chunk-4QKKLK3C.js";
12
- import "../chunk-QYECRPGD.js";
12
+ } from "../chunk-ELY5WBZX.js";
13
+ import "../chunk-FDA45THL.js";
13
14
  import "../chunk-CHCA3ZM2.js";
14
15
  import "../chunk-OTVEIJUQ.js";
15
- import "../chunk-7DMCAGSC.js";
16
+ import "../chunk-5U4UJGTW.js";
16
17
  import "../chunk-5MOYSU5A.js";
17
18
  import "../chunk-4QCFFW2H.js";
18
19
  import "../chunk-76CJBM36.js";
@@ -20,6 +21,7 @@ import {
20
21
  clearTerminalLauncherFailure,
21
22
  writeTerminalLauncherFailure
22
23
  } from "../chunk-AJIXH5JF.js";
24
+ import "../chunk-PVWM2WMM.js";
23
25
  import {
24
26
  CODEX_CHATGPT_UNSUPPORTED_MODELS,
25
27
  assertCodexModelForAuth,
@@ -35,11 +37,11 @@ import "../chunk-MP2AFCGL.js";
35
37
  import {
36
38
  baseAgentName,
37
39
  loadEmployeesSync
38
- } from "../chunk-BRLS5OLZ.js";
40
+ } from "../chunk-OBESOWFJ.js";
39
41
  import "../chunk-TKDITWDN.js";
40
42
  import "../chunk-BBMTVAE3.js";
41
43
  import "../chunk-5YEUPUV4.js";
42
- import "../chunk-NO3M2AFM.js";
44
+ import "../chunk-JDPV7W2L.js";
43
45
  import "../chunk-YYB5PMTK.js";
44
46
  import "../chunk-NJFJWQNN.js";
45
47
  import "../chunk-V3W3SATA.js";
@@ -106,6 +108,14 @@ or a JSON-RPC error mentioning "session expired" or "not found", the daemon was
106
108
  restarted. Your MCP client should auto-reinitialize. If it doesn't, call mcp_ping()
107
109
  which forces a fresh connection. If mcp_ping also fails, tell the user: "MCP daemon
108
110
  was restarted. Run /mcp to reconnect."
111
+
112
+ SESSION CLOSEOUT \u2014 MANDATORY, Codex has no SessionEnd hook: Unlike Claude Code,
113
+ Codex does not fire a session-end event, so nothing consolidates your session
114
+ automatically \u2014 no dreaming cycle, no pattern promotion, no "where I left off"
115
+ summary for your next boot. Before you finish a session, YOU MUST call
116
+ config(action="closeout") yourself to consolidate it. If you are running low on
117
+ context or are about to stop for any other reason, call config(action="closeout")
118
+ then, before you stop \u2014 do not wait until the very last message.
109
119
  `;
110
120
  var CODEX_AUTONOMOUS_BOOT_PROMPT = `You are an AI employee with exe-os consolidated MCP tools: task, memory, behavior, message, identity, decision, session, and mcp_ping. DO NOT ask for confirmation \u2014 work autonomously. If task/memory are not visible in the initial tool list, first call tool_search with query "exe-os task memory MCP consolidated" because Codex may defer MCP tools behind discovery; only tell the user to run 'exe-os codex' if discovery fails or returns no exe-os task/memory tools. Immediately: 1) Call task with action="list" to see your assigned tasks. 2) Call task with action="get" on the highest priority open task. 3) Call memory with action="recall" before starting work. 4) Start working on the task. 5) When done, call task with action="update", status="done", and a result summary. 6) Call memory with action="store" to persist important findings. 7) Check task with action="list" again for the next task. 8) If NO open tasks remain, wait 30 seconds then check task(action="list") ONE more time \u2014 a new task may have been dispatched while you were completing the previous one. If still empty after the recheck, say 'All tasks complete. Standing by.' and STOP.`;
111
121
  function buildCodexBootPrompt(_detectedProject) {
@@ -227,8 +237,37 @@ function writePromptFile(agent, identity, behaviorsPath, globalProcedures) {
227
237
  writeFileSync(outPath, prompt, "utf-8");
228
238
  return outPath;
229
239
  }
230
- var CODEX_PINNED_SANDBOX_ARGS = ["--sandbox", "workspace-write"];
231
- var CODEX_PINNED_APPROVAL_ARGS = ["--approval-policy", "never"];
240
+ var CODEX_PINNED_SANDBOX_MODE = "workspace-write";
241
+ var CODEX_PINNED_APPROVAL_POLICY = "never";
242
+ var CODEX_APPROVAL_FLAG_PREFERENCE = ["--ask-for-approval", "--approval-policy"];
243
+ var CODEX_SANDBOX_FLAG_PREFERENCE = ["--sandbox"];
244
+ function parseCodexSupportedFlags(helpText) {
245
+ const flags = /* @__PURE__ */ new Set();
246
+ for (const match of helpText.matchAll(/(?<![\w-])--[a-z0-9][a-z0-9-]*/g)) {
247
+ flags.add(match[0]);
248
+ }
249
+ return flags;
250
+ }
251
+ function buildCodexConstraintArgs(supported, preference, configKey, value) {
252
+ const flag = preference.find((f) => supported.has(f));
253
+ return flag ? [flag, value] : ["-c", `${configKey}=${JSON.stringify(value)}`];
254
+ }
255
+ var cachedCodexExecFlags = null;
256
+ function detectCodexExecFlags(binary) {
257
+ if (cachedCodexExecFlags) return cachedCodexExecFlags;
258
+ let help = "";
259
+ try {
260
+ const probe = spawnSync(binary, ["exec", "--help"], {
261
+ encoding: "utf-8",
262
+ timeout: 1e4
263
+ });
264
+ help = `${probe.stdout ?? ""}
265
+ ${probe.stderr ?? ""}`;
266
+ } catch {
267
+ }
268
+ cachedCodexExecFlags = parseCodexSupportedFlags(help);
269
+ return cachedCodexExecFlags;
270
+ }
232
271
  function sanitizeCodexPassthroughArgs(passthrough) {
233
272
  const sanitized = [];
234
273
  for (let i = 0; i < passthrough.length; i++) {
@@ -236,26 +275,44 @@ function sanitizeCodexPassthroughArgs(passthrough) {
236
275
  if (arg === "--dangerously-bypass-approvals-and-sandbox" || arg === "--full-auto") {
237
276
  continue;
238
277
  }
239
- if (arg === "--sandbox" || arg === "-s" || arg === "--approval-policy") {
278
+ if (arg === "--sandbox" || arg === "-s" || arg === "--approval-policy" || arg === "--ask-for-approval" || arg === "-a") {
240
279
  i++;
241
280
  continue;
242
281
  }
243
- if (arg.startsWith("--sandbox=") || arg.startsWith("-s=") || arg.startsWith("--approval-policy=")) {
282
+ if (arg.startsWith("--sandbox=") || arg.startsWith("-s=") || arg.startsWith("--approval-policy=") || arg.startsWith("--ask-for-approval=") || arg.startsWith("-a=")) {
244
283
  continue;
245
284
  }
285
+ if (arg === "-c" || arg === "--config") {
286
+ const next = passthrough[i + 1];
287
+ if (next && /^(sandbox_mode|approval_policy)\s*=/.test(next)) {
288
+ i++;
289
+ continue;
290
+ }
291
+ }
246
292
  sanitized.push(arg);
247
293
  }
248
294
  return sanitized;
249
295
  }
250
296
  function buildCodexLaunchArgs(input) {
297
+ const supported = input.supportedExecFlags ?? detectCodexExecFlags(CODEX.binary);
251
298
  const args = [
252
299
  "exec",
253
300
  "-m",
254
301
  input.effectiveModel,
255
302
  "-c",
256
303
  `model=${JSON.stringify(input.effectiveModel)}`,
257
- ...CODEX_PINNED_SANDBOX_ARGS,
258
- ...CODEX_PINNED_APPROVAL_ARGS,
304
+ ...buildCodexConstraintArgs(
305
+ supported,
306
+ CODEX_SANDBOX_FLAG_PREFERENCE,
307
+ "sandbox_mode",
308
+ CODEX_PINNED_SANDBOX_MODE
309
+ ),
310
+ ...buildCodexConstraintArgs(
311
+ supported,
312
+ CODEX_APPROVAL_FLAG_PREFERENCE,
313
+ "approval_policy",
314
+ CODEX_PINNED_APPROVAL_POLICY
315
+ ),
259
316
  "--color",
260
317
  "never",
261
318
  ...sanitizeCodexPassthroughArgs(input.passthrough)
@@ -517,7 +574,7 @@ async function main() {
517
574
  await initStore();
518
575
  behaviorsPath = await exportBehaviorsForAgent(baseAgent, "");
519
576
  try {
520
- const { loadGlobalProcedures, getGlobalProceduresBlock } = await import("../global-procedures-ZOFTOXIR.js");
577
+ const { loadGlobalProcedures, getGlobalProceduresBlock } = await import("../global-procedures-RXIKBVLZ.js");
521
578
  await loadGlobalProcedures();
522
579
  const block = getGlobalProceduresBlock();
523
580
  if (block) globalProcedures = block;
@@ -567,8 +624,8 @@ async function main() {
567
624
  let codexProfileName = null;
568
625
  if (exeSessionName) {
569
626
  try {
570
- const { readOrCreateDaemonToken } = await import("../mcp-http-config-YKJN52HG.js");
571
- const { mcpHttpUrl } = await import("../mcp-http-config-YKJN52HG.js");
627
+ const { readOrCreateDaemonToken } = await import("../mcp-http-config-XUNRIGQH.js");
628
+ const { mcpHttpUrl } = await import("../mcp-http-config-XUNRIGQH.js");
572
629
  const token = readOrCreateDaemonToken();
573
630
  const profileContent = buildCodexMcpProfileContent({
574
631
  agentId: codexIdentity.memoryAgent,
@@ -598,12 +655,12 @@ async function main() {
598
655
  }
599
656
  }
600
657
  try {
601
- const { writeActiveAgent } = await import("../active-agent-C6DPH43L.js");
658
+ const { writeActiveAgent } = await import("../active-agent-RDTJGZHP.js");
602
659
  writeActiveAgent(memoryAgent, empRole);
603
660
  } catch {
604
661
  }
605
662
  try {
606
- const { verifyCodexHooks, runCodexInstaller } = await import("../installer-KCEM4RCG.js");
663
+ const { verifyCodexHooks, runCodexInstaller } = await import("../installer-TOPA7673.js");
607
664
  if (!verifyCodexHooks()) {
608
665
  process.stderr.write("[exe-start-codex] hooks missing \u2014 registering now\n");
609
666
  await runCodexInstaller();
@@ -621,7 +678,7 @@ async function main() {
621
678
  `);
622
679
  if (WORKTREE_ROLES.has(empRole)) {
623
680
  try {
624
- const { ensureWorktree, parseInstanceLabel } = await import("../worktree-H3YFJ3NU.js");
681
+ const { ensureWorktree, parseInstanceLabel } = await import("../worktree-3FO6EQ4G.js");
625
682
  const { base, instance } = parseInstanceLabel(worktreeName);
626
683
  worktreePath = ensureWorktree(process.cwd(), base, instance);
627
684
  if (worktreePath) {
@@ -699,12 +756,17 @@ if (!process.env.VITEST) {
699
756
  export {
700
757
  CODEX_AUTONOMOUS_BOOT_PROMPT,
701
758
  CODEX_BOOT_INSTRUCTIONS,
759
+ CODEX_PINNED_APPROVAL_POLICY,
760
+ CODEX_PINNED_SANDBOX_MODE,
702
761
  buildCodexBootPrompt,
762
+ buildCodexConstraintArgs,
703
763
  buildCodexLaunchArgs,
704
764
  buildCodexMcpProfileContent,
765
+ detectCodexExecFlags,
705
766
  detectCodexModelNotSupported,
706
767
  launchCodex,
707
768
  loadIdentity,
769
+ parseCodexSupportedFlags,
708
770
  readCodexUserConfig,
709
771
  resolveCodexMcpIdentity,
710
772
  resolveEffectiveCodexModel,
@@ -1,21 +1,23 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  exportBehaviorsForAgent
4
- } from "../chunk-BEHLIRRJ.js";
5
- import "../chunk-O2MEBF23.js";
4
+ } from "../chunk-C5FOA5GO.js";
5
+ import "../chunk-XOTDAKJL.js";
6
+ import "../chunk-MCXYNYZI.js";
6
7
  import "../chunk-VMJ2UH4S.js";
7
8
  import "../chunk-QGGH7LOU.js";
8
9
  import {
9
10
  disposeStore,
10
11
  initStore
11
- } from "../chunk-4QKKLK3C.js";
12
- import "../chunk-QYECRPGD.js";
12
+ } from "../chunk-ELY5WBZX.js";
13
+ import "../chunk-FDA45THL.js";
13
14
  import "../chunk-CHCA3ZM2.js";
14
15
  import "../chunk-OTVEIJUQ.js";
15
- import "../chunk-7DMCAGSC.js";
16
+ import "../chunk-5U4UJGTW.js";
16
17
  import "../chunk-5MOYSU5A.js";
17
18
  import "../chunk-4QCFFW2H.js";
18
19
  import "../chunk-76CJBM36.js";
20
+ import "../chunk-PVWM2WMM.js";
19
21
  import "../chunk-BNHAZ65R.js";
20
22
  import "../chunk-RIECV7SR.js";
21
23
  import "../chunk-LNOS24GV.js";
@@ -24,11 +26,11 @@ import "../chunk-MP2AFCGL.js";
24
26
  import {
25
27
  baseAgentName,
26
28
  loadEmployeesSync
27
- } from "../chunk-BRLS5OLZ.js";
29
+ } from "../chunk-OBESOWFJ.js";
28
30
  import "../chunk-TKDITWDN.js";
29
31
  import "../chunk-BBMTVAE3.js";
30
32
  import "../chunk-5YEUPUV4.js";
31
- import "../chunk-NO3M2AFM.js";
33
+ import "../chunk-JDPV7W2L.js";
32
34
  import "../chunk-YYB5PMTK.js";
33
35
  import "../chunk-NJFJWQNN.js";
34
36
  import "../chunk-V3W3SATA.js";
@@ -196,12 +198,12 @@ async function main() {
196
198
  })();
197
199
  process.env.AGENT_ROLE = empRole;
198
200
  try {
199
- const { writeActiveAgent } = await import("../active-agent-C6DPH43L.js");
201
+ const { writeActiveAgent } = await import("../active-agent-RDTJGZHP.js");
200
202
  writeActiveAgent(memoryAgent, empRole);
201
203
  } catch {
202
204
  }
203
205
  try {
204
- const { verifyOpenCodeHooks, runOpenCodeInstaller } = await import("../installer-EA7T3PBD.js");
206
+ const { verifyOpenCodeHooks, runOpenCodeInstaller } = await import("../installer-EXR25DDG.js");
205
207
  if (!verifyOpenCodeHooks()) {
206
208
  process.stderr.write("[exe-start-opencode] hooks missing \u2014 registering now\n");
207
209
  await runOpenCodeInstaller();
@@ -1,28 +1,29 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  status
4
- } from "../chunk-RZIKSE6N.js";
5
- import "../chunk-MBBFL2SP.js";
6
- import "../chunk-LKYGSJ2E.js";
7
- import "../chunk-ORNCMRIX.js";
8
- import "../chunk-ESTR7QUP.js";
9
- import "../chunk-FXPAUDCZ.js";
10
- import "../chunk-QFIVK3G5.js";
4
+ } from "../chunk-GP3J3AOT.js";
5
+ import "../chunk-GIO4VU4J.js";
6
+ import "../chunk-I76LRCNA.js";
7
+ import "../chunk-Y4AYNLXU.js";
8
+ import "../chunk-BTSWFMEH.js";
9
+ import "../chunk-P3PAD6AA.js";
10
+ import "../chunk-KGPWS4KE.js";
11
+ import "../chunk-KYVIV54Y.js";
11
12
  import "../chunk-WT4RI36X.js";
12
- import "../chunk-C3UAQ3JG.js";
13
13
  import "../chunk-KI5PFRG6.js";
14
+ import "../chunk-QAEWWYHL.js";
14
15
  import "../chunk-EIKATSE4.js";
15
16
  import "../chunk-E23LNUWJ.js";
16
- import "../chunk-QAEWWYHL.js";
17
- import "../chunk-EHHMNKOA.js";
17
+ import "../chunk-CSBD7QLZ.js";
18
18
  import "../chunk-GBNB4EWD.js";
19
19
  import "../chunk-UXLO7VHX.js";
20
20
  import "../chunk-DSOQUQTV.js";
21
- import "../chunk-WR75WUEP.js";
21
+ import "../chunk-BFL3UB77.js";
22
22
  import "../chunk-AJIXH5JF.js";
23
+ import "../chunk-PVWM2WMM.js";
23
24
  import "../chunk-XTWHNLGD.js";
24
25
  import "../chunk-AM7S2TY6.js";
25
- import "../chunk-2FYIMTQE.js";
26
+ import "../chunk-PGF5I7EV.js";
26
27
  import "../chunk-CVYC6DUW.js";
27
28
  import "../chunk-ZVTKWWLV.js";
28
29
  import "../chunk-CDUB5Q6J.js";
@@ -34,20 +35,20 @@ import "../chunk-W2IRQJ6R.js";
34
35
  import "../chunk-HYZV25LY.js";
35
36
  import "../chunk-GJV3WDWM.js";
36
37
  import "../chunk-MP2AFCGL.js";
37
- import "../chunk-BRLS5OLZ.js";
38
+ import "../chunk-OBESOWFJ.js";
38
39
  import "../chunk-TKDITWDN.js";
39
40
  import "../chunk-BBMTVAE3.js";
40
41
  import "../chunk-5YEUPUV4.js";
41
- import "../chunk-NO3M2AFM.js";
42
+ import "../chunk-JDPV7W2L.js";
42
43
  import "../chunk-YYB5PMTK.js";
43
44
  import "../chunk-NJFJWQNN.js";
44
45
  import "../chunk-V3W3SATA.js";
45
46
  import "../chunk-JY5GAZYC.js";
46
47
  import "../chunk-FXU7JOXK.js";
47
48
  import "../chunk-WNBZJSQT.js";
48
- import "../chunk-ZDUO6QBH.js";
49
+ import "../chunk-6UZ3DEQI.js";
49
50
  import "../chunk-A7XLR3K7.js";
50
- import "../chunk-VS4LPG66.js";
51
+ import "../chunk-MQ5RUHNZ.js";
51
52
  import "../chunk-QILQ5FCG.js";
52
53
  import "../chunk-ARX6TAGN.js";
53
54
  import "../chunk-QMSEL5YS.js";
@@ -4,12 +4,12 @@ import {
4
4
  main,
5
5
  runHealth,
6
6
  runTest
7
- } from "../chunk-T6S45OLV.js";
7
+ } from "../chunk-4GVJIMMK.js";
8
8
  import "../chunk-MMRUBN3I.js";
9
9
  import "../chunk-2XZ6X3PJ.js";
10
- import "../chunk-ZDUO6QBH.js";
10
+ import "../chunk-6UZ3DEQI.js";
11
11
  import "../chunk-A7XLR3K7.js";
12
- import "../chunk-VS4LPG66.js";
12
+ import "../chunk-MQ5RUHNZ.js";
13
13
  import "../chunk-QMSEL5YS.js";
14
14
  import "../chunk-HSGBZSCA.js";
15
15
  import "../chunk-JKKZGDLP.js";
@@ -1,18 +1,18 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  shutdownCli
4
- } from "../chunk-MBBFL2SP.js";
4
+ } from "../chunk-GIO4VU4J.js";
5
5
  import {
6
6
  fastDbInit
7
- } from "../chunk-LKYGSJ2E.js";
7
+ } from "../chunk-I76LRCNA.js";
8
8
  import {
9
9
  getClient,
10
10
  loadEmployees
11
- } from "../chunk-BRLS5OLZ.js";
11
+ } from "../chunk-OBESOWFJ.js";
12
12
  import "../chunk-TKDITWDN.js";
13
13
  import "../chunk-BBMTVAE3.js";
14
14
  import "../chunk-5YEUPUV4.js";
15
- import "../chunk-NO3M2AFM.js";
15
+ import "../chunk-JDPV7W2L.js";
16
16
  import "../chunk-YYB5PMTK.js";
17
17
  import "../chunk-NJFJWQNN.js";
18
18
  import "../chunk-V3W3SATA.js";
@@ -7,6 +7,12 @@ import {
7
7
  isFirstPartyImage,
8
8
  normalizeVersion
9
9
  } from "../chunk-L25OAFOU.js";
10
+ import {
11
+ compareLiveArtifacts,
12
+ declaredArtifactsFromManifest,
13
+ deliveryStateOf,
14
+ parseDigest
15
+ } from "../chunk-W5MCOZTW.js";
10
16
  import "../chunk-MLKGABMK.js";
11
17
 
12
18
  // src/bin/exe-verify-running-images.ts
@@ -93,6 +99,82 @@ function inspectContainer(name) {
93
99
  labels: { [VERSION_LABEL]: clean(version), [REVISION_LABEL]: clean(revision) }
94
100
  };
95
101
  }
102
+ function resolveRunningRef(containerName, configuredImage) {
103
+ const imageId = run("docker", ["inspect", containerName, "--format", "{{ .Image }}"]);
104
+ if (imageId.status !== 0) return configuredImage;
105
+ const id = imageId.stdout.trim();
106
+ if (!id) return configuredImage;
107
+ const digests = run("docker", ["inspect", id, "--format", "{{ json .RepoDigests }}"]);
108
+ if (digests.status !== 0) return configuredImage;
109
+ let list = [];
110
+ try {
111
+ const parsed = JSON.parse(digests.stdout.trim() || "[]");
112
+ if (Array.isArray(parsed)) list = parsed.filter((x) => typeof x === "string");
113
+ } catch {
114
+ return configuredImage;
115
+ }
116
+ if (list.length === 0) return configuredImage;
117
+ const configuredRepo = (configuredImage.split("@")[0] ?? "").replace(/:[^/:]+$/, "");
118
+ return list.find((d) => d.startsWith(`${configuredRepo}@`)) ?? list[0] ?? configuredImage;
119
+ }
120
+ function groupRunningArtifacts(entries) {
121
+ const byRef = /* @__PURE__ */ new Map();
122
+ for (const e of entries) {
123
+ const existing = byRef.get(e.ref);
124
+ if (existing) {
125
+ existing.containers.push(e.container);
126
+ continue;
127
+ }
128
+ byRef.set(e.ref, { containers: [e.container], ref: e.ref, digest: parseDigest(e.ref) });
129
+ }
130
+ return [...byRef.values()];
131
+ }
132
+ function loadManifest(explicitPath) {
133
+ const candidates = explicitPath ? [explicitPath] : DEFAULT_MANIFESTS;
134
+ for (const candidate of candidates) {
135
+ if (!existsSync(candidate)) continue;
136
+ try {
137
+ return { manifest: JSON.parse(readFileSync(candidate, "utf8")), path: candidate };
138
+ } catch {
139
+ }
140
+ }
141
+ return void 0;
142
+ }
143
+ function loadDeclared(explicitPath) {
144
+ const loaded = loadManifest(explicitPath);
145
+ if (!loaded) return { declared: [], source: "no manifest found" };
146
+ try {
147
+ return { declared: declaredArtifactsFromManifest(loaded.manifest), source: loaded.path };
148
+ } catch {
149
+ return { declared: [], source: `${loaded.path} (unreadable stacks)` };
150
+ }
151
+ }
152
+ var VERDICT_ICON = {
153
+ agrees: "\u{1F7E2}",
154
+ disagrees: "\u{1F534}",
155
+ undeclared: "\u{1F7E0}",
156
+ "unknown-provenance": "\u{1F7E0}",
157
+ "not-running": "\u{1F7E0}"
158
+ };
159
+ function printLiveState(report) {
160
+ console.log(
161
+ `
162
+ What is live \u2014 ${report.inventory.runningArtifacts} running artifact(s) vs ${report.inventory.declaredArtifacts} declared (${report.inventory.source})
163
+ `
164
+ );
165
+ for (const e of report.entries) {
166
+ const icon = VERDICT_ICON[e.verdict] ?? "?";
167
+ console.log(` ${icon} ${e.service.padEnd(22)} ${e.verdict}`);
168
+ if (e.running) console.log(` running ${e.running.digest ?? e.running.ref} [${e.running.containers.join(", ")}]`);
169
+ if (e.declared) console.log(` declared ${e.declared.digest ?? e.declared.ref}`);
170
+ if (e.verdict !== "agrees") console.log(` ${e.detail}`);
171
+ }
172
+ console.log(
173
+ `
174
+ agrees: ${report.counts.agrees} disagrees: ${report.counts.disagrees} undeclared: ${report.counts.undeclared} unknown-provenance: ${report.counts["unknown-provenance"]} not-running: ${report.counts["not-running"]}
175
+ `
176
+ );
177
+ }
96
178
  function loadKnownVersions(explicitPath) {
97
179
  const candidates = explicitPath ? [explicitPath] : DEFAULT_MANIFESTS;
98
180
  for (const candidate of candidates) {
@@ -118,8 +200,33 @@ function main(argv) {
118
200
  const containers = names.map(inspectContainer).filter((c) => c !== void 0);
119
201
  const knownVersions = loadKnownVersions(manifestPath);
120
202
  const findings = findRunningImageIssues(containers, knownVersions);
203
+ const { declared, source } = loadDeclared(manifestPath);
204
+ const running = groupRunningArtifacts(
205
+ containers.map((c) => ({ container: c.name, ref: resolveRunningRef(c.name, c.image) }))
206
+ );
207
+ const liveState = compareLiveArtifacts(running, declared, {
208
+ source,
209
+ // A declared service with nothing running it is real information on a full
210
+ // stack host, and pure noise on a subset install. Reported only when the
211
+ // manifest was actually readable, and always as a finding the reader can
212
+ // dismiss — see limitation 4 in delivery-truth.ts.
213
+ reportNotRunning: declared.length > 0
214
+ });
121
215
  if (json) {
122
- console.log(JSON.stringify({ ok: findings.length === 0, checked: containers.length, findings }, null, 2));
216
+ console.log(
217
+ JSON.stringify(
218
+ {
219
+ ok: findings.length === 0 && liveState.findings.length === 0,
220
+ checked: containers.length,
221
+ findings,
222
+ liveState,
223
+ // The contract the bug/task close gates should consume (#690/#694).
224
+ delivery: deliveryStateOf(liveState)
225
+ },
226
+ null,
227
+ 2
228
+ )
229
+ );
123
230
  } else {
124
231
  console.log(`Running-image version assertion \u2014 inspected ${containers.length} container(s)`);
125
232
  if (knownVersions.size === 0) {
@@ -131,15 +238,27 @@ function main(argv) {
131
238
  for (const f of findings) {
132
239
  console.error(` \u{1F534} [${f.kind}] ${f.message}`);
133
240
  }
241
+ if (declared.length === 0) {
242
+ console.log(" \u26A0\uFE0F no declared artifacts readable \u2014 live-vs-declared comparison SKIPPED (this is not a pass)");
243
+ } else {
244
+ printLiveState(liveState);
245
+ }
134
246
  }
135
- if (findings.length === 0) return 0;
247
+ const enforceable = liveState.findings.filter((f) => f.verdict !== "not-running");
248
+ const total = findings.length + enforceable.length;
249
+ if (total === 0) return 0;
136
250
  if (!enforce) {
137
251
  console.error(
138
- `::warning::${findings.length} running-image finding(s) \u2014 WARN-first, not failing. Pass --enforce (or EXE_VERIFY_RUNNING_IMAGES_ENFORCE=1) to fail closed.`
252
+ `::warning::${findings.length} running-image finding(s) and ${liveState.findings.length} live-vs-declared finding(s) \u2014 WARN-first, not failing. Pass --enforce (or EXE_VERIFY_RUNNING_IMAGES_ENFORCE=1) to fail closed.`
139
253
  );
140
254
  return 0;
141
255
  }
142
- console.error(`::error::${findings.length} running container(s) do not resolve to a known release.`);
256
+ for (const f of enforceable) {
257
+ console.error(`::error::[${f.verdict}] ${f.service}: ${f.detail}`);
258
+ }
259
+ console.error(
260
+ `::error::${total} finding(s): ${findings.length} container(s) do not resolve to a known release; ${enforceable.length} artifact(s) are not the artifact the signed manifest pins.`
261
+ );
143
262
  return 1;
144
263
  }
145
264
  process.exit(main(process.argv));
@@ -47,6 +47,9 @@ function daemonSockPath() {
47
47
  function restartMarkerPath() {
48
48
  return join(exeDir(), "last-daemon-restart");
49
49
  }
50
+ function suppressionCountersPath() {
51
+ return join(exeDir(), "watchdog-suppressions.json");
52
+ }
50
53
  function watchdogLogDir() {
51
54
  return join(exeDir(), "logs");
52
55
  }
@@ -340,6 +343,38 @@ async function awaitSuccessor(killedPid) {
340
343
  await sleep(SUCCESSOR_POLL_MS);
341
344
  }
342
345
  }
346
+ function emptySuppressionCounters() {
347
+ return { total: {}, lastAt: {}, lastDetail: {} };
348
+ }
349
+ function readSuppressionCounters(file = suppressionCountersPath()) {
350
+ try {
351
+ const parsed = JSON.parse(readFileSync(file, "utf8"));
352
+ if (!parsed || typeof parsed !== "object") return emptySuppressionCounters();
353
+ const raw = parsed;
354
+ const obj = (v) => v && typeof v === "object" && !Array.isArray(v) ? v : {};
355
+ const total = {};
356
+ for (const [k, v] of Object.entries(obj(raw.total))) {
357
+ if (typeof v === "number" && Number.isFinite(v)) total[k] = v;
358
+ }
359
+ return { total, lastAt: { ...obj(raw.lastAt) }, lastDetail: { ...obj(raw.lastDetail) } };
360
+ } catch {
361
+ return emptySuppressionCounters();
362
+ }
363
+ }
364
+ function recordSuppression(reason, detail, file = suppressionCountersPath(), nowIso = (/* @__PURE__ */ new Date()).toISOString()) {
365
+ const counters = readSuppressionCounters(file);
366
+ const next = (counters.total[reason] ?? 0) + 1;
367
+ counters.total[reason] = next;
368
+ counters.lastAt[reason] = nowIso;
369
+ counters.lastDetail[reason] = detail;
370
+ try {
371
+ mkdirSync(dirname(file), { recursive: true });
372
+ writeFileSync(file, JSON.stringify(counters, null, 2));
373
+ } catch (err) {
374
+ log(`[watchdog] WARNING: could not persist suppression counter: ${err instanceof Error ? err.message : String(err)}`);
375
+ }
376
+ return next;
377
+ }
343
378
  function cleanupStaleFiles() {
344
379
  try {
345
380
  if (existsSync(daemonPidPath())) unlinkSync(daemonPidPath());
@@ -546,19 +581,22 @@ async function tick() {
546
581
  if (age === null) {
547
582
  log("[watchdog] Daemon PID file missing \u2014 cannot determine daemon age (daemon likely dead); proceeding to self-heal checks");
548
583
  } else if (bootGraceActive({ ageSec: age, perCore, readySignaledThisBoot: readySignaledByPid(pid) })) {
549
- log(`[watchdog] Daemon is only ${Math.round(age)}s old (min ${effectiveMinDaemonAgeS(perCore)}s at load ${perCore.toFixed(2)}/core, not yet ready) \u2014 suppressing kill, resetting counter`);
584
+ const bootGraceTotal = recordSuppression("boot_grace", `age=${Math.round(age)}s load=${perCore.toFixed(2)}/core`);
585
+ log(`[watchdog] Daemon is only ${Math.round(age)}s old (min ${effectiveMinDaemonAgeS(perCore)}s at load ${perCore.toFixed(2)}/core, not yet ready) \u2014 suppressing kill, resetting counter [boot-grace-suppressed total: ${bootGraceTotal}]`);
550
586
  failureState = emptyFailureState();
551
587
  return;
552
588
  }
553
589
  const starvation = detectStarvation();
554
590
  if (starvation.starved) {
555
- log(`[watchdog] Daemon unresponsive but host is CPU-starved (${starvation.reason}) \u2014 suppressing self-heal (restart won't fix starvation), resetting counter`);
591
+ const starvationTotal = recordSuppression("starvation", starvation.reason ?? "starved");
592
+ log(`[watchdog] Daemon unresponsive but host is CPU-starved (${starvation.reason}) \u2014 suppressing self-heal (restart won't fix starvation), resetting counter [starvation-suppressed total: ${starvationTotal}]`);
556
593
  failureState = emptyFailureState();
557
594
  return;
558
595
  }
559
596
  const hbAge = heartbeatAgeMs(now);
560
597
  if (isHeartbeatFresh(hbAge)) {
561
- log(`[watchdog] Daemon unresponsive to HTTP ping but event-loop heartbeat is fresh (${((hbAge ?? 0) / 1e3).toFixed(1)}s old < ${HEARTBEAT_FRESH_MS / 1e3}s) \u2014 event loop is still turning; daemon is alive-but-slow. Suppressing kill, resetting counter`);
598
+ const hbTotal = recordSuppression("heartbeat_fresh", `hbAge=${((hbAge ?? 0) / 1e3).toFixed(1)}s`);
599
+ log(`[watchdog] Daemon unresponsive to HTTP ping but event-loop heartbeat is fresh (${((hbAge ?? 0) / 1e3).toFixed(1)}s old < ${HEARTBEAT_FRESH_MS / 1e3}s) \u2014 event loop is still turning; daemon is alive-but-slow. Suppressing kill, resetting counter [heartbeat-fresh-suppressed total: ${hbTotal}]`);
562
600
  failureState = emptyFailureState();
563
601
  return;
564
602
  }
@@ -627,12 +665,15 @@ export {
627
665
  effectiveMinDaemonAgeS,
628
666
  effectiveSigtermGraceMs,
629
667
  emptyFailureState,
668
+ emptySuppressionCounters,
630
669
  hasSustainedFailures,
631
670
  heartbeatAgeMs,
632
671
  isHeartbeatFresh,
633
672
  launchdKickstartTargets,
634
673
  loadPerCore,
674
+ readSuppressionCounters,
635
675
  recordPingFailure,
676
+ recordSuppression,
636
677
  resolveSelfPath,
637
678
  restartDaemonViaSupervisor,
638
679
  watchdogDaemonPidPathForTests