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.
- package/AGENTS.md +27 -0
- package/README.md +15 -0
- package/bin/bincode +98 -0
- package/bunfig.toml +4 -0
- package/package.json +124 -0
- package/parsers-config.ts +239 -0
- package/script/build.ts +167 -0
- package/script/postinstall.mjs +206 -0
- package/script/publish.ts +99 -0
- package/script/schema.ts +47 -0
- package/src/acp/README.md +164 -0
- package/src/acp/agent.ts +1051 -0
- package/src/acp/session.ts +101 -0
- package/src/acp/types.ts +22 -0
- package/src/agent/agent.ts +398 -0
- package/src/agent/generate.txt +75 -0
- package/src/agent/prompt/compaction.txt +12 -0
- package/src/agent/prompt/explore.txt +18 -0
- package/src/agent/prompt/summary.txt +10 -0
- package/src/agent/prompt/title.txt +36 -0
- package/src/auth/bineric-login.ts +506 -0
- package/src/auth/index.ts +70 -0
- package/src/bun/index.ts +114 -0
- package/src/bus/bus-event.ts +43 -0
- package/src/bus/global.ts +10 -0
- package/src/bus/index.ts +105 -0
- package/src/cli/auth-check.ts +61 -0
- package/src/cli/bootstrap.ts +21 -0
- package/src/cli/cmd/acp.ts +88 -0
- package/src/cli/cmd/agent.ts +256 -0
- package/src/cli/cmd/auth.ts +436 -0
- package/src/cli/cmd/cmd.ts +7 -0
- package/src/cli/cmd/debug/config.ts +15 -0
- package/src/cli/cmd/debug/file.ts +91 -0
- package/src/cli/cmd/debug/index.ts +43 -0
- package/src/cli/cmd/debug/lsp.ts +48 -0
- package/src/cli/cmd/debug/ripgrep.ts +83 -0
- package/src/cli/cmd/debug/scrap.ts +15 -0
- package/src/cli/cmd/debug/skill.ts +15 -0
- package/src/cli/cmd/debug/snapshot.ts +48 -0
- package/src/cli/cmd/export.ts +88 -0
- package/src/cli/cmd/generate.ts +38 -0
- package/src/cli/cmd/github.ts +1399 -0
- package/src/cli/cmd/import.ts +98 -0
- package/src/cli/cmd/login.ts +112 -0
- package/src/cli/cmd/logout.ts +38 -0
- package/src/cli/cmd/mcp.ts +654 -0
- package/src/cli/cmd/models.ts +77 -0
- package/src/cli/cmd/pr.ts +112 -0
- package/src/cli/cmd/run.ts +368 -0
- package/src/cli/cmd/serve.ts +31 -0
- package/src/cli/cmd/session.ts +106 -0
- package/src/cli/cmd/stats.ts +298 -0
- package/src/cli/cmd/tui/app.tsx +669 -0
- package/src/cli/cmd/tui/attach.ts +30 -0
- package/src/cli/cmd/tui/component/border.tsx +21 -0
- package/src/cli/cmd/tui/component/dialog-agent.tsx +31 -0
- package/src/cli/cmd/tui/component/dialog-command.tsx +123 -0
- package/src/cli/cmd/tui/component/dialog-mcp.tsx +86 -0
- package/src/cli/cmd/tui/component/dialog-model.tsx +223 -0
- package/src/cli/cmd/tui/component/dialog-provider.tsx +224 -0
- package/src/cli/cmd/tui/component/dialog-session-list.tsx +102 -0
- package/src/cli/cmd/tui/component/dialog-session-rename.tsx +31 -0
- package/src/cli/cmd/tui/component/dialog-status.tsx +162 -0
- package/src/cli/cmd/tui/component/dialog-tag.tsx +44 -0
- package/src/cli/cmd/tui/component/dialog-theme-list.tsx +50 -0
- package/src/cli/cmd/tui/component/logo.tsx +32 -0
- package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +560 -0
- package/src/cli/cmd/tui/component/prompt/history.tsx +108 -0
- package/src/cli/cmd/tui/component/prompt/index.tsx +1052 -0
- package/src/cli/cmd/tui/context/args.tsx +14 -0
- package/src/cli/cmd/tui/context/directory.ts +13 -0
- package/src/cli/cmd/tui/context/exit.tsx +23 -0
- package/src/cli/cmd/tui/context/helper.tsx +25 -0
- package/src/cli/cmd/tui/context/keybind.tsx +101 -0
- package/src/cli/cmd/tui/context/kv.tsx +49 -0
- package/src/cli/cmd/tui/context/local.tsx +339 -0
- package/src/cli/cmd/tui/context/prompt.tsx +18 -0
- package/src/cli/cmd/tui/context/route.tsx +46 -0
- package/src/cli/cmd/tui/context/sdk.tsx +74 -0
- package/src/cli/cmd/tui/context/sync.tsx +372 -0
- package/src/cli/cmd/tui/context/theme/aura.json +69 -0
- package/src/cli/cmd/tui/context/theme/ayu.json +80 -0
- package/src/cli/cmd/tui/context/theme/bincode.json +245 -0
- package/src/cli/cmd/tui/context/theme/catppuccin-frappe.json +233 -0
- package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +233 -0
- package/src/cli/cmd/tui/context/theme/catppuccin.json +112 -0
- package/src/cli/cmd/tui/context/theme/cobalt2.json +228 -0
- package/src/cli/cmd/tui/context/theme/cursor.json +249 -0
- package/src/cli/cmd/tui/context/theme/dracula.json +219 -0
- package/src/cli/cmd/tui/context/theme/everforest.json +241 -0
- package/src/cli/cmd/tui/context/theme/flexoki.json +237 -0
- package/src/cli/cmd/tui/context/theme/github.json +233 -0
- package/src/cli/cmd/tui/context/theme/gruvbox.json +95 -0
- package/src/cli/cmd/tui/context/theme/kanagawa.json +77 -0
- package/src/cli/cmd/tui/context/theme/lucent-orng.json +227 -0
- package/src/cli/cmd/tui/context/theme/material.json +235 -0
- package/src/cli/cmd/tui/context/theme/matrix.json +77 -0
- package/src/cli/cmd/tui/context/theme/mercury.json +252 -0
- package/src/cli/cmd/tui/context/theme/monokai.json +221 -0
- package/src/cli/cmd/tui/context/theme/nightowl.json +221 -0
- package/src/cli/cmd/tui/context/theme/nord.json +223 -0
- package/src/cli/cmd/tui/context/theme/one-dark.json +84 -0
- package/src/cli/cmd/tui/context/theme/orng.json +245 -0
- package/src/cli/cmd/tui/context/theme/palenight.json +222 -0
- package/src/cli/cmd/tui/context/theme/rosepine.json +234 -0
- package/src/cli/cmd/tui/context/theme/solarized.json +223 -0
- package/src/cli/cmd/tui/context/theme/synthwave84.json +226 -0
- package/src/cli/cmd/tui/context/theme/tokyonight.json +243 -0
- package/src/cli/cmd/tui/context/theme/vercel.json +245 -0
- package/src/cli/cmd/tui/context/theme/vesper.json +218 -0
- package/src/cli/cmd/tui/context/theme/zenburn.json +223 -0
- package/src/cli/cmd/tui/context/theme.tsx +1109 -0
- package/src/cli/cmd/tui/event.ts +40 -0
- package/src/cli/cmd/tui/routes/home.tsx +105 -0
- package/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +64 -0
- package/src/cli/cmd/tui/routes/session/dialog-message.tsx +109 -0
- package/src/cli/cmd/tui/routes/session/dialog-subagent.tsx +26 -0
- package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +47 -0
- package/src/cli/cmd/tui/routes/session/footer.tsx +88 -0
- package/src/cli/cmd/tui/routes/session/header.tsx +141 -0
- package/src/cli/cmd/tui/routes/session/index.tsx +1888 -0
- package/src/cli/cmd/tui/routes/session/sidebar.tsx +321 -0
- package/src/cli/cmd/tui/spawn.ts +60 -0
- package/src/cli/cmd/tui/thread.ts +120 -0
- package/src/cli/cmd/tui/ui/dialog-alert.tsx +57 -0
- package/src/cli/cmd/tui/ui/dialog-confirm.tsx +83 -0
- package/src/cli/cmd/tui/ui/dialog-help.tsx +38 -0
- package/src/cli/cmd/tui/ui/dialog-prompt.tsx +77 -0
- package/src/cli/cmd/tui/ui/dialog-select.tsx +330 -0
- package/src/cli/cmd/tui/ui/dialog.tsx +170 -0
- package/src/cli/cmd/tui/ui/spinner.ts +368 -0
- package/src/cli/cmd/tui/ui/toast.tsx +100 -0
- package/src/cli/cmd/tui/util/clipboard.ts +127 -0
- package/src/cli/cmd/tui/util/editor.ts +32 -0
- package/src/cli/cmd/tui/util/terminal.ts +114 -0
- package/src/cli/cmd/tui/worker.ts +63 -0
- package/src/cli/cmd/uninstall.ts +344 -0
- package/src/cli/cmd/upgrade.ts +67 -0
- package/src/cli/cmd/web.ts +84 -0
- package/src/cli/error.ts +55 -0
- package/src/cli/ui.ts +84 -0
- package/src/cli/upgrade.ts +25 -0
- package/src/command/index.ts +80 -0
- package/src/command/template/initialize.txt +10 -0
- package/src/command/template/review.txt +97 -0
- package/src/config/config.ts +995 -0
- package/src/config/markdown.ts +41 -0
- package/src/env/index.ts +26 -0
- package/src/file/ignore.ts +83 -0
- package/src/file/index.ts +328 -0
- package/src/file/ripgrep.ts +393 -0
- package/src/file/time.ts +64 -0
- package/src/file/watcher.ts +103 -0
- package/src/flag/flag.ts +46 -0
- package/src/format/formatter.ts +315 -0
- package/src/format/index.ts +137 -0
- package/src/global/index.ts +52 -0
- package/src/id/id.ts +73 -0
- package/src/ide/index.ts +76 -0
- package/src/index.ts +217 -0
- package/src/installation/index.ts +196 -0
- package/src/lsp/client.ts +229 -0
- package/src/lsp/index.ts +485 -0
- package/src/lsp/language.ts +116 -0
- package/src/lsp/server.ts +1895 -0
- package/src/mcp/auth.ts +135 -0
- package/src/mcp/index.ts +654 -0
- package/src/mcp/oauth-callback.ts +200 -0
- package/src/mcp/oauth-provider.ts +154 -0
- package/src/patch/index.ts +622 -0
- package/src/permission/index.ts +199 -0
- package/src/plugin/index.ts +101 -0
- package/src/project/bootstrap.ts +31 -0
- package/src/project/instance.ts +78 -0
- package/src/project/project.ts +221 -0
- package/src/project/state.ts +65 -0
- package/src/project/vcs.ts +76 -0
- package/src/provider/auth.ts +143 -0
- package/src/provider/models-macro.ts +11 -0
- package/src/provider/models.ts +106 -0
- package/src/provider/provider.ts +1071 -0
- package/src/provider/sdk/openai-compatible/src/README.md +5 -0
- package/src/provider/sdk/openai-compatible/src/index.ts +2 -0
- package/src/provider/sdk/openai-compatible/src/openai-compatible-provider.ts +101 -0
- package/src/provider/sdk/openai-compatible/src/responses/convert-to-openai-responses-input.ts +303 -0
- package/src/provider/sdk/openai-compatible/src/responses/map-openai-responses-finish-reason.ts +22 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-config.ts +18 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-error.ts +22 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-api-types.ts +207 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-language-model.ts +1713 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-prepare-tools.ts +177 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-settings.ts +1 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/code-interpreter.ts +88 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/file-search.ts +128 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/image-generation.ts +115 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/local-shell.ts +65 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/web-search-preview.ts +104 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/web-search.ts +103 -0
- package/src/provider/transform.ts +455 -0
- package/src/pty/index.ts +231 -0
- package/src/server/error.ts +36 -0
- package/src/server/project.ts +79 -0
- package/src/server/server.ts +2642 -0
- package/src/server/tui.ts +71 -0
- package/src/session/compaction.ts +223 -0
- package/src/session/index.ts +458 -0
- package/src/session/llm.ts +201 -0
- package/src/session/message-v2.ts +659 -0
- package/src/session/message.ts +189 -0
- package/src/session/processor.ts +409 -0
- package/src/session/prompt/anthropic-20250930.txt +166 -0
- package/src/session/prompt/anthropic.txt +104 -0
- package/src/session/prompt/anthropic_spoof.txt +1 -0
- package/src/session/prompt/beast.txt +147 -0
- package/src/session/prompt/build-switch.txt +5 -0
- package/src/session/prompt/codex.txt +318 -0
- package/src/session/prompt/copilot-gpt-5.txt +143 -0
- package/src/session/prompt/gemini.txt +155 -0
- package/src/session/prompt/max-steps.txt +16 -0
- package/src/session/prompt/plan-reminder-anthropic.txt +67 -0
- package/src/session/prompt/plan.txt +26 -0
- package/src/session/prompt/polaris.txt +106 -0
- package/src/session/prompt/qwen.txt +109 -0
- package/src/session/prompt.ts +1446 -0
- package/src/session/retry.ts +86 -0
- package/src/session/revert.ts +108 -0
- package/src/session/status.ts +76 -0
- package/src/session/summary.ts +194 -0
- package/src/session/system.ts +120 -0
- package/src/session/todo.ts +37 -0
- package/src/share/share-next.ts +194 -0
- package/src/share/share.ts +87 -0
- package/src/shell/shell.ts +67 -0
- package/src/skill/index.ts +1 -0
- package/src/skill/skill.ts +83 -0
- package/src/snapshot/index.ts +197 -0
- package/src/storage/storage.ts +226 -0
- package/src/tool/bash.ts +306 -0
- package/src/tool/bash.txt +158 -0
- package/src/tool/batch.ts +175 -0
- package/src/tool/batch.txt +24 -0
- package/src/tool/codesearch.ts +138 -0
- package/src/tool/codesearch.txt +12 -0
- package/src/tool/edit.ts +675 -0
- package/src/tool/edit.txt +10 -0
- package/src/tool/glob.ts +65 -0
- package/src/tool/glob.txt +6 -0
- package/src/tool/grep.ts +121 -0
- package/src/tool/grep.txt +8 -0
- package/src/tool/invalid.ts +17 -0
- package/src/tool/ls.ts +110 -0
- package/src/tool/ls.txt +1 -0
- package/src/tool/lsp-diagnostics.ts +26 -0
- package/src/tool/lsp-diagnostics.txt +1 -0
- package/src/tool/lsp-hover.ts +31 -0
- package/src/tool/lsp-hover.txt +1 -0
- package/src/tool/lsp.ts +87 -0
- package/src/tool/lsp.txt +19 -0
- package/src/tool/multiedit.ts +46 -0
- package/src/tool/multiedit.txt +41 -0
- package/src/tool/patch.ts +233 -0
- package/src/tool/patch.txt +1 -0
- package/src/tool/read.ts +219 -0
- package/src/tool/read.txt +12 -0
- package/src/tool/registry.ts +162 -0
- package/src/tool/skill.ts +100 -0
- package/src/tool/task.ts +136 -0
- package/src/tool/task.txt +60 -0
- package/src/tool/todo.ts +39 -0
- package/src/tool/todoread.txt +14 -0
- package/src/tool/todowrite.txt +167 -0
- package/src/tool/tool.ts +71 -0
- package/src/tool/webfetch.ts +187 -0
- package/src/tool/webfetch.txt +13 -0
- package/src/tool/websearch.ts +150 -0
- package/src/tool/websearch.txt +11 -0
- package/src/tool/write.ts +110 -0
- package/src/tool/write.txt +8 -0
- package/src/util/archive.ts +16 -0
- package/src/util/color.ts +19 -0
- package/src/util/context.ts +25 -0
- package/src/util/defer.ts +12 -0
- package/src/util/eventloop.ts +20 -0
- package/src/util/filesystem.ts +83 -0
- package/src/util/fn.ts +11 -0
- package/src/util/iife.ts +3 -0
- package/src/util/keybind.ts +102 -0
- package/src/util/lazy.ts +11 -0
- package/src/util/locale.ts +81 -0
- package/src/util/lock.ts +98 -0
- package/src/util/log.ts +180 -0
- package/src/util/queue.ts +32 -0
- package/src/util/rpc.ts +42 -0
- package/src/util/scrap.ts +10 -0
- package/src/util/signal.ts +12 -0
- package/src/util/timeout.ts +14 -0
- package/src/util/token.ts +7 -0
- package/src/util/wildcard.ts +54 -0
- 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'
|