Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
e2e6ce6
feat(server): report image dimensions with signed asset URLs (#10198)
juliusmarminge Sep 5, 2026
7451d17
fix(mobile): size a chat image's frame before its bytes arrive (#10199)
juliusmarminge Sep 5, 2026
d0f855b
fix(web): size the chat image slot from server-reported dimensions (#…
juliusmarminge Sep 5, 2026
0671e34
refactor(shared): remove unused runtime helpers and exports (#10166)
juliusmarminge Sep 5, 2026
dbfd517
refactor(client-runtime): remove unused runtime exports and helpers (…
juliusmarminge Sep 5, 2026
5716dec
refactor(contracts): keep RPC implementation exports private (#10168)
juliusmarminge Sep 5, 2026
50bc62a
refactor(contracts): trim unused client API runtime exports (#10169)
juliusmarminge Sep 5, 2026
2ae3b71
refactor(contracts): keep unused settings and relay exports private (…
juliusmarminge Sep 5, 2026
5fe5c6f
ci: enforce runtime exports while allowing types and schemas (#10171)
juliusmarminge Sep 5, 2026
54441e6
fix(web): copy provider update commands from compact rows (#9888)
MatthewFeroz Sep 5, 2026
3be90ce
fix(web): align provider header action sizes and spacing (#9890)
MatthewFeroz Sep 5, 2026
3fb8942
fix(mobile): restore live tool shimmer and add a Thinking row (#10173)
juliusmarminge Sep 5, 2026
1cb49c3
fix(mobile): even out the working pill's spacing (#10209)
juliusmarminge Sep 5, 2026
7eda989
fix(mobile): only make work rows expandable when the body adds someth…
juliusmarminge Sep 5, 2026
579a775
fix(mobile): fold subagent lifecycle rows into one batch per spawn (#…
juliusmarminge Sep 5, 2026
89cc743
fix(mobile): stop clipping expanded tool groups (#10212)
juliusmarminge Sep 5, 2026
c2cfe59
fix(web): defer browser discovery in integrations (#9797)
zortos293 Sep 5, 2026
88fc41c
refactor(web): test file cache identity through its public helpers (#…
juliusmarminge Sep 5, 2026
748fe0f
refactor(web): test favicon fallback through the component (#10220)
juliusmarminge Sep 5, 2026
183c343
feat: show provider usage limits with /usage-limits (#9875)
chrisdeeming Sep 5, 2026
585ce2c
refactor(web): test formatted timestamps instead of formatter options…
juliusmarminge Sep 5, 2026
be53bbd
feat(usage): show remaining quota instead of used (#9889)
chrisdeeming Sep 5, 2026
f12d393
fix(ui): unify loading and refresh feedback across clients (#9561)
StiensWout Sep 5, 2026
bd16b86
fix(client-runtime): report terminated thread loads (#10216)
juliusmarminge Sep 6, 2026
050690d
fix(server): settle threads using actual pull request terminal timest…
maria-rcks Sep 6, 2026
eee0557
fix(clients): persist project icons across reloads and reconnects (#1…
StiensWout Sep 6, 2026
b438447
fix(mobile): use selected theme across input forms and controls (#10239)
juliusmarminge Sep 6, 2026
bfba778
fix(mobile): keep the new-task draft when switching environment (#10247)
juliusmarminge Sep 6, 2026
2c33535
fix(web): keep timestamp tooltip dates in English (#10256)
Lucenx9 Sep 6, 2026
3da9399
fix(web): let authorized clients scrolling reach settings (#10080)
flamboh Sep 6, 2026
add8c3a
fix(web): remember usage page selection (#10189)
extoci Sep 6, 2026
c8872fd
fix(server): keep the Antigravity Google sign-in across server restar…
t3dotgg Sep 6, 2026
ab67795
fix(antigravity): load user skills from ~/.gemini for every project (…
t3dotgg Sep 6, 2026
84aebb7
fix(web): respect reduced motion in shared disclosures (#10258)
saphid Sep 6, 2026
b2e1518
feat(marketing): add a Windows 95 landing page (#10286)
t3dotgg Sep 6, 2026
fdcc491
refactor(web): remove unused runtime wrappers and exports (#10225)
juliusmarminge Sep 6, 2026
226abe5
refactor(web): keep feature component helpers private (#10226)
juliusmarminge Sep 6, 2026
1200f53
refactor(web): keep app utilities private and remove dead helpers (#1…
juliusmarminge Sep 6, 2026
da2ba5b
ci: enforce unused runtime exports in the web app (#10228)
juliusmarminge Sep 6, 2026
76f686d
test(desktop): cover Clerk setup through the service (#10284)
juliusmarminge Sep 6, 2026
cabac78
test(desktop): cover WSL hashes through runtime resolution (#10285)
juliusmarminge Sep 6, 2026
181e451
test(desktop): cover password store through startup (#10287)
juliusmarminge Sep 6, 2026
0c200c5
test(desktop): cover WSL paths through public behavior (#10289)
juliusmarminge Sep 6, 2026
b4040d9
test(desktop): exercise WSL cache safety through public scripts (#10301)
juliusmarminge Sep 6, 2026
f93aafc
test(web): cover file classification through diff ordering (#10304)
juliusmarminge Sep 6, 2026
a9fc4dc
test(web): focus command palette tests on search behavior (#10302)
juliusmarminge Sep 6, 2026
fc7ad2e
fix(web): add project settings to legacy sidebar project menu (#10021)
hwanseoc Sep 6, 2026
b972f1c
test(web): keep Markdown gutter styling private (#10306)
juliusmarminge Sep 6, 2026
9f40b2f
feat(settings): add shared project defaults and scoped overrides (#9754)
maria-rcks Sep 6, 2026
420fd76
feat(connections): balance new threads across connected machines (#9895)
maria-rcks Sep 6, 2026
f1e84c2
test(web): keep settings viewport comparison private (#10307)
juliusmarminge Sep 6, 2026
4f782be
fix(web): prevent file tree search focus ring clipping (#10175)
GuilhermeVieiraDev Sep 6, 2026
b7465a3
fix(mobile): stop the work log flickering during subagent runs and fa…
juliusmarminge Sep 6, 2026
a495385
fix(mobile): save linked media from chat (#10271)
juliusmarminge Sep 6, 2026
272d6d7
feat(markdown): show the GitHub mark for github.com links (#10324)
juliusmarminge Sep 6, 2026
d924fe2
fix(marketing): show a real preview card when t3.codes is shared (#10…
t3dotgg Sep 6, 2026
b273d1c
feat(usage): pool subscription limits per provider across accounts an…
juliusmarminge Sep 6, 2026
f0d7f14
merge: sync upstream through d924fe2664
github-actions[bot] Sep 6, 2026
00d6109
chore(web): remove usage limits demo fixtures (#10330)
juliusmarminge Sep 6, 2026
efe3a96
merge: include upstream through 00d6109cbb
github-actions[bot] Sep 6, 2026
e00d06c
fix(shared): copy-and-sort usage limit pools for Hermes
github-actions[bot] Sep 6, 2026
127efae
fix(web): expose error disclosure state (#10125)
saphid Sep 6, 2026
f4a9f28
fix: keep queued-send feed still and project-defaults in settings search
github-actions[bot] Sep 6, 2026
bc02873
fix(web): name the editor picker accurately (#10124)
saphid Sep 6, 2026
aea9ecb
fix(web): make task row states readable (#10128)
saphid Sep 6, 2026
8268978
fix(web): explain hosted connection prerequisites (#10129)
saphid Sep 6, 2026
5533383
fix(web): name combobox chip removal targets (#10127)
saphid Sep 6, 2026
0382e76
merge: include upstream through 55333833ec
github-actions[bot] Sep 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
44 changes: 24 additions & 20 deletions apps/desktop/src/app/DesktopClerk.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -129,28 +129,32 @@ describe("DesktopClerk", () => {
});
});

it.each([
for (const { isDevelopment, scheme } of [
{ isDevelopment: true, scheme: "t3code-dev" },
{ isDevelopment: false, scheme: "t3code" },
])("configures the SDK with the $scheme renderer origin", ({ isDevelopment, scheme }) => {
const bridge = { cleanup: vi.fn(), isPrimaryInstance: true };
storageMock.mockReturnValue(storageAdapter);
createClerkBridgeMock.mockReturnValue(bridge);

assert.equal(DesktopClerk.createDesktopClerkBridge("/tmp/t3-state", isDevelopment), bridge);
assert.deepEqual(storageMock.mock.calls, [[{ path: "/tmp/t3-state" }]]);
assert.deepEqual(createClerkBridgeMock.mock.calls, [
[
{
storage: storageAdapter,
passkeys: true,
renderer: { scheme, host: "app" },
},
],
]);
storageMock.mockClear();
createClerkBridgeMock.mockClear();
});
] as const) {
it.effect(`configures the SDK with the ${scheme} renderer origin`, () => {
const bridge = { cleanup: vi.fn(), isPrimaryInstance: true };
storageMock.mockReturnValue(storageAdapter);
createClerkBridgeMock.mockReturnValue(bridge);

return Effect.gen(function* () {
yield* Effect.scoped(Layer.build(makeDesktopClerkLayer(isDevelopment)));
assert.deepEqual(storageMock.mock.calls, [[{ path: "/tmp/t3-state" }]]);
assert.deepEqual(createClerkBridgeMock.mock.calls, [
[
{
storage: storageAdapter,
passkeys: true,
renderer: { scheme, host: "app" },
},
],
]);
storageMock.mockClear();
createClerkBridgeMock.mockClear();
});
});
}

it.effect(
"wires second-instance argv into deep links and registers the protocol when packaged",
Expand Down
2 changes: 1 addition & 1 deletion apps/desktop/src/app/DesktopClerk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ export const desktopClerkFrontendApiHostname = resolveDesktopClerkFrontendApiHos
: __T3CODE_BUILD_CLERK_PUBLISHABLE_KEY__,
);

export function createDesktopClerkBridge(stateDir: string, isDevelopment: boolean) {
function createDesktopClerkBridge(stateDir: string, isDevelopment: boolean) {
return createClerkBridge({
storage: storage({ path: stateDir }),
passkeys: true,
Expand Down
53 changes: 15 additions & 38 deletions apps/desktop/src/app/DesktopPreReadyPlatform.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,45 +37,22 @@ describe("DesktopPreReadyPlatform", () => {
registerSchemesMock.mockReset();
});

it("reads an explicit Electron command-line switch value", () => {
const value = DesktopPreReadyPlatform.readCommandLineSwitchValue(
{
hasSwitch: (switchName) => switchName === "password-store",
getSwitchValue: (switchName) => {
assert.equal(switchName, "password-store");
return "basic";
},
},
"password-store",
it.effect("preserves an explicit Linux password-store switch", () => {
hasSwitchMock.mockImplementation((switchName) => switchName === "password-store");
getSwitchValueMock.mockReturnValue(" basic ");

return Effect.gen(function* () {
const options = yield* DesktopPreReadyPlatform.DesktopPreReadyElectronOptions;

assert.equal(options.linuxPasswordStoreCommandLine, "basic");
assert.isFalse(appendSwitchMock.mock.calls.some(([name]) => name === "password-store"));
}).pipe(
Effect.provide(
DesktopPreReadyPlatform.layer.pipe(
Layer.provide(Layer.succeed(HostProcessPlatform, "linux")),
),
),
);

assert.equal(value, "basic");
});

it("treats valueless Electron command-line switches as absent", () => {
const value = DesktopPreReadyPlatform.readCommandLineSwitchValue(
{
hasSwitch: () => true,
getSwitchValue: () => "",
},
"password-store",
);

assert.isNull(value);
});

it("returns null for missing Electron command-line switches", () => {
const value = DesktopPreReadyPlatform.readCommandLineSwitchValue(
{
hasSwitch: () => false,
getSwitchValue: () => {
throw new Error("Unexpected switch value read.");
},
},
"password-store",
);

assert.isNull(value);
});

it.effect(
Expand Down
2 changes: 1 addition & 1 deletion apps/desktop/src/app/DesktopPreReadyPlatform.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export interface DesktopPreReadyCommandLineReader {
readonly getSwitchValue: (switchName: string) => string;
}

export function readCommandLineSwitchValue(
function readCommandLineSwitchValue(
commandLine: DesktopPreReadyCommandLineReader,
switchName: string,
): string | null {
Expand Down
8 changes: 0 additions & 8 deletions apps/desktop/src/backend/DesktopBackendConfiguration.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -218,14 +218,6 @@ const withPackagedWslHarness = <A, E, R>(
}).pipe(Effect.scoped, Effect.provide(NodeServices.layer));

describe("DesktopBackendConfiguration", () => {
it("accepts only normalized SHA-256 archive identities", () => {
assert.equal(
DesktopBackendConfiguration.parseWslRuntimeArchiveHash(` ${"A".repeat(64)}\n`),
"a".repeat(64),
);
assert.isNull(DesktopBackendConfiguration.parseWslRuntimeArchiveHash("abc123"));
});

it.effect("resolvePrimary produces a stable scoped bootstrap token", () =>
withHarness(
Effect.gen(function* () {
Expand Down
2 changes: 1 addition & 1 deletion apps/desktop/src/backend/DesktopBackendConfiguration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,7 @@ const WSL_RUNTIME_ARCHIVE_NAME = "wsl-runtime.tar.gz";
const WSL_RUNTIME_ARCHIVE_HASH_NAME = `${WSL_RUNTIME_ARCHIVE_NAME}.sha256`;
const SHA256_HEX_PATTERN = /^[0-9a-f]{64}$/i;

export const parseWslRuntimeArchiveHash = (value: string): string | null => {
const parseWslRuntimeArchiveHash = (value: string): string | null => {
const trimmed = value.trim();
return SHA256_HEX_PATTERN.test(trimmed) ? trimmed.toLowerCase() : null;
};
Expand Down
2 changes: 2 additions & 0 deletions apps/desktop/src/settings/DesktopClientSettings.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,8 @@ const clientSettings: ClientSettings = {
sidebarThreadPreviewCount: 6,
sidebarHideProviderIcons: false,
legacySidebarEnabled: false,
loadBalancingEnabled: false,
loadBalancingWeights: { "environment-1": 75, "environment-2": 0 },
timestampFormat: "24-hour",
wordWrap: true,
};
Expand Down
55 changes: 12 additions & 43 deletions apps/desktop/src/wsl/DesktopWslEnvironment.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,17 @@ import * as TestClock from "effect/testing/TestClock";
import { ChildProcessSpawner } from "effect/unstable/process";

import {
buildWslNodeEnvPreamble,
buildWslRuntimeInstallScript,
buildWslRuntimeInvalidateScript,
buildWslRuntimePruneScript,
DesktopWslDistroListError,
formatMissingToolsReason,
formatNodePtyProbeFailureReason,
formatWslShellTransportFailureReason,
parseNodePath,
parseNodeVersion,
parseResolvedPath,
parseToolchainReport,
parseWslRuntimeRoot,
probeWslDistros,
sanitizeWslRuntimeId,
} from "./DesktopWslEnvironment.ts";

const encoder = new TextEncoder();
Expand Down Expand Up @@ -144,46 +140,19 @@ describe("probeWslDistros", () => {
});
});

describe("formatNodePtyProbeFailureReason", () => {
it("identifies a packaged build that omitted the Linux node-pty prebuild", () => {
const reason = formatNodePtyProbeFailureReason(4);

expect(reason).toContain("packaged Linux node-pty binary was not included");
expect(reason).toContain("--wsl-prebuild");
});

it("leaves other node-pty load failures to the compatibility diagnostic", () => {
expect(formatNodePtyProbeFailureReason(1)).toBeNull();
});
});

describe("formatWslShellTransportFailureReason", () => {
it("distinguishes timeouts and spawn failures from normal shell exit codes", () => {
expect(formatWslShellTransportFailureReason("timeout")).toContain("timed out");
expect(formatWslShellTransportFailureReason("spawn")).toContain("could not start wsl.exe");
expect(formatWslShellTransportFailureReason("process")).toContain("lost communication");
expect(formatWslShellTransportFailureReason(null)).toBeNull();
});
});

describe("buildWslNodeEnvPreamble", () => {
it("passes the required Node engine range into the shared resolver", () => {
const preamble = buildWslNodeEnvPreamble("^22.16 || ^23.11 || >=24.10");

expect(preamble).toContain("T3_NODE_ENGINE_RANGE='^22.16 || ^23.11 || >=24.10'");
expect(preamble.indexOf("T3_NODE_ENGINE_RANGE=")).toBeLessThan(
preamble.lastIndexOf("ensure_remote_node_path || true"),
);
});

it("keeps the shared resolver permissive when no Node engine range is provided", () => {
expect(buildWslNodeEnvPreamble()).toContain("T3_NODE_ENGINE_RANGE=''");
});
});

describe("WSL runtime cache", () => {
it("sanitizes cache ids before interpolating them into Linux paths", () => {
expect(sanitizeWslRuntimeId("1.2.3/x64; touch /tmp/nope")).toBe("1.2.3_x64__touch__tmp_nope");
it.each([
[
"install",
(id: string) => buildWslRuntimeInstallScript("/runtime.tar.gz", id, "b".repeat(64)),
],
["prune", buildWslRuntimePruneScript],
["invalidate", buildWslRuntimeInvalidateScript],
] as const)("sanitizes cache ids in the %s script", (_, buildScript) => {
const runtimeId = "1.2.3/x64; touch /tmp/nope";
const script = buildScript(runtimeId);
expect(script).toContain("/1.2.3_x64__touch__tmp_nope");
expect(script).not.toContain(runtimeId);
});

it("installs through a temporary directory and only reuses valid completed caches", () => {
Expand Down
9 changes: 4 additions & 5 deletions apps/desktop/src/wsl/DesktopWslEnvironment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ const TIMEOUT_RESULT: ShellResult = {
transportFailure: "timeout",
};

export const formatWslShellTransportFailureReason = (
const formatWslShellTransportFailureReason = (
failure: ShellResult["transportFailure"],
): string | null => {
switch (failure) {
Expand All @@ -165,7 +165,7 @@ export const formatWslShellTransportFailureReason = (
// Reuse the SSH remote resolver so WSL and SSH discover version-managed Node
// the same way. Passing the engine range lets the resolver fall through to
// version managers like nvm when a system node exists but is too old.
export const buildWslNodeEnvPreamble = (
const buildWslNodeEnvPreamble = (
nodeEngineRange?: string | null,
): string => `${buildRemoteNodeEnvScript({ nodeEngineRange: nodeEngineRange ?? null })}
ensure_remote_node_path || true
Expand Down Expand Up @@ -263,8 +263,7 @@ const WSL_RUNTIME_READY_MARKER = ".t3code-wsl-runtime-ready";
const WSL_RUNTIME_SELECTED_MARKER = ".t3code-wsl-runtime-selected";
const WSL_RUNTIME_SELECTION_GRACE_MINUTES = 5;

export const sanitizeWslRuntimeId = (value: string): string =>
value.replace(/[^A-Za-z0-9._-]/g, "_");
const sanitizeWslRuntimeId = (value: string): string => value.replace(/[^A-Za-z0-9._-]/g, "_");

// `archiveSha256` is the digest the build recorded alongside the archive. The
// install verifies the bytes before extracting, so an archive can never be
Expand Down Expand Up @@ -491,7 +490,7 @@ export const parseWslRuntimeRoot = (stdout: string): string | null => {

const NODE_PTY_PREBUILD_MISSING_EXIT_CODE = 4;

export const formatNodePtyProbeFailureReason = (exitCode: number): string | null =>
const formatNodePtyProbeFailureReason = (exitCode: number): string | null =>
exitCode === NODE_PTY_PREBUILD_MISSING_EXIT_CODE
? "WSL support is missing from this T3 Code build: the packaged Linux node-pty binary was not included. Rebuild the Windows artifact with `--wsl-prebuild <path-to-linux-pty.node>` or install a build that includes WSL support."
: null;
Expand Down
32 changes: 3 additions & 29 deletions apps/desktop/src/wsl/wslPathParsing.test.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
import { describe, it, expect } from "vite-plus/test";

import {
DISTRO_NAME_PATTERN,
extractDistroFromUncPath,
isValidDistroName,
parseWslDistroList,
resolveWslHomeUncPath,
resolveWslPickFolderDefaultPath,
wslUncPathToLinuxPath,
} from "./wslPathParsing.ts";
Expand Down Expand Up @@ -116,29 +114,6 @@ describe("wslUncPathToLinuxPath", () => {
});
});

describe("resolveWslHomeUncPath", () => {
const distros = [
{ name: "Debian", isDefault: true, version: 2 as const },
{ name: "Ubuntu", isDefault: false, version: 2 as const },
];

it("uses the configured distro when one is selected", () => {
expect(resolveWslHomeUncPath({ distro: "Ubuntu" }, distros)).toBe(
"\\\\wsl.localhost\\Ubuntu\\home",
);
});

it("uses the actual default distro when config uses the WSL default", () => {
expect(resolveWslHomeUncPath({ distro: null }, distros)).toBe(
"\\\\wsl.localhost\\Debian\\home",
);
});

it("omits the default path when no default distro is known", () => {
expect(resolveWslHomeUncPath({ distro: null }, [])).toBeNull();
});
});

describe("resolveWslPickFolderDefaultPath", () => {
const config = { distro: null };
const distros = [{ name: "Debian", isDefault: true, version: 2 as const }];
Expand Down Expand Up @@ -184,23 +159,22 @@ describe("resolveWslPickFolderDefaultPath", () => {
});
});

describe("DISTRO_NAME_PATTERN / isValidDistroName", () => {
describe("isValidDistroName", () => {
it("accepts common distro names", () => {
for (const name of ["Ubuntu", "Ubuntu-22.04", "kali-linux", "Debian", "Ubuntu 22.04"]) {
expect(DISTRO_NAME_PATTERN.test(name)).toBe(true);
expect(isValidDistroName(name)).toBe(true);
}
});

it("rejects names with trailing whitespace, hyphen, or dot", () => {
for (const name of ["Ubuntu ", "Ubuntu-", "Ubuntu."]) {
expect(DISTRO_NAME_PATTERN.test(name)).toBe(false);
expect(isValidDistroName(name)).toBe(false);
}
});

it("rejects names containing control or shell-meta characters", () => {
for (const name of ["bad\nname", "bad\tname", "bad/name", "bad!name", "bad;name"]) {
expect(DISTRO_NAME_PATTERN.test(name)).toBe(false);
expect(isValidDistroName(name)).toBe(false);
}
});
});
7 changes: 2 additions & 5 deletions apps/desktop/src/wsl/wslPathParsing.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export interface WslConfig {

// Literal space — \s would also match \n/\t/\r and corrupt UNC paths like \\wsl.localhost\<distro>\...
// Trailing char must also be \w so hand-edited config like "Ubuntu " / "Ubuntu-" / "Ubuntu." rejects.
export const DISTRO_NAME_PATTERN = /^\w(?:[\w \-.]*\w)?$/;
const DISTRO_NAME_PATTERN = /^\w(?:[\w \-.]*\w)?$/;

export function parseWslDistroList(stdout: Buffer): readonly WslDistro[] {
const hasUtf16Bom = stdout.length >= 2 && stdout[0] === 0xff && stdout[1] === 0xfe;
Expand Down Expand Up @@ -61,10 +61,7 @@ export function wslUncPathToLinuxPath(windowsPath: string): string | null {
return `/${rest.split("\\").filter(Boolean).join("/")}`;
}

export function resolveWslHomeUncPath(
config: WslConfig,
distros: readonly WslDistro[],
): string | null {
function resolveWslHomeUncPath(config: WslConfig, distros: readonly WslDistro[]): string | null {
const distroName = config.distro ?? distros.find((distro) => distro.isDefault)?.name ?? null;
return distroName ? `\\\\wsl.localhost\\${distroName}\\home` : null;
}
Expand Down
1 change: 1 addition & 0 deletions apps/marketing/astro.config.mjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { defineConfig } from "astro/config";

export default defineConfig({
site: "https://t3.codes",
server: {
port: Number(process.env.PORT ?? 4173),
},
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added apps/marketing/public/95/providers/codex-320.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added apps/marketing/public/95/providers/codex-640.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added apps/marketing/public/95/providers/grok-320.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added apps/marketing/public/95/providers/grok-960.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading