User: hey
Assistant: Hello! How can I assist you today?
User: hello
Assistant: Hi there again! What would you like to talk about?
User: what can you do
Assistant: I can help with a variety of things, including answering questions, providing information on different topics, assisting with writing and editing, tutoring in subjects like math or science, giving recommendations for books or movies, and much more. What do you need help with today?
User: give me a sum function
Assistant: Sure! Here's a simple sum function in Python that takes a list of numbers and returns the sum:

```python
def sum_numbers(numbers):
    return sum(numbers)

# Example usage:
my_numbers = [1, 2, 3, 4, 5]
total = sum_numbers(my_numbers)
print("The sum is:", total)
```

You can replace the `my_numbers` list with any list of numbers you want to sum. Let me know if you need a sum function in a different programming language or have any other questions!
User: hello man
Assistant: Hello! How can I help you today?
User: 
is this something new?








Assistant: It sounds like you're wondering if there's something new or different about our conversation. I'm here to provide assistance, answer questions, and help with various topics. If there's anything specific you'd like to know or discuss, feel free to tell me!
User: hello
Assistant: Hi again! How can I assist you right now?
User: what can you do?
Assistant: I can assist you with a wide range of topics, including:

- Answering questions or providing explanations on various subjects
- Offering writing and editing help
- Giving recommendations for books, movies, or music
- Tutoring in subjects like math, science, history, etc.
- Providing coding examples and debugging assistance
- Engaging in general conversation or brainstorming ideas

If there's something specific you'd like to know or talk about, just let me know
User: hey
User: what can yo do?
Assistant: I can help you with many things, including:

- Answering questions and providing information on various topics
- Assisting with writing, editing, and brainstorming ideas
- Offering recommendations for books, movies, or music
- Tutoring and explaining concepts in subjects like math, science, and history
- Providing coding assistance and examples
- Engaging in casual conversation and discussions

If there's something specific you have in mind, just let me know!
User: hello
Assistant: Hello! How can I assist you today?
User: l
Assistant: It looks like you entered "l." If that was a mistake, feel free to type your question or let me know how I can help!
User: hello man
Assistant: Hi there! How can I assist you today?
User: can you refactor this code?

import { useEffect, useRef, useState } from "react";
import { ActionPanel, Action, List, Detail, Form, Toast, showToast } from "@raycast/api";
import { useForm, FormValidation } from "@raycast/utils";
import { nanoid } from "nanoid";
import moment from "moment";

import { ChatService } from "./lib/services/ChatService";
import { ChatMessage } from "./types";

// Mock data for existing chats and models
const models = ["mistral:latest", "deepseek-r1:1.5b", "llama3.2:latest"];
const chatService = new ChatService();

interface CreateChat {
  model: string;
  chatName: string;
}

