camelagi 0.5.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 (249) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +224 -0
  3. package/camelagi.mjs +2 -0
  4. package/config.example.yaml +107 -0
  5. package/dist/agent/agent-openai.js +206 -0
  6. package/dist/agent/agent-openai.js.map +1 -0
  7. package/dist/agent/agent-sdk.js +209 -0
  8. package/dist/agent/agent-sdk.js.map +1 -0
  9. package/dist/agent/tool-adapter.js +31 -0
  10. package/dist/agent/tool-adapter.js.map +1 -0
  11. package/dist/agent/types.js +3 -0
  12. package/dist/agent/types.js.map +1 -0
  13. package/dist/agent.js +17 -0
  14. package/dist/agent.js.map +1 -0
  15. package/dist/approval-forward.js +42 -0
  16. package/dist/approval-forward.js.map +1 -0
  17. package/dist/approvals.js +151 -0
  18. package/dist/approvals.js.map +1 -0
  19. package/dist/boot.js +34 -0
  20. package/dist/boot.js.map +1 -0
  21. package/dist/bootstrap.js +451 -0
  22. package/dist/bootstrap.js.map +1 -0
  23. package/dist/camelagi-gateway.mjs +93611 -0
  24. package/dist/camelagi-gateway.mjs.map +7 -0
  25. package/dist/channels/adapter.js +10 -0
  26. package/dist/channels/adapter.js.map +1 -0
  27. package/dist/channels/discord.js +232 -0
  28. package/dist/channels/discord.js.map +1 -0
  29. package/dist/channels/handler.js +349 -0
  30. package/dist/channels/handler.js.map +1 -0
  31. package/dist/channels/index.js +19 -0
  32. package/dist/channels/index.js.map +1 -0
  33. package/dist/channels/registry.js +71 -0
  34. package/dist/channels/registry.js.map +1 -0
  35. package/dist/channels/telegram.js +83 -0
  36. package/dist/channels/telegram.js.map +1 -0
  37. package/dist/channels/types.js +3 -0
  38. package/dist/channels/types.js.map +1 -0
  39. package/dist/chunker.js +102 -0
  40. package/dist/chunker.js.map +1 -0
  41. package/dist/cli/cmd-agents.js +65 -0
  42. package/dist/cli/cmd-agents.js.map +1 -0
  43. package/dist/cli/cmd-bootstrap.js +10 -0
  44. package/dist/cli/cmd-bootstrap.js.map +1 -0
  45. package/dist/cli/cmd-chat.js +32 -0
  46. package/dist/cli/cmd-chat.js.map +1 -0
  47. package/dist/cli/cmd-config.js +88 -0
  48. package/dist/cli/cmd-config.js.map +1 -0
  49. package/dist/cli/cmd-cron.js +120 -0
  50. package/dist/cli/cmd-cron.js.map +1 -0
  51. package/dist/cli/cmd-daemon.js +37 -0
  52. package/dist/cli/cmd-daemon.js.map +1 -0
  53. package/dist/cli/cmd-doctor.js +18 -0
  54. package/dist/cli/cmd-doctor.js.map +1 -0
  55. package/dist/cli/cmd-logs.js +30 -0
  56. package/dist/cli/cmd-logs.js.map +1 -0
  57. package/dist/cli/cmd-pairing.js +41 -0
  58. package/dist/cli/cmd-pairing.js.map +1 -0
  59. package/dist/cli/cmd-reset.js +39 -0
  60. package/dist/cli/cmd-reset.js.map +1 -0
  61. package/dist/cli/cmd-serve.js +30 -0
  62. package/dist/cli/cmd-serve.js.map +1 -0
  63. package/dist/cli/cmd-sessions.js +56 -0
  64. package/dist/cli/cmd-sessions.js.map +1 -0
  65. package/dist/cli/cmd-setup.js +11 -0
  66. package/dist/cli/cmd-setup.js.map +1 -0
  67. package/dist/cli/cmd-soul.js +43 -0
  68. package/dist/cli/cmd-soul.js.map +1 -0
  69. package/dist/cli/parse.js +50 -0
  70. package/dist/cli/parse.js.map +1 -0
  71. package/dist/cli/registry.js +15 -0
  72. package/dist/cli/registry.js.map +1 -0
  73. package/dist/cli.js +103 -0
  74. package/dist/cli.js.map +1 -0
  75. package/dist/compact.js +92 -0
  76. package/dist/compact.js.map +1 -0
  77. package/dist/config.js +153 -0
  78. package/dist/config.js.map +1 -0
  79. package/dist/constants.js +21 -0
  80. package/dist/constants.js.map +1 -0
  81. package/dist/core/config.js +212 -0
  82. package/dist/core/config.js.map +1 -0
  83. package/dist/core/constants.js +21 -0
  84. package/dist/core/constants.js.map +1 -0
  85. package/dist/core/errors.js +5 -0
  86. package/dist/core/errors.js.map +1 -0
  87. package/dist/core/log.js +41 -0
  88. package/dist/core/log.js.map +1 -0
  89. package/dist/core/models.js +123 -0
  90. package/dist/core/models.js.map +1 -0
  91. package/dist/core/types.js +3 -0
  92. package/dist/core/types.js.map +1 -0
  93. package/dist/core/update-check.js +51 -0
  94. package/dist/core/update-check.js.map +1 -0
  95. package/dist/cron.js +81 -0
  96. package/dist/cron.js.map +1 -0
  97. package/dist/daemon.js +109 -0
  98. package/dist/daemon.js.map +1 -0
  99. package/dist/doctor.js +194 -0
  100. package/dist/doctor.js.map +1 -0
  101. package/dist/errors.js +5 -0
  102. package/dist/errors.js.map +1 -0
  103. package/dist/extensions/approval-forward.js +42 -0
  104. package/dist/extensions/approval-forward.js.map +1 -0
  105. package/dist/extensions/approvals.js +144 -0
  106. package/dist/extensions/approvals.js.map +1 -0
  107. package/dist/extensions/cron.js +306 -0
  108. package/dist/extensions/cron.js.map +1 -0
  109. package/dist/extensions/hooks.js +72 -0
  110. package/dist/extensions/hooks.js.map +1 -0
  111. package/dist/extensions/skills.js +97 -0
  112. package/dist/extensions/skills.js.map +1 -0
  113. package/dist/gateway/csrf.js +44 -0
  114. package/dist/gateway/csrf.js.map +1 -0
  115. package/dist/gateway/logger.js +81 -0
  116. package/dist/gateway/logger.js.map +1 -0
  117. package/dist/gateway/rate-limit.js +33 -0
  118. package/dist/gateway/rate-limit.js.map +1 -0
  119. package/dist/gateway/routes.js +315 -0
  120. package/dist/gateway/routes.js.map +1 -0
  121. package/dist/gateway/state.js +54 -0
  122. package/dist/gateway/state.js.map +1 -0
  123. package/dist/gateway/ws-handler.js +200 -0
  124. package/dist/gateway/ws-handler.js.map +1 -0
  125. package/dist/gateway-entry.js +16 -0
  126. package/dist/gateway-entry.js.map +1 -0
  127. package/dist/hooks.js +72 -0
  128. package/dist/hooks.js.map +1 -0
  129. package/dist/lanes.js +62 -0
  130. package/dist/lanes.js.map +1 -0
  131. package/dist/model.js +30 -0
  132. package/dist/model.js.map +1 -0
  133. package/dist/policy.js +22 -0
  134. package/dist/policy.js.map +1 -0
  135. package/dist/queue.js +45 -0
  136. package/dist/queue.js.map +1 -0
  137. package/dist/retry.js +96 -0
  138. package/dist/retry.js.map +1 -0
  139. package/dist/runs.js +83 -0
  140. package/dist/runs.js.map +1 -0
  141. package/dist/runtime/compact.js +99 -0
  142. package/dist/runtime/compact.js.map +1 -0
  143. package/dist/runtime/lanes.js +66 -0
  144. package/dist/runtime/lanes.js.map +1 -0
  145. package/dist/runtime/orchestrate.js +121 -0
  146. package/dist/runtime/orchestrate.js.map +1 -0
  147. package/dist/runtime/queue.js +50 -0
  148. package/dist/runtime/queue.js.map +1 -0
  149. package/dist/runtime/retry.js +127 -0
  150. package/dist/runtime/retry.js.map +1 -0
  151. package/dist/runtime/runs.js +105 -0
  152. package/dist/runtime/runs.js.map +1 -0
  153. package/dist/serve.js +209 -0
  154. package/dist/serve.js.map +1 -0
  155. package/dist/session.js +75 -0
  156. package/dist/session.js.map +1 -0
  157. package/dist/setup.js +254 -0
  158. package/dist/setup.js.map +1 -0
  159. package/dist/skills.js +89 -0
  160. package/dist/skills.js.map +1 -0
  161. package/dist/subagent.js +71 -0
  162. package/dist/subagent.js.map +1 -0
  163. package/dist/system-prompt.js +157 -0
  164. package/dist/system-prompt.js.map +1 -0
  165. package/dist/telegram/admin-bot.js +705 -0
  166. package/dist/telegram/admin-bot.js.map +1 -0
  167. package/dist/telegram/agent-bot.js +551 -0
  168. package/dist/telegram/agent-bot.js.map +1 -0
  169. package/dist/telegram/bot-approval.js +63 -0
  170. package/dist/telegram/bot-approval.js.map +1 -0
  171. package/dist/telegram/draft-stream.js +86 -0
  172. package/dist/telegram/draft-stream.js.map +1 -0
  173. package/dist/telegram/format.js +106 -0
  174. package/dist/telegram/format.js.map +1 -0
  175. package/dist/telegram/helpers.js +87 -0
  176. package/dist/telegram/helpers.js.map +1 -0
  177. package/dist/telegram/pairing-notify.js +52 -0
  178. package/dist/telegram/pairing-notify.js.map +1 -0
  179. package/dist/telegram/pairing.js +138 -0
  180. package/dist/telegram/pairing.js.map +1 -0
  181. package/dist/telegram/resolve.js +33 -0
  182. package/dist/telegram/resolve.js.map +1 -0
  183. package/dist/telegram/transcribe.js +77 -0
  184. package/dist/telegram/transcribe.js.map +1 -0
  185. package/dist/telegram/types.js +3 -0
  186. package/dist/telegram/types.js.map +1 -0
  187. package/dist/telegram/voice-wizard.js +84 -0
  188. package/dist/telegram/voice-wizard.js.map +1 -0
  189. package/dist/telegram/wizard.js +89 -0
  190. package/dist/telegram/wizard.js.map +1 -0
  191. package/dist/telegram/wizards.js +297 -0
  192. package/dist/telegram/wizards.js.map +1 -0
  193. package/dist/telegram-admin.js +800 -0
  194. package/dist/telegram-admin.js.map +1 -0
  195. package/dist/telegram.js +118 -0
  196. package/dist/telegram.js.map +1 -0
  197. package/dist/tools/cron.js +94 -0
  198. package/dist/tools/cron.js.map +1 -0
  199. package/dist/tools/edit.js +29 -0
  200. package/dist/tools/edit.js.map +1 -0
  201. package/dist/tools/exec.js +38 -0
  202. package/dist/tools/exec.js.map +1 -0
  203. package/dist/tools/fetch.js +28 -0
  204. package/dist/tools/fetch.js.map +1 -0
  205. package/dist/tools/index.js +16 -0
  206. package/dist/tools/index.js.map +1 -0
  207. package/dist/tools/memory.js +164 -0
  208. package/dist/tools/memory.js.map +1 -0
  209. package/dist/tools/patch.js +284 -0
  210. package/dist/tools/patch.js.map +1 -0
  211. package/dist/tools/read.js +26 -0
  212. package/dist/tools/read.js.map +1 -0
  213. package/dist/tools/search.js +62 -0
  214. package/dist/tools/search.js.map +1 -0
  215. package/dist/tools/subagent.js +48 -0
  216. package/dist/tools/subagent.js.map +1 -0
  217. package/dist/tools/write.js +22 -0
  218. package/dist/tools/write.js.map +1 -0
  219. package/dist/tui/commands.js +450 -0
  220. package/dist/tui/commands.js.map +1 -0
  221. package/dist/tui/components/assistant-message.js +26 -0
  222. package/dist/tui/components/assistant-message.js.map +1 -0
  223. package/dist/tui/components/chat-log.js +94 -0
  224. package/dist/tui/components/chat-log.js.map +1 -0
  225. package/dist/tui/components/custom-editor.js +40 -0
  226. package/dist/tui/components/custom-editor.js.map +1 -0
  227. package/dist/tui/components/hint-bar.js +13 -0
  228. package/dist/tui/components/hint-bar.js.map +1 -0
  229. package/dist/tui/components/tool-execution.js +73 -0
  230. package/dist/tui/components/tool-execution.js.map +1 -0
  231. package/dist/tui/components/user-message.js +19 -0
  232. package/dist/tui/components/user-message.js.map +1 -0
  233. package/dist/tui/components/welcome.js +147 -0
  234. package/dist/tui/components/welcome.js.map +1 -0
  235. package/dist/tui/context.js +3 -0
  236. package/dist/tui/context.js.map +1 -0
  237. package/dist/tui/theme.js +91 -0
  238. package/dist/tui/theme.js.map +1 -0
  239. package/dist/tui/tui.js +389 -0
  240. package/dist/tui/tui.js.map +1 -0
  241. package/dist/tui/ws-handler.js +154 -0
  242. package/dist/tui/ws-handler.js.map +1 -0
  243. package/dist/types.js +3 -0
  244. package/dist/types.js.map +1 -0
  245. package/dist/usage.js +88 -0
  246. package/dist/usage.js.map +1 -0
  247. package/dist/workspace.js +245 -0
  248. package/dist/workspace.js.map +1 -0
  249. package/package.json +74 -0
