Skip to content

Commit 4face12

Browse files
committed
🤖 feat: add Docker runtime to CreationControls UI
Add Docker option to runtime selector with image input field. - Add Docker to RUNTIME_OPTIONS with DockerIcon and styling - Add dockerImage/onDockerImageChange props to CreationControls - Wire up Docker image state through useCreationWorkspace _Generated with mux_
1 parent a00ed1f commit 4face12

File tree

3 files changed

+42
-2
lines changed

3 files changed

+42
-2
lines changed

src/browser/components/ChatInput/CreationControls.tsx

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { Select } from "../Select";
44
import { Loader2, Wand2 } from "lucide-react";
55
import { cn } from "@/common/lib/utils";
66
import { Tooltip, TooltipTrigger, TooltipContent } from "../ui/tooltip";
7-
import { SSHIcon, WorktreeIcon, LocalIcon } from "../icons/RuntimeIcons";
7+
import { SSHIcon, WorktreeIcon, LocalIcon, DockerIcon } from "../icons/RuntimeIcons";
88
import { DocsLink } from "../DocsLink";
99
import type { WorkspaceNameState } from "@/browser/hooks/useWorkspaceName";
1010

@@ -17,9 +17,11 @@ interface CreationControlsProps {
1717
runtimeMode: RuntimeMode;
1818
defaultRuntimeMode: RuntimeMode;
1919
sshHost: string;
20+
dockerImage: string;
2021
onRuntimeModeChange: (mode: RuntimeMode) => void;
2122
onSetDefaultRuntime: (mode: RuntimeMode) => void;
2223
onSshHostChange: (host: string) => void;
24+
onDockerImageChange: (image: string) => void;
2325
disabled: boolean;
2426
/** Project name to display as header */
2527
projectName: string;
@@ -80,6 +82,17 @@ const RUNTIME_OPTIONS: Array<{
8082
idleClass:
8183
"bg-transparent text-muted border-transparent hover:border-[var(--color-runtime-ssh)]/40",
8284
},
85+
{
86+
value: RUNTIME_MODE.DOCKER,
87+
label: "Docker",
88+
description: "Run in Docker container",
89+
docsPath: "/runtime/docker",
90+
Icon: DockerIcon,
91+
activeClass:
92+
"bg-[var(--color-runtime-docker)]/20 text-[var(--color-runtime-docker-text)] border-[var(--color-runtime-docker)]/60",
93+
idleClass:
94+
"bg-transparent text-muted border-transparent hover:border-[var(--color-runtime-docker)]/40",
95+
},
8396
];
8497

8598
function RuntimeButtonGroup(props: RuntimeButtonGroupProps) {
@@ -268,7 +281,11 @@ export function CreationControls(props: CreationControlsProps) {
268281
defaultMode={props.defaultRuntimeMode}
269282
onSetDefault={props.onSetDefaultRuntime}
270283
disabled={props.disabled}
271-
disabledModes={isNonGitRepo ? [RUNTIME_MODE.WORKTREE, RUNTIME_MODE.SSH] : undefined}
284+
disabledModes={
285+
isNonGitRepo
286+
? [RUNTIME_MODE.WORKTREE, RUNTIME_MODE.SSH, RUNTIME_MODE.DOCKER]
287+
: undefined
288+
}
272289
/>
273290

274291
{/* Branch selector - shown for worktree/SSH */}
@@ -306,6 +323,21 @@ export function CreationControls(props: CreationControlsProps) {
306323
/>
307324
</div>
308325
)}
326+
327+
{/* Docker Image Input */}
328+
{props.runtimeMode === RUNTIME_MODE.DOCKER && (
329+
<div className="flex items-center gap-2">
330+
<label className="text-muted-foreground text-xs">image</label>
331+
<input
332+
type="text"
333+
value={props.dockerImage}
334+
onChange={(e) => props.onDockerImageChange(e.target.value)}
335+
placeholder="ubuntu:22.04"
336+
disabled={props.disabled}
337+
className="bg-bg-dark text-foreground border-border-medium focus:border-accent h-7 w-36 rounded-md border px-2 text-sm focus:outline-none disabled:opacity-50"
338+
/>
339+
</div>
340+
)}
309341
</div>
310342
</div>
311343
</div>

src/browser/components/ChatInput/index.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1441,9 +1441,11 @@ export const ChatInput: React.FC<ChatInputProps> = (props) => {
14411441
runtimeMode={creationState.runtimeMode}
14421442
defaultRuntimeMode={creationState.defaultRuntimeMode}
14431443
sshHost={creationState.sshHost}
1444+
dockerImage={creationState.dockerImage}
14441445
onRuntimeModeChange={creationState.setRuntimeMode}
14451446
onSetDefaultRuntime={creationState.setDefaultRuntimeMode}
14461447
onSshHostChange={creationState.setSshHost}
1448+
onDockerImageChange={creationState.setDockerImage}
14471449
disabled={creationState.isSending || isSending}
14481450
projectName={props.projectName}
14491451
nameState={creationState.nameState}

src/browser/components/ChatInput/useCreationWorkspace.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,15 @@ interface UseCreationWorkspaceReturn {
6565
runtimeMode: RuntimeMode;
6666
defaultRuntimeMode: RuntimeMode;
6767
sshHost: string;
68+
dockerImage: string;
6869
/** Set the currently selected runtime mode (does not persist) */
6970
setRuntimeMode: (mode: RuntimeMode) => void;
7071
/** Set the default runtime mode for this project (persists via checkbox) */
7172
setDefaultRuntimeMode: (mode: RuntimeMode) => void;
7273
/** Set the SSH host (persisted separately from runtime mode) */
7374
setSshHost: (host: string) => void;
75+
/** Set the Docker image (persisted separately from runtime mode) */
76+
setDockerImage: (image: string) => void;
7477
toast: Toast | null;
7578
setToast: (toast: Toast | null) => void;
7679
isSending: boolean;
@@ -109,6 +112,7 @@ export function useCreationWorkspace({
109112
setRuntimeMode,
110113
setDefaultRuntimeMode,
111114
setSshHost,
115+
setDockerImage,
112116
setTrunkBranch,
113117
getRuntimeString,
114118
} = useDraftWorkspaceSettings(projectPath, branches, recommendedTrunk);
@@ -261,9 +265,11 @@ export function useCreationWorkspace({
261265
runtimeMode: settings.runtimeMode,
262266
defaultRuntimeMode: settings.defaultRuntimeMode,
263267
sshHost: settings.sshHost,
268+
dockerImage: settings.dockerImage,
264269
setRuntimeMode,
265270
setDefaultRuntimeMode,
266271
setSshHost,
272+
setDockerImage,
267273
toast,
268274
setToast,
269275
isSending,

0 commit comments

Comments
 (0)