This commit is contained in:
2026-02-19 18:05:50 +00:00
parent 9870fa7ae8
commit 6a83342013
38 changed files with 1459 additions and 267 deletions
@@ -6,8 +6,9 @@ import { cardStyle } from '@/components/Card';
import type { TaskInfo } from 'apps/Chat';
import { useClaude } from '@/Screens/Dashboard/Chat/useClaude';
import { useOpenCode } from '@/Screens/Dashboard/Chat/useOpenCode';
import { usePiMono } from '@/Screens/Dashboard/Chat/usePiMono';
import { EmbeddableChat } from '@/Screens/Dashboard/Chat/EmbeddableChat';
import { useVisibleClaudeModels, useVisibleOpenCodeModels } from '@/state/useModels';
import { useVisibleClaudeModels, useVisibleOpenCodeModels, useVisiblePiMonoModels } from '@/state/useModels';
import { useSettings } from '@/state/useSettings';
import type { TaskSummary } from 'apps/FileBrowser';
@@ -39,7 +40,7 @@ type InnerProps = {
defaultInput: string;
cwd: { root?: string; path: string };
initialModel: string | null;
onProviderChange: (p: 'claude' | 'opencode') => void;
onProviderChange: (p: 'claude' | 'opencode' | 'pi-mono') => void;
};
const ClaudeInner = ({
@@ -100,6 +101,35 @@ const OpenCodeInner = ({
);
};
const PiMonoInner = ({
defaultInput,
cwd,
initialModel,
onProviderChange,
taskInfo,
}: InnerProps & { taskInfo: TaskInfo }) => {
const chat = usePiMono(undefined, initialModel, { replaceUrl: false, taskInfo });
const models = useVisiblePiMonoModels();
const wasGenerating = useRef(false);
useEffect(() => {
if (wasGenerating.current && !chat.isGenerating) playDing();
wasGenerating.current = chat.isGenerating;
}, [chat.isGenerating]);
return (
<EmbeddableChat
chat={chat}
provider="pi-mono"
availableModels={models}
onProviderChange={onProviderChange}
defaultInput={defaultInput}
cwd={cwd}
className="flex-1 min-h-0"
/>
);
};
type TaskRunnerModalProps = {
open: boolean;
onOpenChange: (open: boolean) => void;
@@ -113,7 +143,7 @@ type TaskRunnerModalProps = {
export const TaskRunnerModal = ({ open, onOpenChange, task, entryName, entryType, cwd = { path: '' }, promptOverride }: TaskRunnerModalProps) => {
const { settings } = useSettings();
const taskSettings = settings.tasks;
const [provider, setProvider] = useState<'claude' | 'opencode'>(taskSettings.defaultProvider);
const [provider, setProvider] = useState<'claude' | 'opencode' | 'pi-mono'>(taskSettings.defaultProvider);
const defaultInput = promptOverride
?? (entryName && entryType
? `Read the task instructions at ${task.filePath} and execute them on the ${entryType}: ${entryName}`
@@ -150,7 +180,7 @@ export const TaskRunnerModal = ({ open, onOpenChange, task, entryName, entryType
onProviderChange={setProvider}
taskInfo={taskInfo}
/>
) : (
) : provider === 'opencode' ? (
<OpenCodeInner
key="opencode"
defaultInput={defaultInput}
@@ -159,6 +189,15 @@ export const TaskRunnerModal = ({ open, onOpenChange, task, entryName, entryType
onProviderChange={setProvider}
taskInfo={taskInfo}
/>
) : (
<PiMonoInner
key="pi-mono"
defaultInput={defaultInput}
cwd={cwd}
initialModel={taskSettings.defaultProvider === 'pi-mono' ? taskSettings.defaultModel : null}
onProviderChange={setProvider}
taskInfo={taskInfo}
/>
)}
</DialogPrimitive.Content>
</DialogPortal>