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.
Files changed (447) hide show
  1. {fuse_io-0.1.49/fuse_io.egg-info → fuse_io-0.1.57}/PKG-INFO +1 -1
  2. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/ai/service.py +103 -9
  3. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/cli.py +2 -2
  4. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/credentials/router.py +142 -11
  5. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/credentials/service.py +55 -4
  6. fuse_io-0.1.57/fuse/static/404/index.html +1 -0
  7. fuse_io-0.1.57/fuse/static/404.html +1 -0
  8. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/__next.__PAGE__.txt +2 -2
  9. fuse_io-0.1.57/fuse/static/__next._full.txt +24 -0
  10. fuse_io-0.1.57/fuse/static/__next._head.txt +5 -0
  11. fuse_io-0.1.57/fuse/static/__next._index.txt +11 -0
  12. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/__next._tree.txt +3 -2
  13. fuse_io-0.1.57/fuse/static/_next/static/AvepNa0wqMBJJaKWx9jp2/_buildManifest.js +1 -0
  14. fuse_io-0.1.57/fuse/static/_next/static/bAsbGnh27hobCWq6gYKAq/_ssgManifest.js +1 -0
  15. fuse_io-0.1.57/fuse/static/_next/static/chunks/1692-a402f4a4fcaf7b29.js +5 -0
  16. fuse_io-0.1.57/fuse/static/_next/static/chunks/1704-99cc2ea208d98cb0.js +1 -0
  17. fuse_io-0.1.57/fuse/static/_next/static/chunks/1950-70f6edfc3f49b339.js +1 -0
  18. fuse_io-0.1.57/fuse/static/_next/static/chunks/1963-d28a6db5ff807527.js +1 -0
  19. fuse_io-0.1.57/fuse/static/_next/static/chunks/232.c883d640f7157775.js +1 -0
  20. fuse_io-0.1.57/fuse/static/_next/static/chunks/2842-88d6ea1ddfa4c472.js +1 -0
  21. fuse_io-0.1.57/fuse/static/_next/static/chunks/3038-598d667e3d5ea764.js +30 -0
  22. fuse_io-0.1.57/fuse/static/_next/static/chunks/3509-92c0624ea5210c8a.js +1 -0
  23. fuse_io-0.1.57/fuse/static/_next/static/chunks/3794-04fa707794cee3fc.js +2 -0
  24. fuse_io-0.1.57/fuse/static/_next/static/chunks/4831-2650d23954cfe85f.js +1 -0
  25. fuse_io-0.1.57/fuse/static/_next/static/chunks/4bd1b696-e5d7c65570c947b7.js +1 -0
  26. fuse_io-0.1.57/fuse/static/_next/static/chunks/573-4b72224474d6755a.js +1 -0
  27. fuse_io-0.1.57/fuse/static/_next/static/chunks/585-b70392236824b164.js +43 -0
  28. fuse_io-0.1.57/fuse/static/_next/static/chunks/6040-4e3e79454e3ce7cf.js +1 -0
  29. fuse_io-0.1.57/fuse/static/_next/static/chunks/7152-7978ade421a25c37.js +1 -0
  30. fuse_io-0.1.57/fuse/static/_next/static/chunks/7621-20d82d6a1007addd.js +1 -0
  31. fuse_io-0.1.57/fuse/static/_next/static/chunks/7856-044a4109806f2a2d.js +1 -0
  32. fuse_io-0.1.57/fuse/static/_next/static/chunks/7988-891258e42d4e9cb9.js +1 -0
  33. fuse_io-0.1.57/fuse/static/_next/static/chunks/8343-4abaf4b94ff48f9a.js +3 -0
  34. fuse_io-0.1.57/fuse/static/_next/static/chunks/8376-ef78e632aabf30d1.js +9 -0
  35. fuse_io-0.1.57/fuse/static/_next/static/chunks/8500-98e13bcce54aa7a0.js +1 -0
  36. fuse_io-0.1.57/fuse/static/_next/static/chunks/8547-58d8503b201666a3.js +1 -0
  37. fuse_io-0.1.57/fuse/static/_next/static/chunks/9903-a77a05716944e520.js +9 -0
  38. fuse_io-0.1.57/fuse/static/_next/static/chunks/app/(main)/ai-create-example/page-70ceb48a63cfca66.js +11 -0
  39. fuse_io-0.1.57/fuse/static/_next/static/chunks/app/(main)/analytics/page-992337da93734999.js +1 -0
  40. fuse_io-0.1.57/fuse/static/_next/static/chunks/app/(main)/credentials/page-7e4cc6437c0633e9.js +1 -0
  41. fuse_io-0.1.57/fuse/static/_next/static/chunks/app/(main)/dashboard/page-ad0218038e730e18.js +1 -0
  42. fuse_io-0.1.57/fuse/static/_next/static/chunks/app/(main)/executions/page-ad7f99bd73e489e9.js +1 -0
  43. fuse_io-0.1.57/fuse/static/_next/static/chunks/app/(main)/help/page-356b1311d0259b76.js +1 -0
  44. fuse_io-0.1.57/fuse/static/_next/static/chunks/app/(main)/layout-2822b13d2fbf79fc.js +1 -0
  45. fuse_io-0.1.57/fuse/static/_next/static/chunks/app/(main)/settings/page-21ddbcb4288d11e3.js +1 -0
  46. fuse_io-0.1.57/fuse/static/_next/static/chunks/app/(main)/templates/page-adcf4c1235f2abd0.js +1 -0
  47. fuse_io-0.1.57/fuse/static/_next/static/chunks/app/(main)/variables/page-51455efcaf5cf739.js +1 -0
  48. fuse_io-0.1.57/fuse/static/_next/static/chunks/app/(main)/workflows/page-b2a58db616cdcb70.js +1 -0
  49. fuse_io-0.1.57/fuse/static/_next/static/chunks/app/_global-error/page-bd43e16e28d6b5c5.js +1 -0
  50. fuse_io-0.1.57/fuse/static/_next/static/chunks/app/_not-found/page-313af5f7b44a4219.js +1 -0
  51. fuse_io-0.1.57/fuse/static/_next/static/chunks/app/auth/layout-bd43e16e28d6b5c5.js +1 -0
  52. fuse_io-0.1.57/fuse/static/_next/static/chunks/app/auth/login/page-8001afc0c0cef789.js +1 -0
  53. fuse_io-0.1.57/fuse/static/_next/static/chunks/app/auth/register/page-02132d2e011dbec7.js +1 -0
  54. fuse_io-0.1.57/fuse/static/_next/static/chunks/app/credentials-test/page-13091e893fe38fd8.js +1 -0
  55. fuse_io-0.1.57/fuse/static/_next/static/chunks/app/error-408c6bff597b9d0e.js +1 -0
  56. fuse_io-0.1.57/fuse/static/_next/static/chunks/app/global-error-ab2bae883ee0e860.js +1 -0
  57. fuse_io-0.1.57/fuse/static/_next/static/chunks/app/layout-2ac4c5b8cbb2c64d.js +1 -0
  58. fuse_io-0.1.57/fuse/static/_next/static/chunks/app/loading-bd43e16e28d6b5c5.js +1 -0
  59. fuse_io-0.1.57/fuse/static/_next/static/chunks/app/oauth/callback/page-cdaebdec1d4c4d97.js +1 -0
  60. fuse_io-0.1.57/fuse/static/_next/static/chunks/app/page-502f3458c458bd75.js +1 -0
  61. fuse_io-0.1.57/fuse/static/_next/static/chunks/app/workflows/[id]/error-b393ec0b558e28ac.js +1 -0
  62. fuse_io-0.1.57/fuse/static/_next/static/chunks/app/workflows/[id]/loading-bd43e16e28d6b5c5.js +1 -0
  63. fuse_io-0.1.57/fuse/static/_next/static/chunks/app/workflows/[id]/page-636e52c0d2fa9d9b.js +1 -0
  64. fuse_io-0.1.57/fuse/static/_next/static/chunks/app/workflows/error-5a420e4cf1195dbd.js +1 -0
  65. fuse_io-0.1.57/fuse/static/_next/static/chunks/app/workflows/loading-bd43e16e28d6b5c5.js +1 -0
  66. fuse_io-0.1.57/fuse/static/_next/static/chunks/c37d3baf-7f0d73575bc82fee.js +1 -0
  67. fuse_io-0.1.57/fuse/static/_next/static/chunks/framework-81b2e59ffe13bb24.js +1 -0
  68. fuse_io-0.1.57/fuse/static/_next/static/chunks/main-832b18574d412547.js +5 -0
  69. fuse_io-0.1.57/fuse/static/_next/static/chunks/main-app-14c06b7adeda3bca.js +1 -0
  70. fuse_io-0.1.57/fuse/static/_next/static/chunks/next/dist/client/components/builtin/app-error-bd43e16e28d6b5c5.js +1 -0
  71. fuse_io-0.1.57/fuse/static/_next/static/chunks/next/dist/client/components/builtin/forbidden-bd43e16e28d6b5c5.js +1 -0
  72. fuse_io-0.1.57/fuse/static/_next/static/chunks/next/dist/client/components/builtin/not-found-bd43e16e28d6b5c5.js +1 -0
  73. fuse_io-0.1.57/fuse/static/_next/static/chunks/next/dist/client/components/builtin/unauthorized-bd43e16e28d6b5c5.js +1 -0
  74. fuse_io-0.1.57/fuse/static/_next/static/chunks/webpack-03fc999381a8cb79.js +1 -0
  75. fuse_io-0.1.57/fuse/static/_next/static/css/1cb804ccb5b9c075.css +1 -0
  76. fuse_io-0.1.57/fuse/static/_next/static/css/4a300d88a66b0638.css +3 -0
  77. fuse_io-0.1.57/fuse/static/_not-found/__next._full.txt +20 -0
  78. fuse_io-0.1.57/fuse/static/_not-found/__next._head.txt +5 -0
  79. fuse_io-0.1.57/fuse/static/_not-found/__next._index.txt +11 -0
  80. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_not-found/__next._not-found.__PAGE__.txt +1 -1
  81. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_not-found/__next._not-found.txt +1 -1
  82. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_not-found/__next._tree.txt +3 -2
  83. fuse_io-0.1.57/fuse/static/_not-found/index.html +1 -0
  84. fuse_io-0.1.57/fuse/static/_not-found/index.txt +20 -0
  85. fuse_io-0.1.57/fuse/static/ai-create-example/__next.!KG1haW4p.ai-create-example.__PAGE__.txt +9 -0
  86. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/ai-create-example/__next.!KG1haW4p.ai-create-example.txt +1 -1
  87. {fuse_io-0.1.49/fuse/static/workflows → fuse_io-0.1.57/fuse/static/ai-create-example}/__next.!KG1haW4p.txt +2 -2
  88. fuse_io-0.1.57/fuse/static/ai-create-example/__next._full.txt +29 -0
  89. fuse_io-0.1.57/fuse/static/ai-create-example/__next._head.txt +5 -0
  90. fuse_io-0.1.57/fuse/static/ai-create-example/__next._index.txt +11 -0
  91. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/ai-create-example/__next._tree.txt +3 -2
  92. fuse_io-0.1.57/fuse/static/ai-create-example/index.html +1 -0
  93. fuse_io-0.1.57/fuse/static/ai-create-example/index.txt +29 -0
  94. 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
  95. fuse_io-0.1.57/fuse/static/analytics/__next.!KG1haW4p.analytics.txt +4 -0
  96. {fuse_io-0.1.49/fuse/static/ai-create-example → fuse_io-0.1.57/fuse/static/analytics}/__next.!KG1haW4p.txt +2 -2
  97. fuse_io-0.1.57/fuse/static/analytics/__next._full.txt +29 -0
  98. fuse_io-0.1.57/fuse/static/analytics/__next._head.txt +5 -0
  99. fuse_io-0.1.57/fuse/static/analytics/__next._index.txt +11 -0
  100. fuse_io-0.1.57/fuse/static/analytics/__next._tree.txt +4 -0
  101. fuse_io-0.1.57/fuse/static/analytics/index.html +1 -0
  102. fuse_io-0.1.57/fuse/static/analytics/index.txt +29 -0
  103. fuse_io-0.1.57/fuse/static/auth/login/__next._full.txt +24 -0
  104. fuse_io-0.1.57/fuse/static/auth/login/__next._head.txt +5 -0
  105. fuse_io-0.1.57/fuse/static/auth/login/__next._index.txt +11 -0
  106. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/auth/login/__next._tree.txt +3 -2
  107. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/auth/login/__next.auth.login.__PAGE__.txt +2 -2
  108. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/auth/login/__next.auth.login.txt +1 -1
  109. fuse_io-0.1.57/fuse/static/auth/login/__next.auth.txt +4 -0
  110. fuse_io-0.1.57/fuse/static/auth/login/index.html +1 -0
  111. fuse_io-0.1.57/fuse/static/auth/login/index.txt +24 -0
  112. fuse_io-0.1.57/fuse/static/auth/register/__next._full.txt +24 -0
  113. fuse_io-0.1.57/fuse/static/auth/register/__next._head.txt +5 -0
  114. fuse_io-0.1.57/fuse/static/auth/register/__next._index.txt +11 -0
  115. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/auth/register/__next._tree.txt +3 -2
  116. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/auth/register/__next.auth.register.__PAGE__.txt +2 -2
  117. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/auth/register/__next.auth.register.txt +1 -1
  118. fuse_io-0.1.57/fuse/static/auth/register/__next.auth.txt +4 -0
  119. fuse_io-0.1.57/fuse/static/auth/register/index.html +1 -0
  120. fuse_io-0.1.57/fuse/static/auth/register/index.txt +24 -0
  121. fuse_io-0.1.57/fuse/static/credentials/__next.!KG1haW4p.credentials.__PAGE__.txt +9 -0
  122. fuse_io-0.1.57/fuse/static/credentials/__next.!KG1haW4p.credentials.txt +4 -0
  123. {fuse_io-0.1.49/fuse/static/dashboard → fuse_io-0.1.57/fuse/static/credentials}/__next.!KG1haW4p.txt +2 -2
  124. fuse_io-0.1.57/fuse/static/credentials/__next._full.txt +29 -0
  125. fuse_io-0.1.57/fuse/static/credentials/__next._head.txt +5 -0
  126. fuse_io-0.1.57/fuse/static/credentials/__next._index.txt +11 -0
  127. fuse_io-0.1.57/fuse/static/credentials/__next._tree.txt +4 -0
  128. fuse_io-0.1.57/fuse/static/credentials/index.html +1 -0
  129. fuse_io-0.1.57/fuse/static/credentials/index.txt +29 -0
  130. fuse_io-0.1.57/fuse/static/credentials-test/__next._full.txt +24 -0
  131. fuse_io-0.1.57/fuse/static/credentials-test/__next._head.txt +5 -0
  132. fuse_io-0.1.57/fuse/static/credentials-test/__next._index.txt +11 -0
  133. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/credentials-test/__next._tree.txt +3 -2
  134. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/credentials-test/__next.credentials-test.__PAGE__.txt +2 -2
  135. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/credentials-test/__next.credentials-test.txt +1 -1
  136. fuse_io-0.1.57/fuse/static/credentials-test/index.html +1 -0
  137. fuse_io-0.1.57/fuse/static/credentials-test/index.txt +24 -0
  138. fuse_io-0.1.57/fuse/static/dashboard/__next.!KG1haW4p.dashboard.__PAGE__.txt +9 -0
  139. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/dashboard/__next.!KG1haW4p.dashboard.txt +1 -1
  140. {fuse_io-0.1.49/fuse/static/settings → fuse_io-0.1.57/fuse/static/dashboard}/__next.!KG1haW4p.txt +2 -2
  141. fuse_io-0.1.57/fuse/static/dashboard/__next._full.txt +29 -0
  142. fuse_io-0.1.57/fuse/static/dashboard/__next._head.txt +5 -0
  143. fuse_io-0.1.57/fuse/static/dashboard/__next._index.txt +11 -0
  144. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/dashboard/__next._tree.txt +3 -2
  145. fuse_io-0.1.57/fuse/static/dashboard/index.html +1 -0
  146. fuse_io-0.1.57/fuse/static/dashboard/index.txt +29 -0
  147. fuse_io-0.1.57/fuse/static/executions/__next.!KG1haW4p.executions.__PAGE__.txt +9 -0
  148. fuse_io-0.1.57/fuse/static/executions/__next.!KG1haW4p.executions.txt +4 -0
  149. fuse_io-0.1.57/fuse/static/executions/__next.!KG1haW4p.txt +7 -0
  150. fuse_io-0.1.57/fuse/static/executions/__next._full.txt +29 -0
  151. fuse_io-0.1.57/fuse/static/executions/__next._head.txt +5 -0
  152. fuse_io-0.1.57/fuse/static/executions/__next._index.txt +11 -0
  153. fuse_io-0.1.57/fuse/static/executions/__next._tree.txt +4 -0
  154. fuse_io-0.1.57/fuse/static/executions/index.html +1 -0
  155. fuse_io-0.1.57/fuse/static/executions/index.txt +29 -0
  156. 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
  157. fuse_io-0.1.57/fuse/static/help/__next.!KG1haW4p.help.txt +4 -0
  158. fuse_io-0.1.57/fuse/static/help/__next.!KG1haW4p.txt +7 -0
  159. {fuse_io-0.1.49/fuse/static/ai-create-example → fuse_io-0.1.57/fuse/static/help}/__next._full.txt +14 -11
  160. fuse_io-0.1.57/fuse/static/help/__next._head.txt +5 -0
  161. fuse_io-0.1.57/fuse/static/help/__next._index.txt +11 -0
  162. fuse_io-0.1.57/fuse/static/help/__next._tree.txt +4 -0
  163. fuse_io-0.1.57/fuse/static/help/index.html +1 -0
  164. {fuse_io-0.1.49/fuse/static/ai-create-example → fuse_io-0.1.57/fuse/static/help}/index.txt +14 -11
  165. fuse_io-0.1.57/fuse/static/index.html +1 -0
  166. fuse_io-0.1.57/fuse/static/index.txt +24 -0
  167. fuse_io-0.1.57/fuse/static/logo.png +0 -0
  168. fuse_io-0.1.57/fuse/static/oauth/callback/__next._full.txt +24 -0
  169. fuse_io-0.1.57/fuse/static/oauth/callback/__next._head.txt +5 -0
  170. fuse_io-0.1.57/fuse/static/oauth/callback/__next._index.txt +11 -0
  171. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/oauth/callback/__next._tree.txt +3 -2
  172. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/oauth/callback/__next.oauth.callback.__PAGE__.txt +2 -2
  173. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/oauth/callback/__next.oauth.callback.txt +1 -1
  174. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/oauth/callback/__next.oauth.txt +1 -1
  175. fuse_io-0.1.57/fuse/static/oauth/callback/index.html +1 -0
  176. fuse_io-0.1.57/fuse/static/oauth/callback/index.txt +24 -0
  177. fuse_io-0.1.57/fuse/static/settings/__next.!KG1haW4p.settings.__PAGE__.txt +9 -0
  178. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/settings/__next.!KG1haW4p.settings.txt +1 -1
  179. fuse_io-0.1.57/fuse/static/settings/__next.!KG1haW4p.txt +7 -0
  180. fuse_io-0.1.57/fuse/static/settings/__next._full.txt +29 -0
  181. fuse_io-0.1.57/fuse/static/settings/__next._head.txt +5 -0
  182. fuse_io-0.1.57/fuse/static/settings/__next._index.txt +11 -0
  183. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/settings/__next._tree.txt +3 -2
  184. fuse_io-0.1.57/fuse/static/settings/index.html +1 -0
  185. fuse_io-0.1.57/fuse/static/settings/index.txt +29 -0
  186. fuse_io-0.1.57/fuse/static/templates/__next.!KG1haW4p.templates.__PAGE__.txt +9 -0
  187. fuse_io-0.1.57/fuse/static/templates/__next.!KG1haW4p.templates.txt +4 -0
  188. fuse_io-0.1.57/fuse/static/templates/__next.!KG1haW4p.txt +7 -0
  189. fuse_io-0.1.57/fuse/static/templates/__next._full.txt +29 -0
  190. fuse_io-0.1.57/fuse/static/templates/__next._head.txt +5 -0
  191. fuse_io-0.1.57/fuse/static/templates/__next._index.txt +11 -0
  192. fuse_io-0.1.57/fuse/static/templates/__next._tree.txt +4 -0
  193. fuse_io-0.1.57/fuse/static/templates/index.html +1 -0
  194. fuse_io-0.1.57/fuse/static/templates/index.txt +29 -0
  195. fuse_io-0.1.57/fuse/static/variables/__next.!KG1haW4p.txt +7 -0
  196. fuse_io-0.1.57/fuse/static/variables/__next.!KG1haW4p.variables.__PAGE__.txt +9 -0
  197. fuse_io-0.1.57/fuse/static/variables/__next.!KG1haW4p.variables.txt +4 -0
  198. fuse_io-0.1.57/fuse/static/variables/__next._full.txt +29 -0
  199. fuse_io-0.1.57/fuse/static/variables/__next._head.txt +5 -0
  200. fuse_io-0.1.57/fuse/static/variables/__next._index.txt +11 -0
  201. fuse_io-0.1.57/fuse/static/variables/__next._tree.txt +4 -0
  202. fuse_io-0.1.57/fuse/static/variables/index.html +1 -0
  203. fuse_io-0.1.57/fuse/static/variables/index.txt +29 -0
  204. fuse_io-0.1.57/fuse/static/workflows/__next.!KG1haW4p.txt +7 -0
  205. fuse_io-0.1.57/fuse/static/workflows/__next.!KG1haW4p.workflows.__PAGE__.txt +10 -0
  206. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/workflows/__next.!KG1haW4p.workflows.txt +1 -1
  207. fuse_io-0.1.57/fuse/static/workflows/__next._full.txt +29 -0
  208. fuse_io-0.1.57/fuse/static/workflows/__next._head.txt +5 -0
  209. fuse_io-0.1.57/fuse/static/workflows/__next._index.txt +11 -0
  210. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/workflows/__next._tree.txt +3 -2
  211. fuse_io-0.1.57/fuse/static/workflows/index.html +1 -0
  212. fuse_io-0.1.57/fuse/static/workflows/index.txt +29 -0
  213. fuse_io-0.1.57/fuse/static/workflows/new/__next._full.txt +29 -0
  214. fuse_io-0.1.57/fuse/static/workflows/new/__next._head.txt +5 -0
  215. fuse_io-0.1.57/fuse/static/workflows/new/__next._index.txt +11 -0
  216. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/workflows/new/__next._tree.txt +3 -2
  217. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/workflows/new/__next.workflows.$d$id.__PAGE__.txt +2 -2
  218. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/workflows/new/__next.workflows.$d$id.txt +2 -2
  219. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/workflows/new/__next.workflows.txt +2 -2
  220. fuse_io-0.1.57/fuse/static/workflows/new/index.html +1 -0
  221. fuse_io-0.1.57/fuse/static/workflows/new/index.txt +29 -0
  222. {fuse_io-0.1.49 → fuse_io-0.1.57/fuse_io.egg-info}/PKG-INFO +1 -1
  223. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse_io.egg-info/SOURCES.txt +119 -0
  224. {fuse_io-0.1.49 → fuse_io-0.1.57}/pyproject.toml +7 -1
  225. fuse_io-0.1.49/fuse/static/404/index.html +0 -1
  226. fuse_io-0.1.49/fuse/static/404.html +0 -1
  227. fuse_io-0.1.49/fuse/static/__next._full.txt +0 -23
  228. fuse_io-0.1.49/fuse/static/__next._head.txt +0 -7
  229. fuse_io-0.1.49/fuse/static/__next._index.txt +0 -10
  230. fuse_io-0.1.49/fuse/static/_not-found/__next._full.txt +0 -19
  231. fuse_io-0.1.49/fuse/static/_not-found/__next._head.txt +0 -7
  232. fuse_io-0.1.49/fuse/static/_not-found/__next._index.txt +0 -10
  233. fuse_io-0.1.49/fuse/static/_not-found/index.html +0 -1
  234. fuse_io-0.1.49/fuse/static/_not-found/index.txt +0 -19
  235. fuse_io-0.1.49/fuse/static/ai-create-example/__next._head.txt +0 -7
  236. fuse_io-0.1.49/fuse/static/ai-create-example/__next._index.txt +0 -10
  237. fuse_io-0.1.49/fuse/static/ai-create-example/index.html +0 -1
  238. fuse_io-0.1.49/fuse/static/auth/login/__next._full.txt +0 -23
  239. fuse_io-0.1.49/fuse/static/auth/login/__next._head.txt +0 -7
  240. fuse_io-0.1.49/fuse/static/auth/login/__next._index.txt +0 -10
  241. fuse_io-0.1.49/fuse/static/auth/login/__next.auth.txt +0 -4
  242. fuse_io-0.1.49/fuse/static/auth/login/index.html +0 -1
  243. fuse_io-0.1.49/fuse/static/auth/login/index.txt +0 -23
  244. fuse_io-0.1.49/fuse/static/auth/register/__next._full.txt +0 -23
  245. fuse_io-0.1.49/fuse/static/auth/register/__next._head.txt +0 -7
  246. fuse_io-0.1.49/fuse/static/auth/register/__next._index.txt +0 -10
  247. fuse_io-0.1.49/fuse/static/auth/register/__next.auth.txt +0 -4
  248. fuse_io-0.1.49/fuse/static/auth/register/index.html +0 -1
  249. fuse_io-0.1.49/fuse/static/auth/register/index.txt +0 -23
  250. fuse_io-0.1.49/fuse/static/credentials-test/__next._full.txt +0 -23
  251. fuse_io-0.1.49/fuse/static/credentials-test/__next._head.txt +0 -7
  252. fuse_io-0.1.49/fuse/static/credentials-test/__next._index.txt +0 -10
  253. fuse_io-0.1.49/fuse/static/credentials-test/index.html +0 -1
  254. fuse_io-0.1.49/fuse/static/credentials-test/index.txt +0 -23
  255. fuse_io-0.1.49/fuse/static/dashboard/__next.!KG1haW4p.dashboard.__PAGE__.txt +0 -9
  256. fuse_io-0.1.49/fuse/static/dashboard/__next._full.txt +0 -26
  257. fuse_io-0.1.49/fuse/static/dashboard/__next._head.txt +0 -7
  258. fuse_io-0.1.49/fuse/static/dashboard/__next._index.txt +0 -10
  259. fuse_io-0.1.49/fuse/static/dashboard/index.html +0 -1
  260. fuse_io-0.1.49/fuse/static/dashboard/index.txt +0 -26
  261. fuse_io-0.1.49/fuse/static/index.html +0 -1
  262. fuse_io-0.1.49/fuse/static/index.txt +0 -23
  263. fuse_io-0.1.49/fuse/static/oauth/callback/__next._full.txt +0 -23
  264. fuse_io-0.1.49/fuse/static/oauth/callback/__next._head.txt +0 -7
  265. fuse_io-0.1.49/fuse/static/oauth/callback/__next._index.txt +0 -10
  266. fuse_io-0.1.49/fuse/static/oauth/callback/index.html +0 -1
  267. fuse_io-0.1.49/fuse/static/oauth/callback/index.txt +0 -23
  268. fuse_io-0.1.49/fuse/static/settings/__next._full.txt +0 -26
  269. fuse_io-0.1.49/fuse/static/settings/__next._head.txt +0 -7
  270. fuse_io-0.1.49/fuse/static/settings/__next._index.txt +0 -10
  271. fuse_io-0.1.49/fuse/static/settings/index.html +0 -1
  272. fuse_io-0.1.49/fuse/static/settings/index.txt +0 -26
  273. fuse_io-0.1.49/fuse/static/workflows/__next.!KG1haW4p.workflows.__PAGE__.txt +0 -10
  274. fuse_io-0.1.49/fuse/static/workflows/__next._full.txt +0 -29
  275. fuse_io-0.1.49/fuse/static/workflows/__next._head.txt +0 -7
  276. fuse_io-0.1.49/fuse/static/workflows/__next._index.txt +0 -10
  277. fuse_io-0.1.49/fuse/static/workflows/index.html +0 -1
  278. fuse_io-0.1.49/fuse/static/workflows/index.txt +0 -29
  279. fuse_io-0.1.49/fuse/static/workflows/new/__next._full.txt +0 -26
  280. fuse_io-0.1.49/fuse/static/workflows/new/__next._head.txt +0 -7
  281. fuse_io-0.1.49/fuse/static/workflows/new/__next._index.txt +0 -10
  282. fuse_io-0.1.49/fuse/static/workflows/new/index.html +0 -1
  283. fuse_io-0.1.49/fuse/static/workflows/new/index.txt +0 -26
  284. {fuse_io-0.1.49 → fuse_io-0.1.57}/.python-version +0 -0
  285. {fuse_io-0.1.49 → fuse_io-0.1.57}/LICENSE +0 -0
  286. {fuse_io-0.1.49 → fuse_io-0.1.57}/MANIFEST.in +0 -0
  287. {fuse_io-0.1.49 → fuse_io-0.1.57}/README.md +0 -0
  288. {fuse_io-0.1.49 → fuse_io-0.1.57}/docs/pypi_publishing_guide.md +0 -0
  289. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/__init__.py +0 -0
  290. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/ai/__init__.py +0 -0
  291. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/ai/router.py +0 -0
  292. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/alembic/README +0 -0
  293. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/alembic/env.py +0 -0
  294. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/alembic/script.py.mako +0 -0
  295. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/alembic/versions/.keep +0 -0
  296. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/alembic/versions/7a0fd1dc4902_remove_superuser.py +0 -0
  297. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/alembic/versions/7edc63646d26_add_credentials_table.py +0 -0
  298. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/alembic/versions/debec76c1cf8_initial_migration.py +0 -0
  299. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/alembic.ini +0 -0
  300. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/api.py +0 -0
  301. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/auth/__init__.py +0 -0
  302. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/auth/crud_user.py +0 -0
  303. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/auth/dependencies.py +0 -0
  304. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/auth/models.py +0 -0
  305. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/auth/router.py +0 -0
  306. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/auth/schemas.py +0 -0
  307. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/auth/service.py +0 -0
  308. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/auth/utils.py +0 -0
  309. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/backend_pre_start.py +0 -0
  310. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/base.py +0 -0
  311. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/config.py +0 -0
  312. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/credentials/__init__.py +0 -0
  313. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/credentials/models.py +0 -0
  314. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/database.py +0 -0
  315. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/initial_data.py +0 -0
  316. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/initial_fuse.db +0 -0
  317. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/logger.py +0 -0
  318. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/main.py +0 -0
  319. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/models.py +0 -0
  320. {fuse_io-0.1.49/fuse/static/_next/static/bAsbGnh27hobCWq6gYKAq → fuse_io-0.1.57/fuse/static/_next/static/AvepNa0wqMBJJaKWx9jp2}/_ssgManifest.js +0 -0
  321. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/bAsbGnh27hobCWq6gYKAq/_buildManifest.js +0 -0
  322. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/162-d9110b81661c7d7d.js +0 -0
  323. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/232.97b298320d3351e9.js +0 -0
  324. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/24-4ee5417b9b9b92a9.js +0 -0
  325. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/275-f12d66089f519b01.js +0 -0
  326. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/324-771510774da7c693.js +0 -0
  327. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/361-1ce2845fa2b2c4a4.js +0 -0
  328. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/393-d1b3ea65900fdc5e.js +0 -0
  329. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/4-bdc965d7dcca4cab.js +0 -0
  330. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/4bd1b696-01b4a2ffa8bac205.js +0 -0
  331. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/501-397a9f42b1c4da0e.js +0 -0
  332. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/547-1833756cc09c3c28.js +0 -0
  333. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/794-803d64bb1ca09460.js +0 -0
  334. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/814-18bcbd34c09817f1.js +0 -0
  335. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/821-04976ebb62352e45.js +0 -0
  336. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/93-2937d48fc52107ef.js +0 -0
  337. {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
  338. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/(main)/dashboard/page-7e9db37c6737695c.js +0 -0
  339. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/(main)/layout-5c636818aa3b7ed1.js +0 -0
  340. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/(main)/settings/page-00bc4735cc93b9be.js +0 -0
  341. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/(main)/workflows/page-7c3c63a11ae33eed.js +0 -0
  342. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/_global-error/page-116e68079fa76e6f.js +0 -0
  343. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/_not-found/page-bae0d4902c5585d3.js +0 -0
  344. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/auth/layout-116e68079fa76e6f.js +0 -0
  345. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/auth/login/page-546ffaa564d327e9.js +0 -0
  346. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/auth/register/page-2748b1af5b1b642a.js +0 -0
  347. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/credentials-test/page-1d2c37deaa189b43.js +0 -0
  348. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/error-033f2fd59b73a2d7.js +0 -0
  349. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/global-error-dcd149dc42c5186b.js +0 -0
  350. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/layout-d0d5a6a85d213394.js +0 -0
  351. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/loading-116e68079fa76e6f.js +0 -0
  352. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/oauth/callback/page-eecedf564f689d93.js +0 -0
  353. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/page-606905d313079604.js +0 -0
  354. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/workflows/[id]/error-66ff5093f583ae94.js +0 -0
  355. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/workflows/[id]/loading-116e68079fa76e6f.js +0 -0
  356. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/workflows/[id]/page-5459cee4cb66f5bc.js +0 -0
  357. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/workflows/error-61dbcd88cc0eff5c.js +0 -0
  358. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/app/workflows/loading-116e68079fa76e6f.js +0 -0
  359. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/c37d3baf-0fedbf5b6ffcd550.js +0 -0
  360. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/framework-3311683cffde0ebf.js +0 -0
  361. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/main-app-cf50eb2a7e26453d.js +0 -0
  362. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/main-d74776772a65895d.js +0 -0
  363. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/polyfills-42372ed130431b0a.js +0 -0
  364. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/chunks/webpack-b28a02ce1f174559.js +0 -0
  365. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/css/59d0dfc36eeea694.css +0 -0
  366. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/css/d1e1fa7731bfdccb.css +0 -0
  367. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/media/636a5ac981f94f8b-s.p.woff2 +0 -0
  368. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/media/6fe53d21e6e7ebd8-s.woff2 +0 -0
  369. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/media/8ebc6e9dde468c4a-s.woff2 +0 -0
  370. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/static/_next/static/media/9e7b0a821b9dfcb4-s.woff2 +0 -0
  371. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/users/__init__.py +0 -0
  372. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/users/router.py +0 -0
  373. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/utils/cache.py +0 -0
  374. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/utils/circuit_breaker.py +0 -0
  375. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/utils/code_sanitizer.py +0 -0
  376. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/utils/feature_flags.py +0 -0
  377. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/utils/health.py +0 -0
  378. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/utils/pagination.py +0 -0
  379. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/utils/rate_limit.py +0 -0
  380. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/utils/redis_client.py +0 -0
  381. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/utils/request_id.py +0 -0
  382. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/utils/security.py +0 -0
  383. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/worker.py +0 -0
  384. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/__init__.py +0 -0
  385. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/code_execution.py +0 -0
  386. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/crud_workflow.py +0 -0
  387. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/__init__.py +0 -0
  388. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/constants.py +0 -0
  389. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/core.py +0 -0
  390. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/error_handler.py +0 -0
  391. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/errors.py +0 -0
  392. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/executor.py +0 -0
  393. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/graph.py +0 -0
  394. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/__init__.py +0 -0
  395. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/actions/code.py +0 -0
  396. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/actions/data.py +0 -0
  397. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/actions/discord.py +0 -0
  398. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/actions/email.py +0 -0
  399. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/actions/google_sheets.py +0 -0
  400. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/actions/http_request.py +0 -0
  401. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/actions/slack.py +0 -0
  402. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/actions/utility.py +0 -0
  403. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/actions/whatsapp.py +0 -0
  404. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/ai/__init__.py +0 -0
  405. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/ai/agent.py +0 -0
  406. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/ai/chat_model.py +0 -0
  407. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/ai/llm.py +0 -0
  408. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/ai/memory.py +0 -0
  409. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/ai/tool.py +0 -0
  410. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/base.py +0 -0
  411. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/logic/__init__.py +0 -0
  412. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/logic/delay.py +0 -0
  413. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/logic/if_node.py +0 -0
  414. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/logic/loop.py +0 -0
  415. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/logic/merge.py +0 -0
  416. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/logic/parallel.py +0 -0
  417. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/logic/pause.py +0 -0
  418. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/logic/switch.py +0 -0
  419. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/registry.py +0 -0
  420. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/triggers/email.py +0 -0
  421. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/triggers/form.py +0 -0
  422. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/triggers/manual.py +0 -0
  423. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/triggers/rss.py +0 -0
  424. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/triggers/schedule.py +0 -0
  425. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/triggers/webhook.py +0 -0
  426. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/nodes/triggers/whatsapp.py +0 -0
  427. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/periodic_scheduler.py +0 -0
  428. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/runtime/code.py +0 -0
  429. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/runtime/http.py +0 -0
  430. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/runtime/internal.py +0 -0
  431. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/scheduler.py +0 -0
  432. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/engine/state.py +0 -0
  433. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/logger.py +0 -0
  434. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/models.py +0 -0
  435. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/router.py +0 -0
  436. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/schemas.py +0 -0
  437. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/service.py +0 -0
  438. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/types.py +0 -0
  439. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse/workflows/utils/templating.py +0 -0
  440. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse_io.egg-info/dependency_links.txt +0 -0
  441. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse_io.egg-info/entry_points.txt +0 -0
  442. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse_io.egg-info/requires.txt +0 -0
  443. {fuse_io-0.1.49 → fuse_io-0.1.57}/fuse_io.egg-info/top_level.txt +0 -0
  444. {fuse_io-0.1.49 → fuse_io-0.1.57}/scripts/format.sh +0 -0
  445. {fuse_io-0.1.49 → fuse_io-0.1.57}/scripts/lint.sh +0 -0
  446. {fuse_io-0.1.49 → fuse_io-0.1.57}/setup.cfg +0 -0
  447. {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.49
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
- provider = (credential.get("provider") or "unknown").lower()
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
- if provider == "gemini":
474
- client = genai.Client(api_key=api_key) if api_key else self.gemini_client
475
- if not client:
476
- raise ValueError("Gemini API key not found.")
477
-
478
- # Combine messages for Gemini (it uses a slightly different format)
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
- # Default OpenAI or OpenRouter if no custom base_url
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
- # Generic OpenAI-compatible provider
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.49")
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.49")
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(provider: str):
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
- from urllib.parse import urlencode
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
- # Check expiry
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 == "google_sheets":
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,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;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,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;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,["275","static/chunks/275-f12d66089f519b01.js","974","static/chunks/app/page-606905d313079604.js"],"default"]
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":"bAsbGnh27hobCWq6gYKAq","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}
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"}]]