feat: Complete Pi Harness Rebuild - Phases 1 till 7.2

This commit is contained in:
2026-02-20 20:51:10 +00:00
parent 25f5f74b1b
commit 92f4b2be8e
39 changed files with 5176 additions and 1657 deletions
+12 -18
View File
@@ -5,10 +5,8 @@ import { eq } from 'drizzle-orm';
import { honoServer } from './servers/hono';
import { verify } from './servers/jwt';
import { officerdb, TokenBlacklist } from 'officerdb';
// import { claudeWebsocket } from './servers/api/claude/websocket';
// import { opencodeWebsocket } from './servers/api/opencode/websocket';
import { piMonoWebsocket } from './servers/api/pi-mono/websocket';
import { terminalWebsocket, initTerminalSidecars } from './servers/api/terminal/websocket';
import { piWebsocket } from './servers/api/pi/websocket';
import officerWeb from './apps/officer-web/index.html';
const { PORT = '5000' } = process.env;
@@ -17,7 +15,7 @@ type WSData = {
userId: number;
email: string;
role: string;
provider: /* 'claude' | 'opencode' | */ 'pi-mono' | 'terminal';
provider: 'terminal' | 'pi';
sandboxed: boolean;
sessionId?: string;
cwd?: string;
@@ -26,14 +24,12 @@ type WSData = {
rows?: number;
};
const handlers: Record<string, typeof piMonoWebsocket> = {
// claude: claudeWebsocket,
// opencode: opencodeWebsocket,
'pi-mono': piMonoWebsocket,
const handlers: Record<string, any> = {
terminal: terminalWebsocket,
pi: piWebsocket,
};
async function upgradeWs(req: Request, server: any, provider: /* 'claude' | 'opencode' | */ 'pi-mono' | 'terminal') {
async function upgradeWs(req: Request, server: any, provider: 'terminal' | 'pi') {
const token = new URL(req.url).searchParams.get('token');
if (!token) return new Response('Unauthorized', { status: 401 });
@@ -75,10 +71,8 @@ const server = serve({
if (await file.exists()) return new Response(file);
return new Response(null, { status: 404 });
},
// '/api/harness/claudecode/ws': (req, server) => upgradeWs(req, server, 'claude'),
// '/api/harness/opencode/ws': (req, server) => upgradeWs(req, server, 'opencode'),
'/api/harness/pi-mono/ws': (req, server) => upgradeWs(req, server, 'pi-mono'),
'/api/terminal/ws': (req, server) => upgradeWs(req, server, 'terminal'),
'/api/pi/chat/ws': (req, server) => upgradeWs(req, server, 'pi'),
'/': officerWeb,
'/*': officerWeb,
'/api': honoServer.fetch,
@@ -110,21 +104,21 @@ console.log(`🚀 Server running at ${server.url}`);
void initTerminalSidecars();
// Ensure pi-mono is installed
// Ensure pi is installed
(async () => {
try {
const check = Bun.spawn(['pi', '--version'], { stdout: 'pipe', stderr: 'pipe' });
const output = await new Response(check.stdout).text();
await check.exited;
if (check.exitCode === 0) {
console.log(`[pi-mono] found: ${output.trim()}`);
console.log(`[pi] found: ${output.trim()}`);
return;
}
} catch {
// not found
}
console.log('[pi-mono] not found, installing...');
console.log('[pi] not found, installing...');
try {
const install = Bun.spawn(['npm', 'install', '-g', '@mariozechner/pi-coding-agent'], {
stdout: 'pipe',
@@ -133,14 +127,14 @@ void initTerminalSidecars();
const stderr = await new Response(install.stderr).text();
await install.exited;
if (install.exitCode !== 0) {
console.error('[pi-mono] install failed:', stderr.trim());
console.error('[pi] install failed:', stderr.trim());
return;
}
const ver = Bun.spawn(['pi', '--version'], { stdout: 'pipe', stderr: 'pipe' });
const version = await new Response(ver.stdout).text();
await ver.exited;
console.log(`[pi-mono] installed: ${version.trim()}`);
console.log(`[pi] installed: ${version.trim()}`);
} catch (err) {
console.error('[pi-mono] install failed:', err);
console.error('[pi] install failed:', err);
}
})();