chore: exclude local resource artifacts from main sync

This commit is contained in:
2026-05-15 10:16:45 +09:00
parent 442879313f
commit d38d022872
504 changed files with 17074 additions and 3642 deletions

0
src/views/play/LayoutPlaygroundView.css Executable file → Normal file
View File

44
src/views/play/LayoutPlaygroundView.tsx Executable file → Normal file
View File

@@ -24,14 +24,12 @@ import { componentSampleEntries, widgetSampleEntries } from '../../app/manifests
import { createChatConversationRoom, fetchChatConversations } from '../../app/main/mainChatPanel';
import { resolveChatWebSocketUrl } from '../../app/main/mainChatPanel/chatUtils';
import { buildChatPath } from '../../app/main/routes';
import { LAYOUT_EDITOR_CHAT_TYPE_NAME } from '../../app/main/chatTypeDefaults';
import { canUseChatType, resolveCurrentChatPermissionRoles, useChatTypeRegistry } from '../../app/main/chatTypeAccess';
import { useTokenAccess } from '../../app/main/tokenAccess';
import type { SelectOptionItem } from '../../components/inputs/select';
import { StockAlertFilterPane, StockAlertGridPane, StockAlertLayoutProvider } from '../../features/layout/stock-alert';
import { resolveSampleEntries, type LoadedSampleEntry } from '../../samples/registry';
import { deleteLayout, listSavedLayouts, saveLayout, type LayoutAxis as StoredLayoutAxis, type SavedLayoutRecord, type SizeUnit as StoredSizeUnit } from './layoutStorage';
import { resolvePreferredLayoutCodexChatType } from './layoutCodexChatType';
import {
LayoutPreviewActionPane,
LayoutPreviewBaseInputPane,
@@ -758,7 +756,7 @@ function resolveLayoutCodexRequestSocketUrl(sessionId: string) {
if (['127.0.0.1', 'localhost', '0.0.0.0'].includes(window.location.hostname)) {
resolvedUrl.protocol = 'wss:';
resolvedUrl.hostname = 'test.sm-home.cloud';
resolvedUrl.hostname = 'preview.sm-home.cloud';
resolvedUrl.port = '';
resolvedUrl.pathname = '/ws/chat';
}
@@ -888,11 +886,25 @@ export function LayoutPlaygroundView({
() => chatTypes.filter((item) => canUseChatType(item, chatPermissionRoles)),
[chatPermissionRoles, chatTypes],
);
const preferredCodexChatType = useMemo(
() => resolvePreferredLayoutCodexChatType(availableChatTypes),
[availableChatTypes],
const [selectedCodexChatTypeId, setSelectedCodexChatTypeId] = useState<string | null>(null);
const selectedCodexChatType = useMemo(
() => availableChatTypes.find((item) => item.id === selectedCodexChatTypeId) ?? availableChatTypes[0] ?? null,
[availableChatTypes, selectedCodexChatTypeId],
);
useEffect(() => {
if (availableChatTypes.length === 0) {
setSelectedCodexChatTypeId(null);
return;
}
if (selectedCodexChatTypeId && availableChatTypes.some((item) => item.id === selectedCodexChatTypeId)) {
return;
}
setSelectedCodexChatTypeId(availableChatTypes[0]?.id ?? null);
}, [availableChatTypes, selectedCodexChatTypeId]);
const createLeafNode = (): LayoutLeafNode => {
const preset = LEAF_PRESETS[leafPresetRef.current % LEAF_PRESETS.length];
leafPresetRef.current += 1;
@@ -1322,7 +1334,7 @@ export function LayoutPlaygroundView({
}
const text = prompt.trim();
const chatType = preferredCodexChatType;
const chatType = selectedCodexChatType;
const conversationTitle = resolveLayoutConversationTitle(layoutName);
if (!text) {
@@ -3024,8 +3036,21 @@ export function LayoutPlaygroundView({
.
</Paragraph>
<Text type="secondary" className="layout-playground__codex-chat-type-copy">
Codex : <Tag color="cyan">{preferredCodexChatType?.name ?? LAYOUT_EDITOR_CHAT_TYPE_NAME}</Tag>
Codex
</Text>
<Select
size="small"
value={selectedCodexChatType?.id ?? undefined}
placeholder="채팅유형 선택"
className="layout-playground__codex-chat-type-select"
options={availableChatTypes.map((item) => ({
value: item.id,
label: item.name,
}))}
onChange={(nextValue) => {
setSelectedCodexChatTypeId(nextValue);
}}
/>
</div>
<div className="layout-playground__bottom-menu-actions">
<Tag color={isSavedLayoutReadyForCodex ? 'blue' : 'warning'}>
@@ -3051,6 +3076,7 @@ export function LayoutPlaygroundView({
type="primary"
icon={<MessageOutlined />}
loading={isSaving}
disabled={!selectedCodexChatType}
onClick={() => void handleSaveLayout({ openCodexAfterSave: true })}
>
Codex
@@ -3058,7 +3084,7 @@ export function LayoutPlaygroundView({
<Button
ghost
icon={<MessageOutlined />}
disabled={!hasCurrentPrompt || !isSavedLayoutReadyForCodex}
disabled={!hasCurrentPrompt || !isSavedLayoutReadyForCodex || !selectedCodexChatType}
onClick={() => {
openCodexLiveForPrompt(currentInteractionPrompt);
}}

View File

@@ -320,7 +320,6 @@ export function CbtPlayAppView() {
const bookmarkQuestionIds = useMemo(() => new Set(storageState.bookmarks.map((item) => item.questionId)), [storageState.bookmarks]);
const solvedCount = storageState.sessions.length;
const wrongQuestionCount = storageState.wrongNotes.length;
const bookmarkCount = storageState.bookmarks.length;
const overallAccuracyRate = useMemo(() => {
const totals = storageState.progressStats.reduce(
(result, stat) => {
@@ -334,7 +333,6 @@ export function CbtPlayAppView() {
return totals.total > 0 ? totals.correct / totals.total : 0;
}, [storageState.progressStats]);
const sessionProgressPercent = activeSession ? Math.round(((currentQuestionIndex + 1) / activeSession.questionIds.length) * 100) : 0;
const answeredCount = activeSession?.answers.filter((answer) => Boolean(answer.selectedValue)).length ?? 0;
const deferredCount = activeSession?.answers.filter((answer) => answer.isMarked).length ?? 0;
const submittedSession = activeSession?.submittedAt ? activeSession : null;
const isActiveSolverSession = Boolean(activeSession && currentQuestion && activeAnswer && activeSection === 'solver');
@@ -1244,7 +1242,16 @@ export function CbtPlayAppView() {
</Button>
{isSubmitted ? (
currentQuestionIndex >= activeQuestions.length - 1 ? (
<Button type="primary" icon={<ReloadOutlined />} onClick={() => handleRetrySession(submittedSession)}>
<Button
type="primary"
icon={<ReloadOutlined />}
onClick={() => {
if (!submittedSession) {
return;
}
handleRetrySession(submittedSession);
}}
>
</Button>
) : (

View File

@@ -1,4 +1,6 @@
.test-play-app {
display: flex;
flex-direction: column;
height: 100%;
min-height: 100%;
overflow: auto;
@@ -13,6 +15,7 @@
.test-play-app__hero {
display: grid;
grid-template-columns: minmax(0, 1.4fr) minmax(280px, 0.9fr);
align-items: start;
gap: 24px;
margin-bottom: 24px;
}
@@ -50,7 +53,7 @@
display: flex;
flex-direction: column;
gap: 10px;
min-height: 100%;
min-height: 0;
color: #f5f6f8;
}
@@ -76,7 +79,8 @@
@media (max-width: 900px) {
.test-play-app {
padding: 20px;
min-height: 100dvh;
padding: 20px 20px calc(20px + env(safe-area-inset-bottom, 0px));
}
.test-play-app__hero {
@@ -86,4 +90,8 @@
.test-play-app__hero-copy {
padding: 24px;
}
.test-play-app__spotlight .ant-card-body {
min-height: 180px;
}
}

0
src/views/play/layoutStorage.ts Executable file → Normal file
View File