@askexenow/exe-os 0.9.146 → 0.9.148

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/deploy/compose/.env.customer.example +1 -1
  2. package/deploy/compose/.env.default +1 -1
  3. package/deploy/compose/.env.example +1 -1
  4. package/deploy/compose/README.md +1 -1
  5. package/deploy/compose/docker-compose.yml +16 -14
  6. package/dist/{backfill-metadata-5JOQOIN2.js → backfill-metadata-KMDWLDXU.js} +1 -1
  7. package/dist/bin/agentic-ontology-backfill.js +1 -1
  8. package/dist/bin/agentic-reflection-backfill.js +1 -1
  9. package/dist/bin/agentic-semantic-label.js +1 -1
  10. package/dist/bin/backfill-conversations.js +1 -1
  11. package/dist/bin/backfill-responses.js +1 -1
  12. package/dist/bin/backfill-vectors.js +1 -1
  13. package/dist/bin/bulk-sync-postgres.js +1 -1
  14. package/dist/bin/cleanup-stale-review-tasks.js +1 -1
  15. package/dist/bin/cli.js +5 -5
  16. package/dist/bin/customer-readiness.js +45 -7
  17. package/dist/bin/exe-agent.js +3 -3
  18. package/dist/bin/exe-assign.js +1 -1
  19. package/dist/bin/exe-boot.js +8 -6
  20. package/dist/bin/exe-call.js +3 -3
  21. package/dist/bin/exe-dispatch.js +1 -1
  22. package/dist/bin/exe-doctor.js +1 -1
  23. package/dist/bin/exe-export-behaviors.js +2 -2
  24. package/dist/bin/exe-forget.js +3 -3
  25. package/dist/bin/exe-gateway.js +1 -1
  26. package/dist/bin/exe-heartbeat.js +1 -1
  27. package/dist/bin/exe-kill.js +2 -2
  28. package/dist/bin/exe-launch-agent.js +5 -5
  29. package/dist/bin/exe-new-employee.js +3 -3
  30. package/dist/bin/exe-pending-messages.js +1 -1
  31. package/dist/bin/exe-pending-notifications.js +1 -1
  32. package/dist/bin/exe-pending-reviews.js +1 -1
  33. package/dist/bin/exe-rename.js +3 -3
  34. package/dist/bin/exe-review.js +2 -2
  35. package/dist/bin/exe-search.js +2 -2
  36. package/dist/bin/exe-session-cleanup.js +3 -3
  37. package/dist/bin/exe-start-codex.js +2 -2
  38. package/dist/bin/exe-start-opencode.js +1 -1
  39. package/dist/bin/exe-status.js +2 -2
  40. package/dist/bin/exe-team.js +1 -1
  41. package/dist/bin/git-sweep.js +1 -1
  42. package/dist/bin/graph-backfill.js +1 -1
  43. package/dist/bin/graph-export.js +2 -2
  44. package/dist/bin/intercom-check.js +1 -1
  45. package/dist/bin/pre-publish.js +1 -1
  46. package/dist/bin/scan-tasks.js +1 -1
  47. package/dist/bin/setup.js +1 -1
  48. package/dist/bin/shard-migrate.js +1 -1
  49. package/dist/bin/stack-update.js +1 -1
  50. package/dist/{catchup-brief-7HTF254M.js → catchup-brief-IPNSW7RQ.js} +2 -2
  51. package/dist/{chunk-KJFCQUQP.js → chunk-3MLGUSKS.js} +1 -1
  52. package/dist/{chunk-4LUI7MMY.js → chunk-4EINMZNO.js} +1 -1
  53. package/dist/{chunk-AAZ3MQIA.js → chunk-AGFWOII2.js} +1 -1
  54. package/dist/{chunk-CAXNZ4KN.js → chunk-FNMNKYVH.js} +12 -12
  55. package/dist/{chunk-HJWNO7MX.js → chunk-JF3Q5YKI.js} +1 -1
  56. package/dist/{chunk-IYDFOUK4.js → chunk-MKUVEDUE.js} +1 -1
  57. package/dist/{chunk-7J6OKCQX.js → chunk-NJKERRSG.js} +1 -1
  58. package/dist/{chunk-CVUFSWGC.js → chunk-UPMKSFBU.js} +1 -1
  59. package/dist/{chunk-GKFSZKUD.js → chunk-XWQKCCCO.js} +1 -1
  60. package/dist/{chunk-PMUKZYTR.js → chunk-Y6TS42WD.js} +1 -1
  61. package/dist/{chunk-6CSCJTGT.js → chunk-ZMJHXDZR.js} +1 -1
  62. package/dist/{chunk-4XO2533K.js → chunk-ZUAXTH6Z.js} +1 -1
  63. package/dist/{exe-export-C7GZLJJ2.js → exe-export-ADSWDE5U.js} +3 -3
  64. package/dist/{exe-import-E3ZOLEAC.js → exe-import-WFLNGJZP.js} +3 -3
  65. package/dist/{fast-db-init-JI5U4KWG.js → fast-db-init-HVAVS35N.js} +1 -1
  66. package/dist/gateway/index.js +2 -2
  67. package/dist/{git-task-sweep-EVITTAZE.js → git-task-sweep-RSRASAHB.js} +1 -1
  68. package/dist/{global-procedures-YJLTJ7EZ.js → global-procedures-EKYSVONR.js} +2 -2
  69. package/dist/hooks/bug-report-worker.js +1 -1
  70. package/dist/hooks/codex-stop-task-finalizer.js +1 -1
  71. package/dist/hooks/commit-complete.js +2 -2
  72. package/dist/hooks/error-recall.js +2 -2
  73. package/dist/hooks/instructions-loaded.js +1 -1
  74. package/dist/hooks/notification.js +1 -1
  75. package/dist/hooks/post-compact.js +1 -1
  76. package/dist/hooks/post-tool-combined.js +1 -1
  77. package/dist/hooks/pre-compact.js +1 -1
  78. package/dist/hooks/pre-tool-use.js +3 -3
  79. package/dist/hooks/prompt-submit.js +4 -4
  80. package/dist/hooks/session-end.js +3 -3
  81. package/dist/hooks/session-start.js +2 -2
  82. package/dist/hooks/stop.js +3 -3
  83. package/dist/hooks/subagent-stop.js +1 -1
  84. package/dist/hooks/summary-worker.js +1 -1
  85. package/dist/index.js +3 -3
  86. package/dist/lib/consolidation.js +2 -2
  87. package/dist/lib/employee-templates.js +3 -3
  88. package/dist/lib/hybrid-search.js +2 -2
  89. package/dist/lib/schedules.js +2 -2
  90. package/dist/lib/store.js +1 -1
  91. package/dist/mcp/register-tools.js +12 -12
  92. package/dist/mcp/server.js +12 -12
  93. package/dist/runtime/index.js +1 -1
  94. package/dist/{setup-wizard-3GVBHKHG.js → setup-wizard-QVNTI3T4.js} +1 -1
  95. package/dist/tui/App.js +3 -3
  96. package/package.json +1 -1
  97. package/release-notes.json +173 -173
  98. /package/dist/{chunk-UU6YYTYH.js → chunk-7B5DQGXG.js} +0 -0
  99. /package/dist/{chunk-I7KGNSNR.js → chunk-B4HAUSVQ.js} +0 -0
  100. /package/dist/{chunk-IGRIWAV4.js → chunk-CGQ5PWS3.js} +0 -0
  101. /package/dist/{chunk-RMSDKMFD.js → chunk-HHMHL4FB.js} +0 -0
  102. /package/dist/{chunk-44XTE6NK.js → chunk-UJMDHPIN.js} +0 -0
  103. /package/dist/{core-memory-KF6T4PMU.js → core-memory-C3JLISAU.js} +0 -0
  104. /package/dist/{exe-key-4275KC6R.js → exe-key-4L32R46F.js} +0 -0
