From fde6ad1e7fa6236c6c1ac1e3ff6d8e959012543a Mon Sep 17 00:00:00 2001 From: OlegIvaniv Date: Wed, 16 Aug 2023 13:08:10 +0200 Subject: [PATCH] feat(editor): Ask AI in Code node (#6672) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(editor): Ask AI tab and CLi connection Signed-off-by: Oleg Ivaniv * Remove old getSchema util method Signed-off-by: Oleg Ivaniv * Increase CSS specificity of the CodeNodeEditor global overrides Signed-off-by: Oleg Ivaniv * feat(editor): Magic Connect Signed-off-by: Oleg Ivaniv * Improve AI controller, load conditionally, UX modal imporvements Signed-off-by: Oleg Ivaniv * Extract-out AI curl Signed-off-by: Oleg Ivaniv * Move loading phrases to locale, add support for ask ai experiment Signed-off-by: Oleg Ivaniv * fix build * adjust communication * fix: Remove duplicate source control preferences fetching (no-changelog) (#6675) fix: remove duplicate source control preferences fetching (no-changelog) * fix(Slack Node): Add UTM params to n8n reference in Slack message (no-changelog) (#6668) fix(Slack Node): Add UTM params to n8n reference in Slack message * fix(FileMaker Node): Improve returned error responses (#6585) * fix(Microsoft Outlook Node): Fix issue with category not correctly applying (#6583) * feat(Airtable Node): Overhaul (#6200) * fix(core): Deleting manual executions should defer deleting binary data (#6680) deleting manual executions should defer deleting binary data * fix(editor): Add paywall state to non owner users for Variables (#6679) * fix(editor): Add paywall state to non owner users for Variables * fix(editor): Add variables view tests * fix(editor): remove link from paywall state for non owner * fix(editor): fix displaying logic * refactor(core): Refactor WorkflowStatistics code (no-changelog) (#6617) refactor(core): Refactor WorkflowStatistics code * fix(editor): Hide Execute Node button for unknown nodes (#6684) * feat: Allow hiding credential params on cloud (#6687) * fix: Stop n8n from complaining about credentials when saving a new workflow form a template (#6671) * fix(core): Upgrade semver to address CVE-2022-25883 (#6689) * fix(core): Upgrade semver to address CVE-2022-25883 [GH Advisory](https://github.com/advisories/GHSA-c2qf-rxjj-qqgw) * enforce the patched version of semver everywhere in the dev setup * ci: Fix test checker glob (no changelog) (#6682) ci: Fix test checker glob * fix(API): Do not add starting node on workflow creation (#6686) * fix(API): Do not add starting node on workflow creation * chore: Remove comment * fix(core): Filter out workflows that failed to activate on startup (#6676) * fix(core): Deactivate on init workflow that should not be retried * fix(core): Filter out workflows with activation errors * fix(core): Load SAML libraries dynamically (#6690) load SAML dynamically * fix(crowd.dev Node): Fix documentation urls for crowd.dev credentials and nodes (#6696) * feat(Read PDF Node): Replace pdf-parse with pdfjs, and add support for streaming and encrypted PDFs (#6640) * feat: Allow `eslint-config` to be externally consumable (#6694) * feat: Allow `eslint-config` to be externally consumable * refactor: Adjust import styles * fix(Contentful Node): Fix typo in credential name (no-changelog) (#6692) * fix(editor): Ensure default credential values are not detected as dirty state (#6677) * fix(editor): Ensure default credential values are not detected as dirty state * chore: Remove logging * refactor: Improve comment * feat(Google Cloud Storage Node): Use streaming for file uploads (#6462) fix(Google Cloud Storage Node): Use streaming for file uploads * fix(editor): Prevent RMC from loading schema if it's already cached (#6695) * fix(editor): Prevent RMC from loading schema if it's already cached * ✅ Adding new tests for RMC * 👕 Fixing lint errors * 👌 Updating inline loader styling * fix(API): Fix issue with workflow setting not supporting newer nanoids (#6699) * ci: Fix test workflows (no-changelog) (#6698) * ci: Fix test workflows (no-changelog) We removed `pdf-parse` in #6640, so we need to get these test PDF files from the `test-workflows` repo instead ([which has been updated to include these files](https://github.com/n8n-io/test-workflows/commit/0f6ef1c804e3f1e919b097bdf061ea9ea095b1e2)) * remove `\n` from ids and skipList text files * fix(core): Banner dismissal should also work for users migrating to v1 (no-changelog) (#6700) * fix(Postgres Node): For select queries, empty result should be be replaced with `{"success":true}` (#6703) * fix(Postgres Node): For select queries, empty result should be be replaced with `{"success":true}` * :zap: less checks --------- Co-authored-by: Michael Kret * feat(editor): Removing `ph-no-capture` class from some elements (#6674) * feat(editor): Remove `.ph-no-capture` class from some of the fields * ✔️ Updating test snapshots * ⚡ Redacting expressions preview in credentials form * 🔧 Disable posthog input masking * 🚨 Testing PostHog iFrame settings * Reverting iframe test * ⚡ Hiding API key in PostHog recordings * ✅ Added tests for redacted values * ✔️ Updating checkbox snapshots after label component update * ✔️ Updating test snapshots in editor-ui * 👕 Fix lint errors * fix(editor): Remove global link styling in v1 banner (#6705) * fix: Add missing indices on sqlite (#6673) * fix: enforce tag name uniqueness on sqlite * rename migration and add other missing indices * add tags tests * test: Move test timeout to `/cli` (no-changelog) (#6712) * fix(core): Redirect user to previous url after SSO signin (#6710) redirect user to previous url after SSO signin * fix(FTP Node): List recursive ignore . and .. to prevent infinite loops (#6707) ignore . and .. to prevent infinite loop Co-authored-by: Michael Kret * ci: Fix running e2e tests in dev mode (no-changelog) (#6717) * fix(Google BigQuery Node): Error description improvement (#6715) * fix(GitLab Trigger Node): Fix trigger activation 404 error (#6711) * fix webhook checkExists not deleting static data * improve webhook checkExists not deleting static data * fix(core): Support redis cluster in queue mode (#6708) * support redis cluster * cleanup, fix config schema * set default prefix to bull * fix(editor): Skip error line highlighting if out of range (#6721) * fix(AwsS3 Node): Fix issue if bucket name contains a '.' (#6542) * test(editor): Add canvas actions E2E tests (#6723) * test(editor): Add canvas actions E2E tests * test(editor): Open category items in node creator when category dropped on canvas * test(editor): Have new position counted only once in drag * test(editor): rename test * feat(Rundeck Node): Add support for node filters (#5633) * fix(Gmail Trigger Node): Early returns in case of no data (#6727) * fix(core): Use JWT as reset password token (#6714) * use jwt to reset password * increase expiration time to 1d * drop user id query string * refactor * use service instead of package in tests * sqlite migration * postgres migration * mysql migration * remove unused properties * remove userId from FE * fix test for users.api * move migration to the common folder * move type assertion to the jwt.service * Add jwt secret as a readonly property * use signData instead of sign in user.controller * remove base class * remove base class * add tests * ci: Fix tests on postgres (no-changelog) * refactor(core): Prevent community packages queries if feature is disabled (#6728) * feat(core): Add cache service (#6729) * add cache service * PR adjustments * switch to maxSize for memory cache * Revert "test(editor): Add canvas actions E2E tests" (#6736) Revert "test(editor): Add canvas actions E2E tests (#6723)" This reverts commit 052d82b2208c1b2e6f62c6004822c6278c15278b. * fix(Postgres Node): Arrays in query replacement fix (#6718) * fix(Telegram Trigger Node): Add guard to 'include' call on null or undefined (#6730) * fix(core): Use `exec` in docker images to forward signals correctly (#6732) * refactor(core): Move webhook DB access to repository (no-changelog) (#6706) * refactor(core): Move webhook DB access to repository (no-changelog) * make sure `DataSource` is initialized before it's dependencies at some point I hope to replace `DataSource` with a custom `DatabaseConnection` service class that can then disconnect and reconnect from DB without having to update all repositories. --------- Co-authored-by: कारतोफ्फेलस्क्रिप्ट™ * feat: Environments release using source control (#6653) * initial telemetry setup and adjusted pull return * quicksave before merge * feat: add conflicting workflow list to pull modal * feat: update source control pull modal * fix: fix linting issue * feat: add Enter keydown event for submitting source control push modal (no-changelog) feat: add Enter keydown event for submitting source control push modal * quicksave * user workflow table for export * improve telemetry data * pull api telemetry * fix lint * Copy tweaks. * remove authorName and authorEmail and pick from user * rename owners.json to workflow_owners.json * ignore credential conflicts on pull * feat: several push/pull flow changes and design update * pull and push return same data format * fix: add One last step toast for successful pull * feat: add up to date pull toast * fix: add proper Learn more link for push and pull modals * do not await tracking being sent * fix import * fix await * add more sourcecontrolfile status * Minor copy tweak for "More info". * Minor copy tweak for "More info". * ignore variable_stub conflicts on pull * ignore whitespace differences * do not show remote workflows that are not yet created * fix telemetry * fix toast when pulling deleted wf * lint fix * refactor and make some imports dynamic * fix variable edit validation * fix telemetry response * improve telemetry * fix unintenional delete commit * fix status unknown issue * fix up to date toast * do not export active state and reapply versionid * use update instead of upsert * fix: show all workflows when clicking push to git * feat: update Up to date pull translation * fix: update read only env checks * do not update versionid of only active flag changes * feat: prevent access to new workflow and templates import when read only env * feat: send only active state and version if workflow state is not dirty * fix: Detect when only active state has changed and prevent generation a new version ID * feat: improve readonly env messages * make getPreferences public * fix telemetry issue * fix: add partial workflow update based on dirty state when changing active state * update unit tests * fix: remove unsaved changes check in readOnlyEnv * fix: disable push to git button when read onyl env * fix: update readonly toast duration * fix: fix pinning and title input in protected mode * initial commit (NOT working) * working push * cleanup and implement pull * fix getstatus * update import to new method * var and tag diffs are no conflicts * only show pull conflict for workflows * refactor and ignore faulty credentials * add sanitycheck for missing git folder * prefer fetch over pull and limit depth to 1 * back to pull... * fix setting branch on initial connect * fix test * remove clean workfolder * refactor: Remove some unnecessary code * Fixed links to docs. * fix getstatus query params * lint fix * dialog to show local and remote name on conflict * only show remote name on conflict * fix credential expression export * fix: Broken test * dont show toast on pull with empty var/tags and refactor * apply frontend changes from old branch * fix tag with same name import * fix buttons shown for non instance owners * prepare local storage key for removal * refactor: Change wording on pushing and pulling * refactor: Change menu item * test: Fix broken test * Update packages/cli/src/environments/sourceControl/types/sourceControlPushWorkFolder.ts Co-authored-by: Iván Ovejero --------- Co-authored-by: Alex Grozav Co-authored-by: Giulio Andreini Co-authored-by: Omar Ajoue Co-authored-by: Iván Ovejero * fix(core): Fix RemoveResetPasswordColumns migration for sqlite (no-changelog) (#6739) * ci: Update changelog generation to work with node 18 * refactor: Remove webhook from `IDatabaseCollections` (no-changelog) (#6745) * refactor: Remove webhook from `IDatabaseCollections` * refactor: Remove also from `collections` * :rocket: Release 1.1.0 (#6746) Co-authored-by: netroy * fix(Lemlist Node): Fix pagination issues with campaigns and activities (#6734) * ci: Fix linting issues (no-changelog) (#6747) * fix(core): Allow ignoring SSL issues on generic oauth2 credentials (#6702) * refactor: Remove all references to the resetPasswordToken field (no-changelog) (#6751) refactor: remove all references to the resetPasswordToken field (no-changelog) * refactor(core): Use mixins to delete redundant code between Entity classes (no-changelog) (#6616) * db entities don't need an ID before they are inserted * don't define constructors on entity classes, use repository.create instead * use mixins to reduce duplicate code in db entity classes * fix: Display source control buttons properly (#6756) * feat(editor): Migrate Design System and Editor UI to Vue 3 (#6476) * feat: remove vue-fragment (no-changelog) * feat: partial design-system migration * feat: migrate info-accordion and info-tip components * feat: migrate several components to vue 3 * feat: migrated several components * feat: migrate several components * feat: migrate several components * feat: migrate several components * feat: re-exported all design system components * fix: fix design for popper components * fix: editor kind of working, lots of issues to fix * fix: fix several vue 3 migration issues * fix: replace @change with @update:modelValue in several places * fix: fix translation linking * fix: fix inline-edit input * fix: fix ndv and dialog design * fix: update parameter input event bindings * fix: rename deprecated lifecycle methods * fix: fix json view mapping * build: update lock file * fix(editor): revisit last conflict with master and fix issues * fix(editor): revisit last conflict with master and fix issues * fix: fix expression editor bug causing code mirror to no longer be reactive * fix: fix resource locator bug * fix: fix vue-agile integration * fix: remove global import for vue-agile * fix: replace element-plus buttons with n8n-buttons everywhere * fix(editor): Fix various element-plus styles (#6571) * fix(editor): Fix various element-plus styles Signed-off-by: Oleg Ivaniv * Remove debugging code Signed-off-by: Oleg Ivaniv * Address PR comments Signed-off-by: Oleg Ivaniv --------- Signed-off-by: Oleg Ivaniv * fix(editor): Fix loading in production mode [Vue 3] (#6578) Signed-off-by: Oleg Ivaniv * fix(editor): First round of e2e tests fixes with Vue 3 (#6579) * fix(editor): Fix broken smoke and workflow list e2e tests * ✔️ Fix failing canvas action tests. Updating some selectors used in credentials and workflow tests * feat: add vue 3 eslint rules and fix issues * fix: fix tags-dropdown * fix: fix white-space issues caused by i18n-t * fix: rename non-generic click events * fix: fix search in resources list layout * fix: fix datatable paginator * fix: fix popper select caret and dropdown size * fix: add width to action-dropdown * fix: fix workflow settings icon not being hidden * fix: refactor newly added code * fix: fix merge issue * fix: fix ndv credentials watcher * fix: fix workflow saving and grabber notch * fix: fix nodes list panel transition * fix: fix node title visibility * fix: fix data unpinning * fix: fix value access * fix: show input panel only if trigger panel enabled or not trigger node * fix: fix tags dropdown and executions status spcing * fix(editor): Prevent execution list to load back when leaving the route (#6697) fix(editor): prevent execution list to load back when leaving the route * fix: fix drawer visibility * fix: fix expression toggle padding * fix: fix expressions editor styling * chore: prepare for testing * fix: fix styling for el-button without patching * test: fix unit tests in design-system * test: fix most unit tests * fix: remove import cycle. * fix: fix personalization modal tests * fix further resource mapper test adjustments * fix: fix multiple tests and n8n-route attr duplication * fix: fix source control tets * fix: fixed remaining unit tests * fix: fix workflows and credentials e2e tests * fix: fix localizeNodeNames * fix: update ndv e2e tests * fix: fix popper left placement arrow * fix: fix 5-ndv e2e tests * fix: fix 6-code-node e2e tests * fix(editor): Drop click outside directive from NodeCreator (#6716) * fix(editor): Drop click outside directive from NodeCreator * fix(editor): make sure mouseup outside is unbound at least before the component is unmounted * fix: fix 10-settings-log-streaming e2e tests * fix: fix node redrawing * fix: fix tooltip buttons styling * fix: fix varous e2e suites * fix: fix 15-scheduler-node e2e suite * fix: fix route watcher * fix: fixed param name update and credential edit * feat: update event names * refactor: Remove deprecated `$data` (#6576) Co-authored-by: Alex Grozav * fix: fix 17-sharing e2e suite * fix: fix tags dropdown * fix: fix tags manager * fix(editor): move :deep selectors to a separate scoped style block * fix: fix sticky component and inline text edit * fix: update e2e tests * fix: remove button override references * fix(editor): Adjust spacing in templates for Vue 3 (#6744) * fix(editor): Adjust spacing in templates * fix: Undo unneeded change * fix: Undo unneeded change * fix(editor): Adjust NDV height for Vue 3 (#6742) fix(editor): Adjust NDV height * fix(editor): Restore collapsed sidebar items for Vue 3 (#6743) fix(editor): Restore collapsed sidebar items * fix: fix linting issues * fix: fix design-system deps * fix: post-merge fixes * fix: update tests * fix: increase timeout for executionslist tets * chore: fix linting issue * fix: fix 14-mapping e2e tests in ci * fix: re-enable tests * fix: fix workflow duplication e2e tests after tags update * fix(editor): Change component prop to be typed * fix: fix tags dropdown in duplicate wf modal * fix: fix focus behaviour in tags selector * fix: fix tag creation * fix: fix log streaming e2e race condition * fix(editor): Fix Vue 3 linting issues (#6748) * fix(editor): Fix Vue 3 linting issues Signed-off-by: Oleg Ivaniv * fix MainSidebar linter issues * revert pnpm lock * update pnpm lock file --------- Signed-off-by: Oleg Ivaniv Co-authored-by: Alex Grozav * fix(editor): Some css fixes for vue3 branch (#6749) * ✨ Fixing filter button height * ✨ Update input modal button position * ✨ Updating tags styling * ✨ Fix event logging settings spacing * 👕 Fixing lint errors * fix: fix linting issues * Revert to `// eslint-disable-next-line @typescript-eslint/no-misused-promises` disabling of mixins init Signed-off-by: Oleg Ivaniv * fix: fix css issue * fix(editor): Lint fix * fix(editor): Fix settings initialisation (#6750) Signed-off-by: Oleg Ivaniv * fix: fix initial settings loading * fix: replace realClick with click force * fix: fix randomly failing mapping e2e tests * fix(editor): Fix menu item event handling * fix: fix resource filters dropdown events (#6752) * fix: fix resource filters dropdown events * fix: remove teleported:false * fix: fix event selection event naming (#6753) * fix: removed console.log (#6754) * fix: rever await nextTick changes * fix: redo linting changes * fix(editor): Redraw node connections if adding more than one node to canvas (#6755) * fix(editor): Redraw node connections if adding more than one node to canvas Signed-off-by: Oleg Ivaniv * Update position before connection two nodes * Lint fix --------- Signed-off-by: Oleg Ivaniv Co-authored-by: Alex Grozav * fix(editor): Fix `ResourceMapper` unit tests (#6758) * ✔️ Fix matching columns test * ✔️ Fix multiple matching columns test * ✔️ Removing `skip` from the last test * fix: Allow pasting a big workflow (#6760) * fix: pasting a big workflow * chore: update comment * refactor: move try/catch to function * refactor: move try/catch to function * fix(editor): Fix modal layer width * fix: fix position changes * fix: undo it.only * fix: make undo/redo multiple steps more verbose * fix: Fix value survey styles (#6764) * fix: fix value survey styles * fix: lint * Revert "fix: lint" 72869c431f1448861df021be041b61c62f1e3118 * fix: lint * fix(editor): Fix collapsed sub menu * fix: Fix drawer animation (#6767) fix: drawer animation * fix(editor): Fix source control buttons (#6769) * fix(editor): Fix App loading & auth (#6768) * fix(editor): Fix App loading & auth Signed-off-by: Oleg Ivaniv * Await promises Signed-off-by: Oleg Ivaniv * Fix eslint error Signed-off-by: Oleg Ivaniv --------- Signed-off-by: Oleg Ivaniv --------- Signed-off-by: Oleg Ivaniv Co-authored-by: Csaba Tuncsik Co-authored-by: OlegIvaniv Co-authored-by: Milorad FIlipović Co-authored-by: Iván Ovejero Co-authored-by: Mutasem Aldmour <4711238+mutdmour@users.noreply.github.com> * perf(editor): Memoize locale translate calls during actions generation (#6773) performance(editor): Memoize locale translate calls during actions generation Signed-off-by: Oleg Ivaniv * fix(editor): Close tags dropdown when modal is opened (#6766) * feat: remove vue-fragment (no-changelog) * feat: partial design-system migration * feat: migrate info-accordion and info-tip components * feat: migrate several components to vue 3 * feat: migrated several components * feat: migrate several components * feat: migrate several components * feat: migrate several components * feat: re-exported all design system components * fix: fix design for popper components * fix: editor kind of working, lots of issues to fix * fix: fix several vue 3 migration issues * fix: replace @change with @update:modelValue in several places * fix: fix translation linking * fix: fix inline-edit input * fix: fix ndv and dialog design * fix: update parameter input event bindings * fix: rename deprecated lifecycle methods * fix: fix json view mapping * build: update lock file * fix(editor): revisit last conflict with master and fix issues * fix(editor): revisit last conflict with master and fix issues * fix: fix expression editor bug causing code mirror to no longer be reactive * fix: fix resource locator bug * fix: fix vue-agile integration * fix: remove global import for vue-agile * fix: replace element-plus buttons with n8n-buttons everywhere * fix(editor): Fix various element-plus styles (#6571) * fix(editor): Fix various element-plus styles Signed-off-by: Oleg Ivaniv * Remove debugging code Signed-off-by: Oleg Ivaniv * Address PR comments Signed-off-by: Oleg Ivaniv --------- Signed-off-by: Oleg Ivaniv * fix(editor): Fix loading in production mode [Vue 3] (#6578) Signed-off-by: Oleg Ivaniv * fix(editor): First round of e2e tests fixes with Vue 3 (#6579) * fix(editor): Fix broken smoke and workflow list e2e tests * ✔️ Fix failing canvas action tests. Updating some selectors used in credentials and workflow tests * feat: add vue 3 eslint rules and fix issues * fix: fix tags-dropdown * fix: fix white-space issues caused by i18n-t * fix: rename non-generic click events * fix: fix search in resources list layout * fix: fix datatable paginator * fix: fix popper select caret and dropdown size * fix: add width to action-dropdown * fix: fix workflow settings icon not being hidden * fix: refactor newly added code * fix: fix merge issue * fix: fix ndv credentials watcher * fix: fix workflow saving and grabber notch * fix: fix nodes list panel transition * fix: fix node title visibility * fix: fix data unpinning * fix: fix value access * fix: show input panel only if trigger panel enabled or not trigger node * fix: fix tags dropdown and executions status spcing * fix(editor): Prevent execution list to load back when leaving the route (#6697) fix(editor): prevent execution list to load back when leaving the route * fix: fix drawer visibility * fix: fix expression toggle padding * fix: fix expressions editor styling * chore: prepare for testing * fix: fix styling for el-button without patching * test: fix unit tests in design-system * test: fix most unit tests * fix: remove import cycle. * fix: fix personalization modal tests * fix further resource mapper test adjustments * fix: fix multiple tests and n8n-route attr duplication * fix: fix source control tets * fix: fixed remaining unit tests * fix: fix workflows and credentials e2e tests * fix: fix localizeNodeNames * fix: update ndv e2e tests * fix: fix popper left placement arrow * fix: fix 5-ndv e2e tests * fix: fix 6-code-node e2e tests * fix(editor): Drop click outside directive from NodeCreator (#6716) * fix(editor): Drop click outside directive from NodeCreator * fix(editor): make sure mouseup outside is unbound at least before the component is unmounted * fix: fix 10-settings-log-streaming e2e tests * fix: fix node redrawing * fix: fix tooltip buttons styling * fix: fix varous e2e suites * fix: fix 15-scheduler-node e2e suite * fix: fix route watcher * fix: fixed param name update and credential edit * feat: update event names * refactor: Remove deprecated `$data` (#6576) Co-authored-by: Alex Grozav * fix: fix 17-sharing e2e suite * fix: fix tags dropdown * fix: fix tags manager * fix(editor): move :deep selectors to a separate scoped style block * fix: fix sticky component and inline text edit * fix: update e2e tests * fix: remove button override references * fix(editor): Adjust spacing in templates for Vue 3 (#6744) * fix(editor): Adjust spacing in templates * fix: Undo unneeded change * fix: Undo unneeded change * fix(editor): Adjust NDV height for Vue 3 (#6742) fix(editor): Adjust NDV height * fix(editor): Restore collapsed sidebar items for Vue 3 (#6743) fix(editor): Restore collapsed sidebar items * fix: fix linting issues * fix: fix design-system deps * fix: post-merge fixes * fix: update tests * fix: increase timeout for executionslist tets * chore: fix linting issue * fix: fix 14-mapping e2e tests in ci * fix: re-enable tests * fix: fix workflow duplication e2e tests after tags update * fix(editor): Change component prop to be typed * fix: fix tags dropdown in duplicate wf modal * fix: fix focus behaviour in tags selector * fix: fix tag creation * fix: fix log streaming e2e race condition * fix(editor): Fix Vue 3 linting issues (#6748) * fix(editor): Fix Vue 3 linting issues Signed-off-by: Oleg Ivaniv * fix MainSidebar linter issues * revert pnpm lock * update pnpm lock file --------- Signed-off-by: Oleg Ivaniv Co-authored-by: Alex Grozav * fix(editor): Some css fixes for vue3 branch (#6749) * ✨ Fixing filter button height * ✨ Update input modal button position * ✨ Updating tags styling * ✨ Fix event logging settings spacing * 👕 Fixing lint errors * fix: fix linting issues * Revert to `// eslint-disable-next-line @typescript-eslint/no-misused-promises` disabling of mixins init Signed-off-by: Oleg Ivaniv * fix: fix css issue * fix(editor): Lint fix * fix(editor): Fix settings initialisation (#6750) Signed-off-by: Oleg Ivaniv * fix: fix initial settings loading * fix: replace realClick with click force * fix: fix randomly failing mapping e2e tests * fix(editor): Fix menu item event handling * fix: fix resource filters dropdown events (#6752) * fix: fix resource filters dropdown events * fix: remove teleported:false * fix: fix event selection event naming (#6753) * fix: removed console.log (#6754) * fix: rever await nextTick changes * fix: redo linting changes * fix(editor): Redraw node connections if adding more than one node to canvas (#6755) * fix(editor): Redraw node connections if adding more than one node to canvas Signed-off-by: Oleg Ivaniv * Update position before connection two nodes * Lint fix --------- Signed-off-by: Oleg Ivaniv Co-authored-by: Alex Grozav * fix(editor): Fix `ResourceMapper` unit tests (#6758) * ✔️ Fix matching columns test * ✔️ Fix multiple matching columns test * ✔️ Removing `skip` from the last test * fix: Allow pasting a big workflow (#6760) * fix: pasting a big workflow * chore: update comment * refactor: move try/catch to function * refactor: move try/catch to function * fix(editor): Fix modal layer width * fix: fix position changes * fix: undo it.only * fix: make undo/redo multiple steps more verbose * fix: Fix value survey styles (#6764) * fix: fix value survey styles * fix: lint * Revert "fix: lint" 72869c431f1448861df021be041b61c62f1e3118 * fix: lint * fix(editor): Close tags dropdown when modal is opened * ✔️ Updating tag selectors in e2e tests * ✔️ Using tab to blur dropdown after adding tags * ✔️ Clicking on the New Tab button instead of the tags dropdown to open it * Reverting merge changes added by mistake --------- Signed-off-by: Oleg Ivaniv Co-authored-by: Alex Grozav Co-authored-by: Csaba Tuncsik Co-authored-by: OlegIvaniv Co-authored-by: Iván Ovejero Co-authored-by: Mutasem Aldmour <4711238+mutdmour@users.noreply.github.com> * fix: Show NodeIcon tooltips by removing pointer-events: none (#6777) fix: show NodeIcon tooltips by removing pointer-events: none * fix: Respect set modal widths (#6771) * feat: remove vue-fragment (no-changelog) * feat: partial design-system migration * feat: migrate info-accordion and info-tip components * feat: migrate several components to vue 3 * feat: migrated several components * feat: migrate several components * feat: migrate several components * feat: migrate several components * feat: re-exported all design system components * fix: fix design for popper components * fix: editor kind of working, lots of issues to fix * fix: fix several vue 3 migration issues * fix: replace @change with @update:modelValue in several places * fix: fix translation linking * fix: fix inline-edit input * fix: fix ndv and dialog design * fix: update parameter input event bindings * fix: rename deprecated lifecycle methods * fix: fix json view mapping * build: update lock file * fix(editor): revisit last conflict with master and fix issues * fix(editor): revisit last conflict with master and fix issues * fix: fix expression editor bug causing code mirror to no longer be reactive * fix: fix resource locator bug * fix: fix vue-agile integration * fix: remove global import for vue-agile * fix: replace element-plus buttons with n8n-buttons everywhere * fix(editor): Fix various element-plus styles (#6571) * fix(editor): Fix various element-plus styles Signed-off-by: Oleg Ivaniv * Remove debugging code Signed-off-by: Oleg Ivaniv * Address PR comments Signed-off-by: Oleg Ivaniv --------- Signed-off-by: Oleg Ivaniv * fix(editor): Fix loading in production mode [Vue 3] (#6578) Signed-off-by: Oleg Ivaniv * fix(editor): First round of e2e tests fixes with Vue 3 (#6579) * fix(editor): Fix broken smoke and workflow list e2e tests * ✔️ Fix failing canvas action tests. Updating some selectors used in credentials and workflow tests * feat: add vue 3 eslint rules and fix issues * fix: fix tags-dropdown * fix: fix white-space issues caused by i18n-t * fix: rename non-generic click events * fix: fix search in resources list layout * fix: fix datatable paginator * fix: fix popper select caret and dropdown size * fix: add width to action-dropdown * fix: fix workflow settings icon not being hidden * fix: refactor newly added code * fix: fix merge issue * fix: fix ndv credentials watcher * fix: fix workflow saving and grabber notch * fix: fix nodes list panel transition * fix: fix node title visibility * fix: fix data unpinning * fix: fix value access * fix: show input panel only if trigger panel enabled or not trigger node * fix: fix tags dropdown and executions status spcing * fix(editor): Prevent execution list to load back when leaving the route (#6697) fix(editor): prevent execution list to load back when leaving the route * fix: fix drawer visibility * fix: fix expression toggle padding * fix: fix expressions editor styling * chore: prepare for testing * fix: fix styling for el-button without patching * test: fix unit tests in design-system * test: fix most unit tests * fix: remove import cycle. * fix: fix personalization modal tests * fix further resource mapper test adjustments * fix: fix multiple tests and n8n-route attr duplication * fix: fix source control tets * fix: fixed remaining unit tests * fix: fix workflows and credentials e2e tests * fix: fix localizeNodeNames * fix: update ndv e2e tests * fix: fix popper left placement arrow * fix: fix 5-ndv e2e tests * fix: fix 6-code-node e2e tests * fix(editor): Drop click outside directive from NodeCreator (#6716) * fix(editor): Drop click outside directive from NodeCreator * fix(editor): make sure mouseup outside is unbound at least before the component is unmounted * fix: fix 10-settings-log-streaming e2e tests * fix: fix node redrawing * fix: fix tooltip buttons styling * fix: fix varous e2e suites * fix: fix 15-scheduler-node e2e suite * fix: fix route watcher * fix: fixed param name update and credential edit * feat: update event names * refactor: Remove deprecated `$data` (#6576) Co-authored-by: Alex Grozav * fix: fix 17-sharing e2e suite * fix: fix tags dropdown * fix: fix tags manager * fix(editor): move :deep selectors to a separate scoped style block * fix: fix sticky component and inline text edit * fix: update e2e tests * fix: remove button override references * fix(editor): Adjust spacing in templates for Vue 3 (#6744) * fix(editor): Adjust spacing in templates * fix: Undo unneeded change * fix: Undo unneeded change * fix(editor): Adjust NDV height for Vue 3 (#6742) fix(editor): Adjust NDV height * fix(editor): Restore collapsed sidebar items for Vue 3 (#6743) fix(editor): Restore collapsed sidebar items * fix: fix linting issues * fix: fix design-system deps * fix: post-merge fixes * fix: update tests * fix: increase timeout for executionslist tets * chore: fix linting issue * fix: fix 14-mapping e2e tests in ci * fix: re-enable tests * fix: fix workflow duplication e2e tests after tags update * fix(editor): Change component prop to be typed * fix: fix tags dropdown in duplicate wf modal * fix: fix focus behaviour in tags selector * fix: fix tag creation * fix: fix log streaming e2e race condition * fix(editor): Fix Vue 3 linting issues (#6748) * fix(editor): Fix Vue 3 linting issues Signed-off-by: Oleg Ivaniv * fix MainSidebar linter issues * revert pnpm lock * update pnpm lock file --------- Signed-off-by: Oleg Ivaniv Co-authored-by: Alex Grozav * fix(editor): Some css fixes for vue3 branch (#6749) * ✨ Fixing filter button height * ✨ Update input modal button position * ✨ Updating tags styling * ✨ Fix event logging settings spacing * 👕 Fixing lint errors * fix: fix linting issues * Revert to `// eslint-disable-next-line @typescript-eslint/no-misused-promises` disabling of mixins init Signed-off-by: Oleg Ivaniv * fix: fix css issue * fix(editor): Lint fix * fix(editor): Fix settings initialisation (#6750) Signed-off-by: Oleg Ivaniv * fix: fix initial settings loading * fix: replace realClick with click force * fix: fix randomly failing mapping e2e tests * fix(editor): Fix menu item event handling * fix: fix resource filters dropdown events (#6752) * fix: fix resource filters dropdown events * fix: remove teleported:false * fix: fix event selection event naming (#6753) * fix: removed console.log (#6754) * fix: rever await nextTick changes * fix: redo linting changes * fix(editor): Redraw node connections if adding more than one node to canvas (#6755) * fix(editor): Redraw node connections if adding more than one node to canvas Signed-off-by: Oleg Ivaniv * Update position before connection two nodes * Lint fix --------- Signed-off-by: Oleg Ivaniv Co-authored-by: Alex Grozav * fix(editor): Fix `ResourceMapper` unit tests (#6758) * ✔️ Fix matching columns test * ✔️ Fix multiple matching columns test * ✔️ Removing `skip` from the last test * fix: Allow pasting a big workflow (#6760) * fix: pasting a big workflow * chore: update comment * refactor: move try/catch to function * refactor: move try/catch to function * fix(editor): Fix modal layer width * fix: fix position changes * fix: undo it.only * fix: make undo/redo multiple steps more verbose * fix: Fix value survey styles (#6764) * fix: fix value survey styles * fix: lint * Revert "fix: lint" 72869c431f1448861df021be041b61c62f1e3118 * fix: lint * fix(editor): Fix collapsed sub menu * fix: Fix drawer animation (#6767) fix: drawer animation * fix(editor): Fix source control buttons (#6769) * fix: Respect modal width --------- Signed-off-by: Oleg Ivaniv Co-authored-by: Alex Grozav Co-authored-by: Csaba Tuncsik Co-authored-by: OlegIvaniv Co-authored-by: Milorad FIlipović Co-authored-by: Iván Ovejero * fix(editor): Fix tooltip opening delay prop name (#6776) fix(editor): fix tooltip opening delay prop name * fix(editor): Fix collapsed sub menu elements (#6778) * fix: Remove number input arrows (no-changelog) (#6782) fix: remove number input arrows * ci: Update most of the dev tooling (no-changelog) (#6780) * fix(TheHive Node): Treat `ApiKey` as a secret (#6786) * test(editor): Prevent node view unload by default in e2e run (#6787) Signed-off-by: Oleg Ivaniv * fix(editor): Resolve vue 3 related console-warnings (#6779) * fix(editor): Resolve vue 3 related console-warnings Signed-off-by: Oleg Ivaniv * Use span as component wrapper instead of div Signed-off-by: Oleg Ivaniv * Wrap popover component in span Signed-off-by: Oleg Ivaniv --------- Signed-off-by: Oleg Ivaniv * fix(editor): Vue3 - Fix modal positioning and multi-select tag sizing (#6783) * ✨ Updating modals positioning within the overlay * 💄 Implemented multi-select variant with small tabs * ✔️ Removing password link clicks while modal is open in e2e tests * Set generous timeout for $paramter resolve Signed-off-by: Oleg Ivaniv --------- Signed-off-by: Oleg Ivaniv Co-authored-by: Oleg Ivaniv * ci: Fix linting issues (no-changelog) (#6788) * ci: Fix linting (no-changelog) * lintfix for nodes-base as well * fix(editor): Fix code node highlight error (#6791) Signed-off-by: Oleg Ivaniv * feat(core): Credentials for popular SecOps services, Part 1 (#6775) * refactor: Clear unused ESLint directives from BE packages (no-changelog) (#6798) * refactor(core): Cache workflow ownership (#6738) * refactor: Set up ownership service * refactor: Specify cache keys and values * refactor: Replace util with service calls * test: Mock service in tests * refactor: Use dependency injection * test: Write tests * refactor: Apply feedback from Omar and Micha * test: Fix tests * test: Fix missing spot * refactor: Return user entity from cache * refactor: More dependency injection! * fix(editor): Prevent text edit dialog from re-opening in same tick (#6781) * fix: prevent reopenning textedit dialog in same tick * fix: add same logic for code edit dialog * fix: remove stop modifier * fix: blur input field when closing modal, removing default element-plus behaviour * test(editor): Do not chain invoke calls after assertions in 24-ndv-paired-item e2e spec (no-changelog) (#6800) * test(editor): Do not chaing invoke calls after assertions in 24-ndv-paired-item e2e spec * Do not chaing realHover after assertion Signed-off-by: Oleg Ivaniv * Remove .only Signed-off-by: Oleg Ivaniv --------- Signed-off-by: Oleg Ivaniv * fix(Todoist Node): Fix issue with section id being ignored (#6799) * test(editor): Add canvas actions E2E tests (#6723) (#6790) * test(editor): Add canvas actions E2E tests (#6723) * test(editor): Add canvas actions E2E tests * test(editor): Open category items in node creator when category dropped on canvas * test(editor): Have new position counted only once in drag * test(editor): rename test (cherry picked from commit 052d82b2208c1b2e6f62c6004822c6278c15278b) * test: fix drag positioning * fix(core): Add missing primary key on the `execution_data` table on postgres (#6797) * fix: Review fixes Signed-off-by: Oleg Ivaniv * fix: Fin locales Signed-off-by: Oleg Ivaniv * Fix merging errors Signed-off-by: Oleg Ivaniv * Map erros based on statusCode Signed-off-by: Oleg Ivaniv * Fix code replacing Signed-off-by: Oleg Ivaniv * Fix code formatting Signed-off-by: Oleg Ivaniv * Address review points Signed-off-by: Oleg Ivaniv * Optionally access total_tokens * Clean-up Ask AI modal Signed-off-by: Oleg Ivaniv * Store prompt in sessionStorage Signed-off-by: Oleg Ivaniv * Improve schema generation, only get parent nodes Signed-off-by: Oleg Ivaniv * Send error messages to telemetry, aske before switching tabs Signed-off-by: Oleg Ivaniv * Add locale Signed-off-by: Oleg Ivaniv * Post-merge cleanup Signed-off-by: Oleg Ivaniv * Move Ask AI into separate folder Signed-off-by: Oleg Ivaniv * Lint fix Signed-off-by: Oleg Ivaniv * Constants lint fix Signed-off-by: Oleg Ivaniv * Add Ask AI e2e tests and fix linting issues Signed-off-by: Oleg Ivaniv * Move CircleLoader to design-lib Signed-off-by: Oleg Ivaniv * Replace circle-lodaer and move el-tabs styles to n8n theme Signed-off-by: Oleg Ivaniv * Fix placeholder & e2e tests Signed-off-by: Oleg Ivaniv * Remove old CircleLoader Signed-off-by: Oleg Ivaniv --------- Signed-off-by: Oleg Ivaniv Co-authored-by: ricardo Co-authored-by: Alex Grozav Co-authored-by: Romain Dunand Co-authored-by: Jon Co-authored-by: Michael Kret <88898367+michael-radency@users.noreply.github.com> Co-authored-by: कारतोफ्फेलस्क्रिप्ट™ Co-authored-by: Csaba Tuncsik Co-authored-by: Iván Ovejero Co-authored-by: Omar Ajoue Co-authored-by: Michael Auerswald Co-authored-by: Milorad FIlipović Co-authored-by: Michael Kret Co-authored-by: Val <68596159+valya@users.noreply.github.com> Co-authored-by: Marcus <56945030+maspio@users.noreply.github.com> Co-authored-by: Jordan Hall Co-authored-by: qg-horie <36725144+qg-horie@users.noreply.github.com> Co-authored-by: Ricardo Espinoza Co-authored-by: कारतोफ्फेलस्क्रिप्ट™ Co-authored-by: Ali Afsharzadeh Co-authored-by: Giulio Andreini Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Mutasem Aldmour <4711238+mutdmour@users.noreply.github.com> --- cypress/e2e/6-code-node.cy.ts | 165 +++++++- cypress/pages/ndv.ts | 2 +- packages/cli/src/Server.ts | 3 + packages/cli/src/config/index.ts | 1 + packages/cli/src/config/schema.ts | 9 + .../N8nCircleLoader/CircleLoader.stories.ts | 50 +++ .../N8nCircleLoader/CircleLoader.vue | 63 +++ .../__tests__/CircleLoader.spec.ts | 15 + .../__snapshots__/CircleLoader.spec.ts.snap | 8 + .../src/components/N8nCircleLoader/index.ts | 3 + .../design-system/src/components/index.ts | 1 + packages/design-system/src/plugin.ts | 2 + packages/editor-ui/src/api/ai.ts | 34 ++ .../editor-ui/src/components/AskAiModal.vue | 52 --- .../components/CodeNodeEditor/AskAI/AskAI.vue | 392 ++++++++++++++++++ .../CodeNodeEditor/CodeNodeEditor.vue | 147 +++++-- .../src/components/CodeNodeEditor/linter.ts | 53 +-- packages/editor-ui/src/components/Modals.vue | 8 - .../src/components/RunDataSchema.vue | 17 +- .../__tests__/useDataSchema.test.ts | 355 ++++++++++++++++ packages/editor-ui/src/composables/index.ts | 1 + .../src/composables/useDataSchema.ts | 130 ++++++ packages/editor-ui/src/constants.ts | 16 +- packages/editor-ui/src/n8n-theme.scss | 24 ++ .../src/plugins/i18n/locales/en.json | 30 ++ .../editor-ui/src/plugins/telemetry/index.ts | 14 + packages/editor-ui/src/stores/ui.store.ts | 7 +- .../src/utils/__tests__/typesUtils.test.ts | 353 +--------------- packages/editor-ui/src/utils/typesUtils.ts | 41 -- packages/workflow/src/Interfaces.ts | 3 + 30 files changed, 1440 insertions(+), 559 deletions(-) create mode 100644 packages/design-system/src/components/N8nCircleLoader/CircleLoader.stories.ts create mode 100644 packages/design-system/src/components/N8nCircleLoader/CircleLoader.vue create mode 100644 packages/design-system/src/components/N8nCircleLoader/__tests__/CircleLoader.spec.ts create mode 100644 packages/design-system/src/components/N8nCircleLoader/__tests__/__snapshots__/CircleLoader.spec.ts.snap create mode 100644 packages/design-system/src/components/N8nCircleLoader/index.ts create mode 100644 packages/editor-ui/src/api/ai.ts delete mode 100644 packages/editor-ui/src/components/AskAiModal.vue create mode 100644 packages/editor-ui/src/components/CodeNodeEditor/AskAI/AskAI.vue create mode 100644 packages/editor-ui/src/composables/__tests__/useDataSchema.test.ts create mode 100644 packages/editor-ui/src/composables/useDataSchema.ts diff --git a/cypress/e2e/6-code-node.cy.ts b/cypress/e2e/6-code-node.cy.ts index 4a987dd6cdce6..0ed9ba5089b6b 100644 --- a/cypress/e2e/6-code-node.cy.ts +++ b/cypress/e2e/6-code-node.cy.ts @@ -5,29 +5,158 @@ const WorkflowPage = new WorkflowPageClass(); const ndv = new NDV(); describe('Code node', () => { - beforeEach(() => { - WorkflowPage.actions.visit(); - }); + describe('Code editor', () => { + beforeEach(() => { + WorkflowPage.actions.visit(); + WorkflowPage.actions.addInitialNodeToCanvas('Manual'); + WorkflowPage.actions.addNodeToCanvas('Code', true, true); + }); - it('should execute the placeholder in all-items mode successfully', () => { - WorkflowPage.actions.addInitialNodeToCanvas('Manual'); - WorkflowPage.actions.addNodeToCanvas('Code'); - WorkflowPage.actions.openNode('Code'); + it('should show correct placeholders switching modes', () => { + cy.contains("// Loop over input items and add a new field").should('be.visible'); - ndv.actions.execute(); + ndv.getters.parameterInput('mode').click(); + ndv.actions.selectOptionInParameterDropdown('mode', 'Run Once for Each Item'); - WorkflowPage.getters.successToast().contains('Node executed successfully'); - }); + cy.contains("// Add a new field called 'myNewField'").should('be.visible'); + + ndv.getters.parameterInput('mode').click(); + ndv.actions.selectOptionInParameterDropdown('mode', 'Run Once for All Items'); + cy.contains("// Loop over input items and add a new field").should('be.visible'); + }) + + it('should execute the placeholder successfully in both modes', () => { + ndv.actions.execute(); + + WorkflowPage.getters.successToast().contains('Node executed successfully'); + ndv.getters.parameterInput('mode').click(); + ndv.actions.selectOptionInParameterDropdown('mode', 'Run Once for Each Item'); + + ndv.actions.execute(); + + WorkflowPage.getters.successToast().contains('Node executed successfully'); + }); + }) + + describe('Ask AI', () => { + it('tab should display based on experiment', () => { + WorkflowPage.actions.visit(); + cy.window().then((win) => { + win.featureFlags.override('011_ask_AI', 'control'); + WorkflowPage.actions.addInitialNodeToCanvas('Manual'); + WorkflowPage.actions.addNodeToCanvas('Code'); + WorkflowPage.actions.openNode('Code'); + + cy.getByTestId('code-node-tab-ai').should('not.exist'); + + ndv.actions.close(); + win.featureFlags.override('011_ask_AI', undefined); + WorkflowPage.actions.openNode('Code'); + cy.getByTestId('code-node-tab-ai').should('not.exist'); + }) + }) + + describe('Enabled', () => { + beforeEach(() => { + WorkflowPage.actions.visit(); + cy.window().then((win) => { + win.featureFlags.override('011_ask_AI', 'gpt3'); + WorkflowPage.actions.addInitialNodeToCanvas('Manual'); + WorkflowPage.actions.addNodeToCanvas('Code', true, true); + }) + }) + + it('tab should exist if experiment selected and be selectable', () => { + cy.getByTestId('code-node-tab-ai').should('exist'); + cy.get('#tab-ask-ai').click(); + cy.contains('Hey AI, generate JavaScript').should('exist'); + }) + + it('generate code button should have correct state & tooltips', () => { + cy.getByTestId('code-node-tab-ai').should('exist'); + cy.get('#tab-ask-ai').click(); + + + cy.getByTestId('ask-ai-cta').should('be.disabled'); + cy.getByTestId('ask-ai-cta').realHover(); + cy.getByTestId('ask-ai-cta-tooltip-no-input-data').should('exist'); + ndv.actions.executePrevious(); + cy.getByTestId('ask-ai-cta').realHover(); + cy.getByTestId('ask-ai-cta-tooltip-no-prompt').should('exist'); + cy.getByTestId('ask-ai-prompt-input') + // Type random 14 character string + .type([...Array(14)].map(() => (Math.random() * 36 | 0).toString(36)).join('')) + + cy.getByTestId('ask-ai-cta').realHover(); + cy.getByTestId('ask-ai-cta-tooltip-prompt-too-short').should('exist'); + + cy.getByTestId('ask-ai-prompt-input') + .clear() + // Type random 15 character string + .type([...Array(15)].map(() => (Math.random() * 36 | 0).toString(36)).join('')) + cy.getByTestId('ask-ai-cta').should('be.enabled'); + + cy.getByTestId('ask-ai-prompt-counter').should('contain.text', '15 / 600'); + }) + + it('should send correct schema and replace code', () => { + const prompt = [...Array(20)].map(() => (Math.random() * 36 | 0).toString(36)).join(''); + cy.get('#tab-ask-ai').click(); + ndv.actions.executePrevious(); + + cy.getByTestId('ask-ai-prompt-input').type(prompt) + + cy.intercept('POST', '/rest/ask-ai', { + statusCode: 200, + body: { + data: { + code: 'console.log("Hello World")', + usage: { + prompt_tokens: 15, + completion_tokens: 15, + total_tokens: 30 + } + }, + } + }).as('ask-ai'); + cy.getByTestId('ask-ai-cta').click(); + cy.wait('@ask-ai') + .its('request.body') + .should('deep.include', { + question: prompt, + model: "gpt-3.5-turbo-16k", + context: { schema: [] } + }); + + cy.contains('Code generation completed').should('be.visible') + cy.getByTestId('code-node-tab-code').should('contain.text', 'console.log("Hello World")'); + cy.get('#tab-code').should('have.class', 'is-active'); + }) + + it('should show error based on status code', () => { + const prompt = [...Array(20)].map(() => (Math.random() * 36 | 0).toString(36)).join(''); + cy.get('#tab-ask-ai').click(); + ndv.actions.executePrevious(); + + cy.getByTestId('ask-ai-prompt-input').type(prompt) - it('should execute the placeholder in each-item mode successfully', () => { - WorkflowPage.actions.addInitialNodeToCanvas('Manual'); - WorkflowPage.actions.addNodeToCanvas('Code'); - WorkflowPage.actions.openNode('Code'); - ndv.getters.parameterInput('mode').click(); - ndv.actions.selectOptionInParameterDropdown('mode', 'Run Once for Each Item'); + const handledCodes = [ + { code: 400, message: 'Code generation failed due to an unknown reason' }, + { code: 413, message: 'Your workflow data is too large for AI to process' }, + { code: 429, message: 'We\'ve hit our rate limit with our AI partner' }, + { code: 500, message: 'Code generation failed due to an unknown reason' }, + ] - ndv.actions.execute(); + handledCodes.forEach(({ code, message }) => { + cy.intercept('POST', '/rest/ask-ai', { + statusCode: code, + status: code, + }).as('ask-ai'); - WorkflowPage.getters.successToast().contains('Node executed successfully'); + cy.getByTestId('ask-ai-cta').click(); + cy.contains(message).should('be.visible') + }) + }) + }) }); }); diff --git a/cypress/pages/ndv.ts b/cypress/pages/ndv.ts index bde403a0fe626..301de78cfe5a3 100644 --- a/cypress/pages/ndv.ts +++ b/cypress/pages/ndv.ts @@ -114,7 +114,7 @@ export class NDV extends BasePage { cy.get('body').type('{enter}'); }, executePrevious: () => { - this.getters.executePrevious().click(); + this.getters.executePrevious().click({ force: true }); }, mapDataFromHeader: (col: number, parameterName: string) => { const draggable = `[data-test-id="ndv-input-panel"] [data-test-id="ndv-data-container"] table th:nth-child(${col})`; diff --git a/packages/cli/src/Server.ts b/packages/cli/src/Server.ts index 2a2a532944e86..28dd62a14109c 100644 --- a/packages/cli/src/Server.ts +++ b/packages/cli/src/Server.ts @@ -325,6 +325,9 @@ export class Server extends AbstractServer { banners: { dismissed: [], }, + ai: { + enabled: config.getEnv('ai.enabled'), + }, }; } diff --git a/packages/cli/src/config/index.ts b/packages/cli/src/config/index.ts index 351b31d853cdc..2c2890412f50e 100644 --- a/packages/cli/src/config/index.ts +++ b/packages/cli/src/config/index.ts @@ -18,6 +18,7 @@ if (inE2ETests) { N8N_PUBLIC_API_DISABLED: 'true', EXTERNAL_FRONTEND_HOOKS_URLS: '', N8N_PERSONALIZATION_ENABLED: 'false', + N8N_AI_ENABLED: 'true', }; } else if (inTest) { const testsDir = join(tmpdir(), 'n8n-tests/'); diff --git a/packages/cli/src/config/schema.ts b/packages/cli/src/config/schema.ts index 74e4ae67eff64..d24fd38c16219 100644 --- a/packages/cli/src/config/schema.ts +++ b/packages/cli/src/config/schema.ts @@ -1174,4 +1174,13 @@ export const schema = { }, }, }, + + ai: { + enabled: { + doc: 'Whether AI features are enabled', + format: Boolean, + default: false, + env: 'N8N_AI_ENABLED', + }, + }, }; diff --git a/packages/design-system/src/components/N8nCircleLoader/CircleLoader.stories.ts b/packages/design-system/src/components/N8nCircleLoader/CircleLoader.stories.ts new file mode 100644 index 0000000000000..a9f11a3165579 --- /dev/null +++ b/packages/design-system/src/components/N8nCircleLoader/CircleLoader.stories.ts @@ -0,0 +1,50 @@ +import N8nCircleLoader from './CircleLoader.vue'; +import type { StoryFn } from '@storybook/vue3'; + +export default { + title: 'Atoms/CircleLoader', + component: N8nCircleLoader, + argTypes: { + radius: { + control: { + type: 'number', + }, + }, + progress: { + control: { + type: 'number', + }, + }, + strokeWidth: { + control: { + type: 'number', + }, + }, + }, +}; + +interface Args { + radius: number; + progress: number; + strokeWidth: number; +} + +const template: StoryFn = (args, { argTypes }) => ({ + setup: () => ({ args }), + props: Object.keys(argTypes), + components: { + N8nCircleLoader, + }, + template: ` +
+ +
+ `, +}); + +export const defaultCircleLoader = template.bind({}); +defaultCircleLoader.args = { + radius: 20, + progress: 42, + strokeWidth: 10, +}; diff --git a/packages/design-system/src/components/N8nCircleLoader/CircleLoader.vue b/packages/design-system/src/components/N8nCircleLoader/CircleLoader.vue new file mode 100644 index 0000000000000..a9231c2852b04 --- /dev/null +++ b/packages/design-system/src/components/N8nCircleLoader/CircleLoader.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/packages/design-system/src/components/N8nCircleLoader/__tests__/CircleLoader.spec.ts b/packages/design-system/src/components/N8nCircleLoader/__tests__/CircleLoader.spec.ts new file mode 100644 index 0000000000000..a05b4c219af86 --- /dev/null +++ b/packages/design-system/src/components/N8nCircleLoader/__tests__/CircleLoader.spec.ts @@ -0,0 +1,15 @@ +import { render } from '@testing-library/vue'; +import N8NCircleLoader from '../CircleLoader.vue'; + +describe('N8NCircleLoader', () => { + it('should render correctly', () => { + const wrapper = render(N8NCircleLoader, { + props: { + radius: 20, + progress: 42, + strokeWidth: 10, + }, + }); + expect(wrapper.html()).toMatchSnapshot(); + }); +}); diff --git a/packages/design-system/src/components/N8nCircleLoader/__tests__/__snapshots__/CircleLoader.spec.ts.snap b/packages/design-system/src/components/N8nCircleLoader/__tests__/__snapshots__/CircleLoader.spec.ts.snap new file mode 100644 index 0000000000000..1f208ed67dfe9 --- /dev/null +++ b/packages/design-system/src/components/N8nCircleLoader/__tests__/__snapshots__/CircleLoader.spec.ts.snap @@ -0,0 +1,8 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`N8NCircleLoader > should render correctly 1`] = ` +"
+ + +
" +`; diff --git a/packages/design-system/src/components/N8nCircleLoader/index.ts b/packages/design-system/src/components/N8nCircleLoader/index.ts new file mode 100644 index 0000000000000..fcd1764c53831 --- /dev/null +++ b/packages/design-system/src/components/N8nCircleLoader/index.ts @@ -0,0 +1,3 @@ +import N8nCircleLoader from './CircleLoader.vue'; + +export default N8nCircleLoader; diff --git a/packages/design-system/src/components/index.ts b/packages/design-system/src/components/index.ts index 888149da2cf0b..9e9cbd616e245 100644 --- a/packages/design-system/src/components/index.ts +++ b/packages/design-system/src/components/index.ts @@ -9,6 +9,7 @@ export { default as N8nButton } from './N8nButton'; export { default as N8nCallout } from './N8nCallout'; export { default as N8nCard } from './N8nCard'; export { default as N8nCheckbox } from './N8nCheckbox'; +export { default as N8nCircleLoader } from './N8nCircleLoader'; export { default as N8nColorPicker } from './N8nColorPicker'; export { default as N8nDatatable } from './N8nDatatable'; export { default as N8nFormBox } from './N8nFormBox'; diff --git a/packages/design-system/src/plugin.ts b/packages/design-system/src/plugin.ts index 1ad81241cc441..2f0bea9017f56 100644 --- a/packages/design-system/src/plugin.ts +++ b/packages/design-system/src/plugin.ts @@ -12,6 +12,7 @@ import { N8nCallout, N8nCard, N8nCheckbox, + N8nCircleLoader, N8nColorPicker, N8nDatatable, N8nFormBox, @@ -66,6 +67,7 @@ export const N8nPlugin: Plugin<{}> = { app.component('n8n-callout', N8nCallout); app.component('n8n-card', N8nCard); app.component('n8n-checkbox', N8nCheckbox); + app.component('n8n-circle-loader', N8nCircleLoader); app.component('n8n-color-picker', N8nColorPicker); app.component('n8n-datatable', N8nDatatable); app.component('n8n-form-box', N8nFormBox); diff --git a/packages/editor-ui/src/api/ai.ts b/packages/editor-ui/src/api/ai.ts new file mode 100644 index 0000000000000..95ace358fbdfe --- /dev/null +++ b/packages/editor-ui/src/api/ai.ts @@ -0,0 +1,34 @@ +import type { IRestApiContext, Schema } from '@/Interface'; +import { makeRestApiRequest } from '@/utils/apiUtils'; +import type { IDataObject } from 'n8n-workflow'; + +type Usage = { + prompt_tokens: number; + completion_tokens: number; + total_tokens: number; +}; + +export async function generateCodeForPrompt( + ctx: IRestApiContext, + { + question, + context, + model, + n8nVersion, + }: { + question: string; + context: { + schema: Array<{ nodeName: string; schema: Schema }>; + inputSchema: { nodeName: string; schema: Schema }; + }; + model: string; + n8nVersion: string; + }, +): Promise<{ code: string; usage: Usage }> { + return makeRestApiRequest(ctx, 'POST', '/ask-ai', { + question, + context, + model, + n8nVersion, + } as IDataObject); +} diff --git a/packages/editor-ui/src/components/AskAiModal.vue b/packages/editor-ui/src/components/AskAiModal.vue deleted file mode 100644 index 5a606964e462e..0000000000000 --- a/packages/editor-ui/src/components/AskAiModal.vue +++ /dev/null @@ -1,52 +0,0 @@ - - - - - diff --git a/packages/editor-ui/src/components/CodeNodeEditor/AskAI/AskAI.vue b/packages/editor-ui/src/components/CodeNodeEditor/AskAI/AskAI.vue new file mode 100644 index 0000000000000..9a4876b33bd6c --- /dev/null +++ b/packages/editor-ui/src/components/CodeNodeEditor/AskAI/AskAI.vue @@ -0,0 +1,392 @@ + + + + + + + diff --git a/packages/editor-ui/src/components/CodeNodeEditor/CodeNodeEditor.vue b/packages/editor-ui/src/components/CodeNodeEditor/CodeNodeEditor.vue index 2a25169fb10af..14401cd10fb69 100644 --- a/packages/editor-ui/src/components/CodeNodeEditor/CodeNodeEditor.vue +++ b/packages/editor-ui/src/components/CodeNodeEditor/CodeNodeEditor.vue @@ -5,24 +5,46 @@ @mouseout="onMouseOut" ref="codeNodeEditorContainer" > -
- - {{ $locale.baseText('codeNodeEditor.askAi') }} - + +
+ + + + + + + +
+ +