fuse-io 0.1.30__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- fuse_io-0.1.30/.python-version +1 -0
- fuse_io-0.1.30/LICENSE +21 -0
- fuse_io-0.1.30/MANIFEST.in +20 -0
- fuse_io-0.1.30/PKG-INFO +306 -0
- fuse_io-0.1.30/README.md +240 -0
- fuse_io-0.1.30/docs/pypi_publishing_guide.md +256 -0
- fuse_io-0.1.30/fuse/__init__.py +0 -0
- fuse_io-0.1.30/fuse/ai/__init__.py +0 -0
- fuse_io-0.1.30/fuse/ai/router.py +35 -0
- fuse_io-0.1.30/fuse/ai/service.py +538 -0
- fuse_io-0.1.30/fuse/alembic/README +1 -0
- fuse_io-0.1.30/fuse/alembic/env.py +90 -0
- fuse_io-0.1.30/fuse/alembic/script.py.mako +25 -0
- fuse_io-0.1.30/fuse/alembic/versions/.keep +0 -0
- fuse_io-0.1.30/fuse/alembic/versions/1439949b74ad_add_edge_handles.py +31 -0
- fuse_io-0.1.30/fuse/alembic/versions/1a31ce608336_add_cascade_delete_relationships.py +37 -0
- fuse_io-0.1.30/fuse/alembic/versions/2c7ca0ca6779_add_hashed_password_field_to_user_model.py +29 -0
- fuse_io-0.1.30/fuse/alembic/versions/82e10e9b2e3f_add_spec_column_to_workflownode_and_.py +34 -0
- fuse_io-0.1.30/fuse/alembic/versions/9426be80e78e_add_workflows.py +66 -0
- fuse_io-0.1.30/fuse/alembic/versions/9c0a54914c78_add_max_length_for_string_varchar_.py +65 -0
- fuse_io-0.1.30/fuse/alembic/versions/ceedbe88ef0d_add_v2_config_columns_to_workflow.py +33 -0
- fuse_io-0.1.30/fuse/alembic/versions/d98dd8ec85a3_edit_replace_id_integers_in_all_models_.py +99 -0
- fuse_io-0.1.30/fuse/alembic/versions/dd21742ef7b0_add_execution_models.py +54 -0
- fuse_io-0.1.30/fuse/alembic/versions/e2412789c190_initialize_models.py +54 -0
- fuse_io-0.1.30/fuse/alembic.ini +71 -0
- fuse_io-0.1.30/fuse/api.py +17 -0
- fuse_io-0.1.30/fuse/auth/__init__.py +9 -0
- fuse_io-0.1.30/fuse/auth/crud_user.py +63 -0
- fuse_io-0.1.30/fuse/auth/dependencies.py +69 -0
- fuse_io-0.1.30/fuse/auth/models.py +17 -0
- fuse_io-0.1.30/fuse/auth/router.py +147 -0
- fuse_io-0.1.30/fuse/auth/schemas.py +71 -0
- fuse_io-0.1.30/fuse/auth/service.py +51 -0
- fuse_io-0.1.30/fuse/auth/utils.py +142 -0
- fuse_io-0.1.30/fuse/backend_pre_start.py +39 -0
- fuse_io-0.1.30/fuse/base.py +71 -0
- fuse_io-0.1.30/fuse/cli.py +266 -0
- fuse_io-0.1.30/fuse/config.py +183 -0
- fuse_io-0.1.30/fuse/credentials/__init__.py +11 -0
- fuse_io-0.1.30/fuse/credentials/router.py +199 -0
- fuse_io-0.1.30/fuse/credentials/service.py +181 -0
- fuse_io-0.1.30/fuse/database.py +32 -0
- fuse_io-0.1.30/fuse/initial_data.py +24 -0
- fuse_io-0.1.30/fuse/items/__init__.py +9 -0
- fuse_io-0.1.30/fuse/items/crud_item.py +44 -0
- fuse_io-0.1.30/fuse/items/models.py +19 -0
- fuse_io-0.1.30/fuse/items/router.py +97 -0
- fuse_io-0.1.30/fuse/items/schemas.py +34 -0
- fuse_io-0.1.30/fuse/items/service.py +57 -0
- fuse_io-0.1.30/fuse/logger.py +156 -0
- fuse_io-0.1.30/fuse/main.py +121 -0
- fuse_io-0.1.30/fuse/models.py +10 -0
- fuse_io-0.1.30/fuse/static/404/index.html +1 -0
- fuse_io-0.1.30/fuse/static/404.html +1 -0
- fuse_io-0.1.30/fuse/static/__next.__PAGE__.txt +9 -0
- fuse_io-0.1.30/fuse/static/__next._full.txt +23 -0
- fuse_io-0.1.30/fuse/static/__next._head.txt +7 -0
- fuse_io-0.1.30/fuse/static/__next._index.txt +10 -0
- fuse_io-0.1.30/fuse/static/__next._tree.txt +3 -0
- fuse_io-0.1.30/fuse/static/_next/static/bAsbGnh27hobCWq6gYKAq/_buildManifest.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/bAsbGnh27hobCWq6gYKAq/_ssgManifest.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/162-d9110b81661c7d7d.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/232.97b298320d3351e9.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/24-4ee5417b9b9b92a9.js +5 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/275-f12d66089f519b01.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/324-771510774da7c693.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/361-1ce2845fa2b2c4a4.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/393-d1b3ea65900fdc5e.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/4-bdc965d7dcca4cab.js +33 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/4bd1b696-01b4a2ffa8bac205.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/501-397a9f42b1c4da0e.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/547-1833756cc09c3c28.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/794-803d64bb1ca09460.js +2 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/814-18bcbd34c09817f1.js +9 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/821-04976ebb62352e45.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/93-2937d48fc52107ef.js +9 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/app/(main)/ai-create-example/page-0a2e0f0b4460de7c.js +11 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/app/(main)/dashboard/page-7e9db37c6737695c.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/app/(main)/layout-5c636818aa3b7ed1.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/app/(main)/settings/page-00bc4735cc93b9be.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/app/(main)/workflows/page-7c3c63a11ae33eed.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/app/_global-error/page-116e68079fa76e6f.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/app/_not-found/page-bae0d4902c5585d3.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/app/auth/layout-116e68079fa76e6f.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/app/auth/login/page-546ffaa564d327e9.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/app/auth/register/page-2748b1af5b1b642a.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/app/credentials-test/page-1d2c37deaa189b43.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/app/error-033f2fd59b73a2d7.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/app/global-error-dcd149dc42c5186b.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/app/layout-d0d5a6a85d213394.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/app/loading-116e68079fa76e6f.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/app/oauth/callback/page-eecedf564f689d93.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/app/page-606905d313079604.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/app/workflows/[id]/error-66ff5093f583ae94.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/app/workflows/[id]/loading-116e68079fa76e6f.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/app/workflows/[id]/page-5459cee4cb66f5bc.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/app/workflows/error-61dbcd88cc0eff5c.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/app/workflows/loading-116e68079fa76e6f.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/c37d3baf-0fedbf5b6ffcd550.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/framework-3311683cffde0ebf.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/main-app-cf50eb2a7e26453d.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/main-d74776772a65895d.js +5 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/chunks/webpack-b28a02ce1f174559.js +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/css/59d0dfc36eeea694.css +5 -0
- fuse_io-0.1.30/fuse/static/_next/static/css/d1e1fa7731bfdccb.css +1 -0
- fuse_io-0.1.30/fuse/static/_next/static/media/636a5ac981f94f8b-s.p.woff2 +0 -0
- fuse_io-0.1.30/fuse/static/_next/static/media/6fe53d21e6e7ebd8-s.woff2 +0 -0
- fuse_io-0.1.30/fuse/static/_next/static/media/8ebc6e9dde468c4a-s.woff2 +0 -0
- fuse_io-0.1.30/fuse/static/_next/static/media/9e7b0a821b9dfcb4-s.woff2 +0 -0
- fuse_io-0.1.30/fuse/static/_not-found/__next._full.txt +19 -0
- fuse_io-0.1.30/fuse/static/_not-found/__next._head.txt +7 -0
- fuse_io-0.1.30/fuse/static/_not-found/__next._index.txt +10 -0
- fuse_io-0.1.30/fuse/static/_not-found/__next._not-found.__PAGE__.txt +5 -0
- fuse_io-0.1.30/fuse/static/_not-found/__next._not-found.txt +4 -0
- fuse_io-0.1.30/fuse/static/_not-found/__next._tree.txt +3 -0
- fuse_io-0.1.30/fuse/static/_not-found/index.html +1 -0
- fuse_io-0.1.30/fuse/static/_not-found/index.txt +19 -0
- fuse_io-0.1.30/fuse/static/ai-create-example/__next.!KG1haW4p.ai-create-example.__PAGE__.txt +9 -0
- fuse_io-0.1.30/fuse/static/ai-create-example/__next.!KG1haW4p.ai-create-example.txt +4 -0
- fuse_io-0.1.30/fuse/static/ai-create-example/__next.!KG1haW4p.txt +7 -0
- fuse_io-0.1.30/fuse/static/ai-create-example/__next._full.txt +26 -0
- fuse_io-0.1.30/fuse/static/ai-create-example/__next._head.txt +7 -0
- fuse_io-0.1.30/fuse/static/ai-create-example/__next._index.txt +10 -0
- fuse_io-0.1.30/fuse/static/ai-create-example/__next._tree.txt +3 -0
- fuse_io-0.1.30/fuse/static/ai-create-example/index.html +1 -0
- fuse_io-0.1.30/fuse/static/ai-create-example/index.txt +26 -0
- fuse_io-0.1.30/fuse/static/auth/login/__next._full.txt +23 -0
- fuse_io-0.1.30/fuse/static/auth/login/__next._head.txt +7 -0
- fuse_io-0.1.30/fuse/static/auth/login/__next._index.txt +10 -0
- fuse_io-0.1.30/fuse/static/auth/login/__next._tree.txt +3 -0
- fuse_io-0.1.30/fuse/static/auth/login/__next.auth.login.__PAGE__.txt +9 -0
- fuse_io-0.1.30/fuse/static/auth/login/__next.auth.login.txt +4 -0
- fuse_io-0.1.30/fuse/static/auth/login/__next.auth.txt +4 -0
- fuse_io-0.1.30/fuse/static/auth/login/index.html +1 -0
- fuse_io-0.1.30/fuse/static/auth/login/index.txt +23 -0
- fuse_io-0.1.30/fuse/static/auth/register/__next._full.txt +23 -0
- fuse_io-0.1.30/fuse/static/auth/register/__next._head.txt +7 -0
- fuse_io-0.1.30/fuse/static/auth/register/__next._index.txt +10 -0
- fuse_io-0.1.30/fuse/static/auth/register/__next._tree.txt +3 -0
- fuse_io-0.1.30/fuse/static/auth/register/__next.auth.register.__PAGE__.txt +9 -0
- fuse_io-0.1.30/fuse/static/auth/register/__next.auth.register.txt +4 -0
- fuse_io-0.1.30/fuse/static/auth/register/__next.auth.txt +4 -0
- fuse_io-0.1.30/fuse/static/auth/register/index.html +1 -0
- fuse_io-0.1.30/fuse/static/auth/register/index.txt +23 -0
- fuse_io-0.1.30/fuse/static/credentials-test/__next._full.txt +23 -0
- fuse_io-0.1.30/fuse/static/credentials-test/__next._head.txt +7 -0
- fuse_io-0.1.30/fuse/static/credentials-test/__next._index.txt +10 -0
- fuse_io-0.1.30/fuse/static/credentials-test/__next._tree.txt +3 -0
- fuse_io-0.1.30/fuse/static/credentials-test/__next.credentials-test.__PAGE__.txt +9 -0
- fuse_io-0.1.30/fuse/static/credentials-test/__next.credentials-test.txt +4 -0
- fuse_io-0.1.30/fuse/static/credentials-test/index.html +1 -0
- fuse_io-0.1.30/fuse/static/credentials-test/index.txt +23 -0
- fuse_io-0.1.30/fuse/static/dashboard/__next.!KG1haW4p.dashboard.__PAGE__.txt +9 -0
- fuse_io-0.1.30/fuse/static/dashboard/__next.!KG1haW4p.dashboard.txt +4 -0
- fuse_io-0.1.30/fuse/static/dashboard/__next.!KG1haW4p.txt +7 -0
- fuse_io-0.1.30/fuse/static/dashboard/__next._full.txt +26 -0
- fuse_io-0.1.30/fuse/static/dashboard/__next._head.txt +7 -0
- fuse_io-0.1.30/fuse/static/dashboard/__next._index.txt +10 -0
- fuse_io-0.1.30/fuse/static/dashboard/__next._tree.txt +3 -0
- fuse_io-0.1.30/fuse/static/dashboard/index.html +1 -0
- fuse_io-0.1.30/fuse/static/dashboard/index.txt +26 -0
- fuse_io-0.1.30/fuse/static/index.html +1 -0
- fuse_io-0.1.30/fuse/static/index.txt +23 -0
- fuse_io-0.1.30/fuse/static/oauth/callback/__next._full.txt +23 -0
- fuse_io-0.1.30/fuse/static/oauth/callback/__next._head.txt +7 -0
- fuse_io-0.1.30/fuse/static/oauth/callback/__next._index.txt +10 -0
- fuse_io-0.1.30/fuse/static/oauth/callback/__next._tree.txt +3 -0
- fuse_io-0.1.30/fuse/static/oauth/callback/__next.oauth.callback.__PAGE__.txt +9 -0
- fuse_io-0.1.30/fuse/static/oauth/callback/__next.oauth.callback.txt +4 -0
- fuse_io-0.1.30/fuse/static/oauth/callback/__next.oauth.txt +4 -0
- fuse_io-0.1.30/fuse/static/oauth/callback/index.html +1 -0
- fuse_io-0.1.30/fuse/static/oauth/callback/index.txt +23 -0
- fuse_io-0.1.30/fuse/static/settings/__next.!KG1haW4p.settings.__PAGE__.txt +9 -0
- fuse_io-0.1.30/fuse/static/settings/__next.!KG1haW4p.settings.txt +4 -0
- fuse_io-0.1.30/fuse/static/settings/__next.!KG1haW4p.txt +7 -0
- fuse_io-0.1.30/fuse/static/settings/__next._full.txt +26 -0
- fuse_io-0.1.30/fuse/static/settings/__next._head.txt +7 -0
- fuse_io-0.1.30/fuse/static/settings/__next._index.txt +10 -0
- fuse_io-0.1.30/fuse/static/settings/__next._tree.txt +3 -0
- fuse_io-0.1.30/fuse/static/settings/index.html +1 -0
- fuse_io-0.1.30/fuse/static/settings/index.txt +26 -0
- fuse_io-0.1.30/fuse/static/workflows/__next.!KG1haW4p.txt +7 -0
- fuse_io-0.1.30/fuse/static/workflows/__next.!KG1haW4p.workflows.__PAGE__.txt +10 -0
- fuse_io-0.1.30/fuse/static/workflows/__next.!KG1haW4p.workflows.txt +4 -0
- fuse_io-0.1.30/fuse/static/workflows/__next._full.txt +29 -0
- fuse_io-0.1.30/fuse/static/workflows/__next._head.txt +7 -0
- fuse_io-0.1.30/fuse/static/workflows/__next._index.txt +10 -0
- fuse_io-0.1.30/fuse/static/workflows/__next._tree.txt +4 -0
- fuse_io-0.1.30/fuse/static/workflows/index.html +1 -0
- fuse_io-0.1.30/fuse/static/workflows/index.txt +29 -0
- fuse_io-0.1.30/fuse/static/workflows/new/__next._full.txt +26 -0
- fuse_io-0.1.30/fuse/static/workflows/new/__next._head.txt +7 -0
- fuse_io-0.1.30/fuse/static/workflows/new/__next._index.txt +10 -0
- fuse_io-0.1.30/fuse/static/workflows/new/__next._tree.txt +3 -0
- fuse_io-0.1.30/fuse/static/workflows/new/__next.workflows.$d$id.__PAGE__.txt +6 -0
- fuse_io-0.1.30/fuse/static/workflows/new/__next.workflows.$d$id.txt +5 -0
- fuse_io-0.1.30/fuse/static/workflows/new/__next.workflows.txt +5 -0
- fuse_io-0.1.30/fuse/static/workflows/new/index.html +1 -0
- fuse_io-0.1.30/fuse/static/workflows/new/index.txt +26 -0
- fuse_io-0.1.30/fuse/users/__init__.py +0 -0
- fuse_io-0.1.30/fuse/users/router.py +234 -0
- fuse_io-0.1.30/fuse/utils/cache.py +235 -0
- fuse_io-0.1.30/fuse/utils/circuit_breaker.py +355 -0
- fuse_io-0.1.30/fuse/utils/code_sanitizer.py +357 -0
- fuse_io-0.1.30/fuse/utils/feature_flags.py +358 -0
- fuse_io-0.1.30/fuse/utils/health.py +160 -0
- fuse_io-0.1.30/fuse/utils/pagination.py +42 -0
- fuse_io-0.1.30/fuse/utils/rate_limit.py +167 -0
- fuse_io-0.1.30/fuse/utils/redis_client.py +20 -0
- fuse_io-0.1.30/fuse/utils/request_id.py +89 -0
- fuse_io-0.1.30/fuse/utils/security.py +36 -0
- fuse_io-0.1.30/fuse/worker.py +44 -0
- fuse_io-0.1.30/fuse/workflows/__init__.py +9 -0
- fuse_io-0.1.30/fuse/workflows/code_execution.py +195 -0
- fuse_io-0.1.30/fuse/workflows/crud_workflow.py +115 -0
- fuse_io-0.1.30/fuse/workflows/engine/__init__.py +6 -0
- fuse_io-0.1.30/fuse/workflows/engine/constants.py +103 -0
- fuse_io-0.1.30/fuse/workflows/engine/core.py +41 -0
- fuse_io-0.1.30/fuse/workflows/engine/error_handler.py +267 -0
- fuse_io-0.1.30/fuse/workflows/engine/errors.py +19 -0
- fuse_io-0.1.30/fuse/workflows/engine/executor.py +259 -0
- fuse_io-0.1.30/fuse/workflows/engine/graph.py +32 -0
- fuse_io-0.1.30/fuse/workflows/engine/nodes/__init__.py +69 -0
- fuse_io-0.1.30/fuse/workflows/engine/nodes/actions/code.py +189 -0
- fuse_io-0.1.30/fuse/workflows/engine/nodes/actions/data.py +132 -0
- fuse_io-0.1.30/fuse/workflows/engine/nodes/actions/discord.py +58 -0
- fuse_io-0.1.30/fuse/workflows/engine/nodes/actions/email.py +110 -0
- fuse_io-0.1.30/fuse/workflows/engine/nodes/actions/google_sheets.py +315 -0
- fuse_io-0.1.30/fuse/workflows/engine/nodes/actions/http_request.py +97 -0
- fuse_io-0.1.30/fuse/workflows/engine/nodes/actions/slack.py +233 -0
- fuse_io-0.1.30/fuse/workflows/engine/nodes/actions/utility.py +24 -0
- fuse_io-0.1.30/fuse/workflows/engine/nodes/actions/whatsapp.py +66 -0
- fuse_io-0.1.30/fuse/workflows/engine/nodes/ai/__init__.py +3 -0
- fuse_io-0.1.30/fuse/workflows/engine/nodes/ai/agent.py +100 -0
- fuse_io-0.1.30/fuse/workflows/engine/nodes/ai/llm.py +198 -0
- fuse_io-0.1.30/fuse/workflows/engine/nodes/base.py +58 -0
- fuse_io-0.1.30/fuse/workflows/engine/nodes/logic/__init__.py +11 -0
- fuse_io-0.1.30/fuse/workflows/engine/nodes/logic/delay.py +32 -0
- fuse_io-0.1.30/fuse/workflows/engine/nodes/logic/if_node.py +58 -0
- fuse_io-0.1.30/fuse/workflows/engine/nodes/logic/loop.py +41 -0
- fuse_io-0.1.30/fuse/workflows/engine/nodes/logic/merge.py +31 -0
- fuse_io-0.1.30/fuse/workflows/engine/nodes/logic/parallel.py +28 -0
- fuse_io-0.1.30/fuse/workflows/engine/nodes/logic/pause.py +29 -0
- fuse_io-0.1.30/fuse/workflows/engine/nodes/logic/switch.py +37 -0
- fuse_io-0.1.30/fuse/workflows/engine/nodes/registry.py +27 -0
- fuse_io-0.1.30/fuse/workflows/engine/nodes/triggers/email.py +37 -0
- fuse_io-0.1.30/fuse/workflows/engine/nodes/triggers/form.py +33 -0
- fuse_io-0.1.30/fuse/workflows/engine/nodes/triggers/manual.py +23 -0
- fuse_io-0.1.30/fuse/workflows/engine/nodes/triggers/rss.py +45 -0
- fuse_io-0.1.30/fuse/workflows/engine/nodes/triggers/schedule.py +39 -0
- fuse_io-0.1.30/fuse/workflows/engine/nodes/triggers/webhook.py +34 -0
- fuse_io-0.1.30/fuse/workflows/engine/nodes/triggers/whatsapp.py +27 -0
- fuse_io-0.1.30/fuse/workflows/engine/periodic_scheduler.py +92 -0
- fuse_io-0.1.30/fuse/workflows/engine/runtime/code.py +35 -0
- fuse_io-0.1.30/fuse/workflows/engine/runtime/http.py +41 -0
- fuse_io-0.1.30/fuse/workflows/engine/runtime/internal.py +25 -0
- fuse_io-0.1.30/fuse/workflows/engine/scheduler.py +196 -0
- fuse_io-0.1.30/fuse/workflows/engine/state.py +108 -0
- fuse_io-0.1.30/fuse/workflows/logger.py +111 -0
- fuse_io-0.1.30/fuse/workflows/models.py +101 -0
- fuse_io-0.1.30/fuse/workflows/router.py +553 -0
- fuse_io-0.1.30/fuse/workflows/schemas.py +190 -0
- fuse_io-0.1.30/fuse/workflows/service.py +166 -0
- fuse_io-0.1.30/fuse/workflows/types.py +366 -0
- fuse_io-0.1.30/fuse/workflows/utils/templating.py +47 -0
- fuse_io-0.1.30/fuse_io.egg-info/PKG-INFO +306 -0
- fuse_io-0.1.30/fuse_io.egg-info/SOURCES.txt +275 -0
- fuse_io-0.1.30/fuse_io.egg-info/dependency_links.txt +1 -0
- fuse_io-0.1.30/fuse_io.egg-info/entry_points.txt +2 -0
- fuse_io-0.1.30/fuse_io.egg-info/requires.txt +37 -0
- fuse_io-0.1.30/fuse_io.egg-info/top_level.txt +1 -0
- fuse_io-0.1.30/pyproject.toml +89 -0
- fuse_io-0.1.30/scripts/format.sh +5 -0
- fuse_io-0.1.30/scripts/lint.sh +8 -0
- fuse_io-0.1.30/setup.cfg +4 -0
- fuse_io-0.1.30/uv.lock +2714 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.13
|
fuse_io-0.1.30/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Bibek Timilsina
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
include README.md
|
|
2
|
+
include LICENSE
|
|
3
|
+
include pyproject.toml
|
|
4
|
+
include .python-version
|
|
5
|
+
include uv.lock
|
|
6
|
+
|
|
7
|
+
recursive-include fuse *
|
|
8
|
+
recursive-exclude fuse/__pycache__ *
|
|
9
|
+
|
|
10
|
+
recursive-include docs *.md
|
|
11
|
+
recursive-include scripts *.sh
|
|
12
|
+
|
|
13
|
+
global-exclude __pycache__
|
|
14
|
+
global-exclude *.py[co]
|
|
15
|
+
global-exclude .DS_Store
|
|
16
|
+
global-exclude dist/*
|
|
17
|
+
global-exclude build/*
|
|
18
|
+
global-exclude *.egg-info
|
|
19
|
+
global-exclude fuse.db
|
|
20
|
+
global-exclude .env
|
fuse_io-0.1.30/PKG-INFO
ADDED
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: fuse-io
|
|
3
|
+
Version: 0.1.30
|
|
4
|
+
Summary: Fuse - Workflow automation. A powerful local-first automation platform with visual builder, AI integration, and extensive node library.
|
|
5
|
+
Author-email: Bibek Timilsina <bibektimilsina@example.com>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/fuse-io/fuse
|
|
8
|
+
Project-URL: Documentation, https://github.com/fuse-io/fuse#readme
|
|
9
|
+
Project-URL: Source Code, https://github.com/fuse-io/fuse
|
|
10
|
+
Project-URL: Bug Tracker, https://github.com/fuse-io/fuse/issues
|
|
11
|
+
Keywords: automation,workflow,no-code,low-code,fastapi,ai,integration
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Intended Audience :: Information Technology
|
|
15
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
16
|
+
Classifier: Operating System :: OS Independent
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
22
|
+
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
|
23
|
+
Classifier: Topic :: Office/Business :: Scheduling
|
|
24
|
+
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
|
|
25
|
+
Classifier: Framework :: FastAPI
|
|
26
|
+
Requires-Python: <4.0,>=3.10
|
|
27
|
+
Description-Content-Type: text/markdown
|
|
28
|
+
License-File: LICENSE
|
|
29
|
+
Requires-Dist: alembic>=1.16.5
|
|
30
|
+
Requires-Dist: anthropic>=0.75.0
|
|
31
|
+
Requires-Dist: argon2-cffi>=23.1.0
|
|
32
|
+
Requires-Dist: celery>=5.6.0
|
|
33
|
+
Requires-Dist: click>=8.1.0
|
|
34
|
+
Requires-Dist: email-validator>=2.3.0
|
|
35
|
+
Requires-Dist: emails>=0.6
|
|
36
|
+
Requires-Dist: fastapi>=0.116.1
|
|
37
|
+
Requires-Dist: feedparser>=6.0.11
|
|
38
|
+
Requires-Dist: google-genai>=0.2.2
|
|
39
|
+
Requires-Dist: gunicorn>=23.0.0
|
|
40
|
+
Requires-Dist: httpx>=0.28.1
|
|
41
|
+
Requires-Dist: jinja2>=3.1.6
|
|
42
|
+
Requires-Dist: jsonschema>=4.25.1
|
|
43
|
+
Requires-Dist: openai>=2.8.1
|
|
44
|
+
Requires-Dist: passlib>=1.7.4
|
|
45
|
+
Requires-Dist: psycopg>=3.3.2
|
|
46
|
+
Requires-Dist: psycopg-binary>=3.3.2
|
|
47
|
+
Requires-Dist: psycopg2-binary>=2.9.11
|
|
48
|
+
Requires-Dist: pydantic>=2.11.7
|
|
49
|
+
Requires-Dist: pydantic-settings>=2.10.1
|
|
50
|
+
Requires-Dist: pyjwt>=2.10.1
|
|
51
|
+
Requires-Dist: python-multipart>=0.0.20
|
|
52
|
+
Requires-Dist: redis>=7.1.0
|
|
53
|
+
Requires-Dist: rich>=14.2.0
|
|
54
|
+
Requires-Dist: sentry-sdk>=2.37.0
|
|
55
|
+
Requires-Dist: sqlmodel>=0.0.24
|
|
56
|
+
Requires-Dist: tenacity>=9.1.2
|
|
57
|
+
Requires-Dist: uvicorn[standard]>=0.35.0
|
|
58
|
+
Provides-Extra: dev
|
|
59
|
+
Requires-Dist: coverage>=7.10.6; extra == "dev"
|
|
60
|
+
Requires-Dist: mypy>=1.17.1; extra == "dev"
|
|
61
|
+
Requires-Dist: pre-commit>=4.3.0; extra == "dev"
|
|
62
|
+
Requires-Dist: pytest>=8.4.2; extra == "dev"
|
|
63
|
+
Requires-Dist: ruff>=0.12.12; extra == "dev"
|
|
64
|
+
Requires-Dist: types-passlib>=1.7.7.20250602; extra == "dev"
|
|
65
|
+
Dynamic: license-file
|
|
66
|
+
|
|
67
|
+
# 🚀 Fuse - Workflow Automation
|
|
68
|
+
|
|
69
|
+
[](https://badge.fury.io/py/fuse-io)
|
|
70
|
+
[](https://www.python.org/downloads/)
|
|
71
|
+
[](https://opensource.org/licenses/MIT)
|
|
72
|
+
|
|
73
|
+
**Fuse** is a powerful **local-first** workflow automation platform with visual builder, AI integration, and extensive node library. Build complex automations with a drag-and-drop interface, similar to n8n and Zapier, but optimized for local deployment and AI-powered workflows.
|
|
74
|
+
|
|
75
|
+
> **"Keep your workflows in constant fuse"** ⚡
|
|
76
|
+
|
|
77
|
+
## ✨ Features
|
|
78
|
+
|
|
79
|
+
### 🎨 Visual Workflow Builder
|
|
80
|
+
- **Drag-and-drop** interface powered by React Flow
|
|
81
|
+
- Real-time workflow execution with live log streaming
|
|
82
|
+
- Support for parallel execution, loops, and conditional branching
|
|
83
|
+
- **29+ pre-built nodes** including triggers, actions, AI, and logic nodes
|
|
84
|
+
|
|
85
|
+
### 🤖 AI-Powered Automation
|
|
86
|
+
- Built-in **AI LLM nodes** supporting OpenAI, Anthropic, and Google AI
|
|
87
|
+
- **AI Agent** nodes for autonomous task completion
|
|
88
|
+
- AI-assisted workflow generation from natural language prompts
|
|
89
|
+
- Token usage tracking and cost monitoring
|
|
90
|
+
|
|
91
|
+
### 🔌 Extensive Integration Library
|
|
92
|
+
- **Triggers**: Manual, Cron, Webhook, Email, Form, RSS, WhatsApp
|
|
93
|
+
- **Actions**: HTTP requests, Google Sheets, Slack, Discord, Email
|
|
94
|
+
- **Logic**: Conditions, Switch/Case, Loops, Merge, Delay, Pause
|
|
95
|
+
- **Data**: Transform, Store, Set Variables
|
|
96
|
+
- **Code**: Python and JavaScript execution nodes
|
|
97
|
+
|
|
98
|
+
### 🔒 Security & Performance
|
|
99
|
+
- **JWT-based authentication** with secure session management
|
|
100
|
+
- **Rate limiting** and **circuit breaker** patterns for external API calls
|
|
101
|
+
- **PostgreSQL** database with Alembic migrations
|
|
102
|
+
- **Redis** for caching and Celery task queue
|
|
103
|
+
- **WebSocket support** for real-time updates
|
|
104
|
+
|
|
105
|
+
## 📦 Installation
|
|
106
|
+
|
|
107
|
+
### Quick Start
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
pip install fuse-io
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Initialize and Start
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
# Initialize configuration
|
|
117
|
+
fuse init
|
|
118
|
+
|
|
119
|
+
# Start the server and builder
|
|
120
|
+
fuse start
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Then open your browser to `http://localhost:5678` 🎉
|
|
124
|
+
|
|
125
|
+
### Custom Configuration
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
fuse start --host 0.0.0.0 --port 3000 --workers 4 --reload
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## 🛠 Development Setup
|
|
132
|
+
|
|
133
|
+
### Prerequisites
|
|
134
|
+
- Python 3.10 or higher
|
|
135
|
+
- PostgreSQL 14+
|
|
136
|
+
- Redis 6+
|
|
137
|
+
- Node.js 18+ (for frontend development)
|
|
138
|
+
|
|
139
|
+
### Clone and Install
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
git clone https://github.com/fuse-io/fuse.git
|
|
143
|
+
cd fuse
|
|
144
|
+
|
|
145
|
+
# Backend setup
|
|
146
|
+
cd fuse_backend
|
|
147
|
+
pip install -e ".[dev]"
|
|
148
|
+
|
|
149
|
+
# Frontend setup
|
|
150
|
+
cd ../fuse_frontend
|
|
151
|
+
npm install
|
|
152
|
+
npm run dev
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Environment Configuration
|
|
156
|
+
|
|
157
|
+
Create a `.env` file in the `fuse_backend` directory:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
# Database
|
|
161
|
+
DATABASE_URL=postgresql://user:password@localhost:5432/fuse
|
|
162
|
+
|
|
163
|
+
# Redis
|
|
164
|
+
REDIS_URL=redis://localhost:6379/0
|
|
165
|
+
|
|
166
|
+
# Security
|
|
167
|
+
SECRET_KEY=your-secret-key-change-in-production
|
|
168
|
+
|
|
169
|
+
# AI API Keys (Optional)
|
|
170
|
+
OPENAI_API_KEY=sk-...
|
|
171
|
+
ANTHROPIC_API_KEY=sk-ant-...
|
|
172
|
+
GOOGLE_API_KEY=AIza...
|
|
173
|
+
|
|
174
|
+
# OAuth (Optional)
|
|
175
|
+
GOOGLE_OAUTH_CLIENT_ID=...
|
|
176
|
+
GOOGLE_OAUTH_CLIENT_SECRET=...
|
|
177
|
+
SLACK_OAUTH_CLIENT_ID=...
|
|
178
|
+
SLACK_OAUTH_CLIENT_SECRET=...
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### Run with Docker
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
docker-compose up --build
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
Access the application at `http://localhost:8000`
|
|
188
|
+
|
|
189
|
+
## 📚 Usage Examples
|
|
190
|
+
|
|
191
|
+
### Creating Your First Workflow
|
|
192
|
+
|
|
193
|
+
1. **Add a Trigger**: Start with a Manual Trigger, Webhook, or Cron Schedule
|
|
194
|
+
2. **Add Actions**: Connect HTTP Request, Google Sheets, or AI nodes
|
|
195
|
+
3. **Add Logic**: Use conditions, loops, or parallel branches
|
|
196
|
+
4. **Test & Deploy**: Click "Execute" to test, then activate for production
|
|
197
|
+
|
|
198
|
+
### Example: AIowered Data Processing
|
|
199
|
+
|
|
200
|
+
```python
|
|
201
|
+
# Workflow structure:
|
|
202
|
+
# Trigger (Manual) → HTTP Request → AI LLM → Transform → Google Sheets
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
1. Fetch data from an API
|
|
206
|
+
2. Process with AI (summarize, classify, extract)
|
|
207
|
+
3. Transform the results
|
|
208
|
+
4. Save to Google Sheets
|
|
209
|
+
|
|
210
|
+
### Example: Scheduled Report Generation
|
|
211
|
+
|
|
212
|
+
```python
|
|
213
|
+
# Workflow structure:
|
|
214
|
+
# Cron Trigger → Read Sheets → Loop → AI Agent → Email
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
1. Run daily at 9 AM
|
|
218
|
+
2. Read data from Google Sheets
|
|
219
|
+
3. Loop through each row
|
|
220
|
+
4. Generate insights with AI
|
|
221
|
+
5. Send email report
|
|
222
|
+
|
|
223
|
+
## 🏗 Architecture
|
|
224
|
+
|
|
225
|
+
```
|
|
226
|
+
┌─────────────────────────────────────────┐
|
|
227
|
+
│ Frontend (Next.js) │
|
|
228
|
+
│ - React Flow Workflow Builder │
|
|
229
|
+
│ - Real-time Logs (WebSocket) │
|
|
230
|
+
│ - Node Configuration UI │
|
|
231
|
+
└──────────────────┬──────────────────────┘
|
|
232
|
+
│ HTTP + WebSocket
|
|
233
|
+
┌──────────────────▼──────────────────────┐
|
|
234
|
+
│ Backend (FastAPI) │
|
|
235
|
+
│ - REST API (JWT Auth) │
|
|
236
|
+
│ - WebSocket for live logs │
|
|
237
|
+
│ - Workflow Engine │
|
|
238
|
+
└──────────────────┬──────────────────────┘
|
|
239
|
+
│
|
|
240
|
+
┌──────────┴──────────┐
|
|
241
|
+
│ │
|
|
242
|
+
┌───────▼────────┐ ┌────────▼─────────┐
|
|
243
|
+
│ PostgreSQL │ │ Redis + Celery │
|
|
244
|
+
│ (Workflows & │ │ (Task Queue & │
|
|
245
|
+
│ Executions) │ │ Cache) │
|
|
246
|
+
└────────────────┘ └──────────────────┘
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
## 🚀 CLI Commands
|
|
250
|
+
|
|
251
|
+
```bash
|
|
252
|
+
# Start server
|
|
253
|
+
fuse start [--host HOST] [--port PORT] [--workers N] [--reload]
|
|
254
|
+
|
|
255
|
+
# Initialize project
|
|
256
|
+
fuse init
|
|
257
|
+
|
|
258
|
+
# Show version
|
|
259
|
+
fuse version
|
|
260
|
+
|
|
261
|
+
# Help
|
|
262
|
+
fuse --help
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
## 🔐 Security Best Practices
|
|
266
|
+
|
|
267
|
+
1. **Change default SECRET_KEY** in production
|
|
268
|
+
2. Use **environment variables** for sensitive data
|
|
269
|
+
3. Enable **rate limiting** for public endpoints
|
|
270
|
+
4. Use **HTTPS** in production deployments
|
|
271
|
+
5. Regularly **rotate API keys** and credentials
|
|
272
|
+
|
|
273
|
+
## 🤝 Contributing
|
|
274
|
+
|
|
275
|
+
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
|
|
276
|
+
|
|
277
|
+
### Development Workflow
|
|
278
|
+
|
|
279
|
+
1. Fork the repository
|
|
280
|
+
2. Create your feature branch (`git checkout -b feature/AmazingFeature`)
|
|
281
|
+
3. Commit your changes (`git commit -m 'Add some AmazingFeature'`)
|
|
282
|
+
4. Push to the branch (`git push origin feature/AmazingFeature`)
|
|
283
|
+
5. Open a Pull Request
|
|
284
|
+
|
|
285
|
+
## 📄 License
|
|
286
|
+
|
|
287
|
+
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
|
288
|
+
|
|
289
|
+
## 🙏 Acknowledgments
|
|
290
|
+
|
|
291
|
+
- Inspired by [n8n](https://n8n.io/) and [Zapier](https://zapier.com/)
|
|
292
|
+
- Built with [FastAPI](https://fastapi.tiangolo.com/)
|
|
293
|
+
- UI powered by [React Flow](https://reactflow.dev/)
|
|
294
|
+
- Based on [full-stack-fastapi-template](https://github.com/tiangolo/full-stack-fastapi-template)
|
|
295
|
+
|
|
296
|
+
## 📞 Support
|
|
297
|
+
|
|
298
|
+
- 📖 [Documentation](https://github.com/fuse-io/fuse#readme)
|
|
299
|
+
- 🐛 [Issue Tracker](https://github.com/fuse-io/fuse/issues)
|
|
300
|
+
- 💬 [Discussions](https://github.com/fuse-io/fuse/discussions)
|
|
301
|
+
|
|
302
|
+
---
|
|
303
|
+
|
|
304
|
+
**Made with ⚡ by [Bibek Timilsina](https://github.com/bibektimilsina)**
|
|
305
|
+
|
|
306
|
+
*Fuse - Keep your workflows in constant fuse* 🌊
|
fuse_io-0.1.30/README.md
ADDED
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
# 🚀 Fuse - Workflow Automation
|
|
2
|
+
|
|
3
|
+
[](https://badge.fury.io/py/fuse-io)
|
|
4
|
+
[](https://www.python.org/downloads/)
|
|
5
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
|
+
|
|
7
|
+
**Fuse** is a powerful **local-first** workflow automation platform with visual builder, AI integration, and extensive node library. Build complex automations with a drag-and-drop interface, similar to n8n and Zapier, but optimized for local deployment and AI-powered workflows.
|
|
8
|
+
|
|
9
|
+
> **"Keep your workflows in constant fuse"** ⚡
|
|
10
|
+
|
|
11
|
+
## ✨ Features
|
|
12
|
+
|
|
13
|
+
### 🎨 Visual Workflow Builder
|
|
14
|
+
- **Drag-and-drop** interface powered by React Flow
|
|
15
|
+
- Real-time workflow execution with live log streaming
|
|
16
|
+
- Support for parallel execution, loops, and conditional branching
|
|
17
|
+
- **29+ pre-built nodes** including triggers, actions, AI, and logic nodes
|
|
18
|
+
|
|
19
|
+
### 🤖 AI-Powered Automation
|
|
20
|
+
- Built-in **AI LLM nodes** supporting OpenAI, Anthropic, and Google AI
|
|
21
|
+
- **AI Agent** nodes for autonomous task completion
|
|
22
|
+
- AI-assisted workflow generation from natural language prompts
|
|
23
|
+
- Token usage tracking and cost monitoring
|
|
24
|
+
|
|
25
|
+
### 🔌 Extensive Integration Library
|
|
26
|
+
- **Triggers**: Manual, Cron, Webhook, Email, Form, RSS, WhatsApp
|
|
27
|
+
- **Actions**: HTTP requests, Google Sheets, Slack, Discord, Email
|
|
28
|
+
- **Logic**: Conditions, Switch/Case, Loops, Merge, Delay, Pause
|
|
29
|
+
- **Data**: Transform, Store, Set Variables
|
|
30
|
+
- **Code**: Python and JavaScript execution nodes
|
|
31
|
+
|
|
32
|
+
### 🔒 Security & Performance
|
|
33
|
+
- **JWT-based authentication** with secure session management
|
|
34
|
+
- **Rate limiting** and **circuit breaker** patterns for external API calls
|
|
35
|
+
- **PostgreSQL** database with Alembic migrations
|
|
36
|
+
- **Redis** for caching and Celery task queue
|
|
37
|
+
- **WebSocket support** for real-time updates
|
|
38
|
+
|
|
39
|
+
## 📦 Installation
|
|
40
|
+
|
|
41
|
+
### Quick Start
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
pip install fuse-io
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Initialize and Start
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# Initialize configuration
|
|
51
|
+
fuse init
|
|
52
|
+
|
|
53
|
+
# Start the server and builder
|
|
54
|
+
fuse start
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Then open your browser to `http://localhost:5678` 🎉
|
|
58
|
+
|
|
59
|
+
### Custom Configuration
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
fuse start --host 0.0.0.0 --port 3000 --workers 4 --reload
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## 🛠 Development Setup
|
|
66
|
+
|
|
67
|
+
### Prerequisites
|
|
68
|
+
- Python 3.10 or higher
|
|
69
|
+
- PostgreSQL 14+
|
|
70
|
+
- Redis 6+
|
|
71
|
+
- Node.js 18+ (for frontend development)
|
|
72
|
+
|
|
73
|
+
### Clone and Install
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
git clone https://github.com/fuse-io/fuse.git
|
|
77
|
+
cd fuse
|
|
78
|
+
|
|
79
|
+
# Backend setup
|
|
80
|
+
cd fuse_backend
|
|
81
|
+
pip install -e ".[dev]"
|
|
82
|
+
|
|
83
|
+
# Frontend setup
|
|
84
|
+
cd ../fuse_frontend
|
|
85
|
+
npm install
|
|
86
|
+
npm run dev
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Environment Configuration
|
|
90
|
+
|
|
91
|
+
Create a `.env` file in the `fuse_backend` directory:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
# Database
|
|
95
|
+
DATABASE_URL=postgresql://user:password@localhost:5432/fuse
|
|
96
|
+
|
|
97
|
+
# Redis
|
|
98
|
+
REDIS_URL=redis://localhost:6379/0
|
|
99
|
+
|
|
100
|
+
# Security
|
|
101
|
+
SECRET_KEY=your-secret-key-change-in-production
|
|
102
|
+
|
|
103
|
+
# AI API Keys (Optional)
|
|
104
|
+
OPENAI_API_KEY=sk-...
|
|
105
|
+
ANTHROPIC_API_KEY=sk-ant-...
|
|
106
|
+
GOOGLE_API_KEY=AIza...
|
|
107
|
+
|
|
108
|
+
# OAuth (Optional)
|
|
109
|
+
GOOGLE_OAUTH_CLIENT_ID=...
|
|
110
|
+
GOOGLE_OAUTH_CLIENT_SECRET=...
|
|
111
|
+
SLACK_OAUTH_CLIENT_ID=...
|
|
112
|
+
SLACK_OAUTH_CLIENT_SECRET=...
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Run with Docker
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
docker-compose up --build
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Access the application at `http://localhost:8000`
|
|
122
|
+
|
|
123
|
+
## 📚 Usage Examples
|
|
124
|
+
|
|
125
|
+
### Creating Your First Workflow
|
|
126
|
+
|
|
127
|
+
1. **Add a Trigger**: Start with a Manual Trigger, Webhook, or Cron Schedule
|
|
128
|
+
2. **Add Actions**: Connect HTTP Request, Google Sheets, or AI nodes
|
|
129
|
+
3. **Add Logic**: Use conditions, loops, or parallel branches
|
|
130
|
+
4. **Test & Deploy**: Click "Execute" to test, then activate for production
|
|
131
|
+
|
|
132
|
+
### Example: AIowered Data Processing
|
|
133
|
+
|
|
134
|
+
```python
|
|
135
|
+
# Workflow structure:
|
|
136
|
+
# Trigger (Manual) → HTTP Request → AI LLM → Transform → Google Sheets
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
1. Fetch data from an API
|
|
140
|
+
2. Process with AI (summarize, classify, extract)
|
|
141
|
+
3. Transform the results
|
|
142
|
+
4. Save to Google Sheets
|
|
143
|
+
|
|
144
|
+
### Example: Scheduled Report Generation
|
|
145
|
+
|
|
146
|
+
```python
|
|
147
|
+
# Workflow structure:
|
|
148
|
+
# Cron Trigger → Read Sheets → Loop → AI Agent → Email
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
1. Run daily at 9 AM
|
|
152
|
+
2. Read data from Google Sheets
|
|
153
|
+
3. Loop through each row
|
|
154
|
+
4. Generate insights with AI
|
|
155
|
+
5. Send email report
|
|
156
|
+
|
|
157
|
+
## 🏗 Architecture
|
|
158
|
+
|
|
159
|
+
```
|
|
160
|
+
┌─────────────────────────────────────────┐
|
|
161
|
+
│ Frontend (Next.js) │
|
|
162
|
+
│ - React Flow Workflow Builder │
|
|
163
|
+
│ - Real-time Logs (WebSocket) │
|
|
164
|
+
│ - Node Configuration UI │
|
|
165
|
+
└──────────────────┬──────────────────────┘
|
|
166
|
+
│ HTTP + WebSocket
|
|
167
|
+
┌──────────────────▼──────────────────────┐
|
|
168
|
+
│ Backend (FastAPI) │
|
|
169
|
+
│ - REST API (JWT Auth) │
|
|
170
|
+
│ - WebSocket for live logs │
|
|
171
|
+
│ - Workflow Engine │
|
|
172
|
+
└──────────────────┬──────────────────────┘
|
|
173
|
+
│
|
|
174
|
+
┌──────────┴──────────┐
|
|
175
|
+
│ │
|
|
176
|
+
┌───────▼────────┐ ┌────────▼─────────┐
|
|
177
|
+
│ PostgreSQL │ │ Redis + Celery │
|
|
178
|
+
│ (Workflows & │ │ (Task Queue & │
|
|
179
|
+
│ Executions) │ │ Cache) │
|
|
180
|
+
└────────────────┘ └──────────────────┘
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## 🚀 CLI Commands
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
# Start server
|
|
187
|
+
fuse start [--host HOST] [--port PORT] [--workers N] [--reload]
|
|
188
|
+
|
|
189
|
+
# Initialize project
|
|
190
|
+
fuse init
|
|
191
|
+
|
|
192
|
+
# Show version
|
|
193
|
+
fuse version
|
|
194
|
+
|
|
195
|
+
# Help
|
|
196
|
+
fuse --help
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## 🔐 Security Best Practices
|
|
200
|
+
|
|
201
|
+
1. **Change default SECRET_KEY** in production
|
|
202
|
+
2. Use **environment variables** for sensitive data
|
|
203
|
+
3. Enable **rate limiting** for public endpoints
|
|
204
|
+
4. Use **HTTPS** in production deployments
|
|
205
|
+
5. Regularly **rotate API keys** and credentials
|
|
206
|
+
|
|
207
|
+
## 🤝 Contributing
|
|
208
|
+
|
|
209
|
+
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
|
|
210
|
+
|
|
211
|
+
### Development Workflow
|
|
212
|
+
|
|
213
|
+
1. Fork the repository
|
|
214
|
+
2. Create your feature branch (`git checkout -b feature/AmazingFeature`)
|
|
215
|
+
3. Commit your changes (`git commit -m 'Add some AmazingFeature'`)
|
|
216
|
+
4. Push to the branch (`git push origin feature/AmazingFeature`)
|
|
217
|
+
5. Open a Pull Request
|
|
218
|
+
|
|
219
|
+
## 📄 License
|
|
220
|
+
|
|
221
|
+
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
|
222
|
+
|
|
223
|
+
## 🙏 Acknowledgments
|
|
224
|
+
|
|
225
|
+
- Inspired by [n8n](https://n8n.io/) and [Zapier](https://zapier.com/)
|
|
226
|
+
- Built with [FastAPI](https://fastapi.tiangolo.com/)
|
|
227
|
+
- UI powered by [React Flow](https://reactflow.dev/)
|
|
228
|
+
- Based on [full-stack-fastapi-template](https://github.com/tiangolo/full-stack-fastapi-template)
|
|
229
|
+
|
|
230
|
+
## 📞 Support
|
|
231
|
+
|
|
232
|
+
- 📖 [Documentation](https://github.com/fuse-io/fuse#readme)
|
|
233
|
+
- 🐛 [Issue Tracker](https://github.com/fuse-io/fuse/issues)
|
|
234
|
+
- 💬 [Discussions](https://github.com/fuse-io/fuse/discussions)
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
**Made with ⚡ by [Bibek Timilsina](https://github.com/bibektimilsina)**
|
|
239
|
+
|
|
240
|
+
*Fuse - Keep your workflows in constant fuse* 🌊
|