@@ -5,7 +5,7 @@
5
5
  # --- Data Layer ---
6
6
  POSTGRES_USER=exe
7
7
  POSTGRES_PASSWORD=CHANGEME_POSTGRES_PASSWORD
8
- POSTGRES_DB=default
8
+ POSTGRES_DB=exedb
9
9
 
10
10
  CLICKHOUSE_DB=default
11
11
  CLICKHOUSE_USER=exe
@@ -23,7 +23,7 @@ GATEWAY_IMAGE_TAG=ghcr.io/askexe/exe-gateway:v0.9.1
23
23
  # ------------------------------------------------------------------
24
24
  POSTGRES_USER=exe
25
25
  POSTGRES_PASSWORD=CHANGEME_POSTGRES_PASSWORD
26
- POSTGRES_DB=default
26
+ POSTGRES_DB=exedb
27
27
  WIKI_DB_NAME=wiki
28
28
 
29
29
  # ------------------------------------------------------------------
@@ -5,7 +5,7 @@
5
5
  # --- Data Layer ---
6
6
  POSTGRES_USER=exe
7
7
  POSTGRES_PASSWORD=CHANGEME_POSTGRES_PASSWORD
8
- POSTGRES_DB=default
8
+ POSTGRES_DB=exedb
9
9
 
10
10
  CLICKHOUSE_DB=default
11
11
  CLICKHOUSE_USER=exe
@@ -23,7 +23,7 @@ unchanged; this directory is the full stack.
23
23
 
24
24
  | Service | Image | Pin source | Internal port |
25
25
  |----------------|-----------------------------------------------|------------------------|---------------|
26
- | `crm-postgres` | `postgres:16.6-alpine` | hard-pinned | 5432 |
26
+ | `exe-db` | `pgvector/pgvector:pg16` | hard-pinned | 5432 |
27
27
  | `clickhouse` | `clickhouse/clickhouse-server:24.8.4.13-alpine` | hard-pinned | 8123 / 9000 |
28
28
  | `redis` | `redis:7.4-alpine` | hard-pinned | 6379 |
29
29
  | `exe-crm` | `${CRM_IMAGE_TAG}` | `.env` | 3000 |
@@ -1,6 +1,7 @@
1
1
  # exe-os VPS stack — full production compose
