@askexenow/exe-os 0.9.155 → 0.9.156
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/backup.sh +37 -0
- package/deploy/compose/branding.json +20 -0
- package/deploy/compose/docker-compose.yml +14 -0
- package/deploy/compose/setup.sh +166 -0
- package/deploy/compose/status.sh +48 -0
- package/package.json +1 -1
- package/release-notes.json +104 -104
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Automated backup for exe-os stack — runs daily via cron or systemd timer.
|
|
3
|
+
# Backs up: postgres (all databases), gateway auth state, wiki storage.
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
|
|
6
|
+
BACKUP_DIR="${BACKUP_DIR:-/opt/exe-backups}"
|
|
7
|
+
RETENTION_DAYS="${BACKUP_RETENTION_DAYS:-7}"
|
|
8
|
+
DATE=$(date +%Y%m%d-%H%M%S)
|
|
9
|
+
COMPOSE_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
10
|
+
|
|
11
|
+
mkdir -p "$BACKUP_DIR"
|
|
12
|
+
|
|
13
|
+
echo "[backup] Starting exe-os stack backup ($DATE)"
|
|
14
|
+
|
|
15
|
+
# 1. Postgres dump (all databases)
|
|
16
|
+
echo "[backup] Dumping postgres..."
|
|
17
|
+
docker exec exe-db pg_dumpall -U exe > "$BACKUP_DIR/postgres-$DATE.sql" 2>/dev/null
|
|
18
|
+
gzip "$BACKUP_DIR/postgres-$DATE.sql"
|
|
19
|
+
echo "[backup] Postgres: $(du -h "$BACKUP_DIR/postgres-$DATE.sql.gz" | cut -f1)"
|
|
20
|
+
|
|
21
|
+
# 2. Gateway auth state (Baileys creds)
|
|
22
|
+
echo "[backup] Backing up gateway auth state..."
|
|
23
|
+
docker cp exe-gateway:/data/. "$BACKUP_DIR/gateway-$DATE/" 2>/dev/null || echo "[backup] Gateway backup skipped (not running)"
|
|
24
|
+
tar -czf "$BACKUP_DIR/gateway-$DATE.tar.gz" -C "$BACKUP_DIR" "gateway-$DATE" 2>/dev/null && rm -rf "$BACKUP_DIR/gateway-$DATE"
|
|
25
|
+
|
|
26
|
+
# 3. Wiki storage (uploaded docs)
|
|
27
|
+
echo "[backup] Backing up wiki storage..."
|
|
28
|
+
docker cp exe-wiki:/app/server/storage/. "$BACKUP_DIR/wiki-$DATE/" 2>/dev/null || echo "[backup] Wiki backup skipped"
|
|
29
|
+
tar -czf "$BACKUP_DIR/wiki-$DATE.tar.gz" -C "$BACKUP_DIR" "wiki-$DATE" 2>/dev/null && rm -rf "$BACKUP_DIR/wiki-$DATE"
|
|
30
|
+
|
|
31
|
+
# 4. Retention — delete backups older than N days
|
|
32
|
+
echo "[backup] Cleaning backups older than $RETENTION_DAYS days..."
|
|
33
|
+
find "$BACKUP_DIR" -name "*.gz" -mtime "+$RETENTION_DAYS" -delete 2>/dev/null
|
|
34
|
+
find "$BACKUP_DIR" -name "*.sql" -mtime "+$RETENTION_DAYS" -delete 2>/dev/null
|
|
35
|
+
|
|
36
|
+
echo "[backup] Done. Backups at $BACKUP_DIR:"
|
|
37
|
+
ls -lh "$BACKUP_DIR"/*.gz 2>/dev/null | tail -5
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Exe OS",
|
|
3
|
+
"logo": null,
|
|
4
|
+
"colors": {
|
|
5
|
+
"primary": "#F5D76E",
|
|
6
|
+
"background": "#0F0E1A",
|
|
7
|
+
"surface": "rgba(245, 215, 110, 0.08)",
|
|
8
|
+
"text": "#f8f5ea",
|
|
9
|
+
"muted": "rgba(248, 245, 234, 0.72)"
|
|
10
|
+
},
|
|
11
|
+
"fonts": {
|
|
12
|
+
"heading": "Epilogue",
|
|
13
|
+
"body": "Manrope",
|
|
14
|
+
"mono": "Space Grotesk"
|
|
15
|
+
},
|
|
16
|
+
"support": {
|
|
17
|
+
"email": "support@askexe.com",
|
|
18
|
+
"url": "https://askexe.com"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -126,6 +126,11 @@ services:
|
|
|
126
126
|
API_EXTERNAL_URL: ${GOTRUE_EXTERNAL_URL:-https://auth.askexe.com}
|
|
127
127
|
GOTRUE_DISABLE_SIGNUP: ${GOTRUE_DISABLE_SIGNUP:-false}
|
|
128
128
|
GOTRUE_MAILER_AUTOCONFIRM: ${GOTRUE_MAILER_AUTOCONFIRM:-true}
|
|
129
|
+
GOTRUE_SMTP_HOST: ${SMTP_HOST:-}
|
|
130
|
+
GOTRUE_SMTP_PORT: ${SMTP_PORT:-587}
|
|
131
|
+
GOTRUE_SMTP_USER: ${SMTP_USER:-}
|
|
132
|
+
GOTRUE_SMTP_PASS: ${SMTP_PASS:-}
|
|
133
|
+
GOTRUE_SMTP_ADMIN_EMAIL: ${SMTP_FROM:-noreply@askexe.com}
|
|
129
134
|
ports:
|
|
130
135
|
- "127.0.0.1:${GOTRUE_HOST_PORT:-9999}:9999"
|
|
131
136
|
networks:
|
|
@@ -173,9 +178,14 @@ services:
|
|
|
173
178
|
image: ${CRM_IMAGE_TAG:-ghcr.io/askexe/exe-crm:v0.9.2}
|
|
174
179
|
container_name: exe-crm
|
|
175
180
|
restart: unless-stopped
|
|
181
|
+
# Auto-migrate on boot: run database init before starting the app.
|
|
182
|
+
# Twenty CRM won't create tables automatically — this ensures they exist.
|
|
183
|
+
command: ["sh", "-c", "yarn database:init:prod 2>/dev/null || true && node dist/src/main"]
|
|
176
184
|
depends_on:
|
|
177
185
|
exe-db:
|
|
178
186
|
condition: service_healthy
|
|
187
|
+
gotrue:
|
|
188
|
+
condition: service_healthy
|
|
179
189
|
clickhouse:
|
|
180
190
|
condition: service_healthy
|
|
181
191
|
redis:
|
|
@@ -261,9 +271,13 @@ services:
|
|
|
261
271
|
image: ${WIKI_IMAGE_TAG:-ghcr.io/askexe/exe-wiki:v0.9.2}
|
|
262
272
|
container_name: exe-wiki
|
|
263
273
|
restart: unless-stopped
|
|
274
|
+
# Wiki uses Prisma — runs migrate on boot via built-in entrypoint.
|
|
275
|
+
# If tables don't exist, Prisma creates them automatically.
|
|
264
276
|
depends_on:
|
|
265
277
|
exe-db:
|
|
266
278
|
condition: service_healthy
|
|
279
|
+
gotrue:
|
|
280
|
+
condition: service_healthy
|
|
267
281
|
env_file:
|
|
268
282
|
- path: .env
|
|
269
283
|
required: false
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# exe-os stack first-time setup — run once on a fresh VPS.
|
|
3
|
+
# Usage: ./setup.sh --client <name> --domain <domain> [--license <key>]
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
|
|
6
|
+
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m'
|
|
7
|
+
info() { echo -e "${GREEN}[setup]${NC} $1"; }
|
|
8
|
+
warn() { echo -e "${YELLOW}[setup]${NC} $1"; }
|
|
9
|
+
err() { echo -e "${RED}[setup]${NC} $1" >&2; }
|
|
10
|
+
|
|
11
|
+
# Parse args
|
|
12
|
+
CLIENT="" DOMAIN="" LICENSE=""
|
|
13
|
+
while [[ $# -gt 0 ]]; do
|
|
14
|
+
case $1 in
|
|
15
|
+
--client) CLIENT="$2"; shift 2;;
|
|
16
|
+
--domain) DOMAIN="$2"; shift 2;;
|
|
17
|
+
--license) LICENSE="$2"; shift 2;;
|
|
18
|
+
*) err "Unknown arg: $1"; exit 1;;
|
|
19
|
+
esac
|
|
20
|
+
done
|
|
21
|
+
[[ -z "$CLIENT" || -z "$DOMAIN" ]] && { err "Usage: ./setup.sh --client <name> --domain <domain>"; exit 1; }
|
|
22
|
+
|
|
23
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
24
|
+
cd "$SCRIPT_DIR"
|
|
25
|
+
|
|
26
|
+
# Step 1: Docker + GHCR auth
|
|
27
|
+
info "Step 1: Docker registry authentication"
|
|
28
|
+
if ! docker info >/dev/null 2>&1; then
|
|
29
|
+
err "Docker is not running. Install Docker first: https://docs.docker.com/engine/install/"
|
|
30
|
+
exit 1
|
|
31
|
+
fi
|
|
32
|
+
|
|
33
|
+
if [[ -f .ghcr-token ]]; then
|
|
34
|
+
info "Logging into GHCR with stored token..."
|
|
35
|
+
cat .ghcr-token | docker login ghcr.io -u exe-os-pull --password-stdin 2>/dev/null || true
|
|
36
|
+
elif [[ -n "${GHCR_TOKEN:-}" ]]; then
|
|
37
|
+
info "Logging into GHCR with GHCR_TOKEN env var..."
|
|
38
|
+
echo "$GHCR_TOKEN" | docker login ghcr.io -u exe-os-pull --password-stdin 2>/dev/null || true
|
|
39
|
+
else
|
|
40
|
+
warn "No GHCR token found. Set GHCR_TOKEN env var or create .ghcr-token file."
|
|
41
|
+
warn "Images must be pullable — public or pre-authed."
|
|
42
|
+
fi
|
|
43
|
+
|
|
44
|
+
# Step 2: Generate .env
|
|
45
|
+
info "Step 2: Generating .env file"
|
|
46
|
+
if [[ -f .env ]]; then
|
|
47
|
+
warn ".env already exists — skipping generation. Delete .env to regenerate."
|
|
48
|
+
else
|
|
49
|
+
if command -v node >/dev/null 2>&1; then
|
|
50
|
+
node -e "
|
|
51
|
+
const { generateEnv } = require('../../dist/deploy/compose/generate-env.js');
|
|
52
|
+
console.log(generateEnv({ clientName: '$CLIENT', domain: '$DOMAIN', licenseKey: '${LICENSE:-}' || undefined }));
|
|
53
|
+
" > .env 2>/dev/null || {
|
|
54
|
+
# Fallback: generate inline
|
|
55
|
+
info "Generating secrets inline..."
|
|
56
|
+
gen() { openssl rand -hex "$1"; }
|
|
57
|
+
cat > .env << ENVEOF
|
|
58
|
+
POSTGRES_USER=exe
|
|
59
|
+
POSTGRES_PASSWORD=$(gen 32)
|
|
60
|
+
POSTGRES_DB=exedb
|
|
61
|
+
CLICKHOUSE_DB=default
|
|
62
|
+
CLICKHOUSE_USER=exe
|
|
63
|
+
CLICKHOUSE_PASSWORD=$(gen 32)
|
|
64
|
+
REDIS_PASSWORD=$(gen 32)
|
|
65
|
+
GOTRUE_JWT_SECRET=$(gen 48)
|
|
66
|
+
GOTRUE_SITE_URL=https://crm.${DOMAIN}
|
|
67
|
+
GOTRUE_EXTERNAL_URL=https://auth.${DOMAIN}
|
|
68
|
+
GOTRUE_DISABLE_SIGNUP=false
|
|
69
|
+
GOTRUE_MAILER_AUTOCONFIRM=true
|
|
70
|
+
CRM_IMAGE_TAG=ghcr.io/askexe/exe-crm:v0.9.3
|
|
71
|
+
CRM_SERVER_URL=https://crm.${DOMAIN}
|
|
72
|
+
CRM_APP_SECRET=$(gen 48)
|
|
73
|
+
EXE_CRM_ADMIN_TOKEN=$(gen 48)
|
|
74
|
+
CRM_HOST_PORT=3000
|
|
75
|
+
WIKI_IMAGE_TAG=ghcr.io/askexe/exe-wiki:v0.9.4
|
|
76
|
+
WIKI_DB_SCHEMA=wiki
|
|
77
|
+
WIKI_VECTOR_DB=postgres
|
|
78
|
+
WIKI_AUTH_TOKEN=$(gen 48)
|
|
79
|
+
EXE_WIKI_ADMIN_TOKEN=$(gen 48)
|
|
80
|
+
WIKI_JWT_SECRET=$(gen 48)
|
|
81
|
+
WIKI_SIG_KEY=$(gen 48)
|
|
82
|
+
WIKI_SIG_SALT=$(gen 16)
|
|
83
|
+
WIKI_HOST_PORT=3001
|
|
84
|
+
EXE_OS_IMAGE_TAG=ghcr.io/askexe/exe-os:v0.9.155
|
|
85
|
+
EXED_MCP_TOKEN=$(gen 48)
|
|
86
|
+
EXED_DEVICE_ID=vps-${CLIENT}
|
|
87
|
+
EXE_CLOUD_SYNC_TO_POSTGRES=true
|
|
88
|
+
EXE_LICENSE_KEY=${LICENSE:-CHANGEME_EXE_LICENSE_KEY}
|
|
89
|
+
GATEWAY_IMAGE_TAG=ghcr.io/askexe/exe-gateway:v0.9.3
|
|
90
|
+
EXE_GATEWAY_AUTH_TOKEN=$(gen 48)
|
|
91
|
+
EXE_GATEWAY_WS_RELAY_AUTH_TOKEN=$(gen 48)
|
|
92
|
+
EXE_GATEWAY_WHATSAPP_VERIFY_TOKEN=$(gen 32)
|
|
93
|
+
API_ROUTER_URL=https://gateway.${DOMAIN}
|
|
94
|
+
GATEWAY_HTTP_HOST_PORT=3100
|
|
95
|
+
GATEWAY_WS_HOST_PORT=3101
|
|
96
|
+
MONITOR_HUB_IMAGE_TAG=ghcr.io/askexe/exe-monitor-hub:v0.9.4
|
|
97
|
+
MONITOR_AGENT_IMAGE_TAG=ghcr.io/askexe/exe-monitor-agent:v0.9.4
|
|
98
|
+
EXE_MONITOR_ADMIN_TOKEN=$(gen 48)
|
|
99
|
+
MONITOR_HUB_URL=https://monitor.${DOMAIN}
|
|
100
|
+
MONITOR_AGENT_TOKEN=CHANGEME_MONITOR_AGENT_TOKEN
|
|
101
|
+
MONITOR_AGENT_KEY=CHANGEME_MONITOR_AGENT_KEY
|
|
102
|
+
MONITOR_AGENT_LISTEN=:45876
|
|
103
|
+
MONITOR_HUB_PORT=8090
|
|
104
|
+
ENVEOF
|
|
105
|
+
}
|
|
106
|
+
fi
|
|
107
|
+
info ".env generated with auto-generated secrets"
|
|
108
|
+
fi
|
|
109
|
+
|
|
110
|
+
# Step 3: Cloudflared tunnel config
|
|
111
|
+
info "Step 3: Cloudflare Tunnel setup"
|
|
112
|
+
if [[ ! -f cloudflared/config.yml ]]; then
|
|
113
|
+
if [[ -f cloudflared/config.yml.example ]]; then
|
|
114
|
+
warn "Copy cloudflared/config.yml.example → cloudflared/config.yml"
|
|
115
|
+
warn "Then set TUNNEL_ID and DOMAIN in the config."
|
|
116
|
+
warn "Create tunnel: cloudflared tunnel create exe-${CLIENT}"
|
|
117
|
+
fi
|
|
118
|
+
else
|
|
119
|
+
info "Cloudflared config exists."
|
|
120
|
+
fi
|
|
121
|
+
|
|
122
|
+
# Step 4: Pull images
|
|
123
|
+
info "Step 4: Pulling Docker images..."
|
|
124
|
+
docker compose pull 2>&1 || { err "Image pull failed — check GHCR authentication"; exit 1; }
|
|
125
|
+
|
|
126
|
+
# Step 5: Start stack
|
|
127
|
+
info "Step 5: Starting stack..."
|
|
128
|
+
docker compose up -d 2>&1
|
|
129
|
+
|
|
130
|
+
# Step 6: Wait for health
|
|
131
|
+
info "Step 6: Waiting for services to be healthy..."
|
|
132
|
+
sleep 10
|
|
133
|
+
HEALTHY=0
|
|
134
|
+
for i in $(seq 1 30); do
|
|
135
|
+
COUNT=$(docker ps --filter "health=healthy" --format '{{.Names}}' | wc -l | tr -d ' ')
|
|
136
|
+
TOTAL=$(docker ps --format '{{.Names}}' | wc -l | tr -d ' ')
|
|
137
|
+
echo -ne "\r $COUNT/$TOTAL healthy (attempt $i/30)..."
|
|
138
|
+
if [[ "$COUNT" -ge "$TOTAL" ]]; then HEALTHY=1; break; fi
|
|
139
|
+
sleep 5
|
|
140
|
+
done
|
|
141
|
+
echo ""
|
|
142
|
+
[[ "$HEALTHY" -eq 1 ]] && info "All services healthy!" || warn "Some services not healthy yet — check docker ps"
|
|
143
|
+
|
|
144
|
+
# Step 7: Verify
|
|
145
|
+
info "Step 7: Verification"
|
|
146
|
+
docker ps --format 'table {{.Names}}\t{{.Status}}'
|
|
147
|
+
echo ""
|
|
148
|
+
info "Stack deployed! Next steps:"
|
|
149
|
+
echo " 1. Configure Cloudflare tunnel (if not done)"
|
|
150
|
+
echo " 2. Open https://crm.${DOMAIN} to create admin account"
|
|
151
|
+
echo " 3. Open https://wiki.${DOMAIN} to set up wiki"
|
|
152
|
+
echo " 4. Configure WhatsApp: edit gateway.json, restart gateway, pair at https://gateway.${DOMAIN}/pair/<name>"
|
|
153
|
+
echo " 5. Verify: curl https://crm.${DOMAIN}/healthz && curl https://wiki.${DOMAIN}/api/ping"
|
|
154
|
+
|
|
155
|
+
# Step 8: Firewall — ensure outbound HTTPS is open
|
|
156
|
+
info "Step 8: Checking network connectivity..."
|
|
157
|
+
if curl -s --max-time 5 https://ghcr.io >/dev/null 2>&1; then
|
|
158
|
+
info "Outbound HTTPS working (GHCR reachable)"
|
|
159
|
+
else
|
|
160
|
+
warn "Cannot reach ghcr.io — check firewall/network. Docker pulls will fail."
|
|
161
|
+
fi
|
|
162
|
+
if curl -s --max-time 5 https://api.cloudflare.com >/dev/null 2>&1; then
|
|
163
|
+
info "Cloudflare reachable"
|
|
164
|
+
else
|
|
165
|
+
warn "Cannot reach Cloudflare — tunnel won't work."
|
|
166
|
+
fi
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# exe-os stack health check — run anytime to verify all services.
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m'
|
|
6
|
+
|
|
7
|
+
echo "=== exe-os Stack Health ==="
|
|
8
|
+
echo ""
|
|
9
|
+
|
|
10
|
+
# Container status
|
|
11
|
+
echo "Containers:"
|
|
12
|
+
docker ps --format 'table {{.Names}}\t{{.Status}}' 2>/dev/null
|
|
13
|
+
echo ""
|
|
14
|
+
|
|
15
|
+
# Service health endpoints
|
|
16
|
+
echo "Service Endpoints:"
|
|
17
|
+
DOMAIN="${1:-localhost}"
|
|
18
|
+
check() {
|
|
19
|
+
local name=$1 url=$2
|
|
20
|
+
CODE=$(curl -sk -o /dev/null -w "%{http_code}" --max-time 5 "$url" 2>/dev/null || echo "000")
|
|
21
|
+
if [[ "$CODE" == "200" ]]; then
|
|
22
|
+
echo -e " ${GREEN}✅${NC} $name ($CODE)"
|
|
23
|
+
elif [[ "$CODE" == "401" ]]; then
|
|
24
|
+
echo -e " ${YELLOW}🔒${NC} $name ($CODE — auth required, service is up)"
|
|
25
|
+
else
|
|
26
|
+
echo -e " ${RED}❌${NC} $name ($CODE)"
|
|
27
|
+
fi
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
check "CRM" "http://127.0.0.1:3000/healthz"
|
|
31
|
+
check "Wiki" "http://127.0.0.1:3001/api/ping"
|
|
32
|
+
check "Gateway" "http://127.0.0.1:3100/health"
|
|
33
|
+
check "Monitor" "http://127.0.0.1:8090/api/health"
|
|
34
|
+
check "GoTrue" "http://127.0.0.1:9999/health"
|
|
35
|
+
check "exe-os" "http://127.0.0.1:8765/health"
|
|
36
|
+
|
|
37
|
+
echo ""
|
|
38
|
+
|
|
39
|
+
# Database
|
|
40
|
+
echo "Database:"
|
|
41
|
+
docker exec exe-db psql -U exe -d exedb -c "SELECT schemaname, COUNT(*) as tables FROM pg_tables WHERE schemaname NOT IN ('pg_catalog','information_schema') GROUP BY schemaname ORDER BY schemaname;" 2>/dev/null || echo " ❌ Cannot connect to database"
|
|
42
|
+
|
|
43
|
+
echo ""
|
|
44
|
+
|
|
45
|
+
# Disk/Memory
|
|
46
|
+
echo "Resources:"
|
|
47
|
+
echo " RAM: $(free -h 2>/dev/null | awk '/^Mem:/ {print $3 "/" $2}' || echo 'N/A')"
|
|
48
|
+
echo " Disk: $(df -h / 2>/dev/null | awk 'NR==2 {print $3 "/" $2 " (" $5 " used)"}' || echo 'N/A')"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@askexenow/exe-os",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.156",
|
|
4
4
|
"description": "AI employee operating system — persistent memory, task management, and multi-agent coordination for Claude Code.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"type": "module",
|
package/release-notes.json
CHANGED
|
@@ -1,6 +1,109 @@
|
|
|
1
1
|
{
|
|
2
|
-
"current": "0.9.
|
|
2
|
+
"current": "0.9.156",
|
|
3
3
|
"notes": {
|
|
4
|
+
"0.9.156": {
|
|
5
|
+
"version": "0.9.156",
|
|
6
|
+
"date": "2026-05-28",
|
|
7
|
+
"features": [
|
|
8
|
+
"complete deployment readiness — all 14 second-pass blind spots fixed",
|
|
9
|
+
"production-ready stack — all 15 blind spots fixed",
|
|
10
|
+
"blocked task notification — ping dispatcher immediately on status change",
|
|
11
|
+
"self-improving skills — usage tracking, success counting, and refinement daemon",
|
|
12
|
+
"4 retrieval improvements — query expansion, stop words, contradiction resolution, abstention",
|
|
13
|
+
"competitive roadmap — serverless tier, identity depth, self-improving skills, user modeling",
|
|
14
|
+
"run database migrations before container swap in stack-update",
|
|
15
|
+
"graph auto-extract from ARCHITECTURE.md — regex-based entity/relationship extraction",
|
|
16
|
+
"migrate cloud.askexe.com → api.askexe.com as canonical endpoint",
|
|
17
|
+
"federated recall — code_context + graph fallback when memory results weak",
|
|
18
|
+
"migrate cloud.askexe.com → api.askexe.com across all src/ defaults",
|
|
19
|
+
"rolling restart in stack-update — one service at a time with health verification",
|
|
20
|
+
"DMR benchmark harness + LoCoMo improvements for v0.9.145 evaluation",
|
|
21
|
+
"Windows/WSL support — WezTerm config + WSL detection in setup wizard",
|
|
22
|
+
"queryTaskRows() consolidation — single scoped query path for all task list operations",
|
|
23
|
+
"review signal files — reliable reviewer notification on update_task(done)",
|
|
24
|
+
"Ghostty-native notifications via OSC 9 — no more Script Editor popup",
|
|
25
|
+
"device-scoped behaviors — device_id column + filter in loading",
|
|
26
|
+
"dispatch reliability — 45s boot timeout, dispatch ack signals, agent heartbeat",
|
|
27
|
+
"setup wizard headless mode + daemon health check after restart",
|
|
28
|
+
"device-scoped behaviors — add device_id column + filter on load",
|
|
29
|
+
"gateway prompt injection defense — 3-tier security hardening",
|
|
30
|
+
"add diagnostics(action=\"merge_agent_memories\") for reassigning memories across agent IDs",
|
|
31
|
+
"add task dependency tree visualization (action=dependency_tree)",
|
|
32
|
+
"graceful COO auto-relaunch after context-full exit"
|
|
33
|
+
],
|
|
34
|
+
"fixes": [
|
|
35
|
+
"add scope import to prompt-submit — gate pass",
|
|
36
|
+
"add writeFileSync import to config.ts",
|
|
37
|
+
"persist cloud endpoint migration to config.json — stop logging on every boot",
|
|
38
|
+
"include memory_type in pushToPostgres metadata — was stripped on sync",
|
|
39
|
+
"add scope import to daemon-orchestration — satisfies customer-readiness gate",
|
|
40
|
+
"skill-refinement.ts — correct writeMemory field names + updateIdentity 3rd arg",
|
|
41
|
+
"make skill lifecycle fields optional on Behavior interface — unblocks publish",
|
|
42
|
+
"session isolation for tmux kill — block cross-scope session kills",
|
|
43
|
+
"session-scope daemon, push, capacity, and cleanup (P0 #7-#13)",
|
|
44
|
+
"add memory_type to crdt-sync MemoryRecord interface — unblocks publish",
|
|
45
|
+
"session-scope daemon, push, capacity, cleanup (P0 #7-#9, #13)",
|
|
46
|
+
"include memory_type in cloud sync push/pull + fix backfill re-sync",
|
|
47
|
+
"session-scope signal file system — prevent cross-session task/review bleed",
|
|
48
|
+
"session-scope notification routing — use row.session_scope over ambient",
|
|
49
|
+
"daemon NEVER guesses session from tmux — header-only routing",
|
|
50
|
+
"3 daemon bugs — context-full TTL override, API watchdog kill-after-3, idle-kill verify",
|
|
51
|
+
"federated recall always searches code_context + graph — count threshold was useless",
|
|
52
|
+
"make cross-repo guardrail task-aware — allow multi-repo work when task scope permits",
|
|
53
|
+
"ONE postgres — replace crm-postgres with exe-db across entire stack",
|
|
54
|
+
"smart session-scoping gate + last boot cleanup leak + triage_bug docs",
|
|
55
|
+
"add shipped_version to support triage + clean platform procedures",
|
|
56
|
+
"close remaining session-scoping findings from Bob's audit",
|
|
57
|
+
"close 3 more session-scoping leaks from Bob's audit (LEAK-4, LEAK-7, LEAK-8)",
|
|
58
|
+
"diagnostics check_update ENOENT + healthcheck timeout",
|
|
59
|
+
"close 8 session-scoping leaks — daemon ALS trust + review cleanup + close-task + inbox"
|
|
60
|
+
],
|
|
61
|
+
"security": [
|
|
62
|
+
"fix shell injection, SSRF, socket leaks, backup validation",
|
|
63
|
+
"bump v0.9.139 — 2 CRITICAL security fixes, 14 bug fixes, 6 features, customer config preservation",
|
|
64
|
+
"fix 2 CRITICAL + 1 HIGH from post-fix audit",
|
|
65
|
+
"validate X-Agent-Role against roster — prevent privilege escalation",
|
|
66
|
+
"release: stack v0.9.8 — security hardening + Hygo bug fixes",
|
|
67
|
+
"add webhook HMAC-SHA256 validation + disable query param auth in prod",
|
|
68
|
+
"pin GitHub Actions to SHAs, update jose to 6.2.3",
|
|
69
|
+
"harden support intake against abuse and data leakage",
|
|
70
|
+
"bump to v0.9.22 — Codex MCP parity + customer bug fixes + security audit remediation",
|
|
71
|
+
"audit: pre-hygo exe-gateway security report",
|
|
72
|
+
"add SECURITY.md — trust document for pre-install security evaluation",
|
|
73
|
+
"fix 4 pricing tier bypass vulnerabilities (audit F1-F4)"
|
|
74
|
+
],
|
|
75
|
+
"other": [
|
|
76
|
+
"rename memory schema → graph across codebase",
|
|
77
|
+
"unified access control — admin token + GoTrue across all services",
|
|
78
|
+
"capture data pipeline spec — raw → filter → wiki + CRM projection",
|
|
79
|
+
"bump to v0.9.149 — task lifecycle simplification + review notification fix",
|
|
80
|
+
"capture gateway connection observability requirements (2026-05-28)",
|
|
81
|
+
"bump to v0.9.146 for publish",
|
|
82
|
+
"Windows support architecture — WezTerm + WSL decision (2026-05-27)",
|
|
83
|
+
"Merge branch 'tom4-work' — device-scoped behaviors + push-notification fix",
|
|
84
|
+
"bump to v0.9.145 for publish",
|
|
85
|
+
"revert: keep workflow files unchanged — GitHub OAuth blocks workflow scope",
|
|
86
|
+
"stage remaining Yoshi fixes — features + bug cleanup",
|
|
87
|
+
"add tests for daemon restart orchestrator module",
|
|
88
|
+
"publish v0.9.144 — ESM require() fix + reliable task signals + OAuth 2.1",
|
|
89
|
+
"add MCP tool tests for message, cloud-sync, and file-copy",
|
|
90
|
+
"add coverage for send_message, cloud_sync, file_copy MCP tools (Track A)",
|
|
91
|
+
"Recover MCP sessions after daemon restart",
|
|
92
|
+
"publish v0.9.143 — all fixes live",
|
|
93
|
+
"publish v0.9.142",
|
|
94
|
+
"publish v0.9.141",
|
|
95
|
+
"ops: journalctl rotation + certbot expiry alerting",
|
|
96
|
+
"revert: daemon heap back to 33% of RAM — no artificial cap",
|
|
97
|
+
"v0.9.140 publish + heap cap 4GB (was 33% unbounded)",
|
|
98
|
+
"PG-1 cross-repo entity federation design document",
|
|
99
|
+
"add lint step + automated npm publish workflow",
|
|
100
|
+
"audit: scoped SQL + package budget + TUI vendored + TODO classification"
|
|
101
|
+
],
|
|
102
|
+
"migration_notes": [
|
|
103
|
+
"If daemon goes down, agents will now fail instead of silently",
|
|
104
|
+
"exe-daemon.ts kills old embed.pid process and cleans up"
|
|
105
|
+
]
|
|
106
|
+
},
|
|
4
107
|
"0.9.155": {
|
|
5
108
|
"version": "0.9.155",
|
|
6
109
|
"date": "2026-05-28",
|
|
@@ -412,109 +515,6 @@
|
|
|
412
515
|
"If daemon goes down, agents will now fail instead of silently",
|
|
413
516
|
"exe-daemon.ts kills old embed.pid process and cleans up"
|
|
414
517
|
]
|
|
415
|
-
},
|
|
416
|
-
"0.9.144": {
|
|
417
|
-
"version": "0.9.144",
|
|
418
|
-
"date": "2026-05-26",
|
|
419
|
-
"features": [
|
|
420
|
-
"close_task auto-merges PR + pulls main + builds + prunes + respawns",
|
|
421
|
-
"auto-respawn Tom after close_task if more tasks queued",
|
|
422
|
-
"message WAL fallback — messages survive daemon downtime",
|
|
423
|
-
"entity type hierarchy — subtypes with rollup queries (PG-2)",
|
|
424
|
-
"temporal validity windows for graph queries (PG-3)",
|
|
425
|
-
"backup restore CLI + restoreBackup function",
|
|
426
|
-
"ESLint setup + dependency hygiene + any type reduction",
|
|
427
|
-
"config(action=\"hire\") MCP tool — COO can hire employees directly",
|
|
428
|
-
"GM (General Manager) role template + hiring guidance",
|
|
429
|
-
"merge gate warning in close_task — catches unmerged PRs",
|
|
430
|
-
"behavior hygiene — platform procedure + COO identity + company procedure",
|
|
431
|
-
"MCP auto-reconnect to daemon — survives deploy restarts transparently",
|
|
432
|
-
"event-driven notifications — stop polling managers, let task state drive everything",
|
|
433
|
-
"MCP disconnect tracker + daemon observability",
|
|
434
|
-
"MCP lifecycle logging to file — FULL transparency on every disconnect",
|
|
435
|
-
"automatic P0 bug fixing — daemon auto-dispatch + GitHub Actions fallback",
|
|
436
|
-
"enforce worktrees for engineer sessions — prevent direct main commits",
|
|
437
|
-
"multi-device coordination — routing, handoff, device status",
|
|
438
|
-
"hook tamper protection — SHA-256 manifest + verification before spawn",
|
|
439
|
-
"governed collaborative memory — visibility tags + write governance",
|
|
440
|
-
"cache-sharing protocol — pub/sub memory bus for inter-agent sharing",
|
|
441
|
-
"multi-modal memory — media attachments on memories",
|
|
442
|
-
"comprehensive \"last 20%\" integration tests + audit_trail read path",
|
|
443
|
-
"wire memory poisoning defense into writeMemory() pipeline",
|
|
444
|
-
"memory poisoning defense — trust levels, anomaly detection, quarantine"
|
|
445
|
-
],
|
|
446
|
-
"fixes": [
|
|
447
|
-
"remove unused test imports blocking publish",
|
|
448
|
-
"resolve all typecheck errors — await-in-sync + type mismatches",
|
|
449
|
-
"remaining require() → ESM imports in daemon (db-backup, intercom, shutdown)",
|
|
450
|
-
"eliminate CJS require() from ESM daemon + reliable task signal delivery",
|
|
451
|
-
"migrate critical writeFileSync to atomicWrite — prevent corruption on crash (Track C)",
|
|
452
|
-
"security hardening — SQL injection lint + TUI input sanitize + MCP rate limiter (Track D)",
|
|
453
|
-
"clear public launch readiness blockers",
|
|
454
|
-
"prune old worktree on close_task before respawning fresh",
|
|
455
|
-
"exe-launch-agent resolves multi-instance names — tom2/tom3 no longer rejected",
|
|
456
|
-
"worktree isolation for all runtimes + token budget enforcement + atomic memory versioning",
|
|
457
|
-
"cross-device sync dedup — cooldown key prevents duplicate pushes",
|
|
458
|
-
"merge gate checks branch name not git author — was silently passing",
|
|
459
|
-
"resume_employee uses autoInstance — spawns tom2/tom3 for parallel",
|
|
460
|
-
"security hardening — fail-closed behavior auth gates",
|
|
461
|
-
"send_message intercom uses force:true — bypass 5-min debounce",
|
|
462
|
-
"global session cap 10→50 — match MCP session cap",
|
|
463
|
-
"/exe-call ALWAYS fires + tmux send-keys blocked for ALL agents",
|
|
464
|
-
"SIGTERM graceful shutdown — remove process.exit(0) from initMetrics",
|
|
465
|
-
"stale task escalation — surface alive-but-stalled agents to COO",
|
|
466
|
-
"cloud sync upsert + entity type hierarchy + temporal validity + file_copy security",
|
|
467
|
-
"daemon memory leak + duplicate watchdog + HTTP body limit + WAL flush",
|
|
468
|
-
"heap pressure alarm was false positive — compared heapUsed/heapTotal instead of heapUsed/heapLimit",
|
|
469
|
-
"strengthen scoped SQL audit — cover UPDATE/INSERT, expand exemptions",
|
|
470
|
-
"hard block tmux send-keys for non-coordinator agents",
|
|
471
|
-
"MCP disconnect procedure — explicitly block tmux send-keys workaround"
|
|
472
|
-
],
|
|
473
|
-
"security": [
|
|
474
|
-
"fix shell injection, SSRF, socket leaks, backup validation",
|
|
475
|
-
"bump v0.9.139 — 2 CRITICAL security fixes, 14 bug fixes, 6 features, customer config preservation",
|
|
476
|
-
"fix 2 CRITICAL + 1 HIGH from post-fix audit",
|
|
477
|
-
"validate X-Agent-Role against roster — prevent privilege escalation",
|
|
478
|
-
"release: stack v0.9.8 — security hardening + Hygo bug fixes",
|
|
479
|
-
"add webhook HMAC-SHA256 validation + disable query param auth in prod",
|
|
480
|
-
"pin GitHub Actions to SHAs, update jose to 6.2.3",
|
|
481
|
-
"harden support intake against abuse and data leakage",
|
|
482
|
-
"bump to v0.9.22 — Codex MCP parity + customer bug fixes + security audit remediation",
|
|
483
|
-
"audit: pre-hygo exe-gateway security report",
|
|
484
|
-
"add SECURITY.md — trust document for pre-install security evaluation",
|
|
485
|
-
"fix 4 pricing tier bypass vulnerabilities (audit F1-F4)"
|
|
486
|
-
],
|
|
487
|
-
"other": [
|
|
488
|
-
"publish v0.9.144 — ESM require() fix + reliable task signals + OAuth 2.1",
|
|
489
|
-
"add coverage for send_message, cloud_sync, file_copy MCP tools (Track A)",
|
|
490
|
-
"Recover MCP sessions after daemon restart",
|
|
491
|
-
"publish v0.9.143 — all fixes live",
|
|
492
|
-
"publish v0.9.142",
|
|
493
|
-
"publish v0.9.141",
|
|
494
|
-
"ops: journalctl rotation + certbot expiry alerting",
|
|
495
|
-
"revert: daemon heap back to 33% of RAM — no artificial cap",
|
|
496
|
-
"v0.9.140 publish + heap cap 4GB (was 33% unbounded)",
|
|
497
|
-
"PG-1 cross-repo entity federation design document",
|
|
498
|
-
"add lint step + automated npm publish workflow",
|
|
499
|
-
"audit: scoped SQL + package budget + TUI vendored + TODO classification",
|
|
500
|
-
"add full readiness audit evidence",
|
|
501
|
-
"roadmap: Cross-Repo Ontology — Palantir-level graph (PG-1 through PG-10)",
|
|
502
|
-
"capture mcp restart self-healing roadmap",
|
|
503
|
-
"Enforce chain of command task review parity",
|
|
504
|
-
"document raw SQL fallback in orchestrator auto-approve path",
|
|
505
|
-
"Finalize orchestration rollout fixes",
|
|
506
|
-
"Scope device governance task queries",
|
|
507
|
-
"bump v0.9.138 — 7 critical bug fixes, 10 features, 16 commits",
|
|
508
|
-
"bump v0.9.137 — Memanto typed schema, push notifications, lazy consolidation",
|
|
509
|
-
"bump v0.9.136 — daemon OOM fix, process monitor, auto-notify reviewer",
|
|
510
|
-
"bump v0.9.135 — code debt cleanup, 28 new tests, full observability",
|
|
511
|
-
"Codex MCP regression tests (18) + DB singleton integration tests (10)",
|
|
512
|
-
"release notes for v0.9.134"
|
|
513
|
-
],
|
|
514
|
-
"migration_notes": [
|
|
515
|
-
"If daemon goes down, agents will now fail instead of silently",
|
|
516
|
-
"exe-daemon.ts kills old embed.pid process and cleans up"
|
|
517
|
-
]
|
|
518
518
|
}
|
|
519
519
|
}
|
|
520
520
|
}
|