diff --git a/apps/mobile/modules/t3-terminal/ios/T3TerminalView.swift b/apps/mobile/modules/t3-terminal/ios/T3TerminalView.swift index 262cc8a8a74d75660871f97a7672d6a3c6f6b8eb..69f8a6d4af162a8692674fe1286d9b5420bb4aac 100644 --- a/apps/mobile/modules/t3-terminal/ios/T3TerminalView.swift +++ b/apps/mobile/modules/t3-terminal/ios/T3TerminalView.swift @@ -410,6 +410,7 @@ public final class T3TerminalView: ExpoView, UITextFieldDelegate { return false } + emitInput("\u{7F}") return false } diff --git a/apps/server/src/sourceControl/ForgejoCli.ts b/apps/server/src/sourceControl/ForgejoCli.ts index 9fdb4149c8b61ba39d0c2f593a8c548a3c3597fb..0eacba0759cff9e8c354ab7e39182977254339c8 100644 --- a/apps/server/src/sourceControl/ForgejoCli.ts +++ b/apps/server/src/sourceControl/ForgejoCli.ts @@ -366,25 +366,6 @@ export const make = Effect.gen(function* () { .execute(request) .pipe(Effect.provideService(FetchHttpClient.RequestInit, { redirect: "manual" })); const status = response.status; - if (status < 200 || status >= 300) - return yield* new ForgejoCliError({ - command: "fj", - cwd: input.cwd, - httpStatus: status, - ...(status === 401 - ? { reason: "authentication" as const } - : status === 403 - ? { reason: "forbidden" as const } - : status === 404 - ? { reason: "not-found" as const } - : status === 429 - ? { reason: "rate-limit" as const } - : {}), - detail: - status === 404 - ? "Forgejo repository or pull request was not found." - : `Forgejo API request failed (HTTP ${status}). Check this server's fj credentials and permissions.`, - }); const body = status === 204 || status === 205 ? { text: "", truncated: false, invalidUtf8: false } @@ -399,6 +380,29 @@ export const make = Effect.gen(function* () { reason: "invalid-response", detail: "Forgejo returned an oversized or invalid response.", }); + if (status < 200 || status >= 300) { + const detail = + status === 404 + ? "Forgejo repository or pull request was not found." + : body.text + ? `Forgejo API request failed (HTTP ${status}): ${body.text}` + : `Forgejo API request failed (HTTP ${status}). Check this server's fj credentials and permissions.`; + return yield* new ForgejoCliError({ + command: "fj", + cwd: input.cwd, + httpStatus: status, + ...(status === 401 + ? { reason: "authentication" as const } + : status === 403 + ? { reason: "forbidden" as const } + : status === 404 + ? { reason: "not-found" as const } + : status === 429 + ? { reason: "rate-limit" as const } + : {}), + detail, + }); + } return { exitCode: ChildProcessSpawner.ExitCode(0), stdout: body.text, diff --git a/apps/web/src/components/chat/ModelPickerSidebar.tsx b/apps/web/src/components/chat/ModelPickerSidebar.tsx index 30f9e3ce809b34a3d2944d5628823e0ee3841da3..19a542d2aa2fea624d26c7278c27ba5c7434e0c6 100644 --- a/apps/web/src/components/chat/ModelPickerSidebar.tsx +++ b/apps/web/src/components/chat/ModelPickerSidebar.tsx @@ -203,7 +203,7 @@ export const ModelPickerSidebar = memo(function ModelPickerSidebar(props: { displayName={entry.displayName} accentColor={entry.accentColor} showBadge={showInstanceBadge} - className="size-6" + className="size-6 z-30" iconClassName="size-5" indicatorBackground={ isHovered && !isDisabled diff --git a/apps/web/src/components/chat/ProviderInstanceIcon.tsx b/apps/web/src/components/chat/ProviderInstanceIcon.tsx index 4a40ed15bcb32237b86559b8c0cdd37ecb8000f8..b9f7853cd8ec975dcb971b516c9e4ad8406df900 100644 --- a/apps/web/src/components/chat/ProviderInstanceIcon.tsx +++ b/apps/web/src/components/chat/ProviderInstanceIcon.tsx @@ -29,7 +29,7 @@ export const ProviderInstanceIcon = memo(function ProviderInstanceIcon(props: { return ( {props.triggerLabel ?? triggerTitle} - {props.triggerLabel ?? triggerLabel} + {triggerTooltipContent} {selectedModel?.isUnavailable && props.triggerLabel === undefined ? ( diff --git a/apps/web/src/components/ui/dialog-styles.ts b/apps/web/src/components/ui/dialog-styles.ts index 4dda3fe9392411a7fd5538064f3f5d532d464c31..f2eeae928e995987680b7f8fe7c266a8b3b01a0f 100644 --- a/apps/web/src/components/ui/dialog-styles.ts +++ b/apps/web/src/components/ui/dialog-styles.ts @@ -5,7 +5,7 @@ const DIALOG_BACKDROP_CLASS = `dialog-backdrop ${DIALOG_BACKDROP_BASE_CLASS}`; const DIALOG_MEDIA_BACKDROP_CLASS = `${DIALOG_BACKDROP_BASE_CLASS} bg-black/75 backdrop-blur-none`; const DIALOG_POPUP_BASE_CLASS = - "-translate-y-[calc(1.25rem*var(--nested-dialogs))] relative flex min-h-0 w-full min-w-0 scale-[calc(1-0.1*var(--nested-dialogs))] flex-col opacity-[calc(1-0.1*var(--nested-dialogs))] outline-none transition-[scale,opacity,translate] duration-200 ease-in-out will-change-transform data-nested:data-ending-style:translate-y-8 data-nested:data-starting-style:translate-y-8 data-nested-dialog-open:origin-top data-ending-style:scale-98 data-starting-style:scale-98 data-ending-style:opacity-0 data-starting-style:opacity-0"; + "-translate-y-[calc(1.25rem*var(--nested-dialogs))] relative flex min-h-0 w-full min-w-0 scale-[calc(1-0.1*var(--nested-dialogs))] flex-col opacity-[calc(1-0.1*var(--nested-dialogs))] outline-none transition-[scale,opacity,translate] duration-200 ease-in-out will-change-transform data-nested:data-ending-style:translate-y-8 data-nested:data-starting-style:translate-y-8 data-nested-dialog-open:origin-top data-ending-style:scale-98 data-starting-style:scale-98 data-ending-style:opacity-0 data-starting-style:opacity-0 [-webkit-app-region:no-drag]"; const DIALOG_POPUP_CLASS = `dialog-glass ${DIALOG_POPUP_BASE_CLASS} rounded-2xl border`; const DIALOG_MEDIA_POPUP_CLASS = `${DIALOG_POPUP_BASE_CLASS} max-h-[92vh] w-auto max-w-[92vw] overflow-visible rounded-none border border-transparent bg-transparent p-0 shadow-none`;