@askexenow/exe-os 0.9.207 → 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.
@@ -4,7 +4,7 @@ import {
4
4
  } from "../chunk-MTR5SMNA.js";
5
5
  import {
6
6
  lightweightSearch
7
- } from "../chunk-T4TMVXF5.js";
7
+ } from "../chunk-IN5SGMHP.js";
8
8
  import "../chunk-KJVFW5C7.js";
9
9
  import "../chunk-CHCA3ZM2.js";
10
10
  import "../chunk-XJQASQPO.js";
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  hybridSearch,
4
4
  lightweightSearch
5
- } from "../chunk-T4TMVXF5.js";
5
+ } from "../chunk-IN5SGMHP.js";
6
6
  import {
7
7
  initStore
8
8
  } from "../chunk-KJVFW5C7.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  lightweightSearch
3
- } from "./chunk-T4TMVXF5.js";
3
+ } from "./chunk-IN5SGMHP.js";
4
4
  import "./chunk-KJVFW5C7.js";
5
5
  import "./chunk-CHCA3ZM2.js";
6
6
  import "./chunk-XJQASQPO.js";
@@ -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-TRLLNJHH.js");
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-TRLLNJHH.js");
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-TRLLNJHH.js");
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 claudeDir = path.join(os.homedir(), ".claude", "projects");
65
- let projectDirs = [];
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
- for (const dir of projectDirs) {
75
- const jsonlPath = path.join(dir, `${sessionUuid}.jsonl`);
76
- try {
77
- const usage = await extractSessionUsage(jsonlPath);
78
- if (usage.input === 0 && usage.output === 0) continue;
79
- const totals = agentTotals.get(agentId) ?? {
80
- input: 0,
81
- output: 0,
82
- cacheRead: 0,
83
- cacheCreate: 0,
84
- costUSD: 0,
85
- sessions: /* @__PURE__ */ new Set()
86
- };
87
- totals.input += usage.input;
88
- totals.output += usage.output;
89
- totals.cacheRead += usage.cacheRead;
90
- totals.cacheCreate += usage.cacheCreate;
91
- totals.costUSD += usage.costUSD;
92
- totals.sessions.add(sessionUuid);
93
- agentTotals.set(agentId, totals);
94
- break;
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;
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  isRerankerAvailable,
6
6
  rerankWithScores
7
- } from "./chunk-P5J37OSU.js";
7
+ } from "./chunk-4DLHWZRV.js";
8
8
  import {
9
9
  getEntityByName,
10
10
  getEntityNeighbors,
@@ -106,7 +106,7 @@ import {
106
106
  } from "./chunk-OBVXTLRM.js";
107
107
  import {
108
108
  getAgentSpend
109
- } from "./chunk-434A3L6O.js";
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-T4TMVXF5.js";
190
+ } from "./chunk-IN5SGMHP.js";
191
191
  import {
192
192
  attachDocumentMetadata,
193
193
  flushBatch,
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  hybridSearch,
6
6
  lightweightSearch
7
- } from "../chunk-T4TMVXF5.js";
7
+ } from "../chunk-IN5SGMHP.js";
8
8
  import {
9
9
  initStore
10
10
  } from "../chunk-KJVFW5C7.js";
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "version": 1,
3
- "generatedAt": "2026-06-03T13:59:08.725Z",
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": "05a7e7b6de3520f4ebba0490f6f35d8cd0a3e23d7fd18b6cab8c160d42b649f1",
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": "45e49ef9fe9abe2f4dc5c53ccd4b19b3fbfd343673ebf572c8a0d9c99329fda4",
18
+ "prompt-submit.js": "e6d08921271ad17fc959a46d816208275d1b9f533e84708970125001488c38a0",
19
19
  "session-end.js": "2abfca49918f1bc22cabc277fc11b8de1388b0b676cb58f2227ab2cf17955238",
20
- "session-start.js": "e878a9136cfedb9d8e876c605b8c865ab92ef9c1141e85c32b03f714ff79daa4",
20
+ "session-start.js": "f8d00dc3d070f623a220a7da7d9079928f8aa45ce9dac2266a1276d131eedd10",
21
21
  "stop.js": "3982d90bbafc8ae0dbaa2901254884525491d1119d65a0e0eb55359089b7a9ae",
22
22
  "subagent-stop.js": "68f023c30969a4e87fa0014664c26a2e68b56d568fd3a14d1d71b7c39d620042",
23
23
  "summary-worker.js": "832c0a7316dc2a47f92f48925817d86e1f4d8195792ae9d3e87ce2a91228fb82"
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  hybridSearch,
3
3
  lightweightSearch
