"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
require("dotenv/config");
/**
* 🛰️ GLOBAL STABILIZATION (April 2026): Catch unhandled errors that cause HF Space restarts.
*/
process.on('uncaughtException', (err) => { console.error('[FATAL:EXCEPTION]', err); });
process.on('unhandledRejection', (reason) => { console.error('[FATAL:REJECTION]', reason); });
const http_1 = require("http");
const next_1 = __importDefault(require("next"));
const socket_io_1 = require("socket.io");
const ws_1 = require("ws");
const Y = __importStar(require("yjs"));
const awarenessProtocol = __importStar(require("y-protocols/awareness"));
const syncProtocol = __importStar(require("y-protocols/sync"));
const encoding = __importStar(require("lib0/encoding"));
const decoding = __importStar(require("lib0/decoding"));
const map = __importStar(require("lib0/map"));
const pty = __importStar(require("node-pty"));
const os = __importStar(require("os"));
const auto_sleep_1 = require("./lib/jobs/auto-sleep");
const manager_1 = require("./lib/docker/manager");
const schema_1 = require("./lib/db/schema");
const db_1 = require("./lib/db");
const storage_1 = require("./lib/hf/storage");
const env_config_1 = require("./lib/env-config");
const http_proxy_1 = __importDefault(require("http-proxy"));
const constants_1 = require("./constants");
process.env.TMPDIR = env_config_1.ENV_CONFIG.TMPDIR;
process.env.HF_HOME = env_config_1.ENV_CONFIG.HF_HOME;
if (!process.env.HOME)
process.env.HOME = '/home/node';
const dev = process.env.NODE_ENV !== "production";
const app = (0, next_1.default)({ dev });
const handle = app.getRequestHandler();
const docs = new Map();
const getOrCreateDoc = (docName) => {
return map.setIfUndefined(docs, docName, () => {
const doc = new Y.Doc();
const awareness = new awarenessProtocol.Awareness(doc);
return { doc, awareness };
});
};
const proxy = http_proxy_1.default.createProxyServer({
ws: true,
xfwd: true,
timeout: 30000,
proxyTimeout: 30000
});
function getWorkspaceRequestContext(req) {
var _a;
const host = req.headers.host || 'localhost';
const fullUrl = new URL(req.url || '/', `http://${host}`);
const pathname = fullUrl.pathname;
const workspaceHostMatch = host.match(/^workspace-([a-zA-Z0-9-]+)\./);
const id = workspaceHostMatch ? workspaceHostMatch[1] : (pathname.startsWith('/workspace/') ? (_a = pathname.split('/')[2]) !== null && _a !== void 0 ? _a : null : null);
return { host, pathname, id };
}
function prepareWorkspaceProxyRequest(req, id) {
var _a;
req.headers['x-codeverse-id'] = id;
req.headers['x-codeverse-type'] = 'workspace';
const prefix = `/workspace/${id}`;
if ((_a = req.url) === null || _a === void 0 ? void 0 : _a.startsWith(prefix)) {
req.url = req.url.substring(prefix.length);
if (!req.url.startsWith('/')) {
req.url = `/${req.url}`;
}
}
}
function renderProxyError(res, error, id) {
res.writeHead(502, { 'Content-Type': 'text/html' });
res.end(`
Workspace Connection Failure
Workspace Connection Restricted
Native isolation link for ${id} failed.
Diagnostic: ${error}
Target: Hugging Face Space (Sandboxed)
Auto-Repair & Boot
`);
}
proxy.on("error", (err, req, res) => {
const host = req.headers.host || "";
const fullUrl = new URL(req.url || "/", `http://${host}`);
const pathname = fullUrl.pathname;
const headerId = req.headers['x-codeverse-id'];
const workspaceHostMatch = host.match(/^workspace-([a-zA-Z0-9-]+)\./);
const id = headerId || (workspaceHostMatch ? workspaceHostMatch[1] : (pathname.split("/")[2] || "unknown"));
console.error(`[Proxy Connection Error] ${err.message} for workspace/${id}`);
if (res instanceof http_1.ServerResponse) {
if (!res.headersSent) {
renderProxyError(res, err.message, id);
}
else {
res.end();
}
}
});
proxy.on("proxyReq", (proxyReq, req) => {
const id = req.headers['x-codeverse-id'];
const type = req.headers['x-codeverse-type'];
if (id && type) {
proxyReq.setHeader('x-codeverse-id', id);
proxyReq.setHeader('x-codeverse-type', type);
}
});
proxy.on("proxyReqWs", (proxyReq, req) => {
const id = req.headers['x-codeverse-id'];
const type = req.headers['x-codeverse-type'];
if (id && type) {
proxyReq.setHeader('x-codeverse-id', id);
proxyReq.setHeader('x-codeverse-type', type);
}
});
proxy.on("proxyRes", (proxyRes, req) => {
const id = req.headers['x-codeverse-id'];
const type = req.headers['x-codeverse-type'];
if (id && type && proxyRes.headers.location) {
const originalLocation = proxyRes.headers.location;
if (originalLocation.startsWith('/') && !originalLocation.startsWith(`/${type}/${id}`)) {
proxyRes.headers.location = `/${type}/${id}${originalLocation}`;
}
}
});
// Port and Host logic
const PORT = Number(process.env.PORT) || 7860;
const HOST = '0.0.0.0';
let isAppReady = false;
let envStatus = { valid: true, missing: [] };
/**
*Autoritative Entrypoint: We initialize the HTTP server immediately to satisfy HF Spaces health checks.
*/
const server = (0, http_1.createServer)((req, res) => {
const { pathname, id } = getWorkspaceRequestContext(req);
// 1. Initializing State
if (!isAppReady && !pathname.startsWith("/_next/static") && pathname !== "/favicon.ico") {
res.writeHead(200, { 'Content-Type': 'text/html' });
return res.end(`
CodeVerse | Initializing
CodeVerse is waking up
Restoring your environment and securing persistent volumes...
`);
}
// 2. Maintenance / Misconfiguration State
if (isAppReady && !envStatus.valid && pathname !== "/api/health" && !pathname.startsWith("/_next/")) {
res.writeHead(503, { 'Content-Type': 'text/html' });
return res.end(`
Infrastructure Error
${constants_1.UI_STRINGS.MAINTENANCE_MESSAGE}
${envStatus.missing.map(m => `- ${m}
`).join('')}
`);
}
// 3. Workspace Proxying
if (id) {
const isRunning = (0, manager_1.isWorkspaceRunning)(id);
if (isRunning) {
const port = (0, manager_1.getWorkspacePort)(id);
if (port) {
prepareWorkspaceProxyRequest(req, id);
return proxy.web(req, res, { target: `http://127.0.0.1:${port}`, changeOrigin: true });
}
}
else if (!(pathname === null || pathname === void 0 ? void 0 : pathname.startsWith("/api/"))) {
// 🚑 WORKSPACE OFFLINE OR BOOTING: Detect if it's truly gone or just waking up
res.writeHead(503, { 'Content-Type': 'text/html', 'Retry-After': '5' });
return res.end(`
CodeVerse | Workspace Status
Provisioning Environment
We're restoring your workspace from cold storage. This usually takes 30-60 seconds depending on the Nix profile complexity.
Return to Dashboard
`);
}
}
// 4. Default Next.js Handle
handle(req, res);
});
// Setup Sockets
const io = new socket_io_1.Server(server, { path: "/api/socketio" });
const shoket = new ws_1.WebSocketServer({ noServer: true });
// Start Listening Immediately
server.listen(PORT, HOST, () => {
console.log('----------------------------------------------------');
console.log(`[READY] ${constants_1.APP_CONFIG.NAME} ${constants_1.APP_CONFIG.VERSION}`);
console.log(`[READY] Interface: ${HOST}:${PORT}`);
console.log('----------------------------------------------------');
});
// Background Async Initialization
(async () => {
try {
console.log("[BOOT] Starting Next.js preparation...");
await app.prepare();
console.log("[BOOT] Next.js payload ready.");
envStatus = (0, env_config_1.validateEnvironment)();
if (envStatus.valid) {
console.log("[BOOT] Environment validated. Synchronizing database...");
await (0, schema_1.initDb)(db_1.client);
console.log("[BOOT] Database synchronized.");
// Reconnect and Warmup
(0, manager_1.reconnectRunningWorkspaces)().catch(() => { });
if (process.env.ENABLE_BASELINE_PREWARM === 'true') {
(0, manager_1.prewarmWorkspace)({ id: 'baseline-warmup', userId: 'system', projectName: 'CodeVerse-Internal' }).catch(() => { });
}
// Crons and Persistence
storage_1.HFStorage.startAutoSave(constants_1.INFRA_CONFIG.PERSISTENCE_INTERVAL_MS * 5);
(0, auto_sleep_1.startAutoSleepCron)();
}
isAppReady = true;
console.log("[BOOT] Global state stabilized. Application is fully operational.");
}
catch (err) {
console.error("[BOOT:ERROR] Fatal initialization failure:", err);
}
})();
// Terminal and Collaboration Handlers
server.on("upgrade", (req, socket, head) => {
const { pathname, id } = getWorkspaceRequestContext(req);
if (pathname === "/api/collab") {
shoket.handleUpgrade(req, socket, head, (ws) => {
shoket.emit("connection", ws, req);
});
return;
}
if (id && (0, manager_1.isWorkspaceRunning)(id)) {
const port = (0, manager_1.getWorkspacePort)(id);
if (!port) {
socket.destroy();
return;
}
prepareWorkspaceProxyRequest(req, id);
proxy.ws(req, socket, head, { target: `ws://127.0.0.1:${port}`, changeOrigin: true });
return;
}
socket.destroy();
});
shoket.on("connection", (conn, request) => {
const { doc } = getOrCreateDoc(new URL(request.url || "/", "http://l").searchParams.get('doc') || "default");
conn.binaryType = "arraybuffer";
const encoder = encoding.createEncoder();
encoding.writeVarUint(encoder, 0);
syncProtocol.writeSyncStep1(encoder, doc);
conn.send(encoding.toUint8Array(encoder));
conn.on("message", (message) => {
const encoder = encoding.createEncoder();
const decoder = decoding.createDecoder(new Uint8Array(message));
const messageType = decoding.readVarUint(decoder);
if (messageType === 0) {
encoding.writeVarUint(encoder, 0);
syncProtocol.readSyncMessage(decoder, encoder, doc, null);
if (encoding.length(encoder) > 1)
conn.send(encoding.toUint8Array(encoder));
}
});
});
io.on("connection", (socket) => {
let shell = null;
socket.on("terminal:start", ({ cols, rows }) => {
shell = pty.spawn(process.env.SHELL || (os.platform() === "win32" ? "powershell.exe" : "bash"), [], {
cols: cols || 80,
rows: rows || 24,
cwd: env_config_1.ENV_CONFIG.WORKSPACE_ROOT,
env: process.env,
});
shell.onData((data) => socket.emit("terminal:data", data));
});
socket.on("terminal:write", (data) => { if (shell)
shell.write(data); });
socket.on("disconnect", () => { if (shell)
shell.kill(); });
});