@askexenow/exe-os 0.9.206 → 0.9.208
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/exe-forget.js +1 -1
- package/dist/bin/exe-search.js +1 -1
- package/dist/{catchup-brief-RSE5BJZN.js → catchup-brief-CNAN2KVD.js} +1 -1
- package/dist/{chunk-745HXTTK.js → chunk-IN5SGMHP.js} +3 -3
- package/dist/{chunk-434A3L6O.js → chunk-Q72H4NTD.js} +99 -32
- package/dist/{chunk-PYTUXXP4.js → chunk-QOAPYITU.js} +32 -24
- package/dist/{chunk-XSEXQDU5.js → chunk-WLEIKHPC.js} +4 -4
- package/dist/{daemon-orchestration-ZCJ3XPBE.js → daemon-orchestration-TC3JWVDC.js} +1 -1
- package/dist/hooks/error-recall.js +1 -1
- package/dist/hooks/manifest.json +4 -4
- package/dist/hooks/prompt-submit.js +1 -1
- package/dist/hooks/session-start.js +1 -1
- package/dist/lib/exe-daemon.js +69 -47
- package/dist/lib/hybrid-search.js +1 -1
- package/dist/lib/token-spend.js +1 -1
- package/dist/mcp/register-tools.js +5 -5
- package/dist/mcp/server.js +5 -5
- package/dist/{reranker-S5MJWW7Q.js → reranker-MLJUTXY7.js} +1 -1
- package/package.json +1 -1
- package/release-notes.json +84 -84
- /package/dist/{chunk-E7HAATCK.js → chunk-4DLHWZRV.js} +0 -0
package/dist/bin/exe-forget.js
CHANGED
package/dist/bin/exe-search.js
CHANGED
|
@@ -233,7 +233,7 @@ async function hybridSearch(queryText, agentId, options) {
|
|
|
233
233
|
let rerankerAvailable = false;
|
|
234
234
|
if (process.env.EXE_IS_DAEMON === "1") {
|
|
235
235
|
try {
|
|
236
|
-
const { isRerankerAvailable } = await import("./reranker-
|
|
236
|
+
const { isRerankerAvailable } = await import("./reranker-MLJUTXY7.js");
|
|
237
237
|
rerankerAvailable = isRerankerAvailable();
|
|
238
238
|
} catch {
|
|
239
239
|
}
|
|
@@ -397,7 +397,7 @@ async function hybridSearch(queryText, agentId, options) {
|
|
|
397
397
|
try {
|
|
398
398
|
let rerankedRecords;
|
|
399
399
|
if (graphContextMap.size > 0) {
|
|
400
|
-
const { rerankWithContext } = await import("./reranker-
|
|
400
|
+
const { rerankWithContext } = await import("./reranker-MLJUTXY7.js");
|
|
401
401
|
const candidates = merged.map((m) => ({
|
|
402
402
|
text: m.raw_text,
|
|
403
403
|
context: graphContextMap.get(m.id)
|
|
@@ -405,7 +405,7 @@ async function hybridSearch(queryText, agentId, options) {
|
|
|
405
405
|
const scored = await rerankWithContext(effectiveQuery, candidates, rerankReturnLimit);
|
|
406
406
|
rerankedRecords = scored.map((s) => merged[s.index]);
|
|
407
407
|
} else {
|
|
408
|
-
const { rerank } = await import("./reranker-
|
|
408
|
+
const { rerank } = await import("./reranker-MLJUTXY7.js");
|
|
409
409
|
rerankedRecords = await rerank(effectiveQuery, merged, rerankReturnLimit);
|
|
410
410
|
}
|
|
411
411
|
if (rerankedRecords.length > 0) {
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-3MHKTBHZ.js";
|
|
4
4
|
|
|
5
5
|
// src/lib/token-spend.ts
|
|
6
|
-
import { readdir } from "fs/promises";
|
|
6
|
+
import { readdir, stat } from "fs/promises";
|
|
7
7
|
import { createReadStream } from "fs";
|
|
8
8
|
import { createInterface } from "readline";
|
|
9
9
|
import path from "path";
|
|
@@ -34,7 +34,16 @@ var MODEL_PRICING = {
|
|
|
34
34
|
};
|
|
35
35
|
var DEFAULT_PRICING = MODEL_PRICING["claude-sonnet-4"];
|
|
36
36
|
var CACHE_TTL_MS = 5 * 60 * 1e3;
|
|
37
|
+
var JSONL_INDEX_TTL_MS = 5 * 60 * 1e3;
|
|
38
|
+
var USAGE_CACHE_MAX_ENTRIES = 1e4;
|
|
37
39
|
var _spendCache = /* @__PURE__ */ new Map();
|
|
40
|
+
var _spendInFlight = /* @__PURE__ */ new Map();
|
|
41
|
+
var _usageCache = /* @__PURE__ */ new Map();
|
|
42
|
+
var _usageInFlight = /* @__PURE__ */ new Map();
|
|
43
|
+
var _jsonlPathIndex = null;
|
|
44
|
+
function yieldToEventLoop() {
|
|
45
|
+
return new Promise((resolve) => setImmediate(resolve));
|
|
46
|
+
}
|
|
38
47
|
function getPricing(model) {
|
|
39
48
|
if (MODEL_PRICING[model]) return MODEL_PRICING[model];
|
|
40
49
|
const stripped = model.replace(/-\d{8}$/, "");
|
|
@@ -50,6 +59,13 @@ async function getAgentSpend(period = "7d") {
|
|
|
50
59
|
if (cached && Date.now() < cached.expires) {
|
|
51
60
|
return cached.result;
|
|
52
61
|
}
|
|
62
|
+
const inFlight = _spendInFlight.get(period);
|
|
63
|
+
if (inFlight) return inFlight;
|
|
64
|
+
const promise = computeAgentSpend(period).finally(() => _spendInFlight.delete(period));
|
|
65
|
+
_spendInFlight.set(period, promise);
|
|
66
|
+
return promise;
|
|
67
|
+
}
|
|
68
|
+
async function computeAgentSpend(period) {
|
|
53
69
|
const cutoff = periodToCutoff(period);
|
|
54
70
|
const client = getClient();
|
|
55
71
|
const dbResult = await client.execute({
|
|
@@ -61,40 +77,35 @@ async function getAgentSpend(period = "7d") {
|
|
|
61
77
|
for (const row of dbResult.rows) {
|
|
62
78
|
sessionAgent.set(row.session_uuid, row.agent_id);
|
|
63
79
|
}
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
try {
|
|
67
|
-
const entries = await readdir(claudeDir);
|
|
68
|
-
projectDirs = entries.map((e) => path.join(claudeDir, e));
|
|
69
|
-
} catch {
|
|
70
|
-
return [];
|
|
71
|
-
}
|
|
80
|
+
const jsonlPaths = await getClaudeSessionJsonlIndex();
|
|
81
|
+
if (jsonlPaths.size === 0) return [];
|
|
72
82
|
const agentTotals = /* @__PURE__ */ new Map();
|
|
83
|
+
let processed = 0;
|
|
73
84
|
for (const [sessionUuid, agentId] of sessionAgent) {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
} catch {
|
|
96
|
-
}
|
|
85
|
+
const jsonlPath = jsonlPaths.get(sessionUuid);
|
|
86
|
+
if (!jsonlPath) continue;
|
|
87
|
+
try {
|
|
88
|
+
const usage = await extractSessionUsageCached(jsonlPath);
|
|
89
|
+
if (usage.input === 0 && usage.output === 0) continue;
|
|
90
|
+
const totals = agentTotals.get(agentId) ?? {
|
|
91
|
+
input: 0,
|
|
92
|
+
output: 0,
|
|
93
|
+
cacheRead: 0,
|
|
94
|
+
cacheCreate: 0,
|
|
95
|
+
costUSD: 0,
|
|
96
|
+
sessions: /* @__PURE__ */ new Set()
|
|
97
|
+
};
|
|
98
|
+
totals.input += usage.input;
|
|
99
|
+
totals.output += usage.output;
|
|
100
|
+
totals.cacheRead += usage.cacheRead;
|
|
101
|
+
totals.cacheCreate += usage.cacheCreate;
|
|
102
|
+
totals.costUSD += usage.costUSD;
|
|
103
|
+
totals.sessions.add(sessionUuid);
|
|
104
|
+
agentTotals.set(agentId, totals);
|
|
105
|
+
} catch {
|
|
97
106
|
}
|
|
107
|
+
processed++;
|
|
108
|
+
if (processed % 25 === 0) await yieldToEventLoop();
|
|
98
109
|
}
|
|
99
110
|
const result = Array.from(agentTotals.entries()).map(([agentId, t]) => ({
|
|
100
111
|
agentId,
|
|
@@ -109,6 +120,62 @@ async function getAgentSpend(period = "7d") {
|
|
|
109
120
|
_spendCache.set(period, { result, expires: Date.now() + CACHE_TTL_MS });
|
|
110
121
|
return result;
|
|
111
122
|
}
|
|
123
|
+
async function getClaudeSessionJsonlIndex() {
|
|
124
|
+
if (_jsonlPathIndex && Date.now() < _jsonlPathIndex.expires) {
|
|
125
|
+
return _jsonlPathIndex.paths;
|
|
126
|
+
}
|
|
127
|
+
const claudeDir = path.join(os.homedir(), ".claude", "projects");
|
|
128
|
+
const paths = /* @__PURE__ */ new Map();
|
|
129
|
+
let projectDirs = [];
|
|
130
|
+
try {
|
|
131
|
+
const entries = await readdir(claudeDir, { withFileTypes: true });
|
|
132
|
+
projectDirs = entries.filter((entry) => entry.isDirectory()).map((entry) => path.join(claudeDir, entry.name));
|
|
133
|
+
} catch {
|
|
134
|
+
_jsonlPathIndex = { expires: Date.now() + JSONL_INDEX_TTL_MS, paths };
|
|
135
|
+
return paths;
|
|
136
|
+
}
|
|
137
|
+
let scanned = 0;
|
|
138
|
+
for (const dir of projectDirs) {
|
|
139
|
+
try {
|
|
140
|
+
const files = await readdir(dir);
|
|
141
|
+
for (const file of files) {
|
|
142
|
+
if (!file.endsWith(".jsonl")) continue;
|
|
143
|
+
paths.set(file.slice(0, -".jsonl".length), path.join(dir, file));
|
|
144
|
+
}
|
|
145
|
+
} catch {
|
|
146
|
+
}
|
|
147
|
+
scanned++;
|
|
148
|
+
if (scanned % 25 === 0) await yieldToEventLoop();
|
|
149
|
+
}
|
|
150
|
+
_jsonlPathIndex = { expires: Date.now() + JSONL_INDEX_TTL_MS, paths };
|
|
151
|
+
return paths;
|
|
152
|
+
}
|
|
153
|
+
async function extractSessionUsageCached(jsonlPath) {
|
|
154
|
+
const st = await stat(jsonlPath);
|
|
155
|
+
const cached = _usageCache.get(jsonlPath);
|
|
156
|
+
if (cached && cached.mtimeMs === st.mtimeMs && cached.size === st.size) {
|
|
157
|
+
return cached.usage;
|
|
158
|
+
}
|
|
159
|
+
const existing = _usageInFlight.get(jsonlPath);
|
|
160
|
+
if (existing) return existing;
|
|
161
|
+
const promise = extractSessionUsage(jsonlPath).then((usage) => {
|
|
162
|
+
_usageCache.set(jsonlPath, { mtimeMs: st.mtimeMs, size: st.size, usage });
|
|
163
|
+
pruneUsageCache();
|
|
164
|
+
return usage;
|
|
165
|
+
}).finally(() => _usageInFlight.delete(jsonlPath));
|
|
166
|
+
_usageInFlight.set(jsonlPath, promise);
|
|
167
|
+
return promise;
|
|
168
|
+
}
|
|
169
|
+
function pruneUsageCache() {
|
|
170
|
+
if (_usageCache.size <= USAGE_CACHE_MAX_ENTRIES) return;
|
|
171
|
+
const overflow = _usageCache.size - USAGE_CACHE_MAX_ENTRIES;
|
|
172
|
+
let removed = 0;
|
|
173
|
+
for (const key of _usageCache.keys()) {
|
|
174
|
+
_usageCache.delete(key);
|
|
175
|
+
removed++;
|
|
176
|
+
if (removed >= overflow) break;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
112
179
|
async function extractSessionUsage(jsonlPath) {
|
|
113
180
|
let input = 0;
|
|
114
181
|
let output = 0;
|
|
@@ -1625,6 +1625,9 @@ async function createWorktreeReaperRealDeps() {
|
|
|
1625
1625
|
const { getGitRoot, isWorktreeDirty: isDirty } = await import("./worktree-QTCOX6RV.js");
|
|
1626
1626
|
const { statSync: statSync2 } = await import("fs");
|
|
1627
1627
|
const { basename } = await import("path");
|
|
1628
|
+
const { promisify } = await import("util");
|
|
1629
|
+
const { execFile: execFileCb } = await import("child_process");
|
|
1630
|
+
const execFileAsync = promisify(execFileCb);
|
|
1628
1631
|
const sessions = listTmuxSessions();
|
|
1629
1632
|
const cwdMap = /* @__PURE__ */ new Map();
|
|
1630
1633
|
const cwdPromises = sessions.map(async (s) => {
|
|
@@ -1635,33 +1638,38 @@ async function createWorktreeReaperRealDeps() {
|
|
|
1635
1638
|
}
|
|
1636
1639
|
});
|
|
1637
1640
|
await Promise.all(cwdPromises);
|
|
1641
|
+
const repoRoots = /* @__PURE__ */ new Set();
|
|
1642
|
+
for (const cwd of cwdMap.values()) {
|
|
1643
|
+
const root = getGitRoot(cwd);
|
|
1644
|
+
if (root) repoRoots.add(root);
|
|
1645
|
+
}
|
|
1646
|
+
const worktreeCache = /* @__PURE__ */ new Map();
|
|
1647
|
+
const wtPromises = [...repoRoots].map(async (repoRoot) => {
|
|
1648
|
+
try {
|
|
1649
|
+
const { stdout } = await execFileAsync("git", ["worktree", "list", "--porcelain"], {
|
|
1650
|
+
cwd: repoRoot,
|
|
1651
|
+
timeout: 1e4
|
|
1652
|
+
});
|
|
1653
|
+
const worktrees = [];
|
|
1654
|
+
let currentPath = "";
|
|
1655
|
+
for (const line of stdout.split("\n")) {
|
|
1656
|
+
if (line.startsWith("worktree ")) {
|
|
1657
|
+
currentPath = line.slice("worktree ".length);
|
|
1658
|
+
} else if (line.startsWith("branch ") && currentPath) {
|
|
1659
|
+
const branch = line.slice("branch refs/heads/".length);
|
|
1660
|
+
worktrees.push({ path: currentPath, branch });
|
|
1661
|
+
currentPath = "";
|
|
1662
|
+
}
|
|
1663
|
+
}
|
|
1664
|
+
worktreeCache.set(repoRoot, worktrees);
|
|
1665
|
+
} catch {
|
|
1666
|
+
}
|
|
1667
|
+
});
|
|
1668
|
+
await Promise.all(wtPromises);
|
|
1638
1669
|
return {
|
|
1639
1670
|
listTmuxSessions: () => sessions,
|
|
1640
1671
|
getPaneCwd: (s) => cwdMap.get(s),
|
|
1641
|
-
listWorktrees: (repoRoot) =>
|
|
1642
|
-
try {
|
|
1643
|
-
const out = execSync("git worktree list --porcelain", {
|
|
1644
|
-
cwd: repoRoot,
|
|
1645
|
-
encoding: "utf-8",
|
|
1646
|
-
timeout: 1e4,
|
|
1647
|
-
stdio: ["pipe", "pipe", "pipe"]
|
|
1648
|
-
});
|
|
1649
|
-
const worktrees = [];
|
|
1650
|
-
let currentPath = "";
|
|
1651
|
-
for (const line of out.split("\n")) {
|
|
1652
|
-
if (line.startsWith("worktree ")) {
|
|
1653
|
-
currentPath = line.slice("worktree ".length);
|
|
1654
|
-
} else if (line.startsWith("branch ") && currentPath) {
|
|
1655
|
-
const branch = line.slice("branch refs/heads/".length);
|
|
1656
|
-
worktrees.push({ path: currentPath, branch });
|
|
1657
|
-
currentPath = "";
|
|
1658
|
-
}
|
|
1659
|
-
}
|
|
1660
|
-
return worktrees;
|
|
1661
|
-
} catch {
|
|
1662
|
-
return [];
|
|
1663
|
-
}
|
|
1664
|
-
},
|
|
1672
|
+
listWorktrees: (repoRoot) => worktreeCache.get(repoRoot) ?? [],
|
|
1665
1673
|
isWorktreeDirty: (wtPath) => isDirty(wtPath),
|
|
1666
1674
|
getDirMtimeMs: (dirPath) => {
|
|
1667
1675
|
try {
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
import {
|
|
5
5
|
isRerankerAvailable,
|
|
6
6
|
rerankWithScores
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-4DLHWZRV.js";
|
|
8
8
|
import {
|
|
9
9
|
getEntityByName,
|
|
10
10
|
getEntityNeighbors,
|
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
} from "./chunk-SEAFDIKF.js";
|
|
23
23
|
import {
|
|
24
24
|
AUTO_WAKE_MAX_RETRIES
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-QOAPYITU.js";
|
|
26
26
|
import {
|
|
27
27
|
getCachedLicenseGate
|
|
28
28
|
} from "./chunk-GCMXBQ7Y.js";
|
|
@@ -106,7 +106,7 @@ import {
|
|
|
106
106
|
} from "./chunk-OBVXTLRM.js";
|
|
107
107
|
import {
|
|
108
108
|
getAgentSpend
|
|
109
|
-
} from "./chunk-
|
|
109
|
+
} from "./chunk-Q72H4NTD.js";
|
|
110
110
|
import {
|
|
111
111
|
exportGraphHTML,
|
|
112
112
|
generateGraphReport
|
|
@@ -187,7 +187,7 @@ import {
|
|
|
187
187
|
import {
|
|
188
188
|
hybridSearch,
|
|
189
189
|
recentRecords
|
|
190
|
-
} from "./chunk-
|
|
190
|
+
} from "./chunk-IN5SGMHP.js";
|
|
191
191
|
import {
|
|
192
192
|
attachDocumentMetadata,
|
|
193
193
|
flushBatch,
|
package/dist/hooks/manifest.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 1,
|
|
3
|
-
"generatedAt": "2026-06-
|
|
3
|
+
"generatedAt": "2026-06-03T14:09:05.781Z",
|
|
4
4
|
"hashes": {
|
|
5
5
|
"bug-report-worker.js": "9d3b56d139065f399142c958f34379d02a85a0a6a1105863adf2e2ccb89108db",
|
|
6
6
|
"codex-stop-task-finalizer.js": "7571bbe9ab0ca34128bfb812ef804febe7fc20f6d97dba58977ab8ff518c0312",
|
|
7
7
|
"commit-complete.js": "bc9567621fcda704ad9c026e78af3d14e2a86288ff0599f0633be63427c6feb1",
|
|
8
|
-
"error-recall.js": "
|
|
8
|
+
"error-recall.js": "398308a62c376f20eb9aa72815cbb1220c76bc2c007878a88eb69fb49d804bd8",
|
|
9
9
|
"exe-heartbeat-hook.js": "10688da0e9c9972fff33c3bb33923df4e743df9d48e744b96d227836c6270c4c",
|
|
10
10
|
"ingest-worker.js": "df9693b3a590f313868019ab91dd2f7298750492f792c2b8055c4ad68a1c9d67",
|
|
11
11
|
"ingest.js": "766bf7211ab1305cf8acd3aa5da741e2a193f1038d663b53d50c128110679188",
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
"post-tool-combined.js": "7dc4491cd976f39349ad448cc72a9cc53a63f18532fee3f15d9309ce72b09ed0",
|
|
16
16
|
"pre-compact.js": "c35ff8d4774b1b6f4ba0178b03a0359e8ef38c1283f1ff672d7d37c1264a7fa8",
|
|
17
17
|
"pre-tool-use.js": "f610e4cf30dfe5014861e26c121d9157f1b8aa473975d01621c291eae1735267",
|
|
18
|
-
"prompt-submit.js": "
|
|
18
|
+
"prompt-submit.js": "e6d08921271ad17fc959a46d816208275d1b9f533e84708970125001488c38a0",
|
|
19
19
|
"session-end.js": "2abfca49918f1bc22cabc277fc11b8de1388b0b676cb58f2227ab2cf17955238",
|
|
20
|
-
"session-start.js": "
|
|
20
|
+
"session-start.js": "f8d00dc3d070f623a220a7da7d9079928f8aa45ce9dac2266a1276d131eedd10",
|
|
21
21
|
"stop.js": "3982d90bbafc8ae0dbaa2901254884525491d1119d65a0e0eb55359089b7a9ae",
|
|
22
22
|
"subagent-stop.js": "68f023c30969a4e87fa0014664c26a2e68b56d568fd3a14d1d71b7c39d620042",
|
|
23
23
|
"summary-worker.js": "832c0a7316dc2a47f92f48925817d86e1f4d8195792ae9d3e87ce2a91228fb82"
|
|
@@ -158,7 +158,7 @@ You are **${ag.agentId}** (${ag.agentRole}). Daemon is degraded \u2014 memory un
|
|
|
158
158
|
query = `last actions on ${projectName}`;
|
|
159
159
|
header = "## Resuming Session\nHere's where you left off:";
|
|
160
160
|
try {
|
|
161
|
-
const { buildCatchupBrief } = await import("../catchup-brief-
|
|
161
|
+
const { buildCatchupBrief } = await import("../catchup-brief-CNAN2KVD.js");
|
|
162
162
|
const brief = await buildCatchupBrief(
|
|
163
163
|
agentId,
|
|
164
164
|
projectName,
|
package/dist/lib/exe-daemon.js
CHANGED
|
@@ -2249,7 +2249,7 @@ async function startReviewPolling() {
|
|
|
2249
2249
|
lastNudgeSent: /* @__PURE__ */ new Map(),
|
|
2250
2250
|
intervalMs: REVIEW_POLL_INTERVAL_MS
|
|
2251
2251
|
};
|
|
2252
|
-
const { pollReviewNudge, createReviewNudgeRealDeps, loadNudgeState } = await import("../daemon-orchestration-
|
|
2252
|
+
const { pollReviewNudge, createReviewNudgeRealDeps, loadNudgeState } = await import("../daemon-orchestration-TC3JWVDC.js");
|
|
2253
2253
|
const nudgeState = loadNudgeState();
|
|
2254
2254
|
const tick = async () => {
|
|
2255
2255
|
fired("review_polling");
|
|
@@ -2291,7 +2291,7 @@ function startSessionTTL() {
|
|
|
2291
2291
|
if (!await ensureStoreForPolling()) return;
|
|
2292
2292
|
try {
|
|
2293
2293
|
const { getClient } = await import("./database.js");
|
|
2294
|
-
const { checkSessionTTL, createSessionTTLRealDeps } = await import("../daemon-orchestration-
|
|
2294
|
+
const { checkSessionTTL, createSessionTTLRealDeps } = await import("../daemon-orchestration-TC3JWVDC.js");
|
|
2295
2295
|
const deps = createSessionTTLRealDeps(getClient);
|
|
2296
2296
|
const killed = await checkSessionTTL(deps);
|
|
2297
2297
|
if (killed.length > 0) acted("session_ttl");
|
|
@@ -2340,7 +2340,7 @@ function startIdleKill() {
|
|
|
2340
2340
|
const cfg = await getCachedConfig();
|
|
2341
2341
|
if (!cfg) return;
|
|
2342
2342
|
const { getClient } = await import("./database.js");
|
|
2343
|
-
const { pollIdleKill, createIdleKillRealDeps } = await import("../daemon-orchestration-
|
|
2343
|
+
const { pollIdleKill, createIdleKillRealDeps } = await import("../daemon-orchestration-TC3JWVDC.js");
|
|
2344
2344
|
const deps = createIdleKillRealDeps(
|
|
2345
2345
|
getClient,
|
|
2346
2346
|
cfg.sessionLifecycle.idleKillIntercomAckWindowMs
|
|
@@ -2607,10 +2607,14 @@ function startGraphExtraction() {
|
|
|
2607
2607
|
}
|
|
2608
2608
|
var AGENT_STATS_INTERVAL_MS = 60 * 1e3;
|
|
2609
2609
|
var AGENT_STATS_PATH = path3.join(EXE_AI_DIR, "agent-stats.json");
|
|
2610
|
+
var _agentStatsInFlight = false;
|
|
2610
2611
|
async function writeAgentStats() {
|
|
2611
2612
|
fired("agent_stats");
|
|
2612
|
-
if (
|
|
2613
|
+
if (_agentStatsInFlight) return;
|
|
2614
|
+
_agentStatsInFlight = true;
|
|
2615
|
+
const started = Date.now();
|
|
2613
2616
|
try {
|
|
2617
|
+
if (!await ensureStoreForPolling()) return;
|
|
2614
2618
|
acted("agent_stats");
|
|
2615
2619
|
const { getClient } = await import("./database.js");
|
|
2616
2620
|
const client = getClient();
|
|
@@ -2670,6 +2674,19 @@ async function writeAgentStats() {
|
|
|
2670
2674
|
} catch (err) {
|
|
2671
2675
|
process.stderr.write(`[exed] Agent stats error: ${err instanceof Error ? err.message : String(err)}
|
|
2672
2676
|
`);
|
|
2677
|
+
} finally {
|
|
2678
|
+
_agentStatsInFlight = false;
|
|
2679
|
+
const durationMs = Date.now() - started;
|
|
2680
|
+
if (durationMs > 3e3) {
|
|
2681
|
+
process.stderr.write(`[exed] Agent stats slow path: ${durationMs}ms
|
|
2682
|
+
`);
|
|
2683
|
+
logDaemonHealth({
|
|
2684
|
+
event: "process_stats",
|
|
2685
|
+
pid: process.pid,
|
|
2686
|
+
message: `agent_stats took ${durationMs}ms`,
|
|
2687
|
+
data: { type: "timer_slow", timer: "agent_stats", durationMs }
|
|
2688
|
+
});
|
|
2689
|
+
}
|
|
2673
2690
|
}
|
|
2674
2691
|
}
|
|
2675
2692
|
function startAgentStats() {
|
|
@@ -2897,7 +2914,7 @@ function startOrphanReaper() {
|
|
|
2897
2914
|
const tick = async () => {
|
|
2898
2915
|
fired("orphan_reaper");
|
|
2899
2916
|
try {
|
|
2900
|
-
const { reapOrphanedMcpProcesses, createOrphanReaperRealDeps } = await import("../daemon-orchestration-
|
|
2917
|
+
const { reapOrphanedMcpProcesses, createOrphanReaperRealDeps } = await import("../daemon-orchestration-TC3JWVDC.js");
|
|
2901
2918
|
const deps = createOrphanReaperRealDeps();
|
|
2902
2919
|
const reaped = await reapOrphanedMcpProcesses(deps);
|
|
2903
2920
|
if (reaped.length > 0) acted("orphan_reaper");
|
|
@@ -2921,7 +2938,7 @@ function startZombieAgentReaper() {
|
|
|
2921
2938
|
const tick = async () => {
|
|
2922
2939
|
fired("zombie_agent_reaper");
|
|
2923
2940
|
try {
|
|
2924
|
-
const { reapZombieAgentProcesses, createZombieAgentReaperRealDeps } = await import("../daemon-orchestration-
|
|
2941
|
+
const { reapZombieAgentProcesses, createZombieAgentReaperRealDeps } = await import("../daemon-orchestration-TC3JWVDC.js");
|
|
2925
2942
|
const deps = createZombieAgentReaperRealDeps();
|
|
2926
2943
|
const reaped = reapZombieAgentProcesses(deps);
|
|
2927
2944
|
if (reaped.length > 0) acted("zombie_agent_reaper");
|
|
@@ -2944,7 +2961,7 @@ function startWorktreeReaper() {
|
|
|
2944
2961
|
const tick = async () => {
|
|
2945
2962
|
fired("worktree_reaper");
|
|
2946
2963
|
try {
|
|
2947
|
-
const { reapOrphanedWorktrees, createWorktreeReaperRealDeps } = await import("../daemon-orchestration-
|
|
2964
|
+
const { reapOrphanedWorktrees, createWorktreeReaperRealDeps } = await import("../daemon-orchestration-TC3JWVDC.js");
|
|
2948
2965
|
const deps = await createWorktreeReaperRealDeps();
|
|
2949
2966
|
const result = await reapOrphanedWorktrees(deps);
|
|
2950
2967
|
if (result.pruned.length > 0) {
|
|
@@ -2999,7 +3016,7 @@ function startStuckTaskRelease() {
|
|
|
2999
3016
|
if (!await ensureStoreForPolling()) return;
|
|
3000
3017
|
try {
|
|
3001
3018
|
const { getClient } = await import("./database.js");
|
|
3002
|
-
const { releaseStuckTasks, createStuckTaskRealDeps } = await import("../daemon-orchestration-
|
|
3019
|
+
const { releaseStuckTasks, createStuckTaskRealDeps } = await import("../daemon-orchestration-TC3JWVDC.js");
|
|
3003
3020
|
const deps = createStuckTaskRealDeps(getClient);
|
|
3004
3021
|
const released = await releaseStuckTasks(deps);
|
|
3005
3022
|
if (released.length > 0) {
|
|
@@ -3637,60 +3654,65 @@ try {
|
|
|
3637
3654
|
setTimeout(async () => {
|
|
3638
3655
|
try {
|
|
3639
3656
|
if (!await ensureStoreForPolling()) return;
|
|
3640
|
-
const {
|
|
3657
|
+
const { readdir, readFile } = await import("fs/promises");
|
|
3641
3658
|
const { getClient } = await import("./database.js");
|
|
3642
3659
|
const client = getClient();
|
|
3643
3660
|
const tasksRoot = path3.join(os2.homedir(), ".exe-os", "tasks");
|
|
3644
3661
|
let synced = 0;
|
|
3645
|
-
const
|
|
3662
|
+
const walkAsync = async (dir) => {
|
|
3663
|
+
let entries;
|
|
3646
3664
|
try {
|
|
3647
|
-
|
|
3648
|
-
|
|
3649
|
-
|
|
3650
|
-
|
|
3665
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
3666
|
+
} catch {
|
|
3667
|
+
return;
|
|
3668
|
+
}
|
|
3669
|
+
for (const e of entries) {
|
|
3670
|
+
const full = path3.join(dir, e.name);
|
|
3671
|
+
if (e.isDirectory()) {
|
|
3672
|
+
await walkAsync(full);
|
|
3673
|
+
continue;
|
|
3674
|
+
}
|
|
3675
|
+
if (!e.name.endsWith(".md")) continue;
|
|
3676
|
+
try {
|
|
3677
|
+
const content = await readFile(full, "utf8");
|
|
3678
|
+
const id = content.match(/\*\*ID:\*\*\s*([a-f0-9-]+)/)?.[1];
|
|
3679
|
+
const title = content.split("\n")[0]?.replace(/^# /, "") || "";
|
|
3680
|
+
const assignedTo = content.match(/\*\*Assigned to:\*\*\s*(\w+)/)?.[1];
|
|
3681
|
+
const assignedBy = content.match(/\*\*Assigned by:\*\*\s*(\w+)/)?.[1] || "exe";
|
|
3682
|
+
const project = content.match(/\*\*Project:\*\*\s*([\w-]+)/)?.[1] || "exe-os";
|
|
3683
|
+
const status = content.match(/\*\*Status:\*\*\s*(\w+)/)?.[1] || "open";
|
|
3684
|
+
const priority = content.match(/\*\*Priority:\*\*\s*(\w+)/)?.[1] || "p1";
|
|
3685
|
+
const scope = full.match(/tasks\/([^/]+)\//)?.[1] || null;
|
|
3686
|
+
if (id && assignedTo) {
|
|
3651
3687
|
try {
|
|
3652
|
-
const
|
|
3653
|
-
|
|
3654
|
-
|
|
3655
|
-
|
|
3656
|
-
|
|
3657
|
-
|
|
3658
|
-
|
|
3659
|
-
|
|
3660
|
-
|
|
3661
|
-
|
|
3662
|
-
|
|
3663
|
-
|
|
3664
|
-
|
|
3665
|
-
|
|
3666
|
-
|
|
3667
|
-
|
|
3668
|
-
|
|
3669
|
-
void import("../orchestration-events-MSJVUR4T.js").then(({ recordOrchestrationEventBestEffort: recordOE }) => {
|
|
3670
|
-
recordOE({
|
|
3671
|
-
eventType: "task_file.resynced",
|
|
3672
|
-
source: "exe-daemon.taskFileResync",
|
|
3673
|
-
taskId: id,
|
|
3674
|
-
agentId: assignedTo,
|
|
3675
|
-
sessionScope: scope,
|
|
3676
|
-
projectName: project,
|
|
3677
|
-
payload: { status, priority }
|
|
3678
|
-
});
|
|
3679
|
-
}).catch(() => {
|
|
3680
|
-
});
|
|
3681
|
-
}
|
|
3688
|
+
const res = await client.execute({
|
|
3689
|
+
sql: `INSERT OR IGNORE INTO tasks (id, title, assigned_to, assigned_by, project_name, status, priority, task_file, session_scope, created_at, updated_at)
|
|
3690
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
3691
|
+
args: [id, title, assignedTo, assignedBy, project, status, priority, full, scope, (/* @__PURE__ */ new Date()).toISOString(), (/* @__PURE__ */ new Date()).toISOString()]
|
|
3692
|
+
});
|
|
3693
|
+
if (Number(res.rowsAffected ?? 0) > 0) {
|
|
3694
|
+
synced++;
|
|
3695
|
+
void import("../orchestration-events-MSJVUR4T.js").then(({ recordOrchestrationEventBestEffort: recordOE }) => {
|
|
3696
|
+
recordOE({
|
|
3697
|
+
eventType: "task_file.resynced",
|
|
3698
|
+
source: "exe-daemon.taskFileResync",
|
|
3699
|
+
taskId: id,
|
|
3700
|
+
agentId: assignedTo,
|
|
3701
|
+
sessionScope: scope,
|
|
3702
|
+
projectName: project,
|
|
3703
|
+
payload: { status, priority }
|
|
3704
|
+
});
|
|
3682
3705
|
}).catch(() => {
|
|
3683
3706
|
});
|
|
3684
3707
|
}
|
|
3685
3708
|
} catch {
|
|
3686
3709
|
}
|
|
3687
3710
|
}
|
|
3711
|
+
} catch {
|
|
3688
3712
|
}
|
|
3689
|
-
} catch {
|
|
3690
3713
|
}
|
|
3691
3714
|
};
|
|
3692
|
-
|
|
3693
|
-
await new Promise((r) => setTimeout(r, 2e3));
|
|
3715
|
+
await walkAsync(tasksRoot);
|
|
3694
3716
|
if (synced > 0) process.stderr.write(`[exed] Task re-sync: ${synced} missing DB rows restored from disk.
|
|
3695
3717
|
`);
|
|
3696
3718
|
} catch (e) {
|
package/dist/lib/token-spend.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
registerAllTools
|
|
3
|
-
} from "../chunk-
|
|
3
|
+
} from "../chunk-WLEIKHPC.js";
|
|
4
4
|
import "../chunk-EAHUS6WU.js";
|
|
5
|
-
import "../chunk-
|
|
5
|
+
import "../chunk-4DLHWZRV.js";
|
|
6
6
|
import "../chunk-KH5Y6RR4.js";
|
|
7
7
|
import "../chunk-557C2IGL.js";
|
|
8
8
|
import "../chunk-E6ORBQHP.js";
|
|
9
9
|
import "../chunk-SEAFDIKF.js";
|
|
10
|
-
import "../chunk-
|
|
10
|
+
import "../chunk-QOAPYITU.js";
|
|
11
11
|
import "../chunk-GCMXBQ7Y.js";
|
|
12
12
|
import "../chunk-IENYOYZ6.js";
|
|
13
13
|
import "../chunk-GQYIMXUW.js";
|
|
@@ -30,7 +30,7 @@ import "../chunk-Q2G5C3HV.js";
|
|
|
30
30
|
import "../chunk-BGLXECHT.js";
|
|
31
31
|
import "../chunk-QOTQZAAE.js";
|
|
32
32
|
import "../chunk-OBVXTLRM.js";
|
|
33
|
-
import "../chunk-
|
|
33
|
+
import "../chunk-Q72H4NTD.js";
|
|
34
34
|
import "../chunk-46SQTBQW.js";
|
|
35
35
|
import "../chunk-4EKVVGVV.js";
|
|
36
36
|
import "../chunk-GP6G6EQI.js";
|
|
@@ -56,7 +56,7 @@ import "../chunk-MTR5SMNA.js";
|
|
|
56
56
|
import "../chunk-FLCWUX6G.js";
|
|
57
57
|
import "../chunk-EF4PA3TY.js";
|
|
58
58
|
import "../chunk-LMSRF47U.js";
|
|
59
|
-
import "../chunk-
|
|
59
|
+
import "../chunk-IN5SGMHP.js";
|
|
60
60
|
import "../chunk-KJVFW5C7.js";
|
|
61
61
|
import "../chunk-CHCA3ZM2.js";
|
|
62
62
|
import "../chunk-XJQASQPO.js";
|
package/dist/mcp/server.js
CHANGED
|
@@ -3,9 +3,9 @@ import {
|
|
|
3
3
|
} from "../chunk-V4TZI6EO.js";
|
|
4
4
|
import {
|
|
5
5
|
registerAllTools
|
|
6
|
-
} from "../chunk-
|
|
6
|
+
} from "../chunk-WLEIKHPC.js";
|
|
7
7
|
import "../chunk-EAHUS6WU.js";
|
|
8
|
-
import "../chunk-
|
|
8
|
+
import "../chunk-4DLHWZRV.js";
|
|
9
9
|
import "../chunk-KH5Y6RR4.js";
|
|
10
10
|
import "../chunk-557C2IGL.js";
|
|
11
11
|
import "../chunk-E6ORBQHP.js";
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
startToolTelemetryFlush,
|
|
14
14
|
wrapServerWithTelemetry
|
|
15
15
|
} from "../chunk-SEAFDIKF.js";
|
|
16
|
-
import "../chunk-
|
|
16
|
+
import "../chunk-QOAPYITU.js";
|
|
17
17
|
import {
|
|
18
18
|
initLicenseGate
|
|
19
19
|
} from "../chunk-GCMXBQ7Y.js";
|
|
@@ -38,7 +38,7 @@ import "../chunk-Q2G5C3HV.js";
|
|
|
38
38
|
import "../chunk-BGLXECHT.js";
|
|
39
39
|
import "../chunk-QOTQZAAE.js";
|
|
40
40
|
import "../chunk-OBVXTLRM.js";
|
|
41
|
-
import "../chunk-
|
|
41
|
+
import "../chunk-Q72H4NTD.js";
|
|
42
42
|
import "../chunk-46SQTBQW.js";
|
|
43
43
|
import "../chunk-4EKVVGVV.js";
|
|
44
44
|
import "../chunk-GP6G6EQI.js";
|
|
@@ -66,7 +66,7 @@ import "../chunk-MTR5SMNA.js";
|
|
|
66
66
|
import "../chunk-FLCWUX6G.js";
|
|
67
67
|
import "../chunk-EF4PA3TY.js";
|
|
68
68
|
import "../chunk-LMSRF47U.js";
|
|
69
|
-
import "../chunk-
|
|
69
|
+
import "../chunk-IN5SGMHP.js";
|
|
70
70
|
import {
|
|
71
71
|
disposeStore,
|
|
72
72
|
initStore
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@askexenow/exe-os",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.208",
|
|
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.208",
|
|
3
3
|
"notes": {
|
|
4
|
-
"0.9.
|
|
5
|
-
"version": "0.9.
|
|
4
|
+
"0.9.208": {
|
|
5
|
+
"version": "0.9.208",
|
|
6
6
|
"date": "2026-06-03",
|
|
7
7
|
"features": [
|
|
8
8
|
"5-minute telemetry batching + per-tool-call usage in payload",
|
|
@@ -32,6 +32,8 @@
|
|
|
32
32
|
"BEAM multi-tier support — 100K, 1M, 10M token scales"
|
|
33
33
|
],
|
|
34
34
|
"fixes": [
|
|
35
|
+
"Fix daemon agent stats event-loop stalls",
|
|
36
|
+
"async-ify task re-sync walk + git worktree list in daemon",
|
|
35
37
|
"async worktree reaper — eliminates 30-min event loop blocks",
|
|
36
38
|
"simplify telemetry to once-per-day only",
|
|
37
39
|
"reduce telemetry batch cadence from 5min to 6h",
|
|
@@ -54,9 +56,7 @@
|
|
|
54
56
|
"remove ALL --strict-mcp-config usage — was blocking /exe-intercom in session MCP config too",
|
|
55
57
|
"tsup outputs to dist directly — kill dist-next migration shim",
|
|
56
58
|
"drop --strict-mcp-config from lean MCP — was blocking skill loading (/exe-intercom)",
|
|
57
|
-
"zombie agent reaper never kills coordinator/exe session processes"
|
|
58
|
-
"typecheck errors blocking publish — async embed alert + dead code cleanup",
|
|
59
|
-
"session TTL uses registry registeredAt instead of tmux session_created"
|
|
59
|
+
"zombie agent reaper never kills coordinator/exe session processes"
|
|
60
60
|
],
|
|
61
61
|
"security": [
|
|
62
62
|
"fix shell injection, SSRF, socket leaks, backup validation",
|
|
@@ -73,6 +73,8 @@
|
|
|
73
73
|
"fix 4 pricing tier bypass vulnerabilities (audit F1-F4)"
|
|
74
74
|
],
|
|
75
75
|
"other": [
|
|
76
|
+
"bump to v0.9.208",
|
|
77
|
+
"bump to v0.9.207",
|
|
76
78
|
"bump to v0.9.206",
|
|
77
79
|
"bump to v0.9.205",
|
|
78
80
|
"bump to v0.9.204",
|
|
@@ -95,14 +97,12 @@
|
|
|
95
97
|
"remove registry.askexe.com references — fully consolidated to update.askexe.com",
|
|
96
98
|
"bump to 0.9.198 — coordinator reaper guard",
|
|
97
99
|
"bump to 0.9.197 — TTL fix + registry consolidation + TS fixes",
|
|
98
|
-
"update all manifest images to update.askexe.com + compose + beam tuning"
|
|
99
|
-
"bump to 0.9.196",
|
|
100
|
-
"bump to 0.9.195"
|
|
100
|
+
"update all manifest images to update.askexe.com + compose + beam tuning"
|
|
101
101
|
],
|
|
102
102
|
"migration_notes": []
|
|
103
103
|
},
|
|
104
|
-
"0.9.
|
|
105
|
-
"version": "0.9.
|
|
104
|
+
"0.9.207": {
|
|
105
|
+
"version": "0.9.207",
|
|
106
106
|
"date": "2026-06-03",
|
|
107
107
|
"features": [
|
|
108
108
|
"5-minute telemetry batching + per-tool-call usage in payload",
|
|
@@ -132,6 +132,8 @@
|
|
|
132
132
|
"BEAM multi-tier support — 100K, 1M, 10M token scales"
|
|
133
133
|
],
|
|
134
134
|
"fixes": [
|
|
135
|
+
"async-ify task re-sync walk + git worktree list in daemon",
|
|
136
|
+
"async worktree reaper — eliminates 30-min event loop blocks",
|
|
135
137
|
"simplify telemetry to once-per-day only",
|
|
136
138
|
"reduce telemetry batch cadence from 5min to 6h",
|
|
137
139
|
"prevent daemon telemetry checkpoint stalls",
|
|
@@ -154,9 +156,7 @@
|
|
|
154
156
|
"tsup outputs to dist directly — kill dist-next migration shim",
|
|
155
157
|
"drop --strict-mcp-config from lean MCP — was blocking skill loading (/exe-intercom)",
|
|
156
158
|
"zombie agent reaper never kills coordinator/exe session processes",
|
|
157
|
-
"typecheck errors blocking publish — async embed alert + dead code cleanup"
|
|
158
|
-
"session TTL uses registry registeredAt instead of tmux session_created",
|
|
159
|
-
"CRM auth defaults + benchmark beam.ts updates"
|
|
159
|
+
"typecheck errors blocking publish — async embed alert + dead code cleanup"
|
|
160
160
|
],
|
|
161
161
|
"security": [
|
|
162
162
|
"fix shell injection, SSRF, socket leaks, backup validation",
|
|
@@ -173,6 +173,8 @@
|
|
|
173
173
|
"fix 4 pricing tier bypass vulnerabilities (audit F1-F4)"
|
|
174
174
|
],
|
|
175
175
|
"other": [
|
|
176
|
+
"bump to v0.9.207",
|
|
177
|
+
"bump to v0.9.206",
|
|
176
178
|
"bump to v0.9.205",
|
|
177
179
|
"bump to v0.9.204",
|
|
178
180
|
"update release-notes.json",
|
|
@@ -195,16 +197,19 @@
|
|
|
195
197
|
"bump to 0.9.198 — coordinator reaper guard",
|
|
196
198
|
"bump to 0.9.197 — TTL fix + registry consolidation + TS fixes",
|
|
197
199
|
"update all manifest images to update.askexe.com + compose + beam tuning",
|
|
198
|
-
"bump to 0.9.196"
|
|
199
|
-
"bump to 0.9.195",
|
|
200
|
-
"bump to 0.9.194"
|
|
200
|
+
"bump to 0.9.196"
|
|
201
201
|
],
|
|
202
202
|
"migration_notes": []
|
|
203
203
|
},
|
|
204
|
-
"0.9.
|
|
205
|
-
"version": "0.9.
|
|
204
|
+
"0.9.206": {
|
|
205
|
+
"version": "0.9.206",
|
|
206
206
|
"date": "2026-06-03",
|
|
207
207
|
"features": [
|
|
208
|
+
"5-minute telemetry batching + per-tool-call usage in payload",
|
|
209
|
+
"disk outbox for failed telemetry + remote killswitch",
|
|
210
|
+
"auto-attach orchestration metrics to every bug report",
|
|
211
|
+
"auto-send daily telemetry from daemon",
|
|
212
|
+
"add telemetry intake endpoint to Cloudflare Worker",
|
|
208
213
|
"close orchestration measurement edge gaps",
|
|
209
214
|
"harden orchestration telemetry coverage",
|
|
210
215
|
"telemetry upload + RESUME storms + reviewer bottlenecks + DB consistency",
|
|
@@ -224,14 +229,13 @@
|
|
|
224
229
|
"3-mode BEAM benchmark — FTS vs FTS+Graph vs Hybrid",
|
|
225
230
|
"wire update.askexe.com — billing schema + non-fatal image credentials",
|
|
226
231
|
"add 'never defer' platform procedure — fix it now or assign it now",
|
|
227
|
-
"BEAM multi-tier support — 100K, 1M, 10M token scales"
|
|
228
|
-
"MemoryAgentBench harness — ICLR 2026 benchmark",
|
|
229
|
-
"support outbox flusher + list_tasks null fix + doctor outbox status",
|
|
230
|
-
"bug report outbox flusher — reports reach AskExe even when daemon is dead",
|
|
231
|
-
"add daily-summary CLI entry point + enable tsup build",
|
|
232
|
-
"add daemon observability platform procedure"
|
|
232
|
+
"BEAM multi-tier support — 100K, 1M, 10M token scales"
|
|
233
233
|
],
|
|
234
234
|
"fixes": [
|
|
235
|
+
"async worktree reaper — eliminates 30-min event loop blocks",
|
|
236
|
+
"simplify telemetry to once-per-day only",
|
|
237
|
+
"reduce telemetry batch cadence from 5min to 6h",
|
|
238
|
+
"prevent daemon telemetry checkpoint stalls",
|
|
235
239
|
"add gateway tables to init-db.sql — prevents missing table on fresh deploys",
|
|
236
240
|
"task test mock returns correct shape for createOrRefreshResumeTask",
|
|
237
241
|
"embed RAM gate 16GB, paste-buffer -p, task dispatch repo + surfacing",
|
|
@@ -252,11 +256,7 @@
|
|
|
252
256
|
"drop --strict-mcp-config from lean MCP — was blocking skill loading (/exe-intercom)",
|
|
253
257
|
"zombie agent reaper never kills coordinator/exe session processes",
|
|
254
258
|
"typecheck errors blocking publish — async embed alert + dead code cleanup",
|
|
255
|
-
"session TTL uses registry registeredAt instead of tmux session_created"
|
|
256
|
-
"CRM auth defaults + benchmark beam.ts updates",
|
|
257
|
-
"enable GoTrue email auth by default in setup template",
|
|
258
|
-
"intercom signal path in packaged source — ships to customers on npm install",
|
|
259
|
-
"intercom signal path + registry consolidated to update.askexe.com"
|
|
259
|
+
"session TTL uses registry registeredAt instead of tmux session_created"
|
|
260
260
|
],
|
|
261
261
|
"security": [
|
|
262
262
|
"fix shell injection, SSRF, socket leaks, backup validation",
|
|
@@ -273,6 +273,8 @@
|
|
|
273
273
|
"fix 4 pricing tier bypass vulnerabilities (audit F1-F4)"
|
|
274
274
|
],
|
|
275
275
|
"other": [
|
|
276
|
+
"bump to v0.9.206",
|
|
277
|
+
"bump to v0.9.205",
|
|
276
278
|
"bump to v0.9.204",
|
|
277
279
|
"update release-notes.json",
|
|
278
280
|
"bump stack manifest to v0.9.12 — CRM v0.9.44, exe-os v0.9.199",
|
|
@@ -295,16 +297,26 @@
|
|
|
295
297
|
"bump to 0.9.197 — TTL fix + registry consolidation + TS fixes",
|
|
296
298
|
"update all manifest images to update.askexe.com + compose + beam tuning",
|
|
297
299
|
"bump to 0.9.196",
|
|
298
|
-
"bump to 0.9.195"
|
|
299
|
-
"bump to 0.9.194",
|
|
300
|
-
"bump to 0.9.193"
|
|
300
|
+
"bump to 0.9.195"
|
|
301
301
|
],
|
|
302
302
|
"migration_notes": []
|
|
303
303
|
},
|
|
304
|
-
"0.9.
|
|
305
|
-
"version": "0.9.
|
|
304
|
+
"0.9.205": {
|
|
305
|
+
"version": "0.9.205",
|
|
306
306
|
"date": "2026-06-03",
|
|
307
307
|
"features": [
|
|
308
|
+
"5-minute telemetry batching + per-tool-call usage in payload",
|
|
309
|
+
"disk outbox for failed telemetry + remote killswitch",
|
|
310
|
+
"auto-attach orchestration metrics to every bug report",
|
|
311
|
+
"auto-send daily telemetry from daemon",
|
|
312
|
+
"add telemetry intake endpoint to Cloudflare Worker",
|
|
313
|
+
"close orchestration measurement edge gaps",
|
|
314
|
+
"harden orchestration telemetry coverage",
|
|
315
|
+
"telemetry upload + RESUME storms + reviewer bottlenecks + DB consistency",
|
|
316
|
+
"harden orchestration measurement contract",
|
|
317
|
+
"add blocked duration + session duration latency metrics",
|
|
318
|
+
"complete orchestration measurement — all blind spots closed",
|
|
319
|
+
"full orchestration measurement — 38 event types across all blind spots",
|
|
308
320
|
"expand orchestration measurement to full event coverage",
|
|
309
321
|
"DB Authority Phase 1 — task claim and liveness schema",
|
|
310
322
|
"browser prompt injection defense + persistent cookie jar",
|
|
@@ -317,21 +329,13 @@
|
|
|
317
329
|
"3-mode BEAM benchmark — FTS vs FTS+Graph vs Hybrid",
|
|
318
330
|
"wire update.askexe.com — billing schema + non-fatal image credentials",
|
|
319
331
|
"add 'never defer' platform procedure — fix it now or assign it now",
|
|
320
|
-
"BEAM multi-tier support — 100K, 1M, 10M token scales"
|
|
321
|
-
"MemoryAgentBench harness — ICLR 2026 benchmark",
|
|
322
|
-
"support outbox flusher + list_tasks null fix + doctor outbox status",
|
|
323
|
-
"bug report outbox flusher — reports reach AskExe even when daemon is dead",
|
|
324
|
-
"add daily-summary CLI entry point + enable tsup build",
|
|
325
|
-
"add daemon observability platform procedure",
|
|
326
|
-
"add retrieval architecture platform procedure for 8-16GB machines",
|
|
327
|
-
"graceful shutdown warning via intercom 90s before idle kill",
|
|
328
|
-
"upload pre-update snapshot to R2 before every stack-update",
|
|
329
|
-
"encrypted daily VPS backups with R2 cloud upload",
|
|
330
|
-
"conversation history import — parser + MCP tool + CLI",
|
|
331
|
-
"add vps-backup + vps-health-gate scripts with stack-update integration",
|
|
332
|
-
"add update_bug_report + update_feature_request MCP tools"
|
|
332
|
+
"BEAM multi-tier support — 100K, 1M, 10M token scales"
|
|
333
333
|
],
|
|
334
334
|
"fixes": [
|
|
335
|
+
"simplify telemetry to once-per-day only",
|
|
336
|
+
"reduce telemetry batch cadence from 5min to 6h",
|
|
337
|
+
"prevent daemon telemetry checkpoint stalls",
|
|
338
|
+
"add gateway tables to init-db.sql — prevents missing table on fresh deploys",
|
|
335
339
|
"task test mock returns correct shape for createOrRefreshResumeTask",
|
|
336
340
|
"embed RAM gate 16GB, paste-buffer -p, task dispatch repo + surfacing",
|
|
337
341
|
"full shard schema parity with main DB",
|
|
@@ -352,11 +356,7 @@
|
|
|
352
356
|
"zombie agent reaper never kills coordinator/exe session processes",
|
|
353
357
|
"typecheck errors blocking publish — async embed alert + dead code cleanup",
|
|
354
358
|
"session TTL uses registry registeredAt instead of tmux session_created",
|
|
355
|
-
"CRM auth defaults + benchmark beam.ts updates"
|
|
356
|
-
"enable GoTrue email auth by default in setup template",
|
|
357
|
-
"intercom signal path in packaged source — ships to customers on npm install",
|
|
358
|
-
"intercom signal path + registry consolidated to update.askexe.com",
|
|
359
|
-
"4 customer P2 bugs — CLI passthrough + agent casing + clipboard (#50)"
|
|
359
|
+
"CRM auth defaults + benchmark beam.ts updates"
|
|
360
360
|
],
|
|
361
361
|
"security": [
|
|
362
362
|
"fix shell injection, SSRF, socket leaks, backup validation",
|
|
@@ -373,6 +373,11 @@
|
|
|
373
373
|
"fix 4 pricing tier bypass vulnerabilities (audit F1-F4)"
|
|
374
374
|
],
|
|
375
375
|
"other": [
|
|
376
|
+
"bump to v0.9.205",
|
|
377
|
+
"bump to v0.9.204",
|
|
378
|
+
"update release-notes.json",
|
|
379
|
+
"bump stack manifest to v0.9.12 — CRM v0.9.44, exe-os v0.9.199",
|
|
380
|
+
"review full orchestration measurement coverage",
|
|
376
381
|
"bump to v0.9.203",
|
|
377
382
|
"capture orchestration measurement blind spots",
|
|
378
383
|
"review push event orchestration roadmap",
|
|
@@ -392,19 +397,23 @@
|
|
|
392
397
|
"update all manifest images to update.askexe.com + compose + beam tuning",
|
|
393
398
|
"bump to 0.9.196",
|
|
394
399
|
"bump to 0.9.195",
|
|
395
|
-
"bump to 0.9.194"
|
|
396
|
-
"bump to 0.9.193",
|
|
397
|
-
"bump to 0.9.192",
|
|
398
|
-
"bump to 0.9.191",
|
|
399
|
-
"bump to 0.9.189",
|
|
400
|
-
"bump to 0.9.188 — HYGO stack-update blockers fixed"
|
|
400
|
+
"bump to 0.9.194"
|
|
401
401
|
],
|
|
402
402
|
"migration_notes": []
|
|
403
403
|
},
|
|
404
|
-
"0.9.
|
|
405
|
-
"version": "0.9.
|
|
404
|
+
"0.9.204": {
|
|
405
|
+
"version": "0.9.204",
|
|
406
406
|
"date": "2026-06-03",
|
|
407
407
|
"features": [
|
|
408
|
+
"close orchestration measurement edge gaps",
|
|
409
|
+
"harden orchestration telemetry coverage",
|
|
410
|
+
"telemetry upload + RESUME storms + reviewer bottlenecks + DB consistency",
|
|
411
|
+
"harden orchestration measurement contract",
|
|
412
|
+
"add blocked duration + session duration latency metrics",
|
|
413
|
+
"complete orchestration measurement — all blind spots closed",
|
|
414
|
+
"full orchestration measurement — 38 event types across all blind spots",
|
|
415
|
+
"expand orchestration measurement to full event coverage",
|
|
416
|
+
"DB Authority Phase 1 — task claim and liveness schema",
|
|
408
417
|
"browser prompt injection defense + persistent cookie jar",
|
|
409
418
|
"wire exe-erp into VPS stack (init-db, cloudflared, manifest, docs)",
|
|
410
419
|
"consolidate registry.askexe.com → update.askexe.com as primary registry (#51)",
|
|
@@ -420,18 +429,11 @@
|
|
|
420
429
|
"support outbox flusher + list_tasks null fix + doctor outbox status",
|
|
421
430
|
"bug report outbox flusher — reports reach AskExe even when daemon is dead",
|
|
422
431
|
"add daily-summary CLI entry point + enable tsup build",
|
|
423
|
-
"add daemon observability platform procedure"
|
|
424
|
-
"add retrieval architecture platform procedure for 8-16GB machines",
|
|
425
|
-
"graceful shutdown warning via intercom 90s before idle kill",
|
|
426
|
-
"upload pre-update snapshot to R2 before every stack-update",
|
|
427
|
-
"encrypted daily VPS backups with R2 cloud upload",
|
|
428
|
-
"conversation history import — parser + MCP tool + CLI",
|
|
429
|
-
"add vps-backup + vps-health-gate scripts with stack-update integration",
|
|
430
|
-
"add update_bug_report + update_feature_request MCP tools",
|
|
431
|
-
"VPS guardrails — Postgres backup cron + post-deploy health gate",
|
|
432
|
-
"co-occurrence edges + graph backfill script"
|
|
432
|
+
"add daemon observability platform procedure"
|
|
433
433
|
],
|
|
434
434
|
"fixes": [
|
|
435
|
+
"add gateway tables to init-db.sql — prevents missing table on fresh deploys",
|
|
436
|
+
"task test mock returns correct shape for createOrRefreshResumeTask",
|
|
435
437
|
"embed RAM gate 16GB, paste-buffer -p, task dispatch repo + surfacing",
|
|
436
438
|
"full shard schema parity with main DB",
|
|
437
439
|
"ensure orchestration metrics CLI exits",
|
|
@@ -454,9 +456,7 @@
|
|
|
454
456
|
"CRM auth defaults + benchmark beam.ts updates",
|
|
455
457
|
"enable GoTrue email auth by default in setup template",
|
|
456
458
|
"intercom signal path in packaged source — ships to customers on npm install",
|
|
457
|
-
"intercom signal path + registry consolidated to update.askexe.com"
|
|
458
|
-
"4 customer P2 bugs — CLI passthrough + agent casing + clipboard (#50)",
|
|
459
|
-
"MCP pressure eviction evicts ONE session, not all"
|
|
459
|
+
"intercom signal path + registry consolidated to update.askexe.com"
|
|
460
460
|
],
|
|
461
461
|
"security": [
|
|
462
462
|
"fix shell injection, SSRF, socket leaks, backup validation",
|
|
@@ -473,6 +473,15 @@
|
|
|
473
473
|
"fix 4 pricing tier bypass vulnerabilities (audit F1-F4)"
|
|
474
474
|
],
|
|
475
475
|
"other": [
|
|
476
|
+
"bump to v0.9.204",
|
|
477
|
+
"update release-notes.json",
|
|
478
|
+
"bump stack manifest to v0.9.12 — CRM v0.9.44, exe-os v0.9.199",
|
|
479
|
+
"review full orchestration measurement coverage",
|
|
480
|
+
"bump to v0.9.203",
|
|
481
|
+
"capture orchestration measurement blind spots",
|
|
482
|
+
"review push event orchestration roadmap",
|
|
483
|
+
"add full 4-phase DB Authority roadmap to ARCHITECTURE.md",
|
|
484
|
+
"update release-notes for v0.9.202 + remove stale lock file",
|
|
476
485
|
"bump to v0.9.202",
|
|
477
486
|
"bump to v0.9.201",
|
|
478
487
|
"bump to v0.9.200",
|
|
@@ -488,16 +497,7 @@
|
|
|
488
497
|
"bump to 0.9.196",
|
|
489
498
|
"bump to 0.9.195",
|
|
490
499
|
"bump to 0.9.194",
|
|
491
|
-
"bump to 0.9.193"
|
|
492
|
-
"bump to 0.9.192",
|
|
493
|
-
"bump to 0.9.191",
|
|
494
|
-
"bump to 0.9.189",
|
|
495
|
-
"bump to 0.9.188 — HYGO stack-update blockers fixed",
|
|
496
|
-
"bump to 0.9.187",
|
|
497
|
-
"bump to 0.9.186 — cross-session dispatch fix",
|
|
498
|
-
"release: bump exe-os image to v0.9.185 in stack manifest",
|
|
499
|
-
"bump to 0.9.185",
|
|
500
|
-
"bump to 0.9.184"
|
|
500
|
+
"bump to 0.9.193"
|
|
501
501
|
],
|
|
502
502
|
"migration_notes": []
|
|
503
503
|
}
|
|
File without changes
|