@askexenow/exe-os 0.9.374 → 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 (455) hide show
  1. package/deploy/compose/.env.customer.example +16 -1
  2. package/deploy/compose/.env.example +16 -1
  3. package/deploy/compose/docker-compose.yml +80 -18
  4. package/deploy/compose/gateway-watchdog.sh +17 -0
  5. package/deploy/compose/generate-env.ts +41 -1
  6. package/deploy/compose/sso-edge/default.conf.template +59 -63
  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 +115 -92
  11. package/dist/.dist-verified.json +3 -3
  12. package/dist/{active-agent-ONPPEWQV.js → active-agent-BOBBUJ74.js} +6 -6
  13. package/dist/{active-agent-UJKMG7LJ.js → active-agent-GFGEGK2U.js} +6 -6
  14. package/dist/{agent-defs-generator-ZWI6DXOE.js → agent-defs-generator-OX6UFPRX.js} +5 -5
  15. package/dist/{agent-loop-OYHJKNYH.js → agent-loop-7ZRH56EX.js} +1 -1
  16. package/dist/{agentic-ontology-WHFJ3QFS.js → agentic-ontology-DT3VOXBT.js} +1 -1
  17. package/dist/{backfill-metadata-3OUSQD5V.js → backfill-metadata-VRP6PTPP.js} +9 -9
  18. package/dist/{backup-verify-ZKTUYLTA.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-ZJ45TFBJ.js → behaviors-GPI4BLTC.js} +16 -14
  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 +14 -12
  26. package/dist/bin/backfill-responses.js +14 -12
  27. package/dist/bin/backfill-vectors.js +16 -14
  28. package/dist/bin/bulk-sync-postgres.js +21 -19
  29. package/dist/bin/cc-doctor.js +19 -11
  30. package/dist/bin/cleanup-stale-review-tasks.js +27 -26
  31. package/dist/bin/cli.js +83 -109
  32. package/dist/bin/daemon-restart-handoff.js +2 -1
  33. package/dist/bin/deferred-daemon-restart.js +118 -110
  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 +23 -23
  37. package/dist/bin/exe-assign.js +16 -14
  38. package/dist/bin/exe-boot.js +91 -71
  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 +70 -37
  42. package/dist/bin/exe-config-dump.js +5 -5
  43. package/dist/bin/exe-dispatch.js +28 -27
  44. package/dist/bin/exe-doctor.js +12 -11
  45. package/dist/bin/exe-export-behaviors.js +20 -18
  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 +22 -10
  49. package/dist/bin/exe-heartbeat.js +33 -32
  50. package/dist/bin/exe-kill.js +32 -31
  51. package/dist/bin/exe-launch-agent.js +76 -54
  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 +28 -27
  58. package/dist/bin/exe-pending-notifications.js +27 -26
  59. package/dist/bin/exe-pending-reviews.js +28 -27
  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 +31 -30
  63. package/dist/bin/exe-search.js +10 -10
  64. package/dist/bin/exe-session-cleanup.js +32 -31
  65. package/dist/bin/exe-settings.js +21 -19
  66. package/dist/bin/exe-start-codex.js +31 -25
  67. package/dist/bin/exe-start-opencode.js +24 -22
  68. package/dist/bin/exe-start.sh +11 -2
  69. package/dist/bin/exe-status.js +29 -28
  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 +170 -16
  74. package/dist/bin/generate-hook-manifest.js +8 -41
  75. package/dist/bin/git-sweep.js +28 -27
  76. package/dist/bin/graph-backfill.js +11 -11
  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 +14 -14
  80. package/dist/bin/install.js +130 -116
  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 +52 -38
  90. package/dist/bin/setup.js +1 -1
  91. package/dist/bin/shard-migrate.js +9 -9
  92. package/dist/bin/stack-update.js +10 -5
  93. package/dist/bin/verify-stack.js +3 -1
  94. package/dist/bin/vps-health-gate.js +1 -1
  95. package/dist/{boot-generation-JKVZ4ZAT.js → boot-generation-BN6GKASY.js} +6 -6
  96. package/dist/{boot-review-sections-2M6BTG73.js → boot-review-sections-OQ5JGSOD.js} +26 -25
  97. package/dist/{branch-hygiene-U5GFRSTP.js → branch-hygiene-QLD77IMJ.js} +1 -1
  98. package/dist/build-manifest.json +1186 -1106
  99. package/dist/{capability-cards-5IMJT6J7.js → capability-cards-EDZ62HKG.js} +5 -5
  100. package/dist/{capacity-monitor-SAXCQK7O.js → capacity-monitor-6GMTVILS.js} +28 -27
  101. package/dist/{catchup-brief-U2TXBLHD.js → catchup-brief-SGGBMDUP.js} +32 -31
  102. package/dist/{cc-binary-detect-6TNIY5JX.js → cc-binary-detect-ZR6WNOUU.js} +1 -3
  103. package/dist/{chunk-NKETJCB5.js → chunk-2ODXCCMR.js} +18 -3
  104. package/dist/{hook-integrity-KGAV6ZC2.js → chunk-3L72UBUH.js} +28 -15
  105. package/dist/chunk-3OX5S7KZ.js +273 -0
  106. package/dist/{chunk-W75GTHR3.js → chunk-3SRZNJKD.js} +1 -1
  107. package/dist/{chunk-I4DNJFDR.js → chunk-42IFYZUN.js} +4 -4
  108. package/dist/{chunk-JHI5WMK5.js → chunk-473JUDCT.js} +5 -5
  109. package/dist/{chunk-ANLFH23R.js → chunk-4F5CNI65.js} +1 -1
  110. package/dist/{chunk-AWWKRZMB.js → chunk-4KVSCQND.js} +87 -14
  111. package/dist/{chunk-ZCERWHY2.js → chunk-4M6RXJEY.js} +33 -23
  112. package/dist/{chunk-YTSXPJUQ.js → chunk-4YJEEOYT.js} +3 -3
  113. package/dist/{chunk-6RKKVPYF.js → chunk-4YUGB637.js} +1 -1
  114. package/dist/{chunk-XXOPG4BW.js → chunk-4ZSOKEDY.js} +3 -3
  115. package/dist/{chunk-55BEFF4V.js → chunk-5DF4Y6EC.js} +1 -1
  116. package/dist/{chunk-4QCFFW2H.js → chunk-5QCIWWFA.js} +46 -0
  117. package/dist/{chunk-3UUX5OY4.js → chunk-5QKLWJ4Z.js} +1 -1
  118. package/dist/{chunk-YSLGFPWX.js → chunk-5UBWBXLF.js} +3 -3
  119. package/dist/chunk-5WA4DG2A.js +117 -0
  120. package/dist/{chunk-4EN3IZ3Q.js → chunk-64ODONK2.js} +67 -1
  121. package/dist/{chunk-TAMDAOCU.js → chunk-66CGXQUA.js} +239 -39
  122. package/dist/{chunk-QHJR7IMX.js → chunk-6F3FQCAQ.js} +3 -3
  123. package/dist/{chunk-WMEYJT4R.js → chunk-6FG34V6D.js} +15 -14
  124. package/dist/{chunk-NMH5ZQPU.js → chunk-6KQ6WMTI.js} +1 -1
  125. package/dist/{chunk-IRVOXUSK.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-KTCXJWJG.js → chunk-7UNMSF5O.js} +1 -1
  130. package/dist/{chunk-JTVIANUB.js → chunk-AEUGIJDO.js} +3 -1
  131. package/dist/{chunk-DSJI76XL.js → chunk-AHNVFBVB.js} +113 -16
  132. package/dist/{chunk-IBS2FAI4.js → chunk-AUKRBHHZ.js} +4 -1
  133. package/dist/{chunk-AKLJ4JH3.js → chunk-BBK2TSK3.js} +1 -1
  134. package/dist/{chunk-ZL4AGWAH.js → chunk-BNWWVYRN.js} +6 -5
  135. package/dist/{chunk-PY3FOMRN.js → chunk-BQEZPRUC.js} +4 -4
  136. package/dist/{chunk-DIXXEE3S.js → chunk-BQXYXJYC.js} +721 -309
  137. package/dist/{chunk-ORM7ZFKC.js → chunk-BZ546I4Q.js} +32 -0
  138. package/dist/{chunk-3KDCORDO.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-MXPNVSXI.js → chunk-CIEVY5TD.js} +11 -11
  142. package/dist/{chunk-UBK7HK3J.js → chunk-CKLJT2DH.js} +2 -2
  143. package/dist/{chunk-MOGA4Q7F.js → chunk-CKOJP7JI.js} +1 -1
  144. package/dist/{chunk-V3W3SATA.js → chunk-CL4J4757.js} +1 -1
  145. package/dist/{chunk-XNNECNDL.js → chunk-CQFWTWC6.js} +13 -13
  146. package/dist/{chunk-PDVXWXTL.js → chunk-CROVXJ4S.js} +3 -3
  147. package/dist/{chunk-WJG344NC.js → chunk-CWSLTSL6.js} +8 -8
  148. package/dist/{chunk-VMTZ4RUW.js → chunk-DDMGQ5Q3.js} +60 -26
  149. package/dist/{chunk-YKC7QDZH.js → chunk-DN24VTS5.js} +31 -6
  150. package/dist/{chunk-IN6CAM4F.js → chunk-EHAN752X.js} +7 -7
  151. package/dist/{chunk-EXTZSNWL.js → chunk-EPHSISMT.js} +2 -2
  152. package/dist/{chunk-6EZQUNE6.js → chunk-FCMQVEVL.js} +36 -3
  153. package/dist/{chunk-3L2QU5ZF.js → chunk-FS7XF7SE.js} +1 -1
  154. package/dist/{chunk-LGS2V2XD.js → chunk-FUKVP54K.js} +66 -19
  155. package/dist/{chunk-44TLJZJ5.js → chunk-FX2QRSRT.js} +1 -1
  156. package/dist/{chunk-PWRC5XZO.js → chunk-FXZ6VGFW.js} +16 -8
  157. package/dist/{chunk-NT7W4RXD.js → chunk-GKDAQL45.js} +1 -1
  158. package/dist/{chunk-EKE37MO4.js → chunk-GOT5ZHPX.js} +3 -3
  159. package/dist/{chunk-SLLLOOEI.js → chunk-GPJIBLP4.js} +1 -0
  160. package/dist/{chunk-EKYYMIVT.js → chunk-GPUOUUHA.js} +10 -1
  161. package/dist/{chunk-PB5S7YOF.js → chunk-GXNBPTPJ.js} +1 -1
  162. package/dist/{chunk-4SJ4LK4V.js → chunk-HE34XVD5.js} +5 -5
  163. package/dist/{chunk-6VHOQ3IM.js → chunk-HHAKXIKX.js} +12 -9
  164. package/dist/{chunk-TFKCERAK.js → chunk-HHT527PV.js} +38 -41
  165. package/dist/{chunk-ZSODLMFV.js → chunk-HIVOLPLD.js} +1 -40
  166. package/dist/{chunk-UCFC2AEI.js → chunk-I3LDTSWU.js} +1 -1
  167. package/dist/{chunk-Q3AXXKDF.js → chunk-IKXH4BFC.js} +5 -5
  168. package/dist/chunk-IMYGYIAI.js +23 -0
  169. package/dist/{chunk-GS7LIT34.js → chunk-IPHLUZ37.js} +1 -1
  170. package/dist/{chunk-M4IRPXSZ.js → chunk-IZA7XW2Q.js} +3 -3
  171. package/dist/{chunk-SEQIPGLU.js → chunk-IZLML47J.js} +1 -1
  172. package/dist/{chunk-4HKTO2SV.js → chunk-JRMHGO5B.js} +1 -1
  173. package/dist/{chunk-U73AC5AN.js → chunk-JSTTPYL3.js} +16 -16
  174. package/dist/{chunk-6SCGLHJ7.js → chunk-JVWLHBAV.js} +4 -4
  175. package/dist/{chunk-OVEQE6YS.js → chunk-K7UNIEB4.js} +254 -48
  176. package/dist/{chunk-HNWS7YHN.js → chunk-KBR5LIWD.js} +1 -1
  177. package/dist/{chunk-AKLQSC6W.js → chunk-KI7O64XV.js} +328 -98
  178. package/dist/{chunk-XXFKSJYA.js → chunk-KK3MIY5C.js} +5 -5
  179. package/dist/{chunk-U6SUKSZR.js → chunk-KO3OHI6V.js} +3 -3
  180. package/dist/{chunk-NJFJWQNN.js → chunk-L5CGXEZC.js} +27 -22
  181. package/dist/{chunk-NBXDXKLC.js → chunk-LK3XQDBP.js} +1 -1
  182. package/dist/{chunk-T3QUKNLI.js → chunk-LM443ORV.js} +1 -1
  183. package/dist/{chunk-BBSIEYF5.js → chunk-LNAFLXL7.js} +12 -4
  184. package/dist/{chunk-32YV32VA.js → chunk-LTUA5EYI.js} +122 -11
  185. package/dist/{chunk-23MVDXLY.js → chunk-MAXD5JQL.js} +11 -10
  186. package/dist/{chunk-GNUAL43X.js → chunk-MFASHRJ6.js} +5 -5
  187. package/dist/chunk-MFYMDGE7.js +37 -0
  188. package/dist/{chunk-VKJGHAZT.js → chunk-MGVILAYU.js} +57 -13
  189. package/dist/{chunk-DB55JZHU.js → chunk-MSLWRWTI.js} +1 -1
  190. package/dist/{chunk-C2L622QJ.js → chunk-NB5IRTC4.js} +52 -44
  191. package/dist/{chunk-2ZOEC4KC.js → chunk-ND75TGPR.js} +2 -2
  192. package/dist/{chunk-VRTCVZND.js → chunk-NE34MWVL.js} +142 -16
  193. package/dist/{chunk-S2WBS6BG.js → chunk-NMOFLWDY.js} +1 -1
  194. package/dist/{chunk-CRCB5S7I.js → chunk-NPXKGBVZ.js} +140 -23
  195. package/dist/{chunk-JSMDRKPJ.js → chunk-NRBGUIPE.js} +1 -1
  196. package/dist/{chunk-4LWBC7CM.js → chunk-NY6SBR4O.js} +1 -1
  197. package/dist/{chunk-UCUOGVDX.js → chunk-O3K2C22L.js} +13 -1
  198. package/dist/{chunk-R522MWAR.js → chunk-OATET4BV.js} +2 -2
  199. package/dist/chunk-OOZU5H3T.js +86 -0
  200. package/dist/{chunk-XFTEX77S.js → chunk-OQ4FNDRG.js} +28 -6
  201. package/dist/{chunk-VYQ7B7DI.js → chunk-OWVX52XF.js} +4 -4
  202. package/dist/{chunk-AETLDRZB.js → chunk-PEAAX6UA.js} +1 -1
  203. package/dist/{chunk-UM3N6VND.js → chunk-PFAVHC5N.js} +5 -5
  204. package/dist/chunk-PMVVUIHH.js +85 -0
  205. package/dist/chunk-PPMGQFLJ.js +2317 -0
  206. package/dist/{chunk-7TSBV3SD.js → chunk-PTY2N23C.js} +310 -2
  207. package/dist/{chunk-UKLN57Q5.js → chunk-PZ5SKYK6.js} +4 -4
  208. package/dist/{chunk-636LKCKE.js → chunk-Q6ZLQMP2.js} +1 -1
  209. package/dist/{chunk-N7VEP5B3.js → chunk-QFR5EKZG.js} +29 -7
  210. package/dist/{chunk-YMP2QSOP.js → chunk-QN56VQ6Z.js} +1 -1
  211. package/dist/{chunk-6YVUR3OU.js → chunk-QR3BUMOS.js} +2 -2
  212. package/dist/{chunk-XZ65ST2I.js → chunk-QV5CQLQH.js} +2 -2
  213. package/dist/{chunk-DJOIMFKV.js → chunk-REZIGNA6.js} +2 -2
  214. package/dist/{chunk-UQGSBM3U.js → chunk-RFPMXR6B.js} +11 -0
  215. package/dist/{chunk-DN4YVV4Z.js → chunk-RSABKW6B.js} +1 -1
  216. package/dist/{chunk-LP4GB656.js → chunk-RZNP35SI.js} +2 -2
  217. package/dist/{chunk-NUTZJZKW.js → chunk-SKTAZGFI.js} +10 -42
  218. package/dist/{chunk-TQAZTRQ3.js → chunk-SVXUT2DN.js} +4 -4
  219. package/dist/{chunk-DJ7YXOTU.js → chunk-T7EF5CQO.js} +3 -3
  220. package/dist/{chunk-QAEWWYHL.js → chunk-TDF2XKLK.js} +5 -1
  221. package/dist/{chunk-ZGYNKA3O.js → chunk-TT5BBVLX.js} +29 -31
  222. package/dist/{chunk-5H47VHB7.js → chunk-UWX6MMCX.js} +1 -1
  223. package/dist/{chunk-XL5MFGMR.js → chunk-V4YNN7PA.js} +10 -3
  224. package/dist/{chunk-SL6KQYDU.js → chunk-V5DDXXMP.js} +7 -7
  225. package/dist/{chunk-DZKPOSFD.js → chunk-VH6SPPNA.js} +1 -1
  226. package/dist/{chunk-LDNYSMPZ.js → chunk-VJUUI2VT.js} +1 -1
  227. package/dist/{chunk-CBCGDEJA.js → chunk-VN5WOOAQ.js} +42 -6
  228. package/dist/{chunk-EXDW3E2R.js → chunk-VPHJ2LUI.js} +165 -15
  229. package/dist/{chunk-GOMQ7PVQ.js → chunk-WJC6AAJN.js} +1 -1
  230. package/dist/{chunk-GJI77VDO.js → chunk-WVBVUVZB.js} +6 -5
  231. package/dist/{chunk-A6PDF4BO.js → chunk-XTQ7R2PA.js} +2 -2
  232. package/dist/{chunk-L6RXG36J.js → chunk-Y2HD2YB7.js} +1 -1
  233. package/dist/{chunk-KTU3EAWK.js → chunk-YAACLBZ7.js} +5 -5
  234. package/dist/{chunk-7GE2EQ23.js → chunk-YGVAKKGJ.js} +11 -6
  235. package/dist/chunk-YLHACCCB.js +166 -0
  236. package/dist/{chunk-PLZSZOZN.js → chunk-YP6UGVEY.js} +3 -3
  237. package/dist/{chunk-ULIBLJ6W.js → chunk-YYC553FO.js} +5 -5
  238. package/dist/{chunk-T35RCQFE.js → chunk-YZPEQW7H.js} +9 -8
  239. package/dist/{chunk-KI5PFRG6.js → chunk-ZKGWHT56.js} +60 -2
  240. package/dist/{chunk-NUK7EEN5.js → chunk-ZKJ5S23O.js} +33 -13
  241. package/dist/chunk-ZLPS3GR7.js +146 -0
  242. package/dist/{chunk-XH7YL7JM.js → chunk-ZMX22HSS.js} +50 -6
  243. package/dist/{chunk-JY5GAZYC.js → chunk-ZQEJ4IX2.js} +4 -0
  244. package/dist/{chunk-R4CBHKZ2.js → chunk-ZS5JO6QV.js} +7 -6
  245. package/dist/{cleanup-graph-garbage-DPJGO52H.js → cleanup-graph-garbage-LAPIZGFX.js} +12 -12
  246. package/dist/{cloud-sync-command-JPNTT4OQ.js → cloud-sync-command-QAZ2NWRA.js} +11 -2
  247. package/dist/{cloud-sync-db-init-V2LWIUQU.js → cloud-sync-db-init-HAGVF32Y.js} +1 -1
  248. package/dist/{cloud-sync-shutdown-BNALPWGX.js → cloud-sync-shutdown-DAEPCFVK.js} +5 -5
  249. package/dist/{co-activation-CMNSWS6B.js → co-activation-523TKQPZ.js} +5 -5
  250. package/dist/{co-occurrence-WRI2NAN6.js → co-occurrence-PQUCTENN.js} +36 -17
  251. package/dist/{code-context-index-NOJSHLPN.js → code-context-index-LIDOFKOR.js} +6 -4
  252. package/dist/{code-context-watcher-VZNZU3BO.js → code-context-watcher-4F7K2N3U.js} +6 -4
  253. package/dist/{content-extractor-NXYNEF5K.js → content-extractor-DJM5EUDA.js} +2 -2
  254. package/dist/{conversation-entity-extractor-74252CAO.js → conversation-entity-extractor-THGKQ5RD.js} +5 -5
  255. package/dist/{crdt-sync-B3JN6AIV.js → crdt-sync-32B55NOJ.js} +1 -1
  256. package/dist/{crm-webhook-GYWQRFET.js → crm-webhook-FHRISFYQ.js} +2 -2
  257. package/dist/{cto-delegation-gate-LQHVLEMW.js → cto-delegation-gate-O6XPGECP.js} +27 -26
  258. package/dist/{daemon-auth-QZHEO7IQ.js → daemon-auth-PNKHERLV.js} +6 -1
  259. package/dist/daemon-drift-N2GKUBAO.js +15 -0
  260. package/dist/{daemon-orchestration-5HIQALZH.js → daemon-orchestration-BWLSJG2X.js} +33 -30
  261. package/dist/{daemon-ready-P2BR2XP5.js → daemon-ready-BN6EZLTQ.js} +1 -1
  262. package/dist/{daemon-ready-signal-CKXPUMJ2.js → daemon-ready-signal-PNDMVKPJ.js} +3 -1
  263. package/dist/{daemon-restart-circuit-breaker-SMTWFX27.js → daemon-restart-circuit-breaker-CD4VMCU7.js} +1 -1
  264. package/dist/daemon-restart-report-FIO5HZTJ.js +15 -0
  265. package/dist/{daemon-timer-report-TNJH5SFY.js → daemon-timer-report-6UK5PSDP.js} +2 -1
  266. package/dist/{db-integrity-events-2DTFO37N.js → db-integrity-events-GYGANKZV.js} +1 -1
  267. package/dist/{destructive-data-guard-BVFWPPIS.js → destructive-data-guard-HHWUBIGS.js} +1 -1
  268. package/dist/{doc-graph-extractor-PQHDHQPQ.js → doc-graph-extractor-HOKOV7BE.js} +10 -10
  269. package/dist/{documents-C4SSPJMC.js → documents-HWEJMONR.js} +16 -14
  270. package/dist/{dreaming-XAO3FCBV.js → dreaming-FMNDODG2.js} +31 -30
  271. package/dist/{employee-boot-brief-W4OHUMRQ.js → employee-boot-brief-DBFROOQJ.js} +35 -34
  272. package/dist/{entity-boost-3UWGXG5O.js → entity-boost-5V4W6NFA.js} +1 -1
  273. package/dist/{exe-drift-AG2KMKD5.js → exe-drift-V55UAYRT.js} +6 -6
  274. package/dist/{exe-export-IC5BT335.js → exe-export-LHN42ZUS.js} +18 -16
  275. package/dist/{exe-import-A35ZLDPG.js → exe-import-M536BEZC.js} +18 -16
  276. package/dist/{exe-key-TCMJNYLA.js → exe-key-37XIR22X.js} +111 -107
  277. package/dist/{exe-org-JXCR3JYZ.js → exe-org-7TDIRNTE.js} +14 -14
  278. package/dist/{exe-snapshot-SV6SRIG6.js → exe-snapshot-EOUBCIQK.js} +34 -33
  279. package/dist/{fast-db-init-L2RGKJWH.js → fast-db-init-GWUZ746B.js} +1 -1
  280. package/dist/{founder-context-D4HFIESJ.js → founder-context-6LQKET4A.js} +2 -2
  281. package/dist/{fts-integrity-4YB34KWX.js → fts-integrity-PLAL6NMG.js} +1 -1
  282. package/dist/gateway/index.js +17 -17
  283. package/dist/{git-main-guard-VTW4N3CM.js → git-main-guard-BGICS25C.js} +1 -1
  284. package/dist/{git-staleness-TN7CYGFG.js → git-staleness-QNNXJK3W.js} +5 -5
  285. package/dist/{global-procedures-YFDEIOG7.js → global-procedures-NMQGF54V.js} +7 -7
  286. package/dist/{gotrue-session-ODZ2ERJX.js → gotrue-session-U4H3UGHL.js} +1 -3
  287. package/dist/{graph-auto-extract-3YR3TYRW.js → graph-auto-extract-7POGAKHM.js} +10 -10
  288. package/dist/{graph-query-AP5R6ZHO.js → graph-query-ZEDO4BDF.js} +1 -1
  289. package/dist/{graph-rag-Z2KCJTPK.js → graph-rag-JA7XN7NO.js} +5 -5
  290. package/dist/hook-integrity-6NLSNTXD.js +15 -0
  291. package/dist/{hook-prefetch-K5DN3TOQ.js → hook-prefetch-4KH3D4YU.js} +28 -26
  292. package/dist/hook-tamper-log-Z4PWC7N4.js +90 -0
  293. package/dist/hooks/bug-report-worker.js +31 -30
  294. package/dist/hooks/codex-stop-task-finalizer.js +33 -32
  295. package/dist/hooks/commit-complete.js +30 -29
  296. package/dist/hooks/error-recall.js +12 -12
  297. package/dist/hooks/exe-heartbeat-hook.js +7 -7
  298. package/dist/hooks/ingest-worker.js +17 -15
  299. package/dist/hooks/ingest.js +20 -20
  300. package/dist/hooks/instructions-loaded.js +9 -9
  301. package/dist/hooks/manifest.json +20 -20
  302. package/dist/hooks/notification.js +8 -8
  303. package/dist/hooks/post-compact.js +7 -7
  304. package/dist/hooks/post-tool-combined.js +14 -14
  305. package/dist/hooks/pre-compact.js +30 -29
  306. package/dist/hooks/pre-tool-use.js +303 -489
  307. package/dist/hooks/prompt-submit.js +61 -54
  308. package/dist/hooks/session-end.js +35 -34
  309. package/dist/hooks/session-start.js +18 -18
  310. package/dist/hooks/stop.js +36 -35
  311. package/dist/hooks/subagent-stop.js +32 -31
  312. package/dist/hooks/summary-worker.js +36 -35
  313. package/dist/index.js +39 -38
  314. package/dist/{installer-LK35OX6R.js → installer-M34Q7LAS.js} +25 -10
  315. package/dist/{installer-54HTN5RE.js → installer-POV6TDQ5.js} +12 -8
  316. package/dist/{installer-LLWKZI2S.js → installer-S624ZOMB.js} +12 -8
  317. package/dist/{intercom-queue-5NOT2RKI.js → intercom-queue-MKDWAEUV.js} +26 -25
  318. package/dist/lib/cloud-sync.js +27 -19
  319. package/dist/lib/consolidation.js +12 -12
  320. package/dist/lib/database.js +5 -5
  321. package/dist/lib/db-backup.js +7 -1
  322. package/dist/lib/db-daemon-client.js +8 -6
  323. package/dist/lib/db-write-worker.js +4 -4
  324. package/dist/lib/db.js +5 -5
  325. package/dist/lib/device-registry.js +1 -1
  326. package/dist/lib/embedder.js +6 -4
  327. package/dist/lib/employee-templates.js +8 -8
  328. package/dist/lib/employees.js +5 -5
  329. package/dist/lib/exe-daemon-client.js +5 -3
  330. package/dist/lib/exe-daemon.js +333 -262
  331. package/dist/lib/hybrid-search.js +10 -10
  332. package/dist/lib/identity-templates.js +1 -1
  333. package/dist/lib/identity.js +17 -7
  334. package/dist/lib/license.js +2 -2
  335. package/dist/lib/messaging.js +27 -26
  336. package/dist/lib/post-tool-memory.js +9 -9
  337. package/dist/lib/registry-proxy.js +3 -1
  338. package/dist/lib/reminders.js +6 -6
  339. package/dist/lib/schedules.js +11 -11
  340. package/dist/lib/session-registry.js +11 -7
  341. package/dist/lib/session-wrappers.js +1 -1
  342. package/dist/lib/skill-learning.js +17 -15
  343. package/dist/lib/status-brief.js +2 -1
  344. package/dist/lib/store.js +9 -9
  345. package/dist/lib/task-router.js +6 -6
  346. package/dist/lib/tasks.js +28 -27
  347. package/dist/lib/tmux-routing.js +26 -25
  348. package/dist/lib/tmux-status.js +5 -1
  349. package/dist/lib/token-spend.js +6 -6
  350. package/dist/{license-gate-JVMB6OFD.js → license-gate-2QNMBAZU.js} +3 -3
  351. package/dist/{license-sync-5VYS2F2W.js → license-sync-FEDKH5MD.js} +2 -2
  352. package/dist/{mailbox-inbox-4MEUOL3J.js → mailbox-inbox-XE72D3AX.js} +2 -2
  353. package/dist/{mailbox-outbox-J6WIF3UY.js → mailbox-outbox-DNDDP2HW.js} +1 -1
  354. package/dist/mcp/register-tools.js +110 -106
  355. package/dist/mcp/server.js +113 -109
  356. package/dist/mcp/tools/complete-reminder.js +7 -7
  357. package/dist/mcp/tools/create-reminder.js +7 -7
  358. package/dist/mcp/tools/create-task.js +30 -29
  359. package/dist/mcp/tools/deactivate-behavior.js +18 -16
  360. package/dist/mcp/tools/list-reminders.js +7 -7
  361. package/dist/mcp/tools/list-tasks.js +30 -29
  362. package/dist/mcp/tools/send-message.js +33 -30
  363. package/dist/mcp/tools/update-task.js +29 -28
  364. package/dist/{mcp-child-registry-OTG4MWO7.js → mcp-child-registry-DVHYAHPW.js} +2 -2
  365. package/dist/{mcp-health-HNVSWKFA.js → mcp-health-B5EKRCZG.js} +2 -2
  366. package/dist/{mcp-http-config-DQWL7U2Z.js → mcp-http-config-ZJ7XHWT7.js} +10 -6
  367. package/dist/{mcp-session-identity-277GASTQ.js → mcp-session-identity-PEVM7VIP.js} +26 -25
  368. package/dist/{memory-cards-3S2ZQPR7.js → memory-cards-VN5DEWPD.js} +9 -9
  369. package/dist/{memory-graph-extractor-A6DFEFIN.js → memory-graph-extractor-TMEB6WLA.js} +11 -11
  370. package/dist/{memory-poisoning-defense-ZVP4H6DY.js → memory-poisoning-defense-DYHARQ2G.js} +5 -5
  371. package/dist/{memory-pressure-watchdog-6W5F6R7H.js → memory-pressure-watchdog-J6Q3SIBL.js} +27 -26
  372. package/dist/{memory-queue-client-ADSDP6OX.js → memory-queue-client-QC2OTMJB.js} +6 -4
  373. package/dist/{memory-reflection-BKB2YOE6.js → memory-reflection-ZYJUOSFX.js} +9 -9
  374. package/dist/{message-queue-client-XQN7QABL.js → message-queue-client-OEQCGSWC.js} +1 -25
  375. package/dist/{notification-ledger-CLGM7ODF.js → notification-ledger-TG6EFYBP.js} +29 -28
  376. package/dist/{notifications-MACUZPYP.js → notifications-LGYY22W5.js} +26 -25
  377. package/dist/{orchestration-events-N7LYMUGA.js → orchestration-events-JPHB6NPY.js} +6 -6
  378. package/dist/{orchestrator-4X24EWHV.js → orchestrator-IC4WGP6L.js} +28 -27
  379. package/dist/{org-brief-session-FZOFMO5U.js → org-brief-session-DEPHWCQR.js} +9 -9
  380. package/dist/{org-consent-policy-O5E6HXBL.js → org-consent-policy-T27AO5OJ.js} +2 -2
  381. package/dist/{org-join-POWUG25F.js → org-join-A3YXC5RB.js} +2 -2
  382. package/dist/{org-key-admin-E7EMDOZZ.js → org-key-admin-SQFHCVP2.js} +3 -3
  383. package/dist/{org-partner-runtime-FODONVTM.js → org-partner-runtime-L7L2WWGN.js} +10 -10
  384. package/dist/{org-row-visibility-VX4AVV5Q.js → org-row-visibility-M54Z6ZH3.js} +1 -1
  385. package/dist/{pipeline-router-6GGT2ZW3.js → pipeline-router-NKYAUR3Y.js} +6 -6
  386. package/dist/{plan-limits-FUN76LYY.js → plan-limits-ISRRGF23.js} +8 -8
  387. package/dist/{platform-procedures-7YSCLF4Z.js → platform-procedures-Z7ZGBJWN.js} +1 -1
  388. package/dist/{project-boot-3Q65LCIP.js → project-boot-BLYGVUJH.js} +4 -1
  389. package/dist/{project-name-LJVFMYTQ.js → project-name-WKSNNKXK.js} +6 -6
  390. package/dist/{projection-worker-4OANGP5K.js → projection-worker-RNYPE46G.js} +2 -2
  391. package/dist/{prospective-memory-KR3P4T6N.js → prospective-memory-GEO6E3UL.js} +5 -5
  392. package/dist/{push-notifications-NCZLH6DI.js → push-notifications-EY6BXZUY.js} +27 -26
  393. package/dist/{reproject-worktree-memories-PWYKPB2U.js → reproject-worktree-memories-DAA5GWMH.js} +28 -27
  394. package/dist/{reranker-6V3C2AO4.js → reranker-7OADQPMG.js} +1 -1
  395. package/dist/{retrieval-health-5D7O6VH6.js → retrieval-health-FCEDWN2P.js} +2 -2
  396. package/dist/{review-polling-QW3LJ4KN.js → review-polling-G52BR4MC.js} +27 -26
  397. package/dist/runtime/index.js +39 -38
  398. package/dist/{session-events-T45SSTMF.js → session-events-P6E2373E.js} +27 -26
  399. package/dist/{session-kill-telemetry-QSPVJGBF.js → session-kill-telemetry-OHNJMIVT.js} +27 -26
  400. package/dist/{session-mcp-config-SC5BLWZG.js → session-mcp-config-WFZAH6R5.js} +2 -1
  401. package/dist/{session-scope-KRWE54C4.js → session-scope-DKOHPQPJ.js} +26 -25
  402. package/dist/{setup-wizard-GP3TBTPF.js → setup-wizard-RNU3RFBE.js} +1 -1
  403. package/dist/{skill-refinement-C7JTMLJG.js → skill-refinement-AKJTHFXC.js} +6 -6
  404. package/dist/{stack-generate-manifest-MFMDWRUP.js → stack-generate-manifest-7WJZWSPK.js} +163 -15
  405. package/dist/{stack-promote-EKSCYY63.js → stack-promote-OP2URGFF.js} +4 -4
  406. package/dist/{stack-release-2GZAAFO4.js → stack-release-MY6U2QIO.js} +31 -8
  407. package/dist/{stack-update-J6JXSTAZ.js → stack-update-QSHSLUTZ.js} +3 -3
  408. package/dist/{steward-gate-BFCCMCSW.js → steward-gate-KMLS5ECC.js} +6 -6
  409. package/dist/{subagent-brief-injection-ED36PLYY.js → subagent-brief-injection-HCKZQZBF.js} +37 -36
  410. package/dist/{support-inbox-YW47SYJF.js → support-inbox-UBXU5RKV.js} +11 -11
  411. package/dist/{support-outbox-HFJWG52M.js → support-outbox-G2NG2U5K.js} +2 -2
  412. package/dist/{sweep-budget-KMPJ7O5Z.js → sweep-budget-YGLCNXZZ.js} +9 -3
  413. package/dist/{task-enforcement-CECTQX4U.js → task-enforcement-2GR7HU6V.js} +27 -26
  414. package/dist/{task-request-inbox-Q5T4N5K7.js → task-request-inbox-ANCVK2VG.js} +2 -2
  415. package/dist/{task-scope-ERVEUEYU.js → task-scope-QANJJXXB.js} +30 -29
  416. package/dist/{tasks-crud-ZRQNJXQ2.js → tasks-crud-45WOIMIM.js} +44 -25
  417. package/dist/{tasks-notify-MIZH4C2O.js → tasks-notify-ZJS4MA3S.js} +29 -26
  418. package/dist/{tasks-review-Z7J2P6DG.js → tasks-review-ZVPKY47Z.js} +26 -25
  419. package/dist/{telemetry-upload-LVQUQYFP.js → telemetry-upload-VY3UWAEL.js} +10 -10
  420. package/dist/{token-budget-BU4NOVZF.js → token-budget-XHX6XFEC.js} +6 -6
  421. package/dist/{tool-capability-index-7F42MOJT.js → tool-capability-index-6HLZU437.js} +1 -1
  422. package/dist/{tool-telemetry-O27EVMBR.js → tool-telemetry-GBDI4AXR.js} +1 -1
  423. package/dist/tui/App.js +36 -35
  424. package/dist/{tui-data-TPWWBIUQ.js → tui-data-IQFE3UW3.js} +30 -29
  425. package/dist/{typed-messages-RCMPEKJN.js → typed-messages-P2HLLA62.js} +1 -1
  426. package/dist/{update-support-F2F5537B.js → update-support-BDN5AK4R.js} +25 -22
  427. package/dist/{work-claims-B73X5NE7.js → work-claims-PDQNLE5K.js} +7 -7
  428. package/dist/{work-state-heartbeat-P4YX6E2R.js → work-state-heartbeat-CH6BLQKV.js} +1 -1
  429. package/dist/{worker-gate-BEEIIVWA.js → worker-gate-NUUSQMBT.js} +1 -3
  430. package/dist/{workflow-engine-5X46PFCW.js → workflow-engine-RZ7QEI3Z.js} +2 -2
  431. package/dist/{worktree-W47CIMJ6.js → worktree-Q25PZST6.js} +11 -7
  432. package/dist/worktree-ownership-guard-4LKMW6PW.js +421 -0
  433. package/dist/{worktree-sweep-BNBD4RFX.js → worktree-sweep-EV5YQ2OB.js} +8 -8
  434. package/package.json +15 -3
  435. package/release-notes.json +5 -5
  436. package/src/commands/exe.md +16 -16
  437. package/stack.release.json +9 -8
  438. package/dist/behavior-injection-M6UYZCMW.js +0 -63
  439. package/dist/chunk-BJ7AVSY6.js +0 -50
  440. package/dist/daemon-restart-report-EIVD6WDJ.js +0 -10
  441. package/dist/worktree-ownership-guard-OUWJROW2.js +0 -88
  442. /package/dist/{chunk-GQOEWNVM.js → chunk-4EG4DT4F.js} +0 -0
  443. /package/dist/{chunk-AISULNGL.js → chunk-BRAIWGMF.js} +0 -0
  444. /package/dist/{chunk-NRG7KZIP.js → chunk-HQEAZDAC.js} +0 -0
  445. /package/dist/{chunk-VZAFWPAY.js → chunk-IK4344V5.js} +0 -0
  446. /package/dist/{chunk-GM7TLYOK.js → chunk-K3VDF6II.js} +0 -0
  447. /package/dist/{chunk-2AJGV5UL.js → chunk-KM7DAG5J.js} +0 -0
  448. /package/dist/{chunk-YO4BO2CL.js → chunk-QIEYJ4KZ.js} +0 -0
  449. /package/dist/{chunk-WSQASFLP.js → chunk-VCTK5HRA.js} +0 -0
  450. /package/dist/{chunk-KQ6RJWRW.js → chunk-VPT6VMBG.js} +0 -0
  451. /package/dist/{chunk-6WIFPD2P.js → chunk-YZ4AEMR7.js} +0 -0
  452. /package/dist/{core-memory-7I7RE2SJ.js → core-memory-UIZKCY4L.js} +0 -0
  453. /package/dist/{memory-isolation-2TUZ7Z4K.js → memory-isolation-3GJ6WLYX.js} +0 -0
  454. /package/dist/{oauth-server-AYM37SQ4.js → oauth-server-ZRHXIRXQ.js} +0 -0
  455. /package/dist/{wiki-acl-IBQLLBTS.js → wiki-acl-MFOYK5F4.js} +0 -0
