From 43e0ceb342cd27ee94e7c1ac830ee642294e2f2f Mon Sep 17 00:00:00 2001 From: HugoCasa Date: Tue, 13 Feb 2024 15:52:03 +0100 Subject: [PATCH] feat: add ai for predicates and iterator expressions (#3203) * feat: add ai for predicates and iterator expressions * fix: npm run check * feat: copilot like suggestion --- frontend/src/lib/components/ArgInput.svelte | 2 + frontend/src/lib/components/Editor.svelte | 4 - .../lib/components/InputTransformForm.svelte | 12 +- .../InputTransformSchemaForm.svelte | 1 + .../src/lib/components/SimpleEditor.svelte | 36 +++- .../copilot/FlowCopilotInputsModal.svelte | 2 +- .../lib/components/copilot/IteratorGen.svelte | 181 ++++++++++++++++++ .../components/copilot/PredicateGen.svelte | 135 +++++++++++++ .../components/copilot/StepInputGen.svelte | 113 +++++++++-- .../components/copilot/StepInputsGen.svelte | 84 ++++++-- .../lib/components/flows/FlowEditor.svelte | 2 +- .../content/BranchPredicateEditor.svelte | 15 +- .../flows/content/FlowBranchOneWrapper.svelte | 3 +- .../content/FlowBranchesOneWrapper.svelte | 8 +- .../flows/content/FlowEditorPanel.svelte | 2 + .../components/flows/content/FlowLoop.svelte | 52 ++++- .../flows/content/FlowModuleWrapper.svelte | 17 +- .../lib/components/flows/flowStateUtils.ts | 2 +- frontend/src/lib/components/theme/nord.json | 93 --------- 19 files changed, 607 insertions(+), 157 deletions(-) create mode 100644 frontend/src/lib/components/copilot/IteratorGen.svelte create mode 100644 frontend/src/lib/components/copilot/PredicateGen.svelte delete mode 100644 frontend/src/lib/components/theme/nord.json diff --git a/frontend/src/lib/components/ArgInput.svelte b/frontend/src/lib/components/ArgInput.svelte index a15db45209..a3b4b801ae 100644 --- a/frontend/src/lib/components/ArgInput.svelte +++ b/frontend/src/lib/components/ArgInput.svelte @@ -340,6 +340,7 @@ { @@ -608,6 +609,7 @@ 0} + on:showExpr={(e) => { + monaco?.setSuggestion(e.detail) + }} on:setExpr={(e) => { arg = { type: 'javascript', expr: e.detail } propertyType = 'javascript' - monaco?.setCode(e.detail) + monaco?.setCode('') + monaco?.insertAtCursor(e.detail) }} {pickableProperties} {argName} @@ -395,6 +404,7 @@ focused = false }} autoHeight + preventTabOnEmpty={enableAi} /> diff --git a/frontend/src/lib/components/InputTransformSchemaForm.svelte b/frontend/src/lib/components/InputTransformSchemaForm.svelte index deb74486aa..ae2a9dad62 100644 --- a/frontend/src/lib/components/InputTransformSchemaForm.svelte +++ b/frontend/src/lib/components/InputTransformSchemaForm.svelte @@ -74,6 +74,7 @@ (args[argName].type === 'javascript' && !args[argName].expr)) ) : []} + {schema} /> {/if} {#if keys.length > 0} diff --git a/frontend/src/lib/components/SimpleEditor.svelte b/frontend/src/lib/components/SimpleEditor.svelte index 3d8022afaf..e15d008439 100644 --- a/frontend/src/lib/components/SimpleEditor.svelte +++ b/frontend/src/lib/components/SimpleEditor.svelte @@ -13,8 +13,7 @@ KeyMod, Uri as mUri, languages, - type IRange, - type IKeyboardEvent + type IRange } from 'monaco-editor' import 'monaco-editor/esm/vs/basic-languages/sql/sql.contribution' import 'monaco-editor/esm/vs/basic-languages/yaml/yaml.contribution' @@ -57,6 +56,7 @@ export let fixedOverflowWidgets = true export let small = false export let domLib = false + export let autofocus = false const dispatch = createEventDispatcher() @@ -117,12 +117,6 @@ } } - export function onKeyUp(f: (e: IKeyboardEvent) => void) { - if (editor) { - return editor.onKeyUp(f) - } - } - export function show(): void { divEl?.classList.remove('hidden') } @@ -131,9 +125,17 @@ divEl?.classList.add('hidden') } + let suggestion = '' + export function setSuggestion(value: string): void { + suggestion = value + } + let width = 0 let initialized = false + let disableTabCond: meditor.IContextKey | undefined + $: disableTabCond?.set(!code && !!suggestion) + async function loadMonaco() { await initializeVscode() initialized = true @@ -184,6 +186,7 @@ let timeoutModel: NodeJS.Timeout | undefined = undefined editor.onDidChangeModelContent((event) => { + suggestion = '' timeoutModel && clearTimeout(timeoutModel) timeoutModel = setTimeout(() => { code = getCode() @@ -198,6 +201,9 @@ code = getCode() shouldBindKey && format && format() }) + + disableTabCond = editor.createContextKey('disableTabCond', !code) + editor.addCommand(KeyCode.Tab, function () {}, 'disableTabCond') }) if (autoHeight) { @@ -332,6 +338,11 @@ if (BROWSER) { mounted = true await loadMonaco() + if (autofocus) { + setTimeout(() => { + focus() + }, 0) + } } }) @@ -347,6 +358,15 @@ +{#if editor && suggestion && code.length === 0} +
+ {suggestion} +
+{/if} +