@askexenow/exe-os 0.9.256 → 0.9.260

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 (273) hide show
  1. package/deploy/compose/.env.customer.example +13 -13
  2. package/deploy/compose/.env.example +8 -8
  3. package/deploy/compose/docker-compose.yml +18 -18
  4. package/deploy/compose/generate-env.ts +22 -18
  5. package/deploy/compose/init-db.sql +221 -20
  6. package/deploy/stack-manifests/v0.9.json +1207 -1136
  7. package/dist/{active-agent-DTZ6VJIR.js → active-agent-IGZXTTV4.js} +3 -3
  8. package/dist/{active-agent-7QNK5CJZ.js → active-agent-OYUXMTHS.js} +3 -3
  9. package/dist/{agentic-ontology-UZK33N6I.js → agentic-ontology-5WT23SLZ.js} +1 -1
  10. package/dist/{backfill-metadata-R7PNZ5TX.js → backfill-metadata-EG52U3GF.js} +4 -4
  11. package/dist/{behaviors-G6QHSQBN.js → behaviors-2TZCFJLU.js} +3 -3
  12. package/dist/bin/age-ontology-load.js +2 -2
  13. package/dist/bin/agentic-ontology-backfill.js +5 -5
  14. package/dist/bin/agentic-reflection-backfill.js +6 -6
  15. package/dist/bin/agentic-semantic-label.js +5 -5
  16. package/dist/bin/backfill-conversations.js +6 -5
  17. package/dist/bin/backfill-responses.js +6 -5
  18. package/dist/bin/backfill-vectors.js +7 -6
  19. package/dist/bin/bulk-sync-postgres.js +6 -6
  20. package/dist/bin/cleanup-stale-review-tasks.js +9 -9
  21. package/dist/bin/cli.js +17 -17
  22. package/dist/bin/deferred-daemon-restart.js +4 -1
  23. package/dist/bin/exe-agent-config.js +2 -2
  24. package/dist/bin/exe-agent.js +4 -4
  25. package/dist/bin/exe-assign.js +8 -7
  26. package/dist/bin/exe-boot.js +16 -16
  27. package/dist/bin/exe-call.js +4 -4
  28. package/dist/bin/exe-cloud.js +4 -4
  29. package/dist/bin/exe-dispatch.js +9 -9
  30. package/dist/bin/exe-doctor.js +1 -1
  31. package/dist/bin/exe-export-behaviors.js +7 -7
  32. package/dist/bin/exe-forget.js +6 -6
  33. package/dist/bin/exe-gateway.js +9 -9
  34. package/dist/bin/exe-heartbeat.js +9 -9
  35. package/dist/bin/exe-kill.js +12 -12
  36. package/dist/bin/exe-launch-agent.js +16 -16
  37. package/dist/bin/exe-new-employee.js +6 -6
  38. package/dist/bin/exe-pending-messages.js +11 -10
  39. package/dist/bin/exe-pending-notifications.js +9 -9
  40. package/dist/bin/exe-pending-reviews.js +11 -9
  41. package/dist/bin/exe-rename.js +4 -4
  42. package/dist/bin/exe-review.js +11 -11
  43. package/dist/bin/exe-search.js +5 -5
  44. package/dist/bin/exe-session-cleanup.js +14 -14
  45. package/dist/bin/exe-settings.js +4 -4
  46. package/dist/bin/exe-start-codex.js +11 -11
  47. package/dist/bin/exe-start-opencode.js +8 -8
  48. package/dist/bin/exe-status.js +10 -10
  49. package/dist/bin/exe-support.js +3 -1
  50. package/dist/bin/exe-team.js +3 -3
  51. package/dist/bin/git-sweep.js +71 -11
  52. package/dist/bin/graph-backfill.js +4 -4
  53. package/dist/bin/graph-export.js +5 -5
  54. package/dist/bin/graph-layer-benchmark.js +7 -7
  55. package/dist/bin/import-history.js +7 -7
  56. package/dist/bin/install.js +12 -9
  57. package/dist/bin/intercom-check.js +4 -4
  58. package/dist/bin/mcp-sessions.js +2 -2
  59. package/dist/bin/orchestration-metrics.js +4 -4
  60. package/dist/bin/postgres-agentic-reflection-backfill.js +7 -7
  61. package/dist/bin/postgres-agentic-semantic-backfill.js +7 -7
  62. package/dist/bin/pre-publish.js +2 -1
  63. package/dist/bin/scan-tasks.js +9 -9
  64. package/dist/bin/setup.js +1 -1
  65. package/dist/bin/shard-migrate.js +4 -4
  66. package/dist/bin/stack-update.js +20 -3
  67. package/dist/bin/vps-health-gate.js +1 -1
  68. package/dist/{capacity-monitor-QMKII67L.js → capacity-monitor-CTFWWTCR.js} +10 -10
  69. package/dist/{catchup-brief-CNISNLV7.js → catchup-brief-AXA4DAQI.js} +11 -11
  70. package/dist/{chunk-QP4FHME2.js → chunk-235ZCOYB.js} +18 -6
  71. package/dist/{chunk-2NEQQCRC.js → chunk-25JAXHON.js} +1 -1
  72. package/dist/{chunk-MU6ESLYL.js → chunk-2PFNATXD.js} +1 -1
  73. package/dist/chunk-2XZ6X3PJ.js +13 -0
  74. package/dist/chunk-3XX3CDKF.js +9 -0
  75. package/dist/{chunk-ZTB6E2ZL.js → chunk-4FGTT26Q.js} +1 -1
  76. package/dist/{chunk-YYSQAM4W.js → chunk-4TYAHVDI.js} +8 -8
  77. package/dist/{chunk-2QKNXGII.js → chunk-4VECWOUO.js} +2 -2
  78. package/dist/{chunk-YXMXP45V.js → chunk-57C3MZPQ.js} +2 -2
  79. package/dist/{chunk-FTNNNAMH.js → chunk-5JYCTIQD.js} +1 -1
  80. package/dist/{chunk-CS267UMH.js → chunk-5LDTCWYX.js} +79 -19
  81. package/dist/{chunk-FQVITYVF.js → chunk-6D2IZ5MB.js} +2 -2
  82. package/dist/{chunk-ZG3HADWE.js → chunk-7UJRF4WF.js} +1 -1
  83. package/dist/{chunk-JFVITKXI.js → chunk-A2UPDE3J.js} +1 -1
  84. package/dist/{chunk-KOCQAMAM.js → chunk-ANYOAZCZ.js} +238 -5
  85. package/dist/{chunk-PSQNT5DS.js → chunk-AQS2B3HC.js} +8 -8
  86. package/dist/{chunk-ABNALOLM.js → chunk-BGEXTWGR.js} +3 -3
  87. package/dist/{chunk-LPK5JPME.js → chunk-BPZL5YOM.js} +1 -1
  88. package/dist/{chunk-JGEGEOVP.js → chunk-COKTAJUZ.js} +1 -1
  89. package/dist/{chunk-MRZE5IOP.js → chunk-CXOX7TRG.js} +1 -1
  90. package/dist/{chunk-6LFFIEDM.js → chunk-DU64OESH.js} +1 -1
  91. package/dist/{chunk-X3SS45PO.js → chunk-FPXZY3FY.js} +1 -1
  92. package/dist/{chunk-TVTRMINO.js → chunk-FUGZF7VR.js} +1 -1
  93. package/dist/{chunk-O7SFCX5B.js → chunk-GB4FI66P.js} +2 -2
  94. package/dist/{chunk-VGWQBI76.js → chunk-GBR4MAAK.js} +1 -1
  95. package/dist/chunk-GH4LVBQM.js +371 -0
  96. package/dist/{chunk-AIXZ5O7U.js → chunk-GIHMDOSK.js} +1 -1
  97. package/dist/{chunk-RDCE652I.js → chunk-HDWVXSGO.js} +1 -1
  98. package/dist/{chunk-RF54NGPJ.js → chunk-IJ7R3MXE.js} +3 -5
  99. package/dist/{chunk-R7FBOZT5.js → chunk-ISL3NSVX.js} +1 -1
  100. package/dist/{chunk-5B2AEXVA.js → chunk-IVSRRIRG.js} +1 -1
  101. package/dist/{chunk-SD2R3SEA.js → chunk-J3YNCJ4A.js} +1 -1
  102. package/dist/{chunk-5IZYSS3M.js → chunk-JE4C74EE.js} +4 -4
  103. package/dist/{chunk-VRVHIVUE.js → chunk-KSR2PNRW.js} +2 -2
  104. package/dist/{chunk-LL2ARYTZ.js → chunk-L3PY4NFQ.js} +1 -1
  105. package/dist/{chunk-VFATLVRX.js → chunk-L5VPUOB6.js} +1 -1
  106. package/dist/{chunk-3VLFVOM7.js → chunk-LRKJGSNH.js} +2 -2
  107. package/dist/{chunk-4FT3SQAS.js → chunk-LVY74L2J.js} +2 -2
  108. package/dist/{chunk-X4T7LR2X.js → chunk-M7PZFYHE.js} +2 -2
  109. package/dist/{chunk-CIX64N7D.js → chunk-MGTVPIEZ.js} +1 -1
  110. package/dist/{chunk-MXCBORCC.js → chunk-MKTEGZ37.js} +3 -3
  111. package/dist/chunk-MMRUBN3I.js +36 -0
  112. package/dist/{chunk-4MONXPWR.js → chunk-MPXLF7TA.js} +1 -1
  113. package/dist/{chunk-6QMXKKFD.js → chunk-N27CTUFU.js} +1 -1
  114. package/dist/{chunk-YDHPC4PX.js → chunk-N4ES27RI.js} +3 -3
  115. package/dist/{chunk-WIRJ574R.js → chunk-NGQQRGLP.js} +2 -2
  116. package/dist/{chunk-AQOCHSIR.js → chunk-OCJ5GZKV.js} +4 -4
  117. package/dist/{chunk-O477L4LV.js → chunk-OSPS5N2I.js} +1 -1
  118. package/dist/{chunk-5WEH43HH.js → chunk-PQHA6X6Y.js} +1 -1
  119. package/dist/{chunk-DJYIBHN5.js → chunk-PQQTSNXS.js} +3 -3
  120. package/dist/{chunk-LGFB67MY.js → chunk-Q3GLQDZI.js} +1 -1
  121. package/dist/{chunk-7GR7VBBW.js → chunk-QUC27OCW.js} +1 -1
  122. package/dist/{chunk-5NBOFYJG.js → chunk-QYNFWFFH.js} +4 -4
  123. package/dist/{chunk-RLDOG7DI.js → chunk-R4EZGQWL.js} +2516 -2289
  124. package/dist/{chunk-LYIUESG2.js → chunk-SLF7JRLG.js} +10 -10
  125. package/dist/{chunk-X7I6NLIA.js → chunk-T2EUNNUX.js} +5 -5
  126. package/dist/{chunk-VRWOLLKN.js → chunk-T4NFOOPB.js} +2 -2
  127. package/dist/{chunk-2YJSDJEH.js → chunk-TZPHTI5Q.js} +1 -1
  128. package/dist/{chunk-CQSFIQGN.js → chunk-UOZ5KUNN.js} +1 -1
  129. package/dist/{chunk-5R4R743Q.js → chunk-V2UVWYHO.js} +17 -15
  130. package/dist/{chunk-VKCZ3OGM.js → chunk-VD676VIC.js} +4 -4
  131. package/dist/{chunk-USLVSLQ5.js → chunk-VDCPKJUQ.js} +1 -1
  132. package/dist/{chunk-Y7NMPQXZ.js → chunk-VLX6AHTD.js} +8 -8
  133. package/dist/{chunk-ITPIBVSG.js → chunk-WMZTSHNX.js} +83 -1
  134. package/dist/{chunk-5U7WB4YG.js → chunk-WVBZ3QBR.js} +2 -2
  135. package/dist/{chunk-3EMZZZNU.js → chunk-X2RKYKTP.js} +1 -1
  136. package/dist/{chunk-XTIHYH64.js → chunk-YY2BCIAP.js} +2 -2
  137. package/dist/{chunk-Z6GHDYQI.js → chunk-Z2AEOVEZ.js} +30 -6
  138. package/dist/{chunk-PHTRZQR4.js → chunk-ZBDAFYDD.js} +4 -4
  139. package/dist/{chunk-E4CCKWZN.js → chunk-ZKFTDL4M.js} +1 -1
  140. package/dist/{co-activation-AIVMI5U2.js → co-activation-UNVL5JCP.js} +2 -2
  141. package/dist/{co-occurrence-L6QOQTJB.js → co-occurrence-ETAVWYVE.js} +2 -2
  142. package/dist/{code-context-index-DYHYVJHX.js → code-context-index-DCQYAYA2.js} +3 -2
  143. package/dist/{crdt-sync-YBMDPFNT.js → crdt-sync-AH7N6QOE.js} +1 -1
  144. package/dist/{crm-webhook-QO3ZESKR.js → crm-webhook-R6546T3Y.js} +2 -2
  145. package/dist/{cto-delegation-gate-UFPVFLIW.js → cto-delegation-gate-VB4TMZ3I.js} +8 -8
  146. package/dist/{daemon-orchestration-6XAISQ7B.js → daemon-orchestration-YAJKIL6Q.js} +12 -12
  147. package/dist/{db-backup-7UMCTS44.js → db-backup-2RG6VHT7.js} +11 -3
  148. package/dist/{dreaming-FJ75QVGZ.js → dreaming-WMBTSXGD.js} +9 -9
  149. package/dist/{exe-drift-OH3WV2ZQ.js → exe-drift-MQZGYHEN.js} +3 -3
  150. package/dist/{exe-export-UYKYNVBU.js → exe-export-E4BDIHOC.js} +5 -5
  151. package/dist/{exe-import-Q4FNSMLJ.js → exe-import-IWAD4HN6.js} +5 -5
  152. package/dist/{exe-key-22LOIIUX.js → exe-key-L2RV7XJX.js} +2 -2
  153. package/dist/{exe-snapshot-J7CL6QEL.js → exe-snapshot-IOGN4ARV.js} +12 -12
  154. package/dist/{fast-db-init-QXGL2PKQ.js → fast-db-init-GCY3F74H.js} +1 -1
  155. package/dist/gateway/index.js +8 -8
  156. package/dist/{git-staleness-YVWDCFIE.js → git-staleness-BQIFNZIU.js} +2 -2
  157. package/dist/{git-task-sweep-RRCOTTIS.js → git-task-sweep-GSKS6WKR.js} +9 -9
  158. package/dist/{global-procedures-FCGWAFES.js → global-procedures-3DJUA5OX.js} +3 -3
  159. package/dist/{graph-auto-extract-RUQC5IIS.js → graph-auto-extract-2I44WRDY.js} +2 -2
  160. package/dist/hooks/bug-report-worker.js +11 -11
  161. package/dist/hooks/codex-stop-task-finalizer.js +11 -11
  162. package/dist/hooks/commit-complete.js +11 -11
  163. package/dist/hooks/error-recall.js +6 -6
  164. package/dist/hooks/exe-heartbeat-hook.js +3 -3
  165. package/dist/hooks/ingest-worker.js +3 -2
  166. package/dist/hooks/ingest.js +6 -6
  167. package/dist/hooks/instructions-loaded.js +4 -4
  168. package/dist/hooks/manifest.json +20 -20
  169. package/dist/hooks/notification.js +4 -4
  170. package/dist/hooks/post-compact.js +10 -10
  171. package/dist/hooks/post-tool-combined.js +6 -6
  172. package/dist/hooks/pre-compact.js +14 -13
  173. package/dist/hooks/pre-tool-use.js +14 -14
  174. package/dist/hooks/prompt-submit.js +22 -22
  175. package/dist/hooks/session-end.js +19 -18
  176. package/dist/hooks/session-start.js +11 -11
  177. package/dist/hooks/stop.js +70 -17
  178. package/dist/hooks/subagent-stop.js +10 -10
  179. package/dist/hooks/summary-worker.js +17 -16
  180. package/dist/index.js +17 -17
  181. package/dist/{installer-7SMJC3SX.js → installer-6MQCAHUG.js} +5 -5
  182. package/dist/{installer-GFZVC43I.js → installer-TCMPFSSP.js} +5 -5
  183. package/dist/{installer-34DCTB5B.js → installer-ZY2BKTEO.js} +5 -5
  184. package/dist/lib/cloud-sync.js +4 -4
  185. package/dist/lib/consolidation.js +5 -5
  186. package/dist/lib/database.js +2 -2
  187. package/dist/lib/db-daemon-client.js +58 -13
  188. package/dist/lib/db.js +2 -2
  189. package/dist/lib/embedder.js +3 -2
  190. package/dist/lib/employee-templates.js +4 -4
  191. package/dist/lib/employees.js +2 -2
  192. package/dist/lib/exe-daemon-client.js +2 -1
  193. package/dist/lib/exe-daemon.js +266 -104
  194. package/dist/lib/hybrid-search.js +5 -5
  195. package/dist/lib/identity.js +2 -2
  196. package/dist/lib/messaging.js +9 -9
  197. package/dist/lib/reminders.js +3 -3
  198. package/dist/lib/schedules.js +5 -5
  199. package/dist/lib/session-registry.js +4 -4
  200. package/dist/lib/skill-learning.js +4 -4
  201. package/dist/lib/store.js +4 -4
  202. package/dist/lib/task-router.js +3 -3
  203. package/dist/lib/tasks.js +10 -10
  204. package/dist/lib/tmux-routing.js +8 -8
  205. package/dist/lib/token-spend.js +3 -3
  206. package/dist/mcp/register-tools.js +59 -56
  207. package/dist/mcp/server.js +60 -57
  208. package/dist/mcp/tools/complete-reminder.js +4 -4
  209. package/dist/mcp/tools/create-reminder.js +4 -4
  210. package/dist/mcp/tools/create-task.js +12 -12
  211. package/dist/mcp/tools/deactivate-behavior.js +5 -5
  212. package/dist/mcp/tools/list-reminders.js +4 -4
  213. package/dist/mcp/tools/list-tasks.js +12 -12
  214. package/dist/mcp/tools/send-message.js +11 -11
  215. package/dist/mcp/tools/update-task.js +11 -11
  216. package/dist/{mcp-http-config-MZMHKMJC.js → mcp-http-config-VUDZ3D5D.js} +3 -3
  217. package/dist/{memory-cards-3SFXU6IP.js → memory-cards-ZOOPC2WF.js} +2 -2
  218. package/dist/{memory-graph-extractor-T57YQQCW.js → memory-graph-extractor-RRQMUBMI.js} +3 -3
  219. package/dist/{memory-poisoning-defense-O53AHMTZ.js → memory-poisoning-defense-UQMNLG6H.js} +2 -2
  220. package/dist/{memory-queue-client-ITWQIFSD.js → memory-queue-client-TPQDAA4D.js} +3 -2
  221. package/dist/{memory-reflection-YPP2JC2S.js → memory-reflection-GSGXAGXV.js} +2 -2
  222. package/dist/{notifications-BETWD6EK.js → notifications-ZKGLZVCU.js} +8 -8
  223. package/dist/{orchestration-events-A5D52NXX.js → orchestration-events-7RMWC5SS.js} +3 -3
  224. package/dist/{orchestrator-X564XCWC.js → orchestrator-A6MX2OHA.js} +10 -10
  225. package/dist/{pipeline-router-RVHLL7UA.js → pipeline-router-6ZBYJD2U.js} +3 -3
  226. package/dist/{plan-limits-ANAVC6PM.js → plan-limits-4XH4A7IA.js} +3 -3
  227. package/dist/{project-boot-ENMCAL7G.js → project-boot-7ZEIDWUG.js} +3 -2
  228. package/dist/{projection-worker-O3HBG5QK.js → projection-worker-YKKBNQZT.js} +130 -51
  229. package/dist/{reranker-SRJL4IWB.js → reranker-CE3XG56J.js} +1 -1
  230. package/dist/{review-polling-5JTTHHEO.js → review-polling-PK3CY4NI.js} +9 -9
  231. package/dist/runtime/index.js +11 -11
  232. package/dist/{session-events-RCSYHQQ2.js → session-events-IYU6FYHH.js} +9 -9
  233. package/dist/{session-kill-telemetry-AL3H4ELS.js → session-kill-telemetry-G2VV4CAH.js} +3 -3
  234. package/dist/{session-scope-ZB4SR3AX.js → session-scope-DHTVH3D4.js} +8 -8
  235. package/dist/{setup-wizard-HXTADFXI.js → setup-wizard-IA5ISHQ2.js} +1 -1
  236. package/dist/{skill-refinement-TT4VDYYW.js → skill-refinement-6PBAFLWP.js} +2 -2
  237. package/dist/{stack-release-7WDKQOCO.js → stack-release-NW7MV3WV.js} +41 -11
  238. package/dist/{stack-update-F4CQWMGV.js → stack-update-5SM62R3O.js} +3 -1
  239. package/dist/{steward-gate-HSV67KLF.js → steward-gate-EQV6CZKY.js} +3 -3
  240. package/dist/support-outbox-SZVLHHZG.js +295 -0
  241. package/dist/{task-enforcement-A6AZTYAN.js → task-enforcement-2LS5DOXK.js} +8 -8
  242. package/dist/{task-scope-XKNAY5S7.js → task-scope-AKF3CSWO.js} +8 -8
  243. package/dist/{tasks-crud-F732BVOE.js → tasks-crud-KOIA5SAH.js} +8 -8
  244. package/dist/{tasks-notify-LJ65U7DF.js → tasks-notify-7ZTE4ZQM.js} +9 -9
  245. package/dist/{tasks-review-Y5F4HRAR.js → tasks-review-VMMMAK2Y.js} +8 -8
  246. package/dist/{telemetry-upload-HVYO6FL3.js → telemetry-upload-YLW4NAUF.js} +15 -8
  247. package/dist/{token-budget-VODGJYKX.js → token-budget-NA4OLFNP.js} +2 -2
  248. package/dist/{tool-capability-index-PZWWVABO.js → tool-capability-index-C73KVY5O.js} +1 -1
  249. package/dist/{tool-telemetry-5BSTF3P6.js → tool-telemetry-OVI5KL4S.js} +1 -1
  250. package/dist/tui/App.js +16 -16
  251. package/dist/{tui-data-EHJWRNRZ.js → tui-data-5NT24CC5.js} +8 -8
  252. package/dist/{worker-gate-4AS4K7G4.js → worker-gate-AQLJUQ5G.js} +1 -1
  253. package/dist/{workflow-engine-BXGNFNUW.js → workflow-engine-TRGGUNIZ.js} +2 -2
  254. package/dist/{worktree-3N5BPITS.js → worktree-NK7GZNEA.js} +4 -4
  255. package/dist/worktree-sweep-5XVZCH6A.js +18 -0
  256. package/package.json +3 -2
  257. package/release-notes.json +33 -33
  258. package/stack.release.json +48 -48
  259. package/dist/prediction-log-DOEOHDHS.js +0 -120
  260. package/dist/support-outbox-KEJ73I3F.js +0 -206
  261. /package/dist/{chunk-AWVDA2FL.js → chunk-2H3FVAN3.js} +0 -0
  262. /package/dist/{chunk-VPHOOQLR.js → chunk-3GHTBVZO.js} +0 -0
  263. /package/dist/{chunk-CCPCIW4Z.js → chunk-BBPRL2MP.js} +0 -0
  264. /package/dist/{chunk-Y2FVN7CX.js → chunk-EYLQRPHF.js} +0 -0
  265. /package/dist/{chunk-4S5TEBXD.js → chunk-H6QJT5O5.js} +0 -0
  266. /package/dist/{chunk-FCII2MMI.js → chunk-J5CAYOJU.js} +0 -0
  267. /package/dist/{chunk-LY2DYTDL.js → chunk-RFJESVEL.js} +0 -0
  268. /package/dist/{chunk-GBHQ5TXO.js → chunk-UOOCGJUE.js} +0 -0
  269. /package/dist/{chunk-X2E6W3DB.js → chunk-VJXVTH3Q.js} +0 -0
  270. /package/dist/{core-memory-WFP2L52F.js → core-memory-VZFTGOFE.js} +0 -0
  271. /package/dist/{entity-boost-RTYXAOWV.js → entity-boost-OAB2PZQP.js} +0 -0
  272. /package/dist/{message-queue-client-2CACBUA4.js → message-queue-client-YTKTHAYO.js} +0 -0
  273. /package/dist/{wiki-acl-MS7QLQCR.js → wiki-acl-UCPOROPR.js} +0 -0
