@askexenow/exe-os 0.9.156 → 0.9.157

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.
@@ -0,0 +1,34 @@
1
+ # Protected Files — NEVER overwritten by stack-update
2
+
3
+ These files contain customer configuration. `exe-os stack-update` MUST NOT
4
+ touch them. If a file needs to change, the update should add a NEW file
5
+ and log a migration notice, not replace the existing one.
6
+
7
+ ## Config files (bind-mounted, customer-owned after first setup)
8
+ - `.env` — all secrets, tokens, passwords (PATCHED, never replaced)
9
+ - `gateway.json` — WhatsApp adapter config, account names
10
+ - `branding.json` — customer brand colors, fonts, logo
11
+ - `cloudflared/config.yml` — tunnel ID, credentials, ingress routes
12
+ - `cloudflared/*.json` — tunnel credential files
13
+
14
+ ## Data volumes (Docker managed, persist across updates)
15
+ - `postgres_data` — all database data (CRM, wiki, graph, raw, gateway)
16
+ - `gateway_data` — Baileys WhatsApp auth state (creds.json, sessions)
17
+ - `wiki_data` — uploaded documents, workspace storage
18
+ - `crm_data` — CRM local file storage
19
+ - `monitor_hub_data` — PocketBase data, alert history
20
+ - `monitor_agent_data` — agent metrics cache
21
+ - `redis_data` — CRM job queue, session cache
22
+ - `clickhouse_data` — CRM analytics
23
+ - `exe_os_data` — daemon state, SQLCipher memory DB
24
+
25
+ ## What CAN be updated safely
26
+ - Docker images (pulled, not built locally)
27
+ - `init-db.sql` (only runs on FIRST postgres boot, not on restarts)
28
+ - `docker-compose.yml` (can be replaced — it references configs by path)
29
+ - Deploy scripts (setup.sh, backup.sh, status.sh)
30
+
31
+ ## Golden rule
32
+ If `docker compose down && docker compose up -d` loses customer data
33
+ or config, the compose is WRONG. Volumes and bind mounts must survive
34
+ any container lifecycle operation EXCEPT `docker compose down -v`.
@@ -1,37 +1,117 @@
1
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.
2
+ # exe-os stack backup full data + config, portable to any destination.
3
+ #
4
+ # Usage:
5
+ # ./backup.sh # Backup to /opt/exe-backups/
6
+ # ./backup.sh --output /tmp/backup # Backup to custom dir
7
+ # ./backup.sh --download # Create backup + print download command
8
+ # ./backup.sh --upload-r2 # Backup + upload to Cloudflare R2
9
+ # ./backup.sh --upload-s3 s3://bucket # Backup + upload to S3
10
+ #
4
11
  set -euo pipefail
5
12
 
6
13
  BACKUP_DIR="${BACKUP_DIR:-/opt/exe-backups}"
7
14
  RETENTION_DAYS="${BACKUP_RETENTION_DAYS:-7}"
8
15
  DATE=$(date +%Y%m%d-%H%M%S)
9
- COMPOSE_DIR="$(cd "$(dirname "$0")" && pwd)"
16
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
17
+ DOWNLOAD_MODE=false
18
+ UPLOAD_R2=false
19
+ UPLOAD_S3=""
20
+
21
+ while [[ $# -gt 0 ]]; do
22
+ case $1 in
23
+ --output) BACKUP_DIR="$2"; shift 2;;
24
+ --download) DOWNLOAD_MODE=true; shift;;
25
+ --upload-r2) UPLOAD_R2=true; shift;;
26
+ --upload-s3) UPLOAD_S3="$2"; shift 2;;
27
+ *) shift;;
28
+ esac
29
+ done
10
30
 
11
31
  mkdir -p "$BACKUP_DIR"
32
+ ARCHIVE="$BACKUP_DIR/exe-backup-$DATE"
33
+ mkdir -p "$ARCHIVE"
12
34
 
13
- echo "[backup] Starting exe-os stack backup ($DATE)"
35
+ echo "[backup] Starting exe-os full stack backup ($DATE)"
14
36
 
15
37
  # 1. Postgres dump (all databases)
16
38
  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)"
39
+ docker exec exe-db pg_dumpall -U exe > "$ARCHIVE/postgres.sql" 2>/dev/null || echo "[backup] Postgres dump failed"
40
+ gzip "$ARCHIVE/postgres.sql" 2>/dev/null || true
41
+
42
+ # 2. Customer config files (.env, gateway.json, branding.json, cloudflared)
43
+ echo "[backup] Backing up config files..."
44
+ cp "$SCRIPT_DIR/.env" "$ARCHIVE/env.bak" 2>/dev/null || true
45
+ cp "$SCRIPT_DIR/gateway.json" "$ARCHIVE/gateway.json" 2>/dev/null || true
46
+ cp "$SCRIPT_DIR/branding.json" "$ARCHIVE/branding.json" 2>/dev/null || true
47
+ cp -r "$SCRIPT_DIR/cloudflared" "$ARCHIVE/cloudflared" 2>/dev/null || true
20
48
 
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"
49
+ # 3. Gateway auth state (Baileys creds — critical for WhatsApp connection)
50
+ echo "[backup] Backing up gateway WhatsApp auth state..."
51
+ docker cp exe-gateway:/data/. "$ARCHIVE/gateway-data/" 2>/dev/null || echo "[backup] Gateway data skipped"
25
52
 
26
- # 3. Wiki storage (uploaded docs)
53
+ # 4. Wiki storage (uploaded documents)
27
54
  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"
55
+ docker cp exe-wiki:/app/server/storage/. "$ARCHIVE/wiki-storage/" 2>/dev/null || echo "[backup] Wiki storage skipped"
56
+
57
+ # 5. exe-os daemon state (optional — SQLCipher DB is local-first, not critical for VPS)
58
+ echo "[backup] Backing up exe-os state..."
59
+ docker cp exe-os:/home/exed/.exe-os/. "$ARCHIVE/exe-os-data/" 2>/dev/null || echo "[backup] exe-os data skipped"
60
+
61
+ # 6. Create single archive
62
+ echo "[backup] Creating archive..."
63
+ TARFILE="$BACKUP_DIR/exe-backup-$DATE.tar.gz"
64
+ tar -czf "$TARFILE" -C "$BACKUP_DIR" "exe-backup-$DATE" 2>/dev/null
65
+ rm -rf "$ARCHIVE"
66
+ echo "[backup] Archive: $TARFILE ($(du -h "$TARFILE" | cut -f1))"
30
67
 
31
- # 4. Retention — delete backups older than N days
68
+ # 7. Retention — delete old backups
32
69
  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
70
+ find "$BACKUP_DIR" -name "exe-backup-*.tar.gz" -mtime "+$RETENTION_DAYS" -delete 2>/dev/null
71
+
72
+ # 8. Download instructions
73
+ if $DOWNLOAD_MODE; then
74
+ echo ""
75
+ echo "=== Download to your local machine ==="
76
+ echo "Run on your local machine:"
77
+ echo ""
78
+ HOSTNAME=$(hostname)
79
+ IP=$(curl -s ifconfig.me 2>/dev/null || echo "<VPS_IP>")
80
+ echo " scp root@$IP:$TARFILE ./exe-backup-$DATE.tar.gz"
81
+ echo ""
82
+ echo "Or via Tailscale:"
83
+ TS_IP=$(tailscale ip -4 2>/dev/null || echo "<TAILSCALE_IP>")
84
+ echo " scp root@$TS_IP:$TARFILE ./exe-backup-$DATE.tar.gz"
85
+ echo ""
86
+ echo "To restore on a new VPS:"
87
+ echo " tar -xzf exe-backup-$DATE.tar.gz"
88
+ echo " cp env.bak /opt/exe-stack/.env"
89
+ echo " cp gateway.json /opt/exe-stack/"
90
+ echo " cp branding.json /opt/exe-stack/"
91
+ echo " cp -r cloudflared/ /opt/exe-stack/"
92
+ echo " cat postgres.sql.gz | gunzip | docker exec -i exe-db psql -U exe"
93
+ echo " docker compose up -d"
94
+ fi
95
+
96
+ # 9. Upload to R2 (Cloudflare)
97
+ if $UPLOAD_R2; then
98
+ echo "[backup] Uploading to Cloudflare R2..."
99
+ if command -v rclone >/dev/null 2>&1; then
100
+ rclone copy "$TARFILE" r2:exe-backups/ 2>&1 && echo "[backup] R2 upload complete" || echo "[backup] R2 upload failed"
101
+ elif command -v aws >/dev/null 2>&1; then
102
+ aws s3 cp "$TARFILE" "s3://exe-backups/$(basename "$TARFILE")" --endpoint-url "${R2_ENDPOINT:-}" 2>&1 || echo "[backup] R2 upload failed — configure R2_ENDPOINT"
103
+ else
104
+ echo "[backup] Install rclone or aws-cli for R2 upload"
105
+ fi
106
+ fi
107
+
108
+ # 10. Upload to S3
109
+ if [[ -n "$UPLOAD_S3" ]]; then
110
+ echo "[backup] Uploading to S3..."
111
+ aws s3 cp "$TARFILE" "$UPLOAD_S3/$(basename "$TARFILE")" 2>&1 && echo "[backup] S3 upload complete" || echo "[backup] S3 upload failed"
112
+ fi
35
113
 
