feat(chat): allow prompting subagent sessions
This commit is contained in:
@@ -404,6 +404,7 @@ export const ChatContainer: React.FC<ChatContainerProps> = ({ autoOpenDraft = tr
|
|||||||
// UI store
|
// UI store
|
||||||
const isExpandedInput = useUIStore((state) => state.isExpandedInput);
|
const isExpandedInput = useUIStore((state) => state.isExpandedInput);
|
||||||
const stickyUserHeader = useUIStore((state) => state.stickyUserHeader);
|
const stickyUserHeader = useUIStore((state) => state.stickyUserHeader);
|
||||||
|
const allowPromptingSubagentSessions = useUIStore((state) => state.allowPromptingSubagentSessions);
|
||||||
const isTimelineDialogOpen = useUIStore((s) => s.isTimelineDialogOpen);
|
const isTimelineDialogOpen = useUIStore((s) => s.isTimelineDialogOpen);
|
||||||
const setTimelineDialogOpen = useUIStore((s) => s.setTimelineDialogOpen);
|
const setTimelineDialogOpen = useUIStore((s) => s.setTimelineDialogOpen);
|
||||||
|
|
||||||
@@ -585,7 +586,7 @@ export const ChatContainer: React.FC<ChatContainerProps> = ({ autoOpenDraft = tr
|
|||||||
{t('chat.container.returnToParent.label')}
|
{t('chat.container.returnToParent.label')}
|
||||||
</Button>
|
</Button>
|
||||||
) : null;
|
) : null;
|
||||||
const promptReadOnly = readOnly || Boolean(parentSession);
|
const promptReadOnly = readOnly || (Boolean(parentSession) && !allowPromptingSubagentSessions);
|
||||||
|
|
||||||
React.useEffect(() => {
|
React.useEffect(() => {
|
||||||
if (autoOpenDraft && !currentSessionId && !draftOpen) {
|
if (autoOpenDraft && !currentSessionId && !draftOpen) {
|
||||||
@@ -839,7 +840,7 @@ export const ChatContainer: React.FC<ChatContainerProps> = ({ autoOpenDraft = tr
|
|||||||
: 'flex-1 items-center justify-center bg-background px-0 pb-[6vh]'
|
: 'flex-1 items-center justify-center bg-background px-0 pb-[6vh]'
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
{promptReadOnly ? <ReadOnlyPromptBanner /> : <ChatInput scrollToBottom={scrollToBottomOnSend} />}
|
{promptReadOnly ? <ReadOnlyPromptBanner /> : <ChatInput scrollToBottom={scrollToBottomOnSend} />}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
@@ -899,7 +900,7 @@ export const ChatContainer: React.FC<ChatContainerProps> = ({ autoOpenDraft = tr
|
|||||||
: 'bg-background'
|
: 'bg-background'
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
{promptReadOnly ? <ReadOnlyPromptBanner /> : <ChatInput scrollToBottom={scrollToBottomOnSend} />}
|
{promptReadOnly ? <ReadOnlyPromptBanner /> : <ChatInput scrollToBottom={scrollToBottomOnSend} />}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
@@ -934,7 +935,7 @@ export const ChatContainer: React.FC<ChatContainerProps> = ({ autoOpenDraft = tr
|
|||||||
: 'bg-background'
|
: 'bg-background'
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
{promptReadOnly ? <ReadOnlyPromptBanner /> : <ChatInput scrollToBottom={scrollToBottomOnSend} />}
|
{promptReadOnly ? <ReadOnlyPromptBanner /> : <ChatInput scrollToBottom={scrollToBottomOnSend} />}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -436,9 +436,10 @@ const writeRevealedToolIds = (messageId: string, value: Set<string>): void => {
|
|||||||
revealedToolIdsByMessage.set(messageId, new Set(value));
|
revealedToolIdsByMessage.set(messageId, new Set(value));
|
||||||
};
|
};
|
||||||
|
|
||||||
const UserMessageBody = React.memo(({ messageId, parts, isMobile, alwaysShowActions = isMobile, hasTouchInput, hasTextContent, onCopyMessage, copiedMessage, onShowPopup, agentMention, onRevert, onFork, userActionsMode = 'inline', stickyUserHeaderEnabled = true }: {
|
const UserMessageBody = React.memo(({ messageId, parts, messageCreatedAt, isMobile, alwaysShowActions = isMobile, hasTouchInput, hasTextContent, onCopyMessage, copiedMessage, onShowPopup, agentMention, onRevert, onFork, userActionsMode = 'inline', stickyUserHeaderEnabled = true }: {
|
||||||
messageId: string;
|
messageId: string;
|
||||||
parts: Part[];
|
parts: Part[];
|
||||||
|
messageCreatedAt?: number | null;
|
||||||
isMobile: boolean;
|
isMobile: boolean;
|
||||||
alwaysShowActions?: boolean;
|
alwaysShowActions?: boolean;
|
||||||
hasTouchInput?: boolean;
|
hasTouchInput?: boolean;
|
||||||
@@ -452,8 +453,9 @@ const UserMessageBody = React.memo(({ messageId, parts, isMobile, alwaysShowActi
|
|||||||
userActionsMode?: 'inline' | 'external-content' | 'external-actions';
|
userActionsMode?: 'inline' | 'external-content' | 'external-actions';
|
||||||
stickyUserHeaderEnabled?: boolean;
|
stickyUserHeaderEnabled?: boolean;
|
||||||
}) => {
|
}) => {
|
||||||
const { t } = useI18n();
|
const { locale, t } = useI18n();
|
||||||
const chatSurfaceMode = useChatSurfaceMode();
|
const chatSurfaceMode = useChatSurfaceMode();
|
||||||
|
const timeFormatPreference = useUIStore((state) => state.timeFormatPreference);
|
||||||
const [copyHintVisible, setCopyHintVisible] = React.useState(false);
|
const [copyHintVisible, setCopyHintVisible] = React.useState(false);
|
||||||
const copyHintTimeoutRef = React.useRef<number | null>(null);
|
const copyHintTimeoutRef = React.useRef<number | null>(null);
|
||||||
|
|
||||||
@@ -528,6 +530,12 @@ const UserMessageBody = React.memo(({ messageId, parts, isMobile, alwaysShowActi
|
|||||||
);
|
);
|
||||||
|
|
||||||
const effectiveOnFork = chatSurfaceMode === 'mini-chat' ? undefined : onFork;
|
const effectiveOnFork = chatSurfaceMode === 'mini-chat' ? undefined : onFork;
|
||||||
|
const timestamp = React.useMemo(() => {
|
||||||
|
void locale;
|
||||||
|
if (typeof messageCreatedAt !== 'number' || messageCreatedAt <= 0) return null;
|
||||||
|
const formatted = formatTimestampForDisplay(messageCreatedAt, timeFormatPreference);
|
||||||
|
return formatted.length > 0 ? formatted : null;
|
||||||
|
}, [locale, messageCreatedAt, timeFormatPreference]);
|
||||||
const actionsBlock = ((canCopyMessage && hasCopyableText) || onRevert || effectiveOnFork) && showUserActions ? (
|
const actionsBlock = ((canCopyMessage && hasCopyableText) || onRevert || effectiveOnFork) && showUserActions ? (
|
||||||
<div className={cn(
|
<div className={cn(
|
||||||
'group/user-actions',
|
'group/user-actions',
|
||||||
@@ -556,6 +564,20 @@ const UserMessageBody = React.memo(({ messageId, parts, isMobile, alwaysShowActi
|
|||||||
: 'pointer-events-none opacity-0 transition-opacity duration-150 group-hover/message:pointer-events-auto group-hover/message:opacity-100 group-hover/user-actions:pointer-events-auto group-hover/user-actions:opacity-100 group-hover/user-shell:pointer-events-auto group-hover/user-shell:opacity-100'
|
: 'pointer-events-none opacity-0 transition-opacity duration-150 group-hover/message:pointer-events-auto group-hover/message:opacity-100 group-hover/user-actions:pointer-events-auto group-hover/user-actions:opacity-100 group-hover/user-shell:pointer-events-auto group-hover/user-shell:opacity-100'
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
|
{timestamp ? (
|
||||||
|
<Tooltip>
|
||||||
|
<TooltipTrigger asChild>
|
||||||
|
<span
|
||||||
|
className="mr-1 flex items-center gap-1 text-sm tabular-nums text-muted-foreground/60"
|
||||||
|
aria-label={`Message time: ${timestamp}`}
|
||||||
|
>
|
||||||
|
<Icon name="time" className="h-3.5 w-3.5" />
|
||||||
|
<span className="message-footer__label">{timestamp}</span>
|
||||||
|
</span>
|
||||||
|
</TooltipTrigger>
|
||||||
|
<TooltipContent>{timestamp}</TooltipContent>
|
||||||
|
</Tooltip>
|
||||||
|
) : null}
|
||||||
{onRevert && (
|
{onRevert && (
|
||||||
<Tooltip>
|
<Tooltip>
|
||||||
<TooltipTrigger asChild>
|
<TooltipTrigger asChild>
|
||||||
@@ -2125,6 +2147,7 @@ const MessageBody = React.memo(({ isUser, ...props }: MessageBodyProps) => {
|
|||||||
<UserMessageBody
|
<UserMessageBody
|
||||||
messageId={props.messageId}
|
messageId={props.messageId}
|
||||||
parts={props.parts}
|
parts={props.parts}
|
||||||
|
messageCreatedAt={props.messageCreatedAt}
|
||||||
isMobile={props.isMobile}
|
isMobile={props.isMobile}
|
||||||
alwaysShowActions={props.alwaysShowActions}
|
alwaysShowActions={props.alwaysShowActions}
|
||||||
hasTouchInput={props.hasTouchInput}
|
hasTouchInput={props.hasTouchInput}
|
||||||
|
|||||||
@@ -145,7 +145,7 @@ const VisualSectionContent: React.FC = () => {
|
|||||||
|
|
||||||
// Chat section: User message rendering, Diff layout, Mobile status bar, Show reasoning traces, Follow-up behavior, Persist draft
|
// Chat section: User message rendering, Diff layout, Mobile status bar, Show reasoning traces, Follow-up behavior, Persist draft
|
||||||
const ChatSectionContent: React.FC = () => {
|
const ChatSectionContent: React.FC = () => {
|
||||||
return <OpenChamberVisualSettings visibleSettings={['sessionGoal', 'sessionAssist', 'chatRenderMode', 'messageTransport', 'activityRenderMode', 'userMessageRendering', 'mermaidRendering', 'reasoning', 'showToolFileIcons', 'showTurnChangedFiles', 'expandedTools', 'collapsibleUserMessages', 'stickyUserHeader', 'wideChatLayout', 'codeBlockLineWrap', 'splitAssistantMessageActions', 'diffLayout', 'dotfiles', 'fileViewerPreview', 'followUpBehavior', 'persistDraft', 'inputSpellcheck']} />;
|
return <OpenChamberVisualSettings visibleSettings={['sessionGoal', 'sessionAssist', 'chatRenderMode', 'messageTransport', 'activityRenderMode', 'userMessageRendering', 'mermaidRendering', 'reasoning', 'showToolFileIcons', 'showTurnChangedFiles', 'expandedTools', 'collapsibleUserMessages', 'stickyUserHeader', 'wideChatLayout', 'codeBlockLineWrap', 'splitAssistantMessageActions', 'subagentReadOnlyBanner', 'diffLayout', 'dotfiles', 'fileViewerPreview', 'followUpBehavior', 'persistDraft', 'inputSpellcheck']} />;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Sessions section: Default model & agent, Session retention
|
// Sessions section: Default model & agent, Session retention
|
||||||
|
|||||||
@@ -245,7 +245,7 @@ const normalizeUserMessageRenderingMode = (mode: unknown): 'markdown' | 'plain'
|
|||||||
return mode === 'markdown' ? 'markdown' : 'plain';
|
return mode === 'markdown' ? 'markdown' : 'plain';
|
||||||
};
|
};
|
||||||
|
|
||||||
type VisibleSetting = 'sessionAssist' | 'sessionGoal' | 'theme' | 'pwaInstallName' | 'pwaOrientation' | 'mobileKeyboardMode' | 'timeFormat' | 'weekStart' | 'fontSize' | 'terminalFontSize' | 'editorFontSize' | 'spacing' | 'inputBarOffset' | 'mermaidRendering' | 'userMessageRendering' | 'chatRenderMode' | 'messageTransport' | 'activityRenderMode' | 'collapsibleUserMessages' | 'stickyUserHeader' | 'wideChatLayout' | 'codeBlockLineWrap' | 'splitAssistantMessageActions' | 'diffLayout' | 'mobileStatusBar' | 'dotfiles' | 'fileViewerPreview' | 'reasoning' | 'showToolFileIcons' | 'showTurnChangedFiles' | 'expandedTools' | 'followUpBehavior' | 'terminalQuickKeys' | 'fileEditorKeymap' | 'persistDraft' | 'inputSpellcheck' | 'reportUsage' | 'expandedEditorToolbar';
|
type VisibleSetting = 'sessionAssist' | 'sessionGoal' | 'theme' | 'pwaInstallName' | 'pwaOrientation' | 'mobileKeyboardMode' | 'timeFormat' | 'weekStart' | 'fontSize' | 'terminalFontSize' | 'editorFontSize' | 'spacing' | 'inputBarOffset' | 'mermaidRendering' | 'userMessageRendering' | 'chatRenderMode' | 'messageTransport' | 'activityRenderMode' | 'collapsibleUserMessages' | 'stickyUserHeader' | 'wideChatLayout' | 'codeBlockLineWrap' | 'splitAssistantMessageActions' | 'subagentReadOnlyBanner' | 'diffLayout' | 'mobileStatusBar' | 'dotfiles' | 'fileViewerPreview' | 'reasoning' | 'showToolFileIcons' | 'showTurnChangedFiles' | 'expandedTools' | 'followUpBehavior' | 'terminalQuickKeys' | 'fileEditorKeymap' | 'persistDraft' | 'inputSpellcheck' | 'reportUsage' | 'expandedEditorToolbar';
|
||||||
|
|
||||||
interface OpenChamberVisualSettingsProps {
|
interface OpenChamberVisualSettingsProps {
|
||||||
/** Which settings to show. If undefined, shows all. */
|
/** Which settings to show. If undefined, shows all. */
|
||||||
@@ -333,6 +333,8 @@ export const OpenChamberVisualSettings: React.FC<OpenChamberVisualSettingsProps>
|
|||||||
const setWeekStartPreference = useUIStore(state => state.setWeekStartPreference);
|
const setWeekStartPreference = useUIStore(state => state.setWeekStartPreference);
|
||||||
const showSplitAssistantMessageActions = useUIStore(state => state.showSplitAssistantMessageActions);
|
const showSplitAssistantMessageActions = useUIStore(state => state.showSplitAssistantMessageActions);
|
||||||
const setShowSplitAssistantMessageActions = useUIStore(state => state.setShowSplitAssistantMessageActions);
|
const setShowSplitAssistantMessageActions = useUIStore(state => state.setShowSplitAssistantMessageActions);
|
||||||
|
const allowPromptingSubagentSessions = useUIStore(state => state.allowPromptingSubagentSessions);
|
||||||
|
const setAllowPromptingSubagentSessions = useUIStore(state => state.setAllowPromptingSubagentSessions);
|
||||||
const messageStreamTransport = useConfigStore((state) => state.settingsMessageStreamTransport);
|
const messageStreamTransport = useConfigStore((state) => state.settingsMessageStreamTransport);
|
||||||
const setMessageStreamTransport = useConfigStore((state) => state.setSettingsMessageStreamTransport);
|
const setMessageStreamTransport = useConfigStore((state) => state.setSettingsMessageStreamTransport);
|
||||||
const effectiveMessageStreamTransport = messageStreamTransport;
|
const effectiveMessageStreamTransport = messageStreamTransport;
|
||||||
@@ -1894,7 +1896,7 @@ export const OpenChamberVisualSettings: React.FC<OpenChamberVisualSettingsProps>
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{(shouldShow('sessionAssist') || shouldShow('collapsibleUserMessages') || shouldShow('stickyUserHeader') || shouldShow('wideChatLayout') || shouldShow('codeBlockLineWrap') || shouldShow('splitAssistantMessageActions') || shouldShow('dotfiles') || shouldShow('fileViewerPreview') || shouldShow('persistDraft') || shouldShow('showToolFileIcons') || shouldShow('showTurnChangedFiles') || (!isMobile && shouldShow('inputSpellcheck')) || shouldShow('reasoning')) && (
|
{(shouldShow('sessionAssist') || shouldShow('collapsibleUserMessages') || shouldShow('stickyUserHeader') || shouldShow('wideChatLayout') || shouldShow('codeBlockLineWrap') || shouldShow('splitAssistantMessageActions') || shouldShow('subagentReadOnlyBanner') || shouldShow('dotfiles') || shouldShow('fileViewerPreview') || shouldShow('persistDraft') || shouldShow('showToolFileIcons') || shouldShow('showTurnChangedFiles') || (!isMobile && shouldShow('inputSpellcheck')) || shouldShow('reasoning')) && (
|
||||||
<section className="p-2 space-y-0.5">
|
<section className="p-2 space-y-0.5">
|
||||||
{shouldShow('sessionAssist') && (
|
{shouldShow('sessionAssist') && (
|
||||||
<>
|
<>
|
||||||
@@ -2095,6 +2097,30 @@ export const OpenChamberVisualSettings: React.FC<OpenChamberVisualSettingsProps>
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{shouldShow('subagentReadOnlyBanner') && (
|
||||||
|
<div
|
||||||
|
data-settings-item="chat.subagent-read-only-banner"
|
||||||
|
className="group flex cursor-pointer items-center gap-2 py-0.5"
|
||||||
|
role="button"
|
||||||
|
tabIndex={0}
|
||||||
|
aria-pressed={allowPromptingSubagentSessions}
|
||||||
|
onClick={() => setAllowPromptingSubagentSessions(!allowPromptingSubagentSessions)}
|
||||||
|
onKeyDown={(event) => {
|
||||||
|
if (event.key === ' ' || event.key === 'Enter') {
|
||||||
|
event.preventDefault();
|
||||||
|
setAllowPromptingSubagentSessions(!allowPromptingSubagentSessions);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Checkbox
|
||||||
|
checked={allowPromptingSubagentSessions}
|
||||||
|
onChange={setAllowPromptingSubagentSessions}
|
||||||
|
ariaLabel={t('settings.openchamber.visual.field.allowPromptingSubagentSessionsAria')}
|
||||||
|
/>
|
||||||
|
<span className="typography-ui-label text-foreground">{t('settings.openchamber.visual.field.allowPromptingSubagentSessions')}</span>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
{shouldShow('codeBlockLineWrap') && (
|
{shouldShow('codeBlockLineWrap') && (
|
||||||
<div
|
<div
|
||||||
data-settings-item="chat.code-block-line-wrap"
|
data-settings-item="chat.code-block-line-wrap"
|
||||||
|
|||||||
@@ -1801,6 +1801,8 @@ export const settingsDict = {
|
|||||||
'settings.openchamber.visual.field.showSplitAssistantMessageActionsAria': 'Inline assistant actions',
|
'settings.openchamber.visual.field.showSplitAssistantMessageActionsAria': 'Inline assistant actions',
|
||||||
'settings.openchamber.visual.field.showSplitAssistantMessageActions': 'Inline Assistant Actions',
|
'settings.openchamber.visual.field.showSplitAssistantMessageActions': 'Inline Assistant Actions',
|
||||||
'settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip': 'Show Copy Answer, Save as image, and Read aloud on assistant text blocks that appear before later tool calls in the same response.',
|
'settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip': 'Show Copy Answer, Save as image, and Read aloud on assistant text blocks that appear before later tool calls in the same response.',
|
||||||
|
'settings.openchamber.visual.field.allowPromptingSubagentSessionsAria': 'Allow prompting subagent sessions',
|
||||||
|
'settings.openchamber.visual.field.allowPromptingSubagentSessions': 'Allow Prompting Subagent Sessions',
|
||||||
'settings.openchamber.visual.field.showToolFileIconsAria': 'Show tool file icons',
|
'settings.openchamber.visual.field.showToolFileIconsAria': 'Show tool file icons',
|
||||||
'settings.openchamber.visual.field.showToolFileIcons': 'Show Tool File Icons',
|
'settings.openchamber.visual.field.showToolFileIcons': 'Show Tool File Icons',
|
||||||
'settings.openchamber.visual.field.showTurnChangedFilesAria': 'Show changed files for completed turns',
|
'settings.openchamber.visual.field.showTurnChangedFilesAria': 'Show changed files for completed turns',
|
||||||
|
|||||||
@@ -1766,6 +1766,8 @@ export const settingsDict = {
|
|||||||
"settings.openchamber.visual.field.showSplitAssistantMessageActionsAria": "Acciones en línea del asistente",
|
"settings.openchamber.visual.field.showSplitAssistantMessageActionsAria": "Acciones en línea del asistente",
|
||||||
"settings.openchamber.visual.field.showSplitAssistantMessageActions": "Acciones en línea del asistente",
|
"settings.openchamber.visual.field.showSplitAssistantMessageActions": "Acciones en línea del asistente",
|
||||||
"settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip": "Muestra Copiar respuesta, Guardar como imagen y Leer en voz alta en bloques de texto del asistente que aparecen antes de llamadas a herramientas posteriores dentro de la misma respuesta.",
|
"settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip": "Muestra Copiar respuesta, Guardar como imagen y Leer en voz alta en bloques de texto del asistente que aparecen antes de llamadas a herramientas posteriores dentro de la misma respuesta.",
|
||||||
|
"settings.openchamber.visual.field.allowPromptingSubagentSessionsAria": "Permitir enviar solicitudes a sesiones de subagentes",
|
||||||
|
"settings.openchamber.visual.field.allowPromptingSubagentSessions": "Permitir solicitudes en sesiones de subagentes",
|
||||||
"settings.openchamber.visual.field.showToolFileIconsAria": "Mostrar iconos de archivos de herramientas",
|
"settings.openchamber.visual.field.showToolFileIconsAria": "Mostrar iconos de archivos de herramientas",
|
||||||
"settings.openchamber.visual.field.codeBlockLineWrapAria": "Ajustar líneas de bloques de código",
|
"settings.openchamber.visual.field.codeBlockLineWrapAria": "Ajustar líneas de bloques de código",
|
||||||
"settings.openchamber.visual.field.codeBlockLineWrap": "Ajustar líneas de bloques de código",
|
"settings.openchamber.visual.field.codeBlockLineWrap": "Ajustar líneas de bloques de código",
|
||||||
|
|||||||
@@ -1675,6 +1675,8 @@ export const settingsDict = {
|
|||||||
'settings.openchamber.visual.field.showSplitAssistantMessageActionsAria': 'Actions intégrées de l\'assistant',
|
'settings.openchamber.visual.field.showSplitAssistantMessageActionsAria': 'Actions intégrées de l\'assistant',
|
||||||
'settings.openchamber.visual.field.showSplitAssistantMessageActions': 'Actions intégrées de l\'assistant',
|
'settings.openchamber.visual.field.showSplitAssistantMessageActions': 'Actions intégrées de l\'assistant',
|
||||||
'settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip': 'Afficher Copier la réponse, Enregistrer en image et Lire à haute voix sur les blocs de texte de l\'assistant qui apparaissent avant les appels d\'outil suivants dans la même réponse.',
|
'settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip': 'Afficher Copier la réponse, Enregistrer en image et Lire à haute voix sur les blocs de texte de l\'assistant qui apparaissent avant les appels d\'outil suivants dans la même réponse.',
|
||||||
|
'settings.openchamber.visual.field.allowPromptingSubagentSessionsAria': 'Autoriser les requêtes dans les sessions de sous-agents',
|
||||||
|
'settings.openchamber.visual.field.allowPromptingSubagentSessions': 'Autoriser les requêtes dans les sessions de sous-agents',
|
||||||
'settings.openchamber.visual.field.showToolFileIconsAria': 'Afficher les icônes des fichiers d\'outils',
|
'settings.openchamber.visual.field.showToolFileIconsAria': 'Afficher les icônes des fichiers d\'outils',
|
||||||
'settings.openchamber.visual.field.codeBlockLineWrapAria': 'Renvoyer à la ligne les blocs de code',
|
'settings.openchamber.visual.field.codeBlockLineWrapAria': 'Renvoyer à la ligne les blocs de code',
|
||||||
'settings.openchamber.visual.field.codeBlockLineWrap': 'Renvoyer à la ligne les blocs de code',
|
'settings.openchamber.visual.field.codeBlockLineWrap': 'Renvoyer à la ligne les blocs de code',
|
||||||
|
|||||||
@@ -1799,6 +1799,8 @@ export const settingsDict = {
|
|||||||
'settings.openchamber.visual.field.showSplitAssistantMessageActionsAria': 'インラインアシスタントアクション',
|
'settings.openchamber.visual.field.showSplitAssistantMessageActionsAria': 'インラインアシスタントアクション',
|
||||||
'settings.openchamber.visual.field.showSplitAssistantMessageActions': 'インラインアシスタントアクション',
|
'settings.openchamber.visual.field.showSplitAssistantMessageActions': 'インラインアシスタントアクション',
|
||||||
'settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip': '同じ応答内の後のツール呼び出しの前に表示されるアシスタントテキストブロックに、回答コピー、画像保存、読み上げを表示します。',
|
'settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip': '同じ応答内の後のツール呼び出しの前に表示されるアシスタントテキストブロックに、回答コピー、画像保存、読み上げを表示します。',
|
||||||
|
'settings.openchamber.visual.field.allowPromptingSubagentSessionsAria': 'サブエージェントセッションへのプロンプトを許可',
|
||||||
|
'settings.openchamber.visual.field.allowPromptingSubagentSessions': 'サブエージェントセッションへのプロンプトを許可',
|
||||||
'settings.openchamber.visual.field.showToolFileIconsAria': 'ツールファイルアイコンを表示',
|
'settings.openchamber.visual.field.showToolFileIconsAria': 'ツールファイルアイコンを表示',
|
||||||
'settings.openchamber.visual.field.codeBlockLineWrapAria': 'コードブロックの行を折り返す',
|
'settings.openchamber.visual.field.codeBlockLineWrapAria': 'コードブロックの行を折り返す',
|
||||||
'settings.openchamber.visual.field.codeBlockLineWrap': 'コードブロックの行を折り返す',
|
'settings.openchamber.visual.field.codeBlockLineWrap': 'コードブロックの行を折り返す',
|
||||||
|
|||||||
@@ -1766,6 +1766,8 @@ export const settingsDict = {
|
|||||||
'settings.openchamber.visual.field.showSplitAssistantMessageActionsAria': '인라인 어시스턴트 작업',
|
'settings.openchamber.visual.field.showSplitAssistantMessageActionsAria': '인라인 어시스턴트 작업',
|
||||||
'settings.openchamber.visual.field.showSplitAssistantMessageActions': '인라인 어시스턴트 작업',
|
'settings.openchamber.visual.field.showSplitAssistantMessageActions': '인라인 어시스턴트 작업',
|
||||||
'settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip': '같은 응답에서 이후 도구 호출 앞에 나타나는 어시스턴트 텍스트 블록에 답변 복사, 이미지로 저장, 소리 내어 읽기 작업을 표시합니다.',
|
'settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip': '같은 응답에서 이후 도구 호출 앞에 나타나는 어시스턴트 텍스트 블록에 답변 복사, 이미지로 저장, 소리 내어 읽기 작업을 표시합니다.',
|
||||||
|
'settings.openchamber.visual.field.allowPromptingSubagentSessionsAria': '하위 에이전트 세션에 프롬프트 허용',
|
||||||
|
'settings.openchamber.visual.field.allowPromptingSubagentSessions': '하위 에이전트 세션에 프롬프트 허용',
|
||||||
'settings.openchamber.visual.field.showToolFileIconsAria': '도구 파일 아이콘 표시',
|
'settings.openchamber.visual.field.showToolFileIconsAria': '도구 파일 아이콘 표시',
|
||||||
'settings.openchamber.visual.field.codeBlockLineWrapAria': '코드 블록 줄 바꿈',
|
'settings.openchamber.visual.field.codeBlockLineWrapAria': '코드 블록 줄 바꿈',
|
||||||
'settings.openchamber.visual.field.codeBlockLineWrap': '코드 블록 줄 바꿈',
|
'settings.openchamber.visual.field.codeBlockLineWrap': '코드 블록 줄 바꿈',
|
||||||
|
|||||||
@@ -1017,6 +1017,8 @@ export const settingsDict = {
|
|||||||
'settings.openchamber.visual.field.showSplitAssistantMessageActions': 'Akcje asystenta w treści',
|
'settings.openchamber.visual.field.showSplitAssistantMessageActions': 'Akcje asystenta w treści',
|
||||||
'settings.openchamber.visual.field.showSplitAssistantMessageActionsAria': 'Akcje asystenta w treści',
|
'settings.openchamber.visual.field.showSplitAssistantMessageActionsAria': 'Akcje asystenta w treści',
|
||||||
'settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip': 'Pokaż Kopiuj odpowiedź, Zapisz jako obraz i Odczytaj na głos w blokach tekstu asystenta, które pojawiają się przed późniejszymi wywołaniami narzędzi w tej samej odpowiedzi.',
|
'settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip': 'Pokaż Kopiuj odpowiedź, Zapisz jako obraz i Odczytaj na głos w blokach tekstu asystenta, które pojawiają się przed późniejszymi wywołaniami narzędzi w tej samej odpowiedzi.',
|
||||||
|
'settings.openchamber.visual.field.allowPromptingSubagentSessionsAria': 'Zezwalaj na wysyłanie promptów do sesji podagentów',
|
||||||
|
'settings.openchamber.visual.field.allowPromptingSubagentSessions': 'Zezwalaj na prompty w sesjach podagentów',
|
||||||
'settings.openchamber.visual.field.showToolFileIcons': 'Pokaż ikony plików narzędzi',
|
'settings.openchamber.visual.field.showToolFileIcons': 'Pokaż ikony plików narzędzi',
|
||||||
'settings.openchamber.visual.field.showToolFileIconsAria': 'Pokaż ikony plików narzędzi',
|
'settings.openchamber.visual.field.showToolFileIconsAria': 'Pokaż ikony plików narzędzi',
|
||||||
'settings.openchamber.visual.field.codeBlockLineWrapAria': 'Zawijaj wiersze bloków kodu',
|
'settings.openchamber.visual.field.codeBlockLineWrapAria': 'Zawijaj wiersze bloków kodu',
|
||||||
|
|||||||
@@ -1766,6 +1766,8 @@ export const settingsDict = {
|
|||||||
"settings.openchamber.visual.field.showSplitAssistantMessageActionsAria": "Ações inline do assistente",
|
"settings.openchamber.visual.field.showSplitAssistantMessageActionsAria": "Ações inline do assistente",
|
||||||
"settings.openchamber.visual.field.showSplitAssistantMessageActions": "Ações inline do assistente",
|
"settings.openchamber.visual.field.showSplitAssistantMessageActions": "Ações inline do assistente",
|
||||||
"settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip": "Mostra Copiar resposta, Salvar como imagem e Ler em voz alta em blocos de texto do assistente que aparecem antes de chamadas de ferramenta posteriores na mesma resposta.",
|
"settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip": "Mostra Copiar resposta, Salvar como imagem e Ler em voz alta em blocos de texto do assistente que aparecem antes de chamadas de ferramenta posteriores na mesma resposta.",
|
||||||
|
"settings.openchamber.visual.field.allowPromptingSubagentSessionsAria": "Permitir prompts em sessões de subagentes",
|
||||||
|
"settings.openchamber.visual.field.allowPromptingSubagentSessions": "Permitir prompts em sessões de subagentes",
|
||||||
"settings.openchamber.visual.field.showToolFileIconsAria": "Mostrar ícones de arquivos de ferramentas",
|
"settings.openchamber.visual.field.showToolFileIconsAria": "Mostrar ícones de arquivos de ferramentas",
|
||||||
"settings.openchamber.visual.field.codeBlockLineWrapAria": "Quebrar linhas de blocos de código",
|
"settings.openchamber.visual.field.codeBlockLineWrapAria": "Quebrar linhas de blocos de código",
|
||||||
"settings.openchamber.visual.field.codeBlockLineWrap": "Quebrar linhas de blocos de código",
|
"settings.openchamber.visual.field.codeBlockLineWrap": "Quebrar linhas de blocos de código",
|
||||||
|
|||||||
@@ -1766,6 +1766,8 @@ export const settingsDict = {
|
|||||||
"settings.openchamber.visual.field.showSplitAssistantMessageActionsAria": "Вбудовані дії асистента",
|
"settings.openchamber.visual.field.showSplitAssistantMessageActionsAria": "Вбудовані дії асистента",
|
||||||
"settings.openchamber.visual.field.showSplitAssistantMessageActions": "Вбудовані дії асистента",
|
"settings.openchamber.visual.field.showSplitAssistantMessageActions": "Вбудовані дії асистента",
|
||||||
"settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip": "Показує «Скопіювати відповідь», «Зберегти як зображення» та озвучення для текстових блоків асистента, які з’являються перед пізнішими викликами інструментів у тій самій відповіді.",
|
"settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip": "Показує «Скопіювати відповідь», «Зберегти як зображення» та озвучення для текстових блоків асистента, які з’являються перед пізнішими викликами інструментів у тій самій відповіді.",
|
||||||
|
"settings.openchamber.visual.field.allowPromptingSubagentSessionsAria": "Дозволити надсилати запити в сесії субагентів",
|
||||||
|
"settings.openchamber.visual.field.allowPromptingSubagentSessions": "Дозволити запити в сесіях субагентів",
|
||||||
"settings.openchamber.visual.field.showToolFileIconsAria": "Показати значки файлів інструментів",
|
"settings.openchamber.visual.field.showToolFileIconsAria": "Показати значки файлів інструментів",
|
||||||
"settings.openchamber.visual.field.codeBlockLineWrapAria": "Переносити рядки блоків коду",
|
"settings.openchamber.visual.field.codeBlockLineWrapAria": "Переносити рядки блоків коду",
|
||||||
"settings.openchamber.visual.field.codeBlockLineWrap": "Переносити рядки блоків коду",
|
"settings.openchamber.visual.field.codeBlockLineWrap": "Переносити рядки блоків коду",
|
||||||
|
|||||||
@@ -1766,6 +1766,8 @@ export const settingsDict = {
|
|||||||
'settings.openchamber.visual.field.showSplitAssistantMessageActionsAria': '内联助手操作',
|
'settings.openchamber.visual.field.showSplitAssistantMessageActionsAria': '内联助手操作',
|
||||||
'settings.openchamber.visual.field.showSplitAssistantMessageActions': '内联助手操作',
|
'settings.openchamber.visual.field.showSplitAssistantMessageActions': '内联助手操作',
|
||||||
'settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip': '在同一条回复中,如果助手文本块后面还有工具调用,则显示“复制回答”“保存为图片”和“朗读”操作。',
|
'settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip': '在同一条回复中,如果助手文本块后面还有工具调用,则显示“复制回答”“保存为图片”和“朗读”操作。',
|
||||||
|
'settings.openchamber.visual.field.allowPromptingSubagentSessionsAria': '允许向子智能体会话发送提示',
|
||||||
|
'settings.openchamber.visual.field.allowPromptingSubagentSessions': '允许向子智能体会话发送提示',
|
||||||
'settings.openchamber.visual.field.showToolFileIconsAria': '显示工具文件图标',
|
'settings.openchamber.visual.field.showToolFileIconsAria': '显示工具文件图标',
|
||||||
'settings.openchamber.visual.field.codeBlockLineWrapAria': '代码块自动换行',
|
'settings.openchamber.visual.field.codeBlockLineWrapAria': '代码块自动换行',
|
||||||
'settings.openchamber.visual.field.codeBlockLineWrap': '代码块自动换行',
|
'settings.openchamber.visual.field.codeBlockLineWrap': '代码块自动换行',
|
||||||
|
|||||||
@@ -1677,6 +1677,8 @@
|
|||||||
'settings.openchamber.visual.field.showSplitAssistantMessageActionsAria': '行內助理操作',
|
'settings.openchamber.visual.field.showSplitAssistantMessageActionsAria': '行內助理操作',
|
||||||
'settings.openchamber.visual.field.showSplitAssistantMessageActions': '行內助理操作',
|
'settings.openchamber.visual.field.showSplitAssistantMessageActions': '行內助理操作',
|
||||||
'settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip': '在同一則回覆中,如果助理文字區塊後方還有工具呼叫,則顯示「複製回答」「儲存為圖片」和「朗讀」操作。',
|
'settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip': '在同一則回覆中,如果助理文字區塊後方還有工具呼叫,則顯示「複製回答」「儲存為圖片」和「朗讀」操作。',
|
||||||
|
'settings.openchamber.visual.field.allowPromptingSubagentSessionsAria': '允許向子 Agent 工作階段傳送提示',
|
||||||
|
'settings.openchamber.visual.field.allowPromptingSubagentSessions': '允許向子 Agent 工作階段傳送提示',
|
||||||
'settings.openchamber.visual.field.showToolFileIconsAria': '顯示工具檔案圖示',
|
'settings.openchamber.visual.field.showToolFileIconsAria': '顯示工具檔案圖示',
|
||||||
'settings.openchamber.visual.field.codeBlockLineWrapAria': '程式碼區塊自動換行',
|
'settings.openchamber.visual.field.codeBlockLineWrapAria': '程式碼區塊自動換行',
|
||||||
'settings.openchamber.visual.field.codeBlockLineWrap': '程式碼區塊自動換行',
|
'settings.openchamber.visual.field.codeBlockLineWrap': '程式碼區塊自動換行',
|
||||||
|
|||||||
@@ -237,6 +237,12 @@ const SETTINGS_SEARCH_ITEMS: readonly SettingsSearchItem[] = [
|
|||||||
descriptionKey: 'settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip',
|
descriptionKey: 'settings.openchamber.visual.field.showSplitAssistantMessageActionsTooltip',
|
||||||
keywords: ['copy', 'save image', 'read aloud'],
|
keywords: ['copy', 'save image', 'read aloud'],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: 'chat.subagent-read-only-banner',
|
||||||
|
page: 'chat',
|
||||||
|
titleKey: 'settings.openchamber.visual.field.allowPromptingSubagentSessions',
|
||||||
|
keywords: ['subagent', 'read only', 'prompt', 'banner'],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: 'chat.tool-file-icons',
|
id: 'chat.tool-file-icons',
|
||||||
page: 'chat',
|
page: 'chat',
|
||||||
|
|||||||
@@ -655,6 +655,7 @@ interface UIStore {
|
|||||||
stickyUserHeader: boolean;
|
stickyUserHeader: boolean;
|
||||||
expandedEditorToolbar: boolean;
|
expandedEditorToolbar: boolean;
|
||||||
showSplitAssistantMessageActions: boolean;
|
showSplitAssistantMessageActions: boolean;
|
||||||
|
allowPromptingSubagentSessions: boolean;
|
||||||
isMobileSessionStatusBarCollapsed: boolean;
|
isMobileSessionStatusBarCollapsed: boolean;
|
||||||
mobileSessionPanelOpen: boolean;
|
mobileSessionPanelOpen: boolean;
|
||||||
mobileSessionFilterProjectId: string | null;
|
mobileSessionFilterProjectId: string | null;
|
||||||
@@ -808,6 +809,7 @@ interface UIStore {
|
|||||||
setStickyUserHeader: (value: boolean) => void;
|
setStickyUserHeader: (value: boolean) => void;
|
||||||
setExpandedEditorToolbar: (value: boolean) => void;
|
setExpandedEditorToolbar: (value: boolean) => void;
|
||||||
setShowSplitAssistantMessageActions: (value: boolean) => void;
|
setShowSplitAssistantMessageActions: (value: boolean) => void;
|
||||||
|
setAllowPromptingSubagentSessions: (value: boolean) => void;
|
||||||
setIsMobileSessionStatusBarCollapsed: (value: boolean) => void;
|
setIsMobileSessionStatusBarCollapsed: (value: boolean) => void;
|
||||||
setMobileSessionPanelOpen: (value: boolean) => void;
|
setMobileSessionPanelOpen: (value: boolean) => void;
|
||||||
setMobileSessionFilterProjectId: (value: string | null) => void;
|
setMobileSessionFilterProjectId: (value: string | null) => void;
|
||||||
@@ -954,6 +956,7 @@ export const useUIStore = create<UIStore>()(
|
|||||||
stickyUserHeader: false,
|
stickyUserHeader: false,
|
||||||
expandedEditorToolbar: false,
|
expandedEditorToolbar: false,
|
||||||
showSplitAssistantMessageActions: false,
|
showSplitAssistantMessageActions: false,
|
||||||
|
allowPromptingSubagentSessions: false,
|
||||||
isMobileSessionStatusBarCollapsed: false,
|
isMobileSessionStatusBarCollapsed: false,
|
||||||
mobileSessionPanelOpen: false,
|
mobileSessionPanelOpen: false,
|
||||||
mobileSessionFilterProjectId: null,
|
mobileSessionFilterProjectId: null,
|
||||||
@@ -2115,6 +2118,9 @@ export const useUIStore = create<UIStore>()(
|
|||||||
setShowSplitAssistantMessageActions: (value) => {
|
setShowSplitAssistantMessageActions: (value) => {
|
||||||
set({ showSplitAssistantMessageActions: value });
|
set({ showSplitAssistantMessageActions: value });
|
||||||
},
|
},
|
||||||
|
setAllowPromptingSubagentSessions: (value) => {
|
||||||
|
set({ allowPromptingSubagentSessions: value });
|
||||||
|
},
|
||||||
setIsMobileSessionStatusBarCollapsed: (value) => {
|
setIsMobileSessionStatusBarCollapsed: (value) => {
|
||||||
set({ isMobileSessionStatusBarCollapsed: value });
|
set({ isMobileSessionStatusBarCollapsed: value });
|
||||||
},
|
},
|
||||||
@@ -2357,6 +2363,7 @@ export const useUIStore = create<UIStore>()(
|
|||||||
stickyUserHeader: state.stickyUserHeader,
|
stickyUserHeader: state.stickyUserHeader,
|
||||||
expandedEditorToolbar: state.expandedEditorToolbar,
|
expandedEditorToolbar: state.expandedEditorToolbar,
|
||||||
showSplitAssistantMessageActions: state.showSplitAssistantMessageActions,
|
showSplitAssistantMessageActions: state.showSplitAssistantMessageActions,
|
||||||
|
allowPromptingSubagentSessions: state.allowPromptingSubagentSessions,
|
||||||
isMobileSessionStatusBarCollapsed: state.isMobileSessionStatusBarCollapsed,
|
isMobileSessionStatusBarCollapsed: state.isMobileSessionStatusBarCollapsed,
|
||||||
mobileSessionFilterProjectId: state.mobileSessionFilterProjectId,
|
mobileSessionFilterProjectId: state.mobileSessionFilterProjectId,
|
||||||
shortcutOverrides: state.shortcutOverrides,
|
shortcutOverrides: state.shortcutOverrides,
|
||||||
|
|||||||
Reference in New Issue
Block a user