@askexenow/exe-os 0.9.36 → 0.9.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/bin/backfill-conversations.js +3 -0
  2. package/dist/bin/backfill-responses.js +3 -0
  3. package/dist/bin/cleanup-stale-review-tasks.js +3 -0
  4. package/dist/bin/cli.js +3 -0
  5. package/dist/bin/exe-assign.js +3 -0
  6. package/dist/bin/exe-dispatch.js +3 -0
  7. package/dist/bin/exe-export-behaviors.js +3 -0
  8. package/dist/bin/exe-forget.js +3 -0
  9. package/dist/bin/exe-gateway.js +3 -0
  10. package/dist/bin/exe-heartbeat.js +3 -0
  11. package/dist/bin/exe-kill.js +3 -0
  12. package/dist/bin/exe-pending-messages.js +3 -0
  13. package/dist/bin/exe-pending-notifications.js +3 -0
  14. package/dist/bin/exe-pending-reviews.js +3 -0
  15. package/dist/bin/exe-review.js +3 -0
  16. package/dist/bin/exe-search.js +9 -8
  17. package/dist/bin/exe-session-cleanup.js +7 -1
  18. package/dist/bin/exe-status.js +3 -0
  19. package/dist/bin/exe-team.js +3 -0
  20. package/dist/bin/git-sweep.js +3 -0
  21. package/dist/bin/graph-export.js +3 -0
  22. package/dist/bin/intercom-check.js +3 -0
  23. package/dist/bin/scan-tasks.js +3 -0
  24. package/dist/gateway/index.js +3 -0
  25. package/dist/hooks/bug-report-worker.js +3 -0
  26. package/dist/hooks/codex-stop-task-finalizer.js +3 -0
  27. package/dist/hooks/commit-complete.js +3 -0
  28. package/dist/hooks/error-recall.js +9 -8
  29. package/dist/hooks/ingest-worker.js +9 -2
  30. package/dist/hooks/ingest.js +3 -0
  31. package/dist/hooks/instructions-loaded.js +3 -0
  32. package/dist/hooks/notification.js +3 -0
  33. package/dist/hooks/post-compact.js +3 -0
  34. package/dist/hooks/post-tool-combined.js +18 -10
  35. package/dist/hooks/pre-compact.js +5 -1
  36. package/dist/hooks/pre-tool-use.js +3 -0
  37. package/dist/hooks/prompt-submit.js +9 -8
  38. package/dist/hooks/session-end.js +131 -3
  39. package/dist/hooks/session-start.js +9 -8
  40. package/dist/hooks/stop.js +7 -2
  41. package/dist/hooks/subagent-stop.js +3 -0
  42. package/dist/hooks/summary-worker.js +120 -18
  43. package/dist/index.js +25 -14
  44. package/dist/lib/exe-daemon.js +9 -8
  45. package/dist/lib/hybrid-search.js +9 -8
  46. package/dist/lib/store.js +3 -0
  47. package/dist/mcp/server.js +9 -8
  48. package/dist/runtime/index.js +25 -14
  49. package/dist/tui/App.js +3 -0
  50. package/package.json +1 -1
  51. package/src/commands/exe/save.md +9 -5
