@askexenow/exe-os 0.9.210 → 0.9.212

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-GMQKS5JD.js";
5
5
  import {
6
6
  lightweightSearch
7
- } from "../chunk-BCWQQBMO.js";
7
+ } from "../chunk-UVYFJ7IU.js";
8
8
  import "../chunk-E3Q4R3K6.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-BCWQQBMO.js";
5
+ } from "../chunk-UVYFJ7IU.js";
6
6
  import {
7
7
  initStore
8
8
  } from "../chunk-E3Q4R3K6.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  lightweightSearch
3
- } from "./chunk-BCWQQBMO.js";
3
+ } from "./chunk-UVYFJ7IU.js";
4
4
  import "./chunk-E3Q4R3K6.js";
5
5
  import "./chunk-CHCA3ZM2.js";
6
6
  import "./chunk-XJQASQPO.js";
@@ -7,7 +7,7 @@ import {
7
7
  import {
8
8
  isRerankerAvailable,
9
9
  rerankWithScores
10
- } from "./chunk-XXXJ6HV3.js";
10
+ } from "./chunk-HURHILTM.js";
11
11
  import {
12
12
  getEntityByName,
13
13
  getEntityNeighbors,
@@ -187,7 +187,7 @@ import {
187
187
  import {
188
188
  hybridSearch,
189
189
  recentRecords
190
- } from "./chunk-BCWQQBMO.js";
190
+ } from "./chunk-UVYFJ7IU.js";
191
191
  import {
192
192
  attachDocumentMetadata,
193
193
  flushBatch,
@@ -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-N4DKQYFR.js");
236
+ const { isRerankerAvailable } = await import("./reranker-ZRN4LVF3.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-N4DKQYFR.js");
400
+ const { rerankWithContext } = await import("./reranker-ZRN4LVF3.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-N4DKQYFR.js");
408
+ const { rerank } = await import("./reranker-ZRN4LVF3.js");
409
409
  rerankedRecords = await rerank(effectiveQuery, merged, rerankReturnLimit);
410
410
  }
411
411
  if (rerankedRecords.length > 0) {
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  hybridSearch,
6
6
  lightweightSearch
7
- } from "../chunk-BCWQQBMO.js";
7
+ } from "../chunk-UVYFJ7IU.js";
8
8
  import {
9
9
  initStore
10
10
  } from "../chunk-E3Q4R3K6.js";
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "version": 1,
3
- "generatedAt": "2026-06-03T16:10:51.757Z",
3
+ "generatedAt": "2026-06-03T16:18:56.965Z",
4
4
  "hashes": {
5
5
  "bug-report-worker.js": "0026604aac324e295b46bde719681de6800b2df144012cc2c2b349dcdbb082be",
6
6
  "codex-stop-task-finalizer.js": "f6188b6e85f247546996d138de58cd658e40c8175511e22b1b201a1379502632",
7
7
  "commit-complete.js": "1bc2e33e1d00daebc727c5c3e73ec8d5025ad08544e4cde2848d035ee5e21352",
8
- "error-recall.js": "a10110fe0372c8a6f63e912d443a94f8779b47e4f2459f9a955fa9e0be209e7e",
8
+ "error-recall.js": "17715cf538c6e76761582806b7ae9c5406f13b4b061fb6b8d4ffd89574321e82",
9
9
  "exe-heartbeat-hook.js": "10688da0e9c9972fff33c3bb33923df4e743df9d48e744b96d227836c6270c4c",
10
10
  "ingest-worker.js": "df9693b3a590f313868019ab91dd2f7298750492f792c2b8055c4ad68a1c9d67",
11
11
  "ingest.js": "5af6b8a3a4e30c282d27a17a82d55337b7102d84e796198c6390315a39755404",
@@ -15,9 +15,9 @@
15
15
  "post-tool-combined.js": "19469891de74713eab9d5d9273c130d5fe5ad95a2b99618ac4bb9d60120b5c71",
16
16
  "pre-compact.js": "01761e0a404d9cc5fa2ef1788829bd62bbd426395703491906f4b255f32976f4",
17
17
  "pre-tool-use.js": "c2e10257f91ba7a759aa41db28e374b20780d7376eb17d3d167c3e7cbf0a226d",
18
- "prompt-submit.js": "3142970713d7080a563e75dcb2b24b65ec31ba8af06280071222ebab593f1bb8",
18
+ "prompt-submit.js": "9a7f12e04f302e903e12fa854cabfaf2bbb9ef8256facd2c8f9db4a69c94bd7a",
19
19
  "session-end.js": "2cfe3cbc196cb11bbe68ae23d128eacc99d1dbbbdd7b3698189922bf5645a71a",
20
- "session-start.js": "7ff5c760b93148c02702e562e938ec297e93b4d2cba2c06959128359d3856d55",
20
+ "session-start.js": "05e911eae9f09ebfd1eed24c0325705666d871483685e5b0cd7016a0caec9df9",
21
21
  "stop.js": "9c784c10f1a8eddfec9f5dc66463d67a5b09eb21f340e0d92157e9e7befb367b",
22
22
  "subagent-stop.js": "a3d3a01d99dcdcebd5763e5974ce912d69c5f07ba254eb01c2f8c587903ec88c",
23
23
  "summary-worker.js": "f29f29e148ea34b38eab656131b2045e0e4020b526ab8bada9c693eb19dc690e"
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  hybridSearch,
3
3
  lightweightSearch
4
- } from "../chunk-BCWQQBMO.js";
4
+ } from "../chunk-UVYFJ7IU.js";
5
5
  import {
6
6
  initStore
7
7
  } from "../chunk-E3Q4R3K6.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-4EQIVXVV.js");
161
+ const { buildCatchupBrief } = await import("../catchup-brief-VAG2IH72.js");
162
162
  const brief = await buildCatchupBrief(
163
163
  agentId,
164
164
  projectName,
@@ -2609,14 +2609,56 @@ function startGraphExtraction() {
2609
2609
  var AGENT_STATS_INTERVAL_MS = 60 * 1e3;
2610
2610
  var AGENT_STATS_PATH = path3.join(EXE_AI_DIR, "agent-stats.json");
2611
2611
  var _agentStatsInFlight = false;
2612
+ var _cachedAgentData = null;
2612
2613
  async function writeAgentStats() {
2613
2614
  fired("agent_stats");
2614
2615
  if (_agentStatsInFlight) return;
2616
+ if (!_cachedAgentData) return;
2615
2617
  _agentStatsInFlight = true;
2618
+ try {
2619
+ acted("agent_stats");
2620
+ const cache = _cachedAgentData;
2621
+ const agents = [...cache.counts.entries()].map(([id, c]) => {
2622
+ const s24 = cache.spend24h.get(id);
2623
+ const s7 = cache.spend7d.get(id);
2624
+ const s30 = cache.spend30d.get(id);
2625
+ return {
2626
+ id,
2627
+ total: c.total,
2628
+ growth24h: c.growth24h,
2629
+ growth7d: c.growth7d,
2630
+ growth30d: c.growth30d,
2631
+ spend24h: s24 ?? { inputTokens: 0, outputTokens: 0, costUSD: 0, sessions: 0 },
2632
+ spend7d: s7 ?? { inputTokens: 0, outputTokens: 0, costUSD: 0, sessions: 0 },
2633
+ spend30d: s30 ?? { inputTokens: 0, outputTokens: 0, costUSD: 0, sessions: 0 }
2634
+ };
2635
+ });
2636
+ const cacheAge = Math.round((Date.now() - cache.refreshedAt) / 1e3);
2637
+ const stats = {
2638
+ generated: (/* @__PURE__ */ new Date()).toISOString(),
2639
+ dataStatus: cacheAge < AGENT_STATS_REFRESH_INTERVAL_MS / 1e3 ? "fresh" : "stale",
2640
+ agents,
2641
+ daemon: {
2642
+ uptime: Math.floor((Date.now() - _startedAt2) / 1e3),
2643
+ pid: process.pid
2644
+ }
2645
+ };
2646
+ await writeFile(AGENT_STATS_PATH, JSON.stringify(stats, null, 2), "utf8");
2647
+ } catch (err) {
2648
+ process.stderr.write(`[exed] Agent stats error: ${err instanceof Error ? err.message : String(err)}
2649
+ `);
2650
+ } finally {
2651
+ _agentStatsInFlight = false;
2652
+ }
2653
+ }
2654
+ var AGENT_STATS_REFRESH_INTERVAL_MS = 10 * 60 * 1e3;
2655
+ var _agentRefreshInFlight = false;
2656
+ async function refreshAgentData() {
2657
+ if (_agentRefreshInFlight) return;
2658
+ _agentRefreshInFlight = true;
2616
2659
  const started = Date.now();
2617
2660
  try {
2618
2661
  if (!await ensureStoreForPolling()) return;
2619
- acted("agent_stats");
2620
2662
  const { getClient } = await import("./database.js");
2621
2663
  const client = getClient();
2622
2664
  const result = await client.execute({
@@ -2631,69 +2673,58 @@ async function writeAgentStats() {
2631
2673
  ORDER BY total DESC`,
2632
2674
  args: []
2633
2675
  });
2634
- const agentsBase = result.rows.map((row) => ({
2635
- id: String(row.agent_id),
2636
- total: Number(row.total),
2637
- growth24h: Number(row.growth_24h),
2638
- growth7d: Number(row.growth_7d),
2639
- growth30d: Number(row.growth_30d),
2640
- spend24h: { inputTokens: 0, outputTokens: 0, costUSD: 0, sessions: 0 },
2641
- spend7d: { inputTokens: 0, outputTokens: 0, costUSD: 0, sessions: 0 },
2642
- spend30d: { inputTokens: 0, outputTokens: 0, costUSD: 0, sessions: 0 }
2643
- }));
2676
+ const counts = /* @__PURE__ */ new Map();
2677
+ for (const row of result.rows) {
2678
+ counts.set(String(row.agent_id), {
2679
+ total: Number(row.total),
2680
+ growth24h: Number(row.growth_24h),
2681
+ growth7d: Number(row.growth_7d),
2682
+ growth30d: Number(row.growth_30d)
2683
+ });
2684
+ }
2685
+ let spend24h = /* @__PURE__ */ new Map();
2686
+ let spend7d = /* @__PURE__ */ new Map();
2687
+ let spend30d = /* @__PURE__ */ new Map();
2644
2688
  try {
2645
2689
  const { getAgentSpend } = await import("./token-spend.js");
2646
- const [spend24h, spend7d, spend30d] = await Promise.all([
2647
- getAgentSpend("24h"),
2648
- getAgentSpend("7d"),
2649
- getAgentSpend("30d")
2650
- ]);
2651
- const map24h = new Map(spend24h.map((s) => [s.agentId, s]));
2652
- const map7d = new Map(spend7d.map((s) => [s.agentId, s]));
2653
- const map30d = new Map(spend30d.map((s) => [s.agentId, s]));
2654
- for (const agent of agentsBase) {
2655
- const s24 = map24h.get(agent.id);
2656
- const s7 = map7d.get(agent.id);
2657
- const s30 = map30d.get(agent.id);
2658
- if (s24) agent.spend24h = { inputTokens: s24.inputTokens, outputTokens: s24.outputTokens, costUSD: s24.costUSD, sessions: s24.sessions };
2659
- if (s7) agent.spend7d = { inputTokens: s7.inputTokens, outputTokens: s7.outputTokens, costUSD: s7.costUSD, sessions: s7.sessions };
2660
- if (s30) agent.spend30d = { inputTokens: s30.inputTokens, outputTokens: s30.outputTokens, costUSD: s30.costUSD, sessions: s30.sessions };
2661
- }
2690
+ const r24 = await getAgentSpend("24h");
2691
+ spend24h = new Map(r24.map((s) => [s.agentId, { inputTokens: s.inputTokens, outputTokens: s.outputTokens, costUSD: s.costUSD, sessions: s.sessions }]));
2692
+ const r7 = await getAgentSpend("7d");
2693
+ spend7d = new Map(r7.map((s) => [s.agentId, { inputTokens: s.inputTokens, outputTokens: s.outputTokens, costUSD: s.costUSD, sessions: s.sessions }]));
2694
+ const r30 = await getAgentSpend("30d");
2695
+ spend30d = new Map(r30.map((s) => [s.agentId, { inputTokens: s.inputTokens, outputTokens: s.outputTokens, costUSD: s.costUSD, sessions: s.sessions }]));
2662
2696
  } catch (err) {
2663
- process.stderr.write(`[exed] Agent spend merge: ${err instanceof Error ? err.message : String(err)}
2697
+ process.stderr.write(`[exed] Agent spend refresh error: ${err instanceof Error ? err.message : String(err)}
2664
2698
  `);
2665
2699
  }
2666
- const stats = {
2667
- generated: (/* @__PURE__ */ new Date()).toISOString(),
2668
- agents: agentsBase,
2669
- daemon: {
2670
- uptime: Math.floor((Date.now() - _startedAt2) / 1e3),
2671
- pid: process.pid
2672
- }
2673
- };
2674
- await writeFile(AGENT_STATS_PATH, JSON.stringify(stats, null, 2), "utf8");
2675
- } catch (err) {
2676
- process.stderr.write(`[exed] Agent stats error: ${err instanceof Error ? err.message : String(err)}
2677
- `);
2678
- } finally {
2679
- _agentStatsInFlight = false;
2700
+ _cachedAgentData = { counts, spend24h, spend7d, spend30d, refreshedAt: Date.now() };
2680
2701
  const durationMs = Date.now() - started;
2681
- if (durationMs > 3e3) {
2682
- process.stderr.write(`[exed] Agent stats slow path: ${durationMs}ms
2702
+ if (durationMs > 5e3) {
2703
+ process.stderr.write(`[exed] Agent data refresh: ${durationMs}ms (${counts.size} agents)
2683
2704
  `);
2684
2705
  logDaemonHealth({
2685
2706
  event: "process_stats",
2686
2707
  pid: process.pid,
2687
- message: `agent_stats took ${durationMs}ms`,
2688
- data: { type: "timer_slow", timer: "agent_stats", durationMs }
2708
+ message: `agent_data_refresh took ${durationMs}ms`,
2709
+ data: { type: "timer_slow", timer: "agent_data_refresh", durationMs }
2689
2710
  });
2690
2711
  }
2712
+ } catch (err) {
2713
+ process.stderr.write(`[exed] Agent data refresh error: ${err instanceof Error ? err.message : String(err)}
2714
+ `);
2715
+ } finally {
2716
+ _agentRefreshInFlight = false;
2691
2717
  }
2692
2718
  }
2693
2719
  function startAgentStats() {
2694
- const timer = setInterval(() => void writeAgentStats(), AGENT_STATS_INTERVAL_MS);
2695
- timer.unref();
2696
- process.stderr.write(`[exed] Agent stats started (every ${AGENT_STATS_INTERVAL_MS / 1e3}s, first tick deferred)
2720
+ const statsTimer = setInterval(() => void writeAgentStats(), AGENT_STATS_INTERVAL_MS);
2721
+ statsTimer.unref();
2722
+ setTimeout(() => {
2723
+ void refreshAgentData();
2724
+ const refreshTimer = setInterval(() => void refreshAgentData(), AGENT_STATS_REFRESH_INTERVAL_MS);
2725
+ refreshTimer.unref();
2726
+ }, 3 * 60 * 1e3);
2727
+ process.stderr.write(`[exed] Agent stats started (file every ${AGENT_STATS_INTERVAL_MS / 1e3}s, data refresh every ${AGENT_STATS_REFRESH_INTERVAL_MS / 6e4}m, first refresh at +3m)
2697
2728
  `);
2698
2729
  }
2699
2730
  var CONFIDENCE_DECAY_INTERVAL_MS = 24 * 60 * 60 * 1e3;
@@ -5,7 +5,7 @@ import {
5
5
  recentRecords,
6
6
  rrfMerge,
7
7
  rrfMergeMulti
8
- } from "../chunk-BCWQQBMO.js";
8
+ } from "../chunk-UVYFJ7IU.js";
9
9
  import "../chunk-E3Q4R3K6.js";
10
10
  import "../chunk-CHCA3ZM2.js";
11
11
  import "../chunk-XJQASQPO.js";
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  registerAllTools
3
- } from "../chunk-3WTNJTDW.js";
3
+ } from "../chunk-MEP5CND3.js";
4
4
  import "../chunk-557C2IGL.js";
5
5
  import "../chunk-3GFXV46R.js";
6
6
  import "../chunk-BO6HP63V.js";
7
- import "../chunk-XXXJ6HV3.js";
7
+ import "../chunk-HURHILTM.js";
8
8
  import "../chunk-KH5Y6RR4.js";
9
9
  import "../chunk-GCMXBQ7Y.js";
10
10
  import "../chunk-IENYOYZ6.js";
@@ -56,7 +56,7 @@ import "../chunk-GMQKS5JD.js";
56
56
  import "../chunk-K5EXLDQD.js";
57
57
  import "../chunk-EF4PA3TY.js";
58
58
  import "../chunk-LMSRF47U.js";
59
- import "../chunk-BCWQQBMO.js";
59
+ import "../chunk-UVYFJ7IU.js";
60
60
  import "../chunk-E3Q4R3K6.js";
61
61
  import "../chunk-CHCA3ZM2.js";
62
62
  import "../chunk-XJQASQPO.js";
@@ -3,11 +3,11 @@ import {
3
3
  } from "../chunk-V4TZI6EO.js";
4
4
  import {
5
5
  registerAllTools
6
- } from "../chunk-3WTNJTDW.js";
6
+ } from "../chunk-MEP5CND3.js";
7
7
  import "../chunk-557C2IGL.js";
8
8
  import "../chunk-3GFXV46R.js";
9
9
  import "../chunk-BO6HP63V.js";
10
- import "../chunk-XXXJ6HV3.js";
10
+ import "../chunk-HURHILTM.js";
11
11
  import "../chunk-KH5Y6RR4.js";
12
12
  import {
13
13
  initLicenseGate
@@ -66,7 +66,7 @@ import "../chunk-GMQKS5JD.js";
66
66
  import "../chunk-K5EXLDQD.js";
67
67
  import "../chunk-EF4PA3TY.js";
68
68
  import "../chunk-LMSRF47U.js";
69
- import "../chunk-BCWQQBMO.js";
69
+ import "../chunk-UVYFJ7IU.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-XXXJ6HV3.js";
8
+ } from "./chunk-HURHILTM.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.210",
3
+ "version": "0.9.212",
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.210",
2
+ "current": "0.9.212",
3
3
  "notes": {
4
- "0.9.210": {
5
- "version": "0.9.210",
4
+ "0.9.212": {
5
+ "version": "0.9.212",
6
6
  "date": "2026-06-03",
7
7
  "features": [
8
8
  "free license telemetry is mandatory, paid can opt out",
@@ -32,6 +32,8 @@
32
32
  "wire update.askexe.com — billing schema + non-fatal image credentials"
33
33
  ],
34
34
  "fixes": [
35
+ "move DB memory count query to slow path — fast path is cache-only",
36
+ "split agent stats into fast path (60s) + slow path (10m)",
35
37
  "defer agent stats first tick + async file write",
36
38
  "Fix daemon agent stats event-loop stalls",
37
39
  "async-ify task re-sync walk + git worktree list in daemon",
@@ -54,9 +56,7 @@
54
56
  "isolate Metal/GPU ops in worker process — reranker dispose crash was killing daemon",
55
57
  "remove remaining /exe-intercom invocations + update tests",
56
58
  "replace /exe-intercom skill invocation with plain text prompt",
57
- "remove ALL --strict-mcp-config usage — was blocking /exe-intercom in session MCP config too",
58
- "tsup outputs to dist directly — kill dist-next migration shim",
59
- "drop --strict-mcp-config from lean MCP — was blocking skill loading (/exe-intercom)"
59
+ "remove ALL --strict-mcp-config usage — was blocking /exe-intercom in session MCP config too"
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.212",
77
+ "bump to v0.9.211",
76
78
  "bump to v0.9.210",
77
79
  "bump to v0.9.209",
78
80
  "update release-notes.json",
@@ -95,14 +97,12 @@
95
97
  "design orchestration measurement baseline",
96
98
  "capture tmux hardening path",
97
99
  "add orchestration counterargument",
98
- "audit tmux orchestration architecture",
99
- "bump to v0.9.199",
100
- "remove registry.askexe.com references — fully consolidated to update.askexe.com"
100
+ "audit tmux orchestration architecture"
101
101
  ],
102
102
  "migration_notes": []
103
103
  },
104
- "0.9.209": {
105
- "version": "0.9.209",
104
+ "0.9.211": {
105
+ "version": "0.9.211",
106
106
  "date": "2026-06-03",
107
107
  "features": [
108
108
  "free license telemetry is mandatory, paid can opt out",
@@ -132,6 +132,8 @@
132
132
  "wire update.askexe.com — billing schema + non-fatal image credentials"
133
133
  ],
134
134
  "fixes": [
135
+ "split agent stats into fast path (60s) + slow path (10m)",
136
+ "defer agent stats first tick + async file write",
135
137
  "Fix daemon agent stats event-loop stalls",
136
138
  "async-ify task re-sync walk + git worktree list in daemon",
137
139
  "async worktree reaper — eliminates 30-min event loop blocks",
@@ -154,9 +156,7 @@
154
156
  "remove remaining /exe-intercom invocations + update tests",
155
157
  "replace /exe-intercom skill invocation with plain text prompt",
156
158
  "remove ALL --strict-mcp-config usage — was blocking /exe-intercom in session MCP config too",
157
- "tsup outputs to dist directly — kill dist-next migration shim",
158
- "drop --strict-mcp-config from lean MCP — was blocking skill loading (/exe-intercom)",
159
- "zombie agent reaper never kills coordinator/exe session processes"
159
+ "tsup outputs to dist directly — kill dist-next migration shim"
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.211",
177
+ "bump to v0.9.210",
176
178
  "bump to v0.9.209",
177
179
  "update release-notes.json",
178
180
  "Standardize task completion reports",
@@ -195,16 +197,16 @@
195
197
  "capture tmux hardening path",
196
198
  "add orchestration counterargument",
197
199
  "audit tmux orchestration architecture",
198
- "bump to v0.9.199",
199
- "remove registry.askexe.com references — fully consolidated to update.askexe.com",
200
- "bump to 0.9.198 — coordinator reaper guard"
200
+ "bump to v0.9.199"
201
201
  ],
202
202
  "migration_notes": []
203
203
  },
204
- "0.9.208": {
205
- "version": "0.9.208",
204
+ "0.9.210": {
205
+ "version": "0.9.210",
206
206
  "date": "2026-06-03",
207
207
  "features": [
208
+ "free license telemetry is mandatory, paid can opt out",
209
+ "add mcp-sessions CLI — rich status table for running sessions",
208
210
  "5-minute telemetry batching + per-tool-call usage in payload",
209
211
  "disk outbox for failed telemetry + remote killswitch",
210
212
  "auto-attach orchestration metrics to every bug report",
@@ -227,11 +229,10 @@
227
229
  "scale daemon heap to 25% of system RAM, support 10+ coordinators",
228
230
  "add query expansion + benchmark results to retrieval platform procedure",
229
231
  "3-mode BEAM benchmark — FTS vs FTS+Graph vs Hybrid",
230
- "wire update.askexe.com — billing schema + non-fatal image credentials",
231
- "add 'never defer' platform procedure — fix it now or assign it now",
232
- "BEAM multi-tier support — 100K, 1M, 10M token scales"
232
+ "wire update.askexe.com — billing schema + non-fatal image credentials"
233
233
  ],
234
234
  "fixes": [
235
+ "defer agent stats first tick + async file write",
235
236
  "Fix daemon agent stats event-loop stalls",
236
237
  "async-ify task re-sync walk + git worktree list in daemon",
237
238
  "async worktree reaper — eliminates 30-min event loop blocks",
@@ -255,8 +256,7 @@
255
256
  "replace /exe-intercom skill invocation with plain text prompt",
256
257
  "remove ALL --strict-mcp-config usage — was blocking /exe-intercom in session MCP config too",
257
258
  "tsup outputs to dist directly — kill dist-next migration shim",
258
- "drop --strict-mcp-config from lean MCP — was blocking skill loading (/exe-intercom)",
259
- "zombie agent reaper never kills coordinator/exe session processes"
259
+ "drop --strict-mcp-config from lean MCP — was blocking skill loading (/exe-intercom)"
260
260
  ],
261
261
  "security": [
262
262
  "fix shell injection, SSRF, socket leaks, backup validation",
@@ -273,12 +273,15 @@
273
273
  "fix 4 pricing tier bypass vulnerabilities (audit F1-F4)"
274
274
  ],
275
275
  "other": [
276
+ "bump to v0.9.210",
277
+ "bump to v0.9.209",
278
+ "update release-notes.json",
279
+ "Standardize task completion reports",
276
280
  "bump to v0.9.208",
277
281
  "bump to v0.9.207",
278
282
  "bump to v0.9.206",
279
283
  "bump to v0.9.205",
280
284
  "bump to v0.9.204",
281
- "update release-notes.json",
282
285
  "bump stack manifest to v0.9.12 — CRM v0.9.44, exe-os v0.9.199",
283
286
  "review full orchestration measurement coverage",
284
287
  "bump to v0.9.203",
@@ -294,17 +297,16 @@
294
297
  "add orchestration counterargument",
295
298
  "audit tmux orchestration architecture",
296
299
  "bump to v0.9.199",
297
- "remove registry.askexe.com references — fully consolidated to update.askexe.com",
298
- "bump to 0.9.198 — coordinator reaper guard",
299
- "bump to 0.9.197 — TTL fix + registry consolidation + TS fixes",
300
- "update all manifest images to update.askexe.com + compose + beam tuning"
300
+ "remove registry.askexe.com references — fully consolidated to update.askexe.com"
301
301
  ],
302
302
  "migration_notes": []
303
303
  },
304
- "0.9.207": {
305
- "version": "0.9.207",
304
+ "0.9.209": {
305
+ "version": "0.9.209",
306
306
  "date": "2026-06-03",
307
307
  "features": [
308
+ "free license telemetry is mandatory, paid can opt out",
309
+ "add mcp-sessions CLI — rich status table for running sessions",
308
310
  "5-minute telemetry batching + per-tool-call usage in payload",
309
311
  "disk outbox for failed telemetry + remote killswitch",
310
312
  "auto-attach orchestration metrics to every bug report",
@@ -327,11 +329,10 @@
327
329
  "scale daemon heap to 25% of system RAM, support 10+ coordinators",
328
330
  "add query expansion + benchmark results to retrieval platform procedure",
329
331
  "3-mode BEAM benchmark — FTS vs FTS+Graph vs Hybrid",
330
- "wire update.askexe.com — billing schema + non-fatal image credentials",
331
- "add 'never defer' platform procedure — fix it now or assign it now",
332
- "BEAM multi-tier support — 100K, 1M, 10M token scales"
332
+ "wire update.askexe.com — billing schema + non-fatal image credentials"
333
333
  ],
334
334
  "fixes": [
335
+ "Fix daemon agent stats event-loop stalls",
335
336
  "async-ify task re-sync walk + git worktree list in daemon",
336
337
  "async worktree reaper — eliminates 30-min event loop blocks",
337
338
  "simplify telemetry to once-per-day only",
@@ -355,8 +356,7 @@
355
356
  "remove ALL --strict-mcp-config usage — was blocking /exe-intercom in session MCP config too",
356
357
  "tsup outputs to dist directly — kill dist-next migration shim",
357
358
  "drop --strict-mcp-config from lean MCP — was blocking skill loading (/exe-intercom)",
358
- "zombie agent reaper never kills coordinator/exe session processes",
359
- "typecheck errors blocking publish — async embed alert + dead code cleanup"
359
+ "zombie agent reaper never kills coordinator/exe session processes"
360
360
  ],
361
361
  "security": [
362
362
  "fix shell injection, SSRF, socket leaks, backup validation",
@@ -373,11 +373,14 @@
373
373
  "fix 4 pricing tier bypass vulnerabilities (audit F1-F4)"
374
374
  ],
375
375
  "other": [
376
+ "bump to v0.9.209",
377
+ "update release-notes.json",
378
+ "Standardize task completion reports",
379
+ "bump to v0.9.208",
376
380
  "bump to v0.9.207",
377
381
  "bump to v0.9.206",
378
382
  "bump to v0.9.205",
379
383
  "bump to v0.9.204",
380
- "update release-notes.json",
381
384
  "bump stack manifest to v0.9.12 — CRM v0.9.44, exe-os v0.9.199",
382
385
  "review full orchestration measurement coverage",
383
386
  "bump to v0.9.203",
@@ -394,15 +397,12 @@
394
397
  "audit tmux orchestration architecture",
395
398
  "bump to v0.9.199",
396
399
  "remove registry.askexe.com references — fully consolidated to update.askexe.com",
397
- "bump to 0.9.198 — coordinator reaper guard",
398
- "bump to 0.9.197 — TTL fix + registry consolidation + TS fixes",
399
- "update all manifest images to update.askexe.com + compose + beam tuning",
400
- "bump to 0.9.196"
400
+ "bump to 0.9.198 — coordinator reaper guard"
401
401
  ],
402
402
  "migration_notes": []
403
403
  },
404
- "0.9.206": {
405
- "version": "0.9.206",
404
+ "0.9.208": {
405
+ "version": "0.9.208",
406
406
  "date": "2026-06-03",
407
407
  "features": [
408
408
  "5-minute telemetry batching + per-tool-call usage in payload",
@@ -432,6 +432,8 @@
432
432
  "BEAM multi-tier support — 100K, 1M, 10M token scales"
433
433
  ],
434
434
  "fixes": [
435
+ "Fix daemon agent stats event-loop stalls",
436
+ "async-ify task re-sync walk + git worktree list in daemon",
435
437
  "async worktree reaper — eliminates 30-min event loop blocks",
436
438
  "simplify telemetry to once-per-day only",
437
439
  "reduce telemetry batch cadence from 5min to 6h",
@@ -454,9 +456,7 @@
454
456
  "remove ALL --strict-mcp-config usage — was blocking /exe-intercom in session MCP config too",
455
457
  "tsup outputs to dist directly — kill dist-next migration shim",
456
458
  "drop --strict-mcp-config from lean MCP — was blocking skill loading (/exe-intercom)",
457
- "zombie agent reaper never kills coordinator/exe session processes",
458
- "typecheck errors blocking publish — async embed alert + dead code cleanup",
459
- "session TTL uses registry registeredAt instead of tmux session_created"
459
+ "zombie agent reaper never kills coordinator/exe session processes"
460
460
  ],
461
461
  "security": [
462
462
  "fix shell injection, SSRF, socket leaks, backup validation",
@@ -473,6 +473,8 @@
473
473
  "fix 4 pricing tier bypass vulnerabilities (audit F1-F4)"
474
474
  ],
475
475
  "other": [
476
+ "bump to v0.9.208",
477
+ "bump to v0.9.207",
476
478
  "bump to v0.9.206",
477
479
  "bump to v0.9.205",
478
480
  "bump to v0.9.204",
@@ -495,9 +497,7 @@
495
497
  "remove registry.askexe.com references — fully consolidated to update.askexe.com",
496
498
  "bump to 0.9.198 — coordinator reaper guard",
497
499
  "bump to 0.9.197 — TTL fix + registry consolidation + TS fixes",
498
- "update all manifest images to update.askexe.com + compose + beam tuning",
499
- "bump to 0.9.196",
500
- "bump to 0.9.195"
500
+ "update all manifest images to update.askexe.com + compose + beam tuning"
501
501
  ],
502
502
  "migration_notes": []
503
503
  }
File without changes