authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-09-05 22:07:28-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-09-05 22:07:28-07:00
logfdcc491e0b36245d4b4c74d1fd338d874f4ec84f
tree204f8807306e212bfaff5f3641c06c4daca6754a
parentb2e15185aee22bfdee78806f2734b0a4de9c2c77
signature Signed by PGP key B5690EEEBB952194

refactor(web): remove unused runtime wrappers and exports (#10225)


21 files changed, 15 insertions(+), 187 deletions(-)

apps/web/src/assets/assetUrls.ts-8
......@@ -32,14 +32,6 @@ export function useAssetUrlState(
3232 );
3333}
3434
35export function useAssetUrl(
36 environmentId: EnvironmentId | null,
37 resource: AssetResource | null,
38): string | null {
39 const result = useAssetUrlState(environmentId, resource);
40 return result._tag === "Success" ? result.url : null;
41}
42
4335export function useAssetUrlRefresh(
4436 environmentId: EnvironmentId | null,
4537 resource: AssetResource | null,
apps/web/src/assets/projectFaviconCache.ts+1-1
......@@ -46,7 +46,7 @@ async function withStore<A>(
4646}
4747
4848/** Rasterizes a bitmap that is too large to inline, retrying at half size. */
49export async function downscaleProjectFavicon(
49async function downscaleProjectFavicon(
5050 image: { readonly mimeType: string; readonly bytes: Uint8Array<ArrayBuffer> },
5151 signal: AbortSignal,
5252) {
apps/web/src/cloud/connectCliAuth.ts+1-1
......@@ -12,7 +12,7 @@ import { hasCloudPublicConfig, resolveCloudPublicConfig, trimNonEmpty } from "./
1212
1313const CONNECT_CLI_AUTH_STATE_STORAGE_KEY = "t3code-connect-cli-auth-state";
1414
15export function resolveConnectCliOAuthClientId(): string | null {
15function resolveConnectCliOAuthClientId(): string | null {
1616 return trimNonEmpty(import.meta.env.VITE_CLERK_CLI_OAUTH_CLIENT_ID as string | undefined);
1717}
1818
apps/web/src/cloud/managedRelayLayer.ts+1-1
......@@ -13,7 +13,7 @@ import {
1313 type BrowserDpopKey,
1414} from "./dpop";
1515
16export const relayDpopSignerLayer = Layer.effect(
16const relayDpopSignerLayer = Layer.effect(
1717 ManagedRelay.ManagedRelayDpopSigner,
1818 Effect.gen(function* () {
1919 const crypto = yield* Crypto.Crypto;
apps/web/src/cloud/managedRelayState.ts+1-8
......@@ -33,7 +33,7 @@ const managedRelayAtomRuntime = Atom.runtime(
3333 ),
3434);
3535
36export const managedRelayQueryManager = createManagedRelayQueryManager(managedRelayAtomRuntime);
36const managedRelayQueryManager = createManagedRelayQueryManager(managedRelayAtomRuntime);
3737
3838const managedRelayMutationScheduler = createAtomCommandScheduler();
3939
......@@ -114,10 +114,3 @@ export function useManagedRelayDevices() {
114114 refresh,
115115 };
116116}
117
118export function refreshManagedRelayEnvironments(): void {
119 const session = appAtomRegistry.get(managedRelaySessionAtom);
120 if (session) {
121 managedRelayQueryManager.refreshEnvironments(appAtomRegistry, session.accountId);
122 }
123}
apps/web/src/cloud/primaryCloudLinkState.ts+1-1
......@@ -42,7 +42,7 @@ function targetKey(target: CloudLinkTarget): string {
4242 return JSON.stringify(target);
4343}
4444
45export function refreshPrimaryCloudLinkState(target: CloudLinkTarget | null): void {
45function refreshPrimaryCloudLinkState(target: CloudLinkTarget | null): void {
4646 if (target) {
4747 appAtomRegistry.refresh(primaryCloudLinkStateAtom(targetKey(target)));
4848 }
apps/web/src/connection/desktopLocal.ts+1-1
......@@ -17,7 +17,7 @@ import {
1717 * via {@link isDesktopLocalConnectionTarget}, so the convention can never drift
1818 * between the two.
1919 */
20export const DESKTOP_LOCAL_CONNECTION_ID_PREFIX = "local:";
20const DESKTOP_LOCAL_CONNECTION_ID_PREFIX = "local:";
2121
2222export function desktopLocalConnectionId(backendId: string): string {
2323 return `${DESKTOP_LOCAL_CONNECTION_ID_PREFIX}${backendId}`;
apps/web/src/environments/primary/auth.ts+1-90
......@@ -9,7 +9,6 @@ import type {
99} from "@t3tools/contracts";
1010import { EnvironmentHttpCommonError, PRIMARY_LOCAL_ENVIRONMENT_ID } from "@t3tools/contracts";
1111import type { EnvironmentHttpCommonError as EnvironmentHttpCommonErrorType } from "@t3tools/contracts";
12import * as DateTime from "effect/DateTime";
1312import * as Effect from "effect/Effect";
1413import * as Schema from "effect/Schema";
1514import { HttpClientError } from "effect/unstable/http";
......@@ -66,7 +65,7 @@ export class PrimaryEnvironmentRequestError extends Schema.TaggedErrorClass<Prim
6665 }
6766}
6867
69export const isPrimaryEnvironmentRequestError = Schema.is(PrimaryEnvironmentRequestError);
68const isPrimaryEnvironmentRequestError = Schema.is(PrimaryEnvironmentRequestError);
7069
7170export class PrimaryEnvironmentPairingCredentialRejectedError extends Schema.TaggedErrorClass<PrimaryEnvironmentPairingCredentialRejectedError>()(
7271 "PrimaryEnvironmentPairingCredentialRejectedError",
......@@ -96,10 +95,6 @@ export class PrimaryEnvironmentAuthSessionTimeoutError extends Schema.TaggedErro
9695 }
9796}
9897
99export const isPrimaryEnvironmentAuthSessionTimeoutError = Schema.is(
100 PrimaryEnvironmentAuthSessionTimeoutError,
101);
102
10398export class PrimaryEnvironmentPairingCredentialRequiredError extends Schema.TaggedErrorClass<PrimaryEnvironmentPairingCredentialRequiredError>()(
10499 "PrimaryEnvironmentPairingCredentialRequiredError",
105100 {
......@@ -111,10 +106,6 @@ export class PrimaryEnvironmentPairingCredentialRequiredError extends Schema.Tag
111106 }
112107}
113108
114export const isPrimaryEnvironmentPairingCredentialRequiredError = Schema.is(
115 PrimaryEnvironmentPairingCredentialRequiredError,
116);
117
118109const isEnvironmentHttpCommonError = Schema.is(EnvironmentHttpCommonError);
119110
120111export interface ServerPairingLinkRecord {
......@@ -386,44 +377,6 @@ export async function createServerPairingCredential(input?: {
386377 }
387378}
388379
389export async function listServerPairingLinks(): Promise<ReadonlyArray<ServerPairingLinkRecord>> {
390 try {
391 const pairingLinks = await runPrimaryHttp(
392 PrimaryEnvironmentHttpClient.pipe(
393 Effect.flatMap((client) => client.auth.pairingLinks({ headers: {} })),
394 ),
395 );
396 return pairingLinks.map((pairingLink) => {
397 const timestamps = {
398 createdAt: DateTime.formatIso(pairingLink.createdAt),
399 expiresAt: DateTime.formatIso(pairingLink.expiresAt),
400 };
401 if (pairingLink.label === undefined) {
402 return {
403 id: pairingLink.id,
404 scopes: pairingLink.scopes,
405 subject: pairingLink.subject,
406 createdAt: timestamps.createdAt,
407 expiresAt: timestamps.expiresAt,
408 };
409 }
410 return {
411 id: pairingLink.id,
412 scopes: pairingLink.scopes,
413 subject: pairingLink.subject,
414 label: pairingLink.label,
415 createdAt: timestamps.createdAt,
416 expiresAt: timestamps.expiresAt,
417 };
418 });
419 } catch (error) {
420 throw PrimaryEnvironmentRequestError.fromCause({
421 operation: "list-pairing-links",
422 cause: error,
423 });
424 }
425}
426
427380export async function revokeServerPairingLink(id: string): Promise<void> {
428381 try {
429382 await runPrimaryHttp(
......@@ -440,38 +393,6 @@ export async function revokeServerPairingLink(id: string): Promise<void> {
440393 }
441394}
442395
443export async function listServerClientSessions(): Promise<
444 ReadonlyArray<ServerClientSessionRecord>
445> {
446 try {
447 const clientSessions = await runPrimaryHttp(
448 PrimaryEnvironmentHttpClient.pipe(
449 Effect.flatMap((client) => client.auth.clients({ headers: {} })),
450 ),
451 );
452 return clientSessions.map((clientSession) => ({
453 sessionId: clientSession.sessionId,
454 subject: clientSession.subject,
455 scopes: clientSession.scopes,
456 method: clientSession.method,
457 client: clientSession.client,
458 issuedAt: DateTime.formatIso(clientSession.issuedAt),
459 expiresAt: DateTime.formatIso(clientSession.expiresAt),
460 lastConnectedAt:
461 clientSession.lastConnectedAt === null
462 ? null
463 : DateTime.formatIso(clientSession.lastConnectedAt),
464 connected: clientSession.connected,
465 current: clientSession.current,
466 }));
467 } catch (error) {
468 throw PrimaryEnvironmentRequestError.fromCause({
469 operation: "list-client-sessions",
470 cause: error,
471 });
472 }
473}
474
475396export async function revokeServerClientSession(sessionId: AuthSessionId): Promise<void> {
476397 try {
477398 await runPrimaryHttp(
......@@ -531,16 +452,6 @@ export async function resolveInitialServerAuthGateState(): Promise<ServerAuthGat
531452 });
532453}
533454
534// Used by the WSL backend swap: invalidate the cached authenticated state
535// (the new backend signs sessions with a different key) and re-bootstrap
536// against the desktop bootstrap credential so the next WS reconnect doesn't
537// hit 401 and start a reauth loop in the renderer.
538export async function reauthenticatePrimaryEnvironment(): Promise<ServerAuthGateState> {
539 resolvedAuthenticatedGateState = null;
540 bootstrapPromise = null;
541 return resolveInitialServerAuthGateState();
542}
543
544455export function __resetServerAuthBootstrapForTests() {
545456 bootstrapPromise = null;
546457 resolvedAuthenticatedGateState = null;
apps/web/src/environments/primary/context.ts+1-1
......@@ -54,7 +54,7 @@ async function fetchPrimaryEnvironmentDescriptor(): Promise<ExecutionEnvironment
5454 });
5555}
5656
57export function readPrimaryEnvironmentDescriptor(): ExecutionEnvironmentDescriptor | null {
57function readPrimaryEnvironmentDescriptor(): ExecutionEnvironmentDescriptor | null {
5858 return primaryEnvironmentDescriptor;
5959}
6060
apps/web/src/environments/primary/index.ts+1-14
......@@ -1,27 +1,16 @@
11export {
22 getPrimaryKnownEnvironment,
3 readPrimaryEnvironmentDescriptor,
43 resetPrimaryEnvironmentDescriptorForTests,
54 resolveInitialPrimaryEnvironmentDescriptor,
65 writePrimaryEnvironmentDescriptor,
76} from "./context";
87
9export {
10 resolveInitialPrimaryEnvironmentDescriptor as ensurePrimaryEnvironmentReady,
11 writePrimaryEnvironmentDescriptor as updatePrimaryEnvironmentDescriptor,
12} from "./context";
13
148export {
159 createServerPairingCredential,
16 fetchSessionState,
1710 isPrimaryEnvironmentPairingCredentialRejectedError,
18 isPrimaryEnvironmentRequestError,
19 listServerClientSessions,
20 listServerPairingLinks,
2111 peekPairingTokenFromUrl,
2212 PrimaryEnvironmentPairingCredentialRejectedError,
2313 PrimaryEnvironmentRequestError,
24 reauthenticatePrimaryEnvironment,
2514 resolveInitialServerAuthGateState,
2615 revokeOtherServerClientSessions,
2716 revokeServerClientSession,
......@@ -34,9 +23,7 @@ export {
3423 __resetServerAuthBootstrapForTests,
3524} from "./auth";
3625
37export { refreshPrimarySessionState, usePrimarySessionState } from "./sessionState";
38
39export { PrimaryEnvironmentHttpClient } from "./httpClient";
26export { usePrimarySessionState } from "./sessionState";
4027
4128export {
4229 DesktopEnvironmentBootstrapIncompleteError,
apps/web/src/environments/primary/sessionState.ts+1-1
......@@ -14,7 +14,7 @@ const primarySessionStateAtom = Atom.make(Effect.promise(fetchSessionState)).pip
1414 Atom.withLabel("primary-environment:session"),
1515);
1616
17export function refreshPrimarySessionState(): void {
17function refreshPrimarySessionState(): void {
1818 appAtomRegistry.refresh(primarySessionStateAtom);
1919}
2020
apps/web/src/lib/runtime.ts-2
......@@ -31,8 +31,6 @@ type RuntimeLayerSource =
3131 | typeof relayTracingLayer
3232 | ReturnType<typeof managedRelayClientLayer>;
3333
34export const remoteHttpRuntime = ManagedRuntime.make(httpClientLayer);
35
3634const primaryHttpRuntime = ManagedRuntime.make(
3735 PrimaryEnvironmentHttpClient.layer.pipe(Layer.provide(primaryEnvironmentHttpLayer)),
3836);
apps/web/src/observability/clientTracing.ts-9
......@@ -41,15 +41,6 @@ export interface ClientTracingConfig {
4141 readonly exportIntervalMs?: number;
4242}
4343
44export const ClientTracingLive = Layer.succeed(
45 Tracer.Tracer,
46 Tracer.make({
47 span(options) {
48 return activeDelegate?.span(options) ?? new Tracer.NativeSpan(options);
49 },
50 }),
51);
52
5344export function configureClientTracing(config: ClientTracingConfig = {}): Promise<void> {
5445 if (config.exportIntervalMs === undefined && activeConfigKey !== null) {
5546 return pendingConfiguration;
apps/web/src/rpc/requestLatencyState.ts+1-1
......@@ -112,7 +112,7 @@ export function acknowledgeRpcRequest(requestId: string): void {
112112 setSlowRpcAckRequests(slowRequests.filter((request) => request.requestId !== requestId));
113113}
114114
115export function clearAllTrackedRpcRequests(): void {
115function clearAllTrackedRpcRequests(): void {
116116 for (const pending of pendingRpcAckRequests.values()) {
117117 clearTimeout(pending.timeoutId);
118118 }
apps/web/src/rpc/transportError.ts+1-4
......@@ -1,4 +1 @@
1export {
2 isTransportConnectionErrorMessage,
3 sanitizeThreadErrorMessage,
4} from "@t3tools/client-runtime/errors";
1export { sanitizeThreadErrorMessage } from "@t3tools/client-runtime/errors";
apps/web/src/state/entities.ts+1-1
......@@ -39,7 +39,7 @@ const EMPTY_THREAD_STATUS_ATOM = Atom.make<EnvironmentThreadStatus>("empty").pip
3939 Atom.withLabel("web-thread-status:empty"),
4040);
4141
42export const activeEnvironmentIdAtom = Atom.make<EnvironmentId | null>(null).pipe(
42const activeEnvironmentIdAtom = Atom.make<EnvironmentId | null>(null).pipe(
4343 Atom.keepAlive,
4444 Atom.withLabel("web-active-environment-id"),
4545);
apps/web/src/state/environments.ts-5
......@@ -11,7 +11,6 @@ import { useMemo } from "react";
1111import { environmentCatalog } from "../connection/catalog";
1212import { environmentPresentations, useEnvironmentPresentation } from "./presentation";
1313import { primaryEnvironmentIdAtom } from "./primaryEnvironment";
14import { useEnvironmentQuery } from "./query";
1514import { relayEnvironmentDiscovery } from "./relay";
1615import { usePreparedConnection } from "./session";
1716
......@@ -85,7 +84,3 @@ export function useEnvironmentHttpBaseUrl(environmentId: EnvironmentId | null):
8584export function useRelayEnvironmentDiscovery(): Discovery.RelayEnvironmentDiscoveryState {
8685 return useAtomValue(relayEnvironmentDiscovery.stateValueAtom);
8786}
88
89export function useEnvironmentConnectionState(environmentId: EnvironmentId) {
90 return useEnvironmentQuery(environmentCatalog.stateAtom(environmentId));
91}
apps/web/src/state/queries.ts-31
......@@ -14,7 +14,6 @@ import type {
1414 OrchestrationThread,
1515 ProjectContentMatch,
1616 ProjectEntryKind,
17 ThreadId,
1817 VcsListRefsResult,
1918 VcsRef,
2019} from "@t3tools/contracts";
......@@ -28,7 +27,6 @@ import { orchestrationEnvironment } from "./orchestration";
2827import { isPaginatedBranchesNextPagePending } from "./paginatedBranches";
2928import { projectContentSearch, projectEnvironment } from "./projects";
3029import { useEnvironmentQuery } from "./query";
31import { useEnvironmentThread } from "./threads";
3230import { vcsEnvironment } from "./vcs";
3331
3432const PROJECT_PATH_SEARCH_DEBOUNCE_MS = 120;
......@@ -103,35 +101,6 @@ export function useThreadSearch(
103101 };
104102}
105103
106export function useThreadDetail(
107 environmentId: EnvironmentId | null,
108 threadId: ThreadId | null,
109): ThreadDetailView {
110 const state = useEnvironmentThread(environmentId, threadId);
111 return {
112 data: Option.getOrNull(state.data),
113 error: Option.getOrNull(state.error),
114 isPending: state.status === "synchronizing",
115 isDeleted: state.status === "deleted",
116 };
117}
118
119export function useBranches(target: VcsRefTarget) {
120 const query = target.query?.trim() ?? "";
121 return useEnvironmentQuery(
122 target.environmentId !== null && target.cwd !== null
123 ? vcsEnvironment.listRefs({
124 environmentId: target.environmentId,
125 input: {
126 cwd: target.cwd,
127 ...(query.length > 0 ? { query } : {}),
128 limit: VCS_REF_LIST_LIMIT,
129 },
130 })
131 : null,
132 );
133}
134
135104export function usePaginatedBranches(target: VcsRefTarget) {
136105 const query = target.query?.trim() ?? "";
137106 const targetKey =
apps/web/src/state/server.ts+1-1
......@@ -50,7 +50,7 @@ const EMPTY_PRIMARY_SERVER_STATE: PrimaryServerState = {
5050 welcome: null,
5151};
5252
53export const primaryServerStateAtom = Atom.make((get): PrimaryServerState => {
53const primaryServerStateAtom = Atom.make((get): PrimaryServerState => {
5454 const environmentId = get(primaryEnvironmentIdAtom);
5555 if (environmentId === null) {
5656 return EMPTY_PRIMARY_SERVER_STATE;
apps/web/src/state/shell.ts-5
......@@ -4,7 +4,6 @@ import {
44} from "@t3tools/client-runtime/connection";
55import {
66 createEnvironmentShellAtoms,
7 createEnvironmentShellSummaryAtom,
87 createEnvironmentSnapshotAtom,
98 createShellEnvironmentAtoms,
109 type EnvironmentShellState,
......@@ -21,10 +20,6 @@ import { isHostedStaticApp } from "../hostedPairing";
2120export const shellEnvironment = createShellEnvironmentAtoms(connectionAtomRuntime);
2221export const environmentShell = createEnvironmentShellAtoms(connectionAtomRuntime);
2322export const environmentSnapshotAtom = createEnvironmentSnapshotAtom(environmentShell.stateAtom);
24export const environmentShellSummaryAtom = createEnvironmentShellSummaryAtom({
25 catalogValueAtom: environmentCatalog.catalogValueAtom,
26 shellStateValueAtom: environmentShell.stateValueAtom,
27});
2823
2924export const allEnvironmentShellsBootstrappedAtom = Atom.make((get) => {
3025 const catalog = AsyncResult.value(get(environmentCatalog.catalogAtom));
apps/web/src/state/threads.ts+1-1
......@@ -16,7 +16,7 @@ import { connectionAtomRuntime } from "../connection/runtime";
1616import { environmentSnapshotAtom } from "./shell";
1717
1818export const threadEnvironment = createThreadEnvironmentAtoms(connectionAtomRuntime);
19export const environmentThreads = createEnvironmentThreadStateAtoms(connectionAtomRuntime);
19const environmentThreads = createEnvironmentThreadStateAtoms(connectionAtomRuntime);
2020export const environmentThreadDetails = createEnvironmentThreadDetailAtoms(
2121 environmentThreads.stateAtom,
2222);