@@ -3042,6 +3042,9 @@ function classifyMemoryType(input) {
3042
3042
  if (tool.includes("commit") || text.includes("adr-") || text.includes("architectural decision")) return "adr";
3043
3043
  if (tool.includes("store_behavior") || tool.includes("behavior")) return "behavior";
3044
3044
  if (tool.includes("global_procedure") || text.includes("organization-wide procedures")) return "procedure";
3045
+ if (tool.includes("checkpoint") || text.startsWith("context checkpoint")) return "checkpoint";
3046
+ if (tool.includes("sessionsummary") || tool.includes("session-summary")) return "summary";
3047
+ if (tool.includes("sessionend") || text.startsWith("session ended")) return "summary";
3045
3048
  if (tool.includes("send_whatsapp") || tool.includes("conversation")) return "conversation";
3046
3049
  if (tool === "store_memory" || tool === "manual") return "observation";
3047
3050
  return "raw";
@@ -5653,7 +5656,7 @@ async function hybridSearch(queryText, agentId, options) {
5653
5656
  }
5654
5657
  if (lists.length === 0) return [];
5655
5658
  if (lists.length === 1 && !effectiveIsBroad) return lists[0].slice(0, limit);
5656
- const rrfLimit = effectiveIsBroad ? Math.max(limit * 5, 150) : limit;
5659
+ const rrfLimit = effectiveIsBroad ? Math.max(limit * 5, broadFetchTopK) : limit;
5657
5660
  let merged = lists.length === 1 ? lists[0].slice(0, rrfLimit) : rrfMergeMulti(lists, rrfLimit, RRF_K, weights);
5658
5661
  let graphContextMap = /* @__PURE__ */ new Map();
5659
5662
  let entityBoostRan = false;
@@ -5674,6 +5677,7 @@ async function hybridSearch(queryText, agentId, options) {
5674
5677
  returnTopK: 5
5675
5678
  };
5676
5679
  let rerankedAndBlended = null;
5680
+ const rerankReturnLimit = Math.max(limit, auto.returnTopK ?? 5);
5677
5681
  if (effectiveIsBroad && auto.enabled && rerankerAvailable) {
5678
5682
  const cardinality2 = await estimateCardinality(agentId, effectiveOptions);
5679
5683
  if (cardinality2 > auto.broadQueryMinCardinality) {
@@ -5685,16 +5689,16 @@ async function hybridSearch(queryText, agentId, options) {
5685
5689
  text: m.raw_text,
5686
5690
  context: graphContextMap.get(m.id)
5687
5691
  }));
5688
- const scored = await rerankWithContext2(effectiveQuery, candidates, auto.returnTopK);
5692
+ const scored = await rerankWithContext2(effectiveQuery, candidates, rerankReturnLimit);
5689
5693
  rerankedRecords = scored.map((s) => merged[s.index]);
5690
5694
  } else {
5691
5695
  const { rerank: rerank2 } = await Promise.resolve().then(() => (init_reranker(), reranker_exports));
5692
- rerankedRecords = await rerank2(effectiveQuery, merged, auto.returnTopK);
5696
+ rerankedRecords = await rerank2(effectiveQuery, merged, rerankReturnLimit);
5693
5697
  }
5694
5698
  if (rerankedRecords.length > 0) {
5695
5699
  rerankedAndBlended = rrfMergeMulti(
5696
5700
  [rerankedRecords],
5697
- auto.returnTopK,
5701
+ rerankReturnLimit,
5698
5702
  RRF_K
5699
5703
  );
5700
5704
  }
@@ -5702,10 +5706,7 @@ async function hybridSearch(queryText, agentId, options) {
5702
5706
  }
5703
5707
  }
5704
5708
  }
5705
- const finalResults = (rerankedAndBlended ?? merged).slice(
5706
- 0,
5707
- rerankedAndBlended ? auto.returnTopK : limit
5708
- );
5709
+ const finalResults = (rerankedAndBlended ?? merged).slice(0, limit);
5709
5710
  if (options?.includeSource && finalResults.length > 0) {
5710
5711
  await attachDocumentMetadata(finalResults);
5711
5712
  }
