This commit is contained in:
2026-02-20 04:32:50 +00:00
parent d7503ca56b
commit d9f6eb14ed
24 changed files with 1426 additions and 1183 deletions
@@ -1,14 +1,12 @@
import { useState, useEffect, useRef } from 'react';
import { useEffect, useRef } from 'react';
import { X } from 'lucide-react';
import { Dialog, DialogOverlay, DialogPortal } from '@/components/ui/dialog';
import * as DialogPrimitive from '@radix-ui/react-dialog';
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, useVisiblePiMonoModels } from '@/state/useModels';
import { useVisiblePiMonoModels } from '@/state/useModels';
import { useSettings } from '@/state/useSettings';
import type { TaskSummary } from 'apps/FileBrowser';
@@ -36,78 +34,19 @@ const playDing = () => {
setTimeout(() => ctx.close(), 1500);
};
type InnerProps = {
type PiMonoInnerProps = {
defaultInput: string;
cwd: { root?: string; path: string };
initialModel: string | null;
onProviderChange: (p: 'claude' | 'opencode' | 'pi-mono') => void;
};
const ClaudeInner = ({
defaultInput,
cwd,
initialModel,
onProviderChange,
taskInfo,
}: InnerProps & { taskInfo: TaskInfo }) => {
const chat = useClaude(undefined, initialModel, { replaceUrl: false, taskInfo });
const models = useVisibleClaudeModels();
const wasGenerating = useRef(false);
useEffect(() => {
if (wasGenerating.current && !chat.isGenerating) playDing();
wasGenerating.current = chat.isGenerating;
}, [chat.isGenerating]);
return (
<EmbeddableChat
chat={chat}
provider="claude"
availableModels={models}
onProviderChange={onProviderChange}
defaultInput={defaultInput}
cwd={cwd}
className="flex-1 min-h-0"
/>
);
};
const OpenCodeInner = ({
defaultInput,
cwd,
initialModel,
onProviderChange,
taskInfo,
}: InnerProps & { taskInfo: TaskInfo }) => {
const chat = useOpenCode(undefined, initialModel, { replaceUrl: false, taskInfo });
const models = useVisibleOpenCodeModels();
const wasGenerating = useRef(false);
useEffect(() => {
if (wasGenerating.current && !chat.isGenerating) playDing();
wasGenerating.current = chat.isGenerating;
}, [chat.isGenerating]);
return (
<EmbeddableChat
chat={chat}
provider="opencode"
availableModels={models}
onProviderChange={onProviderChange}
defaultInput={defaultInput}
cwd={cwd}
className="flex-1 min-h-0"
/>
);
taskInfo: TaskInfo;
};
const PiMonoInner = ({
defaultInput,
cwd,
initialModel,
onProviderChange,
taskInfo,
}: InnerProps & { taskInfo: TaskInfo }) => {
}: PiMonoInnerProps) => {
const chat = usePiMono(undefined, initialModel, { replaceUrl: false, taskInfo });
const models = useVisiblePiMonoModels();
@@ -120,9 +59,7 @@ const PiMonoInner = ({
return (
<EmbeddableChat
chat={chat}
provider="pi-mono"
availableModels={models}
onProviderChange={onProviderChange}
defaultInput={defaultInput}
cwd={cwd}
className="flex-1 min-h-0"
@@ -143,7 +80,6 @@ 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' | 'pi-mono'>(taskSettings.defaultProvider);
const defaultInput = promptOverride
?? (entryName && entryType
? `Read the task instructions at ${task.filePath} and execute them on the ${entryType}: ${entryName}`
@@ -171,34 +107,13 @@ export const TaskRunnerModal = ({ open, onOpenChange, task, entryName, entryType
</div>
{/* Chat */}
{provider === 'claude' ? (
<ClaudeInner
key="claude"
defaultInput={defaultInput}
cwd={cwd}
initialModel={taskSettings.defaultProvider === 'claude' ? taskSettings.defaultModel : null}
onProviderChange={setProvider}
taskInfo={taskInfo}
/>
) : provider === 'opencode' ? (
<OpenCodeInner
key="opencode"
defaultInput={defaultInput}
cwd={cwd}
initialModel={taskSettings.defaultProvider === 'opencode' ? taskSettings.defaultModel : null}
onProviderChange={setProvider}
taskInfo={taskInfo}
/>
) : (
<PiMonoInner
key="pi-mono"
defaultInput={defaultInput}
cwd={cwd}
initialModel={taskSettings.defaultProvider === 'pi-mono' ? taskSettings.defaultModel : null}
onProviderChange={setProvider}
taskInfo={taskInfo}
/>
)}
<PiMonoInner
key="pi-mono"
defaultInput={defaultInput}
cwd={cwd}
initialModel={taskSettings.defaultProvider === 'pi-mono' ? taskSettings.defaultModel : null}
taskInfo={taskInfo}
/>
</DialogPrimitive.Content>
</DialogPortal>
</Dialog>