92 lines
4.1 KiB
TypeScript
92 lines
4.1 KiB
TypeScript
// ----------------------------------------------- Obsidian Imports ----------------------------------------------------------
|
||
import { App, Modal, Setting } from 'obsidian';
|
||
|
||
// ----------------------------------------------- Interfaces ----------------------------------------------------------------
|
||
/**
|
||
* Интерфейс для свойств, передаваемых в модальное окно GraphSettingsModal.
|
||
*/
|
||
interface GraphSettingsModalProps {
|
||
app: App;
|
||
graphId: string;
|
||
graphTitle: string;
|
||
initialCustomSystemPrompt: string | null;
|
||
onSave: (graphId: string, customSystemPrompt: string | null) => Promise<void>;
|
||
}
|
||
|
||
// ----------------------------------------------- GraphSettingsModal --------------------------------------------------------
|
||
/**
|
||
* Модальное окно для настройки специфического системного промпта для конкретного графа.
|
||
*/
|
||
export class GraphSettingsModal extends Modal {
|
||
private graphId: string;
|
||
private graphTitle: string;
|
||
private customSystemPrompt: string | null;
|
||
private initialCustomSystemPrompt: string | null;
|
||
private onSave: (graphId: string, customSystemPrompt: string | null) => Promise<void>;
|
||
|
||
constructor(app: App, props: GraphSettingsModalProps) {
|
||
super(app);
|
||
this.graphId = props.graphId;
|
||
this.graphTitle = props.graphTitle;
|
||
this.customSystemPrompt = props.initialCustomSystemPrompt;
|
||
this.initialCustomSystemPrompt = props.initialCustomSystemPrompt;
|
||
this.onSave = props.onSave;
|
||
|
||
this.titleEl.setText(`Настройки графа: ${this.graphTitle}`);
|
||
this.modalEl.addClass('llm-agent-graph-settings-modal');
|
||
}
|
||
|
||
onOpen(): void {
|
||
const { contentEl } = this;
|
||
contentEl.empty();
|
||
|
||
// ----------------------------------------------- System Prompt Setting ------------------------------------------------
|
||
new Setting(contentEl)
|
||
.setName('Пользовательский системный промпт')
|
||
.setDesc('Этот промпт будет использоваться для данного графа вместо глобального системного промпта. Оставьте пустым, чтобы использовать глобальный промпт.')
|
||
.addTextArea(textArea => {
|
||
textArea
|
||
.setPlaceholder('Введите пользовательский системный промпт для этого графа...')
|
||
.setValue(this.customSystemPrompt || '')
|
||
.onChange(value => {
|
||
this.customSystemPrompt = value.trim() === '' ? null : value.trim();
|
||
});
|
||
textArea.inputEl.rows = 6;
|
||
textArea.inputEl.style.minWidth = '400px';
|
||
textArea.inputEl.style.width = '100%';
|
||
});
|
||
|
||
// ----------------------------------------------- Action Buttons -------------------------------------------------------
|
||
new Setting(contentEl)
|
||
.addButton(button => {
|
||
button
|
||
.setButtonText('Сохранить')
|
||
.setCta()
|
||
.onClick(async () => {
|
||
await this.onSave(this.graphId, this.customSystemPrompt);
|
||
this.close();
|
||
});
|
||
})
|
||
.addButton(button => {
|
||
button
|
||
.setButtonText('Сбросить на глобальный')
|
||
.setClass('mod-warning')
|
||
.onClick(async () => {
|
||
await this.onSave(this.graphId, null); // Отправляем null для сброса
|
||
this.close();
|
||
});
|
||
})
|
||
.addButton(button => {
|
||
button
|
||
.setButtonText('Отмена')
|
||
.onClick(() => {
|
||
this.close();
|
||
});
|
||
});
|
||
}
|
||
|
||
onClose(): void {
|
||
const { contentEl } = this;
|
||
contentEl.empty();
|
||
}
|
||
} |