2
2
  #
3
- # Services: exe-crm + crm-postgres + clickhouse + redis + exe-wiki + exed + exe-gateway
3
+ # Services: exe-db (postgres) + clickhouse + redis + exe-crm + exe-wiki + exe-os + exe-gateway
4
+ # ONE postgres (exe-db) — all services connect to it via DATABASE_URL.
4
5
  # Standard for managed customer VPSs: exe-monitor-agent reports fleet health to monitor.askexe.com.
5
6
  # All image tags pinned per-client via .env (no :latest). Healthchecks on every service.
6
7
  # Named volumes for state; explicit subnets; depends_on with service_healthy gates.
@@ -18,12 +19,12 @@ name: exe-os
18
19
 
19
20
  services:
20
21
  # ------------------------------------------------------------------
21
- # Data layer
22
+ # Data layer — ONE postgres (exe-db) for all services
22
23
  # ------------------------------------------------------------------
23
24
 
24
- crm-postgres:
25
- image: postgres:16.6-alpine
26
- container_name: crm-postgres
25
+ exe-db:
26
+ image: ${EXE_DB_IMAGE:-pgvector/pgvector:pg16}
27
+ container_name: exe-db
27
28
  restart: unless-stopped
28
29
  env_file:
29
30
  - path: .env
@@ -31,7 +32,7 @@ services:
31
32
  environment:
32
33
  POSTGRES_USER: ${POSTGRES_USER:-exe}
33
34
  POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}
34
- POSTGRES_DB: ${POSTGRES_DB:-default}
35
+ POSTGRES_DB: ${POSTGRES_DB:-exedb}
35
36
  PGDATA: /var/lib/postgresql/data/pgdata
36
37
  volumes:
37
38
  - postgres_data:/var/lib/postgresql/data
@@ -39,7 +40,7 @@ services:
39
40
  backend:
40
41
  ipv4_address: 10.42.0.10
41
42
  healthcheck:
42
- test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-exe} -d ${POSTGRES_DB:-default}"]
43
+ test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-exe} -d ${POSTGRES_DB:-exedb}"]
43
44
  interval: 10s
44
45
  timeout: 5s
45
46
  start_period: 30s
@@ -112,7 +113,7 @@ services:
112
113
  container_name: exe-crm
113
114
  restart: unless-stopped
114
115
  depends_on:
115
- crm-postgres:
116
+ exe-db:
116
117
  condition: service_healthy
117
118
  clickhouse:
118
119
  condition: service_healthy
