@askexenow/exe-os 0.9.373 → 0.9.376

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 (463) hide show
  1. package/deploy/compose/.env.customer.example +44 -11
  2. package/deploy/compose/.env.example +44 -9
  3. package/deploy/compose/docker-compose.yml +181 -30
  4. package/deploy/compose/gateway-watchdog.sh +17 -0
  5. package/deploy/compose/generate-env.ts +163 -32
  6. package/deploy/compose/sso-edge/default.conf.template +59 -24
  7. package/deploy/compose/sso-edge/error-pages/404.html +129 -0
  8. package/deploy/compose/sso-edge/error-pages/500.html +129 -0
  9. package/deploy/compose/sso-edge/error-pages/503.html +118 -0
  10. package/deploy/compose/sso-edge/sso-redirect.conf +116 -57
  11. package/dist/.dist-verified.json +3 -3
  12. package/dist/{active-agent-BVREYGFJ.js → active-agent-BOBBUJ74.js} +6 -6
  13. package/dist/{active-agent-HLV7IEU3.js → active-agent-GFGEGK2U.js} +6 -6
  14. package/dist/{agent-defs-generator-TFBUJ67B.js → agent-defs-generator-OX6UFPRX.js} +5 -5
  15. package/dist/{agent-loop-CYDFBCNA.js → agent-loop-7ZRH56EX.js} +1 -1
  16. package/dist/{agentic-ontology-WZKVHOUV.js → agentic-ontology-DT3VOXBT.js} +1 -1
  17. package/dist/{backfill-metadata-FN3YMSKC.js → backfill-metadata-VRP6PTPP.js} +9 -9
  18. package/dist/{backup-verify-76235AHA.js → backup-verify-LWHKGOOV.js} +1 -1
  19. package/dist/behavior-injection-GMZKZ3BT.js +83 -0
  20. package/dist/behavior-promotion-QPC4AQ24.js +62 -0
  21. package/dist/{behaviors-33WKK3BG.js → behaviors-GPI4BLTC.js} +18 -15
  22. package/dist/bin/agentic-ontology-backfill.js +10 -10
  23. package/dist/bin/agentic-reflection-backfill.js +11 -11
  24. package/dist/bin/agentic-semantic-label.js +10 -10
  25. package/dist/bin/backfill-conversations.js +16 -13
  26. package/dist/bin/backfill-responses.js +16 -13
  27. package/dist/bin/backfill-vectors.js +18 -15
  28. package/dist/bin/bulk-sync-postgres.js +23 -20
  29. package/dist/bin/cc-doctor.js +20 -12
  30. package/dist/bin/cleanup-stale-review-tasks.js +29 -27
  31. package/dist/bin/cli.js +85 -108
  32. package/dist/bin/daemon-restart-handoff.js +2 -1
  33. package/dist/bin/deferred-daemon-restart.js +120 -111
  34. package/dist/bin/exe-actions.js +176 -0
  35. package/dist/bin/exe-agent-config.js +5 -5
  36. package/dist/bin/exe-agent.js +19 -18
  37. package/dist/bin/exe-assign.js +18 -15
  38. package/dist/bin/exe-boot.js +93 -72
  39. package/dist/bin/exe-call.js +8 -8
  40. package/dist/bin/exe-cicd.js +1210 -0
  41. package/dist/bin/exe-cloud.js +72 -38
  42. package/dist/bin/exe-config-dump.js +5 -5
  43. package/dist/bin/exe-dispatch.js +30 -28
  44. package/dist/bin/exe-doctor.js +14 -11
  45. package/dist/bin/exe-export-behaviors.js +22 -19
  46. package/dist/bin/exe-forget.js +11 -11
  47. package/dist/bin/exe-gateway.js +10 -10
  48. package/dist/bin/exe-healthcheck.js +23 -11
  49. package/dist/bin/exe-heartbeat.js +35 -33
  50. package/dist/bin/exe-kill.js +34 -32
  51. package/dist/bin/exe-launch-agent.js +78 -55
  52. package/dist/bin/exe-mcp.js +10 -6
  53. package/dist/bin/exe-memory-reads.js +9 -9
  54. package/dist/bin/exe-model-supervisor.js +138 -0
  55. package/dist/bin/exe-new-employee.js +14 -14
  56. package/dist/bin/exe-os-mcp-proxy.js +10 -6
  57. package/dist/bin/exe-pending-messages.js +30 -28
  58. package/dist/bin/exe-pending-notifications.js +29 -27
  59. package/dist/bin/exe-pending-reviews.js +30 -28
  60. package/dist/bin/exe-rename.js +9 -9
  61. package/dist/bin/exe-repo-truth.js +1 -1
  62. package/dist/bin/exe-review.js +33 -31
  63. package/dist/bin/exe-search.js +10 -10
  64. package/dist/bin/exe-session-cleanup.js +34 -32
  65. package/dist/bin/exe-settings.js +23 -20
  66. package/dist/bin/exe-start-codex.js +32 -25
  67. package/dist/bin/exe-start-opencode.js +26 -23
  68. package/dist/bin/exe-start.sh +11 -2
  69. package/dist/bin/exe-status.js +31 -29
  70. package/dist/bin/exe-support.js +3 -3
  71. package/dist/bin/exe-team.js +7 -7
  72. package/dist/bin/exe-timers.js +2 -1
  73. package/dist/bin/exe-watchdog.js +180 -15
  74. package/dist/bin/generate-hook-manifest.js +8 -41
  75. package/dist/bin/git-sweep.js +30 -28
  76. package/dist/bin/graph-backfill.js +10 -10
  77. package/dist/bin/graph-export.js +10 -10
  78. package/dist/bin/hooks-cli.js +289 -0
  79. package/dist/bin/import-history.js +13 -13
  80. package/dist/bin/install.js +132 -117
  81. package/dist/bin/intercom-check.js +5 -5
  82. package/dist/bin/mcp-sessions.js +2 -2
  83. package/dist/bin/orchestration-metrics.js +7 -7
  84. package/dist/bin/postgres-agentic-reflection-backfill.js +4 -4
  85. package/dist/bin/postgres-agentic-semantic-backfill.js +4 -4
  86. package/dist/bin/pre-publish.js +1 -1
  87. package/dist/bin/reconcile-backlog.js +2 -2
  88. package/dist/bin/registry-proxy.js +2 -2
  89. package/dist/bin/scan-tasks.js +54 -39
  90. package/dist/bin/setup.js +1 -1
  91. package/dist/bin/shard-migrate.js +9 -9
  92. package/dist/bin/stack-update.js +12 -6
  93. package/dist/bin/verify-stack.js +4 -2
  94. package/dist/bin/vps-health-gate.js +1 -1
  95. package/dist/{boot-generation-QY4H2VST.js → boot-generation-BN6GKASY.js} +6 -6
  96. package/dist/{boot-review-sections-ITQVY2ZQ.js → boot-review-sections-OQ5JGSOD.js} +28 -26
  97. package/dist/{branch-hygiene-U5GFRSTP.js → branch-hygiene-QLD77IMJ.js} +1 -1
  98. package/dist/build-manifest.json +1243 -1133
  99. package/dist/{capability-cards-JDJTJX4D.js → capability-cards-EDZ62HKG.js} +5 -5
  100. package/dist/{capacity-monitor-GK5IB6FJ.js → capacity-monitor-6GMTVILS.js} +30 -28
  101. package/dist/{catchup-brief-ROSFMS46.js → catchup-brief-SGGBMDUP.js} +34 -32
  102. package/dist/{cc-binary-detect-6TNIY5JX.js → cc-binary-detect-ZR6WNOUU.js} +1 -3
  103. package/dist/{chunk-J7RIPMDI.js → chunk-2ODXCCMR.js} +18 -3
  104. package/dist/{hook-integrity-UU5OXONF.js → chunk-3L72UBUH.js} +28 -15
  105. package/dist/chunk-3OX5S7KZ.js +273 -0
  106. package/dist/{chunk-PHA3OES7.js → chunk-3SRZNJKD.js} +1 -1
  107. package/dist/{chunk-4XUPFJNB.js → chunk-42IFYZUN.js} +4 -4
  108. package/dist/{chunk-6D5KMMK4.js → chunk-473JUDCT.js} +5 -5
  109. package/dist/{chunk-NMICTLJK.js → chunk-4F5CNI65.js} +1 -1
  110. package/dist/{chunk-JG4IOKQE.js → chunk-4KVSCQND.js} +88 -15
  111. package/dist/{chunk-ZFXOA2CF.js → chunk-4M6RXJEY.js} +33 -23
  112. package/dist/{chunk-D2AR5PXE.js → chunk-4YJEEOYT.js} +3 -3
  113. package/dist/{chunk-NY75HDWW.js → chunk-4YUGB637.js} +1 -1
  114. package/dist/{chunk-G6P45SFB.js → chunk-4ZSOKEDY.js} +3 -3
  115. package/dist/{chunk-UUPAOKEO.js → chunk-5DF4Y6EC.js} +1 -1
  116. package/dist/{chunk-4QCFFW2H.js → chunk-5QCIWWFA.js} +46 -0
  117. package/dist/{chunk-NLGEFBND.js → chunk-5QKLWJ4Z.js} +1 -1
  118. package/dist/{chunk-ZN3FAXDX.js → chunk-5UBWBXLF.js} +3 -3
  119. package/dist/chunk-5WA4DG2A.js +117 -0
  120. package/dist/{chunk-MQAHDPU5.js → chunk-64ODONK2.js} +67 -1
  121. package/dist/{chunk-USMESBOR.js → chunk-66CGXQUA.js} +239 -39
  122. package/dist/{chunk-OTJVG7JM.js → chunk-6F3FQCAQ.js} +3 -3
  123. package/dist/{chunk-PBVBMZGO.js → chunk-6FG34V6D.js} +15 -14
  124. package/dist/{chunk-7HNQK2JA.js → chunk-6KQ6WMTI.js} +1 -1
  125. package/dist/{chunk-ODOLBT7W.js → chunk-6WKBTZVL.js} +10 -4
  126. package/dist/{chunk-NOKJCF27.js → chunk-7INEFMVU.js} +9 -3
  127. package/dist/{chunk-GSJLB6JI.js → chunk-7THUQU44.js} +34 -8
  128. package/dist/{chunk-HDLAB7W3.js → chunk-7UH2JWBF.js} +1 -1
  129. package/dist/{chunk-MJKWLOCW.js → chunk-7UNMSF5O.js} +1 -1
  130. package/dist/{chunk-TTELLO3M.js → chunk-AEUGIJDO.js} +3 -1
  131. package/dist/{chunk-ZFFRW73K.js → chunk-AHNVFBVB.js} +113 -16
  132. package/dist/{chunk-IBS2FAI4.js → chunk-AUKRBHHZ.js} +4 -1
  133. package/dist/{chunk-7TIAQUBH.js → chunk-BBK2TSK3.js} +1 -1
  134. package/dist/{chunk-L67OHDSD.js → chunk-BNWWVYRN.js} +6 -5
  135. package/dist/{chunk-PY3FOMRN.js → chunk-BQEZPRUC.js} +4 -4
  136. package/dist/{chunk-XPPQ4PBN.js → chunk-BQXYXJYC.js} +733 -309
  137. package/dist/{chunk-ORM7ZFKC.js → chunk-BZ546I4Q.js} +32 -0
  138. package/dist/{chunk-JS5XMVXY.js → chunk-C2UN464N.js} +1 -1
  139. package/dist/{chunk-75H4R62K.js → chunk-CBPNZFSU.js} +0 -2
  140. package/dist/{chunk-YLXTKI6M.js → chunk-CHO5SNWR.js} +1 -1
  141. package/dist/{chunk-HTUEAERH.js → chunk-CIEVY5TD.js} +15 -11
  142. package/dist/{chunk-RHNIWSOP.js → chunk-CKLJT2DH.js} +2 -2
  143. package/dist/{chunk-3FLDC2ZI.js → chunk-CKOJP7JI.js} +1 -1
  144. package/dist/{chunk-V3W3SATA.js → chunk-CL4J4757.js} +1 -1
  145. package/dist/{chunk-3J37XIWU.js → chunk-CQFWTWC6.js} +59 -14
  146. package/dist/{chunk-U45XMFOM.js → chunk-CROVXJ4S.js} +3 -3
  147. package/dist/{chunk-VYNY7K44.js → chunk-CWSLTSL6.js} +8 -8
  148. package/dist/{chunk-V6KKNYF2.js → chunk-DDMGQ5Q3.js} +63 -27
  149. package/dist/{chunk-YKC7QDZH.js → chunk-DN24VTS5.js} +31 -6
  150. package/dist/{chunk-6F4QFV4Q.js → chunk-EHAN752X.js} +7 -7
  151. package/dist/{chunk-2HB5U5QT.js → chunk-EPHSISMT.js} +2 -2
  152. package/dist/{chunk-2W5J4T2F.js → chunk-FCMQVEVL.js} +36 -3
  153. package/dist/{chunk-3L2QU5ZF.js → chunk-FS7XF7SE.js} +1 -1
  154. package/dist/{chunk-6WUXRDTF.js → chunk-FTZET5YX.js} +138 -1
  155. package/dist/{chunk-XEPLZKEB.js → chunk-FUKVP54K.js} +66 -19
  156. package/dist/{chunk-SNW6E3Y4.js → chunk-FX2QRSRT.js} +1 -1
  157. package/dist/{chunk-PWRC5XZO.js → chunk-FXZ6VGFW.js} +16 -8
  158. package/dist/chunk-GHR4ZPJ7.js +70 -0
  159. package/dist/{chunk-6WMJHNGN.js → chunk-GKDAQL45.js} +1 -1
  160. package/dist/{chunk-DMPIS4BY.js → chunk-GOT5ZHPX.js} +3 -3
  161. package/dist/chunk-GPJIBLP4.js +104 -0
  162. package/dist/{chunk-EKYYMIVT.js → chunk-GPUOUUHA.js} +10 -1
  163. package/dist/{chunk-PLSY7Y5F.js → chunk-GXNBPTPJ.js} +1 -1
  164. package/dist/{chunk-NMOEWLJY.js → chunk-HE34XVD5.js} +5 -5
  165. package/dist/{chunk-EM7NP2AC.js → chunk-HHAKXIKX.js} +12 -9
  166. package/dist/{chunk-AMPNM6SB.js → chunk-HHT527PV.js} +82 -37
  167. package/dist/{chunk-WC6WL52H.js → chunk-HIVOLPLD.js} +1 -40
  168. package/dist/{chunk-7P6YUA53.js → chunk-I3LDTSWU.js} +1 -1
  169. package/dist/{chunk-Q3AXXKDF.js → chunk-IKXH4BFC.js} +5 -5
  170. package/dist/chunk-IMYGYIAI.js +23 -0
  171. package/dist/{chunk-KEC47ERR.js → chunk-IPHLUZ37.js} +121 -5
  172. package/dist/{chunk-NZH5VSBC.js → chunk-IZA7XW2Q.js} +3 -3
  173. package/dist/{chunk-LFKRM3RK.js → chunk-IZLML47J.js} +1 -1
  174. package/dist/{chunk-4IZ2ELU7.js → chunk-JRMHGO5B.js} +1 -1
  175. package/dist/{chunk-TRMR77JJ.js → chunk-JSTTPYL3.js} +12 -12
  176. package/dist/{chunk-HWKSG33T.js → chunk-JVWLHBAV.js} +4 -4
  177. package/dist/{chunk-4Y523526.js → chunk-K7UNIEB4.js} +254 -48
  178. package/dist/{chunk-PFLDEJJJ.js → chunk-KBR5LIWD.js} +1 -1
  179. package/dist/{chunk-IMX3VIIT.js → chunk-KI7O64XV.js} +328 -98
  180. package/dist/{chunk-AWKZRRPX.js → chunk-KK3MIY5C.js} +5 -5
  181. package/dist/{chunk-NFFCNZVD.js → chunk-KO3OHI6V.js} +3 -3
  182. package/dist/{chunk-NJFJWQNN.js → chunk-L5CGXEZC.js} +27 -22
  183. package/dist/{chunk-UEZQNJET.js → chunk-LK3XQDBP.js} +1 -1
  184. package/dist/{chunk-T7AZ5K5K.js → chunk-LM443ORV.js} +1 -1
  185. package/dist/{chunk-ICHQULGD.js → chunk-LNAFLXL7.js} +12 -4
  186. package/dist/{chunk-72Y3I24H.js → chunk-LTUA5EYI.js} +122 -11
  187. package/dist/{chunk-FGHPLZDF.js → chunk-MAXD5JQL.js} +11 -10
  188. package/dist/{chunk-45KCQK24.js → chunk-MFASHRJ6.js} +5 -5
  189. package/dist/chunk-MFYMDGE7.js +37 -0
  190. package/dist/{chunk-SMGSSWCW.js → chunk-MGVILAYU.js} +55 -11
  191. package/dist/{chunk-J4C442ZT.js → chunk-MSLWRWTI.js} +1 -1
  192. package/dist/{chunk-C2L622QJ.js → chunk-NB5IRTC4.js} +52 -44
  193. package/dist/{chunk-O5HTTJ2X.js → chunk-ND75TGPR.js} +2 -2
  194. package/dist/{chunk-VRTCVZND.js → chunk-NE34MWVL.js} +142 -16
  195. package/dist/{chunk-X63RNRZF.js → chunk-NMOFLWDY.js} +1 -1
  196. package/dist/{chunk-CRCB5S7I.js → chunk-NPXKGBVZ.js} +140 -23
  197. package/dist/{chunk-LSY2JAFY.js → chunk-NRBGUIPE.js} +1 -1
  198. package/dist/{chunk-4LWBC7CM.js → chunk-NY6SBR4O.js} +1 -1
  199. package/dist/{chunk-UCUOGVDX.js → chunk-O3K2C22L.js} +13 -1
  200. package/dist/{chunk-BZYEOIT3.js → chunk-OATET4BV.js} +2 -2
  201. package/dist/chunk-OOZU5H3T.js +86 -0
  202. package/dist/{chunk-XXNSHYPO.js → chunk-OQ4FNDRG.js} +28 -6
  203. package/dist/{chunk-GJD7D6HM.js → chunk-OWVX52XF.js} +4 -4
  204. package/dist/{chunk-X65OJFQM.js → chunk-PEAAX6UA.js} +1 -1
  205. package/dist/{chunk-X36BZYJ3.js → chunk-PFAVHC5N.js} +5 -5
  206. package/dist/chunk-PMVVUIHH.js +85 -0
  207. package/dist/chunk-PPMGQFLJ.js +2317 -0
  208. package/dist/{chunk-U6RXHPK4.js → chunk-PTY2N23C.js} +311 -3
  209. package/dist/{chunk-5SDE2HWI.js → chunk-PZ5SKYK6.js} +4 -4
  210. package/dist/{chunk-WZFVNICF.js → chunk-Q6ZLQMP2.js} +1 -1
  211. package/dist/{chunk-KBRHGXE7.js → chunk-QFR5EKZG.js} +29 -7
  212. package/dist/{chunk-SWK6MNAI.js → chunk-QN56VQ6Z.js} +1 -1
  213. package/dist/{chunk-6KS57E66.js → chunk-QR3BUMOS.js} +2 -2
  214. package/dist/{chunk-UMNMC3DZ.js → chunk-QV5CQLQH.js} +2 -2
  215. package/dist/{chunk-SCHARPXE.js → chunk-REZIGNA6.js} +2 -2
  216. package/dist/{chunk-UQGSBM3U.js → chunk-RFPMXR6B.js} +11 -0
  217. package/dist/{chunk-DHWJMFR6.js → chunk-RSABKW6B.js} +1 -1
  218. package/dist/{chunk-RHRK3VDF.js → chunk-RZNP35SI.js} +2 -2
  219. package/dist/{chunk-NUTZJZKW.js → chunk-SKTAZGFI.js} +10 -42
  220. package/dist/{chunk-JVKIRKLC.js → chunk-SVXUT2DN.js} +4 -4
  221. package/dist/{chunk-YRC4NV2C.js → chunk-T7EF5CQO.js} +3 -3
  222. package/dist/{chunk-QAEWWYHL.js → chunk-TDF2XKLK.js} +5 -1
  223. package/dist/{chunk-52EK7KIA.js → chunk-TT5BBVLX.js} +51 -111
  224. package/dist/{chunk-5H47VHB7.js → chunk-UWX6MMCX.js} +1 -1
  225. package/dist/{chunk-KXBMR4ZD.js → chunk-V3WLC5TJ.js} +1 -98
  226. package/dist/{chunk-E7DFTCUW.js → chunk-V4YNN7PA.js} +10 -3
  227. package/dist/{chunk-S37PAH7F.js → chunk-V5DDXXMP.js} +25 -5
  228. package/dist/{chunk-3LQVIRGL.js → chunk-VH6SPPNA.js} +1 -1
  229. package/dist/{chunk-TN2AXREB.js → chunk-VJUUI2VT.js} +1 -1
  230. package/dist/{chunk-L6WHOLGP.js → chunk-VN5WOOAQ.js} +42 -6
  231. package/dist/{chunk-EXDW3E2R.js → chunk-VPHJ2LUI.js} +165 -15
  232. package/dist/{chunk-I73AHVH5.js → chunk-WJC6AAJN.js} +1 -1
  233. package/dist/{chunk-FLNUXH6H.js → chunk-WVBVUVZB.js} +6 -5
  234. package/dist/{chunk-A6PDF4BO.js → chunk-XTQ7R2PA.js} +2 -2
  235. package/dist/{chunk-3W7U6ZKY.js → chunk-Y2HD2YB7.js} +1 -1
  236. package/dist/{chunk-MLYG3TI6.js → chunk-YAACLBZ7.js} +5 -5
  237. package/dist/{chunk-DRXO46LA.js → chunk-YGVAKKGJ.js} +11 -6
  238. package/dist/chunk-YLHACCCB.js +166 -0
  239. package/dist/{chunk-JKLA7AUZ.js → chunk-YP6UGVEY.js} +3 -3
  240. package/dist/{chunk-QSAAN3H6.js → chunk-YYC553FO.js} +2 -2
  241. package/dist/{chunk-T35RCQFE.js → chunk-YZPEQW7H.js} +9 -8
  242. package/dist/{chunk-IVU3WN7S.js → chunk-ZG62LIK3.js} +74 -4
  243. package/dist/{chunk-KI5PFRG6.js → chunk-ZKGWHT56.js} +60 -2
  244. package/dist/{chunk-P5YTFPCV.js → chunk-ZKJ5S23O.js} +37 -15
  245. package/dist/chunk-ZLPS3GR7.js +146 -0
  246. package/dist/{chunk-L6MLYKY5.js → chunk-ZMX22HSS.js} +50 -6
  247. package/dist/{chunk-JY5GAZYC.js → chunk-ZQEJ4IX2.js} +4 -0
  248. package/dist/{chunk-P3DQL6JT.js → chunk-ZS5JO6QV.js} +7 -6
  249. package/dist/{cleanup-graph-garbage-6IJ6GJY2.js → cleanup-graph-garbage-LAPIZGFX.js} +11 -11
  250. package/dist/{cloud-sync-command-TZVPTKZV.js → cloud-sync-command-QAZ2NWRA.js} +11 -2
  251. package/dist/{cloud-sync-db-init-2QLU6GCD.js → cloud-sync-db-init-HAGVF32Y.js} +1 -1
  252. package/dist/{cloud-sync-shutdown-OPCDMH4L.js → cloud-sync-shutdown-DAEPCFVK.js} +5 -5
  253. package/dist/{co-activation-YMDKMDZ6.js → co-activation-523TKQPZ.js} +5 -5
  254. package/dist/{co-occurrence-VYWPQSLC.js → co-occurrence-PQUCTENN.js} +35 -16
  255. package/dist/{code-context-index-QLJDRL7B.js → code-context-index-LIDOFKOR.js} +12 -5
  256. package/dist/code-context-watcher-4F7K2N3U.js +120 -0
  257. package/dist/{content-extractor-NXYNEF5K.js → content-extractor-DJM5EUDA.js} +2 -2
  258. package/dist/{conversation-entity-extractor-KGW4UEY4.js → conversation-entity-extractor-THGKQ5RD.js} +4 -4
  259. package/dist/{crdt-sync-QS2DHTKW.js → crdt-sync-32B55NOJ.js} +1 -1
  260. package/dist/{crm-webhook-5PNRCVO2.js → crm-webhook-FHRISFYQ.js} +2 -2
  261. package/dist/{cto-delegation-gate-LD4XTG6U.js → cto-delegation-gate-O6XPGECP.js} +29 -27
  262. package/dist/{daemon-auth-QZHEO7IQ.js → daemon-auth-PNKHERLV.js} +6 -1
  263. package/dist/daemon-drift-N2GKUBAO.js +15 -0
  264. package/dist/{daemon-orchestration-XC2VTPVI.js → daemon-orchestration-BWLSJG2X.js} +35 -31
  265. package/dist/{daemon-ready-3WSKI3R5.js → daemon-ready-BN6EZLTQ.js} +1 -1
  266. package/dist/{daemon-ready-signal-CKXPUMJ2.js → daemon-ready-signal-PNDMVKPJ.js} +3 -1
  267. package/dist/{daemon-restart-circuit-breaker-SMTWFX27.js → daemon-restart-circuit-breaker-CD4VMCU7.js} +1 -1
  268. package/dist/daemon-restart-report-FIO5HZTJ.js +15 -0
  269. package/dist/{daemon-timer-report-TNJH5SFY.js → daemon-timer-report-6UK5PSDP.js} +2 -1
  270. package/dist/{db-integrity-events-2DTFO37N.js → db-integrity-events-GYGANKZV.js} +1 -1
  271. package/dist/{destructive-data-guard-BVFWPPIS.js → destructive-data-guard-HHWUBIGS.js} +1 -1
  272. package/dist/{doc-graph-extractor-6TVQTBLO.js → doc-graph-extractor-HOKOV7BE.js} +9 -9
  273. package/dist/{documents-4WQ5MQR2.js → documents-HWEJMONR.js} +18 -15
  274. package/dist/{dreaming-SO4VH44W.js → dreaming-FMNDODG2.js} +33 -31
  275. package/dist/{employee-boot-brief-Z4WTZVUC.js → employee-boot-brief-DBFROOQJ.js} +37 -35
  276. package/dist/{entity-boost-JY3KNTO2.js → entity-boost-5V4W6NFA.js} +1 -1
  277. package/dist/{exe-drift-BWSUUAEA.js → exe-drift-V55UAYRT.js} +6 -6
  278. package/dist/{exe-export-4WPMVRNO.js → exe-export-LHN42ZUS.js} +20 -17
  279. package/dist/{exe-import-7C3SS62E.js → exe-import-M536BEZC.js} +20 -17
  280. package/dist/{exe-key-NFHZNJU6.js → exe-key-37XIR22X.js} +113 -108
  281. package/dist/{exe-org-5HYTAUH6.js → exe-org-7TDIRNTE.js} +14 -14
  282. package/dist/{exe-snapshot-REKNH2WI.js → exe-snapshot-EOUBCIQK.js} +36 -34
  283. package/dist/{fast-db-init-OW6Z4YDB.js → fast-db-init-GWUZ746B.js} +1 -1
  284. package/dist/{founder-context-6FAAM5LY.js → founder-context-6LQKET4A.js} +2 -2
  285. package/dist/{fts-integrity-4YB34KWX.js → fts-integrity-PLAL6NMG.js} +1 -1
  286. package/dist/gateway/index.js +17 -17
  287. package/dist/{git-main-guard-VTW4N3CM.js → git-main-guard-BGICS25C.js} +1 -1
  288. package/dist/{git-staleness-ELGGOVRV.js → git-staleness-QNNXJK3W.js} +5 -5
  289. package/dist/{global-procedures-JBMGJRR6.js → global-procedures-NMQGF54V.js} +7 -7
  290. package/dist/{gotrue-session-ODZ2ERJX.js → gotrue-session-U4H3UGHL.js} +1 -3
  291. package/dist/{graph-auto-extract-O6IIL5O3.js → graph-auto-extract-7POGAKHM.js} +9 -9
  292. package/dist/{graph-query-AP5R6ZHO.js → graph-query-ZEDO4BDF.js} +1 -1
  293. package/dist/{graph-rag-WHZ6EPMW.js → graph-rag-JA7XN7NO.js} +4 -4
  294. package/dist/hook-integrity-6NLSNTXD.js +15 -0
  295. package/dist/{hook-prefetch-VWHIZBTX.js → hook-prefetch-4KH3D4YU.js} +30 -27
  296. package/dist/hook-tamper-log-Z4PWC7N4.js +90 -0
  297. package/dist/hooks/bug-report-worker.js +33 -31
  298. package/dist/hooks/codex-stop-task-finalizer.js +35 -33
  299. package/dist/hooks/commit-complete.js +32 -30
  300. package/dist/hooks/error-recall.js +12 -12
  301. package/dist/hooks/exe-heartbeat-hook.js +7 -7
  302. package/dist/hooks/ingest-worker.js +19 -16
  303. package/dist/hooks/ingest.js +20 -20
  304. package/dist/hooks/instructions-loaded.js +9 -9
  305. package/dist/hooks/manifest.json +20 -20
  306. package/dist/hooks/notification.js +8 -8
  307. package/dist/hooks/post-compact.js +7 -7
  308. package/dist/hooks/post-tool-combined.js +14 -14
  309. package/dist/hooks/pre-compact.js +32 -30
  310. package/dist/hooks/pre-tool-use.js +305 -490
  311. package/dist/hooks/prompt-submit.js +63 -55
  312. package/dist/hooks/session-end.js +37 -35
  313. package/dist/hooks/session-start.js +18 -18
  314. package/dist/hooks/stop.js +38 -36
  315. package/dist/hooks/subagent-stop.js +34 -32
  316. package/dist/hooks/summary-worker.js +38 -36
  317. package/dist/index.js +40 -38
  318. package/dist/{installer-RYW65FRY.js → installer-M34Q7LAS.js} +25 -10
  319. package/dist/{installer-OYBQQ7BY.js → installer-POV6TDQ5.js} +12 -8
  320. package/dist/{installer-A3V2W3NV.js → installer-S624ZOMB.js} +12 -8
  321. package/dist/{intercom-queue-XBS5WVJM.js → intercom-queue-MKDWAEUV.js} +28 -26
  322. package/dist/lib/cloud-sync.js +29 -20
  323. package/dist/lib/consolidation.js +11 -11
  324. package/dist/lib/database.js +5 -5
  325. package/dist/lib/db-backup.js +7 -1
  326. package/dist/lib/db-daemon-client.js +10 -7
  327. package/dist/lib/db-write-worker.js +4 -4
  328. package/dist/lib/db.js +5 -5
  329. package/dist/lib/device-registry.js +1 -1
  330. package/dist/lib/embedder.js +8 -5
  331. package/dist/lib/employee-templates.js +8 -8
  332. package/dist/lib/employees.js +5 -5
  333. package/dist/lib/exe-daemon-client.js +7 -4
  334. package/dist/lib/exe-daemon.js +440 -255
  335. package/dist/lib/hybrid-search.js +12 -10
  336. package/dist/lib/identity-templates.js +1 -1
  337. package/dist/lib/identity.js +17 -7
  338. package/dist/lib/license.js +2 -2
  339. package/dist/lib/messaging.js +29 -27
  340. package/dist/lib/post-tool-memory.js +9 -9
  341. package/dist/lib/registry-proxy.js +3 -1
  342. package/dist/lib/reminders.js +6 -6
  343. package/dist/lib/schedules.js +11 -11
  344. package/dist/lib/session-registry.js +11 -7
  345. package/dist/lib/session-wrappers.js +1 -1
  346. package/dist/lib/skill-learning.js +19 -16
  347. package/dist/lib/stack-invariants.js +11 -1
  348. package/dist/lib/status-brief.js +2 -1
  349. package/dist/lib/store.js +9 -9
  350. package/dist/lib/task-router.js +6 -6
  351. package/dist/lib/tasks.js +30 -28
  352. package/dist/lib/tmux-routing.js +28 -26
  353. package/dist/lib/tmux-status.js +5 -1
  354. package/dist/lib/token-spend.js +6 -6
  355. package/dist/{license-gate-EOLMF7J5.js → license-gate-2QNMBAZU.js} +3 -3
  356. package/dist/{license-sync-ELY6PKEU.js → license-sync-FEDKH5MD.js} +2 -2
  357. package/dist/{mailbox-inbox-4MEUOL3J.js → mailbox-inbox-XE72D3AX.js} +2 -2
  358. package/dist/{mailbox-outbox-J6WIF3UY.js → mailbox-outbox-DNDDP2HW.js} +1 -1
  359. package/dist/mcp/register-tools.js +112 -107
  360. package/dist/mcp/server.js +113 -108
  361. package/dist/mcp/tools/complete-reminder.js +7 -7
  362. package/dist/mcp/tools/create-reminder.js +7 -7
  363. package/dist/mcp/tools/create-task.js +32 -30
  364. package/dist/mcp/tools/deactivate-behavior.js +20 -17
  365. package/dist/mcp/tools/list-reminders.js +7 -7
  366. package/dist/mcp/tools/list-tasks.js +32 -30
  367. package/dist/mcp/tools/send-message.js +35 -31
  368. package/dist/mcp/tools/update-task.js +31 -29
  369. package/dist/{mcp-child-registry-FVGV5XSB.js → mcp-child-registry-DVHYAHPW.js} +3 -2
  370. package/dist/{mcp-health-HNVSWKFA.js → mcp-health-B5EKRCZG.js} +2 -2
  371. package/dist/{mcp-http-config-4PHK6RHB.js → mcp-http-config-ZJ7XHWT7.js} +10 -6
  372. package/dist/{mcp-session-identity-5DBVDLQR.js → mcp-session-identity-PEVM7VIP.js} +28 -26
  373. package/dist/{memory-cards-WJM4NG3Q.js → memory-cards-VN5DEWPD.js} +13 -9
  374. package/dist/{memory-graph-extractor-TSTO7PYI.js → memory-graph-extractor-TMEB6WLA.js} +10 -10
  375. package/dist/{memory-poisoning-defense-BWVA5OBI.js → memory-poisoning-defense-DYHARQ2G.js} +5 -5
  376. package/dist/{memory-pressure-watchdog-GES7RFL3.js → memory-pressure-watchdog-J6Q3SIBL.js} +29 -27
  377. package/dist/{memory-queue-client-62NS3U56.js → memory-queue-client-QC2OTMJB.js} +8 -5
  378. package/dist/{memory-reflection-6UAL4IHM.js → memory-reflection-ZYJUOSFX.js} +34 -14
  379. package/dist/{message-queue-client-VMVKIPV7.js → message-queue-client-OEQCGSWC.js} +1 -25
  380. package/dist/{notification-ledger-E2WOQ3WQ.js → notification-ledger-TG6EFYBP.js} +31 -29
  381. package/dist/{notifications-IHLUYF3E.js → notifications-LGYY22W5.js} +28 -26
  382. package/dist/{orchestration-events-TKZV4PAI.js → orchestration-events-JPHB6NPY.js} +6 -6
  383. package/dist/{orchestrator-MQXUNOS2.js → orchestrator-IC4WGP6L.js} +30 -28
  384. package/dist/{org-brief-session-7KKLV5OW.js → org-brief-session-DEPHWCQR.js} +9 -9
  385. package/dist/{org-consent-policy-7AHSKB6L.js → org-consent-policy-T27AO5OJ.js} +2 -2
  386. package/dist/{org-join-POWUG25F.js → org-join-A3YXC5RB.js} +2 -2
  387. package/dist/{org-key-admin-E7EMDOZZ.js → org-key-admin-SQFHCVP2.js} +3 -3
  388. package/dist/{org-partner-runtime-EVZKR2SJ.js → org-partner-runtime-L7L2WWGN.js} +10 -10
  389. package/dist/{org-row-visibility-GUMNPRK7.js → org-row-visibility-M54Z6ZH3.js} +1 -1
  390. package/dist/{pipeline-router-E5XQUJGU.js → pipeline-router-NKYAUR3Y.js} +6 -6
  391. package/dist/{plan-limits-AJ6K2P6R.js → plan-limits-ISRRGF23.js} +8 -8
  392. package/dist/{platform-procedures-7YSCLF4Z.js → platform-procedures-Z7ZGBJWN.js} +1 -1
  393. package/dist/{project-boot-5ZXAIOBB.js → project-boot-BLYGVUJH.js} +4 -1
  394. package/dist/{project-name-FQKW5SFG.js → project-name-WKSNNKXK.js} +6 -6
  395. package/dist/{projection-worker-UKSYJ4PG.js → projection-worker-RNYPE46G.js} +2 -2
  396. package/dist/{prospective-memory-S22KIIBP.js → prospective-memory-GEO6E3UL.js} +5 -5
  397. package/dist/{push-notifications-T5SJMFL4.js → push-notifications-EY6BXZUY.js} +29 -27
  398. package/dist/ref-provenance-gate-M4AQO4OT.js +269 -0
  399. package/dist/{reproject-worktree-memories-G6QO5J3X.js → reproject-worktree-memories-DAA5GWMH.js} +30 -28
  400. package/dist/{reranker-NYOFY5FK.js → reranker-7OADQPMG.js} +1 -1
  401. package/dist/resolve-image-labels-ZI6UBW5W.js +15 -0
  402. package/dist/{retrieval-health-LWDBIBWJ.js → retrieval-health-FCEDWN2P.js} +2 -2
  403. package/dist/{review-polling-BSZXGHER.js → review-polling-G52BR4MC.js} +29 -27
  404. package/dist/runtime/index.js +37 -35
  405. package/dist/{session-events-EO7BFQ73.js → session-events-P6E2373E.js} +29 -27
  406. package/dist/{session-kill-telemetry-FXUGITZK.js → session-kill-telemetry-OHNJMIVT.js} +29 -27
  407. package/dist/{session-mcp-config-SC5BLWZG.js → session-mcp-config-WFZAH6R5.js} +2 -1
  408. package/dist/{session-scope-B3VWUG4G.js → session-scope-DKOHPQPJ.js} +28 -26
  409. package/dist/{setup-wizard-3JEJSXXN.js → setup-wizard-RNU3RFBE.js} +1 -1
  410. package/dist/{skill-refinement-5DDEQHGM.js → skill-refinement-AKJTHFXC.js} +6 -6
  411. package/dist/stack-generate-manifest-7WJZWSPK.js +958 -0
  412. package/dist/{stack-promote-KPEARCCS.js → stack-promote-OP2URGFF.js} +5 -4
  413. package/dist/{stack-release-FMGC57AD.js → stack-release-MY6U2QIO.js} +32 -8
  414. package/dist/{stack-update-TZ4P6EXU.js → stack-update-QSHSLUTZ.js} +4 -3
  415. package/dist/{steward-gate-PC6MD5VP.js → steward-gate-KMLS5ECC.js} +6 -6
  416. package/dist/{subagent-brief-injection-NBSQ5IBS.js → subagent-brief-injection-HCKZQZBF.js} +39 -37
  417. package/dist/{supervisor-handoff-CSJQMI53.js → supervisor-handoff-SGLEPOCY.js} +12 -3
  418. package/dist/{support-inbox-M3HDZFVF.js → support-inbox-UBXU5RKV.js} +11 -11
  419. package/dist/{support-outbox-HFJWG52M.js → support-outbox-G2NG2U5K.js} +2 -2
  420. package/dist/{sweep-budget-KMPJ7O5Z.js → sweep-budget-YGLCNXZZ.js} +9 -3
  421. package/dist/{task-enforcement-LXNIF3US.js → task-enforcement-2GR7HU6V.js} +29 -27
  422. package/dist/{task-request-inbox-3EFDJT4E.js → task-request-inbox-ANCVK2VG.js} +2 -2
  423. package/dist/{task-scope-ERJTOAS4.js → task-scope-QANJJXXB.js} +32 -30
  424. package/dist/{tasks-crud-GUP437HH.js → tasks-crud-45WOIMIM.js} +46 -26
  425. package/dist/{tasks-notify-AXFFZTI2.js → tasks-notify-ZJS4MA3S.js} +31 -27
  426. package/dist/{tasks-review-AYNV37GQ.js → tasks-review-ZVPKY47Z.js} +28 -26
  427. package/dist/{telemetry-upload-4IP7KKIR.js → telemetry-upload-VY3UWAEL.js} +10 -10
  428. package/dist/{token-budget-UJD5CHUG.js → token-budget-XHX6XFEC.js} +6 -6
  429. package/dist/{tool-capability-index-TCTWUUBO.js → tool-capability-index-6HLZU437.js} +1 -1
  430. package/dist/{tool-telemetry-YRVOD2RP.js → tool-telemetry-GBDI4AXR.js} +1 -1
  431. package/dist/tui/App.js +38 -36
  432. package/dist/{tui-data-ZUFCSQ3G.js → tui-data-IQFE3UW3.js} +32 -30
  433. package/dist/{typed-messages-RCMPEKJN.js → typed-messages-P2HLLA62.js} +1 -1
  434. package/dist/{update-support-V5LF2KMQ.js → update-support-BDN5AK4R.js} +27 -23
  435. package/dist/{work-claims-2BECZ5GA.js → work-claims-PDQNLE5K.js} +7 -7
  436. package/dist/{work-state-heartbeat-7TMN2GSO.js → work-state-heartbeat-CH6BLQKV.js} +1 -1
  437. package/dist/{worker-gate-WUX2AYYZ.js → worker-gate-NUUSQMBT.js} +1 -3
  438. package/dist/{workflow-engine-HDEYIAWI.js → workflow-engine-RZ7QEI3Z.js} +2 -2
  439. package/dist/{worktree-ZMNKH46X.js → worktree-Q25PZST6.js} +11 -7
  440. package/dist/worktree-ownership-guard-4LKMW6PW.js +421 -0
  441. package/dist/{worktree-sweep-ZNX6R25W.js → worktree-sweep-EV5YQ2OB.js} +8 -8
  442. package/package.json +16 -3
  443. package/release-notes.json +5 -5
  444. package/src/commands/exe.md +16 -16
  445. package/stack.release.json +13 -6
  446. package/dist/behavior-injection-76FH424R.js +0 -62
  447. package/dist/chunk-I422WQ3A.js +0 -50
  448. package/dist/daemon-restart-report-EIVD6WDJ.js +0 -10
  449. package/dist/worktree-ownership-guard-OUWJROW2.js +0 -88
  450. /package/dist/{chunk-X7HB4KLA.js → chunk-4EG4DT4F.js} +0 -0
  451. /package/dist/{chunk-B72KXFDR.js → chunk-BRAIWGMF.js} +0 -0
  452. /package/dist/{chunk-D2Q3AYMB.js → chunk-HQEAZDAC.js} +0 -0
  453. /package/dist/{chunk-SBMBWO2Y.js → chunk-IK4344V5.js} +0 -0
  454. /package/dist/{chunk-4VB6NJOL.js → chunk-K3VDF6II.js} +0 -0
  455. /package/dist/{chunk-KXIYWHBU.js → chunk-KM7DAG5J.js} +0 -0
  456. /package/dist/{chunk-RWTYLRNY.js → chunk-QIEYJ4KZ.js} +0 -0
  457. /package/dist/{chunk-OJTF4SV7.js → chunk-VCTK5HRA.js} +0 -0
  458. /package/dist/{chunk-NP62DK7V.js → chunk-VPT6VMBG.js} +0 -0
  459. /package/dist/{chunk-IUXVUUIA.js → chunk-YZ4AEMR7.js} +0 -0
  460. /package/dist/{core-memory-33XVE547.js → core-memory-UIZKCY4L.js} +0 -0
  461. /package/dist/{memory-isolation-Q3DSVL72.js → memory-isolation-3GJ6WLYX.js} +0 -0
  462. /package/dist/{oauth-server-ZP5ZXRL7.js → oauth-server-ZRHXIRXQ.js} +0 -0
  463. /package/dist/{wiki-acl-EICCXRAK.js → wiki-acl-MFOYK5F4.js} +0 -0
