}
diff --git a/apps/webapp/app/routes/login._index/route.tsx b/apps/webapp/app/routes/login._index/route.tsx
index 9c7df4f9128..ca418e2d7f8 100644
--- a/apps/webapp/app/routes/login._index/route.tsx
+++ b/apps/webapp/app/routes/login._index/route.tsx
@@ -204,7 +204,11 @@ export default function LoginPage() {
{data.lastAuthMethod === "email" && }
= {
},
domain_policy: {
heading: "SSO required",
- body:
- "Trigger.dev couldn't send a magic link because your organization requires single sign-on. Continue to your identity provider.",
+ body: "Trigger.dev couldn't send a magic link because your organization requires single sign-on. Continue to your identity provider.",
},
oauth_blocked: {
heading: "SSO required",
- body:
- "You can't use that provider to sign in — your organization requires SSO. Continue with your identity provider.",
+ body: "You can't use that provider to sign in — your organization requires SSO. Continue with your identity provider.",
},
expired: {
heading: "Login attempt timed out",
@@ -84,7 +82,9 @@ export async function loader({ request }: LoaderFunctionArgs) {
reason,
email,
redirectTo,
- errorMessage: errorCode ? (ERROR_MESSAGES[errorCode] ?? "We couldn't complete sign-in. Try again.") : null,
+ errorMessage: errorCode
+ ? (ERROR_MESSAGES[errorCode] ?? "We couldn't complete sign-in. Try again.")
+ : null,
});
}
diff --git a/apps/webapp/app/routes/magic.tsx b/apps/webapp/app/routes/magic.tsx
index c309f27dbc6..eccd889f1bd 100644
--- a/apps/webapp/app/routes/magic.tsx
+++ b/apps/webapp/app/routes/magic.tsx
@@ -38,9 +38,7 @@ export async function loader({ request }: LoaderFunctionArgs) {
const session = await getSession(request.headers.get("cookie"));
session.flash("auth:error", {
message:
- thrown instanceof Error
- ? thrown.message
- : "Your magic link is invalid or has expired.",
+ thrown instanceof Error ? thrown.message : "Your magic link is invalid or has expired.",
});
return redirect("/login/magic", {
headers: { "Set-Cookie": await commitSession(session) },
diff --git a/apps/webapp/app/routes/otel.v1.metrics.ts b/apps/webapp/app/routes/otel.v1.metrics.ts
index 803dc3da260..a73442ff513 100644
--- a/apps/webapp/app/routes/otel.v1.metrics.ts
+++ b/apps/webapp/app/routes/otel.v1.metrics.ts
@@ -13,9 +13,7 @@ export async function action({ request }: ActionFunctionArgs) {
const exporter = await otlpExporter;
const body = await request.json();
- const exportResponse = await exporter.exportMetrics(
- body as ExportMetricsServiceRequest
- );
+ const exportResponse = await exporter.exportMetrics(body as ExportMetricsServiceRequest);
return json(exportResponse, { status: 200 });
} else if (contentType.startsWith("application/x-protobuf")) {
diff --git a/apps/webapp/app/routes/realtime.v1.batches.$batchId.ts b/apps/webapp/app/routes/realtime.v1.batches.$batchId.ts
index add50434d48..07906292d4d 100644
--- a/apps/webapp/app/routes/realtime.v1.batches.$batchId.ts
+++ b/apps/webapp/app/routes/realtime.v1.batches.$batchId.ts
@@ -25,11 +25,7 @@ export const loader = createLoaderApiRoute(
action: "read",
// See sibling note in api.v1.batches.$batchId.ts — `{type: "runs"}`
// preserves pre-RBAC `read:runs` superScope access for batch reads.
- resource: (batch) =>
- anyResource([
- { type: "batch", id: batch.friendlyId },
- { type: "runs" },
- ]),
+ resource: (batch) => anyResource([{ type: "batch", id: batch.friendlyId }, { type: "runs" }]),
},
},
async ({ authentication, request, resource: batchRun, apiVersion }) => {
diff --git a/apps/webapp/app/routes/realtime.v1.runs.$runId.ts b/apps/webapp/app/routes/realtime.v1.runs.$runId.ts
index f2268989bdd..297190bc443 100644
--- a/apps/webapp/app/routes/realtime.v1.runs.$runId.ts
+++ b/apps/webapp/app/routes/realtime.v1.runs.$runId.ts
@@ -3,10 +3,7 @@ import { z } from "zod";
import { $replica } from "~/db.server";
import { getRequestAbortSignal } from "~/services/httpAsyncStorage.server";
import { resolveRealtimeStreamClient } from "~/services/realtime/resolveRealtimeStreamClient.server";
-import {
- anyResource,
- createLoaderApiRoute,
-} from "~/services/routeBuilders/apiBuilder.server";
+import { anyResource, createLoaderApiRoute } from "~/services/routeBuilders/apiBuilder.server";
import { runStore } from "~/v3/runStore.server";
const ParamsSchema = z.object({
diff --git a/apps/webapp/app/routes/realtime.v1.runs.ts b/apps/webapp/app/routes/realtime.v1.runs.ts
index 2e3617800fe..c0600b392bb 100644
--- a/apps/webapp/app/routes/realtime.v1.runs.ts
+++ b/apps/webapp/app/routes/realtime.v1.runs.ts
@@ -1,10 +1,7 @@
import { z } from "zod";
import { getRequestAbortSignal } from "~/services/httpAsyncStorage.server";
import { resolveRealtimeStreamClient } from "~/services/realtime/resolveRealtimeStreamClient.server";
-import {
- anyResource,
- createLoaderApiRoute,
-} from "~/services/routeBuilders/apiBuilder.server";
+import { anyResource, createLoaderApiRoute } from "~/services/routeBuilders/apiBuilder.server";
const SearchParamsSchema = z.object({
tags: z
diff --git a/apps/webapp/app/routes/realtime.v1.sessions.$session.$io.append.ts b/apps/webapp/app/routes/realtime.v1.sessions.$session.$io.append.ts
index 0bdcceb7146..ddd4ab4ac54 100644
--- a/apps/webapp/app/routes/realtime.v1.sessions.$session.$io.append.ts
+++ b/apps/webapp/app/routes/realtime.v1.sessions.$session.$io.append.ts
@@ -15,10 +15,7 @@ import {
drainSessionStreamWaitpoints,
releaseSessionStreamPart,
} from "~/services/sessionStreamWaitpointCache.server";
-import {
- anyResource,
- createActionApiRoute,
-} from "~/services/routeBuilders/apiBuilder.server";
+import { anyResource, createActionApiRoute } from "~/services/routeBuilders/apiBuilder.server";
import { engine } from "~/v3/runEngine.server";
import { ServiceValidationError } from "~/v3/services/common.server";
@@ -82,17 +79,11 @@ const { action, loader } = createActionApiRoute(
}
if (session.closedAt) {
- return json(
- { ok: false, error: "Cannot append to a closed session" },
- { status: 400 }
- );
+ return json({ ok: false, error: "Cannot append to a closed session" }, { status: 400 });
}
if (session.expiresAt && session.expiresAt.getTime() < Date.now()) {
- return json(
- { ok: false, error: "Cannot append to an expired session" },
- { status: 400 }
- );
+ return json({ ok: false, error: "Cannot append to an expired session" }, { status: 400 });
}
// `.out` is the agent→client channel. Only PRIVATE (secret key) auth —
diff --git a/apps/webapp/app/routes/realtime.v1.sessions.$session.$io.ts b/apps/webapp/app/routes/realtime.v1.sessions.$session.$io.ts
index ab646217509..e846e851be8 100644
--- a/apps/webapp/app/routes/realtime.v1.sessions.$session.$io.ts
+++ b/apps/webapp/app/routes/realtime.v1.sessions.$session.$io.ts
@@ -98,10 +98,7 @@ const loader = createLoaderApiRoute(
allowJWT: true,
corsStrategy: "all",
findResource: async (params, auth) => {
- const row = await resolveSessionWithWriterFallback(
- auth.environment.id,
- params.session
- );
+ const row = await resolveSessionWithWriterFallback(auth.environment.id, params.session);
if (!row && isSessionFriendlyIdForm(params.session)) {
return undefined; // 404 — opaque friendlyId must reference a real row
}
diff --git a/apps/webapp/app/routes/realtime.v1.streams.$runId.$streamId.ts b/apps/webapp/app/routes/realtime.v1.streams.$runId.$streamId.ts
index 81784f9bc3a..19e56e5e0aa 100644
--- a/apps/webapp/app/routes/realtime.v1.streams.$runId.$streamId.ts
+++ b/apps/webapp/app/routes/realtime.v1.streams.$runId.$streamId.ts
@@ -3,10 +3,7 @@ import { z } from "zod";
import { $replica } from "~/db.server";
import { getRequestAbortSignal } from "~/services/httpAsyncStorage.server";
import { getRealtimeStreamInstance } from "~/services/realtime/v1StreamsGlobal.server";
-import {
- anyResource,
- createLoaderApiRoute,
-} from "~/services/routeBuilders/apiBuilder.server";
+import { anyResource, createLoaderApiRoute } from "~/services/routeBuilders/apiBuilder.server";
import { AuthenticatedEnvironment } from "~/services/apiAuth.server";
import { runStore } from "~/v3/runStore.server";
@@ -155,9 +152,15 @@ export const loader = createLoaderApiRoute(
{ run }
);
- return realtimeStream.streamResponse(request, run.friendlyId, params.streamId, getRequestAbortSignal(), {
- lastEventId,
- timeoutInSeconds,
- });
+ return realtimeStream.streamResponse(
+ request,
+ run.friendlyId,
+ params.streamId,
+ getRequestAbortSignal(),
+ {
+ lastEventId,
+ timeoutInSeconds,
+ }
+ );
}
);
diff --git a/apps/webapp/app/routes/realtime.v1.streams.$runId.$target.$streamId.append.ts b/apps/webapp/app/routes/realtime.v1.streams.$runId.$target.$streamId.append.ts
index 7cb813a6dec..12400e8d0b0 100644
--- a/apps/webapp/app/routes/realtime.v1.streams.$runId.$target.$streamId.append.ts
+++ b/apps/webapp/app/routes/realtime.v1.streams.$runId.$target.$streamId.append.ts
@@ -59,8 +59,8 @@ const { action } = createActionApiRoute(
params.target === "self"
? run.friendlyId
: params.target === "parent"
- ? run.parentTaskRun?.friendlyId
- : run.rootTaskRun?.friendlyId;
+ ? run.parentTaskRun?.friendlyId
+ : run.rootTaskRun?.friendlyId;
if (!targetId) {
return new Response("Target not found", { status: 404 });
diff --git a/apps/webapp/app/routes/realtime.v1.streams.$runId.$target.$streamId.ts b/apps/webapp/app/routes/realtime.v1.streams.$runId.$target.$streamId.ts
index c71ad48d121..01a2b550d45 100644
--- a/apps/webapp/app/routes/realtime.v1.streams.$runId.$target.$streamId.ts
+++ b/apps/webapp/app/routes/realtime.v1.streams.$runId.$target.$streamId.ts
@@ -54,8 +54,8 @@ const { action } = createActionApiRoute(
params.target === "self"
? run
: params.target === "parent"
- ? run.parentTaskRun
- : run.rootTaskRun;
+ ? run.parentTaskRun
+ : run.rootTaskRun;
if (!targetRun?.friendlyId) {
return new Response("Target not found", { status: 404 });
@@ -191,8 +191,8 @@ const loader = createLoaderApiRoute(
params.target === "self"
? run
: params.target === "parent"
- ? run.parentTaskRun
- : run.rootTaskRun;
+ ? run.parentTaskRun
+ : run.rootTaskRun;
if (!targetRun?.friendlyId) {
return new Response("Target not found", { status: 404 });
@@ -209,11 +209,9 @@ const loader = createLoaderApiRoute(
const clientId = request.headers.get("X-Client-Id") || "default";
const streamVersion = request.headers.get("X-Stream-Version") || "v1";
- const realtimeStream = getRealtimeStreamInstance(
- authentication.environment,
- streamVersion,
- { run: { streamBasinName: targetRun.streamBasinName ?? null } }
- );
+ const realtimeStream = getRealtimeStreamInstance(authentication.environment, streamVersion, {
+ run: { streamBasinName: targetRun.streamBasinName ?? null },
+ });
const lastChunkIndex = await realtimeStream.getLastChunkIndex(
targetId,
diff --git a/apps/webapp/app/routes/resources.account.mfa.setup/useMfaSetup.ts b/apps/webapp/app/routes/resources.account.mfa.setup/useMfaSetup.ts
index 0a69d44617f..8e1aad9ae1e 100644
--- a/apps/webapp/app/routes/resources.account.mfa.setup/useMfaSetup.ts
+++ b/apps/webapp/app/routes/resources.account.mfa.setup/useMfaSetup.ts
@@ -2,7 +2,7 @@ import { useReducer, useEffect } from "react";
import { useTypedFetcher } from "remix-typedjson";
import { action } from "./route";
-export type MfaPhase = 'idle' | 'enabling' | 'validating' | 'showing-recovery' | 'disabling';
+export type MfaPhase = "idle" | "enabling" | "validating" | "showing-recovery" | "disabling";
export interface MfaState {
phase: MfaPhase;
@@ -14,150 +14,150 @@ export interface MfaState {
recoveryCodes?: string[];
error?: string;
isSubmitting: boolean;
- disableMethod: 'totp' | 'recovery';
+ disableMethod: "totp" | "recovery";
}
-export type MfaAction =
- | { type: 'ENABLE_MFA' }
- | { type: 'SETUP_DATA_RECEIVED'; setupData: { secret: string; otpAuthUrl: string } }
- | { type: 'CANCEL_SETUP' }
- | { type: 'VALIDATE_TOTP'; code: string }
- | { type: 'VALIDATION_SUCCESS'; recoveryCodes: string[] }
- | { type: 'VALIDATION_FAILED'; error: string; setupData: { secret: string; otpAuthUrl: string } }
- | { type: 'RECOVERY_CODES_SAVED' }
- | { type: 'OPEN_DISABLE_DIALOG' }
- | { type: 'DISABLE_MFA' }
- | { type: 'DISABLE_SUCCESS' }
- | { type: 'DISABLE_FAILED'; error: string }
- | { type: 'CANCEL_DISABLE' }
- | { type: 'SET_DISABLE_METHOD'; method: 'totp' | 'recovery' }
- | { type: 'SET_ERROR'; error: string }
- | { type: 'CLEAR_ERROR' }
- | { type: 'SET_SUBMITTING'; isSubmitting: boolean };
+export type MfaAction =
+ | { type: "ENABLE_MFA" }
+ | { type: "SETUP_DATA_RECEIVED"; setupData: { secret: string; otpAuthUrl: string } }
+ | { type: "CANCEL_SETUP" }
+ | { type: "VALIDATE_TOTP"; code: string }
+ | { type: "VALIDATION_SUCCESS"; recoveryCodes: string[] }
+ | { type: "VALIDATION_FAILED"; error: string; setupData: { secret: string; otpAuthUrl: string } }
+ | { type: "RECOVERY_CODES_SAVED" }
+ | { type: "OPEN_DISABLE_DIALOG" }
+ | { type: "DISABLE_MFA" }
+ | { type: "DISABLE_SUCCESS" }
+ | { type: "DISABLE_FAILED"; error: string }
+ | { type: "CANCEL_DISABLE" }
+ | { type: "SET_DISABLE_METHOD"; method: "totp" | "recovery" }
+ | { type: "SET_ERROR"; error: string }
+ | { type: "CLEAR_ERROR" }
+ | { type: "SET_SUBMITTING"; isSubmitting: boolean };
function mfaReducer(state: MfaState, action: MfaAction): MfaState {
switch (action.type) {
- case 'ENABLE_MFA':
+ case "ENABLE_MFA":
return {
...state,
- phase: 'enabling',
+ phase: "enabling",
isSubmitting: true,
error: undefined,
};
- case 'SETUP_DATA_RECEIVED':
+ case "SETUP_DATA_RECEIVED":
return {
...state,
- phase: 'enabling',
+ phase: "enabling",
setupData: action.setupData,
error: undefined,
isSubmitting: false,
};
- case 'CANCEL_SETUP':
+ case "CANCEL_SETUP":
return {
...state,
- phase: 'idle',
+ phase: "idle",
setupData: undefined,
error: undefined,
isSubmitting: false,
};
- case 'VALIDATE_TOTP':
+ case "VALIDATE_TOTP":
return {
...state,
- phase: 'validating',
+ phase: "validating",
isSubmitting: true,
error: undefined,
};
- case 'VALIDATION_SUCCESS':
+ case "VALIDATION_SUCCESS":
return {
...state,
- phase: 'showing-recovery',
+ phase: "showing-recovery",
recoveryCodes: action.recoveryCodes,
isSubmitting: false,
isEnabled: true,
error: undefined,
};
- case 'VALIDATION_FAILED':
+ case "VALIDATION_FAILED":
return {
...state,
- phase: 'enabling',
+ phase: "enabling",
setupData: action.setupData,
error: action.error,
isSubmitting: false,
};
- case 'RECOVERY_CODES_SAVED':
+ case "RECOVERY_CODES_SAVED":
return {
...state,
- phase: 'idle',
+ phase: "idle",
setupData: undefined,
recoveryCodes: undefined,
isSubmitting: false,
};
- case 'OPEN_DISABLE_DIALOG':
+ case "OPEN_DISABLE_DIALOG":
return {
...state,
- phase: 'disabling',
+ phase: "disabling",
error: undefined,
isSubmitting: false,
};
- case 'DISABLE_MFA':
+ case "DISABLE_MFA":
return {
...state,
isSubmitting: true,
error: undefined,
};
- case 'DISABLE_SUCCESS':
+ case "DISABLE_SUCCESS":
return {
...state,
- phase: 'idle',
+ phase: "idle",
isEnabled: false,
error: undefined,
isSubmitting: false,
};
- case 'DISABLE_FAILED':
+ case "DISABLE_FAILED":
return {
...state,
error: action.error,
isSubmitting: false,
};
- case 'CANCEL_DISABLE':
+ case "CANCEL_DISABLE":
return {
...state,
- phase: 'idle',
+ phase: "idle",
error: undefined,
isSubmitting: false,
};
- case 'SET_DISABLE_METHOD':
+ case "SET_DISABLE_METHOD":
return {
...state,
disableMethod: action.method,
error: undefined,
};
- case 'SET_ERROR':
+ case "SET_ERROR":
return {
...state,
error: action.error,
};
- case 'CLEAR_ERROR':
+ case "CLEAR_ERROR":
return {
...state,
error: undefined,
};
- case 'SET_SUBMITTING':
+ case "SET_SUBMITTING":
return {
...state,
isSubmitting: action.isSubmitting,
@@ -170,55 +170,55 @@ function mfaReducer(state: MfaState, action: MfaAction): MfaState {
export function useMfaSetup(initialIsEnabled: boolean) {
const fetcher = useTypedFetcher();
-
+
const [state, dispatch] = useReducer(mfaReducer, {
- phase: 'idle',
+ phase: "idle",
isEnabled: initialIsEnabled,
isSubmitting: false,
- disableMethod: 'totp',
+ disableMethod: "totp",
});
// Handle fetcher responses
useEffect(() => {
if (fetcher.data) {
const { data } = fetcher;
-
+
switch (data.action) {
- case 'enable-mfa':
- dispatch({
- type: 'SETUP_DATA_RECEIVED',
- setupData: { secret: data.secret, otpAuthUrl: data.otpAuthUrl }
+ case "enable-mfa":
+ dispatch({
+ type: "SETUP_DATA_RECEIVED",
+ setupData: { secret: data.secret, otpAuthUrl: data.otpAuthUrl },
});
break;
-
- case 'validate-totp':
+
+ case "validate-totp":
if (data.success) {
- dispatch({
- type: 'VALIDATION_SUCCESS',
- recoveryCodes: data.recoveryCodes || []
+ dispatch({
+ type: "VALIDATION_SUCCESS",
+ recoveryCodes: data.recoveryCodes || [],
});
} else {
- dispatch({
- type: 'VALIDATION_FAILED',
- error: data.error || 'Invalid code',
- setupData: { secret: data.secret!, otpAuthUrl: data.otpAuthUrl! }
+ dispatch({
+ type: "VALIDATION_FAILED",
+ error: data.error || "Invalid code",
+ setupData: { secret: data.secret!, otpAuthUrl: data.otpAuthUrl! },
});
}
break;
-
- case 'disable-mfa':
+
+ case "disable-mfa":
if (data.success) {
- dispatch({ type: 'DISABLE_SUCCESS' });
+ dispatch({ type: "DISABLE_SUCCESS" });
} else {
- dispatch({
- type: 'DISABLE_FAILED',
- error: data.error || 'Failed to disable MFA'
+ dispatch({
+ type: "DISABLE_FAILED",
+ error: data.error || "Failed to disable MFA",
});
}
break;
-
- case 'cancel-totp':
- dispatch({ type: 'CANCEL_SETUP' });
+
+ case "cancel-totp":
+ dispatch({ type: "CANCEL_SETUP" });
break;
}
}
@@ -226,68 +226,65 @@ export function useMfaSetup(initialIsEnabled: boolean) {
// Handle submitting state
useEffect(() => {
- dispatch({ type: 'SET_SUBMITTING', isSubmitting: fetcher.state === 'submitting' });
+ dispatch({ type: "SET_SUBMITTING", isSubmitting: fetcher.state === "submitting" });
}, [fetcher.state]);
const actions = {
enableMfa: () => {
- dispatch({ type: 'ENABLE_MFA' });
+ dispatch({ type: "ENABLE_MFA" });
fetcher.submit(
- { action: 'enable-mfa' },
- { method: 'POST', action: '/resources/account/mfa/setup' }
+ { action: "enable-mfa" },
+ { method: "POST", action: "/resources/account/mfa/setup" }
);
},
cancelSetup: () => {
- dispatch({ type: 'CANCEL_SETUP' });
+ dispatch({ type: "CANCEL_SETUP" });
fetcher.submit(
- { action: 'cancel-totp' },
- { method: 'POST', action: '/resources/account/mfa/setup' }
+ { action: "cancel-totp" },
+ { method: "POST", action: "/resources/account/mfa/setup" }
);
},
validateTotp: (code: string) => {
- dispatch({ type: 'VALIDATE_TOTP', code });
+ dispatch({ type: "VALIDATE_TOTP", code });
fetcher.submit(
- { action: 'validate-totp', totpCode: code },
- { method: 'POST', action: '/resources/account/mfa/setup' }
+ { action: "validate-totp", totpCode: code },
+ { method: "POST", action: "/resources/account/mfa/setup" }
);
},
saveRecoveryCodes: () => {
- dispatch({ type: 'RECOVERY_CODES_SAVED' });
+ dispatch({ type: "RECOVERY_CODES_SAVED" });
fetcher.submit(
- { action: 'saved-recovery-codes' },
- { method: 'POST', action: '/resources/account/mfa/setup' }
+ { action: "saved-recovery-codes" },
+ { method: "POST", action: "/resources/account/mfa/setup" }
);
},
openDisableDialog: () => {
- dispatch({ type: 'OPEN_DISABLE_DIALOG' });
+ dispatch({ type: "OPEN_DISABLE_DIALOG" });
},
disableMfa: (totpCode?: string, recoveryCode?: string) => {
- dispatch({ type: 'DISABLE_MFA' });
- const formData: Record = { action: 'disable-mfa' };
+ dispatch({ type: "DISABLE_MFA" });
+ const formData: Record = { action: "disable-mfa" };
if (totpCode) formData.totpCode = totpCode;
if (recoveryCode) formData.recoveryCode = recoveryCode;
-
- fetcher.submit(
- formData,
- { method: 'POST', action: '/resources/account/mfa/setup' }
- );
+
+ fetcher.submit(formData, { method: "POST", action: "/resources/account/mfa/setup" });
},
cancelDisable: () => {
- dispatch({ type: 'CANCEL_DISABLE' });
+ dispatch({ type: "CANCEL_DISABLE" });
},
- setDisableMethod: (method: 'totp' | 'recovery') => {
- dispatch({ type: 'SET_DISABLE_METHOD', method });
+ setDisableMethod: (method: "totp" | "recovery") => {
+ dispatch({ type: "SET_DISABLE_METHOD", method });
},
clearError: () => {
- dispatch({ type: 'CLEAR_ERROR' });
+ dispatch({ type: "CLEAR_ERROR" });
},
};
@@ -295,8 +292,10 @@ export function useMfaSetup(initialIsEnabled: boolean) {
state,
actions,
// Computed properties for easier access
- isQrDialogOpen: (state.phase === 'enabling' && !!state.setupData) || (state.phase === 'showing-recovery' && !!state.recoveryCodes),
+ isQrDialogOpen:
+ (state.phase === "enabling" && !!state.setupData) ||
+ (state.phase === "showing-recovery" && !!state.recoveryCodes),
isRecoveryDialogOpen: false, // Recovery is now handled within the setup dialog
- isDisableDialogOpen: state.phase === 'disabling',
+ isDisableDialogOpen: state.phase === "disabling",
};
-}
\ No newline at end of file
+}
diff --git a/apps/webapp/app/routes/resources.branches.archive.tsx b/apps/webapp/app/routes/resources.branches.archive.tsx
index 3b7f178da16..105a21644f7 100644
--- a/apps/webapp/app/routes/resources.branches.archive.tsx
+++ b/apps/webapp/app/routes/resources.branches.archive.tsx
@@ -46,8 +46,8 @@ export async function action({ request }: ActionFunctionArgs) {
if (result.success) {
return redirectWithSuccessMessage(
- result.branch.type === "DEVELOPMENT" ?
- branchesDevPath(result.organization, result.project, result.branch)
+ result.branch.type === "DEVELOPMENT"
+ ? branchesDevPath(result.organization, result.project, result.branch)
: branchesPath(result.organization, result.project, result.branch),
request,
`Branch "${result.branch.branchName}" archived`
diff --git a/apps/webapp/app/routes/resources.feedback.ts b/apps/webapp/app/routes/resources.feedback.ts
index 62b13b518b3..3a7e5bd34b5 100644
--- a/apps/webapp/app/routes/resources.feedback.ts
+++ b/apps/webapp/app/routes/resources.feedback.ts
@@ -49,10 +49,7 @@ export const feedbackTypes = {
labelTypeId: "lt_01KS54WBRYKE6DY369KPK2SS4W",
threadTitle: "Web app: HIPAA BAA request",
},
-} as const satisfies Record<
- string,
- { label: string; labelTypeId?: string; threadTitle: string }
->;
+} as const satisfies Record;
export type FeedbackType = keyof typeof feedbackTypes;
diff --git a/apps/webapp/app/routes/resources.orgs.$organizationSlug.can-view-logs-page/route.tsx b/apps/webapp/app/routes/resources.orgs.$organizationSlug.can-view-logs-page/route.tsx
index f55307c7c34..501b4a8ad35 100644
--- a/apps/webapp/app/routes/resources.orgs.$organizationSlug.can-view-logs-page/route.tsx
+++ b/apps/webapp/app/routes/resources.orgs.$organizationSlug.can-view-logs-page/route.tsx
@@ -42,12 +42,10 @@ export const loader = async ({ request, params }: LoaderFunctionArgs) => {
const user = await requireUser(request);
const { organizationSlug } = OrganizationParamsSchema.parse(params);
- const canViewLogsPage = user.admin || user.isImpersonating || await hasLogsPageAccess(
- user.id,
- user.admin,
- user.isImpersonating,
- organizationSlug
- );
+ const canViewLogsPage =
+ user.admin ||
+ user.isImpersonating ||
+ (await hasLogsPageAccess(user.id, user.admin, user.isImpersonating, organizationSlug));
return typedjson({ canViewLogsPage });
};
diff --git a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboard-agent.ts b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboard-agent.ts
index 66f5aae80c1..c2a4bf59ffe 100644
--- a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboard-agent.ts
+++ b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboard-agent.ts
@@ -55,7 +55,14 @@ export const loader = async ({ request, params }: LoaderFunctionArgs) => {
const userId = user.id;
const { organizationSlug, projectParam } = EnvironmentParamSchema.parse(params);
- if (!(await canAccessDashboardAgent({ userId, isAdmin: user.admin, isImpersonating: user.isImpersonating, organizationSlug }))) {
+ if (
+ !(await canAccessDashboardAgent({
+ userId,
+ isAdmin: user.admin,
+ isImpersonating: user.isImpersonating,
+ organizationSlug,
+ }))
+ ) {
return json({ error: "Not found" }, { status: 404 });
}
@@ -83,7 +90,14 @@ export const action = async ({ request, params }: ActionFunctionArgs) => {
const userId = user.id;
const { organizationSlug, projectParam, envParam } = EnvironmentParamSchema.parse(params);
- if (!(await canAccessDashboardAgent({ userId, isAdmin: user.admin, isImpersonating: user.isImpersonating, organizationSlug }))) {
+ if (
+ !(await canAccessDashboardAgent({
+ userId,
+ isAdmin: user.admin,
+ isImpersonating: user.isImpersonating,
+ organizationSlug,
+ }))
+ ) {
return json({ error: "Not found" }, { status: 404 });
}
@@ -186,7 +200,13 @@ export const action = async ({ request, params }: ActionFunctionArgs) => {
// id). The transport falls back here to re-establish a session for an
// existing chat (e.g. after its token expired), so verify ownership before
// issuing one — a client-supplied chatId must belong to the caller.
- if (!(await chatExists(dashboardAgentDb, { chatId, userId, organizationId: project.organizationId }))) {
+ if (
+ !(await chatExists(dashboardAgentDb, {
+ chatId,
+ userId,
+ organizationId: project.organizationId,
+ }))
+ ) {
return json({ error: "Chat not found" }, { status: 404 });
}
let clientData: Record | undefined;
@@ -215,7 +235,13 @@ export const action = async ({ request, params }: ActionFunctionArgs) => {
}
// Only mint a session token for a chat the caller owns, so a client-supplied
// chatId can't be used to get a token for someone else's session.
- if (!(await chatExists(dashboardAgentDb, { chatId, userId, organizationId: project.organizationId }))) {
+ if (
+ !(await chatExists(dashboardAgentDb, {
+ chatId,
+ userId,
+ organizationId: project.organizationId,
+ }))
+ ) {
return json({ error: "Chat not found" }, { status: 404 });
}
return json({ token: await mintDashboardAgentToken(chatId) });
diff --git a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.$dashboardId.widgets.tsx b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.$dashboardId.widgets.tsx
index 51bbded5932..ee3f56147df 100644
--- a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.$dashboardId.widgets.tsx
+++ b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.$dashboardId.widgets.tsx
@@ -6,10 +6,7 @@ import { prisma } from "~/db.server";
import { QueryWidgetConfig } from "~/components/metrics/QueryWidget";
import { findProjectBySlug } from "~/models/project.server";
import { findEnvironmentBySlug } from "~/models/runtimeEnvironment.server";
-import {
- DashboardLayout,
- LayoutItem,
-} from "~/presenters/v3/MetricDashboardPresenter.server";
+import { DashboardLayout, LayoutItem } from "~/presenters/v3/MetricDashboardPresenter.server";
import { getCurrentPlan } from "~/services/platform.v3.server";
import { requireUserId } from "~/services/session.server";
import { EnvironmentParamSchema } from "~/utils/pathBuilder";
@@ -145,10 +142,9 @@ async function saveDashboardLayout(
});
if (result.count === 0) {
- throw new Response(
- "Dashboard was modified by another request. Please refresh and try again.",
- { status: 409 }
- );
+ throw new Response("Dashboard was modified by another request. Please refresh and try again.", {
+ status: 409,
+ });
}
}
diff --git a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.create.tsx b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.create.tsx
index 1e33b3b6817..ef5ed4fa1e5 100644
--- a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.create.tsx
+++ b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.dashboards.create.tsx
@@ -29,8 +29,7 @@ export const action = async ({ request, params }: ActionFunctionArgs) => {
}),
]);
- const metricDashboardsLimitValue = (plan?.v3Subscription?.plan?.limits as any)
- ?.metricDashboards;
+ const metricDashboardsLimitValue = (plan?.v3Subscription?.plan?.limits as any)?.metricDashboards;
const dashboardLimit =
typeof metricDashboardsLimitValue === "number"
? metricDashboardsLimitValue
diff --git a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.logs.$logId.tsx b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.logs.$logId.tsx
index be4fdba7fe8..418cee805c1 100644
--- a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.logs.$logId.tsx
+++ b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.logs.$logId.tsx
@@ -44,7 +44,10 @@ export const loader = async ({ request, params }: LoaderFunctionArgs) => {
const [traceId, spanId, , startTime] = parts;
- const logsClickhouse = await clickhouseFactory.getClickhouseForOrganization(project.organizationId, "logs");
+ const logsClickhouse = await clickhouseFactory.getClickhouseForOrganization(
+ project.organizationId,
+ "logs"
+ );
const presenter = new LogDetailPresenter($replica, logsClickhouse);
let result;
diff --git a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.logs.ts b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.logs.ts
index 38b7dd390f8..8e918ec5f2f 100644
--- a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.logs.ts
+++ b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.logs.ts
@@ -4,7 +4,11 @@ import { requireUser, requireUserId } from "~/services/session.server";
import { EnvironmentParamSchema } from "~/utils/pathBuilder";
import { findProjectBySlug } from "~/models/project.server";
import { findEnvironmentBySlug } from "~/models/runtimeEnvironment.server";
-import { LogsListPresenter, type LogLevel, LogsListOptionsSchema } from "~/presenters/v3/LogsListPresenter.server";
+import {
+ LogsListPresenter,
+ type LogLevel,
+ LogsListOptionsSchema,
+} from "~/presenters/v3/LogsListPresenter.server";
import { $replica } from "~/db.server";
import { clickhouseFactory } from "~/services/clickhouse/clickhouseFactoryInstance.server";
import { getCurrentPlan } from "~/services/platform.v3.server";
@@ -69,7 +73,10 @@ export const loader = async ({ request, params }: LoaderFunctionArgs) => {
retentionLimitDays,
}) as any; // Validated by LogsListOptionsSchema at runtime
- const logsClickhouse = await clickhouseFactory.getClickhouseForOrganization(project.organizationId, "logs");
+ const logsClickhouse = await clickhouseFactory.getClickhouseForOrganization(
+ project.organizationId,
+ "logs"
+ );
const presenter = new LogsListPresenter($replica, logsClickhouse);
const result = await presenter.call(project.organizationId, environment.id, options);
diff --git a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.playground.action.tsx b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.playground.action.tsx
index 826618277af..9485f5ff4c6 100644
--- a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.playground.action.tsx
+++ b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.playground.action.tsx
@@ -117,7 +117,12 @@ export const action = async ({ request, params }: ActionFunctionArgs) => {
const tags = [
`chat:${chatId}`,
"playground:true",
- ...(tagsStr ? tagsStr.split(",").map((t) => t.trim()).filter(Boolean) : []),
+ ...(tagsStr
+ ? tagsStr
+ .split(",")
+ .map((t) => t.trim())
+ .filter(Boolean)
+ : []),
].slice(0, 5);
const triggerConfig = {
@@ -262,12 +267,11 @@ export const action = async ({ request, params }: ActionFunctionArgs) => {
});
if (existing?.title === "New conversation") {
- const firstUserMsg = messagesData.find(
- (m: any) => m.role === "user"
- ) as Record | undefined;
+ const firstUserMsg = messagesData.find((m: any) => m.role === "user") as
+ | Record
+ | undefined;
const firstText =
- firstUserMsg?.parts?.find((p: any) => p.type === "text")?.text ??
- firstUserMsg?.content;
+ firstUserMsg?.parts?.find((p: any) => p.type === "text")?.text ?? firstUserMsg?.content;
if (firstText && typeof firstText === "string") {
titleUpdate = {
title: firstText.length > 60 ? firstText.slice(0, 60) + "..." : firstText,
diff --git a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.playground.realtime.v1.sessions.$session.$io.append.ts b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.playground.realtime.v1.sessions.$session.$io.append.ts
index 038e053a8b0..0d158659314 100644
--- a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.playground.realtime.v1.sessions.$session.$io.append.ts
+++ b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.playground.realtime.v1.sessions.$session.$io.append.ts
@@ -56,27 +56,17 @@ export async function action({ request, params }: ActionFunctionArgs) {
return json({ ok: false, error: "Request body too large" }, { status: 413 });
}
- const session = await resolveSessionByIdOrExternalId(
- $replica,
- environment.id,
- sessionParam
- );
+ const session = await resolveSessionByIdOrExternalId($replica, environment.id, sessionParam);
if (!session) {
return json({ ok: false, error: "Session not found" }, { status: 404 });
}
if (session.closedAt) {
- return json(
- { ok: false, error: "Cannot append to a closed session" },
- { status: 400 }
- );
+ return json({ ok: false, error: "Cannot append to a closed session" }, { status: 400 });
}
if (session.expiresAt && session.expiresAt.getTime() < Date.now()) {
- return json(
- { ok: false, error: "Cannot append to an expired session" },
- { status: 400 }
- );
+ return json({ ok: false, error: "Cannot append to an expired session" }, { status: 400 });
}
const realtimeStream = getRealtimeStreamInstance(environment, "v2", { session });
@@ -117,10 +107,7 @@ export async function action({ request, params }: ActionFunctionArgs) {
if (appendError) {
if (appendError instanceof ServiceValidationError) {
- return json(
- { ok: false, error: appendError.message },
- { status: appendError.status ?? 422 }
- );
+ return json({ ok: false, error: appendError.message }, { status: appendError.status ?? 422 });
}
return json({ ok: false, error: appendError.message }, { status: 500 });
}
diff --git a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.playground.realtime.v1.sessions.$session.$io.ts b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.playground.realtime.v1.sessions.$session.$io.ts
index e54bfe35755..317bd38a7d0 100644
--- a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.playground.realtime.v1.sessions.$session.$io.ts
+++ b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.playground.realtime.v1.sessions.$session.$io.ts
@@ -41,11 +41,7 @@ export async function loader({ request, params }: LoaderFunctionArgs) {
return new Response("Environment not found", { status: 404 });
}
- const session = await resolveSessionByIdOrExternalId(
- $replica,
- environment.id,
- sessionParam
- );
+ const session = await resolveSessionByIdOrExternalId($replica, environment.id, sessionParam);
if (!session) {
return new Response("Session not found", { status: 404 });
diff --git a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.prompts.$promptSlug.generations.ts b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.prompts.$promptSlug.generations.ts
index e468438cdc1..98975140323 100644
--- a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.prompts.$promptSlug.generations.ts
+++ b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.prompts.$promptSlug.generations.ts
@@ -22,8 +22,9 @@ export type GenerationsResponse = {
export const loader = async ({ request, params }: LoaderFunctionArgs) => {
const userId = await requireUserId(request);
- const { projectParam, organizationSlug, envParam, promptSlug } =
- EnvironmentParamSchema.extend({ promptSlug: z.string() }).parse(params);
+ const { projectParam, organizationSlug, envParam, promptSlug } = EnvironmentParamSchema.extend({
+ promptSlug: z.string(),
+ }).parse(params);
const project = await findProjectBySlug(organizationSlug, projectParam, userId);
if (!project) throw new Response("Project not found", { status: 404 });
@@ -59,7 +60,10 @@ export const loader = async ({ request, params }: LoaderFunctionArgs) => {
const operations = url.searchParams.getAll("operations").filter(Boolean);
const providers = url.searchParams.getAll("providers").filter(Boolean);
- const clickhouse = await clickhouseFactory.getClickhouseForOrganization(project.organizationId, "standard");
+ const clickhouse = await clickhouseFactory.getClickhouseForOrganization(
+ project.organizationId,
+ "standard"
+ );
const presenter = new PromptPresenter(clickhouse);
const result = await presenter.listGenerations({
environmentId: environment.id,
diff --git a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.realtime.v1.sessions.$sessionId.$io.ts b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.realtime.v1.sessions.$sessionId.$io.ts
index 3a0dfca568e..c001d66d509 100644
--- a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.realtime.v1.sessions.$sessionId.$io.ts
+++ b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.realtime.v1.sessions.$sessionId.$io.ts
@@ -66,11 +66,7 @@ export async function loader({ request, params }: LoaderFunctionArgs) {
return new Response("Run not found", { status: 404 });
}
- const session = await resolveSessionByIdOrExternalId(
- $replica,
- environment.id,
- sessionId
- );
+ const session = await resolveSessionByIdOrExternalId($replica, environment.id, sessionId);
if (!session) {
return new Response("Session not found", { status: 404 });
diff --git a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.realtime.v1.streams.$runId.$streamId.ts b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.realtime.v1.streams.$runId.$streamId.ts
index cec6c3c4e98..6c50b0f1463 100644
--- a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.realtime.v1.streams.$runId.$streamId.ts
+++ b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.realtime.v1.streams.$runId.$streamId.ts
@@ -82,14 +82,8 @@ export async function loader({ request, params }: LoaderFunctionArgs) {
// `request.signal` is severed by Remix's Request.clone() + Node undici GC bug
// (see apps/webapp/CLAUDE.md). Use the Express res.on('close')-backed signal so
// the upstream stream fetch actually aborts when the user closes the tab.
- return realtimeStream.streamResponse(
- request,
- run.friendlyId,
- streamId,
- getRequestAbortSignal(),
- {
- lastEventId,
- timeoutInSeconds,
- }
- );
+ return realtimeStream.streamResponse(request, run.friendlyId, streamId, getRequestAbortSignal(), {
+ lastEventId,
+ timeoutInSeconds,
+ });
}
diff --git a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.spans.$spanParam/route.tsx b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.spans.$spanParam/route.tsx
index d6d39ebbb95..450b9c69662 100644
--- a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.spans.$spanParam/route.tsx
+++ b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.spans.$spanParam/route.tsx
@@ -397,10 +397,7 @@ function RunBody({
className="size-5 min-h-5 min-w-5"
/>
{run.taskIdentifier}
@@ -1315,10 +1312,10 @@ function SpanEntity({ span }: { span: Span }) {
span.isCancelled
? "CANCELED"
: span.isError
- ? "FAILED"
- : span.isPartial
- ? "EXECUTING"
- : "COMPLETED"
+ ? "FAILED"
+ : span.isPartial
+ ? "EXECUTING"
+ : "COMPLETED"
}
className="text-sm"
/>
@@ -1430,10 +1427,10 @@ function SpanEntity({ span }: { span: Span }) {
span.isCancelled
? "CANCELED"
: span.isError
- ? "FAILED"
- : span.isPartial
- ? "EXECUTING"
- : "COMPLETED"
+ ? "FAILED"
+ : span.isPartial
+ ? "EXECUTING"
+ : "COMPLETED"
}
className="text-sm"
/>
@@ -1508,8 +1505,8 @@ function SpanEntity({ span }: { span: Span }) {
typeof span.properties === "string"
? span.properties
: span.properties != null
- ? JSON.stringify(span.properties, null, 2)
- : undefined
+ ? JSON.stringify(span.properties, null, 2)
+ : undefined
}
startTime={span.startTime}
duration={span.duration}
diff --git a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.streams.$streamKey/route.tsx b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.streams.$streamKey/route.tsx
index 24e7a73374f..ee5eda4c3a6 100644
--- a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.streams.$streamKey/route.tsx
+++ b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.streams.$streamKey/route.tsx
@@ -95,9 +95,15 @@ export const loader = async ({ request, params }: LoaderFunctionArgs) => {
{ run }
);
- return realtimeStream.streamResponse(request, run.friendlyId, streamKey, getRequestAbortSignal(), {
- lastEventId,
- });
+ return realtimeStream.streamResponse(
+ request,
+ run.friendlyId,
+ streamKey,
+ getRequestAbortSignal(),
+ {
+ lastEventId,
+ }
+ );
};
export function RealtimeStreamViewer({
@@ -338,8 +344,8 @@ export function RealtimeStreamViewer({
chunks.length === 0
? "cursor-not-allowed opacity-50"
: copied
- ? "text-success hover:cursor-pointer"
- : "text-text-dimmed hover:cursor-pointer hover:text-text-bright"
+ ? "text-success hover:cursor-pointer"
+ : "text-text-dimmed hover:cursor-pointer hover:text-text-bright"
)}
>
{copied ? (
diff --git a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.live.ts b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.live.ts
index 616aa728872..44def23a85e 100644
--- a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.live.ts
+++ b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.live.ts
@@ -23,8 +23,7 @@ export async function loader({ request, params }: LoaderFunctionArgs) {
Object.fromEntries(url.searchParams)
);
- const newRunsSince =
- includeNewRuns && since !== undefined ? since : undefined;
+ const newRunsSince = includeNewRuns && since !== undefined ? since : undefined;
if (runIds.length === 0 && newRunsSince === undefined) {
return { runs: [] };
diff --git a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.schedules.new/route.tsx b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.schedules.new/route.tsx
index 1f7a2add413..157462a86d5 100644
--- a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.schedules.new/route.tsx
+++ b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.schedules.new/route.tsx
@@ -241,8 +241,8 @@ export function UpsertScheduleForm({
{schedule?.friendlyId
? "Edit schedule"
: defaultTaskIdentifier
- ? `New schedule for ${defaultTaskIdentifier}`
- : "New schedule"}
+ ? `New schedule for ${defaultTaskIdentifier}`
+ : "New schedule"}
diff --git a/apps/webapp/app/routes/resources.orgs.$organizationSlug.schedules-addon.ts b/apps/webapp/app/routes/resources.orgs.$organizationSlug.schedules-addon.ts
index f765da3534c..8f09c6e4e16 100644
--- a/apps/webapp/app/routes/resources.orgs.$organizationSlug.schedules-addon.ts
+++ b/apps/webapp/app/routes/resources.orgs.$organizationSlug.schedules-addon.ts
@@ -14,10 +14,7 @@ export const PurchaseSchema = z.discriminatedUnion("action", [
}),
z.object({
action: z.literal("quota-increase"),
- amount: z.coerce
- .number()
- .int("Must be a whole number")
- .min(1, "Amount must be greater than 0"),
+ amount: z.coerce.number().int("Must be a whole number").min(1, "Amount must be greater than 0"),
}),
]);
@@ -44,10 +41,9 @@ export async function action({ request, params }: ActionFunctionArgs) {
);
}
if (purchaseBlockReason === "managed_billing") {
- return json(
- { ok: false, error: "Contact us to request more schedules." } as const,
- { status: 403 }
- );
+ return json({ ok: false, error: "Contact us to request more schedules." } as const, {
+ status: 403,
+ });
}
const formData = await request.formData();
diff --git a/apps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsx b/apps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsx
index 08dcad356c9..b87c1bfc4c1 100644
--- a/apps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsx
+++ b/apps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsx
@@ -531,10 +531,10 @@ export function TierFree({
{subscription?.plan === undefined
? "Select plan"
: subscription.plan.type === "free"
- ? "Current plan"
- : subscription.canceledAt !== undefined
- ? "Current plan"
- : "Select plan"}
+ ? "Current plan"
+ : subscription.canceledAt !== undefined
+ ? "Current plan"
+ : "Select plan"}
)}
@@ -657,10 +657,10 @@ export function TierHobby({
{subscription?.plan === undefined
? "Select plan"
: subscription.plan.type === "free" || subscription.canceledAt !== undefined
- ? `Upgrade to ${plan.title}`
- : subscription.plan.code === plan.code
- ? "Current plan"
- : `Upgrade to ${plan.title}`}
+ ? `Upgrade to ${plan.title}`
+ : subscription.plan.code === plan.code
+ ? "Current plan"
+ : `Upgrade to ${plan.title}`}
)}
@@ -802,10 +802,10 @@ export function TierPro({
{subscription?.plan === undefined
? "Select plan"
: subscription.plan.type === "free" || subscription.canceledAt !== undefined
- ? `Upgrade to ${plan.title}`
- : subscription.plan.code === plan.code
- ? "Current plan"
- : `Upgrade to ${plan.title}`}
+ ? `Upgrade to ${plan.title}`
+ : subscription.plan.code === plan.code
+ ? "Current plan"
+ : `Upgrade to ${plan.title}`}
)}
diff --git a/apps/webapp/app/routes/resources.preferences.sidemenu.tsx b/apps/webapp/app/routes/resources.preferences.sidemenu.tsx
index 13f442aa610..94db448b581 100644
--- a/apps/webapp/app/routes/resources.preferences.sidemenu.tsx
+++ b/apps/webapp/app/routes/resources.preferences.sidemenu.tsx
@@ -4,10 +4,7 @@ import {
SideMenuSectionIdSchema,
type SideMenuSectionId,
} from "~/components/navigation/sideMenuTypes";
-import {
- updateItemOrder,
- updateSideMenuPreferences,
-} from "~/services/dashboardPreferences.server";
+import { updateItemOrder, updateSideMenuPreferences } from "~/services/dashboardPreferences.server";
import { requireUser } from "~/services/session.server";
// Transforms form data string "true"/"false" to boolean, or undefined if not present
diff --git a/apps/webapp/app/routes/resources.runs.$runParam.logs.download.ts b/apps/webapp/app/routes/resources.runs.$runParam.logs.download.ts
index 7662a88b4d2..6b514034294 100644
--- a/apps/webapp/app/routes/resources.runs.$runParam.logs.download.ts
+++ b/apps/webapp/app/routes/resources.runs.$runParam.logs.download.ts
@@ -83,10 +83,7 @@ export async function loader({ params, request }: LoaderFunctionArgs) {
return new Response("Not found", { status: 404 });
}
- const eventRepository = await getEventRepositoryForStore(
- run.taskEventStore,
- run.organizationId
- );
+ const eventRepository = await getEventRepositoryForStore(run.taskEventStore, run.organizationId);
// Stream the trace straight from the store to the gzip response, one event at
// a time, never materialising the full set or building a tree. This keeps the
diff --git a/apps/webapp/app/routes/resources.runs.$runParam.ts b/apps/webapp/app/routes/resources.runs.$runParam.ts
index 38e17531f6f..e85da45bbde 100644
--- a/apps/webapp/app/routes/resources.runs.$runParam.ts
+++ b/apps/webapp/app/routes/resources.runs.$runParam.ts
@@ -144,17 +144,17 @@ export const loader = async ({ request, params }: LoaderFunctionArgs) => {
finishedAttempt === null
? undefined
: finishedAttempt.outputType === "application/store"
- ? `/resources/packets/${run.runtimeEnvironment.id}/${finishedAttempt.output}`
- : typeof finishedAttempt.output !== "undefined" && finishedAttempt.output !== null
- ? await prettyPrintPacket(finishedAttempt.output, finishedAttempt.outputType ?? undefined)
- : undefined;
+ ? `/resources/packets/${run.runtimeEnvironment.id}/${finishedAttempt.output}`
+ : typeof finishedAttempt.output !== "undefined" && finishedAttempt.output !== null
+ ? await prettyPrintPacket(finishedAttempt.output, finishedAttempt.outputType ?? undefined)
+ : undefined;
const payload =
run.payloadType === "application/store"
? `/resources/packets/${run.runtimeEnvironment.id}/${run.payload}`
: typeof run.payload !== "undefined" && run.payload !== null
- ? await prettyPrintPacket(run.payload, run.payloadType ?? undefined)
- : undefined;
+ ? await prettyPrintPacket(run.payload, run.payloadType ?? undefined)
+ : undefined;
let error: TaskRunError | undefined = undefined;
if (finishedAttempt?.error) {
diff --git a/apps/webapp/app/routes/resources.sessions.$sessionParam.close.ts b/apps/webapp/app/routes/resources.sessions.$sessionParam.close.ts
index 27ffec56716..afc26a06e3b 100644
--- a/apps/webapp/app/routes/resources.sessions.$sessionParam.close.ts
+++ b/apps/webapp/app/routes/resources.sessions.$sessionParam.close.ts
@@ -49,11 +49,7 @@ export const action: ActionFunction = async ({ request, params }) => {
return json(submission);
}
- const session = await resolveSessionByIdOrExternalId(
- $replica,
- environment.id,
- sessionParam
- );
+ const session = await resolveSessionByIdOrExternalId($replica, environment.id, sessionParam);
if (!session) {
submission.error = { sessionParam: ["Session not found"] };
diff --git a/apps/webapp/app/routes/resources.taskruns.$runParam.replay.ts b/apps/webapp/app/routes/resources.taskruns.$runParam.replay.ts
index 49c2dbcf783..a068f6fa7e0 100644
--- a/apps/webapp/app/routes/resources.taskruns.$runParam.replay.ts
+++ b/apps/webapp/app/routes/resources.taskruns.$runParam.replay.ts
@@ -224,7 +224,7 @@ export async function loader({ request, params }: LoaderFunctionArgs) {
? undefined
: regionForDisplay(run.region, run.workerQueue),
regions: regionsResult.regions,
- ttlSeconds: run.ttl ? parseDuration(run.ttl, "s") ?? undefined : undefined,
+ ttlSeconds: run.ttl ? (parseDuration(run.ttl, "s") ?? undefined) : undefined,
idempotencyKey: run.idempotencyKey,
runTags: run.runTags,
payload,
diff --git a/apps/webapp/app/routes/storybook.agent-ui/route.tsx b/apps/webapp/app/routes/storybook.agent-ui/route.tsx
index 0bd205fa608..e43015a361c 100644
--- a/apps/webapp/app/routes/storybook.agent-ui/route.tsx
+++ b/apps/webapp/app/routes/storybook.agent-ui/route.tsx
@@ -34,7 +34,8 @@ const fullDiagnosis: DiagnosisBlock = {
reference: "error_emptyorder",
},
],
- impact: "14 runs of process-order failed with this error in the last 24 hours, all in production.",
+ impact:
+ "14 runs of process-order failed with this error in the last 24 hours, all in production.",
nextSteps: [
"Guard against an empty items array at the top of processOrder and return early.",
"Validate the payload before triggering so empty orders never reach the task.",
@@ -54,7 +55,11 @@ const externalServiceDiagnosis: DiagnosisBlock = {
"The Stripe call has no timeout or retry, so a slow upstream response runs past the task's max duration.",
confidence: "medium",
evidence: [
- { type: "error", detail: "TimeoutError: Stripe API timed out after 30s", reference: "run_f6g7h8i9j0" },
+ {
+ type: "error",
+ detail: "TimeoutError: Stripe API timed out after 30s",
+ reference: "run_f6g7h8i9j0",
+ },
{ type: "deploy", detail: "First seen on version 20260620.2", reference: "20260620.2" },
],
impact: "Intermittent: 3 of the last 50 charge-payment runs timed out.",
@@ -68,7 +73,8 @@ const externalServiceDiagnosis: DiagnosisBlock = {
const lowConfidenceDiagnosis: DiagnosisBlock = {
type: "diagnosis",
runId: "run_k1l2m3n4o5",
- summary: "The run crashed without a captured error, so the cause isn't conclusive from the available signals.",
+ summary:
+ "The run crashed without a captured error, so the cause isn't conclusive from the available signals.",
category: "unknown",
likelyCause:
"The container exited without writing an error. This is consistent with an out-of-memory kill, but there's no OOM signal in the trace to confirm it.",
diff --git a/apps/webapp/app/routes/storybook.animated-panel/route.tsx b/apps/webapp/app/routes/storybook.animated-panel/route.tsx
index 2f136bddb19..f30be72b622 100644
--- a/apps/webapp/app/routes/storybook.animated-panel/route.tsx
+++ b/apps/webapp/app/routes/storybook.animated-panel/route.tsx
@@ -30,16 +30,76 @@ type DemoItem = {
};
const demoItems: DemoItem[] = [
- { id: "run_a1b2c3d4", name: "Process invoices", status: "completed", duration: "2.3s", task: "invoice/process" },
- { id: "run_e5f6g7h8", name: "Send welcome email", status: "running", duration: "0.8s", task: "email/welcome" },
- { id: "run_i9j0k1l2", name: "Generate report", status: "failed", duration: "12.1s", task: "report/generate" },
- { id: "run_m3n4o5p6", name: "Sync inventory", status: "completed", duration: "5.7s", task: "inventory/sync" },
- { id: "run_q7r8s9t0", name: "Resize images", status: "queued", duration: "—", task: "image/resize" },
- { id: "run_u1v2w3x4", name: "Update search index", status: "completed", duration: "1.1s", task: "search/index" },
- { id: "run_y5z6a7b8", name: "Calculate analytics", status: "running", duration: "8.4s", task: "analytics/calc" },
- { id: "run_c9d0e1f2", name: "Deploy preview", status: "completed", duration: "34.2s", task: "deploy/preview" },
- { id: "run_g3h4i5j6", name: "Run migrations", status: "failed", duration: "0.3s", task: "db/migrate" },
- { id: "run_k7l8m9n0", name: "Notify Slack", status: "completed", duration: "0.5s", task: "notify/slack" },
+ {
+ id: "run_a1b2c3d4",
+ name: "Process invoices",
+ status: "completed",
+ duration: "2.3s",
+ task: "invoice/process",
+ },
+ {
+ id: "run_e5f6g7h8",
+ name: "Send welcome email",
+ status: "running",
+ duration: "0.8s",
+ task: "email/welcome",
+ },
+ {
+ id: "run_i9j0k1l2",
+ name: "Generate report",
+ status: "failed",
+ duration: "12.1s",
+ task: "report/generate",
+ },
+ {
+ id: "run_m3n4o5p6",
+ name: "Sync inventory",
+ status: "completed",
+ duration: "5.7s",
+ task: "inventory/sync",
+ },
+ {
+ id: "run_q7r8s9t0",
+ name: "Resize images",
+ status: "queued",
+ duration: "—",
+ task: "image/resize",
+ },
+ {
+ id: "run_u1v2w3x4",
+ name: "Update search index",
+ status: "completed",
+ duration: "1.1s",
+ task: "search/index",
+ },
+ {
+ id: "run_y5z6a7b8",
+ name: "Calculate analytics",
+ status: "running",
+ duration: "8.4s",
+ task: "analytics/calc",
+ },
+ {
+ id: "run_c9d0e1f2",
+ name: "Deploy preview",
+ status: "completed",
+ duration: "34.2s",
+ task: "deploy/preview",
+ },
+ {
+ id: "run_g3h4i5j6",
+ name: "Run migrations",
+ status: "failed",
+ duration: "0.3s",
+ task: "db/migrate",
+ },
+ {
+ id: "run_k7l8m9n0",
+ name: "Notify Slack",
+ status: "completed",
+ duration: "0.5s",
+ task: "notify/slack",
+ },
];
const statusColors: Record
= {
@@ -144,10 +204,7 @@ export default function Story() {
-