@@ -127,7 +128,7 @@ services:
127
128
  EXE_LICENSE_KEY: ${EXE_LICENSE_KEY:?EXE_LICENSE_KEY is required — purchase at https://askexe.com}
128
129
  SERVER_URL: ${CRM_SERVER_URL:-https://crm.askexe.com}
129
130
  APP_SECRET: ${CRM_APP_SECRET:?CRM_APP_SECRET is required}
130
- PG_DATABASE_URL: postgres://${POSTGRES_USER:-exe}:${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}@crm-postgres:5432/${POSTGRES_DB:-default}
131
+ PG_DATABASE_URL: postgres://${POSTGRES_USER:-exe}:${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}@exe-db:5432/${POSTGRES_DB:-exedb}
131
132
  REDIS_URL: redis://:${REDIS_PASSWORD:?REDIS_PASSWORD is required}@redis:6379
132
133
  CLICKHOUSE_URL: http://${CLICKHOUSE_USER:-exe}:${CLICKHOUSE_PASSWORD:?CLICKHOUSE_PASSWORD is required}@clickhouse:8123/${CLICKHOUSE_DB:-default}
133
134
  STORAGE_TYPE: local
@@ -159,7 +160,7 @@ services:
159
160
  restart: unless-stopped
160
161
  command: ["yarn", "worker:prod"]
161
162
  depends_on:
162
- crm-postgres:
163
+ exe-db:
163
164
  condition: service_healthy
164
165
  clickhouse:
165
166
  condition: service_healthy
@@ -175,7 +176,7 @@ services:
175
176
  EXE_LICENSE_KEY: ${EXE_LICENSE_KEY:?EXE_LICENSE_KEY is required — purchase at https://askexe.com}
176
177
  SERVER_URL: ${CRM_SERVER_URL:-https://crm.askexe.com}
177
178
  APP_SECRET: ${CRM_APP_SECRET:?CRM_APP_SECRET is required}
178
- PG_DATABASE_URL: postgres://${POSTGRES_USER:-exe}:${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}@crm-postgres:5432/${POSTGRES_DB:-default}
179
+ PG_DATABASE_URL: postgres://${POSTGRES_USER:-exe}:${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}@exe-db:5432/${POSTGRES_DB:-exedb}
179
180
  REDIS_URL: redis://:${REDIS_PASSWORD:?REDIS_PASSWORD is required}@redis:6379
180
181
  CLICKHOUSE_URL: http://${CLICKHOUSE_USER:-exe}:${CLICKHOUSE_PASSWORD:?CLICKHOUSE_PASSWORD is required}@clickhouse:8123/${CLICKHOUSE_DB:-default}
181
182
  STORAGE_TYPE: local
@@ -198,7 +199,7 @@ services:
198
199
  container_name: exe-wiki
199
200
  restart: unless-stopped
200
201
  depends_on:
201
- crm-postgres:
202
+ exe-db:
202
203
  condition: service_healthy
203
204
  env_file:
204
205
  - path: .env
@@ -208,7 +209,7 @@ services:
208
209
  SERVER_PORT: "3001"
209
210
  EXE_LICENSE_KEY: ${EXE_LICENSE_KEY:?EXE_LICENSE_KEY is required — purchase at https://askexe.com}
210
211
  STORAGE_DIR: /app/server/storage
211
- DATABASE_URL: postgres://${POSTGRES_USER:-exe}:${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}@crm-postgres:5432/${POSTGRES_DB:-default}?schema=${WIKI_DB_SCHEMA:-wiki}
212
+ DATABASE_URL: postgres://${POSTGRES_USER:-exe}:${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}@exe-db:5432/${POSTGRES_DB:-exedb}?schema=${WIKI_DB_SCHEMA:-wiki}
212
213
  AUTH_TOKEN: ${WIKI_AUTH_TOKEN:?WIKI_AUTH_TOKEN is required}
213
214
  JWT_SECRET: ${WIKI_JWT_SECRET:?WIKI_JWT_SECRET is required}
214
215
  SIG_KEY: ${WIKI_SIG_KEY:?WIKI_SIG_KEY is required}
@@ -249,7 +250,7 @@ services:
249
250
  EXED_MCP_TOKEN: ${EXED_MCP_TOKEN:?EXED_MCP_TOKEN is required}
250
251
  EXED_DEVICE_ID: ${EXED_DEVICE_ID:-vps-default}
251
252
  EXE_LICENSE_KEY: ${EXE_LICENSE_KEY:?EXE_LICENSE_KEY is required — purchase at https://askexe.com}
252
- DATABASE_URL: ${EXED_DATABASE_URL:-postgres://${POSTGRES_USER:-exe}:${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}@crm-postgres:5432/${POSTGRES_DB:-default}}
253
+ DATABASE_URL: ${EXED_DATABASE_URL:-postgres://${POSTGRES_USER:-exe}:${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}@exe-db:5432/${POSTGRES_DB:-exedb}}
253
254
  EXE_CLOUD_SYNC_TO_POSTGRES: ${EXE_CLOUD_SYNC_TO_POSTGRES:-true}
254
255
  EXE_RSS_WARN_MB: ${EXE_RSS_WARN_MB:-6144}
255
256
  EXE_RSS_RESTART_MB: ${EXE_RSS_RESTART_MB:-8192}
@@ -285,6 +286,7 @@ services:
285
286
  NODE_ENV: production
286
287
  EXE_GATEWAY_HOME: /data
287
288
  EXE_GATEWAY_CONFIG: /data/gateway.json
289
+ DATABASE_URL: postgres://${POSTGRES_USER:-exe}:${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}@exe-db:5432/${POSTGRES_DB:-exedb}
288
290
  EXE_GATEWAY_PORT: "3100"
289
291
  EXE_GATEWAY_HOST: "127.0.0.1"
290
292
  EXE_GATEWAY_AUTH_TOKEN: ${EXE_GATEWAY_AUTH_TOKEN:?EXE_GATEWAY_AUTH_TOKEN is required}
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  disposeStore,
4
4
  initStore
5
- } from "./chunk-PMUKZYTR.js";
5
+ } from "./chunk-Y6TS42WD.js";
6
6
  import "./chunk-524VLFFY.js";
7
7
  import "./chunk-MP2AFCGL.js";
8
8
  import {
@@ -9,7 +9,7 @@ import {
9
9
  import {
10
10
  disposeStore,
11
11
  initStore
12
- } from "../chunk-PMUKZYTR.js";
12
+ } from "../chunk-Y6TS42WD.js";
13
13
  import "../chunk-524VLFFY.js";
14
14
  import "../chunk-MP2AFCGL.js";
15
15
  import {
@@ -8,7 +8,7 @@ import {
8
8
  } from "../chunk-6YUACQQA.js";
9
9
  import {
10
10
  initStore
11
- } from "../chunk-PMUKZYTR.js";
11
+ } from "../chunk-Y6TS42WD.js";
12
12
  import "../chunk-524VLFFY.js";
13
13
  import "../chunk-MP2AFCGL.js";
14
14
  import "../chunk-TH6HTK2L.js";
@@ -10,7 +10,7 @@ import {
10
10
  } from "../chunk-6YUACQQA.js";
11
11
  import {
12
12
  initStore
13
- } from "../chunk-PMUKZYTR.js";
13
+ } from "../chunk-Y6TS42WD.js";
14
14
  import "../chunk-524VLFFY.js";
15
15
  import "../chunk-MP2AFCGL.js";
16
16
  import {
@@ -9,7 +9,7 @@ import {
9
9
  flushBatch,
10
10
  initStore,
11
11
  writeMemory
12
- } from "../chunk-PMUKZYTR.js";
12
+ } from "../chunk-Y6TS42WD.js";
13
13
  import "../chunk-524VLFFY.js";
14
14
  import "../chunk-MP2AFCGL.js";
15
15
  import {
@@ -9,7 +9,7 @@ import {
9
9
  flushBatch,
10
10
  initStore,
11
11
  writeMemory
12
- } from "../chunk-PMUKZYTR.js";
12
+ } from "../chunk-Y6TS42WD.js";
13
13
  import "../chunk-524VLFFY.js";
14
14
  import "../chunk-MP2AFCGL.js";
15
15
  import {
@@ -18,7 +18,7 @@ import "../chunk-K4KAPZC7.js";
18
18
  import {
19
19
  initStore,
20
20
  vectorToBlob
21
- } from "../chunk-PMUKZYTR.js";
21
+ } from "../chunk-Y6TS42WD.js";
22
22
  import "../chunk-524VLFFY.js";
23
23
  import "../chunk-MP2AFCGL.js";
24
24
  import {
@@ -7,7 +7,7 @@ import "../chunk-HOKOOBDL.js";
7
7
  import {
8
8
  disposeStore,
9
9
  initStore
10
- } from "../chunk-PMUKZYTR.js";
10
+ } from "../chunk-Y6TS42WD.js";
11
11
  import "../chunk-524VLFFY.js";
12
12
  import "../chunk-MP2AFCGL.js";
13
13
  import {
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  fastDbInit
4
- } from "../chunk-UU6YYTYH.js";
4
+ } from "../chunk-7B5DQGXG.js";
5
5
  import {
6
6
  sessionScopeFilter
7
7
  } from "../chunk-ONMRBKAX.js";
package/dist/bin/cli.js CHANGED
@@ -107,7 +107,7 @@ if (args.includes("--global")) {
107
107
  process.exit(1);
108
108
  }
109
109
  } else if (args[0] === "key") {
110
- const { main: runKey } = await import("../exe-key-4275KC6R.js");
110
+ const { main: runKey } = await import("../exe-key-4L32R46F.js");
111
111
  await runKey(args.slice(1));
112
112
  } else if (args[0] === "link") {
113
113
  console.error("`exe-os link` has been removed from the customer command surface.");
@@ -147,7 +147,7 @@ if (args.includes("--global")) {
147
147
  process.exit(1);
148
148
  }
149
149
  } else if (args[0] === "backfill-metadata") {
150
- const { backfillMetadata } = await import("../backfill-metadata-5JOQOIN2.js");
150
+ const { backfillMetadata } = await import("../backfill-metadata-KMDWLDXU.js");
151
151
  let batchSize = 50;
152
152
  let limit = 0;
153
153
  let dryRun = false;
@@ -178,10 +178,10 @@ if (args.includes("--global")) {
178
178
  process.exit(1);
179
179
  }
180
180
  } else if (args[0] === "export") {
181
- const { runExeExport } = await import("../exe-export-C7GZLJJ2.js");
181
+ const { runExeExport } = await import("../exe-export-ADSWDE5U.js");
182
182
  await runExeExport(args.slice(1));
183
183
  } else if (args[0] === "import") {
184
- const { runExeImport } = await import("../exe-import-E3ZOLEAC.js");
184
+ const { runExeImport } = await import("../exe-import-WFLNGJZP.js");
185
185
  await runExeImport(args.slice(1));
186
186
  } else if (args[0] === "send-message" || args[0] === "send_message") {
187
187
  const target = args[1];
@@ -293,7 +293,7 @@ ID: ${result.id}`);
293
293
  process.exit(1);
294
294
  }
295
295
  } else if (args[0] === "setup" || args[0] === "-setup" || args[0] === "--setup") {
296
- const { runSetupWizard } = await import("../setup-wizard-3GVBHKHG.js");
296
+ const { runSetupWizard } = await import("../setup-wizard-QVNTI3T4.js");
297
297
  await runSetupWizard({ skipModel: args.includes("--skip-model") });
298
298
  } else if (args[0] === "update") {
299
299
  const { runUpdate } = await import("./update.js");
@@ -70,13 +70,51 @@ test("Session scoping \u2014 all task query files import scope helper", () => {
70
70
  if (unscoped.length > 0) return `${unscoped.length} files missing scope: ${unscoped.slice(0, 3).join(", ")}`;
71
71
  return true;
72
72
  });
73
- test("No raw list-style task queries \u2014 all go through queryTaskRows", () => {
74
- const rawHits = execSync(
75
- `grep -rn "SELECT.*FROM.*tasks" src/ --include="*.ts" | grep -v tasks-crud.ts | grep -v "// queryTasks" | grep -v "__tests__" | grep -v ".test." | grep -v "customer-readiness" | wc -l`,
76
- { encoding: "utf8", cwd: ROOT }
77
- ).trim();
78
- const count = parseInt(rawHits, 10);
79
- if (count > 70) return `${count} raw task queries outside tasks-crud.ts (expected \u226470)`;
73
+ test("No unscoped task queries \u2014 all task queries have session scope or PK guard", () => {
74
+ let rawOutput;
75
+ try {
76
+ rawOutput = execSync(
77
+ `grep -rn -B5 -A5 "FROM.*tasks\\|UPDATE.*tasks" src/ --include="*.ts" | grep -v tasks-crud.ts | grep -v "__tests__" | grep -v ".test." | grep -v "customer-readiness" | grep -v "task-scope.ts"`,
78
+ { encoding: "utf8", cwd: ROOT }
79
+ ).trim();
80
+ } catch {
81
+ return true;
82
+ }
83
+ if (!rawOutput) return true;
84
+ const blocks = rawOutput.split(/^--$/m);
85
+ const unscoped = [];
86
+ for (const block of blocks) {
87
+ const blockLower = block.toLowerCase();
88
+ const hasScope = blockLower.includes("scope.sql") || blockLower.includes("sessionscopefilter") || blockLower.includes("strictsessionscopefilter") || blockLower.includes("session_scope") || blockLower.includes("intentionally unscoped") || blockLower.includes("audited 2026") || blockLower.includes("querytaskrows");
89
+ const isSafe = hasScope || /where\s+id\s*=\s*\?/.test(blockLower) || // PK lookup by full UUID
90
+ /where\s+task_file\s*=\s*\?/.test(blockLower) || // task_file exact match
91
+ /select\s+count\s*\(\s*\*\s*\)/.test(blockLower) || // COUNT(*) stats
92
+ /assigned_to\s*=\s*\?.*where\s+id/.test(blockLower) || // UPDATE by PK
93
+ /parent_task_id\s*=\s*\?/.test(blockLower) || // Cascade by parent PK
94
+ /blocked_by\s*=\s*\w+\.id/.test(blockLower) || // JOIN on PK (auto-unblock)
95
+ /project_name\s*=\s*'/.test(blockLower) || // Migration: hardcoded project rename
96
+ /device_id\s*is\s*null/.test(blockLower) || // Migration: backfill device_id
97
+ /status\s*=\s*'completed'/.test(blockLower) || // Migration: status rename
98
+ /status\s*=\s*'done'.*result\s*is\s*not\s*null/.test(blockLower) || // Migration: bulk close
99
+ blockLower.includes("conditions.join") || // Dynamic WHERE builder (git-task-sweep)
100
+ blockLower.includes("exe-rename") || // Rename is intentionally global
101
+ blockLower.includes("cleanup-stale") || // One-time legacy cleanup script
102
+ blockLower.includes("title like") || // Cascade cleanup by title pattern
103
+ blockLower.includes("assigned_to is null");
104
+ if (!isSafe) {
105
+ const queryLine = block.split("\n").find(
106
+ (l) => /FROM.*tasks|UPDATE.*tasks/i.test(l) && !l.trim().startsWith("//") && !l.trim().startsWith("*")
107
+ );
108
+ if (queryLine) {
109
+ const match = queryLine.match(/^([^:]+):(\d+)/);
110
+ if (match) unscoped.push(`${match[1]}:${match[2]}`);
111
+ }
112
+ }
113
+ }
114
+ const unique = [...new Set(unscoped)];
115
+ if (unique.length > 0) {
116
+ return `${unique.length} unscoped task quer${unique.length === 1 ? "y" : "ies"}: ${unique.slice(0, 5).join(", ")}${unique.length > 5 ? ` (+${unique.length - 5} more)` : ""}`;
117
+ }
80
118
  return true;
81
119
  });
82
120
  test("Platform procedures \u2014 shipped as code (not DB only)", () => {
@@ -19,9 +19,9 @@ import {
19
19
  } from "../chunk-TMEE7AT7.js";
20
20
  import {
21
21
  getSessionPrompt
22
- } from "../chunk-KJFCQUQP.js";
23
- import "../chunk-CVUFSWGC.js";
24
- import "../chunk-GKFSZKUD.js";
22
+ } from "../chunk-3MLGUSKS.js";
23
+ import "../chunk-UPMKSFBU.js";
24
+ import "../chunk-XWQKCCCO.js";
25
25
  import {
26
26
  createTerminalRenderer,
27
27
  renderAgentEvents
@@ -10,7 +10,7 @@ import {
10
10
  initStore,
11
11
  searchMemories,
12
12
  writeMemory
13
- } from "../chunk-PMUKZYTR.js";
13
+ } from "../chunk-Y6TS42WD.js";
14
14
  import "../chunk-524VLFFY.js";
15
15
  import {
16
16
  createAssignmentMemory,
@@ -5,16 +5,16 @@ import {
5
5
  import {
6
6
  DEFAULT_EXE,
7
7
  getSessionPrompt
8
- } from "../chunk-KJFCQUQP.js";
9
- import "../chunk-CVUFSWGC.js";
10
- import "../chunk-GKFSZKUD.js";
8
+ } from "../chunk-3MLGUSKS.js";
9
+ import "../chunk-UPMKSFBU.js";
10
+ import "../chunk-XWQKCCCO.js";
11
11
  import {
12
12
  cleanupSessionMarkers,
13
13
  writeActiveAgent
14
14
  } from "../chunk-NFHFNPTN.js";
15
15
  import {
16
16
  initStore
17
- } from "../chunk-PMUKZYTR.js";
17
+ } from "../chunk-Y6TS42WD.js";
18
18
  import "../chunk-524VLFFY.js";
19
19
  import {
20
20
  cleanupOldNotifications,
@@ -221,13 +221,15 @@ async function boot(options) {
221
221
  process.stderr.write("[exe-boot] task reconciliation: " + (e instanceof Error ? e.message : String(e)) + "\n");
222
222
  }
223
223
  try {
224
+ const staleRevScope = sessionScopeFilter();
224
225
  await client.execute({
225
226
  sql: `UPDATE tasks SET status = 'done', updated_at = ?
226
227
  WHERE (assigned_to = ? OR assigned_to = ?)
227
228
  AND status = 'in_progress'
228
229
  AND task_file LIKE '%review-%'
229
- AND updated_at < datetime('now', '-1 hour')`,
230
- args: [(/* @__PURE__ */ new Date()).toISOString(), coordinatorName, DEFAULT_COORDINATOR_TEMPLATE_NAME]
230
+ AND updated_at < datetime('now', '-1 hour')
231
+ ${staleRevScope.sql}`,
232
+ args: [(/* @__PURE__ */ new Date()).toISOString(), coordinatorName, DEFAULT_COORDINATOR_TEMPLATE_NAME, ...staleRevScope.args]
231
233
  });
232
234
  } catch {
233
235
  }
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getSessionPrompt
4
- } from "../chunk-KJFCQUQP.js";
5
- import "../chunk-CVUFSWGC.js";
6
- import "../chunk-GKFSZKUD.js";
4
+ } from "../chunk-3MLGUSKS.js";
5
+ import "../chunk-UPMKSFBU.js";
6
+ import "../chunk-XWQKCCCO.js";
7
7
  import {
8
8
  DEFAULT_COORDINATOR_TEMPLATE_NAME,
9
9
  getCoordinatorName,
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  fastDbInit
4
- } from "../chunk-UU6YYTYH.js";
4
+ } from "../chunk-7B5DQGXG.js";
5
5
  import {
6
6
  createTaskCore,
7
7
  ensureEmployee,
@@ -19,7 +19,7 @@ import {
19
19
  parseFlags,
20
20
  runAudit,
21
21
  splitAtSentences
22
- } from "../chunk-4LUI7MMY.js";
22
+ } from "../chunk-4EINMZNO.js";
23
23
  import "../chunk-L3TB7CC3.js";