@@ -1,4 +1,4 @@
1
- # exe-os CUSTOMER VPS stack — Hygo/customer example environment variables
1
+ # exe-os CUSTOMER VPS stack — example environment variables
2
2
  # Copy to .env before deployment and replace every CHANGEME_* value.
3
3
  # Values under # SET_MANUALLY must be provided by the operator.
4
4
 
@@ -18,17 +18,17 @@ GOTRUE_JWT_SECRET=CHANGEME_GOTRUE_JWT_SECRET
18
18
  GOTRUE_API_PORT=9999
19
19
  GOTRUE_SITE_URL=https://crm.CHANGEME_DOMAIN
20
20
  GOTRUE_EXTERNAL_URL=https://auth.CHANGEME_DOMAIN
21
- GOTRUE_DISABLE_SIGNUP=false
22
- GOTRUE_MAILER_AUTOCONFIRM=true
21
+ GOTRUE_DISABLE_SIGNUP=true
22
+ GOTRUE_MAILER_AUTOCONFIRM=false
23
23
 
24
24
  # --- CRM ---
25
- CRM_IMAGE_TAG=update.askexe.com/askexe/exe-crm:v0.9.3
25
+ CRM_IMAGE_TAG=update.askexe.com/askexe/exe-crm:v0.9.47
26
26
  CRM_SERVER_URL=https://CHANGEME_DOMAIN
27
27
  CRM_APP_SECRET=CHANGEME_CRM_APP_SECRET
28
28
  CRM_HOST_PORT=3000
29
29
 
30
30
  # --- Wiki ---
31
- WIKI_IMAGE_TAG=update.askexe.com/askexe/exe-wiki:v0.9.3
31
+ WIKI_IMAGE_TAG=update.askexe.com/askexe/exe-wiki:v0.9.21
32
32
  WIKI_DB_SCHEMA=wiki
33
33
  WIKI_VECTOR_DB=postgres
34
34
  WIKI_AUTH_TOKEN=CHANGEME_WIKI_AUTH_TOKEN
@@ -38,17 +38,17 @@ WIKI_SIG_SALT=CHANGEME_WIKI_SIG_SALT
38
38
  WIKI_HOST_PORT=3001
39
39
 
40
40
  # --- exe-os ---
41
- EXE_OS_IMAGE_TAG=update.askexe.com/askexe/exe-os:v0.9.9
41
+ EXE_OS_IMAGE_TAG=update.askexe.com/askexe/exe-os:v0.9.256
42
42
  EXED_MCP_TOKEN=CHANGEME_EXED_MCP_TOKEN
43
- EXED_DEVICE_ID=hygo-vps
44
- EXE_MCP_HOST_BIND=0.0.0.0
43
+ EXED_DEVICE_ID=CHANGEME_DEVICE_ID
44
+ EXE_MCP_HOST_BIND=127.0.0.1
45
45
  EXE_MCP_HOST_PORT=48739
