neoctl 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/README.md +146 -0
  2. package/dist/agents/agent-definition.d.ts +39 -0
  3. package/dist/agents/agent-definition.js +57 -0
  4. package/dist/agents/agent-definition.js.map +1 -0
  5. package/dist/agents/agent-tool.d.ts +38 -0
  6. package/dist/agents/agent-tool.js +336 -0
  7. package/dist/agents/agent-tool.js.map +1 -0
  8. package/dist/agents/local-agent-task.d.ts +52 -0
  9. package/dist/agents/local-agent-task.js +63 -0
  10. package/dist/agents/local-agent-task.js.map +1 -0
  11. package/dist/agents/smoke-agents.d.ts +1 -0
  12. package/dist/agents/smoke-agents.js +142 -0
  13. package/dist/agents/smoke-agents.js.map +1 -0
  14. package/dist/agents/team.d.ts +10 -0
  15. package/dist/agents/team.js +2 -0
  16. package/dist/agents/team.js.map +1 -0
  17. package/dist/app/app-state.d.ts +21 -0
  18. package/dist/app/app-state.js +24 -0
  19. package/dist/app/app-state.js.map +1 -0
  20. package/dist/context/compaction.d.ts +49 -0
  21. package/dist/context/compaction.js +334 -0
  22. package/dist/context/compaction.js.map +1 -0
  23. package/dist/context/context-manager.d.ts +53 -0
  24. package/dist/context/context-manager.js +98 -0
  25. package/dist/context/context-manager.js.map +1 -0
  26. package/dist/context/prompts.d.ts +22 -0
  27. package/dist/context/prompts.js +84 -0
  28. package/dist/context/prompts.js.map +1 -0
  29. package/dist/context/smoke-context.d.ts +1 -0
  30. package/dist/context/smoke-context.js +151 -0
  31. package/dist/context/smoke-context.js.map +1 -0
  32. package/dist/core/assistant-output-filter.d.ts +9 -0
  33. package/dist/core/assistant-output-filter.js +78 -0
  34. package/dist/core/assistant-output-filter.js.map +1 -0
  35. package/dist/core/context-metrics.d.ts +10 -0
  36. package/dist/core/context-metrics.js +77 -0
  37. package/dist/core/context-metrics.js.map +1 -0
  38. package/dist/core/message-pipeline.d.ts +10 -0
  39. package/dist/core/message-pipeline.js +138 -0
  40. package/dist/core/message-pipeline.js.map +1 -0
  41. package/dist/core/query-engine.d.ts +86 -0
  42. package/dist/core/query-engine.js +337 -0
  43. package/dist/core/query-engine.js.map +1 -0
  44. package/dist/core/query.d.ts +47 -0
  45. package/dist/core/query.js +408 -0
  46. package/dist/core/query.js.map +1 -0
  47. package/dist/core/run-agent.d.ts +48 -0
  48. package/dist/core/run-agent.js +150 -0
  49. package/dist/core/run-agent.js.map +1 -0
  50. package/dist/core/smoke-core-loop.d.ts +1 -0
  51. package/dist/core/smoke-core-loop.js +42 -0
  52. package/dist/core/smoke-core-loop.js.map +1 -0
  53. package/dist/core/state.d.ts +37 -0
  54. package/dist/core/state.js +31 -0
  55. package/dist/core/state.js.map +1 -0
  56. package/dist/index.d.ts +42 -0
  57. package/dist/index.js +43 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/model/communication-logger.d.ts +30 -0
  60. package/dist/model/communication-logger.js +218 -0
  61. package/dist/model/communication-logger.js.map +1 -0
  62. package/dist/model/config.d.ts +25 -0
  63. package/dist/model/config.js +65 -0
  64. package/dist/model/config.js.map +1 -0
  65. package/dist/model/context-window.d.ts +32 -0
  66. package/dist/model/context-window.js +76 -0
  67. package/dist/model/context-window.js.map +1 -0
  68. package/dist/model/credentials.d.ts +13 -0
  69. package/dist/model/credentials.js +19 -0
  70. package/dist/model/credentials.js.map +1 -0
  71. package/dist/model/env.d.ts +8 -0
  72. package/dist/model/env.js +36 -0
  73. package/dist/model/env.js.map +1 -0
  74. package/dist/model/errors.d.ts +42 -0
  75. package/dist/model/errors.js +74 -0
  76. package/dist/model/errors.js.map +1 -0
  77. package/dist/model/http-transport.d.ts +26 -0
  78. package/dist/model/http-transport.js +118 -0
  79. package/dist/model/http-transport.js.map +1 -0
  80. package/dist/model/model-gateway.d.ts +103 -0
  81. package/dist/model/model-gateway.js +15 -0
  82. package/dist/model/model-gateway.js.map +1 -0
  83. package/dist/model/model-metadata.json +677 -0
  84. package/dist/model/openai-adapter.d.ts +34 -0
  85. package/dist/model/openai-adapter.js +152 -0
  86. package/dist/model/openai-adapter.js.map +1 -0
  87. package/dist/model/openai-chat-mapper.d.ts +11 -0
  88. package/dist/model/openai-chat-mapper.js +114 -0
  89. package/dist/model/openai-chat-mapper.js.map +1 -0
  90. package/dist/model/openai-mappers.d.ts +21 -0
  91. package/dist/model/openai-mappers.js +261 -0
  92. package/dist/model/openai-mappers.js.map +1 -0
  93. package/dist/model/openai-responses-adapter.d.ts +2 -0
  94. package/dist/model/openai-responses-adapter.js +2 -0
  95. package/dist/model/openai-responses-adapter.js.map +1 -0
  96. package/dist/model/openai-responses-mapper.d.ts +11 -0
  97. package/dist/model/openai-responses-mapper.js +218 -0
  98. package/dist/model/openai-responses-mapper.js.map +1 -0
  99. package/dist/model/provider-adapter.d.ts +17 -0
  100. package/dist/model/provider-adapter.js +2 -0
  101. package/dist/model/provider-adapter.js.map +1 -0
  102. package/dist/model/provider-factory.d.ts +4 -0
  103. package/dist/model/provider-factory.js +29 -0
  104. package/dist/model/provider-factory.js.map +1 -0
  105. package/dist/model/retry-runner.d.ts +8 -0
  106. package/dist/model/retry-runner.js +28 -0
  107. package/dist/model/retry-runner.js.map +1 -0
  108. package/dist/model/smoke-openai.d.ts +1 -0
  109. package/dist/model/smoke-openai.js +44 -0
  110. package/dist/model/smoke-openai.js.map +1 -0
  111. package/dist/model/smoke-responses-mapper.d.ts +1 -0
  112. package/dist/model/smoke-responses-mapper.js +72 -0
  113. package/dist/model/smoke-responses-mapper.js.map +1 -0
  114. package/dist/model/sse-decoder.d.ts +5 -0
  115. package/dist/model/sse-decoder.js +79 -0
  116. package/dist/model/sse-decoder.js.map +1 -0
  117. package/dist/repl/clipboard.d.ts +14 -0
  118. package/dist/repl/clipboard.js +92 -0
  119. package/dist/repl/clipboard.js.map +1 -0
  120. package/dist/repl/commands.d.ts +38 -0
  121. package/dist/repl/commands.js +86 -0
  122. package/dist/repl/commands.js.map +1 -0
  123. package/dist/repl/index.d.ts +2 -0
  124. package/dist/repl/index.js +2836 -0
  125. package/dist/repl/index.js.map +1 -0
  126. package/dist/repl/markdown-renderer.d.ts +81 -0
  127. package/dist/repl/markdown-renderer.js +546 -0
  128. package/dist/repl/markdown-renderer.js.map +1 -0
  129. package/dist/repl/render.d.ts +2 -0
  130. package/dist/repl/render.js +45 -0
  131. package/dist/repl/render.js.map +1 -0
  132. package/dist/repl/status-line.d.ts +19 -0
  133. package/dist/repl/status-line.js +160 -0
  134. package/dist/repl/status-line.js.map +1 -0
  135. package/dist/safety/audit.d.ts +10 -0
  136. package/dist/safety/audit.js +2 -0
  137. package/dist/safety/audit.js.map +1 -0
  138. package/dist/safety/permissions.d.ts +10 -0
  139. package/dist/safety/permissions.js +2 -0
  140. package/dist/safety/permissions.js.map +1 -0
  141. package/dist/safety/sandbox.d.ts +6 -0
  142. package/dist/safety/sandbox.js +2 -0
  143. package/dist/safety/sandbox.js.map +1 -0
  144. package/dist/session/session-store.d.ts +98 -0
  145. package/dist/session/session-store.js +249 -0
  146. package/dist/session/session-store.js.map +1 -0
  147. package/dist/session/smoke-session.d.ts +1 -0
  148. package/dist/session/smoke-session.js +85 -0
  149. package/dist/session/smoke-session.js.map +1 -0
  150. package/dist/session/tool-result-memory.d.ts +64 -0
  151. package/dist/session/tool-result-memory.js +303 -0
  152. package/dist/session/tool-result-memory.js.map +1 -0
  153. package/dist/skills/skill-tool.d.ts +28 -0
  154. package/dist/skills/skill-tool.js +107 -0
  155. package/dist/skills/skill-tool.js.map +1 -0
  156. package/dist/skills/smoke-skills.d.ts +1 -0
  157. package/dist/skills/smoke-skills.js +60 -0
  158. package/dist/skills/smoke-skills.js.map +1 -0
  159. package/dist/tasks/task-store.d.ts +43 -0
  160. package/dist/tasks/task-store.js +150 -0
  161. package/dist/tasks/task-store.js.map +1 -0
  162. package/dist/tasks/task-tools.d.ts +31 -0
  163. package/dist/tasks/task-tools.js +232 -0
  164. package/dist/tasks/task-tools.js.map +1 -0
  165. package/dist/tools/builtins/echo-tool.d.ts +4 -0
  166. package/dist/tools/builtins/echo-tool.js +26 -0
  167. package/dist/tools/builtins/echo-tool.js.map +1 -0
  168. package/dist/tools/builtins/edit-tool.d.ts +30 -0
  169. package/dist/tools/builtins/edit-tool.js +423 -0
  170. package/dist/tools/builtins/edit-tool.js.map +1 -0
  171. package/dist/tools/builtins/exec-tool.d.ts +18 -0
  172. package/dist/tools/builtins/exec-tool.js +290 -0
  173. package/dist/tools/builtins/exec-tool.js.map +1 -0
  174. package/dist/tools/builtins/filesystem-tools.d.ts +16 -0
  175. package/dist/tools/builtins/filesystem-tools.js +306 -0
  176. package/dist/tools/builtins/filesystem-tools.js.map +1 -0
  177. package/dist/tools/builtins/grep-tool.d.ts +56 -0
  178. package/dist/tools/builtins/grep-tool.js +320 -0
  179. package/dist/tools/builtins/grep-tool.js.map +1 -0
  180. package/dist/tools/builtins/ripgrep-binary.d.ts +6 -0
  181. package/dist/tools/builtins/ripgrep-binary.js +51 -0
  182. package/dist/tools/builtins/ripgrep-binary.js.map +1 -0
  183. package/dist/tools/builtins/search-providers.d.ts +49 -0
  184. package/dist/tools/builtins/search-providers.js +240 -0
  185. package/dist/tools/builtins/search-providers.js.map +1 -0
  186. package/dist/tools/builtins/search-tool.d.ts +18 -0
  187. package/dist/tools/builtins/search-tool.js +171 -0
  188. package/dist/tools/builtins/search-tool.js.map +1 -0
  189. package/dist/tools/registry.d.ts +18 -0
  190. package/dist/tools/registry.js +69 -0
  191. package/dist/tools/registry.js.map +1 -0
  192. package/dist/tools/run-tool-use.d.ts +13 -0
  193. package/dist/tools/run-tool-use.js +113 -0
  194. package/dist/tools/run-tool-use.js.map +1 -0
  195. package/dist/tools/schema.d.ts +2 -0
  196. package/dist/tools/schema.js +61 -0
  197. package/dist/tools/schema.js.map +1 -0
  198. package/dist/tools/smoke-tool-system.d.ts +1 -0
  199. package/dist/tools/smoke-tool-system.js +204 -0
  200. package/dist/tools/smoke-tool-system.js.map +1 -0
  201. package/dist/tools/streaming-tool-executor.d.ts +19 -0
  202. package/dist/tools/streaming-tool-executor.js +89 -0
  203. package/dist/tools/streaming-tool-executor.js.map +1 -0
  204. package/dist/tools/tool-orchestration.d.ts +15 -0
  205. package/dist/tools/tool-orchestration.js +89 -0
  206. package/dist/tools/tool-orchestration.js.map +1 -0
  207. package/dist/tools/tool.d.ts +121 -0
  208. package/dist/tools/tool.js +4 -0
  209. package/dist/tools/tool.js.map +1 -0
  210. package/dist/types/events.d.ts +66 -0
  211. package/dist/types/events.js +2 -0
  212. package/dist/types/events.js.map +1 -0
  213. package/dist/types/messages.d.ts +57 -0
  214. package/dist/types/messages.js +42 -0
  215. package/dist/types/messages.js.map +1 -0
  216. package/package.json +49 -0
  217. package/scripts/copy-model-metadata.mjs +4 -0
  218. package/scripts/install-ripgrep.cjs +152 -0
