Add skeleton MlEphantManager actor
This commit is contained in:
		
							
								
								
									
										203
									
								
								src/machines/mlEphantManagerMachine.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										203
									
								
								src/machines/mlEphantManagerMachine.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,203 @@
 | 
			
		||||
import type { Models } from '@kittycad/lib'
 | 
			
		||||
 | 
			
		||||
type Prompt = Models['TextToCad_Type']
 | 
			
		||||
 | 
			
		||||
// export interface TextToCad_type {
 | 
			
		||||
//     code?: string;
 | 
			
		||||
//     completed_at?: string;
 | 
			
		||||
//     created_at: string;
 | 
			
		||||
//     error?: string;
 | 
			
		||||
//     feedback?: MlFeedback_type;
 | 
			
		||||
//     id: Uuid_type;
 | 
			
		||||
//     kcl_version?: string;
 | 
			
		||||
//     model: TextToCadModel_type;
 | 
			
		||||
//     model_version: string;
 | 
			
		||||
//     output_format: FileExportFormat_type;
 | 
			
		||||
//     outputs: {
 | 
			
		||||
//         [key: string]: string;
 | 
			
		||||
//     };
 | 
			
		||||
//     prompt: string;
 | 
			
		||||
//     started_at?: string;
 | 
			
		||||
//     status: ApiCallStatus_type;
 | 
			
		||||
//     updated_at: string;
 | 
			
		||||
//     user_id: Uuid_type;
 | 
			
		||||
// }
 | 
			
		||||
// export interface TextToCadCreateBody_type {
 | 
			
		||||
//     kcl_version?: string;
 | 
			
		||||
//     project_name?: string;
 | 
			
		||||
//     prompt: string;
 | 
			
		||||
// }
 | 
			
		||||
// export interface TextToCadIteration_type {
 | 
			
		||||
//     code: string;
 | 
			
		||||
//     completed_at?: string;
 | 
			
		||||
//     created_at: string;
 | 
			
		||||
//     error?: string;
 | 
			
		||||
//     feedback?: MlFeedback_type;
 | 
			
		||||
//     id: Uuid_type;
 | 
			
		||||
//     model: TextToCadModel_type;
 | 
			
		||||
//     model_version: string;
 | 
			
		||||
//     original_source_code: string;
 | 
			
		||||
//     prompt?: string;
 | 
			
		||||
//     source_ranges: SourceRangePrompt_type[];
 | 
			
		||||
//     started_at?: string;
 | 
			
		||||
//     status: ApiCallStatus_type;
 | 
			
		||||
//     updated_at: string;
 | 
			
		||||
//     user_id: Uuid_type;
 | 
			
		||||
// }
 | 
			
		||||
// export interface TextToCadIterationBody_type {
 | 
			
		||||
//     kcl_version?: string;
 | 
			
		||||
//     original_source_code: string;
 | 
			
		||||
//     project_name?: string;
 | 
			
		||||
//     prompt?: string;
 | 
			
		||||
//     source_ranges: SourceRangePrompt_type[];
 | 
			
		||||
// }
 | 
			
		||||
// export interface TextToCadMultiFileIteration_type {
 | 
			
		||||
//     completed_at?: string;
 | 
			
		||||
//     created_at: string;
 | 
			
		||||
//     error?: string;
 | 
			
		||||
//     feedback?: MlFeedback_type;
 | 
			
		||||
//     id: Uuid_type;
 | 
			
		||||
//     kcl_version?: string;
 | 
			
		||||
//     model: TextToCadModel_type;
 | 
			
		||||
//     model_version: string;
 | 
			
		||||
//     outputs: {
 | 
			
		||||
//         [key: string]: string;
 | 
			
		||||
//     };
 | 
			
		||||
//     project_name?: string;
 | 
			
		||||
//     prompt?: string;
 | 
			
		||||
//     source_ranges: SourceRangePrompt_type[];
 | 
			
		||||
//     started_at?: string;
 | 
			
		||||
//     status: ApiCallStatus_type;
 | 
			
		||||
//     updated_at: string;
 | 
			
		||||
//     user_id: Uuid_type;
 | 
			
		||||
// }
 | 
			
		||||
// export interface TextToCadMultiFileIterationBody_type {
 | 
			
		||||
//     kcl_version?: string;
 | 
			
		||||
//     project_name?: string;
 | 
			
		||||
//     prompt?: string;
 | 
			
		||||
//     source_ranges: SourceRangePrompt_type[];
 | 
			
		||||
// }
 | 
			
		||||
// export interface TextToCadResultsPage_type {
 | 
			
		||||
//     items: TextToCad_type[];
 | 
			
		||||
