Skip to content

Commit 772b70e

Browse files
committed
feat: add terminal, searchCode, openUrl tool
1 parent dd428d9 commit 772b70e

4 files changed

Lines changed: 778 additions & 0 deletions

File tree

src/pages/aiAssistant/tools/index.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ import { createDir } from "./createDir";
22
import { editFile } from "./editFile";
33
import { fetchTool } from "./fetch";
44
import { listDirectory } from "./listDirectory";
5+
import { openUrl } from "./openUrl";
56
import { readFile } from "./readFile";
7+
import { searchCode } from "./searchCode";
8+
import { interactiveTerminal, terminal } from "./terminal";
69

710
// Export all tools as a single object
811
export const allTools = {
@@ -11,4 +14,8 @@ export const allTools = {
1114
listDirectory,
1215
editFile,
1316
createDir,
17+
terminal,
18+
interactiveTerminal,
19+
searchCode,
20+
openUrl,
1421
};
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import { StructuredTool } from "@langchain/core/tools";
2+
import browser from "plugins/browser";
3+
import { z } from "zod";
4+
5+
const SUPPORTED_PROTOCOL = /^https?:\/\//i;
6+
7+
function normalizeTarget(target) {
8+
if (!target) return "inApp";
9+
if (target === "in-app" || target === "inapp") return "inApp";
10+
return target;
11+
}
12+
13+
class OpenUrlTool extends StructuredTool {
14+
name = "openUrl";
15+
description =
16+
"Opens a URL in the system browser or the in-app browser. " +
17+
"Use this to hand off documentation, dashboards, or other web resources to the user.";
18+
19+
schema = z.object({
20+
url: z
21+
.string()
22+
.min(1)
23+
.describe("Full URL including scheme (http or https)."),
24+
target: z
25+
.enum(["external", "inApp"])
26+
.default("inApp")
27+
.describe(
28+
"Destination: external (system browser) or inApp (Acode's built-in browser). Default inApp.",
29+
),
30+
});
31+
32+
async _call({ url, target = "inApp" }) {
33+
const trimmedUrl = url.trim();
34+
if (!SUPPORTED_PROTOCOL.test(trimmedUrl)) {
35+
return "Error: Only http and https URLs are supported.";
36+
}
37+
38+
const normalizedTarget = normalizeTarget(target);
39+
40+
try {
41+
if (normalizedTarget === "inApp") {
42+
browser.open(trimmedUrl);
43+
return `Opened ${trimmedUrl} in the in-app browser.`;
44+
}
45+
46+
if (typeof window.system.openInBrowser !== "function") {
47+
return "Error: External browser integration is unavailable.";
48+
}
49+
50+
window.system.openInBrowser(trimmedUrl);
51+
return `Opened ${trimmedUrl} in the system browser.`;
52+
} catch (error) {
53+
return `Error opening URL: ${error.message}`;
54+
}
55+
}
56+
}
57+
58+
export const openUrl = new OpenUrlTool();

0 commit comments

Comments
 (0)