package/dist/lib/store.js CHANGED
@@ -3426,6 +3426,9 @@ function classifyMemoryType(input) {
3426
3426
  if (tool.includes("commit") || text.includes("adr-") || text.includes("architectural decision")) return "adr";
3427
3427
  if (tool.includes("store_behavior") || tool.includes("behavior")) return "behavior";
3428
3428
  if (tool.includes("global_procedure") || text.includes("organization-wide procedures")) return "procedure";
3429
+ if (tool.includes("checkpoint") || text.startsWith("context checkpoint")) return "checkpoint";
3430
+ if (tool.includes("sessionsummary") || tool.includes("session-summary")) return "summary";
3431
+ if (tool.includes("sessionend") || text.startsWith("session ended")) return "summary";
3429
3432
  if (tool.includes("send_whatsapp") || tool.includes("conversation")) return "conversation";
3430
3433
  if (tool === "store_memory" || tool === "manual") return "observation";
3431
3434
  return "raw";
@@ -3601,6 +3601,9 @@ function classifyMemoryType(input) {
3601
3601
  if (tool.includes("commit") || text.includes("adr-") || text.includes("architectural decision")) return "adr";
3602
3602
  if (tool.includes("store_behavior") || tool.includes("behavior")) return "behavior";
3603
3603
  if (tool.includes("global_procedure") || text.includes("organization-wide procedures")) return "procedure";
3604
+ if (tool.includes("checkpoint") || text.startsWith("context checkpoint")) return "checkpoint";
3605
+ if (tool.includes("sessionsummary") || tool.includes("session-summary")) return "summary";
3606
+ if (tool.includes("sessionend") || text.startsWith("session ended")) return "summary";
3604
3607
  if (tool.includes("send_whatsapp") || tool.includes("conversation")) return "conversation";
3605
3608
  if (tool === "store_memory" || tool === "manual") return "observation";
3606
3609
  return "raw";
@@ -6150,7 +6153,7 @@ async function hybridSearch(queryText, agentId, options) {
6150
6153
  }
6151
6154
  if (lists.length === 0) return [];
6152
6155
  if (lists.length === 1 && !effectiveIsBroad) return lists[0].slice(0, limit);
6153
- const rrfLimit = effectiveIsBroad ? Math.max(limit * 5, 150) : limit;
6156
+ const rrfLimit = effectiveIsBroad ? Math.max(limit * 5, broadFetchTopK) : limit;
6154
6157
  let merged = lists.length === 1 ? lists[0].slice(0, rrfLimit) : rrfMergeMulti(lists, rrfLimit, RRF_K, weights);
6155
6158
  let graphContextMap = /* @__PURE__ */ new Map();
6156
6159
  let entityBoostRan = false;
@@ -6171,6 +6174,7 @@ async function hybridSearch(queryText, agentId, options) {
6171
6174
  returnTopK: 5
6172
6175
  };
6173
6176
  let rerankedAndBlended = null;
6177
+ const rerankReturnLimit = Math.max(limit, auto.returnTopK ?? 5);
6174
6178
  if (effectiveIsBroad && auto.enabled && rerankerAvailable) {
6175
6179
  const cardinality2 = await estimateCardinality(agentId, effectiveOptions);
6176
6180
  if (cardinality2 > auto.broadQueryMinCardinality) {
@@ -6182,16 +6186,16 @@ async function hybridSearch(queryText, agentId, options) {
6182
6186
  text: m.raw_text,
6183
6187
  context: graphContextMap.get(m.id)
6184
6188
  }));
6185
- const scored = await rerankWithContext2(effectiveQuery, candidates, auto.returnTopK);
6189
+ const scored = await rerankWithContext2(effectiveQuery, candidates, rerankReturnLimit);
6186
6190
  rerankedRecords = scored.map((s) => merged[s.index]);
6187
6191
  } else {
6188
6192
  const { rerank: rerank2 } = await Promise.resolve().then(() => (init_reranker(), reranker_exports));
6189
- rerankedRecords = await rerank2(effectiveQuery, merged, auto.returnTopK);
6193
+ rerankedRecords = await rerank2(effectiveQuery, merged, rerankReturnLimit);
6190
6194
  }
6191
6195
  if (rerankedRecords.length > 0) {
6192
6196
  rerankedAndBlended = rrfMergeMulti(
6193
6197
  [rerankedRecords],
6194
- auto.returnTopK,
6198
+ rerankReturnLimit,
6195
6199
  RRF_K
6196
6200
  );
6197
6201
  }
@@ -6199,10 +6203,7 @@ async function hybridSearch(queryText, agentId, options) {
6199
6203
  }
6200
6204
  }
6201
6205
  }
6202
- const finalResults = (rerankedAndBlended ?? merged).slice(
6203
- 0,
6204
- rerankedAndBlended ? auto.returnTopK : limit
6205
- );
6206
+ const finalResults = (rerankedAndBlended ?? merged).slice(0, limit);
6206
6207
  if (options?.includeSource && finalResults.length > 0) {
6207
6208
  await attachDocumentMetadata(finalResults);
6208
6209
  }
