authorgravatar for me@t3.ggTheo Browne <me@t3.gg> 2026-02-09 21:56:24-08:00
committergravatar for me@t3.ggTheo Browne <me@t3.gg> 2026-02-09 22:19:49-08:00
logb5bab3eb134fd7555914fe57031a064b08beb195
treecd09779d8f322ff26fa07bf875815a5929deb7e3
parent8ebd2479cf976a6ef79843b97d477777efb7cb6a
signature Commit is signed but in an unrecognized format.

rebrand


34 files changed, 101 insertions(+), 99 deletions(-)

AGENTS.md+2-2
......@@ -1,7 +1,7 @@
11# CLAUDE.md
22
33## Project Snapshot
4CodeThing is a minimal web GUI for using code agents like Codex and Claude Code (coming soon).
4T3 Code is a minimal web GUI for using code agents like Codex and Claude Code (coming soon).
55
66This repository is a VERY EARLY WIP. Proposing sweeping changes that improve long-term maintainability is encouraged.
77
......@@ -18,7 +18,7 @@ If a tradeoff is required, choose correctness and robustness over short-term con
1818- `packages/contracts`: Shared Zod schemas and TypeScript contracts for provider events, WebSocket protocol, and model/session types.
1919
2020## Codex App Server (Important)
21CodeThing is currently Codex-first. The server starts `codex app-server` (JSON-RPC over stdio) per provider session, then streams structured events to the browser through WebSocket push messages.
21T3 Code is currently Codex-first. The server starts `codex app-server` (JSON-RPC over stdio) per provider session, then streams structured events to the browser through WebSocket push messages.
2222
2323How we use it in this codebase:
2424- Session startup/resume and turn lifecycle are brokered in `apps/server/src/codexAppServerManager.ts`.
README.md+7-7
......@@ -1,13 +1,13 @@
1# CodeThing
1# T3 Code
22
3CodeThing is a minimal web GUI for coding agents. Currently Codex-first, with Claude Code support coming soon.
3T3 Code is a minimal web GUI for coding agents. Currently Codex-first, with Claude Code support coming soon.
44
55Run `npx t3` in any project directory to launch the web interface.
66Run `bun run dev:desktop` to launch the Electron desktop app in this monorepo.
77
88## Architecture
99
10CodeThing runs as a **Node.js WebSocket server** that wraps `codex app-server` (JSON-RPC over stdio) and serves a React web app.
10T3 Code runs as a **Node.js WebSocket server** that wraps `codex app-server` (JSON-RPC over stdio) and serves a React web app.
1111
1212```
1313┌─────────────────────────────────┐
......@@ -37,8 +37,8 @@ CodeThing runs as a **Node.js WebSocket server** that wraps `codex app-server` (
3737## Codex prerequisites
3838
3939- Install Codex CLI so `codex` is on your PATH.
40- Authenticate Codex before running CodeThing (for example via API key or ChatGPT auth supported by Codex).
41- CodeThing starts the server via `codex app-server` per session.
40- Authenticate Codex before running T3 Code (for example via API key or ChatGPT auth supported by Codex).
41- T3 Code starts the server via `codex app-server` per session.
4242
4343## Quick start
4444
......@@ -69,7 +69,7 @@ npx t3
6969
7070## Runtime modes
7171
72CodeThing has a global runtime mode switch in the chat toolbar:
72T3 Code has a global runtime mode switch in the chat toolbar:
7373
7474- **Full access** (default): starts sessions with `approvalPolicy: never` and `sandboxMode: danger-full-access`.
7575- **Supervised**: starts sessions with `approvalPolicy: on-request` and `sandboxMode: workspace-write`, then prompts in-app for command/file approvals.
......@@ -81,7 +81,7 @@ The renderer communicates with the server via WebSocket using a simple JSON-RPC-
8181- **Request/Response**: `{ id, method, params }` → `{ id, result }` or `{ id, error }`
8282- **Push events**: `{ type: "push", channel, data }` for streaming provider events
8383
84Methods mirror the `NativeApi` interface defined in `@acme/contracts`:
84Methods mirror the `NativeApi` interface defined in `@t3tools/contracts`:
8585
8686- `providers.startSession`, `providers.sendTurn`, `providers.interruptTurn`
8787- `providers.respondToRequest`, `providers.stopSession`, `providers.listSessions`
apps/desktop/package.json+1-1
......@@ -1,5 +1,5 @@
11{
2 "name": "@acme/desktop",
2 "name": "@t3tools/desktop",
33 "version": "0.0.0",
44 "private": true,
55 "main": "dist-electron/main.js",
apps/desktop/src/main.ts+6-6
......@@ -48,11 +48,11 @@ async function reserveLoopbackPort(): Promise<number> {
4848function backendEnv(): NodeJS.ProcessEnv {
4949 return {
5050 ...process.env,
51 CODETHING_MODE: "desktop",
52 CODETHING_NO_BROWSER: "1",
53 CODETHING_PORT: String(backendPort),
54 CODETHING_STATE_DIR: STATE_DIR,
55 CODETHING_AUTH_TOKEN: backendAuthToken,
51 T3CODE_MODE: "desktop",
52 T3CODE_NO_BROWSER: "1",
53 T3CODE_PORT: String(backendPort),
54 T3CODE_STATE_DIR: STATE_DIR,
55 T3CODE_AUTH_TOKEN: backendAuthToken,
5656 };
5757}
5858
......@@ -186,7 +186,7 @@ async function bootstrap(): Promise<void> {
186186 backendPort = await reserveLoopbackPort();
187187 backendAuthToken = randomBytes(24).toString("hex");
188188 backendWsUrl = `ws://127.0.0.1:${backendPort}/?token=${encodeURIComponent(backendAuthToken)}`;
189 process.env.CODETHING_DESKTOP_WS_URL = backendWsUrl;
189 process.env.T3CODE_DESKTOP_WS_URL = backendWsUrl;
190190
191191 registerIpcHandlers();
192192 startBackend();
apps/desktop/src/preload.ts+1-1
......@@ -1,7 +1,7 @@
11import { contextBridge, ipcRenderer } from "electron";
22
33const PICK_FOLDER_CHANNEL = "desktop:pick-folder";
4const wsUrl = process.env.CODETHING_DESKTOP_WS_URL ?? null;
4const wsUrl = process.env.T3CODE_DESKTOP_WS_URL ?? null;
55
66contextBridge.exposeInMainWorld("desktopBridge", {
77 getWsUrl: () => wsUrl,
apps/desktop/tsup.config.ts+1-1
......@@ -6,5 +6,5 @@ export default defineConfig({
66 outDir: "dist-electron",
77 sourcemap: true,
88 clean: true,
9 noExternal: ["@acme/contracts"],
9 noExternal: ["@t3tools/contracts"],
1010});
apps/renderer/index.html+4-1
......@@ -3,7 +3,10 @@
33 <head>
44 <meta charset="UTF-8" />
55 <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6 <title>CodeThing</title>
6 <link rel="preconnect" href="https://fonts.googleapis.com" />
7 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
8 <link href="https://fonts.googleapis.com/css2?family=DM+Sans:ital,opsz,wght@0,9..40,300..800;1,9..40,300..800&display=swap" rel="stylesheet" />
9 <title>T3 Code</title>
710 </head>
811 <body>
912 <div id="root"></div>
apps/renderer/package.json+2-2
......@@ -1,5 +1,5 @@
11{
2 "name": "@acme/renderer",
2 "name": "@t3tools/renderer",
33 "version": "0.0.0",
44 "private": true,
55 "type": "module",
......@@ -11,7 +11,7 @@
1111 "test": "vitest run --passWithNoTests"
1212 },
1313 "dependencies": {
14 "@acme/contracts": "workspace:*",
14 "@t3tools/contracts": "workspace:*",
1515 "highlight.js": "^11.11.1",
1616 "lucide-react": "^0.563.0",
1717 "react": "^19.0.0",
apps/renderer/src/App.tsx+1-1
......@@ -148,7 +148,7 @@ function Layout() {
148148 return (
149149 <div className="flex h-screen flex-col bg-background text-foreground">
150150 <div className="flex flex-1 items-center justify-center">
151 <p className="text-sm text-muted-foreground">Connecting to CodeThing server...</p>
151 <p className="text-sm text-muted-foreground">Connecting to T3 Code server...</p>
152152 </div>
153153 </div>
154154 );
apps/renderer/src/components/ChatView.tsx+3-3
......@@ -2,7 +2,7 @@ import {
22 PROVIDER_SEND_TURN_MAX_INPUT_CHARS,
33 type ProviderApprovalDecision,
44 type ProviderEvent,
5} from "@acme/contracts";
5} from "@t3tools/contracts";
66import {
77 type FormEvent,
88 Fragment,
......@@ -13,7 +13,7 @@ import {
1313 useState,
1414} from "react";
1515
16import { EDITORS, type EditorId } from "@acme/contracts";
16import { EDITORS, type EditorId } from "@t3tools/contracts";
1717import { isElectron } from "../env";
1818import { buildBootstrapInput } from "../historyBootstrap";
1919import {
......@@ -50,7 +50,7 @@ function editorLabel(editor: (typeof EDITORS)[number]): string {
5050 return editor.command ? editor.label : FILE_MANAGER_LABEL;
5151}
5252
53const LAST_EDITOR_KEY = "codething:last-editor";
53const LAST_EDITOR_KEY = "t3code:last-editor";
5454const MAX_VISIBLE_WORK_LOG_ENTRIES = 6;
5555
5656function workToneClass(tone: "thinking" | "tool" | "info" | "error"): string {
apps/renderer/src/components/Sidebar.tsx+2-5
......@@ -202,12 +202,9 @@ export default function Sidebar() {
202202 {/* Drag region / traffic light space (Electron only) */}
203203 {isElectron && <div className="drag-region h-[52px] shrink-0" />}
204204 {/* Branding */}
205 <div className={`flex items-center gap-2 px-4 pb-4 ${isElectron ? "" : "pt-4"}`}>
206 <div className="flex h-7 w-7 items-center justify-center rounded-lg bg-primary text-xs font-bold text-primary-foreground">
207 CT
208 </div>
205 <div className={`flex items-center gap-2.5 px-4 pb-4 ${isElectron ? "" : "pt-4"}`}>
209206 <span className="flex-1 text-sm font-semibold tracking-tight text-foreground">
210 CodeThing
207 T3 <span className="font-normal text-muted-foreground">Code</span>
211208 </span>
212209 <button
213210 type="button"
apps/renderer/src/hooks/useTheme.ts+1-1
......@@ -2,7 +2,7 @@ import { useCallback, useEffect, useSyncExternalStore } from "react";
22
33type Theme = "light" | "dark" | "system";
44
5const STORAGE_KEY = "codething:theme";
5const STORAGE_KEY = "t3code:theme";
66const MEDIA_QUERY = "(prefers-color-scheme: dark)";
77
88let listeners: Array<() => void> = [];
apps/renderer/src/index.css+8-8
......@@ -83,8 +83,8 @@
8383 --card-foreground: var(--color-neutral-800);
8484 --popover: var(--color-white);
8585 --popover-foreground: var(--color-neutral-800);
86 --primary: var(--color-neutral-800);
87 --primary-foreground: var(--color-neutral-50);
86 --primary: oklch(0.488 0.217 264);
87 --primary-foreground: var(--color-white);
8888 --secondary: --alpha(var(--color-black) / 4%);
8989 --secondary-foreground: var(--color-neutral-800);
9090 --muted: --alpha(var(--color-black) / 4%);
......@@ -93,12 +93,12 @@
9393 var(--color-neutral-500) 90%,
9494 var(--color-black)
9595 );
96 --accent: --alpha(var(--color-black) / 4%);
96 --accent: --alpha(var(--color-black) / 5%);
9797 --accent-foreground: var(--color-neutral-800);
9898 --destructive: var(--color-red-500);
9999 --border: --alpha(var(--color-black) / 8%);
100100 --input: --alpha(var(--color-black) / 10%);
101 --ring: var(--color-neutral-400);
101 --ring: oklch(0.488 0.217 264);
102102 --chart-1: oklch(0.646 0.222 41.116);
103103 --chart-2: oklch(0.6 0.118 184.704);
104104 --chart-3: oklch(0.398 0.07 227.392);
......@@ -132,8 +132,8 @@
132132 --card-foreground: var(--color-neutral-100);
133133 --popover: color-mix(in srgb, var(--background) 98%, var(--color-white));
134134 --popover-foreground: var(--color-neutral-100);
135 --primary: var(--color-neutral-100);
136 --primary-foreground: var(--color-neutral-800);
135 --primary: oklch(0.588 0.217 264);
136 --primary-foreground: var(--color-white);
137137 --secondary: --alpha(var(--color-white) / 4%);
138138 --secondary-foreground: var(--color-neutral-100);
139139 --muted: --alpha(var(--color-white) / 4%);
......@@ -151,7 +151,7 @@
151151 );
152152 --border: --alpha(var(--color-white) / 6%);
153153 --input: --alpha(var(--color-white) / 8%);
154 --ring: var(--color-neutral-500);
154 --ring: oklch(0.588 0.217 264);
155155 --chart-1: oklch(0.488 0.243 264.376);
156156 --chart-2: oklch(0.696 0.17 162.48);
157157 --chart-3: oklch(0.769 0.188 70.08);
......@@ -177,7 +177,7 @@
177177
178178body {
179179 font-family:
180 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
180 "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
181181 margin: 0;
182182 padding: 0;
183183 min-height: 100vh;
apps/renderer/src/model-logic.ts+1-1
......@@ -3,7 +3,7 @@ export {
33 MODEL_OPTIONS,
44 normalizeModelSlug,
55 resolveModelSlug,
6} from "@acme/contracts";
6} from "@t3tools/contracts";
77
88export const REASONING_OPTIONS = ["xhigh", "high", "medium", "low"] as const;
99export const DEFAULT_REASONING = "high";
apps/renderer/src/session-logic.test.ts+1-1
......@@ -1,6 +1,6 @@
11import { describe, expect, it } from "vitest";
22
3import type { ProviderEvent, ProviderSession } from "@acme/contracts";
3import type { ProviderEvent, ProviderSession } from "@t3tools/contracts";
44import {
55 type WorkLogEntry,
66 applyEventToMessages,
apps/renderer/src/session-logic.ts+1-1
......@@ -1,4 +1,4 @@
1import type { NativeApi, ProviderEvent, ProviderKind, ProviderSession } from "@acme/contracts";
1import type { NativeApi, ProviderEvent, ProviderKind, ProviderSession } from "@t3tools/contracts";
22import type { ChatMessage, SessionPhase } from "./types";
33import { createWsNativeApi } from "./wsNativeApi";
44
apps/renderer/src/store.test.ts+1-1
......@@ -1,4 +1,4 @@
1import type { ProviderEvent, ProviderSession } from "@acme/contracts";
1import type { ProviderEvent, ProviderSession } from "@t3tools/contracts";
22import { describe, expect, it } from "vitest";
33
44import { type AppState, reducer } from "./store";
apps/renderer/src/store.ts+4-2
......@@ -8,7 +8,7 @@ import {
88 useReducer,
99} from "react";
1010
11import type { ProviderEvent, ProviderSession } from "@acme/contracts";
11import type { ProviderEvent, ProviderSession } from "@t3tools/contracts";
1212import { resolveModelSlug } from "./model-logic";
1313import { hydratePersistedState, toPersistedState } from "./persistenceSchema";
1414import { applyEventToMessages, asObject, asString, evolveSession } from "./session-logic";
......@@ -45,8 +45,10 @@ export interface AppState {
4545 diffOpen: boolean;
4646}
4747
48const PERSISTED_STATE_KEY = "codething:renderer-state:v4";
48const PERSISTED_STATE_KEY = "t3code:renderer-state:v4";
4949const LEGACY_PERSISTED_STATE_KEYS = [
50 "t3code:renderer-state:v3",
51 "codething:renderer-state:v4",
5052 "codething:renderer-state:v3",
5153 "codething:renderer-state:v2",
5254 "codething:renderer-state:v1",
apps/renderer/src/types.ts+1-1
......@@ -1,4 +1,4 @@
1import type { ProviderEvent, ProviderSession } from "@acme/contracts";
1import type { ProviderEvent, ProviderSession } from "@t3tools/contracts";
22
33export type SessionPhase = "disconnected" | "connecting" | "ready" | "running";
44export type RuntimeMode = "approval-required" | "full-access";
apps/renderer/src/vite-env.d.ts+1-1
......@@ -1,6 +1,6 @@
11/// <reference types="vite/client" />
22
3import type { NativeApi } from "@acme/contracts";
3import type { NativeApi } from "@t3tools/contracts";
44
55interface DesktopBridge {
66 getWsUrl: () => string | null;
apps/renderer/src/wsNativeApi.ts+1-1
......@@ -1,4 +1,4 @@
1import { type NativeApi, WS_CHANNELS, WS_METHODS, type WsWelcomePayload } from "@acme/contracts";
1import { type NativeApi, WS_CHANNELS, WS_METHODS, type WsWelcomePayload } from "@t3tools/contracts";
22
33import { WsTransport } from "./wsTransport";
44
apps/renderer/src/wsTransport.ts+1-1
......@@ -1,4 +1,4 @@
1import type { WsPush, WsRequest, WsResponse } from "@acme/contracts";
1import type { WsPush, WsRequest, WsResponse } from "@t3tools/contracts";
22
33type PushListener = (data: unknown) => void;
44
apps/server/package.json+4-4
......@@ -11,10 +11,10 @@
1111 "main": "./dist/index.js",
1212 "scripts": {
1313 "dev": "VITE_DEV_SERVER_URL=http://localhost:5173 tsx src/index.ts",
14 "dev:desktop": "CODETHING_MODE=desktop CODETHING_NO_BROWSER=1 tsx src/index.ts",
14 "dev:desktop": "T3CODE_MODE=desktop T3CODE_NO_BROWSER=1 tsx src/index.ts",
1515 "build": "tsup && node scripts/bundle-client.mjs",
1616 "start": "node dist/index.js",
17 "start:desktop": "CODETHING_MODE=desktop CODETHING_NO_BROWSER=1 node dist/index.js",
17 "start:desktop": "T3CODE_MODE=desktop T3CODE_NO_BROWSER=1 node dist/index.js",
1818 "typecheck": "tsc --noEmit",
1919 "test": "vitest run"
2020 },
......@@ -23,8 +23,8 @@
2323 "ws": "^8.18.0"
2424 },
2525 "devDependencies": {
26 "@acme/contracts": "workspace:*",
27 "@acme/renderer": "workspace:*",
26 "@t3tools/contracts": "workspace:*",
27 "@t3tools/renderer": "workspace:*",
2828 "@types/node": "^22.10.2",
2929 "@types/ws": "^8.5.13",
3030 "tsup": "^8.3.5",
apps/server/src/codexAppServerManager.ts+4-4
......@@ -11,8 +11,8 @@ import type {
1111 ProviderSession,
1212 ProviderSessionStartInput,
1313 ProviderTurnStartResult,
14} from "@acme/contracts";
15import { normalizeModelSlug } from "@acme/contracts";
14} from "@t3tools/contracts";
15import { normalizeModelSlug } from "@t3tools/contracts";
1616
1717type PendingRequestKey = string;
1818
......@@ -180,8 +180,8 @@ export class CodexAppServerManager extends EventEmitter<CodexAppServerManagerEve
180180 try {
181181 await this.sendRequest(context, "initialize", {
182182 clientInfo: {
183 name: "codething_desktop",
184 title: "CodeThing Desktop",
183 name: "t3code_desktop",
184 title: "T3 Code Desktop",
185185 version: "0.1.0",
186186 },
187187 capabilities: {
apps/server/src/index.ts+8-8
......@@ -29,7 +29,7 @@ function parsePort(value: string | undefined): number | undefined {
2929 if (!value) return undefined;
3030 const parsed = Number(value);
3131 if (!Number.isInteger(parsed) || parsed < 1 || parsed > 65535) {
32 throw new Error(`Invalid CODETHING_PORT: ${value}`);
32 throw new Error(`Invalid T3CODE_PORT: ${value}`);
3333 }
3434 return parsed;
3535}
......@@ -97,15 +97,15 @@ function resolveStaticDir(): string | undefined {
9797}
9898
9999async function main() {
100 const mode: RuntimeMode = process.env.CODETHING_MODE === "desktop" ? "desktop" : "web";
101 const requestedPort = parsePort(process.env.CODETHING_PORT);
100 const mode: RuntimeMode = process.env.T3CODE_MODE === "desktop" ? "desktop" : "web";
101 const requestedPort = parsePort(process.env.T3CODE_PORT);
102102 const port =
103103 requestedPort ?? (mode === "desktop" ? DEFAULT_PORT : await findAvailablePort(DEFAULT_PORT));
104 const stateDir = resolveStateDir(process.env.CODETHING_STATE_DIR);
104 const stateDir = resolveStateDir(process.env.T3CODE_STATE_DIR);
105105 const projectRegistry = new ProjectRegistry(stateDir);
106106 const devUrl = process.env.VITE_DEV_SERVER_URL;
107 const noBrowser = parseBooleanEnv(process.env.CODETHING_NO_BROWSER) ?? mode === "desktop";
108 const authToken = process.env.CODETHING_AUTH_TOKEN;
107 const noBrowser = parseBooleanEnv(process.env.T3CODE_NO_BROWSER) ?? mode === "desktop";
108 const authToken = process.env.T3CODE_AUTH_TOKEN;
109109 const staticDir = devUrl ? undefined : resolveStaticDir();
110110
111111 if (!devUrl && !staticDir) {
......@@ -126,7 +126,7 @@ async function main() {
126126 await server.start();
127127
128128 const url = `http://localhost:${port}`;
129 logger.info("CodeThing running", {
129 logger.info("T3 Code running", {
130130 url,
131131 cwd,
132132 mode,
......@@ -171,6 +171,6 @@ async function main() {
171171}
172172
173173main().catch((err) => {
174 logger.error("failed to start CodeThing", { error: err });
174 logger.error("failed to start T3 Code", { error: err });
175175 process.exit(1);
176176});
apps/server/src/projectRegistry.ts+1-1
......@@ -11,7 +11,7 @@ import {
1111 projectAddInputSchema,
1212 projectRecordSchema,
1313 projectRemoveInputSchema,
14} from "@acme/contracts";
14} from "@t3tools/contracts";
1515
1616function normalizeCwd(rawCwd: string): string {
1717 const resolved = path.resolve(rawCwd.trim());
apps/server/src/providerManager.ts+1-1
......@@ -16,7 +16,7 @@ import {
1616 providerSendTurnInputSchema,
1717 providerSessionStartInputSchema,
1818 providerStopSessionInputSchema,
19} from "@acme/contracts";
19} from "@t3tools/contracts";
2020import { CodexAppServerManager } from "./codexAppServerManager";
2121
2222export interface ProviderManagerEvents {
apps/server/src/wsServer.test.ts+6-6
......@@ -6,7 +6,7 @@ import { describe, expect, it, afterEach, vi } from "vitest";
66import { createServer } from "./wsServer";
77import WebSocket from "ws";
88
9import { WS_CHANNELS, WS_METHODS, type WsPush, type WsResponse } from "@acme/contracts";
9import { WS_CHANNELS, WS_METHODS, type WsPush, type WsResponse } from "@t3tools/contracts";
1010import { ProjectRegistry } from "./projectRegistry";
1111
1212interface PendingMessages {
......@@ -87,7 +87,7 @@ describe("WebSocket Server", () => {
8787 stateDir?: string;
8888 } = {},
8989 ): ReturnType<typeof createServer> {
90 const stateDir = options.stateDir ?? makeTempDir("codething-ws-state-");
90 const stateDir = options.stateDir ?? makeTempDir("t3code-ws-state-");
9191 return createServer({
9292 port: 0,
9393 cwd: options.cwd ?? "/test/project",
......@@ -234,8 +234,8 @@ describe("WebSocket Server", () => {
234234 });
235235
236236 it("supports projects list/add/dedupe/remove", async () => {
237 const stateDir = makeTempDir("codething-ws-projects-state-");
238 const firstProjectCwd = makeTempDir("codething-ws-project-a-");
237 const stateDir = makeTempDir("t3code-ws-projects-state-");
238 const firstProjectCwd = makeTempDir("t3code-ws-project-a-");
239239
240240 server = createTestServer({ stateDir, cwd: "/test" });
241241 await server.start();
......@@ -282,8 +282,8 @@ describe("WebSocket Server", () => {
282282 });
283283
284284 it("prunes missing projects on startup", async () => {
285 const stateDir = makeTempDir("codething-ws-prune-state-");
286 const existing = makeTempDir("codething-ws-existing-project-");
285 const stateDir = makeTempDir("t3code-ws-prune-state-");
286 const existing = makeTempDir("t3code-ws-existing-project-");
287287 const missing = path.join(stateDir, "definitely-missing");
288288 const now = new Date().toISOString();
289289 const projectsFile = path.join(stateDir, "projects.json");
apps/server/src/wsServer.ts+2-2
......@@ -13,7 +13,7 @@ import {
1313 type WsRequest,
1414 type WsResponse,
1515 wsRequestSchema,
16} from "@acme/contracts";
16} from "@t3tools/contracts";
1717import { WebSocketServer, type WebSocket } from "ws";
1818
1919import { createLogger } from "./logger";
......@@ -71,7 +71,7 @@ export function createServer(options: ServerOptions) {
7171 const clients = new Set<WebSocket>();
7272 const logger = createLogger("ws");
7373 const logWebSocketEvents =
74 explicitLogWsEvents ?? parseBooleanEnv(process.env.CODETHING_LOG_WS_EVENTS) ?? Boolean(devUrl);
74 explicitLogWsEvents ?? parseBooleanEnv(process.env.T3CODE_LOG_WS_EVENTS) ?? Boolean(devUrl);
7575
7676 function logOutgoingPush(push: WsPush, recipients: number) {
7777 if (!logWebSocketEvents) return;
apps/server/tsup.config.ts+1-1
......@@ -6,7 +6,7 @@ export default defineConfig({
66 outDir: "dist",
77 sourcemap: true,
88 clean: true,
9 noExternal: ["@acme/contracts"],
9 noExternal: ["@t3tools/contracts"],
1010 banner: {
1111 js: '#!/usr/bin/env node\n',
1212 },
bun.lock+12-12
......@@ -13,7 +13,7 @@
1313 },
1414 },
1515 "apps/desktop": {
16 "name": "@acme/desktop",
16 "name": "@t3tools/desktop",
1717 "version": "0.0.0",
1818 "dependencies": {
1919 "electron": "33.4.11",
......@@ -29,10 +29,10 @@
2929 },
3030 },
3131 "apps/renderer": {
32 "name": "@acme/renderer",
32 "name": "@t3tools/renderer",
3333 "version": "0.0.0",
3434 "dependencies": {
35 "@acme/contracts": "workspace:*",
35 "@t3tools/contracts": "workspace:*",
3636 "highlight.js": "^11.11.1",
3737 "lucide-react": "^0.563.0",
3838 "react": "^19.0.0",
......@@ -64,8 +64,8 @@
6464 "ws": "^8.18.0",
6565 },
6666 "devDependencies": {
67 "@acme/contracts": "workspace:*",
68 "@acme/renderer": "workspace:*",
67 "@t3tools/contracts": "workspace:*",
68 "@t3tools/renderer": "workspace:*",
6969 "@types/node": "^22.10.2",
7070 "@types/ws": "^8.5.13",
7171 "tsup": "^8.3.5",
......@@ -74,7 +74,7 @@
7474 },
7575 },
7676 "packages/contracts": {
77 "name": "@acme/contracts",
77 "name": "@t3tools/contracts",
7878 "version": "0.0.0",
7979 "dependencies": {
8080 "zod": "^3.24.1",
......@@ -86,12 +86,6 @@
8686 },
8787 },
8888 "packages": {
89 "@acme/contracts": ["@acme/contracts@workspace:packages/contracts"],
90
91 "@acme/desktop": ["@acme/desktop@workspace:apps/desktop"],
92
93 "@acme/renderer": ["@acme/renderer@workspace:apps/renderer"],
94
9589 "@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="],
9690
9791 "@babel/compat-data": ["@babel/compat-data@7.29.0", "", {}, "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg=="],
......@@ -296,6 +290,12 @@
296290
297291 "@szmarczak/http-timer": ["@szmarczak/http-timer@4.0.6", "", { "dependencies": { "defer-to-connect": "^2.0.0" } }, "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w=="],
298292
293 "@t3tools/contracts": ["@t3tools/contracts@workspace:packages/contracts"],
294
295 "@t3tools/desktop": ["@t3tools/desktop@workspace:apps/desktop"],
296
297 "@t3tools/renderer": ["@t3tools/renderer@workspace:apps/renderer"],
298
299299 "@tailwindcss/node": ["@tailwindcss/node@4.1.18", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "enhanced-resolve": "^5.18.3", "jiti": "^2.6.1", "lightningcss": "1.30.2", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.1.18" } }, "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ=="],
300300
301301 "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.18", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.18", "@tailwindcss/oxide-darwin-arm64": "4.1.18", "@tailwindcss/oxide-darwin-x64": "4.1.18", "@tailwindcss/oxide-freebsd-x64": "4.1.18", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", "@tailwindcss/oxide-linux-x64-musl": "4.1.18", "@tailwindcss/oxide-wasm32-wasi": "4.1.18", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" } }, "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A=="],
package.json+2-2
......@@ -1,12 +1,12 @@
11{
2 "name": "ct-round-5",
2 "name": "@t3tools/monorepo",
33 "private": true,
44 "workspaces": [
55 "apps/*",
66 "packages/*"
77 ],
88 "scripts": {
9 "dev": "CODETHING_LOG_WS_EVENTS=1 VITE_WS_URL=ws://localhost:3773 turbo run dev --ui=tui --filter=@acme/contracts --filter=@acme/renderer --filter=t3 --parallel",
9 "dev": "T3CODE_LOG_WS_EVENTS=1 VITE_WS_URL=ws://localhost:3773 turbo run dev --ui=tui --filter=@t3tools/contracts --filter=@t3tools/renderer --filter=t3 --parallel",
1010 "dev:server": "bun run build:contracts && bun run --cwd apps/server dev",
1111 "dev:web": "VITE_WS_URL=ws://localhost:3773 bun run --cwd apps/renderer dev",
1212 "dev:desktop": "bun run --cwd apps/desktop dev",
packages/contracts/package.json+1-1
......@@ -1,5 +1,5 @@
11{
2 "name": "@acme/contracts",
2 "name": "@t3tools/contracts",
33 "version": "0.0.0",
44 "private": true,
55 "files": [
turbo.json+8-8
......@@ -4,13 +4,13 @@
44 "PORT",
55 "VITE_WS_URL",
66 "VITE_DEV_SERVER_URL",
7 "CODETHING_LOG_WS_EVENTS",
8 "CODETHING_MODE",
9 "CODETHING_PORT",
10 "CODETHING_NO_BROWSER",
11 "CODETHING_STATE_DIR",
12 "CODETHING_AUTH_TOKEN",
13 "CODETHING_DESKTOP_WS_URL"
7 "T3CODE_LOG_WS_EVENTS",
8 "T3CODE_MODE",
9 "T3CODE_PORT",
10 "T3CODE_NO_BROWSER",
11 "T3CODE_STATE_DIR",
12 "T3CODE_AUTH_TOKEN",
13 "T3CODE_DESKTOP_WS_URL"
1414 ],
1515 "tasks": {
1616 "build": {
......@@ -18,7 +18,7 @@
1818 "outputs": ["dist/**", "dist-electron/**"]
1919 },
2020 "dev": {
21 "dependsOn": ["@acme/contracts#build"],
21 "dependsOn": ["@t3tools/contracts#build"],
2222 "cache": false,
2323 "persistent": true
2424 },