46
46
  # VPS-only: enables cloud/local SQLite -> exe-db Postgres projection.
47
47
  # Keep false on laptops/dev boxes.
48
48
  EXE_CLOUD_SYNC_TO_POSTGRES=true
49
49
 
50
50
  # --- Gateway ---
51
- GATEWAY_IMAGE_TAG=update.askexe.com/askexe/exe-gateway:v0.9.3
51
+ GATEWAY_IMAGE_TAG=update.askexe.com/askexe/exe-gateway:v0.9.16
52
52
  EXE_GATEWAY_AUTH_TOKEN=CHANGEME_EXE_GATEWAY_AUTH_TOKEN
53
53
  EXE_GATEWAY_WS_RELAY_AUTH_TOKEN=CHANGEME_EXE_GATEWAY_WS_RELAY_AUTH_TOKEN
54
54
  EXE_GATEWAY_WHATSAPP_VERIFY_TOKEN=CHANGEME_EXE_GATEWAY_WHATSAPP_VERIFY_TOKEN
@@ -64,7 +64,7 @@ GATEWAY_HTTP_HOST_PORT=3100
64
64
  GATEWAY_WS_HOST_PORT=3101
65
65
 
66
66
  # --- Monitoring hub (PocketBase — local per-customer instance) ---
67
- MONITOR_HUB_IMAGE_TAG=update.askexe.com/askexe/exe-monitor-hub:v0.9.3
67
+ MONITOR_HUB_IMAGE_TAG=update.askexe.com/askexe/exe-monitor-hub:v0.9.4
68
68
  MONITOR_HUB_PORT=8090
69
69
  # Bootstrap superuser created on first start. Use your admin email + a strong password.
70
70
  # After first boot these values are no longer used (stored in pb_data volume).
@@ -74,7 +74,7 @@ MONITOR_HUB_ADMIN_EMAIL=CHANGEME_ADMIN_EMAIL
74
74
  MONITOR_HUB_ADMIN_PASSWORD=CHANGEME_MONITOR_HUB_ADMIN_PASSWORD
75
75
 
76
76
  # --- Monitoring agent (standard for managed customer VPSs) ---
77
- MONITOR_AGENT_IMAGE_TAG=update.askexe.com/askexe/exe-monitor-agent:v0.9.3
77
+ MONITOR_AGENT_IMAGE_TAG=update.askexe.com/askexe/exe-monitor-agent:v0.9.4
78
78
  # Reports to the local hub. Auto-populated by `exe-os stack-update` during bootstrap.
79
79
  MONITOR_HUB_URL=http://exe-monitor-hub:8090
80
80
  # TOKEN and KEY are written automatically by stack-update via /api/register-agent.
@@ -84,13 +84,13 @@ MONITOR_AGENT_KEY=CHANGEME_MONITOR_AGENT_KEY
84
84
  MONITOR_AGENT_LISTEN=:45876
85
85
 
86
86
  # --- AskExe central monitoring hub ---
87
- # Not included on customer VPSs. Hygo/customer deployments run exe-monitor-agent above, never the hub.
87
+ # Not included on customer VPSs. Customer deployments run exe-monitor-agent above, never the hub.
88
88
 
89
89
  # --- Cloudflare Tunnel ---
90
90
  # Token-based tunnel (recommended). Get your token:
91
91
  # 1. dash.cloudflare.com > Zero Trust > Networks > Tunnels > Create tunnel
92
92
  # 2. Choose "Cloudflared" connector, name your tunnel (e.g. "hygo-vps")
93
- # 3. Copy the token shown during setup
93
+ # 3. Copy the token shown during setup (e.g. "customer-vps")
94
94
  # Then configure public hostnames in the dashboard (no config.yml needed):
95
95
  # crm.<domain> → http://exe-crm:3000
96
96
  # wiki.<domain> → http://exe-wiki:3001
@@ -18,18 +18,18 @@ GOTRUE_JWT_SECRET=CHANGEME_GOTRUE_JWT_SECRET
18
18
  GOTRUE_API_PORT=9999
19
19
  GOTRUE_SITE_URL=https://crm.CHANGEME_DOMAIN
20
20
  GOTRUE_EXTERNAL_URL=https://auth.CHANGEME_DOMAIN
21
- GOTRUE_DISABLE_SIGNUP=false
22
- GOTRUE_MAILER_AUTOCONFIRM=true
21
+ GOTRUE_DISABLE_SIGNUP=true
22
+ GOTRUE_MAILER_AUTOCONFIRM=false
23
23
 
24
24
  # --- CRM ---
25
- CRM_IMAGE_TAG=ghcr.io/askexe/exe-crm:v0.9.4
25
+ CRM_IMAGE_TAG=ghcr.io/askexe/exe-crm:v0.9.47
26
26
  CRM_SERVER_URL=https://CHANGEME_DOMAIN
27
27
  CRM_APP_SECRET=CHANGEME_CRM_APP_SECRET
28
28
  EXE_CRM_ADMIN_TOKEN=CHANGEME_EXE_CRM_ADMIN_TOKEN
29
29
  CRM_HOST_PORT=3000
30
30
 
31
31
  # --- Wiki ---
32
- WIKI_IMAGE_TAG=ghcr.io/askexe/exe-wiki:v0.9.4
32
+ WIKI_IMAGE_TAG=ghcr.io/askexe/exe-wiki:v0.9.21
33
33
  WIKI_DB_SCHEMA=wiki
34
34
  WIKI_VECTOR_DB=postgres
35
35
  WIKI_AUTH_TOKEN=CHANGEME_WIKI_AUTH_TOKEN
@@ -40,17 +40,17 @@ WIKI_SIG_SALT=CHANGEME_WIKI_SIG_SALT
40
40
  WIKI_HOST_PORT=3001
41
41
 
42
42
  # --- exe-os ---
43
- EXE_OS_IMAGE_TAG=ghcr.io/askexe/exe-os:v0.9.154
43
+ EXE_OS_IMAGE_TAG=ghcr.io/askexe/exe-os:v0.9.256
44
44
  EXED_MCP_TOKEN=CHANGEME_EXED_MCP_TOKEN
45
45
  EXED_DEVICE_ID=vps-default
46
- EXE_MCP_HOST_BIND=0.0.0.0
46
+ EXE_MCP_HOST_BIND=127.0.0.1
47
47
  EXE_MCP_HOST_PORT=48739
48
48
  # VPS-only: enables cloud/local SQLite -> exe-db Postgres projection.
49
49
  # Keep false on laptops/dev boxes.
50
50
  EXE_CLOUD_SYNC_TO_POSTGRES=true
51
51
 
52
52
  # --- Gateway ---
53
- GATEWAY_IMAGE_TAG=ghcr.io/askexe/exe-gateway:v0.9.4
53
+ GATEWAY_IMAGE_TAG=ghcr.io/askexe/exe-gateway:v0.9.16
54
54
  EXE_GATEWAY_AUTH_TOKEN=CHANGEME_EXE_GATEWAY_AUTH_TOKEN
55
55
  EXE_GATEWAY_WS_RELAY_AUTH_TOKEN=CHANGEME_EXE_GATEWAY_WS_RELAY_AUTH_TOKEN
56
56
  EXE_GATEWAY_WHATSAPP_VERIFY_TOKEN=CHANGEME_EXE_GATEWAY_WHATSAPP_VERIFY_TOKEN
@@ -71,7 +71,7 @@ ERROR_REPORTING_ENABLED=true
71
71
  MONITOR_ERROR_URL=http://exe-monitor-hub:8090/api/exe-monitor/errors
72
72
 
73
73
  # --- ERP (optional — Exe ERP, Frappe/ERPNext fork) ---
74
- ERP_IMAGE_TAG=update.askexe.com/askexe/exe-erp:v0.2.0-final3
74
+ ERP_IMAGE_TAG=ghcr.io/askexe/exe-erp:v0.2.0-final3
75
75
  ERP_ADMIN_PASSWORD=CHANGEME_ERP_ADMIN_PASSWORD
76
76
  ERP_SITE_NAME=erp.askexe.com
77
77
  ERP_API_PORT=8069
@@ -138,8 +138,8 @@ services:
138
138
  GOTRUE_JWT_EXP: ${GOTRUE_JWT_EXP:-3600}
