Files
indie/frontend/src/app/llm-workspace/llm-session.service.ts
2026-07-02 01:15:16 +05:45

103 lines
3.5 KiB
TypeScript

import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable } from 'rxjs';
import { SiteStructure, GenerationVersion } from '../core/models/llm';
export interface PromptEntry {
originalPrompt: string;
refinedPrompt: string | null;
result: SiteStructure | null;
timestamp: Date;
}
@Injectable({ providedIn: 'root' })
export class LlmSessionService {
private currentPromptSubject = new BehaviorSubject<string>('');
private currentResultSubject = new BehaviorSubject<SiteStructure | null>(null);
private historySubject = new BehaviorSubject<PromptEntry[]>([]);
private generatingSubject = new BehaviorSubject<boolean>(false);
private errorSubject = new BehaviorSubject<string | null>(null);
private versionsSubject = new BehaviorSubject<GenerationVersion[]>([]);
private currentVersionIdSubject = new BehaviorSubject<string | null>(null);
private loadingVersionsSubject = new BehaviorSubject<boolean>(false);
currentPrompt$ = this.currentPromptSubject.asObservable();
currentResult$ = this.currentResultSubject.asObservable();
history$ = this.historySubject.asObservable();
generating$ = this.generatingSubject.asObservable();
error$ = this.errorSubject.asObservable();
versions$ = this.versionsSubject.asObservable();
currentVersionId$ = this.currentVersionIdSubject.asObservable();
loadingVersions$ = this.loadingVersionsSubject.asObservable();
get currentPrompt(): string { return this.currentPromptSubject.value; }
get currentResult(): SiteStructure | null { return this.currentResultSubject.value; }
get generating(): boolean { return this.generatingSubject.value; }
get error(): string | null { return this.errorSubject.value; }
get versions(): GenerationVersion[] { return this.versionsSubject.value; }
get currentVersionId(): string | null { return this.currentVersionIdSubject.value; }
setPrompt(prompt: string): void {
this.currentPromptSubject.next(prompt);
this.errorSubject.next(null);
}
setResult(result: SiteStructure): void {
this.currentResultSubject.next(result);
const entry: PromptEntry = {
originalPrompt: this.currentPromptSubject.value,
refinedPrompt: null,
result,
timestamp: new Date(),
};
const history = this.historySubject.value;
this.historySubject.next([...history, entry]);
this.generatingSubject.next(false);
this.errorSubject.next(null);
}
clearResult(): void {
this.currentResultSubject.next(null);
}
setGenerating(generating: boolean): void {
this.generatingSubject.next(generating);
}
setError(error: string): void {
this.errorSubject.next(error);
this.generatingSubject.next(false);
}
clearError(): void {
this.errorSubject.next(null);
}
clearHistory(): void {
this.historySubject.next([]);
this.currentResultSubject.next(null);
this.currentPromptSubject.next('');
this.currentVersionIdSubject.next(null);
this.errorSubject.next(null);
}
setVersions(versions: GenerationVersion[]): void {
this.versionsSubject.next(versions);
this.loadingVersionsSubject.next(false);
}
setLoadingVersions(loading: boolean): void {
this.loadingVersionsSubject.next(loading);
}
setCurrentVersionId(id: string | null): void {
this.currentVersionIdSubject.next(id);
}
loadVersionData(structure: SiteStructure, versionId: string): void {
this.currentResultSubject.next(structure);
this.currentVersionIdSubject.next(versionId);
this.generatingSubject.next(false);
this.errorSubject.next(null);
}
}