24
24
  import "../chunk-6Y4B3QF6.js";
25
25
  import "../chunk-MLKGABMK.js";
@@ -5,10 +5,10 @@ import {
5
5
  import "../chunk-ARGBV4PP.js";
6
6
  import {
7
7
  fastDbInit
8
- } from "../chunk-UU6YYTYH.js";
8
+ } from "../chunk-7B5DQGXG.js";
9
9
  import {
10
10
  disposeStore
11
- } from "../chunk-PMUKZYTR.js";
11
+ } from "../chunk-Y6TS42WD.js";
12
12
  import "../chunk-524VLFFY.js";
13
13
  import "../chunk-MP2AFCGL.js";
14
14
  import "../chunk-TH6HTK2L.js";
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  fastDbInit
4
- } from "../chunk-UU6YYTYH.js";
4
+ } from "../chunk-7B5DQGXG.js";
5
5
  import {
6
6
  lightweightSearch
7
- } from "../chunk-AAZ3MQIA.js";
8
- import "../chunk-PMUKZYTR.js";
7
+ } from "../chunk-AGFWOII2.js";
8
+ import "../chunk-Y6TS42WD.js";
9
9
  import "../chunk-524VLFFY.js";
10
10
  import "../chunk-MP2AFCGL.js";
11
11
  import {
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  BotRegistry,
4
4
  Gateway
5
- } from "../chunk-RMSDKMFD.js";
5
+ } from "../chunk-HHMHL4FB.js";
6
6
  import "../chunk-LL5EY6OQ.js";
