summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAkinfolami Akin-Alamu <[email protected]>2026-01-06 09:54:49 -0800
committerGitHub <[email protected]>2026-01-06 11:54:49 -0600
commitaa612b27d408f9b661dcbc152a9d3d935e29d084 (patch)
treefb93384aa897aacdad6bbd0f4c9d6de4e0f116ac
parenta35c278424a5d950fb5e13c61fcb3f550b6b0f57 (diff)
downloadopencode-aa612b27d408f9b661dcbc152a9d3d935e29d084.tar.gz
opencode-aa612b27d408f9b661dcbc152a9d3d935e29d084.zip
feat(tui): add 'c' shortcut to copy device code in OAuth flow (#7020)
-rw-r--r--packages/opencode/src/cli/cmd/tui/component/dialog-provider.tsx17
1 files changed, 17 insertions, 0 deletions
diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-provider.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-provider.tsx
index ce2d70f56..72b12d99b 100644
--- a/packages/opencode/src/cli/cmd/tui/component/dialog-provider.tsx
+++ b/packages/opencode/src/cli/cmd/tui/component/dialog-provider.tsx
@@ -10,6 +10,9 @@ import { useTheme } from "../context/theme"
import { TextAttributes } from "@opentui/core"
import type { ProviderAuthAuthorization } from "@opencode-ai/sdk/v2"
import { DialogModel } from "./dialog-model"
+import { useKeyboard } from "@opentui/solid"
+import { Clipboard } from "@tui/util/clipboard"
+import { useToast } from "../ui/toast"
const PROVIDER_PRIORITY: Record<string, number> = {
opencode: 0,
@@ -104,6 +107,17 @@ function AutoMethod(props: AutoMethodProps) {
const sdk = useSDK()
const dialog = useDialog()
const sync = useSync()
+ const toast = useToast()
+
+ useKeyboard((evt) => {
+ if (evt.name === "c" && !evt.ctrl && !evt.meta) {
+ const code =
+ props.authorization.instructions.match(/[A-Z0-9]{4}-[A-Z0-9]{4}/)?.[0] ?? props.authorization.instructions
+ Clipboard.copy(code)
+ .then(() => toast.show({ message: "Copied to clipboard", variant: "info" }))
+ .catch(toast.error)
+ }
+ })
onMount(async () => {
const result = await sdk.client.provider.oauth.callback({
@@ -132,6 +146,9 @@ function AutoMethod(props: AutoMethodProps) {
<text fg={theme.textMuted}>{props.authorization.instructions}</text>
</box>
<text fg={theme.textMuted}>Waiting for authorization...</text>
+ <text fg={theme.text}>
+ c <span style={{ fg: theme.textMuted }}>copy</span>
+ </text>
</box>
)
}