@@ -67,6 +67,9 @@ export class ModelEditorView extends AbstractWebview<
6767 private readonly autoModeler : AutoModeler ;
6868 private readonly modelEvaluator : ModelEvaluator ;
6969 private readonly languageDefinition : ModelsAsDataLanguage ;
70+ // Cancellation token source that can be used for passing into long-running operations. Should only
71+ // be cancelled when the view is closed
72+ private readonly cancellationTokenSource = new CancellationTokenSource ( ) ;
7073
7174 public constructor (
7275 protected readonly app : App ,
@@ -86,6 +89,12 @@ export class ModelEditorView extends AbstractWebview<
8689 ) {
8790 super ( app ) ;
8891
92+ this . push ( {
93+ dispose : ( ) => {
94+ this . cancellationTokenSource . cancel ( ) ;
95+ } ,
96+ } ) ;
97+
8998 this . modelingStore . initializeStateForDb ( databaseItem , initialMode ) ;
9099 this . registerToModelingEvents ( ) ;
91100 this . registerToModelConfigEvents ( ) ;
@@ -378,6 +387,8 @@ export class ModelEditorView extends AbstractWebview<
378387 this . setViewState ( ) ,
379388 withProgress ( ( progress , token ) => this . loadMethods ( progress , token ) , {
380389 cancellable : true ,
390+ } ) . then ( async ( ) => {
391+ await this . generateModeledMethodsOnStartup ( ) ;
381392 } ) ,
382393 this . loadExistingModeledMethods ( ) ,
383394 // Only load access path suggestions if the feature is enabled
@@ -482,7 +493,7 @@ export class ModelEditorView extends AbstractWebview<
482493
483494 try {
484495 if ( ! token ) {
485- token = new CancellationTokenSource ( ) . token ;
496+ token = this . cancellationTokenSource . token ;
486497 }
487498 const queryResult = await runModelEditorQueries ( mode , {
488499 cliServer : this . cliServer ,
@@ -533,8 +544,6 @@ export class ModelEditorView extends AbstractWebview<
533544 protected async loadAccessPathSuggestions (
534545 progress : ProgressCallback ,
535546 ) : Promise < void > {
536- const tokenSource = new CancellationTokenSource ( ) ;
537-
538547 const mode = this . modelingStore . getMode ( this . databaseItem ) ;
539548
540549 const modelsAsDataLanguage = getModelsAsDataLanguage ( this . language ) ;
@@ -557,7 +566,7 @@ export class ModelEditorView extends AbstractWebview<
557566 queryStorageDir : this . queryStorageDir ,
558567 databaseItem : this . databaseItem ,
559568 progress,
560- token : tokenSource . token ,
569+ token : this . cancellationTokenSource . token ,
561570 logger : this . app . logger ,
562571 } ) ;
563572
@@ -588,8 +597,6 @@ export class ModelEditorView extends AbstractWebview<
588597 protected async generateModeledMethods ( ) : Promise < void > {
589598 await withProgress (
590599 async ( progress ) => {
591- const tokenSource = new CancellationTokenSource ( ) ;
592-
593600 const mode = this . modelingStore . getMode ( this . databaseItem ) ;
594601
595602 const modelsAsDataLanguage = getModelsAsDataLanguage ( this . language ) ;
@@ -647,7 +654,7 @@ export class ModelEditorView extends AbstractWebview<
647654 queryStorageDir : this . queryStorageDir ,
648655 databaseItem : addedDatabase ?? this . databaseItem ,
649656 progress,
650- token : tokenSource . token ,
657+ token : this . cancellationTokenSource . token ,
651658 } ) ;
652659 } catch ( e : unknown ) {
653660 void showAndLogExceptionWithTelemetry (
@@ -663,6 +670,70 @@ export class ModelEditorView extends AbstractWebview<
663670 ) ;
664671 }
665672
673+ protected async generateModeledMethodsOnStartup ( ) : Promise < void > {
674+ const mode = this . modelingStore . getMode ( this . databaseItem ) ;
675+ if ( mode !== Mode . Framework ) {
676+ return ;
677+ }
678+
679+ const modelsAsDataLanguage = getModelsAsDataLanguage ( this . language ) ;
680+ const modelGeneration = modelsAsDataLanguage . modelGeneration ;
681+ const autoRun = modelGeneration ?. autoRun ;
682+
683+ if ( modelGeneration === undefined || autoRun === undefined ) {
684+ return ;
685+ }
686+
687+ await withProgress (
688+ async ( progress ) => {
689+ progress ( {
690+ step : 0 ,
691+ maxStep : 4000 ,
692+ message : "Generating models" ,
693+ } ) ;
694+
695+ const parseResults =
696+ autoRun . parseResults ?? modelGeneration . parseResults ;
697+
698+ try {
699+ await runGenerateQueries ( {
700+ queryConstraints : modelGeneration . queryConstraints ( mode ) ,
701+ filterQueries : modelGeneration . filterQueries ,
702+ parseResults : ( queryPath , results ) =>
703+ parseResults (
704+ queryPath ,
705+ results ,
706+ modelsAsDataLanguage ,
707+ this . app . logger ,
708+ ) ,
709+ onResults : async ( modeledMethods ) => {
710+ this . addModeledMethodsFromArray ( modeledMethods ) ;
711+ } ,
712+ cliServer : this . cliServer ,
713+ queryRunner : this . queryRunner ,
714+ queryStorageDir : this . queryStorageDir ,
715+ databaseItem : this . databaseItem ,
716+ progress,
717+ token : this . cancellationTokenSource . token ,
718+ } ) ;
719+ } catch ( e : unknown ) {
720+ void showAndLogExceptionWithTelemetry (
721+ this . app . logger ,
722+ this . app . telemetry ,
723+ redactableError (
724+ asError ( e ) ,
725+ ) `Failed to auto-run generating models: ${ getErrorMessage ( e ) } ` ,
726+ ) ;
727+ }
728+ } ,
729+ {
730+ cancellable : false ,
731+ location : ProgressLocation . Window ,
732+ title : "Generating models" ,
733+ } ,
734+ ) ;
735+ }
736+
666737 private async generateModeledMethodsFromLlm (
667738 packageName : string ,
668739 methodSignatures : string [ ] ,
0 commit comments