@@ -10,7 +10,12 @@ DOMAIN=CHANGEME_DOMAIN
10
10
  # bug 8dc31733: EXE_DB_IMAGE overrides the Postgres image tag in compose.
11
11
  # The manifest declares env: "EXE_DB_IMAGE" — keep this in sync with the
12
12
  # stack manifest pin. Defaults to pgvector/pgvector:0.8.0-pg16 in compose.
13
- # EXE_DB_IMAGE=pgvector/pgvector:0.8.0-pg16
13
+ EXE_DB_IMAGE=update.askexe.com/askexe/pgvector:0.8.0-pg16@sha256:a132765ec351c65111b5b675928a3a0515a466a40f97277329db8b8209ad8bc9
14
+
15
+ # --- Observability ---
16
+ # OTLP collector image. Compose carries no fallback default: a missing pin
17
+ # ABORTS the deploy rather than substituting an old image.
18
+ OTEL_COLLECTOR_IMAGE=update.askexe.com/askexe/otel-collector-contrib:0.114.0@sha256:37fa87091cfaaec7234a27e4e395a40c31c2bfaea97a349a4afef6d9e9681197
14
19
  POSTGRES_USER=exe
15
20
  POSTGRES_PASSWORD=CHANGEME_POSTGRES_PASSWORD