139
139
  GOTRUE_JWT_DEFAULT_GROUP_NAME: authenticated
140
140
  API_EXTERNAL_URL: ${GOTRUE_EXTERNAL_URL:-https://auth.askexe.com}
141
- GOTRUE_DISABLE_SIGNUP: ${GOTRUE_DISABLE_SIGNUP:-false}
142
- GOTRUE_MAILER_AUTOCONFIRM: ${GOTRUE_MAILER_AUTOCONFIRM:-true}
141
+ GOTRUE_DISABLE_SIGNUP: ${GOTRUE_DISABLE_SIGNUP:-true}
142
+ GOTRUE_MAILER_AUTOCONFIRM: ${GOTRUE_MAILER_AUTOCONFIRM:-false}
143
143
  GOTRUE_SMTP_HOST: ${SMTP_HOST:-}
144
144
  GOTRUE_SMTP_PORT: ${SMTP_PORT:-587}
145
145
  GOTRUE_SMTP_USER: ${SMTP_USER:-}
@@ -195,7 +195,7 @@ services:
195
195
  # ------------------------------------------------------------------
196
196
 
197
197
  exe-crm:
198
- image: ${CRM_IMAGE_TAG:-ghcr.io/askexe/exe-crm:v0.9.4}
198
+ image: ${CRM_IMAGE_TAG:-ghcr.io/askexe/exe-crm:v0.9.47}
199
199
  container_name: exe-crm
200
200
  restart: unless-stopped
201
201
  # Auto-migrate on boot: run database init before starting the app.
@@ -248,7 +248,7 @@ services:
248
248
  options: { max-size: "10m", max-file: "3" }
249
249
 
250
250
  exe-crm-worker:
251
- image: ${CRM_IMAGE_TAG:-ghcr.io/askexe/exe-crm:v0.9.4}
251
+ image: ${CRM_IMAGE_TAG:-ghcr.io/askexe/exe-crm:v0.9.47}
252
252
  container_name: exe-crm-worker
253
253
  restart: unless-stopped
254
254
  command: ["yarn", "worker:prod"]
@@ -294,7 +294,7 @@ services:
294
294
  options: { max-size: "10m", max-file: "3" }
295
295
 
296
296
  exe-wiki:
297
- image: ${WIKI_IMAGE_TAG:-ghcr.io/askexe/exe-wiki:v0.9.5}
297
+ image: ${WIKI_IMAGE_TAG:-ghcr.io/askexe/exe-wiki:v0.9.21}
298
298
  container_name: exe-wiki
299
299
  restart: unless-stopped
300
300
  # Wiki uses Prisma — runs migrate on boot via built-in entrypoint.
@@ -342,7 +342,7 @@ services:
342
342
  options: { max-size: "10m", max-file: "3" }
343
343
 
344
344
  exe-os:
345
- image: ${EXE_OS_IMAGE_TAG:-${EXED_IMAGE_TAG:-ghcr.io/askexe/exe-os:v0.9.157}}
345
+ image: ${EXE_OS_IMAGE_TAG:-${EXED_IMAGE_TAG:-ghcr.io/askexe/exe-os:v0.9.255}}
346
346
  container_name: exe-os
347
347
  restart: unless-stopped
348
348
  env_file:
@@ -355,7 +355,7 @@ services:
355
355
  EXED_MCP_TOKEN: ${EXED_MCP_TOKEN:?EXED_MCP_TOKEN is required}
356
356
  EXE_DAEMON_TOKEN: ${EXED_MCP_TOKEN:?EXED_MCP_TOKEN is required}
357
357
  EXE_MCP_HOST: "0.0.0.0"
358
- EXE_MCP_ALLOW_REMOTE: "1"
358
+ EXE_MCP_ALLOW_REMOTE: "${EXE_MCP_ALLOW_REMOTE:-0}"
359
359
  EXE_MCP_PORT: "48739"
360
360
  EXED_DEVICE_ID: ${EXED_DEVICE_ID:-vps-default}
361
361
  EXE_LICENSE_KEY: ${EXE_LICENSE_KEY:?EXE_LICENSE_KEY is required — purchase at https://askexe.com}
@@ -369,7 +369,7 @@ services:
369
369
  - exe_os_data:/home/exed/.exe-os
370
370
  ports:
371
371
  - "${EXED_HEALTH_HOST_BIND:-127.0.0.1}:${EXED_HOST_PORT:-8765}:8765"
372
- - "${EXE_MCP_HOST_BIND:-0.0.0.0}:${EXE_MCP_HOST_PORT:-48739}:48739"
372
+ - "${EXE_MCP_HOST_BIND:-127.0.0.1}:${EXE_MCP_HOST_PORT:-48739}:48739"
373
373
  networks:
374
374
  backend:
375
375
  ipv4_address: 10.42.0.22
@@ -387,7 +387,7 @@ services:
387
387
  options: { max-size: "10m", max-file: "3" }
388
388
 
389
389
  exe-gateway:
390
- image: ${GATEWAY_IMAGE_TAG:-ghcr.io/askexe/exe-gateway:v0.9.4}
390
+ image: ${GATEWAY_IMAGE_TAG:-ghcr.io/askexe/exe-gateway:v0.9.16}
391
391
  container_name: exe-gateway
392
392
  restart: unless-stopped
393
393
  # Gateway needs 45s to flush outbound queues + disconnect Baileys adapters.
@@ -489,7 +489,7 @@ services:
489
489
  # AskExe control-plane only — not deployed on customer VPSs.
490
490
  # ------------------------------------------------------------------
491
491
  exe-update:
492
- image: ${EXE_OS_IMAGE_TAG:-${EXED_IMAGE_TAG:-ghcr.io/askexe/exe-os:v0.9.157}}
492
+ image: ${EXE_OS_IMAGE_TAG:-${EXED_IMAGE_TAG:-ghcr.io/askexe/exe-os:v0.9.255}}
493
493
  container_name: exe-update
494
494
  profiles: ["askexe-control-plane"]
495
495
  restart: unless-stopped
@@ -538,7 +538,7 @@ services:
538
538
  # ------------------------------------------------------------------
539
539
 
540
540
  cloudflared:
541
- image: cloudflare/cloudflared:latest
541
+ image: cloudflare/cloudflared@sha256:ba461b8aa9c042156dbd39c38657fe7431bafa063220eab8d5330a523863da9f
542
542
  container_name: cloudflared
543
543
  restart: unless-stopped
544
544
  # Token mode: `tunnel run --token <TOKEN>` — no local credentials file needed.
@@ -578,7 +578,7 @@ services:
578
578
  # 4 services: gunicorn API, websocket, RQ worker, scheduler.
579
579
 
580
580
  exe-erp:
581
- image: ${ERP_IMAGE_TAG:-update.askexe.com/askexe/exe-erp:v0.2.0-final3}
581
+ image: ${ERP_IMAGE_TAG:-ghcr.io/askexe/exe-erp:v0.2.0-final3}
582
582
  container_name: exe-erp
583
583
  restart: unless-stopped
584
584
  entrypoint: ["/usr/local/bin/entrypoint.sh"]
@@ -609,7 +609,7 @@ services:
609
609
  DB_NAME: exe_erp
610
610
  DB_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}
611
611
  POSTGRES_USER: ${POSTGRES_USER:-exe}
612
- ADMIN_PASSWORD: ${ERP_ADMIN_PASSWORD:-admin}
612
+ ADMIN_PASSWORD: ${ERP_ADMIN_PASSWORD:?ERP_ADMIN_PASSWORD is required}
613
613
  REDIS_CACHE: redis://:${REDIS_PASSWORD:?REDIS_PASSWORD is required}@redis:6379/3
614
614
  REDIS_QUEUE: redis://:${REDIS_PASSWORD:?REDIS_PASSWORD is required}@redis:6379/4
615
615
  REDIS_SOCKETIO: redis://:${REDIS_PASSWORD:?REDIS_PASSWORD is required}@redis:6379/5
@@ -625,7 +625,7 @@ services:
625
625
  # Sentry (optional)
626
626
  FRAPPE_SENTRY_DSN: ${ERP_SENTRY_DSN:-}
627
627
  ports:
628
- - "${ERP_API_PORT:-8069}:8000"
628
+ - "127.0.0.1:${ERP_API_PORT:-8069}:8000"
629
629
  volumes:
630
630
  - erp_sites:/home/frappe/frappe-bench/sites
631
631
  networks:
@@ -648,7 +648,7 @@ services:
648
648
  options: { max-size: "10m", max-file: "3" }
649
649
 
650
650
  exe-erp-websocket:
651
- image: ${ERP_IMAGE_TAG:-update.askexe.com/askexe/exe-erp:v0.2.0-final3}
651
+ image: ${ERP_IMAGE_TAG:-ghcr.io/askexe/exe-erp:v0.2.0-final3}
652
652
  container_name: exe-erp-websocket
653
653
  restart: unless-stopped
654
654
  entrypoint: []
@@ -663,7 +663,7 @@ services:
663
663
  REDIS_SOCKETIO: redis://:${REDIS_PASSWORD:?REDIS_PASSWORD is required}@redis:6379/5
664
664
  SITE_NAME: ${ERP_SITE_NAME:-erp.askexe.com}
665
665
  ports:
666
- - "${ERP_WS_PORT:-9069}:9000"
666
+ - "127.0.0.1:${ERP_WS_PORT:-9069}:9000"
667
667
  volumes:
668
668
  - erp_sites:/home/frappe/frappe-bench/sites
669
669
  networks:
@@ -678,7 +678,7 @@ services:
678
678
  options: { max-size: "10m", max-file: "3" }
679
679
 
680
680
  exe-erp-queue:
681
- image: ${ERP_IMAGE_TAG:-update.askexe.com/askexe/exe-erp:v0.2.0-final3}
681
+ image: ${ERP_IMAGE_TAG:-ghcr.io/askexe/exe-erp:v0.2.0-final3}
682
682
  container_name: exe-erp-queue
683
683
  restart: unless-stopped
684
684
  entrypoint: []
@@ -713,7 +713,7 @@ services:
713
713
  options: { max-size: "10m", max-file: "3" }
714
714
 
715
715
  exe-erp-scheduler:
716
- image: ${ERP_IMAGE_TAG:-update.askexe.com/askexe/exe-erp:v0.2.0-final3}
716
+ image: ${ERP_IMAGE_TAG:-ghcr.io/askexe/exe-erp:v0.2.0-final3}
717
717
  container_name: exe-erp-scheduler
718
718
  restart: unless-stopped
719
719
  entrypoint: []
@@ -1,27 +1,31 @@
1
1
  import { randomBytes } from "node:crypto";
2
2
  const REGISTRY = "ghcr.io/askexe";
3
3
 
4
- // v0.9.x is the private/customer pilot stack line. Component repos keep their
5
- // own package semver internally, but customer deployments use the tested stack
6
- // image alias so one stack manifest can pin the whole release. exe-os/exed is
7
- // the exception because the runtime package version is the orchestrator release.
8
- const STACK_IMAGE_TAG = "v0.9.4";
9
- const EXED_RELEASE_TAG = "v0.9.154";
4
+ // Keep these defaults in sync with deploy/stack-manifests/v0.9.json latest.
5
+ // deploy/compose/.env.example intentionally uses GHCR fallbacks so local
6
+ // simulation can run without private update.askexe.com registry credentials.
7
+ const CRM_RELEASE_TAG = "v0.9.47";
8
+ const WIKI_RELEASE_TAG = "v0.9.21";
9
+ const EXED_RELEASE_TAG = "v0.9.256";
10
+ const GATEWAY_RELEASE_TAG = "v0.9.16";
11
+ const MONITOR_RELEASE_TAG = "v0.9.4";
12
+ const ERP_RELEASE_TAG = "v0.2.0-final3";
10
13
 
11
14
  const POSTGRES_USER = "exe";
12
15
  const POSTGRES_DB = "exedb";
13
16
  const CLICKHOUSE_DB = "default";
14
17
  const CLICKHOUSE_USER = "exe";
15
- export const CRM_IMAGE_TAG = `${REGISTRY}/exe-crm:${STACK_IMAGE_TAG}`;
18
+ export const CRM_IMAGE_TAG = `${REGISTRY}/exe-crm:${CRM_RELEASE_TAG}`;
16
19
  const CRM_HOST_PORT = "3000";
17
- export const WIKI_IMAGE_TAG = `${REGISTRY}/exe-wiki:${STACK_IMAGE_TAG}`;
20
+ export const WIKI_IMAGE_TAG = `${REGISTRY}/exe-wiki:${WIKI_RELEASE_TAG}`;
18
21
  const WIKI_DB_SCHEMA = "wiki";
19
22
  const WIKI_VECTOR_DB = "postgres";
20
23
  const WIKI_HOST_PORT = "3001";
21
24
  export const EXE_OS_IMAGE_TAG = `${REGISTRY}/exe-os:${EXED_RELEASE_TAG}`;
22
- export const GATEWAY_IMAGE_TAG = `${REGISTRY}/exe-gateway:${STACK_IMAGE_TAG}`;
23
- export const MONITOR_AGENT_IMAGE_TAG = `${REGISTRY}/exe-monitor-agent:${STACK_IMAGE_TAG}`;
24
- export const MONITOR_HUB_IMAGE_TAG = `${REGISTRY}/exe-monitor-hub:${STACK_IMAGE_TAG}`;
25
+ export const GATEWAY_IMAGE_TAG = `${REGISTRY}/exe-gateway:${GATEWAY_RELEASE_TAG}`;
26
+ export const MONITOR_AGENT_IMAGE_TAG = `${REGISTRY}/exe-monitor-agent:${MONITOR_RELEASE_TAG}`;
27
+ export const MONITOR_HUB_IMAGE_TAG = `${REGISTRY}/exe-monitor-hub:${MONITOR_RELEASE_TAG}`;
28
+ export const ERP_IMAGE_TAG = `${REGISTRY}/exe-erp:${ERP_RELEASE_TAG}`;
25
29
  const GATEWAY_HTTP_HOST_PORT = "3100";
26
30
  const GATEWAY_WS_HOST_PORT = "3101";
27
31
  const RANDOM_SECRET_16 = 16;
@@ -33,7 +37,7 @@ const EXAMPLE_LICENSE_KEY = "CHANGEME_EXE_LICENSE_KEY";
33
37
  const DEFAULT_API_ROUTER_URL = "https://gateway.askexe.com";
34
38
  const DEFAULT_MONITOR_HUB_URL = "http://exe-monitor-hub:8090";
35
39
  const DEFAULT_MONITOR_AGENT_LISTEN = ":45876";
36
- const DEFAULT_EXE_MCP_HOST_BIND = "0.0.0.0";
40
+ const DEFAULT_EXE_MCP_HOST_BIND = "127.0.0.1";
37
41
  const DEFAULT_EXE_MCP_HOST_PORT = "48739";
38
42
 
39
43
  export interface GenerateEnvOptions {
@@ -64,8 +68,8 @@ export function generateEnv(options: GenerateEnvOptions): string {
64
68
  "GOTRUE_API_PORT=9999",
65
69
  `GOTRUE_SITE_URL=https://crm.${normalizedDomain}`,
66
70
  `GOTRUE_EXTERNAL_URL=https://auth.${normalizedDomain}`,
67
- "GOTRUE_DISABLE_SIGNUP=false",
68
- "GOTRUE_MAILER_AUTOCONFIRM=true",
71
+ "GOTRUE_DISABLE_SIGNUP=true",
72
+ "GOTRUE_MAILER_AUTOCONFIRM=false",
69
73
  "",
70
74
  "# --- CRM ---",
71
75
  `CRM_IMAGE_TAG=${CRM_IMAGE_TAG}`,
@@ -116,7 +120,7 @@ export function generateEnv(options: GenerateEnvOptions): string {
116
120
  "MONITOR_ERROR_URL=http://exe-monitor-hub:8090/api/exe-monitor/errors",
117
121
  "",
118
122
  "# --- ERP (optional — Exe ERP, Frappe/ERPNext fork) ---",
119
- "ERP_IMAGE_TAG=update.askexe.com/askexe/exe-erp:v0.2.0-final3",
123
+ `ERP_IMAGE_TAG=${ERP_IMAGE_TAG}`,
120
124
  `ERP_ADMIN_PASSWORD=${randomSecret(RANDOM_SECRET_32)}`,
121
125
  `ERP_SITE_NAME=erp.${normalizedDomain}`,
122
126
  "ERP_API_PORT=8069",
@@ -181,8 +185,8 @@ export function generateExampleEnv(): string {
181
185
  "GOTRUE_API_PORT=9999",
182
186
  "GOTRUE_SITE_URL=https://crm.CHANGEME_DOMAIN",
183
187
  "GOTRUE_EXTERNAL_URL=https://auth.CHANGEME_DOMAIN",
184
- "GOTRUE_DISABLE_SIGNUP=false",
185
- "GOTRUE_MAILER_AUTOCONFIRM=true",
188
+ "GOTRUE_DISABLE_SIGNUP=true",
189
+ "GOTRUE_MAILER_AUTOCONFIRM=false",
186
190
  "",
187
191
  "# --- CRM ---",
188
192
  `CRM_IMAGE_TAG=${CRM_IMAGE_TAG}`,
@@ -234,7 +238,7 @@ export function generateExampleEnv(): string {
234
238
  "MONITOR_ERROR_URL=http://exe-monitor-hub:8090/api/exe-monitor/errors",
235
239
  "",
236
240
  "# --- ERP (optional — Exe ERP, Frappe/ERPNext fork) ---",
237
- "ERP_IMAGE_TAG=update.askexe.com/askexe/exe-erp:v0.2.0-final3",
241
+ `ERP_IMAGE_TAG=${ERP_IMAGE_TAG}`,
238
242
  "ERP_ADMIN_PASSWORD=CHANGEME_ERP_ADMIN_PASSWORD",
239
243
  "ERP_SITE_NAME=erp.askexe.com",
240
244
  "ERP_API_PORT=8069",
@@ -73,53 +73,254 @@ CREATE TABLE IF NOT EXISTS raw.raw_events (
73
73
  timestamp TIMESTAMPTZ DEFAULT now(),
74
74
  created_at TIMESTAMPTZ DEFAULT now(),
75
75
  processed_at TIMESTAMPTZ,
76
+ failed_at TIMESTAMPTZ,
77
+ retry_count INT NOT NULL DEFAULT 0,
76
78
  error TEXT,
77
79
  projections JSONB DEFAULT '{}'::jsonb
78
80
  );
79
81
 
80
82
  CREATE INDEX IF NOT EXISTS idx_raw_events_unprocessed ON raw.raw_events (created_at) WHERE processed_at IS NULL;
83
+ CREATE INDEX IF NOT EXISTS idx_raw_events_retryable ON raw.raw_events (failed_at) WHERE processed_at IS NULL AND failed_at IS NOT NULL AND retry_count < 5;
81
84
  CREATE UNIQUE INDEX IF NOT EXISTS uq_raw_events_dedup ON raw.raw_events (source, source_id, event_type);
82
85
 
86
+ -- ---------------------------------------------------------------------------
87
+ -- Graph schema — Company Brain memory + GraphRAG projection targets.
88
+ -- These tables are written by projection-worker.ts and Graph→PG sync. They
89
+ -- must exist on fresh stack boot before workers start projecting raw events.
90
+ -- ---------------------------------------------------------------------------
91
+
92
+ CREATE TABLE IF NOT EXISTS graph.memory_records (
93
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
94
+ agent_id TEXT NOT NULL DEFAULT 'system',
95
+ agent_role TEXT NOT NULL DEFAULT 'ingest',
96
+ session_id TEXT NOT NULL DEFAULT 'projection-worker',
97
+ timestamp TIMESTAMPTZ NOT NULL DEFAULT now(),
98
+ tool_name TEXT NOT NULL DEFAULT 'projection_worker',
99
+ project_name TEXT NOT NULL DEFAULT 'exe-os',
100
+ has_error BOOLEAN NOT NULL DEFAULT false,
101
+ raw_text TEXT NOT NULL,
102
+ vector vector(1024),
103
+ version INTEGER NOT NULL DEFAULT 0,
104
+ task_id TEXT,
105
+ intent TEXT,
106
+ outcome TEXT,
107
+ domain TEXT,
108
+ trajectory TEXT,
109
+ memory_type TEXT NOT NULL DEFAULT 'raw',
110
+ source_type TEXT NOT NULL DEFAULT 'unknown',
111
+ importance INTEGER NOT NULL DEFAULT 5,
112
+ status TEXT NOT NULL DEFAULT 'active',
113
+ metadata JSONB NOT NULL DEFAULT '{}'::jsonb,
114
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
115
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
116
+ );
117
+ CREATE INDEX IF NOT EXISTS idx_graph_memory_records_agent ON graph.memory_records(agent_id);
118
+ CREATE INDEX IF NOT EXISTS idx_graph_memory_records_project_time ON graph.memory_records(project_name, timestamp DESC);
119
+ CREATE INDEX IF NOT EXISTS idx_graph_memory_records_status ON graph.memory_records(status);
120
+ CREATE INDEX IF NOT EXISTS idx_graph_memory_records_source_type ON graph.memory_records(source_type);
121
+
122
+ CREATE TABLE IF NOT EXISTS graph.entities (
123
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
124
+ name TEXT NOT NULL,
125
+ type TEXT NOT NULL,
126
+ first_seen TIMESTAMPTZ NOT NULL DEFAULT now(),
127
+ last_seen TIMESTAMPTZ NOT NULL DEFAULT now(),
128
+ properties JSONB NOT NULL DEFAULT '{}'::jsonb,
129
+ UNIQUE(name, type)
130
+ );
131
+ CREATE INDEX IF NOT EXISTS idx_graph_entities_type ON graph.entities(type);
132
+ CREATE INDEX IF NOT EXISTS idx_graph_entities_last_seen ON graph.entities(last_seen DESC);
133
+
134
+ CREATE TABLE IF NOT EXISTS graph.relationships (
135
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
136
+ source_entity_id UUID NOT NULL REFERENCES graph.entities(id) ON DELETE CASCADE,
137
+ target_entity_id UUID NOT NULL REFERENCES graph.entities(id) ON DELETE CASCADE,
138
+ type TEXT NOT NULL,
139
+ weight DOUBLE PRECISION NOT NULL DEFAULT 1.0,
140
+ confidence DOUBLE PRECISION NOT NULL DEFAULT 0.8,
141
+ confidence_label TEXT,
142
+ timestamp TIMESTAMPTZ NOT NULL DEFAULT now(),
143
+ properties JSONB NOT NULL DEFAULT '{}'::jsonb,
144
+ UNIQUE(source_entity_id, target_entity_id, type)
145
+ );
146
+ CREATE INDEX IF NOT EXISTS idx_graph_relationships_source ON graph.relationships(source_entity_id);
147
+ CREATE INDEX IF NOT EXISTS idx_graph_relationships_target ON graph.relationships(target_entity_id);
148
+ CREATE INDEX IF NOT EXISTS idx_graph_relationships_type ON graph.relationships(type);
149
+
150
+ CREATE TABLE IF NOT EXISTS graph.entity_memories (
151
+ entity_id UUID NOT NULL REFERENCES graph.entities(id) ON DELETE CASCADE,
152
+ memory_id UUID NOT NULL REFERENCES graph.memory_records(id) ON DELETE CASCADE,
153
+ PRIMARY KEY(entity_id, memory_id)
154
+ );
155
+ CREATE INDEX IF NOT EXISTS idx_graph_entity_memories_memory ON graph.entity_memories(memory_id);
156
+
157
+ CREATE TABLE IF NOT EXISTS graph.agent_sessions (
158
+ id TEXT PRIMARY KEY,
159
+ agent_id TEXT NOT NULL,
160
+ project_name TEXT,
161
+ started_at TIMESTAMP(3) NOT NULL,
162
+ last_event_at TIMESTAMP(3) NOT NULL,
163
+ event_count INTEGER NOT NULL DEFAULT 0,
164
+ properties JSONB NOT NULL DEFAULT '{}'::jsonb
165
+ );
166
+ CREATE INDEX IF NOT EXISTS idx_agent_sessions_agent_time ON graph.agent_sessions(agent_id, started_at);
167
+
168
+ CREATE TABLE IF NOT EXISTS graph.agent_goals (
169
+ id TEXT PRIMARY KEY,
170
+ statement TEXT NOT NULL,
171
+ owner_agent_id TEXT,
172
+ project_name TEXT,
173
+ status TEXT NOT NULL DEFAULT 'open',
174
+ priority INTEGER NOT NULL DEFAULT 5,
175
+ success_criteria TEXT,
176
+ parent_goal_id TEXT,
177
+ due_at TIMESTAMP(3),
178
+ achieved_at TIMESTAMP(3),
179
+ supersedes_id TEXT,
180
+ created_at TIMESTAMP(3) NOT NULL,
181
+ updated_at TIMESTAMP(3) NOT NULL,
182
+ source_memory_id TEXT
183
+ );
184
+ CREATE INDEX IF NOT EXISTS idx_agent_goals_project_status ON graph.agent_goals(project_name, status, priority);
185
+
186
+ CREATE TABLE IF NOT EXISTS graph.agent_events (
187
+ id TEXT PRIMARY KEY,
188
+ event_type TEXT NOT NULL,
189
+ occurred_at TIMESTAMP(3) NOT NULL,
190
+ sequence_index INTEGER NOT NULL,
191
+ actor_agent_id TEXT,
192
+ agent_role TEXT,
193
+ project_name TEXT,
194
+ session_id TEXT,
195
+ task_id TEXT,
196
+ goal_id TEXT,
197
+ parent_event_id TEXT,
198
+ intention TEXT,
199
+ outcome TEXT,
200
+ evidence_memory_id TEXT,
201
+ impact TEXT,
202
+ payload JSONB NOT NULL DEFAULT '{}'::jsonb,
203
+ created_at TIMESTAMP(3) NOT NULL
204
+ );
205
+ CREATE INDEX IF NOT EXISTS idx_agent_events_time ON graph.agent_events(occurred_at, sequence_index);
206
+ CREATE INDEX IF NOT EXISTS idx_agent_events_session_seq ON graph.agent_events(session_id, sequence_index);
207
+ CREATE INDEX IF NOT EXISTS idx_agent_events_goal_time ON graph.agent_events(goal_id, occurred_at);
208
+ CREATE INDEX IF NOT EXISTS idx_agent_events_memory ON graph.agent_events(evidence_memory_id);
209
+
210
+ CREATE TABLE IF NOT EXISTS graph.agent_goal_links (
211
+ id TEXT PRIMARY KEY,
212
+ goal_id TEXT NOT NULL,
213
+ link_type TEXT NOT NULL,
214
+ target_id TEXT NOT NULL,
215
+ target_type TEXT NOT NULL,
216
+ created_at TIMESTAMP(3) NOT NULL
217
+ );
218
+ CREATE INDEX IF NOT EXISTS idx_agent_goal_links_goal ON graph.agent_goal_links(goal_id, target_type);
219
+
220
+ CREATE TABLE IF NOT EXISTS graph.agent_semantic_labels (
221
+ id TEXT PRIMARY KEY,
222
+ source_memory_id TEXT NOT NULL,
223
+ event_id TEXT,
224
+ labeler TEXT NOT NULL,
225
+ schema_version INTEGER NOT NULL DEFAULT 1,
226
+ confidence DOUBLE PRECISION NOT NULL DEFAULT 0,
227
+ labels JSONB NOT NULL,
228
+ created_at TIMESTAMP(3) NOT NULL,
229
+ updated_at TIMESTAMP(3) NOT NULL
230
+ );
231
+ CREATE INDEX IF NOT EXISTS idx_agent_semantic_labels_memory ON graph.agent_semantic_labels(source_memory_id, labeler);
232
+ CREATE INDEX IF NOT EXISTS idx_agent_semantic_labels_event ON graph.agent_semantic_labels(event_id);
233
+
234
+ CREATE TABLE IF NOT EXISTS graph.agent_reflection_checkpoints (
235
+ id TEXT PRIMARY KEY,
236
+ project_name TEXT,
237
+ session_id TEXT,
238
+ window_start_at TIMESTAMP(3) NOT NULL,
239
+ window_end_at TIMESTAMP(3) NOT NULL,
240
+ event_count INTEGER NOT NULL DEFAULT 0,
241
+ goal_count INTEGER NOT NULL DEFAULT 0,
242
+ success_count INTEGER NOT NULL DEFAULT 0,
243
+ failure_count INTEGER NOT NULL DEFAULT 0,
244
+ risk_count INTEGER NOT NULL DEFAULT 0,
245
+ summary TEXT NOT NULL,
246
+ learnings JSONB NOT NULL DEFAULT '[]'::jsonb,
247
+ next_actions JSONB NOT NULL DEFAULT '[]'::jsonb,
248
+ evidence_event_ids JSONB NOT NULL DEFAULT '[]'::jsonb,
249
+ confidence DOUBLE PRECISION NOT NULL DEFAULT 0,
250
+ created_at TIMESTAMP(3) NOT NULL
251
+ );
252
+ CREATE INDEX IF NOT EXISTS idx_agent_reflection_project_time ON graph.agent_reflection_checkpoints(project_name, window_end_at);
253
+ CREATE INDEX IF NOT EXISTS idx_agent_reflection_session_time ON graph.agent_reflection_checkpoints(session_id, window_end_at);
254
+
255
+ -- Minimal wiki projection tables used by projection-worker.ts before the
256
+ -- full exe-wiki service has accepted API-ingested documents.
257
+ CREATE TABLE IF NOT EXISTS wiki.workspaces (
258
+ id SERIAL PRIMARY KEY,
259
+ name TEXT NOT NULL,
260
+ slug TEXT NOT NULL UNIQUE,
261
+ chat_mode TEXT NOT NULL DEFAULT 'chat',
262
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
263
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
264
+ );
265
+
266
+ CREATE TABLE IF NOT EXISTS wiki.workspace_documents (
267
+ id BIGSERIAL PRIMARY KEY,
268
+ doc_id TEXT NOT NULL UNIQUE,
269
+ filename TEXT NOT NULL,
270
+ docpath TEXT NOT NULL,
271
+ workspace_id INTEGER NOT NULL REFERENCES wiki.workspaces(id) ON DELETE CASCADE,
272
+ metadata JSONB NOT NULL DEFAULT '{}'::jsonb,
273
+ pinned BOOLEAN NOT NULL DEFAULT false,
274
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
275
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
276
+ );
277
+ CREATE INDEX IF NOT EXISTS idx_wiki_workspace_documents_workspace ON wiki.workspace_documents(workspace_id);
278
+ CREATE INDEX IF NOT EXISTS idx_wiki_workspace_documents_docpath ON wiki.workspace_documents(docpath);
279
+
83
280
  -- Filtered schema — curated, deduplicated, entity-resolved data.
84
281
  -- Projected from raw.raw_events by daemon workers.
85
282
  CREATE SCHEMA IF NOT EXISTS filtered;
86
283
 
87
284
  -- Deduplicated person records from WhatsApp + CRM + manual entry
285
+ -- Column names match projection-worker.ts ensureFilteredSchema (source of truth)
88
286
  CREATE TABLE IF NOT EXISTS filtered.contacts (
89
287
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
90
- phone TEXT UNIQUE,
288
+ name TEXT,
289
+ phone TEXT,
91
290
  email TEXT,
92
- display_name TEXT NOT NULL,
93
- source TEXT NOT NULL DEFAULT 'whatsapp',
94
- source_id TEXT,
291
+ platform TEXT NOT NULL DEFAULT 'whatsapp',
292
+ platform_id TEXT,
95
293
  metadata JSONB DEFAULT '{}'::jsonb,
96
- first_seen_at TIMESTAMPTZ DEFAULT now(),
97
- last_seen_at TIMESTAMPTZ DEFAULT now(),
98
- created_at TIMESTAMPTZ DEFAULT now(),
99
- updated_at TIMESTAMPTZ DEFAULT now()
294
+ first_seen TIMESTAMPTZ NOT NULL DEFAULT now(),
295
+ last_seen TIMESTAMPTZ NOT NULL DEFAULT now(),
296
+ UNIQUE(platform, platform_id)
100
297
  );
101
298
 
102
299
  CREATE INDEX IF NOT EXISTS idx_filtered_contacts_phone ON filtered.contacts (phone);
103
- CREATE INDEX IF NOT EXISTS idx_filtered_contacts_source ON filtered.contacts (source);
300
+ CREATE INDEX IF NOT EXISTS idx_filtered_contacts_platform ON filtered.contacts (platform);
104
301
 
105
302
  -- Normalized chat threads across platforms
303
+ -- Column names match projection-worker.ts ensureFilteredSchema (source of truth)
106
304
  CREATE TABLE IF NOT EXISTS filtered.conversations (
107
305
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
108
306
  contact_id UUID REFERENCES filtered.contacts(id),
109
307
  platform TEXT NOT NULL DEFAULT 'whatsapp',
110
- remote_jid TEXT,
111
- direction TEXT NOT NULL CHECK (direction IN ('inbound', 'outbound')),
112
- content TEXT,
113
- media_type TEXT,
114
- timestamp TIMESTAMPTZ NOT NULL,
115
- raw_event_id UUID,
116
- created_at TIMESTAMPTZ DEFAULT now()
308
+ thread_id TEXT,
309
+ direction TEXT NOT NULL DEFAULT 'inbound',
310
+ content TEXT NOT NULL,
311
+ message_type TEXT NOT NULL DEFAULT 'text',
312
+ metadata JSONB DEFAULT '{}'::jsonb,
313
+ sent_at TIMESTAMPTZ NOT NULL DEFAULT now(),
314
+ source_ref TEXT,
315
+ UNIQUE(platform, source_ref)
117
316
  );
118
317
 
119
- CREATE INDEX IF NOT EXISTS idx_filtered_conversations_contact ON filtered.conversations (contact_id, timestamp DESC);
120
- CREATE INDEX IF NOT EXISTS idx_filtered_conversations_ts ON filtered.conversations (timestamp DESC);
318
+ CREATE INDEX IF NOT EXISTS idx_filtered_conversations_contact ON filtered.conversations (contact_id, sent_at DESC);
319
+ CREATE INDEX IF NOT EXISTS idx_filtered_conversations_ts ON filtered.conversations (sent_at DESC);
320
+ CREATE INDEX IF NOT EXISTS idx_filtered_conversations_thread_sent ON filtered.conversations (platform, thread_id, sent_at);
121
321
 
122
322
  -- Knowledge documents for wiki ingestion
323
+ -- Column names match projection-worker.ts ensureFilteredSchema (source of truth)
123
324
  CREATE TABLE IF NOT EXISTS filtered.documents (
124
325
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
125
326
  title TEXT NOT NULL,
@@ -128,8 +329,8 @@ CREATE TABLE IF NOT EXISTS filtered.documents (
128
329
  source TEXT NOT NULL DEFAULT 'exe-os',
129
330
  source_id TEXT,
130
331
  metadata JSONB DEFAULT '{}'::jsonb,
131
- created_at TIMESTAMPTZ DEFAULT now(),
132
- updated_at TIMESTAMPTZ DEFAULT now()
332
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
333
+ UNIQUE(source, source_id)
133
334
  );
134
335
 
135
336
  CREATE INDEX IF NOT EXISTS idx_filtered_documents_type ON filtered.documents (doc_type);