@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.
- package/deploy/compose/.env.customer.example +13 -13
- package/deploy/compose/.env.example +8 -8
- package/deploy/compose/docker-compose.yml +18 -18
- package/deploy/compose/generate-env.ts +22 -18
- package/deploy/compose/init-db.sql +221 -20
- package/deploy/stack-manifests/v0.9.json +1207 -1136
- package/dist/{active-agent-DTZ6VJIR.js → active-agent-IGZXTTV4.js} +3 -3
- package/dist/{active-agent-7QNK5CJZ.js → active-agent-OYUXMTHS.js} +3 -3
- package/dist/{agentic-ontology-UZK33N6I.js → agentic-ontology-5WT23SLZ.js} +1 -1
- package/dist/{backfill-metadata-R7PNZ5TX.js → backfill-metadata-EG52U3GF.js} +4 -4
- package/dist/{behaviors-G6QHSQBN.js → behaviors-2TZCFJLU.js} +3 -3
- package/dist/bin/age-ontology-load.js +2 -2
- package/dist/bin/agentic-ontology-backfill.js +5 -5
- package/dist/bin/agentic-reflection-backfill.js +6 -6
- package/dist/bin/agentic-semantic-label.js +5 -5
- package/dist/bin/backfill-conversations.js +6 -5
- package/dist/bin/backfill-responses.js +6 -5
- package/dist/bin/backfill-vectors.js +7 -6
- package/dist/bin/bulk-sync-postgres.js +6 -6
- package/dist/bin/cleanup-stale-review-tasks.js +9 -9
- package/dist/bin/cli.js +17 -17
- package/dist/bin/deferred-daemon-restart.js +4 -1
- package/dist/bin/exe-agent-config.js +2 -2
- package/dist/bin/exe-agent.js +4 -4
- package/dist/bin/exe-assign.js +8 -7
- package/dist/bin/exe-boot.js +16 -16
- package/dist/bin/exe-call.js +4 -4
- package/dist/bin/exe-cloud.js +4 -4
- package/dist/bin/exe-dispatch.js +9 -9
- package/dist/bin/exe-doctor.js +1 -1
- package/dist/bin/exe-export-behaviors.js +7 -7
- package/dist/bin/exe-forget.js +6 -6
- package/dist/bin/exe-gateway.js +9 -9
- package/dist/bin/exe-heartbeat.js +9 -9
- package/dist/bin/exe-kill.js +12 -12
- package/dist/bin/exe-launch-agent.js +16 -16
- package/dist/bin/exe-new-employee.js +6 -6
- package/dist/bin/exe-pending-messages.js +11 -10
- package/dist/bin/exe-pending-notifications.js +9 -9
- package/dist/bin/exe-pending-reviews.js +11 -9
- package/dist/bin/exe-rename.js +4 -4
- package/dist/bin/exe-review.js +11 -11
- package/dist/bin/exe-search.js +5 -5
- package/dist/bin/exe-session-cleanup.js +14 -14
- package/dist/bin/exe-settings.js +4 -4
- package/dist/bin/exe-start-codex.js +11 -11
- package/dist/bin/exe-start-opencode.js +8 -8
- package/dist/bin/exe-status.js +10 -10
- package/dist/bin/exe-support.js +3 -1
- package/dist/bin/exe-team.js +3 -3
- package/dist/bin/git-sweep.js +71 -11
- package/dist/bin/graph-backfill.js +4 -4
- package/dist/bin/graph-export.js +5 -5
- package/dist/bin/graph-layer-benchmark.js +7 -7
- package/dist/bin/import-history.js +7 -7
- package/dist/bin/install.js +12 -9
- package/dist/bin/intercom-check.js +4 -4
- package/dist/bin/mcp-sessions.js +2 -2
- package/dist/bin/orchestration-metrics.js +4 -4
- package/dist/bin/postgres-agentic-reflection-backfill.js +7 -7
- package/dist/bin/postgres-agentic-semantic-backfill.js +7 -7
- package/dist/bin/pre-publish.js +2 -1
- package/dist/bin/scan-tasks.js +9 -9
- package/dist/bin/setup.js +1 -1
- package/dist/bin/shard-migrate.js +4 -4
- package/dist/bin/stack-update.js +20 -3
- package/dist/bin/vps-health-gate.js +1 -1
- package/dist/{capacity-monitor-QMKII67L.js → capacity-monitor-CTFWWTCR.js} +10 -10
- package/dist/{catchup-brief-CNISNLV7.js → catchup-brief-AXA4DAQI.js} +11 -11
- package/dist/{chunk-QP4FHME2.js → chunk-235ZCOYB.js} +18 -6
- package/dist/{chunk-2NEQQCRC.js → chunk-25JAXHON.js} +1 -1
- package/dist/{chunk-MU6ESLYL.js → chunk-2PFNATXD.js} +1 -1
- package/dist/chunk-2XZ6X3PJ.js +13 -0
- package/dist/chunk-3XX3CDKF.js +9 -0
- package/dist/{chunk-ZTB6E2ZL.js → chunk-4FGTT26Q.js} +1 -1
- package/dist/{chunk-YYSQAM4W.js → chunk-4TYAHVDI.js} +8 -8
- package/dist/{chunk-2QKNXGII.js → chunk-4VECWOUO.js} +2 -2
- package/dist/{chunk-YXMXP45V.js → chunk-57C3MZPQ.js} +2 -2
- package/dist/{chunk-FTNNNAMH.js → chunk-5JYCTIQD.js} +1 -1
- package/dist/{chunk-CS267UMH.js → chunk-5LDTCWYX.js} +79 -19
- package/dist/{chunk-FQVITYVF.js → chunk-6D2IZ5MB.js} +2 -2
- package/dist/{chunk-ZG3HADWE.js → chunk-7UJRF4WF.js} +1 -1
- package/dist/{chunk-JFVITKXI.js → chunk-A2UPDE3J.js} +1 -1
- package/dist/{chunk-KOCQAMAM.js → chunk-ANYOAZCZ.js} +238 -5
- package/dist/{chunk-PSQNT5DS.js → chunk-AQS2B3HC.js} +8 -8
- package/dist/{chunk-ABNALOLM.js → chunk-BGEXTWGR.js} +3 -3
- package/dist/{chunk-LPK5JPME.js → chunk-BPZL5YOM.js} +1 -1
- package/dist/{chunk-JGEGEOVP.js → chunk-COKTAJUZ.js} +1 -1
- package/dist/{chunk-MRZE5IOP.js → chunk-CXOX7TRG.js} +1 -1
- package/dist/{chunk-6LFFIEDM.js → chunk-DU64OESH.js} +1 -1
- package/dist/{chunk-X3SS45PO.js → chunk-FPXZY3FY.js} +1 -1
- package/dist/{chunk-TVTRMINO.js → chunk-FUGZF7VR.js} +1 -1
- package/dist/{chunk-O7SFCX5B.js → chunk-GB4FI66P.js} +2 -2
- package/dist/{chunk-VGWQBI76.js → chunk-GBR4MAAK.js} +1 -1
- package/dist/chunk-GH4LVBQM.js +371 -0
- package/dist/{chunk-AIXZ5O7U.js → chunk-GIHMDOSK.js} +1 -1
- package/dist/{chunk-RDCE652I.js → chunk-HDWVXSGO.js} +1 -1
- package/dist/{chunk-RF54NGPJ.js → chunk-IJ7R3MXE.js} +3 -5
- package/dist/{chunk-R7FBOZT5.js → chunk-ISL3NSVX.js} +1 -1
- package/dist/{chunk-5B2AEXVA.js → chunk-IVSRRIRG.js} +1 -1
- package/dist/{chunk-SD2R3SEA.js → chunk-J3YNCJ4A.js} +1 -1
- package/dist/{chunk-5IZYSS3M.js → chunk-JE4C74EE.js} +4 -4
- package/dist/{chunk-VRVHIVUE.js → chunk-KSR2PNRW.js} +2 -2
- package/dist/{chunk-LL2ARYTZ.js → chunk-L3PY4NFQ.js} +1 -1
- package/dist/{chunk-VFATLVRX.js → chunk-L5VPUOB6.js} +1 -1
- package/dist/{chunk-3VLFVOM7.js → chunk-LRKJGSNH.js} +2 -2
- package/dist/{chunk-4FT3SQAS.js → chunk-LVY74L2J.js} +2 -2
- package/dist/{chunk-X4T7LR2X.js → chunk-M7PZFYHE.js} +2 -2
- package/dist/{chunk-CIX64N7D.js → chunk-MGTVPIEZ.js} +1 -1
- package/dist/{chunk-MXCBORCC.js → chunk-MKTEGZ37.js} +3 -3
- package/dist/chunk-MMRUBN3I.js +36 -0
- package/dist/{chunk-4MONXPWR.js → chunk-MPXLF7TA.js} +1 -1
- package/dist/{chunk-6QMXKKFD.js → chunk-N27CTUFU.js} +1 -1
- package/dist/{chunk-YDHPC4PX.js → chunk-N4ES27RI.js} +3 -3
- package/dist/{chunk-WIRJ574R.js → chunk-NGQQRGLP.js} +2 -2
- package/dist/{chunk-AQOCHSIR.js → chunk-OCJ5GZKV.js} +4 -4
- package/dist/{chunk-O477L4LV.js → chunk-OSPS5N2I.js} +1 -1
- package/dist/{chunk-5WEH43HH.js → chunk-PQHA6X6Y.js} +1 -1
- package/dist/{chunk-DJYIBHN5.js → chunk-PQQTSNXS.js} +3 -3
- package/dist/{chunk-LGFB67MY.js → chunk-Q3GLQDZI.js} +1 -1
- package/dist/{chunk-7GR7VBBW.js → chunk-QUC27OCW.js} +1 -1
- package/dist/{chunk-5NBOFYJG.js → chunk-QYNFWFFH.js} +4 -4
- package/dist/{chunk-RLDOG7DI.js → chunk-R4EZGQWL.js} +2516 -2289
- package/dist/{chunk-LYIUESG2.js → chunk-SLF7JRLG.js} +10 -10
- package/dist/{chunk-X7I6NLIA.js → chunk-T2EUNNUX.js} +5 -5
- package/dist/{chunk-VRWOLLKN.js → chunk-T4NFOOPB.js} +2 -2
- package/dist/{chunk-2YJSDJEH.js → chunk-TZPHTI5Q.js} +1 -1
- package/dist/{chunk-CQSFIQGN.js → chunk-UOZ5KUNN.js} +1 -1
- package/dist/{chunk-5R4R743Q.js → chunk-V2UVWYHO.js} +17 -15
- package/dist/{chunk-VKCZ3OGM.js → chunk-VD676VIC.js} +4 -4
- package/dist/{chunk-USLVSLQ5.js → chunk-VDCPKJUQ.js} +1 -1
- package/dist/{chunk-Y7NMPQXZ.js → chunk-VLX6AHTD.js} +8 -8
- package/dist/{chunk-ITPIBVSG.js → chunk-WMZTSHNX.js} +83 -1
- package/dist/{chunk-5U7WB4YG.js → chunk-WVBZ3QBR.js} +2 -2
- package/dist/{chunk-3EMZZZNU.js → chunk-X2RKYKTP.js} +1 -1
- package/dist/{chunk-XTIHYH64.js → chunk-YY2BCIAP.js} +2 -2
- package/dist/{chunk-Z6GHDYQI.js → chunk-Z2AEOVEZ.js} +30 -6
- package/dist/{chunk-PHTRZQR4.js → chunk-ZBDAFYDD.js} +4 -4
- package/dist/{chunk-E4CCKWZN.js → chunk-ZKFTDL4M.js} +1 -1
- package/dist/{co-activation-AIVMI5U2.js → co-activation-UNVL5JCP.js} +2 -2
- package/dist/{co-occurrence-L6QOQTJB.js → co-occurrence-ETAVWYVE.js} +2 -2
- package/dist/{code-context-index-DYHYVJHX.js → code-context-index-DCQYAYA2.js} +3 -2
- package/dist/{crdt-sync-YBMDPFNT.js → crdt-sync-AH7N6QOE.js} +1 -1
- package/dist/{crm-webhook-QO3ZESKR.js → crm-webhook-R6546T3Y.js} +2 -2
- package/dist/{cto-delegation-gate-UFPVFLIW.js → cto-delegation-gate-VB4TMZ3I.js} +8 -8
- package/dist/{daemon-orchestration-6XAISQ7B.js → daemon-orchestration-YAJKIL6Q.js} +12 -12
- package/dist/{db-backup-7UMCTS44.js → db-backup-2RG6VHT7.js} +11 -3
- package/dist/{dreaming-FJ75QVGZ.js → dreaming-WMBTSXGD.js} +9 -9
- package/dist/{exe-drift-OH3WV2ZQ.js → exe-drift-MQZGYHEN.js} +3 -3
- package/dist/{exe-export-UYKYNVBU.js → exe-export-E4BDIHOC.js} +5 -5
- package/dist/{exe-import-Q4FNSMLJ.js → exe-import-IWAD4HN6.js} +5 -5
- package/dist/{exe-key-22LOIIUX.js → exe-key-L2RV7XJX.js} +2 -2
- package/dist/{exe-snapshot-J7CL6QEL.js → exe-snapshot-IOGN4ARV.js} +12 -12
- package/dist/{fast-db-init-QXGL2PKQ.js → fast-db-init-GCY3F74H.js} +1 -1
- package/dist/gateway/index.js +8 -8
- package/dist/{git-staleness-YVWDCFIE.js → git-staleness-BQIFNZIU.js} +2 -2
- package/dist/{git-task-sweep-RRCOTTIS.js → git-task-sweep-GSKS6WKR.js} +9 -9
- package/dist/{global-procedures-FCGWAFES.js → global-procedures-3DJUA5OX.js} +3 -3
- package/dist/{graph-auto-extract-RUQC5IIS.js → graph-auto-extract-2I44WRDY.js} +2 -2
- package/dist/hooks/bug-report-worker.js +11 -11
- package/dist/hooks/codex-stop-task-finalizer.js +11 -11
- package/dist/hooks/commit-complete.js +11 -11
- package/dist/hooks/error-recall.js +6 -6
- package/dist/hooks/exe-heartbeat-hook.js +3 -3
- package/dist/hooks/ingest-worker.js +3 -2
- package/dist/hooks/ingest.js +6 -6
- package/dist/hooks/instructions-loaded.js +4 -4
- package/dist/hooks/manifest.json +20 -20
- package/dist/hooks/notification.js +4 -4
- package/dist/hooks/post-compact.js +10 -10
- package/dist/hooks/post-tool-combined.js +6 -6
- package/dist/hooks/pre-compact.js +14 -13
- package/dist/hooks/pre-tool-use.js +14 -14
- package/dist/hooks/prompt-submit.js +22 -22
- package/dist/hooks/session-end.js +19 -18
- package/dist/hooks/session-start.js +11 -11
- package/dist/hooks/stop.js +70 -17
- package/dist/hooks/subagent-stop.js +10 -10
- package/dist/hooks/summary-worker.js +17 -16
- package/dist/index.js +17 -17
- package/dist/{installer-7SMJC3SX.js → installer-6MQCAHUG.js} +5 -5
- package/dist/{installer-GFZVC43I.js → installer-TCMPFSSP.js} +5 -5
- package/dist/{installer-34DCTB5B.js → installer-ZY2BKTEO.js} +5 -5
- package/dist/lib/cloud-sync.js +4 -4
- package/dist/lib/consolidation.js +5 -5
- package/dist/lib/database.js +2 -2
- package/dist/lib/db-daemon-client.js +58 -13
- package/dist/lib/db.js +2 -2
- package/dist/lib/embedder.js +3 -2
- package/dist/lib/employee-templates.js +4 -4
- package/dist/lib/employees.js +2 -2
- package/dist/lib/exe-daemon-client.js +2 -1
- package/dist/lib/exe-daemon.js +266 -104
- package/dist/lib/hybrid-search.js +5 -5
- package/dist/lib/identity.js +2 -2
- package/dist/lib/messaging.js +9 -9
- package/dist/lib/reminders.js +3 -3
- package/dist/lib/schedules.js +5 -5
- package/dist/lib/session-registry.js +4 -4
- package/dist/lib/skill-learning.js +4 -4
- package/dist/lib/store.js +4 -4
- package/dist/lib/task-router.js +3 -3
- package/dist/lib/tasks.js +10 -10
- package/dist/lib/tmux-routing.js +8 -8
- package/dist/lib/token-spend.js +3 -3
- package/dist/mcp/register-tools.js +59 -56
- package/dist/mcp/server.js +60 -57
- package/dist/mcp/tools/complete-reminder.js +4 -4
- package/dist/mcp/tools/create-reminder.js +4 -4
- package/dist/mcp/tools/create-task.js +12 -12
- package/dist/mcp/tools/deactivate-behavior.js +5 -5
- package/dist/mcp/tools/list-reminders.js +4 -4
- package/dist/mcp/tools/list-tasks.js +12 -12
- package/dist/mcp/tools/send-message.js +11 -11
- package/dist/mcp/tools/update-task.js +11 -11
- package/dist/{mcp-http-config-MZMHKMJC.js → mcp-http-config-VUDZ3D5D.js} +3 -3
- package/dist/{memory-cards-3SFXU6IP.js → memory-cards-ZOOPC2WF.js} +2 -2
- package/dist/{memory-graph-extractor-T57YQQCW.js → memory-graph-extractor-RRQMUBMI.js} +3 -3
- package/dist/{memory-poisoning-defense-O53AHMTZ.js → memory-poisoning-defense-UQMNLG6H.js} +2 -2
- package/dist/{memory-queue-client-ITWQIFSD.js → memory-queue-client-TPQDAA4D.js} +3 -2
- package/dist/{memory-reflection-YPP2JC2S.js → memory-reflection-GSGXAGXV.js} +2 -2
- package/dist/{notifications-BETWD6EK.js → notifications-ZKGLZVCU.js} +8 -8
- package/dist/{orchestration-events-A5D52NXX.js → orchestration-events-7RMWC5SS.js} +3 -3
- package/dist/{orchestrator-X564XCWC.js → orchestrator-A6MX2OHA.js} +10 -10
- package/dist/{pipeline-router-RVHLL7UA.js → pipeline-router-6ZBYJD2U.js} +3 -3
- package/dist/{plan-limits-ANAVC6PM.js → plan-limits-4XH4A7IA.js} +3 -3
- package/dist/{project-boot-ENMCAL7G.js → project-boot-7ZEIDWUG.js} +3 -2
- package/dist/{projection-worker-O3HBG5QK.js → projection-worker-YKKBNQZT.js} +130 -51
- package/dist/{reranker-SRJL4IWB.js → reranker-CE3XG56J.js} +1 -1
- package/dist/{review-polling-5JTTHHEO.js → review-polling-PK3CY4NI.js} +9 -9
- package/dist/runtime/index.js +11 -11
- package/dist/{session-events-RCSYHQQ2.js → session-events-IYU6FYHH.js} +9 -9
- package/dist/{session-kill-telemetry-AL3H4ELS.js → session-kill-telemetry-G2VV4CAH.js} +3 -3
- package/dist/{session-scope-ZB4SR3AX.js → session-scope-DHTVH3D4.js} +8 -8
- package/dist/{setup-wizard-HXTADFXI.js → setup-wizard-IA5ISHQ2.js} +1 -1
- package/dist/{skill-refinement-TT4VDYYW.js → skill-refinement-6PBAFLWP.js} +2 -2
- package/dist/{stack-release-7WDKQOCO.js → stack-release-NW7MV3WV.js} +41 -11
- package/dist/{stack-update-F4CQWMGV.js → stack-update-5SM62R3O.js} +3 -1
- package/dist/{steward-gate-HSV67KLF.js → steward-gate-EQV6CZKY.js} +3 -3
- package/dist/support-outbox-SZVLHHZG.js +295 -0
- package/dist/{task-enforcement-A6AZTYAN.js → task-enforcement-2LS5DOXK.js} +8 -8
- package/dist/{task-scope-XKNAY5S7.js → task-scope-AKF3CSWO.js} +8 -8
- package/dist/{tasks-crud-F732BVOE.js → tasks-crud-KOIA5SAH.js} +8 -8
- package/dist/{tasks-notify-LJ65U7DF.js → tasks-notify-7ZTE4ZQM.js} +9 -9
- package/dist/{tasks-review-Y5F4HRAR.js → tasks-review-VMMMAK2Y.js} +8 -8
- package/dist/{telemetry-upload-HVYO6FL3.js → telemetry-upload-YLW4NAUF.js} +15 -8
- package/dist/{token-budget-VODGJYKX.js → token-budget-NA4OLFNP.js} +2 -2
- package/dist/{tool-capability-index-PZWWVABO.js → tool-capability-index-C73KVY5O.js} +1 -1
- package/dist/{tool-telemetry-5BSTF3P6.js → tool-telemetry-OVI5KL4S.js} +1 -1
- package/dist/tui/App.js +16 -16
- package/dist/{tui-data-EHJWRNRZ.js → tui-data-5NT24CC5.js} +8 -8
- package/dist/{worker-gate-4AS4K7G4.js → worker-gate-AQLJUQ5G.js} +1 -1
- package/dist/{workflow-engine-BXGNFNUW.js → workflow-engine-TRGGUNIZ.js} +2 -2
- package/dist/{worktree-3N5BPITS.js → worktree-NK7GZNEA.js} +4 -4
- package/dist/worktree-sweep-5XVZCH6A.js +18 -0
- package/package.json +3 -2
- package/release-notes.json +33 -33
- package/stack.release.json +48 -48
- package/dist/prediction-log-DOEOHDHS.js +0 -120
- package/dist/support-outbox-KEJ73I3F.js +0 -206
- /package/dist/{chunk-AWVDA2FL.js → chunk-2H3FVAN3.js} +0 -0
- /package/dist/{chunk-VPHOOQLR.js → chunk-3GHTBVZO.js} +0 -0
- /package/dist/{chunk-CCPCIW4Z.js → chunk-BBPRL2MP.js} +0 -0
- /package/dist/{chunk-Y2FVN7CX.js → chunk-EYLQRPHF.js} +0 -0
- /package/dist/{chunk-4S5TEBXD.js → chunk-H6QJT5O5.js} +0 -0
- /package/dist/{chunk-FCII2MMI.js → chunk-J5CAYOJU.js} +0 -0
- /package/dist/{chunk-LY2DYTDL.js → chunk-RFJESVEL.js} +0 -0
- /package/dist/{chunk-GBHQ5TXO.js → chunk-UOOCGJUE.js} +0 -0
- /package/dist/{chunk-X2E6W3DB.js → chunk-VJXVTH3Q.js} +0 -0
- /package/dist/{core-memory-WFP2L52F.js → core-memory-VZFTGOFE.js} +0 -0
- /package/dist/{entity-boost-RTYXAOWV.js → entity-boost-OAB2PZQP.js} +0 -0
- /package/dist/{message-queue-client-2CACBUA4.js → message-queue-client-YTKTHAYO.js} +0 -0
- /package/dist/{wiki-acl-MS7QLQCR.js → wiki-acl-UCPOROPR.js} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# exe-os CUSTOMER VPS stack —
|
|
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=
|
|
22
|
-
GOTRUE_MAILER_AUTOCONFIRM=
|
|
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.
|
|
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.
|
|
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.
|
|
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=
|
|
44
|
-
EXE_MCP_HOST_BIND=
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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=
|
|
22
|
-
GOTRUE_MAILER_AUTOCONFIRM=
|
|
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.
|
|
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.
|
|
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.
|
|
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=
|
|
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.
|
|
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=
|
|
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:-
|
|
142
|
-
GOTRUE_MAILER_AUTOCONFIRM: ${GOTRUE_MAILER_AUTOCONFIRM:-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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: "
|
|
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:-
|
|
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.
|
|
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.
|
|
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:
|
|
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:-
|
|
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
|
|
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
|
-
- "
|
|
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:-
|
|
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
|
-
- "
|
|
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:-
|
|
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:-
|
|
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
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
-
const EXED_RELEASE_TAG = "v0.9.
|
|
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:${
|
|
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:${
|
|
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:${
|
|
23
|
-
export const MONITOR_AGENT_IMAGE_TAG = `${REGISTRY}/exe-monitor-agent:${
|
|
24
|
-
export const MONITOR_HUB_IMAGE_TAG = `${REGISTRY}/exe-monitor-hub:${
|
|
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 = "
|
|
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=
|
|
68
|
-
"GOTRUE_MAILER_AUTOCONFIRM=
|
|
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
|
-
|
|
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=
|
|
185
|
-
"GOTRUE_MAILER_AUTOCONFIRM=
|
|
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
|
-
|
|
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
|
-
|
|
288
|
+
name TEXT,
|
|
289
|
+
phone TEXT,
|
|
91
290
|
email TEXT,
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
source_id TEXT,
|
|
291
|
+
platform TEXT NOT NULL DEFAULT 'whatsapp',
|
|
292
|
+
platform_id TEXT,
|
|
95
293
|
metadata JSONB DEFAULT '{}'::jsonb,
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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
|
|
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
|
-
|
|
111
|
-
direction TEXT NOT NULL
|
|
112
|
-
content TEXT,
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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,
|
|
120
|
-
CREATE INDEX IF NOT EXISTS idx_filtered_conversations_ts ON filtered.conversations (
|
|
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
|
-
|
|
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);
|