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,56 @@
1
+ import type { Tool } from "../tool.js";
2
+ export interface GrepToolInput {
3
+ query: string;
4
+ path?: string;
5
+ glob?: string[];
6
+ caseMode: "smart" | "sensitive" | "insensitive";
7
+ fixedStrings: boolean;
8
+ includeHidden: boolean;
9
+ contextLines: number;
10
+ maxResults: number;
11
+ maxColumns: number;
12
+ }
13
+ export interface GrepMatch {
14
+ file: string;
15
+ line: number;
16
+ column?: number;
17
+ text: string;
18
+ textTruncated?: {
19
+ originalLength: number;
20
+ maxChars: number;
21
+ };
22
+ submatches: Array<{
23
+ start: number;
24
+ end: number;
25
+ text: string;
26
+ }>;
27
+ contextBefore?: GrepContextLine[];
28
+ contextAfter?: GrepContextLine[];
29
+ }
30
+ export interface GrepContextLine {
31
+ file: string;
32
+ line: number;
33
+ text: string;
34
+ textTruncated?: {
35
+ originalLength: number;
36
+ maxChars: number;
37
+ };
38
+ }
39
+ export interface GrepToolOutput {
40
+ query: string;
41
+ cwd: string;
42
+ grepPath: string;
43
+ returnedMatches: number;
44
+ totalMatchesKnown: number | null;
45
+ truncated: boolean;
46
+ matches: GrepMatch[];
47
+ transportTruncation?: {
48
+ reason: "resultSize";
49
+ originalLength: number;
50
+ matchesBeforeTransport: number;
51
+ omittedMatches: number;
52
+ maxChars: number;
53
+ };
54
+ errors?: string[];
55
+ }
56
+ export declare const grepTool: Tool<GrepToolInput>;
@@ -0,0 +1,320 @@
1
+ import { spawn } from "node:child_process";
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { resolveBundledRipgrepBinary } from "./ripgrep-binary.js";
5
+ export const grepTool = {
6
+ name: "grep",
7
+ aliases: ["rg"],
8
+ description: "Grep files with the bundled ripgrep binary. Accepts absolute paths and cwd-relative paths. It does not exclude heavy directories by default; pass explicit negated glob filters such as !node_modules/** when you want to skip them.",
9
+ inputSchema: {
10
+ type: "object",
11
+ properties: {
12
+ query: { type: "string", description: "Regex pattern or literal text to look for." },
13
+ path: { type: "string", description: "Absolute or cwd-relative file/directory to grep. Defaults to the current working directory." },
14
+ glob: {
15
+ type: "array",
16
+ items: { type: "string" },
17
+ description: "Optional ripgrep glob filters such as src/**/*.ts, !dist/**, or !node_modules/**.",
18
+ },
19
+ caseMode: { type: "string", enum: ["smart", "sensitive", "insensitive"], description: "Case handling mode." },
20
+ fixedStrings: { type: "boolean", description: "Treat query as literal text instead of a regex." },
21
+ includeHidden: { type: "boolean", description: "Include hidden files and directories while still respecting ignore files." },
22
+ contextLines: { type: "integer", description: "Number of context lines around each match, 0-5." },
23
+ maxResults: { type: "integer", description: "Maximum total matches to return, 1-200." },
24
+ maxColumns: { type: "integer", description: "Maximum line width before ripgrep truncates a line, 80-1000." },
25
+ },
26
+ required: ["query"],
27
+ additionalProperties: false,
28
+ },
29
+ metadata: {
30
+ readOnly: true,
31
+ concurrent: true,
32
+ visible: true,
33
+ maxResultSizeChars: 24000,
34
+ searchHint: "grep files with bundled ripgrep",
35
+ },
36
+ mapResult(result) {
37
+ return shrinkGrepOutputForTransport(result.output, 21000);
38
+ },
39
+ validate(input) {
40
+ const record = input;
41
+ return {
42
+ query: record.query ?? "",
43
+ path: record.path,
44
+ glob: record.glob,
45
+ caseMode: record.caseMode ?? "smart",
46
+ fixedStrings: record.fixedStrings ?? false,
47
+ includeHidden: record.includeHidden ?? false,
48
+ contextLines: record.contextLines ?? 0,
49
+ maxResults: record.maxResults ?? 50,
50
+ maxColumns: record.maxColumns ?? 300,
51
+ };
52
+ },
53
+ validateInput(input) {
54
+ if (!input.query.trim())
55
+ return { ok: false, message: "grep.query cannot be empty" };
56
+ if (input.path !== undefined && !input.path.trim())
57
+ return { ok: false, message: "grep.path cannot be empty" };
58
+ if (!Number.isInteger(input.contextLines) || input.contextLines < 0 || input.contextLines > 5) {
59
+ return { ok: false, message: "grep.contextLines must be between 0 and 5" };
60
+ }
61
+ if (!Number.isInteger(input.maxResults) || input.maxResults < 1 || input.maxResults > 200) {
62
+ return { ok: false, message: "grep.maxResults must be between 1 and 200" };
63
+ }
64
+ if (!Number.isInteger(input.maxColumns) || input.maxColumns < 80 || input.maxColumns > 1000) {
65
+ return { ok: false, message: "grep.maxColumns must be between 80 and 1000" };
66
+ }
67
+ if (input.glob?.some((glob) => !glob.trim()))
68
+ return { ok: false, message: "grep.glob entries cannot be empty" };
69
+ return { ok: true, value: input };
70
+ },
71
+ isConcurrencySafe() {
72
+ return true;
73
+ },
74
+ async call(input, context, options) {
75
+ const { executablePath, platformKey } = resolveBundledRipgrepBinary();
76
+ const root = workingDirectory(context);
77
+ const target = path.resolve(root, input.path ?? ".");
78
+ const stat = await fs.stat(target).catch(() => undefined);
79
+ if (!stat)
80
+ return { ok: false, output: { error: `grep.path does not exist: ${target}` } };
81
+ options.onProgress?.({ toolName: "grep", message: `Searching with bundled rg (${platformKey})` });
82
+ return runRipgrep(executablePath, root, target, input);
83
+ },
84
+ };
85
+ function workingDirectory(context) {
86
+ const snapshot = context.appState.snapshot();
87
+ return path.resolve(snapshot.cwd ?? process.cwd());
88
+ }
89
+ async function runRipgrep(executablePath, root, target, input) {
90
+ const args = buildArgs(input, target);
91
+ const state = {
92
+ matches: [],
93
+ errors: [],
94
+ pendingContext: [],
95
+ maxResults: input.maxResults,
96
+ maxContextLines: input.contextLines,
97
+ truncated: false,
98
+ stopped: false,
99
+ overflowedMaxResults: false,
100
+ };
101
+ let stderr = "";
102
+ let stdoutBuffer = "";
103
+ const child = spawn(executablePath, args, { cwd: root, windowsHide: true });
104
+ child.stdout.setEncoding("utf8");
105
+ child.stdout.on("data", (chunk) => {
106
+ if (state.stopped)
107
+ return;
108
+ stdoutBuffer += chunk;
109
+ let newline = stdoutBuffer.indexOf("\n");
110
+ while (newline >= 0) {
111
+ const line = stdoutBuffer.slice(0, newline).trim();
112
+ stdoutBuffer = stdoutBuffer.slice(newline + 1);
113
+ if (line)
114
+ handleJsonLine(line, root, state);
115
+ if (shouldStopGrep(state)) {
116
+ state.stopped = true;
117
+ child.kill();
118
+ break;
119
+ }
120
+ newline = stdoutBuffer.indexOf("\n");
121
+ }
122
+ });
123
+ child.stderr.setEncoding("utf8");
124
+ child.stderr.on("data", (chunk) => {
125
+ stderr = `${stderr}${chunk}`.slice(-12000);
126
+ });
127
+ return new Promise((resolve) => {
128
+ child.on("error", (error) => {
129
+ resolve({ ok: false, output: { error: error.message } });
130
+ });
131
+ child.on("close", (code) => {
132
+ const remaining = stdoutBuffer.trim();
133
+ if (remaining && !state.stopped)
134
+ handleJsonLine(remaining, root, state);
135
+ const matches = state.matches.slice(0, input.maxResults);
136
+ const truncated = state.truncated || state.matches.length > input.maxResults;
137
+ const output = {
138
+ query: input.query,
139
+ cwd: root,
140
+ grepPath: target,
141
+ returnedMatches: matches.length,
142
+ totalMatchesKnown: truncated ? null : matches.length,
143
+ truncated,
144
+ matches,
145
+ errors: state.errors.length ? state.errors : undefined,
146
+ };
147
+ if (code === 0 || code === 1 || truncated) {
148
+ resolve({ ok: true, output, summary: `${matches.length}${truncated ? "+" : ""} match(es)` });
149
+ return;
150
+ }
151
+ resolve({ ok: false, output: { ...output, error: stderr.trim() || `rg exited with code ${code}` } });
152
+ });
153
+ });
154
+ }
155
+ function buildArgs(input, target) {
156
+ const args = ["--json", "--color=never", "--line-number", "--column", "--with-filename", "--max-columns", String(input.maxColumns)];
157
+ if (input.caseMode === "smart")
158
+ args.push("--smart-case");
159
+ if (input.caseMode === "insensitive")
160
+ args.push("--ignore-case");
161
+ if (input.fixedStrings)
162
+ args.push("--fixed-strings");
163
+ if (input.includeHidden)
164
+ args.push("--hidden");
165
+ if (input.contextLines > 0)
166
+ args.push("--context", String(input.contextLines));
167
+ for (const glob of input.glob ?? [])
168
+ args.push("--glob", glob);
169
+ args.push("--", input.query, target);
170
+ return args;
171
+ }
172
+ function handleJsonLine(line, root, state) {
173
+ try {
174
+ const event = JSON.parse(line);
175
+ if (event.type === "match") {
176
+ if (state.matches.length >= state.maxResults) {
177
+ state.truncated = true;
178
+ state.overflowedMaxResults = true;
179
+ return;
180
+ }
181
+ const match = mapMatchEvent(event, root);
182
+ if (state.pendingContext.length) {
183
+ match.contextBefore = state.pendingContext.slice(-state.maxContextLines);
184
+ state.pendingContext = [];
185
+ }
186
+ state.matches.push(match);
187
+ if (state.matches.length >= state.maxResults)
188
+ state.truncated = true;
189
+ return;
190
+ }
191
+ if (event.type === "context" && state.maxContextLines > 0) {
192
+ const context = mapContextEvent(event, root);
193
+ const lastMatch = state.matches[state.matches.length - 1];
194
+ if (!lastMatch) {
195
+ state.pendingContext = [...state.pendingContext, context].slice(-state.maxContextLines);
196
+ return;
197
+ }
198
+ const contextAfter = [...(lastMatch.contextAfter ?? []), context].slice(0, state.maxContextLines);
199
+ lastMatch.contextAfter = contextAfter;
200
+ }
201
+ }
202
+ catch (error) {
203
+ state.errors.push(error instanceof Error ? error.message : String(error));
204
+ }
205
+ }
206
+ function mapMatchEvent(event, root) {
207
+ const text = normalizeLine(event.data.lines.text);
208
+ return {
209
+ file: relativeEventPath(root, event),
210
+ line: event.data.line_number,
211
+ column: event.data.submatches[0]?.start + 1,
212
+ text,
213
+ submatches: event.data.submatches.map((submatch) => ({
214
+ start: submatch.start,
215
+ end: submatch.end,
216
+ text: submatch.match.text,
217
+ })),
218
+ };
219
+ }
220
+ function mapContextEvent(event, root) {
221
+ return {
222
+ file: relativeEventPath(root, event),
223
+ line: event.data.line_number,
224
+ text: normalizeLine(event.data.lines.text),
225
+ };
226
+ }
227
+ function relativeEventPath(root, event) {
228
+ return path.relative(root, event.data.path.text) || event.data.path.text;
229
+ }
230
+ function normalizeLine(text) {
231
+ return text.replace(/[\r\n]+$/, "");
232
+ }
233
+ function shouldStopGrep(state) {
234
+ if (!state.truncated)
235
+ return false;
236
+ if (state.overflowedMaxResults)
237
+ return true;
238
+ if (state.maxContextLines === 0)
239
+ return true;
240
+ const lastMatch = state.matches[state.matches.length - 1];
241
+ return (lastMatch?.contextAfter?.length ?? 0) >= state.maxContextLines;
242
+ }
243
+ function shrinkGrepOutputForTransport(output, maxChars) {
244
+ if (!isGrepOutput(output))
245
+ return output;
246
+ const boundedOutput = boundLongGrepLines(output);
247
+ const serialized = JSON.stringify(boundedOutput);
248
+ if (serialized.length <= maxChars)
249
+ return boundedOutput;
250
+ const originalMatches = boundedOutput.matches;
251
+ const transportTruncation = {
252
+ reason: "resultSize",
253
+ originalLength: serialized.length,
254
+ matchesBeforeTransport: originalMatches.length,
255
+ omittedMatches: originalMatches.length,
256
+ maxChars,
257
+ };
258
+ const compacted = {
259
+ ...boundedOutput,
260
+ returnedMatches: 0,
261
+ matches: [],
262
+ truncated: true,
263
+ totalMatchesKnown: boundedOutput.truncated ? boundedOutput.totalMatchesKnown : originalMatches.length,
264
+ transportTruncation,
265
+ };
266
+ for (let count = originalMatches.length; count >= 0; count -= 1) {
267
+ compacted.matches = originalMatches.slice(0, count);
268
+ compacted.returnedMatches = compacted.matches.length;
269
+ compacted.transportTruncation = {
270
+ reason: transportTruncation.reason,
271
+ originalLength: transportTruncation.originalLength,
272
+ matchesBeforeTransport: transportTruncation.matchesBeforeTransport,
273
+ maxChars: transportTruncation.maxChars,
274
+ omittedMatches: originalMatches.length - count,
275
+ };
276
+ const candidate = JSON.stringify(compacted);
277
+ if (candidate.length <= maxChars)
278
+ return compacted;
279
+ }
280
+ return compacted;
281
+ }
282
+ function isGrepOutput(output) {
283
+ return typeof output === "object" && output !== null && Array.isArray(output.matches);
284
+ }
285
+ function boundLongGrepLines(output) {
286
+ return {
287
+ ...output,
288
+ matches: output.matches.map((match) => ({
289
+ ...match,
290
+ ...truncateTextField(match.text, MAX_MATCH_TEXT_CHARS),
291
+ submatches: match.submatches.map((submatch) => ({
292
+ ...submatch,
293
+ text: truncatePlainText(submatch.text, MAX_SUBMATCH_TEXT_CHARS),
294
+ })),
295
+ contextBefore: match.contextBefore?.map(truncateContextLine),
296
+ contextAfter: match.contextAfter?.map(truncateContextLine),
297
+ })),
298
+ };
299
+ }
300
+ function truncateContextLine(line) {
301
+ return {
302
+ ...line,
303
+ ...truncateTextField(line.text, MAX_CONTEXT_TEXT_CHARS),
304
+ };
305
+ }
306
+ function truncateTextField(text, maxChars) {
307
+ if (text.length <= maxChars)
308
+ return { text };
309
+ return {
310
+ text: `${text.slice(0, maxChars)}...[truncated ${text.length - maxChars} chars]`,
311
+ textTruncated: { originalLength: text.length, maxChars },
312
+ };
313
+ }
314
+ function truncatePlainText(text, maxChars) {
315
+ return text.length <= maxChars ? text : `${text.slice(0, maxChars)}...[truncated ${text.length - maxChars} chars]`;
316
+ }
317
+ const MAX_MATCH_TEXT_CHARS = 4000;
318
+ const MAX_CONTEXT_TEXT_CHARS = 2000;
319
+ const MAX_SUBMATCH_TEXT_CHARS = 500;
320
+ //# sourceMappingURL=grep-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grep-tool.js","sourceRoot":"","sources":["../../../src/tools/builtins/grep-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface RipgrepBinaryResolution {
2
+ executablePath: string;
3
+ platformKey: string;
4
+ }
5
+ export declare function resolveBundledRipgrepBinary(env?: NodeJS.ProcessEnv): RipgrepBinaryResolution;
6
+ export declare function ripgrepPlatformKey(): string;
@@ -0,0 +1,51 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ const moduleDir = path.dirname(fileURLToPath(import.meta.url));
5
+ export function resolveBundledRipgrepBinary(env = process.env) {
6
+ const platformKey = ripgrepPlatformKey();
7
+ const executable = process.platform === "win32" ? "rg.exe" : "rg";
8
+ const override = env.AGENT_RG_PATH;
9
+ if (override) {
10
+ const executablePath = path.resolve(override);
11
+ assertExecutableExists(executablePath, "AGENT_RG_PATH");
12
+ return { executablePath, platformKey };
13
+ }
14
+ for (const root of candidateRoots(env)) {
15
+ const executablePath = path.join(root, "vendor", "ripgrep", platformKey, executable);
16
+ if (fs.existsSync(executablePath))
17
+ return { executablePath, platformKey };
18
+ }
19
+ throw new Error(`Bundled ripgrep binary not found for ${platformKey}. Run npm run vendor:rg before using the grep tool.`);
20
+ }
21
+ export function ripgrepPlatformKey() {
22
+ const key = `${process.platform}-${process.arch}`;
23
+ switch (key) {
24
+ case "win32-x64":
25
+ case "win32-arm64":
26
+ case "linux-x64":
27
+ case "linux-arm64":
28
+ case "darwin-x64":
29
+ case "darwin-arm64":
30
+ return key;
31
+ default:
32
+ throw new Error(`Unsupported ripgrep platform: ${key}`);
33
+ }
34
+ }
35
+ function candidateRoots(env) {
36
+ const electronProcess = process;
37
+ const roots = [
38
+ env.AGENT_VENDOR_DIR,
39
+ process.cwd(),
40
+ path.resolve(moduleDir, "../../.."),
41
+ electronProcess.resourcesPath,
42
+ path.dirname(process.execPath),
43
+ ].filter((value) => Boolean(value));
44
+ return [...new Set(roots.map((root) => path.resolve(root)))];
45
+ }
46
+ function assertExecutableExists(executablePath, source) {
47
+ if (!fs.existsSync(executablePath)) {
48
+ throw new Error(`${source} points to a missing ripgrep binary: ${executablePath}`);
49
+ }
50
+ }
51
+ //# sourceMappingURL=ripgrep-binary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ripgrep-binary.js","sourceRoot":"","sources":["../../../src/tools/builtins/ripgrep-binary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAOzC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE/D,MAAM,UAAU,2BAA2B,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC9E,MAAM,WAAW,GAAG,kBAAkB,EAAE,CAAC;IACzC,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IAClE,MAAM,QAAQ,GAAG,GAAG,CAAC,aAAa,CAAC;IAEnC,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC9C,sBAAsB,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;QACxD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;IACzC,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACvC,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;QACrF,IAAI,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC;YAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;IAC5E,CAAC;IAED,MAAM,IAAI,KAAK,CACb,wCAAwC,WAAW,qDAAqD,CACzG,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAClD,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,WAAW,CAAC;QACjB,KAAK,aAAa,CAAC;QACnB,KAAK,WAAW,CAAC;QACjB,KAAK,aAAa,CAAC;QACnB,KAAK,YAAY,CAAC;QAClB,KAAK,cAAc;YACjB,OAAO,GAAG,CAAC;QACb;YACE,MAAM,IAAI,KAAK,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,GAAsB;IAC5C,MAAM,eAAe,GAAG,OAAsD,CAAC;IAC/E,MAAM,KAAK,GAAG;QACZ,GAAG,CAAC,gBAAgB;QACpB,OAAO,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC;QACnC,eAAe,CAAC,aAAa;QAC7B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;KAC/B,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAErD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,sBAAsB,CAAC,cAAsB,EAAE,MAAc;IACpE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,wCAAwC,cAAc,EAAE,CAAC,CAAC;IACrF,CAAC;AACH,CAAC"}
@@ -0,0 +1,49 @@
1
+ export type SearchProviderName = "exa" | (string & {});
2
+ export interface SearchToolInput {
3
+ query: string;
4
+ numResults: number;
5
+ includeDomains?: string[];
6
+ excludeDomains?: string[];
7
+ startPublishedDate?: string;
8
+ endPublishedDate?: string;
9
+ }
10
+ export interface WebSearchResult {
11
+ title: string;
12
+ url: string;
13
+ published?: string;
14
+ author?: string;
15
+ highlights?: string[];
16
+ text?: string;
17
+ score?: number;
18
+ raw?: Record<string, unknown>;
19
+ }
20
+ export interface SearchProviderResult {
21
+ provider: string;
22
+ query: string;
23
+ results: WebSearchResult[];
24
+ raw?: unknown;
25
+ }
26
+ export interface SearchProvider {
27
+ readonly name: SearchProviderName;
28
+ search(input: SearchToolInput, signal?: AbortSignal): Promise<SearchProviderResult>;
29
+ }
30
+ export interface SearchProviderConfig {
31
+ provider?: string;
32
+ exa?: ExaSearchProviderConfig;
33
+ }
34
+ export interface ExaSearchProviderConfig {
35
+ mcpUrl?: string;
36
+ toolName?: string;
37
+ timeoutMs?: number;
38
+ }
39
+ export declare const DEFAULT_SEARCH_PROVIDER = "exa";
40
+ export declare const DEFAULT_EXA_MCP_URL = "https://mcp.exa.ai/mcp";
41
+ export declare const DEFAULT_EXA_MCP_TOOL_NAME = "web_search_exa";
42
+ export declare const DEFAULT_SEARCH_TIMEOUT_MS = 30000;
43
+ export declare class SearchProviderError extends Error {
44
+ readonly provider: string;
45
+ readonly cause?: unknown | undefined;
46
+ constructor(message: string, provider: string, cause?: unknown | undefined);
47
+ }
48
+ export declare function createSearchProvider(config?: SearchProviderConfig, env?: NodeJS.ProcessEnv): SearchProvider;
49
+ export declare function createExaSearchProvider(config?: ExaSearchProviderConfig): SearchProvider;