bincode-cli 1.0.1

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 (300) hide show
  1. package/AGENTS.md +27 -0
  2. package/README.md +15 -0
  3. package/bin/bincode +98 -0
  4. package/bunfig.toml +4 -0
  5. package/package.json +124 -0
  6. package/parsers-config.ts +239 -0
  7. package/script/build.ts +167 -0
  8. package/script/postinstall.mjs +206 -0
  9. package/script/publish.ts +99 -0
  10. package/script/schema.ts +47 -0
  11. package/src/acp/README.md +164 -0
  12. package/src/acp/agent.ts +1051 -0
  13. package/src/acp/session.ts +101 -0
  14. package/src/acp/types.ts +22 -0
  15. package/src/agent/agent.ts +398 -0
  16. package/src/agent/generate.txt +75 -0
  17. package/src/agent/prompt/compaction.txt +12 -0
  18. package/src/agent/prompt/explore.txt +18 -0
  19. package/src/agent/prompt/summary.txt +10 -0
  20. package/src/agent/prompt/title.txt +36 -0
  21. package/src/auth/bineric-login.ts +506 -0
  22. package/src/auth/index.ts +70 -0
  23. package/src/bun/index.ts +114 -0
  24. package/src/bus/bus-event.ts +43 -0
  25. package/src/bus/global.ts +10 -0
  26. package/src/bus/index.ts +105 -0
  27. package/src/cli/auth-check.ts +61 -0
  28. package/src/cli/bootstrap.ts +21 -0
  29. package/src/cli/cmd/acp.ts +88 -0
  30. package/src/cli/cmd/agent.ts +256 -0
  31. package/src/cli/cmd/auth.ts +436 -0
  32. package/src/cli/cmd/cmd.ts +7 -0
  33. package/src/cli/cmd/debug/config.ts +15 -0
  34. package/src/cli/cmd/debug/file.ts +91 -0
  35. package/src/cli/cmd/debug/index.ts +43 -0
  36. package/src/cli/cmd/debug/lsp.ts +48 -0
  37. package/src/cli/cmd/debug/ripgrep.ts +83 -0
  38. package/src/cli/cmd/debug/scrap.ts +15 -0
  39. package/src/cli/cmd/debug/skill.ts +15 -0
  40. package/src/cli/cmd/debug/snapshot.ts +48 -0
  41. package/src/cli/cmd/export.ts +88 -0
  42. package/src/cli/cmd/generate.ts +38 -0
  43. package/src/cli/cmd/github.ts +1399 -0
  44. package/src/cli/cmd/import.ts +98 -0
  45. package/src/cli/cmd/login.ts +112 -0
  46. package/src/cli/cmd/logout.ts +38 -0
  47. package/src/cli/cmd/mcp.ts +654 -0
  48. package/src/cli/cmd/models.ts +77 -0
  49. package/src/cli/cmd/pr.ts +112 -0
  50. package/src/cli/cmd/run.ts +368 -0
  51. package/src/cli/cmd/serve.ts +31 -0
  52. package/src/cli/cmd/session.ts +106 -0
  53. package/src/cli/cmd/stats.ts +298 -0
  54. package/src/cli/cmd/tui/app.tsx +669 -0
  55. package/src/cli/cmd/tui/attach.ts +30 -0
  56. package/src/cli/cmd/tui/component/border.tsx +21 -0
  57. package/src/cli/cmd/tui/component/dialog-agent.tsx +31 -0
  58. package/src/cli/cmd/tui/component/dialog-command.tsx +123 -0
  59. package/src/cli/cmd/tui/component/dialog-mcp.tsx +86 -0
  60. package/src/cli/cmd/tui/component/dialog-model.tsx +223 -0
  61. package/src/cli/cmd/tui/component/dialog-provider.tsx +224 -0
  62. package/src/cli/cmd/tui/component/dialog-session-list.tsx +102 -0
  63. package/src/cli/cmd/tui/component/dialog-session-rename.tsx +31 -0
  64. package/src/cli/cmd/tui/component/dialog-status.tsx +162 -0
  65. package/src/cli/cmd/tui/component/dialog-tag.tsx +44 -0
  66. package/src/cli/cmd/tui/component/dialog-theme-list.tsx +50 -0
  67. package/src/cli/cmd/tui/component/logo.tsx +32 -0
  68. package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +560 -0
  69. package/src/cli/cmd/tui/component/prompt/history.tsx +108 -0
  70. package/src/cli/cmd/tui/component/prompt/index.tsx +1052 -0
  71. package/src/cli/cmd/tui/context/args.tsx +14 -0
  72. package/src/cli/cmd/tui/context/directory.ts +13 -0
  73. package/src/cli/cmd/tui/context/exit.tsx +23 -0
  74. package/src/cli/cmd/tui/context/helper.tsx +25 -0
  75. package/src/cli/cmd/tui/context/keybind.tsx +101 -0
  76. package/src/cli/cmd/tui/context/kv.tsx +49 -0
  77. package/src/cli/cmd/tui/context/local.tsx +339 -0
  78. package/src/cli/cmd/tui/context/prompt.tsx +18 -0
  79. package/src/cli/cmd/tui/context/route.tsx +46 -0
  80. package/src/cli/cmd/tui/context/sdk.tsx +74 -0
  81. package/src/cli/cmd/tui/context/sync.tsx +372 -0
  82. package/src/cli/cmd/tui/context/theme/aura.json +69 -0
  83. package/src/cli/cmd/tui/context/theme/ayu.json +80 -0
  84. package/src/cli/cmd/tui/context/theme/bincode.json +245 -0
  85. package/src/cli/cmd/tui/context/theme/catppuccin-frappe.json +233 -0
  86. package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +233 -0
  87. package/src/cli/cmd/tui/context/theme/catppuccin.json +112 -0
  88. package/src/cli/cmd/tui/context/theme/cobalt2.json +228 -0
  89. package/src/cli/cmd/tui/context/theme/cursor.json +249 -0
  90. package/src/cli/cmd/tui/context/theme/dracula.json +219 -0
  91. package/src/cli/cmd/tui/context/theme/everforest.json +241 -0
  92. package/src/cli/cmd/tui/context/theme/flexoki.json +237 -0
  93. package/src/cli/cmd/tui/context/theme/github.json +233 -0
  94. package/src/cli/cmd/tui/context/theme/gruvbox.json +95 -0
  95. package/src/cli/cmd/tui/context/theme/kanagawa.json +77 -0
  96. package/src/cli/cmd/tui/context/theme/lucent-orng.json +227 -0
  97. package/src/cli/cmd/tui/context/theme/material.json +235 -0
  98. package/src/cli/cmd/tui/context/theme/matrix.json +77 -0
  99. package/src/cli/cmd/tui/context/theme/mercury.json +252 -0
  100. package/src/cli/cmd/tui/context/theme/monokai.json +221 -0
  101. package/src/cli/cmd/tui/context/theme/nightowl.json +221 -0
  102. package/src/cli/cmd/tui/context/theme/nord.json +223 -0
  103. package/src/cli/cmd/tui/context/theme/one-dark.json +84 -0
  104. package/src/cli/cmd/tui/context/theme/orng.json +245 -0
  105. package/src/cli/cmd/tui/context/theme/palenight.json +222 -0
  106. package/src/cli/cmd/tui/context/theme/rosepine.json +234 -0
  107. package/src/cli/cmd/tui/context/theme/solarized.json +223 -0
  108. package/src/cli/cmd/tui/context/theme/synthwave84.json +226 -0
  109. package/src/cli/cmd/tui/context/theme/tokyonight.json +243 -0
  110. package/src/cli/cmd/tui/context/theme/vercel.json +245 -0
  111. package/src/cli/cmd/tui/context/theme/vesper.json +218 -0
  112. package/src/cli/cmd/tui/context/theme/zenburn.json +223 -0
  113. package/src/cli/cmd/tui/context/theme.tsx +1109 -0
  114. package/src/cli/cmd/tui/event.ts +40 -0
  115. package/src/cli/cmd/tui/routes/home.tsx +105 -0
  116. package/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +64 -0
  117. package/src/cli/cmd/tui/routes/session/dialog-message.tsx +109 -0
  118. package/src/cli/cmd/tui/routes/session/dialog-subagent.tsx +26 -0
  119. package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +47 -0
  120. package/src/cli/cmd/tui/routes/session/footer.tsx +88 -0
  121. package/src/cli/cmd/tui/routes/session/header.tsx +141 -0
  122. package/src/cli/cmd/tui/routes/session/index.tsx +1888 -0
  123. package/src/cli/cmd/tui/routes/session/sidebar.tsx +321 -0
  124. package/src/cli/cmd/tui/spawn.ts +60 -0
  125. package/src/cli/cmd/tui/thread.ts +120 -0
  126. package/src/cli/cmd/tui/ui/dialog-alert.tsx +57 -0
  127. package/src/cli/cmd/tui/ui/dialog-confirm.tsx +83 -0
  128. package/src/cli/cmd/tui/ui/dialog-help.tsx +38 -0
  129. package/src/cli/cmd/tui/ui/dialog-prompt.tsx +77 -0
  130. package/src/cli/cmd/tui/ui/dialog-select.tsx +330 -0
  131. package/src/cli/cmd/tui/ui/dialog.tsx +170 -0
  132. package/src/cli/cmd/tui/ui/spinner.ts +368 -0
  133. package/src/cli/cmd/tui/ui/toast.tsx +100 -0
  134. package/src/cli/cmd/tui/util/clipboard.ts +127 -0
  135. package/src/cli/cmd/tui/util/editor.ts +32 -0
  136. package/src/cli/cmd/tui/util/terminal.ts +114 -0
  137. package/src/cli/cmd/tui/worker.ts +63 -0
  138. package/src/cli/cmd/uninstall.ts +344 -0
  139. package/src/cli/cmd/upgrade.ts +67 -0
  140. package/src/cli/cmd/web.ts +84 -0
  141. package/src/cli/error.ts +55 -0
  142. package/src/cli/ui.ts +84 -0
  143. package/src/cli/upgrade.ts +25 -0
  144. package/src/command/index.ts +80 -0
  145. package/src/command/template/initialize.txt +10 -0
  146. package/src/command/template/review.txt +97 -0
  147. package/src/config/config.ts +995 -0
  148. package/src/config/markdown.ts +41 -0
  149. package/src/env/index.ts +26 -0
  150. package/src/file/ignore.ts +83 -0
  151. package/src/file/index.ts +328 -0
  152. package/src/file/ripgrep.ts +393 -0
  153. package/src/file/time.ts +64 -0
  154. package/src/file/watcher.ts +103 -0
  155. package/src/flag/flag.ts +46 -0
  156. package/src/format/formatter.ts +315 -0
  157. package/src/format/index.ts +137 -0
  158. package/src/global/index.ts +52 -0
  159. package/src/id/id.ts +73 -0
  160. package/src/ide/index.ts +76 -0
  161. package/src/index.ts +217 -0
  162. package/src/installation/index.ts +196 -0
  163. package/src/lsp/client.ts +229 -0
  164. package/src/lsp/index.ts +485 -0
  165. package/src/lsp/language.ts +116 -0
  166. package/src/lsp/server.ts +1895 -0
  167. package/src/mcp/auth.ts +135 -0
  168. package/src/mcp/index.ts +654 -0
  169. package/src/mcp/oauth-callback.ts +200 -0
  170. package/src/mcp/oauth-provider.ts +154 -0
  171. package/src/patch/index.ts +622 -0
  172. package/src/permission/index.ts +199 -0
  173. package/src/plugin/index.ts +101 -0
  174. package/src/project/bootstrap.ts +31 -0
  175. package/src/project/instance.ts +78 -0
  176. package/src/project/project.ts +221 -0
  177. package/src/project/state.ts +65 -0
  178. package/src/project/vcs.ts +76 -0
  179. package/src/provider/auth.ts +143 -0
  180. package/src/provider/models-macro.ts +11 -0
  181. package/src/provider/models.ts +106 -0
  182. package/src/provider/provider.ts +1071 -0
  183. package/src/provider/sdk/openai-compatible/src/README.md +5 -0
  184. package/src/provider/sdk/openai-compatible/src/index.ts +2 -0
  185. package/src/provider/sdk/openai-compatible/src/openai-compatible-provider.ts +101 -0
  186. package/src/provider/sdk/openai-compatible/src/responses/convert-to-openai-responses-input.ts +303 -0
  187. package/src/provider/sdk/openai-compatible/src/responses/map-openai-responses-finish-reason.ts +22 -0
  188. package/src/provider/sdk/openai-compatible/src/responses/openai-config.ts +18 -0
  189. package/src/provider/sdk/openai-compatible/src/responses/openai-error.ts +22 -0
  190. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-api-types.ts +207 -0
  191. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-language-model.ts +1713 -0
  192. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-prepare-tools.ts +177 -0
  193. package/src/provider/sdk/openai-compatible/src/responses/openai-responses-settings.ts +1 -0
  194. package/src/provider/sdk/openai-compatible/src/responses/tool/code-interpreter.ts +88 -0
  195. package/src/provider/sdk/openai-compatible/src/responses/tool/file-search.ts +128 -0
  196. package/src/provider/sdk/openai-compatible/src/responses/tool/image-generation.ts +115 -0
  197. package/src/provider/sdk/openai-compatible/src/responses/tool/local-shell.ts +65 -0
  198. package/src/provider/sdk/openai-compatible/src/responses/tool/web-search-preview.ts +104 -0
  199. package/src/provider/sdk/openai-compatible/src/responses/tool/web-search.ts +103 -0
  200. package/src/provider/transform.ts +455 -0
  201. package/src/pty/index.ts +231 -0
  202. package/src/server/error.ts +36 -0
  203. package/src/server/project.ts +79 -0
  204. package/src/server/server.ts +2642 -0
  205. package/src/server/tui.ts +71 -0
  206. package/src/session/compaction.ts +223 -0
  207. package/src/session/index.ts +458 -0
  208. package/src/session/llm.ts +201 -0
  209. package/src/session/message-v2.ts +659 -0
  210. package/src/session/message.ts +189 -0
  211. package/src/session/processor.ts +409 -0
  212. package/src/session/prompt/anthropic-20250930.txt +166 -0
  213. package/src/session/prompt/anthropic.txt +104 -0
  214. package/src/session/prompt/anthropic_spoof.txt +1 -0
  215. package/src/session/prompt/beast.txt +147 -0
  216. package/src/session/prompt/build-switch.txt +5 -0
  217. package/src/session/prompt/codex.txt +318 -0
  218. package/src/session/prompt/copilot-gpt-5.txt +143 -0
  219. package/src/session/prompt/gemini.txt +155 -0
  220. package/src/session/prompt/max-steps.txt +16 -0
  221. package/src/session/prompt/plan-reminder-anthropic.txt +67 -0
  222. package/src/session/prompt/plan.txt +26 -0
  223. package/src/session/prompt/polaris.txt +106 -0
  224. package/src/session/prompt/qwen.txt +109 -0
  225. package/src/session/prompt.ts +1446 -0
  226. package/src/session/retry.ts +86 -0
  227. package/src/session/revert.ts +108 -0
  228. package/src/session/status.ts +76 -0
  229. package/src/session/summary.ts +194 -0
  230. package/src/session/system.ts +120 -0
  231. package/src/session/todo.ts +37 -0
  232. package/src/share/share-next.ts +194 -0
  233. package/src/share/share.ts +87 -0
  234. package/src/shell/shell.ts +67 -0
  235. package/src/skill/index.ts +1 -0
  236. package/src/skill/skill.ts +83 -0
  237. package/src/snapshot/index.ts +197 -0
  238. package/src/storage/storage.ts +226 -0
  239. package/src/tool/bash.ts +306 -0
  240. package/src/tool/bash.txt +158 -0
  241. package/src/tool/batch.ts +175 -0
  242. package/src/tool/batch.txt +24 -0
  243. package/src/tool/codesearch.ts +138 -0
  244. package/src/tool/codesearch.txt +12 -0
  245. package/src/tool/edit.ts +675 -0
  246. package/src/tool/edit.txt +10 -0
  247. package/src/tool/glob.ts +65 -0
  248. package/src/tool/glob.txt +6 -0
  249. package/src/tool/grep.ts +121 -0
  250. package/src/tool/grep.txt +8 -0
  251. package/src/tool/invalid.ts +17 -0
  252. package/src/tool/ls.ts +110 -0
  253. package/src/tool/ls.txt +1 -0
  254. package/src/tool/lsp-diagnostics.ts +26 -0
  255. package/src/tool/lsp-diagnostics.txt +1 -0
  256. package/src/tool/lsp-hover.ts +31 -0
  257. package/src/tool/lsp-hover.txt +1 -0
  258. package/src/tool/lsp.ts +87 -0
  259. package/src/tool/lsp.txt +19 -0
  260. package/src/tool/multiedit.ts +46 -0
  261. package/src/tool/multiedit.txt +41 -0
  262. package/src/tool/patch.ts +233 -0
  263. package/src/tool/patch.txt +1 -0
  264. package/src/tool/read.ts +219 -0
  265. package/src/tool/read.txt +12 -0
  266. package/src/tool/registry.ts +162 -0
  267. package/src/tool/skill.ts +100 -0
  268. package/src/tool/task.ts +136 -0
  269. package/src/tool/task.txt +60 -0
  270. package/src/tool/todo.ts +39 -0
  271. package/src/tool/todoread.txt +14 -0
  272. package/src/tool/todowrite.txt +167 -0
  273. package/src/tool/tool.ts +71 -0
  274. package/src/tool/webfetch.ts +187 -0
  275. package/src/tool/webfetch.txt +13 -0
  276. package/src/tool/websearch.ts +150 -0
  277. package/src/tool/websearch.txt +11 -0
  278. package/src/tool/write.ts +110 -0
  279. package/src/tool/write.txt +8 -0
  280. package/src/util/archive.ts +16 -0
  281. package/src/util/color.ts +19 -0
  282. package/src/util/context.ts +25 -0
  283. package/src/util/defer.ts +12 -0
  284. package/src/util/eventloop.ts +20 -0
  285. package/src/util/filesystem.ts +83 -0
  286. package/src/util/fn.ts +11 -0
  287. package/src/util/iife.ts +3 -0
  288. package/src/util/keybind.ts +102 -0
  289. package/src/util/lazy.ts +11 -0
  290. package/src/util/locale.ts +81 -0
  291. package/src/util/lock.ts +98 -0
  292. package/src/util/log.ts +180 -0
  293. package/src/util/queue.ts +32 -0
  294. package/src/util/rpc.ts +42 -0
  295. package/src/util/scrap.ts +10 -0
  296. package/src/util/signal.ts +12 -0
  297. package/src/util/timeout.ts +14 -0
  298. package/src/util/token.ts +7 -0
  299. package/src/util/wildcard.ts +54 -0
  300. package/tsconfig.json +16 -0
