diff --git a/docs/SYNC.md b/docs/SYNC.md index 20d2d89..f711883 100644 --- a/docs/SYNC.md +++ b/docs/SYNC.md @@ -167,6 +167,7 @@ yyyy-mm-dd @handle T-x.y what was done ``` ``` +2026-05-15 @jay T-1.0 Server refactor scaffold. server/ dir with legacy-server.ts, route placeholders, upgrade.ts. index.ts updated. Legacy files tagged. 2026-05-15 @worker-phase0 T-0.* Phase 0 spike complete. tmux+pipe-pane PoC validated. GREEN LIGHT for Phase 1. Report: reference/PHASE-0-report.md. Branch: feat/spike-stream (kept for reference, not merged). 2026-05-15 @worker-phase0.5 T-0.5 Phase 0.5 spike complete. tmux control mode validated. VERDICT: Path B recommended. Report: reference/PHASE-0.5-report.md. Branch: feat/spike-tmux-cc (kept for reference, not merged). ``` diff --git a/extensions/remote-control/auth.ts b/extensions/remote-control/auth.ts index 9d7ac7b..29feb6a 100644 --- a/extensions/remote-control/auth.ts +++ b/extensions/remote-control/auth.ts @@ -1,3 +1,4 @@ +// LEGACY: to be removed after auth/ refactor (T-1.3) /** * Authentication helpers for remote-control. * diff --git a/extensions/remote-control/config.ts b/extensions/remote-control/config.ts index 91fc99c..0ee7967 100644 --- a/extensions/remote-control/config.ts +++ b/extensions/remote-control/config.ts @@ -1,3 +1,4 @@ +// LEGACY: to be replaced by T-1.7 config /** * Configuration management for remote-control. * diff --git a/extensions/remote-control/html.ts b/extensions/remote-control/html.ts index 7abd0bd..2644b60 100644 --- a/extensions/remote-control/html.ts +++ b/extensions/remote-control/html.ts @@ -1,3 +1,4 @@ +// LEGACY: to be removed after Phase 2 /** * Inline web UI for remote-control. * diff --git a/extensions/remote-control/index.ts b/extensions/remote-control/index.ts index b4e074b..40b2ca0 100644 --- a/extensions/remote-control/index.ts +++ b/extensions/remote-control/index.ts @@ -23,7 +23,7 @@ import { readRemoteControlConfig, } from "./config.js"; import { type RawMessage, serializeMessage } from "./messages.js"; -import { type RemoteServer, startServer } from "./server.js"; +import { type RemoteServer, startServer } from "./server/server.js"; // ── Extension entry point ──────────────────────────────────────────────────── diff --git a/extensions/remote-control/messages.ts b/extensions/remote-control/messages.ts index 975b362..9a525d7 100644 --- a/extensions/remote-control/messages.ts +++ b/extensions/remote-control/messages.ts @@ -1,3 +1,4 @@ +// LEGACY: to be removed after Phase 2 /** * Wire protocol types and message serialization for remote-control. * diff --git a/extensions/remote-control/server.ts b/extensions/remote-control/server/legacy-server.ts similarity index 99% rename from extensions/remote-control/server.ts rename to extensions/remote-control/server/legacy-server.ts index a9f52cc..201728d 100644 --- a/extensions/remote-control/server.ts +++ b/extensions/remote-control/server/legacy-server.ts @@ -1,3 +1,4 @@ +// LEGACY: to be removed after Phase 2 — replaced by server/server.ts + route modules /** * HTTP + WebSocket server for remote-control. * diff --git a/extensions/remote-control/server/routes/commands.ts b/extensions/remote-control/server/routes/commands.ts new file mode 100644 index 0000000..ee45179 --- /dev/null +++ b/extensions/remote-control/server/routes/commands.ts @@ -0,0 +1,6 @@ +// LEGACY placeholder — to be filled in by T-1.6 (slash-command registry) +import type { Express } from "express"; + +export function registerCommandsRoutes(_app: Express): void { + // TODO T-1.6: S-08 slash-command registry endpoint +} diff --git a/extensions/remote-control/server/routes/health.ts b/extensions/remote-control/server/routes/health.ts new file mode 100644 index 0000000..9b627f9 --- /dev/null +++ b/extensions/remote-control/server/routes/health.ts @@ -0,0 +1,6 @@ +// LEGACY placeholder — to be filled in by T-1.7 (health endpoint) +import type { Express } from "express"; + +export function registerHealthRoutes(_app: Express): void { + // TODO T-1.7: S-12 health endpoint +} diff --git a/extensions/remote-control/server/routes/input.ts b/extensions/remote-control/server/routes/input.ts new file mode 100644 index 0000000..84ee1c1 --- /dev/null +++ b/extensions/remote-control/server/routes/input.ts @@ -0,0 +1,6 @@ +// LEGACY placeholder — to be filled in by T-1.5 (input/send-keys route) +import type { Express } from "express"; + +export function registerInputRoutes(_app: Express): void { + // TODO T-1.5: S-03 send-keys endpoint +} diff --git a/extensions/remote-control/server/routes/sessions.ts b/extensions/remote-control/server/routes/sessions.ts new file mode 100644 index 0000000..39334f0 --- /dev/null +++ b/extensions/remote-control/server/routes/sessions.ts @@ -0,0 +1,6 @@ +// LEGACY placeholder — to be filled in by T-1.6 (multi-session CRUD) +import type { Express } from "express"; + +export function registerSessionsRoutes(_app: Express): void { + // TODO T-1.6: S-09 sessions lifecycle endpoint +} diff --git a/extensions/remote-control/server/routes/side.ts b/extensions/remote-control/server/routes/side.ts new file mode 100644 index 0000000..1436444 --- /dev/null +++ b/extensions/remote-control/server/routes/side.ts @@ -0,0 +1,6 @@ +// LEGACY placeholder — to be filled in by T-1.6 (state side-channel) +import type { Express } from "express"; + +export function registerSideRoutes(_app: Express): void { + // TODO T-1.6: S-07 state side-channel endpoint +} diff --git a/extensions/remote-control/server/routes/stream.ts b/extensions/remote-control/server/routes/stream.ts new file mode 100644 index 0000000..cba883a --- /dev/null +++ b/extensions/remote-control/server/routes/stream.ts @@ -0,0 +1,6 @@ +// LEGACY placeholder — to be filled in by T-1.5 (stream + binary stream + sequence) +import type { Express } from "express"; + +export function registerStreamRoutes(_app: Express): void { + // TODO T-1.5: S-02 binary stream, S-04 sequence resume, S-05 snapshot +} diff --git a/extensions/remote-control/server/server.ts b/extensions/remote-control/server/server.ts new file mode 100644 index 0000000..66960bc --- /dev/null +++ b/extensions/remote-control/server/server.ts @@ -0,0 +1,19 @@ +/** + * Server bootstrap — Phase 1 scaffold (T-1.0). + * + * Creates the HTTP + WebSocket server and wires up legacy routes. + * Route placeholders will be populated by T-1.5 / T-1.6 / T-1.7. + */ +import type { + ExtensionAPI, + ExtensionContext, +} from "@earendil-works/pi-coding-agent"; +import { startServer as startLegacyServer } from "./legacy-server.js"; +export type { RemoteServer } from "./legacy-server.js"; + +/** + * Start the remote-control server. + * Currently delegates to the legacy server; route modules will be + * wired in during T-1.5 – T-1.7. + */ +export { startLegacyServer as startServer }; diff --git a/extensions/remote-control/server/upgrade.ts b/extensions/remote-control/server/upgrade.ts new file mode 100644 index 0000000..cb8986f --- /dev/null +++ b/extensions/remote-control/server/upgrade.ts @@ -0,0 +1,31 @@ +// Legacy WebSocket upgrade routing — to be replaced in T-1.5/T-1.6. +import type { IncomingMessage } from "node:http"; +import type { Socket } from "node:net"; + +// Lightweight ws server interface (compatible with the ws package without types) +interface WsServer { + handleUpgrade( + request: IncomingMessage, + socket: Socket, + head: Buffer, + cb: (ws: unknown) => void, + ): void; + emit(event: string, ...args: unknown[]): void; +} + +/** + * Route WebSocket upgrade requests to the legacy server. + * In Phase 2 this will dispatch to topic/session-specific handlers. + */ +export function handleUpgrade( + wss: WsServer, + request: IncomingMessage, + socket: Socket, + head: Buffer, +): void { + // T-1.5/T-1.6: inspect URL to route to stream/input/session handlers. + // For now, delegate everything to the legacy WebSocket server. + wss.handleUpgrade(request, socket, head, (ws) => { + wss.emit("connection", ws, request); + }); +}