summaryrefslogtreecommitdiffhomepage
path: root/packages/opencode/src/server/instance/index.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/opencode/src/server/instance/index.ts')
-rw-r--r--packages/opencode/src/server/instance/index.ts263
1 files changed, 263 insertions, 0 deletions
diff --git a/packages/opencode/src/server/instance/index.ts b/packages/opencode/src/server/instance/index.ts
new file mode 100644
index 000000000..2acc424e4
--- /dev/null
+++ b/packages/opencode/src/server/instance/index.ts
@@ -0,0 +1,263 @@
+import { describeRoute, resolver, validator } from "hono-openapi"
+import { Hono } from "hono"
+import type { UpgradeWebSocket } from "hono/ws"
+import z from "zod"
+import { Format } from "../../format"
+import { TuiRoutes } from "./tui"
+import { Instance } from "../../project/instance"
+import { Vcs } from "../../project/vcs"
+import { Agent } from "../../agent/agent"
+import { Skill } from "../../skill"
+import { Global } from "../../global"
+import { LSP } from "../../lsp"
+import { Command } from "../../command"
+import { QuestionRoutes } from "./question"
+import { PermissionRoutes } from "./permission"
+import { ProjectRoutes } from "./project"
+import { SessionRoutes } from "./session"
+import { PtyRoutes } from "./pty"
+import { McpRoutes } from "./mcp"
+import { FileRoutes } from "./file"
+import { ConfigRoutes } from "./config"
+import { ExperimentalRoutes } from "./experimental"
+import { ProviderRoutes } from "./provider"
+import { EventRoutes } from "./event"
+import { WorkspaceRouterMiddleware } from "./middleware"
+import { AppRuntime } from "@/effect/app-runtime"
+
+export const InstanceRoutes = (upgrade: UpgradeWebSocket): Hono =>
+ new Hono()
+ .use(WorkspaceRouterMiddleware(upgrade))
+ .route("/project", ProjectRoutes())
+ .route("/pty", PtyRoutes(upgrade))
+ .route("/config", ConfigRoutes())
+ .route("/experimental", ExperimentalRoutes())
+ .route("/session", SessionRoutes())
+ .route("/permission", PermissionRoutes())
+ .route("/question", QuestionRoutes())
+ .route("/provider", ProviderRoutes())
+ .route("/", FileRoutes())
+ .route("/", EventRoutes())
+ .route("/mcp", McpRoutes())
+ .route("/tui", TuiRoutes())
+ .post(
+ "/instance/dispose",
+ describeRoute({
+ summary: "Dispose instance",
+ description: "Clean up and dispose the current OpenCode instance, releasing all resources.",
+ operationId: "instance.dispose",
+ responses: {
+ 200: {
+ description: "Instance disposed",
+ content: {
+ "application/json": {
+ schema: resolver(z.boolean()),
+ },
+ },
+ },
+ },
+ }),
+ async (c) => {
+ await Instance.dispose()
+ return c.json(true)
+ },
+ )
+ .get(
+ "/path",
+ describeRoute({
+ summary: "Get paths",
+ description: "Retrieve the current working directory and related path information for the OpenCode instance.",
+ operationId: "path.get",
+ responses: {
+ 200: {
+ description: "Path",
+ content: {
+ "application/json": {
+ schema: resolver(
+ z
+ .object({
+ home: z.string(),
+ state: z.string(),
+ config: z.string(),
+ worktree: z.string(),
+ directory: z.string(),
+ })
+ .meta({
+ ref: "Path",
+ }),
+ ),
+ },
+ },
+ },
+ },
+ }),
+ async (c) => {
+ return c.json({
+ home: Global.Path.home,
+ state: Global.Path.state,
+ config: Global.Path.config,
+ worktree: Instance.worktree,
+ directory: Instance.directory,
+ })
+ },
+ )
+ .get(
+ "/vcs",
+ describeRoute({
+ summary: "Get VCS info",
+ description: "Retrieve version control system (VCS) information for the current project, such as git branch.",
+ operationId: "vcs.get",
+ responses: {
+ 200: {
+ description: "VCS info",
+ content: {
+ "application/json": {
+ schema: resolver(Vcs.Info),
+ },
+ },
+ },
+ },
+ }),
+ async (c) => {
+ const [branch, default_branch] = await Promise.all([Vcs.branch(), Vcs.defaultBranch()])
+ return c.json({
+ branch,
+ default_branch,
+ })
+ },
+ )
+ .get(
+ "/vcs/diff",
+ describeRoute({
+ summary: "Get VCS diff",
+ description: "Retrieve the current git diff for the working tree or against the default branch.",
+ operationId: "vcs.diff",
+ responses: {
+ 200: {
+ description: "VCS diff",
+ content: {
+ "application/json": {
+ schema: resolver(Vcs.FileDiff.array()),
+ },
+ },
+ },
+ },
+ }),
+ validator(
+ "query",
+ z.object({
+ mode: Vcs.Mode,
+ }),
+ ),
+ async (c) => {
+ return c.json(await Vcs.diff(c.req.valid("query").mode))
+ },
+ )
+ .get(
+ "/command",
+ describeRoute({
+ summary: "List commands",
+ description: "Get a list of all available commands in the OpenCode system.",
+ operationId: "command.list",
+ responses: {
+ 200: {
+ description: "List of commands",
+ content: {
+ "application/json": {
+ schema: resolver(Command.Info.array()),
+ },
+ },
+ },
+ },
+ }),
+ async (c) => {
+ const commands = await AppRuntime.runPromise(Command.Service.use((svc) => svc.list()))
+ return c.json(commands)
+ },
+ )
+ .get(
+ "/agent",
+ describeRoute({
+ summary: "List agents",
+ description: "Get a list of all available AI agents in the OpenCode system.",
+ operationId: "app.agents",
+ responses: {
+ 200: {
+ description: "List of agents",
+ content: {
+ "application/json": {
+ schema: resolver(Agent.Info.array()),
+ },
+ },
+ },
+ },
+ }),
+ async (c) => {
+ const modes = await Agent.list()
+ return c.json(modes)
+ },
+ )
+ .get(
+ "/skill",
+ describeRoute({
+ summary: "List skills",
+ description: "Get a list of all available skills in the OpenCode system.",
+ operationId: "app.skills",
+ responses: {
+ 200: {
+ description: "List of skills",
+ content: {
+ "application/json": {
+ schema: resolver(Skill.Info.array()),
+ },
+ },
+ },
+ },
+ }),
+ async (c) => {
+ const skills = await Skill.all()
+ return c.json(skills)
+ },
+ )
+ .get(
+ "/lsp",
+ describeRoute({
+ summary: "Get LSP status",
+ description: "Get LSP server status",
+ operationId: "lsp.status",
+ responses: {
+ 200: {
+ description: "LSP server status",
+ content: {
+ "application/json": {
+ schema: resolver(LSP.Status.array()),
+ },
+ },
+ },
+ },
+ }),
+ async (c) => {
+ return c.json(await LSP.status())
+ },
+ )
+ .get(
+ "/formatter",
+ describeRoute({
+ summary: "Get formatter status",
+ description: "Get formatter status",
+ operationId: "formatter.status",
+ responses: {
+ 200: {
+ description: "Formatter status",
+ content: {
+ "application/json": {
+ schema: resolver(Format.Status.array()),
+ },
+ },
+ },
+ },
+ }),
+ async (c) => {
+ return c.json(await AppRuntime.runPromise(Format.Service.use((svc) => svc.status())))
+ },
+ )