16
21
  POSTGRES_DB=exedb
@@ -33,7 +38,12 @@ GOTRUE_EXTERNAL_URL=https://auth.CHANGEME_DOMAIN
33
38
  # tokens are rejected as iss-mismatch. Keep equal to GOTRUE_EXTERNAL_URL.
34
39
  GOTRUE_JWT_ISSUER=https://auth.CHANGEME_DOMAIN
35
40
  # SSO redirect allow-list (bug 66f8e10a) — app origins for unified SSO.
36
- GOTRUE_URI_ALLOW_LIST=https://crm.CHANGEME_DOMAIN,https://wiki.CHANGEME_DOMAIN,https://erp.CHANGEME_DOMAIN
41
+ # Must list EVERY origin the SPA can redirect back to, including the opt-in
42
+ # dashboard: dashboard-page sends ?redirect=https://dashboard.<domain> through
43
+ # auth, and GoTrue rejects any redirect_to that is not on this list. Kept in
44
+ # lockstep with generate-env.ts and .env.example — a customer who enables the
45
+ # dashboard profile must not have to discover this entry themselves.
46
+ GOTRUE_URI_ALLOW_LIST=https://crm.CHANGEME_DOMAIN,https://wiki.CHANGEME_DOMAIN,https://erp.CHANGEME_DOMAIN,https://dashboard.CHANGEME_DOMAIN,https://gateway.CHANGEME_DOMAIN
37
47
  # Bug 0327b017: parent-domain session cookie → shared across all subdomains.
