summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorja <[email protected]>2025-12-22 15:31:47 -0500
committerGitHub <[email protected]>2025-12-22 14:31:47 -0600
commitcd8ecf9722b6ec856135b8000e0cb9053ec0532c (patch)
tree317017f395d9ee2555dca7f22a817693c47c5997
parenteb021a5f92aa56ca5848761dfb0dc2d470a4d41c (diff)
downloadopencode-cd8ecf9722b6ec856135b8000e0cb9053ec0532c.tar.gz
opencode-cd8ecf9722b6ec856135b8000e0cb9053ec0532c.zip
feat(lsp): add Tinymist LSP support for Typst (#5933)
-rw-r--r--packages/opencode/src/lsp/language.ts2
-rw-r--r--packages/opencode/src/lsp/server.ts94
-rw-r--r--packages/web/src/content/docs/lsp.mdx1
3 files changed, 97 insertions, 0 deletions
diff --git a/packages/opencode/src/lsp/language.ts b/packages/opencode/src/lsp/language.ts
index 12792c7c2..620944a8e 100644
--- a/packages/opencode/src/lsp/language.ts
+++ b/packages/opencode/src/lsp/language.ts
@@ -111,4 +111,6 @@ export const LANGUAGE_EXTENSIONS: Record<string, string> = {
".tfvars": "terraform-vars",
".hcl": "hcl",
".nix": "nix",
+ ".typ": "typst",
+ ".typc": "typst",
} as const
diff --git a/packages/opencode/src/lsp/server.ts b/packages/opencode/src/lsp/server.ts
index e0c8de998..b432e5a5d 100644
--- a/packages/opencode/src/lsp/server.ts
+++ b/packages/opencode/src/lsp/server.ts
@@ -1798,4 +1798,98 @@ export namespace LSPServer {
}
},
}
+
+ export const Tinymist: Info = {
+ id: "tinymist",
+ extensions: [".typ", ".typc"],
+ root: NearestRoot(["typst.toml"]),
+ async spawn(root) {
+ let bin = Bun.which("tinymist", {
+ PATH: process.env["PATH"] + path.delimiter + Global.Path.bin,
+ })
+
+ if (!bin) {
+ if (Flag.OPENCODE_DISABLE_LSP_DOWNLOAD) return
+ log.info("downloading tinymist from GitHub releases")
+
+ const response = await fetch("https://api.github.com/repos/Myriad-Dreamin/tinymist/releases/latest")
+ if (!response.ok) {
+ log.error("Failed to fetch tinymist release info")
+ return
+ }
+
+ const release = (await response.json()) as {
+ tag_name?: string
+ assets?: { name?: string; browser_download_url?: string }[]
+ }
+
+ const platform = process.platform
+ const arch = process.arch
+
+ const tinymistArch = arch === "arm64" ? "aarch64" : "x86_64"
+ let tinymistPlatform: string
+ let ext: string
+
+ if (platform === "darwin") {
+ tinymistPlatform = "apple-darwin"
+ ext = "tar.gz"
+ } else if (platform === "win32") {
+ tinymistPlatform = "pc-windows-msvc"
+ ext = "zip"
+ } else {
+ tinymistPlatform = "unknown-linux-gnu"
+ ext = "tar.gz"
+ }
+
+ const assetName = `tinymist-${tinymistArch}-${tinymistPlatform}.${ext}`
+
+ const assets = release.assets ?? []
+ const asset = assets.find((a) => a.name === assetName)
+ if (!asset?.browser_download_url) {
+ log.error(`Could not find asset ${assetName} in tinymist release`)
+ return
+ }
+
+ const downloadResponse = await fetch(asset.browser_download_url)
+ if (!downloadResponse.ok) {
+ log.error("Failed to download tinymist")
+ return
+ }
+
+ const tempPath = path.join(Global.Path.bin, assetName)
+ await Bun.file(tempPath).write(downloadResponse)
+
+ if (ext === "zip") {
+ const ok = await Archive.extractZip(tempPath, Global.Path.bin)
+ .then(() => true)
+ .catch((error) => {
+ log.error("Failed to extract tinymist archive", { error })
+ return false
+ })
+ if (!ok) return
+ } else {
+ await $`tar -xzf ${tempPath} --strip-components=1`.cwd(Global.Path.bin).quiet().nothrow()
+ }
+
+ await fs.rm(tempPath, { force: true })
+
+ bin = path.join(Global.Path.bin, "tinymist" + (platform === "win32" ? ".exe" : ""))
+
+ if (!(await Bun.file(bin).exists())) {
+ log.error("Failed to extract tinymist binary")
+ return
+ }
+
+ if (platform !== "win32") {
+ await $`chmod +x ${bin}`.quiet().nothrow()
+ }
+
+ log.info("installed tinymist", { bin })
+ }
+
+ return {
+ process: spawn(bin, { cwd: root }),
+ }
+ },
+ }
}
diff --git a/packages/web/src/content/docs/lsp.mdx b/packages/web/src/content/docs/lsp.mdx
index b546c1991..230f782d3 100644
--- a/packages/web/src/content/docs/lsp.mdx
+++ b/packages/web/src/content/docs/lsp.mdx
@@ -37,6 +37,7 @@ OpenCode comes with several built-in LSP servers for popular languages:
| sourcekit-lsp | .swift, .objc, .objcpp | `swift` installed (`xcode` on macOS) |
| svelte | .svelte | Auto-installs for Svelte projects |
| terraform | .tf, .tfvars | Auto-installs from GitHub releases |
+| tinymist | .typ, .typc | Auto-installs from GitHub releases |
| typescript | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts | `typescript` dependency in project |
| vue | .vue | Auto-installs for Vue projects |
| yaml-ls | .yaml, .yml | Auto-installs Red Hat yaml-language-server |