From 0047b6b2a23087fe6cb71925e37521ae0820cfa4 Mon Sep 17 00:00:00 2001 From: d-kimsuon Date: Mon, 20 Oct 2025 03:00:13 +0900 Subject: [PATCH] feat: system information view --- .../AssistantConversationContent.tsx | 61 ++++- .../conversationList/ConversationItem.tsx | 26 +- .../conversationList/ConversationList.tsx | 8 +- .../SidechainConversationModal.tsx | 51 ++-- .../[sessionId]/hooks/useSidechain.ts | 21 ++ src/components/GlobalSidebar.tsx | 29 +- src/components/SystemInfoCard.tsx | 229 ++++++++++++++++ src/lib/api/queries.ts | 43 +++ src/lib/i18n/locales/en/messages.json | 255 +++++++++++++----- src/lib/i18n/locales/en/messages.ts | 2 +- src/lib/i18n/locales/ja/messages.json | 255 +++++++++++++----- src/lib/i18n/locales/ja/messages.ts | 2 +- .../presentation/ClaudeCodeController.ts | 35 +++ .../claude-code/services/ClaudeCodeService.ts | 17 ++ src/server/hono/route.ts | 27 ++ 15 files changed, 881 insertions(+), 180 deletions(-) create mode 100644 src/components/SystemInfoCard.tsx diff --git a/src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/AssistantConversationContent.tsx b/src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/AssistantConversationContent.tsx index 46e5c7b..4e9c126 100644 --- a/src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/AssistantConversationContent.tsx +++ b/src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/AssistantConversationContent.tsx @@ -1,7 +1,7 @@ "use client"; import { Trans } from "@lingui/react"; -import { ChevronDown, Lightbulb, Settings } from "lucide-react"; +import { ChevronDown, Lightbulb, Wrench } from "lucide-react"; import Image from "next/image"; import { useTheme } from "next-themes"; import type { FC } from "react"; @@ -10,6 +10,7 @@ import { oneDark, oneLight, } from "react-syntax-highlighter/dist/esm/styles/prism"; +import z from "zod"; import { Badge } from "@/components/ui/badge"; import { Card, @@ -25,12 +26,28 @@ import { } from "@/components/ui/collapsible"; import type { ToolResultContent } from "@/lib/conversation-schema/content/ToolResultContentSchema"; import type { AssistantMessageContent } from "@/lib/conversation-schema/message/AssistantMessageSchema"; +import { Button } from "../../../../../../../components/ui/button"; +import type { SidechainConversation } from "../../../../../../../lib/conversation-schema"; import { MarkdownContent } from "../../../../../../components/MarkdownContent"; +import { SidechainConversationModal } from "../conversationModal/SidechainConversationModal"; + +const taskToolInputSchema = z.object({ + prompt: z.string(), +}); export const AssistantConversationContent: FC<{ content: AssistantMessageContent; getToolResult: (toolUseId: string) => ToolResultContent | undefined; -}> = ({ content, getToolResult }) => { + getSidechainConversationByPrompt: ( + prompt: string, + ) => SidechainConversation | undefined; + getSidechainConversations: (rootUuid: string) => SidechainConversation[]; +}> = ({ + content, + getToolResult, + getSidechainConversationByPrompt, + getSidechainConversations, +}) => { const { resolvedTheme } = useTheme(); const syntaxTheme = resolvedTheme === "dark" ? oneDark : oneLight; if (content.type === "text") { @@ -71,11 +88,48 @@ export const AssistantConversationContent: FC<{ if (content.type === "tool_use") { const toolResult = getToolResult(content.id); + const taskModal = (() => { + const taskInput = + content.name === "Task" + ? taskToolInputSchema.safeParse(content.input) + : undefined; + + if (taskInput === undefined || taskInput.success === false) { + return undefined; + } + + const conversation = getSidechainConversationByPrompt( + taskInput.data.prompt, + ); + + if (conversation === undefined) { + return undefined; + } + + return ( + ({ + ...original, + isSidechain: false, + }))} + getToolResult={getToolResult} + trigger={ + + } + /> + ); + })(); + return (
- + @@ -159,6 +213,7 @@ export const AssistantConversationContent: FC<{ )} + {taskModal} ); diff --git a/src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/ConversationItem.tsx b/src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/ConversationItem.tsx index d6fc6e9..e9b1dc9 100644 --- a/src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/ConversationItem.tsx +++ b/src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/ConversationItem.tsx @@ -1,5 +1,8 @@ import type { FC } from "react"; -import type { Conversation } from "@/lib/conversation-schema"; +import type { + Conversation, + SidechainConversation, +} from "@/lib/conversation-schema"; import type { ToolResultContent } from "@/lib/conversation-schema/content/ToolResultContentSchema"; import { SidechainConversationModal } from "../conversationModal/SidechainConversationModal"; import { AssistantConversationContent } from "./AssistantConversationContent"; @@ -13,11 +16,15 @@ export const ConversationItem: FC<{ conversation: Conversation; getToolResult: (toolUseId: string) => ToolResultContent | undefined; isRootSidechain: (conversation: Conversation) => boolean; - getSidechainConversations: (rootUuid: string) => Conversation[]; + getSidechainConversationByPrompt: ( + prompt: string, + ) => SidechainConversation | undefined; + getSidechainConversations: (rootUuid: string) => SidechainConversation[]; }> = ({ conversation, getToolResult, isRootSidechain, + getSidechainConversationByPrompt, getSidechainConversations, }) => { if (conversation.type === "summary") { @@ -54,13 +61,10 @@ export const ConversationItem: FC<{ conversation={conversation} sidechainConversations={getSidechainConversations( conversation.uuid, - ).map((original) => { - if (original.type === "summary") return original; - return { - ...original, - isSidechain: false, - }; - })} + ).map((original) => ({ + ...original, + isSidechain: false, + }))} getToolResult={getToolResult} /> ); @@ -99,6 +103,10 @@ export const ConversationItem: FC<{ ))} diff --git a/src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/ConversationList.tsx b/src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/ConversationList.tsx index 27b19ef..ce8f36a 100644 --- a/src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/ConversationList.tsx +++ b/src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/ConversationList.tsx @@ -126,8 +126,11 @@ export const ConversationList: FC = ({ conversations.filter((conversation) => conversation.type !== "x-error"), [conversations], ); - const { isRootSidechain, getSidechainConversations } = - useSidechain(validConversations); + const { + isRootSidechain, + getSidechainConversations, + getSidechainConversationByPrompt, + } = useSidechain(validConversations); return (
    @@ -148,6 +151,7 @@ export const ConversationList: FC = ({ getToolResult={getToolResult} isRootSidechain={isRootSidechain} getSidechainConversations={getSidechainConversations} + getSidechainConversationByPrompt={getSidechainConversationByPrompt} /> ); diff --git a/src/app/projects/[projectId]/sessions/[sessionId]/components/conversationModal/SidechainConversationModal.tsx b/src/app/projects/[projectId]/sessions/[sessionId]/components/conversationModal/SidechainConversationModal.tsx index 6c916bb..612898e 100644 --- a/src/app/projects/[projectId]/sessions/[sessionId]/components/conversationModal/SidechainConversationModal.tsx +++ b/src/app/projects/[projectId]/sessions/[sessionId]/components/conversationModal/SidechainConversationModal.tsx @@ -16,11 +16,13 @@ import type { SidechainConversation, } from "@/lib/conversation-schema"; import type { ToolResultContent } from "@/lib/conversation-schema/content/ToolResultContentSchema"; +import { extractFirstUserText } from "../../../../../../../server/core/session/functions/extractFirstUserText"; import { ConversationList } from "../conversationList/ConversationList"; type SidechainConversationModalProps = { conversation: SidechainConversation; sidechainConversations: Conversation[]; + trigger?: React.ReactNode; getToolResult: (toolUseId: string) => ToolResultContent | undefined; }; @@ -38,29 +40,12 @@ const sidechainTitle = (conversations: Conversation[]): string => { return defaultTitle; } - if (firstConversation.type !== "user") { - return defaultTitle; - } - - const textContent = - typeof firstConversation.message.content === "string" - ? firstConversation.message.content - : (() => { - const firstContent = firstConversation.message.content.at(0); - if (firstContent === undefined) return null; - - if (typeof firstContent === "string") return firstContent; - if (firstContent.type === "text") return firstContent.text; - - return null; - })(); - - return textContent ?? defaultTitle; + return extractFirstUserText(firstConversation) ?? defaultTitle; }; export const SidechainConversationModal: FC< SidechainConversationModalProps -> = ({ conversation, sidechainConversations, getToolResult }) => { +> = ({ conversation, sidechainConversations, trigger, getToolResult }) => { const title = sidechainTitle(sidechainConversations); const rootUuid = conversation.uuid; @@ -68,19 +53,21 @@ export const SidechainConversationModal: FC< return ( - + {trigger ?? ( + + )} { ); }, [sidechainConversations]); + const conversationPromptMap = useMemo(() => { + return new Map( + sidechainConversations + .filter((conv) => conv.type === "user") + .filter( + (conv) => + conv.parentUuid === null && + typeof conv.message.content === "string", + ) + .map((conv) => [conv.message.content as string, conv] as const), + ); + }, [sidechainConversations]); + const getRootConversationRecursive = useCallback( (conversation: SidechainConversation): SidechainConversation => { if (conversation.parentUuid === null) { @@ -72,8 +85,16 @@ export const useSidechain = (conversations: Conversation[]) => { [sidechainConversationGroups], ); + const getSidechainConversationByPrompt = useCallback( + (prompt: string) => { + return conversationPromptMap.get(prompt); + }, + [conversationPromptMap], + ); + return { isRootSidechain, getSidechainConversations, + getSidechainConversationByPrompt, }; }; diff --git a/src/components/GlobalSidebar.tsx b/src/components/GlobalSidebar.tsx index 7fd3b9d..f316f0b 100644 --- a/src/components/GlobalSidebar.tsx +++ b/src/components/GlobalSidebar.tsx @@ -2,7 +2,7 @@ import { Trans } from "@lingui/react"; import type { LucideIcon } from "lucide-react"; -import { SettingsIcon } from "lucide-react"; +import { InfoIcon, SettingsIcon } from "lucide-react"; import { type FC, type ReactNode, Suspense, useState } from "react"; import { Tooltip, @@ -13,6 +13,7 @@ import { import { cn } from "@/lib/utils"; import { NotificationSettings } from "./NotificationSettings"; import { SettingsControls } from "./SettingsControls"; +import { SystemInfoCard } from "./SystemInfoCard"; export interface SidebarTab { id: string; @@ -94,7 +95,31 @@ export const GlobalSidebar: FC = ({ ), }; - const allTabs = [...additionalTabs, settingsTab]; + const systemInfoTab: SidebarTab = { + id: "system-info", + icon: InfoIcon, + title: ( + + ), + content: ( + +
    + +
    +
+ } + > + + + ), + }; + + const allTabs = [...additionalTabs, settingsTab, systemInfoTab]; const [activeTab, setActiveTab] = useState( defaultActiveTab ?? allTabs[allTabs.length - 1]?.id ?? "settings", ); diff --git a/src/components/SystemInfoCard.tsx b/src/components/SystemInfoCard.tsx new file mode 100644 index 0000000..621b245 --- /dev/null +++ b/src/components/SystemInfoCard.tsx @@ -0,0 +1,229 @@ +"use client"; + +import { Trans } from "@lingui/react"; +import { useSuspenseQuery } from "@tanstack/react-query"; +import { CheckCircle2, ChevronDown, ChevronRight, XCircle } from "lucide-react"; +import { type FC, type ReactNode, useState } from "react"; +import { + claudeCodeFeaturesQuery, + claudeCodeMetaQuery, + systemVersionQuery, +} from "@/lib/api/queries"; +import { Badge } from "./ui/badge"; +import { + Collapsible, + CollapsibleContent, + CollapsibleTrigger, +} from "./ui/collapsible"; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "./ui/tooltip"; + +interface FeatureInfo { + title: ReactNode; + description: ReactNode; +} + +const getFeatureInfo = (featureName: string): FeatureInfo => { + switch (featureName) { + case "canUseTool": + return { + title: ( + + ), + description: ( + + ), + }; + case "uuidOnSDKMessage": + return { + title: ( + + ), + description: ( + + ), + }; + case "agentSdk": + return { + title: ( + + ), + description: ( + + ), + }; + default: + return { + title: featureName, + description: ( + + ), + }; + } +}; + +export const SystemInfoCard: FC = () => { + const [isExpanded, setIsExpanded] = useState(false); + + const { data: versionData } = useSuspenseQuery({ + ...systemVersionQuery, + }); + + const { data: claudeCodeMetaData } = useSuspenseQuery({ + ...claudeCodeMetaQuery, + }); + + const { data: claudeCodeFeaturesData } = useSuspenseQuery({ + ...claudeCodeFeaturesQuery, + }); + + return ( +
+
+

+ +

+

+ +

+
+ +
+ {/* Claude Code Viewer Version */} +
+

+ +

+
+ + + + + v{versionData?.version || "Unknown"} + +
+
+ + {/* Claude Code Information */} +
+

+ +

+
+
+
+ +
+
+ {claudeCodeMetaData?.executablePath || ( + + + + )} +
+
+ +
+ + + + + {claudeCodeMetaData?.version || ( + + )} + +
+
+
+ + {/* Available Features */} +
+ + +

+ +

+ {isExpanded ? ( + + ) : ( + + )} +
+ + + +
    + {claudeCodeFeaturesData?.features.map(({ name, enabled }) => { + const featureInfo = getFeatureInfo(name); + return ( +
  • + {enabled ? ( + + ) : ( + + )} + + + + {featureInfo.title} + + + + {featureInfo.description} + + +
  • + ); + })} +
+
+
+
+
+
+
+ ); +}; diff --git a/src/lib/api/queries.ts b/src/lib/api/queries.ts index 9ea40de..ce9e18a 100644 --- a/src/lib/api/queries.ts +++ b/src/lib/api/queries.ts @@ -206,3 +206,46 @@ export const configQuery = { return await response.json(); }, } as const; + +export const systemVersionQuery = { + queryKey: ["version"], + queryFn: async () => { + const response = await honoClient.api.version.$get(); + + if (!response.ok) { + throw new Error(`Failed to fetch system version: ${response.statusText}`); + } + + return await response.json(); + }, +} as const; + +export const claudeCodeMetaQuery = { + queryKey: ["cc", "meta"], + queryFn: async () => { + const response = await honoClient.api.cc.meta.$get(); + + if (!response.ok) { + throw new Error( + `Failed to fetch system features: ${response.statusText}`, + ); + } + + return await response.json(); + }, +} as const; + +export const claudeCodeFeaturesQuery = { + queryKey: ["cc", "features"], + queryFn: async () => { + const response = await honoClient.api.cc.features.$get(); + + if (!response.ok) { + throw new Error( + `Failed to fetch claude code features: ${response.statusText}`, + ); + } + + return await response.json(); + }, +} as const; diff --git a/src/lib/i18n/locales/en/messages.json b/src/lib/i18n/locales/en/messages.json index a01aefa..9a88fdc 100644 --- a/src/lib/i18n/locales/en/messages.json +++ b/src/lib/i18n/locales/en/messages.json @@ -23,28 +23,6 @@ "origin": [["src/components/SettingsControls.tsx", 306]], "translation": "Select theme" }, - "Reload MCP servers": { - "placeholders": {}, - "comments": [], - "origin": [ - [ - "src/app/projects/[projectId]/sessions/[sessionId]/components/sessionSidebar/McpTab.tsx", - 42 - ] - ], - "translation": "Reload MCP servers" - }, - "Close sidebar": { - "placeholders": {}, - "comments": [], - "origin": [ - [ - "src/app/projects/[projectId]/sessions/[sessionId]/components/sessionSidebar/MobileSidebar.tsx", - 173 - ] - ], - "translation": "Close sidebar" - }, "Type your message... (Start with / for commands, @ for files, Enter to send)": { "placeholders": {}, "comments": [], @@ -90,6 +68,28 @@ ], "translation": "Type your message... (Start with / for commands, @ for files, Shift+Enter to send)" }, + "Reload MCP servers": { + "placeholders": {}, + "comments": [], + "origin": [ + [ + "src/app/projects/[projectId]/sessions/[sessionId]/components/sessionSidebar/McpTab.tsx", + 42 + ] + ], + "translation": "Reload MCP servers" + }, + "Close sidebar": { + "placeholders": {}, + "comments": [], + "origin": [ + [ + "src/app/projects/[projectId]/sessions/[sessionId]/components/sessionSidebar/MobileSidebar.tsx", + 173 + ] + ], + "translation": "Close sidebar" + }, "Type your message here... (Start with / for commands, @ for files, Enter to send)": { "placeholders": {}, "comments": [], @@ -114,36 +114,6 @@ ], "translation": "Type your message here... (Start with / for commands, @ for files, Shift+Enter to send)" }, - "Available commands": { - "placeholders": {}, - "comments": [], - "origin": [ - [ - "src/app/projects/[projectId]/components/chatForm/CommandCompletion.tsx", - 193 - ] - ], - "translation": "Available commands" - }, - "Message input with completion support": { - "placeholders": {}, - "comments": [], - "origin": [ - ["src/app/projects/[projectId]/components/chatForm/ChatInput.tsx", 210] - ], - "translation": "Message input with completion support" - }, - "Available files and directories": { - "placeholders": {}, - "comments": [], - "origin": [ - [ - "src/app/projects/[projectId]/components/chatForm/FileCompletion.tsx", - 267 - ] - ], - "translation": "Available files and directories" - }, "Uncommitted changes": { "placeholders": {}, "comments": [], @@ -221,6 +191,36 @@ ], "translation": "Compare to" }, + "Available commands": { + "placeholders": {}, + "comments": [], + "origin": [ + [ + "src/app/projects/[projectId]/components/chatForm/CommandCompletion.tsx", + 193 + ] + ], + "translation": "Available commands" + }, + "Available files and directories": { + "placeholders": {}, + "comments": [], + "origin": [ + [ + "src/app/projects/[projectId]/components/chatForm/FileCompletion.tsx", + 267 + ] + ], + "translation": "Available files and directories" + }, + "Message input with completion support": { + "placeholders": {}, + "comments": [], + "origin": [ + ["src/app/projects/[projectId]/components/chatForm/ChatInput.tsx", 210] + ], + "translation": "Message input with completion support" + }, "session.conversation.abort": { "message": "Abort", "placeholders": {}, @@ -244,6 +244,13 @@ "origin": [["src/components/SettingsControls.tsx", 234]], "translation": "Accept Edits (Auto-approve file edits)" }, + "system_info.feature.uuid_on_sdk_message.description": { + "message": "Adds unique identifiers to SDK messages for better tracking (v1.0.86+)", + "placeholders": {}, + "comments": [], + "origin": [["src/components/SystemInfoCard.tsx", 56]], + "translation": "Adds unique identifiers to SDK messages for better tracking (v1.0.86+)" + }, "chat.autocomplete.active": { "message": "Autocomplete active", "placeholders": {}, @@ -253,6 +260,13 @@ ], "translation": "Autocomplete active" }, + "system_info.available_features": { + "message": "Available Features", + "placeholders": {}, + "comments": [], + "origin": [["src/components/SystemInfoCard.tsx", 175]], + "translation": "Available Features" + }, "sidebar.back.to.projects": { "message": "Back to projects", "placeholders": {}, @@ -273,7 +287,7 @@ "message": "Back to Projects", "placeholders": {}, "comments": [], - "origin": [["src/app/projects/[projectId]/not-found.tsx", 42]], + "origin": [["src/app/projects/[projectId]/not-found.tsx", 45]], "translation": "Back to Projects" }, "project.error.back_to_projects": { @@ -339,6 +353,20 @@ "origin": [["src/components/SettingsControls.tsx", 290]], "translation": "Choose your preferred language" }, + "system_info.feature.agent_sdk.title": { + "message": "Claude Agent SDK", + "placeholders": {}, + "comments": [], + "origin": [["src/components/SystemInfoCard.tsx", 65]], + "translation": "Claude Agent SDK" + }, + "system_info.claude_code": { + "message": "Claude Code", + "placeholders": {}, + "comments": [], + "origin": [["src/components/SystemInfoCard.tsx", 141]], + "translation": "Claude Code" + }, "session.processing": { "message": "Claude Code is processing...", "placeholders": {}, @@ -351,6 +379,13 @@ ], "translation": "Claude Code is processing..." }, + "system_info.viewer_version": { + "message": "Claude Code Viewer", + "placeholders": {}, + "comments": [], + "origin": [["src/components/SystemInfoCard.tsx", 123]], + "translation": "Claude Code Viewer" + }, "settings.input.enter_key_behavior.command_enter": { "message": "Command+Enter to send", "placeholders": {}, @@ -519,9 +554,16 @@ "message": "Display and behavior preferences", "placeholders": {}, "comments": [], - "origin": [["src/components/GlobalSidebar.tsx", 55]], + "origin": [["src/components/GlobalSidebar.tsx", 56]], "translation": "Display and behavior preferences" }, + "system_info.feature.can_use_tool.description": { + "message": "Dynamically control tool usage permissions and request user approval before tool execution (v1.0.82+)", + "placeholders": {}, + "comments": [], + "origin": [["src/components/SystemInfoCard.tsx", 41]], + "translation": "Dynamically control tool usage permissions and request user approval before tool execution (v1.0.82+)" + }, "settings.locale.en": { "message": "English", "placeholders": {}, @@ -581,6 +623,13 @@ "origin": [["src/app/projects/[projectId]/error.tsx", 58]], "translation": "Error ID:" }, + "system_info.executable_path": { + "message": "Executable", + "placeholders": {}, + "comments": [], + "origin": [["src/components/SystemInfoCard.tsx", 146]], + "translation": "Executable" + }, "mcp.error.load_failed": { "message": "Failed to load MCP servers: {error}", "placeholders": { @@ -611,6 +660,13 @@ ], "translation": "Failed to send message. Please try again." }, + "system_info.feature.unknown.description": { + "message": "Feature information not available", + "placeholders": {}, + "comments": [], + "origin": [["src/components/SystemInfoCard.tsx", 81]], + "translation": "Feature information not available" + }, "diff.files": { "message": "files", "placeholders": {}, @@ -661,7 +717,7 @@ "origin": [ [ "src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/AssistantConversationContent.tsx", - 98 + 152 ] ], "translation": "Input Parameters" @@ -727,10 +783,17 @@ "src/app/projects/[projectId]/sessions/[sessionId]/components/sessionSidebar/MobileSidebar.tsx", 115 ], - ["src/components/GlobalSidebar.tsx", 66] + ["src/components/GlobalSidebar.tsx", 67] ], "translation": "Loading settings..." }, + "system_info.loading": { + "message": "Loading system information...", + "placeholders": {}, + "comments": [], + "origin": [["src/components/GlobalSidebar.tsx", 109]], + "translation": "Loading system information..." + }, "directory_picker.loading": { "message": "Loading...", "placeholders": {}, @@ -782,6 +845,13 @@ ], "translation": "Media type not supported for display" }, + "system_info.feature.uuid_on_sdk_message.title": { + "message": "Message UUID Support", + "placeholders": {}, + "comments": [], + "origin": [["src/components/SystemInfoCard.tsx", 50]], + "translation": "Message UUID Support" + }, "project_list.messages": { "message": "Messages:", "placeholders": {}, @@ -852,7 +922,7 @@ "message": "Notifications", "placeholders": {}, "comments": [], - "origin": [["src/components/GlobalSidebar.tsx", 84]], + "origin": [["src/components/GlobalSidebar.tsx", 85]], "translation": "Notifications" }, "settings.notifications": { @@ -927,7 +997,7 @@ "message": "Project Not Found", "placeholders": {}, "comments": [], - "origin": [["src/app/projects/[projectId]/not-found.tsx", 23]], + "origin": [["src/app/projects/[projectId]/not-found.tsx", 26]], "translation": "Project Not Found" }, "diff.push": { @@ -1094,7 +1164,7 @@ "message": "Session Display", "placeholders": {}, "comments": [], - "origin": [["src/components/GlobalSidebar.tsx", 74]], + "origin": [["src/components/GlobalSidebar.tsx", 75]], "translation": "Session Display" }, "settings.session.display": { @@ -1125,7 +1195,7 @@ "message": "Settings", "placeholders": {}, "comments": [], - "origin": [["src/components/GlobalSidebar.tsx", 52]], + "origin": [["src/components/GlobalSidebar.tsx", 53]], "translation": "Settings" }, "settings.tab.title": { @@ -1137,7 +1207,7 @@ "src/app/projects/[projectId]/sessions/[sessionId]/components/sessionSidebar/MobileSidebar.tsx", 278 ], - ["src/components/GlobalSidebar.tsx", 43] + ["src/components/GlobalSidebar.tsx", 44] ], "translation": "Settings for display and notifications" }, @@ -1204,6 +1274,20 @@ "origin": [["src/components/SettingsControls.tsx", 316]], "translation": "System" }, + "system_info.title": { + "message": "System Information", + "placeholders": {}, + "comments": [], + "origin": [["src/components/SystemInfoCard.tsx", 109]], + "translation": "System Information" + }, + "settings.section.system_info": { + "message": "System Information", + "placeholders": {}, + "comments": [], + "origin": [["src/components/GlobalSidebar.tsx", 102]], + "translation": "System Information" + }, "notification.test": { "message": "Test", "placeholders": {}, @@ -1215,7 +1299,7 @@ "message": "The project you are looking for does not exist or has been removed", "placeholders": {}, "comments": [], - "origin": [["src/app/projects/[projectId]/not-found.tsx", 29]], + "origin": [["src/app/projects/[projectId]/not-found.tsx", 32]], "translation": "The project you are looking for does not exist or has been removed" }, "settings.theme": { @@ -1232,7 +1316,7 @@ "origin": [ [ "src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/AssistantConversationContent.tsx", - 53 + 70 ] ], "translation": "Thinking" @@ -1256,7 +1340,7 @@ "origin": [ [ "src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/AssistantConversationContent.tsx", - 122 + 176 ] ], "translation": "Tool Result" @@ -1268,11 +1352,18 @@ "origin": [ [ "src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/AssistantConversationContent.tsx", - 80 + 134 ] ], "translation": "Tool Use" }, + "system_info.feature.can_use_tool.title": { + "message": "Tool Use Permission Control", + "placeholders": {}, + "comments": [], + "origin": [["src/components/SystemInfoCard.tsx", 35]], + "translation": "Tool Use Permission Control" + }, "sessions.total": { "message": "total", "placeholders": {}, @@ -1299,6 +1390,16 @@ "origin": [["src/components/SettingsControls.tsx", 144]], "translation": "Unify sessions with same title" }, + "system_info.unknown": { + "message": "Unknown", + "placeholders": {}, + "comments": [], + "origin": [ + ["src/components/SystemInfoCard.tsx", 151], + ["src/components/SystemInfoCard.tsx", 163] + ], + "translation": "Unknown" + }, "user.content.unsupported_media": { "message": "Unsupported Media", "placeholders": {}, @@ -1323,6 +1424,30 @@ ], "translation": "User uploaded image content" }, + "system_info.feature.agent_sdk.description": { + "message": "Uses Claude Agent SDK instead of Claude Code SDK (v1.0.125+)", + "placeholders": {}, + "comments": [], + "origin": [["src/components/SystemInfoCard.tsx", 71]], + "translation": "Uses Claude Agent SDK instead of Claude Code SDK (v1.0.125+)" + }, + "system_info.version_label": { + "message": "Version", + "placeholders": {}, + "comments": [], + "origin": [ + ["src/components/SystemInfoCard.tsx", 130], + ["src/components/SystemInfoCard.tsx", 159] + ], + "translation": "Version" + }, + "system_info.description": { + "message": "Version and feature information", + "placeholders": {}, + "comments": [], + "origin": [["src/components/SystemInfoCard.tsx", 112]], + "translation": "Version and feature information" + }, "project_list.view_conversations": { "message": "View Conversations", "placeholders": {}, diff --git a/src/lib/i18n/locales/en/messages.ts b/src/lib/i18n/locales/en/messages.ts index aafb3a2..e7c2c7d 100644 --- a/src/lib/i18n/locales/en/messages.ts +++ b/src/lib/i18n/locales/en/messages.ts @@ -1 +1 @@ -/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"Available commands\":[\"Available commands\"],\"Available files and directories\":[\"Available files and directories\"],\"Close sidebar\":[\"Close sidebar\"],\"Compare from\":[\"Compare from\"],\"Compare to\":[\"Compare to\"],\"Failed to commit\":[\"Failed to commit\"],\"Failed to commit and push\":[\"Failed to commit and push\"],\"Failed to push\":[\"Failed to push\"],\"Message input with completion support\":[\"Message input with completion support\"],\"Reload MCP servers\":[\"Reload MCP servers\"],\"Retry Push\":[\"Retry Push\"],\"Select enter key behavior\":[\"Select enter key behavior\"],\"Select language\":[\"Select language\"],\"Select permission mode\":[\"Select permission mode\"],\"Select theme\":[\"Select theme\"],\"Type your message here... (Start with / for commands, @ for files, Command+Enter to send)\":[\"Type your message here... (Start with / for commands, @ for files, Command+Enter to send)\"],\"Type your message here... (Start with / for commands, @ for files, Enter to send)\":[\"Type your message here... (Start with / for commands, @ for files, Enter to send)\"],\"Type your message here... (Start with / for commands, @ for files, Shift+Enter to send)\":[\"Type your message here... (Start with / for commands, @ for files, Shift+Enter to send)\"],\"Type your message... (Start with / for commands, @ for files, Command+Enter to send)\":[\"Type your message... (Start with / for commands, @ for files, Command+Enter to send)\"],\"Type your message... (Start with / for commands, @ for files, Enter to send)\":[\"Type your message... (Start with / for commands, @ for files, Enter to send)\"],\"Type your message... (Start with / for commands, @ for files, Shift+Enter to send)\":[\"Type your message... (Start with / for commands, @ for files, Shift+Enter to send)\"],\"Uncommitted changes\":[\"Uncommitted changes\"],\"assistant.thinking\":[\"Thinking\"],\"assistant.tool.input_parameters\":[\"Input Parameters\"],\"assistant.tool.result\":[\"Tool Result\"],\"assistant.tool_use\":[\"Tool Use\"],\"chat.autocomplete.active\":[\"Autocomplete active\"],\"chat.button.start\":[\"Start Chat\"],\"chat.error.send_failed\":[\"Failed to send message. Please try again.\"],\"chat.modal.title\":[\"Start New Chat\"],\"chat.resume\":[\"Resume\"],\"chat.send\":[\"Send\"],\"chat.status.processing\":[\"Processing...\"],\"common.action.cancel\":[\"Cancel\"],\"common.error\":[\"Error\"],\"common.loading\":[\"Loading...\"],\"conversation.error.raw_content\":[\"Raw Content:\"],\"conversation.error.report_issue\":[\"Report this issue\"],\"conversation.error.schema\":[\"Schema Error\"],\"conversation.error.schema_validation\":[\"Schema Validation Error\"],\"conversation.error.schema_validation.description\":[\"This conversation entry failed to parse correctly. This might indicate a format change or parsing issue.\"],\"diff.commit\":[\"Commit\"],\"diff.commit.changes\":[\"Commit Changes\"],\"diff.commit.message\":[\"Commit message\"],\"diff.commit.push\":[\"Commit & Push\"],\"diff.committing\":[\"Committing...\"],\"diff.committing.pushing\":[\"Committing & Pushing...\"],\"diff.deselect.all\":[\"Deselect All\"],\"diff.enter.message\":[\"Enter a commit message\"],\"diff.files\":[\"files\"],\"diff.files.changed\":[\"files changed\"],\"diff.loading\":[\"Loading diff...\"],\"diff.push\":[\"Push\"],\"diff.pushing\":[\"Pushing...\"],\"diff.select.all\":[\"Select All\"],\"diff.select.file\":[\"Select at least one file\"],\"directory_picker.current\":[\"Current:\"],\"directory_picker.loading\":[\"Loading...\"],\"directory_picker.no_directories\":[\"No directories found\"],\"directory_picker.select\":[\"Select This Directory\"],\"mcp.error.load_failed\":[\"Failed to load MCP servers: \",[\"error\"]],\"mcp.no.servers\":[\"No MCP servers found\"],\"mcp.title\":[\"MCP Servers\"],\"notification.beep\":[\"Beep\"],\"notification.chime\":[\"Chime\"],\"notification.description\":[\"Select a sound to play when a task completes\"],\"notification.none\":[\"None\"],\"notification.ping\":[\"Ping\"],\"notification.pop\":[\"Pop\"],\"notification.test\":[\"Test\"],\"project.create.action.create\":[\"Create Project\"],\"project.create.action.creating\":[\"Creating...\"],\"project.create.description\":[\"Select a directory to initialize as a Claude Code project. This will run <0>/init in the selected directory.\"],\"project.create.selected_directory\":[\"Selected directory:\"],\"project.create.title\":[\"Create New Project\"],\"project.error.back_to_projects\":[\"Back to Projects\"],\"project.error.description\":[\"We encountered an error while loading this project\"],\"project.error.details_title\":[\"Error Details\"],\"project.error.error_id\":[\"Error ID:\"],\"project.error.title\":[\"Failed to load project\"],\"project.error.try_again\":[\"Try Again\"],\"project.new\":[\"New Project\"],\"project.not_found.back_to_projects\":[\"Back to Projects\"],\"project.not_found.description\":[\"The project you are looking for does not exist or has been removed\"],\"project.not_found.title\":[\"Project Not Found\"],\"project_list.last_modified\":[\"Last modified:\"],\"project_list.messages\":[\"Messages:\"],\"project_list.no_projects.description\":[\"No Claude Code projects found in your ~/.claude/projects directory. Start a conversation with Claude Code to create your first project.\"],\"project_list.no_projects.title\":[\"No projects found\"],\"project_list.view_conversations\":[\"View Conversations\"],\"projects.page.description\":[\"Browse your Claude Code conversation history and project interactions\"],\"projects.page.loading\":[\"Loading projects...\"],\"projects.page.title\":[\"Your Projects\"],\"session.conversation.abort\":[\"Abort\"],\"session.conversation.in.progress\":[\"Conversation is in progress...\"],\"session.conversation.paused\":[\"Conversation is paused...\"],\"session.processing\":[\"Claude Code is processing...\"],\"session.status.paused\":[\"Paused\"],\"session.status.running\":[\"Running\"],\"sessions.load.more\":[\"Load More\"],\"sessions.new\":[\"New\"],\"sessions.title\":[\"Sessions\"],\"sessions.total\":[\"total\"],\"settings.description\":[\"Display and behavior preferences\"],\"settings.input.enter_key_behavior\":[\"Enter Key Behavior\"],\"settings.input.enter_key_behavior.command_enter\":[\"Command+Enter to send\"],\"settings.input.enter_key_behavior.description\":[\"Choose how the Enter key behaves in message input\"],\"settings.input.enter_key_behavior.enter\":[\"Enter to send\"],\"settings.input.enter_key_behavior.shift_enter\":[\"Shift+Enter to send (default)\"],\"settings.loading\":[\"Loading settings...\"],\"settings.locale\":[\"Language\"],\"settings.locale.description\":[\"Choose your preferred language\"],\"settings.locale.en\":[\"English\"],\"settings.locale.ja\":[\"日本語\"],\"settings.notifications\":[\"Notifications\"],\"settings.permission.mode\":[\"Permission Mode\"],\"settings.permission.mode.accept_edits\":[\"Accept Edits (Auto-approve file edits)\"],\"settings.permission.mode.bypass_permissions\":[\"Bypass Permissions (No prompts)\"],\"settings.permission.mode.default\":[\"Default (Ask permission)\"],\"settings.permission.mode.description\":[\"Control how Claude Code handles permission requests for file operations\"],\"settings.permission.mode.plan\":[\"Plan Mode (Planning only)\"],\"settings.section.notifications\":[\"Notifications\"],\"settings.section.session_display\":[\"Session Display\"],\"settings.session.display\":[\"Session Display\"],\"settings.session.hide_no_user_message\":[\"Hide sessions without user messages\"],\"settings.session.hide_no_user_message.description\":[\"Only show sessions that contain user commands or messages\"],\"settings.session.unify_same_title\":[\"Unify sessions with same title\"],\"settings.session.unify_same_title.description\":[\"Show only the latest session when multiple sessions have the same title\"],\"settings.tab.title\":[\"Settings for display and notifications\"],\"settings.theme\":[\"Theme\"],\"settings.theme.dark\":[\"Dark\"],\"settings.theme.description\":[\"Choose your preferred color theme\"],\"settings.theme.light\":[\"Light\"],\"settings.theme.system\":[\"System\"],\"settings.title\":[\"Settings\"],\"sidebar.back.to.projects\":[\"Back to projects\"],\"sidebar.show.mcp.settings\":[\"Show MCP server settings\"],\"sidebar.show.session.list\":[\"Show session list\"],\"user.content.image\":[\"Image\"],\"user.content.image.description\":[\"User uploaded image content\"],\"user.content.unsupported_media\":[\"Unsupported Media\"],\"user.content.unsupported_media.description\":[\"Media type not supported for display\"]}")as Messages; \ No newline at end of file +/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"Available commands\":[\"Available commands\"],\"Available files and directories\":[\"Available files and directories\"],\"Close sidebar\":[\"Close sidebar\"],\"Compare from\":[\"Compare from\"],\"Compare to\":[\"Compare to\"],\"Failed to commit\":[\"Failed to commit\"],\"Failed to commit and push\":[\"Failed to commit and push\"],\"Failed to push\":[\"Failed to push\"],\"Message input with completion support\":[\"Message input with completion support\"],\"Reload MCP servers\":[\"Reload MCP servers\"],\"Retry Push\":[\"Retry Push\"],\"Select enter key behavior\":[\"Select enter key behavior\"],\"Select language\":[\"Select language\"],\"Select permission mode\":[\"Select permission mode\"],\"Select theme\":[\"Select theme\"],\"Type your message here... (Start with / for commands, @ for files, Command+Enter to send)\":[\"Type your message here... (Start with / for commands, @ for files, Command+Enter to send)\"],\"Type your message here... (Start with / for commands, @ for files, Enter to send)\":[\"Type your message here... (Start with / for commands, @ for files, Enter to send)\"],\"Type your message here... (Start with / for commands, @ for files, Shift+Enter to send)\":[\"Type your message here... (Start with / for commands, @ for files, Shift+Enter to send)\"],\"Type your message... (Start with / for commands, @ for files, Command+Enter to send)\":[\"Type your message... (Start with / for commands, @ for files, Command+Enter to send)\"],\"Type your message... (Start with / for commands, @ for files, Enter to send)\":[\"Type your message... (Start with / for commands, @ for files, Enter to send)\"],\"Type your message... (Start with / for commands, @ for files, Shift+Enter to send)\":[\"Type your message... (Start with / for commands, @ for files, Shift+Enter to send)\"],\"Uncommitted changes\":[\"Uncommitted changes\"],\"assistant.thinking\":[\"Thinking\"],\"assistant.tool.input_parameters\":[\"Input Parameters\"],\"assistant.tool.result\":[\"Tool Result\"],\"assistant.tool_use\":[\"Tool Use\"],\"chat.autocomplete.active\":[\"Autocomplete active\"],\"chat.button.start\":[\"Start Chat\"],\"chat.error.send_failed\":[\"Failed to send message. Please try again.\"],\"chat.modal.title\":[\"Start New Chat\"],\"chat.resume\":[\"Resume\"],\"chat.send\":[\"Send\"],\"chat.status.processing\":[\"Processing...\"],\"common.action.cancel\":[\"Cancel\"],\"common.error\":[\"Error\"],\"common.loading\":[\"Loading...\"],\"conversation.error.raw_content\":[\"Raw Content:\"],\"conversation.error.report_issue\":[\"Report this issue\"],\"conversation.error.schema\":[\"Schema Error\"],\"conversation.error.schema_validation\":[\"Schema Validation Error\"],\"conversation.error.schema_validation.description\":[\"This conversation entry failed to parse correctly. This might indicate a format change or parsing issue.\"],\"diff.commit\":[\"Commit\"],\"diff.commit.changes\":[\"Commit Changes\"],\"diff.commit.message\":[\"Commit message\"],\"diff.commit.push\":[\"Commit & Push\"],\"diff.committing\":[\"Committing...\"],\"diff.committing.pushing\":[\"Committing & Pushing...\"],\"diff.deselect.all\":[\"Deselect All\"],\"diff.enter.message\":[\"Enter a commit message\"],\"diff.files\":[\"files\"],\"diff.files.changed\":[\"files changed\"],\"diff.loading\":[\"Loading diff...\"],\"diff.push\":[\"Push\"],\"diff.pushing\":[\"Pushing...\"],\"diff.select.all\":[\"Select All\"],\"diff.select.file\":[\"Select at least one file\"],\"directory_picker.current\":[\"Current:\"],\"directory_picker.loading\":[\"Loading...\"],\"directory_picker.no_directories\":[\"No directories found\"],\"directory_picker.select\":[\"Select This Directory\"],\"mcp.error.load_failed\":[\"Failed to load MCP servers: \",[\"error\"]],\"mcp.no.servers\":[\"No MCP servers found\"],\"mcp.title\":[\"MCP Servers\"],\"notification.beep\":[\"Beep\"],\"notification.chime\":[\"Chime\"],\"notification.description\":[\"Select a sound to play when a task completes\"],\"notification.none\":[\"None\"],\"notification.ping\":[\"Ping\"],\"notification.pop\":[\"Pop\"],\"notification.test\":[\"Test\"],\"project.create.action.create\":[\"Create Project\"],\"project.create.action.creating\":[\"Creating...\"],\"project.create.description\":[\"Select a directory to initialize as a Claude Code project. This will run <0>/init in the selected directory.\"],\"project.create.selected_directory\":[\"Selected directory:\"],\"project.create.title\":[\"Create New Project\"],\"project.error.back_to_projects\":[\"Back to Projects\"],\"project.error.description\":[\"We encountered an error while loading this project\"],\"project.error.details_title\":[\"Error Details\"],\"project.error.error_id\":[\"Error ID:\"],\"project.error.title\":[\"Failed to load project\"],\"project.error.try_again\":[\"Try Again\"],\"project.new\":[\"New Project\"],\"project.not_found.back_to_projects\":[\"Back to Projects\"],\"project.not_found.description\":[\"The project you are looking for does not exist or has been removed\"],\"project.not_found.title\":[\"Project Not Found\"],\"project_list.last_modified\":[\"Last modified:\"],\"project_list.messages\":[\"Messages:\"],\"project_list.no_projects.description\":[\"No Claude Code projects found in your ~/.claude/projects directory. Start a conversation with Claude Code to create your first project.\"],\"project_list.no_projects.title\":[\"No projects found\"],\"project_list.view_conversations\":[\"View Conversations\"],\"projects.page.description\":[\"Browse your Claude Code conversation history and project interactions\"],\"projects.page.loading\":[\"Loading projects...\"],\"projects.page.title\":[\"Your Projects\"],\"session.conversation.abort\":[\"Abort\"],\"session.conversation.in.progress\":[\"Conversation is in progress...\"],\"session.conversation.paused\":[\"Conversation is paused...\"],\"session.processing\":[\"Claude Code is processing...\"],\"session.status.paused\":[\"Paused\"],\"session.status.running\":[\"Running\"],\"sessions.load.more\":[\"Load More\"],\"sessions.new\":[\"New\"],\"sessions.title\":[\"Sessions\"],\"sessions.total\":[\"total\"],\"settings.description\":[\"Display and behavior preferences\"],\"settings.input.enter_key_behavior\":[\"Enter Key Behavior\"],\"settings.input.enter_key_behavior.command_enter\":[\"Command+Enter to send\"],\"settings.input.enter_key_behavior.description\":[\"Choose how the Enter key behaves in message input\"],\"settings.input.enter_key_behavior.enter\":[\"Enter to send\"],\"settings.input.enter_key_behavior.shift_enter\":[\"Shift+Enter to send (default)\"],\"settings.loading\":[\"Loading settings...\"],\"settings.locale\":[\"Language\"],\"settings.locale.description\":[\"Choose your preferred language\"],\"settings.locale.en\":[\"English\"],\"settings.locale.ja\":[\"日本語\"],\"settings.notifications\":[\"Notifications\"],\"settings.permission.mode\":[\"Permission Mode\"],\"settings.permission.mode.accept_edits\":[\"Accept Edits (Auto-approve file edits)\"],\"settings.permission.mode.bypass_permissions\":[\"Bypass Permissions (No prompts)\"],\"settings.permission.mode.default\":[\"Default (Ask permission)\"],\"settings.permission.mode.description\":[\"Control how Claude Code handles permission requests for file operations\"],\"settings.permission.mode.plan\":[\"Plan Mode (Planning only)\"],\"settings.section.notifications\":[\"Notifications\"],\"settings.section.session_display\":[\"Session Display\"],\"settings.section.system_info\":[\"System Information\"],\"settings.session.display\":[\"Session Display\"],\"settings.session.hide_no_user_message\":[\"Hide sessions without user messages\"],\"settings.session.hide_no_user_message.description\":[\"Only show sessions that contain user commands or messages\"],\"settings.session.unify_same_title\":[\"Unify sessions with same title\"],\"settings.session.unify_same_title.description\":[\"Show only the latest session when multiple sessions have the same title\"],\"settings.tab.title\":[\"Settings for display and notifications\"],\"settings.theme\":[\"Theme\"],\"settings.theme.dark\":[\"Dark\"],\"settings.theme.description\":[\"Choose your preferred color theme\"],\"settings.theme.light\":[\"Light\"],\"settings.theme.system\":[\"System\"],\"settings.title\":[\"Settings\"],\"sidebar.back.to.projects\":[\"Back to projects\"],\"sidebar.show.mcp.settings\":[\"Show MCP server settings\"],\"sidebar.show.session.list\":[\"Show session list\"],\"system_info.available_features\":[\"Available Features\"],\"system_info.claude_code\":[\"Claude Code\"],\"system_info.description\":[\"Version and feature information\"],\"system_info.executable_path\":[\"Executable\"],\"system_info.feature.agent_sdk.description\":[\"Uses Claude Agent SDK instead of Claude Code SDK (v1.0.125+)\"],\"system_info.feature.agent_sdk.title\":[\"Claude Agent SDK\"],\"system_info.feature.can_use_tool.description\":[\"Dynamically control tool usage permissions and request user approval before tool execution (v1.0.82+)\"],\"system_info.feature.can_use_tool.title\":[\"Tool Use Permission Control\"],\"system_info.feature.unknown.description\":[\"Feature information not available\"],\"system_info.feature.uuid_on_sdk_message.description\":[\"Adds unique identifiers to SDK messages for better tracking (v1.0.86+)\"],\"system_info.feature.uuid_on_sdk_message.title\":[\"Message UUID Support\"],\"system_info.loading\":[\"Loading system information...\"],\"system_info.title\":[\"System Information\"],\"system_info.unknown\":[\"Unknown\"],\"system_info.version_label\":[\"Version\"],\"system_info.viewer_version\":[\"Claude Code Viewer\"],\"user.content.image\":[\"Image\"],\"user.content.image.description\":[\"User uploaded image content\"],\"user.content.unsupported_media\":[\"Unsupported Media\"],\"user.content.unsupported_media.description\":[\"Media type not supported for display\"]}")as Messages; \ No newline at end of file diff --git a/src/lib/i18n/locales/ja/messages.json b/src/lib/i18n/locales/ja/messages.json index 2efc524..123cb04 100644 --- a/src/lib/i18n/locales/ja/messages.json +++ b/src/lib/i18n/locales/ja/messages.json @@ -23,28 +23,6 @@ "origin": [["src/components/SettingsControls.tsx", 306]], "translation": "テーマを選択" }, - "Reload MCP servers": { - "placeholders": {}, - "comments": [], - "origin": [ - [ - "src/app/projects/[projectId]/sessions/[sessionId]/components/sessionSidebar/McpTab.tsx", - 42 - ] - ], - "translation": "MCPサーバーを再読み込み" - }, - "Close sidebar": { - "placeholders": {}, - "comments": [], - "origin": [ - [ - "src/app/projects/[projectId]/sessions/[sessionId]/components/sessionSidebar/MobileSidebar.tsx", - 173 - ] - ], - "translation": "サイドバーを閉じる" - }, "Type your message... (Start with / for commands, @ for files, Enter to send)": { "placeholders": {}, "comments": [], @@ -90,6 +68,28 @@ ], "translation": "メッセージを入力... (/でコマンド、@でファイル、Shift+Enterで送信)" }, + "Reload MCP servers": { + "placeholders": {}, + "comments": [], + "origin": [ + [ + "src/app/projects/[projectId]/sessions/[sessionId]/components/sessionSidebar/McpTab.tsx", + 42 + ] + ], + "translation": "MCPサーバーを再読み込み" + }, + "Close sidebar": { + "placeholders": {}, + "comments": [], + "origin": [ + [ + "src/app/projects/[projectId]/sessions/[sessionId]/components/sessionSidebar/MobileSidebar.tsx", + 173 + ] + ], + "translation": "サイドバーを閉じる" + }, "Type your message here... (Start with / for commands, @ for files, Enter to send)": { "placeholders": {}, "comments": [], @@ -114,36 +114,6 @@ ], "translation": "ここにメッセージを入力... (/でコマンド、@でファイル、Shift+Enterで送信)" }, - "Available commands": { - "placeholders": {}, - "comments": [], - "origin": [ - [ - "src/app/projects/[projectId]/components/chatForm/CommandCompletion.tsx", - 193 - ] - ], - "translation": "利用可能なコマンド" - }, - "Message input with completion support": { - "placeholders": {}, - "comments": [], - "origin": [ - ["src/app/projects/[projectId]/components/chatForm/ChatInput.tsx", 210] - ], - "translation": "補完機能付きメッセージ入力" - }, - "Available files and directories": { - "placeholders": {}, - "comments": [], - "origin": [ - [ - "src/app/projects/[projectId]/components/chatForm/FileCompletion.tsx", - 267 - ] - ], - "translation": "利用可能なファイルとディレクトリ" - }, "Uncommitted changes": { "placeholders": {}, "comments": [], @@ -221,6 +191,36 @@ ], "translation": "比較先" }, + "Available commands": { + "placeholders": {}, + "comments": [], + "origin": [ + [ + "src/app/projects/[projectId]/components/chatForm/CommandCompletion.tsx", + 193 + ] + ], + "translation": "利用可能なコマンド" + }, + "Available files and directories": { + "placeholders": {}, + "comments": [], + "origin": [ + [ + "src/app/projects/[projectId]/components/chatForm/FileCompletion.tsx", + 267 + ] + ], + "translation": "利用可能なファイルとディレクトリ" + }, + "Message input with completion support": { + "placeholders": {}, + "comments": [], + "origin": [ + ["src/app/projects/[projectId]/components/chatForm/ChatInput.tsx", 210] + ], + "translation": "補完機能付きメッセージ入力" + }, "session.conversation.abort": { "message": "Abort", "placeholders": {}, @@ -244,6 +244,13 @@ "origin": [["src/components/SettingsControls.tsx", 234]], "translation": "編集を承認(ファイル編集を自動承認)" }, + "system_info.feature.uuid_on_sdk_message.description": { + "message": "Adds unique identifiers to SDK messages for better tracking (v1.0.86+)", + "placeholders": {}, + "comments": [], + "origin": [["src/components/SystemInfoCard.tsx", 56]], + "translation": "SDKメッセージに一意の識別子を追加して追跡を改善します (v1.0.86+)" + }, "chat.autocomplete.active": { "message": "Autocomplete active", "placeholders": {}, @@ -253,6 +260,13 @@ ], "translation": "オートコンプリート有効" }, + "system_info.available_features": { + "message": "Available Features", + "placeholders": {}, + "comments": [], + "origin": [["src/components/SystemInfoCard.tsx", 175]], + "translation": "利用可能機能" + }, "sidebar.back.to.projects": { "message": "Back to projects", "placeholders": {}, @@ -273,7 +287,7 @@ "message": "Back to Projects", "placeholders": {}, "comments": [], - "origin": [["src/app/projects/[projectId]/not-found.tsx", 42]], + "origin": [["src/app/projects/[projectId]/not-found.tsx", 45]], "translation": "プロジェクト一覧に戻る" }, "project.error.back_to_projects": { @@ -339,6 +353,20 @@ "origin": [["src/components/SettingsControls.tsx", 290]], "translation": "お好みの言語を選択" }, + "system_info.feature.agent_sdk.title": { + "message": "Claude Agent SDK", + "placeholders": {}, + "comments": [], + "origin": [["src/components/SystemInfoCard.tsx", 65]], + "translation": "Claude Agent SDK" + }, + "system_info.claude_code": { + "message": "Claude Code", + "placeholders": {}, + "comments": [], + "origin": [["src/components/SystemInfoCard.tsx", 141]], + "translation": "Claude Code" + }, "session.processing": { "message": "Claude Code is processing...", "placeholders": {}, @@ -351,6 +379,13 @@ ], "translation": "Claude Codeが処理中..." }, + "system_info.viewer_version": { + "message": "Claude Code Viewer", + "placeholders": {}, + "comments": [], + "origin": [["src/components/SystemInfoCard.tsx", 123]], + "translation": "Claude Code Viewer" + }, "settings.input.enter_key_behavior.command_enter": { "message": "Command+Enter to send", "placeholders": {}, @@ -519,9 +554,16 @@ "message": "Display and behavior preferences", "placeholders": {}, "comments": [], - "origin": [["src/components/GlobalSidebar.tsx", 55]], + "origin": [["src/components/GlobalSidebar.tsx", 56]], "translation": "表示と動作の設定" }, + "system_info.feature.can_use_tool.description": { + "message": "Dynamically control tool usage permissions and request user approval before tool execution (v1.0.82+)", + "placeholders": {}, + "comments": [], + "origin": [["src/components/SystemInfoCard.tsx", 41]], + "translation": "動的にツールの使用許可を制御し、ツール実行前にユーザーの承認を求めることができます (v1.0.82+)" + }, "settings.locale.en": { "message": "English", "placeholders": {}, @@ -581,6 +623,13 @@ "origin": [["src/app/projects/[projectId]/error.tsx", 58]], "translation": "エラーID:" }, + "system_info.executable_path": { + "message": "Executable", + "placeholders": {}, + "comments": [], + "origin": [["src/components/SystemInfoCard.tsx", 146]], + "translation": "実行ファイル" + }, "mcp.error.load_failed": { "message": "Failed to load MCP servers: {error}", "placeholders": { @@ -611,6 +660,13 @@ ], "translation": "メッセージの送信に失敗しました。もう一度お試しください。" }, + "system_info.feature.unknown.description": { + "message": "Feature information not available", + "placeholders": {}, + "comments": [], + "origin": [["src/components/SystemInfoCard.tsx", 81]], + "translation": "機能情報は利用できません" + }, "diff.files": { "message": "files", "placeholders": {}, @@ -661,7 +717,7 @@ "origin": [ [ "src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/AssistantConversationContent.tsx", - 98 + 152 ] ], "translation": "入力パラメータ" @@ -727,10 +783,17 @@ "src/app/projects/[projectId]/sessions/[sessionId]/components/sessionSidebar/MobileSidebar.tsx", 115 ], - ["src/components/GlobalSidebar.tsx", 66] + ["src/components/GlobalSidebar.tsx", 67] ], "translation": "設定を読み込み中..." }, + "system_info.loading": { + "message": "Loading system information...", + "placeholders": {}, + "comments": [], + "origin": [["src/components/GlobalSidebar.tsx", 109]], + "translation": "システム情報を読み込んでいます..." + }, "directory_picker.loading": { "message": "Loading...", "placeholders": {}, @@ -782,6 +845,13 @@ ], "translation": "表示がサポートされていないメディア形式です" }, + "system_info.feature.uuid_on_sdk_message.title": { + "message": "Message UUID Support", + "placeholders": {}, + "comments": [], + "origin": [["src/components/SystemInfoCard.tsx", 50]], + "translation": "メッセージUUIDサポート" + }, "project_list.messages": { "message": "Messages:", "placeholders": {}, @@ -852,7 +922,7 @@ "message": "Notifications", "placeholders": {}, "comments": [], - "origin": [["src/components/GlobalSidebar.tsx", 84]], + "origin": [["src/components/GlobalSidebar.tsx", 85]], "translation": "通知" }, "settings.notifications": { @@ -927,7 +997,7 @@ "message": "Project Not Found", "placeholders": {}, "comments": [], - "origin": [["src/app/projects/[projectId]/not-found.tsx", 23]], + "origin": [["src/app/projects/[projectId]/not-found.tsx", 26]], "translation": "プロジェクトが見つかりません" }, "diff.push": { @@ -1094,7 +1164,7 @@ "message": "Session Display", "placeholders": {}, "comments": [], - "origin": [["src/components/GlobalSidebar.tsx", 74]], + "origin": [["src/components/GlobalSidebar.tsx", 75]], "translation": "セッション表示" }, "settings.session.display": { @@ -1125,7 +1195,7 @@ "message": "Settings", "placeholders": {}, "comments": [], - "origin": [["src/components/GlobalSidebar.tsx", 52]], + "origin": [["src/components/GlobalSidebar.tsx", 53]], "translation": "設定" }, "settings.tab.title": { @@ -1137,7 +1207,7 @@ "src/app/projects/[projectId]/sessions/[sessionId]/components/sessionSidebar/MobileSidebar.tsx", 278 ], - ["src/components/GlobalSidebar.tsx", 43] + ["src/components/GlobalSidebar.tsx", 44] ], "translation": "表示と通知の設定" }, @@ -1204,6 +1274,20 @@ "origin": [["src/components/SettingsControls.tsx", 316]], "translation": "システム" }, + "system_info.title": { + "message": "System Information", + "placeholders": {}, + "comments": [], + "origin": [["src/components/SystemInfoCard.tsx", 109]], + "translation": "システム情報" + }, + "settings.section.system_info": { + "message": "System Information", + "placeholders": {}, + "comments": [], + "origin": [["src/components/GlobalSidebar.tsx", 102]], + "translation": "システム情報" + }, "notification.test": { "message": "Test", "placeholders": {}, @@ -1215,7 +1299,7 @@ "message": "The project you are looking for does not exist or has been removed", "placeholders": {}, "comments": [], - "origin": [["src/app/projects/[projectId]/not-found.tsx", 29]], + "origin": [["src/app/projects/[projectId]/not-found.tsx", 32]], "translation": "お探しのプロジェクトは存在しないか、削除されています" }, "settings.theme": { @@ -1232,7 +1316,7 @@ "origin": [ [ "src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/AssistantConversationContent.tsx", - 53 + 70 ] ], "translation": "思考中" @@ -1256,7 +1340,7 @@ "origin": [ [ "src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/AssistantConversationContent.tsx", - 122 + 176 ] ], "translation": "ツール実行結果" @@ -1268,11 +1352,18 @@ "origin": [ [ "src/app/projects/[projectId]/sessions/[sessionId]/components/conversationList/AssistantConversationContent.tsx", - 80 + 134 ] ], "translation": "ツール使用" }, + "system_info.feature.can_use_tool.title": { + "message": "Tool Use Permission Control", + "placeholders": {}, + "comments": [], + "origin": [["src/components/SystemInfoCard.tsx", 35]], + "translation": "ツール使用権限制御" + }, "sessions.total": { "message": "total", "placeholders": {}, @@ -1299,6 +1390,16 @@ "origin": [["src/components/SettingsControls.tsx", 144]], "translation": "同じタイトルのセッションを統合" }, + "system_info.unknown": { + "message": "Unknown", + "placeholders": {}, + "comments": [], + "origin": [ + ["src/components/SystemInfoCard.tsx", 151], + ["src/components/SystemInfoCard.tsx", 163] + ], + "translation": "不明" + }, "user.content.unsupported_media": { "message": "Unsupported Media", "placeholders": {}, @@ -1323,6 +1424,30 @@ ], "translation": "ユーザーがアップロードした画像コンテンツ" }, + "system_info.feature.agent_sdk.description": { + "message": "Uses Claude Agent SDK instead of Claude Code SDK (v1.0.125+)", + "placeholders": {}, + "comments": [], + "origin": [["src/components/SystemInfoCard.tsx", 71]], + "translation": "Claude Code SDKではなくClaude Agent SDKを使用 (v1.0.125+)" + }, + "system_info.version_label": { + "message": "Version", + "placeholders": {}, + "comments": [], + "origin": [ + ["src/components/SystemInfoCard.tsx", 130], + ["src/components/SystemInfoCard.tsx", 159] + ], + "translation": "バージョン" + }, + "system_info.description": { + "message": "Version and feature information", + "placeholders": {}, + "comments": [], + "origin": [["src/components/SystemInfoCard.tsx", 112]], + "translation": "バージョンと機能情報" + }, "project_list.view_conversations": { "message": "View Conversations", "placeholders": {}, diff --git a/src/lib/i18n/locales/ja/messages.ts b/src/lib/i18n/locales/ja/messages.ts index dc9cf88..081d224 100644 --- a/src/lib/i18n/locales/ja/messages.ts +++ b/src/lib/i18n/locales/ja/messages.ts @@ -1 +1 @@ -/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"Available commands\":[\"利用可能なコマンド\"],\"Available files and directories\":[\"利用可能なファイルとディレクトリ\"],\"Close sidebar\":[\"サイドバーを閉じる\"],\"Compare from\":[\"比較元\"],\"Compare to\":[\"比較先\"],\"Failed to commit\":[\"コミットに失敗しました\"],\"Failed to commit and push\":[\"コミットとプッシュに失敗しました\"],\"Failed to push\":[\"プッシュに失敗しました\"],\"Message input with completion support\":[\"補完機能付きメッセージ入力\"],\"Reload MCP servers\":[\"MCPサーバーを再読み込み\"],\"Retry Push\":[\"プッシュを再試行\"],\"Select enter key behavior\":[\"Enterキーの動作を選択\"],\"Select language\":[\"言語を選択\"],\"Select permission mode\":[\"権限モードを選択\"],\"Select theme\":[\"テーマを選択\"],\"Type your message here... (Start with / for commands, @ for files, Command+Enter to send)\":[\"ここにメッセージを入力... (/でコマンド、@でファイル、Command+Enterで送信)\"],\"Type your message here... (Start with / for commands, @ for files, Enter to send)\":[\"ここにメッセージを入力... (/でコマンド、@でファイル、Enterで送信)\"],\"Type your message here... (Start with / for commands, @ for files, Shift+Enter to send)\":[\"ここにメッセージを入力... (/でコマンド、@でファイル、Shift+Enterで送信)\"],\"Type your message... (Start with / for commands, @ for files, Command+Enter to send)\":[\"メッセージを入力... (/でコマンド、@でファイル、Command+Enterで送信)\"],\"Type your message... (Start with / for commands, @ for files, Enter to send)\":[\"メッセージを入力... (/でコマンド、@でファイル、Enterで送信)\"],\"Type your message... (Start with / for commands, @ for files, Shift+Enter to send)\":[\"メッセージを入力... (/でコマンド、@でファイル、Shift+Enterで送信)\"],\"Uncommitted changes\":[\"未コミットの変更\"],\"assistant.thinking\":[\"思考中\"],\"assistant.tool.input_parameters\":[\"入力パラメータ\"],\"assistant.tool.result\":[\"ツール実行結果\"],\"assistant.tool_use\":[\"ツール使用\"],\"chat.autocomplete.active\":[\"オートコンプリート有効\"],\"chat.button.start\":[\"チャット開始\"],\"chat.error.send_failed\":[\"メッセージの送信に失敗しました。もう一度お試しください。\"],\"chat.modal.title\":[\"新しいチャットを開始\"],\"chat.resume\":[\"再開\"],\"chat.send\":[\"送信\"],\"chat.status.processing\":[\"処理中...\"],\"common.action.cancel\":[\"キャンセル\"],\"common.error\":[\"エラー\"],\"common.loading\":[\"読み込み中...\"],\"conversation.error.raw_content\":[\"生データ:\"],\"conversation.error.report_issue\":[\"この問題を報告\"],\"conversation.error.schema\":[\"スキーマエラー\"],\"conversation.error.schema_validation\":[\"スキーマ検証エラー\"],\"conversation.error.schema_validation.description\":[\"この会話エントリの解析に失敗しました。フォーマットの変更または解析の問題が考えられます。\"],\"diff.commit\":[\"コミット\"],\"diff.commit.changes\":[\"変更をコミット\"],\"diff.commit.message\":[\"コミットメッセージ\"],\"diff.commit.push\":[\"コミット&プッシュ\"],\"diff.committing\":[\"コミット中...\"],\"diff.committing.pushing\":[\"コミット&プッシュ中...\"],\"diff.deselect.all\":[\"すべて選択解除\"],\"diff.enter.message\":[\"コミットメッセージを入力\"],\"diff.files\":[\"ファイル\"],\"diff.files.changed\":[\"ファイルが変更されました\"],\"diff.loading\":[\"差分を読み込み中...\"],\"diff.push\":[\"プッシュ\"],\"diff.pushing\":[\"プッシュ中...\"],\"diff.select.all\":[\"すべて選択\"],\"diff.select.file\":[\"少なくとも1つのファイルを選択してください\"],\"directory_picker.current\":[\"現在:\"],\"directory_picker.loading\":[\"読み込み中...\"],\"directory_picker.no_directories\":[\"ディレクトリが見つかりません\"],\"directory_picker.select\":[\"このディレクトリを選択\"],\"mcp.error.load_failed\":[\"MCPサーバーの読み込みに失敗しました: \",[\"error\"]],\"mcp.no.servers\":[\"MCPサーバーが見つかりません\"],\"mcp.title\":[\"MCPサーバー\"],\"notification.beep\":[\"ビープ音\"],\"notification.chime\":[\"チャイム\"],\"notification.description\":[\"Claude Code のタスクが完了した時に再生する音を選択してください\"],\"notification.none\":[\"なし\"],\"notification.ping\":[\"ピン\"],\"notification.pop\":[\"ポップ\"],\"notification.test\":[\"テスト\"],\"project.create.action.create\":[\"プロジェクトを作成\"],\"project.create.action.creating\":[\"作成中...\"],\"project.create.description\":[\"Claude Codeプロジェクトとして初期化するディレクトリを選択してください。選択したディレクトリで<0>/initが実行されます。\"],\"project.create.selected_directory\":[\"選択したディレクトリ:\"],\"project.create.title\":[\"新規プロジェクトを作成\"],\"project.error.back_to_projects\":[\"プロジェクト一覧に戻る\"],\"project.error.description\":[\"このプロジェクトの読み込み中にエラーが発生しました\"],\"project.error.details_title\":[\"エラー詳細\"],\"project.error.error_id\":[\"エラーID:\"],\"project.error.title\":[\"プロジェクトの読み込みに失敗しました\"],\"project.error.try_again\":[\"再試行\"],\"project.new\":[\"新規プロジェクト\"],\"project.not_found.back_to_projects\":[\"プロジェクト一覧に戻る\"],\"project.not_found.description\":[\"お探しのプロジェクトは存在しないか、削除されています\"],\"project.not_found.title\":[\"プロジェクトが見つかりません\"],\"project_list.last_modified\":[\"最終更新:\"],\"project_list.messages\":[\"メッセージ:\"],\"project_list.no_projects.description\":[\"~/.claude/projectsディレクトリにClaude Codeプロジェクトが見つかりません。Claude Codeとの会話を開始して、最初のプロジェクトを作成してください。\"],\"project_list.no_projects.title\":[\"プロジェクトが見つかりません\"],\"project_list.view_conversations\":[\"会話を表示\"],\"projects.page.description\":[\"Claude Codeの会話履歴とプロジェクトの操作を閲覧\"],\"projects.page.loading\":[\"プロジェクトを読み込み中...\"],\"projects.page.title\":[\"プロジェクト\"],\"session.conversation.abort\":[\"中止\"],\"session.conversation.in.progress\":[\"会話を進行中...\"],\"session.conversation.paused\":[\"会話を一時停止中...\"],\"session.processing\":[\"Claude Codeが処理中...\"],\"session.status.paused\":[\"一時停止\"],\"session.status.running\":[\"実行中\"],\"sessions.load.more\":[\"さらに読み込む\"],\"sessions.new\":[\"新規\"],\"sessions.title\":[\"セッション\"],\"sessions.total\":[\"合計\"],\"settings.description\":[\"表示と動作の設定\"],\"settings.input.enter_key_behavior\":[\"Enterキーの動作\"],\"settings.input.enter_key_behavior.command_enter\":[\"Command+Enterで送信\"],\"settings.input.enter_key_behavior.description\":[\"メッセージ入力でのEnterキーの動作を選択\"],\"settings.input.enter_key_behavior.enter\":[\"Enterで送信\"],\"settings.input.enter_key_behavior.shift_enter\":[\"Shift+Enterで送信(デフォルト)\"],\"settings.loading\":[\"設定を読み込み中...\"],\"settings.locale\":[\"言語\"],\"settings.locale.description\":[\"お好みの言語を選択\"],\"settings.locale.en\":[\"English\"],\"settings.locale.ja\":[\"日本語\"],\"settings.notifications\":[\"通知\"],\"settings.permission.mode\":[\"権限モード\"],\"settings.permission.mode.accept_edits\":[\"編集を承認(ファイル編集を自動承認)\"],\"settings.permission.mode.bypass_permissions\":[\"権限をバイパス(プロンプトなし)\"],\"settings.permission.mode.default\":[\"デフォルト(権限を確認)\"],\"settings.permission.mode.description\":[\"ファイル操作の権限リクエストの処理方法を制御\"],\"settings.permission.mode.plan\":[\"プランモード(計画のみ)\"],\"settings.section.notifications\":[\"通知\"],\"settings.section.session_display\":[\"セッション表示\"],\"settings.session.display\":[\"セッション表示\"],\"settings.session.hide_no_user_message\":[\"ユーザーメッセージのないセッションを非表示\"],\"settings.session.hide_no_user_message.description\":[\"ユーザーコマンドまたはメッセージを含むセッションのみを表示\"],\"settings.session.unify_same_title\":[\"同じタイトルのセッションを統合\"],\"settings.session.unify_same_title.description\":[\"同じタイトルの複数のセッションがある場合、最新のセッションのみを表示\"],\"settings.tab.title\":[\"表示と通知の設定\"],\"settings.theme\":[\"テーマ\"],\"settings.theme.dark\":[\"ダーク\"],\"settings.theme.description\":[\"お好みのカラーテーマを選択\"],\"settings.theme.light\":[\"ライト\"],\"settings.theme.system\":[\"システム\"],\"settings.title\":[\"設定\"],\"sidebar.back.to.projects\":[\"プロジェクト一覧に戻る\"],\"sidebar.show.mcp.settings\":[\"MCPサーバー設定を表示\"],\"sidebar.show.session.list\":[\"セッション一覧を表示\"],\"user.content.image\":[\"画像\"],\"user.content.image.description\":[\"ユーザーがアップロードした画像コンテンツ\"],\"user.content.unsupported_media\":[\"サポートされていないメディア\"],\"user.content.unsupported_media.description\":[\"表示がサポートされていないメディア形式です\"]}")as Messages; \ No newline at end of file +/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages=JSON.parse("{\"Available commands\":[\"利用可能なコマンド\"],\"Available files and directories\":[\"利用可能なファイルとディレクトリ\"],\"Close sidebar\":[\"サイドバーを閉じる\"],\"Compare from\":[\"比較元\"],\"Compare to\":[\"比較先\"],\"Failed to commit\":[\"コミットに失敗しました\"],\"Failed to commit and push\":[\"コミットとプッシュに失敗しました\"],\"Failed to push\":[\"プッシュに失敗しました\"],\"Message input with completion support\":[\"補完機能付きメッセージ入力\"],\"Reload MCP servers\":[\"MCPサーバーを再読み込み\"],\"Retry Push\":[\"プッシュを再試行\"],\"Select enter key behavior\":[\"Enterキーの動作を選択\"],\"Select language\":[\"言語を選択\"],\"Select permission mode\":[\"権限モードを選択\"],\"Select theme\":[\"テーマを選択\"],\"Type your message here... (Start with / for commands, @ for files, Command+Enter to send)\":[\"ここにメッセージを入力... (/でコマンド、@でファイル、Command+Enterで送信)\"],\"Type your message here... (Start with / for commands, @ for files, Enter to send)\":[\"ここにメッセージを入力... (/でコマンド、@でファイル、Enterで送信)\"],\"Type your message here... (Start with / for commands, @ for files, Shift+Enter to send)\":[\"ここにメッセージを入力... (/でコマンド、@でファイル、Shift+Enterで送信)\"],\"Type your message... (Start with / for commands, @ for files, Command+Enter to send)\":[\"メッセージを入力... (/でコマンド、@でファイル、Command+Enterで送信)\"],\"Type your message... (Start with / for commands, @ for files, Enter to send)\":[\"メッセージを入力... (/でコマンド、@でファイル、Enterで送信)\"],\"Type your message... (Start with / for commands, @ for files, Shift+Enter to send)\":[\"メッセージを入力... (/でコマンド、@でファイル、Shift+Enterで送信)\"],\"Uncommitted changes\":[\"未コミットの変更\"],\"assistant.thinking\":[\"思考中\"],\"assistant.tool.input_parameters\":[\"入力パラメータ\"],\"assistant.tool.result\":[\"ツール実行結果\"],\"assistant.tool_use\":[\"ツール使用\"],\"chat.autocomplete.active\":[\"オートコンプリート有効\"],\"chat.button.start\":[\"チャット開始\"],\"chat.error.send_failed\":[\"メッセージの送信に失敗しました。もう一度お試しください。\"],\"chat.modal.title\":[\"新しいチャットを開始\"],\"chat.resume\":[\"再開\"],\"chat.send\":[\"送信\"],\"chat.status.processing\":[\"処理中...\"],\"common.action.cancel\":[\"キャンセル\"],\"common.error\":[\"エラー\"],\"common.loading\":[\"読み込み中...\"],\"conversation.error.raw_content\":[\"生データ:\"],\"conversation.error.report_issue\":[\"この問題を報告\"],\"conversation.error.schema\":[\"スキーマエラー\"],\"conversation.error.schema_validation\":[\"スキーマ検証エラー\"],\"conversation.error.schema_validation.description\":[\"この会話エントリの解析に失敗しました。フォーマットの変更または解析の問題が考えられます。\"],\"diff.commit\":[\"コミット\"],\"diff.commit.changes\":[\"変更をコミット\"],\"diff.commit.message\":[\"コミットメッセージ\"],\"diff.commit.push\":[\"コミット&プッシュ\"],\"diff.committing\":[\"コミット中...\"],\"diff.committing.pushing\":[\"コミット&プッシュ中...\"],\"diff.deselect.all\":[\"すべて選択解除\"],\"diff.enter.message\":[\"コミットメッセージを入力\"],\"diff.files\":[\"ファイル\"],\"diff.files.changed\":[\"ファイルが変更されました\"],\"diff.loading\":[\"差分を読み込み中...\"],\"diff.push\":[\"プッシュ\"],\"diff.pushing\":[\"プッシュ中...\"],\"diff.select.all\":[\"すべて選択\"],\"diff.select.file\":[\"少なくとも1つのファイルを選択してください\"],\"directory_picker.current\":[\"現在:\"],\"directory_picker.loading\":[\"読み込み中...\"],\"directory_picker.no_directories\":[\"ディレクトリが見つかりません\"],\"directory_picker.select\":[\"このディレクトリを選択\"],\"mcp.error.load_failed\":[\"MCPサーバーの読み込みに失敗しました: \",[\"error\"]],\"mcp.no.servers\":[\"MCPサーバーが見つかりません\"],\"mcp.title\":[\"MCPサーバー\"],\"notification.beep\":[\"ビープ音\"],\"notification.chime\":[\"チャイム\"],\"notification.description\":[\"Claude Code のタスクが完了した時に再生する音を選択してください\"],\"notification.none\":[\"なし\"],\"notification.ping\":[\"ピン\"],\"notification.pop\":[\"ポップ\"],\"notification.test\":[\"テスト\"],\"project.create.action.create\":[\"プロジェクトを作成\"],\"project.create.action.creating\":[\"作成中...\"],\"project.create.description\":[\"Claude Codeプロジェクトとして初期化するディレクトリを選択してください。選択したディレクトリで<0>/initが実行されます。\"],\"project.create.selected_directory\":[\"選択したディレクトリ:\"],\"project.create.title\":[\"新規プロジェクトを作成\"],\"project.error.back_to_projects\":[\"プロジェクト一覧に戻る\"],\"project.error.description\":[\"このプロジェクトの読み込み中にエラーが発生しました\"],\"project.error.details_title\":[\"エラー詳細\"],\"project.error.error_id\":[\"エラーID:\"],\"project.error.title\":[\"プロジェクトの読み込みに失敗しました\"],\"project.error.try_again\":[\"再試行\"],\"project.new\":[\"新規プロジェクト\"],\"project.not_found.back_to_projects\":[\"プロジェクト一覧に戻る\"],\"project.not_found.description\":[\"お探しのプロジェクトは存在しないか、削除されています\"],\"project.not_found.title\":[\"プロジェクトが見つかりません\"],\"project_list.last_modified\":[\"最終更新:\"],\"project_list.messages\":[\"メッセージ:\"],\"project_list.no_projects.description\":[\"~/.claude/projectsディレクトリにClaude Codeプロジェクトが見つかりません。Claude Codeとの会話を開始して、最初のプロジェクトを作成してください。\"],\"project_list.no_projects.title\":[\"プロジェクトが見つかりません\"],\"project_list.view_conversations\":[\"会話を表示\"],\"projects.page.description\":[\"Claude Codeの会話履歴とプロジェクトの操作を閲覧\"],\"projects.page.loading\":[\"プロジェクトを読み込み中...\"],\"projects.page.title\":[\"プロジェクト\"],\"session.conversation.abort\":[\"中止\"],\"session.conversation.in.progress\":[\"会話を進行中...\"],\"session.conversation.paused\":[\"会話を一時停止中...\"],\"session.processing\":[\"Claude Codeが処理中...\"],\"session.status.paused\":[\"一時停止\"],\"session.status.running\":[\"実行中\"],\"sessions.load.more\":[\"さらに読み込む\"],\"sessions.new\":[\"新規\"],\"sessions.title\":[\"セッション\"],\"sessions.total\":[\"合計\"],\"settings.description\":[\"表示と動作の設定\"],\"settings.input.enter_key_behavior\":[\"Enterキーの動作\"],\"settings.input.enter_key_behavior.command_enter\":[\"Command+Enterで送信\"],\"settings.input.enter_key_behavior.description\":[\"メッセージ入力でのEnterキーの動作を選択\"],\"settings.input.enter_key_behavior.enter\":[\"Enterで送信\"],\"settings.input.enter_key_behavior.shift_enter\":[\"Shift+Enterで送信(デフォルト)\"],\"settings.loading\":[\"設定を読み込み中...\"],\"settings.locale\":[\"言語\"],\"settings.locale.description\":[\"お好みの言語を選択\"],\"settings.locale.en\":[\"English\"],\"settings.locale.ja\":[\"日本語\"],\"settings.notifications\":[\"通知\"],\"settings.permission.mode\":[\"権限モード\"],\"settings.permission.mode.accept_edits\":[\"編集を承認(ファイル編集を自動承認)\"],\"settings.permission.mode.bypass_permissions\":[\"権限をバイパス(プロンプトなし)\"],\"settings.permission.mode.default\":[\"デフォルト(権限を確認)\"],\"settings.permission.mode.description\":[\"ファイル操作の権限リクエストの処理方法を制御\"],\"settings.permission.mode.plan\":[\"プランモード(計画のみ)\"],\"settings.section.notifications\":[\"通知\"],\"settings.section.session_display\":[\"セッション表示\"],\"settings.section.system_info\":[\"システム情報\"],\"settings.session.display\":[\"セッション表示\"],\"settings.session.hide_no_user_message\":[\"ユーザーメッセージのないセッションを非表示\"],\"settings.session.hide_no_user_message.description\":[\"ユーザーコマンドまたはメッセージを含むセッションのみを表示\"],\"settings.session.unify_same_title\":[\"同じタイトルのセッションを統合\"],\"settings.session.unify_same_title.description\":[\"同じタイトルの複数のセッションがある場合、最新のセッションのみを表示\"],\"settings.tab.title\":[\"表示と通知の設定\"],\"settings.theme\":[\"テーマ\"],\"settings.theme.dark\":[\"ダーク\"],\"settings.theme.description\":[\"お好みのカラーテーマを選択\"],\"settings.theme.light\":[\"ライト\"],\"settings.theme.system\":[\"システム\"],\"settings.title\":[\"設定\"],\"sidebar.back.to.projects\":[\"プロジェクト一覧に戻る\"],\"sidebar.show.mcp.settings\":[\"MCPサーバー設定を表示\"],\"sidebar.show.session.list\":[\"セッション一覧を表示\"],\"system_info.available_features\":[\"利用可能機能\"],\"system_info.claude_code\":[\"Claude Code\"],\"system_info.description\":[\"バージョンと機能情報\"],\"system_info.executable_path\":[\"実行ファイル\"],\"system_info.feature.agent_sdk.description\":[\"Claude Code SDKではなくClaude Agent SDKを使用 (v1.0.125+)\"],\"system_info.feature.agent_sdk.title\":[\"Claude Agent SDK\"],\"system_info.feature.can_use_tool.description\":[\"動的にツールの使用許可を制御し、ツール実行前にユーザーの承認を求めることができます (v1.0.82+)\"],\"system_info.feature.can_use_tool.title\":[\"ツール使用権限制御\"],\"system_info.feature.unknown.description\":[\"機能情報は利用できません\"],\"system_info.feature.uuid_on_sdk_message.description\":[\"SDKメッセージに一意の識別子を追加して追跡を改善します (v1.0.86+)\"],\"system_info.feature.uuid_on_sdk_message.title\":[\"メッセージUUIDサポート\"],\"system_info.loading\":[\"システム情報を読み込んでいます...\"],\"system_info.title\":[\"システム情報\"],\"system_info.unknown\":[\"不明\"],\"system_info.version_label\":[\"バージョン\"],\"system_info.viewer_version\":[\"Claude Code Viewer\"],\"user.content.image\":[\"画像\"],\"user.content.image.description\":[\"ユーザーがアップロードした画像コンテンツ\"],\"user.content.unsupported_media\":[\"サポートされていないメディア\"],\"user.content.unsupported_media.description\":[\"表示がサポートされていないメディア形式です\"]}")as Messages; \ No newline at end of file diff --git a/src/server/core/claude-code/presentation/ClaudeCodeController.ts b/src/server/core/claude-code/presentation/ClaudeCodeController.ts index 56c752f..9e64878 100644 --- a/src/server/core/claude-code/presentation/ClaudeCodeController.ts +++ b/src/server/core/claude-code/presentation/ClaudeCodeController.ts @@ -4,6 +4,7 @@ import type { ControllerResponse } from "../../../lib/effect/toEffectResponse"; import type { InferEffect } from "../../../lib/effect/types"; import { ApplicationContext } from "../../platform/services/ApplicationContext"; import { ProjectRepository } from "../../project/infrastructure/ProjectRepository"; +import * as ClaudeCodeVersion from "../models/ClaudeCodeVersion"; import { ClaudeCodeService } from "../services/ClaudeCodeService"; const LayerImpl = Effect.gen(function* () { @@ -80,9 +81,43 @@ const LayerImpl = Effect.gen(function* () { } as const satisfies ControllerResponse; }); + const getClaudeCodeMeta = () => + Effect.gen(function* () { + const config = yield* claudeCodeService.getClaudeCodeMeta(); + return { + response: { + executablePath: config.claudeCodeExecutablePath, + version: config.claudeCodeVersion + ? ClaudeCodeVersion.versionText(config.claudeCodeVersion) + : null, + }, + status: 200, + } as const satisfies ControllerResponse; + }); + + const getAvailableFeatures = () => + Effect.gen(function* () { + const features = yield* claudeCodeService.getAvailableFeatures(); + const featuresList = Object.entries(features).flatMap(([key, value]) => { + return [ + { + name: key as keyof typeof features, + enabled: value, + }, + ]; + }); + + return { + response: { features: featuresList }, + status: 200, + } as const satisfies ControllerResponse; + }); + return { getClaudeCommands, getMcpListRoute, + getClaudeCodeMeta, + getAvailableFeatures, }; }); diff --git a/src/server/core/claude-code/services/ClaudeCodeService.ts b/src/server/core/claude-code/services/ClaudeCodeService.ts index baedf4a..eab8658 100644 --- a/src/server/core/claude-code/services/ClaudeCodeService.ts +++ b/src/server/core/claude-code/services/ClaudeCodeService.ts @@ -13,6 +13,21 @@ class ProjectPathNotFoundError extends Data.TaggedError( const LayerImpl = Effect.gen(function* () { const projectRepository = yield* ProjectRepository; + const getClaudeCodeMeta = () => + Effect.gen(function* () { + const config = yield* ClaudeCode.Config; + return config; + }); + + const getAvailableFeatures = () => + Effect.gen(function* () { + const config = yield* ClaudeCode.Config; + const features = ClaudeCode.getAvailableFeatures( + config.claudeCodeVersion, + ); + return features; + }); + const getMcpList = (projectId: string) => Effect.gen(function* () { const { project } = yield* projectRepository.getProject(projectId); @@ -27,7 +42,9 @@ const LayerImpl = Effect.gen(function* () { }); return { + getClaudeCodeMeta, getMcpList, + getAvailableFeatures, }; }); diff --git a/src/server/hono/route.ts b/src/server/hono/route.ts index 6c058ba..9b4715f 100644 --- a/src/server/hono/route.ts +++ b/src/server/hono/route.ts @@ -5,6 +5,7 @@ import { setCookie } from "hono/cookie"; import { streamSSE } from "hono/streaming"; import prexit from "prexit"; import { z } from "zod"; +import packageJson from "../../../package.json" with { type: "json" }; import { ClaudeCodeController } from "../core/claude-code/presentation/ClaudeCodeController"; import { ClaudeCodePermissionController } from "../core/claude-code/presentation/ClaudeCodePermissionController"; import { ClaudeCodeSessionProcessController } from "../core/claude-code/presentation/ClaudeCodeSessionProcessController"; @@ -94,6 +95,12 @@ export const routes = (app: HonoAppType) => }); }) + .get("/version", async (c) => { + return c.json({ + version: packageJson.version, + }); + }) + /** * ProjectController Routes */ @@ -298,6 +305,26 @@ export const routes = (app: HonoAppType) => return response; }) + .get("/cc/meta", async (c) => { + const response = await effectToResponse( + c, + claudeCodeController + .getClaudeCodeMeta() + .pipe(Effect.provide(runtime)), + ); + return response; + }) + + .get("/cc/features", async (c) => { + const response = await effectToResponse( + c, + claudeCodeController + .getAvailableFeatures() + .pipe(Effect.provide(runtime)), + ); + return response; + }) + /** * ClaudeCodeSessionProcessController Routes */