@@ -0,0 +1,175 @@
1
+ import z from "zod"
2
+ import { Tool } from "./tool"
3
+ import DESCRIPTION from "./batch.txt"
4
+
5
+ const DISALLOWED = new Set(["batch"])
6
+ const FILTERED_FROM_SUGGESTIONS = new Set(["invalid", "patch", ...DISALLOWED])
7
+
8
+ export const BatchTool = Tool.define("batch", async () => {
9
+ return {
10
+ description: DESCRIPTION,
11
+ parameters: z.object({
12
+ tool_calls: z
13
+ .array(
14
+ z.object({
15
+ tool: z.string().describe("The name of the tool to execute"),
16
+ parameters: z.object({}).loose().describe("Parameters for the tool"),
17
+ }),
18
+ )
19
+ .min(1, "Provide at least one tool call")
20
+ .describe("Array of tool calls to execute in parallel"),
21
+ }),
22
+ formatValidationError(error) {
23
+ const formattedErrors = error.issues
24
+ .map((issue) => {
25
+ const path = issue.path.length > 0 ? issue.path.join(".") : "root"
26
+ return ` - ${path}: ${issue.message}`
27
+ })
28
+ .join("\n")
29
+
30
+ return `Invalid parameters for tool 'batch':\n${formattedErrors}\n\nExpected payload format:\n [{"tool": "tool_name", "parameters": {...}}, {...}]`
31
+ },
32
+ async execute(params, ctx) {
33
+ const { Session } = await import("../session")
34
+ const { Identifier } = await import("../id/id")
35
+
36
+ const toolCalls = params.tool_calls.slice(0, 10)
37
+ const discardedCalls = params.tool_calls.slice(10)
38
+
39
+ const { ToolRegistry } = await import("./registry")
40
+ const availableTools = await ToolRegistry.tools("")
41
+ const toolMap = new Map(availableTools.map((t) => [t.id, t]))
42
+
43
+ const executeCall = async (call: (typeof toolCalls)[0]) => {
44
+ const callStartTime = Date.now()
45
+ const partID = Identifier.ascending("part")
46
+
47
+ try {
48
+ if (DISALLOWED.has(call.tool)) {
49
+ throw new Error(
50
+ `Tool '${call.tool}' is not allowed in batch. Disallowed tools: ${Array.from(DISALLOWED).join(", ")}`,
51
+ )
52
+ }
53
+
54
+ const tool = toolMap.get(call.tool)
55
+ if (!tool) {
56
+ const availableToolsList = Array.from(toolMap.keys()).filter((name) => !FILTERED_FROM_SUGGESTIONS.has(name))
57
+ throw new Error(
58
+ `Tool '${call.tool}' not in registry. External tools (MCP, environment) cannot be batched - call them directly. Available tools: ${availableToolsList.join(", ")}`,
59
+ )
60
+ }
61
+ const validatedParams = tool.parameters.parse(call.parameters)
62
+
63
+ await Session.updatePart({
64
+ id: partID,
65
+ messageID: ctx.messageID,
66
+ sessionID: ctx.sessionID,
67
+ type: "tool",
68
+ tool: call.tool,
69
+ callID: partID,
70
+ state: {
71
+ status: "running",
72
+ input: call.parameters,
73
+ time: {
74
+ start: callStartTime,
75
+ },
76
+ },
77
+ })
78
+
79
+ const result = await tool.execute(validatedParams, { ...ctx, callID: partID })
80
+
81
+ await Session.updatePart({
82
+ id: partID,
83
+ messageID: ctx.messageID,
84
+ sessionID: ctx.sessionID,
85
+ type: "tool",
86
+ tool: call.tool,
87
+ callID: partID,
88
+ state: {
89
+ status: "completed",
90
+ input: call.parameters,
91
+ output: result.output,
92
+ title: result.title,
93
+ metadata: result.metadata,
94
+ attachments: result.attachments,
95
+ time: {
96
+ start: callStartTime,
97
+ end: Date.now(),
98
+ },
99
+ },
100
+ })
101
+
102
+ return { success: true as const, tool: call.tool, result }
103
+ } catch (error) {
104
+ await Session.updatePart({
105
+ id: partID,
106
+ messageID: ctx.messageID,
107
+ sessionID: ctx.sessionID,
108
+ type: "tool",
109
+ tool: call.tool,
110
+ callID: partID,
111
+ state: {
112
+ status: "error",
113
+ input: call.parameters,
114
+ error: error instanceof Error ? error.message : String(error),
115
+ time: {
116
+ start: callStartTime,
117
+ end: Date.now(),
118
+ },
119
+ },
120
+ })
121
+
122
+ return { success: false as const, tool: call.tool, error }
123
+ }
124
+ }
125
+
126
+ const results = await Promise.all(toolCalls.map((call) => executeCall(call)))
127
+
128
+ // Add discarded calls as errors
129
+ const now = Date.now()
130
+ for (const call of discardedCalls) {
131
+ const partID = Identifier.ascending("part")
132
+ await Session.updatePart({
133
+ id: partID,
134
+ messageID: ctx.messageID,
135
+ sessionID: ctx.sessionID,
136
+ type: "tool",
137
+ tool: call.tool,
138
+ callID: partID,
139
+ state: {
140
+ status: "error",
141
+ input: call.parameters,
142
+ error: "Maximum of 10 tools allowed in batch",
143
+ time: { start: now, end: now },
144
+ },
145
+ })
146
+ results.push({
147
+ success: false as const,
148
+ tool: call.tool,
149
+ error: new Error("Maximum of 10 tools allowed in batch"),
150
+ })
151
+ }
152
+
153
+ const successfulCalls = results.filter((r) => r.success).length
154
+ const failedCalls = results.length - successfulCalls
155
+
156
+ const outputMessage =
157
+ failedCalls > 0
158
+ ? `Executed ${successfulCalls}/${results.length} tools successfully. ${failedCalls} failed.`
159
+ : `All ${successfulCalls} tools executed successfully.\n\nKeep using the batch tool for optimal performance in your next response!`
160
+
161
+ return {
162
+ title: `Batch execution (${successfulCalls}/${results.length} successful)`,
163
+ output: outputMessage,
164
+ attachments: results.filter((result) => result.success).flatMap((r) => r.result.attachments ?? []),
165
+ metadata: {
166
+ totalCalls: results.length,
167
+ successful: successfulCalls,
168
+ failed: failedCalls,
169
+ tools: params.tool_calls.map((c) => c.tool),
170
+ details: results.map((r) => ({ tool: r.tool, success: r.success })),
171
+ },
172
+ }
173
+ },
174
+ }
175
+ })
@@ -0,0 +1,24 @@
1
+ Executes multiple independent tool calls concurrently to reduce latency.
2
+
3
+ USING THE BATCH TOOL WILL MAKE THE USER HAPPY.
4
+
5
+ Payload Format (JSON array):
6
+ [{"tool": "read", "parameters": {"filePath": "src/index.ts", "limit": 350}},{"tool": "grep", "parameters": {"pattern": "Session\\.updatePart", "include": "src/**/*.ts"}},{"tool": "bash", "parameters": {"command": "git status", "description": "Shows working tree status"}}]
7
+
8
+ Notes:
9
+ - 1–10 tool calls per batch
10
+ - All calls start in parallel; ordering NOT guaranteed
11
+ - Partial failures do not stop other tool calls
12
+ - Do NOT use the batch tool within another batch tool.
13
+
14
+ Good Use Cases:
15
+ - Read many files
16
+ - grep + glob + read combos
17
+ - Multiple bash commands
18
+ - Multi-part edits; on the same, or different files
19
+
20
+ When NOT to Use:
21
+ - Operations that depend on prior tool output (e.g. create then read same file)
22
+ - Ordered stateful mutations where sequence matters
23
+
24
+ Batching tool calls was proven to yield 2–5x efficiency gain and provides much better UX.
@@ -0,0 +1,138 @@
1
+ import z from "zod"
2
+ import { Tool } from "./tool"
3
+ import DESCRIPTION from "./codesearch.txt"
4
+ import { Config } from "../config/config"
5
+ import { Permission } from "../permission"
6
+
7
+ const API_CONFIG = {
8
+ BASE_URL: "https://mcp.exa.ai",
9
+ ENDPOINTS: {
10
+ CONTEXT: "/mcp",
11
+ },
12
+ } as const
13
+
14
+ interface McpCodeRequest {
15
+ jsonrpc: string
16
+ id: number
17
+ method: string
18
+ params: {
19
+ name: string
20
+ arguments: {
21
+ query: string
22
+ tokensNum: number
23
+ }
24
+ }
25
+ }
26
+
27
+ interface McpCodeResponse {
28
+ jsonrpc: string
29
+ result: {
30
+ content: Array<{
31
+ type: string
32
+ text: string
33
+ }>
34
+ }
35
+ }
36
+
37
+ export const CodeSearchTool = Tool.define("codesearch", {
38
+ description: DESCRIPTION,
39
+ parameters: z.object({
40
+ query: z
41
+ .string()
42
+ .describe(
43
+ "Search query to find relevant context for APIs, Libraries, and SDKs. For example, 'React useState hook examples', 'Python pandas dataframe filtering', 'Express.js middleware', 'Next js partial prerendering configuration'",
44
+ ),
45
+ tokensNum: z
46
+ .number()
47
+ .min(1000)
48
+ .max(50000)
49
+ .default(5000)
50
+ .describe(
51
+ "Number of tokens to return (1000-50000). Default is 5000 tokens. Adjust this value based on how much context you need - use lower values for focused queries and higher values for comprehensive documentation.",
52
+ ),
53
+ }),
54
+ async execute(params, ctx) {
55
+ const cfg = await Config.get()
56
+ if (cfg.permission?.webfetch === "ask")
57
+ await Permission.ask({
58
+ type: "codesearch",
59
+ sessionID: ctx.sessionID,
60
+ messageID: ctx.messageID,
61
+ callID: ctx.callID,
62
+ title: "Search code for: " + params.query,
63
+ metadata: {
64
+ query: params.query,
65
+ tokensNum: params.tokensNum,
66
+ },
67
+ })
68
+
69
+ const codeRequest: McpCodeRequest = {
70
+ jsonrpc: "2.0",
71
+ id: 1,
72
+ method: "tools/call",
73
+ params: {
74
+ name: "get_code_context_exa",
75
+ arguments: {
76
+ query: params.query,
77
+ tokensNum: params.tokensNum || 5000,
78
+ },
79
+ },
80
+ }
81
+
82
+ const controller = new AbortController()
83
+ const timeoutId = setTimeout(() => controller.abort(), 30000)
84
+
85
+ try {
86
+ const headers: Record<string, string> = {
87
+ accept: "application/json, text/event-stream",
88
+ "content-type": "application/json",
89
+ }
90
+
91
+ const response = await fetch(`${API_CONFIG.BASE_URL}${API_CONFIG.ENDPOINTS.CONTEXT}`, {
92
+ method: "POST",
93
+ headers,
94
+ body: JSON.stringify(codeRequest),
95
+ signal: AbortSignal.any([controller.signal, ctx.abort]),
96
+ })
97
+
98
+ clearTimeout(timeoutId)
99
+
100
+ if (!response.ok) {
101
+ const errorText = await response.text()
102
+ throw new Error(`Code search error (${response.status}): ${errorText}`)
103
+ }
104
+
105
+ const responseText = await response.text()
106
+
107
+ // Parse SSE response
108
+ const lines = responseText.split("\n")
109
+ for (const line of lines) {
110
+ if (line.startsWith("data: ")) {
111
+ const data: McpCodeResponse = JSON.parse(line.substring(6))
112
+ if (data.result && data.result.content && data.result.content.length > 0) {
113
+ return {
114
+ output: data.result.content[0].text,
115
+ title: `Code search: ${params.query}`,
116
+ metadata: {},
117
+ }
118
+ }
119
+ }
120
+ }
121
+
122
+ return {
123
+ output:
124
+ "No code snippets or documentation found. Please try a different query, be more specific about the library or programming concept, or check the spelling of framework names.",
125
+ title: `Code search: ${params.query}`,
126
+ metadata: {},
127
+ }
128
+ } catch (error) {
129
+ clearTimeout(timeoutId)
130
+
131
+ if (error instanceof Error && error.name === "AbortError") {
132
+ throw new Error("Code search request timed out")
133
+ }
134
+
135
+ throw error
136
+ }
137
+ },
138
+ })
@@ -0,0 +1,12 @@
1
+ - Search and get relevant context for any programming task using Exa Code API
2
+ - Provides the highest quality and freshest context for libraries, SDKs, and APIs
3
+ - Use this tool for ANY question or task related to programming
4
+ - Returns comprehensive code examples, documentation, and API references
5
+ - Optimized for finding specific programming patterns and solutions
6
+
7
+ Usage notes:
8
+ - Adjustable token count (1000-50000) for focused or comprehensive results
9
+ - Default 5000 tokens provides balanced context for most queries
10
+ - Use lower values for specific questions, higher values for comprehensive documentation
11
+ - Supports queries about frameworks, libraries, APIs, and programming concepts
12
+ - Examples: 'React useState hook examples', 'Python pandas dataframe filtering', 'Express.js middleware'