7
7
  import "../chunk-ZBA74MMX.js";
8
8
  import "../chunk-GCNWCYJI.js";
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  fastDbInit
4
- } from "../chunk-UU6YYTYH.js";
4
+ } from "../chunk-7B5DQGXG.js";
5
5
  import {
6
6
  isExeSession,
7
7
  listPendingReviews,
@@ -4,11 +4,11 @@ import {
4
4
  } from "../chunk-PMWDO5FR.js";
5
5
  import {
6
6
  fastDbInit
7
- } from "../chunk-UU6YYTYH.js";
7
+ } from "../chunk-7B5DQGXG.js";
8
8
  import {
9
9
  disposeStore,
10
10
  flushBatch
11
- } from "../chunk-PMUKZYTR.js";
11
+ } from "../chunk-Y6TS42WD.js";
12
12
  import "../chunk-524VLFFY.js";
13
13
  import {
14
14
  listSessions
@@ -5,15 +5,15 @@ import {
5
5
  import "../chunk-ARGBV4PP.js";
6
6
  import {
7
7
  getSessionPrompt
8
- } from "../chunk-KJFCQUQP.js";
9
- import "../chunk-CVUFSWGC.js";
10
- import "../chunk-GKFSZKUD.js";
8
+ } from "../chunk-3MLGUSKS.js";
9
+ import "../chunk-UPMKSFBU.js";
10
+ import "../chunk-XWQKCCCO.js";
11
11
  import {
12
12
  fastDbInit
13
- } from "../chunk-UU6YYTYH.js";
13
+ } from "../chunk-7B5DQGXG.js";
14
14
  import {
15
15
  disposeStore
16
- } from "../chunk-PMUKZYTR.js";
16
+ } from "../chunk-Y6TS42WD.js";
17
17
  import "../chunk-524VLFFY.js";
