void selectRoot()}
+ runtimeSettings={runtimeSettings}
+ value={draft}
+ variant="dialog"
+ />
+ ) : (
+ <>
+
+ )}
+ >
)}
{error && (
diff --git a/src/renderer/src/SettingsPanel.test.tsx b/src/renderer/src/SettingsPanel.test.tsx
index 24e3ad4..fb2cf1c 100644
--- a/src/renderer/src/SettingsPanel.test.tsx
+++ b/src/renderer/src/SettingsPanel.test.tsx
@@ -282,7 +282,11 @@ const heartbeatSettingsProps = {
onCreateHeartbeat: vi.fn(async () => {}),
onSetHeartbeatPaused: vi.fn(async () => {}),
onRemoveHeartbeat: vi.fn(async () => {}),
- onRunHeartbeat: vi.fn(async () => {})
+ onRunHeartbeat: vi.fn(async () => {}),
+ onUpdateProject: vi.fn(async () => {
+ throw new Error('Project update is not used in this test')
+ }),
+ projects: []
}
const assistantExpert: AssistantExpert = {
id: '00000000-0000-4000-8000-000000000101',
diff --git a/src/renderer/src/SettingsPanel.tsx b/src/renderer/src/SettingsPanel.tsx
index 8cd90cd..7b6dd42 100644
--- a/src/renderer/src/SettingsPanel.tsx
+++ b/src/renderer/src/SettingsPanel.tsx
@@ -14,7 +14,9 @@ import { useTranslation } from 'react-i18next'
import type {
AssistantExpert,
AssistantHeartbeatConfig,
+ AssistantProject,
HeartbeatCreateInput,
+ ProjectCreateInput,
ProjectChannel
} from '../../shared/assistant-contracts'
import type {
@@ -78,6 +80,11 @@ type SettingsPanelProps = {
onClose: () => void
onSaved: (settings: RuntimeSettings) => void
onNotify?: (notification: AppNotificationInput) => void
+ onUpdateProject: (
+ projectId: string,
+ input: ProjectCreateInput
+ ) => Promise
+ projects: AssistantProject[]
onExpertsChanged?: (experts: AssistantExpert[]) => void
onClearLocalData: () => Promise
heartbeats: AssistantHeartbeatConfig[]
@@ -431,6 +438,8 @@ export function SettingsPanel({
onClose,
onSaved,
onNotify = () => {},
+ onUpdateProject,
+ projects,
onClearLocalData,
heartbeats,
onCreateHeartbeat,
@@ -2824,6 +2833,8 @@ export function SettingsPanel({
)}
{activeTab === 'roles' && (
diff --git a/src/renderer/src/i18n/locales/en-US/integrations.ts b/src/renderer/src/i18n/locales/en-US/integrations.ts
index 5fc9625..f06b6a1 100644
--- a/src/renderer/src/i18n/locales/en-US/integrations.ts
+++ b/src/renderer/src/i18n/locales/en-US/integrations.ts
@@ -18,6 +18,11 @@ export const integrations = {
project: {
sectionAriaLabel: '{{name}} channel project settings',
identity: 'Channel project',
+ cardTitle: 'Project settings',
+ cardDescription:
+ 'Stays synchronized with the selected channel project in the top-left project switcher.',
+ descriptionLabel: 'Project description',
+ descriptionAriaLabel: '{{name}} project description',
rootLabel: 'Default working directory',
rootAriaLabel: '{{name}} default working directory',
selectRootAriaLabel:
diff --git a/src/renderer/src/i18n/locales/zh-CN/integrations.ts b/src/renderer/src/i18n/locales/zh-CN/integrations.ts
index e88164e..983a0a6 100644
--- a/src/renderer/src/i18n/locales/zh-CN/integrations.ts
+++ b/src/renderer/src/i18n/locales/zh-CN/integrations.ts
@@ -15,6 +15,11 @@ export const integrations = {
project: {
sectionAriaLabel: '{{name}} 通道项目设置',
identity: '通道项目',
+ cardTitle: '项目设置',
+ cardDescription:
+ '与左上角当前通道项目的设置保持同步。',
+ descriptionLabel: '项目说明',
+ descriptionAriaLabel: '{{name}} 项目说明',
rootLabel: '默认工作目录',
rootAriaLabel: '{{name}} 默认工作目录',
selectRootAriaLabel: '选择 {{name}} 默认工作目录',
diff --git a/src/renderer/src/styles.css b/src/renderer/src/styles.css
index 74333a4..01adac5 100644
--- a/src/renderer/src/styles.css
+++ b/src/renderer/src/styles.css
@@ -5354,7 +5354,9 @@ details.settings-section > :not(summary) + :not(summary) {
}
.channel-settings__panel {
+ display: grid;
min-width: 0;
+ gap: var(--space-4);
}
.channel-settings__panel > .channel-settings-card {
@@ -5368,6 +5370,11 @@ details.settings-section > :not(summary) + :not(summary) {
gap: var(--space-3);
}
+.channel-project-settings--dialog {
+ padding-top: 0;
+ border-top: 0;
+}
+
.channel-project-settings__identity {
display: flex;
align-items: center;