@rithamnatani/agentmux 1.5.39

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 (235) hide show
  1. package/README.md +440 -0
  2. package/dist/clientFilter.d.ts +5 -0
  3. package/dist/clientFilter.d.ts.map +1 -0
  4. package/dist/clientFilter.js +31 -0
  5. package/dist/clientFilter.js.map +1 -0
  6. package/dist/config.d.ts +28 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +112 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/constants.d.ts +115 -0
  11. package/dist/constants.d.ts.map +1 -0
  12. package/dist/constants.js +118 -0
  13. package/dist/constants.js.map +1 -0
  14. package/dist/execution.d.ts +23 -0
  15. package/dist/execution.d.ts.map +1 -0
  16. package/dist/execution.js +2 -0
  17. package/dist/execution.js.map +1 -0
  18. package/dist/httpServer.d.ts +12 -0
  19. package/dist/httpServer.d.ts.map +1 -0
  20. package/dist/httpServer.js +323 -0
  21. package/dist/httpServer.js.map +1 -0
  22. package/dist/index.d.ts +3 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +98 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/logger.d.ts +19 -0
  27. package/dist/logger.d.ts.map +1 -0
  28. package/dist/logger.js +172 -0
  29. package/dist/logger.js.map +1 -0
  30. package/dist/modelCatalog.d.ts +15 -0
  31. package/dist/modelCatalog.d.ts.map +1 -0
  32. package/dist/modelCatalog.generated.json +80 -0
  33. package/dist/modelCatalog.js +81 -0
  34. package/dist/modelCatalog.js.map +1 -0
  35. package/dist/router/config.d.ts +13 -0
  36. package/dist/router/config.d.ts.map +1 -0
  37. package/dist/router/config.js +198 -0
  38. package/dist/router/config.js.map +1 -0
  39. package/dist/router/defaultConfig.d.ts +13 -0
  40. package/dist/router/defaultConfig.d.ts.map +1 -0
  41. package/dist/router/defaultConfig.js +82 -0
  42. package/dist/router/defaultConfig.js.map +1 -0
  43. package/dist/router/executor.d.ts +35 -0
  44. package/dist/router/executor.d.ts.map +1 -0
  45. package/dist/router/executor.js +189 -0
  46. package/dist/router/executor.js.map +1 -0
  47. package/dist/router/modelMetadata.d.ts +5 -0
  48. package/dist/router/modelMetadata.d.ts.map +1 -0
  49. package/dist/router/modelMetadata.js +81 -0
  50. package/dist/router/modelMetadata.js.map +1 -0
  51. package/dist/router/quota.d.ts +4 -0
  52. package/dist/router/quota.d.ts.map +1 -0
  53. package/dist/router/quota.js +5 -0
  54. package/dist/router/quota.js.map +1 -0
  55. package/dist/router/router.d.ts +3 -0
  56. package/dist/router/router.d.ts.map +1 -0
  57. package/dist/router/router.js +141 -0
  58. package/dist/router/router.js.map +1 -0
  59. package/dist/router/types.d.ts +86 -0
  60. package/dist/router/types.d.ts.map +1 -0
  61. package/dist/router/types.js +2 -0
  62. package/dist/router/types.js.map +1 -0
  63. package/dist/routerConfig.d.ts +14 -0
  64. package/dist/routerConfig.d.ts.map +1 -0
  65. package/dist/routerConfig.js +194 -0
  66. package/dist/routerConfig.js.map +1 -0
  67. package/dist/serverApp.d.ts +43 -0
  68. package/dist/serverApp.d.ts.map +1 -0
  69. package/dist/serverApp.js +618 -0
  70. package/dist/serverApp.js.map +1 -0
  71. package/dist/service/bootstrap.d.ts +3 -0
  72. package/dist/service/bootstrap.d.ts.map +1 -0
  73. package/dist/service/bootstrap.js +32 -0
  74. package/dist/service/bootstrap.js.map +1 -0
  75. package/dist/service/manager.d.ts +6 -0
  76. package/dist/service/manager.d.ts.map +1 -0
  77. package/dist/service/manager.js +318 -0
  78. package/dist/service/manager.js.map +1 -0
  79. package/dist/service/paths.d.ts +10 -0
  80. package/dist/service/paths.d.ts.map +1 -0
  81. package/dist/service/paths.js +57 -0
  82. package/dist/service/paths.js.map +1 -0
  83. package/dist/service/renderers.d.ts +7 -0
  84. package/dist/service/renderers.d.ts.map +1 -0
  85. package/dist/service/renderers.js +110 -0
  86. package/dist/service/renderers.js.map +1 -0
  87. package/dist/service/runtime.d.ts +14 -0
  88. package/dist/service/runtime.d.ts.map +1 -0
  89. package/dist/service/runtime.js +129 -0
  90. package/dist/service/runtime.js.map +1 -0
  91. package/dist/service/types.d.ts +33 -0
  92. package/dist/service/types.d.ts.map +1 -0
  93. package/dist/service/types.js +2 -0
  94. package/dist/service/types.js.map +1 -0
  95. package/dist/taskClientPolicy.d.ts +16 -0
  96. package/dist/taskClientPolicy.d.ts.map +1 -0
  97. package/dist/taskClientPolicy.js +44 -0
  98. package/dist/taskClientPolicy.js.map +1 -0
  99. package/dist/taskStore.d.ts +12 -0
  100. package/dist/taskStore.d.ts.map +1 -0
  101. package/dist/taskStore.js +30 -0
  102. package/dist/taskStore.js.map +1 -0
  103. package/dist/tierConfig.d.ts +16 -0
  104. package/dist/tierConfig.d.ts.map +1 -0
  105. package/dist/tierConfig.js +70 -0
  106. package/dist/tierConfig.js.map +1 -0
  107. package/dist/tools/ask-claude.tool.d.ts +3 -0
  108. package/dist/tools/ask-claude.tool.d.ts.map +1 -0
  109. package/dist/tools/ask-claude.tool.js +30 -0
  110. package/dist/tools/ask-claude.tool.js.map +1 -0
  111. package/dist/tools/ask-codex.tool.d.ts +3 -0
  112. package/dist/tools/ask-codex.tool.d.ts.map +1 -0
  113. package/dist/tools/ask-codex.tool.js +29 -0
  114. package/dist/tools/ask-codex.tool.js.map +1 -0
  115. package/dist/tools/ask-cursor.tool.d.ts +3 -0
  116. package/dist/tools/ask-cursor.tool.d.ts.map +1 -0
  117. package/dist/tools/ask-cursor.tool.js +30 -0
  118. package/dist/tools/ask-cursor.tool.js.map +1 -0
  119. package/dist/tools/ask-gemini.tool.d.ts +3 -0
  120. package/dist/tools/ask-gemini.tool.d.ts.map +1 -0
  121. package/dist/tools/ask-gemini.tool.js +40 -0
  122. package/dist/tools/ask-gemini.tool.js.map +1 -0
  123. package/dist/tools/ask-opencode.tool.d.ts +3 -0
  124. package/dist/tools/ask-opencode.tool.d.ts.map +1 -0
  125. package/dist/tools/ask-opencode.tool.js +29 -0
  126. package/dist/tools/ask-opencode.tool.js.map +1 -0
  127. package/dist/tools/ask-router.tool.d.ts +20 -0
  128. package/dist/tools/ask-router.tool.d.ts.map +1 -0
  129. package/dist/tools/ask-router.tool.js +550 -0
  130. package/dist/tools/ask-router.tool.js.map +1 -0
  131. package/dist/tools/fetch-chunk.tool.d.ts +3 -0
  132. package/dist/tools/fetch-chunk.tool.d.ts.map +1 -0
  133. package/dist/tools/fetch-chunk.tool.js +58 -0
  134. package/dist/tools/fetch-chunk.tool.js.map +1 -0
  135. package/dist/tools/get-run.tool.d.ts +3 -0
  136. package/dist/tools/get-run.tool.d.ts.map +1 -0
  137. package/dist/tools/get-run.tool.js +53 -0
  138. package/dist/tools/get-run.tool.js.map +1 -0
  139. package/dist/tools/important-read-now.tool.d.ts +3 -0
  140. package/dist/tools/important-read-now.tool.d.ts.map +1 -0
  141. package/dist/tools/important-read-now.tool.js +31 -0
  142. package/dist/tools/important-read-now.tool.js.map +1 -0
  143. package/dist/tools/index.d.ts +12 -0
  144. package/dist/tools/index.d.ts.map +1 -0
  145. package/dist/tools/index.js +59 -0
  146. package/dist/tools/index.js.map +1 -0
  147. package/dist/tools/opencode-copilot-usage.tool.d.ts +3 -0
  148. package/dist/tools/opencode-copilot-usage.tool.d.ts.map +1 -0
  149. package/dist/tools/opencode-copilot-usage.tool.js +85 -0
  150. package/dist/tools/opencode-copilot-usage.tool.js.map +1 -0
  151. package/dist/tools/recommend-route.tool.d.ts +3 -0
  152. package/dist/tools/recommend-route.tool.d.ts.map +1 -0
  153. package/dist/tools/recommend-route.tool.js +88 -0
  154. package/dist/tools/recommend-route.tool.js.map +1 -0
  155. package/dist/tools/registry.d.ts +31 -0
  156. package/dist/tools/registry.d.ts.map +1 -0
  157. package/dist/tools/registry.js +105 -0
  158. package/dist/tools/registry.js.map +1 -0
  159. package/dist/tools/simple-tools.d.ts +12 -0
  160. package/dist/tools/simple-tools.d.ts.map +1 -0
  161. package/dist/tools/simple-tools.js +121 -0
  162. package/dist/tools/simple-tools.js.map +1 -0
  163. package/dist/tools/test-tool.example.d.ts +13 -0
  164. package/dist/tools/test-tool.example.d.ts.map +1 -0
  165. package/dist/tools/test-tool.example.js +32 -0
  166. package/dist/tools/test-tool.example.js.map +1 -0
  167. package/dist/tools/tiered-request.tool.d.ts +3 -0
  168. package/dist/tools/tiered-request.tool.d.ts.map +1 -0
  169. package/dist/tools/tiered-request.tool.js +147 -0
  170. package/dist/tools/tiered-request.tool.js.map +1 -0
  171. package/dist/utils/changeModeChunker.d.ts +11 -0
  172. package/dist/utils/changeModeChunker.d.ts.map +1 -0
  173. package/dist/utils/changeModeChunker.js +89 -0
  174. package/dist/utils/changeModeChunker.js.map +1 -0
  175. package/dist/utils/changeModeParser.d.ts +15 -0
  176. package/dist/utils/changeModeParser.d.ts.map +1 -0
  177. package/dist/utils/changeModeParser.js +67 -0
  178. package/dist/utils/changeModeParser.js.map +1 -0
  179. package/dist/utils/changeModeTranslator.d.ts +8 -0
  180. package/dist/utils/changeModeTranslator.d.ts.map +1 -0
  181. package/dist/utils/changeModeTranslator.js +70 -0
  182. package/dist/utils/changeModeTranslator.js.map +1 -0
  183. package/dist/utils/chunkCache.d.ts +22 -0
  184. package/dist/utils/chunkCache.d.ts.map +1 -0
  185. package/dist/utils/chunkCache.js +147 -0
  186. package/dist/utils/chunkCache.js.map +1 -0
  187. package/dist/utils/claudeExecutor.d.ts +3 -0
  188. package/dist/utils/claudeExecutor.d.ts.map +1 -0
  189. package/dist/utils/claudeExecutor.js +21 -0
  190. package/dist/utils/claudeExecutor.js.map +1 -0
  191. package/dist/utils/cliDetector.d.ts +20 -0
  192. package/dist/utils/cliDetector.d.ts.map +1 -0
  193. package/dist/utils/cliDetector.js +95 -0
  194. package/dist/utils/cliDetector.js.map +1 -0
  195. package/dist/utils/codexExecutor.d.ts +3 -0
  196. package/dist/utils/codexExecutor.d.ts.map +1 -0
  197. package/dist/utils/codexExecutor.js +19 -0
  198. package/dist/utils/codexExecutor.js.map +1 -0
  199. package/dist/utils/commandExecutor.d.ts +29 -0
  200. package/dist/utils/commandExecutor.d.ts.map +1 -0
  201. package/dist/utils/commandExecutor.js +487 -0
  202. package/dist/utils/commandExecutor.js.map +1 -0
  203. package/dist/utils/cursorCli.d.ts +3 -0
  204. package/dist/utils/cursorCli.d.ts.map +1 -0
  205. package/dist/utils/cursorCli.js +20 -0
  206. package/dist/utils/cursorCli.js.map +1 -0
  207. package/dist/utils/cursorExecutor.d.ts +3 -0
  208. package/dist/utils/cursorExecutor.d.ts.map +1 -0
  209. package/dist/utils/cursorExecutor.js +22 -0
  210. package/dist/utils/cursorExecutor.js.map +1 -0
  211. package/dist/utils/geminiExecutor.d.ts +4 -0
  212. package/dist/utils/geminiExecutor.d.ts.map +1 -0
  213. package/dist/utils/geminiExecutor.js +131 -0
  214. package/dist/utils/geminiExecutor.js.map +1 -0
  215. package/dist/utils/githubCli.d.ts +22 -0
  216. package/dist/utils/githubCli.d.ts.map +1 -0
  217. package/dist/utils/githubCli.js +131 -0
  218. package/dist/utils/githubCli.js.map +1 -0
  219. package/dist/utils/opencodeCatalog.d.ts +33 -0
  220. package/dist/utils/opencodeCatalog.d.ts.map +1 -0
  221. package/dist/utils/opencodeCatalog.js +171 -0
  222. package/dist/utils/opencodeCatalog.js.map +1 -0
  223. package/dist/utils/opencodeExecutor.d.ts +3 -0
  224. package/dist/utils/opencodeExecutor.d.ts.map +1 -0
  225. package/dist/utils/opencodeExecutor.js +16 -0
  226. package/dist/utils/opencodeExecutor.js.map +1 -0
  227. package/dist/utils/timeoutManager.d.ts +2 -0
  228. package/dist/utils/timeoutManager.d.ts.map +1 -0
  229. package/dist/utils/timeoutManager.js +2 -0
  230. package/dist/utils/timeoutManager.js.map +1 -0
  231. package/dist/utils/worktrunkIsolation.d.ts +26 -0
  232. package/dist/utils/worktrunkIsolation.d.ts.map +1 -0
  233. package/dist/utils/worktrunkIsolation.js +80 -0
  234. package/dist/utils/worktrunkIsolation.js.map +1 -0
  235. package/package.json +72 -0
@@ -0,0 +1,58 @@
1
+ import { z } from 'zod';
2
+ import { getChunks } from '../utils/chunkCache.js';
3
+ import { formatChangeModeResponse, summarizeChangeModeEdits } from '../utils/changeModeTranslator.js';
4
+ const inputSchema = z.object({
5
+ cacheKey: z.string().describe("The cache key provided in the initial changeMode response"),
6
+ chunkIndex: z.number().min(1).describe("Which chunk to retrieve (1-based index)")
7
+ });
8
+ export const fetchChunkTool = {
9
+ name: 'Fetch-Chunk',
10
+ description: 'Retrieves cached chunks from a Gemini changeMode response. Use this to get subsequent chunks after receiving a partial changeMode response.',
11
+ zodSchema: inputSchema,
12
+ prompt: {
13
+ description: 'Fetch the next chunk of a response',
14
+ arguments: [
15
+ {
16
+ name: 'prompt',
17
+ description: 'fetch-chunk cacheKey=<key> chunkIndex=<number>',
18
+ required: true
19
+ }
20
+ ]
21
+ },
22
+ category: 'gemini',
23
+ execute: async (args) => {
24
+ const { cacheKey, chunkIndex } = args;
25
+ // Retrieve cached chunks
26
+ const chunks = getChunks(cacheKey);
27
+ if (!chunks) {
28
+ return `❌ Cache miss: No chunks found for cache key "${cacheKey}".
29
+
30
+ Possible reasons:
31
+ 1. The cache key is incorrect, Have you ran Ask-Gemini with changeMode enabled?
32
+ 2. The cache has expired (10 minute TTL)
33
+ 3. The MCP server was restarted and the file-based cache was cleared
34
+
35
+ Please re-run the original changeMode request to regenerate the chunks.`;
36
+ }
37
+ // Validate chunk index
38
+ if (chunkIndex < 1 || chunkIndex > chunks.length) {
39
+ return `❌ Invalid chunk index: ${chunkIndex}
40
+
41
+ Available chunks: 1 to ${chunks.length}
42
+ You requested: ${chunkIndex}
43
+
44
+ Please use a valid chunk index.`;
45
+ }
46
+ // Get the requested chunk
47
+ const chunk = chunks[chunkIndex - 1];
48
+ // Format the response
49
+ let result = formatChangeModeResponse(chunk.edits, { current: chunkIndex, total: chunks.length, cacheKey });
50
+ // Add summary for first chunk
51
+ if (chunkIndex === 1 && chunks.length > 1) {
52
+ const allEdits = chunks.flatMap(c => c.edits);
53
+ result = summarizeChangeModeEdits(allEdits, true) + '\n\n' + result;
54
+ }
55
+ return result;
56
+ }
57
+ };
58
+ //# sourceMappingURL=fetch-chunk.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-chunk.tool.js","sourceRoot":"","sources":["../../src/tools/fetch-chunk.tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAEtG,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2DAA2D,CAAC;IAC1F,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,yCAAyC,CAAC;CAClF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAgB;IACzC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,6IAA6I;IAE1J,SAAS,EAAE,WAAW;IAEtB,MAAM,EAAE;QACN,WAAW,EAAE,oCAAoC;QACjD,SAAS,EAAE;YACT;gBACE,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,gDAAgD;gBAC7D,QAAQ,EAAE,IAAI;aACf;SACF;KACF;IAED,QAAQ,EAAE,QAAQ;IAElB,OAAO,EAAE,KAAK,EAAE,IAAS,EAAmB,EAAE;QAC5C,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;QAEtC,yBAAyB;QACzB,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAEnC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,gDAAgD,QAAQ;;;;;;;wEAOG,CAAC;QACrE,CAAC;QAED,uBAAuB;QACvB,IAAI,UAAU,GAAG,CAAC,IAAI,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;YACjD,OAAO,0BAA0B,UAAU;;yBAExB,MAAM,CAAC,MAAM;iBACrB,UAAU;;gCAEK,CAAC;QAC7B,CAAC;QAED,0BAA0B;QAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAErC,sBAAsB;QACtB,IAAI,MAAM,GAAG,wBAAwB,CACnC,KAAK,CAAC,KAAK,EACX,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CACxD,CAAC;QAEF,8BAA8B;QAC9B,IAAI,UAAU,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,GAAG,wBAAwB,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC;QACtE,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { UnifiedTool } from './registry.js';
2
+ export declare const getRunTool: UnifiedTool;
3
+ //# sourceMappingURL=get-run.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-run.tool.d.ts","sourceRoot":"","sources":["../../src/tools/get-run.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAU5C,eAAO,MAAM,UAAU,EAAE,WAkDxB,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { z } from 'zod';
2
+ import { getRunsDir } from '../service/paths.js';
3
+ import { readFile, readdir, stat } from 'fs/promises';
4
+ import path from 'path';
5
+ const getRunArgsSchema = z.object({
6
+ runId: z.string().optional().describe("Specific run ID to retrieve. If omitted, and 'latest' is true, retrieves the most recent run."),
7
+ latest: z.boolean().optional().describe("If true, retrieves the most recent run summary. Defaults to true if runId is omitted."),
8
+ });
9
+ export const getRunTool = {
10
+ name: "Get-Run",
11
+ description: "Retrieve summary of a prior command execution (run ledger). Useful for diagnosing failures, reviewing logs, or checking retryability.",
12
+ zodSchema: getRunArgsSchema,
13
+ category: 'utility',
14
+ execution: { taskSupport: 'forbidden' },
15
+ timeoutClass: 'none',
16
+ execute: async (args) => {
17
+ const { runId, latest = !args.runId } = args;
18
+ const runsDir = getRunsDir();
19
+ try {
20
+ if (runId) {
21
+ const filePath = path.join(runsDir, `${runId}.json`);
22
+ const content = await readFile(filePath, 'utf-8');
23
+ return content;
24
+ }
25
+ if (latest) {
26
+ const files = await readdir(runsDir);
27
+ if (files.length === 0) {
28
+ return "No runs found in ledger.";
29
+ }
30
+ const stats = await Promise.all(files.filter(f => f.endsWith('.json')).map(async (f) => {
31
+ const p = path.join(runsDir, f);
32
+ const s = await stat(p);
33
+ return { name: f, mtime: s.mtimeMs };
34
+ }));
35
+ if (stats.length === 0) {
36
+ return "No runs found in ledger.";
37
+ }
38
+ stats.sort((a, b) => b.mtime - a.mtime);
39
+ const latestFile = stats[0].name;
40
+ const content = await readFile(path.join(runsDir, latestFile), 'utf-8');
41
+ return content;
42
+ }
43
+ return "Please provide either runId or set latest: true.";
44
+ }
45
+ catch (error) {
46
+ if (error.code === 'ENOENT') {
47
+ return `Run not found: ${runId}`;
48
+ }
49
+ throw error;
50
+ }
51
+ }
52
+ };
53
+ //# sourceMappingURL=get-run.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-run.tool.js","sourceRoot":"","sources":["../../src/tools/get-run.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { UnifiedTool } from './registry.js';
2
+ export declare const importantReadNowTool: UnifiedTool;
3
+ //# sourceMappingURL=important-read-now.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"important-read-now.tool.d.ts","sourceRoot":"","sources":["../../src/tools/important-read-now.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAwB5C,eAAO,MAAM,oBAAoB,EAAE,WASlC,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { z } from 'zod';
2
+ const noArgsSchema = z.object({});
3
+ const NO_CLI_MESSAGE = `IMPORTANT: No usable AI CLIs were detected by AgentMux.
4
+
5
+ AgentMux requires at least one of the following CLI tools to be installed and available on your system PATH:
6
+
7
+ 1. gemini - Google Gemini CLI (https://github.com/google-gemini/gemini-cli)
8
+ 2. codex - OpenAI Codex CLI (https://github.com/openai/codex)
9
+ 3. claude - Anthropic Claude Code CLI (https://claude.ai/cli)
10
+
11
+ Please inform the user that none of the supported CLIs were detected and at least one must be installed for AgentMux to function.
12
+
13
+ Note: If only your own CLI is installed, it is hidden because calling yourself is not supported. Install a different CLI to enable cross-model collaboration.
14
+
15
+ To verify a CLI is available, run one of these commands in a terminal:
16
+ which gemini
17
+ which codex
18
+ which claude
19
+
20
+ After installing a CLI, restart the MCP server to pick up the change.
21
+ `;
22
+ export const importantReadNowTool = {
23
+ name: "Claude-Gemini-Codex",
24
+ description: "CRITICAL: No usable AI CLIs detected by AgentMux. Call this tool immediately for troubleshooting instructions.",
25
+ zodSchema: noArgsSchema,
26
+ category: 'utility',
27
+ execute: async () => {
28
+ return NO_CLI_MESSAGE;
29
+ },
30
+ };
31
+ //# sourceMappingURL=important-read-now.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"important-read-now.tool.js","sourceRoot":"","sources":["../../src/tools/important-read-now.tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAElC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;CAkBtB,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAgB;IAC/C,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EACT,gHAAgH;IAClH,SAAS,EAAE,YAAY;IACvB,QAAQ,EAAE,SAAS;IACnB,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,OAAO,cAAc,CAAC;IACxB,CAAC;CACF,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { CliAvailability } from '../utils/cliDetector.js';
2
+ import { MultiCliConfig } from '../config.js';
3
+ import type { Logger } from '../logger.js';
4
+ /**
5
+ * Initialize the tool registry based on which CLIs are available.
6
+ * Must be called (and awaited) before the server starts accepting requests.
7
+ */
8
+ export declare function initTools(config?: Pick<MultiCliConfig, 'cliDetectTimeoutMs'> & {
9
+ logger?: Logger;
10
+ }): Promise<CliAvailability>;
11
+ export * from './registry.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAeA,OAAO,EAAuB,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,MAAM,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,oBAAoB,CAAC,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACxE,OAAO,CAAC,eAAe,CAAC,CAgE1B;AAED,cAAc,eAAe,CAAC"}
@@ -0,0 +1,59 @@
1
+ // Tool Registry Index - Registers tools based on CLI availability
2
+ import { toolRegistry } from './registry.js';
3
+ import { askGeminiTool } from './ask-gemini.tool.js';
4
+ import { geminiHelpTool, codexHelpTool, claudeHelpTool, opencodeHelpTool, cursorHelpTool, geminiListModelsTool, codexListModelsTool, claudeListModelsTool, opencodeListModelsTool, cursorListModelsTool, } from './simple-tools.js';
5
+ import { fetchChunkTool } from './fetch-chunk.tool.js';
6
+ import { askCodexTool } from './ask-codex.tool.js';
7
+ import { askClaudeTool } from './ask-claude.tool.js';
8
+ import { askOpencodeTool } from './ask-opencode.tool.js';
9
+ import { opencodeCopilotUsageTool } from './opencode-copilot-usage.tool.js';
10
+ import { askCursorTool } from './ask-cursor.tool.js';
11
+ import { getRunTool } from './get-run.tool.js';
12
+ import { askSubagentTool, hasAnyRouterBackend, routerTierTools } from './ask-router.tool.js';
13
+ import { detectAvailableClis } from '../utils/cliDetector.js';
14
+ /**
15
+ * Initialize the tool registry based on which CLIs are available.
16
+ * Must be called (and awaited) before the server starts accepting requests.
17
+ */
18
+ export async function initTools(config) {
19
+ toolRegistry.length = 0;
20
+ const availability = await detectAvailableClis(config?.cliDetectTimeoutMs, config?.logger);
21
+ toolRegistry.push(getRunTool);
22
+ if (availability.gemini) {
23
+ toolRegistry.push(geminiListModelsTool, // List-Gemini-Models
24
+ askGeminiTool, // Ask-Gemini
25
+ fetchChunkTool, // Fetch-Chunk
26
+ geminiHelpTool);
27
+ }
28
+ if (availability.codex) {
29
+ toolRegistry.push(codexListModelsTool, // List-Codex-Models
30
+ askCodexTool, // Ask-Codex
31
+ codexHelpTool);
32
+ }
33
+ if (availability.claude) {
34
+ toolRegistry.push(claudeListModelsTool, // List-Claude-Models
35
+ askClaudeTool, // Ask-Claude
36
+ claudeHelpTool);
37
+ }
38
+ if (availability.opencode) {
39
+ toolRegistry.push(opencodeListModelsTool, // List-OpenCode-Models
40
+ askOpencodeTool, // Ask-OpenCode
41
+ opencodeCopilotUsageTool, // OpenCode-Copilot-Usage
42
+ opencodeHelpTool);
43
+ }
44
+ if (availability.cursor) {
45
+ toolRegistry.push(cursorListModelsTool, // List-Cursor-Models
46
+ askCursorTool, // Ask-Cursor
47
+ cursorHelpTool);
48
+ }
49
+ if (hasAnyRouterBackend()) {
50
+ toolRegistry.push(askSubagentTool, ...routerTierTools);
51
+ }
52
+ config?.logger?.info('tool_registry_initialized', {
53
+ availability,
54
+ toolNames: toolRegistry.map((tool) => tool.name),
55
+ });
56
+ return availability;
57
+ }
58
+ export * from './registry.js';
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EACL,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAC/E,oBAAoB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,oBAAoB,GAC9G,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC7F,OAAO,EAAE,mBAAmB,EAAmB,MAAM,yBAAyB,CAAC;AAI/E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,MAAyE;IAEzE,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;IACxB,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAC5C,MAAM,EAAE,kBAAkB,EAC1B,MAAM,EAAE,MAAM,CACf,CAAC;IAEF,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAE9B,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;QACxB,YAAY,CAAC,IAAI,CACf,oBAAoB,EAAI,qBAAqB;QAC7C,aAAa,EAAW,aAAa;QACrC,cAAc,EAAU,cAAc;QACtC,cAAc,CACf,CAAC;IACJ,CAAC;IAED,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;QACvB,YAAY,CAAC,IAAI,CACf,mBAAmB,EAAK,oBAAoB;QAC5C,YAAY,EAAY,YAAY;QACpC,aAAa,CACd,CAAC;IACJ,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;QACxB,YAAY,CAAC,IAAI,CACf,oBAAoB,EAAI,qBAAqB;QAC7C,aAAa,EAAW,aAAa;QACrC,cAAc,CACf,CAAC;IACJ,CAAC;IAED,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;QAC1B,YAAY,CAAC,IAAI,CACf,sBAAsB,EAAE,uBAAuB;QAC/C,eAAe,EAAS,eAAe;QACvC,wBAAwB,EAAE,yBAAyB;QACnD,gBAAgB,CACjB,CAAC;IACJ,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;QACxB,YAAY,CAAC,IAAI,CACf,oBAAoB,EAAE,qBAAqB;QAC3C,aAAa,EAAS,aAAa;QACnC,cAAc,CACf,CAAC;IACJ,CAAC;IAED,IAAI,mBAAmB,EAAE,EAAE,CAAC;QAC1B,YAAY,CAAC,IAAI,CACf,eAAe,EACf,GAAG,eAAe,CACnB,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,2BAA2B,EAAE;QAChD,YAAY;QACZ,SAAS,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;KACjD,CAAC,CAAC;IAEH,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,cAAc,eAAe,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { UnifiedTool } from './registry.js';
2
+ export declare const opencodeCopilotUsageTool: UnifiedTool;
3
+ //# sourceMappingURL=opencode-copilot-usage.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-copilot-usage.tool.d.ts","sourceRoot":"","sources":["../../src/tools/opencode-copilot-usage.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAsD5C,eAAO,MAAM,wBAAwB,EAAE,WAmDtC,CAAC"}
@@ -0,0 +1,85 @@
1
+ import { z } from 'zod';
2
+ import { executeGhApi, GhCliError } from '../utils/githubCli.js';
3
+ const currentDate = new Date();
4
+ const opencodeCopilotUsageArgsSchema = z.object({
5
+ username: z.string().min(1).optional().describe('Optional GitHub username to inspect. Defaults to the authenticated `gh` user.'),
6
+ year: z.coerce.number().int().min(1970).optional().describe(`Optional year for the usage window. Defaults to ${currentDate.getFullYear()}.`),
7
+ month: z.coerce.number().int().min(1).max(12).optional().describe(`Optional month for the usage window. Defaults to ${currentDate.getMonth() + 1}.`),
8
+ day: z.coerce.number().int().min(1).max(31).optional().describe('Optional day for a more specific usage window.'),
9
+ product: z.string().min(1).optional().describe('Optional product filter for the usage query.'),
10
+ model: z.string().min(1).optional().describe('Optional model filter for the usage query.'),
11
+ });
12
+ async function getAuthenticatedUsername(context) {
13
+ const username = await executeGhApi(['user', '--jq', '.login'], context);
14
+ if (!username.trim()) {
15
+ throw new Error('GitHub CLI returned an empty username. Run `gh auth status` and try again.');
16
+ }
17
+ return username.trim();
18
+ }
19
+ function buildQueryArgs(args) {
20
+ const queryArgs = ['--method', 'GET', '-f', `year=${args.year}`, '-f', `month=${args.month}`];
21
+ if (args.day !== undefined) {
22
+ queryArgs.push('-f', `day=${args.day}`);
23
+ }
24
+ if (args.product) {
25
+ queryArgs.push('-f', `product=${args.product}`);
26
+ }
27
+ if (args.model) {
28
+ queryArgs.push('-f', `model=${args.model}`);
29
+ }
30
+ return queryArgs;
31
+ }
32
+ function formatSummary(username, year, month, day) {
33
+ const period = day ? `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}` : `${year}-${String(month).padStart(2, '0')}`;
34
+ return `GitHub Copilot premium request usage for ${username} (${period})`;
35
+ }
36
+ export const opencodeCopilotUsageTool = {
37
+ name: 'OpenCode-Copilot-Usage',
38
+ description: 'Check GitHub Copilot premium request usage for the authenticated OpenCode provider account or a specified GitHub username.',
39
+ zodSchema: opencodeCopilotUsageArgsSchema,
40
+ prompt: {
41
+ description: 'Read GitHub Copilot premium request usage for OpenCode via gh api.',
42
+ },
43
+ category: 'opencode',
44
+ execute: async (args, context) => {
45
+ const a = opencodeCopilotUsageArgsSchema.parse(args);
46
+ let resolvedUsername = a.username?.trim() || '';
47
+ let year = a.year ?? new Date().getFullYear();
48
+ let month = a.month ?? new Date().getMonth() + 1;
49
+ try {
50
+ resolvedUsername = resolvedUsername || await getAuthenticatedUsername(context);
51
+ const queryArgs = buildQueryArgs({
52
+ year,
53
+ month,
54
+ day: a.day,
55
+ product: a.product,
56
+ model: a.model,
57
+ });
58
+ const raw = await executeGhApi([
59
+ `/users/${encodeURIComponent(resolvedUsername)}/settings/billing/premium_request/usage`,
60
+ '-H', 'Accept: application/vnd.github+json',
61
+ '-H', 'X-GitHub-Api-Version: 2026-03-10',
62
+ ...queryArgs,
63
+ ], context);
64
+ const parsed = raw ? JSON.parse(raw) : {};
65
+ return `${formatSummary(resolvedUsername, year, month, a.day)}\n\nRaw JSON:\n${JSON.stringify({
66
+ request: {
67
+ username: resolvedUsername,
68
+ year,
69
+ month,
70
+ day: a.day,
71
+ product: a.product,
72
+ model: a.model,
73
+ },
74
+ response: parsed,
75
+ }, null, 2)}`;
76
+ }
77
+ catch (error) {
78
+ if (error instanceof GhCliError) {
79
+ return `${formatSummary(resolvedUsername, year, month, a.day)}\n\n${error.message}\n\nDebug:\n${JSON.stringify(error.details, null, 2)}`;
80
+ }
81
+ throw error;
82
+ }
83
+ },
84
+ };
85
+ //# sourceMappingURL=opencode-copilot-usage.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-copilot-usage.tool.js","sourceRoot":"","sources":["../../src/tools/opencode-copilot-usage.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { UnifiedTool } from './registry.js';
2
+ export declare const recommendRouteTool: UnifiedTool;
3
+ //# sourceMappingURL=recommend-route.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommend-route.tool.d.ts","sourceRoot":"","sources":["../../src/tools/recommend-route.tool.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAuDjD,eAAO,MAAM,kBAAkB,EAAE,WA8ChC,CAAC"}
@@ -0,0 +1,88 @@
1
+ import { z } from 'zod';
2
+ import { loadRouterConfig } from '../router/config.js';
3
+ import { buildRouteDecision } from '../router/router.js';
4
+ import { toolRegistry } from './registry.js';
5
+ const tierSchema = z.enum(['trivial', 'small', 'medium', 'large', 'long', 'crucial']);
6
+ const providerSchema = z.enum(['codex', 'claude', 'gemini', 'opencode', 'cursor']);
7
+ const domainSchema = z.enum(['general', 'code', 'review', 'docs', 'analysis']);
8
+ const costClassSchema = z.enum(['free', 'included', 'low', 'medium', 'premium', 'any']);
9
+ const recommendRouteArgsSchema = z.object({
10
+ prompt: z.string().describe('Task or question text used for sizing context (length only in this stage).'),
11
+ tier: tierSchema.describe('Workload tier used to pick the configured route list.'),
12
+ domain: domainSchema.optional().describe('Optional domain hint for future routing rules.'),
13
+ allowEdits: z.boolean().optional().describe('When set, overrides default allowEdits on chosen routes.'),
14
+ requireReview: z.boolean().optional().describe('When set, overrides default requireReview on chosen routes.'),
15
+ preferredProvider: providerSchema.optional().describe('Try this provider first (stable reorder).'),
16
+ blockedProviders: z.array(providerSchema).optional().describe('Providers that must not be selected.'),
17
+ maxCostClass: costClassSchema.optional().describe('Maximum cost class permitted for the primary route.'),
18
+ forceTask: z.boolean().optional().describe('If true, reject sync-only routes.'),
19
+ });
20
+ function inferAvailabilityFromRegistry() {
21
+ const out = {
22
+ gemini: false,
23
+ codex: false,
24
+ claude: false,
25
+ opencode: false,
26
+ cursor: false,
27
+ };
28
+ for (const t of toolRegistry) {
29
+ switch (t.category) {
30
+ case 'gemini':
31
+ out.gemini = true;
32
+ break;
33
+ case 'codex':
34
+ out.codex = true;
35
+ break;
36
+ case 'claude':
37
+ out.claude = true;
38
+ break;
39
+ case 'opencode':
40
+ out.opencode = true;
41
+ break;
42
+ case 'cursor':
43
+ out.cursor = true;
44
+ break;
45
+ default:
46
+ break;
47
+ }
48
+ }
49
+ return out;
50
+ }
51
+ export const recommendRouteTool = {
52
+ name: 'Recommend-Route',
53
+ description: 'Read-only routing helper: given a tier and constraints, returns a deterministic provider/model recommendation from merged router config (package defaults + ~/.config/multi-cli/config.json + multi-cli.config.json). Does not invoke provider CLIs.',
54
+ zodSchema: recommendRouteArgsSchema,
55
+ category: 'utility',
56
+ execution: { taskSupport: 'forbidden' },
57
+ timeoutClass: 'none',
58
+ execute: async (args, context) => {
59
+ const parsed = recommendRouteArgsSchema.parse(args);
60
+ const availability = context?.cliAvailability ?? inferAvailabilityFromRegistry();
61
+ const projectRoot = context?.cwd;
62
+ const { config, warnings: loadWarnings } = loadRouterConfig(projectRoot);
63
+ const decision = buildRouteDecision(config, {
64
+ prompt: parsed.prompt,
65
+ tier: parsed.tier,
66
+ domain: parsed.domain,
67
+ allowEdits: parsed.allowEdits,
68
+ requireReview: parsed.requireReview,
69
+ preferredProvider: parsed.preferredProvider,
70
+ blockedProviders: parsed.blockedProviders,
71
+ maxCostClass: parsed.maxCostClass,
72
+ forceTask: parsed.forceTask,
73
+ }, {
74
+ availability,
75
+ mcpClientName: context?.mcpClientName,
76
+ projectRoot,
77
+ }, loadWarnings);
78
+ const payload = {
79
+ selected: decision.selected,
80
+ fallbacks: decision.fallbacks,
81
+ rejected: decision.rejected,
82
+ reasons: decision.reasons,
83
+ warnings: decision.warnings,
84
+ };
85
+ return `\`\`\`json\n${JSON.stringify(payload, null, 2)}\n\`\`\``;
86
+ },
87
+ };
88
+ //# sourceMappingURL=recommend-route.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommend-route.tool.js","sourceRoot":"","sources":["../../src/tools/recommend-route.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { Tool, Prompt } from "@modelcontextprotocol/sdk/types.js";
2
+ import { ToolArguments } from "../constants.js";
3
+ import { z } from "zod";
4
+ import { ToolExecutionContext, ToolTimeoutClass } from "../execution.js";
5
+ export interface UnifiedTool {
6
+ name: string;
7
+ description: string;
8
+ zodSchema: z.ZodType;
9
+ prompt?: {
10
+ description: string;
11
+ arguments?: Array<{
12
+ name: string;
13
+ description: string;
14
+ required: boolean;
15
+ }>;
16
+ };
17
+ execute: (args: ToolArguments, context?: ToolExecutionContext) => Promise<string>;
18
+ category?: 'gemini' | 'codex' | 'claude' | 'opencode' | 'cursor' | 'utility';
19
+ execution?: Tool['execution'];
20
+ timeoutClass?: ToolTimeoutClass;
21
+ }
22
+ export declare const toolRegistry: UnifiedTool[];
23
+ export declare function toolExists(toolName: string): boolean;
24
+ export declare function getTool(toolName: string): UnifiedTool | undefined;
25
+ export declare function getToolDefinitions(subset?: UnifiedTool[], mcpClientName?: string): Tool[];
26
+ export declare function getPromptDefinitions(subset?: UnifiedTool[]): Prompt[];
27
+ export declare function validateToolArguments(toolName: string, args: ToolArguments): ToolArguments;
28
+ export declare function executeValidatedTool(tool: UnifiedTool, args: ToolArguments, context?: ToolExecutionContext): Promise<string>;
29
+ export declare function executeTool(toolName: string, args: ToolArguments, context?: ToolExecutionContext): Promise<string>;
30
+ export declare function getPromptMessage(toolName: string, args: Record<string, any>): string;
31
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAElE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,CAAC,EAAY,MAAM,KAAK,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGzE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC;IAErB,MAAM,CAAC,EAAE;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,KAAK,CAAC;YAChB,IAAI,EAAE,MAAM,CAAC;YACb,WAAW,EAAE,MAAM,CAAC;YACpB,QAAQ,EAAE,OAAO,CAAC;SACnB,CAAC,CAAC;KACJ,CAAC;IAEF,OAAO,EAAE,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,oBAAoB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAClF,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC7E,SAAS,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC9B,YAAY,CAAC,EAAE,gBAAgB,CAAC;CACjC;AAED,eAAO,MAAM,YAAY,EAAE,WAAW,EAAO,CAAC;AAC9C,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpD;AACD,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAEjE;AACD,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,CA8BzF;AAcD,wBAAgB,oBAAoB,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,GAAG,MAAM,EAAE,CAQrE;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,aAAa,CAe1F;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,aAAa,EACnB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,aAAa,EACnB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAsBpF"}
@@ -0,0 +1,105 @@
1
+ import { z, ZodError } from "zod";
2
+ import { shouldAdvertiseTaskRequiredForListTools } from "../taskClientPolicy.js";
3
+ export const toolRegistry = [];
4
+ export function toolExists(toolName) {
5
+ return toolRegistry.some(t => t.name === toolName);
6
+ }
7
+ export function getTool(toolName) {
8
+ return toolRegistry.find(t => t.name === toolName);
9
+ }
10
+ export function getToolDefinitions(subset, mcpClientName) {
11
+ return (subset ?? toolRegistry).map(tool => {
12
+ const jsonSchema = z.toJSONSchema(tool.zodSchema);
13
+ const inputSchema = {
14
+ type: "object",
15
+ properties: jsonSchema.properties || {},
16
+ required: jsonSchema.required || [],
17
+ };
18
+ // Derive MCP annotations from tool name
19
+ let annotations;
20
+ if (tool.name.startsWith('Ask-')) {
21
+ annotations = { openWorldHint: true, readOnlyHint: false, destructiveHint: false };
22
+ }
23
+ else if (tool.name.startsWith('List-') || tool.name.endsWith('-Help') || tool.name.endsWith('-Usage') || tool.name === 'Fetch-Chunk' || tool.name === 'Claude-Gemini-Codex' || tool.name === 'Get-Run') {
24
+ annotations = { readOnlyHint: true, destructiveHint: false, openWorldHint: false };
25
+ }
26
+ const execution = shouldAdvertiseTaskRequiredForListTools(mcpClientName, tool)
27
+ ? { taskSupport: 'required' }
28
+ : tool.execution;
29
+ return {
30
+ name: tool.name,
31
+ description: tool.description,
32
+ inputSchema,
33
+ ...(execution && { execution }),
34
+ ...(annotations && { annotations }),
35
+ };
36
+ });
37
+ }
38
+ function extractPromptArguments(zodSchema) {
39
+ const jsonSchema = z.toJSONSchema(zodSchema);
40
+ const properties = jsonSchema.properties || {};
41
+ const required = jsonSchema.required || [];
42
+ return Object.entries(properties).map(([name, prop]) => ({
43
+ name,
44
+ description: prop.description || `${name} parameter`,
45
+ required: required.includes(name)
46
+ }));
47
+ }
48
+ export function getPromptDefinitions(subset) {
49
+ return (subset ?? toolRegistry)
50
+ .filter(tool => tool.prompt)
51
+ .map(tool => ({
52
+ name: tool.name,
53
+ description: tool.prompt.description,
54
+ arguments: tool.prompt.arguments || extractPromptArguments(tool.zodSchema),
55
+ }));
56
+ }
57
+ export function validateToolArguments(toolName, args) {
58
+ const tool = getTool(toolName);
59
+ if (!tool) {
60
+ throw new Error(`Unknown tool: ${toolName}`);
61
+ }
62
+ try {
63
+ return tool.zodSchema.parse(args);
64
+ }
65
+ catch (error) {
66
+ if (error instanceof ZodError) {
67
+ const issues = error.issues.map(issue => `${issue.path.join('.')}: ${issue.message}`).join(', ');
68
+ throw new Error(`Invalid arguments for ${toolName}: ${issues}`);
69
+ }
70
+ throw error;
71
+ }
72
+ }
73
+ export async function executeValidatedTool(tool, args, context) {
74
+ return tool.execute(args, context);
75
+ }
76
+ export async function executeTool(toolName, args, context) {
77
+ const tool = getTool(toolName);
78
+ if (!tool) {
79
+ throw new Error(`Unknown tool: ${toolName}`);
80
+ }
81
+ const validatedArgs = validateToolArguments(toolName, args);
82
+ return executeValidatedTool(tool, validatedArgs, context);
83
+ }
84
+ export function getPromptMessage(toolName, args) {
85
+ const tool = toolRegistry.find(t => t.name === toolName);
86
+ if (!tool?.prompt) {
87
+ throw new Error(`No prompt defined for tool: ${toolName}`);
88
+ }
89
+ const paramStrings = [];
90
+ if (args.prompt) {
91
+ paramStrings.push(args.prompt);
92
+ }
93
+ Object.entries(args).forEach(([key, value]) => {
94
+ if (key !== 'prompt' && value !== undefined && value !== null && value !== false) {
95
+ if (typeof value === 'boolean') {
96
+ paramStrings.push(`[${key}]`);
97
+ }
98
+ else {
99
+ paramStrings.push(`(${key}: ${value})`);
100
+ }
101
+ }
102
+ });
103
+ return `Use the ${toolName} tool${paramStrings.length > 0 ? ': ' + paramStrings.join(' ') : ''}`;
104
+ }
105
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}