Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
201 changes: 103 additions & 98 deletions SOURCE_MANIFEST.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion apps/web/src/api/researchProgress.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,6 @@ describe("live research progress", () => {
}),
),
).toBe("표와 원문 위치를 확인하고 있습니다");
expect(composerActivity(running({ execution_state: "PAUSED" }))).toBe("작업이 일시정지되어 있습니다.");
expect(composerActivity(running({ execution_state: "PAUSED" }))).toBe("조사가 일시정지되어 있습니다.");
});
});
2 changes: 1 addition & 1 deletion apps/web/src/api/researchProgressCharacterization.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -342,7 +342,7 @@ describe("one-line texts", () => {
expect(lines).toMatchInlineSnapshot(`
[
"현재 단계를 마치고 멈추는 중입니다.",
"작업이 일시정지되어 있습니다.",
"조사가 일시정지되어 있습니다.",
"외부 실행의 종료 여부를 아직 확인하지 못했습니다.",
null,
null,
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/components/CapabilityWorkbench.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ it("a malformed panel leaves navigation available and resets on a different view
try{
await mount(<><nav>프로젝트 탐색 유지</nav><WorkspaceErrorBoundary resetKey="research"><BrokenPanel/></WorkspaceErrorBoundary></>);
expect(container.textContent).toContain("프로젝트 탐색 유지");
expect(container.textContent).toContain("이 작업 화면을 표시하지 못했습니다");
expect(container.textContent).toContain("이 화면을 표시하지 못했습니다");
await render(<><nav>프로젝트 탐색 유지</nav><WorkspaceErrorBoundary resetKey="records"><p>기록 조회 가능</p></WorkspaceErrorBoundary></>);
expect(container.textContent).toContain("기록 조회 가능");
}finally{logger.mockRestore();}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ it("does not present an existing legacy thread as a brand-new empty thread", asy
<ConversationTimeline projectId="p" threadId="legacy-thread" onDetail={() => undefined} onContinue={onContinue} onOpenHistory={onOpenHistory}/>
</QueryClientProvider>,
));
await settle(() => Boolean(container.textContent?.includes("이 작업의 대화 기록을 현재 화면에서 불러올 수 없습니다")));
await settle(() => Boolean(container.textContent?.includes("이 대화의 기록을 현재 화면에서 불러올 수 없습니다")));
expect(container.textContent).not.toContain("지금 무엇이 막혀 있나요?");

const buttons = [...container.querySelectorAll<HTMLButtonElement>("button")];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ async function mount(trace: TraceView | Error) {
<ConversationTimeline projectId="p" threadId="t" onDetail={() => undefined}/></QueryClientProvider>));
for (let index = 0; index < 30; index += 1) {
await act(async () => { await new Promise(resolve => setTimeout(resolve, 10)); });
if (container.textContent?.includes("이 작업의 대화 기록을 현재 화면에서 불러올 수 없습니다")) {
if (container.textContent?.includes("이 대화의 기록을 현재 화면에서 불러올 수 없습니다")) {
await act(async () => { await new Promise(resolve => setTimeout(resolve, 50)); }); // let the trace read settle too
return;
}
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/components/LiveProjectWorkspace.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,7 @@ export function LiveProjectWorkspace() {
{visibleProjects.filter(item=>`${item.name} ${item.project_id}`.toLowerCase().includes(search.toLowerCase())).flatMap(item=>[
<ProjectNavItem project={item} active={item.project_id===context.projectId} removing={management.archiving} key={item.project_id} onOpen={drawer.closing(()=>openProject(item.project_id))} onRename={()=>management.askRenameProject(item)} onRemove={()=>management.askArchive(item)}/>,
item.project_id===context.projectId ? <div className="project-sessions" key={`${item.project_id}-sessions`}>
<Button small minimal icon="plus" className="new-session-button" aria-label={t("workspace.newTask")} onClick={drawer.closing(()=>chooseThread(""))}>{t("workspace.newSession")}</Button>
<Button small minimal icon="plus" className="new-session-button" onClick={drawer.closing(()=>chooseThread(""))}>{t("workspace.newSession")}</Button>
{threadsQuery.isPending&&<p className="empty-copy">{t("workspace.loadingSessions")}</p>}
{threadsQuery.error&&<Callout compact intent="danger" role="alert">{threadsQuery.error.message}</Callout>}
{visibleThreads.map(thread => (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,10 +63,10 @@ it("shows the readiness card on a fresh conversation from values the shell alrea
// one sources read for both the page and the count chips
expect(fixture.calls.filter(method => method === "project/source/list")).toHaveLength(1);
const counts = container.querySelector(".workspace-counts")!;
expect(counts.textContent).toContain("세션 1");
expect(counts.textContent).toContain("대화 1");
expect(counts.textContent).toContain("자료 2");
// the top task select is gone; sessions are chosen in the sidebar
expect(container.querySelector('[aria-label="현재 작업 선택"]')).toBeNull();
// the top bar has no select for the conversation; conversations are chosen in the sidebar
expect(container.querySelector(".workstation-topbar select")).toBeNull();
expect(container.querySelectorAll(".project-sessions .thread-button")).toHaveLength(1);
// the card's action opens this computer's settings, where the model accounts are
await act(async () => buttons().find(item => item.textContent === "모델 연결 확인")!.click());
Expand Down
12 changes: 7 additions & 5 deletions apps/web/src/components/LiveProjectWorkspaceRestart.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@ let root: Root | undefined;
let container: HTMLDivElement;
let client: QueryClient;
const scope = (workspace: "A" | "B") => ({ mode: "LOCAL" as const, workspaceId: ids[workspace] });
// The two sentences the gate shows while it checks the saved selection.
const GATE_CHECKING = /저장된 대화 선택을 다시 확인하는 중|선택한 대화의 접근 범위를 확인하는 중/;
async function settle(check: () => boolean) {
for (let i = 0; i < 25; i++) {
await act(async () => { await new Promise(resolve => setTimeout(resolve, 15)); });
Expand Down Expand Up @@ -194,7 +196,7 @@ it("keeps the parent as the sole readiness query owner while opening project set
await act(async () => { container.querySelector<HTMLElement>('[role="tab"][data-tab-id="settings"]')!.click(); });
await settle(() => Boolean(container.textContent?.includes("모델 기본값")));
expect(fixture.calls.filter(call => call.method === "workspace/ready")).toHaveLength(readyBefore);
expect(container.textContent).not.toContain("저장된 작업의 접근 범위를 다시 확인하는 중");
expect(container.textContent).not.toMatch(GATE_CHECKING);
});

it("settles after project creation followed by an immediate settings visit", async () => {
Expand All @@ -213,7 +215,7 @@ it("settles after project creation followed by an immediate settings visit", asy
await act(async () => { container.querySelector<HTMLElement>('[role="tab"][data-tab-id="settings"]')!.click(); });
await settle(() => Boolean(container.textContent?.includes("모델 기본값")));
expect(fixture.calls.filter(call => call.method === "workspace/ready")).toHaveLength(readyBefore);
expect(container.textContent).not.toContain("저장된 작업의 접근 범위를 다시 확인하는 중");
expect(container.textContent).not.toMatch(GATE_CHECKING);
});

it("keeps an existing authorized project readable when setup is unfinished, without enabling execution", async () => {
Expand Down Expand Up @@ -354,7 +356,7 @@ it("drops a missing thread selection but leaves that thread's draft untouched",
fixture.threads = [];
saveWorkspaceContext("p", "missing-thread", scope("A"));
writeDraft("p", "missing-thread", "unsent old-thread draft", scope("A"));
await mount(); await settle(() => Boolean(container.textContent?.includes("저장된 작업 선택 확인 필요")));
await mount(); await settle(() => Boolean(container.textContent?.includes("저장된 대화 선택 확인 필요")));
expect(readWorkspaceContext(scope("A"))).toEqual({ projectId: "p", threadId: "" });
expect(readDraft("p", "missing-thread", scope("A"))).toBe("unsent old-thread draft");
expect(fixture.calls.some(call => call.method === "thread/read" && call.input.thread_id === "missing-thread")).toBe(false);
Expand Down Expand Up @@ -537,10 +539,10 @@ it("opens the project at its most recently updated work and shows the project cu
await settle(() => Boolean(container.textContent?.includes("stored synthetic answer")));
expect(container.querySelector(".workstation-topbar")?.textContent).toContain("기준시점");
expect(container.querySelector(".workstation-topbar")?.textContent).toContain("2026");
expect(container.textContent).not.toContain("저장된 작업의 접근 범위를 다시 확인하는 중");
expect(container.textContent).not.toMatch(GATE_CHECKING);
});

it("keeps the new-session screen when the user chooses 새 세션 after opening a project", async () => {
it("keeps the new-session screen when the user chooses 새 대화 after opening a project", async () => {
fixture.executionReady = true;
await mount(); await settle(() => Boolean(container.querySelector(".project-button")));
await act(async () => (container.querySelector(".project-button") as HTMLButtonElement).click());
Expand Down
8 changes: 4 additions & 4 deletions apps/web/src/i18n/activityMessages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -276,12 +276,12 @@ export const activityMessages = {
"en": "Readback or explicit recovery is required instead of repeating execution."
},
"activity.stopRequested": {
"ko": "현재 연구 작업의 중단을 요청했습니다.",
"en": "A stop was requested for the current research task."
"ko": "현재 조사의 중단을 요청했습니다.",
"en": "A stop was requested for the current research."
},
"activity.stopped": {
"ko": "연구 작업이 중단됐습니다.",
"en": "The research task was interrupted."
"ko": "조사가 중단됐습니다.",
"en": "The research was interrupted."
},
"activity.partialPreserved": {
"ko": "중단 전까지 확인된 기록만 부분 상태로 유지합니다.",
Expand Down
12 changes: 6 additions & 6 deletions apps/web/src/i18n/advancedMessages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ export const advancedMessages = {
"en": "Cutoff · policy binding · lifecycle"
},
"advanced.task": {
"ko": "작업",
"en": "Task"
"ko": "대화",
"en": "Conversation"
},
"advanced.taskHint": {
"ko": "입력 반영 · 조사 진행 · 현재 결과",
Expand Down Expand Up @@ -160,8 +160,8 @@ export const advancedMessages = {
"en": "Projects, sources, and access"
},
"advanced.threadGroup": {
"ko": "작업 · 요청",
"en": "Tasks and requests"
"ko": "대화 · 요청",
"en": "Conversations and requests"
},
"advanced.discoveryGroup": {
"ko": "자료 탐색",
Expand Down Expand Up @@ -368,8 +368,8 @@ export const advancedMessages = {
"en": "This is a journaled /rpc query. An operation or journal may be created only when this button is pressed."
},
"records.chooseTask": {
"ko": "작업을 먼저 선택하세요.",
"en": "Select a task first."
"ko": "대화를 먼저 선택하세요.",
"en": "Select a conversation first."
},
"records.failed": {
"ko": "조회 실패 또는 필요한 범위 누락",
Expand Down
4 changes: 2 additions & 2 deletions apps/web/src/i18n/finishingMessages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ export const finishingMessages = {
"en": "Finishing the current stage before pausing."
},
"progress.paused": {
"ko": "작업이 일시정지되어 있습니다.",
"en": "The task is paused."
"ko": "조사가 일시정지되어 있습니다.",
"en": "The research is paused."
},
"progress.externalUnknown": {
"ko": "외부 실행의 종료 여부를 아직 확인하지 못했습니다.",
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/i18n/formatMessages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ const formats = {
en: (ids: string) => `Other projects reference this project, so it cannot be deleted. Referencing projects: ${ids}`, "zh-Hans": (ids: string)=>`其他项目引用了此项目,因此无法删除。引用它的项目:${ids}`, "zh-Hant": (ids: string)=>`其他專案引用了此專案,因此無法刪除。引用它的專案:${ids}`, ja: (ids: string)=>`ほかのプロジェクトがこのプロジェクトを参照しているため、削除できません。参照しているプロジェクト:${ids}`,
},
replyFixed: { ko: (language: string) => `답변: ${language} 고정`, en: (language: string) => `Reply: ${language} (fixed)`, "zh-Hans": (language: string)=>`回答:${language}(已固定)`, "zh-Hant": (language: string)=>`回答:${language}(已固定)`, ja: (language: string)=>`回答:${language}(固定)` },
missingSelection: { ko: (kind: "project" | "thread") => `저장된 ${kind === "project" ? "프로젝트" : "작업"} 선택 확인 필요`, en: (kind: "project" | "thread") => `Check the saved ${kind === "project" ? "project" : "task"} selection`, "zh-Hans": (kind: "project" | "thread") => `请检查已保存的${kind === "project" ? "项目" : "任务"}选择`, "zh-Hant": (kind: "project" | "thread") => `請檢查已儲存的${kind === "project" ? "專案" : "任務"}選擇`, ja: (kind: "project" | "thread") => `保存済みの${kind === "project" ? "プロジェクト" : "タスク"}の選択を確認してください` },
missingSelection: { ko: (kind: "project" | "thread") => `저장된 ${kind === "project" ? "프로젝트" : "대화"} 선택 확인 필요`, en: (kind: "project" | "thread") => `Check the saved ${kind === "project" ? "project" : "conversation"} selection`, "zh-Hans": (kind: "project" | "thread") => `请检查已保存的${kind === "project" ? "项目" : "对话"}选择`, "zh-Hant": (kind: "project" | "thread") => `請檢查已儲存的${kind === "project" ? "專案" : "對話"}選擇`, ja: (kind: "project" | "thread") => `保存済みの${kind === "project" ? "プロジェクト" : "会話"}の選択を確認してください` },
} as const;

const checkedFormats: { [K in keyof typeof formats]: {
Expand Down
4 changes: 2 additions & 2 deletions apps/web/src/i18n/historyViewMessages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -152,8 +152,8 @@ export const historyViewMessages = {
"en": "Records without an exact request-to-result link cannot be compared."
},
"delta.sameScope": {
"ko": "같은 프로젝트와 세션의 답변 두 개를 선택해 주세요.",
"en": "Select two answers from the same project and session."
"ko": "같은 프로젝트와 대화의 답변 두 개를 선택해 주세요.",
"en": "Select two answers from the same project and conversation."
},
"delta.distinct": {
"ko": "서로 다른 답변 두 개를 선택해 주세요.",
Expand Down
4 changes: 2 additions & 2 deletions apps/web/src/i18n/ja/activityMessagesJa.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,8 @@ export const activityJa: ColumnOf<typeof activityMessages> = {
"activity.redactionNotice": "機密または信頼できない詳細は非表示にしました。",
"activity.externalEndUnknown": "外部での実行が終了したかを確認できませんでした。",
"activity.recoveryRequired": "実行を繰り返すのではなく、読み戻しまたは明示的な復旧が必要です。",
"activity.stopRequested": "現在の調査タスクの停止を要求しました。",
"activity.stopped": "調査タスクは中断されました。",
"activity.stopRequested": "現在の調査の停止を要求しました。",
"activity.stopped": "調査は中断されました。",
"activity.partialPreserved": "中断前に検証された記録だけが、部分的な結果として保持されます。",
"activity.failureNotice": "失敗した実行結果は、新しい根拠や成功した判定としては使われません。",
"activity.sourceBlocked": "資料へのアクセスがブロックされました。",
Expand Down
6 changes: 3 additions & 3 deletions apps/web/src/i18n/ja/advancedMessagesJa.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import type { advancedMessages } from "../advancedMessages";

export const advancedJa: ColumnOf<typeof advancedMessages> = {
"advanced.projectHint": "基準時点 · ポリシーの結びつき · ライフサイクル",
"advanced.task": "タスク",
"advanced.task": "会話",
"advanced.taskHint": "入力の適用 · 調査の進み具合 · 現在の結果",
"advanced.discovery": "探索",
"advanced.discoveryHint": "検索範囲 · 取得の段階 · 停止の理由",
Expand Down Expand Up @@ -42,7 +42,7 @@ export const advancedJa: ColumnOf<typeof advancedMessages> = {
"advanced.fieldHint": "プロトコル · 参加者のセッション · スコア · プライバシーに配慮したエクスポート",
"advanced.fieldNotice": "公開されている現場の名前空間は、現在コマンドだけを提供しています。読み取り専用の照会 API はなく、この画面では参加者の評価、時間の節約、支払い意欲を確かめることはできません。上級者向けのコマンドは、承認されたプロトコルと参加者の同意がある場合にのみ使ってください。",
"advanced.projectGroup": "プロジェクト、資料、アクセス",
"advanced.threadGroup": "タスクとリクエスト",
"advanced.threadGroup": "会話とリクエスト",
"advanced.discoveryGroup": "資料の探索",
"advanced.evidenceGroup": "根拠と主張",
"advanced.hypothesisGroup": "仮説と検証",
Expand Down Expand Up @@ -94,7 +94,7 @@ export const advancedJa: ColumnOf<typeof advancedMessages> = {
"records.controls": "この領域の詳細な照会と上級者向けの制御",
"records.readOnly": "これは読み取り専用の照会です。",
"records.journaled": "これはジャーナルに記録される /rpc の照会です。このボタンを押したときにだけ、操作やジャーナルが作られることがあります。",
"records.chooseTask": "先にタスクを選んでください。",
"records.chooseTask": "先に会話を選んでください。",
"records.failed": "読み取りに失敗したか、必要な範囲がありません",
"records.moreInputs": "追加の ID や範囲が必要な契約は、機能の入力エディターから照会できます。",
"records.beforeRead": "まだ読み取っていません",
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/i18n/ja/finishingMessagesJa.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export const finishingJa: ColumnOf<typeof finishingMessages> = {
"progress.elapsedUnknown": "経過時間は不明",
"progress.noFirstByte": "最初のバイトはまだ届いていません",
"progress.pausing": "現在の段階を終えてから一時停止します。",
"progress.paused": "タスクは一時停止中です。",
"progress.paused": "調査は一時停止中です。",
"progress.externalUnknown": "外部での実行の終了はまだ確認されていません。",
"usage.none": "この結果の使用量は記録されていません",
"usage.lessMinute": "1分未満",
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/i18n/ja/historyViewMessagesJa.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ export const historyViewJa: ColumnOf<typeof historyViewMessages> = {
"delta.record": "記録",
"delta.noIdentifier": "識別子なし",
"delta.noIdentity": "リクエストと結果の正確なリンクがない記録は比較できません。",
"delta.sameScope": "同じプロジェクト・同じセッションから2つの回答を選んでください。",
"delta.sameScope": "同じプロジェクト・同じ会話から2つの回答を選んでください。",
"delta.distinct": "異なる2つの回答を選んでください。",
"delta.checkAccess": "アクセスが確認できると比較できます。",
"delta.checkingAccess": "アクセスを再確認しています… 選択した2つの回答は保持されます。",
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/i18n/ja/remainingMessagesJa.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ export const remainingJa: ColumnOf<typeof remainingMessages> = {
"labels.decider": "決定者:",
"labels.confirmed": "確認済み ·",
"labels.changedVerdicts": "変化した判定:",
"workspaceError.title": "このタスクの画面を表示できませんでした",
"workspaceError.title": "この画面を表示できませんでした",
"workspaceError.notice": "サーバーの応答が表示形式と合っていない可能性があります。これは成功や完了とは扱われず、正式な記録は変更されません。タブやプロジェクトから、ほかの記録を見てください。",
"workspaceError.retry": "サーバーの状態を再読み込みして、もう一度試す",
"labels.userCode": "ユーザーコード:",
Expand Down
Loading
Loading