36
- echo "[backup] Done. Backups at $BACKUP_DIR:"
37
- ls -lh "$BACKUP_DIR"/*.gz 2>/dev/null | tail -5
114
+ echo "[backup] Done."
115
+ echo ""
116
+ echo "Backups:"
117
+ ls -lh "$BACKUP_DIR"/exe-backup-*.tar.gz 2>/dev/null | tail -5
@@ -0,0 +1,73 @@
1
+ #!/usr/bin/env bash
2
+ # exe-os stack restore — restore from a backup archive.
3
+ #
4
+ # Usage:
5
+ # ./restore.sh /path/to/exe-backup-YYYYMMDD-HHMMSS.tar.gz
6
+ #
7
+ # WARNING: This overwrites current config and database. Make a backup first.
8
+ set -euo pipefail
9
+
10
+ RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m'
11
+ info() { echo -e "${GREEN}[restore]${NC} $1"; }
12
+ warn() { echo -e "${YELLOW}[restore]${NC} $1"; }
13
+ err() { echo -e "${RED}[restore]${NC} $1" >&2; }
14
+
15
+ ARCHIVE="${1:-}"
16
+ [[ -z "$ARCHIVE" ]] && { err "Usage: ./restore.sh <backup-archive.tar.gz>"; exit 1; }
17
+ [[ ! -f "$ARCHIVE" ]] && { err "File not found: $ARCHIVE"; exit 1; }
18
+
19
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
20
+ TEMP_DIR=$(mktemp -d)
21
+ trap "rm -rf $TEMP_DIR" EXIT
22
+
23
+ info "Extracting backup..."
24
+ tar -xzf "$ARCHIVE" -C "$TEMP_DIR"
25
+ BACKUP_DIR=$(ls -d "$TEMP_DIR"/exe-backup-* 2>/dev/null | head -1)
26
+ [[ -z "$BACKUP_DIR" ]] && { err "Invalid backup archive — no exe-backup-* directory found"; exit 1; }
27
+
28
+ echo ""
29
+ warn "This will OVERWRITE current config and restore the database."
30
+ warn "Current data will be LOST. Make sure you have a backup of the current state."
31
+ read -p "Type 'RESTORE' to confirm: " CONFIRM
32
+ [[ "$CONFIRM" != "RESTORE" ]] && { err "Aborted."; exit 1; }
33
+
34
+ # 1. Restore config files
35
+ info "Restoring config files..."
36
+ [[ -f "$BACKUP_DIR/env.bak" ]] && cp "$BACKUP_DIR/env.bak" "$SCRIPT_DIR/.env" && info ".env restored"
37
+ [[ -f "$BACKUP_DIR/gateway.json" ]] && cp "$BACKUP_DIR/gateway.json" "$SCRIPT_DIR/gateway.json" && info "gateway.json restored"
38
+ [[ -f "$BACKUP_DIR/branding.json" ]] && cp "$BACKUP_DIR/branding.json" "$SCRIPT_DIR/branding.json" && info "branding.json restored"
39
+ [[ -d "$BACKUP_DIR/cloudflared" ]] && cp -r "$BACKUP_DIR/cloudflared" "$SCRIPT_DIR/" && info "cloudflared config restored"
40
+
41
+ # 2. Restore postgres
42
+ if [[ -f "$BACKUP_DIR/postgres.sql.gz" ]]; then
43
+ info "Restoring postgres database..."
44
+ docker compose up -d exe-db 2>/dev/null
45
+ sleep 5 # wait for postgres to be ready
46
+ gunzip -c "$BACKUP_DIR/postgres.sql.gz" | docker exec -i exe-db psql -U exe 2>/dev/null
47
+ info "Postgres restored"
48
+ fi
49
+
50
+ # 3. Restore gateway auth state
51
+ if [[ -d "$BACKUP_DIR/gateway-data" ]]; then
52
+ info "Restoring gateway WhatsApp auth state..."
53
+ docker compose up -d exe-gateway 2>/dev/null
54
+ sleep 3
55
+ docker cp "$BACKUP_DIR/gateway-data/." exe-gateway:/data/ 2>/dev/null
56
+ docker restart exe-gateway 2>/dev/null
57
+ info "Gateway auth state restored (WhatsApp should reconnect)"
58
+ fi
59
+
60
+ # 4. Restore wiki storage
61
+ if [[ -d "$BACKUP_DIR/wiki-storage" ]]; then
62
+ info "Restoring wiki storage..."
63
+ docker compose up -d exe-wiki 2>/dev/null
64
+ sleep 3
65
+ docker cp "$BACKUP_DIR/wiki-storage/." exe-wiki:/app/server/storage/ 2>/dev/null
66
+ info "Wiki storage restored"
67
+ fi
68
+
69
+ # 5. Start full stack
70
+ info "Starting full stack..."
71
+ docker compose up -d 2>&1
72
+
73
+ info "Restore complete. Run ./status.sh to verify."
@@ -508,11 +508,36 @@ async function runStackUpdate(options) {
508
508
  return { status: "planned", targetVersion: plan.targetVersion, changes: plan.changes, lockFile };
509
509
  }
510
510
  await postDeployAudit(options, "started", plan.targetVersion, previousVersion);
511
- const backupDir = path.join(path.dirname(options.envFile), ".exe-stack-backups");
511
+ const stackDir = path.dirname(options.envFile);
512
+ const backupDir = path.join(stackDir, ".exe-stack-backups");
512
513
  mkdirSync(backupDir, { recursive: true });
513
514
  const stamp = now().toISOString().replace(/[:.]/g, "-");
514
- const backupEnvFile = path.join(backupDir, `env-${stamp}.bak`);
515
+ const updateBackupDir = path.join(backupDir, `pre-update-${stamp}`);
516
+ mkdirSync(updateBackupDir, { recursive: true });
517
+ const backupEnvFile = path.join(updateBackupDir, "env.bak");
515
518
  writeFileSync(backupEnvFile, envRaw, { mode: 384 });
519
+ const protectedFiles = ["gateway.json", "branding.json"];
520
+ for (const f of protectedFiles) {
521
+ const src = path.join(stackDir, f);
522
+ try {
523
+ if (existsSync(src)) {
524
+ copyFileSync(src, path.join(updateBackupDir, f));
525
+ }
526
+ } catch {
527
+ }
528
+ }
529
+ const cfDir = path.join(stackDir, "cloudflared");
530
+ try {
531
+ if (existsSync(cfDir)) {
532
+ const cfBackup = path.join(updateBackupDir, "cloudflared");
533
+ mkdirSync(cfBackup, { recursive: true });
534
+ for (const f of readdirSync(cfDir)) {
535
+ copyFileSync(path.join(cfDir, f), path.join(cfBackup, f));
536
+ }
537
+ }
538
+ } catch {
539
+ }
540
+ console.log(`[stack-update] Config backed up to ${updateBackupDir}`);
516
541
  const updates = Object.fromEntries(plan.changes.map((c) => [c.key, c.after]));
517
542
  const patched = patchEnv(envRaw, updates);
518
543
  const tmp = `${options.envFile}.tmp-${process.pid}`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@askexenow/exe-os",
3
- "version": "0.9.156",
3
+ "version": "0.9.157",
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",
@@ -1,10 +1,11 @@
1
1
  {
2
- "current": "0.9.156",
2
+ "current": "0.9.157",
3
3
  "notes": {
4
- "0.9.156": {
5
- "version": "0.9.156",
4
+ "0.9.157": {
5
+ "version": "0.9.157",
6
6
  "date": "2026-05-28",
7
7
  "features": [
8
+ "update safety + portable backups + restore",
8
9
  "complete deployment readiness — all 14 second-pass blind spots fixed",
9
10
  "production-ready stack — all 15 blind spots fixed",
10
11
  "blocked task notification — ping dispatcher immediately on status change",
@@ -28,8 +29,7 @@
28
29
  "device-scoped behaviors — add device_id column + filter on load",
29
30
  "gateway prompt injection defense — 3-tier security hardening",
30
31
  "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"
32
+ "add task dependency tree visualization (action=dependency_tree)"
33
33
  ],
34
34
  "fixes": [
35
35
  "add scope import to prompt-submit — gate pass",
@@ -104,10 +104,11 @@
104
104
  "exe-daemon.ts kills old embed.pid process and cleans up"
105
105
  ]
106
106
  },
107
- "0.9.155": {
108
- "version": "0.9.155",
107
+ "0.9.156": {
108
+ "version": "0.9.156",
109
109
  "date": "2026-05-28",
110
110
  "features": [
111
+ "complete deployment readiness — all 14 second-pass blind spots fixed",
111
112
  "production-ready stack — all 15 blind spots fixed",
112
113
  "blocked task notification — ping dispatcher immediately on status change",
113
114
  "self-improving skills — usage tracking, success counting, and refinement daemon",
@@ -131,8 +132,7 @@
131
132
  "gateway prompt injection defense — 3-tier security hardening",
132
133
  "add diagnostics(action=\"merge_agent_memories\") for reassigning memories across agent IDs",
133
134
  "add task dependency tree visualization (action=dependency_tree)",
134
- "graceful COO auto-relaunch after context-full exit",
135
- "desktop push notifications on task completion (macOS/Linux)"
135
+ "graceful COO auto-relaunch after context-full exit"
136
136
  ],
137
137
  "fixes": [
138
138
  "add scope import to prompt-submit — gate pass",
@@ -207,10 +207,12 @@
207
207
  "exe-daemon.ts kills old embed.pid process and cleans up"
208
208
  ]
209
209
  },
210
- "0.9.154": {
211
- "version": "0.9.154",
210
+ "0.9.155": {
211
+ "version": "0.9.155",
212
212
  "date": "2026-05-28",
213
213
  "features": [
214
+ "production-ready stack — all 15 blind spots fixed",
215
+ "blocked task notification — ping dispatcher immediately on status change",
214
216
  "self-improving skills — usage tracking, success counting, and refinement daemon",
215
217
  "4 retrieval improvements — query expansion, stop words, contradiction resolution, abstention",
216
218
  "competitive roadmap — serverless tier, identity depth, self-improving skills, user modeling",
@@ -233,11 +235,13 @@
233
235
  "add diagnostics(action=\"merge_agent_memories\") for reassigning memories across agent IDs",
234
236
  "add task dependency tree visualization (action=dependency_tree)",
235
237
  "graceful COO auto-relaunch after context-full exit",
236
- "desktop push notifications on task completion (macOS/Linux)",
237
- "rename GHCR image exed → exe-os across all deploy/stack references",
238
- "passive daemon-restart detection — agents get one-time /mcp notice"
238
+ "desktop push notifications on task completion (macOS/Linux)"
239
239
  ],
240
240
  "fixes": [
241
+ "add scope import to prompt-submit — gate pass",
242
+ "add writeFileSync import to config.ts",
243
+ "persist cloud endpoint migration to config.json — stop logging on every boot",
244
+ "include memory_type in pushToPostgres metadata — was stripped on sync",
241
245
  "add scope import to daemon-orchestration — satisfies customer-readiness gate",
242
246
  "skill-refinement.ts — correct writeMemory field names + updateIdentity 3rd arg",
243
247
  "make skill lifecycle fields optional on Behavior interface — unblocks publish",
@@ -258,11 +262,7 @@
258
262
  "close remaining session-scoping findings from Bob's audit",
259
263
  "close 3 more session-scoping leaks from Bob's audit (LEAK-4, LEAK-7, LEAK-8)",
260
264
  "diagnostics check_update ENOENT + healthcheck timeout",
261
- "close 8 session-scoping leaks — daemon ALS trust + review cleanup + close-task + inbox",
262
- "correct graph column names in federated recall query",
263
- "review notifications never reached reviewer — signal file gate was dead code",
264
- "remove osascript fallback — desktop notifications use OSC 9 only on macOS",
265
- "generate valid UUIDs in projection worker stableId + add wiki.* projection"
265
+ "close 8 session-scoping leaks — daemon ALS trust + review cleanup + close-task + inbox"
266
266
  ],
267
267
  "security": [
268
268
  "fix shell injection, SSRF, socket leaks, backup validation",
@@ -279,6 +279,8 @@
279
279
  "fix 4 pricing tier bypass vulnerabilities (audit F1-F4)"
280
280
  ],
281
281
  "other": [
282
+ "rename memory schema → graph across codebase",
283
+ "unified access control — admin token + GoTrue across all services",
282
284
  "capture data pipeline spec — raw → filter → wiki + CRM projection",
283
285
  "bump to v0.9.149 — task lifecycle simplification + review notification fix",
284
286
  "capture gateway connection observability requirements (2026-05-28)",
@@ -301,19 +303,18 @@
301
303
  "v0.9.140 publish + heap cap 4GB (was 33% unbounded)",
302
304
  "PG-1 cross-repo entity federation design document",
303
305
  "add lint step + automated npm publish workflow",
304
- "audit: scoped SQL + package budget + TUI vendored + TODO classification",
305
- "add full readiness audit evidence",
306
- "roadmap: Cross-Repo Ontology — Palantir-level graph (PG-1 through PG-10)"
306
+ "audit: scoped SQL + package budget + TUI vendored + TODO classification"
307
307
  ],
308
308
  "migration_notes": [
309
309
  "If daemon goes down, agents will now fail instead of silently",
310
310
  "exe-daemon.ts kills old embed.pid process and cleans up"
311
311
  ]
312
312
  },
313
- "0.9.153": {
314
- "version": "0.9.153",
313
+ "0.9.154": {
314
+ "version": "0.9.154",
315
315
  "date": "2026-05-28",
316
316
  "features": [
317
+ "self-improving skills — usage tracking, success counting, and refinement daemon",
317
318
  "4 retrieval improvements — query expansion, stop words, contradiction resolution, abstention",
318
319
  "competitive roadmap — serverless tier, identity depth, self-improving skills, user modeling",
319
320
  "run database migrations before container swap in stack-update",
@@ -337,10 +338,14 @@
337
338
  "graceful COO auto-relaunch after context-full exit",
338
339
  "desktop push notifications on task completion (macOS/Linux)",
339
340
  "rename GHCR image exed → exe-os across all deploy/stack references",
340
- "passive daemon-restart detection — agents get one-time /mcp notice",
341
- "daemon restart orchestrator — single authority for all restart decisions"
341
+ "passive daemon-restart detection — agents get one-time /mcp notice"
342
342
  ],
343
343
  "fixes": [
344
+ "add scope import to daemon-orchestration — satisfies customer-readiness gate",
345
+ "skill-refinement.ts — correct writeMemory field names + updateIdentity 3rd arg",
346
+ "make skill lifecycle fields optional on Behavior interface — unblocks publish",
347
+ "session isolation for tmux kill — block cross-scope session kills",
348
+ "session-scope daemon, push, capacity, and cleanup (P0 #7-#13)",
344
349
  "add memory_type to crdt-sync MemoryRecord interface — unblocks publish",
345
350
  "session-scope daemon, push, capacity, cleanup (P0 #7-#9, #13)",
346
351
  "include memory_type in cloud sync push/pull + fix backfill re-sync",
@@ -355,17 +360,12 @@
355
360
  "add shipped_version to support triage + clean platform procedures",
356
361
  "close remaining session-scoping findings from Bob's audit",
357
362
  "close 3 more session-scoping leaks from Bob's audit (LEAK-4, LEAK-7, LEAK-8)",
363
+ "diagnostics check_update ENOENT + healthcheck timeout",
358
364
  "close 8 session-scoping leaks — daemon ALS trust + review cleanup + close-task + inbox",
359
365
  "correct graph column names in federated recall query",
360
- "diagnostics check_update ENOENT + healthcheck timeout",
361
366
  "review notifications never reached reviewer — signal file gate was dead code",
362
367
  "remove osascript fallback — desktop notifications use OSC 9 only on macOS",
363
- "generate valid UUIDs in projection worker stableId + add wiki.* projection",
364
- "RSS backpressure + safe Metal shutdown for embedding daemon OOM",
365
- "multi-Tom dispatch — per-task signal files + atomic claim + herd prevention",
366
- "restrict project_name='all' to coordinators only in list_tasks",
367
- "CRM Dockerfile multi-arch — BUILDPLATFORM for build stages, rebuild bcrypt",
368
- "enhance intercom log with caller/task/trigger metadata for tracing"
368
+ "generate valid UUIDs in projection worker stableId + add wiki.* projection"
369
369
  ],
370
370
  "security": [
371
371
  "fix shell injection, SSRF, socket leaks, backup validation",
@@ -413,10 +413,12 @@
413
413
  "exe-daemon.ts kills old embed.pid process and cleans up"
414
414
  ]
415
415
  },
416
- "0.9.150": {
417
- "version": "0.9.150",
416
+ "0.9.153": {
417
+ "version": "0.9.153",
418
418
  "date": "2026-05-28",
419
419
  "features": [
420
+ "4 retrieval improvements — query expansion, stop words, contradiction resolution, abstention",
421
+ "competitive roadmap — serverless tier, identity depth, self-improving skills, user modeling",
420
422
  "run database migrations before container swap in stack-update",
421
423
  "graph auto-extract from ARCHITECTURE.md — regex-based entity/relationship extraction",
422
424
  "migrate cloud.askexe.com → api.askexe.com as canonical endpoint",
@@ -439,11 +441,16 @@
439
441
  "desktop push notifications on task completion (macOS/Linux)",
440
442
  "rename GHCR image exed → exe-os across all deploy/stack references",
441
443
  "passive daemon-restart detection — agents get one-time /mcp notice",
442
- "daemon restart orchestrator — single authority for all restart decisions",
443
- "query router cache tuning + cross-session tasks + shared skills",
444
- "socket health probe + tmux env guard + reviewer queue fallback (features 1, 2)"
444
+ "daemon restart orchestrator — single authority for all restart decisions"
445
445
  ],
446
446
  "fixes": [
447
+ "add memory_type to crdt-sync MemoryRecord interface — unblocks publish",
448
+ "session-scope daemon, push, capacity, cleanup (P0 #7-#9, #13)",
449
+ "include memory_type in cloud sync push/pull + fix backfill re-sync",
450
+ "session-scope signal file system — prevent cross-session task/review bleed",
451
+ "session-scope notification routing — use row.session_scope over ambient",
452
+ "daemon NEVER guesses session from tmux — header-only routing",
453
+ "3 daemon bugs — context-full TTL override, API watchdog kill-after-3, idle-kill verify",
447
454
  "federated recall always searches code_context + graph — count threshold was useless",
448
455
  "make cross-repo guardrail task-aware — allow multi-repo work when task scope permits",
449
456
  "ONE postgres — replace crm-postgres with exe-db across entire stack",
@@ -461,14 +468,7 @@
461
468
  "multi-Tom dispatch — per-task signal files + atomic claim + herd prevention",
462
469
  "restrict project_name='all' to coordinators only in list_tasks",
463
470
  "CRM Dockerfile multi-arch — BUILDPLATFORM for build stages, rebuild bcrypt",
464
- "enhance intercom log with caller/task/trigger metadata for tracing",
465
- "project-scope review queries — no more cross-project review pollution",
466
- "remove unused getActiveAgent import in list-tasks",
467
- "project-scope ALL task queries — prevents cross-project pollution",
468
- "hash-based cloud pull conflict detection + indentation-aware Python/Rust chunker",
469
- "add sessionScopeFilter to worker-gate + create-task queries",
470
- "replace require() with ESM import in shouldAutoInstance",
471
- "intercom-check passes project_name to scanFromDb — prevents cross-project task pollution"
471
+ "enhance intercom log with caller/task/trigger metadata for tracing"
472
472
  ],
473
473
  "security": [
474
474
  "fix shell injection, SSRF, socket leaks, backup validation",
@@ -485,6 +485,7 @@
485
485
  "fix 4 pricing tier bypass vulnerabilities (audit F1-F4)"
486
486
  ],
487
487
  "other": [
488
+ "capture data pipeline spec — raw → filter → wiki + CRM projection",
488
489
  "bump to v0.9.149 — task lifecycle simplification + review notification fix",
489
490
  "capture gateway connection observability requirements (2026-05-28)",
490
491
  "bump to v0.9.146 for publish",
@@ -508,8 +509,7 @@
508
509
  "add lint step + automated npm publish workflow",
509
510
  "audit: scoped SQL + package budget + TUI vendored + TODO classification",
510
511
  "add full readiness audit evidence",
511
- "roadmap: Cross-Repo Ontology — Palantir-level graph (PG-1 through PG-10)",
512
- "capture mcp restart self-healing roadmap"
512
+ "roadmap: Cross-Repo Ontology — Palantir-level graph (PG-1 through PG-10)"
513
513
  ],
514
514
  "migration_notes": [
515
515
  "If daemon goes down, agents will now fail instead of silently",