18
18
  import {
19
19
  DEFAULT_PROVIDER,
@@ -4,9 +4,9 @@ import {
4
4
  buildCustomEmployeePrompt,
5
5
  getTemplate,
6
6
  personalizePrompt
7
- } from "../chunk-KJFCQUQP.js";
8
- import "../chunk-CVUFSWGC.js";
9
- import "../chunk-GKFSZKUD.js";
7
+ } from "../chunk-3MLGUSKS.js";
8
+ import "../chunk-UPMKSFBU.js";
9
+ import "../chunk-XWQKCCCO.js";
10
10
  import {
11
11
  PlanLimitError,
12
12
  assertEmployeeLimit
@@ -4,7 +4,7 @@ import {
4
4
  } from "../chunk-LC53LVOT.js";
5
5
  import {
6
6
  fastDbInit
7
- } from "../chunk-UU6YYTYH.js";
7
+ } from "../chunk-7B5DQGXG.js";
8
8
  import "../chunk-ONMRBKAX.js";
9
9
  import "../chunk-LOQCOHEW.js";
10
10
  import "../chunk-TXSJ2L5O.js";
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  fastDbInit
4
- } from "../chunk-UU6YYTYH.js";
4
+ } from "../chunk-7B5DQGXG.js";
5
5
  import {
6
6
  markAsRead,
7
7
  readUnreadNotifications,
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  fastDbInit
4
- } from "../chunk-UU6YYTYH.js";
4
+ } from "../chunk-7B5DQGXG.js";
5
5
  import {
6
6
  cleanupOrphanedReviews,
7
7
  extractRootExe,
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  personalizePrompt
4
- } from "../chunk-KJFCQUQP.js";
5
- import "../chunk-CVUFSWGC.js";
6
- import "../chunk-GKFSZKUD.js";
4
+ } from "../chunk-3MLGUSKS.js";
5
+ import "../chunk-UPMKSFBU.js";
6
+ import "../chunk-XWQKCCCO.js";
7
7
  import {
8
8
  loadEmployees,
9
9
  registerBinSymlinks,
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  fastDbInit
4
- } from "../chunk-UU6YYTYH.js";
4
+ } from "../chunk-7B5DQGXG.js";
5
5
  import {
6
6
  flushBatch,
7
7
  writeMemory
8
- } from "../chunk-PMUKZYTR.js";
8
+ } from "../chunk-Y6TS42WD.js";
9
9
  import "../chunk-524VLFFY.js";
