import type { Plugin } from "@opencode-ai/plugin"; import { Axios } from "axios"; import { promises as fs } from "fs"; import { z } from "zod"; const { vmOrchestrationStatusUpdateUrl } = z .object({ vmOrchestrationStatusUpdateUrl: z.string(), }) .parse({ vmOrchestrationStatusUpdateUrl: process.env.TAYLORDB_VM_ORCHESTRATION_STATUS_UPDATE_URL, }); const axios = new Axios({ baseURL: vmOrchestrationStatusUpdateUrl, }); const updateAppStatus = async (status: "Errored" | "Active" | "Pending") => { await axios.put( "/", JSON.stringify({ status, }), { headers: { "Content-Type": "application/json", }, } ); }; export const DevServerHMRPlugin: Plugin = async ({ client, $ }) => { return { event: async ({ event }) => { if (event.type !== "session.idle") return; const session = await client.session.get({ path: { id: event.properties.sessionID }, }); const isAnyChange = session.data?.summary?.files && session.data.summary.files > 0; if (!isAnyChange) { await updateAppStatus("Active"); return; } const result = await $`pnpm build`.quiet().catch((error) => error); if (result.exitCode !== 0) { if (!client.session["tries"]) { client.session["tries"] = 0; } else { client.session["tries"]++; } if (client.session["tries"] > 3) { await updateAppStatus("Errored"); return; } await client.session.prompt({ path: { id: event.properties.sessionID }, body: { parts: [ { type: "text", text: `While building the project, the following error occurred:\n\n${result.stderr.toString()}\n\nPlease fix the error and try again.`, }, ], }, }); } try { const packageJson = JSON.parse( await fs.readFile("package.json", "utf-8") ); const [major, minor, patch] = packageJson.version .split(".") .map(Number); const newVersion = `${major}.${minor}.${patch + 1}`; const messages = await client.session.messages({ path: { id: event.properties.sessionID }, }); if (!messages.data) { return; } const title = messages.data .reverse() .find( (message) => message.info.role === "user" && message.info.summary && message.info.summary.title )?.info.summary?.["title"]; const commitMessage = title ?? `feat: release version v${newVersion}`; packageJson.version = newVersion; await fs.writeFile( "package.json", JSON.stringify(packageJson, null, 2) ); await $`git config user.name "Taylor AI"`.quiet(); await $`git config user.email "ai@taylordb.io"`.quiet(); await $`git add .`.quiet(); await $`git commit -m ${commitMessage}`.quiet(); await $`git tag v${newVersion}`.quiet(); await $`git push origin main --tags`.quiet(); } catch (error) { console.error("Failed to push to git", error); } await updateAppStatus("Active"); }, "chat.message": async () => { await updateAppStatus("Pending"); }, }; };