exovault-mcp-server 1.0.0

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 (305) hide show
  1. package/dist/auth.d.ts +41 -0
  2. package/dist/auth.d.ts.map +1 -0
  3. package/dist/auth.js +236 -0
  4. package/dist/auth.js.map +1 -0
  5. package/dist/auto-session.d.ts +39 -0
  6. package/dist/auto-session.d.ts.map +1 -0
  7. package/dist/auto-session.js +128 -0
  8. package/dist/auto-session.js.map +1 -0
  9. package/dist/buffer-persistence.d.ts +35 -0
  10. package/dist/buffer-persistence.d.ts.map +1 -0
  11. package/dist/buffer-persistence.js +110 -0
  12. package/dist/buffer-persistence.js.map +1 -0
  13. package/dist/coerce-params.d.ts +36 -0
  14. package/dist/coerce-params.d.ts.map +1 -0
  15. package/dist/coerce-params.js +120 -0
  16. package/dist/coerce-params.js.map +1 -0
  17. package/dist/crypto.d.ts +39 -0
  18. package/dist/crypto.d.ts.map +1 -0
  19. package/dist/crypto.js +119 -0
  20. package/dist/crypto.js.map +1 -0
  21. package/dist/db.d.ts +350 -0
  22. package/dist/db.d.ts.map +1 -0
  23. package/dist/db.js +866 -0
  24. package/dist/db.js.map +1 -0
  25. package/dist/embedding-config.d.ts +11 -0
  26. package/dist/embedding-config.d.ts.map +1 -0
  27. package/dist/embedding-config.js +24 -0
  28. package/dist/embedding-config.js.map +1 -0
  29. package/dist/entity-extraction.d.ts +22 -0
  30. package/dist/entity-extraction.d.ts.map +1 -0
  31. package/dist/entity-extraction.js +140 -0
  32. package/dist/entity-extraction.js.map +1 -0
  33. package/dist/episodic-headline.d.ts +6 -0
  34. package/dist/episodic-headline.d.ts.map +1 -0
  35. package/dist/episodic-headline.js +62 -0
  36. package/dist/episodic-headline.js.map +1 -0
  37. package/dist/error-sanitizer.d.ts +20 -0
  38. package/dist/error-sanitizer.d.ts.map +1 -0
  39. package/dist/error-sanitizer.js +54 -0
  40. package/dist/error-sanitizer.js.map +1 -0
  41. package/dist/extraction-budget.d.ts +39 -0
  42. package/dist/extraction-budget.d.ts.map +1 -0
  43. package/dist/extraction-budget.js +122 -0
  44. package/dist/extraction-budget.js.map +1 -0
  45. package/dist/extraction-llm.d.ts +22 -0
  46. package/dist/extraction-llm.d.ts.map +1 -0
  47. package/dist/extraction-llm.js +32 -0
  48. package/dist/extraction-llm.js.map +1 -0
  49. package/dist/extraction-prompt.d.ts +40 -0
  50. package/dist/extraction-prompt.d.ts.map +1 -0
  51. package/dist/extraction-prompt.js +176 -0
  52. package/dist/extraction-prompt.js.map +1 -0
  53. package/dist/gateway-client.d.ts +303 -0
  54. package/dist/gateway-client.d.ts.map +1 -0
  55. package/dist/gateway-client.js +285 -0
  56. package/dist/gateway-client.js.map +1 -0
  57. package/dist/gateway-init.d.ts +32 -0
  58. package/dist/gateway-init.d.ts.map +1 -0
  59. package/dist/gateway-init.js +71 -0
  60. package/dist/gateway-init.js.map +1 -0
  61. package/dist/index.d.ts +2 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +1242 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/infer-task-status.d.ts +7 -0
  66. package/dist/infer-task-status.d.ts.map +1 -0
  67. package/dist/infer-task-status.js +23 -0
  68. package/dist/infer-task-status.js.map +1 -0
  69. package/dist/normalize-agent-id.d.ts +21 -0
  70. package/dist/normalize-agent-id.d.ts.map +1 -0
  71. package/dist/normalize-agent-id.js +54 -0
  72. package/dist/normalize-agent-id.js.map +1 -0
  73. package/dist/openai.d.ts +14 -0
  74. package/dist/openai.d.ts.map +1 -0
  75. package/dist/openai.js +43 -0
  76. package/dist/openai.js.map +1 -0
  77. package/dist/rlm/actions.d.ts +31 -0
  78. package/dist/rlm/actions.d.ts.map +1 -0
  79. package/dist/rlm/actions.js +241 -0
  80. package/dist/rlm/actions.js.map +1 -0
  81. package/dist/rlm/benchmark.d.ts +2 -0
  82. package/dist/rlm/benchmark.d.ts.map +1 -0
  83. package/dist/rlm/benchmark.js +215 -0
  84. package/dist/rlm/benchmark.js.map +1 -0
  85. package/dist/rlm/execute.d.ts +13 -0
  86. package/dist/rlm/execute.d.ts.map +1 -0
  87. package/dist/rlm/execute.js +366 -0
  88. package/dist/rlm/execute.js.map +1 -0
  89. package/dist/rlm/index.d.ts +6 -0
  90. package/dist/rlm/index.d.ts.map +1 -0
  91. package/dist/rlm/index.js +147 -0
  92. package/dist/rlm/index.js.map +1 -0
  93. package/dist/rlm/profiles.d.ts +9 -0
  94. package/dist/rlm/profiles.d.ts.map +1 -0
  95. package/dist/rlm/profiles.js +46 -0
  96. package/dist/rlm/profiles.js.map +1 -0
  97. package/dist/rlm/types.d.ts +98 -0
  98. package/dist/rlm/types.d.ts.map +1 -0
  99. package/dist/rlm/types.js +6 -0
  100. package/dist/rlm/types.js.map +1 -0
  101. package/dist/rlm/verify.d.ts +13 -0
  102. package/dist/rlm/verify.d.ts.map +1 -0
  103. package/dist/rlm/verify.js +58 -0
  104. package/dist/rlm/verify.js.map +1 -0
  105. package/dist/rlm/writeback.d.ts +7 -0
  106. package/dist/rlm/writeback.d.ts.map +1 -0
  107. package/dist/rlm/writeback.js +77 -0
  108. package/dist/rlm/writeback.js.map +1 -0
  109. package/dist/scripts/backfill-memory-embeddings.d.ts +2 -0
  110. package/dist/scripts/backfill-memory-embeddings.d.ts.map +1 -0
  111. package/dist/scripts/backfill-memory-embeddings.js +153 -0
  112. package/dist/scripts/backfill-memory-embeddings.js.map +1 -0
  113. package/dist/session-buffer.d.ts +104 -0
  114. package/dist/session-buffer.d.ts.map +1 -0
  115. package/dist/session-buffer.js +466 -0
  116. package/dist/session-buffer.js.map +1 -0
  117. package/dist/session-dedup.d.ts +30 -0
  118. package/dist/session-dedup.d.ts.map +1 -0
  119. package/dist/session-dedup.js +67 -0
  120. package/dist/session-dedup.js.map +1 -0
  121. package/dist/session-flush.d.ts +81 -0
  122. package/dist/session-flush.d.ts.map +1 -0
  123. package/dist/session-flush.js +169 -0
  124. package/dist/session-flush.js.map +1 -0
  125. package/dist/session-lifecycle.d.ts +72 -0
  126. package/dist/session-lifecycle.d.ts.map +1 -0
  127. package/dist/session-lifecycle.js +247 -0
  128. package/dist/session-lifecycle.js.map +1 -0
  129. package/dist/setup.d.ts +2 -0
  130. package/dist/setup.d.ts.map +1 -0
  131. package/dist/setup.js +260 -0
  132. package/dist/setup.js.map +1 -0
  133. package/dist/stopwords.d.ts +2 -0
  134. package/dist/stopwords.d.ts.map +1 -0
  135. package/dist/stopwords.js +20 -0
  136. package/dist/stopwords.js.map +1 -0
  137. package/dist/strip-html.d.ts +5 -0
  138. package/dist/strip-html.d.ts.map +1 -0
  139. package/dist/strip-html.js +35 -0
  140. package/dist/strip-html.js.map +1 -0
  141. package/dist/task-completion-flush.d.ts +36 -0
  142. package/dist/task-completion-flush.d.ts.map +1 -0
  143. package/dist/task-completion-flush.js +97 -0
  144. package/dist/task-completion-flush.js.map +1 -0
  145. package/dist/task-lifecycle-types.d.ts +13 -0
  146. package/dist/task-lifecycle-types.d.ts.map +1 -0
  147. package/dist/task-lifecycle-types.js +12 -0
  148. package/dist/task-lifecycle-types.js.map +1 -0
  149. package/dist/task-lifecycle.d.ts +78 -0
  150. package/dist/task-lifecycle.d.ts.map +1 -0
  151. package/dist/task-lifecycle.js +256 -0
  152. package/dist/task-lifecycle.js.map +1 -0
  153. package/dist/tools/agent-messages.d.ts +26 -0
  154. package/dist/tools/agent-messages.d.ts.map +1 -0
  155. package/dist/tools/agent-messages.js +123 -0
  156. package/dist/tools/agent-messages.js.map +1 -0
  157. package/dist/tools/agent-tasks.d.ts +24 -0
  158. package/dist/tools/agent-tasks.d.ts.map +1 -0
  159. package/dist/tools/agent-tasks.js +162 -0
  160. package/dist/tools/agent-tasks.js.map +1 -0
  161. package/dist/tools/archive-memory.d.ts +2 -0
  162. package/dist/tools/archive-memory.d.ts.map +1 -0
  163. package/dist/tools/archive-memory.js +19 -0
  164. package/dist/tools/archive-memory.js.map +1 -0
  165. package/dist/tools/blind-index.d.ts +29 -0
  166. package/dist/tools/blind-index.d.ts.map +1 -0
  167. package/dist/tools/blind-index.js +53 -0
  168. package/dist/tools/blind-index.js.map +1 -0
  169. package/dist/tools/cleanup-memories.d.ts +44 -0
  170. package/dist/tools/cleanup-memories.d.ts.map +1 -0
  171. package/dist/tools/cleanup-memories.js +126 -0
  172. package/dist/tools/cleanup-memories.js.map +1 -0
  173. package/dist/tools/context-checkpoint.d.ts +28 -0
  174. package/dist/tools/context-checkpoint.d.ts.map +1 -0
  175. package/dist/tools/context-checkpoint.js +140 -0
  176. package/dist/tools/context-checkpoint.js.map +1 -0
  177. package/dist/tools/context-profiles.d.ts +67 -0
  178. package/dist/tools/context-profiles.d.ts.map +1 -0
  179. package/dist/tools/context-profiles.js +30 -0
  180. package/dist/tools/context-profiles.js.map +1 -0
  181. package/dist/tools/create-note.d.ts +2 -0
  182. package/dist/tools/create-note.d.ts.map +1 -0
  183. package/dist/tools/create-note.js +60 -0
  184. package/dist/tools/create-note.js.map +1 -0
  185. package/dist/tools/create-vault.d.ts +5 -0
  186. package/dist/tools/create-vault.d.ts.map +1 -0
  187. package/dist/tools/create-vault.js +121 -0
  188. package/dist/tools/create-vault.js.map +1 -0
  189. package/dist/tools/decrypt-helpers.d.ts +31 -0
  190. package/dist/tools/decrypt-helpers.d.ts.map +1 -0
  191. package/dist/tools/decrypt-helpers.js +33 -0
  192. package/dist/tools/decrypt-helpers.js.map +1 -0
  193. package/dist/tools/delete-note.d.ts +2 -0
  194. package/dist/tools/delete-note.d.ts.map +1 -0
  195. package/dist/tools/delete-note.js +21 -0
  196. package/dist/tools/delete-note.js.map +1 -0
  197. package/dist/tools/explore-graph.d.ts +11 -0
  198. package/dist/tools/explore-graph.d.ts.map +1 -0
  199. package/dist/tools/explore-graph.js +169 -0
  200. package/dist/tools/explore-graph.js.map +1 -0
  201. package/dist/tools/get-related-memories.d.ts +2 -0
  202. package/dist/tools/get-related-memories.d.ts.map +1 -0
  203. package/dist/tools/get-related-memories.js +59 -0
  204. package/dist/tools/get-related-memories.js.map +1 -0
  205. package/dist/tools/knowledge-links.d.ts +17 -0
  206. package/dist/tools/knowledge-links.d.ts.map +1 -0
  207. package/dist/tools/knowledge-links.js +102 -0
  208. package/dist/tools/knowledge-links.js.map +1 -0
  209. package/dist/tools/list-active-agents.d.ts +5 -0
  210. package/dist/tools/list-active-agents.d.ts.map +1 -0
  211. package/dist/tools/list-active-agents.js +15 -0
  212. package/dist/tools/list-active-agents.js.map +1 -0
  213. package/dist/tools/list-notes.d.ts +2 -0
  214. package/dist/tools/list-notes.d.ts.map +1 -0
  215. package/dist/tools/list-notes.js +19 -0
  216. package/dist/tools/list-notes.js.map +1 -0
  217. package/dist/tools/list-vaults.d.ts +2 -0
  218. package/dist/tools/list-vaults.d.ts.map +1 -0
  219. package/dist/tools/list-vaults.js +19 -0
  220. package/dist/tools/list-vaults.js.map +1 -0
  221. package/dist/tools/mmr.d.ts +18 -0
  222. package/dist/tools/mmr.d.ts.map +1 -0
  223. package/dist/tools/mmr.js +67 -0
  224. package/dist/tools/mmr.js.map +1 -0
  225. package/dist/tools/read-memories.d.ts +2 -0
  226. package/dist/tools/read-memories.d.ts.map +1 -0
  227. package/dist/tools/read-memories.js +46 -0
  228. package/dist/tools/read-memories.js.map +1 -0
  229. package/dist/tools/read-note.d.ts +2 -0
  230. package/dist/tools/read-note.d.ts.map +1 -0
  231. package/dist/tools/read-note.js +35 -0
  232. package/dist/tools/read-note.js.map +1 -0
  233. package/dist/tools/read-notes.d.ts +6 -0
  234. package/dist/tools/read-notes.d.ts.map +1 -0
  235. package/dist/tools/read-notes.js +45 -0
  236. package/dist/tools/read-notes.js.map +1 -0
  237. package/dist/tools/resolve-vault-id.d.ts +6 -0
  238. package/dist/tools/resolve-vault-id.d.ts.map +1 -0
  239. package/dist/tools/resolve-vault-id.js +7 -0
  240. package/dist/tools/resolve-vault-id.js.map +1 -0
  241. package/dist/tools/rrf.d.ts +28 -0
  242. package/dist/tools/rrf.d.ts.map +1 -0
  243. package/dist/tools/rrf.js +19 -0
  244. package/dist/tools/rrf.js.map +1 -0
  245. package/dist/tools/search-and-read.d.ts +11 -0
  246. package/dist/tools/search-and-read.d.ts.map +1 -0
  247. package/dist/tools/search-and-read.js +208 -0
  248. package/dist/tools/search-and-read.js.map +1 -0
  249. package/dist/tools/search-memories.d.ts +13 -0
  250. package/dist/tools/search-memories.d.ts.map +1 -0
  251. package/dist/tools/search-memories.js +272 -0
  252. package/dist/tools/search-memories.js.map +1 -0
  253. package/dist/tools/search-notes.d.ts +2 -0
  254. package/dist/tools/search-notes.d.ts.map +1 -0
  255. package/dist/tools/search-notes.js +94 -0
  256. package/dist/tools/search-notes.js.map +1 -0
  257. package/dist/tools/semantic-search.d.ts +7 -0
  258. package/dist/tools/semantic-search.d.ts.map +1 -0
  259. package/dist/tools/semantic-search.js +85 -0
  260. package/dist/tools/semantic-search.js.map +1 -0
  261. package/dist/tools/session-start.d.ts +24 -0
  262. package/dist/tools/session-start.d.ts.map +1 -0
  263. package/dist/tools/session-start.js +256 -0
  264. package/dist/tools/session-start.js.map +1 -0
  265. package/dist/tools/stale-tasks.d.ts +22 -0
  266. package/dist/tools/stale-tasks.d.ts.map +1 -0
  267. package/dist/tools/stale-tasks.js +39 -0
  268. package/dist/tools/stale-tasks.js.map +1 -0
  269. package/dist/tools/temporal-decay.d.ts +21 -0
  270. package/dist/tools/temporal-decay.d.ts.map +1 -0
  271. package/dist/tools/temporal-decay.js +32 -0
  272. package/dist/tools/temporal-decay.js.map +1 -0
  273. package/dist/tools/update-memory.d.ts +19 -0
  274. package/dist/tools/update-memory.d.ts.map +1 -0
  275. package/dist/tools/update-memory.js +230 -0
  276. package/dist/tools/update-memory.js.map +1 -0
  277. package/dist/tools/update-note.d.ts +2 -0
  278. package/dist/tools/update-note.d.ts.map +1 -0
  279. package/dist/tools/update-note.js +79 -0
  280. package/dist/tools/update-note.js.map +1 -0
  281. package/dist/tools/vault-instruction-template.d.ts +17 -0
  282. package/dist/tools/vault-instruction-template.d.ts.map +1 -0
  283. package/dist/tools/vault-instruction-template.js +77 -0
  284. package/dist/tools/vault-instruction-template.js.map +1 -0
  285. package/dist/tools/wiki-link-sync.d.ts +34 -0
  286. package/dist/tools/wiki-link-sync.d.ts.map +1 -0
  287. package/dist/tools/wiki-link-sync.js +132 -0
  288. package/dist/tools/wiki-link-sync.js.map +1 -0
  289. package/dist/tools/wrap-tool-handler.d.ts +8 -0
  290. package/dist/tools/wrap-tool-handler.d.ts.map +1 -0
  291. package/dist/tools/wrap-tool-handler.js +32 -0
  292. package/dist/tools/wrap-tool-handler.js.map +1 -0
  293. package/dist/tools/write-memory.d.ts +34 -0
  294. package/dist/tools/write-memory.d.ts.map +1 -0
  295. package/dist/tools/write-memory.js +359 -0
  296. package/dist/tools/write-memory.js.map +1 -0
  297. package/dist/usage.d.ts +11 -0
  298. package/dist/usage.d.ts.map +1 -0
  299. package/dist/usage.js +38 -0
  300. package/dist/usage.js.map +1 -0
  301. package/dist/wiki-link-parser.d.ts +27 -0
  302. package/dist/wiki-link-parser.d.ts.map +1 -0
  303. package/dist/wiki-link-parser.js +93 -0
  304. package/dist/wiki-link-parser.js.map +1 -0
  305. package/package.json +38 -0