//     next_page?: string;
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
const generateFakeSubmittedPrompt = () => ({
 | 
			
		||||
  code: Math.random().toString(),
 | 
			
		||||
  completed_at: Math.random().toString(),
 | 
			
		||||
  created_at: Math.random().toString(),
 | 
			
		||||
  error: Math.random().toString(),
 | 
			
		||||
  // declare type MlFeedback_type = 'thumbs_up' | 'thumbs_down' | 'accepted' | 'rejected';
 | 
			
		||||
  feedback: undefined,
 | 
			
		||||
  id: Math.random().toString(),
 | 
			
		||||
  kcl_version: Math.random().toString(),
 | 
			
		||||
  // export declare type TextToCadModel_type = 'cad' | 'kcl' | 'kcl_iteration'; model : 'kcl',
 | 
			
		||||
  model_version: Math.random().toString(),
 | 
			
		||||
  // export declare type FileExportFormat_type = 'fbx' | 'glb' | 'gltf' | 'obj' | 'ply' | 'step' | 'stl';
 | 
			
		||||
  output_format: 'glb',
 | 
			
		||||
  outputs: {
 | 
			
		||||
    [Math.random().toString()]: Math.random().toString(),
 | 
			
		||||
  },
 | 
			
		||||
  prompt: Math.random().toString(),
 | 
			
		||||
  started_at: Math.random().toString(),
 | 
			
		||||
  // declare type ApiCallStatus_type = 'queued' | 'uploaded' | 'in_progress' | 'completed' | 'failed';
 | 
			
		||||
  status: 'completed',
 | 
			
		||||
  updated_at: Math.random(),
 | 
			
		||||
  // declare type ApiTokenUuid_type = string;
 | 
			
		||||
  user_id: Math.random().toString(),
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
export enum MlEphantManagerTransitionStates {
 | 
			
		||||
  GetPromptsThatCreatedProjects = 'get-prompts-that-created-projects',
 | 
			
		||||
  GetPromptsBelongingToProject = 'get-prompts-belonging-to-project',
 | 
			
		||||
  PromptEditModel = 'prompt-edit-model',
 | 
			
		||||
  PromptCreateModel = 'prompt-create-model',
 | 
			
		||||
  PromptRate = 'prompt-rate',
 | 
			
		||||
  // Note, technically hiding.
 | 
			
		||||
  PromptDelete = 'prompt-delete',
 | 
			
		||||
  PromptPollStatus = 'prompt-poll-status',
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export type MlEphantManagerEvents =
 | 
			
		||||
  | {
 | 
			
		||||
      type: MlEphantManagerTransitionStates.GetPromptsThatCreatedProjects
 | 
			
		||||
    }
 | 
			
		||||
  | {
 | 
			
		||||
      type: MlEphantManagerTransitionStates.GetPromptsBelongingToProject
 | 
			
		||||
      projectId: string
 | 
			
		||||
    }
 | 
			
		||||
  | {
 | 
			
		||||
      type: MlEphantManagerTransitionStates.PromptCreateModel
 | 
			
		||||
      // May or may not belong to a project.
 | 
			
		||||
      projectId?: string
 | 
			
		||||
    }
 | 
			
		||||
  | {
 | 
			
		||||
      type: MlEphantManagerTransitionStates.PromptEditModel
 | 
			
		||||
      projectId: string
 | 
			
		||||
    }
 | 
			
		||||
  | {
 | 
			
		||||
      type: MlEphantManagerTransitionStates.PromptRate
 | 
			
		||||
      promptId: string
 | 
			
		||||
    }
 | 
			
		||||
  | {
 | 
			
		||||
      type: MlEphantManagerTransitionStates.PromptDelete
 | 
			
		||||
      promptId: string
 | 
			
		||||
    }
 | 
			
		||||
  | {
 | 
			
		||||
      type: MlEphantManagerTransitionStates.PromptPollStatus
 | 
			
		||||
      promptId: string
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
export enum MlEphantManagerStates {
 | 
			
		||||
  Idle = 'idle',
 | 
			
		||||
  Pending = 'pending',
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface MlEphantManagerContext {
 | 
			
		||||
  promptsThatCreatedProjects: Map<Prompt>
 | 
			
		||||
  // If no project is selected: undefined.
 | 
			
		||||
  promptsBelongingToProject?: Map<Prompt>
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const mlEphantDefaultContext = Object.freeze({
 | 
			
		||||
  promptsThatCreatedProjects: new Map(),
 | 
			
		||||
  promptsBelongingToProject: undefined,
 | 
			
		||||
  hasPendingPrompts: false,
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
const machine = setup({
 | 
			
		||||
  types: {
 | 
			
		||||
    context: {} as MlEphantManagerContext,
 | 
			
		||||
    events: {} as MlEphantManagerEvents,
 | 
			
		||||
  },
 | 
			
		||||
}).createMachine({
 | 
			
		||||
  initial: MlEphantManagerStates.Idle,
 | 
			
		||||
  states: {
 | 
			
		||||
    [MlEphantManagerStates.Idle]: {
 | 
			
		||||
      on: {
 | 
			
		||||
        [MlEphantManagerTransitionStates.GetPromptsThatCreatedProjects]: {
 | 
			
		||||
          target: MlEphantManagerTransitionStates.GetPromptsThatCreatedProjects,
 | 
			
		||||
        },
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
    [MlEphantManagerStates.Pending]: {
 | 
			
		||||
      states: {
 | 
			
		||||
        [MlEphantManagerTransitionStates.GetPromptsThatCreatedProjects]: {
 | 
			
		||||
          invoke: {
 | 
			
		||||
            input: (args) => args,
 | 
			
		||||
            src: fromPromise(async function (args) {
 | 
			
		||||
              console.log(arguments)
 | 
			
		||||
              return {
 | 
			
		||||
                promptsThatCreatedProjects: new Array(13)
 | 
			
		||||
                  .fill(undefined)
 | 
			
		||||
                  .map(generateFakeSubmittedPrompt),
 | 
			
		||||
              }
 | 
			
		||||
            }),
 | 
			
		||||
            onDone: { target: MlEphantManagerStates.Idle },
 | 
			
		||||
            onError: { target: MlEphantManagerStates.Idle },
 | 
			
		||||
          },
 | 
			
		||||
        },
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
})
 | 
			
		||||
		Reference in New Issue
	
	Block a user