38
48
  GOTRUE_COOKIE_DOMAIN=.CHANGEME_DOMAIN
39
49
  GOTRUE_COOKIE_KEY=exe-auth
@@ -48,10 +58,18 @@ SMTP_PORT=587
48
58
  SMTP_USER=
49
59
  SMTP_PASS=
50
60
 
61
+ # --- Dashboard (exe-dashboard — customer dashboard at dashboard.<domain>) ---
62
+ # OPT-IN: the exe-dashboard compose service sits behind `profiles: [dashboard]`.
63
+ # No default is written here on purpose — the pin comes from the signed stack
64
+ # manifest (services.dashboard.image), so .env stays derived rather than
65
+ # becoming a competing source of truth that outranks it once it goes stale.
66
+ #DASHBOARD_IMAGE_TAG=update.askexe.com/askexe/exe-dashboard:vX.Y.Z@sha256:...
67
+ #DASHBOARD_PORT=3301
68
+
51
69
  # --- Auth gateway (exe-auth — shared SSO sign-in UI at auth.<domain>) ---
52
70
  # Bug 58840873: pin the auth image so compose never falls back to its stale
53
71
  # hardcoded default tag. Keep in sync with the manifest AUTH_IMAGE_TAG.
54
- AUTH_IMAGE_TAG=update.askexe.com/askexe/exe-auth:v0.5.0
72
+ AUTH_IMAGE_TAG=update.askexe.com/askexe/exe-auth:v0.6.1@sha256:89670a15bc59255299be695525863e66f949694eec1dd8886038dc3659a4a941
55
73
  # Bug 379e5c13: server_name / CORS from the CONFIGURED apex domain, not by naive
56
74
  # last-2-label slicing (which breaks company.co.uk → co.uk).
57
75
  AUTH_SERVER_NAME=auth.CHANGEME_DOMAIN
@@ -106,7 +124,7 @@ EXE_ORG_ID=
106
124
  EXE_ORG_WORKSPACE_ID=
107
125
 
108
126
  # --- CRM ---
109
- CRM_IMAGE_TAG=update.askexe.com/askexe/exe-crm:v0.9.51
127
+ CRM_IMAGE_TAG=update.askexe.com/askexe/exe-crm:v0.9.53@sha256:a586dcc8bbd992538e3caa18c44e772d30f31155dfef0a2b7466ca3fc7c553d8
110
128
  CRM_SERVER_URL=https://crm.CHANGEME_DOMAIN
111
129
  CRM_APP_SECRET=CHANGEME_CRM_APP_SECRET
112
130
  # The CRM's first admin — seeded at boot by WorkspaceBootstrapService, which is
@@ -120,7 +138,7 @@ EXE_CRM_ADMIN_EMAIL=CHANGEME_ADMIN_EMAIL
120
138
  CRM_HOST_PORT=3000
121
139
 
122
140
  # --- Wiki ---
123
- WIKI_IMAGE_TAG=update.askexe.com/askexe/exe-wiki:v0.9.26
141
+ WIKI_IMAGE_TAG=update.askexe.com/askexe/exe-wiki:v0.9.28@sha256:61856a4c6b97ce62c62ecdc3a377139287be5860eb807d9fbb737115758d7856
124
142
  # Bug 2a8d3003 — DO NOT change this without migrating the data first.
125
143
  # The wiki's users / workspaces / workspace_documents live in `public`. Point it at a
126
144
  # different schema and Prisma will NOT error: it finds no tables, assumes a fresh
@@ -131,7 +149,22 @@ WIKI_IMAGE_TAG=update.askexe.com/askexe/exe-wiki:v0.9.26
131
149
  # only thing holding production together was a host-local compose override.
132
150
  # exe-wiki-schema-guard blocks the boot if you get this wrong.
133
151
  WIKI_DB_SCHEMA=public
134
- WIKI_VECTOR_DB=exeOsMcp
152
+ # Bugs bed3cb4a / c604df37 — see deploy/compose/docker-compose.yml's exe-wiki
153
+ # environment block for the full rationale. pgvector reuses this same
154
+ # exe-db instance; native runs in-process (no API key, no exe-os MCP daemon).
155
+ WIKI_VECTOR_DB=pgvector
156
+ # bug bed3cb4a / corrected 2026-08-31 (founder direction): wiki's RAG/chat
157
+ # uses GLM via Z.ai directly (exe-wiki PR #78's real, verified `zai`
158
+ # provider) — not Anthropic through exe-gateway. Supply ZAI_API_KEY to match.
159
+ WIKI_LLM_PROVIDER=zai
160
+ ZAI_MODEL_PREF=glm-4.6
161
+ ZAI_BASE_PATH=https://api.z.ai/api/coding/paas/v4
162
+ # exe-gateway's /v1/messages authenticates via an exe_sk_* billing API key
163
+ # (exe-gateway src/api-keys.ts), provisioned per-customer through
164
+ # dashboard.askexe.com — it cannot be generated here. Chat/RAG will fail
165
+ # ("No Anthropic API key was set") until this is set.
166
+ # SET_MANUALLY
167
+ WIKI_ANTHROPIC_API_KEY=CHANGEME_WIKI_ANTHROPIC_API_KEY
135
168
  WIKI_AUTH_TOKEN=CHANGEME_WIKI_AUTH_TOKEN
136
169
  WIKI_JWT_SECRET=CHANGEME_WIKI_JWT_SECRET
137
170
  WIKI_SIG_KEY=CHANGEME_WIKI_SIG_KEY
@@ -143,7 +176,7 @@ WIKI_HOST_PORT=3001
143
176
  EXE_SSO_COOKIE_NAME=exe_access_token
144
177
 
145
178
  # --- exe-os ---
146
- EXE_OS_IMAGE_TAG=update.askexe.com/askexe/exe-os:v0.9.311
179
+ EXE_OS_IMAGE_TAG=update.askexe.com/askexe/exe-os:v0.9.324@sha256:3ce6406e0f7f279ff2568bbbb7d55de51a46fdf35c49691f24fd959d6fd2d3fa
147
180
  EXED_MCP_TOKEN=CHANGEME_EXED_MCP_TOKEN
148
181
  EXED_DEVICE_ID=CHANGEME_DEVICE_ID
149
182
  EXE_MCP_HOST_BIND=127.0.0.1
@@ -153,7 +186,7 @@ EXE_MCP_HOST_PORT=48739
153
186
  EXE_CLOUD_SYNC_TO_POSTGRES=true
154
187
 
155
188
  # --- ERP (Frappe/ERPNext fork) ---
156
- ERP_IMAGE_TAG=update.askexe.com/askexe/exe-erp:v0.2.2
189
+ ERP_IMAGE_TAG=update.askexe.com/askexe/exe-erp:v2026.08.07-d185286-stamped@sha256:1c655f3f7819c797afd13c79561354f0276cf337403f32aee3e406a497e8827b
157
190
  # Administrator password for the ERPNext site (created on first boot).
158
191
  # bug 43854b31: this only applies at FIRST boot. To rotate it later you must also
159
192
  # run `bench --site $ERP_SITE_NAME set-admin-password <new>` inside exe-erp —
@@ -169,7 +202,7 @@ ERP_WS_PORT=9069
169
202
  ERP_SENTRY_DSN=
170
203
 
171
204
  # --- Gateway ---
172
- GATEWAY_IMAGE_TAG=update.askexe.com/askexe/exe-gateway:v0.9.24
205
+ GATEWAY_IMAGE_TAG=update.askexe.com/askexe/exe-gateway:v2026.08.07-c15f093-stamped@sha256:1bc11a2a0ad1f3929d59d2685696f22a72042b9fca9c75e15c02dc7d3c640105
173
206
  EXE_GATEWAY_AUTH_TOKEN=CHANGEME_EXE_GATEWAY_AUTH_TOKEN
174
207
  EXE_GATEWAY_WS_RELAY_AUTH_TOKEN=CHANGEME_EXE_GATEWAY_WS_RELAY_AUTH_TOKEN
175
208
  EXE_GATEWAY_WHATSAPP_VERIFY_TOKEN=CHANGEME_EXE_GATEWAY_WHATSAPP_VERIFY_TOKEN
@@ -190,7 +223,7 @@ CRM_GRAPHQL_URL=http://exe-crm:3000/graphql
190
223
  # bug 633995f1: v0.9.5 is a QUARANTINED build that crashloops on any existing
191
224
  # deployment; v0.9.4 is the last known-good generation and matches the signed
192
225
  # apps manifest. See deploy/known-bad-images.json.
193
- MONITOR_HUB_IMAGE_TAG=update.askexe.com/askexe/exe-monitor-hub:v0.9.4
226
+ MONITOR_HUB_IMAGE_TAG=update.askexe.com/askexe/exe-monitor-hub:v2026.08.09-10660eb4-stamped@sha256:c9a9218c2713b8dffea7e1cf8c0702a614657d311a7a4e821c6a543bab29bb97
194
227
  MONITOR_HUB_PORT=8090
195
228
  # Bootstrap superuser created on first start. Use your admin email + a strong password.
196
229
  # After first boot these values are no longer used (stored in pb_data volume).
@@ -224,7 +257,7 @@ GATEWAY_ALERT_URL=http://exe-gateway:3100/api/alerts/error-spike
224
257
  # Full scope details: deploy/monitor/HOST-ACCESS-CONSENT.md
225
258
  # COMPOSE_PROFILES=monitor-agent
226
259
  # bug 633995f1 / 9ce2a68b: the agent healthcheck is coupled to this generation.
227
- MONITOR_AGENT_IMAGE_TAG=update.askexe.com/askexe/exe-monitor-agent:v0.9.4
260
+ MONITOR_AGENT_IMAGE_TAG=update.askexe.com/askexe/exe-monitor-agent:v2026.08.09-10660eb4-stamped@sha256:29fbd445f79484df04f000603e4ff445e76f0380f86d687a0033e3a0ef7d1b7a
228
261
  # Reports to the local hub. Auto-populated by `exe-os stack-update` during bootstrap.
229
262
  MONITOR_HUB_URL=http://exe-monitor-hub:8090
230
263
  # bug dacf0042: TOKEN and KEY MUST start EMPTY (the safe "unpaired" state) — NOT a
@@ -76,11 +76,26 @@ SMTP_PORT=587
76
76
  SMTP_USER=
77
77
  SMTP_PASS=
78
78
 
79
+ # --- Dashboard (exe-dashboard — customer dashboard at dashboard.<domain>) ---
80
+ # OPT-IN: the exe-dashboard compose service sits behind `profiles: [dashboard]`
81
+ # and is off unless you run `docker compose --profile dashboard ...`.
82
+ # DELIBERATELY UNSET AND COMMENTED OUT. Unlike the older *_IMAGE_TAG lines
83
+ # above/below, this one carries no hardcoded literal: a pinned default here is
84
+ # a second source of truth that silently outranks the manifest the moment it
85
+ # goes stale. Take the value from the signed stack manifest
86
+ # (deploy/stack-manifests/v0.9.json -> services.dashboard.image), digest and all.
87
+ # Leave it unset and compose refuses the dashboard loudly ("has neither an image
88
+ # nor a build context specified") instead of booting something arbitrary.
89
+ #DASHBOARD_IMAGE_TAG=update.askexe.com/askexe/exe-dashboard:vX.Y.Z@sha256:...
90
+ # Host port for the dashboard container (bound to 127.0.0.1; the tunnel and the
91
+ # SSO edge reach it over the docker network, not this port).
92
+ #DASHBOARD_PORT=3301
93
+
79
94
  # --- Auth gateway (exe-auth — shared SSO sign-in UI at auth.<domain>) ---
80
95
  # Bug 58840873: pin the auth image so compose never falls back to its stale
81
96
  # hardcoded default tag. Keep in sync with the manifest AUTH_IMAGE_TAG. exe-auth
82
97
  # ships only from the private update.askexe.com registry (no GHCR mirror).
83
- AUTH_IMAGE_TAG=update.askexe.com/askexe/exe-auth:v0.5.0
98
+ AUTH_IMAGE_TAG=update.askexe.com/askexe/exe-auth:v0.6.1@sha256:89670a15bc59255299be695525863e66f949694eec1dd8886038dc3659a4a941
84
99
  # Bug 379e5c13: server_name / CORS derived from the CONFIGURED apex domain,
85
100
  # not by naive last-2-label slicing (which breaks company.co.uk → co.uk).
86
101
  AUTH_SERVER_NAME=auth.CHANGEME_DOMAIN
@@ -140,7 +155,7 @@ EXE_ORG_ID=
140
155
  EXE_ORG_WORKSPACE_ID=
141
156
 
142
157
  # --- CRM ---
143
- CRM_IMAGE_TAG=ghcr.io/askexe/exe-crm:v0.9.51
158
+ CRM_IMAGE_TAG=ghcr.io/askexe/exe-crm:v0.9.53@sha256:a586dcc8bbd992538e3caa18c44e772d30f31155dfef0a2b7466ca3fc7c553d8
144
159
  CRM_SERVER_URL=https://crm.CHANGEME_DOMAIN
145
160
  CRM_APP_SECRET=CHANGEME_CRM_APP_SECRET
146
161
  EXE_CRM_ADMIN_TOKEN=CHANGEME_EXE_CRM_ADMIN_TOKEN
@@ -153,7 +168,7 @@ EXE_CRM_ADMIN_EMAIL=CHANGEME_ADMIN_EMAIL
153
168
  CRM_HOST_PORT=3000
154
169
 
155
170
  # --- Wiki ---