const Talk = () => {
  const [step, setStep] = useState<"chatList" | "modelSelection" | "chatView">("chatList");
  const [selectedChat, setSelectedChat] = useState<string | null>(null);
  const [messages, setMessages] = useState<Array<ChatMessage>>([]);
  const [existingChats, setExistingChats] = useState<string[]>([]);
  const [inputMessage, setInputMessage] = useState<string>("");

  const messageIdRef = useRef<string | null>(null); // Track current assistant message ID
  const accumulatedResponseRef = useRef<string>(""); // Store streamed content

  useEffect(() => {
    setExistingChats(chatService.listChats());
  }, []);

  const loadChat = (chatName: string) => {
    const loadedMessages = chatService.loadChatHistory(chatName);
    setMessages(loadedMessages);
    setSelectedChat(chatName);
    setStep("chatView");
  };

  const refreshChatList = () => {
    const chats = chatService.listChats();
    setExistingChats(chats);
  };

  const deleteChat = (chatName: string) => {
    chatService.deleteChat(chatName);
    showToast({
      style: Toast.Style.Success,
      title: "Chat Deleted",
      message: `Successfully deleted chat "${chatName}"`,
    });
    refreshChatList(); // Refresh the chat list after deletion
  };

  const { handleSubmit, itemProps } = useForm<CreateChat>({
    onSubmit(values) {
      showToast({
        style: Toast.Style.Success,
        title: "Yay! creating chat",
        message: `creating chat with name ${values.chatName}  and model ${values.model}`,
      });

      chatService.createChat({ model: values.model, chatName: values.chatName });

      loadChat(`${values.chatName}-${values.model}`);
    },
    validation: {
      chatName: FormValidation.Required,
      model: FormValidation.Required,
    },
  });

  console.log("messages", messages);

  const sendMessage = async () => {
    if (!inputMessage.trim()) return; // Prevent sending empty messages

    const model = selectedChat?.split("-")[1]; // Extract model from selectedChat
    // Create a new user message with a timestamp
    const userMessage: ChatMessage = {
      id: nanoid(),
      role: "user",
      content: inputMessage,
      timestamp: moment().valueOf(),
    };
    setMessages((prev) => [...prev, userMessage]);
    setInputMessage(""); // Clear input field

    messageIdRef.current = nanoid();
    accumulatedResponseRef.current = "";

    let assistantResponse = "";

    // Stream response from the assistant
    await chatService.streamOllamaResponse(
      model!,
      selectedChat!,
      inputMessage,
      (chunk, timestamp) => {
        assistantResponse += chunk; // Accumulate assistant's response
        accumulatedResponseRef.current = assistantResponse;

        setMessages((prev) => {
          const lastMessage = prev[prev.length - 1];

          if (lastMessage?.id === messageIdRef.current) {
            // Update the last assistant message
            return [
              ...prev.slice(0, -1),
              {
                id: messageIdRef.current as string,
                role: "assistant",
                content: accumulatedResponseRef.current,
                timestamp,
              },
            ];
          } else {
            // Add a new assistant message
            return [...prev, { id: messageIdRef.current as string, role: "assistant", content: chunk, timestamp }];
          }
        });
      },
      () => {
        // Handle end of response
        console.log("Response streaming ended.");
      },
    );
  };

  const messageCopy = [...messages].sort((a, b) => b.timestamp - a.timestamp);

  const isChatEmpty = (chat: ChatMessage[]) => {
    return chat.length === 0;
  };

  // Step 1: Show previous chat list or option to create a new chat
  if (step === "chatList") {
    return (
      <List navigationTitle="Start Chat" searchBarPlaceholder="Select a Chat">
        <List.Item
          title="Create New Chat"
          actions={
            <ActionPanel>
              <Action title="Create New Chat" onAction={() => setStep("modelSelection")} />
            </ActionPanel>
          }
        />
        {existingChats
          .filter((chat) => chat !== ".DS_Store")
          .map((chat) => (
            <List.Item
              key={chat}
              title={chat}
              actions={
                <ActionPanel>
                  <Action
                    title="Select Chat"
                    onAction={() => {
                      loadChat(chat);
                    }}
                  />

                  <Action title="Delete Chat" onAction={() => deleteChat(chat)} />
                </ActionPanel>
              }
            />
          ))}
      </List>
    );
  }

  // Step 2: Model selection for new chat
  if (step === "modelSelection") {
    return (
      <Form
        actions={
          <ActionPanel>
            <Action.SubmitForm title="Submit" onSubmit={handleSubmit} />
          </ActionPanel>
        }
      >
        <Form.TextField title="Chat Name" placeholder="Tim Cook" error="Required" {...itemProps.chatName} />

        <Form.Dropdown id="model" title="AI Model" defaultValue="mistral:latest">
          {models.map((model) => (
            <Form.Dropdown.Item key={model} value={model} title={model} icon="🚀" />
          ))}
        </Form.Dropdown>
      </Form>
    );
  }

  if (step === "chatView") {
    return (
      <>
        <List
          isShowingDetail={!isChatEmpty(messages)}
          filtering={false}
          searchText={inputMessage}
          onSearchTextChange={setInputMessage}
          navigationTitle="AI Chat"
          searchBarPlaceholder="Ask AI..."
        >
          {(() => {
            if (isChatEmpty(messages)) {
              return (
                <List.EmptyView
                  title="Ask GPT Anything..."
                  actions={
                    <ActionPanel>
                      <Action
                        title="Send to AI"
                        onAction={() => {
                          /* Handle reply */
                          sendMessage();
                        }}
                      />
                      <Action
                        title="Compose Message"
                        onAction={() => {
                          /* Handle reply */
                        }}
                      />
                    </ActionPanel>
                  }
                />
              );
            }

            // return messages.map((msg, index) => {
            return messageCopy.map((msg, index) => {
              return (
                <>
                  <List.Item
                    key={index}
                    title={msg.role === "user" ? `You - ${msg.content}` : `Assistant - ${msg.content}`}
                    subtitle={`${moment(msg.timestamp).fromNow(true)}`} // Optional: Display message index or timestamp
                    detail={
                      <List.Item.Detail
                        markdown={`**${msg.role === "user" ? "You" : "Assistant"}:**\n\n${msg.content}`}
                      />
                    }
                    actions={
                      <ActionPanel>
                        <Action
                          title="Send to AI"
                          onAction={() => {
                            /* Handle reply */
                            sendMessage();
                          }}
                        />
                        <Action
                          title="Compose Message"
                          onAction={() => {
                            /* Handle reply */
                          }}
                        />
                      </ActionPanel>
                    }
                  />
                </>
              );
            });
          })()}
        </List>
      </>
    );
  }

  return <Detail markdown="# Welcome to Talk" />;
};

export default Talk;

Assistant: