Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion apps/server/src/mcp/toolkits/device/handlers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ export function agentDeviceQuickStart(
` ${executable} screenshot /tmp/shot.png ${target} # or call device_screenshot`,
` ${executable} install <app> <path-to-.app-or-.apk> ${target}`,
`Prefer snapshot refs over coordinates. Run ${executable} help for workflow guides and ${executable} <command> --help for flags.`,
"Do not call simctl, adb, xcrun, or serve-sim directly while these tools are attached; use agent-device.",
"Prefer agent-device for driving this device. simctl, adb, and xcrun remain available for anything it does not cover.",
"For remote hosts, arrange builds, app installation, and any Metro reverse forwarding yourself. T3 provides discovery, streaming, and control only.",
"Keep the returned --config and --session flags on every command. Other hosts can be used concurrently; opening one does not switch these commands.",
platformNotes,
Expand Down
2 changes: 1 addition & 1 deletion apps/server/src/provider/CodexDeveloperInstructions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ Do not switch to global browser skills, Chrome, Node REPL browser automation, st

const T3_CODE_DEVICE_TOOL_INSTRUCTIONS = `## T3 Code devices

The \`t3-code\` MCP server also exposes \`device_*\` tools for iOS Simulators and Android Emulators on this environment. For mobile verification, call \`device_list\`, then \`device_open\` so the user can watch the device in their Device panel; its result explains how to drive the device. Driving happens through the \`agent-device\` CLI, which is on PATH. Keep the host config and session flags returned by \`device_open\` on every command so concurrent devices stay independent: prefer \`agent-device snapshot -i\` refs over coordinates, and use \`device_screenshot\` when you need to see the screen. Do not call simctl, adb, xcrun, or serve-sim directly while these tools are present. If \`device_list\` reports a platform as unavailable, say so instead of trying another route.`;
The \`t3-code\` MCP server also exposes \`device_*\` tools for iOS Simulators and Android Emulators on this environment. For mobile verification, call \`device_list\`, then \`device_open\` so the user can watch the device in their Device panel; its result explains how to drive the device. Driving happens through the \`agent-device\` CLI, which is on PATH. Keep the host config and session flags returned by \`device_open\` on every command so concurrent devices stay independent: prefer \`agent-device snapshot -i\` refs over coordinates, and use \`device_screenshot\` when you need to see the screen. Prefer these tools and \`agent-device\` for opening and driving devices. Platform tools such as \`xcrun simctl\` and \`adb\` remain available for anything they do not cover, such as builds, logs, or port forwarding. If \`device_list\` reports a platform as unavailable, say so.`;

export interface T3CodeToolAvailability {
readonly browser: boolean;
Expand Down
24 changes: 16 additions & 8 deletions apps/web/src/components/settings/ConnectionsSettings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1549,14 +1549,29 @@ function SavedBackendListRow({
versionMismatch !== null &&
(serverUpdateState.status === "idle" || serverUpdateState.status === "failed");

const statusTooltip = `${
unsupported
? (environment.connection.error ?? connectionStatusText(environment.connection))
: enabled
? connectionStatusText(environment.connection)
: "Switched off"
}${
versionMismatch
? `\nUpdate available: ${versionMismatch.serverVersion} → ${versionMismatch.clientVersion}`
: ""
}`;

return (
<EnvironmentRow
kind={machineKind}
label={environment.label}
dimmed={!enabled}
subtitle={
<Tooltip>
{/* The status can change while the tooltip is open, and base-ui only
re-measures the popup when the trigger's payload changes. */}
<TooltipTrigger
payload={statusTooltip}
render={
<span
className={cn(
Expand All @@ -1569,14 +1584,7 @@ function SavedBackendListRow({
{subtitleText}
</TooltipTrigger>
<TooltipPopup side="top" className="whitespace-pre-wrap">
{unsupported
? (environment.connection.error ?? connectionStatusText(environment.connection))
: enabled
? connectionStatusText(environment.connection)
: "Switched off"}
{versionMismatch
? `\nUpdate available: ${versionMismatch.serverVersion} → ${versionMismatch.clientVersion}`
: ""}
{statusTooltip}
</TooltipPopup>
</Tooltip>
}
Expand Down
3 changes: 2 additions & 1 deletion docs/internals/devices.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@ already-running agent without the CLI.
How to drive a device is returned from `device_open`, not kept in an
always-loaded prompt or skill: it costs nothing in threads that never open a
device and cannot drift from the pinned CLI version. The always-on prompt block
is a few lines that point at the tools and forbid raw `simctl` and `adb`.
is a few lines that point at the tools and prefer them over raw `simctl` and
`adb`, which stay available for what the tools do not cover.

## The viewer decodes both vendored protocols

Expand Down
Loading