156
- WIKI_IMAGE_TAG=ghcr.io/askexe/exe-wiki:v0.9.26
171
+ WIKI_IMAGE_TAG=ghcr.io/askexe/exe-wiki:v0.9.28@sha256:61856a4c6b97ce62c62ecdc3a377139287be5860eb807d9fbb737115758d7856
157
172
  # Bug 2a8d3003 — DO NOT change this without migrating the data first.
158
173
  # The wiki's users / workspaces / workspace_documents live in `public`. Point it at a
159
174
  # different schema and Prisma will NOT error: it finds no tables, assumes a fresh
@@ -164,7 +179,22 @@ WIKI_IMAGE_TAG=ghcr.io/askexe/exe-wiki:v0.9.26
164
179
  # only thing holding production together was a host-local compose override.
165
180
  # exe-wiki-schema-guard blocks the boot if you get this wrong.
166
181
  WIKI_DB_SCHEMA=public
167
- WIKI_VECTOR_DB=exeOsMcp
182
+ # Bugs bed3cb4a / c604df37 — see deploy/compose/docker-compose.yml's exe-wiki
183
+ # environment block for the full rationale. pgvector reuses this same
184
+ # exe-db instance; native runs in-process (no API key, no exe-os MCP daemon).
185
+ WIKI_VECTOR_DB=pgvector
186
+ # bug bed3cb4a / corrected 2026-08-31 (founder direction): wiki's RAG/chat
187
+ # uses GLM via Z.ai directly (exe-wiki PR #78's real, verified `zai`
188
+ # provider) — not Anthropic through exe-gateway. Supply ZAI_API_KEY to match.
189
+ WIKI_LLM_PROVIDER=zai
190
+ ZAI_MODEL_PREF=glm-4.6
191
+ ZAI_BASE_PATH=https://api.z.ai/api/coding/paas/v4
192
+ # exe-gateway's /v1/messages authenticates via an exe_sk_* billing API key
193
+ # (exe-gateway src/api-keys.ts), provisioned per-customer through
194
+ # dashboard.askexe.com — it cannot be generated here. Chat/RAG will fail
195
+ # ("No Anthropic API key was set") until this is set.
196
+ # SET_MANUALLY
197
+ WIKI_ANTHROPIC_API_KEY=CHANGEME_WIKI_ANTHROPIC_API_KEY
168
198
  WIKI_AUTH_TOKEN=CHANGEME_WIKI_AUTH_TOKEN
169
199
  EXE_WIKI_ADMIN_TOKEN=CHANGEME_EXE_WIKI_ADMIN_TOKEN
170
200
  WIKI_JWT_SECRET=CHANGEME_WIKI_JWT_SECRET
@@ -176,7 +206,12 @@ WIKI_HOST_PORT=3001
176
206
  EXE_SSO_COOKIE_NAME=exe_access_token
177
207
 
178
208
  # --- exe-os ---
179
- EXE_OS_IMAGE_TAG=ghcr.io/askexe/exe-os:v0.9.311
209
+ EXE_OS_IMAGE_TAG=ghcr.io/askexe/exe-os:v0.9.324@sha256:3ce6406e0f7f279ff2568bbbb7d55de51a46fdf35c49691f24fd959d6fd2d3fa
210
+
211
+ # Infra image pins — manifest-derived. Compose has no fallback default for
212
+ # these: a missing pin ABORTS the deploy instead of substituting an old image.
213
+ EXE_DB_IMAGE=update.askexe.com/askexe/pgvector:0.8.0-pg16@sha256:a132765ec351c65111b5b675928a3a0515a466a40f97277329db8b8209ad8bc9
214
+ OTEL_COLLECTOR_IMAGE=update.askexe.com/askexe/otel-collector-contrib:0.114.0@sha256:37fa87091cfaaec7234a27e4e395a40c31c2bfaea97a349a4afef6d9e9681197
180
215
  EXED_MCP_TOKEN=CHANGEME_EXED_MCP_TOKEN
181
216
  EXED_DEVICE_ID=vps-default
182
217
  EXE_MCP_HOST_BIND=127.0.0.1
@@ -186,7 +221,7 @@ EXE_MCP_HOST_PORT=48739
186
221
  EXE_CLOUD_SYNC_TO_POSTGRES=true
187
222
 
188
223
  # --- Gateway ---
189
- GATEWAY_IMAGE_TAG=ghcr.io/askexe/exe-gateway:v0.9.24
224
+ GATEWAY_IMAGE_TAG=ghcr.io/askexe/exe-gateway:v2026.08.07-c15f093-stamped@sha256:1bc11a2a0ad1f3929d59d2685696f22a72042b9fca9c75e15c02dc7d3c640105
190
225
  EXE_GATEWAY_AUTH_TOKEN=CHANGEME_EXE_GATEWAY_AUTH_TOKEN
191
226
  EXE_GATEWAY_WS_RELAY_AUTH_TOKEN=CHANGEME_EXE_GATEWAY_WS_RELAY_AUTH_TOKEN
192
227
  EXE_GATEWAY_WHATSAPP_VERIFY_TOKEN=CHANGEME_EXE_GATEWAY_WHATSAPP_VERIFY_TOKEN
@@ -226,7 +261,7 @@ ERROR_REPORTING_ENABLED=true
226
261
  MONITOR_ERROR_URL=http://exe-monitor-hub:8090/api/exe-monitor/errors
227
262
 
228
263
  # --- ERP (optional — Exe ERP, Frappe/ERPNext fork) ---
229
- ERP_IMAGE_TAG=ghcr.io/askexe/exe-erp:v0.2.2
264
+ ERP_IMAGE_TAG=ghcr.io/askexe/exe-erp:v2026.08.07-d185286-stamped@sha256:1c655f3f7819c797afd13c79561354f0276cf337403f32aee3e406a497e8827b
230
265
  ERP_ADMIN_PASSWORD=CHANGEME_ERP_ADMIN_PASSWORD
231
266
  EXE_ERP_ADMIN_TOKEN=CHANGEME_EXE_ERP_ADMIN_TOKEN
232
267
  # Frappe site name — must match the erp.<domain> the customer serves (bug e61ad373).
@@ -248,7 +283,7 @@ EXE_BUILD_HTTP_PORT=9222
248
283
  # data dir and entrypoint all changed) and crashloops on any existing
249
284
  # deployment. v0.9.4 is the last known-good generation and is what the signed
250
285
  # apps manifest pins. See deploy/known-bad-images.json.
251
- MONITOR_HUB_IMAGE_TAG=ghcr.io/askexe/exe-monitor-hub:v0.9.4
286
+ MONITOR_HUB_IMAGE_TAG=ghcr.io/askexe/exe-monitor-hub:v2026.08.09-10660eb4-stamped@sha256:c9a9218c2713b8dffea7e1cf8c0702a614657d311a7a4e821c6a543bab29bb97
252
287
  MONITOR_HUB_PORT=8090
253
288
  # Bootstrap superuser created on first start. Use your admin email + a strong password.
254
289
  # After first boot these values are no longer used (stored in pb_data volume).
@@ -268,7 +303,7 @@ MONITOR_HUB_ADMIN_PASSWORD=CHANGEME_MONITOR_HUB_ADMIN_PASSWORD
268
303
  # COMPOSE_PROFILES=monitor-agent
269
304
  # bug 633995f1 / 9ce2a68b: keep the agent on the v0.9.4 generation — the
270
305
  # compose healthcheck (`/app/beszel-agent health`) is coupled to it.
271
- MONITOR_AGENT_IMAGE_TAG=ghcr.io/askexe/exe-monitor-agent:v0.9.4
306
+ MONITOR_AGENT_IMAGE_TAG=ghcr.io/askexe/exe-monitor-agent:v2026.08.09-10660eb4-stamped@sha256:29fbd445f79484df04f000603e4ff445e76f0380f86d687a0033e3a0ef7d1b7a
272
307
  # Reports to the local hub. Auto-populated by `exe-os stack-update` during bootstrap.
273
308
  MONITOR_HUB_URL=http://exe-monitor-hub:8090
274
309
  # bug dacf0042: TOKEN and KEY MUST start EMPTY (the safe "unpaired" state) —
@@ -29,7 +29,7 @@ services:
29
29
  # bug ee16e7ef: pin a versioned tag, not the mutable :pg16 rolling tag.
30
30
  # pgvector/pgvector:pg16 can change upstream without notice; 0.8.0-pg16
31
31
  # is the tested stable release. Override via EXE_DB_IMAGE in .env.
32
- image: ${EXE_DB_IMAGE:-pgvector/pgvector:0.8.0-pg16@sha256:a132765ec351c65111b5b675928a3a0515a466a40f97277329db8b8209ad8bc9}
32
+ image: ${EXE_DB_IMAGE:?EXE_DB_IMAGE must be set from the signed stack manifest (digest-pinned) — refusing to fall back to a stale hard-coded image}
33
33
  container_name: exe-db
34
34
  restart: unless-stopped
35
35
  # SECURITY (bug 67d62490): no blanket `env_file: .env`. Each service
@@ -278,7 +278,7 @@ services:
278
278
  # is what the signed apps manifest (deploy/stack-manifests/v0.9.30-apps.json)
279
279
  # and exe-monitor's own stack.release.json pin. Do not reintroduce the bad
280
280
  # digest.
281
- image: ${MONITOR_HUB_IMAGE_TAG:-ghcr.io/askexe/exe-monitor-hub:v0.9.4@sha256:d593bec5a4b248388d0d85353fae1ba8f93cab628a03833aa79acd0632fd11cb}
281
+ image: ${MONITOR_HUB_IMAGE_TAG:?MONITOR_HUB_IMAGE_TAG must be set from the signed stack manifest (digest-pinned) — refusing to fall back to a stale hard-coded image}
282
282
  container_name: exe-monitor-hub
283
283
  restart: unless-stopped
284
284
  # bug d3d49101 / 1fdb8be9: PocketBase's data dir for this hub is a RELATIVE
@@ -360,7 +360,7 @@ services:
360
360
  # ------------------------------------------------------------------
361
361
 
362
362
  exe-crm:
363
- image: ${CRM_IMAGE_TAG:-ghcr.io/askexe/exe-crm:v0.9.51@sha256:73864ce14aaac06b73d67100bbf88e669fd13c7da39edd9644107037211559b7}
363
+ image: ${CRM_IMAGE_TAG:?CRM_IMAGE_TAG must be set from the signed stack manifest (digest-pinned) — refusing to fall back to a stale hard-coded image}
364
364
  container_name: exe-crm
365
365
  restart: unless-stopped
366
366
  # bug ad4471ad: NO compose `command` override. The image entrypoint
@@ -467,6 +467,13 @@ services:
467
467
  STORAGE_TYPE: local
468
468
  STORAGE_LOCAL_PATH: /app/.local-storage
469
469
  BRANDING_CONFIG_PATH: /app/branding.json
470
+ # Bug 2355a199 / exe-crm PR #125: exe-crm sits behind two hops of reverse
471
+ # proxy (cloudflared -> exe-sso-edge -> exe-crm), so the raw peer address
472
+ # Node sees is exe-sso-edge, not the real client. Without telling the app
473
+ # how many trusted hops to peel off X-Forwarded-For, rate limiting keys on
474
+ # the wrong address (the edge, shared by every request) instead of the
475
+ # actual client.
476
+ EXE_TRUSTED_PROXY_HOPS: "2"
470
477
  ports:
471
478
  - "127.0.0.1:${CRM_HOST_PORT:-3000}:3000"
472
479
  volumes:
@@ -486,7 +493,7 @@ services:
486
493
  options: { max-size: "10m", max-file: "3" }
487
494
 
488
495
  exe-crm-worker:
489
- image: ${CRM_IMAGE_TAG:-ghcr.io/askexe/exe-crm:v0.9.51@sha256:73864ce14aaac06b73d67100bbf88e669fd13c7da39edd9644107037211559b7}
496
+ image: ${CRM_IMAGE_TAG:?CRM_IMAGE_TAG must be set from the signed stack manifest (digest-pinned) — refusing to fall back to a stale hard-coded image}
490
497
  container_name: exe-crm-worker
491
498
  restart: unless-stopped
492
499
  command: ["yarn", "worker:prod"]