@@ -0,0 +1,284 @@
1
+ // apply_patch tool: apply multi-file patches in a custom diff format
2
+ import { z } from "zod";
3
+ import fs from "node:fs";
4
+ import path from "node:path";
5
+ function parsePatch(input) {
6
+ let text = input.trim();
7
+ if (text.startsWith("```")) {
8
+ text = text.replace(/^```[^\n]*\n/, "").replace(/\n```$/, "");
9
+ }
10
+ text = text.replace(/^\*\*\* Begin Patch\s*\n/, "").replace(/\n\*\*\* End Patch\s*$/, "");
11
+ const ops = [];
12
+ const lines = text.split("\n");
13
+ let i = 0;
14
+ while (i < lines.length) {
15
+ const line = lines[i];
16
+ if (line.startsWith("*** Add File: ")) {
17
+ const filePath = line.slice("*** Add File: ".length).trim();
18
+ const addLines = [];
19
+ i++;
20
+ while (i < lines.length && !lines[i].startsWith("*** ")) {
21
+ if (lines[i].startsWith("+")) {
22
+ addLines.push(lines[i].slice(1));
23
+ }
24
+ i++;
25
+ }
26
+ ops.push({ type: "add", path: filePath, lines: addLines });
27
+ }
28
+ else if (line.startsWith("*** Delete File: ")) {
29
+ const filePath = line.slice("*** Delete File: ".length).trim();
30
+ ops.push({ type: "delete", path: filePath });
31
+ i++;
32
+ }
33
+ else if (line.startsWith("*** Update File: ")) {
34
+ const filePath = line.slice("*** Update File: ".length).trim();
35
+ const chunks = [];
36
+ i++;
37
+ while (i < lines.length && !lines[i].startsWith("*** ")) {
38
+ if (lines[i].startsWith("@@ ")) {
39
+ const context = lines[i].slice(3).trim();
40
+ const chunkLines = [];
41
+ i++;
42
+ while (i < lines.length && !lines[i].startsWith("*** ") && !lines[i].startsWith("@@ ")) {
43
+ const cl = lines[i];
44
+ if (cl.startsWith("+")) {
45
+ chunkLines.push({ op: "+", text: cl.slice(1) });
46
+ }
47
+ else if (cl.startsWith("-")) {
48
+ chunkLines.push({ op: "-", text: cl.slice(1) });
49
+ }
50
+ else if (cl.startsWith(" ") || cl === "") {
51
+ chunkLines.push({ op: " ", text: cl.startsWith(" ") ? cl.slice(1) : cl });
52
+ }
53
+ else {
54
+ chunkLines.push({ op: " ", text: cl });
55
+ }
56
+ i++;
57
+ }
58
+ chunks.push({ context, lines: chunkLines });
59
+ }
60
+ else {
61
+ i++;
62
+ }
63
+ }
64
+ ops.push({ type: "update", path: filePath, chunks });
65
+ }
66
+ else {
67
+ i++;
68
+ }
69
+ }
70
+ return ops;
71
+ }
72
+ function applyChunks(content, chunks) {
73
+ const fileLines = content.split("\n");
74
+ for (const chunk of chunks) {
75
+ let contextIdx = -1;
76
+ if (chunk.context) {
77
+ for (let j = 0; j < fileLines.length; j++) {
78
+ if (fileLines[j] === chunk.context) {
79
+ contextIdx = j;
80
+ break;
81
+ }
82
+ }
83
+ if (contextIdx === -1) {
84
+ for (let j = 0; j < fileLines.length; j++) {
85
+ if (fileLines[j].trim() === chunk.context.trim()) {
86
+ contextIdx = j;
87
+ break;
88
+ }
89
+ }
90
+ }
91
+ if (contextIdx === -1) {
92
+ throw new Error(`Context line not found: "${chunk.context}"`);
93
+ }
94
+ }
95
+ else {
96
+ contextIdx = 0;
97
+ }
98
+ const oldLines = [];
99
+ const newLines = [];
100
+ for (const cl of chunk.lines) {
101
+ if (cl.op === " ") {
102
+ oldLines.push(cl.text);
103
+ newLines.push(cl.text);
104
+ }
105
+ else if (cl.op === "-") {
106
+ oldLines.push(cl.text);
107
+ }
108
+ else if (cl.op === "+") {
109
+ newLines.push(cl.text);
110
+ }
111
+ }
112
+ let matchStart = -1;
113
+ for (let start = contextIdx; start < fileLines.length; start++) {
114
+ let matches = true;
115
+ for (let k = 0; k < oldLines.length; k++) {
116
+ if (start + k >= fileLines.length) {
117
+ matches = false;
118
+ break;
119
+ }
120
+ if (fileLines[start + k] !== oldLines[k]) {
121
+ if (fileLines[start + k].trim() !== oldLines[k].trim()) {
122
+ matches = false;
123
+ break;
124
+ }
125
+ }
126
+ }
127
+ if (matches) {
128
+ matchStart = start;
129
+ break;
130
+ }
131
+ }
132
+ if (matchStart === -1) {
133
+ for (let start = Math.max(0, contextIdx - 1); start >= 0; start--) {
134
+ let matches = true;
135
+ for (let k = 0; k < oldLines.length; k++) {
136
+ if (start + k >= fileLines.length) {
137
+ matches = false;
138
+ break;
139
+ }
140
+ if (fileLines[start + k].trim() !== oldLines[k].trim()) {
141
+ matches = false;
142
+ break;
143
+ }
144
+ }
145
+ if (matches) {
146
+ matchStart = start;
147
+ break;
148
+ }
149
+ }
150
+ }
151
+ if (matchStart === -1) {
152
+ throw new Error(`Could not match chunk at context: "${chunk.context}"`);
153
+ }
154
+ fileLines.splice(matchStart, oldLines.length, ...newLines);
155
+ }
156
+ return fileLines.join("\n");
157
+ }
158
+ /** Write atomically: write to temp file, then rename over target */
159
+ function atomicWrite(filePath, content) {
160
+ const tmpPath = filePath + `.tmp.${process.pid}`;
161
+ try {
162
+ fs.writeFileSync(tmpPath, content, "utf-8");
163
+ fs.renameSync(tmpPath, filePath);
164
+ }
165
+ catch (err) {
166
+ // Clean up temp file on failure
167
+ try {
168
+ fs.unlinkSync(tmpPath);
169
+ }
170
+ catch { /* ignore */ }
171
+ throw err;
172
+ }
173
+ }
174
+ function applyOp(op) {
175
+ switch (op.type) {
176
+ case "add": {
177
+ const dir = path.dirname(op.path);
178
+ if (dir)
179
+ fs.mkdirSync(dir, { recursive: true });
180
+ const content = (op.lines ?? []).join("\n") + "\n";
181
+ atomicWrite(op.path, content);
182
+ return `A ${op.path}`;
183
+ }
184
+ case "delete": {
185
+ if (!fs.existsSync(op.path))
186
+ return `D ${op.path} (already missing)`;
187
+ fs.unlinkSync(op.path);
188
+ return `D ${op.path}`;
189
+ }
190
+ case "update": {
191
+ if (!fs.existsSync(op.path)) {
192
+ return `ERROR: File not found: ${op.path}`;
193
+ }
194
+ const content = fs.readFileSync(op.path, "utf-8");
195
+ const updated = applyChunks(content, op.chunks ?? []);
196
+ atomicWrite(op.path, updated);
197
+ return `M ${op.path}`;
198
+ }
199
+ }
200
+ }
201
+ export const patchTool = {
202
+ name: "apply_patch",
203
+ description: `Apply a patch to create, modify, or delete files. Use this for multi-file changes or when you know the exact diff.
204
+
205
+ Format:
206
+ *** Add File: path/to/new.ts
207
+ +line1
208
+ +line2
209
+
210
+ *** Update File: path/to/existing.ts
211
+ @@ context line to find
212
+ unchanged line
213
+ -removed line
214
+ +added line
215
+
216
+ *** Delete File: path/to/old.ts`,
217
+ schema: z.object({
218
+ patch: z.string().describe("The patch content in the format described above"),
219
+ }),
220
+ execute: async (args) => {
221
+ const { patch } = args;
222
+ try {
223
+ const ops = parsePatch(patch);
224
+ if (ops.length === 0)
225
+ return "ERROR: No valid patch operations found";
226
+ // Phase 1: Dry-run all updates to catch errors before any writes
227
+ // Save original contents for rollback
228
+ const originals = new Map();
229
+ const staged = [];
230
+ for (const op of ops) {
231
+ if (op.type === "update") {
232
+ if (!fs.existsSync(op.path)) {
233
+ return `ERROR: File not found: ${op.path}`;
234
+ }
235
+ const content = fs.readFileSync(op.path, "utf-8");
236
+ originals.set(op.path, content);
237
+ const updated = applyChunks(content, op.chunks ?? []);
238
+ staged.push({ op, content: updated });
239
+ }
240
+ else if (op.type === "add") {
241
+ originals.set(op.path, fs.existsSync(op.path) ? fs.readFileSync(op.path, "utf-8") : null);
242
+ staged.push({ op });
243
+ }
244
+ else {
245
+ staged.push({ op });
246
+ }
247
+ }
248
+ // Phase 2: Apply all operations
249
+ const results = [];
250
+ for (const { op, content } of staged) {
251
+ try {
252
+ if (op.type === "update" && content !== undefined) {
253
+ atomicWrite(op.path, content);
254
+ results.push(`M ${op.path}`);
255
+ }
256
+ else {
257
+ results.push(applyOp(op));
258
+ }
259
+ }
260
+ catch (err) {
261
+ // Rollback already-applied files
262
+ for (const [filePath, original] of originals) {
263
+ try {
264
+ if (original === null) {
265
+ if (fs.existsSync(filePath))
266
+ fs.unlinkSync(filePath);
267
+ }
268
+ else {
269
+ fs.writeFileSync(filePath, original, "utf-8");
270
+ }
271
+ }
272
+ catch { /* best-effort rollback */ }
273
+ }
274
+ return `ERROR: ${op.path}: ${err instanceof Error ? err.message : String(err)} (all changes rolled back)`;
275
+ }
276
+ }
277
+ return results.join("\n");
278
+ }
279
+ catch (err) {
280
+ return `ERROR: ${err instanceof Error ? err.message : String(err)}`;
281
+ }
282
+ },
283
+ };
284
+ //# sourceMappingURL=patch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch.js","sourceRoot":"","sources":["../../src/tools/patch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { tool } from "@langchain/core/tools";
2
+ import { z } from "zod";
3
+ import fs from "node:fs";
4
+ export const readTool = tool(async ({ path, offset, limit }) => {
5
+ try {
6
+ if (!fs.existsSync(path))
7
+ return `ERROR: File not found: ${path}`;
8
+ const content = fs.readFileSync(path, "utf-8");
9
+ const lines = content.split("\n");
10
+ const start = offset ?? 0;
11
+ const end = limit ? start + limit : lines.length;
12
+ return lines.slice(start, end).map((l, i) => `${start + i + 1}\t${l}`).join("\n");
13
+ }
14
+ catch (err) {
15
+ return `ERROR: ${err.message}`;
16
+ }
17
+ }, {
18
+ name: "read",
19
+ description: "Read a file and return its contents with line numbers",
20
+ schema: z.object({
21
+ path: z.string().describe("Absolute or relative file path"),
22
+ offset: z.number().nullable().optional().describe("Start from this line (0-indexed)"),
23
+ limit: z.number().nullable().optional().describe("Number of lines to read"),
24
+ }),
25
+ });
26
+ //# sourceMappingURL=read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/tools/read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAC1B,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAmB,EAAE;IACjD,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,0BAA0B,IAAI,EAAE,CAAC;QAClE,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,CAAC;QAC1B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;QACjD,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpF,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC;IACjC,CAAC;AACH,CAAC,EACD;IACE,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,uDAAuD;IACpE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;QAC3D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;QACrF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;KAC5E,CAAC;CACH,CACF,CAAC"}
@@ -0,0 +1,62 @@
1
+ // Web search tool — DuckDuckGo HTML scraping (zero config)
2
+ import { tool } from "@langchain/core/tools";
3
+ import { z } from "zod";
4
+ async function searchDuckDuckGo(query, maxResults = 8) {
5
+ const url = `https://html.duckduckgo.com/html/?q=${encodeURIComponent(query)}`;
6
+ const response = await fetch(url, {
7
+ headers: {
8
+ "User-Agent": "Mozilla/5.0 (compatible; OpenCamel/1.0)",
9
+ },
10
+ });
11
+ if (!response.ok)
12
+ throw new Error(`Search failed: ${response.status}`);
13
+ const html = await response.text();
14
+ const results = [];
15
+ // Parse DuckDuckGo HTML results
16
+ // Results are in <a class="result__a"> and <a class="result__snippet">
17
+ const resultBlocks = html.split(/class="result\s/);
18
+ for (const block of resultBlocks.slice(1)) {
19
+ if (results.length >= maxResults)
20
+ break;
21
+ // Extract URL and title from result__a
22
+ const linkMatch = block.match(/class="result__a"[^>]*href="([^"]*)"[^>]*>([^<]*)</);
23
+ if (!linkMatch)
24
+ continue;
25
+ let resultUrl = linkMatch[1];
26
+ const title = linkMatch[2].trim();
27
+ // DuckDuckGo wraps URLs in redirect — extract actual URL
28
+ const uddgMatch = resultUrl.match(/uddg=([^&]+)/);
29
+ if (uddgMatch)
30
+ resultUrl = decodeURIComponent(uddgMatch[1]);
31
+ // Extract snippet
32
+ const snippetMatch = block.match(/class="result__snippet"[^>]*>([^<]*(?:<[^>]*>[^<]*)*)/);
33
+ const snippet = snippetMatch
34
+ ? snippetMatch[1].replace(/<[^>]*>/g, "").replace(/\s+/g, " ").trim()
35
+ : "";
36
+ if (title && resultUrl) {
37
+ results.push({ title, url: resultUrl, snippet });
38
+ }
39
+ }
40
+ return results;
41
+ }
42
+ export const searchTool = tool(async ({ query, maxResults }) => {
43
+ try {
44
+ const results = await searchDuckDuckGo(query, maxResults ?? 8);
45
+ if (results.length === 0)
46
+ return "No results found.";
47
+ return results
48
+ .map((r, i) => `${i + 1}. ${r.title}\n ${r.url}\n ${r.snippet}`)
49
+ .join("\n\n");
50
+ }
51
+ catch (err) {
52
+ return `ERROR: ${err.message}`;
53
+ }
54
+ }, {
55
+ name: "web_search",
56
+ description: "Search the web for information. Returns titles, URLs, and snippets.",
57
+ schema: z.object({
58
+ query: z.string().describe("Search query"),
59
+ maxResults: z.number().optional().describe("Maximum results to return (default 8)"),
60
+ }),
61
+ });
62
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAE3D,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,KAAK,UAAU,gBAAgB,CAAC,KAAa,EAAE,UAAU,GAAG,CAAC;IAC3D,MAAM,GAAG,GAAG,uCAAuC,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;IAC/E,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,OAAO,EAAE;YACP,YAAY,EAAE,yCAAyC;SACxD;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEnC,MAAM,OAAO,GAAmB,EAAE,CAAC;IAEnC,gCAAgC;IAChC,uEAAuE;IACvE,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAEnD,KAAK,MAAM,KAAK,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,IAAI,OAAO,CAAC,MAAM,IAAI,UAAU;YAAE,MAAM;QAExC,uCAAuC;QACvC,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACpF,IAAI,CAAC,SAAS;YAAE,SAAS;QAEzB,IAAI,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAElC,yDAAyD;QACzD,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAClD,IAAI,SAAS;YAAE,SAAS,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAE5D,kBAAkB;QAClB,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC1F,MAAM,OAAO,GAAG,YAAY;YAC1B,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE;YACrE,CAAC,CAAC,EAAE,CAAC;QAEP,IAAI,KAAK,IAAI,SAAS,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAC5B,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,EAAmB,EAAE;IAC/C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,KAAK,EAAE,UAAU,IAAI,CAAC,CAAC,CAAC;QAE/D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,mBAAmB,CAAC;QAErD,OAAO,OAAO;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC;aACnE,IAAI,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC;IACjC,CAAC;AACH,CAAC,EACD;IACE,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,qEAAqE;IAClF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QAC1C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;KACpF,CAAC;CACH,CACF,CAAC"}
@@ -0,0 +1,48 @@
1
+ // Subagent tool: spawn child agents for parallel/isolated tasks
2
+ import { tool } from "@langchain/core/tools";
3
+ import { z } from "zod";
4
+ import { spawnSubagent, listSubagents } from "../subagent.js";
5
+ // These get set by the gateway before tools are used
6
+ let _model = null;
7
+ let _systemPrompt = "";
8
+ let _compaction = null;
9
+ export function setSubagentContext(model, systemPrompt, compaction) {
10
+ _model = model;
11
+ _systemPrompt = systemPrompt;
12
+ _compaction = compaction;
13
+ }
14
+ export const subagentSpawnTool = tool(async ({ task }) => {
15
+ if (!_model)
16
+ return "ERROR: Subagent system not initialized";
17
+ try {
18
+ const handle = await spawnSubagent(_model, _systemPrompt, task, {
19
+ compaction: _compaction,
20
+ });
21
+ if (handle.status === "done") {
22
+ return handle.result ?? "(no response)";
23
+ }
24
+ else {
25
+ return `Subagent failed: ${handle.error}`;
26
+ }
27
+ }
28
+ catch (err) {
29
+ return `ERROR: ${err.message}`;
30
+ }
31
+ }, {
32
+ name: "subagent",
33
+ description: "Spawn a child agent to handle a subtask in an isolated session. The subagent has access to all tools. Use for: parallel research, complex subtasks, tasks that need isolated context.",
34
+ schema: z.object({
35
+ task: z.string().describe("The task/prompt for the subagent to execute"),
36
+ }),
37
+ });
38
+ export const subagentListTool = tool(async () => {
39
+ const subs = listSubagents();
40
+ if (subs.length === 0)
41
+ return "No subagents have been spawned.";
42
+ return subs.map((s) => `[${s.id}] ${s.status} | ${s.task.slice(0, 80)}${s.task.length > 80 ? "..." : ""}`).join("\n");
43
+ }, {
44
+ name: "subagent_list",
45
+ description: "List all spawned subagents and their status",
46
+ schema: z.object({}),
47
+ });
48
+ //# sourceMappingURL=subagent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subagent.js","sourceRoot":"","sources":["../../src/tools/subagent.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAEhE,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAe,MAAM,gBAAgB,CAAC;AAE3E,qDAAqD;AACrD,IAAI,MAAM,GAAQ,IAAI,CAAC;AACvB,IAAI,aAAa,GAAG,EAAE,CAAC;AACvB,IAAI,WAAW,GAAQ,IAAI,CAAC;AAE5B,MAAM,UAAU,kBAAkB,CAAC,KAAU,EAAE,YAAoB,EAAE,UAAgB;IACnF,MAAM,GAAG,KAAK,CAAC;IACf,aAAa,GAAG,YAAY,CAAC;IAC7B,WAAW,GAAG,UAAU,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CACnC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAmB,EAAE;IAClC,IAAI,CAAC,MAAM;QAAE,OAAO,wCAAwC,CAAC;IAE7D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE;YAC9D,UAAU,EAAE,WAAW;SACxB,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC7B,OAAO,MAAM,CAAC,MAAM,IAAI,eAAe,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,OAAO,oBAAoB,MAAM,CAAC,KAAK,EAAE,CAAC;QAC5C,CAAC;IACH,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC;IACjC,CAAC;AACH,CAAC,EACD;IACE,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,uLAAuL;IACpM,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;KACzE,CAAC;CACH,CACF,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAClC,KAAK,IAAqB,EAAE;IAC1B,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,iCAAiC,CAAC;IAEhE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACpB,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CACnF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC,EACD;IACE,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,6CAA6C;IAC1D,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;CACrB,CACF,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { tool } from "@langchain/core/tools";
2
+ import { z } from "zod";
3
+ import fs from "node:fs";
4
+ import path from "node:path";
5
+ export const writeTool = tool(async ({ filePath, content }) => {
6
+ try {
7
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
8
+ fs.writeFileSync(filePath, content, "utf-8");
9
+ return `Wrote ${content.length} chars to ${filePath}`;
10
+ }
11
+ catch (err) {
12
+ return `ERROR: ${err.message}`;
13
+ }
14
+ }, {
15
+ name: "write",
16
+ description: "Write content to a file (creates directories if needed)",
17
+ schema: z.object({
18
+ filePath: z.string().describe("File path to write to"),
19
+ content: z.string().describe("Content to write"),
20
+ }),
21
+ });
22
+ //# sourceMappingURL=write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/tools/write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAC3B,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAmB,EAAE;IAC/C,IAAI,CAAC;QACH,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7C,OAAO,SAAS,OAAO,CAAC,MAAM,aAAa,QAAQ,EAAE,CAAC;IACxD,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC;IACjC,CAAC;AACH,CAAC,EACD;IACE,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,yDAAyD;IACtE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QACtD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;KACjD,CAAC;CACH,CACF,CAAC"}