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,81 @@
1
+ /**
2
+ * Session flush — handles optional LLM extraction when a session ends.
3
+ * Episodic summaries are NOT auto-generated here — agents provide them
4
+ * via `context_checkpoint({ sessionSummary: "..." })`.
5
+ *
6
+ * Uses a "smart skip" approach for LLM extraction:
7
+ * 1. Agent already called context_checkpoint → skip entirely
8
+ * 2. Short session (< minToolCalls) → skip
9
+ * 3. Read-only session (0 writes/searches) → skip
10
+ * 4. Agent already wrote enough memories → skip
11
+ * 5. Otherwise → LLM extraction (if configured + budget allows)
12
+ */
13
+ import { type SessionBufferData } from "./session-buffer.js";
14
+ import { type ExtractionBudget } from "./extraction-budget.js";
15
+ import type { ExtractionClient } from "./extraction-llm.js";
16
+ import { type TaskCompletionFlushResult } from "./task-completion-flush.js";
17
+ import type { TaskLifecycleSettings } from "./task-lifecycle-types.js";
18
+ import type { OpenTask } from "./task-lifecycle.js";
19
+ export interface FlushConfig {
20
+ checkpointed: boolean;
21
+ minToolCalls: number;
22
+ skipIfMemoriesWritten: number;
23
+ checkpointFn: (params: {
24
+ memories: Array<{
25
+ content: string;
26
+ memoryType: string;
27
+ importance: number;
28
+ confidence: number;
29
+ }>;
30
+ sessionSummary: string;
31
+ agentId: string;
32
+ agentRunId: string;
33
+ vaultId?: string;
34
+ dedup?: boolean;
35
+ }) => Promise<string>;
36
+ agentRunId: string;
37
+ agentId: string;
38
+ vaultId?: string;
39
+ extractionClient?: ExtractionClient;
40
+ readBudget?: () => Promise<ExtractionBudget>;
41
+ writeBudget?: (budget: ExtractionBudget) => Promise<void>;
42
+ taskCompletion?: {
43
+ openTasks: OpenTask[];
44
+ settings: TaskLifecycleSettings;
45
+ updateTaskFn: (taskId: string, updates: {
46
+ status: string;
47
+ completionSource: string;
48
+ completionEvidence: string;
49
+ }) => Promise<void>;
50
+ writeMemoryFn?: (content: string) => Promise<void>;
51
+ createCompletedTaskFn?: (task: {
52
+ title: string;
53
+ doneWhen?: string;
54
+ evidence: string;
55
+ }) => Promise<string | null>;
56
+ };
57
+ }
58
+ export interface SessionFlushResult {
59
+ action: "skipped" | "llm_extracted" | "transcript_episodic" | "error";
60
+ reason?: string;
61
+ error?: string;
62
+ taskCompletions?: TaskCompletionFlushResult;
63
+ }
64
+ /**
65
+ * Determine whether LLM extraction should run for this session.
66
+ * Returns { extract: false, reason } for skip, { extract: true } for extract.
67
+ */
68
+ export declare function shouldExtract(data: SessionBufferData, config: {
69
+ checkpointed: boolean;
70
+ minToolCalls: number;
71
+ skipIfMemoriesWritten: number;
72
+ }): {
73
+ extract: boolean;
74
+ reason?: string;
75
+ };
76
+ /**
77
+ * Flush the session buffer. Attempts LLM extraction if configured and budget
78
+ * allows. No longer auto-generates episodic summaries — agents provide those
79
+ * via context_checkpoint({ sessionSummary }).
80
+ */
81
+ export declare function flushSession(data: SessionBufferData, config: FlushConfig): Promise<SessionFlushResult>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-flush.d.ts","sourceRoot":"","sources":["../src/session-flush.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Session flush — handles optional LLM extraction when a session ends.
3
+ * Episodic summaries are NOT auto-generated here — agents provide them
4
+ * via `context_checkpoint({ sessionSummary: "..." })`.
5
+ *
6
+ * Uses a "smart skip" approach for LLM extraction:
7
+ * 1. Agent already called context_checkpoint → skip entirely
8
+ * 2. Short session (< minToolCalls) → skip
9
+ * 3. Read-only session (0 writes/searches) → skip
10
+ * 4. Agent already wrote enough memories → skip
11
+ * 5. Otherwise → LLM extraction (if configured + budget allows)
12
+ */
13
+ import { buildTranscriptEpisodic } from "./session-buffer.js";
14
+ import { buildCompressedPrompt, parseExtractionResult } from "./extraction-prompt.js";
15
+ import { isBudgetExhausted, isCircuitBroken, recordSuccess, recordEmpty, recordError } from "./extraction-budget.js";
16
+ import { flushTaskCompletions } from "./task-completion-flush.js";
17
+ /** Max output tokens for extraction LLM call. */
18
+ const EXTRACTION_MAX_OUTPUT_TOKENS = 300;
19
+ /**
20
+ * Determine whether LLM extraction should run for this session.
21
+ * Returns { extract: false, reason } for skip, { extract: true } for extract.
22
+ */
23
+ export function shouldExtract(data, config) {
24
+ // 1. Agent already checkpointed
25
+ if (config.checkpointed) {
26
+ return { extract: false, reason: "Agent already called context_checkpoint" };
27
+ }
28
+ // 2. Short session
29
+ if (data.activities.length < config.minToolCalls) {
30
+ return { extract: false, reason: `Session had ${data.activities.length} tool calls (min: ${config.minToolCalls})` };
31
+ }
32
+ // 3. Read-only session (no writes AND no searches)
33
+ const hasWritesOrSearches = data.activities.some((a) => a.category === "write" || a.category === "search");
34
+ if (!hasWritesOrSearches) {
35
+ return { extract: false, reason: "Session was read-only (no writes or searches)" };
36
+ }
37
+ // 4. Agent already wrote enough memories
38
+ if (data.memoriesWritten.length >= config.skipIfMemoriesWritten) {
39
+ return {
40
+ extract: false,
41
+ reason: `Agent wrote ${data.memoriesWritten.length} memories (threshold: ${config.skipIfMemoriesWritten})`,
42
+ };
43
+ }
44
+ return { extract: true };
45
+ }
46
+ /**
47
+ * Flush the session buffer. Attempts LLM extraction if configured and budget
48
+ * allows. No longer auto-generates episodic summaries — agents provide those
49
+ * via context_checkpoint({ sessionSummary }).
50
+ */
51
+ export async function flushSession(data, config) {
52
+ const skipCheck = shouldExtract(data, {
53
+ checkpointed: config.checkpointed,
54
+ minToolCalls: config.minToolCalls,
55
+ skipIfMemoriesWritten: config.skipIfMemoriesWritten,
56
+ });
57
+ // If agent already checkpointed or session doesn't qualify, skip
58
+ if (!skipCheck.extract) {
59
+ return { action: "skipped", reason: skipCheck.reason };
60
+ }
61
+ // Attempt LLM extraction if client configured + budget allows
62
+ if (config.extractionClient && config.readBudget && config.writeBudget) {
63
+ const extracted = await attemptLlmExtraction(data, config, config.extractionClient, config.readBudget, config.writeBudget);
64
+ if (extracted) {
65
+ // Also run task completion on LLM extraction path
66
+ if (config.taskCompletion && config.extractionClient) {
67
+ extracted.taskCompletions = await runTaskCompletion(data, config);
68
+ }
69
+ return extracted;
70
+ }
71
+ }
72
+ // No extraction configured or extraction returned empty.
73
+ // Try auto-generating episodic from transcript entries (zero LLM cost).
74
+ let taskCompletions;
75
+ if (config.taskCompletion && config.extractionClient) {
76
+ taskCompletions = await runTaskCompletion(data, config);
77
+ }
78
+ const transcriptEpisodic = buildTranscriptEpisodic(data);
79
+ if (transcriptEpisodic) {
80
+ try {
81
+ await config.checkpointFn({
82
+ memories: [],
83
+ sessionSummary: transcriptEpisodic,
84
+ agentId: config.agentId,
85
+ agentRunId: config.agentRunId,
86
+ vaultId: config.vaultId,
87
+ dedup: true,
88
+ });
89
+ return { action: "transcript_episodic", taskCompletions };
90
+ }
91
+ catch {
92
+ // Best-effort — fall through to skip
93
+ }
94
+ }
95
+ return {
96
+ action: "skipped",
97
+ reason: "No episodic auto-generation — agent provides summary via context_checkpoint",
98
+ taskCompletions,
99
+ };
100
+ }
101
+ /**
102
+ * Attempt LLM extraction. Returns SessionFlushResult on success, null to fall through.
103
+ */
104
+ async function attemptLlmExtraction(data, config, client, getBudget, saveBudget) {
105
+ let budget;
106
+ try {
107
+ budget = await getBudget();
108
+ }
109
+ catch {
110
+ return null; // Can't read budget → skip
111
+ }
112
+ // Check budget + circuit breaker
113
+ if (isBudgetExhausted(budget).exhausted || isCircuitBroken(budget).broken) {
114
+ return null; // Budget/circuit blocked → skip
115
+ }
116
+ try {
117
+ const { prompt } = buildCompressedPrompt(data);
118
+ const llmResult = await client.extract(prompt, EXTRACTION_MAX_OUTPUT_TOKENS);
119
+ const memories = parseExtractionResult(llmResult.text);
120
+ if (memories && memories.length > 0) {
121
+ // Checkpoint with extracted memories (no sessionSummary — agent provides it)
122
+ await config.checkpointFn({
123
+ memories: memories.map((m) => ({
124
+ content: m.content,
125
+ memoryType: m.memoryType,
126
+ importance: m.importance,
127
+ confidence: 3,
128
+ })),
129
+ sessionSummary: "", // Required by type but not used for episodic here
130
+ agentId: config.agentId,
131
+ agentRunId: config.agentRunId,
132
+ vaultId: config.vaultId,
133
+ dedup: true,
134
+ });
135
+ // Record success (swallow budget write errors)
136
+ await saveBudget(recordSuccess(budget, llmResult.inputTokens, llmResult.outputTokens, memories.length)).catch(() => { });
137
+ return { action: "llm_extracted" };
138
+ }
139
+ // Empty extraction → record and fall through
140
+ await saveBudget(recordEmpty(budget)).catch(() => { });
141
+ return null;
142
+ }
143
+ catch {
144
+ // LLM failure → record error and fall through
145
+ await saveBudget(recordError(budget)).catch(() => { });
146
+ return null;
147
+ }
148
+ }
149
+ /**
150
+ * Run task completion detection using the extraction LLM.
151
+ * Returns null-safe result, never throws.
152
+ */
153
+ async function runTaskCompletion(data, config) {
154
+ const tc = config.taskCompletion;
155
+ try {
156
+ return await flushTaskCompletions({
157
+ openTasks: tc.openTasks,
158
+ sessionData: data,
159
+ extractionClient: config.extractionClient,
160
+ updateTaskFn: tc.updateTaskFn,
161
+ writeMemoryFn: tc.writeMemoryFn,
162
+ createCompletedTaskFn: tc.createCompletedTaskFn,
163
+ settings: tc.settings,
164
+ });
165
+ }
166
+ catch {
167
+ return { completed: [], suggested: [], newTasksCreated: [], skipped: 0, error: "task completion failed" };
168
+ }
169
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-flush.js","sourceRoot":"","sources":["../src/session-flush.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Session lifecycle manager — coordinates idle detection, session buffer,
3
+ * and auto-flush for local stdio MCP sessions.
4
+ *
5
+ * Created once per MCP server process. Tracks all tool calls via `onToolCall()`,
6
+ * resets an idle timer on each call, and flushes (context_checkpoint) when:
7
+ * - Idle timer fires (agent stopped calling tools)
8
+ * - stdin EOF detected (client disconnected)
9
+ * - SIGTERM/SIGINT received (process being killed)
10
+ *
11
+ * The flush is idempotent — only runs once per session.
12
+ */
13
+ import { type SessionBufferData } from "./session-buffer.js";
14
+ import { type SessionFlushResult } from "./session-flush.js";
15
+ import type { ExtractionClient } from "./extraction-llm.js";
16
+ import type { ExtractionBudget } from "./extraction-budget.js";
17
+ import type { TaskLifecycleSettings } from "./task-lifecycle-types.js";
18
+ import { type OpenTask } from "./task-lifecycle.js";
19
+ export interface SessionLifecycleConfig {
20
+ agentRunId: string;
21
+ agentId: string;
22
+ vaultId: string;
23
+ idleTimeoutMs: number;
24
+ minToolCalls: number;
25
+ skipIfMemoriesWritten: number;
26
+ checkpointFn: (params: {
27
+ memories: Array<{
28
+ content: string;
29
+ memoryType: string;
30
+ importance: number;
31
+ confidence: number;
32
+ }>;
33
+ sessionSummary: string;
34
+ agentId: string;
35
+ agentRunId: string;
36
+ vaultId?: string;
37
+ dedup?: boolean;
38
+ }) => Promise<string>;
39
+ log: (msg: string) => void;
40
+ onIdle?: () => void;
41
+ extractionClient?: ExtractionClient;
42
+ readBudget?: () => Promise<ExtractionBudget>;
43
+ writeBudget?: (budget: ExtractionBudget) => Promise<void>;
44
+ fetchOpenTasks?: () => Promise<OpenTask[]>;
45
+ taskLifecycleSettings?: TaskLifecycleSettings;
46
+ updateTaskFn?: (taskId: string, updates: {
47
+ status: string;
48
+ completionSource: string;
49
+ completionEvidence: string;
50
+ }) => Promise<void>;
51
+ writeTaskSuggestionFn?: (content: string) => Promise<void>;
52
+ createCompletedTaskFn?: (task: {
53
+ title: string;
54
+ doneWhen?: string;
55
+ evidence: string;
56
+ }) => Promise<string | null>;
57
+ ingestTurnFn?: (content: string) => Promise<void>;
58
+ /** Interval (ms) for periodic ingestion of accumulated activity. Default: 5 minutes. */
59
+ ingestIntervalMs?: number;
60
+ }
61
+ export interface SessionLifecycle {
62
+ onToolCall(tool: string, inputSummary?: string, outputSummary?: string): void;
63
+ /** Record a rich transcript entry for auto-episodic generation. */
64
+ onTranscript(tool: string, context: string): void;
65
+ onMemoryWritten(memoryId: string): void;
66
+ flush(trigger: "idle" | "stdin_eof" | "sigterm" | "sigint" | "manual" | string): Promise<SessionFlushResult>;
67
+ getBufferData(): SessionBufferData;
68
+ getToolCallCount(): number;
69
+ wasCheckpointed(): boolean;
70
+ dispose(): void;
71
+ }
72
+ export declare function createSessionLifecycle(config: SessionLifecycleConfig): SessionLifecycle;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-lifecycle.d.ts","sourceRoot":"","sources":["../src/session-lifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAA2C,KAAK,iBAAiB,EAAoB,MAAM,qBAAqB,CAAC;AACxH,OAAO,EAAgB,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAqB,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEvE,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,YAAY,EAAE,CAAC,MAAM,EAAE;QACrB,QAAQ,EAAE,KAAK,CAAC;YACd,OAAO,EAAE,MAAM,CAAC;YAChB,UAAU,EAAE,MAAM,CAAC;YACnB,UAAU,EAAE,MAAM,CAAC;YACnB,UAAU,EAAE,MAAM,CAAC;SACpB,CAAC,CAAC;QACH,cAAc,EAAE,MAAM,CAAC;QACvB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACtB,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IAEpB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC7C,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1D,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3C,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAC9C,YAAY,CAAC,EAAE,CACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,kBAAkB,EAAE,MAAM,CAAA;KAAE,KAC9E,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,qBAAqB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,qBAAqB,CAAC,EAAE,CAAC,IAAI,EAAE;QAC7B,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;KAClB,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAE7B,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,wFAAwF;IACxF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9E,mEAAmE;IACnE,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAClD,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC7G,aAAa,IAAI,iBAAiB,CAAC;IACnC,gBAAgB,IAAI,MAAM,CAAC;IAC3B,eAAe,IAAI,OAAO,CAAC;IAC3B,OAAO,IAAI,IAAI,CAAC;CACjB;AAKD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,sBAAsB,GAAG,gBAAgB,CAyQvF"}
@@ -0,0 +1,247 @@
1
+ /**
2
+ * Session lifecycle manager — coordinates idle detection, session buffer,
3
+ * and auto-flush for local stdio MCP sessions.
4
+ *
5
+ * Created once per MCP server process. Tracks all tool calls via `onToolCall()`,
6
+ * resets an idle timer on each call, and flushes (context_checkpoint) when:
7
+ * - Idle timer fires (agent stopped calling tools)
8
+ * - stdin EOF detected (client disconnected)
9
+ * - SIGTERM/SIGINT received (process being killed)
10
+ *
11
+ * The flush is idempotent — only runs once per session.
12
+ */
13
+ import { createSessionBuffer, buildTurnContent } from "./session-buffer.js";
14
+ import { flushSession } from "./session-flush.js";
15
+ import { writeBufferToDisk, deleteBuffer } from "./buffer-persistence.js";
16
+ import { matchTaskActivity } from "./task-lifecycle.js";
17
+ /** Write buffer to disk every N tool calls for crash recovery. */
18
+ const DISK_WRITE_INTERVAL = 5;
19
+ export function createSessionLifecycle(config) {
20
+ const buffer = createSessionBuffer({
21
+ agentRunId: config.agentRunId,
22
+ agentId: config.agentId,
23
+ vaultId: config.vaultId,
24
+ });
25
+ let idleTimer = null;
26
+ let ingestTimer = null;
27
+ let flushed = false;
28
+ let toolCallCount = 0;
29
+ let writeCallCount = 0;
30
+ let autoTransitioned = false; // Only one auto-transition per session
31
+ let cachedTodoTasks = null;
32
+ /** Index into activities array — tracks what's been ingested already */
33
+ let lastIngestedActivityIndex = 0;
34
+ function resetIdleTimer() {
35
+ if (idleTimer !== null) {
36
+ clearTimeout(idleTimer);
37
+ idleTimer = null;
38
+ }
39
+ if (flushed)
40
+ return;
41
+ idleTimer = setTimeout(() => {
42
+ idleTimer = null;
43
+ config.log("[exovault-mcp] Idle timeout reached — flushing session");
44
+ config.onIdle?.();
45
+ }, config.idleTimeoutMs);
46
+ }
47
+ /**
48
+ * Start the periodic ingest timer (once, on first tool call).
49
+ * Fires every `ingestIntervalMs` to send accumulated activity to the
50
+ * extraction pipeline without waiting for session flush.
51
+ */
52
+ function startPeriodicIngestTimer() {
53
+ if (ingestTimer !== null)
54
+ return; // already started
55
+ if (!config.ingestTurnFn || !config.ingestIntervalMs)
56
+ return;
57
+ ingestTimer = setInterval(() => {
58
+ if (flushed) {
59
+ if (ingestTimer !== null) {
60
+ clearInterval(ingestTimer);
61
+ ingestTimer = null;
62
+ }
63
+ return;
64
+ }
65
+ void periodicIngest();
66
+ }, config.ingestIntervalMs);
67
+ }
68
+ /**
69
+ * Ingest only NEW activity since the last periodic ingest.
70
+ * Builds turn content from the slice of activities not yet sent.
71
+ */
72
+ async function periodicIngest() {
73
+ if (!config.ingestTurnFn)
74
+ return;
75
+ const data = buffer.getData();
76
+ const newActivities = data.activities.slice(lastIngestedActivityIndex);
77
+ if (newActivities.length === 0)
78
+ return;
79
+ // Build turn content from the new slice only
80
+ const turnContent = buildTurnContent({
81
+ ...data,
82
+ activities: newActivities,
83
+ });
84
+ if (!turnContent)
85
+ return;
86
+ try {
87
+ await config.ingestTurnFn(turnContent);
88
+ }
89
+ catch {
90
+ // Fire-and-forget — never crash because of ingestion
91
+ }
92
+ lastIngestedActivityIndex = data.activities.length;
93
+ }
94
+ function onToolCall(tool, inputSummary, outputSummary) {
95
+ buffer.recordActivity(tool, inputSummary, outputSummary);
96
+ resetIdleTimer();
97
+ startPeriodicIngestTimer();
98
+ // Periodic disk write for crash recovery (fire-and-forget)
99
+ toolCallCount++;
100
+ if (toolCallCount % DISK_WRITE_INTERVAL === 0) {
101
+ writeBufferToDisk(buffer.getData()).catch(() => { });
102
+ }
103
+ // Auto-status transitions: detect todo → in_progress from activity
104
+ // Only on write-category tools, debounced to every 3rd write, max once per session
105
+ const category = buffer.getData().activities.at(-1)?.category;
106
+ if (category === "write") {
107
+ writeCallCount++;
108
+ if (!autoTransitioned &&
109
+ writeCallCount % 3 === 0 &&
110
+ config.taskLifecycleSettings?.autoStatusTransitions &&
111
+ config.fetchOpenTasks &&
112
+ config.updateTaskFn) {
113
+ void checkAutoStatusTransition();
114
+ }
115
+ }
116
+ }
117
+ /** Zero-cost keyword matching to auto-transition a todo task to in_progress. */
118
+ async function checkAutoStatusTransition() {
119
+ try {
120
+ // Lazy-load todo tasks (once per session)
121
+ if (!cachedTodoTasks) {
122
+ const allTasks = await config.fetchOpenTasks();
123
+ cachedTodoTasks = allTasks.filter((t) => t.status === "todo");
124
+ }
125
+ if (cachedTodoTasks.length === 0)
126
+ return;
127
+ const data = buffer.getData();
128
+ for (const task of cachedTodoTasks) {
129
+ const result = matchTaskActivity({ title: task.title, entities: [] }, data.activities);
130
+ if (result.match && result.confidence > 0.6) {
131
+ await config.updateTaskFn(task.id, {
132
+ status: "in_progress",
133
+ completionSource: "auto",
134
+ completionEvidence: `Activity match (confidence: ${result.confidence.toFixed(2)})`,
135
+ });
136
+ autoTransitioned = true;
137
+ config.log(`[exovault-mcp] Auto-transitioned task "${task.title}" to in_progress`);
138
+ // Remove from cached list so we don't re-match
139
+ cachedTodoTasks = cachedTodoTasks.filter((t) => t.id !== task.id);
140
+ break; // Only one transition per session
141
+ }
142
+ }
143
+ }
144
+ catch (e) {
145
+ config.log(`[exovault-mcp] Auto-status check failed: ${e.message}`);
146
+ }
147
+ }
148
+ function onTranscript(tool, context) {
149
+ buffer.recordTranscript(tool, context);
150
+ }
151
+ function onMemoryWritten(memoryId) {
152
+ buffer.recordMemoryWrite(memoryId);
153
+ }
154
+ async function flush(trigger) {
155
+ if (flushed) {
156
+ return { action: "skipped", reason: "Session already flushed" };
157
+ }
158
+ flushed = true;
159
+ // Clear timers since we're flushing now
160
+ if (idleTimer !== null) {
161
+ clearTimeout(idleTimer);
162
+ idleTimer = null;
163
+ }
164
+ if (ingestTimer !== null) {
165
+ clearInterval(ingestTimer);
166
+ ingestTimer = null;
167
+ }
168
+ config.log(`[exovault-mcp] Flushing session (trigger: ${trigger})`);
169
+ const data = buffer.getData();
170
+ // Fetch open tasks for task completion detection (optional, fire-and-forget on failure)
171
+ let taskCompletion;
172
+ if (config.fetchOpenTasks && config.taskLifecycleSettings && config.updateTaskFn) {
173
+ try {
174
+ const openTasks = await config.fetchOpenTasks();
175
+ if (openTasks.length > 0) {
176
+ taskCompletion = {
177
+ openTasks,
178
+ settings: config.taskLifecycleSettings,
179
+ updateTaskFn: config.updateTaskFn,
180
+ writeMemoryFn: config.writeTaskSuggestionFn,
181
+ createCompletedTaskFn: config.createCompletedTaskFn,
182
+ };
183
+ }
184
+ }
185
+ catch (e) {
186
+ config.log(`[exovault-mcp] Failed to fetch open tasks: ${e.message}`);
187
+ }
188
+ }
189
+ const result = await flushSession(data, {
190
+ checkpointed: buffer.wasCheckpointed(),
191
+ minToolCalls: config.minToolCalls,
192
+ skipIfMemoriesWritten: config.skipIfMemoriesWritten,
193
+ checkpointFn: config.checkpointFn,
194
+ agentRunId: config.agentRunId,
195
+ agentId: config.agentId,
196
+ vaultId: config.vaultId,
197
+ extractionClient: config.extractionClient,
198
+ readBudget: config.readBudget,
199
+ writeBudget: config.writeBudget,
200
+ taskCompletion,
201
+ });
202
+ // Auto-ingest only NEW activity not yet sent by the periodic timer
203
+ if (config.ingestTurnFn) {
204
+ const newActivities = data.activities.slice(lastIngestedActivityIndex);
205
+ if (newActivities.length > 0) {
206
+ const turnContent = buildTurnContent({
207
+ ...data,
208
+ activities: newActivities,
209
+ });
210
+ if (turnContent) {
211
+ try {
212
+ await config.ingestTurnFn(turnContent);
213
+ }
214
+ catch {
215
+ // Fire-and-forget — never fail the flush because of ingestion
216
+ }
217
+ }
218
+ }
219
+ }
220
+ buffer.markFlushed();
221
+ // Clean up disk buffer after flush (fire-and-forget)
222
+ await deleteBuffer(config.agentRunId).catch(() => { });
223
+ config.log(`[exovault-mcp] Session flush complete: ${result.action}${result.reason ? ` (${result.reason})` : ""}${result.error ? ` error: ${result.error}` : ""}`);
224
+ return result;
225
+ }
226
+ function dispose() {
227
+ if (idleTimer !== null) {
228
+ clearTimeout(idleTimer);
229
+ idleTimer = null;
230
+ }
231
+ if (ingestTimer !== null) {
232
+ clearInterval(ingestTimer);
233
+ ingestTimer = null;
234
+ }
235
+ flushed = true;
236
+ }
237
+ return {
238
+ onToolCall,
239
+ onTranscript,
240
+ onMemoryWritten,
241
+ flush,
242
+ getBufferData: () => buffer.getData(),
243
+ getToolCallCount: () => toolCallCount,
244
+ wasCheckpointed: () => buffer.wasCheckpointed(),
245
+ dispose,
246
+ };
247
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-lifecycle.js","sourceRoot":"","sources":["../src/session-lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":""}