feat: support multiple event proposals in single AI response

- Change proposedChange to proposedChanges array in ChatMessage type
- Add unique id and individual respondedAction to each ProposedEventChange
- Implement arrow navigation UI for multiple proposals with "Event X von Y" counter
- Add updateProposalResponse() method for per-proposal confirm/reject tracking
- GPTAdapter now collects multiple tool call results into proposals array
- Add RRULE documentation to system prompt (separate events for different times)
- Fix RRULE parsing to strip RRULE: prefix if present
- Add log summarization for large args (conversationHistory, existingEvents)
- Keep proposedChanges logged in full for debugging AI issues
This commit is contained in:
2026-01-10 23:30:32 +01:00
parent 8efe6c304e
commit e6b9dd9d34
18 changed files with 533 additions and 158 deletions

View File

@@ -7,10 +7,12 @@ export type EventAction = "create" | "update" | "delete";
export type RespondedAction = "confirm" | "reject";
export interface ProposedEventChange {
id: string; // Unique ID for each proposal
action: EventAction;
eventId?: string; // Required for update/delete
event?: CreateEventDTO; // Required for create
updates?: UpdateEventDTO; // Required for update
respondedAction?: RespondedAction; // User's response to this specific proposal
}
export interface ChatMessage {
@@ -18,8 +20,7 @@ export interface ChatMessage {
conversationId: string;
sender: MessageSender;
content: string;
proposedChange?: ProposedEventChange;
respondedAction?: RespondedAction;
proposedChanges?: ProposedEventChange[]; // Array of event proposals
createdAt?: Date;
}
@@ -38,7 +39,7 @@ export interface SendMessageDTO {
export interface CreateMessageDTO {
sender: MessageSender;
content: string;
proposedChange?: ProposedEventChange;
proposedChanges?: ProposedEventChange[];
}
export interface GetMessagesOptions {
@@ -47,6 +48,7 @@ export interface GetMessagesOptions {
}
export interface UpdateMessageDTO {
proposalId?: string; // Identifies which proposal to update
respondedAction?: RespondedAction;
}