fuse-io 0.1.49__tar.gz → 0.1.57__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.49/fuse_io.egg-info → fuse_io-0.1.57}/PKG-INFO +1 -1
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/ai/service.py +103 -9
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/cli.py +2 -2
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/credentials/router.py +142 -11
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/credentials/service.py +55 -4
- fuse_io-0.1.57/fuse/static/404/index.html +1 -0
- fuse_io-0.1.57/fuse/static/404.html +1 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/__next.__PAGE__.txt +2 -2
- fuse_io-0.1.57/fuse/static/__next._full.txt +24 -0
- fuse_io-0.1.57/fuse/static/__next._head.txt +5 -0
- fuse_io-0.1.57/fuse/static/__next._index.txt +11 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/__next._tree.txt +3 -2
- fuse_io-0.1.57/fuse/static/_next/static/AvepNa0wqMBJJaKWx9jp2/_buildManifest.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/bAsbGnh27hobCWq6gYKAq/_ssgManifest.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/1692-a402f4a4fcaf7b29.js +5 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/1704-99cc2ea208d98cb0.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/1950-70f6edfc3f49b339.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/1963-d28a6db5ff807527.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/232.c883d640f7157775.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/2842-88d6ea1ddfa4c472.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/3038-598d667e3d5ea764.js +30 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/3509-92c0624ea5210c8a.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/3794-04fa707794cee3fc.js +2 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/4831-2650d23954cfe85f.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/4bd1b696-e5d7c65570c947b7.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/573-4b72224474d6755a.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/585-b70392236824b164.js +43 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/6040-4e3e79454e3ce7cf.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/7152-7978ade421a25c37.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/7621-20d82d6a1007addd.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/7856-044a4109806f2a2d.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/7988-891258e42d4e9cb9.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/8343-4abaf4b94ff48f9a.js +3 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/8376-ef78e632aabf30d1.js +9 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/8500-98e13bcce54aa7a0.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/8547-58d8503b201666a3.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/9903-a77a05716944e520.js +9 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/app/(main)/ai-create-example/page-70ceb48a63cfca66.js +11 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/app/(main)/analytics/page-992337da93734999.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/app/(main)/credentials/page-7e4cc6437c0633e9.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/app/(main)/dashboard/page-ad0218038e730e18.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/app/(main)/executions/page-ad7f99bd73e489e9.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/app/(main)/help/page-356b1311d0259b76.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/app/(main)/layout-2822b13d2fbf79fc.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/app/(main)/settings/page-21ddbcb4288d11e3.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/app/(main)/templates/page-adcf4c1235f2abd0.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/app/(main)/variables/page-51455efcaf5cf739.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/app/(main)/workflows/page-b2a58db616cdcb70.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/app/_global-error/page-bd43e16e28d6b5c5.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/app/_not-found/page-313af5f7b44a4219.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/app/auth/layout-bd43e16e28d6b5c5.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/app/auth/login/page-8001afc0c0cef789.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/app/auth/register/page-02132d2e011dbec7.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/app/credentials-test/page-13091e893fe38fd8.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/app/error-408c6bff597b9d0e.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/app/global-error-ab2bae883ee0e860.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/app/layout-2ac4c5b8cbb2c64d.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/app/loading-bd43e16e28d6b5c5.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/app/oauth/callback/page-cdaebdec1d4c4d97.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/app/page-502f3458c458bd75.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/app/workflows/[id]/error-b393ec0b558e28ac.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/app/workflows/[id]/loading-bd43e16e28d6b5c5.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/app/workflows/[id]/page-636e52c0d2fa9d9b.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/app/workflows/error-5a420e4cf1195dbd.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/app/workflows/loading-bd43e16e28d6b5c5.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/c37d3baf-7f0d73575bc82fee.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/framework-81b2e59ffe13bb24.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/main-832b18574d412547.js +5 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/main-app-14c06b7adeda3bca.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/next/dist/client/components/builtin/app-error-bd43e16e28d6b5c5.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/next/dist/client/components/builtin/forbidden-bd43e16e28d6b5c5.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/next/dist/client/components/builtin/not-found-bd43e16e28d6b5c5.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/next/dist/client/components/builtin/unauthorized-bd43e16e28d6b5c5.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/chunks/webpack-03fc999381a8cb79.js +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/css/1cb804ccb5b9c075.css +1 -0
- fuse_io-0.1.57/fuse/static/_next/static/css/4a300d88a66b0638.css +3 -0
- fuse_io-0.1.57/fuse/static/_not-found/__next._full.txt +20 -0
- fuse_io-0.1.57/fuse/static/_not-found/__next._head.txt +5 -0
- fuse_io-0.1.57/fuse/static/_not-found/__next._index.txt +11 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_not-found/__next._not-found.__PAGE__.txt +1 -1
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_not-found/__next._not-found.txt +1 -1
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_not-found/__next._tree.txt +3 -2
- fuse_io-0.1.57/fuse/static/_not-found/index.html +1 -0
- fuse_io-0.1.57/fuse/static/_not-found/index.txt +20 -0
- fuse_io-0.1.57/fuse/static/ai-create-example/__next.!KG1haW4p.ai-create-example.__PAGE__.txt +9 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/ai-create-example/__next.!KG1haW4p.ai-create-example.txt +1 -1
- {fuse_io-0.1.49/fuse/static/workflows → fuse_io-0.1.57/fuse/static/ai-create-example}/__next.!KG1haW4p.txt +2 -2
- fuse_io-0.1.57/fuse/static/ai-create-example/__next._full.txt +29 -0
- fuse_io-0.1.57/fuse/static/ai-create-example/__next._head.txt +5 -0
- fuse_io-0.1.57/fuse/static/ai-create-example/__next._index.txt +11 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/ai-create-example/__next._tree.txt +3 -2
- fuse_io-0.1.57/fuse/static/ai-create-example/index.html +1 -0
- fuse_io-0.1.57/fuse/static/ai-create-example/index.txt +29 -0
- fuse_io-0.1.49/fuse/static/ai-create-example/__next.!KG1haW4p.ai-create-example.__PAGE__.txt → fuse_io-0.1.57/fuse/static/analytics/__next.!KG1haW4p.analytics.__PAGE__.txt +2 -2
- fuse_io-0.1.57/fuse/static/analytics/__next.!KG1haW4p.analytics.txt +4 -0
- {fuse_io-0.1.49/fuse/static/ai-create-example → fuse_io-0.1.57/fuse/static/analytics}/__next.!KG1haW4p.txt +2 -2
- fuse_io-0.1.57/fuse/static/analytics/__next._full.txt +29 -0
- fuse_io-0.1.57/fuse/static/analytics/__next._head.txt +5 -0
- fuse_io-0.1.57/fuse/static/analytics/__next._index.txt +11 -0
- fuse_io-0.1.57/fuse/static/analytics/__next._tree.txt +4 -0
- fuse_io-0.1.57/fuse/static/analytics/index.html +1 -0
- fuse_io-0.1.57/fuse/static/analytics/index.txt +29 -0
- fuse_io-0.1.57/fuse/static/auth/login/__next._full.txt +24 -0
- fuse_io-0.1.57/fuse/static/auth/login/__next._head.txt +5 -0
- fuse_io-0.1.57/fuse/static/auth/login/__next._index.txt +11 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/auth/login/__next._tree.txt +3 -2
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/auth/login/__next.auth.login.__PAGE__.txt +2 -2
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/auth/login/__next.auth.login.txt +1 -1
- fuse_io-0.1.57/fuse/static/auth/login/__next.auth.txt +4 -0
- fuse_io-0.1.57/fuse/static/auth/login/index.html +1 -0
- fuse_io-0.1.57/fuse/static/auth/login/index.txt +24 -0
- fuse_io-0.1.57/fuse/static/auth/register/__next._full.txt +24 -0
- fuse_io-0.1.57/fuse/static/auth/register/__next._head.txt +5 -0
- fuse_io-0.1.57/fuse/static/auth/register/__next._index.txt +11 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/auth/register/__next._tree.txt +3 -2
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/auth/register/__next.auth.register.__PAGE__.txt +2 -2
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/auth/register/__next.auth.register.txt +1 -1
- fuse_io-0.1.57/fuse/static/auth/register/__next.auth.txt +4 -0
- fuse_io-0.1.57/fuse/static/auth/register/index.html +1 -0
- fuse_io-0.1.57/fuse/static/auth/register/index.txt +24 -0
- fuse_io-0.1.57/fuse/static/credentials/__next.!KG1haW4p.credentials.__PAGE__.txt +9 -0
- fuse_io-0.1.57/fuse/static/credentials/__next.!KG1haW4p.credentials.txt +4 -0
- {fuse_io-0.1.49/fuse/static/dashboard → fuse_io-0.1.57/fuse/static/credentials}/__next.!KG1haW4p.txt +2 -2
- fuse_io-0.1.57/fuse/static/credentials/__next._full.txt +29 -0
- fuse_io-0.1.57/fuse/static/credentials/__next._head.txt +5 -0
- fuse_io-0.1.57/fuse/static/credentials/__next._index.txt +11 -0
- fuse_io-0.1.57/fuse/static/credentials/__next._tree.txt +4 -0
- fuse_io-0.1.57/fuse/static/credentials/index.html +1 -0
- fuse_io-0.1.57/fuse/static/credentials/index.txt +29 -0
- fuse_io-0.1.57/fuse/static/credentials-test/__next._full.txt +24 -0
- fuse_io-0.1.57/fuse/static/credentials-test/__next._head.txt +5 -0
- fuse_io-0.1.57/fuse/static/credentials-test/__next._index.txt +11 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/credentials-test/__next._tree.txt +3 -2
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/credentials-test/__next.credentials-test.__PAGE__.txt +2 -2
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/credentials-test/__next.credentials-test.txt +1 -1
- fuse_io-0.1.57/fuse/static/credentials-test/index.html +1 -0
- fuse_io-0.1.57/fuse/static/credentials-test/index.txt +24 -0
- fuse_io-0.1.57/fuse/static/dashboard/__next.!KG1haW4p.dashboard.__PAGE__.txt +9 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/dashboard/__next.!KG1haW4p.dashboard.txt +1 -1
- {fuse_io-0.1.49/fuse/static/settings → fuse_io-0.1.57/fuse/static/dashboard}/__next.!KG1haW4p.txt +2 -2
- fuse_io-0.1.57/fuse/static/dashboard/__next._full.txt +29 -0
- fuse_io-0.1.57/fuse/static/dashboard/__next._head.txt +5 -0
- fuse_io-0.1.57/fuse/static/dashboard/__next._index.txt +11 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/dashboard/__next._tree.txt +3 -2
- fuse_io-0.1.57/fuse/static/dashboard/index.html +1 -0
- fuse_io-0.1.57/fuse/static/dashboard/index.txt +29 -0
- fuse_io-0.1.57/fuse/static/executions/__next.!KG1haW4p.executions.__PAGE__.txt +9 -0
- fuse_io-0.1.57/fuse/static/executions/__next.!KG1haW4p.executions.txt +4 -0
- fuse_io-0.1.57/fuse/static/executions/__next.!KG1haW4p.txt +7 -0
- fuse_io-0.1.57/fuse/static/executions/__next._full.txt +29 -0
- fuse_io-0.1.57/fuse/static/executions/__next._head.txt +5 -0
- fuse_io-0.1.57/fuse/static/executions/__next._index.txt +11 -0
- fuse_io-0.1.57/fuse/static/executions/__next._tree.txt +4 -0
- fuse_io-0.1.57/fuse/static/executions/index.html +1 -0
- fuse_io-0.1.57/fuse/static/executions/index.txt +29 -0
- fuse_io-0.1.49/fuse/static/settings/__next.!KG1haW4p.settings.__PAGE__.txt → fuse_io-0.1.57/fuse/static/help/__next.!KG1haW4p.help.__PAGE__.txt +2 -2
- fuse_io-0.1.57/fuse/static/help/__next.!KG1haW4p.help.txt +4 -0
- fuse_io-0.1.57/fuse/static/help/__next.!KG1haW4p.txt +7 -0
- {fuse_io-0.1.49/fuse/static/ai-create-example → fuse_io-0.1.57/fuse/static/help}/__next._full.txt +14 -11
- fuse_io-0.1.57/fuse/static/help/__next._head.txt +5 -0
- fuse_io-0.1.57/fuse/static/help/__next._index.txt +11 -0
- fuse_io-0.1.57/fuse/static/help/__next._tree.txt +4 -0
- fuse_io-0.1.57/fuse/static/help/index.html +1 -0
- {fuse_io-0.1.49/fuse/static/ai-create-example → fuse_io-0.1.57/fuse/static/help}/index.txt +14 -11
- fuse_io-0.1.57/fuse/static/index.html +1 -0
- fuse_io-0.1.57/fuse/static/index.txt +24 -0
- fuse_io-0.1.57/fuse/static/logo.png +0 -0
- fuse_io-0.1.57/fuse/static/oauth/callback/__next._full.txt +24 -0
- fuse_io-0.1.57/fuse/static/oauth/callback/__next._head.txt +5 -0
- fuse_io-0.1.57/fuse/static/oauth/callback/__next._index.txt +11 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/oauth/callback/__next._tree.txt +3 -2
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/oauth/callback/__next.oauth.callback.__PAGE__.txt +2 -2
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/oauth/callback/__next.oauth.callback.txt +1 -1
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/oauth/callback/__next.oauth.txt +1 -1
- fuse_io-0.1.57/fuse/static/oauth/callback/index.html +1 -0
- fuse_io-0.1.57/fuse/static/oauth/callback/index.txt +24 -0
- fuse_io-0.1.57/fuse/static/settings/__next.!KG1haW4p.settings.__PAGE__.txt +9 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/settings/__next.!KG1haW4p.settings.txt +1 -1
- fuse_io-0.1.57/fuse/static/settings/__next.!KG1haW4p.txt +7 -0
- fuse_io-0.1.57/fuse/static/settings/__next._full.txt +29 -0
- fuse_io-0.1.57/fuse/static/settings/__next._head.txt +5 -0
- fuse_io-0.1.57/fuse/static/settings/__next._index.txt +11 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/settings/__next._tree.txt +3 -2
- fuse_io-0.1.57/fuse/static/settings/index.html +1 -0
- fuse_io-0.1.57/fuse/static/settings/index.txt +29 -0
- fuse_io-0.1.57/fuse/static/templates/__next.!KG1haW4p.templates.__PAGE__.txt +9 -0
- fuse_io-0.1.57/fuse/static/templates/__next.!KG1haW4p.templates.txt +4 -0
- fuse_io-0.1.57/fuse/static/templates/__next.!KG1haW4p.txt +7 -0
- fuse_io-0.1.57/fuse/static/templates/__next._full.txt +29 -0
- fuse_io-0.1.57/fuse/static/templates/__next._head.txt +5 -0
- fuse_io-0.1.57/fuse/static/templates/__next._index.txt +11 -0
- fuse_io-0.1.57/fuse/static/templates/__next._tree.txt +4 -0
- fuse_io-0.1.57/fuse/static/templates/index.html +1 -0
- fuse_io-0.1.57/fuse/static/templates/index.txt +29 -0
- fuse_io-0.1.57/fuse/static/variables/__next.!KG1haW4p.txt +7 -0
- fuse_io-0.1.57/fuse/static/variables/__next.!KG1haW4p.variables.__PAGE__.txt +9 -0
- fuse_io-0.1.57/fuse/static/variables/__next.!KG1haW4p.variables.txt +4 -0
- fuse_io-0.1.57/fuse/static/variables/__next._full.txt +29 -0
- fuse_io-0.1.57/fuse/static/variables/__next._head.txt +5 -0
- fuse_io-0.1.57/fuse/static/variables/__next._index.txt +11 -0
- fuse_io-0.1.57/fuse/static/variables/__next._tree.txt +4 -0
- fuse_io-0.1.57/fuse/static/variables/index.html +1 -0
- fuse_io-0.1.57/fuse/static/variables/index.txt +29 -0
- fuse_io-0.1.57/fuse/static/workflows/__next.!KG1haW4p.txt +7 -0
- fuse_io-0.1.57/fuse/static/workflows/__next.!KG1haW4p.workflows.__PAGE__.txt +10 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/workflows/__next.!KG1haW4p.workflows.txt +1 -1
- fuse_io-0.1.57/fuse/static/workflows/__next._full.txt +29 -0
- fuse_io-0.1.57/fuse/static/workflows/__next._head.txt +5 -0
- fuse_io-0.1.57/fuse/static/workflows/__next._index.txt +11 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/workflows/__next._tree.txt +3 -2
- fuse_io-0.1.57/fuse/static/workflows/index.html +1 -0
- fuse_io-0.1.57/fuse/static/workflows/index.txt +29 -0
- fuse_io-0.1.57/fuse/static/workflows/new/__next._full.txt +29 -0
- fuse_io-0.1.57/fuse/static/workflows/new/__next._head.txt +5 -0
- fuse_io-0.1.57/fuse/static/workflows/new/__next._index.txt +11 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/workflows/new/__next._tree.txt +3 -2
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/workflows/new/__next.workflows.$d$id.__PAGE__.txt +2 -2
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/workflows/new/__next.workflows.$d$id.txt +2 -2
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/workflows/new/__next.workflows.txt +2 -2
- fuse_io-0.1.57/fuse/static/workflows/new/index.html +1 -0
- fuse_io-0.1.57/fuse/static/workflows/new/index.txt +29 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57/fuse_io.egg-info}/PKG-INFO +1 -1
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse_io.egg-info/SOURCES.txt +119 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/pyproject.toml +7 -1
- fuse_io-0.1.49/fuse/static/404/index.html +0 -1
- fuse_io-0.1.49/fuse/static/404.html +0 -1
- fuse_io-0.1.49/fuse/static/__next._full.txt +0 -23
- fuse_io-0.1.49/fuse/static/__next._head.txt +0 -7
- fuse_io-0.1.49/fuse/static/__next._index.txt +0 -10
- fuse_io-0.1.49/fuse/static/_not-found/__next._full.txt +0 -19
- fuse_io-0.1.49/fuse/static/_not-found/__next._head.txt +0 -7
- fuse_io-0.1.49/fuse/static/_not-found/__next._index.txt +0 -10
- fuse_io-0.1.49/fuse/static/_not-found/index.html +0 -1
- fuse_io-0.1.49/fuse/static/_not-found/index.txt +0 -19
- fuse_io-0.1.49/fuse/static/ai-create-example/__next._head.txt +0 -7
- fuse_io-0.1.49/fuse/static/ai-create-example/__next._index.txt +0 -10
- fuse_io-0.1.49/fuse/static/ai-create-example/index.html +0 -1
- fuse_io-0.1.49/fuse/static/auth/login/__next._full.txt +0 -23
- fuse_io-0.1.49/fuse/static/auth/login/__next._head.txt +0 -7
- fuse_io-0.1.49/fuse/static/auth/login/__next._index.txt +0 -10
- fuse_io-0.1.49/fuse/static/auth/login/__next.auth.txt +0 -4
- fuse_io-0.1.49/fuse/static/auth/login/index.html +0 -1
- fuse_io-0.1.49/fuse/static/auth/login/index.txt +0 -23
- fuse_io-0.1.49/fuse/static/auth/register/__next._full.txt +0 -23
- fuse_io-0.1.49/fuse/static/auth/register/__next._head.txt +0 -7
- fuse_io-0.1.49/fuse/static/auth/register/__next._index.txt +0 -10
- fuse_io-0.1.49/fuse/static/auth/register/__next.auth.txt +0 -4
- fuse_io-0.1.49/fuse/static/auth/register/index.html +0 -1
- fuse_io-0.1.49/fuse/static/auth/register/index.txt +0 -23
- fuse_io-0.1.49/fuse/static/credentials-test/__next._full.txt +0 -23
- fuse_io-0.1.49/fuse/static/credentials-test/__next._head.txt +0 -7
- fuse_io-0.1.49/fuse/static/credentials-test/__next._index.txt +0 -10
- fuse_io-0.1.49/fuse/static/credentials-test/index.html +0 -1
- fuse_io-0.1.49/fuse/static/credentials-test/index.txt +0 -23
- fuse_io-0.1.49/fuse/static/dashboard/__next.!KG1haW4p.dashboard.__PAGE__.txt +0 -9
- fuse_io-0.1.49/fuse/static/dashboard/__next._full.txt +0 -26
- fuse_io-0.1.49/fuse/static/dashboard/__next._head.txt +0 -7
- fuse_io-0.1.49/fuse/static/dashboard/__next._index.txt +0 -10
- fuse_io-0.1.49/fuse/static/dashboard/index.html +0 -1
- fuse_io-0.1.49/fuse/static/dashboard/index.txt +0 -26
- fuse_io-0.1.49/fuse/static/index.html +0 -1
- fuse_io-0.1.49/fuse/static/index.txt +0 -23
- fuse_io-0.1.49/fuse/static/oauth/callback/__next._full.txt +0 -23
- fuse_io-0.1.49/fuse/static/oauth/callback/__next._head.txt +0 -7
- fuse_io-0.1.49/fuse/static/oauth/callback/__next._index.txt +0 -10
- fuse_io-0.1.49/fuse/static/oauth/callback/index.html +0 -1
- fuse_io-0.1.49/fuse/static/oauth/callback/index.txt +0 -23
- fuse_io-0.1.49/fuse/static/settings/__next._full.txt +0 -26
- fuse_io-0.1.49/fuse/static/settings/__next._head.txt +0 -7
- fuse_io-0.1.49/fuse/static/settings/__next._index.txt +0 -10
- fuse_io-0.1.49/fuse/static/settings/index.html +0 -1
- fuse_io-0.1.49/fuse/static/settings/index.txt +0 -26
- fuse_io-0.1.49/fuse/static/workflows/__next.!KG1haW4p.workflows.__PAGE__.txt +0 -10
- fuse_io-0.1.49/fuse/static/workflows/__next._full.txt +0 -29
- fuse_io-0.1.49/fuse/static/workflows/__next._head.txt +0 -7
- fuse_io-0.1.49/fuse/static/workflows/__next._index.txt +0 -10
- fuse_io-0.1.49/fuse/static/workflows/index.html +0 -1
- fuse_io-0.1.49/fuse/static/workflows/index.txt +0 -29
- fuse_io-0.1.49/fuse/static/workflows/new/__next._full.txt +0 -26
- fuse_io-0.1.49/fuse/static/workflows/new/__next._head.txt +0 -7
- fuse_io-0.1.49/fuse/static/workflows/new/__next._index.txt +0 -10
- fuse_io-0.1.49/fuse/static/workflows/new/index.html +0 -1
- fuse_io-0.1.49/fuse/static/workflows/new/index.txt +0 -26
- {fuse_io-0.1.49 → fuse_io-0.1.57}/.python-version +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/LICENSE +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/MANIFEST.in +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/README.md +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/docs/pypi_publishing_guide.md +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/__init__.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/ai/__init__.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/ai/router.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/alembic/README +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/alembic/env.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/alembic/script.py.mako +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/alembic/versions/.keep +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/alembic/versions/7a0fd1dc4902_remove_superuser.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/alembic/versions/7edc63646d26_add_credentials_table.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/alembic/versions/debec76c1cf8_initial_migration.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/alembic.ini +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/api.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/auth/__init__.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/auth/crud_user.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/auth/dependencies.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/auth/models.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/auth/router.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/auth/schemas.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/auth/service.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/auth/utils.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/backend_pre_start.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/base.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/config.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/credentials/__init__.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/credentials/models.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/database.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/initial_data.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/initial_fuse.db +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/logger.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/main.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/models.py +0 -0
- {fuse_io-0.1.49/fuse/static/_next/static/bAsbGnh27hobCWq6gYKAq → fuse_io-0.1.57/fuse/static/_next/static/AvepNa0wqMBJJaKWx9jp2}/_ssgManifest.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/bAsbGnh27hobCWq6gYKAq/_buildManifest.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/162-d9110b81661c7d7d.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/232.97b298320d3351e9.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/24-4ee5417b9b9b92a9.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/275-f12d66089f519b01.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/324-771510774da7c693.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/361-1ce2845fa2b2c4a4.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/393-d1b3ea65900fdc5e.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/4-bdc965d7dcca4cab.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/4bd1b696-01b4a2ffa8bac205.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/501-397a9f42b1c4da0e.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/547-1833756cc09c3c28.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/794-803d64bb1ca09460.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/814-18bcbd34c09817f1.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/821-04976ebb62352e45.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/93-2937d48fc52107ef.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/(main)/ai-create-example/page-0a2e0f0b4460de7c.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/(main)/dashboard/page-7e9db37c6737695c.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/(main)/layout-5c636818aa3b7ed1.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/(main)/settings/page-00bc4735cc93b9be.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/(main)/workflows/page-7c3c63a11ae33eed.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/_global-error/page-116e68079fa76e6f.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/_not-found/page-bae0d4902c5585d3.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/auth/layout-116e68079fa76e6f.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/auth/login/page-546ffaa564d327e9.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/auth/register/page-2748b1af5b1b642a.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/credentials-test/page-1d2c37deaa189b43.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/error-033f2fd59b73a2d7.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/global-error-dcd149dc42c5186b.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/layout-d0d5a6a85d213394.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/loading-116e68079fa76e6f.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/oauth/callback/page-eecedf564f689d93.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/page-606905d313079604.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/workflows/[id]/error-66ff5093f583ae94.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/workflows/[id]/loading-116e68079fa76e6f.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/workflows/[id]/page-5459cee4cb66f5bc.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/workflows/error-61dbcd88cc0eff5c.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/workflows/loading-116e68079fa76e6f.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/c37d3baf-0fedbf5b6ffcd550.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/framework-3311683cffde0ebf.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/main-app-cf50eb2a7e26453d.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/main-d74776772a65895d.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/polyfills-42372ed130431b0a.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/webpack-b28a02ce1f174559.js +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/css/59d0dfc36eeea694.css +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/css/d1e1fa7731bfdccb.css +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/media/636a5ac981f94f8b-s.p.woff2 +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/media/6fe53d21e6e7ebd8-s.woff2 +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/media/8ebc6e9dde468c4a-s.woff2 +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/media/9e7b0a821b9dfcb4-s.woff2 +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/users/__init__.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/users/router.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/utils/cache.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/utils/circuit_breaker.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/utils/code_sanitizer.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/utils/feature_flags.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/utils/health.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/utils/pagination.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/utils/rate_limit.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/utils/redis_client.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/utils/request_id.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/utils/security.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/worker.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/__init__.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/code_execution.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/crud_workflow.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/__init__.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/constants.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/core.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/error_handler.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/errors.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/executor.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/graph.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/__init__.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/actions/code.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/actions/data.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/actions/discord.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/actions/email.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/actions/google_sheets.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/actions/http_request.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/actions/slack.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/actions/utility.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/actions/whatsapp.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/ai/__init__.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/ai/agent.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/ai/chat_model.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/ai/llm.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/ai/memory.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/ai/tool.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/base.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/logic/__init__.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/logic/delay.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/logic/if_node.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/logic/loop.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/logic/merge.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/logic/parallel.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/logic/pause.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/logic/switch.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/registry.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/triggers/email.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/triggers/form.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/triggers/manual.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/triggers/rss.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/triggers/schedule.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/triggers/webhook.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/triggers/whatsapp.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/periodic_scheduler.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/runtime/code.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/runtime/http.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/runtime/internal.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/scheduler.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/state.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/logger.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/models.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/router.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/schemas.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/service.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/types.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/utils/templating.py +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse_io.egg-info/dependency_links.txt +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse_io.egg-info/entry_points.txt +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse_io.egg-info/requires.txt +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse_io.egg-info/top_level.txt +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/scripts/format.sh +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/scripts/lint.sh +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/setup.cfg +0 -0
- {fuse_io-0.1.49 → fuse_io-0.1.57}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fuse-io
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.57
|
|
4
4
|
Summary: Fuse - Workflow automation. A powerful local-first automation platform with visual builder, AI integration, and extensive node library.
|
|
5
5
|
Author-email: Bibek Timilsina <bibektimilsina@example.com>
|
|
6
6
|
License: MIT
|
|
@@ -8,6 +8,7 @@ from google import genai
|
|
|
8
8
|
from openai import OpenAI
|
|
9
9
|
from fuse.config import settings
|
|
10
10
|
from fuse.utils.circuit_breaker import CircuitBreakerOpenError, CircuitBreakers
|
|
11
|
+
import httpx
|
|
11
12
|
|
|
12
13
|
logger = logging.getLogger(__name__)
|
|
13
14
|
# Import nodes to ensure they are registered
|
|
@@ -443,6 +444,7 @@ Generate one complete workflow JSON that fully satisfies the user request and st
|
|
|
443
444
|
logger.error(f"AI execution error: {e}")
|
|
444
445
|
raise e
|
|
445
446
|
|
|
447
|
+
|
|
446
448
|
async def call_llm(
|
|
447
449
|
self,
|
|
448
450
|
messages: Optional[List[Dict[str, str]]] = None,
|
|
@@ -465,21 +467,63 @@ Generate one complete workflow JSON that fully satisfies the user request and st
|
|
|
465
467
|
if user_prompt:
|
|
466
468
|
messages.append({"role": "user", "content": user_prompt})
|
|
467
469
|
|
|
468
|
-
|
|
470
|
+
# Determine provider
|
|
471
|
+
provider = (credential.get("provider") or credential.get("type", "unknown")).lower()
|
|
472
|
+
if provider == "ai_provider":
|
|
473
|
+
provider = credential.get("data", {}).get("provider", "unknown").lower()
|
|
474
|
+
|
|
469
475
|
cred_data = credential.get("data", {})
|
|
470
476
|
api_key = cred_data.get("api_key")
|
|
471
477
|
base_url = cred_data.get("base_url")
|
|
472
478
|
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
+
# =========================================================================
|
|
480
|
+
# Google AI (OAuth or API Key)
|
|
481
|
+
# =========================================================================
|
|
482
|
+
if provider == "gemini" or provider == "google_ai":
|
|
483
|
+
access_token = cred_data.get("access_token")
|
|
484
|
+
|
|
485
|
+
# Combine formatting for Gemini
|
|
479
486
|
combined_prompt = ""
|
|
480
487
|
for msg in messages:
|
|
481
488
|
combined_prompt += f"{msg['role'].upper()}: {msg['content']}\n\n"
|
|
482
489
|
|
|
490
|
+
# 1. OAuth Access Token (Google AI Login)
|
|
491
|
+
if access_token:
|
|
492
|
+
try:
|
|
493
|
+
target_model = model or "gemini-1.5-pro-latest"
|
|
494
|
+
if "/" in target_model: target_model = target_model.split("/")[-1]
|
|
495
|
+
|
|
496
|
+
async with httpx.AsyncClient() as client:
|
|
497
|
+
resp = await client.post(
|
|
498
|
+
f"https://generativelanguage.googleapis.com/v1beta/models/{target_model}:generateContent",
|
|
499
|
+
headers={
|
|
500
|
+
"Authorization": f"Bearer {access_token}",
|
|
501
|
+
"Content-Type": "application/json"
|
|
502
|
+
},
|
|
503
|
+
json={
|
|
504
|
+
"contents": [{"parts": [{"text": combined_prompt}]}],
|
|
505
|
+
"generationConfig": {"temperature": temperature, "maxOutputTokens": max_tokens}
|
|
506
|
+
},
|
|
507
|
+
timeout=60.0
|
|
508
|
+
)
|
|
509
|
+
if resp.status_code != 200:
|
|
510
|
+
raise ValueError(f"Google AI OAuth Error: {resp.text}")
|
|
511
|
+
|
|
512
|
+
resp_json = resp.json()
|
|
513
|
+
content = resp_json.get("candidates", [{}])[0].get("content", {}).get("parts", [{}])[0].get("text", "")
|
|
514
|
+
return {
|
|
515
|
+
"content": content,
|
|
516
|
+
"usage": {"total_tokens": 0} # Usage not always returned in simple format
|
|
517
|
+
}
|
|
518
|
+
except Exception as e:
|
|
519
|
+
logger.error(f"Google AI OAuth Failed: {e}")
|
|
520
|
+
raise e
|
|
521
|
+
|
|
522
|
+
# 2. Existing API Key Flow
|
|
523
|
+
client = genai.Client(api_key=api_key) if api_key else self.gemini_client
|
|
524
|
+
if not client:
|
|
525
|
+
raise ValueError("Gemini API key not found and no OAuth token provided.")
|
|
526
|
+
|
|
483
527
|
response = client.models.generate_content(
|
|
484
528
|
model=model or "gemini-2.0-flash",
|
|
485
529
|
contents=combined_prompt,
|
|
@@ -506,8 +550,57 @@ Generate one complete workflow JSON that fully satisfies the user request and st
|
|
|
506
550
|
},
|
|
507
551
|
}
|
|
508
552
|
|
|
553
|
+
# =========================================================================
|
|
554
|
+
# GitHub Copilot
|
|
555
|
+
# =========================================================================
|
|
556
|
+
elif provider == "github_copilot":
|
|
557
|
+
copilot_token = cred_data.get("copilot_token")
|
|
558
|
+
if not copilot_token:
|
|
559
|
+
raise ValueError("GitHub Copilot token missing. Please re-authenticate.")
|
|
560
|
+
|
|
561
|
+
headers = {
|
|
562
|
+
"Authorization": f"Bearer {copilot_token}",
|
|
563
|
+
"Editor-Version": "vscode/1.85.0",
|
|
564
|
+
"User-Agent": "GitHubCopilot/1.138.0",
|
|
565
|
+
"Content-Type": "application/json"
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
# Map standard model names to Copilot internal names?
|
|
569
|
+
# Copilot usually supports 'gpt-4', 'gpt-3.5-turbo'.
|
|
570
|
+
# If user sends 'openai/gpt-4', split it.
|
|
571
|
+
copilot_model = model
|
|
572
|
+
if "/" in model:
|
|
573
|
+
copilot_model = model.split("/")[-1]
|
|
574
|
+
|
|
575
|
+
# Copilot often defaults to specific models if not specified or different names.
|
|
576
|
+
# But the API is OpenAI compatible.
|
|
577
|
+
|
|
578
|
+
payload = {
|
|
579
|
+
"messages": messages,
|
|
580
|
+
"model": copilot_model,
|
|
581
|
+
"temperature": temperature,
|
|
582
|
+
"max_tokens": max_tokens
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
async with httpx.AsyncClient() as client:
|
|
586
|
+
resp = await client.post(
|
|
587
|
+
"https://api.githubcopilot.com/chat/completions",
|
|
588
|
+
headers=headers,
|
|
589
|
+
json=payload,
|
|
590
|
+
timeout=60.0
|
|
591
|
+
)
|
|
592
|
+
|
|
593
|
+
if resp.status_code != 200:
|
|
594
|
+
raise ValueError(f"GitHub Copilot API Error ({resp.status_code}): {resp.text}")
|
|
595
|
+
|
|
596
|
+
resp_json = resp.json()
|
|
597
|
+
return {
|
|
598
|
+
"content": resp_json["choices"][0]["message"]["content"],
|
|
599
|
+
"usage": resp_json.get("usage", {})
|
|
600
|
+
}
|
|
601
|
+
|
|
509
602
|
elif provider == "openai" or (provider == "openrouter" and not base_url):
|
|
510
|
-
#
|
|
603
|
+
# ... (existing OpenAI logic) ...
|
|
511
604
|
actual_base_url = base_url or (
|
|
512
605
|
"https://openrouter.ai/api/v1" if provider == "openrouter" else None
|
|
513
606
|
)
|
|
@@ -536,6 +629,7 @@ Generate one complete workflow JSON that fully satisfies the user request and st
|
|
|
536
629
|
}
|
|
537
630
|
|
|
538
631
|
elif provider == "anthropic":
|
|
632
|
+
# ... (existing Anthropic logic) ...
|
|
539
633
|
client = Anthropic(api_key=api_key) if api_key else self.anthropic_client
|
|
540
634
|
if not client:
|
|
541
635
|
raise ValueError("Anthropic API key not found.")
|
|
@@ -564,7 +658,7 @@ Generate one complete workflow JSON that fully satisfies the user request and st
|
|
|
564
658
|
}
|
|
565
659
|
|
|
566
660
|
elif provider == "ai_provider" or base_url:
|
|
567
|
-
#
|
|
661
|
+
# ... (Rest of existing logic) ...
|
|
568
662
|
client = OpenAI(api_key=api_key, base_url=base_url)
|
|
569
663
|
response = client.chat.completions.create(
|
|
570
664
|
model=model,
|
|
@@ -15,7 +15,7 @@ logger = logging.getLogger(__name__)
|
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
@click.group()
|
|
18
|
-
@click.version_option(version="0.1.
|
|
18
|
+
@click.version_option(version="0.1.57")
|
|
19
19
|
def main():
|
|
20
20
|
"""
|
|
21
21
|
Fuse - Workflow automation.
|
|
@@ -274,7 +274,7 @@ def version():
|
|
|
274
274
|
|
|
275
275
|
table = Table(title="Version Information", show_header=False)
|
|
276
276
|
table.add_row("Package", "fuse-io")
|
|
277
|
-
table.add_row("Version", "0.1.
|
|
277
|
+
table.add_row("Version", "0.1.57")
|
|
278
278
|
table.add_row(
|
|
279
279
|
"Python",
|
|
280
280
|
f"{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}",
|
|
@@ -10,6 +10,9 @@ from fastapi.responses import RedirectResponse
|
|
|
10
10
|
from pydantic import BaseModel
|
|
11
11
|
from sqlmodel import Session, select
|
|
12
12
|
import httpx
|
|
13
|
+
import logging
|
|
14
|
+
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
13
16
|
|
|
14
17
|
from fuse.auth.dependencies import get_db, get_current_user
|
|
15
18
|
from fuse.auth.models import User
|
|
@@ -251,6 +254,9 @@ def delete_credential(
|
|
|
251
254
|
# =============================================================================
|
|
252
255
|
# OAuth Implementation
|
|
253
256
|
# =============================================================================
|
|
257
|
+
import json
|
|
258
|
+
import base64
|
|
259
|
+
from urllib.parse import urlencode
|
|
254
260
|
|
|
255
261
|
OAUTH_CONFIG = {
|
|
256
262
|
"google_sheets": {
|
|
@@ -260,6 +266,13 @@ OAUTH_CONFIG = {
|
|
|
260
266
|
"client_id": settings.GOOGLE_CLIENT_ID,
|
|
261
267
|
"client_secret": settings.GOOGLE_CLIENT_SECRET,
|
|
262
268
|
},
|
|
269
|
+
"google_ai": {
|
|
270
|
+
"auth_url": "https://accounts.google.com/o/oauth2/v2/auth",
|
|
271
|
+
"token_url": "https://oauth2.googleapis.com/token",
|
|
272
|
+
"scopes": "https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/generative-language.retriever",
|
|
273
|
+
"client_id": settings.GOOGLE_CLIENT_ID,
|
|
274
|
+
"client_secret": settings.GOOGLE_CLIENT_SECRET,
|
|
275
|
+
},
|
|
263
276
|
"slack": {
|
|
264
277
|
"auth_url": "https://slack.com/oauth/v2/authorize",
|
|
265
278
|
"token_url": "https://slack.com/api/oauth.v2.access",
|
|
@@ -278,7 +291,10 @@ OAUTH_CONFIG = {
|
|
|
278
291
|
|
|
279
292
|
|
|
280
293
|
@router.get("/oauth/{provider}/authorize")
|
|
281
|
-
async def oauth_authorize(
|
|
294
|
+
async def oauth_authorize(
|
|
295
|
+
provider: str,
|
|
296
|
+
current_user: User = Depends(get_current_user)
|
|
297
|
+
):
|
|
282
298
|
"""Initiate OAuth flow for a provider."""
|
|
283
299
|
config = OAUTH_CONFIG.get(provider)
|
|
284
300
|
if not config:
|
|
@@ -287,6 +303,7 @@ async def oauth_authorize(provider: str):
|
|
|
287
303
|
if not config.get("client_id") or not config.get("client_secret"):
|
|
288
304
|
ENV_VARS = {
|
|
289
305
|
"google_sheets": ("GOOGLE_CLIENT_ID", "GOOGLE_CLIENT_SECRET"),
|
|
306
|
+
"google_ai": ("GOOGLE_CLIENT_ID", "GOOGLE_CLIENT_SECRET"),
|
|
290
307
|
"slack": ("SLACK_CLIENT_ID", "SLACK_CLIENT_SECRET"),
|
|
291
308
|
"discord": ("DISCORD_CLIENT_ID", "DISCORD_CLIENT_SECRET"),
|
|
292
309
|
}
|
|
@@ -300,7 +317,10 @@ async def oauth_authorize(provider: str):
|
|
|
300
317
|
|
|
301
318
|
redirect_uri = f"{settings.server_host}/api/v1/credentials/oauth/{provider}/callback"
|
|
302
319
|
|
|
303
|
-
|
|
320
|
+
# Encode state with user_id
|
|
321
|
+
state_data = {"user_id": str(current_user.id)}
|
|
322
|
+
state = base64.urlsafe_b64encode(json.dumps(state_data).encode()).decode()
|
|
323
|
+
|
|
304
324
|
params = {
|
|
305
325
|
"client_id": config["client_id"],
|
|
306
326
|
"redirect_uri": redirect_uri,
|
|
@@ -308,6 +328,7 @@ async def oauth_authorize(provider: str):
|
|
|
308
328
|
"scope": config["scopes"],
|
|
309
329
|
"access_type": "offline",
|
|
310
330
|
"prompt": "consent",
|
|
331
|
+
"state": state,
|
|
311
332
|
}
|
|
312
333
|
|
|
313
334
|
query_string = urlencode(params)
|
|
@@ -318,12 +339,34 @@ async def oauth_authorize(provider: str):
|
|
|
318
339
|
async def oauth_callback(
|
|
319
340
|
provider: str,
|
|
320
341
|
code: str,
|
|
342
|
+
state: Optional[str] = None,
|
|
321
343
|
session: Session = Depends(get_db)
|
|
322
344
|
):
|
|
323
345
|
"""Handle OAuth callback and save credential."""
|
|
324
346
|
config = OAUTH_CONFIG.get(provider)
|
|
325
347
|
if not config:
|
|
326
348
|
raise HTTPException(status_code=400, detail="Invalid provider")
|
|
349
|
+
|
|
350
|
+
# Retrieve user from state
|
|
351
|
+
user_id = None
|
|
352
|
+
if state:
|
|
353
|
+
try:
|
|
354
|
+
state_data = json.loads(base64.urlsafe_b64decode(state).decode())
|
|
355
|
+
user_id = state_data.get("user_id")
|
|
356
|
+
except Exception:
|
|
357
|
+
pass # Handle gracefully or error out
|
|
358
|
+
|
|
359
|
+
if not user_id:
|
|
360
|
+
# Fallback for legacy flows or direct visits?
|
|
361
|
+
# In strictly secured app, we should fail.
|
|
362
|
+
# But given we just removed superuser, we need a fallback if state is missing?
|
|
363
|
+
# No, state is required now.
|
|
364
|
+
raise HTTPException(status_code=400, detail="Invalid state parameter. Login flow interrupted.")
|
|
365
|
+
|
|
366
|
+
# Verify user exists
|
|
367
|
+
user = session.get(User, uuid.UUID(user_id))
|
|
368
|
+
if not user:
|
|
369
|
+
raise HTTPException(status_code=404, detail="User not found")
|
|
327
370
|
|
|
328
371
|
redirect_uri = f"{settings.server_host}/api/v1/credentials/oauth/{provider}/callback"
|
|
329
372
|
|
|
@@ -356,15 +399,6 @@ async def oauth_callback(
|
|
|
356
399
|
if provider == "slack":
|
|
357
400
|
name = token_data.get("team", {}).get("name", name)
|
|
358
401
|
|
|
359
|
-
# For OAuth callbacks, we don't have user context from JWT
|
|
360
|
-
# In production, you'd store state param with user_id and retrieve it here
|
|
361
|
-
# For now, we'll get the first superuser as owner
|
|
362
|
-
from fuse.auth.models import User
|
|
363
|
-
user = session.exec(select(User).where(User.is_superuser == True)).first()
|
|
364
|
-
|
|
365
|
-
if not user:
|
|
366
|
-
raise HTTPException(status_code=500, detail="No user found to assign credential")
|
|
367
|
-
|
|
368
402
|
credential = Credential(
|
|
369
403
|
name=name,
|
|
370
404
|
type=provider,
|
|
@@ -380,3 +414,100 @@ async def oauth_callback(
|
|
|
380
414
|
return RedirectResponse(
|
|
381
415
|
url=f"{settings.FRONTEND_URL}/oauth/callback?status=success&id={credential.id}&name={name}"
|
|
382
416
|
)
|
|
417
|
+
|
|
418
|
+
|
|
419
|
+
# =============================================================================
|
|
420
|
+
# GitHub Copilot (Device Flow)
|
|
421
|
+
# =============================================================================
|
|
422
|
+
|
|
423
|
+
GITHUB_COPILOT_CLIENT_ID = "01ab8ac9400c4e429b23" # VS Code Client ID
|
|
424
|
+
|
|
425
|
+
@router.post("/oauth/github-copilot/device/code")
|
|
426
|
+
async def github_copilot_device_code(current_user: User = Depends(get_current_user)):
|
|
427
|
+
"""Start GitHub Copilot Device Flow"""
|
|
428
|
+
async with httpx.AsyncClient() as client:
|
|
429
|
+
response = await client.post(
|
|
430
|
+
"https://github.com/login/device/code",
|
|
431
|
+
json={"client_id": GITHUB_COPILOT_CLIENT_ID, "scope": "read:user"},
|
|
432
|
+
headers={"Accept": "application/json"}
|
|
433
|
+
)
|
|
434
|
+
|
|
435
|
+
if response.status_code != 200:
|
|
436
|
+
raise HTTPException(status_code=400, detail="Failed to initiate device flow")
|
|
437
|
+
|
|
438
|
+
return response.json()
|
|
439
|
+
|
|
440
|
+
@router.post("/oauth/github-copilot/device/poll")
|
|
441
|
+
async def github_copilot_poll(
|
|
442
|
+
device_code: str,
|
|
443
|
+
session: Session = Depends(get_db),
|
|
444
|
+
current_user: User = Depends(get_current_user)
|
|
445
|
+
):
|
|
446
|
+
"""Poll for GitHub Copilot Token"""
|
|
447
|
+
async with httpx.AsyncClient() as client:
|
|
448
|
+
response = await client.post(
|
|
449
|
+
"https://github.com/login/oauth/access_token",
|
|
450
|
+
data={
|
|
451
|
+
"client_id": GITHUB_COPILOT_CLIENT_ID,
|
|
452
|
+
"device_code": device_code,
|
|
453
|
+
"grant_type": "urn:ietf:params:oauth:grant-type:device_code"
|
|
454
|
+
},
|
|
455
|
+
headers={"Accept": "application/json"}
|
|
456
|
+
)
|
|
457
|
+
|
|
458
|
+
data = response.json()
|
|
459
|
+
logger.info(f"GitHub Device Poll Response: {data}")
|
|
460
|
+
|
|
461
|
+
if "error" in data:
|
|
462
|
+
error = data.get("error")
|
|
463
|
+
if error == "authorization_pending":
|
|
464
|
+
return {"status": "pending"}
|
|
465
|
+
elif error == "slow_down":
|
|
466
|
+
return {"status": "pending", "interval": data.get("interval", 5)}
|
|
467
|
+
elif error == "expired_token":
|
|
468
|
+
raise HTTPException(status_code=400, detail="Device code expired")
|
|
469
|
+
else:
|
|
470
|
+
raise HTTPException(status_code=400, detail=f"GitHub Error: {error}")
|
|
471
|
+
|
|
472
|
+
# Success!
|
|
473
|
+
# Now we need to get the "Copilot Token" using this OAuth token?
|
|
474
|
+
# Actually, standard Copilot flow:
|
|
475
|
+
# 1. OAuth Token (from device flow)
|
|
476
|
+
# 2. Get Copilot Token (GET https://api.github.com/copilot_internal/v2/token) using OAuth token
|
|
477
|
+
|
|
478
|
+
oauth_token = data.get("access_token")
|
|
479
|
+
|
|
480
|
+
# Verify copilot access and get internal token
|
|
481
|
+
copilot_resp = await client.get(
|
|
482
|
+
"https://api.github.com/copilot_internal/v2/token",
|
|
483
|
+
headers={
|
|
484
|
+
"Authorization": f"token {oauth_token}",
|
|
485
|
+
"Editor-Version": "vscode/1.85.0",
|
|
486
|
+
"User-Agent": "GitHubCopilot/1.138.0"
|
|
487
|
+
}
|
|
488
|
+
)
|
|
489
|
+
|
|
490
|
+
if copilot_resp.status_code != 200:
|
|
491
|
+
raise HTTPException(status_code=403, detail="Failed to retrieve Copilot token. Access denied or no subscription.")
|
|
492
|
+
|
|
493
|
+
copilot_data = copilot_resp.json()
|
|
494
|
+
|
|
495
|
+
# Save Credential
|
|
496
|
+
encrypted_data = encrypt_credential_data({
|
|
497
|
+
"access_token": oauth_token, # The GitHub OAuth token
|
|
498
|
+
"copilot_token": copilot_data.get("token"), # The actual model access token
|
|
499
|
+
"copilot_expires_at": copilot_data.get("expires_at"),
|
|
500
|
+
"token_type": "github_copilot"
|
|
501
|
+
})
|
|
502
|
+
|
|
503
|
+
credential = Credential(
|
|
504
|
+
name="GitHub Copilot",
|
|
505
|
+
type="github_copilot",
|
|
506
|
+
data=encrypted_data,
|
|
507
|
+
owner_id=current_user.id
|
|
508
|
+
)
|
|
509
|
+
session.add(credential)
|
|
510
|
+
session.commit()
|
|
511
|
+
session.refresh(credential)
|
|
512
|
+
|
|
513
|
+
return {"status": "success", "credential": credential_to_response(credential)}
|
|
@@ -20,6 +20,9 @@ OAUTH_CONFIG = {
|
|
|
20
20
|
"google_sheets": {
|
|
21
21
|
"token_url": "https://oauth2.googleapis.com/token",
|
|
22
22
|
},
|
|
23
|
+
"google_ai": {
|
|
24
|
+
"token_url": "https://oauth2.googleapis.com/token",
|
|
25
|
+
},
|
|
23
26
|
"slack": {
|
|
24
27
|
"token_url": "https://slack.com/api/oauth.v2.access",
|
|
25
28
|
},
|
|
@@ -32,7 +35,7 @@ OAUTH_CONFIG = {
|
|
|
32
35
|
def decrypt_credential_data(data: Dict[str, Any]) -> Dict[str, Any]:
|
|
33
36
|
"""Decrypt sensitive fields in credential data."""
|
|
34
37
|
result = data.copy()
|
|
35
|
-
sensitive_fields = ['access_token', 'refresh_token', 'api_key', 'token', 'secret', 'password', 'webhook_url', 'bot_token']
|
|
38
|
+
sensitive_fields = ['access_token', 'refresh_token', 'api_key', 'token', 'secret', 'password', 'webhook_url', 'bot_token', 'copilot_token']
|
|
36
39
|
|
|
37
40
|
for field in sensitive_fields:
|
|
38
41
|
if field in result and result[field]:
|
|
@@ -102,8 +105,57 @@ async def get_active_credential(cred_id: str) -> Optional[Dict[str, Any]]:
|
|
|
102
105
|
return None
|
|
103
106
|
|
|
104
107
|
data = cred["data"]
|
|
108
|
+
provider = cred["type"]
|
|
109
|
+
|
|
110
|
+
# Special handling for GitHub Copilot Refresh
|
|
111
|
+
if provider == "github_copilot":
|
|
112
|
+
copilot_expires = data.get("copilot_expires_at")
|
|
113
|
+
if copilot_expires and datetime.fromisoformat(copilot_expires) < datetime.now():
|
|
114
|
+
logger.debug(f"Copilot token expired. Refreshing using device flow access token...")
|
|
115
|
+
access_token = data.get("access_token")
|
|
116
|
+
if not access_token:
|
|
117
|
+
return cred # Can't refresh
|
|
118
|
+
|
|
119
|
+
try:
|
|
120
|
+
async with httpx.AsyncClient() as client:
|
|
121
|
+
copilot_resp = await client.get(
|
|
122
|
+
"https://api.github.com/copilot_internal/v2/token",
|
|
123
|
+
headers={
|
|
124
|
+
"Authorization": f"token {access_token}",
|
|
125
|
+
"Editor-Version": "vscode/1.85.0",
|
|
126
|
+
"User-Agent": "GitHubCopilot/1.138.0"
|
|
127
|
+
}
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
if copilot_resp.status_code == 200:
|
|
131
|
+
copilot_data = copilot_resp.json()
|
|
132
|
+
new_token = copilot_data.get("token")
|
|
133
|
+
new_expiry = copilot_data.get("expires_at")
|
|
134
|
+
|
|
135
|
+
# Update DB
|
|
136
|
+
try:
|
|
137
|
+
cred_uuid = uuid.UUID(cred_id)
|
|
138
|
+
with Session(engine) as session:
|
|
139
|
+
credential = session.get(Credential, cred_uuid)
|
|
140
|
+
if credential:
|
|
141
|
+
credential.data["copilot_token"] = encrypt_string(new_token)
|
|
142
|
+
credential.data["copilot_expires_at"] = new_expiry
|
|
143
|
+
credential.updated_at = datetime.utcnow()
|
|
144
|
+
session.add(credential)
|
|
145
|
+
session.commit()
|
|
146
|
+
|
|
147
|
+
# Update local return
|
|
148
|
+
data["copilot_token"] = new_token
|
|
149
|
+
data["copilot_expires_at"] = new_expiry
|
|
150
|
+
except Exception as e:
|
|
151
|
+
logger.error(f"Failed to save refreshed Copilot token: {e}")
|
|
152
|
+
except Exception as e:
|
|
153
|
+
logger.error(f"Failed to refresh Copilot token: {e}")
|
|
154
|
+
|
|
155
|
+
return cred
|
|
156
|
+
|
|
105
157
|
|
|
106
|
-
#
|
|
158
|
+
# Standard OAuth Refresh
|
|
107
159
|
expires_at = data.get("expires_at")
|
|
108
160
|
refresh_token = data.get("refresh_token")
|
|
109
161
|
|
|
@@ -115,7 +167,6 @@ async def get_active_credential(cred_id: str) -> Optional[Dict[str, Any]]:
|
|
|
115
167
|
):
|
|
116
168
|
logger.debug(f"Token for {cred['name']} expired at {expires_at}. Refreshing...")
|
|
117
169
|
|
|
118
|
-
provider = cred["type"] # e.g., google_sheets
|
|
119
170
|
config = OAUTH_CONFIG.get(provider)
|
|
120
171
|
|
|
121
172
|
if config:
|
|
@@ -126,7 +177,7 @@ async def get_active_credential(cred_id: str) -> Optional[Dict[str, Any]]:
|
|
|
126
177
|
client_id = None
|
|
127
178
|
client_secret = None
|
|
128
179
|
|
|
129
|
-
if provider
|
|
180
|
+
if provider in ["google_sheets", "google_ai"]:
|
|
130
181
|
client_id = settings.GOOGLE_CLIENT_ID
|
|
131
182
|
client_secret = settings.GOOGLE_CLIENT_SECRET
|
|
132
183
|
elif provider == "slack":
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<!DOCTYPE html><!--AvepNa0wqMBJJaKWx9jp2--><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/636a5ac981f94f8b-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/1cb804ccb5b9c075.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/4a300d88a66b0638.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-03fc999381a8cb79.js"/><script src="/_next/static/chunks/4bd1b696-e5d7c65570c947b7.js" async=""></script><script src="/_next/static/chunks/3794-04fa707794cee3fc.js" async=""></script><script src="/_next/static/chunks/main-app-14c06b7adeda3bca.js" async=""></script><script src="/_next/static/chunks/8547-58d8503b201666a3.js" async=""></script><script src="/_next/static/chunks/2842-88d6ea1ddfa4c472.js" async=""></script><script src="/_next/static/chunks/1704-99cc2ea208d98cb0.js" async=""></script><script src="/_next/static/chunks/4831-2650d23954cfe85f.js" async=""></script><script src="/_next/static/chunks/7152-7978ade421a25c37.js" async=""></script><script src="/_next/static/chunks/7856-044a4109806f2a2d.js" async=""></script><script src="/_next/static/chunks/app/layout-2ac4c5b8cbb2c64d.js" async=""></script><script src="/_next/static/chunks/8500-98e13bcce54aa7a0.js" async=""></script><script src="/_next/static/chunks/app/error-408c6bff597b9d0e.js" async=""></script><script src="/_next/static/chunks/app/global-error-ab2bae883ee0e860.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>Fuse</title><meta name="description" content="Build and automate powerful workflows"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="__className_646807"><div hidden=""><!--$--><!--/$--></div><script>((a,b,c,d,e,f,g,h)=>{let i=document.documentElement,j=["light","dark"];function k(b){var c;(Array.isArray(a)?a:[a]).forEach(a=>{let c="class"===a,d=c&&f?e.map(a=>f[a]||a):e;c?(i.classList.remove(...d),i.classList.add(f&&f[b]?f[b]:b)):i.setAttribute(a,b)}),c=b,h&&j.includes(c)&&(i.style.colorScheme=c)}if(d)k(d);else try{let a=localStorage.getItem(b)||c,d=g&&"system"===a?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":a;k(d)}catch(a){}})("class","theme","system",null,["light","dark"],null,true,true)</script><!--$--><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><!--/$--><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]"></ol></div><script src="/_next/static/chunks/webpack-03fc999381a8cb79.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[70460,[\"8547\",\"static/chunks/8547-58d8503b201666a3.js\",\"2842\",\"static/chunks/2842-88d6ea1ddfa4c472.js\",\"1704\",\"static/chunks/1704-99cc2ea208d98cb0.js\",\"4831\",\"static/chunks/4831-2650d23954cfe85f.js\",\"7152\",\"static/chunks/7152-7978ade421a25c37.js\",\"7856\",\"static/chunks/7856-044a4109806f2a2d.js\",\"7177\",\"static/chunks/app/layout-2ac4c5b8cbb2c64d.js\"],\"ThemeProvider\"]\n3:I[96337,[\"8547\",\"static/chunks/8547-58d8503b201666a3.js\",\"2842\",\"static/chunks/2842-88d6ea1ddfa4c472.js\",\"1704\",\"static/chunks/1704-99cc2ea208d98cb0.js\",\"4831\",\"static/chunks/4831-2650d23954cfe85f.js\",\"7152\",\"static/chunks/7152-7978ade421a25c37.js\",\"7856\",\"static/chunks/7856-044a4109806f2a2d.js\",\"7177\",\"static/chunks/app/layout-2ac4c5b8cbb2c64d.js\"],\"QueryProvider\"]\n4:I[19417,[\"8547\",\"static/chunks/8547-58d8503b201666a3.js\",\"2842\",\"static/chunks/2842-88d6ea1ddfa4c472.js\",\"1704\",\"static/chunks/1704-99cc2ea208d98cb0.js\",\"4831\",\"static/chunks/4831-2650d23954cfe85f.js\",\"7152\",\"static/chunks/7152-7978ade421a25c37.js\",\"7856\",\"static/chunks/7856-044a4109806f2a2d.js\",\"7177\",\"static/chunks/app/layout-2ac4c5b8cbb2c64d.js\"],\"AuthProvider\"]\n5:I[57121,[],\"\"]\n6:I[87460,[\"8547\",\"static/chunks/8547-58d8503b201666a3.js\",\"8500\",\"static/chunks/8500-98e13bcce54aa7a0.js\",\"8039\",\"static/chunks/app/error-408c6bff597b9d0e.js\"],\"default\"]\n7:I[74581,[],\"\"]\n8:I[23241,[\"8547\",\"static/chunks/8547-58d8503b201666a3.js\",\"2842\",\"static/chunks/2842-88d6ea1ddfa4c472.js\",\"1704\",\"static/chunks/1704-99cc2ea208d98cb0.js\",\"4831\",\"static/chunks/4831-2650d23954cfe85f.js\",\"7152\",\"static/chunks/7152-7978ade421a25c37.js\",\"7856\",\"static/chunks/7856-044a4109806f2a2d.js\",\"7177\",\"static/chunks/app/layout-2ac4c5b8cbb2c64d.js\"],\"Toaster\"]\n9:I[90484,[],\"OutletBoundary\"]\na:\"$Sreact.suspense\"\nc:I[90484,[],\"ViewportBoundary\"]\ne:I[90484,[],\"MetadataBoundary\"]\n10:I[54690,[\"4219\",\"static/chunks/app/global-error-ab2bae883ee0e860.js\"],\"default\"]\n:HL[\"/_next/static/media/636a5ac981f94f8b-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/1cb804ccb5b9c075.css\",\"style\"]\n:HL[\"/_next/static/css/4a300d88a66b0638.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"AvepNa0wqMBJJaKWx9jp2\",\"c\":[\"\",\"_not-found\",\"\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/1cb804ccb5b9c075.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/4a300d88a66b0638.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[\"$\",\"body\",null,{\"className\":\"__className_646807\",\"suppressHydrationWarning\":true,\"children\":[\"$\",\"$L2\",null,{\"attribute\":\"class\",\"defaultTheme\":\"system\",\"enableSystem\":true,\"disableTransitionOnChange\":true,\"children\":[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"children\":[[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$6\",\"errorStyles\":[],\"errorScripts\":[],\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}],[\"$\",\"$L8\",null,{}]]}]}]}]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$a\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@b\"}]}]]}],{},null,false,false]},null,false,false]},[[\"$\",\"div\",\"l\",{\"className\":\"flex flex-col min-h-screen\",\"children\":[[\"$\",\"div\",null,{\"className\":\"border-b\",\"children\":[\"$\",\"div\",null,{\"className\":\"flex h-16 items-center px-4 gap-4\",\"children\":[[\"$\",\"div\",null,{\"className\":\"animate-pulse rounded-md bg-muted h-8 w-32\"}],[\"$\",\"div\",null,{\"className\":\"flex-1\"}],[\"$\",\"div\",null,{\"className\":\"animate-pulse bg-muted h-8 w-8 rounded-full\"}]]}]}],[\"$\",\"div\",null,{\"className\":\"flex-1 p-6\",\"children\":[\"$\",\"div\",null,{\"className\":\"max-w-6xl mx-auto space-y-6\",\"children\":[[\"$\",\"div\",null,{\"className\":\"animate-pulse rounded-md bg-muted h-10 w-64\"}],[\"$\",\"div\",null,{\"className\":\"grid grid-cols-1 md:grid-cols-3 gap-4\",\"children\":[[\"$\",\"div\",null,{\"className\":\"animate-pulse bg-muted h-32 rounded-lg\"}],[\"$\",\"div\",null,{\"className\":\"animate-pulse bg-muted h-32 rounded-lg\"}],[\"$\",\"div\",null,{\"className\":\"animate-pulse bg-muted h-32 rounded-lg\"}]]}],[\"$\",\"div\",null,{\"className\":\"animate-pulse bg-muted h-64 rounded-lg\"}]]}]}]]}],[],[]],false,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$Lc\",null,{\"children\":\"$Ld\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Le\",null,{\"children\":[\"$\",\"$a\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lf\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$10\",[]],\"S\":true}\n"])</script><script>self.__next_f.push([1,"d:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"b:null\nf:[[\"$\",\"title\",\"0\",{\"children\":\"Fuse\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Build and automate powerful workflows\"}]]\n"])</script></body></html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<!DOCTYPE html><!--AvepNa0wqMBJJaKWx9jp2--><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/636a5ac981f94f8b-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/1cb804ccb5b9c075.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/4a300d88a66b0638.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-03fc999381a8cb79.js"/><script src="/_next/static/chunks/4bd1b696-e5d7c65570c947b7.js" async=""></script><script src="/_next/static/chunks/3794-04fa707794cee3fc.js" async=""></script><script src="/_next/static/chunks/main-app-14c06b7adeda3bca.js" async=""></script><script src="/_next/static/chunks/8547-58d8503b201666a3.js" async=""></script><script src="/_next/static/chunks/2842-88d6ea1ddfa4c472.js" async=""></script><script src="/_next/static/chunks/1704-99cc2ea208d98cb0.js" async=""></script><script src="/_next/static/chunks/4831-2650d23954cfe85f.js" async=""></script><script src="/_next/static/chunks/7152-7978ade421a25c37.js" async=""></script><script src="/_next/static/chunks/7856-044a4109806f2a2d.js" async=""></script><script src="/_next/static/chunks/app/layout-2ac4c5b8cbb2c64d.js" async=""></script><script src="/_next/static/chunks/8500-98e13bcce54aa7a0.js" async=""></script><script src="/_next/static/chunks/app/error-408c6bff597b9d0e.js" async=""></script><script src="/_next/static/chunks/app/global-error-ab2bae883ee0e860.js" async=""></script><meta name="robots" content="noindex"/><meta name="next-size-adjust" content=""/><title>404: This page could not be found.</title><title>Fuse</title><meta name="description" content="Build and automate powerful workflows"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="__className_646807"><div hidden=""><!--$--><!--/$--></div><script>((a,b,c,d,e,f,g,h)=>{let i=document.documentElement,j=["light","dark"];function k(b){var c;(Array.isArray(a)?a:[a]).forEach(a=>{let c="class"===a,d=c&&f?e.map(a=>f[a]||a):e;c?(i.classList.remove(...d),i.classList.add(f&&f[b]?f[b]:b)):i.setAttribute(a,b)}),c=b,h&&j.includes(c)&&(i.style.colorScheme=c)}if(d)k(d);else try{let a=localStorage.getItem(b)||c,d=g&&"system"===a?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":a;k(d)}catch(a){}})("class","theme","system",null,["light","dark"],null,true,true)</script><!--$--><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><!--/$--><div role="region" aria-label="Notifications (F8)" tabindex="-1" style="pointer-events:none"><ol tabindex="-1" class="fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]"></ol></div><script src="/_next/static/chunks/webpack-03fc999381a8cb79.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[70460,[\"8547\",\"static/chunks/8547-58d8503b201666a3.js\",\"2842\",\"static/chunks/2842-88d6ea1ddfa4c472.js\",\"1704\",\"static/chunks/1704-99cc2ea208d98cb0.js\",\"4831\",\"static/chunks/4831-2650d23954cfe85f.js\",\"7152\",\"static/chunks/7152-7978ade421a25c37.js\",\"7856\",\"static/chunks/7856-044a4109806f2a2d.js\",\"7177\",\"static/chunks/app/layout-2ac4c5b8cbb2c64d.js\"],\"ThemeProvider\"]\n3:I[96337,[\"8547\",\"static/chunks/8547-58d8503b201666a3.js\",\"2842\",\"static/chunks/2842-88d6ea1ddfa4c472.js\",\"1704\",\"static/chunks/1704-99cc2ea208d98cb0.js\",\"4831\",\"static/chunks/4831-2650d23954cfe85f.js\",\"7152\",\"static/chunks/7152-7978ade421a25c37.js\",\"7856\",\"static/chunks/7856-044a4109806f2a2d.js\",\"7177\",\"static/chunks/app/layout-2ac4c5b8cbb2c64d.js\"],\"QueryProvider\"]\n4:I[19417,[\"8547\",\"static/chunks/8547-58d8503b201666a3.js\",\"2842\",\"static/chunks/2842-88d6ea1ddfa4c472.js\",\"1704\",\"static/chunks/1704-99cc2ea208d98cb0.js\",\"4831\",\"static/chunks/4831-2650d23954cfe85f.js\",\"7152\",\"static/chunks/7152-7978ade421a25c37.js\",\"7856\",\"static/chunks/7856-044a4109806f2a2d.js\",\"7177\",\"static/chunks/app/layout-2ac4c5b8cbb2c64d.js\"],\"AuthProvider\"]\n5:I[57121,[],\"\"]\n6:I[87460,[\"8547\",\"static/chunks/8547-58d8503b201666a3.js\",\"8500\",\"static/chunks/8500-98e13bcce54aa7a0.js\",\"8039\",\"static/chunks/app/error-408c6bff597b9d0e.js\"],\"default\"]\n7:I[74581,[],\"\"]\n8:I[23241,[\"8547\",\"static/chunks/8547-58d8503b201666a3.js\",\"2842\",\"static/chunks/2842-88d6ea1ddfa4c472.js\",\"1704\",\"static/chunks/1704-99cc2ea208d98cb0.js\",\"4831\",\"static/chunks/4831-2650d23954cfe85f.js\",\"7152\",\"static/chunks/7152-7978ade421a25c37.js\",\"7856\",\"static/chunks/7856-044a4109806f2a2d.js\",\"7177\",\"static/chunks/app/layout-2ac4c5b8cbb2c64d.js\"],\"Toaster\"]\n9:I[90484,[],\"OutletBoundary\"]\na:\"$Sreact.suspense\"\nc:I[90484,[],\"ViewportBoundary\"]\ne:I[90484,[],\"MetadataBoundary\"]\n10:I[54690,[\"4219\",\"static/chunks/app/global-error-ab2bae883ee0e860.js\"],\"default\"]\n:HL[\"/_next/static/media/636a5ac981f94f8b-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/1cb804ccb5b9c075.css\",\"style\"]\n:HL[\"/_next/static/css/4a300d88a66b0638.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"AvepNa0wqMBJJaKWx9jp2\",\"c\":[\"\",\"_not-found\",\"\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/1cb804ccb5b9c075.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/4a300d88a66b0638.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[\"$\",\"body\",null,{\"className\":\"__className_646807\",\"suppressHydrationWarning\":true,\"children\":[\"$\",\"$L2\",null,{\"attribute\":\"class\",\"defaultTheme\":\"system\",\"enableSystem\":true,\"disableTransitionOnChange\":true,\"children\":[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"children\":[[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$6\",\"errorStyles\":[],\"errorScripts\":[],\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}],[\"$\",\"$L8\",null,{}]]}]}]}]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L7\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$a\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@b\"}]}]]}],{},null,false,false]},null,false,false]},[[\"$\",\"div\",\"l\",{\"className\":\"flex flex-col min-h-screen\",\"children\":[[\"$\",\"div\",null,{\"className\":\"border-b\",\"children\":[\"$\",\"div\",null,{\"className\":\"flex h-16 items-center px-4 gap-4\",\"children\":[[\"$\",\"div\",null,{\"className\":\"animate-pulse rounded-md bg-muted h-8 w-32\"}],[\"$\",\"div\",null,{\"className\":\"flex-1\"}],[\"$\",\"div\",null,{\"className\":\"animate-pulse bg-muted h-8 w-8 rounded-full\"}]]}]}],[\"$\",\"div\",null,{\"className\":\"flex-1 p-6\",\"children\":[\"$\",\"div\",null,{\"className\":\"max-w-6xl mx-auto space-y-6\",\"children\":[[\"$\",\"div\",null,{\"className\":\"animate-pulse rounded-md bg-muted h-10 w-64\"}],[\"$\",\"div\",null,{\"className\":\"grid grid-cols-1 md:grid-cols-3 gap-4\",\"children\":[[\"$\",\"div\",null,{\"className\":\"animate-pulse bg-muted h-32 rounded-lg\"}],[\"$\",\"div\",null,{\"className\":\"animate-pulse bg-muted h-32 rounded-lg\"}],[\"$\",\"div\",null,{\"className\":\"animate-pulse bg-muted h-32 rounded-lg\"}]]}],[\"$\",\"div\",null,{\"className\":\"animate-pulse bg-muted h-64 rounded-lg\"}]]}]}]]}],[],[]],false,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$Lc\",null,{\"children\":\"$Ld\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Le\",null,{\"children\":[\"$\",\"$a\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lf\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$10\",[]],\"S\":true}\n"])</script><script>self.__next_f.push([1,"d:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"b:null\nf:[[\"$\",\"title\",\"0\",{\"children\":\"Fuse\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Build and automate powerful workflows\"}]]\n"])</script></body></html>
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
1:"$Sreact.fragment"
|
|
2
2
|
2:I[61304,[],"ClientPageRoot"]
|
|
3
|
-
3:I[66919,["
|
|
3
|
+
3:I[66919,["2842","static/chunks/2842-88d6ea1ddfa4c472.js","8974","static/chunks/app/page-502f3458c458bd75.js"],"default"]
|
|
4
4
|
6:I[90484,[],"OutletBoundary"]
|
|
5
5
|
7:"$Sreact.suspense"
|
|
6
|
-
0:{"buildId":"
|
|
6
|
+
0:{"buildId":"AvepNa0wqMBJJaKWx9jp2","rsc":["$","$1","c",{"children":[["$","$L2",null,{"Component":"$3","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@4","$@5"]}}],null,["$","$L6",null,{"children":["$","$7",null,{"name":"Next.MetadataOutlet","children":"$@8"}]}]]}],"loading":null,"isPartial":false}
|
|
7
7
|
4:{}
|
|
8
8
|
5:"$0:rsc:props:children:0:props:serverProvidedParams:params"
|
|
9
9
|
8:null
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
1:"$Sreact.fragment"
|
|
2
|
+
2:I[70460,["8547","static/chunks/8547-58d8503b201666a3.js","2842","static/chunks/2842-88d6ea1ddfa4c472.js","1704","static/chunks/1704-99cc2ea208d98cb0.js","4831","static/chunks/4831-2650d23954cfe85f.js","7152","static/chunks/7152-7978ade421a25c37.js","7856","static/chunks/7856-044a4109806f2a2d.js","7177","static/chunks/app/layout-2ac4c5b8cbb2c64d.js"],"ThemeProvider"]
|
|
3
|
+
3:I[96337,["8547","static/chunks/8547-58d8503b201666a3.js","2842","static/chunks/2842-88d6ea1ddfa4c472.js","1704","static/chunks/1704-99cc2ea208d98cb0.js","4831","static/chunks/4831-2650d23954cfe85f.js","7152","static/chunks/7152-7978ade421a25c37.js","7856","static/chunks/7856-044a4109806f2a2d.js","7177","static/chunks/app/layout-2ac4c5b8cbb2c64d.js"],"QueryProvider"]
|
|
4
|
+
4:I[19417,["8547","static/chunks/8547-58d8503b201666a3.js","2842","static/chunks/2842-88d6ea1ddfa4c472.js","1704","static/chunks/1704-99cc2ea208d98cb0.js","4831","static/chunks/4831-2650d23954cfe85f.js","7152","static/chunks/7152-7978ade421a25c37.js","7856","static/chunks/7856-044a4109806f2a2d.js","7177","static/chunks/app/layout-2ac4c5b8cbb2c64d.js"],"AuthProvider"]
|
|
5
|
+
5:I[57121,[],""]
|
|
6
|
+
6:I[87460,["8547","static/chunks/8547-58d8503b201666a3.js","8500","static/chunks/8500-98e13bcce54aa7a0.js","8039","static/chunks/app/error-408c6bff597b9d0e.js"],"default"]
|
|
7
|
+
7:I[74581,[],""]
|
|
8
|
+
8:I[23241,["8547","static/chunks/8547-58d8503b201666a3.js","2842","static/chunks/2842-88d6ea1ddfa4c472.js","1704","static/chunks/1704-99cc2ea208d98cb0.js","4831","static/chunks/4831-2650d23954cfe85f.js","7152","static/chunks/7152-7978ade421a25c37.js","7856","static/chunks/7856-044a4109806f2a2d.js","7177","static/chunks/app/layout-2ac4c5b8cbb2c64d.js"],"Toaster"]
|
|
9
|
+
9:I[61304,[],"ClientPageRoot"]
|
|
10
|
+
a:I[66919,["2842","static/chunks/2842-88d6ea1ddfa4c472.js","8974","static/chunks/app/page-502f3458c458bd75.js"],"default"]
|
|
11
|
+
d:I[90484,[],"OutletBoundary"]
|
|
12
|
+
e:"$Sreact.suspense"
|
|
13
|
+
10:I[90484,[],"ViewportBoundary"]
|
|
14
|
+
12:I[90484,[],"MetadataBoundary"]
|
|
15
|
+
14:I[54690,["4219","static/chunks/app/global-error-ab2bae883ee0e860.js"],"default"]
|
|
16
|
+
:HL["/_next/static/media/636a5ac981f94f8b-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
|
|
17
|
+
:HL["/_next/static/css/1cb804ccb5b9c075.css","style"]
|
|
18
|
+
:HL["/_next/static/css/4a300d88a66b0638.css","style"]
|
|
19
|
+
0:{"P":null,"b":"AvepNa0wqMBJJaKWx9jp2","c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/1cb804ccb5b9c075.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/css/4a300d88a66b0638.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"__className_646807","suppressHydrationWarning":true,"children":["$","$L2",null,{"attribute":"class","defaultTheme":"system","enableSystem":true,"disableTransitionOnChange":true,"children":["$","$L3",null,{"children":["$","$L4",null,{"children":[["$","$L5",null,{"parallelRouterKey":"children","error":"$6","errorStyles":[],"errorScripts":[],"template":["$","$L7",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}],["$","$L8",null,{}]]}]}]}]}]}]]}],{"children":[["$","$1","c",{"children":[["$","$L9",null,{"Component":"$a","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@b","$@c"]}}],null,["$","$Ld",null,{"children":["$","$e",null,{"name":"Next.MetadataOutlet","children":"$@f"}]}]]}],{},null,false,false]},[["$","div","l",{"className":"flex flex-col min-h-screen","children":[["$","div",null,{"className":"border-b","children":["$","div",null,{"className":"flex h-16 items-center px-4 gap-4","children":[["$","div",null,{"className":"animate-pulse rounded-md bg-muted h-8 w-32"}],["$","div",null,{"className":"flex-1"}],["$","div",null,{"className":"animate-pulse bg-muted h-8 w-8 rounded-full"}]]}]}],["$","div",null,{"className":"flex-1 p-6","children":["$","div",null,{"className":"max-w-6xl mx-auto space-y-6","children":[["$","div",null,{"className":"animate-pulse rounded-md bg-muted h-10 w-64"}],["$","div",null,{"className":"grid grid-cols-1 md:grid-cols-3 gap-4","children":[["$","div",null,{"className":"animate-pulse bg-muted h-32 rounded-lg"}],["$","div",null,{"className":"animate-pulse bg-muted h-32 rounded-lg"}],["$","div",null,{"className":"animate-pulse bg-muted h-32 rounded-lg"}]]}],["$","div",null,{"className":"animate-pulse bg-muted h-64 rounded-lg"}]]}]}]]}],[],[]],false,false],["$","$1","h",{"children":[null,["$","$L10",null,{"children":"$L11"}],["$","div",null,{"hidden":true,"children":["$","$L12",null,{"children":["$","$e",null,{"name":"Next.Metadata","children":"$L13"}]}]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],false]],"m":"$undefined","G":["$14",[]],"S":true}
|
|
20
|
+
b:{}
|
|
21
|
+
c:"$0:f:0:1:1:children:0:props:children:0:props:serverProvidedParams:params"
|
|
22
|
+
11:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
|
|
23
|
+
f:null
|
|
24
|
+
13:[["$","title","0",{"children":"Fuse"}],["$","meta","1",{"name":"description","content":"Build and automate powerful workflows"}]]
|