diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml
index 5331b01b..0b27ffec 100644
--- a/.github/workflows/node.js.yml
+++ b/.github/workflows/node.js.yml
@@ -35,6 +35,21 @@ jobs:
- run: pnpm install --frozen-lockfile
- run: pnpm run tsc
+ test:
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ node-version: [22.x]
+ steps:
+ - uses: actions/checkout@v4
+ - uses: pnpm/action-setup@v6
+ - uses: actions/setup-node@v4
+ with:
+ node-version: ${{ matrix.node-version }}
+ cache: 'pnpm'
+ - run: pnpm install --frozen-lockfile
+ - run: pnpm run test
+
check-docs:
runs-on: ubuntu-latest
strategy:
diff --git a/app/(docs)/@chat/chat/[chatId]/chatArea.tsx b/app/(docs)/@chat/chat/[chatId]/chatArea.tsx
index 0f5413b0..63bef250 100644
--- a/app/(docs)/@chat/chat/[chatId]/chatArea.tsx
+++ b/app/(docs)/@chat/chat/[chatId]/chatArea.tsx
@@ -2,9 +2,10 @@
import { ChatAreaStateUpdater } from "@/(docs)/chatAreaState";
import { useStreamingChatContext } from "@/(docs)/streamingChatContext";
+import { useSendChat } from "@/(docs)/useSendChat";
import { deleteChatAction } from "@/actions/deleteChat";
import { ChatWithMessages } from "@/lib/chatHistory";
-import { LangId, MarkdownSection, PageSlug } from "@/lib/docs";
+import { DynamicMarkdownSection, LangId, MarkdownSection, PageSlug } from "@/lib/docs";
import { Heading } from "@/markdown/heading";
import { StyledMarkdown } from "@/markdown/markdown";
import { usePagesListForLang } from "@/pagesListContext";
@@ -74,9 +75,17 @@ interface Props {
langId: LangId;
pageSlug: PageSlug;
targetSection: MarkdownSection | undefined;
+ priorSectionContent: DynamicMarkdownSection[];
}
export function ChatAreaContent(props: Props) {
- const { chatId, chatData, langId, pageSlug, targetSection } = props;
+ const {
+ chatId,
+ chatData,
+ langId,
+ pageSlug,
+ targetSection,
+ priorSectionContent,
+ } = props;
const langEntry = usePagesListForLang(langId);
const pageEntry = langEntry?.pages.find((p) => p.slug === pageSlug);
@@ -92,6 +101,23 @@ export function ChatAreaContent(props: Props) {
const router = useRouter();
const streamingChatContext = useStreamingChatContext();
const isStreamingThis = streamingChatContext.chatId === chatId;
+ const { sendChat, isLoading: isRegenerating } = useSendChat();
+
+ const handleRegenerate = async () => {
+ if (!confirm("このチャットを削除して再生成してもよろしいですか?")) {
+ return;
+ }
+ const firstUserMsg = chatData.messages.find((m) => m.role === "user");
+ const userQuestion = firstUserMsg ? firstUserMsg.content : chatData.title;
+
+ await sendChat({
+ path: { lang: langId, page: pageSlug },
+ userQuestion,
+ questionScope: "page",
+ sectionContent: priorSectionContent,
+ deleteChatOnCreated: chatId,
+ });
+ };
return (
<>
@@ -117,12 +143,55 @@ export function ChatAreaContent(props: Props) {
-
+
{chatData.createdAt.toLocaleString()}
+