@@ -6788,6 +6788,9 @@ function classifyMemoryType(input) {
6788
6788
  if (tool.includes("commit") || text.includes("adr-") || text.includes("architectural decision")) return "adr";
6789
6789
  if (tool.includes("store_behavior") || tool.includes("behavior")) return "behavior";
6790
6790
  if (tool.includes("global_procedure") || text.includes("organization-wide procedures")) return "procedure";
6791
+ if (tool.includes("checkpoint") || text.startsWith("context checkpoint")) return "checkpoint";
6792
+ if (tool.includes("sessionsummary") || tool.includes("session-summary")) return "summary";
6793
+ if (tool.includes("sessionend") || text.startsWith("session ended")) return "summary";
6791
6794
  if (tool.includes("send_whatsapp") || tool.includes("conversation")) return "conversation";
6792
6795
  if (tool === "store_memory" || tool === "manual") return "observation";
6793
6796
  return "raw";
@@ -10233,20 +10236,28 @@ function createExeOSHooks(config) {
10233
10236
  async onSessionEnd(_context, summary) {
10234
10237
  try {
10235
10238
  const { writeMemory: writeMemory2 } = await Promise.resolve().then(() => (init_store(), store_exports));
10236
- if (summary) {
10237
- await writeMemory2({
10238
- id: randomUUID5(),
10239
- agent_id: config.agentId,
10240
- agent_role: "employee",
10241
- session_id: `api-${config.agentId}`,
10242
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
10243
- tool_name: "SessionEnd",
10244
- project_name: config.projectName,
10245
- has_error: false,
10246
- raw_text: `Session ended. Summary: ${summary}`,
10247
- vector: null
10248
- });
10249
- }
10239
+ await writeMemory2({
10240
+ id: randomUUID5(),
10241
+ agent_id: config.agentId,
10242
+ agent_role: "employee",
10243
+ session_id: `api-${config.agentId}`,
10244
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
10245
+ tool_name: "SessionEnd",
10246
+ project_name: config.projectName,
10247
+ has_error: false,
10248
+ raw_text: [
10249
+ "CONTEXT CHECKPOINT [auto:session-end]",
10250
+ `Agent: ${config.agentId}`,
10251
+ `Project: ${config.projectName}`,
10252
+ `Time: ${(/* @__PURE__ */ new Date()).toISOString()}`,
10253
+ "",
10254
+ "## Runtime Summary",
10255
+ summary || "Session ended. No runtime summary was provided."
10256
+ ].join("\n"),
10257
+ vector: null,
10258
+ importance: 8,
10259
+ memory_type: "checkpoint"
10260
+ });
10250
10261
  } catch (err) {
10251
10262
  process.stderr.write(
10252
10263
  `[exe-hooks] session summary store failed: ${err instanceof Error ? err.message : String(err)}
package/dist/tui/App.js CHANGED
@@ -11097,6 +11097,9 @@ function classifyMemoryType(input) {
11097
11097
  if (tool.includes("commit") || text.includes("adr-") || text.includes("architectural decision")) return "adr";
11098
11098
  if (tool.includes("store_behavior") || tool.includes("behavior")) return "behavior";
11099
11099
  if (tool.includes("global_procedure") || text.includes("organization-wide procedures")) return "procedure";
11100
+ if (tool.includes("checkpoint") || text.startsWith("context checkpoint")) return "checkpoint";
11101
+ if (tool.includes("sessionsummary") || tool.includes("session-summary")) return "summary";
11102
+ if (tool.includes("sessionend") || text.startsWith("session ended")) return "summary";
11100
11103
  if (tool.includes("send_whatsapp") || tool.includes("conversation")) return "conversation";
11101
11104
  if (tool === "store_memory" || tool === "manual") return "observation";
11102
11105
  return "raw";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@askexenow/exe-os",
3
- "version": "0.9.36",
3
+ "version": "0.9.37",
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,6 +1,12 @@
1
1
  # /exe-save
2
2
 
3
- Save a context checkpoint commit everything important from this session to long-term memory before context fills up or session ends.
3
+ Manual escape hatch for saving a context checkpoint.
4
+
5
+ Normally you do **not** need this. Exe OS automatically creates structured
6
+ `CONTEXT CHECKPOINT` memories in the background during meaningful work, before
7
+ compaction/context pressure, and at session end. Use `/exe-save` only when the
8
+ founder explicitly says "save everything" or you want an immediate extra
9
+ checkpoint before risky manual work.
4
10
 
5
11
  ## What to save
6
12
 
@@ -42,7 +48,5 @@ Then call `store_memory` again for each major decision as a separate `decision`
42
48
 
43
49
  ## When to use
44
50
 
45
- - Before your context window fills up
46
- - At the end of a long working session
47
- - Before switching to a different project
48
- - When the founder says "save everything"
51
+ - When the founder explicitly asks to save everything
52
+ - Before risky/manual infrastructure work where an extra checkpoint is useful