@@ -231,7 +238,7 @@ export function NewAgentPlacementOverlay({ open, workspace, onClose }: Props) {
{KIND_OPTIONS.find(option => option.kind === selectedKind)?.label} placement
- Arrow keys move between real layout targets. Enter confirms. Backspace resets.
+ Arrows split the focused pane. Shift+arrows add an outer row or column.
Target: {placementTarget?.label ?? 'none'}
diff --git a/src/renderer/src/workspace/hook/actions/dispatch.ts b/src/renderer/src/workspace/hook/actions/dispatch.ts
index 9b255f483..a33583da7 100644
--- a/src/renderer/src/workspace/hook/actions/dispatch.ts
+++ b/src/renderer/src/workspace/hook/actions/dispatch.ts
@@ -15,6 +15,7 @@ export function useDispatchActions(
setTileTabs: WorkspaceSetTileTabs,
refs: WorkspaceRefs,
showToast: (message: string, durationMs?: number) => void,
+ closeNewAgentPlacement: () => void,
sessionActions: SessionActions,
): {
enterDispatchMode: (scope?: DispatchModeState['scope']) => Promise
@@ -107,6 +108,7 @@ export function useDispatchActions(
const enterDispatchMode = useCallback(
async (scope: DispatchModeState['scope'] = state.dispatchMode?.scope ?? 'project') => {
+ closeNewAgentPlacement()
setState(prev => ({
...prev,
dispatchMode: {
@@ -117,7 +119,7 @@ export function useDispatchActions(
setTileTabs(null)
await ensureDispatchTerminal()
},
- [ensureDispatchTerminal, setState, setTileTabs, state.dispatchMode?.scope],
+ [closeNewAgentPlacement, ensureDispatchTerminal, setState, setTileTabs, state.dispatchMode?.scope],
)
const exitDispatchMode = useCallback(() => {
@@ -129,6 +131,7 @@ export function useDispatchActions(
const setDispatchScope = useCallback(
async (scope: DispatchModeState['scope']) => {
+ closeNewAgentPlacement()
setState(prev => ({
...prev,
dispatchMode: {
@@ -138,7 +141,7 @@ export function useDispatchActions(
}))
await ensureDispatchTerminal()
},
- [ensureDispatchTerminal, setState],
+ [closeNewAgentPlacement, ensureDispatchTerminal, setState],
)
const toggleDispatchTerminal = useCallback(async () => {
diff --git a/src/renderer/src/workspace/hook/actions/pane.ts b/src/renderer/src/workspace/hook/actions/pane.ts
index f492acd9f..89059300f 100644
--- a/src/renderer/src/workspace/hook/actions/pane.ts
+++ b/src/renderer/src/workspace/hook/actions/pane.ts
@@ -2,6 +2,7 @@ import { useCallback } from 'react'
import type {
BuriedPaneRecord,
+ DispatchModeState,
SessionId,
SessionKind,
SessionMeta,
@@ -40,7 +41,12 @@ import type { SessionActions } from '@renderer/workspace/hook/actions/session'
// -----------------------------------------------------------------------------
export function usePaneActions(
- state: { activeTabId: string; sessions: Record; tabs: Tab[] },
+ state: {
+ activeTabId: string
+ dispatchMode: DispatchModeState | null
+ sessions: Record
+ tabs: Tab[]
+ },
setState: WorkspaceSetState,
setRuntimes: WorkspaceSetRuntimes,
setSpotlight: WorkspaceSetSpotlight,
@@ -110,8 +116,12 @@ export function usePaneActions(
const startNewAgentPlacement = useCallback(() => {
const tab = state.tabs.find(t => t.id === state.activeTabId)
if (!tab) return
+ if (state.dispatchMode) {
+ showToast('New Agent placement is only available in the tiled workspace')
+ return
+ }
openNewAgentPlacement()
- }, [openNewAgentPlacement, state.activeTabId, state.tabs])
+ }, [openNewAgentPlacement, showToast, state.activeTabId, state.dispatchMode, state.tabs])
const commitNewAgentPlacement = useCallback(
async (kind: SessionKind, target: PlacementTarget) => {
diff --git a/src/renderer/src/workspace/hook/index.ts b/src/renderer/src/workspace/hook/index.ts
index 368b96c6b..2f9b781e1 100644
--- a/src/renderer/src/workspace/hook/index.ts
+++ b/src/renderer/src/workspace/hook/index.ts
@@ -236,6 +236,7 @@ export function useWorkspace(
setTileTabs,
refs,
showToast,
+ closeNewAgentPlacement,
sessionActions,
)