@xandout/libra-harness 0.1.8

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 (289) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +486 -0
  3. package/dist/agent.d.ts +174 -0
  4. package/dist/agent.d.ts.map +1 -0
  5. package/dist/agent.js +575 -0
  6. package/dist/agent.js.map +1 -0
  7. package/dist/ai-sdk-model.d.ts +26 -0
  8. package/dist/ai-sdk-model.d.ts.map +1 -0
  9. package/dist/ai-sdk-model.js +260 -0
  10. package/dist/ai-sdk-model.js.map +1 -0
  11. package/dist/context.d.ts +75 -0
  12. package/dist/context.d.ts.map +1 -0
  13. package/dist/context.js +2 -0
  14. package/dist/context.js.map +1 -0
  15. package/dist/errors.d.ts +33 -0
  16. package/dist/errors.d.ts.map +1 -0
  17. package/dist/errors.js +59 -0
  18. package/dist/errors.js.map +1 -0
  19. package/dist/extension.d.ts +63 -0
  20. package/dist/extension.d.ts.map +1 -0
  21. package/dist/extension.js +2 -0
  22. package/dist/extension.js.map +1 -0
  23. package/dist/extras/extension-loader.d.ts +205 -0
  24. package/dist/extras/extension-loader.d.ts.map +1 -0
  25. package/dist/extras/extension-loader.js +315 -0
  26. package/dist/extras/extension-loader.js.map +1 -0
  27. package/dist/extras/extensions/auto-steer/extension.d.ts +46 -0
  28. package/dist/extras/extensions/auto-steer/extension.d.ts.map +1 -0
  29. package/dist/extras/extensions/auto-steer/extension.js +52 -0
  30. package/dist/extras/extensions/auto-steer/extension.js.map +1 -0
  31. package/dist/extras/extensions/auto-steer/extension.json +7 -0
  32. package/dist/extras/extensions/auto-steer/index.d.ts +3 -0
  33. package/dist/extras/extensions/auto-steer/index.d.ts.map +1 -0
  34. package/dist/extras/extensions/auto-steer/index.js +2 -0
  35. package/dist/extras/extensions/auto-steer/index.js.map +1 -0
  36. package/dist/extras/extensions/disk-session/extension.d.ts +167 -0
  37. package/dist/extras/extensions/disk-session/extension.d.ts.map +1 -0
  38. package/dist/extras/extensions/disk-session/extension.js +492 -0
  39. package/dist/extras/extensions/disk-session/extension.js.map +1 -0
  40. package/dist/extras/extensions/disk-session/extension.json +6 -0
  41. package/dist/extras/extensions/disk-session/extension.test.d.ts +2 -0
  42. package/dist/extras/extensions/disk-session/extension.test.d.ts.map +1 -0
  43. package/dist/extras/extensions/disk-session/extension.test.js +672 -0
  44. package/dist/extras/extensions/disk-session/extension.test.js.map +1 -0
  45. package/dist/extras/extensions/disk-session/index.d.ts +3 -0
  46. package/dist/extras/extensions/disk-session/index.d.ts.map +1 -0
  47. package/dist/extras/extensions/disk-session/index.js +2 -0
  48. package/dist/extras/extensions/disk-session/index.js.map +1 -0
  49. package/dist/extras/extensions/emoji/extension.d.ts +20 -0
  50. package/dist/extras/extensions/emoji/extension.d.ts.map +1 -0
  51. package/dist/extras/extensions/emoji/extension.js +22 -0
  52. package/dist/extras/extensions/emoji/extension.js.map +1 -0
  53. package/dist/extras/extensions/emoji/extension.json +7 -0
  54. package/dist/extras/extensions/emoji/index.d.ts +3 -0
  55. package/dist/extras/extensions/emoji/index.d.ts.map +1 -0
  56. package/dist/extras/extensions/emoji/index.js +2 -0
  57. package/dist/extras/extensions/emoji/index.js.map +1 -0
  58. package/dist/extras/extensions/filesystem/extension.d.ts +53 -0
  59. package/dist/extras/extensions/filesystem/extension.d.ts.map +1 -0
  60. package/dist/extras/extensions/filesystem/extension.js +350 -0
  61. package/dist/extras/extensions/filesystem/extension.js.map +1 -0
  62. package/dist/extras/extensions/filesystem/extension.json +6 -0
  63. package/dist/extras/extensions/filesystem/extension.test.d.ts +2 -0
  64. package/dist/extras/extensions/filesystem/extension.test.d.ts.map +1 -0
  65. package/dist/extras/extensions/filesystem/extension.test.js +387 -0
  66. package/dist/extras/extensions/filesystem/extension.test.js.map +1 -0
  67. package/dist/extras/extensions/filesystem/index.d.ts +2 -0
  68. package/dist/extras/extensions/filesystem/index.d.ts.map +1 -0
  69. package/dist/extras/extensions/filesystem/index.js +2 -0
  70. package/dist/extras/extensions/filesystem/index.js.map +1 -0
  71. package/dist/extras/extensions/keyword-extractor/extension.d.ts +53 -0
  72. package/dist/extras/extensions/keyword-extractor/extension.d.ts.map +1 -0
  73. package/dist/extras/extensions/keyword-extractor/extension.js +61 -0
  74. package/dist/extras/extensions/keyword-extractor/extension.js.map +1 -0
  75. package/dist/extras/extensions/keyword-extractor/extension.json +6 -0
  76. package/dist/extras/extensions/keyword-extractor/extension.test.d.ts +2 -0
  77. package/dist/extras/extensions/keyword-extractor/extension.test.d.ts.map +1 -0
  78. package/dist/extras/extensions/keyword-extractor/extension.test.js +105 -0
  79. package/dist/extras/extensions/keyword-extractor/extension.test.js.map +1 -0
  80. package/dist/extras/extensions/keyword-extractor/index.d.ts +5 -0
  81. package/dist/extras/extensions/keyword-extractor/index.d.ts.map +1 -0
  82. package/dist/extras/extensions/keyword-extractor/index.js +3 -0
  83. package/dist/extras/extensions/keyword-extractor/index.js.map +1 -0
  84. package/dist/extras/extensions/keyword-extractor/nlp.d.ts +68 -0
  85. package/dist/extras/extensions/keyword-extractor/nlp.d.ts.map +1 -0
  86. package/dist/extras/extensions/keyword-extractor/nlp.js +156 -0
  87. package/dist/extras/extensions/keyword-extractor/nlp.js.map +1 -0
  88. package/dist/extras/extensions/keyword-extractor/nlp.test.d.ts +2 -0
  89. package/dist/extras/extensions/keyword-extractor/nlp.test.d.ts.map +1 -0
  90. package/dist/extras/extensions/keyword-extractor/nlp.test.js +176 -0
  91. package/dist/extras/extensions/keyword-extractor/nlp.test.js.map +1 -0
  92. package/dist/extras/extensions/logger/extension.d.ts +52 -0
  93. package/dist/extras/extensions/logger/extension.d.ts.map +1 -0
  94. package/dist/extras/extensions/logger/extension.js +68 -0
  95. package/dist/extras/extensions/logger/extension.js.map +1 -0
  96. package/dist/extras/extensions/logger/extension.json +7 -0
  97. package/dist/extras/extensions/logger/index.d.ts +3 -0
  98. package/dist/extras/extensions/logger/index.d.ts.map +1 -0
  99. package/dist/extras/extensions/logger/index.js +2 -0
  100. package/dist/extras/extensions/logger/index.js.map +1 -0
  101. package/dist/extras/extensions/mcp/extension.d.ts +63 -0
  102. package/dist/extras/extensions/mcp/extension.d.ts.map +1 -0
  103. package/dist/extras/extensions/mcp/extension.js +437 -0
  104. package/dist/extras/extensions/mcp/extension.js.map +1 -0
  105. package/dist/extras/extensions/mcp/extension.json +7 -0
  106. package/dist/extras/extensions/mcp/extension.test.d.ts +2 -0
  107. package/dist/extras/extensions/mcp/extension.test.d.ts.map +1 -0
  108. package/dist/extras/extensions/mcp/extension.test.js +286 -0
  109. package/dist/extras/extensions/mcp/extension.test.js.map +1 -0
  110. package/dist/extras/extensions/mcp/index.d.ts +3 -0
  111. package/dist/extras/extensions/mcp/index.d.ts.map +1 -0
  112. package/dist/extras/extensions/mcp/index.js +2 -0
  113. package/dist/extras/extensions/mcp/index.js.map +1 -0
  114. package/dist/extras/extensions/mem-session/extension.d.ts +24 -0
  115. package/dist/extras/extensions/mem-session/extension.d.ts.map +1 -0
  116. package/dist/extras/extensions/mem-session/extension.js +49 -0
  117. package/dist/extras/extensions/mem-session/extension.js.map +1 -0
  118. package/dist/extras/extensions/mem-session/extension.json +6 -0
  119. package/dist/extras/extensions/mem-session/index.d.ts +2 -0
  120. package/dist/extras/extensions/mem-session/index.d.ts.map +1 -0
  121. package/dist/extras/extensions/mem-session/index.js +2 -0
  122. package/dist/extras/extensions/mem-session/index.js.map +1 -0
  123. package/dist/extras/extensions/memory/extension.d.ts +54 -0
  124. package/dist/extras/extensions/memory/extension.d.ts.map +1 -0
  125. package/dist/extras/extensions/memory/extension.js +143 -0
  126. package/dist/extras/extensions/memory/extension.js.map +1 -0
  127. package/dist/extras/extensions/memory/extension.json +7 -0
  128. package/dist/extras/extensions/memory/index.d.ts +5 -0
  129. package/dist/extras/extensions/memory/index.d.ts.map +1 -0
  130. package/dist/extras/extensions/memory/index.js +3 -0
  131. package/dist/extras/extensions/memory/index.js.map +1 -0
  132. package/dist/extras/extensions/memory/llm-extractor.d.ts +42 -0
  133. package/dist/extras/extensions/memory/llm-extractor.d.ts.map +1 -0
  134. package/dist/extras/extensions/memory/llm-extractor.js +89 -0
  135. package/dist/extras/extensions/memory/llm-extractor.js.map +1 -0
  136. package/dist/extras/extensions/memory/types.d.ts +142 -0
  137. package/dist/extras/extensions/memory/types.d.ts.map +1 -0
  138. package/dist/extras/extensions/memory/types.js +2 -0
  139. package/dist/extras/extensions/memory/types.js.map +1 -0
  140. package/dist/extras/extensions/otel/extension.d.ts +57 -0
  141. package/dist/extras/extensions/otel/extension.d.ts.map +1 -0
  142. package/dist/extras/extensions/otel/extension.js +253 -0
  143. package/dist/extras/extensions/otel/extension.js.map +1 -0
  144. package/dist/extras/extensions/otel/extension.json +7 -0
  145. package/dist/extras/extensions/otel/extension.test.d.ts +2 -0
  146. package/dist/extras/extensions/otel/extension.test.d.ts.map +1 -0
  147. package/dist/extras/extensions/otel/extension.test.js +399 -0
  148. package/dist/extras/extensions/otel/extension.test.js.map +1 -0
  149. package/dist/extras/extensions/otel/index.d.ts +4 -0
  150. package/dist/extras/extensions/otel/index.d.ts.map +1 -0
  151. package/dist/extras/extensions/otel/index.js +3 -0
  152. package/dist/extras/extensions/otel/index.js.map +1 -0
  153. package/dist/extras/extensions/otel/jsonl-span-exporter.d.ts +60 -0
  154. package/dist/extras/extensions/otel/jsonl-span-exporter.d.ts.map +1 -0
  155. package/dist/extras/extensions/otel/jsonl-span-exporter.js +134 -0
  156. package/dist/extras/extensions/otel/jsonl-span-exporter.js.map +1 -0
  157. package/dist/extras/extensions/scripts/extension.d.ts +180 -0
  158. package/dist/extras/extensions/scripts/extension.d.ts.map +1 -0
  159. package/dist/extras/extensions/scripts/extension.js +618 -0
  160. package/dist/extras/extensions/scripts/extension.js.map +1 -0
  161. package/dist/extras/extensions/scripts/extension.json +7 -0
  162. package/dist/extras/extensions/scripts/extension.test.d.ts +2 -0
  163. package/dist/extras/extensions/scripts/extension.test.d.ts.map +1 -0
  164. package/dist/extras/extensions/scripts/extension.test.js +552 -0
  165. package/dist/extras/extensions/scripts/extension.test.js.map +1 -0
  166. package/dist/extras/extensions/scripts/index.d.ts +3 -0
  167. package/dist/extras/extensions/scripts/index.d.ts.map +1 -0
  168. package/dist/extras/extensions/scripts/index.js +2 -0
  169. package/dist/extras/extensions/scripts/index.js.map +1 -0
  170. package/dist/extras/extensions/skills/extension.d.ts +105 -0
  171. package/dist/extras/extensions/skills/extension.d.ts.map +1 -0
  172. package/dist/extras/extensions/skills/extension.js +419 -0
  173. package/dist/extras/extensions/skills/extension.js.map +1 -0
  174. package/dist/extras/extensions/skills/extension.json +7 -0
  175. package/dist/extras/extensions/skills/extension.test.d.ts +2 -0
  176. package/dist/extras/extensions/skills/extension.test.d.ts.map +1 -0
  177. package/dist/extras/extensions/skills/extension.test.js +184 -0
  178. package/dist/extras/extensions/skills/extension.test.js.map +1 -0
  179. package/dist/extras/extensions/skills/index.d.ts +4 -0
  180. package/dist/extras/extensions/skills/index.d.ts.map +1 -0
  181. package/dist/extras/extensions/skills/index.js +3 -0
  182. package/dist/extras/extensions/skills/index.js.map +1 -0
  183. package/dist/extras/extensions/streaming/extension.d.ts +15 -0
  184. package/dist/extras/extensions/streaming/extension.d.ts.map +1 -0
  185. package/dist/extras/extensions/streaming/extension.js +41 -0
  186. package/dist/extras/extensions/streaming/extension.js.map +1 -0
  187. package/dist/extras/extensions/streaming/extension.json +6 -0
  188. package/dist/extras/extensions/streaming/index.d.ts +2 -0
  189. package/dist/extras/extensions/streaming/index.d.ts.map +1 -0
  190. package/dist/extras/extensions/streaming/index.js +2 -0
  191. package/dist/extras/extensions/streaming/index.js.map +1 -0
  192. package/dist/extras/extensions/structured-output/extension.d.ts +11 -0
  193. package/dist/extras/extensions/structured-output/extension.d.ts.map +1 -0
  194. package/dist/extras/extensions/structured-output/extension.js +102 -0
  195. package/dist/extras/extensions/structured-output/extension.js.map +1 -0
  196. package/dist/extras/extensions/structured-output/extension.json +7 -0
  197. package/dist/extras/extensions/structured-output/index.d.ts +3 -0
  198. package/dist/extras/extensions/structured-output/index.d.ts.map +1 -0
  199. package/dist/extras/extensions/structured-output/index.js +2 -0
  200. package/dist/extras/extensions/structured-output/index.js.map +1 -0
  201. package/dist/extras/extensions/timestamp/extension.d.ts +11 -0
  202. package/dist/extras/extensions/timestamp/extension.d.ts.map +1 -0
  203. package/dist/extras/extensions/timestamp/extension.js +21 -0
  204. package/dist/extras/extensions/timestamp/extension.js.map +1 -0
  205. package/dist/extras/extensions/timestamp/extension.json +6 -0
  206. package/dist/extras/extensions/timestamp/index.d.ts +2 -0
  207. package/dist/extras/extensions/timestamp/index.d.ts.map +1 -0
  208. package/dist/extras/extensions/timestamp/index.js +2 -0
  209. package/dist/extras/extensions/timestamp/index.js.map +1 -0
  210. package/dist/extras/extensions/token-stats/extension.d.ts +50 -0
  211. package/dist/extras/extensions/token-stats/extension.d.ts.map +1 -0
  212. package/dist/extras/extensions/token-stats/extension.js +99 -0
  213. package/dist/extras/extensions/token-stats/extension.js.map +1 -0
  214. package/dist/extras/extensions/token-stats/extension.json +7 -0
  215. package/dist/extras/extensions/token-stats/extension.test.d.ts +2 -0
  216. package/dist/extras/extensions/token-stats/extension.test.d.ts.map +1 -0
  217. package/dist/extras/extensions/token-stats/extension.test.js +197 -0
  218. package/dist/extras/extensions/token-stats/extension.test.js.map +1 -0
  219. package/dist/extras/extensions/token-stats/index.d.ts +3 -0
  220. package/dist/extras/extensions/token-stats/index.d.ts.map +1 -0
  221. package/dist/extras/extensions/token-stats/index.js +2 -0
  222. package/dist/extras/extensions/token-stats/index.js.map +1 -0
  223. package/dist/extras/extensions/tool-buffer/extension.d.ts +89 -0
  224. package/dist/extras/extensions/tool-buffer/extension.d.ts.map +1 -0
  225. package/dist/extras/extensions/tool-buffer/extension.js +182 -0
  226. package/dist/extras/extensions/tool-buffer/extension.js.map +1 -0
  227. package/dist/extras/extensions/tool-buffer/extension.json +7 -0
  228. package/dist/extras/extensions/tool-buffer/extension.test.d.ts +2 -0
  229. package/dist/extras/extensions/tool-buffer/extension.test.d.ts.map +1 -0
  230. package/dist/extras/extensions/tool-buffer/extension.test.js +549 -0
  231. package/dist/extras/extensions/tool-buffer/extension.test.js.map +1 -0
  232. package/dist/extras/extensions/tool-buffer/index.d.ts +3 -0
  233. package/dist/extras/extensions/tool-buffer/index.d.ts.map +1 -0
  234. package/dist/extras/extensions/tool-buffer/index.js +2 -0
  235. package/dist/extras/extensions/tool-buffer/index.js.map +1 -0
  236. package/dist/extras/extensions/weather-tool/extension.d.ts +22 -0
  237. package/dist/extras/extensions/weather-tool/extension.d.ts.map +1 -0
  238. package/dist/extras/extensions/weather-tool/extension.js +33 -0
  239. package/dist/extras/extensions/weather-tool/extension.js.map +1 -0
  240. package/dist/extras/extensions/weather-tool/extension.json +7 -0
  241. package/dist/extras/extensions/weather-tool/index.d.ts +3 -0
  242. package/dist/extras/extensions/weather-tool/index.d.ts.map +1 -0
  243. package/dist/extras/extensions/weather-tool/index.js +2 -0
  244. package/dist/extras/extensions/weather-tool/index.js.map +1 -0
  245. package/dist/extras/models/ai-sdk-resolver.d.ts +15 -0
  246. package/dist/extras/models/ai-sdk-resolver.d.ts.map +1 -0
  247. package/dist/extras/models/ai-sdk-resolver.js +57 -0
  248. package/dist/extras/models/ai-sdk-resolver.js.map +1 -0
  249. package/dist/extras/models/index.d.ts +5 -0
  250. package/dist/extras/models/index.d.ts.map +1 -0
  251. package/dist/extras/models/index.js +3 -0
  252. package/dist/extras/models/index.js.map +1 -0
  253. package/dist/extras/models/routing-model.d.ts +18 -0
  254. package/dist/extras/models/routing-model.d.ts.map +1 -0
  255. package/dist/extras/models/routing-model.js +24 -0
  256. package/dist/extras/models/routing-model.js.map +1 -0
  257. package/dist/extras/openai-provider/index.d.ts +3 -0
  258. package/dist/extras/openai-provider/index.d.ts.map +1 -0
  259. package/dist/extras/openai-provider/index.js +2 -0
  260. package/dist/extras/openai-provider/index.js.map +1 -0
  261. package/dist/extras/openai-provider/server.d.ts +34 -0
  262. package/dist/extras/openai-provider/server.d.ts.map +1 -0
  263. package/dist/extras/openai-provider/server.js +335 -0
  264. package/dist/extras/openai-provider/server.js.map +1 -0
  265. package/dist/handle.d.ts +56 -0
  266. package/dist/handle.d.ts.map +1 -0
  267. package/dist/handle.js +2 -0
  268. package/dist/handle.js.map +1 -0
  269. package/dist/hooks.d.ts +98 -0
  270. package/dist/hooks.d.ts.map +1 -0
  271. package/dist/hooks.js +53 -0
  272. package/dist/hooks.js.map +1 -0
  273. package/dist/index.d.ts +16 -0
  274. package/dist/index.d.ts.map +1 -0
  275. package/dist/index.js +9 -0
  276. package/dist/index.js.map +1 -0
  277. package/dist/model.d.ts +75 -0
  278. package/dist/model.d.ts.map +1 -0
  279. package/dist/model.js +2 -0
  280. package/dist/model.js.map +1 -0
  281. package/dist/tool.d.ts +78 -0
  282. package/dist/tool.d.ts.map +1 -0
  283. package/dist/tool.js +78 -0
  284. package/dist/tool.js.map +1 -0
  285. package/dist/types.d.ts +83 -0
  286. package/dist/types.d.ts.map +1 -0
  287. package/dist/types.js +21 -0
  288. package/dist/types.js.map +1 -0
  289. package/package.json +178 -0
@@ -0,0 +1,68 @@
1
+ import { messageContentToText } from '../../../types.js';
2
+ const LEVEL_ORDER = { info: 0, debug: 1 };
3
+ /**
4
+ * Logging extension — logs each lifecycle stage.
5
+ *
6
+ * Observes every hook stage (beforeTurn, beforeLLM, afterLLM, beforeTool,
7
+ * afterTool, onError, afterTurn) without mutating anything. Accepts
8
+ * optional config for custom log/error functions, a prefix, and a log level.
9
+ *
10
+ * Log levels:
11
+ * - **info** (default): turn start/finish, errors
12
+ * - **debug**: per-LLM-call and per-tool-call details
13
+ *
14
+ * If the `DEBUG` environment variable is set and no explicit `level` is
15
+ * provided, the level defaults to `'debug'`.
16
+ */
17
+ export default function createLoggingExtension(config) {
18
+ const log = config?.logFunction ?? console.log;
19
+ const error = config?.errorFunction ?? console.error;
20
+ const prefix = config?.logPrefix ?? '[logging]';
21
+ const level = config?.level ?? (process.env.DEBUG ? 'debug' : 'info');
22
+ const shouldLog = (target) => LEVEL_ORDER[target] <= LEVEL_ORDER[level];
23
+ return {
24
+ name: 'logging',
25
+ priority: 100,
26
+ install(agent) {
27
+ agent.hook('beforeTurn', 'logging', async (ctx) => {
28
+ log(`${prefix} turn started`);
29
+ if (shouldLog('debug')) {
30
+ log(`${prefix} message: "${messageContentToText(ctx.turn.request.message)}"`);
31
+ }
32
+ });
33
+ agent.hook('beforeLLM', 'logging', async (ctx) => {
34
+ if (!shouldLog('debug'))
35
+ return;
36
+ log(`${prefix} LLM call #${ctx.turn.messages.length} messages`);
37
+ });
38
+ agent.hook('afterLLM', 'logging', async (ctx) => {
39
+ if (!shouldLog('debug'))
40
+ return;
41
+ const calls = ctx.modelResponse?.message.toolCalls;
42
+ if (calls?.length) {
43
+ log(`${prefix} model requested tools: ${calls.map((c) => c.name).join(', ')}`);
44
+ }
45
+ else {
46
+ log(`${prefix} model returned final response`);
47
+ }
48
+ });
49
+ agent.hook('beforeTool', 'logging', async (ctx) => {
50
+ if (!shouldLog('debug'))
51
+ return;
52
+ log(`${prefix} executing tool: ${ctx.toolCall?.name}`);
53
+ });
54
+ agent.hook('afterTool', 'logging', async (ctx) => {
55
+ if (!shouldLog('debug'))
56
+ return;
57
+ log(`${prefix} tool result: ${ctx.toolResult?.content}`);
58
+ });
59
+ agent.hook('onError', 'logging', async (ctx) => {
60
+ error(`${prefix} error:`, ctx.error);
61
+ });
62
+ agent.hook('afterTurn', 'logging', async (ctx) => {
63
+ log(`${prefix} turn finished: ${ctx.turn.response?.finishReason}`);
64
+ });
65
+ },
66
+ };
67
+ }
68
+ //# sourceMappingURL=extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.js","sourceRoot":"","sources":["../../../../src/extras/extensions/logger/extension.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAuCzD,MAAM,WAAW,GAA6B,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AAEpE;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAC5C,MAA+B;IAE/B,MAAM,GAAG,GAAG,MAAM,EAAE,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC;IAC/C,MAAM,KAAK,GAAG,MAAM,EAAE,aAAa,IAAI,OAAO,CAAC,KAAK,CAAC;IACrD,MAAM,MAAM,GAAG,MAAM,EAAE,SAAS,IAAI,WAAW,CAAC;IAChD,MAAM,KAAK,GAAa,MAAM,EAAE,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAEhF,MAAM,SAAS,GAAG,CAAC,MAAgB,EAAW,EAAE,CAC9C,WAAW,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;IAE5C,OAAO;QACL,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,GAAG;QACb,OAAO,CAAC,KAAK;YACX,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;gBAChD,GAAG,CAAC,GAAG,MAAM,eAAe,CAAC,CAAC;gBAC9B,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;oBACvB,GAAG,CAAC,GAAG,MAAM,cAAc,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAChF,CAAC;YACH,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;gBAC/C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;oBAAE,OAAO;gBAChC,GAAG,CAAC,GAAG,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,WAAW,CAAC,CAAC;YAClE,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;gBAC9C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;oBAAE,OAAO;gBAChC,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,SAAS,CAAC;gBACnD,IAAI,KAAK,EAAE,MAAM,EAAE,CAAC;oBAClB,GAAG,CAAC,GAAG,MAAM,2BAA2B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACjF,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,GAAG,MAAM,gCAAgC,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;gBAChD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;oBAAE,OAAO;gBAChC,GAAG,CAAC,GAAG,MAAM,oBAAoB,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YACzD,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;gBAC/C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;oBAAE,OAAO;gBAChC,GAAG,CAAC,GAAG,MAAM,iBAAiB,GAAG,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;YAC3D,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;gBAC7C,KAAK,CAAC,GAAG,MAAM,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;YACvC,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;gBAC/C,GAAG,CAAC,GAAG,MAAM,mBAAmB,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;YACrE,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "logging",
3
+ "description": "Logs each lifecycle stage. High priority so before-hooks see raw state before other extensions mutate it.",
4
+ "enabled": true,
5
+ "priority": 100,
6
+ "configKeys": ["logFunction", "errorFunction", "logPrefix", "level"]
7
+ }
@@ -0,0 +1,3 @@
1
+ export { default as createLoggerExtension } from './extension.js';
2
+ export type { LoggingExtensionConfig, LogLevel } from './extension.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/extras/extensions/logger/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAClE,YAAY,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { default as createLoggerExtension } from './extension.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/extras/extensions/logger/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,63 @@
1
+ import type { Extension } from '../../../extension.js';
2
+ /**
3
+ * Config for the MCP extension.
4
+ *
5
+ * Passed by the extension loader from the host's config object.
6
+ * The key `mcpConfigPaths` should be declared in extension.json's `configKeys`.
7
+ */
8
+ export interface McpExtensionConfig {
9
+ /** One or more MCP server config file paths. */
10
+ mcpConfigPaths?: string | string[];
11
+ /**
12
+ * Tool names to exclude from being registered on the agent. Each entry
13
+ * is matched against the full namespaced tool name (`serverName__toolName`)
14
+ * using RegExp test(). Tools that match are never registered — they're
15
+ * not on the agent, not in the LLM context, and not callable.
16
+ *
17
+ * Examples:
18
+ * - `['slack__slack_send_message']` — exact match
19
+ * - ['crm__delete_.*']` — all CRM delete tools
20
+ * - ['slack__.*']` — all Slack MCP tools
21
+ */
22
+ excludeTools?: string[];
23
+ }
24
+ /**
25
+ * MCP extension factory.
26
+ *
27
+ * Receives config from the extension loader. The `mcpConfigPaths` key (a
28
+ * path or array of paths) tells the extension where to find MCP server
29
+ * config files. Each config file is a JSON file with an `mcpServers`
30
+ * object (compatible with Claude Desktop, Cursor, etc.). Servers from all
31
+ * configs are merged — if two configs define the same server name, the
32
+ * last one wins.
33
+ *
34
+ * If no `mcpConfigPaths` is provided or none of the files exist, the
35
+ * factory returns `undefined` (opts out).
36
+ *
37
+ * Uses `versionNegotiation: { mode: 'auto' }` so each client dynamically
38
+ * supports both 2025-era and 2026-era servers. Tools are namespaced as
39
+ * `serverName__toolName` to avoid collisions.
40
+ *
41
+ * The returned extension has a `close()` method for cleaning up MCP
42
+ * client connections — call it during shutdown.
43
+ *
44
+ * ## Runtime reload
45
+ *
46
+ * MCP tools are NOT registered on the agent at install time. Instead, a
47
+ * `beforeTurn` hook checks config file mtimes on every turn. If any
48
+ * config file changed (new server added, server removed, server
49
+ * modified), the extension reconnects: closes old clients, opens new
50
+ * ones, and rediscovers tools/resources/prompts. The current set of
51
+ * MCP tools is then injected into `turn.tools` for that turn.
52
+ *
53
+ * This means editing `mcpServers.json` takes effect on the next agent
54
+ * turn — no restart needed. The mtime check is cheap (stat only); the
55
+ * expensive reconnect only happens when config actually changes.
56
+ *
57
+ * Meta-tools (`list_resources`, `read_resource`, `list_prompts`,
58
+ * `use_prompt`) are registered at install time and always available.
59
+ * They read from live state, so they reflect the current set of
60
+ * connected servers even after a reload.
61
+ */
62
+ export default function createMcpExtension(config?: McpExtensionConfig): Promise<Extension | undefined>;
63
+ //# sourceMappingURL=extension.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.d.ts","sourceRoot":"","sources":["../../../../src/extras/extensions/mcp/extension.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAyEvD;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,gDAAgD;IAChD,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACnC;;;;;;;;;;OAUG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAA8B,kBAAkB,CAC9C,MAAM,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAgZhC"}
@@ -0,0 +1,437 @@
1
+ import { Client, StreamableHTTPClientTransport, SSEClientTransport } from '@modelcontextprotocol/client';
2
+ import { StdioClientTransport } from '@modelcontextprotocol/client/stdio';
3
+ import { readFileSync, existsSync, statSync } from 'node:fs';
4
+ function inferType(server) {
5
+ if (server.type)
6
+ return server.type;
7
+ if (server.command)
8
+ return 'stdio';
9
+ if (server.url)
10
+ return 'http';
11
+ throw new Error('Cannot infer MCP server type: provide "type", "command", or "url"');
12
+ }
13
+ function createTransport(server) {
14
+ const type = inferType(server);
15
+ switch (type) {
16
+ case 'stdio': {
17
+ if (!server.command)
18
+ throw new Error('stdio MCP server requires "command"');
19
+ return new StdioClientTransport({
20
+ command: server.command,
21
+ args: server.args,
22
+ env: server.env,
23
+ });
24
+ }
25
+ case 'http': {
26
+ if (!server.url)
27
+ throw new Error('http MCP server requires "url"');
28
+ return new StreamableHTTPClientTransport(new URL(server.url), {
29
+ ...(server.headers && { requestInit: { headers: server.headers } }),
30
+ ...(server.authToken && {
31
+ authProvider: {
32
+ token: async () => server.authToken,
33
+ },
34
+ }),
35
+ });
36
+ }
37
+ case 'sse': {
38
+ if (!server.url)
39
+ throw new Error('sse MCP server requires "url"');
40
+ return new SSEClientTransport(new URL(server.url), {
41
+ ...(server.headers && { requestInit: { headers: server.headers } }),
42
+ });
43
+ }
44
+ default:
45
+ throw new Error(`Unknown MCP transport type: ${type}`);
46
+ }
47
+ }
48
+ /**
49
+ * MCP extension factory.
50
+ *
51
+ * Receives config from the extension loader. The `mcpConfigPaths` key (a
52
+ * path or array of paths) tells the extension where to find MCP server
53
+ * config files. Each config file is a JSON file with an `mcpServers`
54
+ * object (compatible with Claude Desktop, Cursor, etc.). Servers from all
55
+ * configs are merged — if two configs define the same server name, the
56
+ * last one wins.
57
+ *
58
+ * If no `mcpConfigPaths` is provided or none of the files exist, the
59
+ * factory returns `undefined` (opts out).
60
+ *
61
+ * Uses `versionNegotiation: { mode: 'auto' }` so each client dynamically
62
+ * supports both 2025-era and 2026-era servers. Tools are namespaced as
63
+ * `serverName__toolName` to avoid collisions.
64
+ *
65
+ * The returned extension has a `close()` method for cleaning up MCP
66
+ * client connections — call it during shutdown.
67
+ *
68
+ * ## Runtime reload
69
+ *
70
+ * MCP tools are NOT registered on the agent at install time. Instead, a
71
+ * `beforeTurn` hook checks config file mtimes on every turn. If any
72
+ * config file changed (new server added, server removed, server
73
+ * modified), the extension reconnects: closes old clients, opens new
74
+ * ones, and rediscovers tools/resources/prompts. The current set of
75
+ * MCP tools is then injected into `turn.tools` for that turn.
76
+ *
77
+ * This means editing `mcpServers.json` takes effect on the next agent
78
+ * turn — no restart needed. The mtime check is cheap (stat only); the
79
+ * expensive reconnect only happens when config actually changes.
80
+ *
81
+ * Meta-tools (`list_resources`, `read_resource`, `list_prompts`,
82
+ * `use_prompt`) are registered at install time and always available.
83
+ * They read from live state, so they reflect the current set of
84
+ * connected servers even after a reload.
85
+ */
86
+ export default async function createMcpExtension(config) {
87
+ const configPaths = config?.mcpConfigPaths;
88
+ if (!configPaths) {
89
+ console.log('[mcp] no mcpConfigPaths in config — skipping MCP extension');
90
+ return undefined;
91
+ }
92
+ const paths = Array.isArray(configPaths) ? configPaths : [configPaths];
93
+ const excludePatterns = (config?.excludeTools ?? []).map((p) => new RegExp(p));
94
+ // ── Live state ───────────────────────────────────────────────────
95
+ // These arrays are mutated by connectAll() — cleared and repopulated
96
+ // on each reload. Meta-tools and buildMcpTools() read from them, so
97
+ // they always reflect the current set of connected servers.
98
+ const clients = [];
99
+ const discoveredTools = [];
100
+ const discoveredResources = [];
101
+ const discoveredPrompts = [];
102
+ // Config mtimes for change detection. Keyed by config path.
103
+ // If a path's mtime changes (or the file appears/disappears), we
104
+ // trigger a reload on the next turn.
105
+ const configMtimes = new Map();
106
+ /**
107
+ * Read and merge all config files, returning the merged server map.
108
+ * Also updates configMtimes for change detection.
109
+ */
110
+ function loadMergedServers() {
111
+ const merged = {};
112
+ configMtimes.clear();
113
+ for (const configPath of paths) {
114
+ if (!existsSync(configPath)) {
115
+ configMtimes.set(configPath, -1); // track non-existence
116
+ continue;
117
+ }
118
+ const raw = readFileSync(configPath, 'utf-8');
119
+ const parsed = JSON.parse(raw);
120
+ if (!parsed.mcpServers || typeof parsed.mcpServers !== 'object') {
121
+ throw new Error(`Invalid MCP config: missing "mcpServers" object in ${configPath}`);
122
+ }
123
+ Object.assign(merged, parsed.mcpServers);
124
+ configMtimes.set(configPath, statSync(configPath).mtimeMs);
125
+ }
126
+ return merged;
127
+ }
128
+ /**
129
+ * Check if any config file changed since the last loadMergedServers().
130
+ * Returns true if a reload is needed.
131
+ */
132
+ function configChanged() {
133
+ for (const [configPath, knownMtime] of configMtimes) {
134
+ try {
135
+ if (!existsSync(configPath)) {
136
+ if (knownMtime !== -1)
137
+ return true; // file was deleted
138
+ continue;
139
+ }
140
+ const currentMtime = statSync(configPath).mtimeMs;
141
+ if (currentMtime !== knownMtime)
142
+ return true;
143
+ }
144
+ catch {
145
+ return true; // stat failed — assume changed
146
+ }
147
+ }
148
+ return false;
149
+ }
150
+ /**
151
+ * Connect to all configured servers, discover tools/resources/prompts.
152
+ * Closes existing clients first. Safe to call repeatedly.
153
+ */
154
+ async function connectAll() {
155
+ // Tear down existing connections.
156
+ await Promise.all(clients.map(({ client }) => client.close().catch(() => { })));
157
+ clients.length = 0;
158
+ discoveredTools.length = 0;
159
+ discoveredResources.length = 0;
160
+ discoveredPrompts.length = 0;
161
+ const mergedServers = loadMergedServers();
162
+ const serverNames = Object.keys(mergedServers);
163
+ if (serverNames.length === 0) {
164
+ console.log('[mcp] no server configs found');
165
+ return;
166
+ }
167
+ console.log(`[mcp] connecting to ${serverNames.length} server(s): ${serverNames.join(', ')}`);
168
+ for (const [name, server] of Object.entries(mergedServers)) {
169
+ try {
170
+ const transport = createTransport(server);
171
+ const client = new Client({ name: 'libra-example', version: '1.0.0' }, { versionNegotiation: { mode: 'auto' } });
172
+ await client.connect(transport);
173
+ clients.push({ client, name });
174
+ const { tools } = await client.listTools();
175
+ for (const tool of tools) {
176
+ discoveredTools.push({
177
+ serverName: name,
178
+ toolName: tool.name,
179
+ description: tool.description,
180
+ inputSchema: tool.inputSchema ?? { type: 'object', properties: {} },
181
+ client,
182
+ });
183
+ }
184
+ // Discover resources (reference docs, data sources).
185
+ try {
186
+ const { resources } = await client.listResources();
187
+ for (const res of resources) {
188
+ discoveredResources.push({
189
+ serverName: name,
190
+ uri: res.uri,
191
+ name: res.name,
192
+ description: res.description,
193
+ mimeType: res.mimeType,
194
+ client,
195
+ });
196
+ }
197
+ }
198
+ catch {
199
+ // Server may not support resources — that's fine.
200
+ }
201
+ // Discover prompts (templated workflows).
202
+ try {
203
+ const { prompts } = await client.listPrompts();
204
+ for (const p of prompts) {
205
+ discoveredPrompts.push({
206
+ serverName: name,
207
+ promptName: p.name,
208
+ description: p.description,
209
+ client,
210
+ });
211
+ }
212
+ }
213
+ catch {
214
+ // Server may not support prompts — that's fine.
215
+ }
216
+ const resCount = discoveredResources.filter((r) => r.serverName === name).length;
217
+ const promptCount = discoveredPrompts.filter((p) => p.serverName === name).length;
218
+ console.log(`[mcp] ${name}: ${tools.length} tool(s)${resCount > 0 ? `, ${resCount} resource(s)` : ''}${promptCount > 0 ? `, ${promptCount} prompt(s)` : ''}` +
219
+ (tools.length > 0 ? ' — ' + tools.map((t) => t.name).join(', ') : ''));
220
+ }
221
+ catch (err) {
222
+ // Don't let one broken MCP server abort the whole extension.
223
+ const msg = err instanceof Error ? err.message : String(err);
224
+ console.error(`[mcp] failed to connect to "${name}": ${msg}`);
225
+ }
226
+ }
227
+ console.log(`[mcp] total: ${discoveredTools.length} tool(s)` +
228
+ (discoveredResources.length > 0 ? `, ${discoveredResources.length} resource(s)` : '') +
229
+ (discoveredPrompts.length > 0 ? `, ${discoveredPrompts.length} prompt(s)` : '') +
230
+ ` from ${clients.length} server(s)`);
231
+ }
232
+ // Initial connection.
233
+ await connectAll();
234
+ if (clients.length === 0) {
235
+ console.log('[mcp] no servers connected — skipping MCP extension');
236
+ return undefined;
237
+ }
238
+ /**
239
+ * Build Tool[] from discovered tools, applying excludePatterns.
240
+ * Called on each turn to inject current MCP tools into turn.tools.
241
+ */
242
+ function buildMcpTools() {
243
+ return discoveredTools
244
+ .filter((dt) => !excludePatterns.some((re) => re.test(`${dt.serverName}__${dt.toolName}`)))
245
+ .map((dt) => ({
246
+ name: `${dt.serverName}__${dt.toolName}`,
247
+ description: dt.description,
248
+ parameters: dt.inputSchema,
249
+ async execute(args) {
250
+ const result = await dt.client.callTool({
251
+ name: dt.toolName,
252
+ arguments: args,
253
+ });
254
+ const text = (result.content ?? [])
255
+ .filter((c) => c.type === 'text')
256
+ .map((c) => c.text ?? '')
257
+ .join('\n');
258
+ return {
259
+ toolCallId: '',
260
+ content: text || JSON.stringify(result.content),
261
+ };
262
+ },
263
+ }));
264
+ }
265
+ const extension = {
266
+ name: 'mcp',
267
+ priority: 50,
268
+ install(agent) {
269
+ // ── beforeTurn: reload on config change + inject tools ──────
270
+ // On every turn, check if config files changed. If so, reconnect.
271
+ // Then inject the current set of MCP tools into turn.tools so
272
+ // the LLM can call them this turn.
273
+ agent.hook('beforeTurn', 'mcp', async (ctx) => {
274
+ if (configChanged()) {
275
+ console.log('[mcp] config changed — reloading servers');
276
+ await connectAll();
277
+ }
278
+ const mcpTools = buildMcpTools();
279
+ if (mcpTools.length > 0) {
280
+ ctx.turn.tools.push(...mcpTools);
281
+ }
282
+ });
283
+ // ── Resources ────────────────────────────────────────────────
284
+ // Meta-tools are registered at install time and always available.
285
+ // They read from the live discoveredResources array, so they
286
+ // reflect the current set of connected servers even after reload.
287
+ agent.tool({
288
+ name: 'list_resources',
289
+ description: 'List available MCP resources (reference docs, data sources) ' +
290
+ 'from connected servers. Use this to discover what reference ' +
291
+ 'material is available, then call read_resource to read one.',
292
+ parameters: { type: 'object', properties: {} },
293
+ async execute() {
294
+ if (discoveredResources.length === 0) {
295
+ return { toolCallId: '', content: 'No resources available.' };
296
+ }
297
+ const lines = discoveredResources.map((r) => `- ${r.serverName}://${r.uri}: ${r.name}` +
298
+ (r.description ? ` — ${r.description}` : ''));
299
+ return {
300
+ toolCallId: '',
301
+ content: `Available resources (${discoveredResources.length}):\n${lines.join('\n')}`,
302
+ };
303
+ },
304
+ });
305
+ agent.tool({
306
+ name: 'read_resource',
307
+ description: 'Read an MCP resource by its URI. Returns the resource content ' +
308
+ '(typically markdown or text). Use list_resources first to see ' +
309
+ 'available URIs.',
310
+ parameters: {
311
+ type: 'object',
312
+ properties: {
313
+ uri: {
314
+ type: 'string',
315
+ description: 'The resource URI to read (e.g. "pave://job-statuses").',
316
+ },
317
+ },
318
+ required: ['uri'],
319
+ },
320
+ async execute(args) {
321
+ const uri = args.uri;
322
+ const res = discoveredResources.find((r) => r.uri === uri || r.uri.endsWith(uri));
323
+ if (!res) {
324
+ const available = discoveredResources.map((r) => r.uri).join(', ');
325
+ return {
326
+ toolCallId: '',
327
+ content: `Resource "${uri}" not found. Available: ${available || '(none)'}`,
328
+ isError: true,
329
+ };
330
+ }
331
+ try {
332
+ const result = await res.client.readResource({ uri: res.uri });
333
+ const text = (result.contents ?? [])
334
+ .map((c) => c.text ?? `[${c.uri}]`)
335
+ .join('\n');
336
+ return { toolCallId: '', content: text || '(empty resource)' };
337
+ }
338
+ catch (err) {
339
+ const msg = err instanceof Error ? err.message : String(err);
340
+ return { toolCallId: '', content: `Failed to read resource: ${msg}`, isError: true };
341
+ }
342
+ },
343
+ });
344
+ // ── Prompts ──────────────────────────────────────────────────
345
+ agent.tool({
346
+ name: 'list_prompts',
347
+ description: 'List available MCP prompts (templated workflows) from ' +
348
+ 'connected servers. Use this to discover pre-built workflows, ' +
349
+ 'then call use_prompt to invoke one.',
350
+ parameters: { type: 'object', properties: {} },
351
+ async execute() {
352
+ if (discoveredPrompts.length === 0) {
353
+ return { toolCallId: '', content: 'No prompts available.' };
354
+ }
355
+ const lines = discoveredPrompts.map((p) => `- ${p.serverName}__${p.promptName}` +
356
+ (p.description ? ` — ${p.description}` : ''));
357
+ return {
358
+ toolCallId: '',
359
+ content: `Available prompts (${discoveredPrompts.length}):\n${lines.join('\n')}`,
360
+ };
361
+ },
362
+ });
363
+ agent.tool({
364
+ name: 'use_prompt',
365
+ description: 'Invoke an MCP prompt by name. Returns the generated prompt ' +
366
+ 'text — follow the instructions in it to complete the task. ' +
367
+ 'Use list_prompts first to see available prompt names.',
368
+ parameters: {
369
+ type: 'object',
370
+ properties: {
371
+ name: {
372
+ type: 'string',
373
+ description: 'The prompt name (e.g. "crm__account-summary").',
374
+ },
375
+ args: {
376
+ type: 'object',
377
+ description: 'Arguments for the prompt (e.g. { "accountId": "account-123" }).',
378
+ additionalProperties: true,
379
+ },
380
+ },
381
+ required: ['name'],
382
+ },
383
+ async execute(args) {
384
+ const name = args.name;
385
+ // Accept "server__prompt" or just "prompt" (if unambiguous).
386
+ let prompt = discoveredPrompts.find((p) => `${p.serverName}__${p.promptName}` === name);
387
+ if (!prompt) {
388
+ const matches = discoveredPrompts.filter((p) => p.promptName === name);
389
+ if (matches.length === 1)
390
+ prompt = matches[0];
391
+ else if (matches.length > 1) {
392
+ return {
393
+ toolCallId: '',
394
+ content: `Ambiguous prompt name "${name}". Use server__prompt format. Matches: ${matches.map((m) => `${m.serverName}__${m.promptName}`).join(', ')}`,
395
+ isError: true,
396
+ };
397
+ }
398
+ }
399
+ if (!prompt) {
400
+ const available = discoveredPrompts.map((p) => `${p.serverName}__${p.promptName}`).join(', ');
401
+ return {
402
+ toolCallId: '',
403
+ content: `Prompt "${name}" not found. Available: ${available || '(none)'}`,
404
+ isError: true,
405
+ };
406
+ }
407
+ try {
408
+ const promptArgs = args.args ?? {};
409
+ const result = await prompt.client.getPrompt({
410
+ name: prompt.promptName,
411
+ arguments: promptArgs,
412
+ });
413
+ const text = (result.messages ?? [])
414
+ .map((m) => {
415
+ if (typeof m.content === 'string')
416
+ return m.content;
417
+ if (m.content?.type === 'text')
418
+ return m.content.text ?? '';
419
+ return '';
420
+ })
421
+ .join('\n');
422
+ return { toolCallId: '', content: text || '(empty prompt)' };
423
+ }
424
+ catch (err) {
425
+ const msg = err instanceof Error ? err.message : String(err);
426
+ return { toolCallId: '', content: `Failed to invoke prompt: ${msg}`, isError: true };
427
+ }
428
+ },
429
+ });
430
+ },
431
+ async close() {
432
+ await Promise.all(clients.map(({ client }) => client.close()));
433
+ },
434
+ };
435
+ return extension;
436
+ }
437
+ //# sourceMappingURL=extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.js","sourceRoot":"","sources":["../../../../src/extras/extensions/mcp/extension.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,6BAA6B,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACzG,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AA6B7D,SAAS,SAAS,CAAC,MAAuB;IACxC,IAAI,MAAM,CAAC,IAAI;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC;IACpC,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC;IACnC,IAAI,MAAM,CAAC,GAAG;QAAE,OAAO,MAAM,CAAC;IAC9B,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;AACvF,CAAC;AAED,SAAS,eAAe,CAAC,MAAuB;IAC9C,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAC/B,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;YAC5E,OAAO,IAAI,oBAAoB,CAAC;gBAC9B,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,GAAG,EAAE,MAAM,CAAC,GAAG;aAChB,CAAC,CAAC;QACL,CAAC;QACD,KAAK,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;YACnE,OAAO,IAAI,6BAA6B,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;gBAC5D,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;gBACnE,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI;oBACtB,YAAY,EAAE;wBACZ,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC,SAAU;qBACrC;iBACF,CAAC;aACH,CAAC,CAAC;QACL,CAAC;QACD,KAAK,KAAK,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAClE,OAAO,IAAI,kBAAkB,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;gBACjD,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;aACpE,CAAC,CAAC;QACL,CAAC;QACD;YACE,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAyBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,kBAAkB,CAC9C,MAA2B;IAE3B,MAAM,WAAW,GAAG,MAAM,EAAE,cAAc,CAAC;IAC3C,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;QAC1E,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IACvE,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,YAAY,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAE/E,oEAAoE;IACpE,qEAAqE;IACrE,oEAAoE;IACpE,4DAA4D;IAC5D,MAAM,OAAO,GAA4C,EAAE,CAAC;IAC5D,MAAM,eAAe,GAMhB,EAAE,CAAC;IACR,MAAM,mBAAmB,GAOpB,EAAE,CAAC;IACR,MAAM,iBAAiB,GAKlB,EAAE,CAAC;IAER,4DAA4D;IAC5D,iEAAiE;IACjE,qCAAqC;IACrC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE/C;;;OAGG;IACH,SAAS,iBAAiB;QACxB,MAAM,MAAM,GAAoC,EAAE,CAAC;QACnD,YAAY,CAAC,KAAK,EAAE,CAAC;QACrB,KAAK,MAAM,UAAU,IAAI,KAAK,EAAE,CAAC;YAC/B,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC5B,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,sBAAsB;gBACxD,SAAS;YACX,CAAC;YACD,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAqB,CAAC;YACnD,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;gBAChE,MAAM,IAAI,KAAK,CAAC,sDAAsD,UAAU,EAAE,CAAC,CAAC;YACtF,CAAC;YACD,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YACzC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACH,SAAS,aAAa;QACpB,KAAK,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,IAAI,YAAY,EAAE,CAAC;YACpD,IAAI,CAAC;gBACH,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC5B,IAAI,UAAU,KAAK,CAAC,CAAC;wBAAE,OAAO,IAAI,CAAC,CAAC,mBAAmB;oBACvD,SAAS;gBACX,CAAC;gBACD,MAAM,YAAY,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC;gBAClD,IAAI,YAAY,KAAK,UAAU;oBAAE,OAAO,IAAI,CAAC;YAC/C,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC,CAAC,+BAA+B;YAC9C,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACH,KAAK,UAAU,UAAU;QACvB,kCAAkC;QAClC,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAC5D,CAAC;QACF,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QACnB,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3B,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC;QAC/B,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC;QAE7B,MAAM,aAAa,GAAG,iBAAiB,EAAE,CAAC;QAC1C,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAE/C,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,uBAAuB,WAAW,CAAC,MAAM,eAAe,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE9F,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;YAC3D,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;gBAC1C,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,EAC3C,EAAE,kBAAkB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CACzC,CAAC;gBAEF,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBAChC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBAE/B,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;gBAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,eAAe,CAAC,IAAI,CAAC;wBACnB,UAAU,EAAE,IAAI;wBAChB,QAAQ,EAAE,IAAI,CAAC,IAAI;wBACnB,WAAW,EAAE,IAAI,CAAC,WAAW;wBAC7B,WAAW,EAAG,IAAI,CAAC,WAAuC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;wBAChG,MAAM;qBACP,CAAC,CAAC;gBACL,CAAC;gBAED,qDAAqD;gBACrD,IAAI,CAAC;oBACH,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;oBACnD,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;wBAC5B,mBAAmB,CAAC,IAAI,CAAC;4BACvB,UAAU,EAAE,IAAI;4BAChB,GAAG,EAAE,GAAG,CAAC,GAAG;4BACZ,IAAI,EAAE,GAAG,CAAC,IAAI;4BACd,WAAW,EAAE,GAAG,CAAC,WAAW;4BAC5B,QAAQ,EAAE,GAAG,CAAC,QAAQ;4BACtB,MAAM;yBACP,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,kDAAkD;gBACpD,CAAC;gBAED,0CAA0C;gBAC1C,IAAI,CAAC;oBACH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;oBAC/C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;wBACxB,iBAAiB,CAAC,IAAI,CAAC;4BACrB,UAAU,EAAE,IAAI;4BAChB,UAAU,EAAE,CAAC,CAAC,IAAI;4BAClB,WAAW,EAAE,CAAC,CAAC,WAAW;4BAC1B,MAAM;yBACP,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,gDAAgD;gBAClD,CAAC;gBAED,MAAM,QAAQ,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC;gBACjF,MAAM,WAAW,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC;gBAClF,OAAO,CAAC,GAAG,CACT,SAAS,IAAI,KAAK,KAAK,CAAC,MAAM,WAAW,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ,cAAc,CAAC,CAAC,CAAC,EAAE,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,WAAW,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE;oBAC9I,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAC1F,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,6DAA6D;gBAC7D,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,OAAO,CAAC,KAAK,CAAC,+BAA+B,IAAI,MAAM,GAAG,EAAE,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CACT,gBAAgB,eAAe,CAAC,MAAM,UAAU;YAC9C,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,mBAAmB,CAAC,MAAM,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;YACrF,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,iBAAiB,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/E,SAAS,OAAO,CAAC,MAAM,YAAY,CACtC,CAAC;IACJ,CAAC;IAED,sBAAsB;IACtB,MAAM,UAAU,EAAE,CAAC;IAEnB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;QACnE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,SAAS,aAAa;QACpB,OAAO,eAAe;aACnB,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,KAAK,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;aAC1F,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACZ,IAAI,EAAE,GAAG,EAAE,CAAC,UAAU,KAAK,EAAE,CAAC,QAAQ,EAAE;YACxC,WAAW,EAAE,EAAE,CAAC,WAAW;YAC3B,UAAU,EAAE,EAAE,CAAC,WAAW;YAC1B,KAAK,CAAC,OAAO,CAAC,IAAI;gBAChB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC;oBACtC,IAAI,EAAE,EAAE,CAAC,QAAQ;oBACjB,SAAS,EAAE,IAAI;iBAChB,CAAC,CAAC;gBACH,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;qBAChC,MAAM,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;qBAClD,GAAG,CAAC,CAAC,CAAkC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;qBACzD,IAAI,CAAC,IAAI,CAAC,CAAC;gBACd,OAAO;oBACL,UAAU,EAAE,EAAE;oBACd,OAAO,EAAE,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC;iBAChD,CAAC;YACJ,CAAC;SACF,CAAC,CAAC,CAAC;IACR,CAAC;IAED,MAAM,SAAS,GAA2C;QACxD,IAAI,EAAE,KAAK;QACX,QAAQ,EAAE,EAAE;QACZ,OAAO,CAAC,KAAK;YACX,+DAA+D;YAC/D,kEAAkE;YAClE,8DAA8D;YAC9D,mCAAmC;YACnC,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;gBAC5C,IAAI,aAAa,EAAE,EAAE,CAAC;oBACpB,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;oBACxD,MAAM,UAAU,EAAE,CAAC;gBACrB,CAAC;gBACD,MAAM,QAAQ,GAAG,aAAa,EAAE,CAAC;gBACjC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACxB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,gEAAgE;YAChE,kEAAkE;YAClE,6DAA6D;YAC7D,kEAAkE;YAClE,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,gBAAgB;gBACtB,WAAW,EACT,8DAA8D;oBAC9D,8DAA8D;oBAC9D,6DAA6D;gBAC/D,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;gBAC9C,KAAK,CAAC,OAAO;oBACX,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBACrC,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC;oBAChE,CAAC;oBACD,MAAM,KAAK,GAAG,mBAAmB,CAAC,GAAG,CACnC,CAAC,CAAC,EAAE,EAAE,CACJ,KAAK,CAAC,CAAC,UAAU,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE;wBACzC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAC/C,CAAC;oBACF,OAAO;wBACL,UAAU,EAAE,EAAE;wBACd,OAAO,EAAE,wBAAwB,mBAAmB,CAAC,MAAM,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;qBACrF,CAAC;gBACJ,CAAC;aACF,CAAC,CAAC;YAEH,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,eAAe;gBACrB,WAAW,EACT,gEAAgE;oBAChE,gEAAgE;oBAChE,iBAAiB;gBACnB,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,GAAG,EAAE;4BACH,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,wDAAwD;yBACtE;qBACF;oBACD,QAAQ,EAAE,CAAC,KAAK,CAAC;iBAClB;gBACD,KAAK,CAAC,OAAO,CAAC,IAAI;oBAChB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAa,CAAC;oBAC/B,MAAM,GAAG,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;oBAClF,IAAI,CAAC,GAAG,EAAE,CAAC;wBACT,MAAM,SAAS,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBACnE,OAAO;4BACL,UAAU,EAAE,EAAE;4BACd,OAAO,EAAE,aAAa,GAAG,2BAA2B,SAAS,IAAI,QAAQ,EAAE;4BAC3E,OAAO,EAAE,IAAI;yBACd,CAAC;oBACJ,CAAC;oBACD,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;wBAC/D,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;6BACjC,GAAG,CAAC,CAAC,CAAkC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;6BACnE,IAAI,CAAC,IAAI,CAAC,CAAC;wBACd,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,IAAI,kBAAkB,EAAE,CAAC;oBACjE,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;wBAC7D,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,4BAA4B,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;oBACvF,CAAC;gBACH,CAAC;aACF,CAAC,CAAC;YAEH,gEAAgE;YAChE,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,cAAc;gBACpB,WAAW,EACT,wDAAwD;oBACxD,+DAA+D;oBAC/D,qCAAqC;gBACvC,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;gBAC9C,KAAK,CAAC,OAAO;oBACX,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBACnC,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC;oBAC9D,CAAC;oBACD,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,CACjC,CAAC,CAAC,EAAE,EAAE,CACJ,KAAK,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU,EAAE;wBACpC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAC/C,CAAC;oBACF,OAAO;wBACL,UAAU,EAAE,EAAE;wBACd,OAAO,EAAE,sBAAsB,iBAAiB,CAAC,MAAM,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;qBACjF,CAAC;gBACJ,CAAC;aACF,CAAC,CAAC;YAEH,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,YAAY;gBAClB,WAAW,EACT,6DAA6D;oBAC7D,6DAA6D;oBAC7D,uDAAuD;gBACzD,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,IAAI,EAAE;4BACJ,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,gDAAgD;yBAC9D;wBACD,IAAI,EAAE;4BACJ,IAAI,EAAE,QAAQ;4BACd,WAAW,EAAE,iEAAiE;4BAC9E,oBAAoB,EAAE,IAAI;yBAC3B;qBACF;oBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;iBACnB;gBACD,KAAK,CAAC,OAAO,CAAC,IAAI;oBAChB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAc,CAAC;oBACjC,6DAA6D;oBAC7D,IAAI,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU,EAAE,KAAK,IAAI,CAAC,CAAC;oBACxF,IAAI,CAAC,MAAM,EAAE,CAAC;wBACZ,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC;wBACvE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;4BAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;6BACzC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BAC5B,OAAO;gCACL,UAAU,EAAE,EAAE;gCACd,OAAO,EAAE,0BAA0B,IAAI,0CAA0C,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gCACpJ,OAAO,EAAE,IAAI;6BACd,CAAC;wBACJ,CAAC;oBACH,CAAC;oBACD,IAAI,CAAC,MAAM,EAAE,CAAC;wBACZ,MAAM,SAAS,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBAC9F,OAAO;4BACL,UAAU,EAAE,EAAE;4BACd,OAAO,EAAE,WAAW,IAAI,2BAA2B,SAAS,IAAI,QAAQ,EAAE;4BAC1E,OAAO,EAAE,IAAI;yBACd,CAAC;oBACJ,CAAC;oBACD,IAAI,CAAC;wBACH,MAAM,UAAU,GAAI,IAAI,CAAC,IAA+B,IAAI,EAAE,CAAC;wBAC/D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;4BAC3C,IAAI,EAAE,MAAM,CAAC,UAAU;4BACvB,SAAS,EAAE,UAAU;yBACtB,CAAC,CAAC;wBACH,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;6BACjC,GAAG,CAAC,CAAC,CAAyD,EAAE,EAAE;4BACjE,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ;gCAAE,OAAO,CAAC,CAAC,OAAO,CAAC;4BACpD,IAAI,CAAC,CAAC,OAAO,EAAE,IAAI,KAAK,MAAM;gCAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;4BAC5D,OAAO,EAAE,CAAC;wBACZ,CAAC,CAAC;6BACD,IAAI,CAAC,IAAI,CAAC,CAAC;wBACd,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,IAAI,gBAAgB,EAAE,CAAC;oBAC/D,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;wBAC7D,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,4BAA4B,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;oBACvF,CAAC;gBACH,CAAC;aACF,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,KAAK;YACT,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACjE,CAAC;KACF,CAAC;IAEF,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "mcp",
3
+ "description": "Connects to MCP servers (stdio/http/sse) and registers their tools. Reads MCP server config from JSON files.",
4
+ "enabled": true,
5
+ "priority": 50,
6
+ "configKeys": ["mcpConfigPaths", "excludeTools"]
7
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=extension.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.test.d.ts","sourceRoot":"","sources":["../../../../src/extras/extensions/mcp/extension.test.ts"],"names":[],"mappings":""}