4
- } from "../chunk-T4TMVXF5.js";
4
+ } from "../chunk-IN5SGMHP.js";
5
5
  import {
6
6
  initStore
7
7
  } from "../chunk-KJVFW5C7.js";
@@ -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-AYLBTVRM.js");
161
+ const { buildCatchupBrief } = await import("../catchup-brief-CNAN2KVD.js");
162
162
  const brief = await buildCatchupBrief(
163
163
  agentId,
164
164
  projectName,
@@ -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 (!await ensureStoreForPolling()) return;
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() {
@@ -5,7 +5,7 @@ import {
5
5
  recentRecords,
6
6
  rrfMerge,
7
7
  rrfMergeMulti
8
- } from "../chunk-T4TMVXF5.js";
8
+ } from "../chunk-IN5SGMHP.js";
9
9
  import "../chunk-KJVFW5C7.js";
10
10
  import "../chunk-CHCA3ZM2.js";
11
11
  import "../chunk-XJQASQPO.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getAgentSpend
3
- } from "../chunk-434A3L6O.js";
3
+ } from "../chunk-Q72H4NTD.js";
4
4
  import "../chunk-3MHKTBHZ.js";
5
5
  import "../chunk-HHECGHFW.js";
6
6
  import "../chunk-FXU7JOXK.js";
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  registerAllTools
3
- } from "../chunk-T4BKQ3CX.js";
3
+ } from "../chunk-WLEIKHPC.js";
4
4
  import "../chunk-EAHUS6WU.js";
5
- import "../chunk-P5J37OSU.js";
5
+ import "../chunk-4DLHWZRV.js";
6
6
  import "../chunk-KH5Y6RR4.js";
7
7
  import "../chunk-557C2IGL.js";
8
8
  import "../chunk-E6ORBQHP.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-434A3L6O.js";
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-T4TMVXF5.js";
59
+ import "../chunk-IN5SGMHP.js";
60
60
  import "../chunk-KJVFW5C7.js";
61
61
  import "../chunk-CHCA3ZM2.js";
62
62
  import "../chunk-XJQASQPO.js";
@@ -3,9 +3,9 @@ import {
3
3
  } from "../chunk-V4TZI6EO.js";
4
4
  import {
5
5
  registerAllTools
6
- } from "../chunk-T4BKQ3CX.js";
6
+ } from "../chunk-WLEIKHPC.js";
7
7
  import "../chunk-EAHUS6WU.js";
8
- import "../chunk-P5J37OSU.js";
8
+ import "../chunk-4DLHWZRV.js";
9
9
  import "../chunk-KH5Y6RR4.js";
10
10
  import "../chunk-557C2IGL.js";
11
11
  import "../chunk-E6ORBQHP.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-434A3L6O.js";
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-T4TMVXF5.js";
69
+ import "../chunk-IN5SGMHP.js";
70
70
  import {
71
71
  disposeStore,
72
72
  initStore
@@ -5,7 +5,7 @@ import {
5
5
  rerank,
6
6
  rerankWithContext,
7
7
  rerankWithScores
8
- } from "./chunk-P5J37OSU.js";
8
+ } from "./chunk-4DLHWZRV.js";
9
9
  import "./chunk-WXW3XGWX.js";
10
10
  import "./chunk-LYH5HE24.js";
11
11
  import "./chunk-MLKGABMK.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@askexenow/exe-os",
