From 4c4820f76af7bc9168a517116456bd06a48c9298 Mon Sep 17 00:00:00 2001 From: Robert Date: Mon, 19 Feb 2024 16:35:34 +0000 Subject: [PATCH 1/3] add sentToLLM to ModelingStore --- .../ql-vscode/src/common/interface-types.ts | 6 ++++ .../src/model-editor/auto-modeler.ts | 6 ++++ .../src/model-editor/model-editor-view.ts | 11 +++++++ .../src/model-editor/modeling-events.ts | 26 ++++++++++++++++ .../src/model-editor/modeling-store.ts | 30 +++++++++++++++++++ .../src/view/model-editor/ModelEditor.tsx | 4 +++ 6 files changed, 83 insertions(+) diff --git a/extensions/ql-vscode/src/common/interface-types.ts b/extensions/ql-vscode/src/common/interface-types.ts index c885683fb..e833c44e8 100644 --- a/extensions/ql-vscode/src/common/interface-types.ts +++ b/extensions/ql-vscode/src/common/interface-types.ts @@ -543,6 +543,11 @@ interface SetInProgressMethodsMessage { methods: string[]; } +interface SetSentToLLMMethodsMessage { + t: "setSentToLLMMethods"; + methods: string[]; +} + interface SwitchModeMessage { t: "switchMode"; mode: Mode; @@ -626,6 +631,7 @@ export type ToModelEditorMessage = | SetModeledMethodsMessage | SetModifiedMethodsMessage | SetInProgressMethodsMessage + | SetSentToLLMMethodsMessage | RevealMethodMessage | SetAccessPathSuggestionsMessage; diff --git a/extensions/ql-vscode/src/model-editor/auto-modeler.ts b/extensions/ql-vscode/src/model-editor/auto-modeler.ts index 3d7549112..a51a0ccc1 100644 --- a/extensions/ql-vscode/src/model-editor/auto-modeler.ts +++ b/extensions/ql-vscode/src/model-editor/auto-modeler.ts @@ -159,6 +159,12 @@ export class AutoModeler { this.databaseItem, candidateSignatures, ); + + // Let the UI know which methods have been sent to the LLM + this.modelingStore.addSentToLLMMethods( + this.databaseItem, + candidateSignatures, + ); } } finally { // Clear out in progress methods in case anything went wrong diff --git a/extensions/ql-vscode/src/model-editor/model-editor-view.ts b/extensions/ql-vscode/src/model-editor/model-editor-view.ts index 7e0bead8e..c09ea8df6 100644 --- a/extensions/ql-vscode/src/model-editor/model-editor-view.ts +++ b/extensions/ql-vscode/src/model-editor/model-editor-view.ts @@ -835,6 +835,17 @@ export class ModelEditorView extends AbstractWebview< }), ); + this.push( + this.modelingEvents.onSentToLLMMethodsChanged(async (event) => { + if (event.dbUri === this.databaseItem.databaseUri.toString()) { + await this.postMessage({ + t: "setSentToLLMMethods", + methods: Array.from(event.methods), + }); + } + }), + ); + this.push( this.modelingEvents.onRevealInModelEditor(async (event) => { if (event.dbUri === this.databaseItem.databaseUri.toString()) { diff --git a/extensions/ql-vscode/src/model-editor/modeling-events.ts b/extensions/ql-vscode/src/model-editor/modeling-events.ts index 81eda6ffa..85d952d6e 100644 --- a/extensions/ql-vscode/src/model-editor/modeling-events.ts +++ b/extensions/ql-vscode/src/model-editor/modeling-events.ts @@ -42,6 +42,7 @@ interface SelectedMethodChangedEvent { readonly modeledMethods: readonly ModeledMethod[]; readonly isModified: boolean; readonly isInProgress: boolean; + readonly hasBeenSentToLLM: boolean; } interface InProgressMethodsChangedEvent { @@ -49,6 +50,11 @@ interface InProgressMethodsChangedEvent { readonly methods: ReadonlySet; } +interface SentToLLMMethodsChangedEvent { + readonly dbUri: string; + readonly methods: ReadonlySet; +} + interface RevealInModelEditorEvent { dbUri: string; method: Method; @@ -69,6 +75,7 @@ export class ModelingEvents extends DisposableObject { public readonly onModifiedMethodsChanged: AppEvent; public readonly onSelectedMethodChanged: AppEvent; public readonly onInProgressMethodsChanged: AppEvent; + public readonly onSentToLLMMethodsChanged: AppEvent; public readonly onRevealInModelEditor: AppEvent; public readonly onFocusModelEditor: AppEvent; @@ -82,6 +89,7 @@ export class ModelingEvents extends DisposableObject { private readonly onModifiedMethodsChangedEventEmitter: AppEventEmitter; private readonly onSelectedMethodChangedEventEmitter: AppEventEmitter; private readonly onInProgressMethodsChangedEventEmitter: AppEventEmitter; + private readonly onSentToLLMMethodsChangedEventEmitter: AppEventEmitter; private readonly onRevealInModelEditorEventEmitter: AppEventEmitter; private readonly onFocusModelEditorEventEmitter: AppEventEmitter; @@ -141,6 +149,12 @@ export class ModelingEvents extends DisposableObject { this.onInProgressMethodsChanged = this.onInProgressMethodsChangedEventEmitter.event; + this.onSentToLLMMethodsChangedEventEmitter = this.push( + app.createEventEmitter(), + ); + this.onSentToLLMMethodsChanged = + this.onSentToLLMMethodsChangedEventEmitter.event; + this.onRevealInModelEditorEventEmitter = this.push( app.createEventEmitter(), ); @@ -226,6 +240,7 @@ export class ModelingEvents extends DisposableObject { modeledMethods: ModeledMethod[], isModified: boolean, isInProgress: boolean, + hasBeenSentToLLM: boolean, ) { this.onSelectedMethodChangedEventEmitter.fire({ databaseItem, @@ -234,6 +249,7 @@ export class ModelingEvents extends DisposableObject { modeledMethods, isModified, isInProgress, + hasBeenSentToLLM, }); } @@ -247,6 +263,16 @@ export class ModelingEvents extends DisposableObject { }); } + public fireSentToLLMMethodsChangedEvent( + dbUri: string, + methods: ReadonlySet, + ) { + this.onSentToLLMMethodsChangedEventEmitter.fire({ + dbUri, + methods, + }); + } + public fireRevealInModelEditorEvent(dbUri: string, method: Method) { this.onRevealInModelEditorEventEmitter.fire({ dbUri, diff --git a/extensions/ql-vscode/src/model-editor/modeling-store.ts b/extensions/ql-vscode/src/model-editor/modeling-store.ts index f57a9726c..66c5fee08 100644 --- a/extensions/ql-vscode/src/model-editor/modeling-store.ts +++ b/extensions/ql-vscode/src/model-editor/modeling-store.ts @@ -14,6 +14,7 @@ interface InternalDbModelingState { modeledMethods: Record; modifiedMethodSignatures: Set; inProgressMethods: Set; + sentToLLMMethods: Set; selectedMethod: Method | undefined; selectedUsage: Usage | undefined; } @@ -26,6 +27,7 @@ interface DbModelingState { readonly modeledMethods: Readonly>; readonly modifiedMethodSignatures: ReadonlySet; readonly inProgressMethods: ReadonlySet; + readonly sentToLLMMethods: ReadonlySet; readonly selectedMethod: Method | undefined; readonly selectedUsage: Usage | undefined; } @@ -37,6 +39,7 @@ interface SelectedMethodDetails { readonly modeledMethods: readonly ModeledMethod[]; readonly isModified: boolean; readonly isInProgress: boolean; + readonly hasBeenSentToLLM: boolean; } export class ModelingStore extends DisposableObject { @@ -59,6 +62,7 @@ export class ModelingStore extends DisposableObject { mode, modeledMethods: {}, modifiedMethodSignatures: new Set(), + sentToLLMMethods: new Set(), selectedMethod: undefined, selectedUsage: undefined, inProgressMethods: new Set(), @@ -301,6 +305,7 @@ export class ModelingStore extends DisposableObject { const modeledMethods = dbState.modeledMethods[method.signature] ?? []; const isModified = dbState.modifiedMethodSignatures.has(method.signature); const isInProgress = dbState.inProgressMethods.has(method.signature); + const hasBeenSentToLLM = dbState.sentToLLMMethods.has(method.signature); this.modelingEvents.fireSelectedMethodChangedEvent( dbItem, method, @@ -308,6 +313,7 @@ export class ModelingStore extends DisposableObject { modeledMethods, isModified, isInProgress, + hasBeenSentToLLM, ); } @@ -336,6 +342,15 @@ export class ModelingStore extends DisposableObject { }); } + public addSentToLLMMethods(dbItem: DatabaseItem, sentToLLMMethods: string[]) { + this.changeSentToLLMMethods(dbItem, (state) => { + state.sentToLLMMethods = new Set([ + ...state.sentToLLMMethods, + ...sentToLLMMethods, + ]); + }); + } + public getSelectedMethodDetails(): SelectedMethodDetails | undefined { const dbState = this.getInternalStateForActiveDb(); if (!dbState) { @@ -356,6 +371,7 @@ export class ModelingStore extends DisposableObject { selectedMethod.signature, ), isInProgress: dbState.inProgressMethods.has(selectedMethod.signature), + hasBeenSentToLLM: dbState.sentToLLMMethods.has(selectedMethod.signature), }; } @@ -412,4 +428,18 @@ export class ModelingStore extends DisposableObject { state.inProgressMethods, ); } + + private changeSentToLLMMethods( + dbItem: DatabaseItem, + updateState: (state: InternalDbModelingState) => void, + ) { + const state = this.getState(dbItem); + + updateState(state); + + this.modelingEvents.fireSentToLLMMethodsChangedEvent( + dbItem.databaseUri.toString(), + state.sentToLLMMethods, + ); + } } diff --git a/extensions/ql-vscode/src/view/model-editor/ModelEditor.tsx b/extensions/ql-vscode/src/view/model-editor/ModelEditor.tsx index 31b36cff3..721e79723 100644 --- a/extensions/ql-vscode/src/view/model-editor/ModelEditor.tsx +++ b/extensions/ql-vscode/src/view/model-editor/ModelEditor.tsx @@ -148,6 +148,10 @@ export function ModelEditor({ setInProgressMethods(new Set(msg.methods)); break; } + case "setSentToLLMMethods": { + // TODO: set state + break; + } case "revealMethod": setRevealedMethodSignature(msg.methodSignature); break; From f98c5319cb2b706ac12990cb89776cddcbe1af76 Mon Sep 17 00:00:00 2001 From: Robert Date: Tue, 20 Feb 2024 09:41:44 +0000 Subject: [PATCH 2/3] Rename to processedByAutoModel --- .../ql-vscode/src/common/interface-types.ts | 6 +-- .../src/model-editor/auto-modeler.ts | 2 +- .../src/model-editor/model-editor-view.ts | 18 +++++---- .../src/model-editor/modeling-events.ts | 24 ++++++------ .../src/model-editor/modeling-store.ts | 37 +++++++++++-------- .../src/view/model-editor/ModelEditor.tsx | 2 +- 6 files changed, 49 insertions(+), 40 deletions(-) diff --git a/extensions/ql-vscode/src/common/interface-types.ts b/extensions/ql-vscode/src/common/interface-types.ts index e833c44e8..cc7c60f16 100644 --- a/extensions/ql-vscode/src/common/interface-types.ts +++ b/extensions/ql-vscode/src/common/interface-types.ts @@ -543,8 +543,8 @@ interface SetInProgressMethodsMessage { methods: string[]; } -interface SetSentToLLMMethodsMessage { - t: "setSentToLLMMethods"; +interface SetProcessedByAutoModelMethodsMessage { + t: "setProcessedByAutoModelMethods"; methods: string[]; } @@ -631,7 +631,7 @@ export type ToModelEditorMessage = | SetModeledMethodsMessage | SetModifiedMethodsMessage | SetInProgressMethodsMessage - | SetSentToLLMMethodsMessage + | SetProcessedByAutoModelMethodsMessage | RevealMethodMessage | SetAccessPathSuggestionsMessage; diff --git a/extensions/ql-vscode/src/model-editor/auto-modeler.ts b/extensions/ql-vscode/src/model-editor/auto-modeler.ts index a51a0ccc1..4e7324f63 100644 --- a/extensions/ql-vscode/src/model-editor/auto-modeler.ts +++ b/extensions/ql-vscode/src/model-editor/auto-modeler.ts @@ -161,7 +161,7 @@ export class AutoModeler { ); // Let the UI know which methods have been sent to the LLM - this.modelingStore.addSentToLLMMethods( + this.modelingStore.addProcessedByAutoModelMethods( this.databaseItem, candidateSignatures, ); diff --git a/extensions/ql-vscode/src/model-editor/model-editor-view.ts b/extensions/ql-vscode/src/model-editor/model-editor-view.ts index c09ea8df6..98ff4c4be 100644 --- a/extensions/ql-vscode/src/model-editor/model-editor-view.ts +++ b/extensions/ql-vscode/src/model-editor/model-editor-view.ts @@ -836,14 +836,16 @@ export class ModelEditorView extends AbstractWebview< ); this.push( - this.modelingEvents.onSentToLLMMethodsChanged(async (event) => { - if (event.dbUri === this.databaseItem.databaseUri.toString()) { - await this.postMessage({ - t: "setSentToLLMMethods", - methods: Array.from(event.methods), - }); - } - }), + this.modelingEvents.onProcessedByAutoModelMethodsChanged( + async (event) => { + if (event.dbUri === this.databaseItem.databaseUri.toString()) { + await this.postMessage({ + t: "setProcessedByAutoModelMethods", + methods: Array.from(event.methods), + }); + } + }, + ), ); this.push( diff --git a/extensions/ql-vscode/src/model-editor/modeling-events.ts b/extensions/ql-vscode/src/model-editor/modeling-events.ts index 85d952d6e..8b99f726a 100644 --- a/extensions/ql-vscode/src/model-editor/modeling-events.ts +++ b/extensions/ql-vscode/src/model-editor/modeling-events.ts @@ -42,7 +42,7 @@ interface SelectedMethodChangedEvent { readonly modeledMethods: readonly ModeledMethod[]; readonly isModified: boolean; readonly isInProgress: boolean; - readonly hasBeenSentToLLM: boolean; + readonly processedByAutoModel: boolean; } interface InProgressMethodsChangedEvent { @@ -50,7 +50,7 @@ interface InProgressMethodsChangedEvent { readonly methods: ReadonlySet; } -interface SentToLLMMethodsChangedEvent { +interface ProcessedByAutoModelMethodsChangedEvent { readonly dbUri: string; readonly methods: ReadonlySet; } @@ -75,7 +75,7 @@ export class ModelingEvents extends DisposableObject { public readonly onModifiedMethodsChanged: AppEvent; public readonly onSelectedMethodChanged: AppEvent; public readonly onInProgressMethodsChanged: AppEvent; - public readonly onSentToLLMMethodsChanged: AppEvent; + public readonly onProcessedByAutoModelMethodsChanged: AppEvent; public readonly onRevealInModelEditor: AppEvent; public readonly onFocusModelEditor: AppEvent; @@ -89,7 +89,7 @@ export class ModelingEvents extends DisposableObject { private readonly onModifiedMethodsChangedEventEmitter: AppEventEmitter; private readonly onSelectedMethodChangedEventEmitter: AppEventEmitter; private readonly onInProgressMethodsChangedEventEmitter: AppEventEmitter; - private readonly onSentToLLMMethodsChangedEventEmitter: AppEventEmitter; + private readonly onProcessedByAutoModelMethodsChangedEventEmitter: AppEventEmitter; private readonly onRevealInModelEditorEventEmitter: AppEventEmitter; private readonly onFocusModelEditorEventEmitter: AppEventEmitter; @@ -149,11 +149,11 @@ export class ModelingEvents extends DisposableObject { this.onInProgressMethodsChanged = this.onInProgressMethodsChangedEventEmitter.event; - this.onSentToLLMMethodsChangedEventEmitter = this.push( - app.createEventEmitter(), + this.onProcessedByAutoModelMethodsChangedEventEmitter = this.push( + app.createEventEmitter(), ); - this.onSentToLLMMethodsChanged = - this.onSentToLLMMethodsChangedEventEmitter.event; + this.onProcessedByAutoModelMethodsChanged = + this.onProcessedByAutoModelMethodsChangedEventEmitter.event; this.onRevealInModelEditorEventEmitter = this.push( app.createEventEmitter(), @@ -240,7 +240,7 @@ export class ModelingEvents extends DisposableObject { modeledMethods: ModeledMethod[], isModified: boolean, isInProgress: boolean, - hasBeenSentToLLM: boolean, + processedByAutoModel: boolean, ) { this.onSelectedMethodChangedEventEmitter.fire({ databaseItem, @@ -249,7 +249,7 @@ export class ModelingEvents extends DisposableObject { modeledMethods, isModified, isInProgress, - hasBeenSentToLLM, + processedByAutoModel, }); } @@ -263,11 +263,11 @@ export class ModelingEvents extends DisposableObject { }); } - public fireSentToLLMMethodsChangedEvent( + public fireProcessedByAutoModelMethodsChangedEvent( dbUri: string, methods: ReadonlySet, ) { - this.onSentToLLMMethodsChangedEventEmitter.fire({ + this.onProcessedByAutoModelMethodsChangedEventEmitter.fire({ dbUri, methods, }); diff --git a/extensions/ql-vscode/src/model-editor/modeling-store.ts b/extensions/ql-vscode/src/model-editor/modeling-store.ts index 66c5fee08..f45e3892b 100644 --- a/extensions/ql-vscode/src/model-editor/modeling-store.ts +++ b/extensions/ql-vscode/src/model-editor/modeling-store.ts @@ -14,7 +14,7 @@ interface InternalDbModelingState { modeledMethods: Record; modifiedMethodSignatures: Set; inProgressMethods: Set; - sentToLLMMethods: Set; + processedByAutoModelMethods: Set; selectedMethod: Method | undefined; selectedUsage: Usage | undefined; } @@ -27,7 +27,7 @@ interface DbModelingState { readonly modeledMethods: Readonly>; readonly modifiedMethodSignatures: ReadonlySet; readonly inProgressMethods: ReadonlySet; - readonly sentToLLMMethods: ReadonlySet; + readonly processedByAutoModelMethods: ReadonlySet; readonly selectedMethod: Method | undefined; readonly selectedUsage: Usage | undefined; } @@ -39,7 +39,7 @@ interface SelectedMethodDetails { readonly modeledMethods: readonly ModeledMethod[]; readonly isModified: boolean; readonly isInProgress: boolean; - readonly hasBeenSentToLLM: boolean; + readonly processedByAutoModel: boolean; } export class ModelingStore extends DisposableObject { @@ -62,7 +62,7 @@ export class ModelingStore extends DisposableObject { mode, modeledMethods: {}, modifiedMethodSignatures: new Set(), - sentToLLMMethods: new Set(), + processedByAutoModelMethods: new Set(), selectedMethod: undefined, selectedUsage: undefined, inProgressMethods: new Set(), @@ -305,7 +305,9 @@ export class ModelingStore extends DisposableObject { const modeledMethods = dbState.modeledMethods[method.signature] ?? []; const isModified = dbState.modifiedMethodSignatures.has(method.signature); const isInProgress = dbState.inProgressMethods.has(method.signature); - const hasBeenSentToLLM = dbState.sentToLLMMethods.has(method.signature); + const processedByAutoModel = dbState.processedByAutoModelMethods.has( + method.signature, + ); this.modelingEvents.fireSelectedMethodChangedEvent( dbItem, method, @@ -313,7 +315,7 @@ export class ModelingStore extends DisposableObject { modeledMethods, isModified, isInProgress, - hasBeenSentToLLM, + processedByAutoModel, ); } @@ -342,11 +344,14 @@ export class ModelingStore extends DisposableObject { }); } - public addSentToLLMMethods(dbItem: DatabaseItem, sentToLLMMethods: string[]) { - this.changeSentToLLMMethods(dbItem, (state) => { - state.sentToLLMMethods = new Set([ - ...state.sentToLLMMethods, - ...sentToLLMMethods, + public addProcessedByAutoModelMethods( + dbItem: DatabaseItem, + processedByAutoModelMethods: string[], + ) { + this.changeProcessedByAutoModelMethods(dbItem, (state) => { + state.processedByAutoModelMethods = new Set([ + ...state.processedByAutoModelMethods, + ...processedByAutoModelMethods, ]); }); } @@ -371,7 +376,9 @@ export class ModelingStore extends DisposableObject { selectedMethod.signature, ), isInProgress: dbState.inProgressMethods.has(selectedMethod.signature), - hasBeenSentToLLM: dbState.sentToLLMMethods.has(selectedMethod.signature), + processedByAutoModel: dbState.processedByAutoModelMethods.has( + selectedMethod.signature, + ), }; } @@ -429,7 +436,7 @@ export class ModelingStore extends DisposableObject { ); } - private changeSentToLLMMethods( + private changeProcessedByAutoModelMethods( dbItem: DatabaseItem, updateState: (state: InternalDbModelingState) => void, ) { @@ -437,9 +444,9 @@ export class ModelingStore extends DisposableObject { updateState(state); - this.modelingEvents.fireSentToLLMMethodsChangedEvent( + this.modelingEvents.fireProcessedByAutoModelMethodsChangedEvent( dbItem.databaseUri.toString(), - state.sentToLLMMethods, + state.processedByAutoModelMethods, ); } } diff --git a/extensions/ql-vscode/src/view/model-editor/ModelEditor.tsx b/extensions/ql-vscode/src/view/model-editor/ModelEditor.tsx index 721e79723..0a8079b74 100644 --- a/extensions/ql-vscode/src/view/model-editor/ModelEditor.tsx +++ b/extensions/ql-vscode/src/view/model-editor/ModelEditor.tsx @@ -148,7 +148,7 @@ export function ModelEditor({ setInProgressMethods(new Set(msg.methods)); break; } - case "setSentToLLMMethods": { + case "setProcessedByAutoModelMethods": { // TODO: set state break; } From 67f46b7fb2382e69c882833c22bd6f6950adcd79 Mon Sep 17 00:00:00 2001 From: Robert Date: Tue, 20 Feb 2024 09:47:37 +0000 Subject: [PATCH 3/3] Add processedByAUtoModel to modelingEventsMock --- .../test/__mocks__/model-editor/modelingEventsMock.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/extensions/ql-vscode/test/__mocks__/model-editor/modelingEventsMock.ts b/extensions/ql-vscode/test/__mocks__/model-editor/modelingEventsMock.ts index 3c4a8eaa6..3444f946c 100644 --- a/extensions/ql-vscode/test/__mocks__/model-editor/modelingEventsMock.ts +++ b/extensions/ql-vscode/test/__mocks__/model-editor/modelingEventsMock.ts @@ -10,6 +10,7 @@ export function createMockModelingEvents({ onModeledMethodsChanged = jest.fn(), onModifiedMethodsChanged = jest.fn(), onInProgressMethodsChanged = jest.fn(), + onProcessedByAutoModelMethodsChanged = jest.fn(), onRevealInModelEditor = jest.fn(), onFocusModelEditor = jest.fn(), }: { @@ -21,6 +22,7 @@ export function createMockModelingEvents({ onModeledMethodsChanged?: ModelingEvents["onModeledMethodsChanged"]; onModifiedMethodsChanged?: ModelingEvents["onModifiedMethodsChanged"]; onInProgressMethodsChanged?: ModelingEvents["onInProgressMethodsChanged"]; + onProcessedByAutoModelMethodsChanged?: ModelingEvents["onProcessedByAutoModelMethodsChanged"]; onRevealInModelEditor?: ModelingEvents["onRevealInModelEditor"]; onFocusModelEditor?: ModelingEvents["onFocusModelEditor"]; } = {}): ModelingEvents { @@ -33,6 +35,7 @@ export function createMockModelingEvents({ onModeledMethodsChanged, onModifiedMethodsChanged, onInProgressMethodsChanged, + onProcessedByAutoModelMethodsChanged, onRevealInModelEditor, onFocusModelEditor, });