@askexenow/exe-os 0.9.162 → 0.9.164
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/dist/bin/deferred-daemon-restart.js +21 -1
- package/dist/bin/exe-forget.js +1 -1
- package/dist/bin/exe-search.js +1 -1
- package/dist/bin/install.js +35 -1
- package/dist/{catchup-brief-MTPBB3KF.js → catchup-brief-VMGUUTZ4.js} +1 -1
- package/dist/{chunk-A4NCK74X.js → chunk-MM3XXKC5.js} +15 -9
- package/dist/{chunk-FPBEJ2JV.js → chunk-R6GFTKG5.js} +4 -0
- package/dist/hooks/error-recall.js +1 -1
- package/dist/hooks/prompt-submit.js +1 -1
- package/dist/hooks/session-start.js +1 -1
- package/dist/lib/exe-daemon.js +15 -4
- package/dist/lib/hybrid-search.js +3 -1
- package/dist/mcp/register-tools.js +2 -2
- package/dist/mcp/server.js +2 -2
- package/package.json +1 -1
- package/release-notes.json +91 -91
|
@@ -5,12 +5,32 @@ import {
|
|
|
5
5
|
import "../chunk-MLKGABMK.js";
|
|
6
6
|
|
|
7
7
|
// src/bin/deferred-daemon-restart.ts
|
|
8
|
-
import { existsSync, openSync, closeSync } from "fs";
|
|
8
|
+
import { existsSync, openSync, closeSync, writeFileSync, unlinkSync } from "fs";
|
|
9
9
|
import { spawn, execSync } from "child_process";
|
|
10
10
|
import path from "path";
|
|
11
11
|
import os from "os";
|
|
12
12
|
var EXE_DIR = path.join(os.homedir(), ".exe-os");
|
|
13
13
|
var DAEMON_PORT = 48739;
|
|
14
|
+
var DEFERRED_RESTART_PID_PATH = path.join(EXE_DIR, "deferred-restart.pid");
|
|
15
|
+
try {
|
|
16
|
+
writeFileSync(DEFERRED_RESTART_PID_PATH, String(process.pid));
|
|
17
|
+
} catch {
|
|
18
|
+
}
|
|
19
|
+
function cleanupPid() {
|
|
20
|
+
try {
|
|
21
|
+
unlinkSync(DEFERRED_RESTART_PID_PATH);
|
|
22
|
+
} catch {
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
process.on("exit", cleanupPid);
|
|
26
|
+
process.on("SIGTERM", () => {
|
|
27
|
+
cleanupPid();
|
|
28
|
+
process.exit(0);
|
|
29
|
+
});
|
|
30
|
+
process.on("SIGINT", () => {
|
|
31
|
+
cleanupPid();
|
|
32
|
+
process.exit(0);
|
|
33
|
+
});
|
|
14
34
|
var DELAY_MS = parseInt(process.env.EXE_DEFERRED_DELAY_MS ?? "3000", 10);
|
|
15
35
|
await new Promise((resolve) => setTimeout(resolve, DELAY_MS));
|
|
16
36
|
process.stderr.write("[deferred-restart] Starting daemon restart...\n");
|
package/dist/bin/exe-forget.js
CHANGED
package/dist/bin/exe-search.js
CHANGED
package/dist/bin/install.js
CHANGED
|
@@ -27,7 +27,7 @@ import "../chunk-LYH5HE24.js";
|
|
|
27
27
|
import "../chunk-MLKGABMK.js";
|
|
28
28
|
|
|
29
29
|
// src/bin/install.ts
|
|
30
|
-
import { existsSync, openSync, closeSync } from "fs";
|
|
30
|
+
import { existsSync, openSync, closeSync, writeFileSync, readFileSync, unlinkSync, statSync } from "fs";
|
|
31
31
|
import { spawn, execSync } from "child_process";
|
|
32
32
|
import path from "path";
|
|
33
33
|
import os from "os";
|
|
@@ -85,7 +85,35 @@ function spawnDaemonInline(pkgRoot) {
|
|
|
85
85
|
}
|
|
86
86
|
process.stderr.write(healthy ? "exe-os: daemon restarted and healthy\n" : "exe-os: daemon spawned but health check pending\n");
|
|
87
87
|
}
|
|
88
|
+
var DEFERRED_RESTART_PID_PATH = path.join(EXE_DIR, "deferred-restart.pid");
|
|
89
|
+
function isDeferredRestartRunning() {
|
|
90
|
+
try {
|
|
91
|
+
if (!existsSync(DEFERRED_RESTART_PID_PATH)) return false;
|
|
92
|
+
const pid = parseInt(readFileSync(DEFERRED_RESTART_PID_PATH, "utf8").trim(), 10);
|
|
93
|
+
if (isNaN(pid) || pid <= 0) return false;
|
|
94
|
+
const age = Date.now() - statSync(DEFERRED_RESTART_PID_PATH).mtimeMs;
|
|
95
|
+
if (age > 6e4) {
|
|
96
|
+
try {
|
|
97
|
+
unlinkSync(DEFERRED_RESTART_PID_PATH);
|
|
98
|
+
} catch {
|
|
99
|
+
}
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
process.kill(pid, 0);
|
|
103
|
+
return true;
|
|
104
|
+
} catch {
|
|
105
|
+
try {
|
|
106
|
+
unlinkSync(DEFERRED_RESTART_PID_PATH);
|
|
107
|
+
} catch {
|
|
108
|
+
}
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
88
112
|
function restartDaemon() {
|
|
113
|
+
if (isDeferredRestartRunning()) {
|
|
114
|
+
process.stderr.write("exe-os: deferred restart already running \u2014 skipping duplicate\n");
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
89
117
|
updateMcpVersionMarker();
|
|
90
118
|
const pkgRoot = resolvePackageRoot();
|
|
91
119
|
const deferredScript = path.join(pkgRoot, "dist", "bin", "deferred-daemon-restart.js");
|
|
@@ -107,6 +135,12 @@ function restartDaemon() {
|
|
|
107
135
|
env: { ...process.env }
|
|
108
136
|
});
|
|
109
137
|
child.unref();
|
|
138
|
+
if (child.pid) {
|
|
139
|
+
try {
|
|
140
|
+
writeFileSync(DEFERRED_RESTART_PID_PATH, String(child.pid));
|
|
141
|
+
} catch {
|
|
142
|
+
}
|
|
143
|
+
}
|
|
110
144
|
if (typeof stderrFd === "number") {
|
|
111
145
|
try {
|
|
112
146
|
closeSync(stderrFd);
|
|
@@ -172,8 +172,9 @@ import {
|
|
|
172
172
|
} from "./chunk-LHLEFNFW.js";
|
|
173
173
|
import {
|
|
174
174
|
hybridSearch,
|
|
175
|
+
lastSearchDegraded,
|
|
175
176
|
recentRecords
|
|
176
|
-
} from "./chunk-
|
|
177
|
+
} from "./chunk-R6GFTKG5.js";
|
|
177
178
|
import {
|
|
178
179
|
getActiveAgent
|
|
179
180
|
} from "./chunk-5G7BZIY3.js";
|
|
@@ -437,7 +438,7 @@ function registerRecallMyMemory(server) {
|
|
|
437
438
|
results = await recentRecords(agentId, searchOptions, limit);
|
|
438
439
|
}
|
|
439
440
|
}
|
|
440
|
-
const FEDERATION_THRESHOLD =
|
|
441
|
+
const FEDERATION_THRESHOLD = 5;
|
|
441
442
|
let federatedCount = 0;
|
|
442
443
|
if (!recent && query && results.length < FEDERATION_THRESHOLD) {
|
|
443
444
|
try {
|
|
@@ -463,21 +464,25 @@ ${cr.content}`,
|
|
|
463
464
|
try {
|
|
464
465
|
const { getClient: getClient2 } = await import("./lib/database.js");
|
|
465
466
|
const client = getClient2();
|
|
467
|
+
const terms = query.split(/\s+/).filter((t) => t.length > 2).slice(0, 6);
|
|
468
|
+
const likeConditions = terms.map(() => "(e.name LIKE ? OR e.properties LIKE ? OR r.type LIKE ?)").join(" OR ");
|
|
469
|
+
const likeArgs = terms.flatMap((t) => [`%${t}%`, `%${t}%`, `%${t}%`]);
|
|
466
470
|
const graphResults = await Promise.race([
|
|
467
471
|
client.execute({
|
|
468
|
-
sql: `SELECT e.name, e.type as entity_type, e.properties as description,
|
|
472
|
+
sql: `SELECT DISTINCT e.name, e.type as entity_type, e.properties as description,
|
|
473
|
+
r.type as relationship_type, r2.name as related_to, r2.type as related_type
|
|
469
474
|
FROM entities e
|
|
470
475
|
LEFT JOIN relationships r ON e.id = r.source_entity_id
|
|
471
476
|
LEFT JOIN entities r2 ON r.target_entity_id = r2.id
|
|
472
|
-
WHERE
|
|
473
|
-
LIMIT
|
|
474
|
-
args:
|
|
477
|
+
WHERE ${likeConditions || "1=0"}
|
|
478
|
+
LIMIT 10`,
|
|
479
|
+
args: likeArgs
|
|
475
480
|
}),
|
|
476
|
-
new Promise((_, rej) => setTimeout(() => rej(new Error("timeout")),
|
|
481
|
+
new Promise((_, rej) => setTimeout(() => rej(new Error("timeout")), 3e3))
|
|
477
482
|
]);
|
|
478
483
|
for (let i = 0; i < (graphResults.rows?.length ?? 0); i++) {
|
|
479
484
|
const gr = graphResults.rows[i];
|
|
480
|
-
const relPart = gr.related_to ? ` \u2192 ${gr.relationship_type} \u2192 ${gr.related_to}` : "";
|
|
485
|
+
const relPart = gr.related_to ? ` \u2192 ${gr.relationship_type} \u2192 ${gr.related_to} (${gr.related_type})` : "";
|
|
481
486
|
results.push({
|
|
482
487
|
id: `federated-graph-${results.length}`,
|
|
483
488
|
raw_text: `[graph] ${gr.name} (${gr.entity_type})${relPart}
|
|
@@ -517,13 +522,14 @@ ${gr.description ?? ""}`,
|
|
|
517
522
|
const federatedNote = federatedCount > 0 ? `
|
|
518
523
|
|
|
519
524
|
[Federated recall: ${federatedCount} result(s) from code_context/graph (memory had < ${FEDERATION_THRESHOLD} matches)]` : "";
|
|
525
|
+
const degradedWarning = !recent && lastSearchDegraded ? '\n\n\u26A0\uFE0F DEGRADED SEARCH: Embedding daemon is offline \u2014 using keyword matching only (no semantic search). Results may be incomplete. Try graph(action="query_relationships") or graph(action="entity_neighbors") for structured/relational queries.' : "";
|
|
520
526
|
return {
|
|
521
527
|
content: [
|
|
522
528
|
{
|
|
523
529
|
type: "text",
|
|
524
530
|
text: `Found ${results.length} memories:
|
|
525
531
|
|
|
526
|
-
${formatted}${federatedNote}`
|
|
532
|
+
${formatted}${federatedNote}${degradedWarning}`
|
|
527
533
|
}
|
|
528
534
|
]
|
|
529
535
|
};
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
|
|
11
11
|
// src/lib/hybrid-search.ts
|
|
12
12
|
var RRF_K = 60;
|
|
13
|
+
var lastSearchDegraded = false;
|
|
13
14
|
var _cardinalityCache = /* @__PURE__ */ new Map();
|
|
14
15
|
var CARDINALITY_TTL_MS = 6e4;
|
|
15
16
|
async function getCachedCardinality(agentId) {
|
|
@@ -173,7 +174,9 @@ async function hybridSearch(queryText, agentId, options) {
|
|
|
173
174
|
try {
|
|
174
175
|
const { embed } = await import("./lib/embedder.js");
|
|
175
176
|
queryVector = await embed(effectiveQuery);
|
|
177
|
+
lastSearchDegraded = false;
|
|
176
178
|
} catch {
|
|
179
|
+
lastSearchDegraded = true;
|
|
177
180
|
if (!process.env.VITEST) {
|
|
178
181
|
process.stderr.write("[hybrid-search] Embed daemon unavailable \u2014 FTS-only mode\n");
|
|
179
182
|
}
|
|
@@ -966,6 +969,7 @@ async function trajectoryBypass(queryText, agentId, options, limit) {
|
|
|
966
969
|
}
|
|
967
970
|
|
|
968
971
|
export {
|
|
972
|
+
lastSearchDegraded,
|
|
969
973
|
hybridSearch,
|
|
970
974
|
estimateCardinality,
|
|
971
975
|
rrfMerge,
|
|
@@ -97,7 +97,7 @@ process.stdin.on("end", async () => {
|
|
|
97
97
|
query = `last actions on ${projectName}`;
|
|
98
98
|
header = "## Resuming Session\nHere's where you left off:";
|
|
99
99
|
try {
|
|
100
|
-
const { buildCatchupBrief } = await import("../catchup-brief-
|
|
100
|
+
const { buildCatchupBrief } = await import("../catchup-brief-VMGUUTZ4.js");
|
|
101
101
|
const brief = await buildCatchupBrief(
|
|
102
102
|
agentId,
|
|
103
103
|
projectName,
|
package/dist/lib/exe-daemon.js
CHANGED
|
@@ -2302,16 +2302,26 @@ var CLOUD_SYNC_CIRCUIT_BREAK = 10;
|
|
|
2302
2302
|
var _cloudSyncConsecutiveFailures = 0;
|
|
2303
2303
|
var _cloudSyncBackoffMs = 0;
|
|
2304
2304
|
var _cloudSyncPaused = false;
|
|
2305
|
+
var _cloudSyncPausedAt = 0;
|
|
2306
|
+
var CLOUD_SYNC_AUTO_RECOVERY_MS = 30 * 6e4;
|
|
2305
2307
|
function startCloudSyncTimer() {
|
|
2306
2308
|
const tick = async () => {
|
|
2307
2309
|
fired("cloud_sync");
|
|
2308
2310
|
if (_cloudSyncPaused) {
|
|
2309
|
-
if (
|
|
2310
|
-
process.stderr.write(`[exed] Cloud sync
|
|
2311
|
+
if (Date.now() - _cloudSyncPausedAt > CLOUD_SYNC_AUTO_RECOVERY_MS) {
|
|
2312
|
+
process.stderr.write(`[exed] Cloud sync auto-recovery: retrying after ${Math.round(CLOUD_SYNC_AUTO_RECOVERY_MS / 6e4)}m pause
|
|
2311
2313
|
`);
|
|
2314
|
+
_cloudSyncPaused = false;
|
|
2315
|
+
_cloudSyncConsecutiveFailures = 0;
|
|
2316
|
+
_cloudSyncBackoffMs = 0;
|
|
2317
|
+
} else {
|
|
2318
|
+
if (_cloudSyncConsecutiveFailures > 0 && _cloudSyncConsecutiveFailures % 20 === 0) {
|
|
2319
|
+
process.stderr.write(`[exed] Cloud sync still paused after ${_cloudSyncConsecutiveFailures} failures (auto-retry in ${Math.round((CLOUD_SYNC_AUTO_RECOVERY_MS - (Date.now() - _cloudSyncPausedAt)) / 6e4)}m)
|
|
2320
|
+
`);
|
|
2321
|
+
}
|
|
2322
|
+
_cloudSyncConsecutiveFailures++;
|
|
2323
|
+
return;
|
|
2312
2324
|
}
|
|
2313
|
-
_cloudSyncConsecutiveFailures++;
|
|
2314
|
-
return;
|
|
2315
2325
|
}
|
|
2316
2326
|
if (_cloudSyncBackoffMs > 0) {
|
|
2317
2327
|
_cloudSyncBackoffMs = Math.max(0, _cloudSyncBackoffMs - CLOUD_SYNC_INTERVAL_MS);
|
|
@@ -2349,6 +2359,7 @@ function startCloudSyncTimer() {
|
|
|
2349
2359
|
);
|
|
2350
2360
|
if (_cloudSyncConsecutiveFailures >= CLOUD_SYNC_CIRCUIT_BREAK) {
|
|
2351
2361
|
_cloudSyncPaused = true;
|
|
2362
|
+
_cloudSyncPausedAt = Date.now();
|
|
2352
2363
|
process.stderr.write(
|
|
2353
2364
|
`[exed] Cloud sync PAUSED after ${CLOUD_SYNC_CIRCUIT_BREAK} consecutive failures. Last error: ${msg}. Will retry when daemon restarts or /exe-cloud sync is run manually.
|
|
2354
2365
|
`
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
estimateCardinality,
|
|
3
3
|
hybridSearch,
|
|
4
|
+
lastSearchDegraded,
|
|
4
5
|
lightweightSearch,
|
|
5
6
|
recentRecords,
|
|
6
7
|
rrfMerge,
|
|
7
8
|
rrfMergeMulti
|
|
8
|
-
} from "../chunk-
|
|
9
|
+
} from "../chunk-R6GFTKG5.js";
|
|
9
10
|
import "../chunk-H3KFLVPW.js";
|
|
10
11
|
import "../chunk-2M3CULM3.js";
|
|
11
12
|
import "../chunk-MP2AFCGL.js";
|
|
@@ -19,6 +20,7 @@ import "../chunk-MLKGABMK.js";
|
|
|
19
20
|
export {
|
|
20
21
|
estimateCardinality,
|
|
21
22
|
hybridSearch,
|
|
23
|
+
lastSearchDegraded,
|
|
22
24
|
lightweightSearch,
|
|
23
25
|
recentRecords,
|
|
24
26
|
rrfMerge,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
registerAllTools
|
|
3
|
-
} from "../chunk-
|
|
3
|
+
} from "../chunk-MM3XXKC5.js";
|
|
4
4
|
import "../chunk-RLHQMWLV.js";
|
|
5
5
|
import "../chunk-ESRI7MFI.js";
|
|
6
6
|
import "../chunk-PLNYW6PA.js";
|
|
@@ -52,7 +52,7 @@ import "../chunk-T5YT64SZ.js";
|
|
|
52
52
|
import "../chunk-MPCICOVG.js";
|
|
53
53
|
import "../chunk-ZKALIEHB.js";
|
|
54
54
|
import "../chunk-LHLEFNFW.js";
|
|
55
|
-
import "../chunk-
|
|
55
|
+
import "../chunk-R6GFTKG5.js";
|
|
56
56
|
import "../chunk-5G7BZIY3.js";
|
|
57
57
|
import "../chunk-G4FDG3LK.js";
|
|
58
58
|
import "../chunk-CMFLJNP6.js";
|
package/dist/mcp/server.js
CHANGED
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "../chunk-V4TZI6EO.js";
|
|
4
4
|
import {
|
|
5
5
|
registerAllTools
|
|
6
|
-
} from "../chunk-
|
|
6
|
+
} from "../chunk-MM3XXKC5.js";
|
|
7
7
|
import "../chunk-RLHQMWLV.js";
|
|
8
8
|
import "../chunk-ESRI7MFI.js";
|
|
9
9
|
import {
|
|
@@ -62,7 +62,7 @@ import "../chunk-T5YT64SZ.js";
|
|
|
62
62
|
import "../chunk-MPCICOVG.js";
|
|
63
63
|
import "../chunk-ZKALIEHB.js";
|
|
64
64
|
import "../chunk-LHLEFNFW.js";
|
|
65
|
-
import "../chunk-
|
|
65
|
+
import "../chunk-R6GFTKG5.js";
|
|
66
66
|
import "../chunk-5G7BZIY3.js";
|
|
67
67
|
import "../chunk-G4FDG3LK.js";
|
|
68
68
|
import "../chunk-CMFLJNP6.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@askexenow/exe-os",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.164",
|
|
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,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
-
"current": "0.9.
|
|
2
|
+
"current": "0.9.164",
|
|
3
3
|
"notes": {
|
|
4
|
-
"0.9.
|
|
5
|
-
"version": "0.9.
|
|
4
|
+
"0.9.164": {
|
|
5
|
+
"version": "0.9.164",
|
|
6
6
|
"date": "2026-05-30",
|
|
7
7
|
"features": [
|
|
8
8
|
"add worktree reaper daemon job to prune orphaned agent worktrees",
|
|
@@ -104,8 +104,8 @@
|
|
|
104
104
|
"exe-daemon.ts kills old embed.pid process and cleans up"
|
|
105
105
|
]
|
|
106
106
|
},
|
|
107
|
-
"0.9.
|
|
108
|
-
"version": "0.9.
|
|
107
|
+
"0.9.163": {
|
|
108
|
+
"version": "0.9.163",
|
|
109
109
|
"date": "2026-05-30",
|
|
110
110
|
"features": [
|
|
111
111
|
"add worktree reaper daemon job to prune orphaned agent worktrees",
|
|
@@ -135,6 +135,7 @@
|
|
|
135
135
|
"blocked task notification — ping dispatcher immediately on status change"
|
|
136
136
|
],
|
|
137
137
|
"fixes": [
|
|
138
|
+
"zombie reaper must never kill TTY-attached sessions + death log",
|
|
138
139
|
"update readiness gate to check daemon-restart-orchestrator",
|
|
139
140
|
"resolve TS errors blocking publish — unused import + undefined row",
|
|
140
141
|
"zombie agent reaper + deferred daemon restart (OOM crash fix)",
|
|
@@ -158,8 +159,7 @@
|
|
|
158
159
|
"DMR retrieval 20% → 100% — stop words, name filtering, speaker fix",
|
|
159
160
|
"kill idle Codex/OpenCode sessions instead of sending intercom — enables auto-wake respawn",
|
|
160
161
|
"suppress daemon auto-reconnect noise — only log after attempt 2+",
|
|
161
|
-
"remove E2EE from bug reports — support intake must be readable server-side"
|
|
162
|
-
"support API — verified encrypted bug reports work (HTTP 201)"
|
|
162
|
+
"remove E2EE from bug reports — support intake must be readable server-side"
|
|
163
163
|
],
|
|
164
164
|
"security": [
|
|
165
165
|
"fix shell injection, SSRF, socket leaks, backup validation",
|
|
@@ -207,10 +207,12 @@
|
|
|
207
207
|
"exe-daemon.ts kills old embed.pid process and cleans up"
|
|
208
208
|
]
|
|
209
209
|
},
|
|
210
|
-
"0.9.
|
|
211
|
-
"version": "0.9.
|
|
210
|
+
"0.9.162": {
|
|
211
|
+
"version": "0.9.162",
|
|
212
212
|
"date": "2026-05-30",
|
|
213
213
|
"features": [
|
|
214
|
+
"add worktree reaper daemon job to prune orphaned agent worktrees",
|
|
215
|
+
"add pre-flight gates to close_task — status gate, worktree check, commit recency",
|
|
214
216
|
"add wiki document ingestion via API for embedding pipeline",
|
|
215
217
|
"add filtered.* projection targets to projection worker",
|
|
216
218
|
"verify-stack post-deploy checks — 8 runtime validations",
|
|
@@ -233,11 +235,15 @@
|
|
|
233
235
|
"update safety + portable backups + restore",
|
|
234
236
|
"complete deployment readiness — all 14 second-pass blind spots fixed",
|
|
235
237
|
"production-ready stack — all 15 blind spots fixed",
|
|
236
|
-
"blocked task notification — ping dispatcher immediately on status change"
|
|
237
|
-
"self-improving skills — usage tracking, success counting, and refinement daemon",
|
|
238
|
-
"4 retrieval improvements — query expansion, stop words, contradiction resolution, abstention"
|
|
238
|
+
"blocked task notification — ping dispatcher immediately on status change"
|
|
239
239
|
],
|
|
240
240
|
"fixes": [
|
|
241
|
+
"zombie reaper must never kill TTY-attached sessions + death log",
|
|
242
|
+
"update readiness gate to check daemon-restart-orchestrator",
|
|
243
|
+
"resolve TS errors blocking publish — unused import + undefined row",
|
|
244
|
+
"zombie agent reaper + deferred daemon restart (OOM crash fix)",
|
|
245
|
+
"idle-kill now reaps Codex/OpenCode sessions (bug 47d1e446)",
|
|
246
|
+
"change orphaned task terminal state from blocked → needs_review",
|
|
241
247
|
"auto-close temporal guard + session_scope fallback + orphan cleanup safety",
|
|
242
248
|
"cloud sync skip-bad-rows + age-based orphan hook reaper",
|
|
243
249
|
"clean unused imports + publish gate fixes for v0.9.159",
|
|
@@ -256,13 +262,7 @@
|
|
|
256
262
|
"DMR retrieval 20% → 100% — stop words, name filtering, speaker fix",
|
|
257
263
|
"kill idle Codex/OpenCode sessions instead of sending intercom — enables auto-wake respawn",
|
|
258
264
|
"suppress daemon auto-reconnect noise — only log after attempt 2+",
|
|
259
|
-
"remove E2EE from bug reports — support intake must be readable server-side"
|
|
260
|
-
"support API — verified encrypted bug reports work (HTTP 201)",
|
|
261
|
-
"support API accepts encrypted bug reports — prevents HTTP 400",
|
|
262
|
-
"Codex agents recheck tasks before stopping — prevents idle-with-open-tasks",
|
|
263
|
-
"P0 #13 session_scope in cleanup SELECT + P0 #6 wire review signal files",
|
|
264
|
-
"add scope import to prompt-submit — gate pass",
|
|
265
|
-
"add writeFileSync import to config.ts"
|
|
265
|
+
"remove E2EE from bug reports — support intake must be readable server-side"
|
|
266
266
|
],
|
|
267
267
|
"security": [
|
|
268
268
|
"fix shell injection, SSRF, socket leaks, backup validation",
|
|
@@ -310,10 +310,14 @@
|
|
|
310
310
|
"exe-daemon.ts kills old embed.pid process and cleans up"
|
|
311
311
|
]
|
|
312
312
|
},
|
|
313
|
-
"0.9.
|
|
314
|
-
"version": "0.9.
|
|
315
|
-
"date": "2026-05-
|
|
313
|
+
"0.9.161": {
|
|
314
|
+
"version": "0.9.161",
|
|
315
|
+
"date": "2026-05-30",
|
|
316
316
|
"features": [
|
|
317
|
+
"add worktree reaper daemon job to prune orphaned agent worktrees",
|
|
318
|
+
"add pre-flight gates to close_task — status gate, worktree check, commit recency",
|
|
319
|
+
"add wiki document ingestion via API for embedding pipeline",
|
|
320
|
+
"add filtered.* projection targets to projection worker",
|
|
317
321
|
"verify-stack post-deploy checks — 8 runtime validations",
|
|
318
322
|
"preflight deploy gate + filtered schema + gateway graceful degradation",
|
|
319
323
|
"harden /exe-afk as primary monitoring tool, deprecate /loop for orchestration",
|
|
@@ -334,18 +338,17 @@
|
|
|
334
338
|
"update safety + portable backups + restore",
|
|
335
339
|
"complete deployment readiness — all 14 second-pass blind spots fixed",
|
|
336
340
|
"production-ready stack — all 15 blind spots fixed",
|
|
337
|
-
"blocked task notification — ping dispatcher immediately on status change"
|
|
338
|
-
"self-improving skills — usage tracking, success counting, and refinement daemon",
|
|
339
|
-
"4 retrieval improvements — query expansion, stop words, contradiction resolution, abstention",
|
|
340
|
-
"competitive roadmap — serverless tier, identity depth, self-improving skills, user modeling",
|
|
341
|
-
"run database migrations before container swap in stack-update"
|
|
341
|
+
"blocked task notification — ping dispatcher immediately on status change"
|
|
342
342
|
],
|
|
343
343
|
"fixes": [
|
|
344
|
-
"
|
|
345
|
-
"
|
|
346
|
-
"
|
|
347
|
-
"
|
|
348
|
-
"
|
|
344
|
+
"update readiness gate to check daemon-restart-orchestrator",
|
|
345
|
+
"resolve TS errors blocking publish — unused import + undefined row",
|
|
346
|
+
"zombie agent reaper + deferred daemon restart (OOM crash fix)",
|
|
347
|
+
"idle-kill now reaps Codex/OpenCode sessions (bug 47d1e446)",
|
|
348
|
+
"change orphaned task terminal state from blocked → needs_review",
|
|
349
|
+
"auto-close temporal guard + session_scope fallback + orphan cleanup safety",
|
|
350
|
+
"cloud sync skip-bad-rows + age-based orphan hook reaper",
|
|
351
|
+
"clean unused imports + publish gate fixes for v0.9.159",
|
|
349
352
|
"daemon memory cascade — prevent duplicate daemons, reap orphan hooks, cap heap",
|
|
350
353
|
"auto-inject timeout on tmux capture-pane to prevent session freeze",
|
|
351
354
|
"auto-wake crash loop — filter boot memories + circuit breaker",
|
|
@@ -362,10 +365,7 @@
|
|
|
362
365
|
"kill idle Codex/OpenCode sessions instead of sending intercom — enables auto-wake respawn",
|
|
363
366
|
"suppress daemon auto-reconnect noise — only log after attempt 2+",
|
|
364
367
|
"remove E2EE from bug reports — support intake must be readable server-side",
|
|
365
|
-
"support API — verified encrypted bug reports work (HTTP 201)"
|
|
366
|
-
"support API accepts encrypted bug reports — prevents HTTP 400",
|
|
367
|
-
"Codex agents recheck tasks before stopping — prevents idle-with-open-tasks",
|
|
368
|
-
"P0 #13 session_scope in cleanup SELECT + P0 #6 wire review signal files"
|
|
368
|
+
"support API — verified encrypted bug reports work (HTTP 201)"
|
|
369
369
|
],
|
|
370
370
|
"security": [
|
|
371
371
|
"fix shell injection, SSRF, socket leaks, backup validation",
|
|
@@ -382,6 +382,8 @@
|
|
|
382
382
|
"fix 4 pricing tier bypass vulnerabilities (audit F1-F4)"
|
|
383
383
|
],
|
|
384
384
|
"other": [
|
|
385
|
+
"bump v0.9.160 — cloud sync resilience + orphan reaper + auto-close guard",
|
|
386
|
+
"update release notes with 5 bug fixes from support triage",
|
|
385
387
|
"bump v0.9.159 — daemon memory cascade fix + session_scope + benchmarks",
|
|
386
388
|
"arch: customer onboarding automation — exe-os deploy-customer command",
|
|
387
389
|
"arch: Fleet Operations Roadmap — 8 phases for production safety at scale",
|
|
@@ -404,71 +406,69 @@
|
|
|
404
406
|
"publish v0.9.144 — ESM require() fix + reliable task signals + OAuth 2.1",
|
|
405
407
|
"add MCP tool tests for message, cloud-sync, and file-copy",
|
|
406
408
|
"add coverage for send_message, cloud_sync, file_copy MCP tools (Track A)",
|
|
407
|
-
"Recover MCP sessions after daemon restart"
|
|
408
|
-
"publish v0.9.143 — all fixes live",
|
|
409
|
-
"publish v0.9.142"
|
|
409
|
+
"Recover MCP sessions after daemon restart"
|
|
410
410
|
],
|
|
411
411
|
"migration_notes": [
|
|
412
412
|
"If daemon goes down, agents will now fail instead of silently",
|
|
413
413
|
"exe-daemon.ts kills old embed.pid process and cleans up"
|
|
414
414
|
]
|
|
415
415
|
},
|
|
416
|
-
"0.9.
|
|
417
|
-
"version": "0.9.
|
|
418
|
-
"date": "2026-05-
|
|
416
|
+
"0.9.160": {
|
|
417
|
+
"version": "0.9.160",
|
|
418
|
+
"date": "2026-05-30",
|
|
419
419
|
"features": [
|
|
420
|
+
"add wiki document ingestion via API for embedding pipeline",
|
|
421
|
+
"add filtered.* projection targets to projection worker",
|
|
422
|
+
"verify-stack post-deploy checks — 8 runtime validations",
|
|
423
|
+
"preflight deploy gate + filtered schema + gateway graceful degradation",
|
|
424
|
+
"harden /exe-afk as primary monitoring tool, deprecate /loop for orchestration",
|
|
425
|
+
"add --judge-model flag to LoCoMo harness",
|
|
426
|
+
"dashboard.askexe.com — customer credits dashboard (backend + frontend)",
|
|
427
|
+
"config persistence contract — document + enforce what survives stack updates",
|
|
428
|
+
"add persona depth to identity — tone, vocabulary, response_style, communication_patterns",
|
|
429
|
+
"4 BEAM improvements — o4-mini judge, entity expansion, temporal prompts, contradiction detection",
|
|
430
|
+
"DMR 100% + BEAM 35% — full results with Claude Sonnet judge",
|
|
431
|
+
"session_scope read paths — search filter + backfill + tests",
|
|
432
|
+
"add session_scope filtering to memory read paths + MCP tools + backfill",
|
|
433
|
+
"classify prompt memories as conversation type + enrich session-end captures",
|
|
434
|
+
"add session_scope column to memories table — schema migration + all write paths",
|
|
435
|
+
"fix Codex integration + add --codex to all 4 harnesses",
|
|
436
|
+
"add checkpoint/resume support for long LoCoMo runs",
|
|
437
|
+
"add Codex GPT-5.5 judge, pre-embedding, expanded retrieval, production prompts",
|
|
420
438
|
"stack manifest 0.9.10 — all new images for customer deployment",
|
|
421
439
|
"update safety + portable backups + restore",
|
|
422
440
|
"complete deployment readiness — all 14 second-pass blind spots fixed",
|
|
423
441
|
"production-ready stack — all 15 blind spots fixed",
|
|
424
442
|
"blocked task notification — ping dispatcher immediately on status change",
|
|
425
443
|
"self-improving skills — usage tracking, success counting, and refinement daemon",
|
|
426
|
-
"4 retrieval improvements — query expansion, stop words, contradiction resolution, abstention"
|
|
427
|
-
"competitive roadmap — serverless tier, identity depth, self-improving skills, user modeling",
|
|
428
|
-
"run database migrations before container swap in stack-update",
|
|
429
|
-
"graph auto-extract from ARCHITECTURE.md — regex-based entity/relationship extraction",
|
|
430
|
-
"migrate cloud.askexe.com → api.askexe.com as canonical endpoint",
|
|
431
|
-
"federated recall — code_context + graph fallback when memory results weak",
|
|
432
|
-
"migrate cloud.askexe.com → api.askexe.com across all src/ defaults",
|
|
433
|
-
"rolling restart in stack-update — one service at a time with health verification",
|
|
434
|
-
"DMR benchmark harness + LoCoMo improvements for v0.9.145 evaluation",
|
|
435
|
-
"Windows/WSL support — WezTerm config + WSL detection in setup wizard",
|
|
436
|
-
"queryTaskRows() consolidation — single scoped query path for all task list operations",
|
|
437
|
-
"review signal files — reliable reviewer notification on update_task(done)",
|
|
438
|
-
"Ghostty-native notifications via OSC 9 — no more Script Editor popup",
|
|
439
|
-
"device-scoped behaviors — device_id column + filter in loading",
|
|
440
|
-
"dispatch reliability — 45s boot timeout, dispatch ack signals, agent heartbeat",
|
|
441
|
-
"setup wizard headless mode + daemon health check after restart",
|
|
442
|
-
"device-scoped behaviors — add device_id column + filter on load",
|
|
443
|
-
"gateway prompt injection defense — 3-tier security hardening",
|
|
444
|
-
"add diagnostics(action=\"merge_agent_memories\") for reassigning memories across agent IDs"
|
|
444
|
+
"4 retrieval improvements — query expansion, stop words, contradiction resolution, abstention"
|
|
445
445
|
],
|
|
446
446
|
"fixes": [
|
|
447
|
+
"auto-close temporal guard + session_scope fallback + orphan cleanup safety",
|
|
448
|
+
"cloud sync skip-bad-rows + age-based orphan hook reaper",
|
|
449
|
+
"clean unused imports + publish gate fixes for v0.9.159",
|
|
450
|
+
"daemon memory cascade — prevent duplicate daemons, reap orphan hooks, cap heap",
|
|
451
|
+
"auto-inject timeout on tmux capture-pane to prevent session freeze",
|
|
452
|
+
"auto-wake crash loop — filter boot memories + circuit breaker",
|
|
453
|
+
"Codex numbered instances use baseAgentName for identity resolution",
|
|
454
|
+
"auto-chain project scope + writeNotification on needs_review",
|
|
455
|
+
"persist WhatsApp auth in Docker volume — prevent data loss on update",
|
|
456
|
+
"wake idle codex sessions on pending tasks",
|
|
457
|
+
"fix daemon MCP session heap leak",
|
|
458
|
+
"include typescript as runtime dependency",
|
|
459
|
+
"remove direct Postgres license validation — CF Worker is the only path",
|
|
460
|
+
"gateway stop_grace_period 45s — prevent SIGKILL during message drain",
|
|
461
|
+
"filter person names from FTS queries to prevent speaker-prefix pollution",
|
|
462
|
+
"DMR retrieval 20% → 100% — stop words, name filtering, speaker fix",
|
|
463
|
+
"kill idle Codex/OpenCode sessions instead of sending intercom — enables auto-wake respawn",
|
|
464
|
+
"suppress daemon auto-reconnect noise — only log after attempt 2+",
|
|
465
|
+
"remove E2EE from bug reports — support intake must be readable server-side",
|
|
447
466
|
"support API — verified encrypted bug reports work (HTTP 201)",
|
|
448
467
|
"support API accepts encrypted bug reports — prevents HTTP 400",
|
|
449
468
|
"Codex agents recheck tasks before stopping — prevents idle-with-open-tasks",
|
|
450
469
|
"P0 #13 session_scope in cleanup SELECT + P0 #6 wire review signal files",
|
|
451
470
|
"add scope import to prompt-submit — gate pass",
|
|
452
|
-
"add writeFileSync import to config.ts"
|
|
453
|
-
"persist cloud endpoint migration to config.json — stop logging on every boot",
|
|
454
|
-
"include memory_type in pushToPostgres metadata — was stripped on sync",
|
|
455
|
-
"add scope import to daemon-orchestration — satisfies customer-readiness gate",
|
|
456
|
-
"skill-refinement.ts — correct writeMemory field names + updateIdentity 3rd arg",
|
|
457
|
-
"make skill lifecycle fields optional on Behavior interface — unblocks publish",
|
|
458
|
-
"session isolation for tmux kill — block cross-scope session kills",
|
|
459
|
-
"session-scope daemon, push, capacity, and cleanup (P0 #7-#13)",
|
|
460
|
-
"add memory_type to crdt-sync MemoryRecord interface — unblocks publish",
|
|
461
|
-
"session-scope daemon, push, capacity, cleanup (P0 #7-#9, #13)",
|
|
462
|
-
"include memory_type in cloud sync push/pull + fix backfill re-sync",
|
|
463
|
-
"session-scope signal file system — prevent cross-session task/review bleed",
|
|
464
|
-
"session-scope notification routing — use row.session_scope over ambient",
|
|
465
|
-
"daemon NEVER guesses session from tmux — header-only routing",
|
|
466
|
-
"3 daemon bugs — context-full TTL override, API watchdog kill-after-3, idle-kill verify",
|
|
467
|
-
"federated recall always searches code_context + graph — count threshold was useless",
|
|
468
|
-
"make cross-repo guardrail task-aware — allow multi-repo work when task scope permits",
|
|
469
|
-
"ONE postgres — replace crm-postgres with exe-db across entire stack",
|
|
470
|
-
"smart session-scoping gate + last boot cleanup leak + triage_bug docs",
|
|
471
|
-
"add shipped_version to support triage + clean platform procedures"
|
|
471
|
+
"add writeFileSync import to config.ts"
|
|
472
472
|
],
|
|
473
473
|
"security": [
|
|
474
474
|
"fix shell injection, SSRF, socket leaks, backup validation",
|
|
@@ -485,6 +485,15 @@
|
|
|
485
485
|
"fix 4 pricing tier bypass vulnerabilities (audit F1-F4)"
|
|
486
486
|
],
|
|
487
487
|
"other": [
|
|
488
|
+
"bump v0.9.160 — cloud sync resilience + orphan reaper + auto-close guard",
|
|
489
|
+
"update release notes with 5 bug fixes from support triage",
|
|
490
|
+
"bump v0.9.159 — daemon memory cascade fix + session_scope + benchmarks",
|
|
491
|
+
"arch: customer onboarding automation — exe-os deploy-customer command",
|
|
492
|
+
"arch: Fleet Operations Roadmap — 8 phases for production safety at scale",
|
|
493
|
+
"arch: add filtered table pipeline + pre-flight deploy system to roadmap",
|
|
494
|
+
"add EXE-OS-STACK.md — complete 6-repo deployment map",
|
|
495
|
+
"cache tmux session (5 calls → 1) + offset daemon timers",
|
|
496
|
+
"cut agent boot from 4min to <30s — merge Bash blocks + parallel DB queries",
|
|
488
497
|
"rename memory schema → graph across codebase",
|
|
489
498
|
"unified access control — admin token + GoTrue across all services",
|
|
490
499
|
"capture data pipeline spec — raw → filter → wiki + CRM projection",
|
|
@@ -500,16 +509,7 @@
|
|
|
500
509
|
"publish v0.9.144 — ESM require() fix + reliable task signals + OAuth 2.1",
|
|
501
510
|
"add MCP tool tests for message, cloud-sync, and file-copy",
|
|
502
511
|
"add coverage for send_message, cloud_sync, file_copy MCP tools (Track A)",
|
|
503
|
-
"Recover MCP sessions after daemon restart"
|
|
504
|
-
"publish v0.9.143 — all fixes live",
|
|
505
|
-
"publish v0.9.142",
|
|
506
|
-
"publish v0.9.141",
|
|
507
|
-
"ops: journalctl rotation + certbot expiry alerting",
|
|
508
|
-
"revert: daemon heap back to 33% of RAM — no artificial cap",
|
|
509
|
-
"v0.9.140 publish + heap cap 4GB (was 33% unbounded)",
|
|
510
|
-
"PG-1 cross-repo entity federation design document",
|
|
511
|
-
"add lint step + automated npm publish workflow",
|
|
512
|
-
"audit: scoped SQL + package budget + TUI vendored + TODO classification"
|
|
512
|
+
"Recover MCP sessions after daemon restart"
|
|
513
513
|
],
|
|
514
514
|
"migration_notes": [
|
|
515
515
|
"If daemon goes down, agents will now fail instead of silently",
|