@askexenow/exe-os 0.9.270 → 0.9.272

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 (311) hide show
  1. package/dist/active-agent-BDYXURXQ.js +26 -0
  2. package/dist/active-agent-YWBGAKGU.js +25 -0
  3. package/dist/agentic-ontology-56VHSVS3.js +25 -0
  4. package/dist/backfill-metadata-G46ABBVR.js +597 -0
  5. package/dist/backfill-metadata-VAV27KJK.js +597 -0
  6. package/dist/behaviors-USUTDXVA.js +25 -0
  7. package/dist/bin/agentic-ontology-backfill.js +5 -5
  8. package/dist/bin/agentic-reflection-backfill.js +6 -6
  9. package/dist/bin/agentic-semantic-label.js +5 -5
  10. package/dist/bin/backfill-conversations.js +4 -4
  11. package/dist/bin/backfill-responses.js +4 -4
  12. package/dist/bin/backfill-vectors.js +5 -5
  13. package/dist/bin/bulk-sync-postgres.js +6 -6
  14. package/dist/bin/cc-doctor.js +4 -4
  15. package/dist/bin/cleanup-stale-review-tasks.js +10 -10
  16. package/dist/bin/cli.js +16 -16
  17. package/dist/bin/exe-agent-config.js +3 -3
  18. package/dist/bin/exe-agent.js +4 -4
  19. package/dist/bin/exe-assign.js +5 -5
  20. package/dist/bin/exe-boot.js +17 -17
  21. package/dist/bin/exe-call.js +4 -4
  22. package/dist/bin/exe-cloud.js +4 -4
  23. package/dist/bin/exe-dispatch.js +10 -10
  24. package/dist/bin/exe-doctor.js +1 -1
  25. package/dist/bin/exe-export-behaviors.js +7 -7
  26. package/dist/bin/exe-forget.js +6 -6
  27. package/dist/bin/exe-gateway.js +7 -7
  28. package/dist/bin/exe-healthcheck.js +4 -4
  29. package/dist/bin/exe-heartbeat.js +10 -10
  30. package/dist/bin/exe-kill.js +13 -13
  31. package/dist/bin/exe-launch-agent.js +37 -19
  32. package/dist/bin/exe-new-employee.js +6 -6
  33. package/dist/bin/exe-pending-messages.js +11 -11
  34. package/dist/bin/exe-pending-notifications.js +10 -10
  35. package/dist/bin/exe-pending-reviews.js +10 -10
  36. package/dist/bin/exe-rename.js +4 -4
  37. package/dist/bin/exe-review.js +12 -12
  38. package/dist/bin/exe-search.js +5 -5
  39. package/dist/bin/exe-session-cleanup.js +15 -15
  40. package/dist/bin/exe-settings.js +5 -5
  41. package/dist/bin/exe-start-codex.js +11 -11
  42. package/dist/bin/exe-start-opencode.js +8 -8
  43. package/dist/bin/exe-status.js +11 -11
  44. package/dist/bin/exe-team.js +3 -3
  45. package/dist/bin/git-sweep.js +11 -11
  46. package/dist/bin/graph-backfill.js +4 -4
  47. package/dist/bin/graph-export.js +5 -5
  48. package/dist/bin/import-history.js +7 -7
  49. package/dist/bin/install.js +6 -6
  50. package/dist/bin/intercom-check.js +4 -4
  51. package/dist/bin/mcp-sessions.js +2 -2
  52. package/dist/bin/orchestration-metrics.js +4 -4
  53. package/dist/bin/postgres-agentic-reflection-backfill.js +2 -2
  54. package/dist/bin/postgres-agentic-semantic-backfill.js +1 -1
  55. package/dist/bin/scan-tasks.js +10 -10
  56. package/dist/bin/setup.js +1 -1
  57. package/dist/bin/shard-migrate.js +4 -4
  58. package/dist/bin/stack-update.js +10 -3
  59. package/dist/bin/vps-health-gate.js +1 -1
  60. package/dist/capacity-monitor-IFVRCIM7.js +49 -0
  61. package/dist/capacity-monitor-Q47GBDSY.js +49 -0
  62. package/dist/catchup-brief-RP4QHXNT.js +151 -0
  63. package/dist/catchup-brief-TKA6TEK4.js +151 -0
  64. package/dist/chunk-23KJ2LXY.js +58 -0
  65. package/dist/chunk-2NQQP3FF.js +630 -0
  66. package/dist/chunk-3FU5I3KV.js +526 -0
  67. package/dist/chunk-46IEEKPU.js +13696 -0
  68. package/dist/chunk-57UAFTO2.js +3958 -0
  69. package/dist/chunk-5AS622MM.js +3958 -0
  70. package/dist/chunk-62DEE65H.js +371 -0
  71. package/dist/chunk-64T6DFSS.js +447 -0
  72. package/dist/chunk-6BWDP63Z.js +197 -0
  73. package/dist/chunk-6GPYL7TX.js +214 -0
  74. package/dist/chunk-6KWLUVFL.js +54 -0
  75. package/dist/chunk-6N5ISWBF.js +1148 -0
  76. package/dist/chunk-6OD7PVMC.js +333 -0
  77. package/dist/chunk-7ET5CYTD.js +382 -0
  78. package/dist/chunk-7IWLKR6N.js +76 -0
  79. package/dist/chunk-7OEUOJL5.js +1021 -0
  80. package/dist/chunk-AIRJTKDK.js +204 -0
  81. package/dist/chunk-ATJ3NXDP.js +244 -0
  82. package/dist/chunk-B5IS7LE4.js +128 -0
  83. package/dist/chunk-BKINEQVI.js +244 -0
  84. package/dist/chunk-BOJV6NI3.js +128 -0
  85. package/dist/chunk-BPHWI6N2.js +284 -0
  86. package/dist/chunk-BXCQWWJP.js +185 -0
  87. package/dist/chunk-BZ6K7AY3.js +50 -0
  88. package/dist/chunk-C54KIFLS.js +214 -0
  89. package/dist/chunk-C6OYEJJI.js +260 -0
  90. package/dist/chunk-CHBHR5W6.js +3556 -0
  91. package/dist/chunk-D2T3272U.js +171 -0
  92. package/dist/chunk-DCHEIVGT.js +221 -0
  93. package/dist/chunk-DHIBLMSP.js +30 -0
  94. package/dist/chunk-E2AF2WYY.js +346 -0
  95. package/dist/chunk-E2KZEZZW.js +1090 -0
  96. package/dist/chunk-E4KWB4WM.js +348 -0
  97. package/dist/chunk-ENU7URWK.js +1073 -0
  98. package/dist/chunk-EZ7KAZMC.js +132 -0
  99. package/dist/chunk-F4FSSHR4.js +1073 -0
  100. package/dist/chunk-FPXU56FG.js +346 -0
  101. package/dist/chunk-FY7HHR5I.js +128 -0
  102. package/dist/chunk-G2S2UMU4.js +159 -0
  103. package/dist/chunk-G33BHQCO.js +70 -0
  104. package/dist/chunk-GJQTL7RX.js +127 -0
  105. package/dist/chunk-GLCKDEM2.js +97 -0
  106. package/dist/chunk-GMA34SXV.js +240 -0
  107. package/dist/chunk-GVAVEBYR.js +2091 -0
  108. package/dist/chunk-HOSJTLBQ.js +513 -0
  109. package/dist/chunk-IBMTSEZC.js +230 -0
  110. package/dist/chunk-IC6HVAS3.js +56 -0
  111. package/dist/chunk-IDFJNO44.js +1051 -0
  112. package/dist/chunk-ILFJMEY5.js +97 -0
  113. package/dist/chunk-ISQAOSL3.js +1921 -0
  114. package/dist/chunk-J6V2DCZK.js +382 -0
  115. package/dist/chunk-JP4CLFLR.js +1148 -0
  116. package/dist/chunk-JTIOZHWG.js +58 -0
  117. package/dist/chunk-KDICWAYV.js +1345 -0
  118. package/dist/chunk-KOBIB6WG.js +159 -0
  119. package/dist/chunk-KQFDDQB6.js +13696 -0
  120. package/dist/chunk-KZNSOHCB.js +280 -0
  121. package/dist/chunk-LVMBYP3C.js +171 -0
  122. package/dist/chunk-M2WQW5NC.js +227 -0
  123. package/dist/chunk-MY6SP5NZ.js +551 -0
  124. package/dist/chunk-N2ACW2ZG.js +363 -0
  125. package/dist/chunk-NSMJDATI.js +495 -0
  126. package/dist/chunk-NSQ5JE23.js +1090 -0
  127. package/dist/chunk-NZL567WG.js +81 -0
  128. package/dist/chunk-O5OMH6LI.js +244 -0
  129. package/dist/chunk-O7YO7E2G.js +1512 -0
  130. package/dist/chunk-OBUV3W7L.js +163 -0
  131. package/dist/chunk-OLDS7LJN.js +495 -0
  132. package/dist/chunk-OO2I22RX.js +38 -0
  133. package/dist/chunk-OPUUT33V.js +447 -0
  134. package/dist/chunk-OT3VMTKB.js +50 -0
  135. package/dist/chunk-P6RVIOVA.js +157 -0
  136. package/dist/chunk-PUA5564C.js +210 -0
  137. package/dist/chunk-PUQLKLQX.js +731 -0
  138. package/dist/chunk-QROKS65G.js +76 -0
  139. package/dist/chunk-R54I2N2T.js +818 -0
  140. package/dist/chunk-RCFYQHUP.js +818 -0
  141. package/dist/chunk-RJTND4YS.js +284 -0
  142. package/dist/chunk-SBLHQMMZ.js +81 -0
  143. package/dist/chunk-SG2ANG5C.js +123 -0
  144. package/dist/chunk-SVFNKSZV.js +333 -0
  145. package/dist/chunk-TAQT2DC7.js +330 -0
  146. package/dist/chunk-TB7HFW7M.js +127 -0
  147. package/dist/chunk-UUKDAIH2.js +731 -0
  148. package/dist/chunk-V6VEFEEH.js +1345 -0
  149. package/dist/chunk-VIO2ALGH.js +290 -0
  150. package/dist/chunk-VKCUSNJW.js +377 -0
  151. package/dist/chunk-VRPPJFIQ.js +1921 -0
  152. package/dist/chunk-WP3PVBBP.js +204 -0
  153. package/dist/chunk-WQEUY7DC.js +129 -0
  154. package/dist/chunk-WXMXUKCA.js +262 -0
  155. package/dist/chunk-X2WBH2IO.js +297 -0
  156. package/dist/chunk-X33TSJNO.js +394 -0
  157. package/dist/chunk-X7MMI2UI.js +89 -0
  158. package/dist/chunk-XG3BQZIK.js +85 -0
  159. package/dist/chunk-XIKBIAOS.js +75 -0
  160. package/dist/chunk-XPEB545Q.js +54 -0
  161. package/dist/chunk-XWH2MLWS.js +330 -0
  162. package/dist/chunk-YH7V73XW.js +89 -0
  163. package/dist/chunk-YMLM5D65.js +135 -0
  164. package/dist/chunk-YNJPRQ6J.js +377 -0
  165. package/dist/chunk-YSNEHBI6.js +551 -0
  166. package/dist/chunk-ZD6BMW2K.js +33 -0
  167. package/dist/chunk-ZKG5IYCG.js +668 -0
  168. package/dist/chunk-ZU4K7ZNX.js +197 -0
  169. package/dist/co-activation-HZMJC34P.js +72 -0
  170. package/dist/co-occurrence-AVYXRV4L.js +74 -0
  171. package/dist/core-memory-NPJCVUMF.js +110 -0
  172. package/dist/core-memory-OKGXL33Z.js +110 -0
  173. package/dist/crdt-sync-ZCH55JNR.js +33 -0
  174. package/dist/crm-webhook-6OMVUUGR.js +10 -0
  175. package/dist/crm-webhook-UCWF3XDB.js +10 -0
  176. package/dist/cto-delegation-gate-JFZFZGC2.js +206 -0
  177. package/dist/cto-delegation-gate-K32M4GVM.js +206 -0
  178. package/dist/daemon-orchestration-2Q7BYOHC.js +135 -0
  179. package/dist/daemon-orchestration-4RJ2CZJL.js +135 -0
  180. package/dist/db-backup-5GA2YFDX.js +33 -0
  181. package/dist/dreaming-I6KXO6E2.js +32 -0
  182. package/dist/dreaming-NJBK5ILR.js +32 -0
  183. package/dist/exe-drift-VSMIMHL4.js +68 -0
  184. package/dist/exe-export-DVHHIA6Y.js +73 -0
  185. package/dist/exe-export-GIVQDENS.js +73 -0
  186. package/dist/exe-import-7N46LSMQ.js +76 -0
  187. package/dist/exe-import-FINYUV5T.js +76 -0
  188. package/dist/exe-key-H45JY44F.js +579 -0
  189. package/dist/exe-key-MAEQGTB7.js +579 -0
  190. package/dist/exe-snapshot-3TEM3BFD.js +164 -0
  191. package/dist/exe-snapshot-HECGUHL3.js +164 -0
  192. package/dist/fast-db-init-3CNTADVO.js +7 -0
  193. package/dist/fast-db-init-HXCS2AP5.js +7 -0
  194. package/dist/gateway/index.js +8 -8
  195. package/dist/git-staleness-YCEBBIVK.js +110 -0
  196. package/dist/git-task-sweep-H34STRNT.js +40 -0
  197. package/dist/git-task-sweep-YL7NLDCK.js +40 -0
  198. package/dist/global-procedures-IHZM6C2K.js +20 -0
  199. package/dist/graph-auto-extract-RZQ3MHP2.js +162 -0
  200. package/dist/hooks/bug-report-worker.js +12 -12
  201. package/dist/hooks/codex-stop-task-finalizer.js +12 -12
  202. package/dist/hooks/commit-complete.js +12 -12
  203. package/dist/hooks/error-recall.js +6 -6
  204. package/dist/hooks/exe-heartbeat-hook.js +3 -3
  205. package/dist/hooks/ingest.js +6 -6
  206. package/dist/hooks/instructions-loaded.js +4 -4
  207. package/dist/hooks/manifest.json +19 -19
  208. package/dist/hooks/notification.js +4 -4
  209. package/dist/hooks/post-compact.js +11 -11
  210. package/dist/hooks/post-tool-combined.js +5 -5
  211. package/dist/hooks/pre-compact.js +12 -12
  212. package/dist/hooks/pre-tool-use.js +15 -15
  213. package/dist/hooks/prompt-submit.js +21 -21
  214. package/dist/hooks/session-end.js +16 -16
  215. package/dist/hooks/session-start.js +10 -10
  216. package/dist/hooks/stop.js +15 -15
  217. package/dist/hooks/subagent-stop.js +11 -11
  218. package/dist/hooks/summary-worker.js +15 -15
  219. package/dist/index.js +18 -18
  220. package/dist/installer-4EW5ZDGD.js +296 -0
  221. package/dist/installer-B2JTQO55.js +38 -0
  222. package/dist/installer-MIL352T7.js +342 -0
  223. package/dist/lib/agent-config.js +9 -3
  224. package/dist/lib/cloud-sync.js +4 -4
  225. package/dist/lib/consolidation.js +5 -5
  226. package/dist/lib/database.js +2 -2
  227. package/dist/lib/db.js +2 -2
  228. package/dist/lib/employee-templates.js +4 -4
  229. package/dist/lib/employees.js +2 -2
  230. package/dist/lib/exe-daemon.js +34 -34
  231. package/dist/lib/hybrid-search.js +5 -5
  232. package/dist/lib/identity.js +2 -2
  233. package/dist/lib/messaging.js +10 -10
  234. package/dist/lib/reminders.js +3 -3
  235. package/dist/lib/schedules.js +5 -5
  236. package/dist/lib/session-registry.js +4 -4
  237. package/dist/lib/skill-learning.js +4 -4
  238. package/dist/lib/store.js +4 -4
  239. package/dist/lib/task-router.js +3 -3
  240. package/dist/lib/tasks.js +11 -11
  241. package/dist/lib/tmux-routing.js +9 -9
  242. package/dist/lib/token-spend.js +3 -3
  243. package/dist/mcp/register-tools.js +54 -54
  244. package/dist/mcp/server.js +55 -55
  245. package/dist/mcp/tools/complete-reminder.js +4 -4
  246. package/dist/mcp/tools/create-reminder.js +4 -4
  247. package/dist/mcp/tools/create-task.js +13 -13
  248. package/dist/mcp/tools/deactivate-behavior.js +5 -5
  249. package/dist/mcp/tools/list-reminders.js +4 -4
  250. package/dist/mcp/tools/list-tasks.js +13 -13
  251. package/dist/mcp/tools/send-message.js +12 -12
  252. package/dist/mcp/tools/update-task.js +12 -12
  253. package/dist/mcp-http-config-OJQR246S.js +27 -0
  254. package/dist/memory-cards-IPULSQFA.js +174 -0
  255. package/dist/memory-graph-extractor-3TZZOKHY.js +17 -0
  256. package/dist/memory-poisoning-defense-SGUGR5YJ.js +225 -0
  257. package/dist/memory-reflection-H3WGCEM6.js +238 -0
  258. package/dist/notifications-VWPO6NJF.js +45 -0
  259. package/dist/notifications-WCSRQN2V.js +45 -0
  260. package/dist/orchestration-events-O5PSDEIO.js +25 -0
  261. package/dist/orchestrator-RAPEJUOI.js +33 -0
  262. package/dist/orchestrator-XPG6LJAI.js +33 -0
  263. package/dist/pipeline-router-5NT6FUC3.js +13 -0
  264. package/dist/pipeline-router-KSUXONDT.js +13 -0
  265. package/dist/plan-limits-53NXLNDQ.js +26 -0
  266. package/dist/project-boot-ITN3FZMM.js +299 -0
  267. package/dist/projection-worker-27XX5M2W.js +964 -0
  268. package/dist/reranker-GU7L2PJX.js +19 -0
  269. package/dist/reranker-TZEXIJAN.js +19 -0
  270. package/dist/review-polling-FA2J2Q5O.js +124 -0
  271. package/dist/review-polling-MLS4BQ3N.js +124 -0
  272. package/dist/runtime/index.js +12 -12
  273. package/dist/session-events-WWGF3B2N.js +36 -0
  274. package/dist/session-events-ZHXXAH6B.js +36 -0
  275. package/dist/session-kill-telemetry-O4TJHHOZ.js +29 -0
  276. package/dist/session-scope-CQXB7VMH.js +86 -0
  277. package/dist/session-scope-HHUMJYF6.js +86 -0
  278. package/dist/setup-wizard-UM2RHSBJ.js +12 -0
  279. package/dist/skill-refinement-MJPOHYD5.js +157 -0
  280. package/dist/skill-refinement-NVUBRK22.js +157 -0
  281. package/dist/stack-release-2KSOYDIV.js +712 -0
  282. package/dist/stack-release-BAPCXMXW.js +713 -0
  283. package/dist/stack-release-W4TWTEZP.js +731 -0
  284. package/dist/stack-update-QQA64STQ.js +52 -0
  285. package/dist/steward-gate-VLE7OCKO.js +13 -0
  286. package/dist/task-enforcement-FUHDL6UR.js +391 -0
  287. package/dist/task-enforcement-QL3K4N3F.js +391 -0
  288. package/dist/task-scope-TZYMB634.js +35 -0
  289. package/dist/task-scope-ZVLUBS4C.js +35 -0
  290. package/dist/tasks-crud-4MSLJWXE.js +77 -0
  291. package/dist/tasks-crud-HIPXKRKX.js +77 -0
  292. package/dist/tasks-notify-7JBUNE7R.js +38 -0
  293. package/dist/tasks-notify-UPIJ3L4O.js +38 -0
  294. package/dist/tasks-review-5SJSFTUB.js +47 -0
  295. package/dist/tasks-review-JHSYBR5I.js +47 -0
  296. package/dist/telemetry-upload-BSGOXGUP.js +739 -0
  297. package/dist/telemetry-upload-LTX3C5HZ.js +739 -0
  298. package/dist/token-budget-2CDWQU3Q.js +84 -0
  299. package/dist/tool-telemetry-7YS7EN7B.js +17 -0
  300. package/dist/tui/App.js +17 -17
  301. package/dist/tui-data-GDGBOS6G.js +258 -0
  302. package/dist/tui-data-VXF2RBVM.js +258 -0
  303. package/dist/wiki-acl-MJIMXRQV.js +111 -0
  304. package/dist/worker-gate-WQGTZOSM.js +21 -0
  305. package/dist/worker-gate-X2YDTKTL.js +21 -0
  306. package/dist/workflow-engine-CYXRZXBM.js +28 -0
  307. package/dist/workflow-engine-KMLAXVA4.js +28 -0
  308. package/dist/worktree-NLSKVRNC.js +26 -0
  309. package/dist/worktree-sweep-44TMEPLE.js +19 -0
  310. package/package.json +1 -1
  311. package/release-notes.json +26 -40
