WIP - create records via AI Assistant more flexible and dynamic

This commit is contained in:
Francisco Gaona
2026-01-18 08:47:51 +01:00
parent c822017ef1
commit 4f466d7992
2 changed files with 1148 additions and 238 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -12,16 +12,92 @@ export interface AiChatContext {
export interface AiAssistantReply { export interface AiAssistantReply {
reply: string; reply: string;
action?: 'create_record' | 'collect_fields' | 'clarify'; action?: 'create_record' | 'collect_fields' | 'clarify' | 'plan_complete' | 'plan_pending';
missingFields?: string[]; missingFields?: string[];
record?: any; record?: any;
records?: any[]; // Multiple records when plan execution completes
plan?: RecordCreationPlan;
} }
// ============================================
// Entity Discovery Types
// ============================================
export interface EntityFieldInfo {
apiName: string;
label: string;
type: string;
isRequired: boolean;
isSystem: boolean;
referenceObject?: string; // For LOOKUP fields, the target entity
description?: string;
}
export interface EntityRelationship {
fieldApiName: string;
fieldLabel: string;
targetEntity: string;
relationshipType: 'lookup' | 'master-detail' | 'polymorphic';
}
export interface EntityInfo {
apiName: string;
label: string;
pluralLabel?: string;
description?: string;
fields: EntityFieldInfo[];
requiredFields: string[]; // Field apiNames that are required
relationships: EntityRelationship[];
}
export interface SystemEntities {
entities: EntityInfo[];
entityByApiName: Record<string, EntityInfo>; // Changed from Map for state serialization
loadedAt: number;
}
// ============================================
// Planning Types
// ============================================
export interface PlannedRecord {
id: string; // Temporary ID for planning (e.g., "temp_account_1")
entityApiName: string;
entityLabel: string;
fields: Record<string, any>;
missingRequiredFields: string[];
dependsOn: string[]; // IDs of other planned records this depends on
status: 'pending' | 'ready' | 'created' | 'failed';
createdRecordId?: string; // Actual ID after creation
error?: string;
}
export interface RecordCreationPlan {
id: string;
records: PlannedRecord[];
executionOrder: string[]; // Ordered list of planned record IDs
status: 'building' | 'incomplete' | 'ready' | 'executing' | 'completed' | 'failed';
createdRecords: any[];
errors: string[];
}
// ============================================
// State Types
// ============================================
export interface AiAssistantState { export interface AiAssistantState {
message: string; message: string;
messages?: any[]; // BaseMessage[] from langchain - used when invoked by Deep Agent messages?: any[]; // BaseMessage[] from langchain - used when invoked by Deep Agent
history?: AiChatMessage[]; history?: AiChatMessage[];
context: AiChatContext; context: AiChatContext;
// Entity discovery
systemEntities?: SystemEntities;
// Planning
plan?: RecordCreationPlan;
// Legacy fields (kept for compatibility during transition)
objectDefinition?: any; objectDefinition?: any;
pageLayout?: any; pageLayout?: any;
extractedFields?: Record<string, any>; extractedFields?: Record<string, any>;