Commit graph

9749 commits

Author SHA1 Message Date
कारतोफ्फेलस्क्रिप्ट™ 281c0ae829
ci: Define explicit charset for mysql/mariadb test database (no-changelog) (#7053)
[DB
Tests](https://github.com/n8n-io/n8n/actions/runs/6035513299/job/16375993427)
2023-08-31 11:57:40 +02:00
Jon 3b9f0fed7a
feat(RSS Read Node): Add support for self signed certificates (#7039) 2023-08-30 16:11:47 +01:00
कारतोफ्फेलस्क्रिप्ट™ dfe0fa65f8
fix(Code Node): Switch over to vm2 fork (#7018)
[Fork is here](https://github.com/n8n-io/vm2). Currently there are no
modifications in it.
2023-08-30 11:17:04 +02:00
Marcus 9ca990b993
fix(MongoDB Node): Stringify response ObjectIDs (#6990)
Github issue / Community forum post (link here to close automatically):
2023-08-29 17:44:37 +02:00
Deborah 8a01d063c9
docs(editor): Update docs links for community nodes (#7044) 2023-08-29 16:40:33 +01:00
कारतोफ्फेलस्क्रिप्ट™ 9d70ce3a15
ci: Fix occasionally failing MFA e2e test (no-changelog) (#7040) 2023-08-29 15:39:10 +02:00
Mutasem Aldmour e1922f7383
test: Add tests for parameter lag (#6942)
Github issue / Community forum post (link here to close automatically):
2023-08-29 14:00:17 +02:00
OlegIvaniv 4600bb3317
fix(editor): Adjust Ask AI tracking events & pass NDV session id (no-changelog) (#7027)
Github issue / Community forum post (link here to close automatically):

---------

Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
2023-08-29 12:53:29 +02:00
Omar Ajoue a4578d68a5
feat: Create workflow history database migration (no-changelog) (#7031)
Github issue / Community forum post (link here to close automatically):

For the upcoming workflow history feature, we're creating the necessary
database tables.

Also changes the schema for Postgres so the versionId column is now
properly a UUID. The `using` statement prevents losing data, basically
converting the strings to UUIDs.

---------

Co-authored-by: कारतोफ्फेलस्क्रिप्ट™ <netroy@users.noreply.github.com>
2023-08-29 12:01:11 +02:00
कारतोफ्फेलस्क्रिप्ट™ 04e3178901
fix(core): Invalid NODES_INCLUDE should not crash the app (#7038)
Fixes #6683
2023-08-29 11:19:40 +02:00
Iván Ovejero 38579e538e
refactor: Skip resource mapper test causing timeouts (no-changelog) (#7034)
Skipping until we have time to address it. Failing at least since [early
last
week](https://n8nio.slack.com/archives/C03594NKD7W/p1692705748244249).
2023-08-29 11:19:16 +02:00
Iván Ovejero 53361d1d62
refactor: Move node i18n logic to NodeTypes (no-changelog) (#7035) 2023-08-29 10:46:24 +02:00
Iván Ovejero b716241b42
feat(core): Add filtering, selection and pagination to users (#6994)
https://linear.app/n8n/issue/PAY-646
2023-08-28 16:13:17 +02:00
Iván Ovejero a7785b2c5d
refactor: Upgrade to TypeScript 5.2 (no-changelog) (#7026)
https://devblogs.microsoft.com/typescript/announcing-typescript-5-2/

---------

Co-authored-by: कारतोफ्फेलस्क्रिप्ट™ <aditya@netroy.in>
2023-08-28 15:03:07 +02:00
कारतोफ्फेलस्क्रिप्ट™ 8bdb07d33d
fix(core): Setup websocket keep-live messages (#6866)
fixes #6757
2023-08-28 10:26:27 +02:00
Iván Ovejero 60c20a4ffd
refactor: Upgrade to pnpm 8.7 (no-changelog) (#7025)
https://github.com/pnpm/pnpm/releases/tag/v8.7.0
2023-08-28 10:10:59 +02:00
Michael Kret 176ccd62bc
fix(Postgres Node): Empty return data fix for Postgres and MySQL (#7016) 2023-08-25 18:38:09 +03:00
कारतोफ्फेलस्क्रिप्ट™ f02f6b659a
refactor(Item Lists Node): Delete duplicate code for sorting via code (no-changelog) (#7019) 2023-08-25 15:46:37 +02:00
Michael Kret d6e1cf232f
fix(Microsoft Excel 365 Node): Support for more extensions in workbook rlc (#7020)
Github issue / Community forum post (link here to close automatically):
2023-08-25 16:37:34 +03:00
कारतोफ्फेलस्क्रिप्ट™ 0356419c1a
feat(Code Node)!: Add a flag to disable forwarding of code logging to stdout (#6966) 2023-08-25 14:23:23 +02:00
कारतोफ्फेलस्क्रिप्ट™ 596b5695cd
fix(Webhook Node): Fix URL params for webhooks (#6986)
Fixes:

https://community.n8n.io/t/empty-params-variables-in-webhook-node-after-upgrading-to-n8n-1-3-1/29624
2023-08-25 13:28:32 +02:00
Iván Ovejero 87cf1d9c1b
refactor(core): Make controller constructors consistent (no-changelog) (#7015) 2023-08-25 13:23:22 +02:00
कारतोफ्फेलस्क्रिप्ट™ 07d3633a05
ci: Use an init container to fix mounted-path permissions in docker compose (#6956)
Fixes
* #6733
* #6793

related PR https://github.com/n8n-io/n8n-docker-caddy/pull/12
2023-08-25 11:51:55 +02:00
OlegIvaniv c2c3a8579d
fix(editor): Fix editor telemetry plugin linting issues (no-changelog) (#7014)
Github issue / Community forum post (link here to close automatically):
2023-08-25 11:42:37 +02:00
Alex Grozav ed927d34b2
feat: External Secrets storage for credentials (#6477)
Github issue / Community forum post (link here to close automatically):

---------

Co-authored-by: Romain Minaud <romain.minaud@gmail.com>
Co-authored-by: Valya Bullions <valya@n8n.io>
Co-authored-by: Csaba Tuncsik <csaba@n8n.io>
Co-authored-by: Giulio Andreini <g.andreini@gmail.com>
Co-authored-by: Omar Ajoue <krynble@gmail.com>
2023-08-25 10:33:46 +02:00
Csaba Tuncsik c833078c87
feat(editor): Debug executions in the editor (#6834) 2023-08-25 09:39:14 +02:00
कारतोफ्फेलस्क्रिप्ट™ 72f65dcdd6
refactor(core): Do not import BaseCommand outside src/commands (no-changelog) (#7008) 2023-08-25 00:17:00 +02:00
OlegIvaniv fb05afa165
fix(editor): Fix sending of Ask AI tracking events (#7002) 2023-08-24 18:40:00 +02:00
कारतोफ्फेलस्क्रिप्ट™ 92d4befea6
fix(core): Fix AddMfaColumns migration for sqlite (no-changelog) (#7006)
When ever we have migrations that use `.addColumn` or `.dropColumn`,
typeorm recreates tables for sqlite. so, we need to disable foreign key
enforcement for sqlite, or else data in some tables can get deleted
because of `ON DELETE CASCADE`

[This has happened in the
past](https://github.com/n8n-io/n8n/pull/6739), and we should really
come up with a way to prevent this from happening again.

---------

Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
Co-authored-by: Oleg Ivaniv <me@olegivaniv.com>
2023-08-24 09:31:37 -04:00
Ricardo Espinoza 2b7ba6fdf1
feat(core): Add MFA (#4767)
https://linear.app/n8n/issue/ADO-947/sync-branch-with-master-and-fix-fe-e2e-tets

---------

Co-authored-by: कारतोफ्फेलस्क्रिप्ट™ <aditya@netroy.in>
2023-08-23 22:59:16 -04:00
कारतोफ्फेलस्क्रिप्ट™ a01c3fbc19
fix(core): Throw NodeSSLError only for nodes that allow ignoring SSL issues (#6928) 2023-08-23 17:29:43 +02:00
Jon 2f81652400
fix(Agile CRM Node): Fix issue with company address not working (#6997) 2023-08-23 16:04:57 +01:00
github-actions[bot] 0e89a65b38
🚀 Release 1.4.0 (#7001)
# [1.4.0](https://github.com/n8n-io/n8n/compare/n8n@1.3.0...n8n@1.4.0)
(2023-08-23)


### Bug Fixes

* **core:** Add recoveryInProgress flag file
([#6962](https://github.com/n8n-io/n8n/issues/6962))
([7b96820](7b96820218))
* **core:** Fix `continueOnFail` for expression error in Set
([#6939](https://github.com/n8n-io/n8n/issues/6939))
([d4fac05](d4fac0527b))
* **core:** Fix `import:workflow` command
([#6996](https://github.com/n8n-io/n8n/issues/6996))
([8c38d85](8c38d85e76))
* **core:** Replace throw with warning when deactivating a non-active
workflow ([#6969](https://github.com/n8n-io/n8n/issues/6969))
([b6a00fe](b6a00febbd))
* **core:** Set up OAuth2 cred test
([#6960](https://github.com/n8n-io/n8n/issues/6960))
([4fc69b7](4fc69b776c))
* **editor:** Do not flag dynamic load options issue on expression
([#6932](https://github.com/n8n-io/n8n/issues/6932))
([60a1ef0](60a1ef0993))
* **editor:** Ensure community node install button tracks user agreement
([#6976](https://github.com/n8n-io/n8n/issues/6976))
([0ddfc73](0ddfc73bee))
* **editor:** Fix parsing for single quoted resolvables
([#6982](https://github.com/n8n-io/n8n/issues/6982))
([f32e993](f32e993227))
* **editor:** Fix Remove all fields not removing values in resource
mapper ([#6940](https://github.com/n8n-io/n8n/issues/6940))
([e6cff3f](e6cff3fce4))
* **editor:** Prevent Code node linter from erroring on `null` parse
([#6934](https://github.com/n8n-io/n8n/issues/6934))
([40d3a29](40d3a295d3))
* **Google Sheets Node:** Fix short sheet name interpreted as range
([#6989](https://github.com/n8n-io/n8n/issues/6989))
([00268a0](00268a019a))
* **Google Sheets Trigger Node:** Support sheet names with non-latin
characters ([#6970](https://github.com/n8n-io/n8n/issues/6970))
([052dd7c](052dd7cc9d))
* **GraphQL Node:** Improve error handling
([#6955](https://github.com/n8n-io/n8n/issues/6955))
([41db637](41db6371f0))
* **Mautic Node:** Fix issue with owner not being set correctly
([#6991](https://github.com/n8n-io/n8n/issues/6991))
([64b950f](64b950f294))
* **Salesforce Node:** Fix Account update owner operation
([#6958](https://github.com/n8n-io/n8n/issues/6958))
([9b27878](9b27878d8f))
* **Shopify Node:** Fix pagination when using options
([#6972](https://github.com/n8n-io/n8n/issues/6972))
([475d9c9](475d9c98e8))
* **Webhook Node:** Backward compatible form-data parsing for non-array
fields ([#6967](https://github.com/n8n-io/n8n/issues/6967))
([9455bcf](9455bcfef5))


### Features

* **core:** Add a warning to error workflows that cannot be started due
to permission or settings
([#6961](https://github.com/n8n-io/n8n/issues/6961))
([67b88f7](67b88f75f4))
* **core:** Add support for ready hooks, and credentials overwrite
endpoint in workers ([#6954](https://github.com/n8n-io/n8n/issues/6954))
([8f8a1de](8f8a1de3dd))
* **editor:** Show banner for non-production licenses
([#6943](https://github.com/n8n-io/n8n/issues/6943))
([413570c](413570c49d))
* Remove PostHog event calls
([#6915](https://github.com/n8n-io/n8n/issues/6915))
([270946a](270946a93b))
* **Send Email Node:** Add support for sending text and html email
simultaneously ([#6978](https://github.com/n8n-io/n8n/issues/6978))
([3860d41](3860d41d73))

Co-authored-by: krynble <krynble@users.noreply.github.com>
2023-08-23 15:41:49 +02:00
Iván Ovejero 8c38d85e76
fix(core): Fix import:workflow command (#6996)
Ref: https://github.com/n8n-io/n8n/actions/runs/5946170960

To test:

```sh
./packages/cli/bin/n8n export:workflow --all --output=./all-workflows.json
./packages/cli/bin/n8n import:workflow --input=./all-workflows.json
```
2023-08-23 15:15:14 +02:00
Jon 64b950f294
fix(Mautic Node): Fix issue with owner not being set correctly (#6991) 2023-08-23 12:02:53 +01:00
Marcus 00268a019a
fix(Google Sheets Node): Fix short sheet name interpreted as range (#6989)
Github issue / Community forum post (link here to close automatically):
https://github.com/n8n-io/n8n/issues/6203
2023-08-22 18:05:54 +02:00
Iván Ovejero 0ddfc73bee
fix(editor): Ensure community node install button tracks user agreement (#6976)
https://share.cleanshot.com/2rlsnTpf
2023-08-22 15:58:23 +02:00
Iván Ovejero 96a9de68a0
refactor(core): Move all user DB access to UserRepository (#6910)
Prep for https://linear.app/n8n/issue/PAY-646
2023-08-22 15:58:05 +02:00
Omar Ajoue 67b88f75f4
feat(core): Add a warning to error workflows that cannot be started due to permission or settings (#6961)
Github issue / Community forum post (link here to close automatically):

This PR aims to address an issue where an Error workflow cannot be
started, either due to insufficient permissions or because its settings
prevent it from being called.

The way of addressing this is by creating a failed execution for the
appointed error workflow stating the error, as can be seen below.

This means the execution itself won't start, as it's prevented before
the execution beings, but we save a "stub" execution to show the error.

![Screenshot 2023-08-17 at 16 17
02](https://github.com/n8n-io/n8n/assets/219272/d8ec0144-13c5-4b11-b91c-a6b440816ccf)
2023-08-22 15:26:33 +02:00
कारतोफ्फेलस्क्रिप्ट™ c188b0e9b2
ci: Improve the performance of the import/no-cycle linting rule (no-changelog) (#6985) 2023-08-22 13:44:50 +02:00
Iván Ovejero 2d1d638654
ci: Remove --report-unused-disable-directives to speed up CI (#6988)
https://n8nio.slack.com/archives/C03MZF137FV/p1692610341832309
2023-08-22 13:42:05 +02:00
Iván Ovejero 2cfa6d344e
refactor: Consolidate WorkflowService.getMany() (no-changelog) (#6892)
In scope:

- Consolidate `WorkflowService.getMany()`.
- Support non-entity field `ownedBy` for `select`.
- Support `tags` for `filter`.
- Move `addOwnerId` to `OwnershipService`.
- Remove unneeded check for `filter.id`.
- Simplify DTO validation for `filter` and `select`.
- Expand tests for `GET /workflows`.

Workflow list query DTOs:

```
filter → name, active, tags
select → id, name, active, tags, createdAt, updatedAt, versionId, ownedBy
```

Out of scope:

- Migrate `shared_workflow.roleId` and `shared_credential.roleId` to
string IDs.
- Refactor `WorkflowHelpers.getSharedWorkflowIds()`.
2023-08-22 13:19:37 +02:00
Iván Ovejero f32e993227
fix(editor): Fix parsing for single quoted resolvables (#6982)
Ref: https://github.com/n8n-io/codemirror-lang-n8n-sql/pull/6

<img width="574" alt="Capture 2023-08-21 at 10 08 53@2x"
src="https://github.com/n8n-io/n8n/assets/44588767/e1f88041-3577-41f3-b990-dbbf02741492">
2023-08-22 13:18:35 +02:00
Iván Ovejero 9b9b891e68
refactor(core): Move remaining tags logic to service (no-changelog) (#6920)
Co-authored-by: कारतोफ्फेलस्क्रिप्ट™ <aditya@netroy.in>
2023-08-22 12:24:43 +02:00
कारतोफ्फेलस्क्रिप्ट™ 9e3e298aca
ci: Fix versions of all external Github actions (no-changelog) (#6984) 2023-08-22 11:21:16 +02:00
Alex Grozav 3126a48e3b
fix(editor): Fix LDAP view info tip color (no-changelog) (#6981) 2023-08-22 08:12:14 +03:00
pemontto 3860d41d73
feat(Send Email Node): Add support for sending text and html email simultaneously (#6978) 2023-08-21 10:49:33 +01:00
Jon 475d9c98e8
fix(Shopify Node): Fix pagination when using options (#6972) 2023-08-21 10:47:38 +01:00
Iván Ovejero dd233bdf7d
test: Fix license tests when tenantId is not default (no-changelog) (#6977)
License tests fail if the env has a non-default `tenantId`:

<details>
<summary>Stack trace</summary>

```
nt -- license

> n8n@1.3.0 test /Users/ivov/Development/n8n/packages/cli
> pnpm test:sqlite "--" "license"


> n8n@1.3.0 test:sqlite /Users/ivov/Development/n8n/packages/cli
> N8N_LOG_LEVEL=silent DB_TYPE=sqlite jest "--" "license"

 FAIL  test/unit/License.test.ts
  License
    ✕ initializes license manager (8 ms)
    ✓ attempts to activate license with provided key
    ✓ renews license (1 ms)
    ✓ check if feature is enabled (2 ms)
    ✓ check if sharing feature is enabled (1 ms)
    ✓ check fetching entitlements
    ✓ check fetching feature values (1 ms)
    ✓ check management jwt
    ✓ getMainPlan() returns the right entitlement (3 ms)
    ✓ getMainPlan() returns undefined if there is no main plan

  ● License › initializes license manager

    expect(jest.fn()).toHaveBeenCalledWith(...expected)

    - Expected
    + Received

      Object {
        "autoRenewEnabled": true,
        "autoRenewOffset": 259200,
    -   "deviceFingerprint": Any<Function>,
    -   "loadCertStr": Any<Function>,
    -   "logger": Anything,
    +   "deviceFingerprint": [Function deviceFingerprint],
    +   "loadCertStr": [Function loadCertStr],
    +   "logger": Logger {
    +     "logger": DerivedLogger {
    +       "_events": Object {
    +         "data": [Function ondata],
    +         "end": [Function bound onceWrapper],
    +         "prefinish": [Function prefinish],
    +       },
    +       "_eventsCount": 3,
    +       "_maxListeners": undefined,
    +       "_readableState": ReadableState {
    +         "autoDestroy": false,
    +         "awaitDrain": 0,
    +         "buffer": BufferList {
    +           "head": null,
    +           "length": 0,
    +           "tail": null,
    +         },
    +         "decoder": null,
    +         "defaultEncoding": "utf8",
    +         "destroyed": false,
    +         "emitClose": true,
    +         "emittedReadable": false,
    +         "encoding": null,
    +         "endEmitted": false,
    +         "ended": false,
    +         "flowing": true,
    +         "highWaterMark": 16,
    +         "length": 0,
    +         "needReadable": true,
    +         "objectMode": true,
    +         "paused": false,
    +         "pipes": Console {
    +           "__winstonerror": [Function bound transportEvent],
    +           "__winstonwarn": [Function bound transportEvent],
    +           "_events": Object {
    +             "close": [Function bound onceWrapper],
    +             "drain": [Function pipeOnDrainFunctionResult],
    +             "error": Array [
    +               [Function onerror],
    +               [Function bound transportEvent],
    +             ],
    +             "finish": [Function bound onceWrapper],
    +             "unpipe": Array [
    +               [Function bound onceWrapper],
    +               [Function onunpipe],
    +             ],
    +             "warn": [Function bound transportEvent],
    +           },
    +           "_eventsCount": 6,
    +           "_maxListeners": 30,
    +           "_writableState": WritableState {
    +             "autoDestroy": false,
    +             "bufferProcessing": false,
    +             "bufferedRequest": null,
    +             "bufferedRequestCount": 0,
    +             "corked": 0,
    +             "corkedRequestsFree": CorkedRequest {
    +               "entry": null,
    +               "finish": [Function anonymous],
    +               "next": null,
    +             },
    +             "decodeStrings": true,
    +             "defaultEncoding": "utf8",
    +             "destroyed": false,
    +             "emitClose": true,
    +             "ended": false,
    +             "ending": false,
    +             "errorEmitted": false,
    +             "finalCalled": false,
    +             "finished": false,
    +             "highWaterMark": 16,
    +             "lastBufferedRequest": null,
    +             "length": 0,
    +             "needDrain": false,
    +             "objectMode": true,
    +             "onwrite": [Function anonymous],
    +             "pendingcb": 0,
    +             "prefinished": false,
    +             "sync": true,
    +             "writecb": null,
    +             "writelen": 0,
    +             "writing": false,
    +           },
    +           "consoleWarnLevels": Object {},
    +           "eol": "
    + ",
    +           "format": Printf {
    +             "template": [Function anonymous],
    +           },
    +           "handleExceptions": undefined,
    +           "handleRejections": undefined,
    +           "level": undefined,
    +           "levels": Object {
    +             "debug": 5,
    +             "error": 0,
    +             "http": 3,
    +             "info": 2,
    +             "silly": 6,
    +             "verbose": 4,
    +             "warn": 1,
    +           },
    +           "name": "console",
    +           "parent": [Circular],
    +           "silent": undefined,
    +           "stderrLevels": Object {},
    +           "writable": true,
    +           Symbol(kCapture): false,
    +         },
    +         "pipesCount": 1,
    +         "readableListening": false,
    +         "reading": false,
    +         "readingMore": false,
    +         "resumeScheduled": true,
    +         "sync": false,
    +       },
    +       "_transformState": Object {
    +         "afterTransform": [Function bound afterTransform],
    +         "needTransform": false,
    +         "transforming": false,
    +         "writecb": null,
    +         "writechunk": null,
    +         "writeencoding": null,
    +       },
    +       "_writableState": WritableState {
    +         "autoDestroy": false,
    +         "bufferProcessing": false,
    +         "bufferedRequest": null,
    +         "bufferedRequestCount": 0,
    +         "corked": 0,
    +         "corkedRequestsFree": CorkedRequest {
    +           "entry": null,
    +           "finish": [Function anonymous],
    +           "next": null,
    +         },
    +         "decodeStrings": true,
    +         "defaultEncoding": "utf8",
    +         "destroyed": false,
    +         "emitClose": true,
    +         "ended": false,
    +         "ending": false,
    +         "errorEmitted": false,
    +         "finalCalled": false,
    +         "finished": false,
    +         "highWaterMark": 16,
    +         "lastBufferedRequest": null,
    +         "length": 0,
    +         "needDrain": false,
    +         "objectMode": true,
    +         "onwrite": [Function anonymous],
    +         "pendingcb": 0,
    +         "prefinished": false,
    +         "sync": true,
    +         "writecb": null,
    +         "writelen": 0,
    +         "writing": false,
    +       },
    +       "allowHalfOpen": true,
    +       "defaultMeta": null,
    +       "exceptions": ExceptionHandler {
    +         "handlers": Map {},
    +         "logger": [Circular],
    +       },
    +       "exitOnError": true,
    +       "format": Format {
    +         "options": Object {},
    +       },
    +       "level": "silent",
    +       "levels": Object {
    +         "debug": 5,
    +         "error": 0,
    +         "http": 3,
    +         "info": 2,
    +         "silly": 6,
    +         "verbose": 4,
    +         "warn": 1,
    +       },
    +       "profilers": Object {},
    +       "readable": true,
    +       "rejections": RejectionHandler {
    +         "handlers": Map {},
    +         "logger": [Circular],
    +       },
    +       "silent": true,
    +       "writable": true,
    +       Symbol(kCapture): false,
    +     },
    +   },
        "productIdentifier": "n8n-1.3.0",
    -   "saveCertStr": Any<Function>,
    +   "saveCertStr": [Function saveCertStr],
        "server": "https://server.com/v1",
    -   "tenantId": 1,
    +   "tenantId": 1001,
      },

    Number of calls: 1

      29 |
      30 | 	test('initializes license manager', async () => {
    > 31 | 		expect(LicenseManager).toHaveBeenCalledWith({
         | 		                       ^
      32 | 			autoRenewEnabled: true,
      33 | 			autoRenewOffset: MOCK_RENEW_OFFSET,
      34 | 			deviceFingerprint: expect.any(Function),

      at Object.<anonymous> (test/unit/License.test.ts:31:26)


 RUNS  test/integration/license.api.test.ts

Test Suites: 1 failed, 1 of 2 total
Tests:       1 failed, 9 passed, 10 total
Snapshots:   0 total
Time:        2 s, estimated 4 s
████████████████████████████████████████^C ELIFECYCLE  Command failed.
 ELIFECYCLE  Test failed. See above for more details.
```

</details>
2023-08-21 10:29:21 +02:00
Michael Auerswald 7b96820218
fix(core): Add recoveryInProgress flag file (#6962)
Issue: during startup, unfinished executions trigger a recovery process
that, under certain circumstances, can in itself crash the instance
(e.g. by running our of memory), resulting in an infinite recovery loop

This PR aims to change this behaviour by writing a flag file when the
recovery process starts, and removing it when it finishes. In the case
of a crash, this flag will persist and upon the next attempt, the
recovery will instead do the absolute minimal (marking executions as
'crashed'), without attempting any 'crashable' actions.
2023-08-18 17:12:24 +02:00