@@ -552,7 +559,7 @@ services:
552
559
  # erroring, so "wiki looks wiped" and "wiki is misconfigured" are indistinguishable
553
560
  # at a glance, and the wrong diagnosis (restore from backup) destroys real data.
554
561
  exe-wiki-schema-guard:
555
- image: ${EXE_DB_IMAGE:-pgvector/pgvector:0.8.0-pg16@sha256:a132765ec351c65111b5b675928a3a0515a466a40f97277329db8b8209ad8bc9}
562
+ image: ${EXE_DB_IMAGE:?EXE_DB_IMAGE must be set from the signed stack manifest (digest-pinned) — refusing to fall back to a stale hard-coded image}
556
563
  container_name: exe-wiki-schema-guard
557
564
  restart: "no"
558
565
  depends_on:
@@ -588,7 +595,7 @@ services:
588
595
  options: { max-size: "10m", max-file: "3" }
589
596
 
590
597
  exe-wiki:
591
- image: ${WIKI_IMAGE_TAG:-ghcr.io/askexe/exe-wiki:v0.9.26@sha256:c0d61d183b274a67977fdfb1b40d5e4736559a9d90507843183e5642da2a959d}
598
+ image: ${WIKI_IMAGE_TAG:?WIKI_IMAGE_TAG must be set from the signed stack manifest (digest-pinned) — refusing to fall back to a stale hard-coded image}
592
599
  container_name: exe-wiki
593
600
  restart: unless-stopped
594
601
  # Wiki uses Prisma — runs migrate on boot via built-in entrypoint.
@@ -684,25 +691,78 @@ services:
684
691
  JWT_SECRET: ${WIKI_JWT_SECRET:?WIKI_JWT_SECRET is required}
685
692
  SIG_KEY: ${WIKI_SIG_KEY:?WIKI_SIG_KEY is required}
686
693
  SIG_SALT: ${WIKI_SIG_SALT:?WIKI_SIG_SALT is required}
687
- # Embeddings (bug 49221421): in the current wiki build the ONLY functional
688
- # embedding path is the exeOsMcp vector provider, which spawns the exe-os
689
- # MCP daemon over stdio and owns vectorization. The pgvector/postgres path
690
- # relies on an inert embedder shim and silently produces NO vectors, so it
691
- # must NOT be the default. We default the wiki to exeOsMcp + native and
692
- # wire the stdio spawn command below so embeddings actually work. If an
693
- # operator overrides WIKI_VECTOR_DB to a non-mcp engine while leaving
694
- # EMBEDDING_ENGINE=native and no MCP command, the wiki now FAILS LOUD at
695
- # boot (see server/utils/boot/productionEnv.js) instead of silent no-op.
696
- VECTOR_DB: ${WIKI_VECTOR_DB:-exeOsMcp}
694
+ # Embeddings + vector DB (bugs bed3cb4a, c604df37). This used to default to
695
+ # exeOsMcp + native, on the assumption that exeOsMcp was the only functional
696
+ # embedding path. Two things changed that:
697
+ # 1. exe-wiki PR #78 ("revive the embedding pipeline, unbreak pgvector
698
+ # retrieval", merged 2026-08-31) restored the real EMBEDDING_ENGINE
699
+ # switch in getEmbeddingEngineSelection() (it had been reduced to an
700
+ # unconditional exeOsMcp shim) and fixed pgvector's table-schema
701
+ # resolution (server/utils/vectorDbProviders/pgvector). native + pgvector
702
+ # is now the wiki's own documented default (docker/.env.example) and a
703
+ # genuinely self-contained combo: native runs @xenova/transformers
704
+ # in-process — no API key, no exe-os MCP daemon, no separate database.
705
+ # 2. bug c604df37: the exeOsMcp path was never actually reachable in
706
+ # production. server/utils/vectorDbProviders/exeOsMcpClient spawns
707
+ # `npx @askexenow/exe-os@<pin> mcp`, but in exe-os `args[0] === "mcp"`
708
+ # (src/bin/cli.ts) routes to the Claude Code MCP config-manager CLI
709
+ # (src/bin/exe-mcp.ts), not the JSON-RPC stdio server
710
+ # (src/mcp/server.ts, exposed only as a package export with no bin
711
+ # entry). The handshake never completes and every embed call no-ops.
712
+ # Default to pgvector so a fresh deploy actually vectorizes documents.
713
+ # exeOsMcp remains selectable via WIKI_VECTOR_DB for an operator who fixes
714
+ # the client-side routing bug above first.
715
+ VECTOR_DB: ${WIKI_VECTOR_DB:-pgvector}
697
716
  EMBEDDING_ENGINE: ${WIKI_EMBEDDING_ENGINE:-native}
