├── .dockerignore ├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .gitattributes ├── .github ├── commit-convention.md ├── renovate.json5 └── workflows │ ├── bench.yml │ ├── ci.yml │ ├── deploy-demo.yml │ ├── deploy-docs.yml │ ├── publish-docker.yml │ └── release.yml ├── .gitignore ├── .npmrc ├── .prettierignore ├── .prettierrc.js ├── .turbo └── config.json ├── CONTRIBUTING.md ├── Dockerfile ├── Dockerfile.demo ├── README.md ├── assets └── assign_user.gif ├── docs ├── .vitepress │ ├── config.ts │ ├── meta.ts │ ├── style │ │ ├── main.css │ │ └── vars.css │ └── theme │ │ ├── components │ │ ├── AsideSponsors.vue │ │ ├── HomeSponsors.vue │ │ ├── SvgImage.vue │ │ └── sponsors.ts │ │ └── index.ts ├── api │ └── index.md ├── guide │ ├── actions.md │ ├── auth.md │ ├── index.md │ ├── input-output.md │ ├── install-mini.md │ ├── install-server.md │ └── sdk.md ├── index.md └── public │ ├── _headers │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── apple-touch-icon.png │ ├── favicon.ico │ ├── k_logo.png │ ├── logo_transparent.png │ └── robots.txt ├── examples ├── README.md ├── nestjs-with-sdk │ ├── Dockerfile │ ├── README.md │ ├── fly.toml │ ├── package.json │ ├── src │ │ ├── actions.provider.ts │ │ ├── app.controller.ts │ │ ├── app.module.ts │ │ ├── app.service.ts │ │ └── main.ts │ ├── tsconfig.build.json │ └── tsconfig.json └── nestjs │ ├── .env.development │ ├── nest-cli.json │ ├── package.json │ ├── src │ ├── actions.provider.ts │ ├── app.controller.ts │ ├── app.module.ts │ ├── app.service.ts │ └── main.ts │ ├── tsconfig.build.json │ └── tsconfig.json ├── fly.toml ├── package.json ├── packages ├── config │ ├── eslint-preset.js │ ├── eslint-typechecking-preset.js │ ├── jest.config.base.js │ ├── jest.config.dom.js │ ├── jest.config.node.js │ ├── package.json │ └── tsconfig.json ├── runnable-api │ ├── README.md │ ├── api.yml │ ├── client.ts │ ├── ids.ts │ ├── index.ts │ ├── openapitools.json │ ├── package.json │ ├── schema.ts │ └── ws.ts ├── runnable-app │ ├── .env.example │ ├── .gitignore │ ├── README.md │ ├── app │ │ ├── api │ │ │ └── context.ts │ │ ├── components │ │ │ ├── feedback │ │ │ │ ├── CatchBoundary.tsx │ │ │ │ └── ErrorBoundary.tsx │ │ │ ├── forms │ │ │ │ ├── CompositeInput.tsx │ │ │ │ ├── FormView.tsx │ │ │ │ ├── ImageInput.tsx │ │ │ │ ├── MultiSelect.tsx │ │ │ │ ├── SingleSelect.tsx │ │ │ │ ├── TableCell.tsx │ │ │ │ ├── TableInput.tsx │ │ │ │ └── TableView.tsx │ │ │ ├── icons │ │ │ │ └── Iconify.tsx │ │ │ ├── layout │ │ │ │ └── Page.tsx │ │ │ └── main │ │ │ │ ├── AppContainer.tsx │ │ │ │ └── Sidebar.tsx │ │ ├── entry.client.tsx │ │ ├── entry.server.tsx │ │ ├── models │ │ │ ├── auth.server.ts │ │ │ ├── env.ts │ │ │ ├── session.server.ts │ │ │ └── user.server.ts │ │ ├── root.tsx │ │ ├── routes │ │ │ ├── ($basename)._index.tsx │ │ │ ├── ($basename).actions.$actionId.tsx │ │ │ ├── ($basename).actions.$actionId_.workflows.$workflowId.tsx │ │ │ ├── ($basename).actions.$actionId_.workflows._index.tsx │ │ │ ├── ($basename).actions.$actionId_.workflows.new.tsx │ │ │ ├── ($basename).actions._index.tsx │ │ │ ├── ($basename).actions.tsx │ │ │ ├── ($basename).auth.callback.google.tsx │ │ │ ├── ($basename).healthcheck.tsx │ │ │ ├── ($basename).login.tsx │ │ │ └── ($basename).logout.tsx │ │ ├── styles │ │ │ ├── context.ts │ │ │ └── createEmotionCache.ts │ │ ├── types.ts │ │ ├── types │ │ │ └── global.d.ts │ │ └── utils │ │ │ ├── __tests__ │ │ │ └── parseFormData.test.ts │ │ │ ├── array.ts │ │ │ ├── assertExists.server.ts │ │ │ ├── internalRedirect.ts │ │ │ ├── objects.ts │ │ │ ├── parseFormData.ts │ │ │ ├── routes.ts │ │ │ └── utils.ts │ ├── jest.config.js │ ├── package.json │ ├── public │ │ └── favicon.ico │ ├── remix.config.js │ ├── remix.env.d.ts │ ├── rollup.config.js │ ├── server │ │ ├── __tests__ │ │ │ └── ws.test.ts │ │ ├── server-env.ts │ │ ├── server.ts │ │ └── ws │ │ │ ├── NamespacedRunnable.ts │ │ │ ├── RunnableWsConnection.ts │ │ │ └── RunnableWsServer.ts │ ├── tsconfig.json │ └── tsconfig.types.json ├── runnable-express │ ├── README.md │ ├── package.json │ ├── rollup.config.js │ ├── src │ │ ├── dev │ │ │ ├── actions.ts │ │ │ └── dev.ts │ │ ├── index.ts │ │ └── middleware.ts │ └── tsconfig.json ├── runnable-sdk │ ├── README.md │ ├── package.json │ ├── rollup.config.js │ ├── src │ │ ├── NamespacedRunnable.ts │ │ ├── Runnable.ts │ │ ├── RunnableWs.ts │ │ ├── api │ │ │ ├── context.ts │ │ │ ├── io.ts │ │ │ ├── validator.ts │ │ │ └── workflows.ts │ │ ├── index.ts │ │ ├── models │ │ │ ├── defer.ts │ │ │ ├── errors.ts │ │ │ ├── ids.ts │ │ │ └── workflows │ │ │ │ ├── InputBuilder.ts │ │ │ │ ├── bread-crumbs.server.ts │ │ │ │ ├── client-bridge.server.ts │ │ │ │ ├── normalizers.server.ts │ │ │ │ ├── types.ts │ │ │ │ ├── validators.server.ts │ │ │ │ ├── workflow-manager.server.ts │ │ │ │ └── workflow.server.ts │ │ ├── types.ts │ │ ├── types │ │ │ └── response.ts │ │ └── utils │ │ │ ├── objects.ts │ │ │ └── options.ts │ └── tsconfig.json └── tsconfig │ ├── README.md │ ├── base.json │ ├── library.json │ ├── nextjs.json │ ├── package.json │ ├── react-library.json │ └── vite.json ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── tsconfig.json └── turbo.json /.dockerignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | *.log 3 | .DS_Store 4 | .env 5 | /.cache 6 | /public/build 7 | /build 8 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | *.snap 4 | *.d.ts 5 | coverage 6 | build 7 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: [ 3 | 'eslint:recommended', 4 | 'plugin:unicorn/recommended', 5 | 'plugin:import/recommended', 6 | 'plugin:@typescript-eslint/recommended', 7 | 'plugin:react/recommended', 8 | // 'plugin:nestjs/recommended', 9 | 'prettier', 10 | ], 11 | env: { 12 | node: true, 13 | jest: true, 14 | }, 15 | ignorePatterns: ['.eslintrc.js', '*.generated.tsx', '**/generated/*.ts', 'CssBaseline.ts'], 16 | settings: { 17 | react: { 18 | version: 'detect', 19 | }, 20 | }, 21 | parser: '@typescript-eslint/parser', 22 | plugins: ['@typescript-eslint'], 23 | rules: { 24 | '@typescript-eslint/no-var-requires': 'warn', 25 | '@typescript-eslint/no-confusing-non-null-assertion': 'error', 26 | '@typescript-eslint/no-dynamic-delete': 'error', 27 | '@typescript-eslint/prefer-ts-expect-error': 'error', 28 | '@typescript-eslint/array-type': 'error', 29 | '@typescript-eslint/explicit-function-return-type': 'off', 30 | '@typescript-eslint/explicit-module-boundary-types': 'off', 31 | '@typescript-eslint/ban-types': 'off', 32 | '@typescript-eslint/no-namespace': 'off', 33 | '@typescript-eslint/no-empty-interface': 'off', 34 | '@typescript-eslint/no-empty-function': 'warn', 35 | '@typescript-eslint/no-shadow': 'warn', 36 | '@typescript-eslint/no-unused-vars': 'warn', 37 | // '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], 38 | 'unicorn/text-encoding-identifier-case': 'warn', 39 | 'unicorn/prefer-top-level-await': 'warn', 40 | 'unicorn/prefer-export-from': 'warn', 41 | 'unicorn/no-useless-undefined': 'warn', 42 | 'unicorn/prefer-module': 'warn', 43 | 'unicorn/expiring-todo-comments': 'off', 44 | 'unicorn/no-null': 'off', 45 | 'unicorn/no-array-callback-reference': 'off', 46 | 'unicorn/filename-case': 'off', 47 | 'unicorn/no-useless-promise-resolve-reject': 'off', 48 | 'import/namespace': 'off', 49 | 'import/named': 'off', 50 | 'import/default': 'off', 51 | 'import/no-unresolved': 'off', 52 | 'import/order': 'error', 53 | 'react/react-in-jsx-scope': 'off', 54 | 'react/prop-types': 'off', 55 | 'unicorn/prevent-abbreviations': 'off', 56 | 'no-var': 'warn', 57 | 'no-restricted-imports': ['error'], 58 | 'no-console': ['error', { allow: ['warn', 'error'] }], 59 | }, 60 | }; 61 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | -------------------------------------------------------------------------------- /.github/commit-convention.md: -------------------------------------------------------------------------------- 1 | ## Git Commit Message Convention 2 | 3 | > This is adapted from [Angular's commit convention](https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-angular). 4 | 5 | #### TL;DR: 6 | 7 | Messages must be matched by the following regex: 8 | 9 | 10 | ```js 11 | /^(revert: )?(feat|fix|docs|dx|refactor|perf|test|workflow|build|ci|chore|types|wip|release|deps)(\(.+\))?: .{1,50}/ 12 | ``` 13 | 14 | #### Examples 15 | 16 | Appears under "Features" header, `dev` subheader: 17 | 18 | ``` 19 | feat(dev): add 'comments' option 20 | ``` 21 | 22 | Appears under "Bug Fixes" header, `dev` subheader, with a link to issue #28: 23 | 24 | ``` 25 | fix(dev): fix dev error 26 | 27 | close #28 28 | ``` 29 | 30 | Appears under "Performance Improvements" header, and under "Breaking Changes" with the breaking change explanation: 31 | 32 | ``` 33 | perf(build): remove 'foo' option 34 | 35 | BREAKING CHANGE: The 'foo' option has been removed. 36 | ``` 37 | 38 | The following commit and commit `667ecc1` do not appear in the changelog if they are under the same release. If not, the revert commit appears under the "Reverts" header. 39 | 40 | ``` 41 | revert: feat(compiler): add 'comments' option 42 | 43 | This reverts commit 667ecc1654a317a13331b17617d973392f415f02. 44 | ``` 45 | 46 | ### Full Message Format 47 | 48 | A commit message consists of a **header**, **body** and **footer**. The header has a **type**, **scope** and **subject**: 49 | 50 | ``` 51 | (): 52 | 53 | 54 | 55 |