@@ -149,7 +149,22 @@ WIKI_IMAGE_TAG=update.askexe.com/askexe/exe-wiki:v0.9.28@sha256:61856a4c6b97ce62
149
149
  # only thing holding production together was a host-local compose override.
150
150
  # exe-wiki-schema-guard blocks the boot if you get this wrong.
151
151
  WIKI_DB_SCHEMA=public
152
- 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
153
168
  WIKI_AUTH_TOKEN=CHANGEME_WIKI_AUTH_TOKEN
154
169
  WIKI_JWT_SECRET=CHANGEME_WIKI_JWT_SECRET
155
170
  WIKI_SIG_KEY=CHANGEME_WIKI_SIG_KEY
@@ -179,7 +179,22 @@ WIKI_IMAGE_TAG=ghcr.io/askexe/exe-wiki:v0.9.28@sha256:61856a4c6b97ce62c62ecdc3a3
179
179
  # only thing holding production together was a host-local compose override.
180
180
  # exe-wiki-schema-guard blocks the boot if you get this wrong.
181
181
  WIKI_DB_SCHEMA=public
182
- 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
183
198
  WIKI_AUTH_TOKEN=CHANGEME_WIKI_AUTH_TOKEN
184
199
  EXE_WIKI_ADMIN_TOKEN=CHANGEME_EXE_WIKI_ADMIN_TOKEN