698
- # stdio spawn of the exe-os MCP server. The wiki client only supports
699
- # stdio transport today (HTTP to the exe-os service is not wired yet), so
700
- # the wiki runs its own pinned exe-os MCP subprocess for embedding.
701
- # bug 8d084f7c: PIN the exe-os npm version. An unversioned `npx
702
- # @askexenow/exe-os` resolves to whatever "latest" is at boot, so a customer
703
- # could silently run a different MCP build than the rest of the stack (and
704
- # offline boots fail). WIKI_EXE_OS_NPM_VERSION defaults to the stack's
705
- # pinned exe-os npm version and is threaded into the spawn args.
717
+ # pgvector reuses the SAME exe-db Postgres instance the wiki's own
718
+ # DATABASE_URL points at exe-db already runs pgvector/pgvector:pg16 (see
719
+ # the exe-db image comment above), so `CREATE EXTENSION IF NOT EXISTS
720
+ # vector` in server/utils/vectorDbProviders/pgvector/index.js succeeds with
721
+ # no separate database or extra service to provision.
722
+ #
723
+ # NOTE this is NOT the same shape as DATABASE_URL above: PGVECTOR_CONNECTION_STRING
724
+ # is handed straight to the `pg` client, not Prisma, so it does not understand
725
+ # a `?schema=` query param (Prisma-only syntax) — it is deliberately omitted.
726
+ # pgvector resolves its own table (default name `exe-wiki_vectors`, see
727
+ # PGVECTOR_TABLE_NAME) through the connection's default search_path, i.e. the
728
+ # same `public` schema the wiki's own Prisma tables live in (WIKI_DB_SCHEMA
729
+ # above). See server/utils/vectorDbProviders/pgvector/SETUP.md for the
730
+ # provider's own setup notes.
731
+ PGVECTOR_CONNECTION_STRING: ${WIKI_PGVECTOR_CONNECTION_STRING:-postgres://${POSTGRES_USER:-exe}:${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}@exe-db:5432/${POSTGRES_DB:-exedb}?sslmode=disable}
732
+ # LLM provider (bug bed3cb4a, corrected per founder direction 2026-08-31:
733
+ # wiki's RAG/chat must use GLM, not Anthropic-via-gateway).
734
+ #
735
+ # A fresh deploy shipped NO LLM_PROVIDER at all, so AnythingLLM's
736
+ # getLLMProvider() fell back to the OpenAI provider, which throws "No
737
+ # OpenAI API key was set" on every chat/RAG request. exe-wiki PR #78 added
738
+ # a real, working `zai` provider directly (no gateway hop needed — GLM/Z.ai
739
+ # exposes its own OpenAI-Messages-compatible endpoint that the wiki client
740
+ # speaks natively), verified end-to-end against a real uploaded PDF
741
+ # including a negative control (correctly declines to answer an
742
+ # out-of-corpus question rather than hallucinating). Use that.
743
+ #
744
+ # An earlier draft of this config pointed wiki at exe-gateway with
745
+ # LLM_PROVIDER=anthropic instead, reasoning that the gateway only speaks
746
+ # the Anthropic Messages protocol. That reasoning is correct AS FAR AS THE
747
+ # GATEWAY GOES, but it's the wrong fix: it routes around wiki's own
748
+ # already-built, already-verified GLM integration instead of using it, and
749
+ # it does not match what the founder explicitly asked for. If exe-wiki
750
+ # ever needs to go through exe-gateway instead of calling Z.ai directly
751
+ # (e.g. for centralized billing/rate-limiting), that's a deliberate future
752
+ # change, not the default.
753
+ LLM_PROVIDER: ${WIKI_LLM_PROVIDER:-zai}
754
+ # Z.ai key is an account credential, not a generatable secret — left empty
755
+ # so the operator fills it in; compose reads it as ${ZAI_API_KEY:-} rather
756
+ # than failing closed. WARN-first check for this lives in generate-env.ts.
757
+ ZAI_API_KEY: ${ZAI_API_KEY:-}
758
+ ZAI_MODEL_PREF: ${ZAI_MODEL_PREF:-glm-4.6}
759
+ # bug 62ba51e9: default to the Coding Plan path (the entitlement we hold).
760
+ # ZAI_BASE_PATH is only honoured by a wiki image carrying exe-wiki PR #78;
761
+ # older images hardcode the PAYG path and will 1113 regardless of this.
762
+ ZAI_BASE_PATH: ${ZAI_BASE_PATH:-https://api.z.ai/api/coding/paas/v4}
763
+ # stdio spawn of the exe-os MCP server. Only used if WIKI_VECTOR_DB is
764
+ # overridden back to exeOsMcp — see bug c604df37 above before doing that;
765
+ # the spawn args below currently point at the wrong CLI entrypoint.
706
766
  EXE_OS_MCP_COMMAND: ${WIKI_EXE_OS_MCP_COMMAND:-npx}
707
767
  EXE_OS_MCP_ARGS: ${WIKI_EXE_OS_MCP_ARGS:--y @askexenow/exe-os@${WIKI_EXE_OS_NPM_VERSION:-0.9.324} mcp}
708
768
  BRANDING_CONFIG_PATH: /app/branding.json
@@ -728,7 +788,15 @@ services:
728
788
  # to pin the split server image; falls back to the combined EXE_OS_IMAGE_TAG
729
789
  # for backward compatibility with existing manifests.
730
790
  exe-os:
731
- image: ${EXE_OS_SERVER_IMAGE_TAG:-${EXE_OS_IMAGE_TAG:-${EXED_IMAGE_TAG:-ghcr.io/askexe/exe-os:v0.9.311@sha256:011730042f55277724dbe83fde1a6416db2f3e8bf62d3254738d68d8de33e1f9}}}
791
+ # FAIL-CLOSED PIN. The signed stack manifest is the single source of truth for
792
+ # this image; stack-update writes EXE_OS_IMAGE_TAG from it. The legacy aliases are
793
+ # kept so an older .env keeps working, and the chain terminates EMPTY on purpose:
794
+ # docker compose evaluates nested defaults eagerly, so `:?` inside a chain would
795
+ # fire even when an alias IS set. With no pin at all compose aborts with
796
+ # "has neither an image nor a build context specified" — loud, not a silent
797
+ # substitution of a stale hard-coded version (which is how auth nearly shipped a
798
+ # four-minor-version downgrade).
799
+ image: ${EXE_OS_SERVER_IMAGE_TAG:-${EXE_OS_IMAGE_TAG:-${EXED_IMAGE_TAG:-}}}
732
800
  container_name: exe-os
733
801
  restart: unless-stopped
734
802
  # bug debf4a39 / 93ddfa27: the daemon connects to exe-db at boot
@@ -847,7 +915,7 @@ services:
847
915
  options: { max-size: "10m", max-file: "3" }
848
916
 
849
917
  exe-gateway:
850
- image: ${GATEWAY_IMAGE_TAG:-ghcr.io/askexe/exe-gateway:v0.9.24@sha256:9cda7c00d886b4ab16a3b88aa953aa45c991f2977084ea8532f55fcaf75e8f37}
918
+ image: ${GATEWAY_IMAGE_TAG:?GATEWAY_IMAGE_TAG must be set from the signed stack manifest (digest-pinned) — refusing to fall back to a stale hard-coded image}
851
919
  container_name: exe-gateway
852
920
  restart: unless-stopped
853
921
  # Gateway needs 45s to flush outbound queues + disconnect Baileys adapters.
@@ -1011,7 +1079,7 @@ services:
1011
1079
  # v0.9.5 default contradicted that healthcheck, so the agent was
1012
1080
  # permanently unhealthy from the first recreate. Matches the signed apps
1013
1081
  # manifest and exe-monitor's stack.release.json.
1014
- image: ${MONITOR_AGENT_IMAGE_TAG:-ghcr.io/askexe/exe-monitor-agent:v0.9.4@sha256:9ca4e75577b2ff2abb754140ccfaf8df19161bcef601faf37d1fce743fe814fc}
1082
+ image: ${MONITOR_AGENT_IMAGE_TAG:?MONITOR_AGENT_IMAGE_TAG must be set from the signed stack manifest (digest-pinned) — refusing to fall back to a stale hard-coded image}
1015
1083
  container_name: exe-monitor-agent
1016
1084
  # Host-access consent gate: only starts when the operator has
1017
1085
  # acknowledged the host-access scope (COMPOSE_PROFILES=monitor-agent).
@@ -1116,7 +1184,15 @@ services:
1116
1184
  # Without a token the binary exits 0 (no crash-loop). (bug 3416cead)
1117
1185
  # ------------------------------------------------------------------
1118
1186
  exe-update:
1119
- image: ${EXE_OS_IMAGE_TAG:-${EXED_IMAGE_TAG:-ghcr.io/askexe/exe-os:v0.9.311@sha256:011730042f55277724dbe83fde1a6416db2f3e8bf62d3254738d68d8de33e1f9}}
1187
+ # FAIL-CLOSED PIN. The signed stack manifest is the single source of truth for
1188
+ # this image; stack-update writes EXE_OS_IMAGE_TAG from it. The legacy aliases are
1189
+ # kept so an older .env keeps working, and the chain terminates EMPTY on purpose:
1190
+ # docker compose evaluates nested defaults eagerly, so `:?` inside a chain would
1191
+ # fire even when an alias IS set. With no pin at all compose aborts with
1192
+ # "has neither an image nor a build context specified" — loud, not a silent
1193
+ # substitution of a stale hard-coded version (which is how auth nearly shipped a
1194
+ # four-minor-version downgrade).
1195
+ image: ${EXE_OS_IMAGE_TAG:-${EXED_IMAGE_TAG:-}}
1120
1196
  container_name: exe-update
1121
1197
  profiles: ["registry-proxy", "askexe-control-plane"]
1122
1198
  restart: unless-stopped
@@ -1205,6 +1281,8 @@ services:
1205
1281
  - ./sso-edge/default.conf.template:/etc/nginx/exe-templates/default.conf.template:ro
1206
1282
  - ./sso-edge/sso-redirect.conf:/etc/nginx/snippets/sso-redirect.conf:ro
1207
1283
  - ./sso-edge/entrypoint.sh:/docker-entrypoint.d/99-render-sso-edge.sh:ro
1284
+ # Branded shared error pages (packages/exe-error-pages, vendored by its sync.mjs; bug 64324162).
1285
+ - ./sso-edge/error-pages:/usr/share/nginx/html/error-pages:ro
1208
1286
  # nginx:alpine runs /docker-entrypoint.d/*.sh then `nginx -g 'daemon off;'`.
1209
1287
  # Our script renders the template from ${DOMAIN}; it does not exec nginx
1210
1288
  # itself (the base entrypoint does), so it ends after `nginx -t`.
@@ -1675,7 +1753,7 @@ services:
1675
1753
  exe-otel-collector:
1676
1754
  # bug 32d6e02f: digest-pinned default (was tag-only) — matches the
1677
1755
  # stack manifest pin for otel/opentelemetry-collector-contrib:0.114.0.
1678
- image: ${OTEL_COLLECTOR_IMAGE:-otel/opentelemetry-collector-contrib:0.114.0@sha256:37fa87091cfaaec7234a27e4e395a40c31c2bfaea97a349a4afef6d9e9681197}
1756
+ image: ${OTEL_COLLECTOR_IMAGE:?OTEL_COLLECTOR_IMAGE must be set from the signed stack manifest (digest-pinned) — refusing to fall back to a stale hard-coded image}
1679
1757
  container_name: exe-otel-collector
1680
1758
  restart: unless-stopped
1681
1759
  command: ["--config=/etc/otelcol-contrib/config.yaml"]
@@ -1743,7 +1821,7 @@ services:
1743
1821
  # a fresh/migrated install boots an old image while the manifest reads "latest".
1744
1822
  # generate-env.ts now always writes AUTH_IMAGE_TAG, and this default mirrors the
1745
1823
  # pin as defense-in-depth — keep BOTH in lockstep on every auth release.
1746
- image: ${AUTH_IMAGE_TAG:-update.askexe.com/askexe/exe-auth:v0.5.0@sha256:ecc57f92b1f2c2d9df4fafe648622fe1fdd87c27012048d950e3f6b82086ccf9}
1824
+ image: ${AUTH_IMAGE_TAG:?AUTH_IMAGE_TAG must be set from the signed stack manifest (digest-pinned) — refusing to fall back to a stale hard-coded image}
1747
1825
  container_name: exe-auth
1748
1826
  restart: unless-stopped
1749
1827
  environment:
@@ -1813,6 +1891,79 @@ services:
1813
1891
  driver: json-file
1814
1892
  options: { max-size: "10m", max-file: "3" }
1815
1893
 
1894
+ # ------------------------------------------------------------------
1895
+ # Dashboard — customer dashboard at dashboard.yourdomain.com
1896
+ # Static nginx image built from dashboard-page/ in the exe-os repo.
1897
+ # ------------------------------------------------------------------
1898
+ #
1899
+ # WHY THIS IS HERE AT ALL (2026-08-20). exe-dashboard has been running in
1900
+ # production for months WITHOUT a service in this file. Its only compose
1901
+ # definition was dashboard-page/docker-compose.yml — a standalone side-car
1902
+ # that carried `build: .` and a hardcoded `image: …:v0.1.0`, joined the
1903
+ # external `exe-net` network, and answered the `upstream sso_dashboard`
1904
+ # in sso-edge/default.conf.template. Nothing in the stack manifest could pin
1905
+ # a service the stack compose did not define, which is exactly why the
1906
+ # dashboard drifted three builds behind main with nobody able to see it.
1907
+ # This entry makes it a first-class, manifest-governed stack service.
1908
+ #
1909
+ # OPT-IN VIA PROFILE. `profiles: ["dashboard"]` keeps this off for every
1910
+ # existing deployment that has not opted in. That is deliberate and it is why
1911
+ # the image pin uses the empty-default form and NOT the required-variable
1912
+ # (colon-question-mark) form: compose interpolates the WHOLE file before it
1913
+ # filters by profile (verified on Docker 28.5.1 — a required-variable
1914
+ # reference inside an INACTIVE profile still aborts `docker compose config`),
1915
+ # so that form here would break every customer who never asked for the
1916
+ # dashboard. The empty terminator gets the same fail-loud
1917
+ # behaviour exactly where it belongs: with the profile ACTIVE and the variable
1918
+ # unset, compose refuses with `service "exe-dashboard" has neither an image nor
1919
+ # a build context specified` instead of silently substituting a stale literal.
1920
+ exe-dashboard:
1921
+ image: ${DASHBOARD_IMAGE_TAG:-}
1922
+ profiles: ["dashboard"]
1923
+ container_name: exe-dashboard
1924
+ restart: unless-stopped
1925
+ environment:
1926
+ # Customer apex domain — templates server_name, CSP and the SPA's API/auth
1927
+ # URLs at container start via dashboard-page/docker-entrypoint.sh. Never
1928
+ # falls back to askexe.com.
1929
+ DOMAIN: ${DOMAIN:?DOMAIN is required — set to your customer apex domain (e.g. hygo.co)}
1930
+ # Optional explicit overrides; each defaults to the matching *.${DOMAIN}.
1931
+ DASH_DOMAIN: ${DASH_DOMAIN:-}
1932
+ DASH_API_URL: ${DASH_API_URL:-}
1933
+ DASH_AUTH_URL: ${DASH_AUTH_URL:-}
1934
+ DASH_DASHBOARD_URL: ${DASH_DASHBOARD_URL:-}
1935
+ ports:
1936
+ - "127.0.0.1:${DASHBOARD_PORT:-3301}:80"
1937
+ networks:
1938
+ # `backend` so exe-sso-edge can resolve `exe-dashboard` for its
1939
+ # `upstream sso_dashboard { server exe-dashboard:80; }`; `frontend` so the
1940
+ # cloudflared tunnel can reach it. Same pair as exe-auth/exe-crm/exe-wiki.
1941
+ #
1942
+ # NOTE: exe-sso-edge deliberately does NOT list this service in its
1943
+ # depends_on. The edge must keep starting on deployments that never enable
1944
+ # the dashboard profile, and a depends_on would make the edge unstartable
1945
+ # for them.
1946
+ - backend
1947
+ - frontend
1948
+ healthcheck:
1949
+ # dashboard-page/nginx.conf serves `location = /health` as a literal 200.
1950
+ # This is the same URL the stack manifest's healthUrl names, so the deploy
1951
+ # gate and the container agree on what "up" means. Before this existed,
1952
+ # /health fell through to the SPA `location /` and returned the index page
1953
+ # with a 200 — a probe that could not fail while nginx was running at all.
1954
+ test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1/health"]
1955
+ interval: 30s
1956
+ timeout: 5s
1957
+ start_period: 5s
1958
+ retries: 3
1959
+ deploy:
1960
+ resources:
1961
+ limits:
1962
+ memory: 128M
1963
+ logging:
1964
+ driver: json-file
1965
+ options: { max-size: "10m", max-file: "3" }
1966
+
1816
1967
  # ------------------------------------------------------------------
1817
1968
  # Volumes
1818
1969
  # ------------------------------------------------------------------
@@ -7,6 +7,10 @@
7
7
  # chmod +x /opt/exe-stack/gateway-watchdog.sh
8
8
  # crontab -l | { cat; echo "*/2 * * * * /opt/exe-stack/gateway-watchdog.sh 2>&1 | logger -t exe-gw-watchdog"; } | crontab -
9
9
  #
10
+ # Or via Ansible (preferred — this header alone was never enough; see bug
11
+ # b5b01c2d, part 2: the install line above documented here was never actually
12
+ # run on exe-db-jkt): import_tasks: deploy/ansible/tasks/gateway-watchdog-cron.yml
13
+ #
10
14
  # ─────────────────────────────────────────────────────────────────────────────
11
15
  # BUG HISTORY (facd5078, P0)
12
16
  # ─────────────────────────────────────────────────────────────────────────────
@@ -54,12 +58,25 @@ COOLDOWN_SECS="${EXE_GATEWAY_WATCHDOG_COOLDOWN_SECS:-300}"
54
58
  STATE_DIR="${EXE_GATEWAY_WATCHDOG_STATE_DIR:-${STACK_DIR}/.gateway-watchdog}"
55
59
  STRIKE_FILE="${STATE_DIR}/strikes"
56
60
  LAST_RESTART_FILE="${STATE_DIR}/last-restart"
61
+ LAST_RUN_FILE="${STATE_DIR}/last-run"
57
62
 
58
63
  mkdir -p "$STATE_DIR" 2>/dev/null || true
59
64
 
60
65
  ts() { date -u +"%Y-%m-%dT%H:%M:%SZ"; }
61
66
  log() { echo "[$(ts)] gateway-watchdog: $*"; }
62
67
 
68
+ # Heartbeat: proves the cron entry is actually firing, independent of what the
69
+ # probe finds. strikes/last-restart only update on specific outcomes, so a
70
+ # process that stopped being scheduled would leave them looking unremarkable
71
+ # forever. This file updates on EVERY invocation — same "a monitor going quiet
72
+ # must be detectable" pattern as backup.sh's LAST_STATUS file. A stale
73
+ # last-run (older than a few cron intervals) means the cron stopped firing,
74
+ # not that the gateway is healthy.
75
+ write_heartbeat() {
76
+ printf 'last_run=%s\nepoch=%s\n' "$(ts)" "$(date -u +%s)" > "$LAST_RUN_FILE" 2>/dev/null || true
77
+ }
78
+ trap write_heartbeat EXIT
79
+
63
80
  # Read a single KEY=VALUE from the stack .env WITHOUT sourcing it (the .env holds
64
81
  # many secrets and arbitrary values; sourcing could execute / mangle them).
65
82
  read_env() {