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 @@...@@ -1,7 +1,7 @@
1# CLAUDE.md1# CLAUDE.md
22
3## Project Snapshot3## 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
6This repository is a VERY EARLY WIP. Proposing sweeping changes that improve long-term maintainability is encouraged.6This 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...@@ -18,7 +18,7 @@ If a tradeoff is required, choose correctness and robustness over short-term con
18- `packages/contracts`: Shared Zod schemas and TypeScript contracts for provider events, WebSocket protocol, and model/session types.18- `packages/contracts`: Shared Zod schemas and TypeScript contracts for provider events, WebSocket protocol, and model/session types.
1919
20## Codex App Server (Important)20## 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
23How we use it in this codebase:23How we use it in this codebase:
24- Session startup/resume and turn lifecycle are brokered in `apps/server/src/codexAppServerManager.ts`.24- Session startup/resume and turn lifecycle are brokered in `apps/server/src/codexAppServerManager.ts`.
README.md+7-7
...@@ -1,13 +1,13 @@...@@ -1,13 +1,13 @@
1# CodeThing1# 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
5Run `npx t3` in any project directory to launch the web interface.5Run `npx t3` in any project directory to launch the web interface.
6Run `bun run dev:desktop` to launch the Electron desktop app in this monorepo.6Run `bun run dev:desktop` to launch the Electron desktop app in this monorepo.
77
8## Architecture8## 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
12```12```
13┌─────────────────────────────────┐13┌─────────────────────────────────┐
...@@ -37,8 +37,8 @@ CodeThing runs as a **Node.js WebSocket server** that wraps `codex app-server` (...@@ -37,8 +37,8 @@ CodeThing runs as a **Node.js WebSocket server** that wraps `codex app-server` (
37## Codex prerequisites37## Codex prerequisites
3838
39- Install Codex CLI so `codex` is on your PATH.39- 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).40- Authenticate Codex before running T3 Code (for example via API key or ChatGPT auth supported by Codex).
41- CodeThing starts the server via `codex app-server` per session.41- T3 Code starts the server via `codex app-server` per session.
4242
43## Quick start43## Quick start
4444
...@@ -69,7 +69,7 @@ npx t3...@@ -69,7 +69,7 @@ npx t3
6969
70## Runtime modes70## 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
74- **Full access** (default): starts sessions with `approvalPolicy: never` and `sandboxMode: danger-full-access`.74- **Full access** (default): starts sessions with `approvalPolicy: never` and `sandboxMode: danger-full-access`.
75- **Supervised**: starts sessions with `approvalPolicy: on-request` and `sandboxMode: workspace-write`, then prompts in-app for command/file approvals.75- **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-...@@ -81,7 +81,7 @@ The renderer communicates with the server via WebSocket using a simple JSON-RPC-
81- **Request/Response**: `{ id, method, params }` → `{ id, result }` or `{ id, error }`81- **Request/Response**: `{ id, method, params }` → `{ id, result }` or `{ id, error }`
82- **Push events**: `{ type: "push", channel, data }` for streaming provider events82- **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
86- `providers.startSession`, `providers.sendTurn`, `providers.interruptTurn`86- `providers.startSession`, `providers.sendTurn`, `providers.interruptTurn`
87- `providers.respondToRequest`, `providers.stopSession`, `providers.listSessions`87- `providers.respondToRequest`, `providers.stopSession`, `providers.listSessions`
apps/desktop/package.json+1-1
...@@ -1,5 +1,5 @@...@@ -1,5 +1,5 @@
1{1{
2 "name": "@acme/desktop",2 "name": "@t3tools/desktop",
3 "version": "0.0.0",3 "version": "0.0.0",
4 "private": true,4 "private": true,
5 "main": "dist-electron/main.js",5 "main": "dist-electron/main.js",
apps/desktop/src/main.ts+6-6
...@@ -48,11 +48,11 @@ async function reserveLoopbackPort(): Promise<number> {...@@ -48,11 +48,11 @@ async function reserveLoopbackPort(): Promise<number> {
48function backendEnv(): NodeJS.ProcessEnv {48function backendEnv(): NodeJS.ProcessEnv {
49 return {49 return {
50 ...process.env,50 ...process.env,
51 CODETHING_MODE: "desktop",51 T3CODE_MODE: "desktop",
52 CODETHING_NO_BROWSER: "1",52 T3CODE_NO_BROWSER: "1",
53 CODETHING_PORT: String(backendPort),53 T3CODE_PORT: String(backendPort),
54 CODETHING_STATE_DIR: STATE_DIR,54 T3CODE_STATE_DIR: STATE_DIR,
55 CODETHING_AUTH_TOKEN: backendAuthToken,55 T3CODE_AUTH_TOKEN: backendAuthToken,
56 };56 };
57}57}
5858
...@@ -186,7 +186,7 @@ async function bootstrap(): Promise<void> {...@@ -186,7 +186,7 @@ async function bootstrap(): Promise<void> {
186 backendPort = await reserveLoopbackPort();186 backendPort = await reserveLoopbackPort();
187 backendAuthToken = randomBytes(24).toString("hex");187 backendAuthToken = randomBytes(24).toString("hex");
188 backendWsUrl = `ws://127.0.0.1:${backendPort}/?token=${encodeURIComponent(backendAuthToken)}`;188 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
191 registerIpcHandlers();191 registerIpcHandlers();
192 startBackend();192 startBackend();
apps/desktop/src/preload.ts+1-1
...@@ -1,7 +1,7 @@...@@ -1,7 +1,7 @@
1import { contextBridge, ipcRenderer } from "electron";1import { contextBridge, ipcRenderer } from "electron";
22
3const PICK_FOLDER_CHANNEL = "desktop:pick-folder";3const 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
6contextBridge.exposeInMainWorld("desktopBridge", {6contextBridge.exposeInMainWorld("desktopBridge", {
7 getWsUrl: () => wsUrl,7 getWsUrl: () => wsUrl,
apps/desktop/tsup.config.ts+1-1
...@@ -6,5 +6,5 @@ export default defineConfig({...@@ -6,5 +6,5 @@ export default defineConfig({
6 outDir: "dist-electron",6 outDir: "dist-electron",
7 sourcemap: true,7 sourcemap: true,
8 clean: true,8 clean: true,
9 noExternal: ["@acme/contracts"],9 noExternal: ["@t3tools/contracts"],
10});10});
apps/renderer/index.html+4-1
...@@ -3,7 +3,10 @@...@@ -3,7 +3,10 @@
3 <head>3 <head>
4 <meta charset="UTF-8" />4 <meta charset="UTF-8" />
5 <meta name="viewport" content="width=device-width, initial-scale=1.0" />5 <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>
7 </head>10 </head>
8 <body>11 <body>
9 <div id="root"></div>12 <div id="root"></div>
apps/renderer/package.json+2-2
...@@ -1,5 +1,5 @@...@@ -1,5 +1,5 @@
1{1{
2 "name": "@acme/renderer",2 "name": "@t3tools/renderer",
3 "version": "0.0.0",3 "version": "0.0.0",
4 "private": true,4 "private": true,
5 "type": "module",5 "type": "module",
...@@ -11,7 +11,7 @@...@@ -11,7 +11,7 @@
11 "test": "vitest run --passWithNoTests"11 "test": "vitest run --passWithNoTests"
12 },12 },
13 "dependencies": {13 "dependencies": {
14 "@acme/contracts": "workspace:*",14 "@t3tools/contracts": "workspace:*",
15 "highlight.js": "^11.11.1",15 "highlight.js": "^11.11.1",
16 "lucide-react": "^0.563.0",16 "lucide-react": "^0.563.0",
17 "react": "^19.0.0",17 "react": "^19.0.0",
apps/renderer/src/App.tsx+1-1
...@@ -148,7 +148,7 @@ function Layout() {...@@ -148,7 +148,7 @@ function Layout() {
148 return (148 return (
149 <div className="flex h-screen flex-col bg-background text-foreground">149 <div className="flex h-screen flex-col bg-background text-foreground">
150 <div className="flex flex-1 items-center justify-center">150 <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>
152 </div>152 </div>
153 </div>153 </div>
154 );154 );
apps/renderer/src/components/ChatView.tsx+3-3
...@@ -2,7 +2,7 @@ import {...@@ -2,7 +2,7 @@ import {
2 PROVIDER_SEND_TURN_MAX_INPUT_CHARS,2 PROVIDER_SEND_TURN_MAX_INPUT_CHARS,
3 type ProviderApprovalDecision,3 type ProviderApprovalDecision,
4 type ProviderEvent,4 type ProviderEvent,
5} from "@acme/contracts";5} from "@t3tools/contracts";
6import {6import {
7 type FormEvent,7 type FormEvent,
8 Fragment,8 Fragment,
...@@ -13,7 +13,7 @@ import {...@@ -13,7 +13,7 @@ import {
13 useState,13 useState,
14} from "react";14} from "react";
1515
16import { EDITORS, type EditorId } from "@acme/contracts";16import { EDITORS, type EditorId } from "@t3tools/contracts";
17import { isElectron } from "../env";17import { isElectron } from "../env";
18import { buildBootstrapInput } from "../historyBootstrap";18import { buildBootstrapInput } from "../historyBootstrap";
19import {19import {
...@@ -50,7 +50,7 @@ function editorLabel(editor: (typeof EDITORS)[number]): string {...@@ -50,7 +50,7 @@ function editorLabel(editor: (typeof EDITORS)[number]): string {
50 return editor.command ? editor.label : FILE_MANAGER_LABEL;50 return editor.command ? editor.label : FILE_MANAGER_LABEL;
51}51}
5252
53const LAST_EDITOR_KEY = "codething:last-editor";53const LAST_EDITOR_KEY = "t3code:last-editor";
54const MAX_VISIBLE_WORK_LOG_ENTRIES = 6;54const MAX_VISIBLE_WORK_LOG_ENTRIES = 6;
5555
56function workToneClass(tone: "thinking" | "tool" | "info" | "error"): string {56function workToneClass(tone: "thinking" | "tool" | "info" | "error"): string {
apps/renderer/src/components/Sidebar.tsx+2-5
...@@ -202,12 +202,9 @@ export default function Sidebar() {...@@ -202,12 +202,9 @@ export default function Sidebar() {
202 {/* Drag region / traffic light space (Electron only) */}202 {/* Drag region / traffic light space (Electron only) */}
203 {isElectron && <div className="drag-region h-[52px] shrink-0" />}203 {isElectron && <div className="drag-region h-[52px] shrink-0" />}
204 {/* Branding */}204 {/* Branding */}
205 <div className={`flex items-center gap-2 px-4 pb-4 ${isElectron ? "" : "pt-4"}`}>205 <div className={`flex items-center gap-2.5 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>
209 <span className="flex-1 text-sm font-semibold tracking-tight text-foreground">206 <span className="flex-1 text-sm font-semibold tracking-tight text-foreground">
210 CodeThing207 T3 <span className="font-normal text-muted-foreground">Code</span>
211 </span>208 </span>
212 <button209 <button
213 type="button"210 type="button"
apps/renderer/src/hooks/useTheme.ts+1-1
...@@ -2,7 +2,7 @@ import { useCallback, useEffect, useSyncExternalStore } from "react";...@@ -2,7 +2,7 @@ import { useCallback, useEffect, useSyncExternalStore } from "react";
22
3type Theme = "light" | "dark" | "system";3type Theme = "light" | "dark" | "system";
44
5const STORAGE_KEY = "codething:theme";5const STORAGE_KEY = "t3code:theme";
6const MEDIA_QUERY = "(prefers-color-scheme: dark)";6const MEDIA_QUERY = "(prefers-color-scheme: dark)";
77
8let listeners: Array<() => void> = [];8let listeners: Array<() => void> = [];
apps/renderer/src/index.css+8-8
...@@ -83,8 +83,8 @@...@@ -83,8 +83,8 @@
83 --card-foreground: var(--color-neutral-800);83 --card-foreground: var(--color-neutral-800);
84 --popover: var(--color-white);84 --popover: var(--color-white);
85 --popover-foreground: var(--color-neutral-800);85 --popover-foreground: var(--color-neutral-800);
86 --primary: var(--color-neutral-800);86 --primary: oklch(0.488 0.217 264);
87 --primary-foreground: var(--color-neutral-50);87 --primary-foreground: var(--color-white);
88 --secondary: --alpha(var(--color-black) / 4%);88 --secondary: --alpha(var(--color-black) / 4%);
89 --secondary-foreground: var(--color-neutral-800);89 --secondary-foreground: var(--color-neutral-800);
90 --muted: --alpha(var(--color-black) / 4%);90 --muted: --alpha(var(--color-black) / 4%);
...@@ -93,12 +93,12 @@...@@ -93,12 +93,12 @@
93 var(--color-neutral-500) 90%,93 var(--color-neutral-500) 90%,
94 var(--color-black)94 var(--color-black)
95 );95 );
96 --accent: --alpha(var(--color-black) / 4%);96 --accent: --alpha(var(--color-black) / 5%);
97 --accent-foreground: var(--color-neutral-800);97 --accent-foreground: var(--color-neutral-800);
98 --destructive: var(--color-red-500);98 --destructive: var(--color-red-500);
99 --border: --alpha(var(--color-black) / 8%);99 --border: --alpha(var(--color-black) / 8%);
100 --input: --alpha(var(--color-black) / 10%);100 --input: --alpha(var(--color-black) / 10%);
101 --ring: var(--color-neutral-400);101 --ring: oklch(0.488 0.217 264);
102 --chart-1: oklch(0.646 0.222 41.116);102 --chart-1: oklch(0.646 0.222 41.116);
103 --chart-2: oklch(0.6 0.118 184.704);103 --chart-2: oklch(0.6 0.118 184.704);
104 --chart-3: oklch(0.398 0.07 227.392);104 --chart-3: oklch(0.398 0.07 227.392);
...@@ -132,8 +132,8 @@...@@ -132,8 +132,8 @@
132 --card-foreground: var(--color-neutral-100);132 --card-foreground: var(--color-neutral-100);
133 --popover: color-mix(in srgb, var(--background) 98%, var(--color-white));133 --popover: color-mix(in srgb, var(--background) 98%, var(--color-white));
134 --popover-foreground: var(--color-neutral-100);134 --popover-foreground: var(--color-neutral-100);
135 --primary: var(--color-neutral-100);135 --primary: oklch(0.588 0.217 264);
136 --primary-foreground: var(--color-neutral-800);136 --primary-foreground: var(--color-white);
137 --secondary: --alpha(var(--color-white) / 4%);137 --secondary: --alpha(var(--color-white) / 4%);
138 --secondary-foreground: var(--color-neutral-100);138 --secondary-foreground: var(--color-neutral-100);
139 --muted: --alpha(var(--color-white) / 4%);139 --muted: --alpha(var(--color-white) / 4%);
...@@ -151,7 +151,7 @@...@@ -151,7 +151,7 @@
151 );151 );
152 --border: --alpha(var(--color-white) / 6%);152 --border: --alpha(var(--color-white) / 6%);
153 --input: --alpha(var(--color-white) / 8%);153 --input: --alpha(var(--color-white) / 8%);
154 --ring: var(--color-neutral-500);154 --ring: oklch(0.588 0.217 264);
155 --chart-1: oklch(0.488 0.243 264.376);155 --chart-1: oklch(0.488 0.243 264.376);
156 --chart-2: oklch(0.696 0.17 162.48);156 --chart-2: oklch(0.696 0.17 162.48);
157 --chart-3: oklch(0.769 0.188 70.08);157 --chart-3: oklch(0.769 0.188 70.08);
...@@ -177,7 +177,7 @@...@@ -177,7 +177,7 @@
177177
178body {178body {
179 font-family:179 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;
181 margin: 0;181 margin: 0;
182 padding: 0;182 padding: 0;
183 min-height: 100vh;183 min-height: 100vh;
apps/renderer/src/model-logic.ts+1-1
...@@ -3,7 +3,7 @@ export {...@@ -3,7 +3,7 @@ export {
3 MODEL_OPTIONS,3 MODEL_OPTIONS,
4 normalizeModelSlug,4 normalizeModelSlug,
5 resolveModelSlug,5 resolveModelSlug,
6} from "@acme/contracts";6} from "@t3tools/contracts";
77
8export const REASONING_OPTIONS = ["xhigh", "high", "medium", "low"] as const;8export const REASONING_OPTIONS = ["xhigh", "high", "medium", "low"] as const;
9export const DEFAULT_REASONING = "high";9export const DEFAULT_REASONING = "high";
apps/renderer/src/session-logic.test.ts+1-1
...@@ -1,6 +1,6 @@...@@ -1,6 +1,6 @@
1import { describe, expect, it } from "vitest";1import { describe, expect, it } from "vitest";
22
3import type { ProviderEvent, ProviderSession } from "@acme/contracts";3import type { ProviderEvent, ProviderSession } from "@t3tools/contracts";
4import {4import {
5 type WorkLogEntry,5 type WorkLogEntry,
6 applyEventToMessages,6 applyEventToMessages,
apps/renderer/src/session-logic.ts+1-1
...@@ -1,4 +1,4 @@...@@ -1,4 +1,4 @@
1import type { NativeApi, ProviderEvent, ProviderKind, ProviderSession } from "@acme/contracts";1import type { NativeApi, ProviderEvent, ProviderKind, ProviderSession } from "@t3tools/contracts";
2import type { ChatMessage, SessionPhase } from "./types";2import type { ChatMessage, SessionPhase } from "./types";
3import { createWsNativeApi } from "./wsNativeApi";3import { createWsNativeApi } from "./wsNativeApi";
44
apps/renderer/src/store.test.ts+1-1
...@@ -1,4 +1,4 @@...@@ -1,4 +1,4 @@
1import type { ProviderEvent, ProviderSession } from "@acme/contracts";1import type { ProviderEvent, ProviderSession } from "@t3tools/contracts";
2import { describe, expect, it } from "vitest";2import { describe, expect, it } from "vitest";
33
4import { type AppState, reducer } from "./store";4import { type AppState, reducer } from "./store";
apps/renderer/src/store.ts+4-2
...@@ -8,7 +8,7 @@ import {...@@ -8,7 +8,7 @@ import {
8 useReducer,8 useReducer,
9} from "react";9} from "react";
1010
11import type { ProviderEvent, ProviderSession } from "@acme/contracts";11import type { ProviderEvent, ProviderSession } from "@t3tools/contracts";
12import { resolveModelSlug } from "./model-logic";12import { resolveModelSlug } from "./model-logic";
13import { hydratePersistedState, toPersistedState } from "./persistenceSchema";13import { hydratePersistedState, toPersistedState } from "./persistenceSchema";
14import { applyEventToMessages, asObject, asString, evolveSession } from "./session-logic";14import { applyEventToMessages, asObject, asString, evolveSession } from "./session-logic";
...@@ -45,8 +45,10 @@ export interface AppState {...@@ -45,8 +45,10 @@ export interface AppState {
45 diffOpen: boolean;45 diffOpen: boolean;
46}46}
4747
48const PERSISTED_STATE_KEY = "codething:renderer-state:v4";48const PERSISTED_STATE_KEY = "t3code:renderer-state:v4";
49const LEGACY_PERSISTED_STATE_KEYS = [49const LEGACY_PERSISTED_STATE_KEYS = [
50 "t3code:renderer-state:v3",
51 "codething:renderer-state:v4",
50 "codething:renderer-state:v3",52 "codething:renderer-state:v3",
51 "codething:renderer-state:v2",53 "codething:renderer-state:v2",
52 "codething:renderer-state:v1",54 "codething:renderer-state:v1",
apps/renderer/src/types.ts+1-1
...@@ -1,4 +1,4 @@...@@ -1,4 +1,4 @@
1import type { ProviderEvent, ProviderSession } from "@acme/contracts";1import type { ProviderEvent, ProviderSession } from "@t3tools/contracts";
22
3export type SessionPhase = "disconnected" | "connecting" | "ready" | "running";3export type SessionPhase = "disconnected" | "connecting" | "ready" | "running";
4export type RuntimeMode = "approval-required" | "full-access";4export type RuntimeMode = "approval-required" | "full-access";
apps/renderer/src/vite-env.d.ts+1-1
...@@ -1,6 +1,6 @@...@@ -1,6 +1,6 @@
1/// <reference types="vite/client" />1/// <reference types="vite/client" />
22
3import type { NativeApi } from "@acme/contracts";3import type { NativeApi } from "@t3tools/contracts";
44
5interface DesktopBridge {5interface DesktopBridge {
6 getWsUrl: () => string | null;6 getWsUrl: () => string | null;
apps/renderer/src/wsNativeApi.ts+1-1
...@@ -1,4 +1,4 @@...@@ -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
3import { WsTransport } from "./wsTransport";3import { WsTransport } from "./wsTransport";
44
apps/renderer/src/wsTransport.ts+1-1
...@@ -1,4 +1,4 @@...@@ -1,4 +1,4 @@
1import type { WsPush, WsRequest, WsResponse } from "@acme/contracts";1import type { WsPush, WsRequest, WsResponse } from "@t3tools/contracts";
22
3type PushListener = (data: unknown) => void;3type PushListener = (data: unknown) => void;
44
apps/server/package.json+4-4
...@@ -11,10 +11,10 @@...@@ -11,10 +11,10 @@
11 "main": "./dist/index.js",11 "main": "./dist/index.js",
12 "scripts": {12 "scripts": {
13 "dev": "VITE_DEV_SERVER_URL=http://localhost:5173 tsx src/index.ts",13 "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",
15 "build": "tsup && node scripts/bundle-client.mjs",15 "build": "tsup && node scripts/bundle-client.mjs",
16 "start": "node dist/index.js",16 "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",
18 "typecheck": "tsc --noEmit",18 "typecheck": "tsc --noEmit",
19 "test": "vitest run"19 "test": "vitest run"
20 },20 },
...@@ -23,8 +23,8 @@...@@ -23,8 +23,8 @@
23 "ws": "^8.18.0"23 "ws": "^8.18.0"
24 },24 },
25 "devDependencies": {25 "devDependencies": {
26 "@acme/contracts": "workspace:*",26 "@t3tools/contracts": "workspace:*",
27 "@acme/renderer": "workspace:*",27 "@t3tools/renderer": "workspace:*",
28 "@types/node": "^22.10.2",28 "@types/node": "^22.10.2",
29 "@types/ws": "^8.5.13",29 "@types/ws": "^8.5.13",
30 "tsup": "^8.3.5",30 "tsup": "^8.3.5",
apps/server/src/codexAppServerManager.ts+4-4
...@@ -11,8 +11,8 @@ import type {...@@ -11,8 +11,8 @@ import type {
11 ProviderSession,11 ProviderSession,
12 ProviderSessionStartInput,12 ProviderSessionStartInput,
13 ProviderTurnStartResult,13 ProviderTurnStartResult,
14} from "@acme/contracts";14} from "@t3tools/contracts";
15import { normalizeModelSlug } from "@acme/contracts";15import { normalizeModelSlug } from "@t3tools/contracts";
1616
17type PendingRequestKey = string;17type PendingRequestKey = string;
1818
...@@ -180,8 +180,8 @@ export class CodexAppServerManager extends EventEmitter<CodexAppServerManagerEve...@@ -180,8 +180,8 @@ export class CodexAppServerManager extends EventEmitter<CodexAppServerManagerEve
180 try {180 try {
181 await this.sendRequest(context, "initialize", {181 await this.sendRequest(context, "initialize", {
182 clientInfo: {182 clientInfo: {
183 name: "codething_desktop",183 name: "t3code_desktop",
184 title: "CodeThing Desktop",184 title: "T3 Code Desktop",
185 version: "0.1.0",185 version: "0.1.0",
186 },186 },
187 capabilities: {187 capabilities: {
apps/server/src/index.ts+8-8
...@@ -29,7 +29,7 @@ function parsePort(value: string | undefined): number | undefined {...@@ -29,7 +29,7 @@ function parsePort(value: string | undefined): number | undefined {
29 if (!value) return undefined;29 if (!value) return undefined;
30 const parsed = Number(value);30 const parsed = Number(value);
31 if (!Number.isInteger(parsed) || parsed < 1 || parsed > 65535) {31 if (!Number.isInteger(parsed) || parsed < 1 || parsed > 65535) {
32 throw new Error(`Invalid CODETHING_PORT: ${value}`);32 throw new Error(`Invalid T3CODE_PORT: ${value}`);
33 }33 }
34 return parsed;34 return parsed;
35}35}
...@@ -97,15 +97,15 @@ function resolveStaticDir(): string | undefined {...@@ -97,15 +97,15 @@ function resolveStaticDir(): string | undefined {
97}97}
9898
99async function main() {99async function main() {
100 const mode: RuntimeMode = process.env.CODETHING_MODE === "desktop" ? "desktop" : "web";100 const mode: RuntimeMode = process.env.T3CODE_MODE === "desktop" ? "desktop" : "web";
101 const requestedPort = parsePort(process.env.CODETHING_PORT);101 const requestedPort = parsePort(process.env.T3CODE_PORT);
102 const port =102 const port =
103 requestedPort ?? (mode === "desktop" ? DEFAULT_PORT : await findAvailablePort(DEFAULT_PORT));103 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);
105 const projectRegistry = new ProjectRegistry(stateDir);105 const projectRegistry = new ProjectRegistry(stateDir);
106 const devUrl = process.env.VITE_DEV_SERVER_URL;106 const devUrl = process.env.VITE_DEV_SERVER_URL;
107 const noBrowser = parseBooleanEnv(process.env.CODETHING_NO_BROWSER) ?? mode === "desktop";107 const noBrowser = parseBooleanEnv(process.env.T3CODE_NO_BROWSER) ?? mode === "desktop";
108 const authToken = process.env.CODETHING_AUTH_TOKEN;108 const authToken = process.env.T3CODE_AUTH_TOKEN;
109 const staticDir = devUrl ? undefined : resolveStaticDir();109 const staticDir = devUrl ? undefined : resolveStaticDir();
110110
111 if (!devUrl && !staticDir) {111 if (!devUrl && !staticDir) {
...@@ -126,7 +126,7 @@ async function main() {...@@ -126,7 +126,7 @@ async function main() {
126 await server.start();126 await server.start();
127127
128 const url = `http://localhost:${port}`;128 const url = `http://localhost:${port}`;
129 logger.info("CodeThing running", {129 logger.info("T3 Code running", {
130 url,130 url,
131 cwd,131 cwd,
132 mode,132 mode,
...@@ -171,6 +171,6 @@ async function main() {...@@ -171,6 +171,6 @@ async function main() {
171}171}
172172
173main().catch((err) => {173main().catch((err) => {
174 logger.error("failed to start CodeThing", { error: err });174 logger.error("failed to start T3 Code", { error: err });
175 process.exit(1);175 process.exit(1);
176});176});
apps/server/src/projectRegistry.ts+1-1
...@@ -11,7 +11,7 @@ import {...@@ -11,7 +11,7 @@ import {
11 projectAddInputSchema,11 projectAddInputSchema,
12 projectRecordSchema,12 projectRecordSchema,
13 projectRemoveInputSchema,13 projectRemoveInputSchema,
14} from "@acme/contracts";14} from "@t3tools/contracts";
1515
16function normalizeCwd(rawCwd: string): string {16function normalizeCwd(rawCwd: string): string {
17 const resolved = path.resolve(rawCwd.trim());17 const resolved = path.resolve(rawCwd.trim());
apps/server/src/providerManager.ts+1-1
...@@ -16,7 +16,7 @@ import {...@@ -16,7 +16,7 @@ import {
16 providerSendTurnInputSchema,16 providerSendTurnInputSchema,
17 providerSessionStartInputSchema,17 providerSessionStartInputSchema,
18 providerStopSessionInputSchema,18 providerStopSessionInputSchema,
19} from "@acme/contracts";19} from "@t3tools/contracts";
20import { CodexAppServerManager } from "./codexAppServerManager";20import { CodexAppServerManager } from "./codexAppServerManager";
2121
22export interface ProviderManagerEvents {22export interface ProviderManagerEvents {
apps/server/src/wsServer.test.ts+6-6
...@@ -6,7 +6,7 @@ import { describe, expect, it, afterEach, vi } from "vitest";...@@ -6,7 +6,7 @@ import { describe, expect, it, afterEach, vi } from "vitest";
6import { createServer } from "./wsServer";6import { createServer } from "./wsServer";
7import WebSocket from "ws";7import 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";
10import { ProjectRegistry } from "./projectRegistry";10import { ProjectRegistry } from "./projectRegistry";
1111
12interface PendingMessages {12interface PendingMessages {
...@@ -87,7 +87,7 @@ describe("WebSocket Server", () => {...@@ -87,7 +87,7 @@ describe("WebSocket Server", () => {
87 stateDir?: string;87 stateDir?: string;
88 } = {},88 } = {},
89 ): ReturnType<typeof createServer> {89 ): ReturnType<typeof createServer> {
90 const stateDir = options.stateDir ?? makeTempDir("codething-ws-state-");90 const stateDir = options.stateDir ?? makeTempDir("t3code-ws-state-");
91 return createServer({91 return createServer({
92 port: 0,92 port: 0,
93 cwd: options.cwd ?? "/test/project",93 cwd: options.cwd ?? "/test/project",
...@@ -234,8 +234,8 @@ describe("WebSocket Server", () => {...@@ -234,8 +234,8 @@ describe("WebSocket Server", () => {
234 });234 });
235235
236 it("supports projects list/add/dedupe/remove", async () => {236 it("supports projects list/add/dedupe/remove", async () => {
237 const stateDir = makeTempDir("codething-ws-projects-state-");237 const stateDir = makeTempDir("t3code-ws-projects-state-");
238 const firstProjectCwd = makeTempDir("codething-ws-project-a-");238 const firstProjectCwd = makeTempDir("t3code-ws-project-a-");
239239
240 server = createTestServer({ stateDir, cwd: "/test" });240 server = createTestServer({ stateDir, cwd: "/test" });
241 await server.start();241 await server.start();
...@@ -282,8 +282,8 @@ describe("WebSocket Server", () => {...@@ -282,8 +282,8 @@ describe("WebSocket Server", () => {
282 });282 });
283283
284 it("prunes missing projects on startup", async () => {284 it("prunes missing projects on startup", async () => {
285 const stateDir = makeTempDir("codething-ws-prune-state-");285 const stateDir = makeTempDir("t3code-ws-prune-state-");
286 const existing = makeTempDir("codething-ws-existing-project-");286 const existing = makeTempDir("t3code-ws-existing-project-");
287 const missing = path.join(stateDir, "definitely-missing");287 const missing = path.join(stateDir, "definitely-missing");
288 const now = new Date().toISOString();288 const now = new Date().toISOString();
289 const projectsFile = path.join(stateDir, "projects.json");289 const projectsFile = path.join(stateDir, "projects.json");
apps/server/src/wsServer.ts+2-2
...@@ -13,7 +13,7 @@ import {...@@ -13,7 +13,7 @@ import {
13 type WsRequest,13 type WsRequest,
14 type WsResponse,14 type WsResponse,
15 wsRequestSchema,15 wsRequestSchema,
16} from "@acme/contracts";16} from "@t3tools/contracts";
17import { WebSocketServer, type WebSocket } from "ws";17import { WebSocketServer, type WebSocket } from "ws";
1818
19import { createLogger } from "./logger";19import { createLogger } from "./logger";
...@@ -71,7 +71,7 @@ export function createServer(options: ServerOptions) {...@@ -71,7 +71,7 @@ export function createServer(options: ServerOptions) {
71 const clients = new Set<WebSocket>();71 const clients = new Set<WebSocket>();
72 const logger = createLogger("ws");72 const logger = createLogger("ws");
73 const logWebSocketEvents =73 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
76 function logOutgoingPush(push: WsPush, recipients: number) {76 function logOutgoingPush(push: WsPush, recipients: number) {
77 if (!logWebSocketEvents) return;77 if (!logWebSocketEvents) return;
apps/server/tsup.config.ts+1-1
...@@ -6,7 +6,7 @@ export default defineConfig({...@@ -6,7 +6,7 @@ export default defineConfig({
6 outDir: "dist",6 outDir: "dist",
7 sourcemap: true,7 sourcemap: true,
8 clean: true,8 clean: true,
9 noExternal: ["@acme/contracts"],9 noExternal: ["@t3tools/contracts"],
10 banner: {10 banner: {
11 js: '#!/usr/bin/env node\n',11 js: '#!/usr/bin/env node\n',
12 },12 },
bun.lock+12-12
...@@ -13,7 +13,7 @@...@@ -13,7 +13,7 @@
13 },13 },
14 },14 },
15 "apps/desktop": {15 "apps/desktop": {
16 "name": "@acme/desktop",16 "name": "@t3tools/desktop",
17 "version": "0.0.0",17 "version": "0.0.0",
18 "dependencies": {18 "dependencies": {
19 "electron": "33.4.11",19 "electron": "33.4.11",
...@@ -29,10 +29,10 @@...@@ -29,10 +29,10 @@
29 },29 },
30 },30 },
31 "apps/renderer": {31 "apps/renderer": {
32 "name": "@acme/renderer",32 "name": "@t3tools/renderer",
33 "version": "0.0.0",33 "version": "0.0.0",
34 "dependencies": {34 "dependencies": {
35 "@acme/contracts": "workspace:*",35 "@t3tools/contracts": "workspace:*",
36 "highlight.js": "^11.11.1",36 "highlight.js": "^11.11.1",
37 "lucide-react": "^0.563.0",37 "lucide-react": "^0.563.0",
38 "react": "^19.0.0",38 "react": "^19.0.0",
...@@ -64,8 +64,8 @@...@@ -64,8 +64,8 @@
64 "ws": "^8.18.0",64 "ws": "^8.18.0",
65 },65 },
66 "devDependencies": {66 "devDependencies": {
67 "@acme/contracts": "workspace:*",67 "@t3tools/contracts": "workspace:*",
68 "@acme/renderer": "workspace:*",68 "@t3tools/renderer": "workspace:*",
69 "@types/node": "^22.10.2",69 "@types/node": "^22.10.2",
70 "@types/ws": "^8.5.13",70 "@types/ws": "^8.5.13",
71 "tsup": "^8.3.5",71 "tsup": "^8.3.5",
...@@ -74,7 +74,7 @@...@@ -74,7 +74,7 @@
74 },74 },
75 },75 },
76 "packages/contracts": {76 "packages/contracts": {
77 "name": "@acme/contracts",77 "name": "@t3tools/contracts",
78 "version": "0.0.0",78 "version": "0.0.0",
79 "dependencies": {79 "dependencies": {
80 "zod": "^3.24.1",80 "zod": "^3.24.1",
...@@ -86,12 +86,6 @@...@@ -86,12 +86,6 @@
86 },86 },
87 },87 },
88 "packages": {88 "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
95 "@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=="],89 "@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
97 "@babel/compat-data": ["@babel/compat-data@7.29.0", "", {}, "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg=="],91 "@babel/compat-data": ["@babel/compat-data@7.29.0", "", {}, "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg=="],
...@@ -296,6 +290,12 @@...@@ -296,6 +290,12 @@
296290
297 "@szmarczak/http-timer": ["@szmarczak/http-timer@4.0.6", "", { "dependencies": { "defer-to-connect": "^2.0.0" } }, "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w=="],291 "@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
299 "@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=="],299 "@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
301 "@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=="],301 "@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 @@...@@ -1,12 +1,12 @@
1{1{
2 "name": "ct-round-5",2 "name": "@t3tools/monorepo",
3 "private": true,3 "private": true,
4 "workspaces": [4 "workspaces": [
5 "apps/*",5 "apps/*",
6 "packages/*"6 "packages/*"
7 ],7 ],
8 "scripts": {8 "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",
10 "dev:server": "bun run build:contracts && bun run --cwd apps/server dev",10 "dev:server": "bun run build:contracts && bun run --cwd apps/server dev",
11 "dev:web": "VITE_WS_URL=ws://localhost:3773 bun run --cwd apps/renderer dev",11 "dev:web": "VITE_WS_URL=ws://localhost:3773 bun run --cwd apps/renderer dev",
12 "dev:desktop": "bun run --cwd apps/desktop dev",12 "dev:desktop": "bun run --cwd apps/desktop dev",
packages/contracts/package.json+1-1
...@@ -1,5 +1,5 @@...@@ -1,5 +1,5 @@
1{1{
2 "name": "@acme/contracts",2 "name": "@t3tools/contracts",
3 "version": "0.0.0",3 "version": "0.0.0",
4 "private": true,4 "private": true,
5 "files": [5 "files": [
turbo.json+8-8
...@@ -4,13 +4,13 @@...@@ -4,13 +4,13 @@
4 "PORT",4 "PORT",
5 "VITE_WS_URL",5 "VITE_WS_URL",
6 "VITE_DEV_SERVER_URL",6 "VITE_DEV_SERVER_URL",
7 "CODETHING_LOG_WS_EVENTS",7 "T3CODE_LOG_WS_EVENTS",
8 "CODETHING_MODE",8 "T3CODE_MODE",
9 "CODETHING_PORT",9 "T3CODE_PORT",
10 "CODETHING_NO_BROWSER",10 "T3CODE_NO_BROWSER",
11 "CODETHING_STATE_DIR",11 "T3CODE_STATE_DIR",
12 "CODETHING_AUTH_TOKEN",12 "T3CODE_AUTH_TOKEN",
13 "CODETHING_DESKTOP_WS_URL"13 "T3CODE_DESKTOP_WS_URL"
14 ],14 ],
15 "tasks": {15 "tasks": {
16 "build": {16 "build": {
...@@ -18,7 +18,7 @@...@@ -18,7 +18,7 @@
18 "outputs": ["dist/**", "dist-electron/**"]18 "outputs": ["dist/**", "dist-electron/**"]
19 },19 },
20 "dev": {20 "dev": {
21 "dependsOn": ["@acme/contracts#build"],21 "dependsOn": ["@t3tools/contracts#build"],
22 "cache": false,22 "cache": false,
23 "persistent": true23 "persistent": true
24 },24 },