@@ -0,0 +1,466 @@
1
+ /**
2
+ * Session buffer — tracks tool call activity during a local MCP session.
3
+ *
4
+ * The buffer accumulates tool calls (with truncated I/O summaries) so that
5
+ * when the session ends (idle timeout, stdin EOF, SIGTERM), we can generate
6
+ * a rule-based episodic summary or feed the activity log to an LLM for
7
+ * structured extraction.
8
+ *
9
+ * Buffer data is kept in-memory and periodically written to a JSON file
10
+ * at `~/.exovault-mcp/sessions/session-{agentRunId}.json` as a crash
11
+ * recovery mechanism.
12
+ */
13
+ const MAX_SUMMARY_CHARS = 200;
14
+ const MAX_TRANSCRIPT_CONTEXT_CHARS = 500;
15
+ /** Tool name → category mapping. */
16
+ export const TOOL_CATEGORIES = {
17
+ // Read
18
+ read_note: "read",
19
+ read_notes: "read",
20
+ read_memories: "read",
21
+ list_notes: "read",
22
+ list_vaults: "read",
23
+ list_tasks: "read",
24
+ list_active_agents: "read",
25
+ get_links: "read",
26
+ get_related_memories: "read",
27
+ // Write
28
+ write_memory: "write",
29
+ create_note: "write",
30
+ update_note: "write",
31
+ delete_note: "write",
32
+ update_memory: "write",
33
+ archive_memory: "write",
34
+ create_task: "write",
35
+ update_task: "write",
36
+ add_link: "write",
37
+ remove_link: "write",
38
+ update_document: "write",
39
+ ingest_turn: "write",
40
+ create_vault: "write",
41
+ create_plan_tasks: "write",
42
+ // Search
43
+ search_notes: "search",
44
+ search_memories: "search",
45
+ semantic_search: "search",
46
+ search_and_read: "search",
47
+ // System
48
+ session_start: "system",
49
+ context_checkpoint: "system",
50
+ cleanup_memories: "system",
51
+ _connection_start: "system",
52
+ };
53
+ export function categorizeTool(toolName) {
54
+ return TOOL_CATEGORIES[toolName] ?? "read";
55
+ }
56
+ function truncate(s, max) {
57
+ if (!s)
58
+ return s;
59
+ return s.length > max ? s.slice(0, max) : s;
60
+ }
61
+ export function createSessionBuffer(config) {
62
+ const data = {
63
+ agentRunId: config.agentRunId,
64
+ agentId: config.agentId,
65
+ startedAt: new Date().toISOString(),
66
+ vaultId: config.vaultId,
67
+ activities: [],
68
+ memoriesWritten: [],
69
+ lastActivityAt: new Date().toISOString(),
70
+ lastFlushedAt: null,
71
+ transcript: [],
72
+ };
73
+ let checkpointed = false;
74
+ function recordActivity(tool, inputSummary, outputSummary) {
75
+ const activity = {
76
+ tool,
77
+ timestamp: new Date().toISOString(),
78
+ category: categorizeTool(tool),
79
+ inputSummary: truncate(inputSummary, MAX_SUMMARY_CHARS),
80
+ outputSummary: truncate(outputSummary, MAX_SUMMARY_CHARS),
81
+ };
82
+ data.activities.push(activity);
83
+ data.lastActivityAt = activity.timestamp;
84
+ if (tool === "context_checkpoint") {
85
+ checkpointed = true;
86
+ }
87
+ }
88
+ function recordTranscript(tool, context) {
89
+ data.transcript.push({
90
+ tool,
91
+ timestamp: new Date().toISOString(),
92
+ context: truncate(context, MAX_TRANSCRIPT_CONTEXT_CHARS) ?? "",
93
+ });
94
+ }
95
+ function recordMemoryWrite(memoryId) {
96
+ data.memoriesWritten.push(memoryId);
97
+ }
98
+ function markFlushed() {
99
+ data.lastFlushedAt = new Date().toISOString();
100
+ }
101
+ function wasCheckpointed() {
102
+ return checkpointed;
103
+ }
104
+ function countByCategory(cat) {
105
+ return data.activities.filter((a) => a.category === cat).length;
106
+ }
107
+ return {
108
+ recordActivity,
109
+ recordTranscript,
110
+ recordMemoryWrite,
111
+ markFlushed,
112
+ wasCheckpointed,
113
+ getSearchCount: () => countByCategory("search"),
114
+ getWriteCount: () => countByCategory("write"),
115
+ getReadCount: () => countByCategory("read"),
116
+ getTotalCount: () => data.activities.length,
117
+ getData: () => ({
118
+ ...data,
119
+ activities: [...data.activities],
120
+ memoriesWritten: [...data.memoriesWritten],
121
+ transcript: [...data.transcript],
122
+ }),
123
+ };
124
+ }
125
+ /** System tools that should be excluded from turn content (noise, not meaningful activity). */
126
+ const SYSTEM_NOISE_TOOLS = new Set([
127
+ "_connection_start",
128
+ "session_start",
129
+ "context_checkpoint",
130
+ "cleanup_memories",
131
+ ]);
132
+ /**
133
+ * Build a conversation turn from the session activity for auto-ingestion.
134
+ * Returns null if there's nothing meaningful to ingest (empty or system-only).
135
+ */
136
+ export function buildTurnContent(data) {
137
+ const meaningful = data.activities.filter((a) => !SYSTEM_NOISE_TOOLS.has(a.tool));
138
+ if (meaningful.length === 0)
139
+ return null;
140
+ const lines = [
141
+ `[MCP Session Activity — ${meaningful.length} tool call${meaningful.length !== 1 ? "s" : ""}]`,
142
+ ];
143
+ for (const a of meaningful) {
144
+ const parts = [a.tool];
145
+ if (a.inputSummary)
146
+ parts.push(a.inputSummary);
147
+ if (a.outputSummary)
148
+ parts.push(`→ ${a.outputSummary}`);
149
+ lines.push(`- ${parts.join(": ")}`);
150
+ }
151
+ return lines.join("\n");
152
+ }
153
+ /**
154
+ * Build a rule-based episodic summary from the session buffer.
155
+ * Used as a fallback when LLM extraction is skipped or budget-exhausted.
156
+ * Always available at $0.00.
157
+ *
158
+ * Synthesizes WHAT was discussed, explored, decided, and accomplished
159
+ * using tool call metadata (inputs + outputs).
160
+ */
161
+ export function buildRuleBasedEpisodic(data) {
162
+ const durationMs = Date.now() - new Date(data.startedAt).getTime();
163
+ const durationMin = Math.round(durationMs / 60_000);
164
+ const lines = [
165
+ `Session: ${durationMin}min, agent=${data.agentId}.`,
166
+ ];
167
+ // Extract search topics
168
+ const searchTopics = [...new Set(data.activities
169
+ .filter((a) => a.category === "search" && a.inputSummary)
170
+ .map((a) => a.inputSummary.replace(/^query:\s*/i, "").trim())
171
+ .filter((s) => s.length > 0))].slice(0, 5);
172
+ // Extract what was read/explored
173
+ const readTopics = extractReadTopics(data.activities);
174
+ // Extract write actions with context
175
+ const writeActions = extractWriteActions(data.activities);
176
+ if (searchTopics.length > 0 || readTopics.length > 0) {
177
+ const explored = [];
178
+ if (searchTopics.length > 0)
179
+ explored.push(...searchTopics);
180
+ if (readTopics.length > 0)
181
+ explored.push(...readTopics);
182
+ lines.push(`Explored: ${explored.join(", ")}.`);
183
+ }
184
+ if (writeActions.length > 0) {
185
+ lines.push(`Outcomes: ${writeActions.join("; ")}.`);
186
+ }
187
+ return lines.join("\n");
188
+ }
189
+ /**
190
+ * Extract what was read/explored during the session.
191
+ * Provides context about what the agent was looking at — note titles,
192
+ * document types, graph queries — to give the episodic summary substance.
193
+ */
194
+ function extractReadTopics(activities) {
195
+ const topics = [];
196
+ const seen = new Set();
197
+ for (const a of activities) {
198
+ if (a.category !== "read")
199
+ continue;
200
+ let topic = null;
201
+ if (a.tool === "read_note" || a.tool === "read_notes") {
202
+ // Try to extract note title from outputSummary
203
+ if (a.outputSummary) {
204
+ const titleMatch = a.outputSummary.match(/title:\s*(.+?)(?:;|$)/i);
205
+ if (titleMatch)
206
+ topic = `note "${titleMatch[1].trim().slice(0, 60)}"`;
207
+ }
208
+ // Fall back to noteId from inputSummary
209
+ if (!topic && a.inputSummary) {
210
+ const idMatch = a.inputSummary.match(/noteId:\s*(\S+)/);
211
+ if (idMatch)
212
+ topic = `note ${idMatch[1].slice(0, 20)}`;
213
+ }
214
+ }
215
+ else if (a.tool === "read_document") {
216
+ if (a.inputSummary) {
217
+ const docMatch = a.inputSummary.match(/documentType:\s*(\w+)/);
218
+ if (docMatch)
219
+ topic = `${docMatch[1]}.md document`;
220
+ }
221
+ }
222
+ else if (a.tool === "explore_graph") {
223
+ if (a.inputSummary) {
224
+ const queryMatch = a.inputSummary.match(/query:\s*(.+?)(?:;|$)/);
225
+ if (queryMatch)
226
+ topic = `graph: ${queryMatch[1].trim().slice(0, 60)}`;
227
+ }
228
+ }
229
+ else if (a.tool === "list_tasks") {
230
+ topic = "task list";
231
+ }
232
+ if (topic && !seen.has(topic)) {
233
+ seen.add(topic);
234
+ topics.push(topic);
235
+ }
236
+ }
237
+ return topics.slice(0, 5);
238
+ }
239
+ /**
240
+ * Extract concise write action descriptions from activities.
241
+ * Returns human-readable phrases like "wrote fact about DeepSeek pricing",
242
+ * "created note: Auth Design Doc", "archived 3 memories".
243
+ */
244
+ function extractWriteActions(activities) {
245
+ const actions = [];
246
+ let archiveCount = 0;
247
+ for (const a of activities) {
248
+ if (a.category !== "write")
249
+ continue;
250
+ const summary = a.inputSummary;
251
+ if (a.tool === "write_memory" || a.tool === "update_memory") {
252
+ if (summary) {
253
+ const typeMatch = summary.match(/type:\s*(\w+)/);
254
+ const contentMatch = summary.match(/content:\s*(?:##?\s*)?(.+?)(?:\n|;|$)/);
255
+ const memType = typeMatch ? typeMatch[1] : "memory";
256
+ const topic = contentMatch
257
+ ? contentMatch[1].replace(/^#+\s*/, "").trim().slice(0, 80)
258
+ : "";
259
+ actions.push(topic ? `wrote ${memType}: ${topic}` : `wrote ${memType}`);
260
+ }
261
+ else {
262
+ actions.push("wrote memory");
263
+ }
264
+ }
265
+ else if (a.tool === "create_task") {
266
+ if (summary) {
267
+ const titleMatch = summary.match(/title:\s*(.+?)(?:;|$)/);
268
+ actions.push(titleMatch ? `created task: ${titleMatch[1].trim().slice(0, 80)}` : "created task");
269
+ }
270
+ else {
271
+ actions.push("created task");
272
+ }
273
+ }
274
+ else if (a.tool === "update_task") {
275
+ if (summary) {
276
+ const statusMatch = summary.match(/status:\s*(\w+)/);
277
+ actions.push(statusMatch ? `updated task → ${statusMatch[1]}` : "updated task");
278
+ }
279
+ }
280
+ else if (a.tool === "create_note") {
281
+ if (summary) {
282
+ const titleMatch = summary.match(/title:\s*(.+?)(?:;|$)/);
283
+ const contentMatch = summary.match(/content:\s*(?:#\s*)?(.+?)(?:\n|;|$)/);
284
+ const label = titleMatch ? titleMatch[1].trim().slice(0, 80)
285
+ : contentMatch ? contentMatch[1].replace(/^#+\s*/, "").trim().slice(0, 60) : "";
286
+ actions.push(label ? `created note: ${label}` : "created note");
287
+ }
288
+ else {
289
+ actions.push("created note");
290
+ }
291
+ }
292
+ else if (a.tool === "update_note") {
293
+ actions.push("updated note");
294
+ }
295
+ else if (a.tool === "delete_note") {
296
+ actions.push("deleted note");
297
+ }
298
+ else if (a.tool === "archive_memory") {
299
+ archiveCount++;
300
+ }
301
+ else if (a.tool === "create_plan_tasks") {
302
+ actions.push("created plan tasks");
303
+ }
304
+ else if (a.tool === "ingest_turn") {
305
+ // Skip — internal plumbing
306
+ }
307
+ else if (a.tool === "context_checkpoint") {
308
+ // Skip — meta
309
+ }
310
+ }
311
+ if (archiveCount > 0) {
312
+ actions.push(`archived ${archiveCount} memor${archiveCount !== 1 ? "ies" : "y"}`);
313
+ }
314
+ return actions.slice(0, 8);
315
+ }
316
+ // ─── Transcript-based auto-episodic ─────────────────────────────────────────
317
+ /** Tools that should NOT generate transcript entries (noise or recursive). */
318
+ const TRANSCRIPT_SKIP_TOOLS = new Set([
319
+ "_connection_start",
320
+ "session_start",
321
+ "ingest_turn",
322
+ "read_note",
323
+ "read_notes",
324
+ "read_memories",
325
+ "list_notes",
326
+ "list_tasks",
327
+ "list_vaults",
328
+ "list_active_agents",
329
+ "read_document",
330
+ "cleanup_memories",
331
+ ]);
332
+ /**
333
+ * Determine if a tool call should generate a transcript entry.
334
+ * Only "rich" tools (writes, searches, graph, checkpoint) are worth capturing.
335
+ */
336
+ export function shouldTranscript(toolName) {
337
+ return !TRANSCRIPT_SKIP_TOOLS.has(toolName);
338
+ }
339
+ /**
340
+ * Extract a human-readable context string from a tool call's args and result.
341
+ * Returns null if the tool shouldn't be transcribed.
342
+ *
343
+ * The args object is the raw tool input (not yet stringified).
344
+ * The resultText is the text content from the tool response.
345
+ */
346
+ export function extractToolContext(toolName, args, resultText) {
347
+ if (!shouldTranscript(toolName))
348
+ return null;
349
+ switch (toolName) {
350
+ case "write_memory": {
351
+ const content = asString(args.content)?.slice(0, 400) ?? "";
352
+ const memType = asString(args.memoryType) ?? "memory";
353
+ const summary = asString(args.summary)?.slice(0, 100);
354
+ return summary
355
+ ? `Stored ${memType}: ${summary} — ${content}`
356
+ : `Stored ${memType}: ${content}`;
357
+ }
358
+ case "update_memory": {
359
+ const content = asString(args.content)?.slice(0, 300) ?? "";
360
+ return `Updated memory: ${content}`;
361
+ }
362
+ case "search_memories": {
363
+ const query = asString(args.query) ?? "";
364
+ const countMatch = resultText?.match(/(\d+)\s+(?:result|memor)/i);
365
+ const count = countMatch ? countMatch[1] : "?";
366
+ return `Searched memories for "${query}" (${count} results)`;
367
+ }
368
+ case "search_notes": {
369
+ const query = asString(args.query) ?? "";
370
+ const countMatch = resultText?.match(/(\d+)\s+(?:result|note)/i);
371
+ const count = countMatch ? countMatch[1] : "?";
372
+ return `Searched notes for "${query}" (${count} results)`;
373
+ }
374
+ case "semantic_search":
375
+ case "search_and_read": {
376
+ const query = asString(args.query) ?? "";
377
+ return `Semantic search: "${query}"`;
378
+ }
379
+ case "create_task": {
380
+ const title = asString(args.title) ?? "";
381
+ const priority = args.priority ? ` (P${args.priority})` : "";
382
+ return `Created task: ${title}${priority}`;
383
+ }
384
+ case "update_task": {
385
+ const status = asString(args.status);
386
+ const title = asString(args.title);
387
+ return title
388
+ ? `Updated task "${title}"${status ? ` → ${status}` : ""}`
389
+ : `Updated task${status ? ` → ${status}` : ""}`;
390
+ }
391
+ case "create_note": {
392
+ const title = asString(args.title) ?? "";
393
+ const content = asString(args.content)?.slice(0, 200) ?? "";
394
+ return `Created note "${title}": ${content}`;
395
+ }
396
+ case "update_note": {
397
+ const title = asString(args.title);
398
+ return title ? `Updated note "${title}"` : "Updated note";
399
+ }
400
+ case "delete_note":
401
+ return "Deleted note";
402
+ case "archive_memory":
403
+ return "Archived memory";
404
+ case "create_vault": {
405
+ const name = asString(args.name) ?? "";
406
+ return `Created vault "${name}"`;
407
+ }
408
+ case "create_plan_tasks": {
409
+ const plan = asString(args.plan)?.slice(0, 300) ?? "";
410
+ return `Created plan tasks: ${plan}`;
411
+ }
412
+ case "add_link": {
413
+ const rel = asString(args.relationType) ?? "references";
414
+ return `Linked ${asString(args.sourceType)}→${asString(args.targetType)} (${rel})`;
415
+ }
416
+ case "remove_link":
417
+ return "Removed knowledge link";
418
+ case "explore_graph": {
419
+ const query = asString(args.query) ?? asString(args.nodeId) ?? "";
420
+ return `Explored graph: ${query}`;
421
+ }
422
+ case "get_links":
423
+ case "get_related_memories":
424
+ return `Fetched links for ${asString(args.sourceId) ?? asString(args.memoryId) ?? "node"}`;
425
+ case "context_checkpoint": {
426
+ const summary = asString(args.sessionSummary)?.slice(0, 400) ?? "";
427
+ return `Checkpoint: ${summary}`;
428
+ }
429
+ case "update_document": {
430
+ const docType = asString(args.documentType) ?? "document";
431
+ return `Appended to ${docType} document`;
432
+ }
433
+ default:
434
+ return `${toolName}: ${JSON.stringify(args).slice(0, 200)}`;
435
+ }
436
+ }
437
+ function asString(v) {
438
+ return typeof v === "string" ? v : undefined;
439
+ }
440
+ /**
441
+ * Minimum number of transcript entries to qualify for auto-episodic generation.
442
+ * Below this threshold, the session is too thin to be worth summarizing.
443
+ */
444
+ export const MIN_TRANSCRIPT_ENTRIES_FOR_EPISODIC = 3;
445
+ /**
446
+ * Build a narrative episodic summary from transcript entries.
447
+ * Used when the agent didn't call context_checkpoint but the session
448
+ * has enough rich tool context to generate a useful summary.
449
+ *
450
+ * Returns null if the transcript is too thin.
451
+ */
452
+ export function buildTranscriptEpisodic(data) {
453
+ if (data.transcript.length < MIN_TRANSCRIPT_ENTRIES_FOR_EPISODIC) {
454
+ return null;
455
+ }
456
+ const durationMs = Date.now() - new Date(data.startedAt).getTime();
457
+ const durationMin = Math.round(durationMs / 60_000);
458
+ const lines = [
459
+ `Session: ${durationMin}min, agent=${data.agentId}.`,
460
+ "",
461
+ ];
462
+ for (const entry of data.transcript) {
463
+ lines.push(`- ${entry.context}`);
464
+ }
465
+ return lines.join("\n");
466
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-buffer.js","sourceRoot":"","sources":["../src/session-buffer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Server-side deduplication for session_start responses.
3
+ * Pure utility — no external dependencies.
4
+ *
5
+ * NOTE: Shared logic with src/lib/session-dedup.ts (Next.js app).
6
+ * Keep in sync if either changes.
7
+ */
8
+ export interface DeduplicableMemory {
9
+ id: string;
10
+ content?: string | null;
11
+ summary?: string | null;
12
+ importance?: number | null;
13
+ updatedAt?: string | Date | null;
14
+ [key: string]: unknown;
15
+ }
16
+ /**
17
+ * Remove duplicate memories from an array.
18
+ * Two memories are considered duplicates if they have identical `content` text.
19
+ * When duplicates exist, keeps the one with higher importance (ties broken by most recent updatedAt).
20
+ */
21
+ export declare function deduplicateMemories<T extends DeduplicableMemory>(memories: T[]): T[];
22
+ /**
23
+ * For summaryOnly mode: strip full content, keeping only summary + metadata.
24
+ * Falls back to truncated content when summary is null.
25
+ */
26
+ export declare function compactMemory<T extends DeduplicableMemory>(mem: T, maxContentFallback?: number): T;
27
+ /**
28
+ * Apply both dedup and compaction to a list of memories.
29
+ */
30
+ export declare function compactAndDedup<T extends DeduplicableMemory>(memories: T[], summaryOnly: boolean): T[];
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-dedup.d.ts","sourceRoot":"","sources":["../src/session-dedup.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IACjC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,kBAAkB,EAC9D,QAAQ,EAAE,CAAC,EAAE,GACZ,CAAC,EAAE,CA+BL;AAQD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,kBAAkB,EACxD,GAAG,EAAE,CAAC,EACN,kBAAkB,SAAM,GACvB,CAAC,CAYH;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,kBAAkB,EAC1D,QAAQ,EAAE,CAAC,EAAE,EACb,WAAW,EAAE,OAAO,GACnB,CAAC,EAAE,CAIL"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Server-side deduplication for session_start responses.
3
+ * Pure utility — no external dependencies.
4
+ *
5
+ * NOTE: Shared logic with src/lib/session-dedup.ts (Next.js app).
6
+ * Keep in sync if either changes.
7
+ */
8
+ /**
9
+ * Remove duplicate memories from an array.
10
+ * Two memories are considered duplicates if they have identical `content` text.
11
+ * When duplicates exist, keeps the one with higher importance (ties broken by most recent updatedAt).
12
+ */
13
+ export function deduplicateMemories(memories) {
14
+ if (memories.length <= 1)
15
+ return memories;
16
+ const seen = new Map();
17
+ for (const mem of memories) {
18
+ const key = mem.content ?? mem.summary ?? null;
19
+ if (!key) {
20
+ seen.set(mem.id, mem);
21
+ continue;
22
+ }
23
+ const existing = seen.get(key);
24
+ if (!existing) {
25
+ seen.set(key, mem);
26
+ continue;
27
+ }
28
+ const existingImportance = existing.importance ?? 0;
29
+ const newImportance = mem.importance ?? 0;
30
+ if (newImportance > existingImportance ||
31
+ (newImportance === existingImportance &&
32
+ toTimestamp(mem.updatedAt) > toTimestamp(existing.updatedAt))) {
33
+ seen.set(key, mem);
34
+ }
35
+ }
36
+ return Array.from(seen.values());
37
+ }
38
+ function toTimestamp(val) {
39
+ if (!val)
40
+ return 0;
41
+ if (val instanceof Date)
42
+ return val.getTime();
43
+ return new Date(val).getTime();
44
+ }
45
+ /**
46
+ * For summaryOnly mode: strip full content, keeping only summary + metadata.
47
+ * Falls back to truncated content when summary is null.
48
+ */
49
+ export function compactMemory(mem, maxContentFallback = 150) {
50
+ const { content, ...rest } = mem;
51
+ if (rest.summary) {
52
+ return rest;
53
+ }
54
+ if (content && content.length > maxContentFallback) {
55
+ return { ...mem, content: content.slice(0, maxContentFallback) + "…" };
56
+ }
57
+ return mem;
58
+ }
59
+ /**
60
+ * Apply both dedup and compaction to a list of memories.
61
+ */
62
+ export function compactAndDedup(memories, summaryOnly) {
63
+ const deduped = deduplicateMemories(memories);
64
+ if (!summaryOnly)
65
+ return deduped;
66
+ return deduped.map((m) => compactMemory(m));
67
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-dedup.js","sourceRoot":"","sources":["../src/session-dedup.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAAa;IAEb,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC;IAE1C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAa,CAAC;IAElC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC;QAC/C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YACtB,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACnB,SAAS;QACX,CAAC;QAED,MAAM,kBAAkB,GAAG,QAAQ,CAAC,UAAU,IAAI,CAAC,CAAC;QACpD,MAAM,aAAa,GAAG,GAAG,CAAC,UAAU,IAAI,CAAC,CAAC;QAE1C,IACE,aAAa,GAAG,kBAAkB;YAClC,CAAC,aAAa,KAAK,kBAAkB;gBACnC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAC/D,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,WAAW,CAAC,GAAqC;IACxD,IAAI,CAAC,GAAG;QAAE,OAAO,CAAC,CAAC;IACnB,IAAI,GAAG,YAAY,IAAI;QAAE,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC;IAC9C,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,GAAM,EACN,kBAAkB,GAAG,GAAG;IAExB,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC;IAEjC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,IAAS,CAAC;IACnB,CAAC;IAED,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;QACnD,OAAO,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,GAAG,GAAG,EAAE,CAAC;IACzE,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,QAAa,EACb,WAAoB;IAEpB,MAAM,OAAO,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC9C,IAAI,CAAC,WAAW;QAAE,OAAO,OAAO,CAAC;IACjC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC"}