diff options
| author | Yuu Toriyama <[email protected]> | 2025-08-14 04:46:21 +0900 |
|---|---|---|
| committer | opencode <[email protected]> | 2025-08-13 19:49:14 +0000 |
| commit | 3f0f910f7b3efdd0b7836a5812821973bbe15817 (patch) | |
| tree | 9c60570b21eec9436a99621c10331ac33e1de7b0 /packages | |
| parent | 5bf841ab7a9f3258abe2b1adba4b4bc3f0e4915d (diff) | |
| download | opencode-3f0f910f7b3efdd0b7836a5812821973bbe15817.tar.gz opencode-3f0f910f7b3efdd0b7836a5812821973bbe15817.zip | |
Fix: Error [ERR_DLOPEN_FAILED] (#1546)
Diffstat (limited to 'packages')
| -rw-r--r-- | packages/opencode/package.json | 1 | ||||
| -rw-r--r-- | packages/opencode/src/tool/bash.ts | 27 | ||||
| -rw-r--r-- | packages/opencode/src/tool/test.ts | 69 |
3 files changed, 66 insertions, 31 deletions
diff --git a/packages/opencode/package.json b/packages/opencode/package.json index be7664e89..e7853e7ac 100644 --- a/packages/opencode/package.json +++ b/packages/opencode/package.json @@ -52,6 +52,7 @@ "remeda": "catalog:", "tree-sitter": "0.22.4", "tree-sitter-bash": "0.23.3", + "web-tree-sitter": "0.22.6", "turndown": "7.2.0", "vscode-jsonrpc": "8.2.1", "xdg-basedir": "5.1.0", diff --git a/packages/opencode/src/tool/bash.ts b/packages/opencode/src/tool/bash.ts index b0fe920b6..da1559c50 100644 --- a/packages/opencode/src/tool/bash.ts +++ b/packages/opencode/src/tool/bash.ts @@ -19,11 +19,28 @@ const MAX_TIMEOUT = 10 * 60 * 1000 const log = Log.create({ service: "bash-tool" }) const parser = lazy(async () => { - const { default: Parser } = await import("tree-sitter") - const Bash = await import("tree-sitter-bash") - const p = new Parser() - p.setLanguage(Bash.language as any) - return p + try { + const { default: Parser } = await import("tree-sitter") + const Bash = await import("tree-sitter-bash") + const p = new Parser() + p.setLanguage(Bash.language as any) + return p + } catch (e) { + const { default: Parser } = await import("web-tree-sitter") + const { default: treeWasm } = await import("web-tree-sitter/tree-sitter.wasm" as string, { with: { type: "wasm" } }) + await Parser.init({ + locateFile() { + return treeWasm + }, + }) + const { default: bashWasm } = await import("tree-sitter-bash/tree-sitter-bash.wasm" as string, { + with: { type: "wasm" }, + }) + const bashLanguage = await Parser.Language.load(bashWasm) + const p = new Parser() + p.setLanguage(bashLanguage) + return p + } }) export const BashTool = Tool.define("bash", { diff --git a/packages/opencode/src/tool/test.ts b/packages/opencode/src/tool/test.ts index 4ac819826..138d92fbc 100644 --- a/packages/opencode/src/tool/test.ts +++ b/packages/opencode/src/tool/test.ts @@ -1,53 +1,70 @@ -import Parser from "tree-sitter"; -import Bash from "tree-sitter-bash"; - -const parser = new Parser(); -parser.setLanguage(Bash.language as any); +const parser = async () => { + try { + const { default: Parser } = await import("tree-sitter") + const Bash = await import("tree-sitter-bash") + const p = new Parser() + p.setLanguage(Bash.language as any) + return p + } catch (e) { + const { default: Parser } = await import("web-tree-sitter") + const { default: treeWasm } = await import("web-tree-sitter/tree-sitter.wasm" as string, { with: { type: "wasm" } }) + await Parser.init({ + locateFile() { + return treeWasm + }, + }) + const { default: bashWasm } = await import("tree-sitter-bash/tree-sitter-bash.wasm" as string, { + with: { type: "wasm" }, + }) + const bashLanguage = await Parser.Language.load(bashWasm) + const p = new Parser() + p.setLanguage(bashLanguage) + return p + } +} -const sourceCode = `cd --foo foo/bar && echo "hello" && cd ../baz`; +const sourceCode = `cd --foo foo/bar && echo "hello" && cd ../baz` -const tree = parser.parse(sourceCode); +const tree = await parser().then((p) => p.parse(sourceCode)) // Function to extract commands and arguments -function extractCommands( - node: any, -): Array<{ command: string; args: string[] }> { - const commands: Array<{ command: string; args: string[] }> = []; +function extractCommands(node: any): Array<{ command: string; args: string[] }> { + const commands: Array<{ command: string; args: string[] }> = [] function traverse(node: any) { if (node.type === "command") { - const commandNode = node.child(0); + const commandNode = node.child(0) if (commandNode) { - const command = commandNode.text; - const args: string[] = []; + const command = commandNode.text + const args: string[] = [] // Extract arguments for (let i = 1; i < node.childCount; i++) { - const child = node.child(i); + const child = node.child(i) if (child && child.type === "word") { - args.push(child.text); + args.push(child.text) } } - commands.push({ command, args }); + commands.push({ command, args }) } } // Traverse children for (let i = 0; i < node.childCount; i++) { - traverse(node.child(i)); + traverse(node.child(i)) } } - traverse(node); - return commands; + traverse(node) + return commands } // Extract and display commands -console.log("Source code: " + sourceCode); -const commands = extractCommands(tree.rootNode); -console.log("Extracted commands:"); +console.log("Source code: " + sourceCode) +const commands = extractCommands(tree.rootNode) +console.log("Extracted commands:") commands.forEach((cmd, index) => { - console.log(`${index + 1}. Command: ${cmd.command}`); - console.log(` Args: [${cmd.args.join(", ")}]`); -}); + console.log(`${index + 1}. Command: ${cmd.command}`) + console.log(` Args: [${cmd.args.join(", ")}]`) +}) |