3
- "version": "0.9.207",
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",
@@ -1,8 +1,8 @@
1
1
  {
2
- "current": "0.9.207",
2
+ "current": "0.9.208",
3
3
  "notes": {
4
- "0.9.207": {
5
- "version": "0.9.207",
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,7 @@
32
32
  "BEAM multi-tier support — 100K, 1M, 10M token scales"
33
33
  ],
34
34
  "fixes": [
35
+ "Fix daemon agent stats event-loop stalls",
35
36
  "async-ify task re-sync walk + git worktree list in daemon",
36
37
  "async worktree reaper — eliminates 30-min event loop blocks",
37
38
  "simplify telemetry to once-per-day only",
@@ -55,8 +56,7 @@
55
56
  "remove ALL --strict-mcp-config usage — was blocking /exe-intercom in session MCP config too",
56
57
  "tsup outputs to dist directly — kill dist-next migration shim",
57
58
  "drop --strict-mcp-config from lean MCP — was blocking skill loading (/exe-intercom)",
58
- "zombie agent reaper never kills coordinator/exe session processes",
59
- "typecheck errors blocking publish — async embed alert + dead code cleanup"
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,7 @@
73
73
  "fix 4 pricing tier bypass vulnerabilities (audit F1-F4)"
74
74
  ],
75
75
  "other": [
76
+ "bump to v0.9.208",
76
77
  "bump to v0.9.207",
77
78
  "bump to v0.9.206",
78
79
  "bump to v0.9.205",
@@ -96,13 +97,12 @@
96
97
  "remove registry.askexe.com references — fully consolidated to update.askexe.com",
97
98
  "bump to 0.9.198 — coordinator reaper guard",
98
99
  "bump to 0.9.197 — TTL fix + registry consolidation + TS fixes",
99
- "update all manifest images to update.askexe.com + compose + beam tuning",
100
- "bump to 0.9.196"
100
+ "update all manifest images to update.askexe.com + compose + beam tuning"
101
101
  ],
102
102
  "migration_notes": []
103
103
  },
104
- "0.9.206": {
105
- "version": "0.9.206",
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,7 @@
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",
135
136
  "async worktree reaper — eliminates 30-min event loop blocks",
136
137
  "simplify telemetry to once-per-day only",
137
138
  "reduce telemetry batch cadence from 5min to 6h",
@@ -155,8 +156,7 @@
155
156
  "tsup outputs to dist directly — kill dist-next migration shim",
156
157
  "drop --strict-mcp-config from lean MCP — was blocking skill loading (/exe-intercom)",
157
158
  "zombie agent reaper never kills coordinator/exe session processes",
158
- "typecheck errors blocking publish — async embed alert + dead code cleanup",
159
- "session TTL uses registry registeredAt instead of tmux session_created"
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,7 @@
173
173
  "fix 4 pricing tier bypass vulnerabilities (audit F1-F4)"
174
174
  ],
175
175
  "other": [
176
+ "bump to v0.9.207",
176
177
  "bump to v0.9.206",
177
178
  "bump to v0.9.205",
178
179
  "bump to v0.9.204",
@@ -196,13 +197,12 @@
196
197
  "bump to 0.9.198 — coordinator reaper guard",
197
198
  "bump to 0.9.197 — TTL fix + registry consolidation + TS fixes",
198
199
  "update all manifest images to update.askexe.com + compose + beam tuning",
199
- "bump to 0.9.196",
200
- "bump to 0.9.195"
200
+ "bump to 0.9.196"
201
201
  ],
202
202
  "migration_notes": []
203
203
  },
