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,215 @@
1
+ #!/usr/bin/env node
2
+ import { performance } from "node:perf_hooks";
3
+ import { initialize } from "../auth.js";
4
+ import { runController } from "./index.js";
5
+ import { getRlmProfile } from "./profiles.js";
6
+ function parseScenarios() {
7
+ const raw = process.env.RLM_BENCHMARK_SCENARIOS;
8
+ if (!raw) {
9
+ return [
10
+ {
11
+ id: "roadmap",
12
+ goal: "What are the current roadmap priorities and completed milestones for this project?",
13
+ vaultId: process.env.RLM_BENCHMARK_VAULT_ID,
14
+ },
15
+ {
16
+ id: "indexing",
17
+ goal: "What indexing reliability improvements have already been implemented and what remains?",
18
+ vaultId: process.env.RLM_BENCHMARK_VAULT_ID,
19
+ },
20
+ ];
21
+ }
22
+ try {
23
+ const parsed = JSON.parse(raw);
24
+ return parsed.filter((s) => s.goal && s.id);
25
+ }
26
+ catch {
27
+ throw new Error("RLM_BENCHMARK_SCENARIOS must be valid JSON array");
28
+ }
29
+ }
30
+ async function main() {
31
+ const ctx = await initialize();
32
+ const envLlmApiKey = process.env.RLM_LLM_API_KEY ??
33
+ process.env.LLM_API_KEY ??
34
+ process.env.DEEPSEEK_API_KEY ??
35
+ undefined;
36
+ const llmConfig = ctx.llmConfig ??
37
+ (envLlmApiKey
38
+ ? {
39
+ apiKey: envLlmApiKey,
40
+ baseUrl: process.env.RLM_LLM_BASE_URL ??
41
+ process.env.LLM_BASE_URL ??
42
+ "https://api.deepseek.com",
43
+ modelId: process.env.RLM_LLM_MODEL_ID ??
44
+ process.env.LLM_MODEL_ID ??
45
+ "deepseek-chat",
46
+ }
47
+ : undefined);
48
+ if (!llmConfig) {
49
+ throw new Error("LLM config missing. Add llmApiKey/llmBaseUrl/llmModelId to ~/.exovault-mcp/config.json, or set RLM_LLM_API_KEY in environment.");
50
+ }
51
+ const scenarios = parseScenarios();
52
+ const profileName = process.env.RLM_BENCHMARK_MODE === "quick" ? "quick" : "quality";
53
+ const activeProfile = getRlmProfile(profileName);
54
+ const baseline = {
55
+ profile: profileName,
56
+ maxSteps: Number(process.env.RLM_BENCHMARK_BASELINE_MAX_STEPS ?? activeProfile.maxSteps),
57
+ memorySearchThreshold: Number(process.env.RLM_BENCHMARK_BASELINE_THRESHOLD ?? activeProfile.tuning.memorySearchThreshold),
58
+ memorySearchTopK: Number(process.env.RLM_BENCHMARK_BASELINE_MEMORY_TOP_K ?? activeProfile.tuning.memorySearchTopK),
59
+ noteSearchTopK: Number(process.env.RLM_BENCHMARK_BASELINE_NOTE_TOP_K ?? activeProfile.tuning.noteSearchTopK),
60
+ stepResultCharLimit: Number(process.env.RLM_BENCHMARK_BASELINE_STEP_RESULT_LIMIT ??
61
+ activeProfile.tuning.stepResultCharLimit),
62
+ summaryPerStepCharLimit: Number(process.env.RLM_BENCHMARK_BASELINE_SUMMARY_STEP_LIMIT ??
63
+ activeProfile.tuning.summaryPerStepCharLimit),
64
+ duplicateSearchTolerance: Number(process.env.RLM_BENCHMARK_BASELINE_DUPLICATE_TOLERANCE ??
65
+ activeProfile.tuning.duplicateSearchTolerance),
66
+ forceFinalizeRemainingSteps: Number(process.env.RLM_BENCHMARK_BASELINE_FORCE_FINALIZE_REMAINING ??
67
+ activeProfile.tuning.forceFinalizeRemainingSteps),
68
+ forceFinalizeMinEvidence: Number(process.env.RLM_BENCHMARK_BASELINE_FORCE_FINALIZE_EVIDENCE ??
69
+ activeProfile.tuning.forceFinalizeMinEvidence),
70
+ fallbackRecencyRetryLimit: Number(process.env.RLM_BENCHMARK_BASELINE_FALLBACK_RECENCY_RETRY_LIMIT ??
71
+ activeProfile.tuning.fallbackRecencyRetryLimit),
72
+ disableLlmFallbackSummary: (process.env.RLM_BENCHMARK_BASELINE_DISABLE_LLM_FALLBACK_SUMMARY ??
73
+ String(activeProfile.tuning.disableLlmFallbackSummary)) === "true",
74
+ };
75
+ const tuned = {
76
+ profile: profileName,
77
+ maxSteps: Number(process.env.RLM_BENCHMARK_TUNED_MAX_STEPS ?? Math.max(2, activeProfile.maxSteps - 1)),
78
+ memorySearchThreshold: Number(process.env.RLM_BENCHMARK_TUNED_THRESHOLD ?? activeProfile.tuning.memorySearchThreshold),
79
+ memorySearchTopK: Number(process.env.RLM_BENCHMARK_TUNED_MEMORY_TOP_K ?? Math.max(2, activeProfile.tuning.memorySearchTopK - 1)),
80
+ noteSearchTopK: Number(process.env.RLM_BENCHMARK_TUNED_NOTE_TOP_K ?? activeProfile.tuning.noteSearchTopK),
81
+ stepResultCharLimit: Number(process.env.RLM_BENCHMARK_TUNED_STEP_RESULT_LIMIT ?? activeProfile.tuning.stepResultCharLimit),
82
+ summaryPerStepCharLimit: Number(process.env.RLM_BENCHMARK_TUNED_SUMMARY_STEP_LIMIT ??
83
+ activeProfile.tuning.summaryPerStepCharLimit),
84
+ duplicateSearchTolerance: Number(process.env.RLM_BENCHMARK_TUNED_DUPLICATE_TOLERANCE ??
85
+ activeProfile.tuning.duplicateSearchTolerance),
86
+ forceFinalizeRemainingSteps: Number(process.env.RLM_BENCHMARK_TUNED_FORCE_FINALIZE_REMAINING ??
87
+ activeProfile.tuning.forceFinalizeRemainingSteps),
88
+ forceFinalizeMinEvidence: Number(process.env.RLM_BENCHMARK_TUNED_FORCE_FINALIZE_EVIDENCE ??
89
+ activeProfile.tuning.forceFinalizeMinEvidence),
90
+ fallbackRecencyRetryLimit: Number(process.env.RLM_BENCHMARK_TUNED_FALLBACK_RECENCY_RETRY_LIMIT ??
91
+ activeProfile.tuning.fallbackRecencyRetryLimit),
92
+ disableLlmFallbackSummary: (process.env.RLM_BENCHMARK_TUNED_DISABLE_LLM_FALLBACK_SUMMARY ??
93
+ String(activeProfile.tuning.disableLlmFallbackSummary)) === "true",
94
+ };
95
+ const guardrailPolicy = {
96
+ tunedMaxSteps: Number(process.env.RLM_BENCHMARK_ASSERT_TUNED_MAX_STEPS ?? tuned.maxSteps),
97
+ tunedMaxTokens: process.env.RLM_BENCHMARK_ASSERT_TUNED_MAX_TOKENS
98
+ ? Number(process.env.RLM_BENCHMARK_ASSERT_TUNED_MAX_TOKENS)
99
+ : undefined,
100
+ tunedMaxFallbackOnlyRate: Number(process.env.RLM_BENCHMARK_ASSERT_TUNED_MAX_FALLBACK_ONLY_RATE ?? 0.2),
101
+ strict: process.env.RLM_BENCHMARK_STRICT_ASSERT === "true",
102
+ };
103
+ const guardrailChecks = [];
104
+ const runInParallel = process.env.RLM_BENCHMARK_PARALLEL !== "false";
105
+ const report = {
106
+ generatedAt: new Date().toISOString(),
107
+ model: llmConfig.modelId,
108
+ benchmarkMode: profileName,
109
+ profiles: { baseline, tuned },
110
+ guardrails: guardrailPolicy,
111
+ parallel: runInParallel,
112
+ scenarios: [],
113
+ };
114
+ for (const scenario of scenarios) {
115
+ const scenarioResult = {
116
+ id: scenario.id,
117
+ goal: scenario.goal,
118
+ runs: [],
119
+ };
120
+ const modes = ["baseline", "tuned"];
121
+ const executeMode = async (mode) => {
122
+ const cfg = mode === "baseline" ? baseline : tuned;
123
+ const start = performance.now();
124
+ const run = await runController(ctx, llmConfig, {
125
+ goal: scenario.goal,
126
+ vaultId: scenario.vaultId,
127
+ profile: cfg.profile,
128
+ maxSteps: cfg.maxSteps,
129
+ writebackEnabled: false,
130
+ memorySearchThreshold: cfg.memorySearchThreshold,
131
+ memorySearchTopK: cfg.memorySearchTopK,
132
+ noteSearchTopK: cfg.noteSearchTopK,
133
+ disableLlmFallbackSummary: cfg.disableLlmFallbackSummary,
134
+ stepResultCharLimit: cfg.stepResultCharLimit,
135
+ summaryPerStepCharLimit: cfg.summaryPerStepCharLimit,
136
+ duplicateSearchTolerance: cfg.duplicateSearchTolerance,
137
+ forceFinalizeRemainingSteps: cfg.forceFinalizeRemainingSteps,
138
+ forceFinalizeMinEvidence: cfg.forceFinalizeMinEvidence,
139
+ fallbackRecencyRetryLimit: cfg.fallbackRecencyRetryLimit,
140
+ });
141
+ const elapsed = Math.round(performance.now() - start);
142
+ const memorySearchCalls = run.metrics?.memorySearchCalls ?? 0;
143
+ const memoryFallbackCalls = run.metrics?.memoryFallbackCalls ?? 0;
144
+ const fallbackOnly = memorySearchCalls > 0 && memoryFallbackCalls >= memorySearchCalls;
145
+ const result = {
146
+ mode,
147
+ elapsedMs: elapsed,
148
+ answer: run.answer,
149
+ answerPreview: run.answer.slice(0, 500),
150
+ confidence: run.confidence,
151
+ stepsUsed: run.stepsUsed,
152
+ totalTokens: run.totalTokens,
153
+ finishReason: run.finishReason,
154
+ budgetExhausted: run.budgetExhausted,
155
+ fallbackOnly,
156
+ metrics: run.metrics,
157
+ };
158
+ if (mode === "tuned") {
159
+ guardrailChecks.push({
160
+ scenarioId: scenario.id,
161
+ mode,
162
+ passed: result.stepsUsed <= guardrailPolicy.tunedMaxSteps,
163
+ message: `stepsUsed=${result.stepsUsed}, ceiling=${guardrailPolicy.tunedMaxSteps}`,
164
+ });
165
+ if (guardrailPolicy.tunedMaxTokens !== undefined) {
166
+ guardrailChecks.push({
167
+ scenarioId: scenario.id,
168
+ mode,
169
+ passed: result.totalTokens <= guardrailPolicy.tunedMaxTokens,
170
+ message: `totalTokens=${result.totalTokens}, ceiling=${guardrailPolicy.tunedMaxTokens}`,
171
+ });
172
+ }
173
+ const acceptableFinish = result.finishReason === "tool_finish" || result.finishReason === "controller_finalize";
174
+ guardrailChecks.push({
175
+ scenarioId: scenario.id,
176
+ mode,
177
+ passed: acceptableFinish,
178
+ message: `finishReason=${result.finishReason ?? "none"} expected tool_finish/controller_finalize`,
179
+ });
180
+ const fallbackOnlyRate = fallbackOnly ? 1 : 0;
181
+ guardrailChecks.push({
182
+ scenarioId: scenario.id,
183
+ mode,
184
+ passed: fallbackOnlyRate <= guardrailPolicy.tunedMaxFallbackOnlyRate,
185
+ message: `fallbackOnlyRate=${fallbackOnlyRate}, ceiling=${guardrailPolicy.tunedMaxFallbackOnlyRate}`,
186
+ });
187
+ }
188
+ return result;
189
+ };
190
+ const runResults = runInParallel
191
+ ? await Promise.all(modes.map((mode) => executeMode(mode)))
192
+ : [
193
+ await executeMode("baseline"),
194
+ await executeMode("tuned"),
195
+ ];
196
+ scenarioResult.runs.push(...runResults);
197
+ report.scenarios.push(scenarioResult);
198
+ }
199
+ report.checks = guardrailChecks;
200
+ const failedChecks = guardrailChecks.filter((check) => !check.passed);
201
+ report.checkSummary = {
202
+ total: guardrailChecks.length,
203
+ failed: failedChecks.length,
204
+ };
205
+ if (guardrailPolicy.strict && failedChecks.length > 0) {
206
+ throw new Error(`Benchmark guardrails failed: ${failedChecks
207
+ .map((check) => `${check.scenarioId}/${check.mode} ${check.message}`)
208
+ .join("; ")}`);
209
+ }
210
+ process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
211
+ }
212
+ main().catch((err) => {
213
+ process.stderr.write(`RLM benchmark failed: ${err.message}\n`);
214
+ process.exit(1);
215
+ });
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmark.js","sourceRoot":"","sources":["../../src/rlm/benchmark.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { McpContext, LlmConfig } from "../auth.js";
2
+ import type { ControllerState } from "./types.js";
3
+ export interface ExecuteResult {
4
+ answer: string;
5
+ confidence: number;
6
+ state: ControllerState;
7
+ }
8
+ /**
9
+ * Run the recursive execution loop.
10
+ * Uses Vercel AI SDK generateText() with tool definitions.
11
+ * The LLM proposes actions, we execute them, and loop until finish() or budget exhaustion.
12
+ */
13
+ export declare function executeLoop(ctx: McpContext, llmConfig: LlmConfig, state: ControllerState): Promise<ExecuteResult>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/rlm/execute.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAExD,OAAO,KAAK,EAAE,eAAe,EAAW,MAAM,YAAY,CAAC;AA2D3D,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,eAAe,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,aAAa,CAAC,CA0VxB"}
@@ -0,0 +1,366 @@
1
+ import { generateText, stepCountIs } from "ai";
2
+ import { createOpenAI } from "@ai-sdk/openai";
3
+ import { buildToolDefinitions } from "./actions.js";
4
+ const SYSTEM_PROMPT = `You are a retrieval controller for ExoVault, an encrypted knowledge base.
5
+ Your job is to answer a goal by searching and reading memories, then calling finish().
6
+
7
+ ## Optimal workflow (aim for 3-4 steps total):
8
+ 1. search_memories — one good semantic query covers most goals
9
+ 2. read_memories — read 3-5 top hits for full details (ONLY if summaries are insufficient)
10
+ 3. finish() — synthesize your answer with confidence score
11
+
12
+ ## CRITICAL RULES
13
+ - You have a STRICT step budget. Every step costs money.
14
+ - call finish() AS SOON AS you have enough evidence. Do not over-search.
15
+ - ONE search_memories call usually suffices. Only search again if the first returned zero relevant hits.
16
+ - Do NOT call search_notes unless you specifically need keyword matching on note titles/tags. Most goals are answered by memories alone.
17
+ - Do NOT repeat searches with slightly different wording — read the results you already have.
18
+ - Do NOT call finish() more than once.
19
+ - If no relevant results after 1-2 searches, call finish() with low confidence immediately.
20
+ - The finish() tool is the ONLY way to return your answer. Text responses are NOT returned.`;
21
+ function buildUserMessage(state) {
22
+ const parts = [`Goal: ${state.goal}`];
23
+ if (state.hypothesis) {
24
+ parts.push(`\nCurrent hypothesis: ${state.hypothesis}`);
25
+ }
26
+ if (state.retrieved.length > 0) {
27
+ parts.push(`\nRetrieved so far (${state.retrieved.length} items):`);
28
+ for (const item of state.retrieved.slice(-10)) {
29
+ parts.push(`- [${item.type}:${item.id}] ${item.summary}`);
30
+ }
31
+ }
32
+ if (state.steps.length > 0) {
33
+ parts.push(`\nSteps taken: ${state.steps.length}/${state.budget.maxSteps}`);
34
+ }
35
+ const stepsRemaining = state.budget.maxSteps - state.steps.length;
36
+ if (stepsRemaining <= state.tuning.forceFinalizeRemainingSteps + 1) {
37
+ parts.push(`\nWARNING: Step budget is low (${stepsRemaining} steps left). If evidence is sufficient, call finish() now.`);
38
+ }
39
+ const elapsed = Date.now() - state.startedAt;
40
+ const remaining = state.budget.maxWallMs - elapsed;
41
+ if (remaining < state.budget.maxWallMs * 0.3) {
42
+ parts.push(`\nWARNING: Time running low (${Math.round(remaining / 1000)}s remaining). Finish soon.`);
43
+ }
44
+ return parts.join("\n");
45
+ }
46
+ function isBudgetExhausted(state) {
47
+ if (state.steps.length >= state.budget.maxSteps)
48
+ return true;
49
+ if (Date.now() - state.startedAt >= state.budget.maxWallMs)
50
+ return true;
51
+ return false;
52
+ }
53
+ /**
54
+ * Run the recursive execution loop.
55
+ * Uses Vercel AI SDK generateText() with tool definitions.
56
+ * The LLM proposes actions, we execute them, and loop until finish() or budget exhaustion.
57
+ */
58
+ export async function executeLoop(ctx, llmConfig, state) {
59
+ const provider = createOpenAI({
60
+ apiKey: llmConfig.apiKey,
61
+ baseURL: llmConfig.baseUrl,
62
+ });
63
+ const model = provider.chat(llmConfig.modelId);
64
+ const tools = buildToolDefinitions(ctx, state, state.vaultId);
65
+ // Calculate remaining steps for this loop
66
+ const remainingSteps = state.budget.maxSteps - state.steps.length;
67
+ const disableLlmFallbackSummary = state.tuning.disableLlmFallbackSummary;
68
+ function clip(text, limit) {
69
+ if (text.length <= limit)
70
+ return text;
71
+ return `${text.slice(0, limit)}…`;
72
+ }
73
+ function clampConfidence(value) {
74
+ if (typeof value !== "number" || Number.isNaN(value))
75
+ return undefined;
76
+ return Math.max(0, Math.min(1, value));
77
+ }
78
+ function parseFinalizePayload(text) {
79
+ try {
80
+ const parsed = JSON.parse(text);
81
+ return {
82
+ answer: typeof parsed.answer === "string" ? parsed.answer : undefined,
83
+ confidence: clampConfidence(parsed.confidence),
84
+ };
85
+ }
86
+ catch {
87
+ const firstBrace = text.indexOf("{");
88
+ const lastBrace = text.lastIndexOf("}");
89
+ if (firstBrace >= 0 && lastBrace > firstBrace) {
90
+ try {
91
+ const parsed = JSON.parse(text.slice(firstBrace, lastBrace + 1));
92
+ return {
93
+ answer: typeof parsed.answer === "string" ? parsed.answer : undefined,
94
+ confidence: clampConfidence(parsed.confidence),
95
+ };
96
+ }
97
+ catch {
98
+ return null;
99
+ }
100
+ }
101
+ return null;
102
+ }
103
+ }
104
+ function parseToolOutput(raw) {
105
+ if (typeof raw !== "string")
106
+ return raw;
107
+ try {
108
+ return JSON.parse(raw);
109
+ }
110
+ catch {
111
+ return raw;
112
+ }
113
+ }
114
+ function buildResultSnapshot(action, parsed) {
115
+ if (!parsed || typeof parsed !== "object")
116
+ return undefined;
117
+ const obj = parsed;
118
+ if (action === "search_memories") {
119
+ const memories = Array.isArray(obj.memories) ? obj.memories : [];
120
+ const hits = memories.slice(0, 5).map((m) => {
121
+ const mm = m;
122
+ return {
123
+ id: mm.id,
124
+ memoryType: mm.memoryType,
125
+ summary: typeof mm.summary === "string" ? clip(mm.summary, 120) : null,
126
+ similarity: mm.similarity ?? null,
127
+ };
128
+ });
129
+ return {
130
+ searchMode: obj.searchMode ?? null,
131
+ count: memories.length,
132
+ hits,
133
+ skipped: obj.skipped ?? false,
134
+ };
135
+ }
136
+ if (action === "search_notes") {
137
+ const results = Array.isArray(obj) ? obj : Array.isArray(obj.results) ? obj.results : [];
138
+ const hits = results.slice(0, 5).map((n) => {
139
+ const nn = n;
140
+ return {
141
+ id: nn.id,
142
+ title: typeof nn.title === "string" ? clip(nn.title, 120) : null,
143
+ score: nn.score ?? nn.similarity ?? null,
144
+ };
145
+ });
146
+ return { count: results.length, hits, skipped: obj.skipped ?? false };
147
+ }
148
+ if (action === "read_memories") {
149
+ const memories = Array.isArray(obj.memories) ? obj.memories : [];
150
+ const hits = memories.slice(0, 3).map((m) => {
151
+ const mm = m;
152
+ return {
153
+ id: mm.id,
154
+ memoryType: mm.memoryType,
155
+ summary: typeof mm.summary === "string" ? clip(mm.summary, 120) : null,
156
+ contentPreview: typeof mm.content === "string" ? clip(mm.content, 180) : null,
157
+ };
158
+ });
159
+ return { count: memories.length, hits };
160
+ }
161
+ if (action === "read_note") {
162
+ return {
163
+ id: obj.id ?? null,
164
+ title: typeof obj.title === "string" ? clip(obj.title, 120) : null,
165
+ contentPreview: typeof obj.content === "string" ? clip(obj.content, 220) : null,
166
+ };
167
+ }
168
+ if (action === "finish") {
169
+ return {
170
+ answerPreview: typeof obj.answer === "string" ? clip(obj.answer, 180) : null,
171
+ confidence: obj.confidence ?? null,
172
+ };
173
+ }
174
+ return undefined;
175
+ }
176
+ function summarizeStepForFallback(step) {
177
+ const raw = step.resultSnapshot
178
+ ? JSON.stringify(step.resultSnapshot)
179
+ : step.result;
180
+ return clip(raw, state.tuning.summaryPerStepCharLimit);
181
+ }
182
+ function buildHeuristicFallbackAnswer() {
183
+ const latestSteps = state.steps.slice(-5);
184
+ const lines = [];
185
+ lines.push(`Goal: ${state.goal}`);
186
+ lines.push("Evidence collected (heuristic summary):");
187
+ for (const step of latestSteps) {
188
+ if (step.resultSnapshot) {
189
+ lines.push(`- ${step.action}: ${clip(JSON.stringify(step.resultSnapshot), 180)}`);
190
+ }
191
+ else if (step.result) {
192
+ lines.push(`- ${step.action}: ${clip(step.result, 180)}`);
193
+ }
194
+ }
195
+ if (state.retrieved.length > 0) {
196
+ lines.push("Top retrieved items:");
197
+ for (const item of state.retrieved.slice(-5)) {
198
+ lines.push(`- [${item.type}] ${item.summary}`);
199
+ }
200
+ }
201
+ lines.push("Run ended before explicit finish(); this is a best-effort summary from retrieved evidence.");
202
+ return lines.join("\n");
203
+ }
204
+ const result = await generateText({
205
+ model,
206
+ system: SYSTEM_PROMPT,
207
+ prompt: buildUserMessage(state),
208
+ tools,
209
+ stopWhen: stepCountIs(remainingSteps),
210
+ onStepFinish: (stepResult) => {
211
+ const stepStart = Date.now();
212
+ const { toolCalls, toolResults, usage } = stepResult;
213
+ if (!toolCalls || toolCalls.length === 0)
214
+ return;
215
+ for (let i = 0; i < toolCalls.length; i++) {
216
+ const call = toolCalls[i];
217
+ const toolResult = toolResults?.[i];
218
+ const parsedOutput = parseToolOutput(toolResult?.output);
219
+ const snapshot = buildResultSnapshot(call.toolName, parsedOutput);
220
+ if (call.toolName === "search_memories" && parsedOutput && typeof parsedOutput === "object") {
221
+ const mode = parsedOutput.searchMode;
222
+ if (mode === "fallback-recency") {
223
+ state.metrics.memoryFallbackCalls += 1;
224
+ }
225
+ }
226
+ const stepLog = {
227
+ action: call.toolName,
228
+ input: (call.input ?? {}),
229
+ result: typeof toolResult?.output === "string"
230
+ ? clip(toolResult.output, state.tuning.stepResultCharLimit)
231
+ : clip(JSON.stringify(toolResult?.output), state.tuning.stepResultCharLimit),
232
+ resultSnapshot: snapshot,
233
+ tokensUsed: usage?.totalTokens ?? 0,
234
+ durationMs: Date.now() - stepStart,
235
+ };
236
+ state.steps.push(stepLog);
237
+ state.totalTokens += usage?.totalTokens ?? 0;
238
+ // Track retrieved items for context
239
+ if (call.toolName === "search_memories" || call.toolName === "search_notes") {
240
+ try {
241
+ const parsedObj = parsedOutput && typeof parsedOutput === "object"
242
+ ? parsedOutput
243
+ : {};
244
+ const items = (parsedObj.memories ?? parsedObj.results ?? []);
245
+ for (const item of items.slice(0, 5)) {
246
+ state.retrieved.push({
247
+ type: call.toolName === "search_memories" ? "memory" : "note",
248
+ id: (item.id ?? item.noteId ?? "unknown"),
249
+ summary: (item.summary ?? item.title ?? item.content?.slice(0, 100) ?? ""),
250
+ });
251
+ }
252
+ }
253
+ catch {
254
+ // Parse failure — skip tracking
255
+ }
256
+ }
257
+ }
258
+ },
259
+ });
260
+ // Check if the LLM called finish()
261
+ let answer = "";
262
+ let confidence = 0;
263
+ let finishCalled = false;
264
+ for (const step of result.steps ?? []) {
265
+ for (const call of step.toolCalls ?? []) {
266
+ if (call.toolName === "finish") {
267
+ const input = call.input;
268
+ answer = input.answer;
269
+ confidence = input.confidence;
270
+ finishCalled = true;
271
+ }
272
+ }
273
+ }
274
+ const stepsRemaining = state.budget.maxSteps - state.steps.length;
275
+ if (!finishCalled &&
276
+ stepsRemaining <= state.tuning.forceFinalizeRemainingSteps &&
277
+ state.retrieved.length >= state.tuning.forceFinalizeMinEvidence) {
278
+ try {
279
+ const finalizeResult = await generateText({
280
+ model,
281
+ system: "You are finalizing a recursive retrieval run. Produce the best final answer from provided evidence and estimate confidence. Do not ask for more searches. Return strict JSON: {\"answer\":\"...\",\"confidence\":0.0}.",
282
+ prompt: [
283
+ `Goal: ${state.goal}`,
284
+ `\nEvidence summary:`,
285
+ ...state.steps
286
+ .slice(-state.tuning.summaryMaxSteps)
287
+ .map((s) => `[${s.action}] ${summarizeStepForFallback(s)}`),
288
+ ].join("\n"),
289
+ });
290
+ const parsedFinalize = parseFinalizePayload(finalizeResult.text ?? "");
291
+ answer = parsedFinalize?.answer ?? (finalizeResult.text || answer);
292
+ confidence = parsedFinalize?.confidence ?? Math.max(confidence, 0.45);
293
+ state.metrics.forcedFinalize = true;
294
+ state.totalTokens += finalizeResult.usage?.totalTokens ?? 0;
295
+ finishCalled = true;
296
+ state.finishReason = "controller_finalize";
297
+ }
298
+ catch {
299
+ // fallback handled below
300
+ }
301
+ }
302
+ // Fallback: if LLM never called finish(), synthesize answer from retrieved data
303
+ if (!finishCalled && state.steps.length > 0) {
304
+ if (disableLlmFallbackSummary) {
305
+ answer = buildHeuristicFallbackAnswer();
306
+ confidence = 0.25;
307
+ state.finishReason = state.budgetExhausted ? "budget_exhausted" : "controller_finalize";
308
+ state.confidence = confidence;
309
+ state.hypothesis = answer;
310
+ state.budgetExhausted = isBudgetExhausted(state);
311
+ if (state.budgetExhausted) {
312
+ state.finishReason = "budget_exhausted";
313
+ }
314
+ return { answer, confidence, state };
315
+ }
316
+ try {
317
+ const summaryResult = await generateText({
318
+ model,
319
+ system: "You are given retrieval results from a knowledge base search. Synthesize them into a clear, direct answer to the goal. Only state what the evidence supports. Be concise.",
320
+ prompt: [
321
+ `Goal: ${state.goal}`,
322
+ `\nRetrieval results:`,
323
+ ...state.steps
324
+ .slice(-state.tuning.summaryMaxSteps)
325
+ .map((s) => `[${s.action}] ${summarizeStepForFallback(s)}`),
326
+ ].join("\n"),
327
+ });
328
+ answer = summaryResult.text || "No answer could be generated.";
329
+ confidence = 0.3;
330
+ state.totalTokens += summaryResult.usage?.totalTokens ?? 0;
331
+ state.finishReason = state.budgetExhausted ? "budget_exhausted" : "controller_finalize";
332
+ }
333
+ catch {
334
+ // Last resort: use whatever text the model produced
335
+ answer = result.text || "Budget exhausted before the controller could finish.";
336
+ confidence = 0;
337
+ state.finishReason = state.budgetExhausted ? "budget_exhausted" : "controller_finalize";
338
+ }
339
+ }
340
+ else if (!finishCalled) {
341
+ answer = result.text || "No information found.";
342
+ confidence = 0;
343
+ state.finishReason = state.budgetExhausted ? "budget_exhausted" : "controller_finalize";
344
+ }
345
+ else if (!state.finishReason) {
346
+ state.finishReason = "tool_finish";
347
+ }
348
+ // Update total tokens from final usage
349
+ if (result.usage) {
350
+ const stepTokens = state.steps.reduce((sum, s) => sum + s.tokensUsed, 0);
351
+ const finalTotal = result.usage.totalTokens ?? 0;
352
+ if (finalTotal > stepTokens) {
353
+ state.totalTokens = finalTotal;
354
+ }
355
+ }
356
+ state.confidence = confidence;
357
+ state.hypothesis = answer;
358
+ state.budgetExhausted = isBudgetExhausted(state);
359
+ const finishedWithAnswer = finishCalled ||
360
+ state.finishReason === "tool_finish" ||
361
+ state.finishReason === "controller_finalize";
362
+ if (state.budgetExhausted && !finishedWithAnswer) {
363
+ state.finishReason = "budget_exhausted";
364
+ }
365
+ return { answer, confidence, state };
366
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.js","sourceRoot":"","sources":["../../src/rlm/execute.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { McpContext, LlmConfig } from "../auth.js";
2
+ import { type ControllerInput, type ControllerResult } from "./types.js";
3
+ /**
4
+ * Run the RLM controller: recursive retrieval, verification, and writeback.
5
+ */
6
+ export declare function runController(ctx: McpContext, llmConfig: LlmConfig, input: ControllerInput): Promise<ControllerResult>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rlm/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAKxD,OAAO,EAAkB,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAwB,MAAM,YAAY,CAAC;AAkB/G;;GAEG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,gBAAgB,CAAC,CAgJ3B"}