@@ -0,0 +1,230 @@
1
+ // src/bin/vps-health-gate.ts
2
+ import { spawnSync } from "child_process";
3
+ import { appendFileSync, existsSync, mkdirSync, readdirSync } from "fs";
4
+ import http from "http";
5
+ import path from "path";
6
+ var DEPLOY_LOG = "/opt/exe-stack/deploy-log.jsonl";
7
+ var BACKUP_DIR = "/opt/exe-stack/backups";
8
+ async function checkCRM() {
9
+ const start = Date.now();
10
+ try {
11
+ const status = await httpGet("http://localhost:3000/api");
12
+ return {
13
+ check: "crm",
14
+ status: status >= 200 && status < 400 ? "pass" : "fail",
15
+ message: status >= 200 && status < 400 ? `CRM healthy (HTTP ${status})` : `CRM unhealthy (HTTP ${status})`,
16
+ durationMs: Date.now() - start
17
+ };
18
+ } catch (err) {
19
+ return {
20
+ check: "crm",
21
+ status: "fail",
22
+ message: `CRM unreachable: ${err instanceof Error ? err.message : err}`,
23
+ durationMs: Date.now() - start
24
+ };
25
+ }
26
+ }
27
+ async function checkGateway() {
28
+ const start = Date.now();
29
+ try {
30
+ const status = await httpGet("http://localhost:3100/health");
31
+ return {
32
+ check: "gateway",
33
+ status: status >= 200 && status < 300 ? "pass" : "fail",
34
+ message: status >= 200 && status < 300 ? `Gateway healthy (HTTP ${status})` : `Gateway unhealthy (HTTP ${status})`,
35
+ durationMs: Date.now() - start
36
+ };
37
+ } catch (err) {
38
+ return {
39
+ check: "gateway",
40
+ status: "fail",
41
+ message: `Gateway unreachable: ${err instanceof Error ? err.message : err}`,
42
+ durationMs: Date.now() - start
43
+ };
44
+ }
45
+ }
46
+ function checkPostgres() {
47
+ const start = Date.now();
48
+ const databaseUrl = process.env.DATABASE_URL || "postgres://exe@localhost:5432/exedb";
49
+ const result = spawnSync("psql", [databaseUrl, "-c", "SELECT 1"], {
50
+ encoding: "utf8",
51
+ stdio: ["pipe", "pipe", "pipe"],
52
+ timeout: 1e4
53
+ });
54
+ return {
55
+ check: "postgres",
56
+ status: result.status === 0 ? "pass" : "fail",
57
+ message: result.status === 0 ? "Postgres responding" : `Postgres failed: ${result.stderr?.trim() || `exit ${result.status}`}`,
58
+ durationMs: Date.now() - start
59
+ };
60
+ }
61
+ function checkRawEvents() {
62
+ const start = Date.now();
63
+ const databaseUrl = process.env.DATABASE_URL || "postgres://exe@localhost:5432/exedb";
64
+ const result = spawnSync(
65
+ "psql",
66
+ [databaseUrl, "-t", "-c", "SELECT count(*) FROM raw.raw_events"],
67
+ {
68
+ encoding: "utf8",
69
+ stdio: ["pipe", "pipe", "pipe"],
70
+ timeout: 1e4
71
+ }
72
+ );
73
+ if (result.status !== 0) {
74
+ return {
75
+ check: "raw_events",
76
+ status: "fail",
77
+ message: `raw.raw_events query failed: ${result.stderr?.trim() || `exit ${result.status}`}`,
78
+ durationMs: Date.now() - start
79
+ };
80
+ }
81
+ const count = parseInt(result.stdout?.trim() || "0", 10);
82
+ return {
83
+ check: "raw_events",
84
+ status: count > 0 ? "pass" : "fail",
85
+ message: count > 0 ? `raw.raw_events has ${count} rows` : "raw.raw_events is empty",
86
+ durationMs: Date.now() - start
87
+ };
88
+ }
89
+ async function checkGoTrue() {
90
+ const start = Date.now();
91
+ try {
92
+ const status = await httpGet("http://localhost:9999/health");
93
+ return {
94
+ check: "gotrue",
95
+ status: status >= 200 && status < 300 ? "pass" : "fail",
96
+ message: status >= 200 && status < 300 ? `GoTrue healthy (HTTP ${status})` : `GoTrue unhealthy (HTTP ${status})`,
97
+ durationMs: Date.now() - start
98
+ };
99
+ } catch (err) {
100
+ return {
101
+ check: "gotrue",
102
+ status: "fail",
103
+ message: `GoTrue unreachable: ${err instanceof Error ? err.message : err}`,
104
+ durationMs: Date.now() - start
105
+ };
106
+ }
107
+ }
108
+ async function runHealthGate() {
109
+ console.log("[health-gate] Running post-deploy health checks...\n");
110
+ const results = [];
111
+ results.push(checkPostgres());
112
+ results.push(checkRawEvents());
113
+ results.push(await checkCRM());
114
+ results.push(await checkGateway());
115
+ results.push(await checkGoTrue());
116
+ const passed = results.every((r) => r.status === "pass");
117
+ for (const r of results) {
118
+ const icon = r.status === "pass" ? "\u2713" : "\u2717";
119
+ const color = r.status === "pass" ? "\x1B[32m" : "\x1B[31m";
120
+ console.log(` ${color}${icon}\x1B[0m ${r.check.padEnd(12)} ${r.message} (${r.durationMs}ms)`);
121
+ }
122
+ console.log("");
123
+ const result = {
124
+ passed,
125
+ results,
126
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
127
+ };
128
+ return result;
129
+ }
130
+ function logResult(result) {
131
+ mkdirSync(path.dirname(DEPLOY_LOG), { recursive: true });
132
+ const line = JSON.stringify({
133
+ ...result,
134
+ type: "health_gate"
135
+ }) + "\n";
136
+ try {
137
+ appendFileSync(DEPLOY_LOG, line);
138
+ console.log(`[health-gate] Result logged to ${DEPLOY_LOG}`);
139
+ } catch (err) {
140
+ console.warn(`[health-gate] Failed to write deploy log: ${err instanceof Error ? err.message : err}`);
141
+ }
142
+ }
143
+ function restorePreDeployBackup() {
144
+ if (!existsSync(BACKUP_DIR)) return false;
145
+ const backups = readdirSync(BACKUP_DIR).filter((f) => f.startsWith("pg-pre-deploy-") && f.endsWith(".dump")).sort().reverse();
146
+ if (backups.length === 0) {
147
+ console.warn("[health-gate] No pre-deploy backup found to restore");
148
+ return false;
149
+ }
150
+ const latest = backups[0];
151
+ const filepath = path.join(BACKUP_DIR, latest);
152
+ const databaseUrl = process.env.DATABASE_URL || "postgres://exe@localhost:5432/exedb";
153
+ console.log(`[health-gate] Restoring pre-deploy backup: ${latest}`);
154
+ const result = spawnSync("pg_restore", ["-d", databaseUrl, "--clean", "--if-exists", filepath], {
155
+ encoding: "utf8",
156
+ stdio: ["pipe", "pipe", "pipe"],
157
+ timeout: 3e5
158
+ });
159
+ if (result.status !== 0) {
160
+ console.error(`[health-gate] pg_restore failed: ${result.stderr?.trim() || `exit ${result.status}`}`);
161
+ return false;
162
+ }
163
+ console.log("[health-gate] \u2713 Pre-deploy backup restored");
164
+ return true;
165
+ }
166
+ function httpGet(url) {
167
+ return new Promise((resolve, reject) => {
168
+ const req = http.request(url, { method: "GET", timeout: 1e4 }, (res) => {
169
+ res.resume();
170
+ resolve(res.statusCode ?? 0);
171
+ });
172
+ req.on("timeout", () => req.destroy(new Error("timeout")));
173
+ req.on("error", reject);
174
+ req.end();
175
+ });
176
+ }
177
+ async function main(args) {
178
+ if (args.includes("--help") || args.includes("-h")) {
179
+ console.log(`
180
+ exe-os vps-health-gate \u2014 Post-deploy health checks
181
+
182
+ Runs 5 checks: Postgres, raw_events, CRM, Gateway, GoTrue.
183
+ If any check fails, triggers rollback and exits with code 1.
184
+
185
+ Usage:
186
+ exe-os vps-health-gate Run health gate
187
+ exe-os vps-health-gate --check-only Run checks without rollback on failure
188
+ `);
189
+ return;
190
+ }
191
+ const checkOnly = args.includes("--check-only");
192
+ const result = await runHealthGate();
193
+ logResult(result);
194
+ if (result.passed) {
195
+ console.log("[health-gate] \u2713 All checks passed \u2014 deploy is healthy");
196
+ return;
197
+ }
198
+ const failed = result.results.filter((r) => r.status === "fail");
199
+ console.error(`[health-gate] \u2717 ${failed.length} check(s) failed`);
200
+ if (checkOnly) {
201
+ process.exitCode = 1;
202
+ return;
203
+ }
204
+ console.log("[health-gate] Starting rollback...");
205
+ restorePreDeployBackup();
206
+ try {
207
+ const { rollbackStackUpdate, defaultStackPaths } = await import("./stack-update-QQA64STQ.js");
208
+ const paths = defaultStackPaths();
209
+ await rollbackStackUpdate({
210
+ manifestRef: paths.manifestRef,
211
+ composeFile: paths.composeFile,
212
+ envFile: paths.envFile
213
+ });
214
+ console.log("[health-gate] \u2713 Stack rolled back to previous version");
215
+ } catch (err) {
216
+ console.error(`[health-gate] Stack rollback failed: ${err instanceof Error ? err.message : err}`);
217
+ }
218
+ process.exitCode = 1;
219
+ }
220
+
221
+ export {
222
+ checkCRM,
223
+ checkGateway,
224
+ checkPostgres,
225
+ checkRawEvents,
226
+ checkGoTrue,
227
+ runHealthGate,
228
+ logResult,
229
+ main
230
+ };
@@ -0,0 +1,56 @@
1
+ import {
2
+ getClient
3
+ } from "./chunk-CHBHR5W6.js";
4
+
5
+ // src/lib/reminders.ts
6
+ import crypto from "crypto";
7
+ async function createReminder(text, dueDate) {
8
+ const client = getClient();
9
+ const id = crypto.randomUUID();
10
+ const now = (/* @__PURE__ */ new Date()).toISOString();
11
+ await client.execute({
12
+ sql: `INSERT INTO reminders (id, text, created_at, due_date) VALUES (?, ?, ?, ?)`,
13
+ args: [id, text, now, dueDate ?? null]
14
+ });
15
+ return { id, text, createdAt: now, dueDate: dueDate ?? null, completedAt: null };
16
+ }
17
+ async function listReminders(includeCompleted = false) {
18
+ const client = getClient();
19
+ const sql = includeCompleted ? `SELECT id, text, created_at, due_date, completed_at FROM reminders ORDER BY due_date ASC NULLS LAST LIMIT 500` : `SELECT id, text, created_at, due_date, completed_at FROM reminders WHERE completed_at IS NULL ORDER BY due_date ASC NULLS LAST LIMIT 500`;
20
+ const result = await client.execute(sql);
21
+ return result.rows.map((row) => ({
22
+ id: String(row.id),
23
+ text: String(row.text),
24
+ createdAt: String(row.created_at),
25
+ dueDate: row.due_date ? String(row.due_date) : null,
26
+ completedAt: row.completed_at ? String(row.completed_at) : null
27
+ }));
28
+ }
29
+ async function completeReminder(idOrText) {
30
+ const client = getClient();
31
+ const now = (/* @__PURE__ */ new Date()).toISOString();
32
+ let result = await client.execute({
33
+ sql: `SELECT id, text FROM reminders WHERE id = ? AND completed_at IS NULL`,
34
+ args: [idOrText]
35
+ });
36
+ if (result.rows.length === 0) {
37
+ result = await client.execute({
38
+ sql: `SELECT id, text FROM reminders WHERE completed_at IS NULL AND text LIKE '%' || ? || '%' LIMIT 1`,
39
+ args: [idOrText]
40
+ });
41
+ }
42
+ if (result.rows.length === 0) return null;
43
+ const row = result.rows[0];
44
+ const id = String(row.id);
45
+ await client.execute({
46
+ sql: `UPDATE reminders SET completed_at = ? WHERE id = ?`,
47
+ args: [now, id]
48
+ });
49
+ return { id, text: String(row.text), createdAt: "", dueDate: null, completedAt: now };
50
+ }
51
+
52
+ export {
53
+ createReminder,
54
+ listReminders,
55
+ completeReminder
56
+ };