-
+
{threadsQuery.isPending&&
{t("workspace.loadingSessions")}
}
{threadsQuery.error&&
{threadsQuery.error.message}}
{visibleThreads.map(thread => (
diff --git a/apps/web/src/components/LiveProjectWorkspaceReadiness.test.tsx b/apps/web/src/components/LiveProjectWorkspaceReadiness.test.tsx
index 7ee5bd03..cbed74a3 100644
--- a/apps/web/src/components/LiveProjectWorkspaceReadiness.test.tsx
+++ b/apps/web/src/components/LiveProjectWorkspaceReadiness.test.tsx
@@ -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());
diff --git a/apps/web/src/components/LiveProjectWorkspaceRestart.test.tsx b/apps/web/src/components/LiveProjectWorkspaceRestart.test.tsx
index 82fbfb68..38f2a257 100644
--- a/apps/web/src/components/LiveProjectWorkspaceRestart.test.tsx
+++ b/apps/web/src/components/LiveProjectWorkspaceRestart.test.tsx
@@ -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)); });
@@ -194,7 +196,7 @@ it("keeps the parent as the sole readiness query owner while opening project set
await act(async () => { container.querySelector
('[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 () => {
@@ -213,7 +215,7 @@ it("settles after project creation followed by an immediate settings visit", asy
await act(async () => { container.querySelector('[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 () => {
@@ -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);
@@ -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());
diff --git a/apps/web/src/i18n/activityMessages.ts b/apps/web/src/i18n/activityMessages.ts
index 8344253a..49c2632a 100644
--- a/apps/web/src/i18n/activityMessages.ts
+++ b/apps/web/src/i18n/activityMessages.ts
@@ -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": "중단 전까지 확인된 기록만 부분 상태로 유지합니다.",
diff --git a/apps/web/src/i18n/advancedMessages.ts b/apps/web/src/i18n/advancedMessages.ts
index 6cd9660f..05d7fb20 100644
--- a/apps/web/src/i18n/advancedMessages.ts
+++ b/apps/web/src/i18n/advancedMessages.ts
@@ -4,8 +4,8 @@ export const advancedMessages = {
"en": "Cutoff · policy binding · lifecycle"
},
"advanced.task": {
- "ko": "작업",
- "en": "Task"
+ "ko": "대화",
+ "en": "Conversation"
},
"advanced.taskHint": {
"ko": "입력 반영 · 조사 진행 · 현재 결과",
@@ -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": "자료 탐색",
@@ -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": "조회 실패 또는 필요한 범위 누락",
diff --git a/apps/web/src/i18n/finishingMessages.ts b/apps/web/src/i18n/finishingMessages.ts
index 541e8460..2feb13a5 100644
--- a/apps/web/src/i18n/finishingMessages.ts
+++ b/apps/web/src/i18n/finishingMessages.ts
@@ -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": "외부 실행의 종료 여부를 아직 확인하지 못했습니다.",
diff --git a/apps/web/src/i18n/formatMessages.ts b/apps/web/src/i18n/formatMessages.ts
index 2a7cf94e..8a4ae128 100644
--- a/apps/web/src/i18n/formatMessages.ts
+++ b/apps/web/src/i18n/formatMessages.ts
@@ -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]: {
diff --git a/apps/web/src/i18n/historyViewMessages.ts b/apps/web/src/i18n/historyViewMessages.ts
index 0535c2ed..0d2981df 100644
--- a/apps/web/src/i18n/historyViewMessages.ts
+++ b/apps/web/src/i18n/historyViewMessages.ts
@@ -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": "서로 다른 답변 두 개를 선택해 주세요.",
diff --git a/apps/web/src/i18n/ja/activityMessagesJa.ts b/apps/web/src/i18n/ja/activityMessagesJa.ts
index 5727b610..7638c802 100644
--- a/apps/web/src/i18n/ja/activityMessagesJa.ts
+++ b/apps/web/src/i18n/ja/activityMessagesJa.ts
@@ -71,8 +71,8 @@ export const activityJa: ColumnOf = {
"activity.redactionNotice": "機密または信頼できない詳細は非表示にしました。",
"activity.externalEndUnknown": "外部での実行が終了したかを確認できませんでした。",
"activity.recoveryRequired": "実行を繰り返すのではなく、読み戻しまたは明示的な復旧が必要です。",
- "activity.stopRequested": "現在の調査タスクの停止を要求しました。",
- "activity.stopped": "調査タスクは中断されました。",
+ "activity.stopRequested": "現在の調査の停止を要求しました。",
+ "activity.stopped": "調査は中断されました。",
"activity.partialPreserved": "中断前に検証された記録だけが、部分的な結果として保持されます。",
"activity.failureNotice": "失敗した実行結果は、新しい根拠や成功した判定としては使われません。",
"activity.sourceBlocked": "資料へのアクセスがブロックされました。",
diff --git a/apps/web/src/i18n/ja/advancedMessagesJa.ts b/apps/web/src/i18n/ja/advancedMessagesJa.ts
index 14b66c2e..1294945a 100644
--- a/apps/web/src/i18n/ja/advancedMessagesJa.ts
+++ b/apps/web/src/i18n/ja/advancedMessagesJa.ts
@@ -3,7 +3,7 @@ import type { advancedMessages } from "../advancedMessages";
export const advancedJa: ColumnOf = {
"advanced.projectHint": "基準時点 · ポリシーの結びつき · ライフサイクル",
- "advanced.task": "タスク",
+ "advanced.task": "会話",
"advanced.taskHint": "入力の適用 · 調査の進み具合 · 現在の結果",
"advanced.discovery": "探索",
"advanced.discoveryHint": "検索範囲 · 取得の段階 · 停止の理由",
@@ -42,7 +42,7 @@ export const advancedJa: ColumnOf = {
"advanced.fieldHint": "プロトコル · 参加者のセッション · スコア · プライバシーに配慮したエクスポート",
"advanced.fieldNotice": "公開されている現場の名前空間は、現在コマンドだけを提供しています。読み取り専用の照会 API はなく、この画面では参加者の評価、時間の節約、支払い意欲を確かめることはできません。上級者向けのコマンドは、承認されたプロトコルと参加者の同意がある場合にのみ使ってください。",
"advanced.projectGroup": "プロジェクト、資料、アクセス",
- "advanced.threadGroup": "タスクとリクエスト",
+ "advanced.threadGroup": "会話とリクエスト",
"advanced.discoveryGroup": "資料の探索",
"advanced.evidenceGroup": "根拠と主張",
"advanced.hypothesisGroup": "仮説と検証",
@@ -94,7 +94,7 @@ export const advancedJa: ColumnOf = {
"records.controls": "この領域の詳細な照会と上級者向けの制御",
"records.readOnly": "これは読み取り専用の照会です。",
"records.journaled": "これはジャーナルに記録される /rpc の照会です。このボタンを押したときにだけ、操作やジャーナルが作られることがあります。",
- "records.chooseTask": "先にタスクを選んでください。",
+ "records.chooseTask": "先に会話を選んでください。",
"records.failed": "読み取りに失敗したか、必要な範囲がありません",
"records.moreInputs": "追加の ID や範囲が必要な契約は、機能の入力エディターから照会できます。",
"records.beforeRead": "まだ読み取っていません",
diff --git a/apps/web/src/i18n/ja/finishingMessagesJa.ts b/apps/web/src/i18n/ja/finishingMessagesJa.ts
index f6d20c89..52420c3d 100644
--- a/apps/web/src/i18n/ja/finishingMessagesJa.ts
+++ b/apps/web/src/i18n/ja/finishingMessagesJa.ts
@@ -9,7 +9,7 @@ export const finishingJa: ColumnOf = {
"progress.elapsedUnknown": "経過時間は不明",
"progress.noFirstByte": "最初のバイトはまだ届いていません",
"progress.pausing": "現在の段階を終えてから一時停止します。",
- "progress.paused": "タスクは一時停止中です。",
+ "progress.paused": "調査は一時停止中です。",
"progress.externalUnknown": "外部での実行の終了はまだ確認されていません。",
"usage.none": "この結果の使用量は記録されていません",
"usage.lessMinute": "1分未満",
diff --git a/apps/web/src/i18n/ja/historyViewMessagesJa.ts b/apps/web/src/i18n/ja/historyViewMessagesJa.ts
index a5437088..8c8c68aa 100644
--- a/apps/web/src/i18n/ja/historyViewMessagesJa.ts
+++ b/apps/web/src/i18n/ja/historyViewMessagesJa.ts
@@ -40,7 +40,7 @@ export const historyViewJa: ColumnOf = {
"delta.record": "記録",
"delta.noIdentifier": "識別子なし",
"delta.noIdentity": "リクエストと結果の正確なリンクがない記録は比較できません。",
- "delta.sameScope": "同じプロジェクト・同じセッションから2つの回答を選んでください。",
+ "delta.sameScope": "同じプロジェクト・同じ会話から2つの回答を選んでください。",
"delta.distinct": "異なる2つの回答を選んでください。",
"delta.checkAccess": "アクセスが確認できると比較できます。",
"delta.checkingAccess": "アクセスを再確認しています… 選択した2つの回答は保持されます。",
diff --git a/apps/web/src/i18n/ja/remainingMessagesJa.ts b/apps/web/src/i18n/ja/remainingMessagesJa.ts
index c22f357b..419783b9 100644
--- a/apps/web/src/i18n/ja/remainingMessagesJa.ts
+++ b/apps/web/src/i18n/ja/remainingMessagesJa.ts
@@ -80,7 +80,7 @@ export const remainingJa: ColumnOf = {
"labels.decider": "決定者:",
"labels.confirmed": "確認済み ·",
"labels.changedVerdicts": "変化した判定:",
- "workspaceError.title": "このタスクの画面を表示できませんでした",
+ "workspaceError.title": "この画面を表示できませんでした",
"workspaceError.notice": "サーバーの応答が表示形式と合っていない可能性があります。これは成功や完了とは扱われず、正式な記録は変更されません。タブやプロジェクトから、ほかの記録を見てください。",
"workspaceError.retry": "サーバーの状態を再読み込みして、もう一度試す",
"labels.userCode": "ユーザーコード:",
diff --git a/apps/web/src/i18n/ja/researchMessagesJa.ts b/apps/web/src/i18n/ja/researchMessagesJa.ts
index b4166ba3..cbfbea4f 100644
--- a/apps/web/src/i18n/ja/researchMessagesJa.ts
+++ b/apps/web/src/i18n/ja/researchMessagesJa.ts
@@ -12,8 +12,8 @@ export const researchJa: ColumnOf = {
"timeline.limited": "さらに古い履歴は、この画面の範囲を超えています。調査履歴を開いてご覧ください。",
"timeline.unsupported": "このサーバーは会話履歴に対応していません。検証できる現在の記録だけを表示します。",
"timeline.queued": "この指示は、現在の調査が終わったあとに適用されます",
- "timeline.unavailable": "このタスクの会話履歴は、現在の画面では利用できません。",
- "timeline.recoverAdvice": "保存済みの調査履歴と現在のプロジェクトの記録を確認するか、このタスクで新しい質問をしてください。",
+ "timeline.unavailable": "この会話の履歴は、現在の画面では利用できません。",
+ "timeline.recoverAdvice": "保存済みの調査履歴と現在のプロジェクトの記録を確認するか、この会話で新しい質問をしてください。",
"timeline.newQuestion": "新しい質問で続ける",
"timeline.openHistory": "調査履歴を見る",
"timeline.emptyTitle": "何を検討していますか?",
@@ -81,10 +81,10 @@ export const researchJa: ColumnOf = {
"result.memory": "プロジェクトの記憶",
"result.checking": "資料と条件を確認しています。まだ回答は保存されていません。",
"result.noLinkedAnswer": "このリクエストに結びついた保存済みの回答はまだありません。",
- "progress.current": "現在のタスク",
+ "progress.current": "現在の調査",
"progress.pause": "一時停止",
"progress.resume": "再開",
"progress.stop": "停止を要求",
- "progress.stopConfirm": "このタスクを停止しますか?すでに始まった外部での実行が止まったかどうかは、別に確認されます。",
+ "progress.stopConfirm": "この調査を停止しますか?すでに始まった外部での実行が止まったかどうかは、別に確認されます。",
"progress.unknown": "不明",
};
diff --git a/apps/web/src/i18n/ja/researchPanelsMessagesJa.ts b/apps/web/src/i18n/ja/researchPanelsMessagesJa.ts
index e90d0c7d..dca85bfd 100644
--- a/apps/web/src/i18n/ja/researchPanelsMessagesJa.ts
+++ b/apps/web/src/i18n/ja/researchPanelsMessagesJa.ts
@@ -95,6 +95,6 @@ export const researchPanelsJa: ColumnOf = {
"historyWorkspace.testMode": "検証モード:この画面は、制御された資料とモデルを使います。実際の調査結果は検証しません。",
"historyWorkspace.preserve": "判定の変化を確認するあいだ、元の回答と根拠を保持します。",
"historyWorkspace.scope": "履歴の範囲",
- "historyWorkspace.session": "現在のセッション",
+ "historyWorkspace.session": "現在の会話",
"historyWorkspace.project": "プロジェクト全体",
};
diff --git a/apps/web/src/i18n/ja/setupMessagesJa.ts b/apps/web/src/i18n/ja/setupMessagesJa.ts
index 7df97be5..897321cb 100644
--- a/apps/web/src/i18n/ja/setupMessagesJa.ts
+++ b/apps/web/src/i18n/ja/setupMessagesJa.ts
@@ -57,12 +57,12 @@ export const setupJa: ColumnOf = {
"model.parentLoading": "継承されたプロジェクトのモデルを確認しています…",
"model.parentFailed": "継承されたプロジェクトのモデルを読み込めませんでした。",
"model.noProjectModel": "プロジェクトのモデルは指定されていません",
- "model.inheritsProject": "このタスクはプロジェクトのモデル設定を引き継ぎます。",
+ "model.inheritsProject": "この会話はプロジェクトのモデル設定を引き継ぎます。",
"model.researchModel": "調査に使うモデル",
"model.choose": "モデルを選択",
"model.reasoningEffort": "調査の推論の強度",
"model.default": "既定",
- "model.saveThread": "このタスクの既定として保存",
+ "model.saveThread": "この会話の既定として保存",
"model.saveProject": "プロジェクトの既定として保存",
"model.nextRequestOnly": "保存していない選択は、次のリクエストにのみ適用されます。モデルが一覧にあっても、プロバイダーの認証や実行の成功が確認されたわけではありません。",
"model.saved": "既定の設定を保存しました。",
diff --git a/apps/web/src/i18n/ja/sourceMessagesJa.ts b/apps/web/src/i18n/ja/sourceMessagesJa.ts
index 703fb285..c787b6a7 100644
--- a/apps/web/src/i18n/ja/sourceMessagesJa.ts
+++ b/apps/web/src/i18n/ja/sourceMessagesJa.ts
@@ -18,7 +18,7 @@ export const sourceJa: ColumnOf = {
"sources.scopeLabel": "資料の利用範囲",
"sources.chooseScope": "利用範囲を選択",
"sources.projectShared": "このプロジェクト内で共有",
- "sources.explicitGrants": "明示的に許可されたタスクのみ",
+ "sources.explicitGrants": "明示的に許可した作業のみ",
"sources.connectFailed": "資料を接続できませんでした",
"sources.scopeHelp": "「このプロジェクト内で共有」にすると、このプロジェクトのすべての作業がこの資料を根拠として使えます。「明示的に許可した作業のみ」にすると、個別に許可した作業だけが使えます。",
"sources.connected": "資料を接続しました。新しい質問または指示で分析を始めてください。",
diff --git a/apps/web/src/i18n/ja/workspaceDetailMessagesJa.ts b/apps/web/src/i18n/ja/workspaceDetailMessagesJa.ts
index 4e2320ae..e18e0f9c 100644
--- a/apps/web/src/i18n/ja/workspaceDetailMessagesJa.ts
+++ b/apps/web/src/i18n/ja/workspaceDetailMessagesJa.ts
@@ -11,15 +11,15 @@ export const workspaceDetailJa: ColumnOf = {
"workspace.preparing": "準備状況を確認しています…",
"workspace.readinessFailed": "サーバーの準備状況の確認に失敗しました",
"workspace.readinessAdvice": "サーバーの準備状況を確認できませんでした。接続を確認して、もう一度お試しください。",
- "workspace.loadingSaved": "このワークスペースの保存済みタスクを確認しています…",
+ "workspace.loadingSaved": "このワークスペースの保存済みの会話を確認しています…",
"workspace.checkingProjects": "アクセスできるプロジェクトを確認しています…",
"workspace.accessFailed": "プロジェクトへのアクセスを検証できませんでした。保存済みの作業が新しいプロジェクトに置き換わることはありません。",
"workspace.savedUnavailable": "このワークスペースの保存済みの調査は、現在利用できません。アクセス権限を確認してください。",
- "workspace.taskUnavailable": "選択したタスクを検証できませんでした。下書きは保持されています。",
+ "workspace.taskUnavailable": "選択した会話を検証できませんでした。下書きは保持されています。",
"workspace.draftNotSent": "保存済みの下書きは自動では送信されません。",
"setup.researchIndependent": "保存済みの調査はこの設定ファイルとは別で、必要な権限があれば引き続きアクセスできます。",
"model.unavailable": "保存済みのモデルの選択は、現在利用できません。",
- "model.inheritedUnchanged": "このタスクはプロジェクトのモデル設定を引き継いでおり、個別の選択で置き換えられてはいません。",
+ "model.inheritedUnchanged": "この会話はプロジェクトのモデル設定を引き継いでおり、個別の選択で置き換えられてはいません。",
"model.keepSelection": "現在の選択は保持されます。変更するには、下でモデルを選んでください。",
"model.modelLabel": "モデル",
"model.effortLabel": "推論の強度",
diff --git a/apps/web/src/i18n/ja/workspaceMessagesJa.ts b/apps/web/src/i18n/ja/workspaceMessagesJa.ts
index 9270e2ca..b8bfaa6c 100644
--- a/apps/web/src/i18n/ja/workspaceMessagesJa.ts
+++ b/apps/web/src/i18n/ja/workspaceMessagesJa.ts
@@ -81,20 +81,19 @@ export const workspaceJa: ColumnOf = {
"workspace.searchProjects": "プロジェクトを検索",
"workspace.searchPlaceholder": "プロジェクトを探す…",
"workspace.refreshProjects": "プロジェクト一覧を更新",
- "workspace.newTask": "新しいタスク",
- "workspace.newSession": "新しいセッション",
- "workspace.loadingSessions": "セッションを読み込んでいます…",
- "workspace.untitledSession": "無題のセッション",
+ "workspace.newSession": "新しい会話",
+ "workspace.loadingSessions": "会話を読み込んでいます…",
+ "workspace.untitledSession": "無題の会話",
"workspace.running": "実行中",
"workspace.paused": "一時停止中",
"workspace.reopen": "続きを読む",
- "workspace.firstQuestion": "最初の質問を送ると、このプロジェクトにセッションが作られます。",
+ "workspace.firstQuestion": "最初の質問を送ると、このプロジェクトに会話が作られます。",
"workspace.noProjects": "プロジェクトはまだありません。",
"workspace.testMode": "検証モード",
"workspace.checkingProject": "プロジェクトを確認しています",
"workspace.selectProject": "プロジェクトを選択",
- "workspace.checkingTask": "タスクを確認しています",
- "workspace.selectedTask": "選択したタスク",
+ "workspace.checkingTask": "会話を確認しています",
+ "workspace.selectedTask": "選択した会話",
"workspace.cutoffHint": "このプロジェクトの判定に使う資料の基準時点",
"workspace.serverConnected": "サーバーに接続済み",
"workspace.serverFailed": "サーバーへの接続に失敗",
@@ -107,25 +106,23 @@ export const workspaceJa: ColumnOf = {
"readiness.consentOff": "インターネットを使わない",
"readiness.consentUndecided": "インターネット使用は未決定",
"readiness.readyNotice": "質問を送ると、接続した資料から根拠を探し、考えられる説明と次の行動をまとめて整理します。",
- "workspace.sessionsCount": "セッション",
+ "workspace.sessionsCount": "会話",
"workspace.sourcesCount": "資料",
"workspace.countsLabel": "このプロジェクトの件数",
"workspace.locationUnsaved": "ワークスペースの場所は保存されていません",
- "workspace.taskSelectionNeeded": "保存済みのタスクの選択を確認",
+ "workspace.taskSelectionNeeded": "保存済みの会話の選択を確認",
"workspace.projectList": "プロジェクト一覧",
"workspace.setupNeededHint": "新しい調査には設定が必要です。押すと設定を開きます。",
"workspace.refreshContext": "現在の文脈を更新",
"workspace.conversation": "会話",
"workspace.trace": "追跡表",
- "workspace.chooseTask": "現在のタスクを選択",
- "workspace.untitledTask": "無題のタスク",
"workspace.missingProject": "保存されていたプロジェクトが現在の一覧にないため、選択をクリアしました。",
"workspace.locationFailure": "このブラウザに最後のワークスペースの場所を保存できませんでした。再度開いたあとの自動復元が制限される場合があります。",
"workspace.identityMissing": "ワークスペースの識別子を検証できなかったため、再度開いたあとの下書きの復元はできません。",
"workspace.chooseProjectNotice": "プロジェクトを選択",
"workspace.selectForInfo": "プロジェクトを選ぶと、ワークスペース情報と使用量を確認できます。",
"workspace.connectModel": "モデルの接続",
- "workspace.checkingAccess": "選択したタスクへのアクセスを確認しています…",
- "workspace.selectionCheck": "保存済みのタスクの選択を確認しています…",
+ "workspace.checkingAccess": "選択した会話へのアクセスを確認しています…",
+ "workspace.selectionCheck": "保存済みの会話の選択を確認しています…",
"workspace.checkAgain": "もう一度確認",
};
diff --git a/apps/web/src/i18n/jaScreen.test.ts b/apps/web/src/i18n/jaScreen.test.ts
index 023d4f71..bc63ab29 100644
--- a/apps/web/src/i18n/jaScreen.test.ts
+++ b/apps/web/src/i18n/jaScreen.test.ts
@@ -52,7 +52,7 @@ it("builds the typed Japanese sentences", () => {
expect(message("monthDay", 11, 5, "09:30")).toBe("11月5日 09:30");
expect(message("minutesSeconds", 2, 5)).toBe("2 分 5 秒");
expect(message("replyFixed", "日本語")).toBe("回答:日本語(固定)");
- expect(message("missingSelection", "thread")).toBe("保存済みのタスクの選択を確認してください");
+ expect(message("missingSelection", "thread")).toBe("保存済みの会話の選択を確認してください");
expect(t("expected.unknown")).toBe("不明");
});
diff --git a/apps/web/src/i18n/remainingMessages.ts b/apps/web/src/i18n/remainingMessages.ts
index eafd1f8a..a6b7f660 100644
--- a/apps/web/src/i18n/remainingMessages.ts
+++ b/apps/web/src/i18n/remainingMessages.ts
@@ -312,8 +312,8 @@ export const remainingMessages = {
"en": "Changed assessments:"
},
"workspaceError.title": {
- "ko": "이 작업 화면을 표시하지 못했습니다",
- "en": "This task view could not be displayed"
+ "ko": "이 화면을 표시하지 못했습니다",
+ "en": "This view could not be displayed"
},
"workspaceError.notice": {
"ko": "서버 응답과 표시 형식이 맞지 않을 수 있습니다. 성공·완료로 처리하지 않으며 저장된 기록을 바꾸지 않았습니다. 위 탭이나 왼쪽 프로젝트에서 다른 기록을 확인할 수 있습니다.",
diff --git a/apps/web/src/i18n/researchMessages.ts b/apps/web/src/i18n/researchMessages.ts
index 55df7171..f4cff268 100644
--- a/apps/web/src/i18n/researchMessages.ts
+++ b/apps/web/src/i18n/researchMessages.ts
@@ -40,12 +40,12 @@ export const researchMessages = {
"en": "This instruction will be applied after the current investigation finishes"
},
"timeline.unavailable": {
- "ko": "이 작업의 대화 기록을 현재 화면에서 불러올 수 없습니다.",
- "en": "This task's conversation history is unavailable in the current view."
+ "ko": "이 대화의 기록을 현재 화면에서 불러올 수 없습니다.",
+ "en": "This conversation's history is unavailable in the current view."
},
"timeline.recoverAdvice": {
- "ko": "저장된 연구 이력과 현재 프로젝트 기록을 확인하거나, 같은 작업에서 새 질문을 이어갈 수 있습니다.",
- "en": "Check saved research history and current project records, or ask a new question in this task."
+ "ko": "저장된 연구 이력과 현재 프로젝트 기록을 확인하거나, 같은 대화에서 새 질문을 이어갈 수 있습니다.",
+ "en": "Check saved research history and current project records, or ask a new question in this conversation."
},
"timeline.newQuestion": {
"ko": "새 질문으로 이어가기",
@@ -283,8 +283,8 @@ export const researchMessages = {
"en": "There is no saved answer linked to this request yet."
},
"progress.current": {
- "ko": "현재 작업",
- "en": "Current task"
+ "ko": "현재 조사",
+ "en": "Current research"
},
"progress.pause": {
"ko": "일시정지",
@@ -299,8 +299,8 @@ export const researchMessages = {
"en": "Request stop"
},
"progress.stopConfirm": {
- "ko": "이 작업을 중단할까요? 이미 진행한 외부 실행의 종료 여부는 별도로 확인됩니다.",
- "en": "Stop this task? Whether any external execution already started has stopped will be checked separately."
+ "ko": "이 조사를 중단할까요? 이미 진행한 외부 실행의 종료 여부는 별도로 확인됩니다.",
+ "en": "Stop this research? Whether any external execution already started has stopped will be checked separately."
},
"progress.unknown": {
"ko": "미확인",
diff --git a/apps/web/src/i18n/researchPanelsMessages.ts b/apps/web/src/i18n/researchPanelsMessages.ts
index c93c30d7..e67f2219 100644
--- a/apps/web/src/i18n/researchPanelsMessages.ts
+++ b/apps/web/src/i18n/researchPanelsMessages.ts
@@ -372,8 +372,8 @@ export const researchPanelsMessages = {
"en": "History scope"
},
"historyWorkspace.session": {
- "ko": "현재 세션",
- "en": "Current session"
+ "ko": "현재 대화",
+ "en": "Current conversation"
},
"historyWorkspace.project": {
"ko": "프로젝트 전체",
diff --git a/apps/web/src/i18n/uiFormatMessages.ts b/apps/web/src/i18n/uiFormatMessages.ts
index 5542503b..f4aa8430 100644
--- a/apps/web/src/i18n/uiFormatMessages.ts
+++ b/apps/web/src/i18n/uiFormatMessages.ts
@@ -22,7 +22,7 @@ export const uiFormats = {
terminationReason: {ko: (code: string) => `기록된 종료 사유: ${code}`, en: (code: string) => `Recorded termination reason: ${code}`, "zh-Hans": (code: string)=>`记录的终止原因:${code}`, "zh-Hant": (code: string)=>`記錄的終止原因:${code}`, ja: (code: string)=>`記録された終了の理由:${code}`},
interruptedAnswer: {ko: (reason: string | null) => `모델 호출이 중간에 끊겨 이 조사의 답이 없습니다(${reason}).`, en: (reason: string | null) => `This investigation has no answer because the model call was interrupted (${reason}).`, "zh-Hans": (reason: string | null)=>`模型调用中途中断,因此这次调查没有回答(${reason})。`, "zh-Hant": (reason: string | null)=>`模型呼叫中途中斷,因此這次調查沒有回答(${reason})。`, ja: (reason: string | null)=>`モデル呼び出しが途中で途切れたため、この調査には回答がありません(${reason})。`},
resumeStages: {ko: (count: number | undefined) => ` 끝낸 ${count}단계는 그대로 쓰고 끊긴 곳부터 다시 부릅니다. 자료나 설정이 바뀐 단계는 새로 부릅니다. 누르면 바로 시작합니다.`, en: (count: number | undefined) => ` Continue from the interruption, reusing the ${count} completed stages where inputs are unchanged. Stages with changed sources or settings run again. Pressing this starts immediately.`, "zh-Hans": (count: number | undefined) => ` 从中断处继续,在输入未变化的情况下复用已完成的 ${count} 个阶段。资料或设置已变化的阶段会重新运行。点击后立即开始。`, "zh-Hant": (count: number | undefined) => ` 從中斷處繼續,在輸入未變化的情況下複用已完成的 ${count} 個階段。資料或設定已變化的階段會重新執行。點選後立即開始。`, ja: (count: number | undefined) => ` 中断した箇所から再開し、入力が変わっていない完了済みの ${count} 段階はそのまま再利用します。資料や設定が変わった段階は、もう一度実行します。押すとすぐに始まります。`},
- usageTooltip: {ko: (input: string, output: string) => `현재 작업의 제공자 보고값: 입력 ${input}, 출력 ${output}. 적용 가능한 단가·비용 근거가 없어 추정 비용은 미확인입니다. 계정 잔여량이나 추가 청구액이 아닙니다.`, en: (input: string, output: string) => `Provider-reported usage for this task: input ${input}, output ${output}. Estimated cost is unknown without applicable pricing and cost evidence. This is not remaining account quota or an additional charge.`, "zh-Hans": (input: string, output: string)=>`服务提供商报告的本任务用量:输入 ${input},输出 ${output}。由于没有适用的价格和成本依据,估计成本未知。这不是账户的剩余额度,也不是额外的费用。`, "zh-Hant": (input: string, output: string)=>`服務提供商報告的本任務用量:輸入 ${input},輸出 ${output}。由於沒有適用的價格和成本依據,估計成本未知。這不是帳戶的剩餘額度,也不是額外的費用。`, ja: (input: string, output: string)=>`このタスクについてプロバイダーが報告した使用量:入力 ${input}、出力 ${output}。適用できる単価やコストの根拠がないため、見積もりコストは不明です。アカウントの残り枠や追加の請求額ではありません。`},
+ usageTooltip: {ko: (input: string, output: string) => `이번 조사의 제공자 보고값: 입력 ${input}, 출력 ${output}. 적용 가능한 단가·비용 근거가 없어 추정 비용은 미확인입니다. 계정 잔여량이나 추가 청구액이 아닙니다.`, en: (input: string, output: string) => `Provider-reported usage for this research: input ${input}, output ${output}. Estimated cost is unknown without applicable pricing and cost evidence. This is not remaining account quota or an additional charge.`, "zh-Hans": (input: string, output: string)=>`服务提供商报告的本次研究用量:输入 ${input},输出 ${output}。由于没有适用的价格和成本依据,估计成本未知。这不是账户的剩余额度,也不是额外的费用。`, "zh-Hant": (input: string, output: string)=>`服務提供商報告的本次研究用量:輸入 ${input},輸出 ${output}。由於沒有適用的價格和成本依據,估計成本未知。這不是帳戶的剩餘額度,也不是額外的費用。`, ja: (input: string, output: string)=>`この調査についてプロバイダーが報告した使用量:入力 ${input}、出力 ${output}。適用できる単価やコストの根拠がないため、見積もりコストは不明です。アカウントの残り枠や追加の請求額ではありません。`},
usageCaption: {ko: (total: string, partial: boolean) => `사용 토큰 ${total}${partial ? " (부분 관측)" : ""} · 추정 비용 미확인`, en: (total: string, partial: boolean) => `Tokens used ${total}${partial ? " (partially observed)" : ""} · Estimated cost unknown`, "zh-Hans": (total: string, partial: boolean) => `已用 token ${total}${partial ? "(部分观察到)" : ""} · 估计成本未知`, "zh-Hant": (total: string, partial: boolean) => `已用 token ${total}${partial ? "(部分觀察到)" : ""} · 估計成本未知`, ja: (total: string, partial: boolean) => `使用トークン ${total}${partial ? "(一部のみ観測)" : ""} · 見積もりコストは不明`},
evidenceButton: {ko: (n: number | string) => `근거 ${n} 보기`, en: (n: number | string) => `View evidence ${n}`, "zh-Hans": (n: number | string)=>`查看证据 ${n}`, "zh-Hant": (n: number | string)=>`檢視證據 ${n}`, ja: (n: number | string)=>`根拠 ${n} を見る`},
technicalPhrases: {ko: (count: number) => `기록된 상세 문구 ${count}개`, en: (count: number) => `${count} recorded technical ${count === 1 ? "phrase" : "phrases"}`, "zh-Hans": (count: number)=>`${count} 条已记录的详细措辞`, "zh-Hant": (count: number)=>`${count} 條已記錄的詳細措辭`, ja: (count: number)=>`記録された詳細な文言 ${count} 件`},
diff --git a/apps/web/src/i18n/wordingRules.test.ts b/apps/web/src/i18n/wordingRules.test.ts
index 79198b75..af8202f5 100644
--- a/apps/web/src/i18n/wordingRules.test.ts
+++ b/apps/web/src/i18n/wordingRules.test.ts
@@ -4,8 +4,9 @@ import { join, resolve } from "node:path";
import { afterEach, expect, it } from "vitest";
import { activityDisplay } from "./activityDisplay";
import { connectionReason } from "./connectionReasons";
-import { formatCatalog } from "./formatMessages";
+import { formatCatalog, message } from "./formatMessages";
import { historyTitle } from "./historyTitle";
+import { localRetrievalReason, localRetrievalReasonMessages } from "./localRetrievalMessages";
import { setLocale } from "./locale";
import { messages } from "./messages";
import { joinSentences, sentenceGap } from "./sentences";
@@ -120,3 +121,72 @@ it("says in every screen language why a key was not saved, without the reason co
setLocale("ko");
expect(connectionReason("MODEL_CREDENTIAL_STORE_UNREADABLE")).toContain("새 키를 저장하지 않았습니다");
});
+
+// One word for the unit a person asks questions in, in every screen language. It used to be a session in the
+// sidebar, a task in the top bar and a conversation in the menu, so the same thing looked like three.
+const LANGUAGES = ["ko", "en", "ja", "zh-Hans", "zh-Hant"] as const;
+const CONVERSATION = { ko: "대화", en: "conversation", ja: "会話", "zh-Hans": "对话", "zh-Hant": "對話" } as const;
+const CONVERSATION_KEYS = [
+ "workspace.newSession", "workspace.loadingSessions", "workspace.untitledSession", "workspace.firstQuestion",
+ "workspace.checkingTask", "workspace.selectedTask", "workspace.sessionsCount", "workspace.taskSelectionNeeded",
+ "workspace.checkingAccess", "workspace.selectionCheck", "workspace.taskUnavailable", "workspace.loadingSaved",
+ "workspace.conversation", "manage.renameThreadTitle", "manage.threadChanged",
+ "model.inheritedUnchanged", "model.inheritsProject", "model.saveThread",
+ "advanced.task", "advanced.threadGroup", "records.chooseTask", "delta.sameScope",
+ "timeline.unavailable", "timeline.recoverAdvice", "historyWorkspace.session",
+] as const;
+// The words it was called before. They stay only where they mean another thing, and each place says which.
+const RETIRED = { ko: /세션/, en: /\b(?:session|task)s?\b/i, ja: /セッション|タスク/, "zh-Hans": /会话|任务/, "zh-Hant": /會話|任務|工作階段/ } as const;
+const ANOTHER_THING: Record = {
+ "advanced.fieldHint": "a session of a field study with its participants",
+ RESOURCE_AUTHORITY_CHANGED: "the login session",
+ "sources.explicitGrants": "a line of work that was given a source, which is not a conversation",
+ "sources.scopeHelp": "the same line of work",
+};
+const INDEX_JOB = /^(?:localRetrieval\.|EMBEDDING_)/;
+
+it("calls the unit of questions and answers a conversation in every screen language", () => {
+ const found: string[] = [];
+ for (const key of CONVERSATION_KEYS) {
+ const row = messages[key];
+ for (const language of LANGUAGES) {
+ if (!row[language].toLowerCase().includes(CONVERSATION[language])) found.push(key + " " + language + ": " + row[language]);
+ }
+ // "작업 공간" is the workspace; any other "작업" here would be the old word for a conversation.
+ if (row.ko.replaceAll("작업 공간", "").includes("작업")) found.push(key + " ko: 작업");
+ }
+ for (const language of LANGUAGES) {
+ setLocale(language);
+ for (const text of [message("missingSelection", "thread"), message("threadMenu", "A")]) {
+ if (!text.toLowerCase().includes(CONVERSATION[language])) found.push(language + ": " + text);
+ }
+ }
+ expect(found).toEqual([]);
+});
+
+it("keeps the words a conversation was called before out of every other sentence", () => {
+ // Every sentence of the three word lists, by key and language.
+ const sentences = new Map();
+ for (const [key, row] of Object.entries(messages)) sentences.set(key, LANGUAGES.map(language => row[language]));
+ for (const [key, row] of Object.entries(formatCatalog)) {
+ sentences.set(key, LANGUAGES.map(language => writtenPart(row[language] as (...values: never[]) => string)));
+ }
+ for (const code of Object.keys(localRetrievalReasonMessages)) sentences.set(code, LANGUAGES.map(language => localRetrievalReason(code, language)));
+ const retired = (texts: string[]) => LANGUAGES.filter((language, index) => RETIRED[language].test(texts[index]));
+ const found: string[] = [];
+ for (const [key, texts] of sentences) {
+ if (key in ANOTHER_THING || INDEX_JOB.test(key)) continue;
+ for (const language of retired(texts)) found.push(key + " " + language);
+ }
+ expect(found).toEqual([]);
+ // Every exception is still in use: a place that stops using the old word leaves the list.
+ for (const key of Object.keys(ANOTHER_THING)) expect(retired(sentences.get(key) ?? []), key).not.toEqual([]);
+});
+
+it("quotes the two choices for who may use a source by the names they have on the form", () => {
+ for (const language of LANGUAGES) {
+ const help = messages["sources.scopeHelp"][language];
+ expect(help, language).toContain(messages["sources.projectShared"][language]);
+ expect(help, language).toContain(messages["sources.explicitGrants"][language]);
+ }
+});
diff --git a/apps/web/src/i18n/workspaceDetailMessages.ts b/apps/web/src/i18n/workspaceDetailMessages.ts
index 8abac02c..0438873b 100644
--- a/apps/web/src/i18n/workspaceDetailMessages.ts
+++ b/apps/web/src/i18n/workspaceDetailMessages.ts
@@ -36,8 +36,8 @@ export const workspaceDetailMessages = {
"en": "Server readiness could not be checked. Check the connection and try again."
},
"workspace.loadingSaved": {
- "ko": "이 작업 공간의 저장된 작업을 확인하는 중…",
- "en": "Checking saved tasks in this workspace…"
+ "ko": "이 작업 공간의 저장된 대화를 확인하는 중…",
+ "en": "Checking saved conversations in this workspace…"
},
"workspace.checkingProjects": {
"ko": "읽을 수 있는 프로젝트를 확인하는 중…",
@@ -52,8 +52,8 @@ export const workspaceDetailMessages = {
"en": "Saved research in this workspace is currently unavailable. Check your access."
},
"workspace.taskUnavailable": {
- "ko": "선택한 작업을 확인하지 못했습니다. 초안은 유지합니다.",
- "en": "The selected task could not be verified. Your draft is preserved."
+ "ko": "선택한 대화를 확인하지 못했습니다. 초안은 유지합니다.",
+ "en": "The selected conversation could not be verified. Your draft is preserved."
},
"workspace.draftNotSent": {
"ko": "저장된 초안은 자동 제출하지 않습니다.",
diff --git a/apps/web/src/i18n/workspaceMessages.ts b/apps/web/src/i18n/workspaceMessages.ts
index aa229d9a..80b93f23 100644
--- a/apps/web/src/i18n/workspaceMessages.ts
+++ b/apps/web/src/i18n/workspaceMessages.ts
@@ -294,21 +294,17 @@ export const workspaceMessages = {
"ko": "프로젝트 목록 새로고침",
"en": "Refresh project list"
},
- "workspace.newTask": {
- "ko": "새 작업",
- "en": "New task"
- },
"workspace.newSession": {
- "ko": "새 세션",
- "en": "New session"
+ "ko": "새 대화",
+ "en": "New conversation"
},
"workspace.loadingSessions": {
- "ko": "세션을 읽는 중…",
- "en": "Loading sessions…"
+ "ko": "대화를 읽는 중…",
+ "en": "Loading conversations…"
},
"workspace.untitledSession": {
- "ko": "제목 없는 세션",
- "en": "Untitled session"
+ "ko": "제목 없는 대화",
+ "en": "Untitled conversation"
},
"workspace.running": {
"ko": "진행 중",
@@ -323,8 +319,8 @@ export const workspaceMessages = {
"en": "Continue reading"
},
"workspace.firstQuestion": {
- "ko": "첫 질문을 보내면 이 프로젝트 아래 세션이 생깁니다.",
- "en": "Send your first question to create a session in this project."
+ "ko": "첫 질문을 보내면 이 프로젝트 아래 대화가 생깁니다.",
+ "en": "Send your first question to create a conversation in this project."
},
"workspace.noProjects": {
"ko": "아직 프로젝트가 없습니다.",
@@ -343,12 +339,12 @@ export const workspaceMessages = {
"en": "Select a project"
},
"workspace.checkingTask": {
- "ko": "작업 확인 중",
- "en": "Checking task"
+ "ko": "대화 확인 중",
+ "en": "Checking conversation"
},
"workspace.selectedTask": {
- "ko": "선택한 작업",
- "en": "Selected task"
+ "ko": "선택한 대화",
+ "en": "Selected conversation"
},
"workspace.cutoffHint": {
"ko": "이 프로젝트가 판단에 쓰는 자료의 기준시점",
@@ -377,7 +373,7 @@ export const workspaceMessages = {
"readiness.consentOff": { "ko": "인터넷 사용 안 함", "en": "Internet use off" },
"readiness.consentUndecided": { "ko": "인터넷 사용 미결정", "en": "Internet use undecided" },
"readiness.readyNotice": { "ko": "질문을 보내면 연결된 자료에서 근거를 찾고, 가능한 설명과 다음 행동을 함께 정리합니다.", "en": "Send a question and THOTH finds evidence in the connected sources, with possible explanations and next actions." },
- "workspace.sessionsCount": { "ko": "세션", "en": "Sessions" },
+ "workspace.sessionsCount": { "ko": "대화", "en": "Conversations" },
"workspace.sourcesCount": { "ko": "자료", "en": "Sources" },
"workspace.countsLabel": { "ko": "이 프로젝트의 개수", "en": "Counts for this project" },
"workspace.locationUnsaved": {
@@ -385,8 +381,8 @@ export const workspaceMessages = {
"en": "Workspace location not saved"
},
"workspace.taskSelectionNeeded": {
- "ko": "저장된 작업 선택 확인 필요",
- "en": "Check the saved task selection"
+ "ko": "저장된 대화 선택 확인 필요",
+ "en": "Check the saved conversation selection"
},
"workspace.projectList": { "ko": "프로젝트 목록", "en": "Project list" },
"workspace.setupNeededHint": {
@@ -405,14 +401,6 @@ export const workspaceMessages = {
"ko": "추적표",
"en": "Trace table"
},
- "workspace.chooseTask": {
- "ko": "현재 작업 선택",
- "en": "Select current task"
- },
- "workspace.untitledTask": {
- "ko": "제목 없는 작업",
- "en": "Untitled task"
- },
"workspace.missingProject": {
"ko": "저장된 프로젝트를 현재 목록에서 확인하지 못해 선택을 비웠습니다.",
"en": "The saved project is not in the current list, so the selection was cleared."
@@ -438,12 +426,12 @@ export const workspaceMessages = {
"en": "Model connection"
},
"workspace.checkingAccess": {
- "ko": "선택한 작업의 접근 범위를 확인하는 중…",
- "en": "Checking access to the selected task…"
+ "ko": "선택한 대화의 접근 범위를 확인하는 중…",
+ "en": "Checking access to the selected conversation…"
},
"workspace.selectionCheck": {
- "ko": "저장된 작업 선택을 다시 확인하는 중…",
- "en": "Checking the saved task selection…"
+ "ko": "저장된 대화 선택을 다시 확인하는 중…",
+ "en": "Checking the saved conversation selection…"
},
"workspace.checkAgain": {
"ko": "다시 확인",
diff --git a/apps/web/src/i18n/zh/activityMessagesZh.ts b/apps/web/src/i18n/zh/activityMessagesZh.ts
index e79ce9dc..eaf3dc77 100644
--- a/apps/web/src/i18n/zh/activityMessagesZh.ts
+++ b/apps/web/src/i18n/zh/activityMessagesZh.ts
@@ -71,8 +71,8 @@ export const activityZh: ColumnOf = {
"activity.redactionNotice": "敏感或不可信的详情已隐藏。",
"activity.externalEndUnknown": "无法确认外部执行是否已结束。",
"activity.recoveryRequired": "需要回读或明确恢复,而不是重复执行。",
- "activity.stopRequested": "已请求停止当前研究任务。",
- "activity.stopped": "研究任务被中断。",
+ "activity.stopRequested": "已请求停止当前研究。",
+ "activity.stopped": "研究被中断。",
"activity.partialPreserved": "只有在中断之前已验证的记录才会作为部分结果保留。",
"activity.failureNotice": "失败的执行结果不会被用作新的证据或成功的评估。",
"activity.sourceBlocked": "资料访问被阻止。",
diff --git a/apps/web/src/i18n/zh/advancedMessagesZh.ts b/apps/web/src/i18n/zh/advancedMessagesZh.ts
index 97d3fcc3..bd1ad424 100644
--- a/apps/web/src/i18n/zh/advancedMessagesZh.ts
+++ b/apps/web/src/i18n/zh/advancedMessagesZh.ts
@@ -3,7 +3,7 @@ import type { advancedMessages } from "../advancedMessages";
export const advancedZh: ColumnOf = {
"advanced.projectHint": "截止时间 · 策略绑定 · 生命周期",
- "advanced.task": "任务",
+ "advanced.task": "对话",
"advanced.taskHint": "输入应用 · 研究进展 · 当前结果",
"advanced.discovery": "发现",
"advanced.discoveryHint": "搜索范围 · 获取阶段 · 停止原因",
@@ -42,7 +42,7 @@ export const advancedZh: ColumnOf = {
"advanced.fieldHint": "方案 · 参与者会话 · 评分 · 保护隐私的导出",
"advanced.fieldNotice": "公开的现场命名空间目前只提供命令,没有只读查询 API,本界面也不能证明参与者评估、节省的时间或付费意愿。只有在获得批准的方案和参与者同意的情况下,才能使用高级命令。",
"advanced.projectGroup": "项目、资料与访问",
- "advanced.threadGroup": "任务与请求",
+ "advanced.threadGroup": "对话与请求",
"advanced.discoveryGroup": "资料发现",
"advanced.evidenceGroup": "证据与主张",
"advanced.hypothesisGroup": "假设与验证",
@@ -94,7 +94,7 @@ export const advancedZh: ColumnOf = {
"records.controls": "此区域的详细查询和高级控制",
"records.readOnly": "这是只读查询。",
"records.journaled": "这是记入日志的 /rpc 查询。只有按下此按钮时才可能创建操作或日志。",
- "records.chooseTask": "请先选择任务。",
+ "records.chooseTask": "请先选择对话。",
"records.failed": "读取失败或缺少所需范围",
"records.moreInputs": "需要额外 ID 或范围的契约,可以通过能力输入编辑器查询。",
"records.beforeRead": "尚未读取",
diff --git a/apps/web/src/i18n/zh/finishingMessagesZh.ts b/apps/web/src/i18n/zh/finishingMessagesZh.ts
index db4fa282..79ee963a 100644
--- a/apps/web/src/i18n/zh/finishingMessagesZh.ts
+++ b/apps/web/src/i18n/zh/finishingMessagesZh.ts
@@ -9,7 +9,7 @@ export const finishingZh: ColumnOf = {
"progress.elapsedUnknown": "耗时未知",
"progress.noFirstByte": "尚未收到首字节",
"progress.pausing": "正在完成当前阶段后暂停。",
- "progress.paused": "任务已暂停。",
+ "progress.paused": "研究已暂停。",
"progress.externalUnknown": "尚未确认外部执行已终止。",
"usage.none": "此结果没有使用量记录",
"usage.lessMinute": "不到一分钟",
diff --git a/apps/web/src/i18n/zh/historyViewMessagesZh.ts b/apps/web/src/i18n/zh/historyViewMessagesZh.ts
index 11560f23..b8494e13 100644
--- a/apps/web/src/i18n/zh/historyViewMessagesZh.ts
+++ b/apps/web/src/i18n/zh/historyViewMessagesZh.ts
@@ -40,7 +40,7 @@ export const historyViewZh: ColumnOf = {
"delta.record": "记录",
"delta.noIdentifier": "无标识符",
"delta.noIdentity": "没有精确的请求与结果链接的记录无法比较。",
- "delta.sameScope": "请从同一项目和同一会话中选择两个回答。",
+ "delta.sameScope": "请从同一项目和同一对话中选择两个回答。",
"delta.distinct": "请选择两个不同的回答。",
"delta.checkAccess": "确认访问权限后即可比较。",
"delta.checkingAccess": "正在重新检查访问权限… 你选择的两个回答会保留。",
diff --git a/apps/web/src/i18n/zh/remainingMessagesZh.ts b/apps/web/src/i18n/zh/remainingMessagesZh.ts
index 98b1e3cb..ab32cf48 100644
--- a/apps/web/src/i18n/zh/remainingMessagesZh.ts
+++ b/apps/web/src/i18n/zh/remainingMessagesZh.ts
@@ -80,7 +80,7 @@ export const remainingZh: ColumnOf = {
"labels.decider": "决定人:",
"labels.confirmed": "已确认 ·",
"labels.changedVerdicts": "变化的评估:",
- "workspaceError.title": "无法显示此任务视图",
+ "workspaceError.title": "无法显示此视图",
"workspaceError.notice": "服务器的响应可能与显示格式不符。这不会被视为成功或完成,已保存的记录不受影响。请使用标签页或项目查看其他记录。",
"workspaceError.retry": "重新加载服务器状态并重试",
"labels.userCode": "用户代码:",
diff --git a/apps/web/src/i18n/zh/researchMessagesZh.ts b/apps/web/src/i18n/zh/researchMessagesZh.ts
index ad73a751..5598cf41 100644
--- a/apps/web/src/i18n/zh/researchMessagesZh.ts
+++ b/apps/web/src/i18n/zh/researchMessagesZh.ts
@@ -12,8 +12,8 @@ export const researchZh: ColumnOf = {
"timeline.limited": "更早的历史超出了此视图的范围。请打开研究历史查看。",
"timeline.unsupported": "此服务器不支持对话历史。只显示可以验证的当前记录。",
"timeline.queued": "此指示将在当前调查结束后应用",
- "timeline.unavailable": "当前视图中无法查看此任务的对话历史。",
- "timeline.recoverAdvice": "请查看已保存的研究历史和当前项目记录,或在此任务中提出新问题。",
+ "timeline.unavailable": "当前视图中无法查看此对话的历史。",
+ "timeline.recoverAdvice": "请查看已保存的研究历史和当前项目记录,或在此对话中提出新问题。",
"timeline.newQuestion": "用新问题继续",
"timeline.openHistory": "查看研究历史",
"timeline.emptyTitle": "你正在思考什么问题?",
@@ -81,10 +81,10 @@ export const researchZh: ColumnOf = {
"result.memory": "项目记忆",
"result.checking": "正在检查资料和条件。尚未保存任何回答。",
"result.noLinkedAnswer": "此请求尚无关联的已保存回答。",
- "progress.current": "当前任务",
+ "progress.current": "当前研究",
"progress.pause": "暂停",
"progress.resume": "继续",
"progress.stop": "请求停止",
- "progress.stopConfirm": "要停止此任务吗?已开始的外部执行是否已停止,会另行检查。",
+ "progress.stopConfirm": "要停止此研究吗?已开始的外部执行是否已停止,会另行检查。",
"progress.unknown": "未知",
};
diff --git a/apps/web/src/i18n/zh/researchPanelsMessagesZh.ts b/apps/web/src/i18n/zh/researchPanelsMessagesZh.ts
index 1ff53dc4..7c0e5a9c 100644
--- a/apps/web/src/i18n/zh/researchPanelsMessagesZh.ts
+++ b/apps/web/src/i18n/zh/researchPanelsMessagesZh.ts
@@ -95,6 +95,6 @@ export const researchPanelsZh: ColumnOf = {
"historyWorkspace.testMode": "验证模式:此屏幕使用受控的资料和模型,不会验证真实的研究结果。",
"historyWorkspace.preserve": "在审查评估变化时,保留原始回答和证据。",
"historyWorkspace.scope": "历史范围",
- "historyWorkspace.session": "当前会话",
+ "historyWorkspace.session": "当前对话",
"historyWorkspace.project": "整个项目",
};
diff --git a/apps/web/src/i18n/zh/setupMessagesZh.ts b/apps/web/src/i18n/zh/setupMessagesZh.ts
index 2fb8bb66..b472dc37 100644
--- a/apps/web/src/i18n/zh/setupMessagesZh.ts
+++ b/apps/web/src/i18n/zh/setupMessagesZh.ts
@@ -57,12 +57,12 @@ export const setupZh: ColumnOf = {
"model.parentLoading": "正在检查继承的项目模型…",
"model.parentFailed": "无法读取继承的项目模型。",
"model.noProjectModel": "未指定项目模型",
- "model.inheritsProject": "此任务沿用项目的模型设置。",
+ "model.inheritsProject": "此对话沿用项目的模型设置。",
"model.researchModel": "研究所用模型",
"model.choose": "选择模型",
"model.reasoningEffort": "研究所用推理强度",
"model.default": "默认",
- "model.saveThread": "保存为此任务的默认设置",
+ "model.saveThread": "保存为此对话的默认设置",
"model.saveProject": "保存为项目的默认设置",
"model.nextRequestOnly": "未保存的选择只对下一次请求有效。模型出现在列表中,并不表示服务提供商的身份验证已通过或能成功执行。",
"model.saved": "默认设置已保存。",
diff --git a/apps/web/src/i18n/zh/sourceMessagesZh.ts b/apps/web/src/i18n/zh/sourceMessagesZh.ts
index eb8b3f71..0ff52bd6 100644
--- a/apps/web/src/i18n/zh/sourceMessagesZh.ts
+++ b/apps/web/src/i18n/zh/sourceMessagesZh.ts
@@ -20,7 +20,7 @@ export const sourceZh: ColumnOf = {
"sources.projectShared": "在本项目内共享",
"sources.explicitGrants": "仅限明确许可的任务",
"sources.connectFailed": "未能连接资料",
- "sources.scopeHelp": "“在本项目内共享”让本项目的所有任务都能把这份资料用作证据。“仅限明确允许的任务”只让单独获得许可的任务使用。",
+ "sources.scopeHelp": "“在本项目内共享”让本项目的所有任务都能把这份资料用作证据。“仅限明确许可的任务”只让单独获得许可的任务使用。",
"sources.connected": "资料已连接。请用新的问题或指示开始分析。",
"sources.unclassified": "权威性未分类",
"sources.informal": "非正式参考",
diff --git a/apps/web/src/i18n/zh/workspaceDetailMessagesZh.ts b/apps/web/src/i18n/zh/workspaceDetailMessagesZh.ts
index 25651564..269d2a91 100644
--- a/apps/web/src/i18n/zh/workspaceDetailMessagesZh.ts
+++ b/apps/web/src/i18n/zh/workspaceDetailMessagesZh.ts
@@ -11,15 +11,15 @@ export const workspaceDetailZh: ColumnOf = {
"workspace.preparing": "正在检查就绪状态…",
"workspace.readinessFailed": "服务器就绪检查失败",
"workspace.readinessAdvice": "无法检查服务器就绪状态。请检查连接后重试。",
- "workspace.loadingSaved": "正在检查此工作区中已保存的任务…",
+ "workspace.loadingSaved": "正在检查此工作区中已保存的对话…",
"workspace.checkingProjects": "正在检查可访问的项目…",
"workspace.accessFailed": "无法验证项目访问权限。已保存的工作不会被新项目取代。",
"workspace.savedUnavailable": "此工作区中已保存的研究目前不可用。请检查你的访问权限。",
- "workspace.taskUnavailable": "无法验证所选任务。你的草稿会保留。",
+ "workspace.taskUnavailable": "无法验证所选对话。你的草稿会保留。",
"workspace.draftNotSent": "已保存的草稿不会自动提交。",
"setup.researchIndependent": "已保存的研究与此设置文件相互独立,在具备所需权限时仍可访问。",
"model.unavailable": "已保存的模型选择目前不可用。",
- "model.inheritedUnchanged": "此任务沿用项目的模型设置;没有单独的选择取代它们。",
+ "model.inheritedUnchanged": "此对话沿用项目的模型设置;没有单独的选择取代它们。",
"model.keepSelection": "你现有的选择会保留。如需更改,请在下面选择模型。",
"model.modelLabel": "模型",
"model.effortLabel": "推理强度",
diff --git a/apps/web/src/i18n/zh/workspaceMessagesZh.ts b/apps/web/src/i18n/zh/workspaceMessagesZh.ts
index bd56fcc1..b4fab945 100644
--- a/apps/web/src/i18n/zh/workspaceMessagesZh.ts
+++ b/apps/web/src/i18n/zh/workspaceMessagesZh.ts
@@ -81,20 +81,19 @@ export const workspaceZh: ColumnOf = {
"workspace.searchProjects": "搜索项目",
"workspace.searchPlaceholder": "查找项目…",
"workspace.refreshProjects": "刷新项目列表",
- "workspace.newTask": "新任务",
- "workspace.newSession": "新会话",
- "workspace.loadingSessions": "正在加载会话…",
- "workspace.untitledSession": "未命名会话",
+ "workspace.newSession": "新对话",
+ "workspace.loadingSessions": "正在加载对话…",
+ "workspace.untitledSession": "未命名对话",
"workspace.running": "运行中",
"workspace.paused": "已暂停",
"workspace.reopen": "继续阅读",
- "workspace.firstQuestion": "发送你的第一个问题,即可在此项目中创建会话。",
+ "workspace.firstQuestion": "发送你的第一个问题,即可在此项目中创建对话。",
"workspace.noProjects": "还没有项目。",
"workspace.testMode": "验证模式",
"workspace.checkingProject": "正在检查项目",
"workspace.selectProject": "选择项目",
- "workspace.checkingTask": "正在检查任务",
- "workspace.selectedTask": "已选任务",
+ "workspace.checkingTask": "正在检查对话",
+ "workspace.selectedTask": "已选对话",
"workspace.cutoffHint": "此项目评估所用资料的截止时间",
"workspace.serverConnected": "服务器已连接",
"workspace.serverFailed": "服务器连接失败",
@@ -107,25 +106,23 @@ export const workspaceZh: ColumnOf = {
"readiness.consentOff": "不使用互联网",
"readiness.consentUndecided": "互联网使用未决定",
"readiness.readyNotice": "发送问题后,THOTH 会在已连接的资料中查找证据,并一并整理可能的解释与下一步行动。",
- "workspace.sessionsCount": "会话",
+ "workspace.sessionsCount": "对话",
"workspace.sourcesCount": "资料",
"workspace.countsLabel": "此项目的数量",
"workspace.locationUnsaved": "未保存工作区位置",
- "workspace.taskSelectionNeeded": "检查已保存的任务选择",
+ "workspace.taskSelectionNeeded": "检查已保存的对话选择",
"workspace.projectList": "项目列表",
"workspace.setupNeededHint": "新研究需要先完成设置。点击后打开设置。",
"workspace.refreshContext": "刷新当前上下文",
"workspace.conversation": "对话",
"workspace.trace": "追溯表",
- "workspace.chooseTask": "选择当前任务",
- "workspace.untitledTask": "未命名任务",
"workspace.missingProject": "已保存的项目不在当前列表中,因此选择已被清除。",
"workspace.locationFailure": "无法在此浏览器中保存上一次的工作区位置。重新打开后,自动恢复可能受限。",
"workspace.identityMissing": "无法验证工作区标识,因此重新打开后无法恢复草稿。",
"workspace.chooseProjectNotice": "选择项目",
"workspace.selectForInfo": "选择项目以查看工作区信息和使用量。",
"workspace.connectModel": "模型连接",
- "workspace.checkingAccess": "正在检查对所选任务的访问权限…",
- "workspace.selectionCheck": "正在检查已保存的任务选择…",
+ "workspace.checkingAccess": "正在检查对所选对话的访问权限…",
+ "workspace.selectionCheck": "正在检查已保存的对话选择…",
"workspace.checkAgain": "再次检查",
};
diff --git a/apps/web/src/i18n/zhHant/activityMessagesZhHant.ts b/apps/web/src/i18n/zhHant/activityMessagesZhHant.ts
index 7b199127..7472cc92 100644
--- a/apps/web/src/i18n/zhHant/activityMessagesZhHant.ts
+++ b/apps/web/src/i18n/zhHant/activityMessagesZhHant.ts
@@ -71,8 +71,8 @@ export const activityZhHant: ColumnOf = {
"activity.redactionNotice": "敏感或不可信的詳情已隱藏。",
"activity.externalEndUnknown": "無法確認外部執行是否已結束。",
"activity.recoveryRequired": "需要回讀或明確還原,而不是重複執行。",
- "activity.stopRequested": "已請求停止目前研究任務。",
- "activity.stopped": "研究任務被中斷。",
+ "activity.stopRequested": "已請求停止目前研究。",
+ "activity.stopped": "研究被中斷。",
"activity.partialPreserved": "只有在中斷之前已驗證的記錄才會作為部分結果保留。",
"activity.failureNotice": "失敗的執行結果不會被用作新的證據或成功的評估。",
"activity.sourceBlocked": "資料存取被阻止。",
diff --git a/apps/web/src/i18n/zhHant/advancedMessagesZhHant.ts b/apps/web/src/i18n/zhHant/advancedMessagesZhHant.ts
index c854cb0a..9e04c99b 100644
--- a/apps/web/src/i18n/zhHant/advancedMessagesZhHant.ts
+++ b/apps/web/src/i18n/zhHant/advancedMessagesZhHant.ts
@@ -3,7 +3,7 @@ import type { advancedMessages } from "../advancedMessages";
export const advancedZhHant: ColumnOf = {
"advanced.projectHint": "截止時間 · 策略繫結 · 生命週期",
- "advanced.task": "任務",
+ "advanced.task": "對話",
"advanced.taskHint": "輸入應用 · 研究進展 · 目前結果",
"advanced.discovery": "發現",
"advanced.discoveryHint": "搜尋範圍 · 獲取階段 · 停止原因",
@@ -42,7 +42,7 @@ export const advancedZhHant: ColumnOf = {
"advanced.fieldHint": "方案 · 參與者會話 · 評分 · 保護隱私的匯出",
"advanced.fieldNotice": "公開的現場名稱空間目前只提供命令,沒有隻讀查詢 API,本介面也不能證明參與者評估、節省的時間或付費意願。只有在獲得批准的方案和參與者同意的情況下,才能使用進階命令。",
"advanced.projectGroup": "專案、資料與存取",
- "advanced.threadGroup": "任務與請求",
+ "advanced.threadGroup": "對話與請求",
"advanced.discoveryGroup": "資料發現",
"advanced.evidenceGroup": "證據與主張",
"advanced.hypothesisGroup": "假設與驗證",
@@ -94,7 +94,7 @@ export const advancedZhHant: ColumnOf = {
"records.controls": "此區域的詳細查詢和進階控制",
"records.readOnly": "這是隻讀查詢。",
"records.journaled": "這是記入日誌的 /rpc 查詢。只有按下此按鈕時才可能建立操作或日誌。",
- "records.chooseTask": "請先選擇任務。",
+ "records.chooseTask": "請先選擇對話。",
"records.failed": "讀取失敗或缺少所需範圍",
"records.moreInputs": "需要額外 ID 或範圍的契約,可以透過能力輸入編輯器查詢。",
"records.beforeRead": "尚未讀取",
diff --git a/apps/web/src/i18n/zhHant/finishingMessagesZhHant.ts b/apps/web/src/i18n/zhHant/finishingMessagesZhHant.ts
index 6eaa61e5..f57ed544 100644
--- a/apps/web/src/i18n/zhHant/finishingMessagesZhHant.ts
+++ b/apps/web/src/i18n/zhHant/finishingMessagesZhHant.ts
@@ -9,7 +9,7 @@ export const finishingZhHant: ColumnOf = {
"progress.elapsedUnknown": "耗時未知",
"progress.noFirstByte": "尚未收到首位元組",
"progress.pausing": "正在完成目前階段後暫停。",
- "progress.paused": "任務已暫停。",
+ "progress.paused": "研究已暫停。",
"progress.externalUnknown": "尚未確認外部執行已終止。",
"usage.none": "此結果沒有使用量記錄",
"usage.lessMinute": "不到一分鐘",
diff --git a/apps/web/src/i18n/zhHant/historyViewMessagesZhHant.ts b/apps/web/src/i18n/zhHant/historyViewMessagesZhHant.ts
index cfae6979..986e2d64 100644
--- a/apps/web/src/i18n/zhHant/historyViewMessagesZhHant.ts
+++ b/apps/web/src/i18n/zhHant/historyViewMessagesZhHant.ts
@@ -40,7 +40,7 @@ export const historyViewZhHant: ColumnOf = {
"delta.record": "記錄",
"delta.noIdentifier": "無識別碼",
"delta.noIdentity": "沒有精確的請求與結果連結的記錄無法比較。",
- "delta.sameScope": "請從同一專案和同一會話中選擇兩個回答。",
+ "delta.sameScope": "請從同一專案和同一對話中選擇兩個回答。",
"delta.distinct": "請選擇兩個不同的回答。",
"delta.checkAccess": "確認存取權限後即可比較。",
"delta.checkingAccess": "正在重新檢查存取權限… 你選擇的兩個回答會保留。",
diff --git a/apps/web/src/i18n/zhHant/remainingMessagesZhHant.ts b/apps/web/src/i18n/zhHant/remainingMessagesZhHant.ts
index 1a7ad52b..c447e7ec 100644
--- a/apps/web/src/i18n/zhHant/remainingMessagesZhHant.ts
+++ b/apps/web/src/i18n/zhHant/remainingMessagesZhHant.ts
@@ -80,7 +80,7 @@ export const remainingZhHant: ColumnOf = {
"labels.decider": "決定人:",
"labels.confirmed": "已確認 ·",
"labels.changedVerdicts": "變化的評估:",
- "workspaceError.title": "無法顯示此任務檢視",
+ "workspaceError.title": "無法顯示此檢視",
"workspaceError.notice": "伺服器的回應可能與顯示格式不符。這不會被視為成功或完成,已儲存的記錄不受影響。請使用標籤頁或專案檢視其他記錄。",
"workspaceError.retry": "重新載入伺服器狀態並重試",
"labels.userCode": "使用者程式碼:",
diff --git a/apps/web/src/i18n/zhHant/researchMessagesZhHant.ts b/apps/web/src/i18n/zhHant/researchMessagesZhHant.ts
index 7b4d37e4..8372b8b5 100644
--- a/apps/web/src/i18n/zhHant/researchMessagesZhHant.ts
+++ b/apps/web/src/i18n/zhHant/researchMessagesZhHant.ts
@@ -12,8 +12,8 @@ export const researchZhHant: ColumnOf = {
"timeline.limited": "更早的歷史超出了此檢視的範圍。請開啟研究歷史檢視。",
"timeline.unsupported": "此伺服器不支援對話歷史。只顯示可以驗證的目前記錄。",
"timeline.queued": "此指示將在目前調查結束後應用",
- "timeline.unavailable": "目前檢視中無法檢視此任務的對話歷史。",
- "timeline.recoverAdvice": "請檢視已儲存的研究歷史和目前專案記錄,或在此任務中提出新問題。",
+ "timeline.unavailable": "目前檢視中無法檢視此對話的歷史。",
+ "timeline.recoverAdvice": "請檢視已儲存的研究歷史和目前專案記錄,或在此對話中提出新問題。",
"timeline.newQuestion": "用新問題繼續",
"timeline.openHistory": "檢視研究歷史",
"timeline.emptyTitle": "你正在思考什麼問題?",
@@ -81,10 +81,10 @@ export const researchZhHant: ColumnOf = {
"result.memory": "專案記憶",
"result.checking": "正在檢查資料和條件。尚未儲存任何回答。",
"result.noLinkedAnswer": "此請求尚無關聯的已儲存回答。",
- "progress.current": "目前任務",
+ "progress.current": "目前研究",
"progress.pause": "暫停",
"progress.resume": "繼續",
"progress.stop": "請求停止",
- "progress.stopConfirm": "要停止此任務嗎?已開始的外部執行是否已停止,會另行檢查。",
+ "progress.stopConfirm": "要停止此研究嗎?已開始的外部執行是否已停止,會另行檢查。",
"progress.unknown": "未知",
};
diff --git a/apps/web/src/i18n/zhHant/researchPanelsMessagesZhHant.ts b/apps/web/src/i18n/zhHant/researchPanelsMessagesZhHant.ts
index aacc5956..3ac17c78 100644
--- a/apps/web/src/i18n/zhHant/researchPanelsMessagesZhHant.ts
+++ b/apps/web/src/i18n/zhHant/researchPanelsMessagesZhHant.ts
@@ -95,6 +95,6 @@ export const researchPanelsZhHant: ColumnOf = {
"historyWorkspace.testMode": "驗證模式:此螢幕使用受控的資料和模型,不會驗證真實的研究結果。",
"historyWorkspace.preserve": "在審查評估變化時,保留原始回答和證據。",
"historyWorkspace.scope": "歷史範圍",
- "historyWorkspace.session": "目前會話",
+ "historyWorkspace.session": "目前對話",
"historyWorkspace.project": "整個專案",
};
diff --git a/apps/web/src/i18n/zhHant/setupMessagesZhHant.ts b/apps/web/src/i18n/zhHant/setupMessagesZhHant.ts
index c660c87a..6cdb6d83 100644
--- a/apps/web/src/i18n/zhHant/setupMessagesZhHant.ts
+++ b/apps/web/src/i18n/zhHant/setupMessagesZhHant.ts
@@ -57,12 +57,12 @@ export const setupZhHant: ColumnOf = {
"model.parentLoading": "正在檢查繼承的專案模型…",
"model.parentFailed": "無法讀取繼承的專案模型。",
"model.noProjectModel": "未指定專案模型",
- "model.inheritsProject": "此任務沿用專案的模型設定。",
+ "model.inheritsProject": "此對話沿用專案的模型設定。",
"model.researchModel": "研究所用模型",
"model.choose": "選擇模型",
"model.reasoningEffort": "研究所用推理強度",
"model.default": "預設",
- "model.saveThread": "儲存為此任務的預設設定",
+ "model.saveThread": "儲存為此對話的預設設定",
"model.saveProject": "儲存為專案的預設設定",
"model.nextRequestOnly": "未儲存的選擇只對下一次請求有效。模型出現在列表中,並不表示服務提供商的身分驗證已透過或能成功執行。",
"model.saved": "預設設定已儲存。",
diff --git a/apps/web/src/i18n/zhHant/sourceMessagesZhHant.ts b/apps/web/src/i18n/zhHant/sourceMessagesZhHant.ts
index bf30d2b2..e4808335 100644
--- a/apps/web/src/i18n/zhHant/sourceMessagesZhHant.ts
+++ b/apps/web/src/i18n/zhHant/sourceMessagesZhHant.ts
@@ -20,7 +20,7 @@ export const sourceZhHant: ColumnOf = {
"sources.projectShared": "在本專案內共享",
"sources.explicitGrants": "僅限明確許可的任務",
"sources.connectFailed": "未能連線資料",
- "sources.scopeHelp": "「在本專案內共用」讓本專案的所有任務都能把這份資料用作證據。「僅限明確允許的任務」只讓個別獲得許可的任務使用。",
+ "sources.scopeHelp": "「在本專案內共享」讓本專案的所有任務都能把這份資料用作證據。「僅限明確許可的任務」只讓個別獲得許可的任務使用。",
"sources.connected": "資料已連線。請用新的問題或指示開始分析。",
"sources.unclassified": "權威性未分類",
"sources.informal": "非正式參考",
diff --git a/apps/web/src/i18n/zhHant/workspaceDetailMessagesZhHant.ts b/apps/web/src/i18n/zhHant/workspaceDetailMessagesZhHant.ts
index 67fddb7b..b0ae8cc5 100644
--- a/apps/web/src/i18n/zhHant/workspaceDetailMessagesZhHant.ts
+++ b/apps/web/src/i18n/zhHant/workspaceDetailMessagesZhHant.ts
@@ -11,15 +11,15 @@ export const workspaceDetailZhHant: ColumnOf = {
"workspace.preparing": "正在檢查就緒狀態…",
"workspace.readinessFailed": "伺服器就緒檢查失敗",
"workspace.readinessAdvice": "無法檢查伺服器就緒狀態。請檢查連線後重試。",
- "workspace.loadingSaved": "正在檢查此工作區中已儲存的任務…",
+ "workspace.loadingSaved": "正在檢查此工作區中已儲存的對話…",
"workspace.checkingProjects": "正在檢查可存取的專案…",
"workspace.accessFailed": "無法驗證專案存取權限。已儲存的工作不會被新專案取代。",
"workspace.savedUnavailable": "此工作區中已儲存的研究目前不可用。請檢查你的存取權限。",
- "workspace.taskUnavailable": "無法驗證所選任務。你的草稿會保留。",
+ "workspace.taskUnavailable": "無法驗證所選對話。你的草稿會保留。",
"workspace.draftNotSent": "已儲存的草稿不會自動提交。",
"setup.researchIndependent": "已儲存的研究與此設定檔案相互獨立,在具備所需權限時仍可存取。",
"model.unavailable": "已儲存的模型選擇目前不可用。",
- "model.inheritedUnchanged": "此任務沿用專案的模型設定;沒有單獨的選擇取代它們。",
+ "model.inheritedUnchanged": "此對話沿用專案的模型設定;沒有單獨的選擇取代它們。",
"model.keepSelection": "你現有的選擇會保留。如需更改,請在下面選擇模型。",
"model.modelLabel": "模型",
"model.effortLabel": "推理強度",
diff --git a/apps/web/src/i18n/zhHant/workspaceMessagesZhHant.ts b/apps/web/src/i18n/zhHant/workspaceMessagesZhHant.ts
index 04caf222..46e6011d 100644
--- a/apps/web/src/i18n/zhHant/workspaceMessagesZhHant.ts
+++ b/apps/web/src/i18n/zhHant/workspaceMessagesZhHant.ts
@@ -81,20 +81,19 @@ export const workspaceZhHant: ColumnOf = {
"workspace.searchProjects": "搜尋專案",
"workspace.searchPlaceholder": "查詢專案…",
"workspace.refreshProjects": "重新整理專案列表",
- "workspace.newTask": "新任務",
- "workspace.newSession": "新會話",
- "workspace.loadingSessions": "正在載入會話…",
- "workspace.untitledSession": "未命名會話",
+ "workspace.newSession": "新對話",
+ "workspace.loadingSessions": "正在載入對話…",
+ "workspace.untitledSession": "未命名對話",
"workspace.running": "執行中",
"workspace.paused": "已暫停",
"workspace.reopen": "繼續閱讀",
- "workspace.firstQuestion": "傳送你的第一個問題,即可在此專案中建立會話。",
+ "workspace.firstQuestion": "傳送你的第一個問題,即可在此專案中建立對話。",
"workspace.noProjects": "還沒有專案。",
"workspace.testMode": "驗證模式",
"workspace.checkingProject": "正在檢查專案",
"workspace.selectProject": "選擇專案",
- "workspace.checkingTask": "正在檢查任務",
- "workspace.selectedTask": "已選任務",
+ "workspace.checkingTask": "正在檢查對話",
+ "workspace.selectedTask": "已選對話",
"workspace.cutoffHint": "此專案評估所用資料的截止時間",
"workspace.serverConnected": "伺服器已連線",
"workspace.serverFailed": "伺服器連線失敗",
@@ -107,25 +106,23 @@ export const workspaceZhHant: ColumnOf = {
"readiness.consentOff": "不使用網際網路",
"readiness.consentUndecided": "網際網路使用未決定",
"readiness.readyNotice": "傳送問題後,THOTH 會在已連線的資料中查詢證據,並一併整理可能的解釋與下一步行動。",
- "workspace.sessionsCount": "會話",
+ "workspace.sessionsCount": "對話",
"workspace.sourcesCount": "資料",
"workspace.countsLabel": "此專案的數量",
"workspace.locationUnsaved": "未儲存工作區位置",
- "workspace.taskSelectionNeeded": "檢查已儲存的任務選擇",
+ "workspace.taskSelectionNeeded": "檢查已儲存的對話選擇",
"workspace.projectList": "專案清單",
"workspace.setupNeededHint": "新研究需要先完成設定。點擊後開啟設定。",
"workspace.refreshContext": "重新整理目前上下文",
"workspace.conversation": "對話",
"workspace.trace": "追溯表",
- "workspace.chooseTask": "選擇目前任務",
- "workspace.untitledTask": "未命名任務",
"workspace.missingProject": "已儲存的專案不在目前列表中,因此選擇已被清除。",
"workspace.locationFailure": "無法在此瀏覽器中儲存上一次的工作區位置。重新開啟後,自動還原可能受限。",
"workspace.identityMissing": "無法驗證工作區標識,因此重新開啟後無法還原草稿。",
"workspace.chooseProjectNotice": "選擇專案",
"workspace.selectForInfo": "選擇專案以檢視工作區資訊和使用量。",
"workspace.connectModel": "模型連線",
- "workspace.checkingAccess": "正在檢查對所選任務的存取權限…",
- "workspace.selectionCheck": "正在檢查已儲存的任務選擇…",
+ "workspace.checkingAccess": "正在檢查對所選對話的存取權限…",
+ "workspace.selectionCheck": "正在檢查已儲存的對話選擇…",
"workspace.checkAgain": "再次檢查",
};
diff --git a/apps/web/src/i18n/zhHantScreen.test.ts b/apps/web/src/i18n/zhHantScreen.test.ts
index 4d52bf45..4043a979 100644
--- a/apps/web/src/i18n/zhHantScreen.test.ts
+++ b/apps/web/src/i18n/zhHantScreen.test.ts
@@ -56,7 +56,7 @@ it("uses Taiwan wording where the conversion tool or mainland usage would not",
expect(t("usage.memoryExpansion")).toBe("記憶檢索詞擴充");
expect(t("history.itemAbsent")).toBe("項目不存在");
expect(t("restore.impact")).toBe("對關聯項目的影響");
- expect(t("delta.sameScope")).toBe("請從同一專案和同一會話中選擇兩個回答。");
+ expect(t("delta.sameScope")).toBe("請從同一專案和同一對話中選擇兩個回答。");
expect(t("closure.basis")).toBe("佐證文件");
expect(t("review.unsupported")).toBe("未得到支持");
expect(t("credential.keyOnly")).toBe("不支援帳戶登入。請獲取並登記 API 金鑰。");
diff --git a/apps/web/src/styles.css b/apps/web/src/styles.css
index d2be2004..ff1ba50a 100644
--- a/apps/web/src/styles.css
+++ b/apps/web/src/styles.css
@@ -1,4 +1,6 @@
:root {
+ /* The smallest text on any screen. Labels, tags and notes that used to be 7 to 11px are all this size. */
+ --font-small: 12px;
font-family: Inter, "Pretendard", "Noto Sans KR", system-ui, sans-serif;
color: #e8ebf2;
background: #090b10;
@@ -39,13 +41,13 @@ button { color: inherit; }
.model-settings { display: flex; flex-wrap: wrap; align-items: end; gap: 12px;
min-width: 0; margin: 14px 16px; padding: 12px; border: 1px solid var(--line); border-radius: 10px; }
.model-settings legend { color: var(--muted); font-size: 12px; padding: 0 6px; }
-.model-settings label { display: grid; gap: 6px; font-size: 11px; min-width: 0; }
+.model-settings label { display: grid; gap: 6px; font-size: var(--font-small); min-width: 0; }
.model-settings select { max-width: 100%; border: 1px solid var(--line); border-radius: 7px;
background: var(--surface-1); color: var(--text); padding: 8px; font: inherit; }
.model-settings button { background: var(--surface-3); border: 1px solid var(--line);
- border-radius: 7px; padding: 8px; font-size: 11px; cursor: pointer; }
+ border-radius: 7px; padding: 8px; font-size: var(--font-small); cursor: pointer; }
.model-settings button:disabled { opacity: .45; cursor: not-allowed; }
-.model-settings small { flex-basis: 100%; color: var(--muted); font-size: 10px; }
+.model-settings small { flex-basis: 100%; color: var(--muted); font-size: var(--font-small); }
.model-settings [role="alert"] { color: var(--red); font-size: 12px; }
.app-shell {
@@ -94,7 +96,7 @@ button { color: inherit; }
.brand strong,
.brand span { display: block; }
.brand strong { letter-spacing: .12em; font-size: 13px; }
-.brand span { margin-top: 3px; color: var(--muted); font-size: 10px; }
+.brand span { margin-top: 3px; color: var(--muted); font-size: var(--font-small); }
.nav-section { margin-bottom: 24px; }
.thread-section { flex: 1; }
@@ -102,7 +104,7 @@ button { color: inherit; }
.eyebrow {
margin: 0 0 9px;
color: #7569c5;
- font-size: 10px;
+ font-size: var(--font-small);
font-weight: 800;
letter-spacing: .15em;
}
@@ -132,8 +134,8 @@ button { color: inherit; }
.project-button strong,
.thread-button strong { font-size: 12px; line-height: 1.35; }
.project-button small,
-.thread-button small { margin-top: 4px; color: var(--muted); font-size: 10px; line-height: 1.35; }
-.thread-button > span { color: var(--accent-bright); font-family: inherit; font-size: 10px; }
+.thread-button small { margin-top: 4px; color: var(--muted); font-size: var(--font-small); line-height: 1.35; }
+.thread-button > span { color: var(--accent-bright); font-family: inherit; font-size: var(--font-small); }
.project-dot { width: 7px; height: 7px; margin-top: 4px; border-radius: 50%; background: var(--accent); box-shadow: 0 0 12px #8c7bff88; }
.boundary-note {
@@ -143,7 +145,7 @@ button { color: inherit; }
background: #10131a;
}
.boundary-note strong,
-.boundary-note span { display: block; font-size: 10px; }
+.boundary-note span { display: block; font-size: var(--font-small); }
.boundary-note span { margin-top: 4px; color: var(--muted); }
.new-project-button,
.fixture-link {
@@ -154,7 +156,7 @@ button { color: inherit; }
color: #c8c2f8;
background: #151322;
cursor: pointer;
- font-size: 10px;
+ font-size: var(--font-small);
text-align: left;
}
.new-project-button { margin-bottom: 18px; }
@@ -178,8 +180,8 @@ button { color: inherit; }
}
.topbar div:first-child { display: flex; gap: 12px; align-items: center; }
.topbar strong { font-size: 12px; }
-.breadcrumb { color: var(--muted); font-size: 11px; }
-.topbar-status { display: flex; align-items: center; gap: 7px; color: var(--muted); font-size: 10px; }
+.breadcrumb { color: var(--muted); font-size: var(--font-small); }
+.topbar-status { display: flex; align-items: center; gap: 7px; color: var(--muted); font-size: var(--font-small); }
.live-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--green); box-shadow: 0 0 9px #54d2a099; }
.prompt-composer {
@@ -199,7 +201,7 @@ button { color: inherit; }
background: linear-gradient(180deg, #151923, #10131a);
}
.onboarding-card h1 { max-width: 650px; margin: 0 0 28px; font-size: 32px; line-height: 1.2; letter-spacing: -.035em; }
-.onboarding-card label { display: grid; gap: 7px; color: var(--muted); font-size: 10px; }
+.onboarding-card label { display: grid; gap: 7px; color: var(--muted); font-size: var(--font-small); }
.onboarding-card input,
.source-controls select {
min-width: 0;
@@ -227,15 +229,15 @@ button { color: inherit; }
.source-connect-panel { margin: 22px 28px 0; border: 1px solid var(--line-soft); border-radius: 11px; padding: 16px; background: var(--surface-1); }
.source-connect-panel h2 { margin: 0; font-size: 16px; }
.source-controls { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 8px; align-items: stretch; }
-.file-picker { display: grid; place-items: center; border: 1px dashed #4b5366; border-radius: 8px; padding: 9px 12px; color: #b8c0ce; cursor: pointer; font-size: 10px; }
+.file-picker { display: grid; place-items: center; border: 1px dashed #4b5366; border-radius: 8px; padding: 9px 12px; color: #b8c0ce; cursor: pointer; font-size: var(--font-small); }
.file-picker:hover { border-color: var(--accent); }
.file-picker input { position: absolute; width: 1px; height: 1px; opacity: 0; }
-.source-controls button { border: 0; border-radius: 8px; padding: 9px 12px; color: white; background: #5f52be; cursor: pointer; font-size: 10px; font-weight: 700; }
+.source-controls button { border: 0; border-radius: 8px; padding: 9px 12px; color: white; background: #5f52be; cursor: pointer; font-size: var(--font-small); font-weight: 700; }
.source-controls button:disabled { opacity: .4; cursor: not-allowed; }
-.progress-banner { display: flex; align-items: center; gap: 9px; margin: 12px 28px 0; border: 1px solid #3e3768; border-radius: 8px; padding: 10px 12px; color: #c7bfff; background: #171426; font-size: 10px; }
+.progress-banner { display: flex; align-items: center; gap: 9px; margin: 12px 28px 0; border: 1px solid #3e3768; border-radius: 8px; padding: 10px 12px; color: #c7bfff; background: #171426; font-size: var(--font-small); }
.progress-spinner { width: 11px; height: 11px; border: 2px solid #554b8f; border-top-color: #b6aaff; border-radius: 50%; animation: spin .8s linear infinite; }
.progress-banner > span:nth-child(2) { flex: 1; }
-.progress-banner button { border: 1px solid #655029; border-radius: 7px; padding: 6px 9px; color: #edc77f; background: #251e12; cursor: pointer; font-size: 9px; }
+.progress-banner button { border: 1px solid #655029; border-radius: 7px; padding: 6px 9px; color: #edc77f; background: #251e12; cursor: pointer; font-size: var(--font-small); }
@keyframes spin { to { transform: rotate(360deg); } }
.welcome-state.compact { padding-top: 8vh; }
.welcome-state.compact h1 { font-size: clamp(28px, 3vw, 46px); }
@@ -244,7 +246,7 @@ button { color: inherit; }
.prompt-label-row { padding: 14px 16px 0; }
.prompt-label-row label { font-size: 12px; font-weight: 700; }
.prompt-label-row span,
-.composer-footer span { color: var(--muted); font-size: 10px; }
+.composer-footer span { color: var(--muted); font-size: var(--font-small); }
.prompt-composer textarea {
width: 100%;
resize: vertical;
@@ -263,7 +265,7 @@ button { color: inherit; }
color: white;
background: #6f5fdc;
cursor: pointer;
- font-size: 11px;
+ font-size: var(--font-small);
font-weight: 700;
}
.composer-footer button:hover { background: #8170ef; }
@@ -276,8 +278,8 @@ button { color: inherit; }
.flow-preview div { min-height: 88px; padding: 14px 10px; border-right: 1px solid var(--line-soft); }
.flow-preview span,
.flow-preview strong { display: block; }
-.flow-preview span { color: var(--faint); font-family: var(--code-font); font-variant-ligatures: none; font-size: 10px; }
-.flow-preview strong { margin-top: 22px; font-size: 10px; letter-spacing: .08em; }
+.flow-preview span { color: var(--faint); font-family: var(--code-font); font-variant-ligatures: none; font-size: var(--font-small); }
+.flow-preview strong { margin-top: 22px; font-size: var(--font-small); letter-spacing: .08em; }
.analysis-workspace { padding: 24px 28px 80px; }
.object-header { display: flex; justify-content: space-between; gap: 24px; padding: 24px 0 30px; }
@@ -304,7 +306,7 @@ button { color: inherit; }
color: var(--muted);
background: transparent;
cursor: pointer;
- font-size: 10px;
+ font-size: var(--font-small);
}
.workspace-tabs button:hover { color: var(--text); background: #161a23; }
.workspace-tabs button.active { color: var(--text); border-color: #3b345f; background: #1b1729; }
@@ -312,61 +314,61 @@ button { color: inherit; }
.section-title-row h2,
.receipt-card h2 { margin: 0; font-size: 17px; }
.section-title-row > span,
-.section-title-row code { color: var(--muted); font-size: 10px; }
+.section-title-row code { color: var(--muted); font-size: var(--font-small); }
.dimension-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 9px; }
.dimension-card,
.analysis-card { border: 1px solid var(--line-soft); border-radius: 10px; background: var(--surface-1); }
.dimension-card { min-height: 128px; padding: 13px; }
-.dimension-card > span:first-child { display: block; margin-bottom: 12px; color: var(--muted); font-size: 10px; }
-.dimension-card p { margin: 14px 0 0; color: #b4bbc7; font-size: 11px; line-height: 1.5; }
+.dimension-card > span:first-child { display: block; margin-bottom: 12px; color: var(--muted); font-size: var(--font-small); }
+.dimension-card p { margin: 14px 0 0; color: #b4bbc7; font-size: var(--font-small); line-height: 1.5; }
.card-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 11px; }
.analysis-card { padding: 16px; }
.analysis-card.frontier { border-color: #4b4278; box-shadow: inset 0 0 0 1px #241f3b; }
.analysis-card h3 { margin: 13px 0 10px; font-size: 14px; line-height: 1.45; }
-.analysis-card p { font-size: 11px; line-height: 1.55; }
+.analysis-card p { font-size: var(--font-small); line-height: 1.55; }
.analysis-card dl { margin: 16px 0 0; }
-.analysis-card dt { margin-top: 10px; color: var(--faint); font-size: 9px; font-weight: 800; letter-spacing: .08em; text-transform: uppercase; }
-.analysis-card dd { margin: 3px 0 0; color: #b8bfca; font-size: 10px; line-height: 1.55; }
+.analysis-card dt { margin-top: 10px; color: var(--faint); font-size: var(--font-small); font-weight: 800; letter-spacing: .08em; text-transform: uppercase; }
+.analysis-card dd { margin: 3px 0 0; color: #b8bfca; font-size: var(--font-small); line-height: 1.55; }
.card-kicker,
.badge-row { display: flex; gap: 5px; flex-wrap: wrap; align-items: center; }
-.card-kicker code { margin-left: auto; color: var(--faint); font-size: 9px; }
-.frontier-label { color: var(--accent-bright); font-size: 9px; font-weight: 700; }
+.card-kicker code { margin-left: auto; color: var(--faint); font-size: var(--font-small); }
+.frontier-label { color: var(--accent-bright); font-size: var(--font-small); font-weight: 700; }
.muted { color: var(--muted) !important; }
.warning-copy { color: var(--amber); }
-.protected-callout { margin-top: 14px; border-left: 2px solid var(--amber); padding: 9px 10px; color: #d8c49d; background: #211b13; font-size: 10px; line-height: 1.5; }
+.protected-callout { margin-top: 14px; border-left: 2px solid var(--amber); padding: 9px 10px; color: #d8c49d; background: #211b13; font-size: var(--font-small); line-height: 1.5; }
.receipt-card { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }
-.receipt-card code { display: block; margin-top: 10px; color: var(--muted); font-size: 9px; overflow-wrap: anywhere; }
+.receipt-card code { display: block; margin-top: 10px; color: var(--muted); font-size: var(--font-small); overflow-wrap: anywhere; }
.change-feed { display: grid; }
.change-entry { display: grid; grid-template-columns: 18px 1fr; gap: 10px; min-height: 130px; }
.change-entry > div:last-child { border-left: 1px solid var(--line); padding: 0 0 26px 18px; }
.change-marker { width: 9px; height: 9px; margin: 5px 0 0 14px; border: 2px solid var(--accent); border-radius: 50%; background: var(--surface-0); box-shadow: 0 0 10px #8c7bff77; }
.change-entry h3 { margin: 12px 0 7px; font-size: 13px; }
-.change-entry p { margin: 0 0 8px; color: var(--muted); font-size: 10px; }
-.change-entry code { display: block; color: var(--faint); font-size: 9px; overflow-wrap: anywhere; }
-.change-entry time { margin-left: auto; color: var(--faint); font-size: 9px; }
-.change-entry button { margin-top: 11px; border: 1px solid var(--line); border-radius: 6px; padding: 6px 8px; color: var(--muted); background: var(--surface-1); font-size: 9px; }
+.change-entry p { margin: 0 0 8px; color: var(--muted); font-size: var(--font-small); }
+.change-entry code { display: block; color: var(--faint); font-size: var(--font-small); overflow-wrap: anywhere; }
+.change-entry time { margin-left: auto; color: var(--faint); font-size: var(--font-small); }
+.change-entry button { margin-top: 11px; border: 1px solid var(--line); border-radius: 6px; padding: 6px 8px; color: var(--muted); background: var(--surface-1); font-size: var(--font-small); }
.change-entry button:disabled { opacity: .45; }
.revision-actions { display: flex; gap: 7px; flex-wrap: wrap; }
.diff-panel { margin-top: 18px; border: 1px solid var(--line); border-radius: 10px; padding: 14px; background: #0d1016; }
.diff-panel h3 { margin: 0; font-size: 13px; }
.diff-panel article { display: grid; grid-template-columns: minmax(120px, .7fr) 1fr auto 1fr; gap: 8px; align-items: start; border-top: 1px solid var(--line-soft); padding: 10px 0; }
-.diff-panel article > code { color: var(--accent-bright); font-size: 9px; overflow-wrap: anywhere; }
-.diff-panel pre { max-height: 180px; margin: 0; overflow: auto; white-space: pre-wrap; color: #b9c0cc; font-size: 9px; }
+.diff-panel article > code { color: var(--accent-bright); font-size: var(--font-small); overflow-wrap: anywhere; }
+.diff-panel pre { max-height: 180px; margin: 0; overflow: auto; white-space: pre-wrap; color: #b9c0cc; font-size: var(--font-small); }
.diff-panel article > span { color: var(--faint); }
.analysis-card.protected { border-color: #655029; background: #1c1812; }
-.analysis-card > code { display: block; color: var(--faint); font-size: 9px; overflow-wrap: anywhere; }
+.analysis-card > code { display: block; color: var(--faint); font-size: var(--font-small); overflow-wrap: anywhere; }
.panel-loading { padding: 34px 0; }
-.lifecycle-field { display: grid; gap: 7px; margin-bottom: 12px; color: var(--muted); font-size: 10px; }
+.lifecycle-field { display: grid; gap: 7px; margin-bottom: 12px; color: var(--muted); font-size: var(--font-small); }
.lifecycle-field textarea { width: 100%; resize: vertical; border: 1px solid var(--line); border-radius: 8px; padding: 11px; color: var(--text); background: #0d1016; outline: 0; line-height: 1.5; }
.lifecycle-field textarea:focus { border-color: var(--accent); }
.lifecycle-actions { display: flex; gap: 8px; flex-wrap: wrap; }
.lifecycle-actions button,
-.primary-action { border: 1px solid #49416f; border-radius: 8px; padding: 9px 12px; color: #ded9ff; background: #211c35; cursor: pointer; font-size: 10px; font-weight: 700; }
+.primary-action { border: 1px solid #49416f; border-radius: 8px; padding: 9px 12px; color: #ded9ff; background: #211c35; cursor: pointer; font-size: var(--font-small); font-weight: 700; }
.lifecycle-actions button:disabled,
.primary-action:disabled { opacity: .4; cursor: not-allowed; }
.lifecycle-result { margin-top: 14px; }
-.badge { display: inline-flex; align-items: center; min-height: 20px; border: 1px solid #343b4b; border-radius: 999px; padding: 2px 7px; color: #b8c0ce; background: #181d27; font-size: 8px; font-weight: 800; letter-spacing: .045em; }
+.badge { display: inline-flex; align-items: center; min-height: 20px; border: 1px solid #343b4b; border-radius: 999px; padding: 2px 7px; color: #b8c0ce; background: #181d27; font-size: var(--font-small); font-weight: 800; letter-spacing: .045em; }
.badge-pass,
.badge-valid,
.badge-complete,
@@ -385,19 +387,19 @@ button { color: inherit; }
.evidence-rail { border-left: 1px solid var(--line-soft); padding: 18px 14px; }
.panel-heading { padding: 4px 3px 14px; }
.panel-heading h2 { margin: 0; font-size: 15px; }
-.panel-heading span { display: block; margin-top: 5px; color: var(--faint); font-size: 9px; }
+.panel-heading span { display: block; margin-top: 5px; color: var(--faint); font-size: var(--font-small); }
.evidence-filters { display: grid; grid-template-columns: 1fr 96px; gap: 6px; margin-bottom: 10px; }
.evidence-filters input,
-.evidence-filters select { min-width: 0; border: 1px solid var(--line); border-radius: 7px; padding: 8px; color: var(--text); background: #0d1016; font-size: 9px; outline: 0; }
+.evidence-filters select { min-width: 0; border: 1px solid var(--line); border-radius: 7px; padding: 8px; color: var(--text); background: #0d1016; font-size: var(--font-small); outline: 0; }
.evidence-list { display: grid; gap: 8px; }
.evidence-item { border: 1px solid var(--line-soft); border-radius: 9px; padding: 12px; background: #11151c; }
-.evidence-item p { margin: 0 0 10px; color: #c7ccd5; font-size: 10px; line-height: 1.55; }
-.evidence-item code { display: block; margin-bottom: 9px; color: var(--accent-bright); font-size: 8px; overflow-wrap: anywhere; }
-.evidence-item small { display: block; margin: -3px 0 9px; color: var(--faint); font-size: 7px; overflow-wrap: anywhere; }
-.empty-copy { color: var(--faint); font-size: 10px; line-height: 1.5; }
+.evidence-item p { margin: 0 0 10px; color: #c7ccd5; font-size: var(--font-small); line-height: 1.55; }
+.evidence-item code { display: block; margin-bottom: 9px; color: var(--accent-bright); font-size: var(--font-small); overflow-wrap: anywhere; }
+.evidence-item small { display: block; margin: -3px 0 9px; color: var(--faint); font-size: var(--font-small); overflow-wrap: anywhere; }
+.empty-copy { color: var(--faint); font-size: var(--font-small); line-height: 1.5; }
.error-copy,
.error-banner { color: #ff9b9b; }
-.error-banner { margin: 14px 28px; border: 1px solid #663434; border-radius: 8px; padding: 11px; background: #241313; font-size: 11px; }
+.error-banner { margin: 14px 28px; border: 1px solid #663434; border-radius: 8px; padding: 11px; background: #241313; font-size: var(--font-small); }
@media (max-width: 1180px) {
.app-shell { grid-template-columns: 230px minmax(0, 1fr); }
@@ -446,12 +448,12 @@ button { color: inherit; }
.research-progress-log li.research-progress-current { border-left-color: var(--accent-bright); }
.research-progress-log strong, .research-progress-log span { display: block; }
.research-progress-log strong { color: var(--text); font-size: 12px; }
-.research-progress-log span { margin-top: 2px; color: var(--muted); font-size: 11px; }
-.research-progress-model { margin: 8px 0 0; color: var(--faint); font-size: 11px; }
+.research-progress-log span { margin-top: 2px; color: var(--muted); font-size: var(--font-small); }
+.research-progress-model { margin: 8px 0 0; color: var(--faint); font-size: var(--font-small); }
.research-progress-timeline { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }
.research-progress-note { margin: 4px 0 0; color: var(--text); font-size: 13px; line-height: 1.55; }
.research-progress-note.live { color: var(--accent-bright); }
.research-progress-action { display: flex; align-items: center; gap: 8px; width: fit-content; max-width: 100%; padding: 6px 10px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface-2); color: var(--muted); font-size: 12px; }
.research-progress-action.live { border-color: var(--accent); }
.research-progress-action-label { color: var(--text); font-weight: 600; flex-shrink: 0; }
-.research-progress-action code { min-width: 0; font-size: 11px; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
+.research-progress-action code { min-width: 0; font-size: var(--font-small); color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
diff --git a/apps/web/src/typeScaleRules.test.ts b/apps/web/src/typeScaleRules.test.ts
new file mode 100644
index 00000000..13383d97
--- /dev/null
+++ b/apps/web/src/typeScaleRules.test.ts
@@ -0,0 +1,37 @@
+import { readdirSync, readFileSync } from "node:fs";
+import { join, resolve } from "node:path";
+import { expect, it } from "vitest";
+
+// No text is drawn under 12px (04-ideal I-23). The smallest size is one variable; a stylesheet rule
+// that names a smaller size, or a size relative to its parent with no floor, would bring 8 to 11px back.
+
+const SOURCE = resolve(import.meta.dirname);
+function files(folder: string, extension: string): string[] {
+ return readdirSync(folder, { withFileTypes: true }).flatMap(entry => {
+ const path = join(folder, entry.name);
+ if (entry.isDirectory()) return files(path, extension);
+ return entry.name.endsWith(extension) && !entry.name.includes(".test.") ? [path] : [];
+ });
+}
+const sheets = files(SOURCE, ".css").map(path => ({ path, text: readFileSync(path, "utf8").replace(/\/\*[\s\S]*?\*\//g, "") }));
+const declared = sheets.flatMap(sheet => [...sheet.text.matchAll(/font-size:\s*([^;}]+)/g)].map(found => found[1].trim()));
+
+it("declares no font size under 12px", () => {
+ expect(declared.length).toBeGreaterThan(300);
+ const pixels = declared.filter(value => /^[\d.]+px$/.test(value)).map(value => parseFloat(value));
+ expect(pixels.filter(size => size < 12)).toEqual([]);
+ const smallest = sheets.map(sheet => /--font-small:\s*([\d.]+)px/.exec(sheet.text)?.[1]).filter(Boolean);
+ expect(smallest).toEqual(["12"]);
+});
+
+it("gives every size that depends on its parent a floor", () => {
+ const relative = declared.filter(value => /(em|rem|%)\b/.test(value) || /^(smaller|small|x-small|xx-small)$/.test(value));
+ expect(relative.length).toBeGreaterThan(0);
+ for (const value of relative) expect(value, value).toMatch(/^max\([\d.]+em, var\(--font-small\)\)$/);
+});
+
+it("sets no font size in a component's own style", () => {
+ const found = files(SOURCE, ".tsx").filter(path => /fontSize\s*:/.test(readFileSync(path, "utf8")));
+ expect(found).toEqual([]);
+});
+
diff --git a/apps/web/src/workstation.css b/apps/web/src/workstation.css
index 2793443e..7f261792 100644
--- a/apps/web/src/workstation.css
+++ b/apps/web/src/workstation.css
@@ -13,17 +13,17 @@
.history-layout { display: grid; grid-template-columns: minmax(260px, 340px) minmax(0, 1fr); height: clamp(400px, calc(100dvh - 330px), 720px); border: 1px solid var(--line); border-radius: var(--radius); background: var(--surface-1); overflow: hidden; }
.history-timeline { min-width: 0; min-height: 0; overflow: auto; scrollbar-gutter: stable; padding: 20px 14px; border-right: 1px solid var(--line); background: var(--surface-0); }
.history-list-heading { display: flex; align-items: baseline; justify-content: space-between; padding: 0 8px 14px; gap: 12px; }
-.history-list-heading h2 { margin: 0; font-size: 16px; }.history-list-heading>span { font-size: 11px; color: var(--muted); }
+.history-list-heading h2 { margin: 0; font-size: 16px; }.history-list-heading>span { font-size: var(--font-small); color: var(--muted); }
.history-events { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; }
-.history-compare-choices { display:flex; flex-wrap:wrap; gap:6px; padding:0 12px 10px; }.history-compare-choices .bp6-button[aria-pressed="true"] { background:var(--accent); color:#fff; }.history-compare-unavailable { color:var(--muted); font-size:11px; }
+.history-compare-choices { display:flex; flex-wrap:wrap; gap:6px; padding:0 12px 10px; }.history-compare-choices .bp6-button[aria-pressed="true"] { background:var(--accent); color:#fff; }.history-compare-unavailable { color:var(--muted); font-size:var(--font-small); }
.history-decision-comparison { min-width:0; margin:0 0 16px; padding:16px; border:1px solid var(--line); border-radius:var(--radius); background:var(--surface-1); overflow-wrap:anywhere; }.history-decision-comparison h2 { margin:0 0 4px; font-size:16px; }.history-decision-comparison .section-title-row p { margin:0; color:var(--muted); font-size:12px; }.history-decision-comparison .section-title-row .bp6-button { flex-shrink:0; white-space:nowrap; }.history-compare-selected { display:flex; flex-wrap:wrap; gap:8px; margin:12px 0 0; }.history-compare-selected span { min-width:0; padding:6px 9px; border:1px solid var(--line-soft); border-radius:var(--radius); font-size:12px; overflow-wrap:anywhere; }
-.decision-delta-view { min-width:0; margin-top:16px; padding-top:16px; border-top:1px solid var(--line-soft); }.decision-delta-view h3,.decision-delta-view h4,.decision-delta-view h5 { margin:0; }.decision-delta-view h3 { font-size:15px; }.decision-delta-view h4 { font-size:13px; margin:12px 0 8px; }.decision-delta-view h5 { font-size:12px; margin-bottom:8px; }.decision-delta-group { margin:16px 0; }.decision-delta-change { margin:10px 0; padding:12px; border:1px solid var(--line-soft); border-radius:var(--radius); }.decision-delta-values { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:12px; }.decision-delta-values>div { min-width:0; overflow-wrap:anywhere; }.decision-delta-values strong { display:block; margin-bottom:6px; color:var(--muted); font-size:11px; }.decision-delta-values ul { margin:4px 0; padding-left:18px; }.decision-delta-values dl { margin:4px 0; }.decision-delta-values dt { color:var(--muted); font-size:11px; }.decision-delta-values dd { margin:0 0 6px 8px; }.decision-delta-reasons { padding-top:10px; border-top:1px solid var(--line-soft); }.decision-delta-reasons ul { margin:4px 0; padding-left:18px; }
-.decision-delta-count{font-size:12px;color:var(--muted);margin:10px 0}.decision-delta-group .section-title-row{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px}.decision-delta-group .section-title-row .bp6-button{flex-shrink:0;white-space:nowrap}.decision-delta-group .muted{font-size:11px}.decision-value{min-width:0;overflow-wrap:anywhere}.decision-value>.bp6-button{display:block;margin-top:4px}.decision-value-full{max-height:320px;overflow:auto;white-space:pre-wrap;overflow-wrap:anywhere;background:var(--surface-0);border:1px solid var(--line-soft);border-radius:var(--radius);padding:10px;font-size:11px}
+.decision-delta-view { min-width:0; margin-top:16px; padding-top:16px; border-top:1px solid var(--line-soft); }.decision-delta-view h3,.decision-delta-view h4,.decision-delta-view h5 { margin:0; }.decision-delta-view h3 { font-size:15px; }.decision-delta-view h4 { font-size:13px; margin:12px 0 8px; }.decision-delta-view h5 { font-size:12px; margin-bottom:8px; }.decision-delta-group { margin:16px 0; }.decision-delta-change { margin:10px 0; padding:12px; border:1px solid var(--line-soft); border-radius:var(--radius); }.decision-delta-values { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:12px; }.decision-delta-values>div { min-width:0; overflow-wrap:anywhere; }.decision-delta-values strong { display:block; margin-bottom:6px; color:var(--muted); font-size:var(--font-small); }.decision-delta-values ul { margin:4px 0; padding-left:18px; }.decision-delta-values dl { margin:4px 0; }.decision-delta-values dt { color:var(--muted); font-size:var(--font-small); }.decision-delta-values dd { margin:0 0 6px 8px; }.decision-delta-reasons { padding-top:10px; border-top:1px solid var(--line-soft); }.decision-delta-reasons ul { margin:4px 0; padding-left:18px; }
+.decision-delta-count{font-size:12px;color:var(--muted);margin:10px 0}.decision-delta-group .section-title-row{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px}.decision-delta-group .section-title-row .bp6-button{flex-shrink:0;white-space:nowrap}.decision-delta-group .muted{font-size:var(--font-small)}.decision-value{min-width:0;overflow-wrap:anywhere}.decision-value>.bp6-button{display:block;margin-top:4px}.decision-value-full{max-height:320px;overflow:auto;white-space:pre-wrap;overflow-wrap:anywhere;background:var(--surface-0);border:1px solid var(--line-soft);border-radius:var(--radius);padding:10px;font-size:var(--font-small)}
.history-event { display: block; text-align: left; width: 100%; border: 1px solid transparent; border-left: 3px solid var(--line); background: transparent; padding: 16px; border-radius: var(--radius); cursor: pointer; }.history-event .bp6-button-text { display:block; width:100%; }
.history-event:hover { background: var(--surface-2); }.history-event.is-selected { border-color: var(--accent); background: var(--surface-2); }
-.history-event-meta { display: flex; justify-content: space-between; gap: 10px; color: var(--muted); font-size: 11px; }
+.history-event-meta { display: flex; justify-content: space-between; gap: 10px; color: var(--muted); font-size: var(--font-small); }
.history-event strong { display: block; margin: 10px 0 12px; font-weight: 500; font-size: 14px; line-height: 1.6; overflow-wrap: anywhere; word-break: keep-all; }
-.history-event-status { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; color: var(--muted); font-size: 11px; }
+.history-event-status { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; color: var(--muted); font-size: var(--font-small); }
.history-timeline>.bp6-button { margin-top: 18px; min-height: 36px; }
.history-detail { min-width: 0; padding: 28px; min-height: 0; overflow: auto; overflow-wrap: anywhere; scrollbar-gutter: stable; }
.history-detail-heading { border-bottom: 1px solid var(--line-soft); padding-bottom: 20px; margin-bottom: 22px; }
@@ -47,21 +47,21 @@
.history-empty { padding: 45px 12px; color: var(--muted); text-align: center; }.history-empty h3 { color: var(--text); margin-top: 16px; }.history-empty p { font-size: 12px; }
.history-technical { margin-top: 28px; padding-top: 16px; border-top: 1px solid var(--line-soft); color: var(--muted); font-size: 12px; }
.history-technical summary,.history-change summary,.restore-impact summary { cursor: pointer; padding: 6px 0; }
-.history-technical pre { max-height: 350px; overflow: auto; white-space: pre-wrap; overflow-wrap: anywhere; font-size: 11px; }
+.history-technical pre { max-height: 350px; overflow: auto; white-space: pre-wrap; overflow-wrap: anywhere; font-size: var(--font-small); }
.toolkit-disclosure { margin-top: 8px; }.toolkit-disclosure>.bp6-button { color: var(--muted); padding-left: 0; }.toolkit-disclosure-body { padding: 6px 10px 10px; border-left: 2px solid var(--line); overflow-wrap: anywhere; }
.history-comparison { margin-top: 20px; }.history-change-group { margin: 24px 0; }.history-change-group h4 { color: var(--accent-bright); font-size: 13px; }
.history-change { margin: 14px 0; }.history-change h5 { font-weight: 500; font-size: 13px; margin: 0 0 10px; }
.history-diff-values { display: grid; grid-template-columns: 1fr 1fr; border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden; }
.history-diff-values>div { min-width: 0; padding: 14px; background: var(--surface-0); }.history-diff-values>div+div { border-left: 1px solid var(--line); background: var(--surface-2); }
-.history-diff-values span { color: var(--muted); font-size: 11px; }.history-diff-values pre { white-space: pre-wrap; overflow-wrap: anywhere; font-family: inherit; font-size: 13px; line-height: 1.7; margin-bottom: 0; }
-.history-change details { color: var(--muted); font-size: 11px; margin-top: 6px; }
+.history-diff-values span { color: var(--muted); font-size: var(--font-small); }.history-diff-values pre { white-space: pre-wrap; overflow-wrap: anywhere; font-family: inherit; font-size: 13px; line-height: 1.7; margin-bottom: 0; }
+.history-change details { color: var(--muted); font-size: var(--font-small); margin-top: 6px; }
.history-restore-dialog { width: min(780px, calc(100vw - 32px)); max-height: calc(100dvh - 40px); margin: 20px 0; }
.history-restore-dialog .bp6-dialog-body { overflow: auto; min-height: 0; }.history-restore-dialog .bp6-dialog-footer-actions { flex-wrap: wrap; }
.history-restore-dialog p { line-height: 1.7; }.history-restore-dialog .bp6-callout { margin: 16px 0; }.history-restore-dialog code { overflow-wrap: anywhere; }
.history-compact .history-detail { padding: 18px; min-height: 260px; }.history-compact .history-diff-values { grid-template-columns: 1fr; }
@media(max-width:1100px) { .history-layout { grid-template-columns: 1fr; height: auto; }.history-timeline { max-height: 340px; overflow: auto; border-right: 0; border-bottom: 1px solid var(--line); }.history-detail { min-height: 300px; }.history-heading { flex-wrap: wrap; } }
@media(max-width:600px) { .history-detail { padding: 18px; }.history-toolbar { align-items: flex-start; flex-wrap: wrap; }.history-diff-values,.decision-delta-values { grid-template-columns: 1fr; }.history-diff-values>div+div { border-left: 0; border-top: 1px solid var(--line); }.history-event-meta { flex-wrap: wrap; }.history-detail-actions>.bp6-button { flex-grow: 1; }.history-decision-comparison { padding:12px; }.history-compare-selected { flex-direction:column; } }
-.domain-grid {display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:8px;margin-bottom:24px}.domain-card.bp6-button{background:#222d39;border:1px solid #3c4755;padding:12px;border-radius:4px}.domain-card .bp6-button-text{display:flex;align-items:center;gap:10px}.domain-card strong{display:block;font-size:12px}.domain-card small{display:block;font-size:10px;color:#a6b4c4;margin-top:4px}.domain-card.bp6-active{border-color:#589add;background:#294767}.domain-detail{padding:22px;background:#22272f;border:1px solid #3c4755;border-radius:4px}.domain-detail>.bp6-callout{margin:12px 0}.domain-detail>.bp6-input-group{margin-bottom:12px}
+.domain-grid {display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:8px;margin-bottom:24px}.domain-card.bp6-button{background:#222d39;border:1px solid #3c4755;padding:12px;border-radius:4px}.domain-card .bp6-button-text{display:flex;align-items:center;gap:10px}.domain-card strong{display:block;font-size:12px}.domain-card small{display:block;font-size:var(--font-small);color:#a6b4c4;margin-top:4px}.domain-card.bp6-active{border-color:#589add;background:#294767}.domain-detail{padding:22px;background:#22272f;border:1px solid #3c4755;border-radius:4px}.domain-detail>.bp6-callout{margin:12px 0}.domain-detail>.bp6-input-group{margin-bottom:12px}
:root {
color-scheme: dark;
--surface-0: #1c2127; --surface-1: #22272f; --surface-2: #252d37; --surface-3: #2f3b49;
@@ -79,42 +79,42 @@ button:focus-visible, summary:focus-visible, a:focus-visible { outline: 2px soli
.workstation .brand { padding: 0 0 15px; gap: 9px; }
.workstation .brand-mark { width: 34px; height: 34px; background: #294568; color: #9cc8ff; border: 1px solid #3d638b; border-radius: var(--radius); }
.workstation .brand strong { font-size: 15px; letter-spacing: .18em; }
-.workstation .brand span { font-size: 8px; letter-spacing: .09em; }
-.workstation .brand .bp6-tag { margin-left: auto; font-size: 9px; }
+.workstation .brand span { font-size: var(--font-small); letter-spacing: .09em; }
+.workstation .brand .bp6-tag { margin-left: auto; font-size: var(--font-small); }
.workstation .nav-section { margin: 5px 0 0; }
.workstation .nav-section-heading { display: flex; justify-content: space-between; align-items: center; margin-bottom: 6px; }
-.workstation .nav-label { color: var(--faint); margin: 0 0 0 8px; font-size: 10px; letter-spacing: .13em; }
+.workstation .nav-label { color: var(--faint); margin: 0 0 0 8px; font-size: var(--font-small); letter-spacing: .13em; }
.workstation .new-project-button { margin: 0; background: #24548a; border: 1px solid #3972aa; border-radius: 4px; padding: 9px; font-size: 12px; }
.workstation .project-button,.workstation .thread-button { width: 100%; min-height: 48px; padding: 9px; border-radius: 4px; margin-bottom: 4px; border: 1px solid transparent; background: transparent; gap: 9px; }
.project-nav-row {display:flex;align-items:center;gap:2px;min-width:0;position:relative}.project-nav-row>.project-button{flex:1;min-width:0}.project-nav-row>.bp6-button,.project-nav-row .bp6-popover-target>.bp6-button{color:var(--muted)}.project-inline-menu{min-width:180px;padding:4px}
.workstation .project-button>.bp6-button-text,.workstation .thread-button>.bp6-button-text { display: flex; align-items: center; gap: 9px; overflow: hidden; }
.workstation .project-button.active,.workstation .thread-button.active { background: #253951; border-color: #3a5573; }
.workstation .project-button strong,.workstation .thread-button strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 178px; color: var(--text); font-size: 12px; }
-.workstation .project-button small,.workstation .thread-button small { font-size: 10px; font-family: inherit; color: var(--muted); }
+.workstation .project-button small,.workstation .thread-button small { font-size: var(--font-small); font-family: inherit; color: var(--muted); }
.workstation .thread-section { min-height: 60px; flex: 1; }
.workstation .project-sessions {margin:0 0 8px 18px;padding:4px 0 8px 8px;border-left:1px solid var(--line-soft);display:grid;gap:2px}
-.workstation .new-session-button {justify-content:flex-start;color:var(--muted);font-size:11px;min-height:28px}
+.workstation .new-session-button {justify-content:flex-start;color:var(--muted);font-size:var(--font-small);min-height:28px}
.workstation .project-sessions .thread-button {min-height:40px;padding:6px 8px;margin:0}
.workstation .project-sessions .thread-button strong {max-width:150px;font-size:12px}
.workstation .sidebar-bottom { margin-top: auto; display: grid; gap: 3px; }
.workstation .boundary-note { margin-top: 12px; border: 0; border-top: 1px solid var(--line-soft); border-radius: 0; padding: 14px 6px 0; background: transparent; }
-.workstation .boundary-note strong { color: var(--muted); font-size: 11px; }.workstation .boundary-note span { font-size: 10px; line-height: 1.7; }
+.workstation .boundary-note strong { color: var(--muted); font-size: var(--font-small); }.workstation .boundary-note span { font-size: var(--font-small); line-height: 1.7; }
.workstation-topbar { grid-column: 2 / -1; grid-row: 1; display: flex; justify-content: space-between; gap: 20px; align-items: center; padding: 0 24px; background: #202831; border-bottom: 1px solid var(--line-soft); min-width: 0; }
.context-path,.header-status { display: flex; align-items: center; gap: 12px; min-width: 0; font-size: 12px; }.context-path>span {color:var(--muted)}.context-path small {overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:240px;color:var(--muted)}
.workspace-navigation { grid-column: 2 / -1; grid-row: 2; display:flex;align-items:center;justify-content:space-between;gap:20px;padding:0 24px;background:#202831;border-bottom:1px solid var(--line);min-width:0; }
-.workspace-navigation .bp6-tab-list { gap: 26px; }.workspace-navigation .bp6-tab { font-size: 12px;line-height:48px; }.context-policy {display:flex;align-items:center;gap:12px;font-size:11px;color:var(--muted)}.context-policy select {max-width:210px;height:27px;line-height:27px;font-size:11px}
-.workspace-content {grid-column:2;grid-row:3;min-width:0;padding:28px;max-width:100%;}.workspace-content>.bp6-callout {margin:18px 0}.workspace-heading {display:flex;justify-content:space-between;align-items:flex-start;gap:20px;margin-bottom:24px}.workspace-heading h1 {margin:0 0 9px;font-size:27px;letter-spacing:-.04em;font-weight:600;line-height:1.3}.workspace-heading p:not(.eyebrow){margin:0;line-height:1.7;font-size:12px;color:var(--muted);max-width:780px;white-space:pre-line}.eyebrow {color:var(--accent-bright);font-size:10px;letter-spacing:.14em;font-weight:600}
-.workstation h2 {font-size:16px;font-weight:600}.workstation h3 {font-size:13px;font-weight:600}.workstation p {line-height:1.65}.workstation .muted {font-size:11px;line-height:1.65;color:var(--muted)}.workstation code {color:var(--muted);font-size:10px;overflow-wrap:anywhere}.workstation .empty-copy {font-size:11px;line-height:1.65;padding:8px}.workstation .bp6-callout {font-size:12px;border-radius:4px;}.workstation .bp6-callout p:last-child{margin-bottom:0}
+.workspace-navigation .bp6-tab-list { gap: 26px; }.workspace-navigation .bp6-tab { font-size: 12px;line-height:48px; }.context-policy {display:flex;align-items:center;gap:12px;font-size:var(--font-small);color:var(--muted)}.context-policy select {max-width:210px;height:27px;line-height:27px;font-size:var(--font-small)}
+.workspace-content {grid-column:2;grid-row:3;min-width:0;padding:28px;max-width:100%;}.workspace-content>.bp6-callout {margin:18px 0}.workspace-heading {display:flex;justify-content:space-between;align-items:flex-start;gap:20px;margin-bottom:24px}.workspace-heading h1 {margin:0 0 9px;font-size:27px;letter-spacing:-.04em;font-weight:600;line-height:1.3}.workspace-heading p:not(.eyebrow){margin:0;line-height:1.7;font-size:12px;color:var(--muted);max-width:780px;white-space:pre-line}.eyebrow {color:var(--accent-bright);font-size:var(--font-small);letter-spacing:.14em;font-weight:600}
+.workstation h2 {font-size:16px;font-weight:600}.workstation h3 {font-size:13px;font-weight:600}.workstation p {line-height:1.65}.workstation .muted {font-size:var(--font-small);line-height:1.65;color:var(--muted)}.workstation code {color:var(--muted);font-size:var(--font-small);overflow-wrap:anywhere}.workstation .empty-copy {font-size:var(--font-small);line-height:1.65;padding:8px}.workstation .bp6-callout {font-size:12px;border-radius:4px;}.workstation .bp6-callout p:last-child{margin-bottom:0}
.workstation .onboarding-card {margin:0;padding:24px;background:var(--surface-1);border:1px solid var(--line);border-radius:var(--radius);max-width:760px}.workstation .onboarding-card label {font-size:12px;display:grid;gap:8px;color:var(--muted);margin-top:14px}.workstation .onboarding-card input:not(.bp6-input) {padding:8px;border:1px solid var(--line);border-radius:3px;background:#1c252f;color:var(--text)}.workstation .onboarding-card .bp6-button.bp6-intent-primary {background:#2d72d2;color:#fff;border-radius:3px;font-size:12px;padding:8px 12px}
.start-page {max-width:980px;margin:30px auto;}.start-page>.workspace-heading {padding-bottom:28px;border-bottom:1px solid var(--line-soft)}.start-page>.workspace-heading>.bp6-icon {color:#456887;margin:18px 20px}.start-page h1 {font-size:36px;line-height:1.35}.start-principles {display:grid;grid-template-columns:repeat(3,1fr);gap:28px;margin-top:40px}.start-principles>div{border-top:1px solid var(--line);padding-top:20px}.start-principles .bp6-icon {color:var(--accent-bright)}.start-principles p{color:var(--muted);font-size:12px}
.project-home-list{max-width:760px;margin-top:28px}.project-home-list>.section-title-row{margin-bottom:10px}.project-home-item.bp6-button{margin-bottom:8px;padding:14px;background:var(--surface-1);border:1px solid var(--line)}.project-home-item .bp6-button-text{display:flex}.project-home-item strong,.project-home-item small{display:block}.project-home-item small{margin-top:4px;color:var(--muted);font-size:12px}
-.workstation .prompt-composer {margin:24px 0 0;background:#222d3a;border:1px solid #48627e;border-radius:6px;padding:0;overflow:visible}.workstation .prompt-label-row {padding:15px 17px 10px}.workstation .prompt-label-row label {font-size:12px}.workstation .prompt-label-row span {font-size:10px}.workstation .prompt-composer>textarea {margin:0 16px;width:calc(100% - 32px);resize:vertical;min-height:90px;border:0;border-radius:3px;background:#1c2530;font-size:13px;padding:12px;line-height:1.7;color:var(--text);box-shadow:none}.workstation .composer-footer {padding:12px 16px;border-top:1px solid var(--line-soft)}.workstation .composer-footer>span{font-size:10px}.workstation .composer-footer .bp6-button{background:#2d72d2;border-radius:3px;font-size:12px;padding:8px 12px}.workstation .model-settings{margin:14px 16px;padding:10px 0;border:0;border-top:1px solid var(--line-soft);border-radius:0;gap:10px}.workstation .model-settings legend{font-size:10px;padding:0 8px 0 0}.workstation .model-settings select{background:#253240;border:1px solid #425269;border-radius:3px;font-size:11px;padding:6px 28px 6px 6px}.workstation .model-settings button{border-radius:3px;background:#2f3e50;font-size:10px;padding:6px}.workstation .model-settings small {font-size:10px}
-.workstation .research-empty {min-height:230px;padding:25px;margin:10px 0}.research-empty .bp6-heading{font-size:20px}.research-empty .bp6-non-ideal-state-text{max-width:480px;font-size:12px;color:var(--muted)}.research-empty>.bp6-non-ideal-state-visual{color:#7293b8}.research-progress {padding:16px;background:var(--surface-1);border:1px solid var(--line);border-radius:4px;margin-bottom:18px}.research-progress>.bp6-callout{margin:12px 0}.control-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:12px}.control-row>span{flex:1;min-width:180px}.budget-strip{display:grid;grid-template-columns:1fr 1.5fr 1fr;gap:20px;border-top:1px solid var(--line-soft);margin-top:16px;padding-top:14px}.budget-strip>div{display:grid;gap:6px}.budget-strip span{font-size:10px;color:var(--muted)}.budget-strip strong{font-size:11px}.budget-strip .bp6-progress-bar{height:3px}.research-progress details{margin-top:14px}.workstation summary{cursor:pointer;color:var(--muted);font-size:11px;padding:8px 0}.answer-panel{padding:22px;background:#243143;border-left:3px solid var(--accent);border-radius:3px}.answer-text {white-space:pre-wrap;font-size:14px;line-height:1.9}.stale-result{border-left:2px solid var(--amber);padding-left:10px}
-.workstation .evidence-rail {grid-column:3;grid-row:3;height:calc(100vh - 105px);top:105px;padding:21px 17px;background:#202831;border-left:1px solid var(--line);position:sticky;display:block}.workstation .evidence-rail h2{font-size:14px}.workstation .evidence-item{background:var(--surface-1);border:1px solid var(--line-soft);border-radius:4px;padding:12px;margin-bottom:10px}.workstation .evidence-item p{font-size:12px;line-height:1.7}.workstation .evidence-item small{font-size:9px;overflow-wrap:anywhere}.workstation .evidence-item code {font-size:10px;color:var(--accent-bright)}.workstation .evidence-filters {grid-template-columns:1fr;margin:18px 0 12px}.workstation .evidence-filters input {font-size:11px}.workstation .evidence-filters select{font-size:11px;width:100%}
-.workstation .source-connect-panel{margin:0 0 20px;padding:20px;background:var(--surface-1);border:1px solid var(--line);border-radius:4px}.workstation .source-controls{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.workstation .source-controls>*:first-child{grid-column:1/-1}.workstation .source-controls select {width:100%;padding:0 28px 0 10px;font-size:11px;border-radius:3px;background:transparent;border:0}.workstation .source-controls button {background:#2d72d2;border-radius:3px;font-size:12px}.workstation .source-controls .bp6-file-input{text-align:left;font-size:12px}.source-control-label{display:grid;gap:6px;color:var(--muted);font-size:10px}.local-developer-tools{display:grid;gap:6px;margin-top:8px}.source-time-advanced{margin-top:8px}.source-time-advanced-body{padding:4px 10px 10px;border-left:2px solid var(--line)}
-.catalog-toolbar {display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-bottom:18px}.catalog-toolbar .bp6-input-group {flex:1;min-width:220px}.catalog-toolbar .bp6-html-select select{font-size:12px}.catalog-layout {display:grid;grid-template-columns:minmax(260px,340px) minmax(0,1fr);border:1px solid var(--line);border-radius:4px;overflow:hidden;background:var(--surface-1)}.method-list {max-height:calc(100vh - 270px);min-height:450px;overflow:auto;background:#1e2732;border-right:1px solid var(--line);padding:8px}.catalog-count{font-size:10px;color:var(--muted);padding:8px}.method-item.bp6-button {display:flex;width:100%;padding:9px 7px;border-radius:3px;min-height:48px}.method-item .bp6-button-text {display:flex;gap:10px;align-items:flex-start;min-width:0}.method-item strong {display:block;font-family:var(--code-font);font-variant-ligatures:none;font-size:11px;overflow-wrap:anywhere;font-weight:500}.method-item small {display:block;color:var(--muted);font-size:10px;margin-top:4px}.method-kind{display:inline-flex;flex-shrink:0;width:19px;height:19px;align-items:center;justify-content:center;border-radius:3px;font-size:10px;background:#24476b;color:#9cc8ff}.method-kind.command{background:#584321;color:#e8c57c}.method-detail {padding:24px;min-width:0;overflow-wrap:anywhere}.method-detail h2 {font-family:var(--code-font);font-variant-ligatures:none;font-size:19px;margin:16px 0}.method-meta {display:grid;grid-template-columns:1fr 1fr;gap:12px;margin:20px 0}.method-meta>div{min-width:0}.method-meta dt{font-size:10px;color:var(--muted);margin-bottom:4px}.method-meta dd {margin:0;font-size:11px;overflow-wrap:anywhere}.editor-label {display:grid;gap:7px;font-size:12px;margin:20px 0 9px}.editor-label small{color:var(--muted);font-size:10px}.json-editor.bp6-input {font-family:var(--code-font);font-variant-ligatures:none;font-size:12px;line-height:1.6;resize:vertical;background:#18212a}.method-actions{display:flex;gap:10px;margin:16px 0}.request-key{display:block;font-size:9px;color:var(--faint);overflow-wrap:anywhere}.rpc-result{border-top:1px solid var(--line);margin-top:22px;padding-top:15px}
-.record-panel {padding:20px;background:var(--surface-1);border:1px solid var(--line);border-radius:4px;margin:18px 0}.record-grid{margin:0;display:grid;gap:0;min-width:0}.record-grid>div{display:grid;grid-template-columns:minmax(100px,.3fr) minmax(0,1fr);gap:14px;padding:9px 0;border-bottom:1px solid var(--line-soft)}.record-grid dt {font-family:var(--code-font);font-variant-ligatures:none;font-size:10px;color:var(--muted);overflow-wrap:anywhere}.record-grid dd{margin:0;min-width:0}.record-value{font-size:12px;line-height:1.6;white-space:pre-wrap;overflow-wrap:anywhere}.record-null{font-size:11px;color:var(--faint)}.record-array{display:grid;gap:10px;min-width:0}.record-array-item{display:flex;gap:10px;align-items:flex-start;padding:10px;background:#1e2833;border-radius:3px;min-width:0}.record-array-item>.record-grid{flex:1}.record-index{font-size:9px;font-family:var(--code-font);font-variant-ligatures:none;color:var(--faint);padding-top:4px}.raw-detail{max-width:100%;min-width:0}.raw-detail pre,.record-panel pre{font-size:10px;white-space:pre-wrap;overflow-wrap:anywhere;max-height:500px;overflow:auto;color:var(--muted)}.records-empty{padding:70px 20px;text-align:center;color:var(--muted)}.records-empty h2{font-size:20px}.records-empty p{font-size:12px}
-.workstation .analysis-workspace{padding:0}.workstation .object-header{margin:20px 0;padding:18px;background:var(--surface-1);border:1px solid var(--line);border-radius:4px}.workstation .object-header h1{font-size:15px;overflow-wrap:anywhere}.workstation .analysis-card,.workstation .dimension-card{background:var(--surface-1);border:1px solid var(--line);border-radius:4px;padding:16px;box-shadow:none}.workstation .analysis-card h3{font-size:14px;line-height:1.6}.workstation .analysis-card p,.workstation .analysis-card dd{font-size:12px}.workstation .dimension-grid{grid-template-columns:repeat(2,1fr)}.workstation .dimension-card p{font-size:12px}.workstation .workspace-tabs{margin:20px 0;border-bottom:1px solid var(--line);gap:4px}.workstation .workspace-tabs button{font-size:11px;border-radius:3px}.workstation .workspace-tabs button.active{background:#2a4059;border-color:#3e6186}.workstation .badge {font-size:9px;line-height:1.5;letter-spacing:0;max-width:100%;overflow-wrap:anywhere}.workstation .protected-callout{background:#3b3324;border-color:#796038;color:#efd59a;font-size:11px}.workstation .action-card.frontier {border-color:#4c7199}.workstation .frontier-label{color:var(--accent-bright)}.workstation .result-section{margin:22px 0}.workstation .receipt-card{grid-template-columns:1fr}.workstation .section-title-row{gap:10px;flex-wrap:wrap}
+.workstation .prompt-composer {margin:24px 0 0;background:#222d3a;border:1px solid #48627e;border-radius:6px;padding:0;overflow:visible}.workstation .prompt-label-row {padding:15px 17px 10px}.workstation .prompt-label-row label {font-size:12px}.workstation .prompt-label-row span {font-size:var(--font-small)}.workstation .prompt-composer>textarea {margin:0 16px;width:calc(100% - 32px);resize:vertical;min-height:90px;border:0;border-radius:3px;background:#1c2530;font-size:13px;padding:12px;line-height:1.7;color:var(--text);box-shadow:none}.workstation .composer-footer {padding:12px 16px;border-top:1px solid var(--line-soft)}.workstation .composer-footer>span{font-size:var(--font-small)}.workstation .composer-footer .bp6-button{background:#2d72d2;border-radius:3px;font-size:12px;padding:8px 12px}.workstation .model-settings{margin:14px 16px;padding:10px 0;border:0;border-top:1px solid var(--line-soft);border-radius:0;gap:10px}.workstation .model-settings legend{font-size:var(--font-small);padding:0 8px 0 0}.workstation .model-settings select{background:#253240;border:1px solid #425269;border-radius:3px;font-size:var(--font-small);padding:6px 28px 6px 6px}.workstation .model-settings button{border-radius:3px;background:#2f3e50;font-size:var(--font-small);padding:6px}.workstation .model-settings small {font-size:var(--font-small)}
+.workstation .research-empty {min-height:230px;padding:25px;margin:10px 0}.research-empty .bp6-heading{font-size:20px}.research-empty .bp6-non-ideal-state-text{max-width:480px;font-size:12px;color:var(--muted)}.research-empty>.bp6-non-ideal-state-visual{color:#7293b8}.research-progress {padding:16px;background:var(--surface-1);border:1px solid var(--line);border-radius:4px;margin-bottom:18px}.research-progress>.bp6-callout{margin:12px 0}.control-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:12px}.control-row>span{flex:1;min-width:180px}.budget-strip{display:grid;grid-template-columns:1fr 1.5fr 1fr;gap:20px;border-top:1px solid var(--line-soft);margin-top:16px;padding-top:14px}.budget-strip>div{display:grid;gap:6px}.budget-strip span{font-size:var(--font-small);color:var(--muted)}.budget-strip strong{font-size:var(--font-small)}.budget-strip .bp6-progress-bar{height:3px}.research-progress details{margin-top:14px}.workstation summary{cursor:pointer;color:var(--muted);font-size:var(--font-small);padding:8px 0}.answer-panel{padding:22px;background:#243143;border-left:3px solid var(--accent);border-radius:3px}.answer-text {white-space:pre-wrap;font-size:14px;line-height:1.9}.stale-result{border-left:2px solid var(--amber);padding-left:10px}
+.workstation .evidence-rail {grid-column:3;grid-row:3;height:calc(100vh - 105px);top:105px;padding:21px 17px;background:#202831;border-left:1px solid var(--line);position:sticky;display:block}.workstation .evidence-rail h2{font-size:14px}.workstation .evidence-item{background:var(--surface-1);border:1px solid var(--line-soft);border-radius:4px;padding:12px;margin-bottom:10px}.workstation .evidence-item p{font-size:12px;line-height:1.7}.workstation .evidence-item small{font-size:var(--font-small);overflow-wrap:anywhere}.workstation .evidence-item code {font-size:var(--font-small);color:var(--accent-bright)}.workstation .evidence-filters {grid-template-columns:1fr;margin:18px 0 12px}.workstation .evidence-filters input {font-size:var(--font-small)}.workstation .evidence-filters select{font-size:var(--font-small);width:100%}
+.workstation .source-connect-panel{margin:0 0 20px;padding:20px;background:var(--surface-1);border:1px solid var(--line);border-radius:4px}.workstation .source-controls{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.workstation .source-controls>*:first-child{grid-column:1/-1}.workstation .source-controls select {width:100%;padding:0 28px 0 10px;font-size:var(--font-small);border-radius:3px;background:transparent;border:0}.workstation .source-controls button {background:#2d72d2;border-radius:3px;font-size:12px}.workstation .source-controls .bp6-file-input{text-align:left;font-size:12px}.source-control-label{display:grid;gap:6px;color:var(--muted);font-size:var(--font-small)}.local-developer-tools{display:grid;gap:6px;margin-top:8px}.source-time-advanced{margin-top:8px}.source-time-advanced-body{padding:4px 10px 10px;border-left:2px solid var(--line)}
+.catalog-toolbar {display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-bottom:18px}.catalog-toolbar .bp6-input-group {flex:1;min-width:220px}.catalog-toolbar .bp6-html-select select{font-size:12px}.catalog-layout {display:grid;grid-template-columns:minmax(260px,340px) minmax(0,1fr);border:1px solid var(--line);border-radius:4px;overflow:hidden;background:var(--surface-1)}.method-list {max-height:calc(100vh - 270px);min-height:450px;overflow:auto;background:#1e2732;border-right:1px solid var(--line);padding:8px}.catalog-count{font-size:var(--font-small);color:var(--muted);padding:8px}.method-item.bp6-button {display:flex;width:100%;padding:9px 7px;border-radius:3px;min-height:48px}.method-item .bp6-button-text {display:flex;gap:10px;align-items:flex-start;min-width:0}.method-item strong {display:block;font-family:var(--code-font);font-variant-ligatures:none;font-size:var(--font-small);overflow-wrap:anywhere;font-weight:500}.method-item small {display:block;color:var(--muted);font-size:var(--font-small);margin-top:4px}.method-kind{display:inline-flex;flex-shrink:0;width:19px;height:19px;align-items:center;justify-content:center;border-radius:3px;font-size:var(--font-small);background:#24476b;color:#9cc8ff}.method-kind.command{background:#584321;color:#e8c57c}.method-detail {padding:24px;min-width:0;overflow-wrap:anywhere}.method-detail h2 {font-family:var(--code-font);font-variant-ligatures:none;font-size:19px;margin:16px 0}.method-meta {display:grid;grid-template-columns:1fr 1fr;gap:12px;margin:20px 0}.method-meta>div{min-width:0}.method-meta dt{font-size:var(--font-small);color:var(--muted);margin-bottom:4px}.method-meta dd {margin:0;font-size:var(--font-small);overflow-wrap:anywhere}.editor-label {display:grid;gap:7px;font-size:12px;margin:20px 0 9px}.editor-label small{color:var(--muted);font-size:var(--font-small)}.json-editor.bp6-input {font-family:var(--code-font);font-variant-ligatures:none;font-size:12px;line-height:1.6;resize:vertical;background:#18212a}.method-actions{display:flex;gap:10px;margin:16px 0}.request-key{display:block;font-size:var(--font-small);color:var(--faint);overflow-wrap:anywhere}.rpc-result{border-top:1px solid var(--line);margin-top:22px;padding-top:15px}
+.record-panel {padding:20px;background:var(--surface-1);border:1px solid var(--line);border-radius:4px;margin:18px 0}.record-grid{margin:0;display:grid;gap:0;min-width:0}.record-grid>div{display:grid;grid-template-columns:minmax(100px,.3fr) minmax(0,1fr);gap:14px;padding:9px 0;border-bottom:1px solid var(--line-soft)}.record-grid dt {font-family:var(--code-font);font-variant-ligatures:none;font-size:var(--font-small);color:var(--muted);overflow-wrap:anywhere}.record-grid dd{margin:0;min-width:0}.record-value{font-size:12px;line-height:1.6;white-space:pre-wrap;overflow-wrap:anywhere}.record-null{font-size:var(--font-small);color:var(--faint)}.record-array{display:grid;gap:10px;min-width:0}.record-array-item{display:flex;gap:10px;align-items:flex-start;padding:10px;background:#1e2833;border-radius:3px;min-width:0}.record-array-item>.record-grid{flex:1}.record-index{font-size:var(--font-small);font-family:var(--code-font);font-variant-ligatures:none;color:var(--faint);padding-top:4px}.raw-detail{max-width:100%;min-width:0}.raw-detail pre,.record-panel pre{font-size:var(--font-small);white-space:pre-wrap;overflow-wrap:anywhere;max-height:500px;overflow:auto;color:var(--muted)}.records-empty{padding:70px 20px;text-align:center;color:var(--muted)}.records-empty h2{font-size:20px}.records-empty p{font-size:12px}
+.workstation .analysis-workspace{padding:0}.workstation .object-header{margin:20px 0;padding:18px;background:var(--surface-1);border:1px solid var(--line);border-radius:4px}.workstation .object-header h1{font-size:15px;overflow-wrap:anywhere}.workstation .analysis-card,.workstation .dimension-card{background:var(--surface-1);border:1px solid var(--line);border-radius:4px;padding:16px;box-shadow:none}.workstation .analysis-card h3{font-size:14px;line-height:1.6}.workstation .analysis-card p,.workstation .analysis-card dd{font-size:12px}.workstation .dimension-grid{grid-template-columns:repeat(2,1fr)}.workstation .dimension-card p{font-size:12px}.workstation .workspace-tabs{margin:20px 0;border-bottom:1px solid var(--line);gap:4px}.workstation .workspace-tabs button{font-size:var(--font-small);border-radius:3px}.workstation .workspace-tabs button.active{background:#2a4059;border-color:#3e6186}.workstation .badge {font-size:var(--font-small);line-height:1.5;letter-spacing:0;max-width:100%;overflow-wrap:anywhere}.workstation .protected-callout{background:#3b3324;border-color:#796038;color:#efd59a;font-size:var(--font-small)}.workstation .action-card.frontier {border-color:#4c7199}.workstation .frontier-label{color:var(--accent-bright)}.workstation .result-section{margin:22px 0}.workstation .receipt-card{grid-template-columns:1fr}.workstation .section-title-row{gap:10px;flex-wrap:wrap}
@media(min-width:1700px){:root{--sidebar-width:268px;--evidence-width:360px}.workspace-content{padding:32px 40px}.workstation .dimension-grid{grid-template-columns:repeat(4,1fr)}}
@media(max-width:1250px){:root{--sidebar-width:220px;--evidence-width:280px}.workspace-content{padding:22px}.context-policy>span{display:none}.catalog-layout{grid-template-columns:280px minmax(0,1fr)}.method-detail{padding:18px}.method-meta{grid-template-columns:1fr}.workstation .brand .bp6-tag{display:none}}
@media(max-width:1080px){.workstation.with-evidence{grid-template-columns:var(--sidebar-width) minmax(0,1fr)}.workstation .evidence-rail{grid-column:2;grid-row:4;height:auto;position:static;max-height:600px;border-top:1px solid var(--line)}.context-policy{display:none}.catalog-layout{grid-template-columns:240px minmax(0,1fr)}.budget-strip{grid-template-columns:1fr 1fr}.context-path small{max-width:130px}}
@@ -150,7 +150,7 @@ button:focus-visible, summary:focus-visible, a:focus-visible { outline: 2px soli
.conversation-heading {display:flex;align-items:center;justify-content:space-between;padding:16px 28px;border-bottom:1px solid var(--line-soft);gap:16px}
.conversation-heading h1 {margin:0;font-size:14px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--muted)}
.conversation-heading-tools {display:flex;align-items:center;gap:4px;flex-shrink:0}
-.conversation-heading-tools .bp6-button {color:var(--muted);font-size:11px}
+.conversation-heading-tools .bp6-button {color:var(--muted);font-size:var(--font-small)}
.research-side-panel {border-left:1px solid var(--line);background:var(--surface-1);display:flex;flex-direction:column;min-height:0;min-width:0}
.research-side-panel>header {display:flex;align-items:center;justify-content:space-between;gap:8px;padding:8px 12px;border-bottom:1px solid var(--line-soft)}
.research-side-panel>header .bp6-tabs {min-width:0;flex:1}
@@ -160,26 +160,26 @@ button:focus-visible, summary:focus-visible, a:focus-visible { outline: 2px soli
.conversation-timeline,.conversation-timeline *{box-sizing:border-box}
.conversation-turn {margin-bottom:42px}
.user-message {max-width:85%;margin-left:auto;border:1px solid var(--line);background:var(--surface-2);padding:16px 20px;border-radius:16px 16px 4px 16px}
-.user-message header,.assistant-message>header {font-size:11px;color:var(--muted);display:flex;justify-content:space-between;gap:20px}
-.user-message time {font-size:10px;color:var(--faint)}
+.user-message header,.assistant-message>header {font-size:var(--font-small);color:var(--muted);display:flex;justify-content:space-between;gap:20px}
+.user-message time {font-size:var(--font-small);color:var(--faint)}
.user-message p {margin:8px 0 0;white-space:pre-wrap;font-size:14px;overflow-wrap:anywhere}
.assistant-message {padding:26px 4px 0;line-height:1.8}
.assistant-message>header {font-weight:700;letter-spacing:.13em;color:var(--accent-bright);margin-bottom:14px}
.assistant-message>header {align-items:center;flex-wrap:wrap;justify-content:flex-start;gap:10px}
.result-status-strip {display:inline-flex;flex-wrap:wrap;gap:4px;letter-spacing:0;font-weight:400}
-.result-status-strip .bp6-tag {font-size:11px}
+.result-status-strip .bp6-tag {font-size:var(--font-small)}
.answer-text .answer-lead {color:var(--amber);font-size:13px;margin:0 0 8px}
.answer-text .answer-heading {font-size:14px;font-weight:600;margin:14px 0 6px}
.result-hold-details {margin-top:14px}.result-hold-details>.toolkit-disclosure-body {border-left:0;padding-left:0}
-.turn-tally {font-size:11px;margin:0 0 10px;text-align:right}
+.turn-tally {font-size:var(--font-small);margin:0 0 10px;text-align:right}
.turn-summary {display:flex;align-items:flex-start;justify-content:space-between;gap:10px;margin-top:10px;padding:10px 14px;background:var(--surface-1);border:1px solid var(--line);border-radius:6px}
.turn-summary-line {display:flex;flex-wrap:wrap;align-items:center;gap:6px;min-width:0;font-size:12px}
.turn-summary-label {font-weight:600;color:var(--text)}
.turn-summary-preview {flex-basis:100%;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.turn-summary-actions {display:flex;gap:4px;flex-shrink:0;align-items:center}
.turn-summary-open {padding:4px 0;background:transparent;border:0;margin-top:4px;justify-content:flex-start;gap:4px}
-.workspace-counts {display:flex;gap:6px;align-items:center;font-size:11px}
-.setup-needed-button {font-size:11px;min-height:22px;padding:2px 8px}
+.workspace-counts {display:flex;gap:6px;align-items:center;font-size:var(--font-small)}
+.setup-needed-button {font-size:var(--font-small);min-height:22px;padding:2px 8px}
.project-readiness {text-align:left;max-width:620px;margin:26px auto 0;padding:14px 16px;background:var(--surface-1);border:1px solid var(--line);border-radius:6px}
.project-readiness .readiness-title {font-size:12px;font-weight:600;margin:0 0 8px;color:var(--text)}
.project-readiness .readiness-facts {display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px}
@@ -198,14 +198,14 @@ button:focus-visible, summary:focus-visible, a:focus-visible { outline: 2px soli
.followup-summary p,.followup-summary li{font-size:12px;line-height:1.7}.followup-summary ul{margin:0;padding-left:18px}
.followup-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px}.followup-grid>section{min-width:0;border-left:2px solid var(--line-soft);padding-left:10px}
.followup-detail-columns{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}
-.followup-ref-list{display:flex;flex-wrap:wrap;gap:6px;margin:8px 0}.followup-ref-list code,.followup-ref-list span{font-size:10px;max-width:100%;overflow-wrap:anywhere;background:var(--surface-0);border:1px solid var(--line-soft);border-radius:3px;padding:3px 6px;color:var(--muted)}
+.followup-ref-list{display:flex;flex-wrap:wrap;gap:6px;margin:8px 0}.followup-ref-list code,.followup-ref-list span{font-size:var(--font-small);max-width:100%;overflow-wrap:anywhere;background:var(--surface-0);border:1px solid var(--line-soft);border-radius:3px;padding:3px 6px;color:var(--muted)}
.coverage-table{display:grid;gap:8px}.coverage-row{padding:10px;border:1px solid var(--line-soft);border-radius:var(--radius);background:var(--surface-0)}.coverage-row>div:first-child{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.coverage-row p{margin:8px 0 4px}.coverage-row small{color:var(--muted);line-height:1.6}
.project-review-list{margin:0 0 16px;padding:16px;border:1px solid var(--line);border-radius:var(--radius);background:var(--surface-1)}.project-review-list .section-title-row{align-items:flex-start}.project-review-list h2{font-size:16px;margin:0 0 4px}.project-review-list p{font-size:12px;color:var(--muted);line-height:1.7;margin:0}
-.review-items{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px;margin-top:12px}.review-item{padding:12px;border:1px solid var(--line-soft);border-radius:var(--radius);background:var(--surface-0)}.review-item>div{display:flex;gap:6px;flex-wrap:wrap}.review-item h3{font-size:13px;line-height:1.5;margin:10px 0 6px}.review-item small{display:block;color:var(--muted);font-size:10px;line-height:1.6;margin:8px 0;overflow-wrap:anywhere}
+.review-items{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px;margin-top:12px}.review-item{padding:12px;border:1px solid var(--line-soft);border-radius:var(--radius);background:var(--surface-0)}.review-item>div{display:flex;gap:6px;flex-wrap:wrap}.review-item h3{font-size:13px;line-height:1.5;margin:10px 0 6px}.review-item small{display:block;color:var(--muted);font-size:var(--font-small);line-height:1.6;margin:8px 0;overflow-wrap:anywhere}
.answer-actions {display:flex;gap:3px;flex-wrap:wrap;margin-top:18px}
.answer-actions .bp6-button {font-size:12px;color:var(--muted)}.answer-actions .toolkit-disclosure{margin-top:0}.answer-more-actions{display:flex;flex-wrap:wrap;gap:4px;padding-top:4px}
.conversation-empty {padding:9vh 10px 2vh;text-align:center}
-.conversation-empty>span {font-size:10px;letter-spacing:.22em;color:var(--accent-bright)}
+.conversation-empty>span {font-size:var(--font-small);letter-spacing:.22em;color:var(--accent-bright)}
.conversation-empty h1 {font-size:27px;margin:16px 0}
.conversation-empty p {max-width:430px;margin:auto;color:var(--muted)}
.legacy-thread-empty{padding-top:12vh}.legacy-thread-empty>.bp6-icon{color:var(--accent-bright)}.legacy-thread-empty h1{max-width:720px;margin:22px auto 12px;font-size:24px;line-height:1.45}.legacy-thread-empty p{max-width:680px;font-size:14px;line-height:1.7}.legacy-thread-actions{display:flex;justify-content:center;gap:10px;margin-top:24px;flex-wrap:wrap}.legacy-thread-actions>.bp6-button{min-height:40px}
@@ -217,10 +217,10 @@ button:focus-visible, summary:focus-visible, a:focus-visible { outline: 2px soli
.composer-tools>.bp6-button:last-child {margin-left:auto}
.model-settings.compact {display:flex;align-items:center;flex-wrap:wrap;gap:8px;border:0;padding:0;margin:0;min-width:0}
.model-settings.compact legend,.model-settings.compact>small {display:none}
-.model-settings.compact label {font-size:10px;color:var(--muted);display:flex;gap:4px;align-items:center}
-.model-settings.compact select {min-width:96px;max-width:220px;text-overflow:ellipsis;white-space:nowrap;border:1px solid var(--line);border-radius:16px;background:var(--surface-2);color:var(--text);height:27px;font-size:11px;padding:2px 24px 2px 10px}
-.model-defaults {font-size:11px;color:var(--muted)}
-.usage-summary {display:block;text-align:right;font-size:11px;color:var(--faint);padding:8px 4px 0}
+.model-settings.compact label {font-size:var(--font-small);color:var(--muted);display:flex;gap:4px;align-items:center}
+.model-settings.compact select {min-width:96px;max-width:220px;text-overflow:ellipsis;white-space:nowrap;border:1px solid var(--line);border-radius:16px;background:var(--surface-2);color:var(--text);height:27px;font-size:var(--font-small);padding:2px 24px 2px 10px}
+.model-defaults {font-size:var(--font-small);color:var(--muted)}
+.usage-summary {display:block;text-align:right;font-size:var(--font-small);color:var(--faint);padding:8px 4px 0}
.activity-disclosure {font-size:12px;color:var(--muted);display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:8px}
.activity-disclosure p {margin:0;display:flex;align-items:center;gap:8px;flex:1}
.activity-controls {display:flex;margin-left:auto}
@@ -236,7 +236,7 @@ button:focus-visible, summary:focus-visible, a:focus-visible { outline: 2px soli
.detail-card h3 {margin-top:0;font-size:14px}.detail-card p {overflow-wrap:anywhere}
.research-detail-pane .evidence-rail {position:static;width:auto;min-width:0;height:auto;max-height:none;overflow:visible;padding:0;border:0;grid-column:auto;grid-row:auto}
.research-detail-pane .audit-trail {min-width:0}.research-detail-pane table {display:block;overflow:auto;max-width:100%}
-.test-mode-banner {margin:0!important;border-radius:0!important;font-size:11px!important}
+.test-mode-banner {margin:0!important;border-radius:0!important;font-size:var(--font-small)!important}
.project-advanced {margin:18px 0;color:var(--muted)}.project-advanced>.bp6-button{padding-left:0}
@media (max-width: 1100px) {
/* There is no room for the conversation and a detail panel side by side: the panel covers the conversation
@@ -334,7 +334,7 @@ button:focus-visible, summary:focus-visible, a:focus-visible { outline: 2px soli
.composer-dock { padding: 8px; }
.composer-tools { gap: 6px; }
.model-settings.compact select { max-width: 112px; }
- .usage-summary { text-align: left; font-size: 9px; }
+ .usage-summary { text-align: left; font-size: var(--font-small); }
.legacy-thread-empty { padding: 36px 12px 28px; }
.legacy-thread-empty h1 { font-size: 21px; }
.legacy-thread-actions > .bp6-button { flex: 1; min-width: 150px; }
@@ -359,8 +359,8 @@ button:focus-visible, summary:focus-visible, a:focus-visible { outline: 2px soli
.conversation-heading h1 { font-size: 12px; }
.conversation-empty h1 { font-size: 21px; }
.user-message time { display: none; }
- .composer-tools > .bp6-button { font-size: 11px; }
- .model-settings.compact label { font-size: 9px; }
+ .composer-tools > .bp6-button { font-size: var(--font-small); }
+ .model-settings.compact label { font-size: var(--font-small); }
}
@media(max-width:480px){.result-example-page{padding:18px 0;overflow-x:hidden}.result-example-page>.bp6-callout{width:calc(100vw - 28px);margin:0 auto 22px}.result-example-page>.conversation-timeline{width:calc(100vw - 28px);max-width:calc(100vw - 28px);padding:18px 0}.result-example-page .user-message{max-width:100%;margin-left:0}.result-example-page .followup-summary{padding:12px}}
@@ -418,24 +418,24 @@ button:focus-visible, summary:focus-visible, a:focus-visible { outline: 2px soli
.research-progress-now { margin: 0 0 6px; color: var(--accent-bright); font-size: 14px; font-weight: 600; }
-.research-progress-summary{display:flex;align-items:flex-start;gap:12px;padding:4px 0 12px}.research-progress-summary>.bp6-spinner,.research-progress-summary>.bp6-icon{flex:0 0 auto;color:var(--accent-bright);margin-top:2px}.research-progress-summary span,.research-progress-brief span{display:block;color:var(--accent-bright);font-size:11px;font-weight:600;margin-bottom:3px}.research-progress-summary strong{display:block;font-size:15px;line-height:1.5}.research-progress-brief{display:grid;gap:10px;margin:0 0 12px;padding-left:30px}.research-progress-brief>div{display:grid;grid-template-columns:92px minmax(0,1fr);gap:10px}.research-progress-brief p{margin:0;color:var(--muted);font-size:13px;line-height:1.65}.research-progress>.toolkit-disclosure{border-top:1px solid var(--line-soft);padding-top:6px}
+.research-progress-summary{display:flex;align-items:flex-start;gap:12px;padding:4px 0 12px}.research-progress-summary>.bp6-spinner,.research-progress-summary>.bp6-icon{flex:0 0 auto;color:var(--accent-bright);margin-top:2px}.research-progress-summary span,.research-progress-brief span{display:block;color:var(--accent-bright);font-size:var(--font-small);font-weight:600;margin-bottom:3px}.research-progress-summary strong{display:block;font-size:15px;line-height:1.5}.research-progress-brief{display:grid;gap:10px;margin:0 0 12px;padding-left:30px}.research-progress-brief>div{display:grid;grid-template-columns:92px minmax(0,1fr);gap:10px}.research-progress-brief p{margin:0;color:var(--muted);font-size:13px;line-height:1.65}.research-progress>.toolkit-disclosure{border-top:1px solid var(--line-soft);padding-top:6px}
.research-activity{margin:14px 0 4px;padding:14px 0 8px;border-top:1px solid var(--line-soft)}
-.research-activity-heading{display:flex;align-items:end;justify-content:space-between;gap:12px;margin-bottom:10px}.research-activity-heading>div{display:grid;gap:2px}.research-activity-heading>div>span{color:var(--accent-bright);font-size:10px;font-weight:600;letter-spacing:.08em}.research-activity-heading strong{font-size:13px}.research-activity-heading>span{color:var(--faint);font-size:11px}
+.research-activity-heading{display:flex;align-items:end;justify-content:space-between;gap:12px;margin-bottom:10px}.research-activity-heading>div{display:grid;gap:2px}.research-activity-heading>div>span{color:var(--accent-bright);font-size:var(--font-small);font-weight:600;letter-spacing:.08em}.research-activity-heading strong{font-size:13px}.research-activity-heading>span{color:var(--faint);font-size:var(--font-small)}
.research-activity-list,.research-activity-expanded{list-style:none;margin:0;padding:0;display:grid;gap:8px}.research-activity-list>li{display:grid;grid-template-columns:22px minmax(0,1fr);gap:9px;padding:10px;border:1px solid var(--line-soft);border-radius:6px;background:var(--surface-2)}
.research-activity-list>li[data-severity="error"],.research-activity-list>li[data-severity="blocked"]{border-left:2px solid var(--red)}.research-activity-list>li[data-severity="warning"],.research-activity-list>li[data-severity="input_required"]{border-left:2px solid var(--amber)}
-.research-activity-icon{padding-top:2px;color:var(--accent-bright)}.research-activity-main{display:grid;gap:4px;min-width:0}.research-activity-main>strong{font-size:12px;line-height:1.5}.research-activity-main>span{overflow:hidden;text-overflow:ellipsis;color:var(--muted);font-size:11px;line-height:1.5;white-space:nowrap}.research-activity-badges{display:flex;gap:5px;flex-wrap:wrap}.research-activity-badges .bp6-tag{font-size:10px}
+.research-activity-icon{padding-top:2px;color:var(--accent-bright)}.research-activity-main{display:grid;gap:4px;min-width:0}.research-activity-main>strong{font-size:12px;line-height:1.5}.research-activity-main>span{overflow:hidden;text-overflow:ellipsis;color:var(--muted);font-size:var(--font-small);line-height:1.5;white-space:nowrap}.research-activity-badges{display:flex;gap:5px;flex-wrap:wrap}.research-activity-badges .bp6-tag{font-size:var(--font-small)}
.research-activity>.toolkit-disclosure{margin-top:8px}.research-activity-expanded>li{padding:12px;border:1px solid var(--line-soft);border-radius:6px;background:var(--surface-2)}.research-activity-expanded header{display:flex;align-items:center;gap:7px;flex-wrap:wrap}.research-activity-expanded header>strong{margin-right:auto;font-size:12px}.research-activity-expanded header>.bp6-icon,.research-activity-expanded header>.bp6-spinner{color:var(--accent-bright)}
-.research-activity-detail{display:grid;gap:10px;margin-top:10px}.research-activity-detail section{display:grid;gap:5px}.research-activity-detail h5{margin:0;color:var(--faint);font-size:10px;text-transform:uppercase;letter-spacing:.07em}.research-activity-detail p{margin:0;color:var(--muted);font-size:11px;line-height:1.6}.research-activity-detail p>strong{display:block;color:var(--faint);font-size:10px}.research-activity-detail code{display:block;overflow-wrap:anywhere;color:var(--muted);font-size:10px}.research-activity-detail .activity-limit{color:var(--faint)}
-.activity-arguments{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:4px 12px;margin:0}.activity-arguments>div{display:grid;grid-template-columns:minmax(70px,.7fr) minmax(0,1fr);gap:6px}.activity-arguments dt{color:var(--faint);font-size:10px}.activity-arguments dd{margin:0;overflow-wrap:anywhere;color:var(--muted);font-size:10px}.activity-empty{color:var(--faint);font-size:10px}
+.research-activity-detail{display:grid;gap:10px;margin-top:10px}.research-activity-detail section{display:grid;gap:5px}.research-activity-detail h5{margin:0;color:var(--faint);font-size:var(--font-small);text-transform:uppercase;letter-spacing:.07em}.research-activity-detail p{margin:0;color:var(--muted);font-size:var(--font-small);line-height:1.6}.research-activity-detail p>strong{display:block;color:var(--faint);font-size:var(--font-small)}.research-activity-detail code{display:block;overflow-wrap:anywhere;color:var(--muted);font-size:var(--font-small)}.research-activity-detail .activity-limit{color:var(--faint)}
+.activity-arguments{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:4px 12px;margin:0}.activity-arguments>div{display:grid;grid-template-columns:minmax(70px,.7fr) minmax(0,1fr);gap:6px}.activity-arguments dt{color:var(--faint);font-size:var(--font-small)}.activity-arguments dd{margin:0;overflow-wrap:anywhere;color:var(--muted);font-size:var(--font-small)}.activity-empty{color:var(--faint);font-size:var(--font-small)}
.research-progress-detail, .research-progress-missing { margin: 0 0 12px; color: var(--muted); font-size: 12px; line-height: 1.65; }
.research-progress-log { list-style: none; margin: 0 0 12px; padding: 0; display: grid; gap: 10px; }
.research-progress-log li { padding-left: 14px; border-left: 2px solid var(--line); }
.research-progress-log li.research-progress-current { border-left-color: var(--accent-bright); }
.research-progress-log strong, .research-progress-log span { display: block; }
.research-progress-log strong { color: var(--text); font-size: 12px; font-weight: 600; }
-.research-progress-log span { margin-top: 3px; color: var(--muted); font-size: 11px; line-height: 1.6; }
+.research-progress-log span { margin-top: 3px; color: var(--muted); font-size: var(--font-small); line-height: 1.6; }
.research-progress-evidence, .research-progress-sources { margin: 0 0 10px; padding-left: 18px; color: var(--muted); font-size: 12px; }
-.research-progress-model { margin: 8px 0 0; color: var(--faint); font-size: 11px; line-height: 1.5; }
+.research-progress-model { margin: 8px 0 0; color: var(--faint); font-size: var(--font-small); line-height: 1.5; }
.research-progress-timeline { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }
.research-progress-note { margin: 4px 0 0; color: var(--text); font-size: 13px; line-height: 1.55; }
.research-progress-note.live { color: var(--accent-bright); }
@@ -443,12 +443,12 @@ button:focus-visible, summary:focus-visible, a:focus-visible { outline: 2px soli
.research-progress-action.live { border-color: #4c7199; }
.research-progress-action .bp6-icon, .research-progress-action .bp6-spinner { flex-shrink: 0; color: var(--accent-bright); }
.research-progress-action-label { color: var(--text); font-weight: 600; flex-shrink: 0; }
-.research-progress-action code { min-width: 0; font-size: 11px; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
+.research-progress-action code { min-width: 0; font-size: var(--font-small); color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Judgment screen: cited answers */
.assistant-message .answer-text {white-space:normal}
.answer-text p {margin:0 0 12px}.answer-text ul {margin:0 0 12px;padding-left:20px}.answer-text li {margin:4px 0}
-.answer-citation {display:inline;border:0;background:none;color:var(--accent-bright);font:inherit;font-size:.82em;font-weight:600;padding:0 1px;cursor:pointer;vertical-align:baseline}
+.answer-citation {display:inline;border:0;background:none;color:var(--accent-bright);font:inherit;font-size:max(.82em, var(--font-small));font-weight:600;padding:0 1px;cursor:pointer;vertical-align:baseline}
.answer-citation:hover,.answer-citation:focus-visible {text-decoration:underline}
.workstation .evidence-item.focused {border-color:var(--accent-bright);box-shadow:0 0 0 2px rgba(76,144,240,.35)}
.evidence-item .citation-number {display:inline-block;margin-bottom:6px;color:var(--accent-bright);font-size:12px}
@@ -457,24 +457,24 @@ button:focus-visible, summary:focus-visible, a:focus-visible { outline: 2px soli
.answer-hold {margin:14px 0}.answer-hold p {margin:2px 0;font-size:13px}
.answer-hold .confirmed-facts p {margin:2px 0;font-size:13px}.answer-hold .confirmed-facts ul {margin:2px 0 6px;padding-left:18px;font-size:13px}.answer-hold .evidence-use p {margin:2px 0;font-size:13px}.answer-hold .evidence-use ul {margin:2px 0 6px;padding-left:18px;font-size:12px}.usage-line {margin:8px 0 0;font-size:12px}
.coverage-head,.coverage-row {display:grid;grid-template-columns:minmax(0,2fr) minmax(90px,1fr) minmax(0,1.4fr);gap:10px;align-items:start}
-.coverage-head {font-size:10px;color:var(--muted);padding:0 10px}
+.coverage-head {font-size:var(--font-small);color:var(--muted);padding:0 10px}
.coverage-row>div:first-child {display:block}.coverage-row .coverage-tech {grid-column:1/-1}
/* Judgment screen: hypotheses */
.hypothesis-counts {margin:8px 0}.counter-state {font-size:12px;color:var(--muted)}
-.relation-filter {display:flex;align-items:center;gap:8px;margin:8px 0}.relation-summary {margin-left:auto;font-size:11px;color:var(--muted)}
-.relation-table {width:100%}.relation-table th,.relation-table td {font-size:11px}
+.relation-filter {display:flex;align-items:center;gap:8px;margin:8px 0}.relation-summary {margin-left:auto;font-size:var(--font-small);color:var(--muted)}
+.relation-table {width:100%}.relation-table th,.relation-table td {font-size:var(--font-small)}
/* Judgment screen: actions */
.recommendation {border-left:3px solid var(--accent)}.recommendation p {margin:6px 0}
-.criteria-table {width:100%;margin-top:10px}.criteria-table th,.criteria-table td {font-size:11px;vertical-align:top}.criteria-table td p {margin:0 0 6px}
-.source-number {color:var(--accent-bright);font-size:.85em;margin-right:2px}
+.criteria-table {width:100%;margin-top:10px}.criteria-table th,.criteria-table td {font-size:var(--font-small);vertical-align:top}.criteria-table td p {margin:0 0 6px}
+.source-number {color:var(--accent-bright);font-size:max(.85em, var(--font-small));margin-right:2px}
.queued-instruction-notice {margin:8px 0}
-.project-memory {display:grid;gap:10px}.project-memory .memory-card p {margin:6px 0}.project-memory .memory-excluded h3 {font-size:12px;margin:6px 0 4px}.project-memory .memory-excluded ul {margin:0;padding-left:18px;font-size:11px}
-.action-effort .effort-line {margin:2px 0}.action-effort small {color:var(--muted)}.effort-editor {display:grid;gap:6px;margin-top:6px;max-width:520px}.effort-editor-row {display:grid;grid-template-columns:150px 1fr;gap:8px;align-items:center}.effort-editor-row label {display:flex;gap:6px;align-items:center;font-size:11px}
-.review-line {margin:6px 0}.review-line p {margin:2px 0}.cell-review {min-height:16px;padding:0 2px}.review-reasons {border:0;padding:0;margin:8px 0}.review-reasons legend {font-size:11px;color:var(--muted)}.review-note {display:block;font-size:11px;margin-top:8px}
-.approval-card ins {background:rgba(45,164,78,.25);text-decoration:none;padding:0 2px}.approval-card del {background:rgba(219,55,55,.25);padding:0 2px}.approval-change {margin:6px 0}.approval-actions {display:flex;gap:8px;margin-top:8px}.approval-full {display:grid;gap:4px;margin:8px 0}.approval-full dt {font-size:11px;color:var(--muted)}.approval-full dd {margin:0}
-.project-memory .memory-card.older {opacity:.7}.project-memory .memory-reason {color:var(--warning, #d9822b);margin:2px 0}.history-change-brief {display:flex;gap:6px;flex-wrap:wrap;align-items:center;font-size:11px;color:var(--muted)}
+.project-memory {display:grid;gap:10px}.project-memory .memory-card p {margin:6px 0}.project-memory .memory-excluded h3 {font-size:12px;margin:6px 0 4px}.project-memory .memory-excluded ul {margin:0;padding-left:18px;font-size:var(--font-small)}
+.action-effort .effort-line {margin:2px 0}.action-effort small {color:var(--muted)}.effort-editor {display:grid;gap:6px;margin-top:6px;max-width:520px}.effort-editor-row {display:grid;grid-template-columns:150px 1fr;gap:8px;align-items:center}.effort-editor-row label {display:flex;gap:6px;align-items:center;font-size:var(--font-small)}
+.review-line {margin:6px 0}.review-line p {margin:2px 0}.cell-review {min-height:16px;padding:0 2px}.review-reasons {border:0;padding:0;margin:8px 0}.review-reasons legend {font-size:var(--font-small);color:var(--muted)}.review-note {display:block;font-size:var(--font-small);margin-top:8px}
+.approval-card ins {background:rgba(45,164,78,.25);text-decoration:none;padding:0 2px}.approval-card del {background:rgba(219,55,55,.25);padding:0 2px}.approval-change {margin:6px 0}.approval-actions {display:flex;gap:8px;margin-top:8px}.approval-full {display:grid;gap:4px;margin:8px 0}.approval-full dt {font-size:var(--font-small);color:var(--muted)}.approval-full dd {margin:0}
+.project-memory .memory-card.older {opacity:.7}.project-memory .memory-reason {color:var(--warning, #d9822b);margin:2px 0}.history-change-brief {display:flex;gap:6px;flex-wrap:wrap;align-items:center;font-size:var(--font-small);color:var(--muted)}
/* Trace table: one line per requirement and criterion, verdict in words and colour, history under the line. */
.trace-page{gap:12px}
@@ -486,19 +486,19 @@ button:focus-visible, summary:focus-visible, a:focus-visible { outline: 2px soli
.trace-table .bp6-tag{white-space:normal;max-width:100%;height:auto;min-height:20px}.trace-table .bp6-tag .bp6-text-overflow-ellipsis{white-space:normal;overflow:visible;text-overflow:clip}
.trace-sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
.trace-table th,.trace-table td{vertical-align:top;text-align:left;padding:8px 10px;line-height:1.55;overflow-wrap:anywhere}
-.trace-table thead th{font-size:11px;color:var(--muted);font-weight:600}
+.trace-table thead th{font-size:var(--font-small);color:var(--muted);font-weight:600}
.trace-table .trace-requirement>*{background:var(--surface-1);border-top:2px solid var(--line)}
.trace-table .trace-requirement th{font-size:13px}
-.trace-kind{display:inline-block;font-size:10px;font-weight:600;padding:1px 6px;border:1px solid var(--line);border-radius:8px;margin-right:4px;color:var(--muted)}
+.trace-kind{display:inline-block;font-size:var(--font-small);font-weight:600;padding:1px 6px;border:1px solid var(--line);border-radius:8px;margin-right:4px;color:var(--muted)}
.trace-indent{display:inline-block;padding-left:14px}
-.trace-reasons{margin:4px 0 0;padding-left:16px;font-size:11px;line-height:1.55}
-.trace-next{margin-top:4px}.trace-tags{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.trace-next-label{font-size:11px;font-weight:600}
+.trace-reasons{margin:4px 0 0;padding-left:16px;font-size:var(--font-small);line-height:1.55}
+.trace-next{margin-top:4px}.trace-tags{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.trace-next-label{font-size:var(--font-small);font-weight:600}
.trace-history{list-style:none;margin:0;padding:6px 0 10px;display:grid;gap:10px}
.trace-revision{border:1px solid var(--line-soft);border-radius:8px;padding:10px 12px;background:var(--surface-0)}
.trace-revision[data-current="true"]{border-color:var(--line)}
.trace-revision h4{margin:0 0 6px;font-size:12px}
.trace-revision p{margin:4px 0}
-.trace-change{font-size:11px;color:var(--muted)}
+.trace-change{font-size:var(--font-small);color:var(--muted)}
.trace-preview h3{font-size:13px;margin:12px 0 6px}
.trace-file-field{display:grid;gap:4px;margin:10px 0}
.trace-notice p{margin:2px 0}
@@ -510,7 +510,7 @@ button:focus-visible, summary:focus-visible, a:focus-visible { outline: 2px soli
/* An archived project is one row, like an open one: the name, then its menu. */
.archived-project-row { display: flex; align-items: center; gap: 2px; min-width: 0; min-height: 30px; padding-left: 8px; font-size: 12px; color: var(--muted); }
.archived-project-row .bp6-popover-target > .bp6-button { color: var(--muted); }
-.local-retrieval-command{display:block;margin:4px 0;padding:6px 8px;border:1px solid var(--line-soft);border-radius:3px;background:var(--surface-2);font-family:var(--code-font);font-variant-ligatures:none;font-size:11px;line-height:1.5;overflow-wrap:anywhere;user-select:all}
+.local-retrieval-command{display:block;margin:4px 0;padding:6px 8px;border:1px solid var(--line-soft);border-radius:3px;background:var(--surface-2);font-family:var(--code-font);font-variant-ligatures:none;font-size:var(--font-small);line-height:1.5;overflow-wrap:anywhere;user-select:all}
.archived-project-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Languages are chosen in Settings; the question box only shows a fixed response language. */
@@ -518,15 +518,15 @@ button:focus-visible, summary:focus-visible, a:focus-visible { outline: 2px soli
.language-card .language-row label { min-width:150px; font-size:12px; color:var(--muted); }
.language-card select { max-width:100%; border:1px solid var(--line); border-radius:4px; background:var(--surface-1); color:var(--text); padding:4px 7px; font:inherit; font-size:12px; }
.language-card p { margin:4px 0; font-size:12px; }
-.language-help { display:block; font-size:11px; line-height:1.5; color:var(--muted); }
+.language-help { display:block; font-size:var(--font-small); line-height:1.5; color:var(--muted); }
/* Keep the question primary; persistent defaults and explanations live in Settings. */
.workstation .composer-dock .prompt-composer { padding:10px 12px; }
.workstation .composer-dock .prompt-composer textarea { margin:0;width:100%;min-height:48px;line-height:1.5; }
.composer-tools { gap:6px;margin-top:6px; }
-.language-fixed { display:inline-flex;align-items:center;gap:2px;font-size:11px;color:var(--muted);white-space:nowrap; }
-.language-fixed .language-fixed-link { font-size:11px;min-height:0;padding:0 4px; }
-.language-current { font-size:10px;color:var(--muted);white-space:nowrap; }
+.language-fixed { display:inline-flex;align-items:center;gap:2px;font-size:var(--font-small);color:var(--muted);white-space:nowrap; }
+.language-fixed .language-fixed-link { font-size:var(--font-small);min-height:0;padding:0 4px; }
+.language-current { font-size:var(--font-small);color:var(--muted);white-space:nowrap; }
.model-settings.compact .model-control-label { position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%); }
.model-settings.compact label:last-of-type select { min-width:68px;max-width:82px; }
.composer-tools>.bp6-button:last-child { min-width:32px;min-height:32px; }