@@ -0,0 +1,240 @@
1
+ export const DEFAULT_SEARCH_PROVIDER = "exa";
2
+ export const DEFAULT_EXA_MCP_URL = "https://mcp.exa.ai/mcp";
3
+ export const DEFAULT_EXA_MCP_TOOL_NAME = "web_search_exa";
4
+ export const DEFAULT_SEARCH_TIMEOUT_MS = 30_000;
5
+ export class SearchProviderError extends Error {
6
+ provider;
7
+ cause;
8
+ constructor(message, provider, cause) {
9
+ super(message);
10
+ this.provider = provider;
11
+ this.cause = cause;
12
+ this.name = "SearchProviderError";
13
+ }
14
+ }
15
+ export function createSearchProvider(config = {}, env = process.env) {
16
+ const provider = (config.provider ?? env.SEARCH_PROVIDER ?? env.WEB_SEARCH_PROVIDER ?? DEFAULT_SEARCH_PROVIDER).trim().toLowerCase();
17
+ switch (provider) {
18
+ case "exa":
19
+ return createExaSearchProvider({
20
+ mcpUrl: config.exa?.mcpUrl ?? env.EXA_MCP_URL ?? env.WEB_SEARCH_EXA_MCP_URL,
21
+ toolName: config.exa?.toolName ?? env.EXA_MCP_TOOL_NAME ?? env.WEB_SEARCH_EXA_TOOL_NAME,
22
+ timeoutMs: config.exa?.timeoutMs ?? parseOptionalInteger(env.SEARCH_TIMEOUT_MS ?? env.WEB_SEARCH_TIMEOUT_MS),
23
+ });
24
+ default:
25
+ throw new SearchProviderError(`Unsupported search provider: ${provider}. Add a provider implementation and register it in createSearchProvider().`, provider);
26
+ }
27
+ }
28
+ export function createExaSearchProvider(config = {}) {
29
+ const mcpUrl = config.mcpUrl?.trim() || DEFAULT_EXA_MCP_URL;
30
+ const toolName = config.toolName?.trim() || DEFAULT_EXA_MCP_TOOL_NAME;
31
+ const timeoutMs = config.timeoutMs ?? DEFAULT_SEARCH_TIMEOUT_MS;
32
+ return {
33
+ name: "exa",
34
+ async search(input, signal) {
35
+ const response = await callExaMcpTool(mcpUrl, toolName, input, timeoutMs, signal);
36
+ return {
37
+ provider: "exa",
38
+ query: input.query,
39
+ results: extractExaResults(response),
40
+ raw: response,
41
+ };
42
+ },
43
+ };
44
+ }
45
+ async function callExaMcpTool(mcpUrl, toolName, input, timeoutMs, signal) {
46
+ const controller = new AbortController();
47
+ const abort = () => controller.abort(signal?.reason);
48
+ const timeout = setTimeout(() => controller.abort(new Error(`Search request timed out after ${timeoutMs}ms`)), timeoutMs);
49
+ signal?.addEventListener("abort", abort, { once: true });
50
+ try {
51
+ const response = await fetch(mcpUrl, {
52
+ method: "POST",
53
+ headers: {
54
+ Accept: "application/json, text/event-stream",
55
+ "Content-Type": "application/json",
56
+ },
57
+ body: JSON.stringify({
58
+ jsonrpc: "2.0",
59
+ id: 1,
60
+ method: "tools/call",
61
+ params: {
62
+ name: toolName,
63
+ arguments: buildExaArguments(input),
64
+ },
65
+ }),
66
+ signal: controller.signal,
67
+ });
68
+ const text = await response.text();
69
+ if (!response.ok) {
70
+ throw new SearchProviderError(`Exa MCP HTTP ${response.status}: ${text.slice(0, 1000)}`, "exa");
71
+ }
72
+ return parseJsonRpcOrSseResponse(text);
73
+ }
74
+ catch (error) {
75
+ if (error instanceof SearchProviderError)
76
+ throw error;
77
+ throw new SearchProviderError(error instanceof Error ? error.message : String(error), "exa", error);
78
+ }
79
+ finally {
80
+ clearTimeout(timeout);
81
+ signal?.removeEventListener("abort", abort);
82
+ }
83
+ }
84
+ function buildExaArguments(input) {
85
+ const args = {
86
+ query: input.query,
87
+ numResults: input.numResults,
88
+ };
89
+ if (input.includeDomains?.length)
90
+ args.includeDomains = input.includeDomains;
91
+ if (input.excludeDomains?.length)
92
+ args.excludeDomains = input.excludeDomains;
93
+ if (input.startPublishedDate)
94
+ args.startPublishedDate = input.startPublishedDate;
95
+ if (input.endPublishedDate)
96
+ args.endPublishedDate = input.endPublishedDate;
97
+ return args;
98
+ }
99
+ function parseJsonRpcOrSseResponse(text) {
100
+ const trimmed = text.trim();
101
+ if (!trimmed)
102
+ throw new SearchProviderError("Exa MCP returned an empty response", "exa");
103
+ const dataMessages = trimmed
104
+ .split(/\r?\n/u)
105
+ .map((rawLine) => rawLine.trim())
106
+ .filter((line) => line.startsWith("data:"))
107
+ .map((line) => line.slice("data:".length).trim())
108
+ .filter((data) => data && data !== "[DONE]");
109
+ if (dataMessages.length === 0)
110
+ return parseJsonRpcMessage(trimmed);
111
+ return parseJsonRpcMessage(dataMessages[0] ?? "{}");
112
+ }
113
+ function parseJsonRpcMessage(jsonText) {
114
+ const message = JSON.parse(jsonText);
115
+ if (isRecord(message.error)) {
116
+ const errorMessage = typeof message.error.message === "string" ? message.error.message : JSON.stringify(message.error);
117
+ throw new SearchProviderError(`Exa MCP error: ${errorMessage}`, "exa");
118
+ }
119
+ if (isRecord(message.result))
120
+ return message.result;
121
+ return message;
122
+ }
123
+ function extractExaResults(response) {
124
+ const structured = extractStructuredExaResults(response);
125
+ if (structured.length > 0)
126
+ return structured;
127
+ const text = extractMcpText(response);
128
+ if (!text)
129
+ return [];
130
+ return parseExaTextResults(text);
131
+ }
132
+ function extractStructuredExaResults(response) {
133
+ const structuredContent = isRecord(response.structuredContent) ? response.structuredContent : undefined;
134
+ const candidates = [
135
+ response.results,
136
+ response.documents,
137
+ structuredContent?.results,
138
+ structuredContent?.documents,
139
+ ];
140
+ for (const candidate of candidates) {
141
+ if (!Array.isArray(candidate))
142
+ continue;
143
+ const results = candidate.map(mapStructuredResult).filter((result) => result !== undefined);
144
+ if (results.length > 0)
145
+ return results;
146
+ }
147
+ return [];
148
+ }
149
+ function mapStructuredResult(value) {
150
+ if (!isRecord(value))
151
+ return undefined;
152
+ const url = stringFrom(value.url) ?? stringFrom(value.id);
153
+ if (!url)
154
+ return undefined;
155
+ const title = stringFrom(value.title) ?? url;
156
+ const highlights = arrayOfStrings(value.highlights ?? value.snippets ?? value.texts);
157
+ return {
158
+ title,
159
+ url,
160
+ published: stringFrom(value.publishedDate ?? value.published ?? value.date),
161
+ author: stringFrom(value.author),
162
+ highlights: highlights.length ? highlights : undefined,
163
+ text: stringFrom(value.text ?? value.summary),
164
+ score: typeof value.score === "number" ? value.score : undefined,
165
+ raw: value,
166
+ };
167
+ }
168
+ function extractMcpText(response) {
169
+ const content = response.content;
170
+ if (!Array.isArray(content))
171
+ return "";
172
+ return content
173
+ .map((item) => (isRecord(item) && item.type === "text" && typeof item.text === "string" ? item.text.trim() : ""))
174
+ .filter(Boolean)
175
+ .join("\n\n")
176
+ .trim();
177
+ }
178
+ function parseExaTextResults(text) {
179
+ return text
180
+ .split(/\n---\n/u)
181
+ .map((entry) => entry.trim())
182
+ .filter(Boolean)
183
+ .map(parseExaTextEntry)
184
+ .filter((result) => result !== undefined);
185
+ }
186
+ function parseExaTextEntry(entry) {
187
+ const lines = entry.split(/\r?\n/u);
188
+ const title = readLabel(lines, "Title") ?? "Untitled";
189
+ const url = readLabel(lines, "URL");
190
+ if (!url)
191
+ return undefined;
192
+ const published = normalizeOptionalLabel(readLabel(lines, "Published"));
193
+ const author = normalizeOptionalLabel(readLabel(lines, "Author"));
194
+ const highlights = readHighlights(lines);
195
+ return {
196
+ title,
197
+ url,
198
+ published,
199
+ author,
200
+ highlights: highlights.length ? highlights : undefined,
201
+ text: highlights.join("\n"),
202
+ };
203
+ }
204
+ function readLabel(lines, label) {
205
+ const prefix = `${label}:`;
206
+ const line = lines.find((value) => value.startsWith(prefix));
207
+ return line?.slice(prefix.length).trim();
208
+ }
209
+ function normalizeOptionalLabel(value) {
210
+ if (!value || value === "N/A")
211
+ return undefined;
212
+ return value;
213
+ }
214
+ function readHighlights(lines) {
215
+ const start = lines.findIndex((line) => line.trim() === "Highlights:");
216
+ if (start < 0)
217
+ return [];
218
+ return lines
219
+ .slice(start + 1)
220
+ .map((line) => line.trim())
221
+ .filter((line) => line && line !== "[...]" && !line.startsWith("Title:") && !line.startsWith("URL:"));
222
+ }
223
+ function stringFrom(value) {
224
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
225
+ }
226
+ function arrayOfStrings(value) {
227
+ if (!Array.isArray(value))
228
+ return [];
229
+ return value.filter((item) => typeof item === "string" && item.trim().length > 0);
230
+ }
231
+ function parseOptionalInteger(value) {
232
+ if (!value?.trim())
233
+ return undefined;
234
+ const parsed = Number(value);
235
+ return Number.isInteger(parsed) && parsed > 0 ? parsed : undefined;
236
+ }
237
+ function isRecord(value) {
238
+ return !!value && typeof value === "object" && !Array.isArray(value);
239
+ }
240
+ //# sourceMappingURL=search-providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-providers.js","sourceRoot":"","sources":["../../../src/tools/builtins/search-providers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { Tool } from "../tool.js";
2
+ import { type SearchProvider, type SearchToolInput, type WebSearchResult } from "./search-providers.js";
3
+ export interface WebSearchToolInput extends SearchToolInput {
4
+ provider?: string;
5
+ }
6
+ export interface WebSearchToolOutput {
7
+ query: string;
8
+ provider: string;
9
+ returnedResults: number;
10
+ results: WebSearchResult[];
11
+ truncated?: boolean;
12
+ error?: string;
13
+ }
14
+ export interface CreateSearchToolOptions {
15
+ provider?: SearchProvider;
16
+ }
17
+ export declare function createSearchTool(options?: CreateSearchToolOptions): Tool<WebSearchToolInput>;
18
+ export declare const searchTool: Tool<WebSearchToolInput>;
@@ -0,0 +1,171 @@
1
+ import { createSearchProvider } from "./search-providers.js";
2
+ const DEFAULT_NUM_RESULTS = 5;
3
+ const MAX_NUM_RESULTS = 10;
4
+ const MAX_HIGHLIGHTS_PER_RESULT = 6;
5
+ const MAX_HIGHLIGHT_CHARS = 800;
6
+ const MAX_TEXT_CHARS = 1600;
7
+ export function createSearchTool(options = {}) {
8
+ return {
9
+ name: "search",
10
+ description: "Search the web for current information. Uses a pluggable provider backend; the default provider is Exa MCP. Use grep for local workspace text lookup.",
11
+ inputSchema: {
12
+ type: "object",
13
+ properties: {
14
+ query: { type: "string", description: "Web search query." },
15
+ provider: { type: "string", description: "Optional backend provider name. Defaults to SEARCH_PROVIDER/WEB_SEARCH_PROVIDER or exa." },
16
+ numResults: { type: "integer", description: `Maximum number of results to return, 1-${MAX_NUM_RESULTS}. Defaults to ${DEFAULT_NUM_RESULTS}.` },
17
+ includeDomains: {
18
+ type: "array",
19
+ items: { type: "string" },
20
+ description: "Optional list of domains to include, such as openai.com.",
21
+ },
22
+ excludeDomains: {
23
+ type: "array",
24
+ items: { type: "string" },
25
+ description: "Optional list of domains to exclude.",
26
+ },
27
+ startPublishedDate: { type: "string", description: "Optional earliest published date filter, YYYY-MM-DD when supported by the provider." },
28
+ endPublishedDate: { type: "string", description: "Optional latest published date filter, YYYY-MM-DD when supported by the provider." },
29
+ },
30
+ required: ["query"],
31
+ additionalProperties: false,
32
+ },
33
+ metadata: {
34
+ readOnly: true,
35
+ concurrent: true,
36
+ visible: true,
37
+ maxResultSizeChars: 24000,
38
+ searchHint: "web search via provider backend",
39
+ },
40
+ validate(input) {
41
+ const record = input;
42
+ return {
43
+ query: record.query ?? "",
44
+ provider: record.provider,
45
+ numResults: record.numResults ?? DEFAULT_NUM_RESULTS,
46
+ includeDomains: record.includeDomains,
47
+ excludeDomains: record.excludeDomains,
48
+ startPublishedDate: record.startPublishedDate,
49
+ endPublishedDate: record.endPublishedDate,
50
+ };
51
+ },
52
+ validateInput(input) {
53
+ if (!input.query.trim())
54
+ return { ok: false, message: "search.query cannot be empty" };
55
+ if (input.provider !== undefined && !input.provider.trim())
56
+ return { ok: false, message: "search.provider cannot be empty" };
57
+ if (!Number.isInteger(input.numResults) || input.numResults < 1 || input.numResults > MAX_NUM_RESULTS) {
58
+ return { ok: false, message: `search.numResults must be between 1 and ${MAX_NUM_RESULTS}` };
59
+ }
60
+ if (input.includeDomains?.some((domain) => !domain.trim()))
61
+ return { ok: false, message: "search.includeDomains entries cannot be empty" };
62
+ if (input.excludeDomains?.some((domain) => !domain.trim()))
63
+ return { ok: false, message: "search.excludeDomains entries cannot be empty" };
64
+ if (input.startPublishedDate !== undefined && !input.startPublishedDate.trim())
65
+ return { ok: false, message: "search.startPublishedDate cannot be empty" };
66
+ if (input.endPublishedDate !== undefined && !input.endPublishedDate.trim())
67
+ return { ok: false, message: "search.endPublishedDate cannot be empty" };
68
+ return { ok: true, value: input };
69
+ },
70
+ isConcurrencySafe() {
71
+ return true;
72
+ },
73
+ async call(input, context, callOptions) {
74
+ let provider;
75
+ try {
76
+ provider = options.provider ?? createSearchProvider({ provider: input.provider }, process.env);
77
+ }
78
+ catch (error) {
79
+ return {
80
+ ok: false,
81
+ output: {
82
+ query: input.query,
83
+ provider: input.provider?.trim() || "unknown",
84
+ returnedResults: 0,
85
+ results: [],
86
+ error: error instanceof Error ? error.message : String(error),
87
+ },
88
+ };
89
+ }
90
+ callOptions.onProgress?.({ toolName: "search", message: `Searching the web with ${provider.name}` });
91
+ try {
92
+ const providerResult = await provider.search(input, context.abortSignal);
93
+ const output = {
94
+ query: input.query,
95
+ provider: providerResult.provider,
96
+ returnedResults: providerResult.results.length,
97
+ results: normalizeResults(providerResult.results),
98
+ };
99
+ return { ok: true, output, summary: `${output.returnedResults} web result(s)` };
100
+ }
101
+ catch (error) {
102
+ const providerName = provider.name;
103
+ return {
104
+ ok: false,
105
+ output: {
106
+ query: input.query,
107
+ provider: providerName,
108
+ returnedResults: 0,
109
+ results: [],
110
+ error: error instanceof Error ? error.message : String(error),
111
+ },
112
+ };
113
+ }
114
+ },
115
+ mapResult(result) {
116
+ return shrinkSearchOutputForTransport(result.output, 21_000);
117
+ },
118
+ };
119
+ }
120
+ export const searchTool = createSearchTool();
121
+ function normalizeResults(results) {
122
+ return results.map((result) => ({
123
+ title: trimText(result.title, 400),
124
+ url: result.url,
125
+ published: result.published,
126
+ author: result.author,
127
+ score: result.score,
128
+ highlights: result.highlights
129
+ ?.map((highlight) => trimText(highlight, MAX_HIGHLIGHT_CHARS))
130
+ .filter(Boolean)
131
+ .slice(0, MAX_HIGHLIGHTS_PER_RESULT),
132
+ text: result.text ? trimText(result.text, MAX_TEXT_CHARS) : undefined,
133
+ }));
134
+ }
135
+ function shrinkSearchOutputForTransport(output, maxChars) {
136
+ if (!isSearchOutput(output))
137
+ return output;
138
+ const serialized = JSON.stringify(output);
139
+ if (serialized.length <= maxChars)
140
+ return output;
141
+ const shrunk = {
142
+ ...output,
143
+ truncated: true,
144
+ results: output.results.map((result) => ({
145
+ title: trimText(result.title, 240),
146
+ url: result.url,
147
+ published: result.published,
148
+ author: result.author,
149
+ highlights: result.highlights?.slice(0, 3).map((highlight) => trimText(highlight, 300)),
150
+ text: result.text ? trimText(result.text, 600) : undefined,
151
+ score: result.score,
152
+ })),
153
+ };
154
+ return JSON.stringify(shrunk).length <= maxChars
155
+ ? shrunk
156
+ : {
157
+ ...shrunk,
158
+ results: shrunk.results.slice(0, Math.max(1, Math.floor(shrunk.results.length / 2))),
159
+ };
160
+ }
161
+ function isSearchOutput(value) {
162
+ if (!value || typeof value !== "object" || Array.isArray(value))
163
+ return false;
164
+ const record = value;
165
+ return typeof record.query === "string" && typeof record.provider === "string" && Array.isArray(record.results);
166
+ }
167
+ function trimText(value, maxChars) {
168
+ const trimmed = value.trim();
169
+ return trimmed.length <= maxChars ? trimmed : `${trimmed.slice(0, maxChars)}…`;
170
+ }
171
+ //# sourceMappingURL=search-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-tool.js","sourceRoot":"","sources":["../../../src/tools/builtins/search-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { Tool, ToolDefinition, ToolUseContext } from "./tool.js";
2
+ export interface ToolPoolOptions {
3
+ mode?: "default" | "simple" | "repl";
4
+ denyTools?: readonly string[];
5
+ includeDeferred?: boolean;
6
+ }
7
+ export declare class ToolRegistry {
8
+ private readonly tools;
9
+ private readonly aliases;
10
+ register(tool: Tool<any>): void;
11
+ get(name: string): Tool<any> | undefined;
12
+ getByAlias(name: string): Tool<any> | undefined;
13
+ definitions(context?: ToolUseContext, options?: ToolPoolOptions): ToolDefinition[];
14
+ names(): string[];
15
+ list(context?: ToolUseContext, options?: ToolPoolOptions): Tool<any>[];
16
+ private visibleTools;
17
+ }
18
+ export declare function assembleToolPool(builtInTools: readonly Tool<any>[], externalTools?: readonly Tool<any>[], options?: ToolPoolOptions): ToolRegistry;
@@ -0,0 +1,69 @@
1
+ import { resolveToolDescription } from "./tool.js";
2
+ export class ToolRegistry {
3
+ tools = new Map();
4
+ aliases = new Map();
5
+ register(tool) {
6
+ if (this.tools.has(tool.name)) {
7
+ throw new Error(`Tool already registered: ${tool.name}`);
8
+ }
9
+ this.tools.set(tool.name, tool);
10
+ for (const alias of tool.aliases ?? []) {
11
+ if (!this.aliases.has(alias))
12
+ this.aliases.set(alias, tool.name);
13
+ }
14
+ }
15
+ get(name) {
16
+ return this.tools.get(name) ?? this.getByAlias(name);
17
+ }
18
+ getByAlias(name) {
19
+ const canonical = this.aliases.get(name);
20
+ return canonical ? this.tools.get(canonical) : undefined;
21
+ }
22
+ definitions(context, options = {}) {
23
+ return this.visibleTools(context, options).map((tool) => ({
24
+ name: tool.name,
25
+ description: resolveToolDescription(tool, context),
26
+ inputSchema: tool.inputSchema,
27
+ strict: false,
28
+ }));
29
+ }
30
+ names() {
31
+ return [...this.tools.keys()].sort();
32
+ }
33
+ list(context, options = {}) {
34
+ return this.visibleTools(context, options);
35
+ }
36
+ visibleTools(context, options) {
37
+ const deny = new Set(options.denyTools ?? []);
38
+ return [...this.tools.values()]
39
+ .filter((tool) => tool.metadata.visible)
40
+ .filter((tool) => !deny.has(tool.name))
41
+ .filter((tool) => options.includeDeferred || !tool.metadata.shouldDefer || tool.metadata.alwaysLoad)
42
+ .filter((tool) => tool.isEnabled?.(context) ?? true)
43
+ .sort(compareToolForPromptCache);
44
+ }
45
+ }
46
+ export function assembleToolPool(builtInTools, externalTools = [], options = {}) {
47
+ const registry = new ToolRegistry();
48
+ const deny = new Set(options.denyTools ?? []);
49
+ const ordered = [
50
+ ...builtInTools.filter((tool) => !deny.has(tool.name)).sort(compareToolForPromptCache),
51
+ ...externalTools.filter((tool) => !deny.has(tool.name)).sort(compareToolForPromptCache),
52
+ ];
53
+ const seen = new Set();
54
+ for (const tool of ordered) {
55
+ if (seen.has(tool.name))
56
+ continue;
57
+ seen.add(tool.name);
58
+ registry.register(tool);
59
+ }
60
+ return registry;
61
+ }
62
+ function compareToolForPromptCache(left, right) {
63
+ const leftMcp = left.metadata.isMcp ? 1 : 0;
64
+ const rightMcp = right.metadata.isMcp ? 1 : 0;
65
+ if (leftMcp !== rightMcp)
66
+ return leftMcp - rightMcp;
67
+ return left.name.localeCompare(right.name);
68
+ }
69
+ //# 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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"}
@@ -0,0 +1,13 @@
1
+ import { type Message, type ToolUseRequest } from "../types/messages.js";
2
+ import type { CanUseTool, ToolProgressEvent, ToolUseContext } from "./tool.js";
3
+ export interface ToolMessageUpdate {
4
+ message: Message;
5
+ context?: ToolUseContext;
6
+ progress?: ToolProgressEvent;
7
+ }
8
+ export interface RunToolUseOptions {
9
+ canUseTool?: CanUseTool;
10
+ parentMessage?: Message;
11
+ }
12
+ export declare function runToolUse(request: ToolUseRequest, context: ToolUseContext, options?: RunToolUseOptions): Promise<ToolMessageUpdate[]>;
13
+ export declare function runToolUseToMessages(request: ToolUseRequest, context: ToolUseContext, options?: RunToolUseOptions): Promise<Message[]>;