vite-plugin-opencode-assistant 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vite/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Plugin, ViteDevServer } from \"vite\";\nimport type { ResultPromise } from \"execa\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport http from \"http\";\nimport { fileURLToPath } from \"url\";\nimport Inspector from \"unplugin-vue-inspector/vite\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nimport { startOpenCodeWeb } from \"../opencode/web.js\";\nimport { injectWidget } from \"./injector.js\";\nimport {\n checkOpenCodeInstalled,\n findAvailablePort,\n waitForServer,\n killOrphanOpenCodeProcesses,\n} from \"./utils.js\";\nimport { OpenCodeOptions, SessionInfo, PageContext } from \"../types.js\";\nimport {\n DEFAULT_CONFIG,\n DEFAULT_RETRIES,\n RETRY_DELAY,\n WIDGET_SCRIPT_PATH,\n CONTEXT_API_PATH,\n START_API_PATH,\n SESSIONS_API_PATH,\n SSE_EVENTS_PATH,\n SERVER_START_TIMEOUT,\n} from \"../constants.js\";\nimport {\n setVerbose,\n PerformanceTimer,\n RequestContext,\n createLogger,\n} from \"../logger.js\";\n\nexport default function opencodePlugin(\n options: OpenCodeOptions = {},\n): Plugin[] {\n const plugins: Plugin[] = [];\n\n plugins.push(\n ...Inspector({\n enabled: false,\n toggleButtonVisibility: \"never\",\n toggleComboKey: false,\n }),\n );\n\n plugins.push(createOpenCodePlugin(options));\n\n return plugins;\n}\n\nfunction createOpenCodePlugin(options: OpenCodeOptions = {}): Plugin {\n let webProcess: ResultPromise | null = null;\n let sessionUrl: string | null = null;\n let actualWebPort: number = DEFAULT_CONFIG.webPort;\n let isStarted = false;\n let startPromise: Promise<void> | null = null;\n let pageContext: PageContext = { url: \"\", title: \"\" };\n\n const sseClients: Set<http.ServerResponse> = new Set();\n\n const config = { ...DEFAULT_CONFIG, ...options };\n\n setVerbose(config.verbose);\n\n const log = createLogger(\"Plugin\");\n\n function base64Encode(str: string): string {\n return Buffer.from(str).toString(\"base64\");\n }\n\n function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n function createHttpRequest<T>(\n options: http.RequestOptions,\n body?: string,\n ): Promise<T> {\n const timer = new PerformanceTimer(\"HTTP Request\", {\n operation: `${options.method || \"GET\"} ${options.path}`,\n });\n\n return new Promise((resolve, reject) => {\n const req = http.request(options, (res) => {\n let data = \"\";\n res.on(\"data\", (chunk) => (data += chunk));\n res.on(\"end\", () => {\n try {\n const result = JSON.parse(data);\n timer.end(`✓ Status: ${res.statusCode}`);\n resolve(result);\n } catch (e) {\n timer.end(\"❌ JSON parse error\");\n reject(new Error(`JSON parse error: ${data.substring(0, 100)}`));\n }\n });\n });\n req.on(\"error\", (e) => {\n timer.end(\"❌ Request failed\");\n reject(e);\n });\n if (body) req.write(body);\n req.end();\n });\n }\n\n async function getSessions(\n retries = DEFAULT_RETRIES,\n ): Promise<SessionInfo[]> {\n const timer = log.timer(\"getSessions\", { retries });\n let lastError: Error | null = null;\n\n for (let i = 0; i < retries; i++) {\n try {\n log.debug(`Attempt ${i + 1}/${retries}`, { operation: \"getSessions\" });\n const sessions = await createHttpRequest<SessionInfo[]>({\n hostname: config.hostname,\n port: actualWebPort,\n path: \"/session\",\n });\n timer.end(`Found ${sessions.length} sessions`);\n return sessions;\n } catch (e) {\n lastError = e instanceof Error ? e : new Error(String(e));\n log.debug(`Attempt ${i + 1} failed: ${lastError.message}`, {\n operation: \"getSessions\",\n });\n if (i < retries - 1) {\n log.debug(`Retrying in ${RETRY_DELAY}ms...`, {\n operation: \"getSessions\",\n });\n await sleep(RETRY_DELAY);\n }\n }\n }\n\n timer.end(\"❌ All retries exhausted\");\n throw lastError;\n }\n\n async function createSession(\n retries = DEFAULT_RETRIES,\n title?: string,\n ): Promise<SessionInfo> {\n const timer = log.timer(\"createSession\", { retries, title });\n let lastError: Error | null = null;\n\n for (let i = 0; i < retries; i++) {\n try {\n log.debug(`Attempt ${i + 1}/${retries}`, {\n operation: \"createSession\",\n title,\n });\n const requestBody = title ? JSON.stringify({ title }) : undefined;\n const session = await createHttpRequest<SessionInfo>(\n {\n hostname: config.hostname,\n port: actualWebPort,\n path: \"/session\",\n method: \"POST\",\n headers: requestBody\n ? { \"Content-Type\": \"application/json\" }\n : undefined,\n },\n requestBody,\n );\n timer.end(`Created session: ${session.id}`);\n return session;\n } catch (e) {\n lastError = e instanceof Error ? e : new Error(String(e));\n log.debug(`Attempt ${i + 1} failed: ${lastError.message}`, {\n operation: \"createSession\",\n });\n if (i < retries - 1) {\n log.debug(`Retrying in ${RETRY_DELAY}ms...`, {\n operation: \"createSession\",\n });\n await sleep(RETRY_DELAY);\n }\n }\n }\n\n timer.end(\"❌ All retries exhausted\");\n throw lastError;\n }\n\n async function deleteSession(\n sessionId: string,\n retries = DEFAULT_RETRIES,\n ): Promise<void> {\n const timer = log.timer(\"deleteSession\", { sessionId, retries });\n let lastError: Error | null = null;\n\n for (let i = 0; i < retries; i++) {\n try {\n log.debug(`Attempt ${i + 1}/${retries}`, {\n operation: \"deleteSession\",\n sessionId,\n });\n await createHttpRequest<void>({\n hostname: config.hostname,\n port: actualWebPort,\n path: `/session/${sessionId}`,\n method: \"DELETE\",\n });\n timer.end(`Deleted session: ${sessionId}`);\n return;\n } catch (e) {\n lastError = e instanceof Error ? e : new Error(String(e));\n log.debug(`Attempt ${i + 1} failed: ${lastError.message}`, {\n operation: \"deleteSession\",\n sessionId,\n });\n if (i < retries - 1) {\n log.debug(`Retrying in ${RETRY_DELAY}ms...`, {\n operation: \"deleteSession\",\n sessionId,\n });\n await sleep(RETRY_DELAY);\n }\n }\n }\n\n timer.end(\"❌ All retries exhausted\");\n throw lastError;\n }\n\n async function getToolIds(retries = DEFAULT_RETRIES): Promise<string[]> {\n const timer = log.timer(\"getToolIds\", { retries });\n let lastError: Error | null = null;\n\n for (let i = 0; i < retries; i++) {\n try {\n log.debug(`Attempt ${i + 1}/${retries}`, {\n operation: \"getToolIds\",\n });\n const toolIds = await createHttpRequest<string[]>({\n hostname: config.hostname,\n port: actualWebPort,\n path: \"/experimental/tool/ids\",\n });\n timer.end(`Found ${toolIds.length} tools`);\n return toolIds;\n } catch (e) {\n lastError = e instanceof Error ? e : new Error(String(e));\n log.debug(`Attempt ${i + 1} failed: ${lastError.message}`, {\n operation: \"getToolIds\",\n });\n if (i < retries - 1) {\n log.debug(`Retrying in ${RETRY_DELAY}ms...`, {\n operation: \"getToolIds\",\n });\n await sleep(RETRY_DELAY);\n }\n }\n }\n\n timer.end(\"❌ All retries exhausted\");\n throw lastError;\n }\n\n async function warmupChromeMcp(viteOrigin?: string): Promise<void> {\n if (!config.warmupChromeMcp) return;\n\n const timer = log.timer(\"warmupChromeMcp\", { viteOrigin });\n let warmupSessionId: string | null = null;\n\n try {\n const warmupSession = await createSession(\n DEFAULT_RETRIES,\n \"__chrome_mcp_warmup__\",\n );\n warmupSessionId = warmupSession.id;\n let chromeToolIds: string[] | undefined;\n\n try {\n const toolIds = await getToolIds();\n chromeToolIds = toolIds.filter((toolId) =>\n /chrome[-_]?devtools/i.test(toolId),\n );\n log.debug(\"Resolved Chrome MCP tool ids\", {\n chromeToolIds,\n });\n } catch (e) {\n log.debug(\"Failed to resolve Chrome MCP tool ids\", { error: e });\n }\n\n const prompt = [\n \"Call the browser tool list_pages immediately to establish the Chrome DevTools MCP connection.\",\n viteOrigin\n ? `If there are no pages, call new_page with ${viteOrigin}.`\n : \"If there are no pages, call new_page with about:blank.\",\n \"Do not read or modify project files.\",\n \"Do not use any non-browser tools.\",\n \"After the tool call is complete, reply with exactly: ready\",\n ].join(\" \");\n\n await createHttpRequest<unknown>(\n {\n hostname: config.hostname,\n port: actualWebPort,\n path: `/session/${warmupSessionId}/message`,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n },\n JSON.stringify({\n system:\n \"You are warming up Chrome DevTools MCP during startup. You must use the available browser tools immediately before replying.\",\n tools: chromeToolIds?.length ? chromeToolIds : undefined,\n parts: [{ type: \"text\", text: prompt }],\n }),\n );\n\n timer.end(\"Chrome MCP warmed up\");\n } catch (e) {\n log.warn(\"Failed to warm up Chrome MCP\", { error: e });\n timer.end(\"Chrome MCP warmup skipped\");\n } finally {\n if (warmupSessionId) {\n try {\n await deleteSession(warmupSessionId);\n } catch (e) {\n log.debug(\"Failed to delete warmup session\", {\n error: e,\n warmupSessionId,\n });\n }\n }\n }\n }\n\n async function getOrCreateSession(): Promise<string> {\n const timer = log.timer(\"getOrCreateSession\");\n const projectDir = process.cwd();\n\n log.debug(\"Getting sessions...\", { projectDir });\n const sessions = await getSessions();\n log.debug(`Found ${sessions.length} sessions`, {\n sessions: sessions.map((s) => ({ id: s.id, directory: s.directory })),\n });\n\n const matchingSession = sessions.find((s) => s.directory === projectDir);\n\n if (matchingSession) {\n const url = `http://${config.hostname}:${actualWebPort}/${base64Encode(projectDir)}/session/${matchingSession.id}`;\n timer.end(`Using existing session: ${matchingSession.id}`);\n return url;\n }\n\n log.debug(\"Creating new session...\", { projectDir });\n const newSession = await createSession();\n const url = `http://${config.hostname}:${actualWebPort}/${base64Encode(projectDir)}/session/${newSession.id}`;\n timer.end(`Created new session: ${newSession.id}`);\n return url;\n }\n\n function setupOpenCodePlugin(): string {\n const timer = log.timer(\"setupOpenCodePlugin\");\n const projectDir = process.cwd();\n const cacheDir = path.join(\n projectDir,\n \"node_modules\",\n \".cache\",\n \"opencode\",\n );\n const pluginsDir = path.join(cacheDir, \"plugins\");\n\n log.debug(\"Setting up plugin directory\", { cacheDir, pluginsDir });\n\n if (!fs.existsSync(pluginsDir)) {\n fs.mkdirSync(pluginsDir, { recursive: true });\n log.debug(\"Created plugins directory\", { pluginsDir });\n }\n\n const pluginSourcePath = path.join(\n __dirname,\n \"..\",\n \"opencode\",\n \"plugins\",\n \"page-context.js\",\n );\n const pluginTargetPath = path.join(pluginsDir, \"page-context.js\");\n\n if (fs.existsSync(pluginSourcePath)) {\n fs.copyFileSync(pluginSourcePath, pluginTargetPath);\n log.debug(\"Plugin installed\", {\n source: pluginSourcePath,\n target: pluginTargetPath,\n });\n } else {\n log.warn(\"Plugin source not found\", { path: pluginSourcePath });\n }\n\n // 生成内置的 Chrome DevTools MCP 配置\n const mcpConfig = {\n mcp: {\n \"chrome-devtools\": {\n type: \"local\",\n command: [\"npx\", \"-y\", \"chrome-devtools-mcp@latest\", \"--autoConnect\"],\n enabled: true,\n },\n },\n };\n const mcpConfigPath = path.join(cacheDir, \"opencode.json\");\n fs.writeFileSync(mcpConfigPath, JSON.stringify(mcpConfig, null, 2));\n log.debug(\"Created OpenCode MCP config\", { mcpConfigPath });\n\n timer.end();\n return cacheDir;\n }\n\n async function startServices(\n corsOrigins?: string[],\n contextApiUrl?: string,\n viteOrigin?: string,\n ): Promise<void> {\n if (isStarted && webProcess) {\n log.debug(\"Services already started, skipping\");\n return;\n }\n if (startPromise) {\n log.debug(\"Waiting for existing start promise\");\n return startPromise;\n }\n\n startPromise = (async () => {\n const timer = log.timer(\"startServices\", {\n corsOrigins,\n contextApiUrl,\n viteOrigin,\n });\n log.info(\"Starting OpenCode services...\");\n\n const orphanCount = await killOrphanOpenCodeProcesses();\n if (orphanCount > 0) {\n log.debug(`Killed ${orphanCount} orphan OpenCode process(es)`);\n }\n\n if (!(await checkOpenCodeInstalled())) {\n log.error(`OpenCode is not installed!\n\nPlease install OpenCode first:\n\n # YOLO\n curl -fsSL https://opencode.ai/install | bash\n\n # Package managers\n npm i -g opencode-ai@latest # or bun/pnpm/yarn\n scoop install opencode # Windows\n choco install opencode # Windows\n brew install anomalyco/tap/opencode # macOS and Linux (recommended, always up to date)\n brew install opencode # macOS and Linux (official brew formula, updated less)\n sudo pacman -S opencode # Arch Linux (Stable)\n paru -S opencode-bin # Arch Linux (Latest from AUR)\n mise use -g opencode # Any OS\n nix run nixpkgs#opencode # or github:anomalyco/opencode for latest dev branch\n `);\n timer.end(\"❌ OpenCode not installed\");\n return;\n }\n\n timer.checkpoint(\"OpenCode installation verified\");\n\n actualWebPort = await findAvailablePort(config.webPort, config.hostname);\n if (actualWebPort !== config.webPort) {\n log.info(\n `Port ${config.webPort} is in use, using ${actualWebPort} instead`,\n );\n } else {\n log.debug(`Using port ${actualWebPort}`);\n }\n\n timer.checkpoint(\"Port allocated\");\n\n const configDir = setupOpenCodePlugin();\n\n timer.checkpoint(\"Plugin setup complete\");\n\n log.debug(\"Starting OpenCode Web process...\", {\n port: actualWebPort,\n hostname: config.hostname,\n configDir,\n });\n\n webProcess = startOpenCodeWeb({\n port: actualWebPort,\n hostname: config.hostname,\n serverUrl: \"\",\n cwd: process.cwd(),\n configDir,\n corsOrigins,\n contextApiUrl,\n });\n\n timer.checkpoint(\"Web process started\");\n const webUrl = `http://${config.hostname}:${actualWebPort}`;\n log.info(`Waiting for OpenCode Web to become ready at ${webUrl}...`);\n\n await waitForServer(webUrl, SERVER_START_TIMEOUT);\n log.info(`OpenCode Web started at ${webUrl}`);\n\n await warmupChromeMcp(viteOrigin);\n timer.checkpoint(\"Chrome MCP warmup complete\");\n\n try {\n sessionUrl = await getOrCreateSession();\n timer.checkpoint(\"Session created\");\n log.debug(`Session URL: ${sessionUrl}`);\n\n sseClients.forEach((client) => {\n try {\n client.write(\n `data: ${JSON.stringify({ type: \"SESSION_READY\", sessionUrl })}\\n\\n`,\n );\n } catch (e) {\n log.debug(\"Failed to send SESSION_READY event\", { error: e });\n }\n });\n } catch (e) {\n log.warn(\"Failed to get/create session\", { error: e });\n }\n\n isStarted = true;\n log.debug(\n `OpenCode services started successfully: ${sessionUrl || webUrl}`,\n );\n timer.end(\"✓ Services started successfully\");\n })();\n\n return startPromise;\n }\n\n async function stopServices(): Promise<void> {\n const timer = log.timer(\"stopServices\");\n log.info(\"Stopping OpenCode services...\");\n\n if (webProcess) {\n log.debug(\"Killing web process\", { pid: webProcess.pid });\n webProcess.kill(\"SIGTERM\");\n webProcess = null;\n }\n\n isStarted = false;\n startPromise = null;\n timer.end(\"✓ Services stopped\");\n }\n\n function handleContextRequest(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n ): void {\n const ctx = new RequestContext(req.method || \"GET\", CONTEXT_API_PATH);\n\n res.setHeader(\"Content-Type\", \"application/json\");\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n res.setHeader(\"Access-Control-Allow-Methods\", \"GET, POST, DELETE, OPTIONS\");\n res.setHeader(\"Access-Control-Allow-Headers\", \"Content-Type\");\n\n if (req.method === \"OPTIONS\") {\n res.writeHead(200);\n res.end();\n ctx.end(200);\n return;\n }\n\n if (req.method === \"GET\") {\n res.writeHead(200);\n res.end(JSON.stringify(pageContext));\n ctx.end(200);\n return;\n }\n\n if (req.method === \"DELETE\") {\n pageContext.selectedElements = [];\n log.debug(\"Selected elements cleared\", { sseClients: sseClients.size });\n\n let sentCount = 0;\n sseClients.forEach((client) => {\n try {\n client.write(\n `data: ${JSON.stringify({ type: \"CLEAR_ELEMENTS\" })}\\n\\n`,\n );\n sentCount++;\n } catch (e) {\n log.debug(\"Failed to send SSE message\", { error: e });\n }\n });\n log.debug(\"SSE messages sent\", {\n count: sentCount,\n totalClients: sseClients.size,\n });\n\n res.writeHead(200);\n res.end(JSON.stringify({ success: true }));\n ctx.end(200);\n return;\n }\n\n if (req.method === \"POST\") {\n let body = \"\";\n req.on(\"data\", (chunk) => (body += chunk));\n req.on(\"end\", () => {\n try {\n const data = JSON.parse(body);\n pageContext = {\n url: data.url || \"\",\n title: data.title || \"\",\n selectedElements: data.selectedElements || [],\n };\n log.debug(\"Context updated\", {\n url: pageContext.url,\n title: pageContext.title,\n selectedElementsCount: pageContext.selectedElements?.length || 0,\n });\n\n if (\n pageContext.selectedElements &&\n pageContext.selectedElements.length > 0\n ) {\n log.debug(\"Selected elements details\", {\n elements: pageContext.selectedElements.map((el) => ({\n filePath: el.filePath,\n line: el.line,\n text: el.innerText?.substring(0, 50),\n })),\n });\n }\n\n res.writeHead(200);\n res.end(JSON.stringify({ success: true }));\n ctx.end(200);\n } catch (e) {\n log.debug(\"Invalid JSON in request body\", { error: e });\n res.writeHead(400);\n res.end(JSON.stringify({ error: \"Invalid JSON\" }));\n ctx.end(400);\n }\n });\n return;\n }\n\n res.writeHead(405);\n res.end(JSON.stringify({ error: \"Method not allowed\" }));\n ctx.end(405);\n }\n\n return {\n name: \"vite-plugin-opencode\",\n apply(_viteConfig, env) {\n if (!config.enabled) return false;\n\n return env.command === \"serve\" && process.env.NODE_ENV !== \"test\";\n },\n\n async configureServer(server: ViteDevServer) {\n const timer = log.timer(\"configureServer\");\n\n server.middlewares.use(WIDGET_SCRIPT_PATH, async (_req, res) => {\n const ctx = new RequestContext(\"GET\", WIDGET_SCRIPT_PATH);\n const widgetPath = path.join(__dirname, \"client.js\");\n\n if (fs.existsSync(widgetPath)) {\n res.setHeader(\"Content-Type\", \"application/javascript\");\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n fs.createReadStream(widgetPath).pipe(res);\n ctx.end(200);\n } else {\n res.writeHead(404);\n res.end(\"Widget script not found\");\n ctx.end(404);\n }\n });\n\n server.middlewares.use(CONTEXT_API_PATH, async (req, res) => {\n handleContextRequest(req as http.IncomingMessage, res);\n });\n\n server.middlewares.use(START_API_PATH, async (_req, res) => {\n const ctx = new RequestContext(\"GET\", START_API_PATH);\n\n res.setHeader(\"Content-Type\", \"application/json\");\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n res.writeHead(200);\n res.end(JSON.stringify({ success: true, sessionUrl }));\n ctx.end(200);\n });\n\n server.middlewares.use(SSE_EVENTS_PATH, async (req, res) => {\n const ctx = new RequestContext(\"GET\", SSE_EVENTS_PATH);\n\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"Access-Control-Allow-Origin\": \"*\",\n });\n\n sseClients.add(res);\n log.debug(\"SSE client connected\", { totalClients: sseClients.size });\n\n res.write(`data: ${JSON.stringify({ type: \"CONNECTED\" })}\\n\\n`);\n\n if (sessionUrl) {\n res.write(\n `data: ${JSON.stringify({ type: \"SESSION_READY\", sessionUrl })}\\n\\n`,\n );\n }\n\n req.on(\"close\", () => {\n sseClients.delete(res);\n log.debug(\"SSE client disconnected\", {\n totalClients: sseClients.size,\n });\n });\n\n ctx.end(200);\n });\n\n server.middlewares.use(SESSIONS_API_PATH, async (req, res) => {\n const ctx = new RequestContext(req.method || \"GET\", SESSIONS_API_PATH);\n\n res.setHeader(\"Content-Type\", \"application/json\");\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n res.setHeader(\n \"Access-Control-Allow-Methods\",\n \"GET, POST, DELETE, OPTIONS\",\n );\n res.setHeader(\"Access-Control-Allow-Headers\", \"Content-Type\");\n\n if (req.method === \"OPTIONS\") {\n res.writeHead(200);\n res.end();\n ctx.end(200);\n return;\n }\n\n try {\n if (req.method === \"GET\") {\n ctx.checkpoint(\"Fetching sessions\");\n const sessions = await getSessions();\n res.writeHead(200);\n res.end(JSON.stringify(sessions));\n ctx.end(200);\n } else if (req.method === \"POST\") {\n ctx.checkpoint(\"Creating session\");\n const newSession = await createSession();\n res.writeHead(200);\n res.end(JSON.stringify(newSession));\n ctx.end(200);\n } else if (req.method === \"DELETE\") {\n const url = new URL(req.url || \"\", `http://${req.headers.host}`);\n const sessionId = url.searchParams.get(\"id\");\n\n if (!sessionId) {\n res.writeHead(400);\n res.end(JSON.stringify({ error: \"Session ID is required\" }));\n ctx.end(400);\n return;\n }\n\n ctx.checkpoint(`Deleting session: ${sessionId}`);\n await deleteSession(sessionId);\n res.writeHead(200);\n res.end(JSON.stringify({ success: true }));\n ctx.end(200);\n } else {\n res.writeHead(405);\n res.end(JSON.stringify({ error: \"Method not allowed\" }));\n ctx.end(405);\n }\n } catch (e) {\n log.error(\"Session API error\", { error: e, method: req.method });\n res.writeHead(500);\n res.end(JSON.stringify({ error: String(e) }));\n ctx.error(e);\n }\n });\n\n server.httpServer?.on(\"listening\", async () => {\n log.debug(\"Vite server listening event fired\");\n\n const address = server.httpServer?.address();\n let vitePort: number;\n let viteHost: string;\n\n if (address && typeof address === \"object\") {\n vitePort = address.port;\n const addr = address.address;\n if (addr === \"::\" || addr === \"::1\" || addr === \"0.0.0.0\" || !addr) {\n viteHost = \"localhost\";\n } else {\n viteHost = addr;\n }\n } else {\n const host = server.config.server.host;\n vitePort = server.config.server.port || 5173;\n viteHost =\n typeof host === \"string\" &&\n host !== \"0.0.0.0\" &&\n host !== \"::\" &&\n host !== \"::1\"\n ? host\n : \"localhost\";\n }\n\n const viteOrigin = `http://${viteHost}:${vitePort}`;\n const contextApiUrl = `http://${viteHost}:${vitePort}${CONTEXT_API_PATH}`;\n\n log.debug(\"Vite server ready\", {\n vitePort,\n viteHost,\n viteOrigin,\n contextApiUrl,\n });\n\n try {\n await startServices([viteOrigin], contextApiUrl, viteOrigin);\n } catch (e) {\n log.error(\"Failed to start services\", { error: e });\n }\n });\n\n server.httpServer?.on(\"close\", () => {\n log.debug(\"HTTP server closing\");\n stopServices();\n });\n\n const cleanup = async () => {\n log.debug(\"Process cleanup triggered\");\n await stopServices();\n process.exit(0);\n };\n\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n timer.end(\"✓ Server configured\");\n },\n\n transformIndexHtml(html) {\n const timer = log.timer(\"transformIndexHtml\");\n\n const widget = injectWidget({\n webUrl: `http://${config.hostname}:${actualWebPort}`,\n serverUrl: `http://${config.hostname}:${actualWebPort}`,\n position: config.position,\n theme: config.theme,\n open: config.open,\n autoReload: config.autoReload,\n cwd: process.cwd(),\n sessionUrl: sessionUrl || undefined,\n hotkey: config.hotkey,\n });\n\n timer.end();\n return html.replace(\"</body>\", `${widget}</body>`);\n },\n };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import { WidgetOptions } from '../types.js';
2
+ export declare function injectWidget(options: WidgetOptions): string;
@@ -0,0 +1,6 @@
1
+ import { WIDGET_SCRIPT_PATH, CONFIG_DATA_ATTR } from '../constants.js';
2
+ export function injectWidget(options) {
3
+ const configBase64 = Buffer.from(JSON.stringify(options)).toString('base64');
4
+ return `<script src="${WIDGET_SCRIPT_PATH}" ${CONFIG_DATA_ATTR}="${configBase64}"></script>`;
5
+ }
6
+ //# sourceMappingURL=injector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"injector.js","sourceRoot":"","sources":["../../src/vite/injector.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAEtE,MAAM,UAAU,YAAY,CAAC,OAAsB;IACjD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAC5E,OAAO,gBAAgB,kBAAkB,KAAK,gBAAgB,KAAK,YAAY,aAAa,CAAA;AAC9F,CAAC","sourcesContent":["import { WidgetOptions } from '../types.js'\nimport { WIDGET_SCRIPT_PATH, CONFIG_DATA_ATTR } from '../constants.js'\n\nexport function injectWidget(options: WidgetOptions): string {\n const configBase64 = Buffer.from(JSON.stringify(options)).toString('base64')\n return `<script src=\"${WIDGET_SCRIPT_PATH}\" ${CONFIG_DATA_ATTR}=\"${configBase64}\"></script>`\n}\n"]}
@@ -0,0 +1,5 @@
1
+ export declare function waitForServer(url: string, timeout?: number): Promise<void>;
2
+ export declare function checkOpenCodeInstalled(): Promise<boolean>;
3
+ export declare function isPortAvailable(port: number, hostname?: string): Promise<boolean>;
4
+ export declare function findAvailablePort(startPort: number, hostname?: string, maxTries?: number): Promise<number>;
5
+ export declare function killOrphanOpenCodeProcesses(): Promise<number>;
@@ -0,0 +1,206 @@
1
+ import http from 'http';
2
+ import { spawn } from 'child_process';
3
+ import net from 'net';
4
+ import { DEFAULT_HOSTNAME, SERVER_CHECK_INTERVAL, MAX_PORT_TRIES, } from '../constants.js';
5
+ import { createLogger, PerformanceTimer } from '../logger.js';
6
+ const log = createLogger('Utils');
7
+ export function waitForServer(url, timeout = 10000) {
8
+ const timer = new PerformanceTimer('waitForServer', { url, timeout });
9
+ return new Promise((resolve, reject) => {
10
+ const startTime = Date.now();
11
+ let attempts = 0;
12
+ const check = () => {
13
+ attempts++;
14
+ log.debug(`Checking server availability (attempt ${attempts})`, { url });
15
+ const req = http.get(url, (res) => {
16
+ if (res.statusCode && res.statusCode < 500) {
17
+ timer.end(`✓ Server ready after ${attempts} attempts`);
18
+ resolve();
19
+ }
20
+ else {
21
+ log.debug(`Server returned status ${res.statusCode}, retrying...`);
22
+ retryOrReject();
23
+ }
24
+ });
25
+ req.on('error', (err) => {
26
+ log.debug(`Server check failed: ${err.message}`);
27
+ retryOrReject();
28
+ });
29
+ };
30
+ const retryOrReject = () => {
31
+ const elapsed = Date.now() - startTime;
32
+ if (elapsed < timeout) {
33
+ setTimeout(check, SERVER_CHECK_INTERVAL);
34
+ }
35
+ else {
36
+ timer.end('❌ Timeout');
37
+ reject(new Error(`Server not ready after ${timeout}ms (${attempts} attempts)`));
38
+ }
39
+ };
40
+ check();
41
+ });
42
+ }
43
+ export async function checkOpenCodeInstalled() {
44
+ const timer = log.timer('checkOpenCodeInstalled');
45
+ return new Promise((resolve) => {
46
+ log.debug('Checking if OpenCode is installed...');
47
+ const proc = spawn('opencode', ['--version'], { stdio: 'ignore' });
48
+ proc.on('close', (code) => {
49
+ const installed = code === 0;
50
+ timer.end(installed ? '✓ OpenCode is installed' : '❌ OpenCode not found');
51
+ resolve(installed);
52
+ });
53
+ proc.on('error', (err) => {
54
+ log.debug('Failed to check OpenCode installation', { error: err.message });
55
+ timer.end('❌ Check failed');
56
+ resolve(false);
57
+ });
58
+ });
59
+ }
60
+ export async function isPortAvailable(port, hostname = DEFAULT_HOSTNAME) {
61
+ return new Promise((resolve) => {
62
+ const server = net.createServer();
63
+ server.once('error', (err) => {
64
+ log.debug(`Port ${port} is not available`, { error: err.message });
65
+ resolve(false);
66
+ });
67
+ server.once('listening', () => {
68
+ server.close();
69
+ log.debug(`Port ${port} is available`);
70
+ resolve(true);
71
+ });
72
+ server.listen(port, hostname);
73
+ });
74
+ }
75
+ export async function findAvailablePort(startPort, hostname = DEFAULT_HOSTNAME, maxTries = MAX_PORT_TRIES) {
76
+ const timer = log.timer('findAvailablePort', { startPort, hostname, maxTries });
77
+ log.debug(`Looking for available port starting from ${startPort}`);
78
+ for (let port = startPort; port < startPort + maxTries; port++) {
79
+ if (await isPortAvailable(port, hostname)) {
80
+ timer.end(`✓ Found available port: ${port}`);
81
+ return port;
82
+ }
83
+ log.debug(`Port ${port} is in use, trying next...`);
84
+ }
85
+ timer.end('❌ No available port found');
86
+ throw new Error(`No available port found after ${maxTries} tries starting from ${startPort}`);
87
+ }
88
+ export async function killOrphanOpenCodeProcesses() {
89
+ const timer = log.timer('killOrphanOpenCodeProcesses');
90
+ log.debug('Looking for orphan OpenCode processes (PPID=1)');
91
+ return new Promise((resolve) => {
92
+ if (process.platform === 'win32') {
93
+ killOrphanProcessesOnWindows(resolve, timer);
94
+ }
95
+ else {
96
+ killOrphanProcessesOnUnix(resolve, timer);
97
+ }
98
+ });
99
+ }
100
+ function killOrphanProcessesOnWindows(resolve, timer) {
101
+ log.debug('Using Windows method to find orphan processes');
102
+ const proc = spawn('wmic', [
103
+ 'process',
104
+ 'where',
105
+ 'name="opencode.exe"',
106
+ 'get',
107
+ 'processid,parentprocessid'
108
+ ], { stdio: 'pipe' });
109
+ let output = '';
110
+ proc.stdout?.on('data', (data) => {
111
+ output += data.toString();
112
+ });
113
+ proc.on('close', () => {
114
+ const lines = output.split('\n').filter(line => line.trim());
115
+ const pidsToKill = [];
116
+ lines.forEach(line => {
117
+ const parts = line.trim().split(/\s+/);
118
+ if (parts.length >= 2) {
119
+ const ppid = parts[0];
120
+ const pid = parts[1];
121
+ if (ppid === '1' && pid && !isNaN(Number(pid))) {
122
+ pidsToKill.push(pid);
123
+ }
124
+ }
125
+ });
126
+ if (pidsToKill.length > 0) {
127
+ log.debug(`Found ${pidsToKill.length} orphan processes`, { pids: pidsToKill });
128
+ let killedCount = 0;
129
+ let completedCount = 0;
130
+ pidsToKill.forEach(pid => {
131
+ const killProc = spawn('taskkill', ['/F', '/PID', pid], { stdio: 'ignore' });
132
+ killProc.on('close', (code) => {
133
+ completedCount++;
134
+ if (code === 0) {
135
+ killedCount++;
136
+ log.debug(`Killed orphan process ${pid}`);
137
+ }
138
+ if (completedCount === pidsToKill.length) {
139
+ timer.end(`✓ Killed ${killedCount} orphan processes`);
140
+ resolve(killedCount);
141
+ }
142
+ });
143
+ });
144
+ }
145
+ else {
146
+ log.debug('No orphan processes found');
147
+ timer.end('No orphan processes found');
148
+ resolve(0);
149
+ }
150
+ });
151
+ proc.on('error', (err) => {
152
+ log.debug('Failed to find orphan processes', { error: err.message });
153
+ timer.end('❌ Failed to find orphan processes');
154
+ resolve(0);
155
+ });
156
+ }
157
+ function killOrphanProcessesOnUnix(resolve, timer) {
158
+ log.debug('Using Unix method to find orphan processes');
159
+ const proc = spawn('ps', ['-e', '-o', 'pid,ppid,comm'], { stdio: 'pipe' });
160
+ let output = '';
161
+ proc.stdout?.on('data', (data) => {
162
+ output += data.toString();
163
+ });
164
+ proc.on('close', () => {
165
+ const lines = output.split('\n');
166
+ const pidsToKill = [];
167
+ lines.forEach(line => {
168
+ const trimmed = line.trim();
169
+ if (trimmed.includes('opencode')) {
170
+ const parts = trimmed.split(/\s+/);
171
+ if (parts.length >= 3) {
172
+ const pid = parts[0];
173
+ const ppid = parts[1];
174
+ const comm = parts.slice(2).join(' ');
175
+ if (ppid === '1' && comm.includes('opencode')) {
176
+ pidsToKill.push(pid);
177
+ }
178
+ }
179
+ }
180
+ });
181
+ if (pidsToKill.length > 0) {
182
+ log.debug(`Found ${pidsToKill.length} orphan processes`, { pids: pidsToKill });
183
+ const killProc = spawn('kill', ['-9', ...pidsToKill], { stdio: 'ignore' });
184
+ killProc.on('close', (code) => {
185
+ const killedCount = code === 0 ? pidsToKill.length : 0;
186
+ timer.end(killedCount > 0 ? `✓ Killed ${killedCount} orphan processes` : '❌ Failed to kill processes');
187
+ resolve(killedCount);
188
+ });
189
+ killProc.on('error', () => {
190
+ timer.end('❌ Failed to kill processes');
191
+ resolve(0);
192
+ });
193
+ }
194
+ else {
195
+ log.debug('No orphan processes found');
196
+ timer.end('No orphan processes found');
197
+ resolve(0);
198
+ }
199
+ });
200
+ proc.on('error', (err) => {
201
+ log.debug('Failed to find orphan processes', { error: err.message });
202
+ timer.end('❌ Failed to find orphan processes');
203
+ resolve(0);
204
+ });
205
+ }
206
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/vite/utils.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AACrC,OAAO,GAAG,MAAM,KAAK,CAAA;AACrB,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,GACf,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAE7D,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;AAEjC,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,OAAO,GAAG,KAAK;IACxD,MAAM,KAAK,GAAG,IAAI,gBAAgB,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAA;IAErE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAC5B,IAAI,QAAQ,GAAG,CAAC,CAAA;QAEhB,MAAM,KAAK,GAAG,GAAS,EAAE;YACvB,QAAQ,EAAE,CAAA;YACV,GAAG,CAAC,KAAK,CAAC,yCAAyC,QAAQ,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;YAExE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE;gBAChC,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC;oBAC3C,KAAK,CAAC,GAAG,CAAC,wBAAwB,QAAQ,WAAW,CAAC,CAAA;oBACtD,OAAO,EAAE,CAAA;gBACX,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,KAAK,CAAC,0BAA0B,GAAG,CAAC,UAAU,eAAe,CAAC,CAAA;oBAClE,aAAa,EAAE,CAAA;gBACjB,CAAC;YACH,CAAC,CAAC,CAAA;YAEF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACtB,GAAG,CAAC,KAAK,CAAC,wBAAwB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;gBAChD,aAAa,EAAE,CAAA;YACjB,CAAC,CAAC,CAAA;QACJ,CAAC,CAAA;QAED,MAAM,aAAa,GAAG,GAAS,EAAE;YAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAA;YACtC,IAAI,OAAO,GAAG,OAAO,EAAE,CAAC;gBACtB,UAAU,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAA;YAC1C,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;gBACtB,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,OAAO,OAAO,QAAQ,YAAY,CAAC,CAAC,CAAA;YACjF,CAAC;QACH,CAAC,CAAA;QAED,KAAK,EAAE,CAAA;IACT,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAA;IAEjD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,GAAG,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAA;QAEjD,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;QAElE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,CAAA;YAC5B,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAA;YACzE,OAAO,CAAC,SAAS,CAAC,CAAA;QACpB,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACvB,GAAG,CAAC,KAAK,CAAC,uCAAuC,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;YAC1E,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;YAC3B,OAAO,CAAC,KAAK,CAAC,CAAA;QAChB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,QAAQ,GAAG,gBAAgB;IAC7E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,EAAE,CAAA;QAEjC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAC3B,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,mBAAmB,EAAE,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAA;YAC7E,OAAO,CAAC,KAAK,CAAC,CAAA;QAChB,CAAC,CAAC,CAAA;QAEF,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;YAC5B,MAAM,CAAC,KAAK,EAAE,CAAA;YACd,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,eAAe,CAAC,CAAA;YACtC,OAAO,CAAC,IAAI,CAAC,CAAA;QACf,CAAC,CAAC,CAAA;QAEF,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAC/B,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAAiB,EACjB,QAAQ,GAAG,gBAAgB,EAC3B,QAAQ,GAAG,cAAc;IAEzB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,mBAAmB,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAA;IAE/E,GAAG,CAAC,KAAK,CAAC,4CAA4C,SAAS,EAAE,CAAC,CAAA;IAElE,KAAK,IAAI,IAAI,GAAG,SAAS,EAAE,IAAI,GAAG,SAAS,GAAG,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;QAC/D,IAAI,MAAM,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC1C,KAAK,CAAC,GAAG,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAA;YAC5C,OAAO,IAAI,CAAA;QACb,CAAC;QACD,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,4BAA4B,CAAC,CAAA;IACrD,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;IACtC,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,wBAAwB,SAAS,EAAE,CAAC,CAAA;AAC/F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B;IAC/C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAEtD,GAAG,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAA;IAE3D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,4BAA4B,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QAC9C,CAAC;aAAM,CAAC;YACN,yBAAyB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QAC3C,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,4BAA4B,CACnC,OAAgC,EAChC,KAAuB;IAEvB,GAAG,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAA;IAE1D,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE;QACzB,SAAS;QACT,OAAO;QACP,qBAAqB;QACrB,KAAK;QACL,2BAA2B;KAC5B,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;IAErB,IAAI,MAAM,GAAG,EAAE,CAAA;IAEf,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QAC/B,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAA;IAC3B,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACpB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;QAC5D,MAAM,UAAU,GAAa,EAAE,CAAA;QAE/B,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACnB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YACtC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACtB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;gBACrB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;gBACpB,IAAI,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;oBAC/C,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACtB,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,GAAG,CAAC,KAAK,CAAC,SAAS,UAAU,CAAC,MAAM,mBAAmB,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAA;YAE9E,IAAI,WAAW,GAAG,CAAC,CAAA;YACnB,IAAI,cAAc,GAAG,CAAC,CAAA;YAEtB,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;gBACvB,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;gBAC5E,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;oBAC5B,cAAc,EAAE,CAAA;oBAChB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;wBACf,WAAW,EAAE,CAAA;wBACb,GAAG,CAAC,KAAK,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAA;oBAC3C,CAAC;oBAED,IAAI,cAAc,KAAK,UAAU,CAAC,MAAM,EAAE,CAAC;wBACzC,KAAK,CAAC,GAAG,CAAC,YAAY,WAAW,mBAAmB,CAAC,CAAA;wBACrD,OAAO,CAAC,WAAW,CAAC,CAAA;oBACtB,CAAC;gBACH,CAAC,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAA;YACtC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;YACtC,OAAO,CAAC,CAAC,CAAC,CAAA;QACZ,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACvB,GAAG,CAAC,KAAK,CAAC,iCAAiC,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;QACpE,KAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAA;QAC9C,OAAO,CAAC,CAAC,CAAC,CAAA;IACZ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,yBAAyB,CAChC,OAAgC,EAChC,KAAuB;IAEvB,GAAG,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAA;IAEvD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,eAAe,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;IAC1E,IAAI,MAAM,GAAG,EAAE,CAAA;IAEf,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QAC/B,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAA;IAC3B,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACpB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAChC,MAAM,UAAU,GAAa,EAAE,CAAA;QAE/B,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACnB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;YAC3B,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBACjC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;gBAClC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;oBACtB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;oBACpB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;oBACrB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;oBAErC,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;wBAC9C,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;oBACtB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,GAAG,CAAC,KAAK,CAAC,SAAS,UAAU,CAAC,MAAM,mBAAmB,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAA;YAE9E,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,GAAG,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;YAC1E,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC5B,MAAM,WAAW,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;gBACtD,KAAK,CAAC,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,WAAW,mBAAmB,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAA;gBACtG,OAAO,CAAC,WAAW,CAAC,CAAA;YACtB,CAAC,CAAC,CAAA;YAEF,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACxB,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAA;gBACvC,OAAO,CAAC,CAAC,CAAC,CAAA;YACZ,CAAC,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAA;YACtC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;YACtC,OAAO,CAAC,CAAC,CAAC,CAAA;QACZ,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACvB,GAAG,CAAC,KAAK,CAAC,iCAAiC,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;QACpE,KAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAA;QAC9C,OAAO,CAAC,CAAC,CAAC,CAAA;IACZ,CAAC,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import http from 'http'\nimport { spawn } from 'child_process'\nimport net from 'net'\nimport {\n DEFAULT_HOSTNAME,\n SERVER_CHECK_INTERVAL,\n MAX_PORT_TRIES,\n} from '../constants.js'\nimport { createLogger, PerformanceTimer } from '../logger.js'\n\nconst log = createLogger('Utils')\n\nexport function waitForServer(url: string, timeout = 10000): Promise<void> {\n const timer = new PerformanceTimer('waitForServer', { url, timeout })\n \n return new Promise((resolve, reject) => {\n const startTime = Date.now()\n let attempts = 0\n\n const check = (): void => {\n attempts++\n log.debug(`Checking server availability (attempt ${attempts})`, { url })\n \n const req = http.get(url, (res) => {\n if (res.statusCode && res.statusCode < 500) {\n timer.end(`✓ Server ready after ${attempts} attempts`)\n resolve()\n } else {\n log.debug(`Server returned status ${res.statusCode}, retrying...`)\n retryOrReject()\n }\n })\n\n req.on('error', (err) => {\n log.debug(`Server check failed: ${err.message}`)\n retryOrReject()\n })\n }\n\n const retryOrReject = (): void => {\n const elapsed = Date.now() - startTime\n if (elapsed < timeout) {\n setTimeout(check, SERVER_CHECK_INTERVAL)\n } else {\n timer.end('❌ Timeout')\n reject(new Error(`Server not ready after ${timeout}ms (${attempts} attempts)`))\n }\n }\n\n check()\n })\n}\n\nexport async function checkOpenCodeInstalled(): Promise<boolean> {\n const timer = log.timer('checkOpenCodeInstalled')\n \n return new Promise((resolve) => {\n log.debug('Checking if OpenCode is installed...')\n \n const proc = spawn('opencode', ['--version'], { stdio: 'ignore' })\n \n proc.on('close', (code) => {\n const installed = code === 0\n timer.end(installed ? '✓ OpenCode is installed' : '❌ OpenCode not found')\n resolve(installed)\n })\n \n proc.on('error', (err) => {\n log.debug('Failed to check OpenCode installation', { error: err.message })\n timer.end('❌ Check failed')\n resolve(false)\n })\n })\n}\n\nexport async function isPortAvailable(port: number, hostname = DEFAULT_HOSTNAME): Promise<boolean> {\n return new Promise((resolve) => {\n const server = net.createServer()\n \n server.once('error', (err) => {\n log.debug(`Port ${port} is not available`, { error: (err as Error).message })\n resolve(false)\n })\n \n server.once('listening', () => {\n server.close()\n log.debug(`Port ${port} is available`)\n resolve(true)\n })\n \n server.listen(port, hostname)\n })\n}\n\nexport async function findAvailablePort(\n startPort: number,\n hostname = DEFAULT_HOSTNAME,\n maxTries = MAX_PORT_TRIES\n): Promise<number> {\n const timer = log.timer('findAvailablePort', { startPort, hostname, maxTries })\n \n log.debug(`Looking for available port starting from ${startPort}`)\n \n for (let port = startPort; port < startPort + maxTries; port++) {\n if (await isPortAvailable(port, hostname)) {\n timer.end(`✓ Found available port: ${port}`)\n return port\n }\n log.debug(`Port ${port} is in use, trying next...`)\n }\n \n timer.end('❌ No available port found')\n throw new Error(`No available port found after ${maxTries} tries starting from ${startPort}`)\n}\n\nexport async function killOrphanOpenCodeProcesses(): Promise<number> {\n const timer = log.timer('killOrphanOpenCodeProcesses')\n \n log.debug('Looking for orphan OpenCode processes (PPID=1)')\n \n return new Promise((resolve) => {\n if (process.platform === 'win32') {\n killOrphanProcessesOnWindows(resolve, timer)\n } else {\n killOrphanProcessesOnUnix(resolve, timer)\n }\n })\n}\n\nfunction killOrphanProcessesOnWindows(\n resolve: (value: number) => void,\n timer: PerformanceTimer\n): void {\n log.debug('Using Windows method to find orphan processes')\n \n const proc = spawn('wmic', [\n 'process',\n 'where',\n 'name=\"opencode.exe\"',\n 'get',\n 'processid,parentprocessid'\n ], { stdio: 'pipe' })\n \n let output = ''\n \n proc.stdout?.on('data', (data) => {\n output += data.toString()\n })\n \n proc.on('close', () => {\n const lines = output.split('\\n').filter(line => line.trim())\n const pidsToKill: string[] = []\n \n lines.forEach(line => {\n const parts = line.trim().split(/\\s+/)\n if (parts.length >= 2) {\n const ppid = parts[0]\n const pid = parts[1]\n if (ppid === '1' && pid && !isNaN(Number(pid))) {\n pidsToKill.push(pid)\n }\n }\n })\n \n if (pidsToKill.length > 0) {\n log.debug(`Found ${pidsToKill.length} orphan processes`, { pids: pidsToKill })\n \n let killedCount = 0\n let completedCount = 0\n \n pidsToKill.forEach(pid => {\n const killProc = spawn('taskkill', ['/F', '/PID', pid], { stdio: 'ignore' })\n killProc.on('close', (code) => {\n completedCount++\n if (code === 0) {\n killedCount++\n log.debug(`Killed orphan process ${pid}`)\n }\n \n if (completedCount === pidsToKill.length) {\n timer.end(`✓ Killed ${killedCount} orphan processes`)\n resolve(killedCount)\n }\n })\n })\n } else {\n log.debug('No orphan processes found')\n timer.end('No orphan processes found')\n resolve(0)\n }\n })\n \n proc.on('error', (err) => {\n log.debug('Failed to find orphan processes', { error: err.message })\n timer.end('❌ Failed to find orphan processes')\n resolve(0)\n })\n}\n\nfunction killOrphanProcessesOnUnix(\n resolve: (value: number) => void,\n timer: PerformanceTimer\n): void {\n log.debug('Using Unix method to find orphan processes')\n \n const proc = spawn('ps', ['-e', '-o', 'pid,ppid,comm'], { stdio: 'pipe' })\n let output = ''\n \n proc.stdout?.on('data', (data) => {\n output += data.toString()\n })\n \n proc.on('close', () => {\n const lines = output.split('\\n')\n const pidsToKill: string[] = []\n \n lines.forEach(line => {\n const trimmed = line.trim()\n if (trimmed.includes('opencode')) {\n const parts = trimmed.split(/\\s+/)\n if (parts.length >= 3) {\n const pid = parts[0]\n const ppid = parts[1]\n const comm = parts.slice(2).join(' ')\n \n if (ppid === '1' && comm.includes('opencode')) {\n pidsToKill.push(pid)\n }\n }\n }\n })\n \n if (pidsToKill.length > 0) {\n log.debug(`Found ${pidsToKill.length} orphan processes`, { pids: pidsToKill })\n \n const killProc = spawn('kill', ['-9', ...pidsToKill], { stdio: 'ignore' })\n killProc.on('close', (code) => {\n const killedCount = code === 0 ? pidsToKill.length : 0\n timer.end(killedCount > 0 ? `✓ Killed ${killedCount} orphan processes` : '❌ Failed to kill processes')\n resolve(killedCount)\n })\n \n killProc.on('error', () => {\n timer.end('❌ Failed to kill processes')\n resolve(0)\n })\n } else {\n log.debug('No orphan processes found')\n timer.end('No orphan processes found')\n resolve(0)\n }\n })\n \n proc.on('error', (err) => {\n log.debug('Failed to find orphan processes', { error: err.message })\n timer.end('❌ Failed to find orphan processes')\n resolve(0)\n })\n}\n"]}
package/package.json CHANGED
@@ -1,21 +1,28 @@
1
1
  {
2
2
  "name": "vite-plugin-opencode-assistant",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "Embed OpenCode Web UI in your Vite dev server for real-time code modification and preview",
5
- "main": "dist/index.js",
6
- "types": "dist/index.d.ts",
5
+ "main": "dist/vite/index.js",
6
+ "types": "dist/vite/index.d.ts",
7
7
  "type": "module",
8
+ "workspaces": [
9
+ "example"
10
+ ],
8
11
  "exports": {
9
12
  ".": {
10
- "import": "./dist/index.js",
11
- "types": "./dist/index.d.ts"
13
+ "import": "./dist/vite/index.js",
14
+ "types": "./dist/vite/index.d.ts"
12
15
  }
13
16
  },
14
17
  "files": [
15
18
  "dist"
16
19
  ],
20
+ "publishConfig": {
21
+ "registry": "https://registry.npmjs.org"
22
+ },
17
23
  "scripts": {
18
- "build": "rm -rf dist && tsc",
24
+ "build": "rm -rf dist && tsc && npm run build:plugins",
25
+ "build:plugins": "vite build --config vite.plugins.config.ts",
19
26
  "dev": "tsc --watch",
20
27
  "test": "vitest",
21
28
  "prepublishOnly": "npm run build"
@@ -33,6 +40,10 @@
33
40
  ],
34
41
  "author": "",
35
42
  "license": "MIT",
43
+ "dependencies": {
44
+ "execa": "^9.6.1",
45
+ "unplugin-vue-inspector": "^2.4.0"
46
+ },
36
47
  "peerDependencies": {
37
48
  "vite": ">=4.0.0"
38
49
  },