204
- "0.9.205": {
205
- "version": "0.9.205",
204
+ "0.9.206": {
205
+ "version": "0.9.206",
206
206
  "date": "2026-06-03",
207
207
  "features": [
208
208
  "5-minute telemetry batching + per-tool-call usage in payload",
@@ -232,6 +232,7 @@
232
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",
235
236
  "simplify telemetry to once-per-day only",
236
237
  "reduce telemetry batch cadence from 5min to 6h",
237
238
  "prevent daemon telemetry checkpoint stalls",
@@ -255,8 +256,7 @@
255
256
  "drop --strict-mcp-config from lean MCP — was blocking skill loading (/exe-intercom)",
256
257
  "zombie agent reaper never kills coordinator/exe session processes",
257
258
  "typecheck errors blocking publish — async embed alert + dead code cleanup",
258
- "session TTL uses registry registeredAt instead of tmux session_created",
259
- "CRM auth defaults + benchmark beam.ts updates"
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,7 @@
273
273
  "fix 4 pricing tier bypass vulnerabilities (audit F1-F4)"
274
274
  ],
275
275
  "other": [
276
+ "bump to v0.9.206",
276
277
  "bump to v0.9.205",
277
278
  "bump to v0.9.204",
278
279
  "update release-notes.json",
@@ -296,15 +297,19 @@
296
297
  "bump to 0.9.197 — TTL fix + registry consolidation + TS fixes",
297
298
  "update all manifest images to update.askexe.com + compose + beam tuning",
298
299
  "bump to 0.9.196",
299
- "bump to 0.9.195",
300
- "bump to 0.9.194"
300
+ "bump to 0.9.195"
301
301
  ],
302
302
  "migration_notes": []
303
303
  },
304
- "0.9.204": {
305
- "version": "0.9.204",
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",
308
313
  "close orchestration measurement edge gaps",
309
314
  "harden orchestration telemetry coverage",
310
315
  "telemetry upload + RESUME storms + reviewer bottlenecks + DB consistency",
@@ -324,14 +329,12 @@
324
329
  "3-mode BEAM benchmark — FTS vs FTS+Graph vs Hybrid",
325
330
  "wire update.askexe.com — billing schema + non-fatal image credentials",
326
331
  "add 'never defer' platform procedure — fix it now or assign it now",
327
- "BEAM multi-tier support — 100K, 1M, 10M token scales",
328
- "MemoryAgentBench harness — ICLR 2026 benchmark",
329
- "support outbox flusher + list_tasks null fix + doctor outbox status",
330
- "bug report outbox flusher — reports reach AskExe even when daemon is dead",
331
- "add daily-summary CLI entry point + enable tsup build",
332
- "add daemon observability platform procedure"
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",
335
338
  "add gateway tables to init-db.sql — prevents missing table on fresh deploys",
336
339
  "task test mock returns correct shape for createOrRefreshResumeTask",
337
340
  "embed RAM gate 16GB, paste-buffer -p, task dispatch repo + surfacing",
@@ -353,10 +356,7 @@
353
356
  "zombie agent reaper never kills coordinator/exe session processes",
354
357
  "typecheck errors blocking publish — async embed alert + dead code cleanup",
355
358
  "session TTL uses registry registeredAt instead of tmux session_created",
356
- "CRM auth defaults + benchmark beam.ts updates",
357
- "enable GoTrue email auth by default in setup template",
358
- "intercom signal path in packaged source — ships to customers on npm install",
359
- "intercom signal path + registry consolidated to update.askexe.com"
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,7 @@
373
373
  "fix 4 pricing tier bypass vulnerabilities (audit F1-F4)"
374
374
  ],
375
375
  "other": [
376
+ "bump to v0.9.205",
376
377
  "bump to v0.9.204",
377
378
  "update release-notes.json",
378
379
  "bump stack manifest to v0.9.12 — CRM v0.9.44, exe-os v0.9.199",
@@ -396,15 +397,21 @@
396
397
  "update all manifest images to update.askexe.com + compose + beam tuning",
397
398
  "bump to 0.9.196",
398
399
  "bump to 0.9.195",
399
- "bump to 0.9.194",
400
- "bump to 0.9.193"
400
+ "bump to 0.9.194"
401
401
  ],
402
402
  "migration_notes": []
403
403
  },
404
- "0.9.203": {
405
- "version": "0.9.203",
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",
408
415
  "expand orchestration measurement to full event coverage",
409
416
  "DB Authority Phase 1 — task claim and liveness schema",
410
417
  "browser prompt injection defense + persistent cookie jar",
@@ -422,16 +429,10 @@
422
429
  "support outbox flusher + list_tasks null fix + doctor outbox status",
423
430
  "bug report outbox flusher — reports reach AskExe even when daemon is dead",
424
431
  "add daily-summary CLI entry point + enable tsup build",
425
- "add daemon observability platform procedure",
426
- "add retrieval architecture platform procedure for 8-16GB machines",
427
- "graceful shutdown warning via intercom 90s before idle kill",
428
- "upload pre-update snapshot to R2 before every stack-update",
429
- "encrypted daily VPS backups with R2 cloud upload",
430
- "conversation history import — parser + MCP tool + CLI",
431
- "add vps-backup + vps-health-gate scripts with stack-update integration",
432
- "add update_bug_report + update_feature_request MCP tools"
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",
435
436
  "task test mock returns correct shape for createOrRefreshResumeTask",
436
437
  "embed RAM gate 16GB, paste-buffer -p, task dispatch repo + surfacing",
437
438
  "full shard schema parity with main DB",
@@ -455,8 +456,7 @@
455
456
  "CRM auth defaults + benchmark beam.ts updates",
456
457
  "enable GoTrue email auth by default in setup template",
457
458
  "intercom signal path in packaged source — ships to customers on npm install",
458
- "intercom signal path + registry consolidated to update.askexe.com",
459
- "4 customer P2 bugs — CLI passthrough + agent casing + clipboard (#50)"
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,10 @@
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",
476
480
  "bump to v0.9.203",
477
481
  "capture orchestration measurement blind spots",
478
482
  "review push event orchestration roadmap",
@@ -493,11 +497,7 @@
493
497
  "bump to 0.9.196",
494
498
  "bump to 0.9.195",
495
499
  "bump to 0.9.194",
496
- "bump to 0.9.193",
497
- "bump to 0.9.192",
498
- "bump to 0.9.191",
499
- "bump to 0.9.189",
500
- "bump to 0.9.188 — HYGO stack-update blockers fixed"
500
+ "bump to 0.9.193"
501
501
  ],
502
502
  "migration_notes": []
503
503
  }
File without changes