10
10
  import {
11
11
  getCurrentSessionScope,
@@ -2,10 +2,10 @@
2
2
  import {
3
3
  hybridSearch,
4
4
  lightweightSearch
5
- } from "../chunk-AAZ3MQIA.js";
5
+ } from "../chunk-AGFWOII2.js";
6
6
  import {
7
7
  initStore
8
- } from "../chunk-PMUKZYTR.js";
8
+ } from "../chunk-Y6TS42WD.js";
9
9
  import "../chunk-524VLFFY.js";
10
10
  import "../chunk-MP2AFCGL.js";
11
11
  import "../chunk-TH6HTK2L.js";
@@ -3,7 +3,7 @@ import {
3
3
  flushBatch,
4
4
  initStore,
5
5
  writeMemory
6
- } from "../chunk-PMUKZYTR.js";
6
+ } from "../chunk-Y6TS42WD.js";
7
7
  import "../chunk-524VLFFY.js";
8
8
  import {
9
9
  sessionScopeFilter,
@@ -174,7 +174,7 @@ try {
174
174
  if (result.rows.length === 0) process.exit(0);
175
175
  let commits = [];
176
176
  try {
177
- const { getRecentCommits } = await import("../git-task-sweep-EVITTAZE.js");
177
+ const { getRecentCommits } = await import("../git-task-sweep-RSRASAHB.js");
178
178
  commits = getRecentCommits(30);
179
179
  } catch {
180
180
  }
@@ -187,7 +187,7 @@ try {
187
187
  const context = row.context ? String(row.context) : void 0;
188
188
  if (commits.length > 0) {
189
189
  try {
190
- const { findBestMatch } = await import("../git-task-sweep-EVITTAZE.js");
190
+ const { findBestMatch } = await import("../git-task-sweep-RSRASAHB.js");
191
191
  const match = findBestMatch({ id: taskId, title, context }, commits);
192
192
  if (match) {
193
193
  try {