185
200
  WIKI_JWT_SECRET=CHANGEME_WIKI_JWT_SECRET
@@ -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:
@@ -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
@@ -1221,6 +1281,8 @@ services:
1221
1281
  - ./sso-edge/default.conf.template:/etc/nginx/exe-templates/default.conf.template:ro
1222
1282
  - ./sso-edge/sso-redirect.conf:/etc/nginx/snippets/sso-redirect.conf:ro
1223
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
1224
1286
  # nginx:alpine runs /docker-entrypoint.d/*.sh then `nginx -g 'daemon off;'`.
1225
1287
  # Our script renders the template from ${DOMAIN}; it does not exec nginx
1226
1288
  # itself (the base entrypoint does), so it ends after `nginx -t`.
@@ -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() {
@@ -89,7 +89,17 @@ export const WIKI_IMAGE_TAG = pin("wiki", REGISTRY, "exe-wiki");
89
89
  // pinned the wiki to an empty schema — Prisma bootstraps it silently rather than
90
90
  // erroring, so the wiki simply comes up with no users and no documents.
91
91
  const WIKI_DB_SCHEMA = "public";
92
- const WIKI_VECTOR_DB = "exeOsMcp";
92
+ // Bugs bed3cb4a / c604df37: exeOsMcp is not reachable in production (the wiki's
93
+ // client spawns the wrong exe-os CLI subcommand) and exe-wiki PR #78 made
94
+ // native + pgvector the working, self-contained default. See the matching
95
+ // comment in deploy/compose/docker-compose.yml's exe-wiki environment block.
96
+ const WIKI_VECTOR_DB = "pgvector";
97
+ const WIKI_LLM_PROVIDER = "zai";
98
+ const WIKI_ZAI_MODEL_PREF = "glm-4.6";
99
+ const WIKI_ZAI_BASE_PATH = "https://api.z.ai/api/coding/paas/v4";
100
+ // codex P1: docker-compose.yml reads the UNPREFIXED ZAI_MODEL_PREF / ZAI_BASE_PATH
101
+ // (matching the already-unprefixed ZAI_API_KEY) — emit those names, not
102
+ // WIKI_-prefixed ones a fresh customer .env would generate but compose never reads.
93
103
  const WIKI_HOST_PORT = "3001";
94
104
  export const EXE_OS_IMAGE_TAG = pin("exe-os", REGISTRY, "exe-os");
95
105
  export const GATEWAY_IMAGE_TAG = pin("gateway", REGISTRY, "exe-gateway");
@@ -313,7 +323,22 @@ export function generateEnv(options: GenerateEnvOptions): string {
313
323
  "# only thing holding production together was a host-local compose override.",
314
324
  "# exe-wiki-schema-guard blocks the boot if you get this wrong.",
315
325
  `WIKI_DB_SCHEMA=${WIKI_DB_SCHEMA}`,
326
+ "# Bugs bed3cb4a / c604df37 — see deploy/compose/docker-compose.yml's exe-wiki",
327
+ "# environment block for the full rationale. pgvector reuses this same",
328
+ "# exe-db instance; native runs in-process (no API key, no exe-os MCP daemon).",
316
329
  `WIKI_VECTOR_DB=${WIKI_VECTOR_DB}`,
330
+ "# bug bed3cb4a / corrected 2026-08-31 (founder direction): wiki's RAG/chat",
331
+ "# uses GLM via Z.ai directly (exe-wiki PR #78's real, verified `zai`",
332
+ "# provider) — not Anthropic through exe-gateway. Supply ZAI_API_KEY to match.",
333
+ `WIKI_LLM_PROVIDER=${WIKI_LLM_PROVIDER}`,
334
+ `ZAI_MODEL_PREF=${WIKI_ZAI_MODEL_PREF}`,
335
+ `ZAI_BASE_PATH=${WIKI_ZAI_BASE_PATH}`,
336
+ "# exe-gateway's /v1/messages authenticates via an exe_sk_* billing API key",
337
+ "# (exe-gateway src/api-keys.ts), provisioned per-customer through",
338
+ "# dashboard.askexe.com — it cannot be generated here. Chat/RAG will fail",
339
+ '# ("No Anthropic API key was set") until this is set.',
340
+ MANUAL_VALUE_COMMENT,
341
+ "WIKI_ANTHROPIC_API_KEY=",
317
342
  `WIKI_AUTH_TOKEN=${randomSecret(RANDOM_SECRET_48)}`,
318
343
  `EXE_WIKI_ADMIN_TOKEN=${randomSecret(RANDOM_SECRET_48)}`,
319
344
  `WIKI_JWT_SECRET=${randomSecret(RANDOM_SECRET_48)}`,
@@ -632,7 +657,22 @@ export function generateExampleEnv(): string {
632
657
  "# only thing holding production together was a host-local compose override.",
633
658
  "# exe-wiki-schema-guard blocks the boot if you get this wrong.",
634
659
  `WIKI_DB_SCHEMA=${WIKI_DB_SCHEMA}`,
660
+ "# Bugs bed3cb4a / c604df37 — see deploy/compose/docker-compose.yml's exe-wiki",
661
+ "# environment block for the full rationale. pgvector reuses this same",
662
+ "# exe-db instance; native runs in-process (no API key, no exe-os MCP daemon).",
635
663
  `WIKI_VECTOR_DB=${WIKI_VECTOR_DB}`,
664
+ "# bug bed3cb4a / corrected 2026-08-31 (founder direction): wiki's RAG/chat",
665
+ "# uses GLM via Z.ai directly (exe-wiki PR #78's real, verified `zai`",
666
+ "# provider) — not Anthropic through exe-gateway. Supply ZAI_API_KEY to match.",
667
+ `WIKI_LLM_PROVIDER=${WIKI_LLM_PROVIDER}`,
668
+ `ZAI_MODEL_PREF=${WIKI_ZAI_MODEL_PREF}`,
669
+ `ZAI_BASE_PATH=${WIKI_ZAI_BASE_PATH}`,
670
+ "# exe-gateway's /v1/messages authenticates via an exe_sk_* billing API key",
671
+ "# (exe-gateway src/api-keys.ts), provisioned per-customer through",
672
+ "# dashboard.askexe.com — it cannot be generated here. Chat/RAG will fail",
673
+ '# ("No Anthropic API key was set") until this is set.',
674
+ MANUAL_VALUE_COMMENT,
675
+ "WIKI_ANTHROPIC_API_KEY=CHANGEME_WIKI_ANTHROPIC_API_KEY",
636
676
  "WIKI_AUTH_TOKEN=CHANGEME_WIKI_AUTH_TOKEN",
637
677
  "EXE_WIKI_ADMIN_TOKEN=CHANGEME_EXE_WIKI_ADMIN_TOKEN",
638
678
  "WIKI_JWT_SECRET=CHANGEME_WIKI_JWT_SECRET",
@@ -70,54 +70,15 @@ map $http_cookie $sso_gotrue_cookie {
70
70
  "~(?:^|;\s*)exe_access_token=([^\s;]+)" $1;
71
71
  }
72
72
 
73
- # Static-asset exemption for the gate (see sso-redirect.conf step 0). Exempting
74
- # assets is required for the SPA to boot at all: the app sets its session cookie
75
- # only after its JS runs, so gating app.js hands a session-bearing document auth
76
- # HTML in place of its script -> blank page.
77
- #
78
- # MAPS OVER $request_uri, NOT $uri (bug 06a3daae). Same trap the token map
79
- # above documents: $sso_is_static is read inside the auth_request subrequest,
80
- # where $uri is the gate's own path `/_sso_gate` never the original request
81
- # path so an extension regex over $uri can never match and this exemption was
82
- # completely inert from the day it shipped. $request_uri IS inherited, but it
83
- # carries the query string, so the anchor admits `?`/`#` as well as end-of-
84
- # string — without that, /assets/app.js?v=abc would fall back into the gate.
85
- #
86
- # SCOPED BY PATH PREFIX, NOT BY BARE EXTENSION (P0 review of PR #874). A bare
87
- # extension test over $request_uri exempts ANY URL shaped like an asset, and the
88
- # app locations are catch-all proxies, so `/uploads/customer.png` and
89
- # `/api/export.js` would walk straight past the gate — the gate returns 204
90
- # before it ever looks at a cookie. The allow arms below are anchored at `^/`
91
- # on the build-output directories the SPAs actually boot from; everything else
92
- # — including every proxied application path — falls to `default ""` and stays
93
- # gated. This is now a path test AND an extension test, not a URL-shape test.
94
- #
95
- # nginx takes the FIRST matching regex in a map, so the deny arms are listed
96
- # first and win unconditionally over the allow arms.
97
- map $request_uri $sso_is_static {
98
- default "";
99
-
100
- # ── DENY (evaluated first, wins over everything below) ───────────────────
101
- # Proxied application surface: API, user uploads and app-served files can
102
- # never be exempt, whatever extension or query string they are dressed in.
103
- "~*^/(?:api|uploads?|files|private|attachments|media|desk|app|method|admin)(?:[/?#]|$)" "";
104
- # Traversal, raw or percent-encoded. $request_uri is the RAW request line:
105
- # `/assets/../api/secret.js` is a prefix match here but normalizes to
106
- # `/api/secret.js` before it reaches the app, so it must never be exempt.
107
- "~\.\." "";
108
- "~*%2e" "";
109
- "~*%2f" "";
110
- "~*%5c" "";
111
-
112
- # ── ALLOW ────────────────────────────────────────────────────────────────
113
- # Build-output directories only: Vite/Frappe `/assets/`, CRA/Twenty
114
- # `/static/`, Next `/_next/static/`, Nuxt `/_nuxt/`, Vite-in-subdir
115
- # `/build/assets/`. `[^?#]*` keeps the extension test on the PATH, so a
116
- # query string can never supply the matching extension.
117
- "~*^/(?:_next/static|_nuxt|assets|static|build/assets)/[^?#]*\.(?:js|mjs|css|map|png|jpe?g|gif|svg|ico|webp|woff2?|ttf)(?:[?#]|$)" "static";
118
- # Root icons the browser requests on its own before any app code runs.
119
- "~*^/(?:favicon\.(?:ico|svg|png)|apple-touch-icon(?:-precomposed)?\.png)(?:[?#]|$)" "static";
120
- }
73
+ # NO static-asset exemption map here deliberately (bug 419e1231). A
74
+ # `map $uri $sso_is_static` used to live at this spot, feeding a step-0 bypass
75
+ # in /_sso_gate that could never fire ($uri inside an auth_request subrequest is
76
+ # "/_sso_gate", not the parent path). Since bug 83ba9546 the gate authenticates
77
+ # off the apex `exe_sess` cookie, which the browser sends on the very first
78
+ # request, so assets need no exemption to load. Do not re-add this map over
79
+ # $request_uri "to make it work" that would newly open a real bypass for every
80
+ # path ending in an asset extension (CRM attachments, wiki images included).
81
+ # Ungate a specific path with `location = /p { auth_request off; }` instead.
121
82
 
122
83
  map $http_upgrade $sso_conn_upgrade {
123
84
  default upgrade;
@@ -163,15 +124,25 @@ server {
163
124
  set $sso_auth_base "https://auth.${DOMAIN}";
164
125
  set $sso_app_url "https://wiki.${DOMAIN}";
165
126
  set $sso_product "Wiki";
166
- # Bug f1bb40d8: ONE canonical SSO session-cookie key across auth / edge / wiki.
167
- # Previously the edge gated on $cookie_wiki_session while the wiki frontend set
168
- # exe_sso_token (and kept its real token in localStorage) four different keys,
169
- # so the edge never saw a session and the user redirect-looped (yet /api/ping
170
- # stayed 200, so health missed it). The contract is now exe_access_token: the
171
- # wiki sets a cookie of this name after consuming ?access_token=, and the edge
172
- # gates on the same name. Keep this in lockstep with EXE_SSO_COOKIE_NAME on the
173
- # exe-wiki service (docker-compose.yml) and sso-redirect.README.md.
174
- set $sso_session_cookie $cookie_exe_access_token; # exe-wiki SSO session cookie (canonical)
127
+ # Bug 4a6650f5: EMPTY ON PURPOSE the wiki has no app-native session cookie.
128
+ #
129
+ # This used to be $cookie_exe_access_token (bug f1bb40d8's "one canonical SSO
130
+ # cookie key"), but exe_access_token is the apex PRESENCE SENTINEL: value is
131
+ # the literal "1", deliberately JS-readable, forgeable by any visitor. Using
132
+ # it here made step 1 of /_sso_gate satisfy its app-cookie arm and its
133
+ # sentinel arm from that single cookie, so `Cookie: exe_access_token=1`
134
+ # returned 204 with no credential at all (live: wiki 200 instead of 302), and
135
+ # a logged-out user could walk back in by re-setting it, defeating cross-app
136
+ # logout. exe-wiki never had a second, real session cookie to point at — its
137
+ # boot script only mirrors this same sentinel name (EXE_SSO_COOKIE_NAME).
138
+ #
139
+ # Leaving it empty makes step 1 unmatchable, so every wiki request falls
140
+ # through to steps 2-3 and is authenticated by the apex `exe_sess` cookie
141
+ # validated against GoTrue /user — the same path CRM/ERP take on first visit
142
+ # since bug 83ba9546, and strictly stronger than presence-trusting a cookie.
143
+ # If exe-wiki ever mints a real server-side session cookie, set that name
144
+ # here — never the sentinel.
145
+ set $sso_session_cookie "";
175
146
  include /etc/nginx/snippets/sso-redirect.conf;
176
147
 
177
148
  # Bug d3ba1136: wiki's actual health probe is /api/ping. Expose the standard
@@ -218,10 +189,14 @@ server {
218
189
  set $sso_auth_base "https://auth.${DOMAIN}";
219
190
  set $sso_app_url "https://dashboard.${DOMAIN}";
220
191
  set $sso_product "Dashboard";
221
- # The dashboard stores its access token in localStorage AND sets a cookie
222
- # named exe_access_token on the parent domain so the SSO edge can gate on
223
- # it (same cookie name as the Wiki both are canonical SSO consumers).
224
- set $sso_session_cookie $cookie_exe_access_token;
192
+ # Bug 4a6650f5: EMPTY ON PURPOSE same defect and same fix as the Wiki
193
+ # vhost above (see its comment). The dashboard keeps its access token in
194
+ # localStorage and only mirrors the apex `exe_access_token` sentinel into a
195
+ # cookie; that sentinel is a forgeable "1", not a credential, so gating on it
196
+ # admitted anyone sending `Cookie: exe_access_token=1`. The dashboard has no
197
+ # app-native session cookie to name instead, so leave this empty and let
198
+ # steps 2-3 validate the apex `exe_sess` cookie against GoTrue.
199
+ set $sso_session_cookie "";
225
200
  include /etc/nginx/snippets/sso-redirect.conf;
226
201
 
227
202
  location = /health { auth_request off; proxy_pass http://sso_dashboard/health; }
@@ -230,9 +205,30 @@ server {
230
205
  location / { proxy_pass http://sso_dashboard; }
231
206
  }
232
207
 
233
- # Default — unknown host → 404 (no open proxy).
208
+ # Default — unknown host or edge-generated error branded shared error pages
209
+ # (packages/exe-error-pages, vendored here by packages/exe-error-pages/sync.mjs
210
+ # and bind-mounted at /usr/share/nginx/html/error-pages; bug 64324162 delivery
211
+ # path). Scoped to THIS server only: app 4xx/5xx from crm/wiki/erp/etc. are
212
+ # proxied responses and pass through untouched (no proxy_intercept_errors).
234
213
  server {
235
214
  listen 80 default_server;
236
215
  server_name _;
237
- return 404;
216
+
217
+ root /usr/share/nginx/html;
218
+
219
+ error_page 404 /error-pages/404.html;
220
+ error_page 500 502 504 /error-pages/500.html;
221
+ error_page 503 /error-pages/503.html;
222
+
223
+ # The shared pages, reachable only via the error_page directives above.
224
+ location ^~ /error-pages/ {
225
+ internal;
226
+ # Static HTML, inline CSS; Google Fonts is the only external dep.
227
+ add_header Cache-Control "no-store" always;
228
+ }
229
+
230
+ # Any request to an unconfigured host falls here and returns the branded 404.
231
+ location / {
232
+ return 404;
233
+ }
238
234
  }
@@ -0,0 +1,129 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <!-- Build provenance: stamped by stamp.mjs at delivery-build time so a served page reveals the exact source commit. Unstamped (literal __EXE_BUILD_*__) => served straight from git without a provenance step. -->
7
+ <meta name="exe-build-rev" content="__EXE_BUILD_REV__">
8
+ <meta name="exe-build-ref" content="__EXE_BUILD_REF__">
9
+ <meta name="exe-build-time" content="__EXE_BUILD_TIME__">
10
+ <title>404 — Page Not Found | Exe</title>
11
+ <style>
12
+ @import url('https://fonts.googleapis.com/css2?family=Epilogue:wght@400;700&family=Manrope:wght@400;500;600&display=swap');
13
+
14
+ *, *::before, *::after {
15
+ margin: 0;
16
+ padding: 0;
17
+ box-sizing: border-box;
18
+ }
19
+
20
+ body {
21
+ background: #0F0E1A;
22
+ color: #FFFFFF;
23
+ font-family: 'Manrope', sans-serif;
24
+ min-height: 100vh;
25
+ display: flex;
26
+ flex-direction: column;
27
+ align-items: center;
28
+ justify-content: center;
29
+ -webkit-font-smoothing: antialiased;
30
+ -moz-osx-font-smoothing: grayscale;
31
+ }
32
+
33
+ .container {
34
+ text-align: center;
35
+ padding: 2rem;
36
+ max-width: 480px;
37
+ }
38
+
39
+ .logo {
40
+ font-family: 'Epilogue', sans-serif;
41
+ font-weight: 700;
42
+ font-size: 30px;
43
+ color: #F5D76E;
44
+ letter-spacing: 0.08em;
45
+ margin-bottom: 3rem;
46
+ }
47
+
48
+ .error-code {
49
+ font-family: 'Epilogue', sans-serif;
50
+ font-weight: 700;
51
+ font-size: 120px;
52
+ line-height: 1;
53
+ color: #FFFFFF;
54
+ margin-bottom: 1rem;
55
+ }
56
+
57
+ .description {
58
+ font-family: 'Manrope', sans-serif;
59
+ font-size: 16px;
60
+ font-weight: 400;
61
+ color: #A09CAF;
62
+ line-height: 1.6;
63
+ margin-bottom: 2.5rem;
64
+ }
65
+
66
+ .btn {
67
+ display: inline-block;
68
+ font-family: 'Manrope', sans-serif;
69
+ font-weight: 600;
70
+ font-size: 14px;
71
+ letter-spacing: 0.04em;
72
+ text-transform: uppercase;
73
+ color: #0F0E1A;
74
+ background: #F5D76E;
75
+ border: none;
76
+ border-radius: 8px;
77
+ padding: 14px 36px;
78
+ cursor: pointer;
79
+ text-decoration: none;
80
+ transition: background 0.2s ease, transform 0.1s ease;
81
+ }
82
+
83
+ .btn:hover {
84
+ background: #f7e08a;
85
+ transform: translateY(-1px);
86
+ }
87
+
88
+ .btn:active {
89
+ transform: translateY(0);
90
+ }
91
+
92
+ .services {
93
+ margin-top: 4rem;
94
+ font-family: 'Manrope', sans-serif;
95
+ font-size: 13px;
96
+ color: #5A5669;
97
+ }
98
+
99
+ .services a {
100
+ color: #5A5669;
101
+ text-decoration: none;
102
+ transition: color 0.2s ease;
103
+ }
104
+
105
+ .services a:hover {
106
+ color: #A09CAF;
107
+ }
108
+
109
+ .services .sep {
110
+ margin: 0 0.6em;
111
+ }
112
+ </style>
113
+ </head>
114
+ <body>
115
+ <div class="container">
116
+ <div class="logo">EXE</div>
117
+ <div class="error-code">404</div>
118
+ <p class="description">The page you're looking for doesn't exist or has been moved.</p>
119
+ <a href="/" class="btn">Go Home</a>
120
+ <div class="services">
121
+ <a href="https://crm.askexe.com">CRM</a>
122
+ <span class="sep">&middot;</span>
123
+ <a href="https://wiki.askexe.com">Wiki</a>
124
+ <span class="sep">&middot;</span>
125
+ <a href="https://erp.askexe.com">ERP</a>
126
+ </div>
127
+ </div>
128
+ </body>
129
+ </html>