diff --git a/apps/docs/components/ui/block-types.tsx b/apps/docs/components/ui/block-types.tsx
index 96937dc728..c76ecb92d7 100644
--- a/apps/docs/components/ui/block-types.tsx
+++ b/apps/docs/components/ui/block-types.tsx
@@ -1,4 +1,3 @@
-import { cn } from '@/lib/utils'
import {
AgentIcon,
ApiIcon,
@@ -7,7 +6,8 @@ import {
ConditionalIcon,
ConnectIcon,
ResponseIcon,
-} from '../icons'
+} from '@/components/icons'
+import { cn } from '@/lib/utils'
// Custom Feature component specifically for BlockTypes to handle the 6-item layout
const BlockFeature = ({
diff --git a/apps/sim/app/(auth)/layout.tsx b/apps/sim/app/(auth)/layout.tsx
index cdc4f93b9c..76a3726817 100644
--- a/apps/sim/app/(auth)/layout.tsx
+++ b/apps/sim/app/(auth)/layout.tsx
@@ -2,7 +2,7 @@
import Image from 'next/image'
import Link from 'next/link'
-import { GridPattern } from '../(landing)/components/grid-pattern'
+import { GridPattern } from '@/app/(landing)/components/grid-pattern'
export default function AuthLayout({ children }: { children: React.ReactNode }) {
return (
diff --git a/apps/sim/app/(auth)/login/login-form.test.tsx b/apps/sim/app/(auth)/login/login-form.test.tsx
index a40edfd88f..6ab8cf5c96 100644
--- a/apps/sim/app/(auth)/login/login-form.test.tsx
+++ b/apps/sim/app/(auth)/login/login-form.test.tsx
@@ -6,7 +6,7 @@ import { act, fireEvent, render, screen, waitFor } from '@testing-library/react'
import { useRouter, useSearchParams } from 'next/navigation'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import { client } from '@/lib/auth-client'
-import LoginPage from './login-form'
+import LoginPage from '@/app/(auth)/login/login-form'
vi.mock('next/navigation', () => ({
useRouter: vi.fn(),
diff --git a/apps/sim/app/(auth)/login/page.tsx b/apps/sim/app/(auth)/login/page.tsx
index 5d4ce8f7d5..91648a5e00 100644
--- a/apps/sim/app/(auth)/login/page.tsx
+++ b/apps/sim/app/(auth)/login/page.tsx
@@ -1,5 +1,5 @@
-import { getOAuthProviderStatus } from '../components/oauth-provider-checker'
-import LoginForm from './login-form'
+import { getOAuthProviderStatus } from '@/app/(auth)/components/oauth-provider-checker'
+import LoginForm from '@/app/(auth)/login/login-form'
// Force dynamic rendering to avoid prerender errors with search params
export const dynamic = 'force-dynamic'
diff --git a/apps/sim/app/(auth)/reset-password/page.tsx b/apps/sim/app/(auth)/reset-password/page.tsx
index 378c0c3b0b..d842898a3b 100644
--- a/apps/sim/app/(auth)/reset-password/page.tsx
+++ b/apps/sim/app/(auth)/reset-password/page.tsx
@@ -12,7 +12,7 @@ import {
CardTitle,
} from '@/components/ui/card'
import { createLogger } from '@/lib/logs/console/logger'
-import { SetNewPasswordForm } from './reset-password-form'
+import { SetNewPasswordForm } from '@/app/(auth)/reset-password/reset-password-form'
const logger = createLogger('ResetPasswordPage')
diff --git a/apps/sim/app/(auth)/signup/page.tsx b/apps/sim/app/(auth)/signup/page.tsx
index c415382ef2..3fededdd14 100644
--- a/apps/sim/app/(auth)/signup/page.tsx
+++ b/apps/sim/app/(auth)/signup/page.tsx
@@ -1,6 +1,6 @@
import { env, isTruthy } from '@/lib/env'
-import { getOAuthProviderStatus } from '../components/oauth-provider-checker'
-import SignupForm from './signup-form'
+import { getOAuthProviderStatus } from '@/app/(auth)/components/oauth-provider-checker'
+import SignupForm from '@/app/(auth)/signup/signup-form'
// Force dynamic rendering to avoid prerender errors with search params
export const dynamic = 'force-dynamic'
diff --git a/apps/sim/app/(auth)/signup/signup-form.test.tsx b/apps/sim/app/(auth)/signup/signup-form.test.tsx
index e235aa7337..adb4b025fb 100644
--- a/apps/sim/app/(auth)/signup/signup-form.test.tsx
+++ b/apps/sim/app/(auth)/signup/signup-form.test.tsx
@@ -6,7 +6,7 @@ import { act, fireEvent, render, screen, waitFor } from '@testing-library/react'
import { useRouter, useSearchParams } from 'next/navigation'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import { client } from '@/lib/auth-client'
-import SignupPage from './signup-form'
+import SignupPage from '@/app/(auth)/signup/signup-form'
vi.mock('next/navigation', () => ({
useRouter: vi.fn(),
diff --git a/apps/sim/app/(auth)/verify/page.tsx b/apps/sim/app/(auth)/verify/page.tsx
index 372c6fd040..55c185675d 100644
--- a/apps/sim/app/(auth)/verify/page.tsx
+++ b/apps/sim/app/(auth)/verify/page.tsx
@@ -1,7 +1,7 @@
import { env } from '@/lib/env'
import { isProd } from '@/lib/environment'
import { getBaseUrl } from '@/lib/urls/utils'
-import { VerifyContent } from './verify-content'
+import { VerifyContent } from '@/app/(auth)/verify/verify-content'
// Force dynamic rendering to avoid prerender errors with search params
export const dynamic = 'force-dynamic'
diff --git a/apps/sim/app/(auth)/verify/verify-content.tsx b/apps/sim/app/(auth)/verify/verify-content.tsx
index 6d5d73b0f4..4e6822db16 100644
--- a/apps/sim/app/(auth)/verify/verify-content.tsx
+++ b/apps/sim/app/(auth)/verify/verify-content.tsx
@@ -4,7 +4,7 @@ import { Suspense, useEffect, useState } from 'react'
import { Button } from '@/components/ui/button'
import { InputOTP, InputOTPGroup, InputOTPSlot } from '@/components/ui/input-otp'
import { cn } from '@/lib/utils'
-import { useVerification } from './use-verification'
+import { useVerification } from '@/app/(auth)/verify/use-verification'
interface VerifyContentProps {
hasResendKey: boolean
diff --git a/apps/sim/app/(landing)/components/hero-workflow.tsx b/apps/sim/app/(landing)/components/hero-workflow.tsx
index 727847dff5..bb0b785ede 100644
--- a/apps/sim/app/(landing)/components/hero-workflow.tsx
+++ b/apps/sim/app/(landing)/components/hero-workflow.tsx
@@ -17,9 +17,9 @@ import ReactFlow, {
} from 'reactflow'
import 'reactflow/dist/style.css'
-import { HeroBlock } from './hero-block'
-import { HeroEdge } from './hero-edge'
-import { useWindowSize } from './use-window-size'
+import { HeroBlock } from '@/app/(landing)/components/hero-block'
+import { HeroEdge } from '@/app/(landing)/components/hero-edge'
+import { useWindowSize } from '@/app/(landing)/components/use-window-size'
const nodeTypes: NodeTypes = { heroBlock: HeroBlock }
const edgeTypes: EdgeTypes = { heroEdge: HeroEdge }
diff --git a/apps/sim/app/(landing)/components/nav-client.tsx b/apps/sim/app/(landing)/components/nav-client.tsx
index 9c3096108b..1765a0c264 100644
--- a/apps/sim/app/(landing)/components/nav-client.tsx
+++ b/apps/sim/app/(landing)/components/nav-client.tsx
@@ -15,7 +15,7 @@ import {
SheetTitle,
SheetTrigger,
} from '@/components/ui/sheet'
-import { usePrefetchOnHover } from '../utils/prefetch'
+import { usePrefetchOnHover } from '@/app/(landing)/utils/prefetch'
// --- Framer Motion Variants ---
const desktopNavContainerVariants = {
diff --git a/apps/sim/app/(landing)/components/nav-wrapper.tsx b/apps/sim/app/(landing)/components/nav-wrapper.tsx
index a2a4765cc0..1cafe6e7d5 100644
--- a/apps/sim/app/(landing)/components/nav-wrapper.tsx
+++ b/apps/sim/app/(landing)/components/nav-wrapper.tsx
@@ -3,9 +3,9 @@
import { useEffect, useState } from 'react'
import { AnimatePresence, motion } from 'framer-motion'
import { usePathname } from 'next/navigation'
-import { getFormattedGitHubStars } from '../actions/github'
-import GitHubStarsClient from './github-stars-client'
-import NavClient from './nav-client'
+import { getFormattedGitHubStars } from '@/app/(landing)/actions/github'
+import GitHubStarsClient from '@/app/(landing)/components/github-stars-client'
+import NavClient from '@/app/(landing)/components/nav-client'
interface NavWrapperProps {
onOpenTypeformLink: () => void
diff --git a/apps/sim/app/(landing)/components/sections/blogs.tsx b/apps/sim/app/(landing)/components/sections/blogs.tsx
index 7052af57da..48ffb32d17 100644
--- a/apps/sim/app/(landing)/components/sections/blogs.tsx
+++ b/apps/sim/app/(landing)/components/sections/blogs.tsx
@@ -1,7 +1,7 @@
'use client'
import { motion } from 'framer-motion'
-import { BlogCard } from '../blog-card'
+import { BlogCard } from '@/app/(landing)/components/blog-card'
function Blogs() {
return (
diff --git a/apps/sim/app/(landing)/components/sections/features.tsx b/apps/sim/app/(landing)/components/sections/features.tsx
index 52bbb12c78..128f0ccacb 100644
--- a/apps/sim/app/(landing)/components/sections/features.tsx
+++ b/apps/sim/app/(landing)/components/sections/features.tsx
@@ -18,8 +18,8 @@ import 'reactflow/dist/style.css'
import { AgentIcon, ConnectIcon, StartIcon } from '@/components/icons'
import { cn } from '@/lib/utils'
-import { DotPattern } from '../dot-pattern'
-import { HeroBlock } from '../hero-block'
+import { DotPattern } from '@/app/(landing)/components/dot-pattern'
+import { HeroBlock } from '@/app/(landing)/components/hero-block'
// --- Types ---
type Feature = {
diff --git a/apps/sim/app/(landing)/components/sections/footer.tsx b/apps/sim/app/(landing)/components/sections/footer.tsx
index 0a957c6011..9e2b85fe6a 100644
--- a/apps/sim/app/(landing)/components/sections/footer.tsx
+++ b/apps/sim/app/(landing)/components/sections/footer.tsx
@@ -6,8 +6,8 @@ import { useRouter } from 'next/navigation'
import { DiscordIcon, GithubIcon, xIcon as XIcon } from '@/components/icons'
import { Button } from '@/components/ui/button'
import { useSession } from '@/lib/auth-client'
-import { usePrefetchOnHover } from '../../utils/prefetch'
-import useIsMobile from '../hooks/use-is-mobile'
+import useIsMobile from '@/app/(landing)/components/hooks/use-is-mobile'
+import { usePrefetchOnHover } from '@/app/(landing)/utils/prefetch'
function Footer() {
const router = useRouter()
diff --git a/apps/sim/app/(landing)/components/sections/hero.tsx b/apps/sim/app/(landing)/components/sections/hero.tsx
index e822888b7c..c33f17e914 100644
--- a/apps/sim/app/(landing)/components/sections/hero.tsx
+++ b/apps/sim/app/(landing)/components/sections/hero.tsx
@@ -5,8 +5,8 @@ import { Command, CornerDownLeft } from 'lucide-react'
import { useRouter } from 'next/navigation'
import { Button } from '@/components/ui/button'
import { useSession } from '@/lib/auth-client'
-import { GridPattern } from '../grid-pattern'
-import HeroWorkflowProvider from '../hero-workflow'
+import { GridPattern } from '@/app/(landing)/components/grid-pattern'
+import HeroWorkflowProvider from '@/app/(landing)/components/hero-workflow'
function Hero() {
const router = useRouter()
diff --git a/apps/sim/app/(landing)/components/sections/integrations.tsx b/apps/sim/app/(landing)/components/sections/integrations.tsx
index ea472bef17..1ed12806fd 100644
--- a/apps/sim/app/(landing)/components/sections/integrations.tsx
+++ b/apps/sim/app/(landing)/components/sections/integrations.tsx
@@ -3,9 +3,9 @@
import { motion } from 'framer-motion'
import { GitBranch, RefreshCcw } from 'lucide-react'
import ReactFlow, { ConnectionLineType, Position, ReactFlowProvider } from 'reactflow'
+import { DotPattern } from '@/app/(landing)/components/dot-pattern'
+import { HeroBlock } from '@/app/(landing)/components/hero-block'
import { OrbitingCircles } from '@/app/(landing)/components/magicui/orbiting-circles'
-import { DotPattern } from '../dot-pattern'
-import { HeroBlock } from '../hero-block'
function Integrations() {
return (
diff --git a/apps/sim/app/(landing)/components/sections/testimonials.tsx b/apps/sim/app/(landing)/components/sections/testimonials.tsx
index 0bad46f0a5..465ce9f7aa 100644
--- a/apps/sim/app/(landing)/components/sections/testimonials.tsx
+++ b/apps/sim/app/(landing)/components/sections/testimonials.tsx
@@ -1,8 +1,8 @@
'use client'
import { motion } from 'framer-motion'
+import useIsMobile from '@/app/(landing)/components/hooks/use-is-mobile'
import { Marquee } from '@/app/(landing)/components/magicui/marquee'
-import useIsMobile from '../hooks/use-is-mobile'
const X_TESTIMONIALS = [
{
diff --git a/apps/sim/app/(landing)/contributors/page.tsx b/apps/sim/app/(landing)/contributors/page.tsx
index cd600a4b26..19e7aca157 100644
--- a/apps/sim/app/(landing)/contributors/page.tsx
+++ b/apps/sim/app/(landing)/contributors/page.tsx
@@ -26,10 +26,10 @@ import {
import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'
import { Button } from '@/components/ui/button'
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'
-import { GridPattern } from '../components/grid-pattern'
-import NavWrapper from '../components/nav-wrapper'
-import Footer from '../components/sections/footer'
-import { getCachedContributorsData, prefetchContributorsData } from '../utils/prefetch'
+import { GridPattern } from '@/app/(landing)/components/grid-pattern'
+import NavWrapper from '@/app/(landing)/components/nav-wrapper'
+import Footer from '@/app/(landing)/components/sections/footer'
+import { getCachedContributorsData, prefetchContributorsData } from '@/app/(landing)/utils/prefetch'
interface Contributor {
login: string
diff --git a/apps/sim/app/(landing)/landing.tsx b/apps/sim/app/(landing)/landing.tsx
index 1965b454d2..e57ed86c19 100644
--- a/apps/sim/app/(landing)/landing.tsx
+++ b/apps/sim/app/(landing)/landing.tsx
@@ -1,10 +1,10 @@
'use client'
-import NavWrapper from './components/nav-wrapper'
-import Footer from './components/sections/footer'
-import Hero from './components/sections/hero'
-import Integrations from './components/sections/integrations'
-import Testimonials from './components/sections/testimonials'
+import NavWrapper from '@/app/(landing)/components/nav-wrapper'
+import Footer from '@/app/(landing)/components/sections/footer'
+import Hero from '@/app/(landing)/components/sections/hero'
+import Integrations from '@/app/(landing)/components/sections/integrations'
+import Testimonials from '@/app/(landing)/components/sections/testimonials'
export default function Landing() {
const handleOpenTypeformLink = () => {
diff --git a/apps/sim/app/(landing)/privacy/page.tsx b/apps/sim/app/(landing)/privacy/page.tsx
index 09d3ba85c6..2912a2c688 100644
--- a/apps/sim/app/(landing)/privacy/page.tsx
+++ b/apps/sim/app/(landing)/privacy/page.tsx
@@ -1,9 +1,9 @@
'use client'
import Link from 'next/link'
-import { GridPattern } from '../components/grid-pattern'
-import NavWrapper from '../components/nav-wrapper'
-import Footer from '../components/sections/footer'
+import { GridPattern } from '@/app/(landing)/components/grid-pattern'
+import NavWrapper from '@/app/(landing)/components/nav-wrapper'
+import Footer from '@/app/(landing)/components/sections/footer'
export default function PrivacyPolicy() {
const handleOpenTypeformLink = () => {
diff --git a/apps/sim/app/(landing)/terms/page.tsx b/apps/sim/app/(landing)/terms/page.tsx
index 1acfbba2f6..8b730225e8 100644
--- a/apps/sim/app/(landing)/terms/page.tsx
+++ b/apps/sim/app/(landing)/terms/page.tsx
@@ -1,9 +1,9 @@
'use client'
import Link from 'next/link'
-import { GridPattern } from '../components/grid-pattern'
-import NavWrapper from '../components/nav-wrapper'
-import Footer from '../components/sections/footer'
+import { GridPattern } from '@/app/(landing)/components/grid-pattern'
+import NavWrapper from '@/app/(landing)/components/nav-wrapper'
+import Footer from '@/app/(landing)/components/sections/footer'
export default function TermsOfService() {
const handleOpenTypeformLink = () => {
diff --git a/apps/sim/app/(landing)/utils/prefetch.ts b/apps/sim/app/(landing)/utils/prefetch.ts
index db02cc9d5a..1c8e9fe379 100644
--- a/apps/sim/app/(landing)/utils/prefetch.ts
+++ b/apps/sim/app/(landing)/utils/prefetch.ts
@@ -1,6 +1,6 @@
// Utility for prefetching and caching contributors page data
-import { getCommitsData, getContributors, getRepositoryStats } from '../actions/github'
-import { generateActivityData, generateCommitTimelineData } from './github'
+import { getCommitsData, getContributors, getRepositoryStats } from '@/app/(landing)/actions/github'
+import { generateActivityData, generateCommitTimelineData } from '@/app/(landing)/utils/github'
interface Contributor {
login: string
diff --git a/apps/sim/app/api/auth/forget-password/route.test.ts b/apps/sim/app/api/auth/forget-password/route.test.ts
index e9467853d5..e4d54900e0 100644
--- a/apps/sim/app/api/auth/forget-password/route.test.ts
+++ b/apps/sim/app/api/auth/forget-password/route.test.ts
@@ -27,7 +27,7 @@ describe('Forget Password API Route', () => {
redirectTo: 'https://example.com/reset',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/auth/forget-password/route')
const response = await POST(req)
const data = await response.json()
@@ -56,7 +56,7 @@ describe('Forget Password API Route', () => {
email: 'test@example.com',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/auth/forget-password/route')
const response = await POST(req)
const data = await response.json()
@@ -79,7 +79,7 @@ describe('Forget Password API Route', () => {
const req = createMockRequest('POST', {})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/auth/forget-password/route')
const response = await POST(req)
const data = await response.json()
@@ -98,7 +98,7 @@ describe('Forget Password API Route', () => {
email: '',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/auth/forget-password/route')
const response = await POST(req)
const data = await response.json()
@@ -126,7 +126,7 @@ describe('Forget Password API Route', () => {
email: 'nonexistent@example.com',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/auth/forget-password/route')
const response = await POST(req)
const data = await response.json()
@@ -156,7 +156,7 @@ describe('Forget Password API Route', () => {
email: 'test@example.com',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/auth/forget-password/route')
const response = await POST(req)
const data = await response.json()
diff --git a/apps/sim/app/api/auth/oauth/connections/route.test.ts b/apps/sim/app/api/auth/oauth/connections/route.test.ts
index c038134a02..16797efb13 100644
--- a/apps/sim/app/api/auth/oauth/connections/route.test.ts
+++ b/apps/sim/app/api/auth/oauth/connections/route.test.ts
@@ -96,7 +96,7 @@ describe('OAuth Connections API Route', () => {
mockDb.limit.mockResolvedValueOnce(mockUserRecord)
const req = createMockRequest('GET')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/auth/oauth/connections/route')
const response = await GET(req)
const data = await response.json()
@@ -121,7 +121,7 @@ describe('OAuth Connections API Route', () => {
mockGetSession.mockResolvedValueOnce(null)
const req = createMockRequest('GET')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/auth/oauth/connections/route')
const response = await GET(req)
const data = await response.json()
@@ -146,7 +146,7 @@ describe('OAuth Connections API Route', () => {
mockDb.limit.mockResolvedValueOnce([])
const req = createMockRequest('GET')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/auth/oauth/connections/route')
const response = await GET(req)
const data = await response.json()
@@ -165,7 +165,7 @@ describe('OAuth Connections API Route', () => {
mockDb.where.mockRejectedValueOnce(new Error('Database error'))
const req = createMockRequest('GET')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/auth/oauth/connections/route')
const response = await GET(req)
const data = await response.json()
@@ -209,7 +209,7 @@ describe('OAuth Connections API Route', () => {
mockDb.limit.mockResolvedValueOnce([])
const req = createMockRequest('GET')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/auth/oauth/connections/route')
const response = await GET(req)
const data = await response.json()
diff --git a/apps/sim/app/api/auth/oauth/credentials/route.test.ts b/apps/sim/app/api/auth/oauth/credentials/route.test.ts
index 497b668cf1..30877f1744 100644
--- a/apps/sim/app/api/auth/oauth/credentials/route.test.ts
+++ b/apps/sim/app/api/auth/oauth/credentials/route.test.ts
@@ -111,7 +111,7 @@ describe('OAuth Credentials API Route', () => {
const req = createMockRequestWithQuery('GET', '?provider=google-email')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/auth/oauth/credentials/route')
const response = await GET(req)
const data = await response.json()
@@ -135,7 +135,7 @@ describe('OAuth Credentials API Route', () => {
const req = createMockRequestWithQuery('GET', '?provider=google')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/auth/oauth/credentials/route')
const response = await GET(req)
const data = await response.json()
@@ -152,7 +152,7 @@ describe('OAuth Credentials API Route', () => {
const req = createMockRequestWithQuery('GET')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/auth/oauth/credentials/route')
const response = await GET(req)
const data = await response.json()
@@ -177,7 +177,7 @@ describe('OAuth Credentials API Route', () => {
const req = createMockRequestWithQuery('GET', '?provider=github')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/auth/oauth/credentials/route')
const response = await GET(req)
const data = await response.json()
@@ -220,7 +220,7 @@ describe('OAuth Credentials API Route', () => {
const req = createMockRequestWithQuery('GET', '?provider=google')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/auth/oauth/credentials/route')
const response = await GET(req)
const data = await response.json()
@@ -244,7 +244,7 @@ describe('OAuth Credentials API Route', () => {
const req = createMockRequestWithQuery('GET', '?provider=google')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/auth/oauth/credentials/route')
const response = await GET(req)
const data = await response.json()
diff --git a/apps/sim/app/api/auth/oauth/disconnect/route.test.ts b/apps/sim/app/api/auth/oauth/disconnect/route.test.ts
index d368694b24..f4fa9cd08c 100644
--- a/apps/sim/app/api/auth/oauth/disconnect/route.test.ts
+++ b/apps/sim/app/api/auth/oauth/disconnect/route.test.ts
@@ -68,7 +68,7 @@ describe('OAuth Disconnect API Route', () => {
provider: 'google',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/auth/oauth/disconnect/route')
const response = await POST(req)
const data = await response.json()
@@ -91,7 +91,7 @@ describe('OAuth Disconnect API Route', () => {
providerId: 'google-email',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/auth/oauth/disconnect/route')
const response = await POST(req)
const data = await response.json()
@@ -108,7 +108,7 @@ describe('OAuth Disconnect API Route', () => {
provider: 'google',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/auth/oauth/disconnect/route')
const response = await POST(req)
const data = await response.json()
@@ -125,7 +125,7 @@ describe('OAuth Disconnect API Route', () => {
const req = createMockRequest('POST', {})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/auth/oauth/disconnect/route')
const response = await POST(req)
const data = await response.json()
@@ -147,7 +147,7 @@ describe('OAuth Disconnect API Route', () => {
provider: 'google',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/auth/oauth/disconnect/route')
const response = await POST(req)
const data = await response.json()
diff --git a/apps/sim/app/api/auth/oauth/microsoft/file/route.ts b/apps/sim/app/api/auth/oauth/microsoft/file/route.ts
index a85403c6a5..1242c850a2 100644
--- a/apps/sim/app/api/auth/oauth/microsoft/file/route.ts
+++ b/apps/sim/app/api/auth/oauth/microsoft/file/route.ts
@@ -2,9 +2,9 @@ import { eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
+import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils'
import { db } from '@/db'
import { account } from '@/db/schema'
-import { refreshAccessTokenIfNeeded } from '../../utils'
export const dynamic = 'force-dynamic'
diff --git a/apps/sim/app/api/auth/oauth/microsoft/files/route.ts b/apps/sim/app/api/auth/oauth/microsoft/files/route.ts
index 6b02f35bd1..ebcbc79703 100644
--- a/apps/sim/app/api/auth/oauth/microsoft/files/route.ts
+++ b/apps/sim/app/api/auth/oauth/microsoft/files/route.ts
@@ -2,9 +2,9 @@ import { eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
+import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils'
import { db } from '@/db'
import { account } from '@/db/schema'
-import { refreshAccessTokenIfNeeded } from '../../utils'
export const dynamic = 'force-dynamic'
diff --git a/apps/sim/app/api/auth/oauth/token/route.test.ts b/apps/sim/app/api/auth/oauth/token/route.test.ts
index b83ed0ee81..01a6d483e7 100644
--- a/apps/sim/app/api/auth/oauth/token/route.test.ts
+++ b/apps/sim/app/api/auth/oauth/token/route.test.ts
@@ -28,7 +28,7 @@ describe('OAuth Token API Routes', () => {
randomUUID: vi.fn().mockReturnValue(mockUUID),
})
- vi.doMock('../utils', () => ({
+ vi.doMock('@/app/api/auth/oauth/utils', () => ({
getUserId: mockGetUserId,
getCredential: mockGetCredential,
refreshTokenIfNeeded: mockRefreshTokenIfNeeded,
@@ -67,7 +67,7 @@ describe('OAuth Token API Routes', () => {
})
// Import handler after setting up mocks
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/auth/oauth/token/route')
// Call handler
const response = await POST(req)
@@ -102,7 +102,7 @@ describe('OAuth Token API Routes', () => {
workflowId: 'workflow-id',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/auth/oauth/token/route')
const response = await POST(req)
const data = await response.json()
@@ -121,7 +121,7 @@ describe('OAuth Token API Routes', () => {
it('should handle missing credentialId', async () => {
const req = createMockRequest('POST', {})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/auth/oauth/token/route')
const response = await POST(req)
const data = await response.json()
@@ -138,7 +138,7 @@ describe('OAuth Token API Routes', () => {
credentialId: 'credential-id',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/auth/oauth/token/route')
const response = await POST(req)
const data = await response.json()
@@ -155,7 +155,7 @@ describe('OAuth Token API Routes', () => {
workflowId: 'nonexistent-workflow-id',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/auth/oauth/token/route')
const response = await POST(req)
const data = await response.json()
@@ -172,7 +172,7 @@ describe('OAuth Token API Routes', () => {
credentialId: 'nonexistent-credential-id',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/auth/oauth/token/route')
const response = await POST(req)
const data = await response.json()
@@ -196,7 +196,7 @@ describe('OAuth Token API Routes', () => {
credentialId: 'credential-id',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/auth/oauth/token/route')
const response = await POST(req)
const data = await response.json()
@@ -228,7 +228,7 @@ describe('OAuth Token API Routes', () => {
'http://localhost:3000/api/auth/oauth/token?credentialId=credential-id'
)
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/auth/oauth/token/route')
const response = await GET(req as any)
const data = await response.json()
@@ -244,7 +244,7 @@ describe('OAuth Token API Routes', () => {
it('should handle missing credentialId', async () => {
const req = new Request('http://localhost:3000/api/auth/oauth/token')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/auth/oauth/token/route')
const response = await GET(req as any)
const data = await response.json()
@@ -261,7 +261,7 @@ describe('OAuth Token API Routes', () => {
'http://localhost:3000/api/auth/oauth/token?credentialId=credential-id'
)
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/auth/oauth/token/route')
const response = await GET(req as any)
const data = await response.json()
@@ -278,7 +278,7 @@ describe('OAuth Token API Routes', () => {
'http://localhost:3000/api/auth/oauth/token?credentialId=nonexistent-credential-id'
)
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/auth/oauth/token/route')
const response = await GET(req as any)
const data = await response.json()
@@ -300,7 +300,7 @@ describe('OAuth Token API Routes', () => {
'http://localhost:3000/api/auth/oauth/token?credentialId=credential-id'
)
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/auth/oauth/token/route')
const response = await GET(req as any)
const data = await response.json()
@@ -325,7 +325,7 @@ describe('OAuth Token API Routes', () => {
'http://localhost:3000/api/auth/oauth/token?credentialId=credential-id'
)
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/auth/oauth/token/route')
const response = await GET(req as any)
const data = await response.json()
diff --git a/apps/sim/app/api/auth/oauth/token/route.ts b/apps/sim/app/api/auth/oauth/token/route.ts
index 64ae988141..d9628d2cb2 100644
--- a/apps/sim/app/api/auth/oauth/token/route.ts
+++ b/apps/sim/app/api/auth/oauth/token/route.ts
@@ -1,6 +1,6 @@
import { type NextRequest, NextResponse } from 'next/server'
import { createLogger } from '@/lib/logs/console/logger'
-import { getCredential, getUserId, refreshTokenIfNeeded } from '../utils'
+import { getCredential, getUserId, refreshTokenIfNeeded } from '@/app/api/auth/oauth/utils'
export const dynamic = 'force-dynamic'
diff --git a/apps/sim/app/api/auth/oauth/utils.test.ts b/apps/sim/app/api/auth/oauth/utils.test.ts
index 6fad5df7ab..7255572948 100644
--- a/apps/sim/app/api/auth/oauth/utils.test.ts
+++ b/apps/sim/app/api/auth/oauth/utils.test.ts
@@ -50,7 +50,7 @@ describe('OAuth Utils', () => {
describe('getUserId', () => {
it('should get user ID from session when no workflowId is provided', async () => {
- const { getUserId } = await import('./utils')
+ const { getUserId } = await import('@/app/api/auth/oauth/utils')
const userId = await getUserId('request-id')
@@ -60,7 +60,7 @@ describe('OAuth Utils', () => {
it('should get user ID from workflow when workflowId is provided', async () => {
mockDb.limit.mockReturnValueOnce([{ userId: 'workflow-owner-id' }])
- const { getUserId } = await import('./utils')
+ const { getUserId } = await import('@/app/api/auth/oauth/utils')
const userId = await getUserId('request-id', 'workflow-id')
@@ -76,7 +76,7 @@ describe('OAuth Utils', () => {
getSession: vi.fn().mockResolvedValue(null),
}))
- const { getUserId } = await import('./utils')
+ const { getUserId } = await import('@/app/api/auth/oauth/utils')
const userId = await getUserId('request-id')
@@ -87,7 +87,7 @@ describe('OAuth Utils', () => {
it('should return undefined if workflow is not found', async () => {
mockDb.limit.mockReturnValueOnce([])
- const { getUserId } = await import('./utils')
+ const { getUserId } = await import('@/app/api/auth/oauth/utils')
const userId = await getUserId('request-id', 'nonexistent-workflow-id')
@@ -101,7 +101,7 @@ describe('OAuth Utils', () => {
const mockCredential = { id: 'credential-id', userId: 'test-user-id' }
mockDb.limit.mockReturnValueOnce([mockCredential])
- const { getCredential } = await import('./utils')
+ const { getCredential } = await import('@/app/api/auth/oauth/utils')
const credential = await getCredential('request-id', 'credential-id', 'test-user-id')
@@ -116,7 +116,7 @@ describe('OAuth Utils', () => {
it('should return undefined when credential is not found', async () => {
mockDb.limit.mockReturnValueOnce([])
- const { getCredential } = await import('./utils')
+ const { getCredential } = await import('@/app/api/auth/oauth/utils')
const credential = await getCredential('request-id', 'nonexistent-id', 'test-user-id')
@@ -135,7 +135,7 @@ describe('OAuth Utils', () => {
providerId: 'google',
}
- const { refreshTokenIfNeeded } = await import('./utils')
+ const { refreshTokenIfNeeded } = await import('@/app/api/auth/oauth/utils')
const result = await refreshTokenIfNeeded('request-id', mockCredential, 'credential-id')
@@ -159,7 +159,7 @@ describe('OAuth Utils', () => {
refreshToken: 'new-refresh-token',
})
- const { refreshTokenIfNeeded } = await import('./utils')
+ const { refreshTokenIfNeeded } = await import('@/app/api/auth/oauth/utils')
const result = await refreshTokenIfNeeded('request-id', mockCredential, 'credential-id')
@@ -183,7 +183,7 @@ describe('OAuth Utils', () => {
mockRefreshOAuthToken.mockResolvedValueOnce(null)
- const { refreshTokenIfNeeded } = await import('./utils')
+ const { refreshTokenIfNeeded } = await import('@/app/api/auth/oauth/utils')
await expect(
refreshTokenIfNeeded('request-id', mockCredential, 'credential-id')
@@ -201,7 +201,7 @@ describe('OAuth Utils', () => {
providerId: 'google',
}
- const { refreshTokenIfNeeded } = await import('./utils')
+ const { refreshTokenIfNeeded } = await import('@/app/api/auth/oauth/utils')
const result = await refreshTokenIfNeeded('request-id', mockCredential, 'credential-id')
@@ -222,7 +222,7 @@ describe('OAuth Utils', () => {
}
mockDb.limit.mockReturnValueOnce([mockCredential])
- const { refreshAccessTokenIfNeeded } = await import('./utils')
+ const { refreshAccessTokenIfNeeded } = await import('@/app/api/auth/oauth/utils')
const token = await refreshAccessTokenIfNeeded('credential-id', 'test-user-id', 'request-id')
@@ -247,7 +247,7 @@ describe('OAuth Utils', () => {
refreshToken: 'new-refresh-token',
})
- const { refreshAccessTokenIfNeeded } = await import('./utils')
+ const { refreshAccessTokenIfNeeded } = await import('@/app/api/auth/oauth/utils')
const token = await refreshAccessTokenIfNeeded('credential-id', 'test-user-id', 'request-id')
@@ -260,7 +260,7 @@ describe('OAuth Utils', () => {
it('should return null if credential not found', async () => {
mockDb.limit.mockReturnValueOnce([])
- const { refreshAccessTokenIfNeeded } = await import('./utils')
+ const { refreshAccessTokenIfNeeded } = await import('@/app/api/auth/oauth/utils')
const token = await refreshAccessTokenIfNeeded('nonexistent-id', 'test-user-id', 'request-id')
@@ -281,7 +281,7 @@ describe('OAuth Utils', () => {
mockRefreshOAuthToken.mockResolvedValueOnce(null)
- const { refreshAccessTokenIfNeeded } = await import('./utils')
+ const { refreshAccessTokenIfNeeded } = await import('@/app/api/auth/oauth/utils')
const token = await refreshAccessTokenIfNeeded('credential-id', 'test-user-id', 'request-id')
diff --git a/apps/sim/app/api/auth/oauth/wealthbox/item/route.ts b/apps/sim/app/api/auth/oauth/wealthbox/item/route.ts
index 2f9954c98a..227b0e09a8 100644
--- a/apps/sim/app/api/auth/oauth/wealthbox/item/route.ts
+++ b/apps/sim/app/api/auth/oauth/wealthbox/item/route.ts
@@ -2,9 +2,9 @@ import { eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
+import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils'
import { db } from '@/db'
import { account } from '@/db/schema'
-import { refreshAccessTokenIfNeeded } from '../../utils'
export const dynamic = 'force-dynamic'
diff --git a/apps/sim/app/api/auth/oauth/wealthbox/items/route.ts b/apps/sim/app/api/auth/oauth/wealthbox/items/route.ts
index f16844e059..3fc90e16ba 100644
--- a/apps/sim/app/api/auth/oauth/wealthbox/items/route.ts
+++ b/apps/sim/app/api/auth/oauth/wealthbox/items/route.ts
@@ -2,9 +2,9 @@ import { eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
+import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils'
import { db } from '@/db'
import { account } from '@/db/schema'
-import { refreshAccessTokenIfNeeded } from '../../utils'
export const dynamic = 'force-dynamic'
diff --git a/apps/sim/app/api/auth/reset-password/route.test.ts b/apps/sim/app/api/auth/reset-password/route.test.ts
index 36dd653c76..4541c65a9e 100644
--- a/apps/sim/app/api/auth/reset-password/route.test.ts
+++ b/apps/sim/app/api/auth/reset-password/route.test.ts
@@ -27,7 +27,7 @@ describe('Reset Password API Route', () => {
newPassword: 'newSecurePassword123',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/auth/reset-password/route')
const response = await POST(req)
const data = await response.json()
@@ -52,7 +52,7 @@ describe('Reset Password API Route', () => {
newPassword: 'newSecurePassword123',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/auth/reset-password/route')
const response = await POST(req)
const data = await response.json()
@@ -91,7 +91,7 @@ describe('Reset Password API Route', () => {
newPassword: 'newSecurePassword123',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/auth/reset-password/route')
const response = await POST(req)
const data = await response.json()
@@ -111,7 +111,7 @@ describe('Reset Password API Route', () => {
newPassword: '',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/auth/reset-password/route')
const response = await POST(req)
const data = await response.json()
@@ -140,7 +140,7 @@ describe('Reset Password API Route', () => {
newPassword: 'newSecurePassword123',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/auth/reset-password/route')
const response = await POST(req)
const data = await response.json()
@@ -149,7 +149,7 @@ describe('Reset Password API Route', () => {
expect(data.message).toBe(errorMessage)
const logger = await import('@/lib/logs/console/logger')
- const mockLogger = logger.createLogger('PasswordReset')
+ const mockLogger = logger.createLogger('PasswordResetAPI')
expect(mockLogger.error).toHaveBeenCalledWith('Error during password reset:', {
error: expect.any(Error),
})
@@ -171,7 +171,7 @@ describe('Reset Password API Route', () => {
newPassword: 'newSecurePassword123',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/auth/reset-password/route')
const response = await POST(req)
const data = await response.json()
@@ -182,7 +182,7 @@ describe('Reset Password API Route', () => {
)
const logger = await import('@/lib/logs/console/logger')
- const mockLogger = logger.createLogger('PasswordReset')
+ const mockLogger = logger.createLogger('PasswordResetAPI')
expect(mockLogger.error).toHaveBeenCalled()
})
})
diff --git a/apps/sim/app/api/auth/reset-password/route.ts b/apps/sim/app/api/auth/reset-password/route.ts
index 847ea67cc4..46141563d1 100644
--- a/apps/sim/app/api/auth/reset-password/route.ts
+++ b/apps/sim/app/api/auth/reset-password/route.ts
@@ -4,7 +4,7 @@ import { createLogger } from '@/lib/logs/console/logger'
export const dynamic = 'force-dynamic'
-const logger = createLogger('PasswordReset')
+const logger = createLogger('PasswordResetAPI')
export async function POST(request: NextRequest) {
try {
diff --git a/apps/sim/app/api/chat/[subdomain]/otp/route.ts b/apps/sim/app/api/chat/[subdomain]/otp/route.ts
index da80560c2f..b7063ee882 100644
--- a/apps/sim/app/api/chat/[subdomain]/otp/route.ts
+++ b/apps/sim/app/api/chat/[subdomain]/otp/route.ts
@@ -5,10 +5,10 @@ import { renderOTPEmail } from '@/components/emails/render-email'
import { sendEmail } from '@/lib/email/mailer'
import { createLogger } from '@/lib/logs/console/logger'
import { getRedisClient, markMessageAsProcessed, releaseLock } from '@/lib/redis'
+import { addCorsHeaders, setChatAuthCookie } from '@/app/api/chat/utils'
import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils'
import { db } from '@/db'
import { chat } from '@/db/schema'
-import { addCorsHeaders, setChatAuthCookie } from '../../utils'
const logger = createLogger('ChatOtpAPI')
diff --git a/apps/sim/app/api/chat/[subdomain]/route.test.ts b/apps/sim/app/api/chat/[subdomain]/route.test.ts
index 787ca53b92..e4dc365830 100644
--- a/apps/sim/app/api/chat/[subdomain]/route.test.ts
+++ b/apps/sim/app/api/chat/[subdomain]/route.test.ts
@@ -67,7 +67,7 @@ describe('Chat Subdomain API Route', () => {
beforeEach(() => {
vi.resetModules()
- vi.doMock('../utils', () => ({
+ vi.doMock('@/app/api/chat/utils', () => ({
addCorsHeaders: mockAddCorsHeaders,
validateChatAuth: mockValidateChatAuth,
setChatAuthCookie: mockSetChatAuthCookie,
@@ -138,7 +138,7 @@ describe('Chat Subdomain API Route', () => {
const req = createMockRequest('GET')
const params = Promise.resolve({ subdomain: 'test-chat' })
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/chat/[subdomain]/route')
const response = await GET(req, { params })
@@ -169,7 +169,7 @@ describe('Chat Subdomain API Route', () => {
const req = createMockRequest('GET')
const params = Promise.resolve({ subdomain: 'nonexistent' })
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/chat/[subdomain]/route')
const response = await GET(req, { params })
@@ -203,7 +203,7 @@ describe('Chat Subdomain API Route', () => {
const req = createMockRequest('GET')
const params = Promise.resolve({ subdomain: 'inactive-chat' })
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/chat/[subdomain]/route')
const response = await GET(req, { params })
@@ -224,7 +224,7 @@ describe('Chat Subdomain API Route', () => {
const req = createMockRequest('GET')
const params = Promise.resolve({ subdomain: 'password-protected-chat' })
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/chat/[subdomain]/route')
const response = await GET(req, { params })
@@ -245,7 +245,7 @@ describe('Chat Subdomain API Route', () => {
const req = createMockRequest('POST', { password: 'test-password' })
const params = Promise.resolve({ subdomain: 'password-protected-chat' })
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/chat/[subdomain]/route')
const response = await POST(req, { params })
@@ -261,7 +261,7 @@ describe('Chat Subdomain API Route', () => {
const req = createMockRequest('POST', {})
const params = Promise.resolve({ subdomain: 'test-chat' })
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/chat/[subdomain]/route')
const response = await POST(req, { params })
@@ -282,7 +282,7 @@ describe('Chat Subdomain API Route', () => {
const req = createMockRequest('POST', { input: 'Hello' })
const params = Promise.resolve({ subdomain: 'protected-chat' })
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/chat/[subdomain]/route')
const response = await POST(req, { params })
@@ -345,7 +345,7 @@ describe('Chat Subdomain API Route', () => {
const req = createMockRequest('POST', { input: 'Hello' })
const params = Promise.resolve({ subdomain: 'test-chat' })
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/chat/[subdomain]/route')
const response = await POST(req, { params })
@@ -360,7 +360,7 @@ describe('Chat Subdomain API Route', () => {
const req = createMockRequest('POST', { input: 'Hello world', conversationId: 'conv-123' })
const params = Promise.resolve({ subdomain: 'test-chat' })
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/chat/[subdomain]/route')
const response = await POST(req, { params })
@@ -377,7 +377,7 @@ describe('Chat Subdomain API Route', () => {
const req = createMockRequest('POST', { input: 'Hello world' })
const params = Promise.resolve({ subdomain: 'test-chat' })
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/chat/[subdomain]/route')
const response = await POST(req, { params })
@@ -407,7 +407,7 @@ describe('Chat Subdomain API Route', () => {
const req = createMockRequest('POST', { input: 'Trigger error' })
const params = Promise.resolve({ subdomain: 'test-chat' })
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/chat/[subdomain]/route')
const response = await POST(req, { params })
@@ -426,12 +426,13 @@ describe('Chat Subdomain API Route', () => {
// Create a request with invalid JSON
const req = {
method: 'POST',
+ headers: new Headers(),
json: vi.fn().mockRejectedValue(new Error('Invalid JSON')),
} as any
const params = Promise.resolve({ subdomain: 'test-chat' })
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/chat/[subdomain]/route')
const response = await POST(req, { params })
@@ -449,7 +450,7 @@ describe('Chat Subdomain API Route', () => {
})
const params = Promise.resolve({ subdomain: 'test-chat' })
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/chat/[subdomain]/route')
await POST(req, { params })
@@ -464,7 +465,7 @@ describe('Chat Subdomain API Route', () => {
const req = createMockRequest('POST', { input: 'Hello world' })
const params = Promise.resolve({ subdomain: 'test-chat' })
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/chat/[subdomain]/route')
await POST(req, { params })
diff --git a/apps/sim/app/api/chat/[subdomain]/route.ts b/apps/sim/app/api/chat/[subdomain]/route.ts
index 7c335270be..188b37a534 100644
--- a/apps/sim/app/api/chat/[subdomain]/route.ts
+++ b/apps/sim/app/api/chat/[subdomain]/route.ts
@@ -1,16 +1,16 @@
import { eq } from 'drizzle-orm'
import { type NextRequest, NextResponse } from 'next/server'
import { createLogger } from '@/lib/logs/console/logger'
-import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils'
-import { db } from '@/db'
-import { chat, workflow } from '@/db/schema'
import {
addCorsHeaders,
executeWorkflowForChat,
setChatAuthCookie,
validateAuthToken,
validateChatAuth,
-} from '../utils'
+} from '@/app/api/chat/utils'
+import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils'
+import { db } from '@/db'
+import { chat, workflow } from '@/db/schema'
const logger = createLogger('ChatSubdomainAPI')
diff --git a/apps/sim/app/api/chat/edit/[id]/route.test.ts b/apps/sim/app/api/chat/edit/[id]/route.test.ts
index 30cdb0e0a0..13367a1fbc 100644
--- a/apps/sim/app/api/chat/edit/[id]/route.test.ts
+++ b/apps/sim/app/api/chat/edit/[id]/route.test.ts
@@ -94,7 +94,7 @@ describe('Chat Edit API Route', () => {
}))
const req = new NextRequest('http://localhost:3000/api/chat/edit/chat-123')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/chat/edit/[id]/route')
const response = await GET(req, { params: Promise.resolve({ id: 'chat-123' }) })
expect(response.status).toBe(401)
@@ -111,7 +111,7 @@ describe('Chat Edit API Route', () => {
mockCheckChatAccess.mockResolvedValue({ hasAccess: false })
const req = new NextRequest('http://localhost:3000/api/chat/edit/chat-123')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/chat/edit/[id]/route')
const response = await GET(req, { params: Promise.resolve({ id: 'chat-123' }) })
expect(response.status).toBe(404)
@@ -138,7 +138,7 @@ describe('Chat Edit API Route', () => {
mockCheckChatAccess.mockResolvedValue({ hasAccess: true, chat: mockChat })
const req = new NextRequest('http://localhost:3000/api/chat/edit/chat-123')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/chat/edit/[id]/route')
const response = await GET(req, { params: Promise.resolve({ id: 'chat-123' }) })
expect(response.status).toBe(200)
@@ -164,7 +164,7 @@ describe('Chat Edit API Route', () => {
method: 'PATCH',
body: JSON.stringify({ title: 'Updated Chat' }),
})
- const { PATCH } = await import('./route')
+ const { PATCH } = await import('@/app/api/chat/edit/[id]/route')
const response = await PATCH(req, { params: Promise.resolve({ id: 'chat-123' }) })
expect(response.status).toBe(401)
@@ -184,7 +184,7 @@ describe('Chat Edit API Route', () => {
method: 'PATCH',
body: JSON.stringify({ title: 'Updated Chat' }),
})
- const { PATCH } = await import('./route')
+ const { PATCH } = await import('@/app/api/chat/edit/[id]/route')
const response = await PATCH(req, { params: Promise.resolve({ id: 'chat-123' }) })
expect(response.status).toBe(404)
@@ -212,7 +212,7 @@ describe('Chat Edit API Route', () => {
method: 'PATCH',
body: JSON.stringify({ title: 'Updated Chat', description: 'Updated description' }),
})
- const { PATCH } = await import('./route')
+ const { PATCH } = await import('@/app/api/chat/edit/[id]/route')
const response = await PATCH(req, { params: Promise.resolve({ id: 'chat-123' }) })
expect(response.status).toBe(200)
@@ -245,7 +245,7 @@ describe('Chat Edit API Route', () => {
method: 'PATCH',
body: JSON.stringify({ subdomain: 'new-subdomain' }),
})
- const { PATCH } = await import('./route')
+ const { PATCH } = await import('@/app/api/chat/edit/[id]/route')
const response = await PATCH(req, { params: Promise.resolve({ id: 'chat-123' }) })
expect(response.status).toBe(400)
@@ -273,7 +273,7 @@ describe('Chat Edit API Route', () => {
method: 'PATCH',
body: JSON.stringify({ authType: 'password' }), // No password provided
})
- const { PATCH } = await import('./route')
+ const { PATCH } = await import('@/app/api/chat/edit/[id]/route')
const response = await PATCH(req, { params: Promise.resolve({ id: 'chat-123' }) })
expect(response.status).toBe(400)
@@ -304,7 +304,7 @@ describe('Chat Edit API Route', () => {
method: 'PATCH',
body: JSON.stringify({ title: 'Admin Updated Chat' }),
})
- const { PATCH } = await import('./route')
+ const { PATCH } = await import('@/app/api/chat/edit/[id]/route')
const response = await PATCH(req, { params: Promise.resolve({ id: 'chat-123' }) })
expect(response.status).toBe(200)
@@ -321,7 +321,7 @@ describe('Chat Edit API Route', () => {
const req = new NextRequest('http://localhost:3000/api/chat/edit/chat-123', {
method: 'DELETE',
})
- const { DELETE } = await import('./route')
+ const { DELETE } = await import('@/app/api/chat/edit/[id]/route')
const response = await DELETE(req, { params: Promise.resolve({ id: 'chat-123' }) })
expect(response.status).toBe(401)
@@ -340,7 +340,7 @@ describe('Chat Edit API Route', () => {
const req = new NextRequest('http://localhost:3000/api/chat/edit/chat-123', {
method: 'DELETE',
})
- const { DELETE } = await import('./route')
+ const { DELETE } = await import('@/app/api/chat/edit/[id]/route')
const response = await DELETE(req, { params: Promise.resolve({ id: 'chat-123' }) })
expect(response.status).toBe(404)
@@ -361,7 +361,7 @@ describe('Chat Edit API Route', () => {
const req = new NextRequest('http://localhost:3000/api/chat/edit/chat-123', {
method: 'DELETE',
})
- const { DELETE } = await import('./route')
+ const { DELETE } = await import('@/app/api/chat/edit/[id]/route')
const response = await DELETE(req, { params: Promise.resolve({ id: 'chat-123' }) })
expect(response.status).toBe(200)
@@ -385,7 +385,7 @@ describe('Chat Edit API Route', () => {
const req = new NextRequest('http://localhost:3000/api/chat/edit/chat-123', {
method: 'DELETE',
})
- const { DELETE } = await import('./route')
+ const { DELETE } = await import('@/app/api/chat/edit/[id]/route')
const response = await DELETE(req, { params: Promise.resolve({ id: 'chat-123' }) })
expect(response.status).toBe(200)
diff --git a/apps/sim/app/api/chat/route.test.ts b/apps/sim/app/api/chat/route.test.ts
index 462c1d9450..63113b5a5b 100644
--- a/apps/sim/app/api/chat/route.test.ts
+++ b/apps/sim/app/api/chat/route.test.ts
@@ -89,7 +89,7 @@ describe('Chat API Route', () => {
}))
const req = new NextRequest('http://localhost:3000/api/chat')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/chat/route')
const response = await GET(req)
expect(response.status).toBe(401)
@@ -107,7 +107,7 @@ describe('Chat API Route', () => {
mockWhere.mockResolvedValue(mockDeployments)
const req = new NextRequest('http://localhost:3000/api/chat')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/chat/route')
const response = await GET(req)
expect(response.status).toBe(200)
@@ -125,7 +125,7 @@ describe('Chat API Route', () => {
mockWhere.mockRejectedValue(new Error('Database error'))
const req = new NextRequest('http://localhost:3000/api/chat')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/chat/route')
const response = await GET(req)
expect(response.status).toBe(500)
@@ -143,7 +143,7 @@ describe('Chat API Route', () => {
method: 'POST',
body: JSON.stringify({}),
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/chat/route')
const response = await POST(req)
expect(response.status).toBe(401)
@@ -163,7 +163,7 @@ describe('Chat API Route', () => {
method: 'POST',
body: JSON.stringify(invalidData),
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/chat/route')
const response = await POST(req)
expect(response.status).toBe(400)
@@ -192,7 +192,7 @@ describe('Chat API Route', () => {
method: 'POST',
body: JSON.stringify(validData),
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/chat/route')
const response = await POST(req)
expect(response.status).toBe(400)
@@ -223,7 +223,7 @@ describe('Chat API Route', () => {
method: 'POST',
body: JSON.stringify(validData),
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/chat/route')
const response = await POST(req)
expect(response.status).toBe(404)
@@ -268,7 +268,7 @@ describe('Chat API Route', () => {
method: 'POST',
body: JSON.stringify(validData),
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/chat/route')
const response = await POST(req)
expect(response.status).toBe(200)
@@ -310,7 +310,7 @@ describe('Chat API Route', () => {
method: 'POST',
body: JSON.stringify(validData),
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/chat/route')
const response = await POST(req)
expect(response.status).toBe(200)
@@ -343,7 +343,7 @@ describe('Chat API Route', () => {
method: 'POST',
body: JSON.stringify(validData),
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/chat/route')
const response = await POST(req)
expect(response.status).toBe(404)
@@ -378,7 +378,7 @@ describe('Chat API Route', () => {
method: 'POST',
body: JSON.stringify(validData),
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/chat/route')
const response = await POST(req)
expect(response.status).toBe(500)
@@ -412,7 +412,7 @@ describe('Chat API Route', () => {
method: 'POST',
body: JSON.stringify(validData),
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/chat/route')
const response = await POST(req)
expect(response.status).toBe(400)
diff --git a/apps/sim/app/api/chat/subdomains/validate/route.test.ts b/apps/sim/app/api/chat/subdomains/validate/route.test.ts
index 24ef63a1b8..6887cdb889 100644
--- a/apps/sim/app/api/chat/subdomains/validate/route.test.ts
+++ b/apps/sim/app/api/chat/subdomains/validate/route.test.ts
@@ -93,7 +93,7 @@ describe('Subdomain Validation API Route', () => {
const req = new NextRequest('http://localhost:3000/api/chat/subdomains/validate?subdomain=test')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/chat/subdomains/validate/route')
const response = await GET(req)
@@ -110,7 +110,7 @@ describe('Subdomain Validation API Route', () => {
const req = new NextRequest('http://localhost:3000/api/chat/subdomains/validate')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/chat/subdomains/validate/route')
const response = await GET(req)
@@ -129,7 +129,7 @@ describe('Subdomain Validation API Route', () => {
'http://localhost:3000/api/chat/subdomains/validate?subdomain=Invalid_Subdomain!'
)
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/chat/subdomains/validate/route')
const response = await GET(req)
const data = await response.json()
@@ -156,7 +156,7 @@ describe('Subdomain Validation API Route', () => {
'http://localhost:3000/api/chat/subdomains/validate?subdomain=available-subdomain'
)
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/chat/subdomains/validate/route')
const response = await GET(req)
@@ -178,7 +178,7 @@ describe('Subdomain Validation API Route', () => {
'http://localhost:3000/api/chat/subdomains/validate?subdomain=telemetry'
)
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/chat/subdomains/validate/route')
const response = await GET(req)
const data = await response.json()
@@ -205,7 +205,7 @@ describe('Subdomain Validation API Route', () => {
'http://localhost:3000/api/chat/subdomains/validate?subdomain=used-subdomain'
)
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/chat/subdomains/validate/route')
const response = await GET(req)
@@ -229,7 +229,7 @@ describe('Subdomain Validation API Route', () => {
'http://localhost:3000/api/chat/subdomains/validate?subdomain=error-subdomain'
)
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/chat/subdomains/validate/route')
const response = await GET(req)
diff --git a/apps/sim/app/api/chat/utils.test.ts b/apps/sim/app/api/chat/utils.test.ts
index 0d594d9624..ec3321ca2e 100644
--- a/apps/sim/app/api/chat/utils.test.ts
+++ b/apps/sim/app/api/chat/utils.test.ts
@@ -66,7 +66,7 @@ describe('Chat API Utils', () => {
describe('Auth token utils', () => {
it.concurrent('should encrypt and validate auth tokens', async () => {
- const { encryptAuthToken, validateAuthToken } = await import('./utils')
+ const { encryptAuthToken, validateAuthToken } = await import('@/app/api/chat/utils')
const subdomainId = 'test-subdomain-id'
const type = 'password'
@@ -83,7 +83,7 @@ describe('Chat API Utils', () => {
})
it.concurrent('should reject expired tokens', async () => {
- const { validateAuthToken } = await import('./utils')
+ const { validateAuthToken } = await import('@/app/api/chat/utils')
const subdomainId = 'test-subdomain-id'
// Create an expired token by directly constructing it with an old timestamp
@@ -98,7 +98,7 @@ describe('Chat API Utils', () => {
describe('Cookie handling', () => {
it.concurrent('should set auth cookie correctly', async () => {
- const { setChatAuthCookie } = await import('./utils')
+ const { setChatAuthCookie } = await import('@/app/api/chat/utils')
const mockSet = vi.fn()
const mockResponse = {
@@ -127,7 +127,7 @@ describe('Chat API Utils', () => {
describe('CORS handling', () => {
it.concurrent('should add CORS headers for localhost in development', async () => {
- const { addCorsHeaders } = await import('./utils')
+ const { addCorsHeaders } = await import('@/app/api/chat/utils')
const mockRequest = {
headers: {
@@ -162,7 +162,7 @@ describe('Chat API Utils', () => {
})
it.concurrent('should handle OPTIONS request', async () => {
- const { OPTIONS } = await import('./utils')
+ const { OPTIONS } = await import('@/app/api/chat/utils')
const mockRequest = {
headers: {
@@ -178,7 +178,7 @@ describe('Chat API Utils', () => {
describe('Chat auth validation', () => {
beforeEach(() => {
- vi.doMock('./utils', async (importOriginal) => {
+ vi.doMock('@/app/api/chat/utils', async (importOriginal) => {
const original = (await importOriginal()) as any
return {
...original,
@@ -200,7 +200,7 @@ describe('Chat API Utils', () => {
})
it.concurrent('should allow access to public chats', async () => {
- const utils = await import('./utils')
+ const utils = await import('@/app/api/chat/utils')
const { validateChatAuth } = utils
const deployment = {
@@ -220,7 +220,7 @@ describe('Chat API Utils', () => {
})
it.concurrent('should request password auth for GET requests', async () => {
- const { validateChatAuth } = await import('./utils')
+ const { validateChatAuth } = await import('@/app/api/chat/utils')
const deployment = {
id: 'chat-id',
@@ -241,7 +241,7 @@ describe('Chat API Utils', () => {
})
it('should validate password for POST requests', async () => {
- const { validateChatAuth } = await import('./utils')
+ const { validateChatAuth } = await import('@/app/api/chat/utils')
const { decryptSecret } = await import('@/lib/utils')
const deployment = {
@@ -268,7 +268,7 @@ describe('Chat API Utils', () => {
})
it.concurrent('should reject incorrect password', async () => {
- const { validateChatAuth } = await import('./utils')
+ const { validateChatAuth } = await import('@/app/api/chat/utils')
const deployment = {
id: 'chat-id',
@@ -294,7 +294,7 @@ describe('Chat API Utils', () => {
})
it.concurrent('should request email auth for email-protected chats', async () => {
- const { validateChatAuth } = await import('./utils')
+ const { validateChatAuth } = await import('@/app/api/chat/utils')
const deployment = {
id: 'chat-id',
@@ -316,7 +316,7 @@ describe('Chat API Utils', () => {
})
it.concurrent('should check allowed emails for email auth', async () => {
- const { validateChatAuth } = await import('./utils')
+ const { validateChatAuth } = await import('@/app/api/chat/utils')
const deployment = {
id: 'chat-id',
diff --git a/apps/sim/app/api/codegen/route.test.ts b/apps/sim/app/api/codegen/route.test.ts
index 14c1639bca..94d95d457a 100644
--- a/apps/sim/app/api/codegen/route.test.ts
+++ b/apps/sim/app/api/codegen/route.test.ts
@@ -94,7 +94,7 @@ describe('Codegen API Route', () => {
generationType: 'json-schema',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/codegen/route')
const response = await POST(req)
const data = await response.json()
@@ -136,7 +136,7 @@ describe('Codegen API Route', () => {
generationType: 'javascript-function-body',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/codegen/route')
const response = await POST(req)
const data = await response.json()
@@ -188,7 +188,7 @@ describe('Codegen API Route', () => {
generationType: 'custom-tool-schema',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/codegen/route')
const response = await POST(req)
const data = await response.json()
@@ -217,7 +217,7 @@ describe('Codegen API Route', () => {
context: 'existing function code here',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/codegen/route')
const response = await POST(req)
@@ -260,7 +260,7 @@ describe('Codegen API Route', () => {
],
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/codegen/route')
const response = await POST(req)
@@ -287,7 +287,7 @@ describe('Codegen API Route', () => {
generationType: 'json-schema',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/codegen/route')
const response = await POST(req)
const data = await response.json()
@@ -302,7 +302,7 @@ describe('Codegen API Route', () => {
prompt: '',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/codegen/route')
const response = await POST(req)
const data = await response.json()
@@ -319,7 +319,7 @@ describe('Codegen API Route', () => {
generationType: 'invalid-type',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/codegen/route')
const response = await POST(req)
const data = await response.json()
@@ -348,7 +348,7 @@ describe('Codegen API Route', () => {
generationType: 'javascript-function-body',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/codegen/route')
const response = await POST(req)
const data = await response.json()
@@ -377,7 +377,7 @@ describe('Codegen API Route', () => {
generationType: 'json-schema',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/codegen/route')
const response = await POST(req)
const data = await response.json()
diff --git a/apps/sim/app/api/files/delete/route.test.ts b/apps/sim/app/api/files/delete/route.test.ts
index cadccfd3f9..5f7b26764b 100644
--- a/apps/sim/app/api/files/delete/route.test.ts
+++ b/apps/sim/app/api/files/delete/route.test.ts
@@ -21,7 +21,7 @@ describe('File Delete API Route', () => {
filePath: '/api/files/serve/test-file.txt',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/files/delete/route')
const response = await POST(req)
const data = await response.json()
@@ -42,7 +42,7 @@ describe('File Delete API Route', () => {
filePath: '/api/files/serve/nonexistent.txt',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/files/delete/route')
const response = await POST(req)
const data = await response.json()
@@ -74,7 +74,7 @@ describe('File Delete API Route', () => {
filePath: '/api/files/serve/s3/1234567890-test-file.txt',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/files/delete/route')
const response = await POST(req)
const data = await response.json()
@@ -109,7 +109,7 @@ describe('File Delete API Route', () => {
filePath: '/api/files/serve/blob/1234567890-test-document.pdf',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/files/delete/route')
const response = await POST(req)
const data = await response.json()
@@ -127,7 +127,7 @@ describe('File Delete API Route', () => {
const req = createMockRequest('POST', {})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/files/delete/route')
const response = await POST(req)
const data = await response.json()
@@ -138,7 +138,7 @@ describe('File Delete API Route', () => {
})
it('should handle CORS preflight requests', async () => {
- const { OPTIONS } = await import('./route')
+ const { OPTIONS } = await import('@/app/api/files/delete/route')
const response = await OPTIONS()
diff --git a/apps/sim/app/api/files/parse/route.test.ts b/apps/sim/app/api/files/parse/route.test.ts
index da05eeb088..ea57a130b9 100644
--- a/apps/sim/app/api/files/parse/route.test.ts
+++ b/apps/sim/app/api/files/parse/route.test.ts
@@ -7,7 +7,7 @@ import { NextRequest } from 'next/server'
*/
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import { createMockRequest, setupFileApiMocks } from '@/app/api/__test-utils__/utils'
-import { POST } from './route'
+import { POST } from '@/app/api/files/parse/route'
const mockJoin = vi.fn((...args: string[]): string => {
if (args[0] === '/test/uploads') {
@@ -53,7 +53,7 @@ describe('File Parse API Route', () => {
setupFileApiMocks()
const req = createMockRequest('POST', {})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/files/parse/route')
const response = await POST(req)
const data = await response.json()
@@ -72,7 +72,7 @@ describe('File Parse API Route', () => {
filePath: '/api/files/serve/test-file.txt',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/files/parse/route')
const response = await POST(req)
const data = await response.json()
@@ -97,7 +97,7 @@ describe('File Parse API Route', () => {
filePath: '/api/files/serve/s3/test-file.pdf',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/files/parse/route')
const response = await POST(req)
const data = await response.json()
@@ -120,7 +120,7 @@ describe('File Parse API Route', () => {
filePath: ['/api/files/serve/file1.txt', '/api/files/serve/file2.txt'],
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/files/parse/route')
const response = await POST(req)
const data = await response.json()
@@ -157,7 +157,7 @@ describe('File Parse API Route', () => {
}),
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/files/parse/route')
const response = await POST(req)
const data = await response.json()
@@ -184,7 +184,7 @@ describe('File Parse API Route', () => {
filePath: '/api/files/serve/nonexistent.txt',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/files/parse/route')
const response = await POST(req)
const data = await response.json()
diff --git a/apps/sim/app/api/files/presigned/route.test.ts b/apps/sim/app/api/files/presigned/route.test.ts
index 4456863b07..a96446b005 100644
--- a/apps/sim/app/api/files/presigned/route.test.ts
+++ b/apps/sim/app/api/files/presigned/route.test.ts
@@ -25,7 +25,7 @@ describe('/api/files/presigned', () => {
storageProvider: 's3',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/files/presigned/route')
const request = new NextRequest('http://localhost:3000/api/files/presigned', {
method: 'POST',
@@ -51,7 +51,7 @@ describe('/api/files/presigned', () => {
storageProvider: 's3',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/files/presigned/route')
const request = new NextRequest('http://localhost:3000/api/files/presigned', {
method: 'POST',
@@ -75,7 +75,7 @@ describe('/api/files/presigned', () => {
storageProvider: 's3',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/files/presigned/route')
const request = new NextRequest('http://localhost:3000/api/files/presigned', {
method: 'POST',
@@ -99,7 +99,7 @@ describe('/api/files/presigned', () => {
storageProvider: 's3',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/files/presigned/route')
const request = new NextRequest('http://localhost:3000/api/files/presigned', {
method: 'POST',
@@ -124,7 +124,7 @@ describe('/api/files/presigned', () => {
storageProvider: 's3',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/files/presigned/route')
const largeFileSize = 150 * 1024 * 1024 // 150MB (exceeds 100MB limit)
const request = new NextRequest('http://localhost:3000/api/files/presigned', {
@@ -150,7 +150,7 @@ describe('/api/files/presigned', () => {
storageProvider: 's3',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/files/presigned/route')
const request = new NextRequest('http://localhost:3000/api/files/presigned', {
method: 'POST',
@@ -182,7 +182,7 @@ describe('/api/files/presigned', () => {
storageProvider: 's3',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/files/presigned/route')
const request = new NextRequest(
'http://localhost:3000/api/files/presigned?type=knowledge-base',
@@ -210,7 +210,7 @@ describe('/api/files/presigned', () => {
storageProvider: 'blob',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/files/presigned/route')
const request = new NextRequest('http://localhost:3000/api/files/presigned', {
method: 'POST',
@@ -250,7 +250,7 @@ describe('/api/files/presigned', () => {
isUsingCloudStorage: vi.fn().mockReturnValue(true),
}))
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/files/presigned/route')
const request = new NextRequest('http://localhost:3000/api/files/presigned', {
method: 'POST',
@@ -293,7 +293,7 @@ describe('/api/files/presigned', () => {
getSignedUrl: vi.fn().mockRejectedValue(new Error('S3 service unavailable')),
}))
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/files/presigned/route')
const request = new NextRequest('http://localhost:3000/api/files/presigned', {
method: 'POST',
@@ -339,7 +339,7 @@ describe('/api/files/presigned', () => {
sanitizeFilenameForMetadata: vi.fn((filename) => filename),
}))
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/files/presigned/route')
const request = new NextRequest('http://localhost:3000/api/files/presigned', {
method: 'POST',
@@ -364,7 +364,7 @@ describe('/api/files/presigned', () => {
storageProvider: 's3',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/files/presigned/route')
const request = new NextRequest('http://localhost:3000/api/files/presigned', {
method: 'POST',
@@ -382,7 +382,7 @@ describe('/api/files/presigned', () => {
describe('OPTIONS', () => {
it('should handle CORS preflight requests', async () => {
- const { OPTIONS } = await import('./route')
+ const { OPTIONS } = await import('@/app/api/files/presigned/route')
const response = await OPTIONS()
diff --git a/apps/sim/app/api/files/serve/[...path]/route.test.ts b/apps/sim/app/api/files/serve/[...path]/route.test.ts
index 3174879cf7..f39325201c 100644
--- a/apps/sim/app/api/files/serve/[...path]/route.test.ts
+++ b/apps/sim/app/api/files/serve/[...path]/route.test.ts
@@ -61,7 +61,7 @@ describe('File Serve API Route', () => {
it('should serve local file successfully', async () => {
const req = new NextRequest('http://localhost:3000/api/files/serve/test-file.txt')
const params = { path: ['test-file.txt'] }
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/files/serve/[...path]/route')
const response = await GET(req, { params: Promise.resolve(params) })
@@ -107,7 +107,7 @@ describe('File Serve API Route', () => {
const req = new NextRequest('http://localhost:3000/api/files/serve/nested/path/file.txt')
const params = { path: ['nested', 'path', 'file.txt'] }
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/files/serve/[...path]/route')
const response = await GET(req, { params: Promise.resolve(params) })
@@ -163,7 +163,7 @@ describe('File Serve API Route', () => {
const req = new NextRequest('http://localhost:3000/api/files/serve/s3/1234567890-image.png')
const params = { path: ['s3', '1234567890-image.png'] }
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/files/serve/[...path]/route')
const response = await GET(req, { params: Promise.resolve(params) })
@@ -208,7 +208,7 @@ describe('File Serve API Route', () => {
const req = new NextRequest('http://localhost:3000/api/files/serve/nonexistent.txt')
const params = { path: ['nonexistent.txt'] }
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/files/serve/[...path]/route')
const response = await GET(req, { params: Promise.resolve(params) })
@@ -249,7 +249,7 @@ describe('File Serve API Route', () => {
const req = new NextRequest(`http://localhost:3000/api/files/serve/file.${test.ext}`)
const params = { path: [`file.${test.ext}`] }
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/files/serve/[...path]/route')
const response = await GET(req, { params: Promise.resolve(params) })
diff --git a/apps/sim/app/api/files/upload/route.test.ts b/apps/sim/app/api/files/upload/route.test.ts
index 7aa21e88bf..ec06804c4c 100644
--- a/apps/sim/app/api/files/upload/route.test.ts
+++ b/apps/sim/app/api/files/upload/route.test.ts
@@ -47,7 +47,7 @@ describe('File Upload API Route', () => {
body: formData,
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/files/upload/route')
const response = await POST(req)
const data = await response.json()
@@ -77,7 +77,7 @@ describe('File Upload API Route', () => {
body: formData,
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/files/upload/route')
const response = await POST(req)
const data = await response.json()
@@ -108,7 +108,7 @@ describe('File Upload API Route', () => {
body: formData,
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/files/upload/route')
const response = await POST(req)
const data = await response.json()
@@ -128,7 +128,7 @@ describe('File Upload API Route', () => {
body: formData,
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/files/upload/route')
const response = await POST(req)
const data = await response.json()
@@ -157,7 +157,7 @@ describe('File Upload API Route', () => {
body: formData,
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/files/upload/route')
const response = await POST(req)
const data = await response.json()
@@ -168,7 +168,7 @@ describe('File Upload API Route', () => {
})
it('should handle CORS preflight requests', async () => {
- const { OPTIONS } = await import('./route')
+ const { OPTIONS } = await import('@/app/api/files/upload/route')
const response = await OPTIONS()
diff --git a/apps/sim/app/api/files/upload/route.ts b/apps/sim/app/api/files/upload/route.ts
index bbd06e00da..405d5a2e96 100644
--- a/apps/sim/app/api/files/upload/route.ts
+++ b/apps/sim/app/api/files/upload/route.ts
@@ -5,10 +5,12 @@ import { v4 as uuidv4 } from 'uuid'
import { createLogger } from '@/lib/logs/console/logger'
import { isUsingCloudStorage, uploadFile } from '@/lib/uploads'
import { UPLOAD_DIR } from '@/lib/uploads/setup'
-// Import to ensure the uploads directory is created
import '@/lib/uploads/setup.server'
-
-import { createErrorResponse, createOptionsResponse, InvalidRequestError } from '../utils'
+import {
+ createErrorResponse,
+ createOptionsResponse,
+ InvalidRequestError,
+} from '@/app/api/files/utils'
export const dynamic = 'force-dynamic'
diff --git a/apps/sim/app/api/folders/[id]/route.test.ts b/apps/sim/app/api/folders/[id]/route.test.ts
index 2008ccbca4..b9d26eb599 100644
--- a/apps/sim/app/api/folders/[id]/route.test.ts
+++ b/apps/sim/app/api/folders/[id]/route.test.ts
@@ -135,7 +135,7 @@ describe('Individual Folder API Route', () => {
})
const params = Promise.resolve({ id: 'folder-1' })
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/folders/[id]/route')
const response = await PUT(req, { params })
@@ -160,7 +160,7 @@ describe('Individual Folder API Route', () => {
})
const params = Promise.resolve({ id: 'folder-1' })
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/folders/[id]/route')
const response = await PUT(req, { params })
@@ -178,7 +178,7 @@ describe('Individual Folder API Route', () => {
})
const params = Promise.resolve({ id: 'folder-1' })
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/folders/[id]/route')
const response = await PUT(req, { params })
@@ -200,7 +200,7 @@ describe('Individual Folder API Route', () => {
})
const params = Promise.resolve({ id: 'folder-1' })
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/folders/[id]/route')
const response = await PUT(req, { params })
@@ -222,7 +222,7 @@ describe('Individual Folder API Route', () => {
})
const params = Promise.resolve({ id: 'folder-1' })
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/folders/[id]/route')
const response = await PUT(req, { params })
@@ -244,7 +244,7 @@ describe('Individual Folder API Route', () => {
})
const params = Promise.resolve({ id: 'folder-1' })
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/folders/[id]/route')
const response = await PUT(req, { params })
@@ -266,7 +266,7 @@ describe('Individual Folder API Route', () => {
})
const params = Promise.resolve({ id: 'folder-1' })
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/folders/[id]/route')
const response = await PUT(req, { params })
@@ -300,7 +300,7 @@ describe('Individual Folder API Route', () => {
})
const params = Promise.resolve({ id: 'folder-1' })
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/folders/[id]/route')
await PUT(req, { params })
@@ -321,7 +321,7 @@ describe('Individual Folder API Route', () => {
})
const params = Promise.resolve({ id: 'folder-1' })
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/folders/[id]/route')
const response = await PUT(req, { params })
@@ -347,7 +347,7 @@ describe('Individual Folder API Route', () => {
})
const params = Promise.resolve({ id: 'folder-1' })
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/folders/[id]/route')
const response = await PUT(req, { params })
@@ -372,7 +372,7 @@ describe('Individual Folder API Route', () => {
const params = Promise.resolve({ id: 'folder-1' })
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/folders/[id]/route')
const response = await PUT(req, { params })
@@ -404,7 +404,7 @@ describe('Individual Folder API Route', () => {
})
const params = Promise.resolve({ id: 'folder-3' })
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/folders/[id]/route')
const response = await PUT(req, { params })
@@ -430,7 +430,7 @@ describe('Individual Folder API Route', () => {
const req = createMockRequest('DELETE')
const params = Promise.resolve({ id: 'folder-1' })
- const { DELETE } = await import('./route')
+ const { DELETE } = await import('@/app/api/folders/[id]/route')
const response = await DELETE(req, { params })
@@ -450,7 +450,7 @@ describe('Individual Folder API Route', () => {
const req = createMockRequest('DELETE')
const params = Promise.resolve({ id: 'folder-1' })
- const { DELETE } = await import('./route')
+ const { DELETE } = await import('@/app/api/folders/[id]/route')
const response = await DELETE(req, { params })
@@ -470,7 +470,7 @@ describe('Individual Folder API Route', () => {
const req = createMockRequest('DELETE')
const params = Promise.resolve({ id: 'folder-1' })
- const { DELETE } = await import('./route')
+ const { DELETE } = await import('@/app/api/folders/[id]/route')
const response = await DELETE(req, { params })
@@ -490,7 +490,7 @@ describe('Individual Folder API Route', () => {
const req = createMockRequest('DELETE')
const params = Promise.resolve({ id: 'folder-1' })
- const { DELETE } = await import('./route')
+ const { DELETE } = await import('@/app/api/folders/[id]/route')
const response = await DELETE(req, { params })
@@ -512,7 +512,7 @@ describe('Individual Folder API Route', () => {
const req = createMockRequest('DELETE')
const params = Promise.resolve({ id: 'folder-1' })
- const { DELETE } = await import('./route')
+ const { DELETE } = await import('@/app/api/folders/[id]/route')
const response = await DELETE(req, { params })
@@ -533,7 +533,7 @@ describe('Individual Folder API Route', () => {
const req = createMockRequest('DELETE')
const params = Promise.resolve({ id: 'folder-1' })
- const { DELETE } = await import('./route')
+ const { DELETE } = await import('@/app/api/folders/[id]/route')
const response = await DELETE(req, { params })
diff --git a/apps/sim/app/api/folders/route.test.ts b/apps/sim/app/api/folders/route.test.ts
index 3fa050167d..f05aff1e1a 100644
--- a/apps/sim/app/api/folders/route.test.ts
+++ b/apps/sim/app/api/folders/route.test.ts
@@ -101,7 +101,7 @@ describe('Folders API Route', () => {
value: 'http://localhost:3000/api/folders?workspaceId=workspace-123',
})
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/folders/route')
const response = await GET(mockRequest)
expect(response.status).toBe(200)
@@ -124,7 +124,7 @@ describe('Folders API Route', () => {
value: 'http://localhost:3000/api/folders?workspaceId=workspace-123',
})
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/folders/route')
const response = await GET(mockRequest)
expect(response.status).toBe(401)
@@ -141,7 +141,7 @@ describe('Folders API Route', () => {
value: 'http://localhost:3000/api/folders',
})
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/folders/route')
const response = await GET(mockRequest)
expect(response.status).toBe(400)
@@ -159,7 +159,7 @@ describe('Folders API Route', () => {
value: 'http://localhost:3000/api/folders?workspaceId=workspace-123',
})
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/folders/route')
const response = await GET(mockRequest)
expect(response.status).toBe(403)
@@ -177,7 +177,7 @@ describe('Folders API Route', () => {
value: 'http://localhost:3000/api/folders?workspaceId=workspace-123',
})
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/folders/route')
const response = await GET(mockRequest)
expect(response.status).toBe(200) // Should work for read permissions
@@ -198,7 +198,7 @@ describe('Folders API Route', () => {
value: 'http://localhost:3000/api/folders?workspaceId=workspace-123',
})
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/folders/route')
const response = await GET(mockRequest)
expect(response.status).toBe(500)
@@ -241,7 +241,7 @@ describe('Folders API Route', () => {
color: '#6B7280',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/folders/route')
const response = await POST(req)
expect(response.status).toBe(200)
@@ -283,7 +283,7 @@ describe('Folders API Route', () => {
workspaceId: 'workspace-123',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/folders/route')
const response = await POST(req)
expect(response.status).toBe(200)
@@ -310,7 +310,7 @@ describe('Folders API Route', () => {
parentId: 'folder-1',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/folders/route')
const response = await POST(req)
expect(response.status).toBe(200)
@@ -329,7 +329,7 @@ describe('Folders API Route', () => {
workspaceId: 'workspace-123',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/folders/route')
const response = await POST(req)
expect(response.status).toBe(401)
@@ -347,7 +347,7 @@ describe('Folders API Route', () => {
workspaceId: 'workspace-123',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/folders/route')
const response = await POST(req)
expect(response.status).toBe(403)
@@ -385,7 +385,7 @@ describe('Folders API Route', () => {
workspaceId: 'workspace-123',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/folders/route')
const response = await POST(req)
expect(response.status).toBe(200)
@@ -423,7 +423,7 @@ describe('Folders API Route', () => {
workspaceId: 'workspace-123',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/folders/route')
const response = await POST(req)
expect(response.status).toBe(200)
@@ -445,7 +445,7 @@ describe('Folders API Route', () => {
const req = createMockRequest('POST', body)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/folders/route')
const response = await POST(req)
expect(response.status).toBe(400)
@@ -468,7 +468,7 @@ describe('Folders API Route', () => {
workspaceId: 'workspace-123',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/folders/route')
const response = await POST(req)
expect(response.status).toBe(500)
@@ -513,7 +513,7 @@ describe('Folders API Route', () => {
workspaceId: 'workspace-123',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/folders/route')
await POST(req)
expect(capturedValues).not.toBeNull()
@@ -553,7 +553,7 @@ describe('Folders API Route', () => {
workspaceId: 'workspace-123',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/folders/route')
await POST(req)
expect(capturedValues).not.toBeNull()
diff --git a/apps/sim/app/api/function/execute/route.test.ts b/apps/sim/app/api/function/execute/route.test.ts
index 13ccd662ff..7ee1c5e70b 100644
--- a/apps/sim/app/api/function/execute/route.test.ts
+++ b/apps/sim/app/api/function/execute/route.test.ts
@@ -65,7 +65,7 @@ describe('Function Execute API Route', () => {
timeout: 5000,
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/function/execute/route')
const response = await POST(req)
const data = await response.json()
@@ -80,7 +80,7 @@ describe('Function Execute API Route', () => {
timeout: 5000,
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/function/execute/route')
const response = await POST(req)
const data = await response.json()
@@ -94,7 +94,7 @@ describe('Function Execute API Route', () => {
code: 'return "test"',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/function/execute/route')
const response = await POST(req)
expect(response.status).toBe(200)
@@ -116,7 +116,7 @@ describe('Function Execute API Route', () => {
},
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/function/execute/route')
const response = await POST(req)
expect(response.status).toBe(200)
@@ -131,7 +131,7 @@ describe('Function Execute API Route', () => {
},
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/function/execute/route')
const response = await POST(req)
expect(response.status).toBe(200)
@@ -149,7 +149,7 @@ describe('Function Execute API Route', () => {
},
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/function/execute/route')
const response = await POST(req)
expect(response.status).toBe(200)
@@ -165,7 +165,7 @@ describe('Function Execute API Route', () => {
},
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/function/execute/route')
const response = await POST(req)
expect(response.status).toBe(200)
@@ -199,7 +199,7 @@ describe('Function Execute API Route', () => {
params: gmailData,
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/function/execute/route')
const response = await POST(req)
expect(response.status).toBe(200)
@@ -221,7 +221,7 @@ describe('Function Execute API Route', () => {
params: complexEmailData,
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/function/execute/route')
const response = await POST(req)
expect(response.status).toBe(200)
@@ -234,7 +234,7 @@ describe('Function Execute API Route', () => {
code: 'return "freestyle test"',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/function/execute/route')
await POST(req)
expect(mockFreestyleExecuteScript).toHaveBeenCalled()
@@ -250,7 +250,7 @@ describe('Function Execute API Route', () => {
code: 'return "fallback test"',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/function/execute/route')
const response = await POST(req)
expect(mockFreestyleExecuteScript).toHaveBeenCalled()
@@ -271,7 +271,7 @@ describe('Function Execute API Route', () => {
code: 'return undefinedVariable',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/function/execute/route')
const response = await POST(req)
expect(response.status).toBe(500)
@@ -293,7 +293,7 @@ describe('Function Execute API Route', () => {
code: 'return "vm test"',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/function/execute/route')
await POST(req)
expect(mockFreestyleExecuteScript).not.toHaveBeenCalled()
@@ -319,7 +319,7 @@ describe('Function Execute API Route', () => {
code: 'return invalidCode(',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/function/execute/route')
const response = await POST(req)
expect(response.status).toBe(500)
@@ -339,7 +339,7 @@ describe('Function Execute API Route', () => {
isCustomTool: true,
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/function/execute/route')
const response = await POST(req)
expect(response.status).toBe(200)
@@ -355,7 +355,7 @@ describe('Function Execute API Route', () => {
headers: { 'Content-Type': 'application/json' },
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/function/execute/route')
const response = await POST(req)
expect(response.status).toBe(500)
@@ -367,7 +367,7 @@ describe('Function Execute API Route', () => {
timeout: 10000,
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/function/execute/route')
await POST(req)
expect(mockLogger.info).toHaveBeenCalledWith(
@@ -384,7 +384,7 @@ describe('Function Execute API Route', () => {
params: {},
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/function/execute/route')
const response = await POST(req)
expect(response.status).toBe(200)
@@ -417,7 +417,7 @@ SyntaxError: Invalid or unexpected token
timeout: 5000,
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/function/execute/route')
const response = await POST(req)
const data = await response.json()
@@ -460,7 +460,7 @@ SyntaxError: Invalid or unexpected token
timeout: 5000,
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/function/execute/route')
const response = await POST(req)
const data = await response.json()
@@ -501,7 +501,7 @@ SyntaxError: Invalid or unexpected token
timeout: 5000,
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/function/execute/route')
const response = await POST(req)
const data = await response.json()
@@ -531,7 +531,7 @@ SyntaxError: Invalid or unexpected token
timeout: 5000,
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/function/execute/route')
const response = await POST(req)
const data = await response.json()
@@ -567,7 +567,7 @@ SyntaxError: Invalid or unexpected token
timeout: 5000,
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/function/execute/route')
const response = await POST(req)
const data = await response.json()
@@ -598,7 +598,7 @@ SyntaxError: Invalid or unexpected token
timeout: 5000,
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/function/execute/route')
const response = await POST(req)
const data = await response.json()
@@ -620,7 +620,7 @@ SyntaxError: Invalid or unexpected token
},
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/function/execute/route')
const response = await POST(req)
expect(response.status).toBe(200)
@@ -644,7 +644,7 @@ SyntaxError: Invalid or unexpected token
},
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/function/execute/route')
const response = await POST(req)
expect(response.status).toBe(200)
@@ -705,7 +705,7 @@ describe('Function Execute API - Template Variable Edge Cases', () => {
},
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/function/execute/route')
const response = await POST(req)
const data = await response.json()
@@ -730,7 +730,7 @@ describe('Function Execute API - Template Variable Edge Cases', () => {
},
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/function/execute/route')
const response = await POST(req)
const data = await response.json()
@@ -752,7 +752,7 @@ describe('Function Execute API - Template Variable Edge Cases', () => {
params: {},
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/function/execute/route')
const response = await POST(req)
const data = await response.json()
diff --git a/apps/sim/app/api/jobs/[jobId]/route.ts b/apps/sim/app/api/jobs/[jobId]/route.ts
index f584782158..9b3f9172b7 100644
--- a/apps/sim/app/api/jobs/[jobId]/route.ts
+++ b/apps/sim/app/api/jobs/[jobId]/route.ts
@@ -7,8 +7,8 @@ import { db } from '@/db'
export const dynamic = 'force-dynamic'
+import { createErrorResponse } from '@/app/api/workflows/utils'
import { apiKey as apiKeyTable } from '@/db/schema'
-import { createErrorResponse } from '../../workflows/utils'
const logger = createLogger('TaskStatusAPI')
diff --git a/apps/sim/app/api/knowledge/[id]/documents/[documentId]/chunks/[chunkId]/route.ts b/apps/sim/app/api/knowledge/[id]/documents/[documentId]/chunks/[chunkId]/route.ts
index c064602e84..f453790ebe 100644
--- a/apps/sim/app/api/knowledge/[id]/documents/[documentId]/chunks/[chunkId]/route.ts
+++ b/apps/sim/app/api/knowledge/[id]/documents/[documentId]/chunks/[chunkId]/route.ts
@@ -7,9 +7,9 @@ import { createLogger } from '@/lib/logs/console/logger'
export const dynamic = 'force-dynamic'
+import { checkChunkAccess } from '@/app/api/knowledge/utils'
import { db } from '@/db'
import { document, embedding } from '@/db/schema'
-import { checkChunkAccess } from '../../../../../utils'
const logger = createLogger('ChunkByIdAPI')
diff --git a/apps/sim/app/api/knowledge/[id]/documents/[documentId]/chunks/route.test.ts b/apps/sim/app/api/knowledge/[id]/documents/[documentId]/chunks/route.test.ts
index 3078a726a8..3ebd69da29 100644
--- a/apps/sim/app/api/knowledge/[id]/documents/[documentId]/chunks/route.test.ts
+++ b/apps/sim/app/api/knowledge/[id]/documents/[documentId]/chunks/route.test.ts
@@ -153,7 +153,7 @@ describe('Knowledge Document Chunks API Route', () => {
})
const req = createMockRequest('POST', validChunkData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/[id]/documents/[documentId]/chunks/route')
const response = await POST(req, { params: mockParams })
const data = await response.json()
@@ -213,7 +213,7 @@ describe('Knowledge Document Chunks API Route', () => {
})
const req = createMockRequest('POST', workflowData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/[id]/documents/[documentId]/chunks/route')
const response = await POST(req, { params: mockParams })
const data = await response.json()
@@ -226,7 +226,7 @@ describe('Knowledge Document Chunks API Route', () => {
mockGetUserId.mockResolvedValue(null)
const req = createMockRequest('POST', validChunkData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/[id]/documents/[documentId]/chunks/route')
const response = await POST(req, { params: mockParams })
const data = await response.json()
@@ -243,7 +243,7 @@ describe('Knowledge Document Chunks API Route', () => {
mockGetUserId.mockResolvedValue(null)
const req = createMockRequest('POST', workflowData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/[id]/documents/[documentId]/chunks/route')
const response = await POST(req, { params: mockParams })
const data = await response.json()
@@ -262,7 +262,7 @@ describe('Knowledge Document Chunks API Route', () => {
})
const req = createMockRequest('POST', validChunkData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/[id]/documents/[documentId]/chunks/route')
const response = await POST(req, { params: mockParams })
const data = await response.json()
@@ -281,7 +281,7 @@ describe('Knowledge Document Chunks API Route', () => {
})
const req = createMockRequest('POST', validChunkData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/[id]/documents/[documentId]/chunks/route')
const response = await POST(req, { params: mockParams })
const data = await response.json()
@@ -303,7 +303,7 @@ describe('Knowledge Document Chunks API Route', () => {
} as any)
const req = createMockRequest('POST', validChunkData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/[id]/documents/[documentId]/chunks/route')
const response = await POST(req, { params: mockParams })
const data = await response.json()
@@ -326,7 +326,7 @@ describe('Knowledge Document Chunks API Route', () => {
}
const req = createMockRequest('POST', invalidData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/[id]/documents/[documentId]/chunks/route')
const response = await POST(req, { params: mockParams })
const data = await response.json()
@@ -367,7 +367,7 @@ describe('Knowledge Document Chunks API Route', () => {
})
const req = createMockRequest('POST', validChunkData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/[id]/documents/[documentId]/chunks/route')
await POST(req, { params: mockParams })
expect(mockTx.values).toHaveBeenCalled()
diff --git a/apps/sim/app/api/knowledge/[id]/documents/[documentId]/route.test.ts b/apps/sim/app/api/knowledge/[id]/documents/[documentId]/route.test.ts
index 42b51610db..148b793e5a 100644
--- a/apps/sim/app/api/knowledge/[id]/documents/[documentId]/route.test.ts
+++ b/apps/sim/app/api/knowledge/[id]/documents/[documentId]/route.test.ts
@@ -14,7 +14,7 @@ import {
mockKnowledgeSchemas()
-vi.mock('../../../utils', () => ({
+vi.mock('@/app/api/knowledge/utils', () => ({
checkKnowledgeBaseAccess: vi.fn(),
checkKnowledgeBaseWriteAccess: vi.fn(),
checkDocumentAccess: vi.fn(),
@@ -98,7 +98,7 @@ describe('Document By ID API Route', () => {
const mockParams = Promise.resolve({ id: 'kb-123', documentId: 'doc-123' })
it('should retrieve document successfully for authenticated user', async () => {
- const { checkDocumentAccess } = await import('../../../utils')
+ const { checkDocumentAccess } = await import('@/app/api/knowledge/utils')
mockAuth$.mockAuthenticatedUser()
vi.mocked(checkDocumentAccess).mockResolvedValue({
@@ -108,7 +108,7 @@ describe('Document By ID API Route', () => {
})
const req = createMockRequest('GET')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/knowledge/[id]/documents/[documentId]/route')
const response = await GET(req, { params: mockParams })
const data = await response.json()
@@ -123,7 +123,7 @@ describe('Document By ID API Route', () => {
mockAuth$.mockUnauthenticated()
const req = createMockRequest('GET')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/knowledge/[id]/documents/[documentId]/route')
const response = await GET(req, { params: mockParams })
const data = await response.json()
@@ -132,7 +132,7 @@ describe('Document By ID API Route', () => {
})
it('should return not found for non-existent document', async () => {
- const { checkDocumentAccess } = await import('../../../utils')
+ const { checkDocumentAccess } = await import('@/app/api/knowledge/utils')
mockAuth$.mockAuthenticatedUser()
vi.mocked(checkDocumentAccess).mockResolvedValue({
@@ -142,7 +142,7 @@ describe('Document By ID API Route', () => {
})
const req = createMockRequest('GET')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/knowledge/[id]/documents/[documentId]/route')
const response = await GET(req, { params: mockParams })
const data = await response.json()
@@ -151,7 +151,7 @@ describe('Document By ID API Route', () => {
})
it('should return unauthorized for document without access', async () => {
- const { checkDocumentAccess } = await import('../../../utils')
+ const { checkDocumentAccess } = await import('@/app/api/knowledge/utils')
mockAuth$.mockAuthenticatedUser()
vi.mocked(checkDocumentAccess).mockResolvedValue({
@@ -160,7 +160,7 @@ describe('Document By ID API Route', () => {
})
const req = createMockRequest('GET')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/knowledge/[id]/documents/[documentId]/route')
const response = await GET(req, { params: mockParams })
const data = await response.json()
@@ -169,13 +169,13 @@ describe('Document By ID API Route', () => {
})
it('should handle database errors', async () => {
- const { checkDocumentAccess } = await import('../../../utils')
+ const { checkDocumentAccess } = await import('@/app/api/knowledge/utils')
mockAuth$.mockAuthenticatedUser()
vi.mocked(checkDocumentAccess).mockRejectedValue(new Error('Database error'))
const req = createMockRequest('GET')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/knowledge/[id]/documents/[documentId]/route')
const response = await GET(req, { params: mockParams })
const data = await response.json()
@@ -194,7 +194,7 @@ describe('Document By ID API Route', () => {
}
it('should update document successfully', async () => {
- const { checkDocumentWriteAccess } = await import('../../../utils')
+ const { checkDocumentWriteAccess } = await import('@/app/api/knowledge/utils')
mockAuth$.mockAuthenticatedUser()
vi.mocked(checkDocumentWriteAccess).mockResolvedValue({
@@ -223,7 +223,7 @@ describe('Document By ID API Route', () => {
mockDbChain.select.mockReturnValue(selectChain)
const req = createMockRequest('PUT', validUpdateData)
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/knowledge/[id]/documents/[documentId]/route')
const response = await PUT(req, { params: mockParams })
const data = await response.json()
@@ -236,7 +236,7 @@ describe('Document By ID API Route', () => {
})
it('should validate update data', async () => {
- const { checkDocumentWriteAccess } = await import('../../../utils')
+ const { checkDocumentWriteAccess } = await import('@/app/api/knowledge/utils')
mockAuth$.mockAuthenticatedUser()
vi.mocked(checkDocumentWriteAccess).mockResolvedValue({
@@ -252,7 +252,7 @@ describe('Document By ID API Route', () => {
}
const req = createMockRequest('PUT', invalidData)
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/knowledge/[id]/documents/[documentId]/route')
const response = await PUT(req, { params: mockParams })
const data = await response.json()
@@ -266,7 +266,7 @@ describe('Document By ID API Route', () => {
const mockParams = Promise.resolve({ id: 'kb-123', documentId: 'doc-123' })
it('should mark document as failed due to timeout successfully', async () => {
- const { checkDocumentWriteAccess } = await import('../../../utils')
+ const { checkDocumentWriteAccess } = await import('@/app/api/knowledge/utils')
const processingDocument = {
...mockDocument,
@@ -303,7 +303,7 @@ describe('Document By ID API Route', () => {
mockDbChain.select.mockReturnValue(selectChain)
const req = createMockRequest('PUT', { markFailedDueToTimeout: true })
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/knowledge/[id]/documents/[documentId]/route')
const response = await PUT(req, { params: mockParams })
const data = await response.json()
@@ -320,7 +320,7 @@ describe('Document By ID API Route', () => {
})
it('should reject marking failed for non-processing document', async () => {
- const { checkDocumentWriteAccess } = await import('../../../utils')
+ const { checkDocumentWriteAccess } = await import('@/app/api/knowledge/utils')
mockAuth$.mockAuthenticatedUser()
vi.mocked(checkDocumentWriteAccess).mockResolvedValue({
@@ -330,7 +330,7 @@ describe('Document By ID API Route', () => {
})
const req = createMockRequest('PUT', { markFailedDueToTimeout: true })
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/knowledge/[id]/documents/[documentId]/route')
const response = await PUT(req, { params: mockParams })
const data = await response.json()
@@ -339,7 +339,7 @@ describe('Document By ID API Route', () => {
})
it('should reject marking failed for recently started processing', async () => {
- const { checkDocumentWriteAccess } = await import('../../../utils')
+ const { checkDocumentWriteAccess } = await import('@/app/api/knowledge/utils')
const recentProcessingDocument = {
...mockDocument,
@@ -355,7 +355,7 @@ describe('Document By ID API Route', () => {
})
const req = createMockRequest('PUT', { markFailedDueToTimeout: true })
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/knowledge/[id]/documents/[documentId]/route')
const response = await PUT(req, { params: mockParams })
const data = await response.json()
@@ -368,7 +368,9 @@ describe('Document By ID API Route', () => {
const mockParams = Promise.resolve({ id: 'kb-123', documentId: 'doc-123' })
it('should retry processing successfully', async () => {
- const { checkDocumentWriteAccess, processDocumentAsync } = await import('../../../utils')
+ const { checkDocumentWriteAccess, processDocumentAsync } = await import(
+ '@/app/api/knowledge/utils'
+ )
const failedDocument = {
...mockDocument,
@@ -401,7 +403,7 @@ describe('Document By ID API Route', () => {
vi.mocked(processDocumentAsync).mockResolvedValue(undefined)
const req = createMockRequest('PUT', { retryProcessing: true })
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/knowledge/[id]/documents/[documentId]/route')
const response = await PUT(req, { params: mockParams })
const data = await response.json()
@@ -414,7 +416,7 @@ describe('Document By ID API Route', () => {
})
it('should reject retry for non-failed document', async () => {
- const { checkDocumentWriteAccess } = await import('../../../utils')
+ const { checkDocumentWriteAccess } = await import('@/app/api/knowledge/utils')
mockAuth$.mockAuthenticatedUser()
vi.mocked(checkDocumentWriteAccess).mockResolvedValue({
@@ -424,7 +426,7 @@ describe('Document By ID API Route', () => {
})
const req = createMockRequest('PUT', { retryProcessing: true })
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/knowledge/[id]/documents/[documentId]/route')
const response = await PUT(req, { params: mockParams })
const data = await response.json()
@@ -441,7 +443,7 @@ describe('Document By ID API Route', () => {
mockAuth$.mockUnauthenticated()
const req = createMockRequest('PUT', validUpdateData)
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/knowledge/[id]/documents/[documentId]/route')
const response = await PUT(req, { params: mockParams })
const data = await response.json()
@@ -450,7 +452,7 @@ describe('Document By ID API Route', () => {
})
it('should return not found for non-existent document', async () => {
- const { checkDocumentWriteAccess } = await import('../../../utils')
+ const { checkDocumentWriteAccess } = await import('@/app/api/knowledge/utils')
mockAuth$.mockAuthenticatedUser()
vi.mocked(checkDocumentWriteAccess).mockResolvedValue({
@@ -460,7 +462,7 @@ describe('Document By ID API Route', () => {
})
const req = createMockRequest('PUT', validUpdateData)
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/knowledge/[id]/documents/[documentId]/route')
const response = await PUT(req, { params: mockParams })
const data = await response.json()
@@ -469,7 +471,7 @@ describe('Document By ID API Route', () => {
})
it('should handle database errors during update', async () => {
- const { checkDocumentWriteAccess } = await import('../../../utils')
+ const { checkDocumentWriteAccess } = await import('@/app/api/knowledge/utils')
mockAuth$.mockAuthenticatedUser()
vi.mocked(checkDocumentWriteAccess).mockResolvedValue({
@@ -480,7 +482,7 @@ describe('Document By ID API Route', () => {
mockDbChain.set.mockRejectedValue(new Error('Database error'))
const req = createMockRequest('PUT', validUpdateData)
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/knowledge/[id]/documents/[documentId]/route')
const response = await PUT(req, { params: mockParams })
const data = await response.json()
@@ -493,7 +495,7 @@ describe('Document By ID API Route', () => {
const mockParams = Promise.resolve({ id: 'kb-123', documentId: 'doc-123' })
it('should delete document successfully', async () => {
- const { checkDocumentWriteAccess } = await import('../../../utils')
+ const { checkDocumentWriteAccess } = await import('@/app/api/knowledge/utils')
mockAuth$.mockAuthenticatedUser()
vi.mocked(checkDocumentWriteAccess).mockResolvedValue({
@@ -508,7 +510,7 @@ describe('Document By ID API Route', () => {
mockDbChain.where.mockResolvedValue(undefined) // Update operation resolves
const req = createMockRequest('DELETE')
- const { DELETE } = await import('./route')
+ const { DELETE } = await import('@/app/api/knowledge/[id]/documents/[documentId]/route')
const response = await DELETE(req, { params: mockParams })
const data = await response.json()
@@ -527,7 +529,7 @@ describe('Document By ID API Route', () => {
mockAuth$.mockUnauthenticated()
const req = createMockRequest('DELETE')
- const { DELETE } = await import('./route')
+ const { DELETE } = await import('@/app/api/knowledge/[id]/documents/[documentId]/route')
const response = await DELETE(req, { params: mockParams })
const data = await response.json()
@@ -536,7 +538,7 @@ describe('Document By ID API Route', () => {
})
it('should return not found for non-existent document', async () => {
- const { checkDocumentWriteAccess } = await import('../../../utils')
+ const { checkDocumentWriteAccess } = await import('@/app/api/knowledge/utils')
mockAuth$.mockAuthenticatedUser()
vi.mocked(checkDocumentWriteAccess).mockResolvedValue({
@@ -546,7 +548,7 @@ describe('Document By ID API Route', () => {
})
const req = createMockRequest('DELETE')
- const { DELETE } = await import('./route')
+ const { DELETE } = await import('@/app/api/knowledge/[id]/documents/[documentId]/route')
const response = await DELETE(req, { params: mockParams })
const data = await response.json()
@@ -555,7 +557,7 @@ describe('Document By ID API Route', () => {
})
it('should return unauthorized for document without access', async () => {
- const { checkDocumentWriteAccess } = await import('../../../utils')
+ const { checkDocumentWriteAccess } = await import('@/app/api/knowledge/utils')
mockAuth$.mockAuthenticatedUser()
vi.mocked(checkDocumentWriteAccess).mockResolvedValue({
@@ -564,7 +566,7 @@ describe('Document By ID API Route', () => {
})
const req = createMockRequest('DELETE')
- const { DELETE } = await import('./route')
+ const { DELETE } = await import('@/app/api/knowledge/[id]/documents/[documentId]/route')
const response = await DELETE(req, { params: mockParams })
const data = await response.json()
@@ -573,7 +575,7 @@ describe('Document By ID API Route', () => {
})
it('should handle database errors during deletion', async () => {
- const { checkDocumentWriteAccess } = await import('../../../utils')
+ const { checkDocumentWriteAccess } = await import('@/app/api/knowledge/utils')
mockAuth$.mockAuthenticatedUser()
vi.mocked(checkDocumentWriteAccess).mockResolvedValue({
@@ -584,7 +586,7 @@ describe('Document By ID API Route', () => {
mockDbChain.set.mockRejectedValue(new Error('Database error'))
const req = createMockRequest('DELETE')
- const { DELETE } = await import('./route')
+ const { DELETE } = await import('@/app/api/knowledge/[id]/documents/[documentId]/route')
const response = await DELETE(req, { params: mockParams })
const data = await response.json()
diff --git a/apps/sim/app/api/knowledge/[id]/documents/[documentId]/route.ts b/apps/sim/app/api/knowledge/[id]/documents/[documentId]/route.ts
index 6dcc508811..dbf5b6fcfd 100644
--- a/apps/sim/app/api/knowledge/[id]/documents/[documentId]/route.ts
+++ b/apps/sim/app/api/knowledge/[id]/documents/[documentId]/route.ts
@@ -6,9 +6,13 @@ import { createLogger } from '@/lib/logs/console/logger'
export const dynamic = 'force-dynamic'
+import {
+ checkDocumentAccess,
+ checkDocumentWriteAccess,
+ processDocumentAsync,
+} from '@/app/api/knowledge/utils'
import { db } from '@/db'
import { document, embedding } from '@/db/schema'
-import { checkDocumentAccess, checkDocumentWriteAccess, processDocumentAsync } from '../../../utils'
const logger = createLogger('DocumentByIdAPI')
diff --git a/apps/sim/app/api/knowledge/[id]/documents/route.test.ts b/apps/sim/app/api/knowledge/[id]/documents/route.test.ts
index b42dac2bec..c27bec231d 100644
--- a/apps/sim/app/api/knowledge/[id]/documents/route.test.ts
+++ b/apps/sim/app/api/knowledge/[id]/documents/route.test.ts
@@ -14,7 +14,7 @@ import {
mockKnowledgeSchemas()
-vi.mock('../../utils', () => ({
+vi.mock('@/app/api/knowledge/utils', () => ({
checkKnowledgeBaseAccess: vi.fn(),
checkKnowledgeBaseWriteAccess: vi.fn(),
checkDocumentAccess: vi.fn(),
@@ -95,10 +95,13 @@ describe('Knowledge Base Documents API Route', () => {
const mockParams = Promise.resolve({ id: 'kb-123' })
it('should retrieve documents successfully for authenticated user', async () => {
- const { checkKnowledgeBaseAccess } = await import('../../utils')
+ const { checkKnowledgeBaseAccess } = await import('@/app/api/knowledge/utils')
mockAuth$.mockAuthenticatedUser()
- vi.mocked(checkKnowledgeBaseAccess).mockResolvedValue({ hasAccess: true })
+ vi.mocked(checkKnowledgeBaseAccess).mockResolvedValue({
+ hasAccess: true,
+ knowledgeBase: { id: 'kb-123', userId: 'user-123' },
+ })
// Mock the count query (first query)
mockDbChain.where.mockResolvedValueOnce([{ count: 1 }])
@@ -107,7 +110,7 @@ describe('Knowledge Base Documents API Route', () => {
mockDbChain.offset.mockResolvedValue([mockDocument])
const req = createMockRequest('GET')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/knowledge/[id]/documents/route')
const response = await GET(req, { params: mockParams })
const data = await response.json()
@@ -120,10 +123,13 @@ describe('Knowledge Base Documents API Route', () => {
})
it('should filter disabled documents by default', async () => {
- const { checkKnowledgeBaseAccess } = await import('../../utils')
+ const { checkKnowledgeBaseAccess } = await import('@/app/api/knowledge/utils')
mockAuth$.mockAuthenticatedUser()
- vi.mocked(checkKnowledgeBaseAccess).mockResolvedValue({ hasAccess: true })
+ vi.mocked(checkKnowledgeBaseAccess).mockResolvedValue({
+ hasAccess: true,
+ knowledgeBase: { id: 'kb-123', userId: 'user-123' },
+ })
// Mock the count query (first query)
mockDbChain.where.mockResolvedValueOnce([{ count: 1 }])
@@ -132,7 +138,7 @@ describe('Knowledge Base Documents API Route', () => {
mockDbChain.offset.mockResolvedValue([mockDocument])
const req = createMockRequest('GET')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/knowledge/[id]/documents/route')
const response = await GET(req, { params: mockParams })
expect(response.status).toBe(200)
@@ -140,10 +146,13 @@ describe('Knowledge Base Documents API Route', () => {
})
it('should include disabled documents when requested', async () => {
- const { checkKnowledgeBaseAccess } = await import('../../utils')
+ const { checkKnowledgeBaseAccess } = await import('@/app/api/knowledge/utils')
mockAuth$.mockAuthenticatedUser()
- vi.mocked(checkKnowledgeBaseAccess).mockResolvedValue({ hasAccess: true })
+ vi.mocked(checkKnowledgeBaseAccess).mockResolvedValue({
+ hasAccess: true,
+ knowledgeBase: { id: 'kb-123', userId: 'user-123' },
+ })
// Mock the count query (first query)
mockDbChain.where.mockResolvedValueOnce([{ count: 1 }])
@@ -154,7 +163,7 @@ describe('Knowledge Base Documents API Route', () => {
const url = 'http://localhost:3000/api/knowledge/kb-123/documents?includeDisabled=true'
const req = new Request(url, { method: 'GET' }) as any
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/knowledge/[id]/documents/route')
const response = await GET(req, { params: mockParams })
expect(response.status).toBe(200)
@@ -164,7 +173,7 @@ describe('Knowledge Base Documents API Route', () => {
mockAuth$.mockUnauthenticated()
const req = createMockRequest('GET')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/knowledge/[id]/documents/route')
const response = await GET(req, { params: mockParams })
const data = await response.json()
@@ -173,13 +182,16 @@ describe('Knowledge Base Documents API Route', () => {
})
it('should return not found for non-existent knowledge base', async () => {
- const { checkKnowledgeBaseAccess } = await import('../../utils')
+ const { checkKnowledgeBaseAccess } = await import('@/app/api/knowledge/utils')
mockAuth$.mockAuthenticatedUser()
- vi.mocked(checkKnowledgeBaseAccess).mockResolvedValue({ hasAccess: false, notFound: true })
+ vi.mocked(checkKnowledgeBaseAccess).mockResolvedValue({
+ hasAccess: false,
+ notFound: true,
+ })
const req = createMockRequest('GET')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/knowledge/[id]/documents/route')
const response = await GET(req, { params: mockParams })
const data = await response.json()
@@ -188,13 +200,13 @@ describe('Knowledge Base Documents API Route', () => {
})
it('should return unauthorized for knowledge base without access', async () => {
- const { checkKnowledgeBaseAccess } = await import('../../utils')
+ const { checkKnowledgeBaseAccess } = await import('@/app/api/knowledge/utils')
mockAuth$.mockAuthenticatedUser()
vi.mocked(checkKnowledgeBaseAccess).mockResolvedValue({ hasAccess: false })
const req = createMockRequest('GET')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/knowledge/[id]/documents/route')
const response = await GET(req, { params: mockParams })
const data = await response.json()
@@ -203,14 +215,17 @@ describe('Knowledge Base Documents API Route', () => {
})
it('should handle database errors', async () => {
- const { checkKnowledgeBaseAccess } = await import('../../utils')
+ const { checkKnowledgeBaseAccess } = await import('@/app/api/knowledge/utils')
mockAuth$.mockAuthenticatedUser()
- vi.mocked(checkKnowledgeBaseAccess).mockResolvedValue({ hasAccess: true })
+ vi.mocked(checkKnowledgeBaseAccess).mockResolvedValue({
+ hasAccess: true,
+ knowledgeBase: { id: 'kb-123', userId: 'user-123' },
+ })
mockDbChain.orderBy.mockRejectedValue(new Error('Database error'))
const req = createMockRequest('GET')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/knowledge/[id]/documents/route')
const response = await GET(req, { params: mockParams })
const data = await response.json()
@@ -229,14 +244,17 @@ describe('Knowledge Base Documents API Route', () => {
}
it('should create single document successfully', async () => {
- const { checkKnowledgeBaseWriteAccess } = await import('../../utils')
+ const { checkKnowledgeBaseWriteAccess } = await import('@/app/api/knowledge/utils')
mockAuth$.mockAuthenticatedUser()
- vi.mocked(checkKnowledgeBaseWriteAccess).mockResolvedValue({ hasAccess: true })
+ vi.mocked(checkKnowledgeBaseWriteAccess).mockResolvedValue({
+ hasAccess: true,
+ knowledgeBase: { id: 'kb-123', userId: 'user-123' },
+ })
mockDbChain.values.mockResolvedValue(undefined)
const req = createMockRequest('POST', validDocumentData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/[id]/documents/route')
const response = await POST(req, { params: mockParams })
const data = await response.json()
@@ -248,10 +266,13 @@ describe('Knowledge Base Documents API Route', () => {
})
it('should validate single document data', async () => {
- const { checkKnowledgeBaseWriteAccess } = await import('../../utils')
+ const { checkKnowledgeBaseWriteAccess } = await import('@/app/api/knowledge/utils')
mockAuth$.mockAuthenticatedUser()
- vi.mocked(checkKnowledgeBaseWriteAccess).mockResolvedValue({ hasAccess: true })
+ vi.mocked(checkKnowledgeBaseWriteAccess).mockResolvedValue({
+ hasAccess: true,
+ knowledgeBase: { id: 'kb-123', userId: 'user-123' },
+ })
const invalidData = {
filename: '', // Invalid: empty filename
@@ -261,7 +282,7 @@ describe('Knowledge Base Documents API Route', () => {
}
const req = createMockRequest('POST', invalidData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/[id]/documents/route')
const response = await POST(req, { params: mockParams })
const data = await response.json()
@@ -299,10 +320,15 @@ describe('Knowledge Base Documents API Route', () => {
}
it('should create bulk documents successfully', async () => {
- const { checkKnowledgeBaseWriteAccess, processDocumentAsync } = await import('../../utils')
+ const { checkKnowledgeBaseWriteAccess, processDocumentAsync } = await import(
+ '@/app/api/knowledge/utils'
+ )
mockAuth$.mockAuthenticatedUser()
- vi.mocked(checkKnowledgeBaseWriteAccess).mockResolvedValue({ hasAccess: true })
+ vi.mocked(checkKnowledgeBaseWriteAccess).mockResolvedValue({
+ hasAccess: true,
+ knowledgeBase: { id: 'kb-123', userId: 'user-123' },
+ })
// Mock transaction to return the created documents
mockDbChain.transaction.mockImplementation(async (callback) => {
@@ -317,7 +343,7 @@ describe('Knowledge Base Documents API Route', () => {
vi.mocked(processDocumentAsync).mockResolvedValue(undefined)
const req = createMockRequest('POST', validBulkData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/[id]/documents/route')
const response = await POST(req, { params: mockParams })
const data = await response.json()
@@ -330,10 +356,13 @@ describe('Knowledge Base Documents API Route', () => {
})
it('should validate bulk document data', async () => {
- const { checkKnowledgeBaseWriteAccess } = await import('../../utils')
+ const { checkKnowledgeBaseWriteAccess } = await import('@/app/api/knowledge/utils')
mockAuth$.mockAuthenticatedUser()
- vi.mocked(checkKnowledgeBaseWriteAccess).mockResolvedValue({ hasAccess: true })
+ vi.mocked(checkKnowledgeBaseWriteAccess).mockResolvedValue({
+ hasAccess: true,
+ knowledgeBase: { id: 'kb-123', userId: 'user-123' },
+ })
const invalidBulkData = {
bulk: true,
@@ -355,7 +384,7 @@ describe('Knowledge Base Documents API Route', () => {
}
const req = createMockRequest('POST', invalidBulkData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/[id]/documents/route')
const response = await POST(req, { params: mockParams })
const data = await response.json()
@@ -365,10 +394,15 @@ describe('Knowledge Base Documents API Route', () => {
})
it('should handle processing errors gracefully', async () => {
- const { checkKnowledgeBaseWriteAccess, processDocumentAsync } = await import('../../utils')
+ const { checkKnowledgeBaseWriteAccess, processDocumentAsync } = await import(
+ '@/app/api/knowledge/utils'
+ )
mockAuth$.mockAuthenticatedUser()
- vi.mocked(checkKnowledgeBaseWriteAccess).mockResolvedValue({ hasAccess: true })
+ vi.mocked(checkKnowledgeBaseWriteAccess).mockResolvedValue({
+ hasAccess: true,
+ knowledgeBase: { id: 'kb-123', userId: 'user-123' },
+ })
// Mock transaction to succeed but processing to fail
mockDbChain.transaction.mockImplementation(async (callback) => {
@@ -384,7 +418,7 @@ describe('Knowledge Base Documents API Route', () => {
vi.mocked(processDocumentAsync).mockResolvedValue(undefined)
const req = createMockRequest('POST', validBulkData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/[id]/documents/route')
const response = await POST(req, { params: mockParams })
const data = await response.json()
@@ -408,7 +442,7 @@ describe('Knowledge Base Documents API Route', () => {
mockAuth$.mockUnauthenticated()
const req = createMockRequest('POST', validDocumentData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/[id]/documents/route')
const response = await POST(req, { params: mockParams })
const data = await response.json()
@@ -417,7 +451,7 @@ describe('Knowledge Base Documents API Route', () => {
})
it('should return not found for non-existent knowledge base', async () => {
- const { checkKnowledgeBaseWriteAccess } = await import('../../utils')
+ const { checkKnowledgeBaseWriteAccess } = await import('@/app/api/knowledge/utils')
mockAuth$.mockAuthenticatedUser()
vi.mocked(checkKnowledgeBaseWriteAccess).mockResolvedValue({
@@ -426,7 +460,7 @@ describe('Knowledge Base Documents API Route', () => {
})
const req = createMockRequest('POST', validDocumentData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/[id]/documents/route')
const response = await POST(req, { params: mockParams })
const data = await response.json()
@@ -435,13 +469,13 @@ describe('Knowledge Base Documents API Route', () => {
})
it('should return unauthorized for knowledge base without access', async () => {
- const { checkKnowledgeBaseWriteAccess } = await import('../../utils')
+ const { checkKnowledgeBaseWriteAccess } = await import('@/app/api/knowledge/utils')
mockAuth$.mockAuthenticatedUser()
vi.mocked(checkKnowledgeBaseWriteAccess).mockResolvedValue({ hasAccess: false })
const req = createMockRequest('POST', validDocumentData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/[id]/documents/route')
const response = await POST(req, { params: mockParams })
const data = await response.json()
@@ -450,14 +484,17 @@ describe('Knowledge Base Documents API Route', () => {
})
it('should handle database errors during creation', async () => {
- const { checkKnowledgeBaseWriteAccess } = await import('../../utils')
+ const { checkKnowledgeBaseWriteAccess } = await import('@/app/api/knowledge/utils')
mockAuth$.mockAuthenticatedUser()
- vi.mocked(checkKnowledgeBaseWriteAccess).mockResolvedValue({ hasAccess: true })
+ vi.mocked(checkKnowledgeBaseWriteAccess).mockResolvedValue({
+ hasAccess: true,
+ knowledgeBase: { id: 'kb-123', userId: 'user-123' },
+ })
mockDbChain.values.mockRejectedValue(new Error('Database error'))
const req = createMockRequest('POST', validDocumentData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/[id]/documents/route')
const response = await POST(req, { params: mockParams })
const data = await response.json()
diff --git a/apps/sim/app/api/knowledge/[id]/documents/route.ts b/apps/sim/app/api/knowledge/[id]/documents/route.ts
index dbe49c2afd..330bf77aa9 100644
--- a/apps/sim/app/api/knowledge/[id]/documents/route.ts
+++ b/apps/sim/app/api/knowledge/[id]/documents/route.ts
@@ -5,13 +5,13 @@ import { z } from 'zod'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
import { getUserId } from '@/app/api/auth/oauth/utils'
-import { db } from '@/db'
-import { document } from '@/db/schema'
import {
checkKnowledgeBaseAccess,
checkKnowledgeBaseWriteAccess,
processDocumentAsync,
-} from '../../utils'
+} from '@/app/api/knowledge/utils'
+import { db } from '@/db'
+import { document } from '@/db/schema'
const logger = createLogger('DocumentsAPI')
diff --git a/apps/sim/app/api/knowledge/[id]/route.test.ts b/apps/sim/app/api/knowledge/[id]/route.test.ts
index 97cf4c2395..33150b8a5b 100644
--- a/apps/sim/app/api/knowledge/[id]/route.test.ts
+++ b/apps/sim/app/api/knowledge/[id]/route.test.ts
@@ -79,7 +79,7 @@ describe('Knowledge Base By ID API Route', () => {
mockDbChain.limit.mockResolvedValueOnce([mockKnowledgeBase])
const req = createMockRequest('GET')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/knowledge/[id]/route')
const response = await GET(req, { params: mockParams })
const data = await response.json()
@@ -94,7 +94,7 @@ describe('Knowledge Base By ID API Route', () => {
mockAuth$.mockUnauthenticated()
const req = createMockRequest('GET')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/knowledge/[id]/route')
const response = await GET(req, { params: mockParams })
const data = await response.json()
@@ -108,7 +108,7 @@ describe('Knowledge Base By ID API Route', () => {
mockDbChain.limit.mockResolvedValueOnce([])
const req = createMockRequest('GET')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/knowledge/[id]/route')
const response = await GET(req, { params: mockParams })
const data = await response.json()
@@ -122,7 +122,7 @@ describe('Knowledge Base By ID API Route', () => {
mockDbChain.limit.mockResolvedValueOnce([{ id: 'kb-123', userId: 'different-user' }])
const req = createMockRequest('GET')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/knowledge/[id]/route')
const response = await GET(req, { params: mockParams })
const data = await response.json()
@@ -135,7 +135,7 @@ describe('Knowledge Base By ID API Route', () => {
mockDbChain.limit.mockRejectedValueOnce(new Error('Database error'))
const req = createMockRequest('GET')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/knowledge/[id]/route')
const response = await GET(req, { params: mockParams })
const data = await response.json()
@@ -165,7 +165,7 @@ describe('Knowledge Base By ID API Route', () => {
mockDbChain.limit.mockResolvedValueOnce([{ ...mockKnowledgeBase, ...validUpdateData }])
const req = createMockRequest('PUT', validUpdateData)
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/knowledge/[id]/route')
const response = await PUT(req, { params: mockParams })
const data = await response.json()
@@ -179,7 +179,7 @@ describe('Knowledge Base By ID API Route', () => {
mockAuth$.mockUnauthenticated()
const req = createMockRequest('PUT', validUpdateData)
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/knowledge/[id]/route')
const response = await PUT(req, { params: mockParams })
const data = await response.json()
@@ -196,7 +196,7 @@ describe('Knowledge Base By ID API Route', () => {
mockDbChain.limit.mockResolvedValueOnce([])
const req = createMockRequest('PUT', validUpdateData)
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/knowledge/[id]/route')
const response = await PUT(req, { params: mockParams })
const data = await response.json()
@@ -217,7 +217,7 @@ describe('Knowledge Base By ID API Route', () => {
}
const req = createMockRequest('PUT', invalidData)
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/knowledge/[id]/route')
const response = await PUT(req, { params: mockParams })
const data = await response.json()
@@ -234,7 +234,7 @@ describe('Knowledge Base By ID API Route', () => {
mockDbChain.where.mockRejectedValueOnce(new Error('Database error'))
const req = createMockRequest('PUT', validUpdateData)
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/knowledge/[id]/route')
const response = await PUT(req, { params: mockParams })
const data = await response.json()
@@ -257,7 +257,7 @@ describe('Knowledge Base By ID API Route', () => {
mockDbChain.where.mockResolvedValueOnce(undefined)
const req = createMockRequest('DELETE')
- const { DELETE } = await import('./route')
+ const { DELETE } = await import('@/app/api/knowledge/[id]/route')
const response = await DELETE(req, { params: mockParams })
const data = await response.json()
@@ -271,7 +271,7 @@ describe('Knowledge Base By ID API Route', () => {
mockAuth$.mockUnauthenticated()
const req = createMockRequest('DELETE')
- const { DELETE } = await import('./route')
+ const { DELETE } = await import('@/app/api/knowledge/[id]/route')
const response = await DELETE(req, { params: mockParams })
const data = await response.json()
@@ -288,7 +288,7 @@ describe('Knowledge Base By ID API Route', () => {
mockDbChain.limit.mockResolvedValueOnce([])
const req = createMockRequest('DELETE')
- const { DELETE } = await import('./route')
+ const { DELETE } = await import('@/app/api/knowledge/[id]/route')
const response = await DELETE(req, { params: mockParams })
const data = await response.json()
@@ -305,7 +305,7 @@ describe('Knowledge Base By ID API Route', () => {
mockDbChain.limit.mockResolvedValueOnce([{ id: 'kb-123', userId: 'different-user' }])
const req = createMockRequest('DELETE')
- const { DELETE } = await import('./route')
+ const { DELETE } = await import('@/app/api/knowledge/[id]/route')
const response = await DELETE(req, { params: mockParams })
const data = await response.json()
@@ -321,7 +321,7 @@ describe('Knowledge Base By ID API Route', () => {
mockDbChain.where.mockRejectedValueOnce(new Error('Database error'))
const req = createMockRequest('DELETE')
- const { DELETE } = await import('./route')
+ const { DELETE } = await import('@/app/api/knowledge/[id]/route')
const response = await DELETE(req, { params: mockParams })
const data = await response.json()
diff --git a/apps/sim/app/api/knowledge/route.test.ts b/apps/sim/app/api/knowledge/route.test.ts
index 5d19704e94..97218d77c0 100644
--- a/apps/sim/app/api/knowledge/route.test.ts
+++ b/apps/sim/app/api/knowledge/route.test.ts
@@ -60,7 +60,7 @@ describe('Knowledge Base API Route', () => {
mockAuth$.mockUnauthenticated()
const req = createMockRequest('GET')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/knowledge/route')
const response = await GET(req)
const data = await response.json()
@@ -73,7 +73,7 @@ describe('Knowledge Base API Route', () => {
mockDbChain.orderBy.mockRejectedValue(new Error('Database error'))
const req = createMockRequest('GET')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/knowledge/route')
const response = await GET(req)
const data = await response.json()
@@ -97,7 +97,7 @@ describe('Knowledge Base API Route', () => {
mockAuth$.mockAuthenticatedUser()
const req = createMockRequest('POST', validKnowledgeBaseData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/route')
const response = await POST(req)
const data = await response.json()
@@ -112,7 +112,7 @@ describe('Knowledge Base API Route', () => {
mockAuth$.mockUnauthenticated()
const req = createMockRequest('POST', validKnowledgeBaseData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/route')
const response = await POST(req)
const data = await response.json()
@@ -124,7 +124,7 @@ describe('Knowledge Base API Route', () => {
mockAuth$.mockAuthenticatedUser()
const req = createMockRequest('POST', { description: 'Missing name' })
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/route')
const response = await POST(req)
const data = await response.json()
@@ -146,7 +146,7 @@ describe('Knowledge Base API Route', () => {
}
const req = createMockRequest('POST', invalidData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/route')
const response = await POST(req)
const data = await response.json()
@@ -159,7 +159,7 @@ describe('Knowledge Base API Route', () => {
const minimalData = { name: 'Test KB' }
const req = createMockRequest('POST', minimalData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/route')
const response = await POST(req)
const data = await response.json()
@@ -178,7 +178,7 @@ describe('Knowledge Base API Route', () => {
mockDbChain.values.mockRejectedValue(new Error('Database error'))
const req = createMockRequest('POST', validKnowledgeBaseData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/route')
const response = await POST(req)
const data = await response.json()
diff --git a/apps/sim/app/api/knowledge/search/route.test.ts b/apps/sim/app/api/knowledge/search/route.test.ts
index a1405134d7..13a3a91012 100644
--- a/apps/sim/app/api/knowledge/search/route.test.ts
+++ b/apps/sim/app/api/knowledge/search/route.test.ts
@@ -154,7 +154,7 @@ describe('Knowledge Search API Route', () => {
})
const req = createMockRequest('POST', validSearchData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/search/route')
const response = await POST(req)
const data = await response.json()
@@ -200,7 +200,7 @@ describe('Knowledge Search API Route', () => {
})
const req = createMockRequest('POST', multiKbData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/search/route')
const response = await POST(req)
const data = await response.json()
@@ -234,7 +234,7 @@ describe('Knowledge Search API Route', () => {
})
const req = createMockRequest('POST', workflowData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/search/route')
const response = await POST(req)
const data = await response.json()
@@ -247,7 +247,7 @@ describe('Knowledge Search API Route', () => {
mockGetUserId.mockResolvedValue(null)
const req = createMockRequest('POST', validSearchData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/search/route')
const response = await POST(req)
const data = await response.json()
@@ -264,7 +264,7 @@ describe('Knowledge Search API Route', () => {
mockGetUserId.mockResolvedValue(null)
const req = createMockRequest('POST', workflowData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/search/route')
const response = await POST(req)
const data = await response.json()
@@ -282,7 +282,7 @@ describe('Knowledge Search API Route', () => {
})
const req = createMockRequest('POST', validSearchData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/search/route')
const response = await POST(req)
const data = await response.json()
@@ -304,7 +304,7 @@ describe('Knowledge Search API Route', () => {
.mockResolvedValueOnce({ hasAccess: false, notFound: true })
const req = createMockRequest('POST', multiKbData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/search/route')
const response = await POST(req)
const data = await response.json()
@@ -320,7 +320,7 @@ describe('Knowledge Search API Route', () => {
}
const req = createMockRequest('POST', invalidData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/search/route')
const response = await POST(req)
const data = await response.json()
@@ -354,7 +354,7 @@ describe('Knowledge Search API Route', () => {
})
const req = createMockRequest('POST', dataWithoutTopK)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/search/route')
const response = await POST(req)
const data = await response.json()
@@ -374,7 +374,7 @@ describe('Knowledge Search API Route', () => {
})
const req = createMockRequest('POST', validSearchData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/search/route')
const response = await POST(req)
const data = await response.json()
@@ -393,7 +393,7 @@ describe('Knowledge Search API Route', () => {
mockDbChain.limit.mockResolvedValueOnce(mockKnowledgeBases)
const req = createMockRequest('POST', validSearchData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/search/route')
const response = await POST(req)
const data = await response.json()
@@ -415,7 +415,7 @@ describe('Knowledge Search API Route', () => {
})
const req = createMockRequest('POST', validSearchData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/search/route')
const response = await POST(req)
const data = await response.json()
@@ -436,7 +436,7 @@ describe('Knowledge Search API Route', () => {
})
const req = createMockRequest('POST', validSearchData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/search/route')
const response = await POST(req)
const data = await response.json()
@@ -465,7 +465,7 @@ describe('Knowledge Search API Route', () => {
})
const req = createMockRequest('POST', validSearchData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/search/route')
const response = await POST(req)
const data = await response.json()
@@ -513,7 +513,7 @@ describe('Knowledge Search API Route', () => {
})
const req = createMockRequest('POST', validSearchData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/search/route')
await POST(req)
// Verify token estimation was called with correct parameters
@@ -570,7 +570,7 @@ describe('Knowledge Search API Route', () => {
})
const req = createMockRequest('POST', longQueryData)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/knowledge/search/route')
const response = await POST(req)
const data = await response.json()
diff --git a/apps/sim/app/api/knowledge/utils.test.ts b/apps/sim/app/api/knowledge/utils.test.ts
index c5f0421df6..9d9fc0d2d3 100644
--- a/apps/sim/app/api/knowledge/utils.test.ts
+++ b/apps/sim/app/api/knowledge/utils.test.ts
@@ -151,7 +151,7 @@ import {
checkKnowledgeBaseAccess,
generateEmbeddings,
processDocumentAsync,
-} from './utils'
+} from '@/app/api/knowledge/utils'
describe('Knowledge Utils', () => {
beforeEach(() => {
diff --git a/apps/sim/app/api/logs/cleanup/route.ts b/apps/sim/app/api/logs/cleanup/route.ts
index 373d2a42a6..5e7b9257af 100644
--- a/apps/sim/app/api/logs/cleanup/route.ts
+++ b/apps/sim/app/api/logs/cleanup/route.ts
@@ -11,7 +11,7 @@ import { subscription, user, workflow, workflowExecutionLogs } from '@/db/schema
export const dynamic = 'force-dynamic'
-const logger = createLogger('LogsCleanup')
+const logger = createLogger('LogsCleanupAPI')
const BATCH_SIZE = 2000
const S3_CONFIG = {
diff --git a/apps/sim/app/api/organizations/invitations/accept/route.ts b/apps/sim/app/api/organizations/invitations/accept/route.ts
index b13a6f1682..eb995ec4bd 100644
--- a/apps/sim/app/api/organizations/invitations/accept/route.ts
+++ b/apps/sim/app/api/organizations/invitations/accept/route.ts
@@ -7,7 +7,7 @@ import { createLogger } from '@/lib/logs/console/logger'
import { db } from '@/db'
import { invitation, member, permissions, workspaceInvitation } from '@/db/schema'
-const logger = createLogger('OrganizationInvitationAcceptance')
+const logger = createLogger('OrganizationInvitationAcceptanceAPI')
export const dynamic = 'force-dynamic'
diff --git a/apps/sim/app/api/schedules/[id]/status/route.test.ts b/apps/sim/app/api/schedules/[id]/status/route.test.ts
index 3a71190fb3..29d269ab0a 100644
--- a/apps/sim/app/api/schedules/[id]/status/route.test.ts
+++ b/apps/sim/app/api/schedules/[id]/status/route.test.ts
@@ -44,7 +44,7 @@ describe('Schedule Status API Route', () => {
const req = createMockRequest('GET')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/schedules/[id]/status/route')
const res = await GET(req, { params: Promise.resolve({ id: 'schedule-id' }) })
@@ -67,7 +67,7 @@ describe('Schedule Status API Route', () => {
}))
const req = createMockRequest('GET')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/schedules/[id]/status/route')
const res = await GET(req, { params: Promise.resolve({ id: 'schedule-id' }) })
expect(res.status).toBe(200)
@@ -85,7 +85,7 @@ describe('Schedule Status API Route', () => {
}))
const req = createMockRequest('GET')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/schedules/[id]/status/route')
const res = await GET(req, { params: Promise.resolve({ id: 'missing-id' }) })
expect(res.status).toBe(404)
@@ -101,7 +101,7 @@ describe('Schedule Status API Route', () => {
}))
const req = createMockRequest('GET')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/schedules/[id]/status/route')
const res = await GET(req, { params: Promise.resolve({ id: 'schedule-id' }) })
expect(res.status).toBe(404)
@@ -117,7 +117,7 @@ describe('Schedule Status API Route', () => {
}))
const req = createMockRequest('GET')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/schedules/[id]/status/route')
const res = await GET(req, { params: Promise.resolve({ id: 'schedule-id' }) })
expect(res.status).toBe(403)
@@ -133,7 +133,7 @@ describe('Schedule Status API Route', () => {
}))
const req = createMockRequest('GET')
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/schedules/[id]/status/route')
const res = await GET(req, { params: Promise.resolve({ id: 'schedule-id' }) })
expect(res.status).toBe(401)
diff --git a/apps/sim/app/api/schedules/execute/route.test.ts b/apps/sim/app/api/schedules/execute/route.test.ts
index 41fad03654..c7d14b89ab 100644
--- a/apps/sim/app/api/schedules/execute/route.test.ts
+++ b/apps/sim/app/api/schedules/execute/route.test.ts
@@ -121,7 +121,7 @@ describe('Scheduled Workflow Execution API Route', () => {
})),
}))
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/schedules/execute/route')
const response = await GET()
expect(response).toBeDefined()
@@ -137,7 +137,7 @@ describe('Scheduled Workflow Execution API Route', () => {
})),
}))
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/schedules/execute/route')
const response = await GET()
expect(response).toBeDefined()
@@ -166,7 +166,7 @@ describe('Scheduled Workflow Execution API Route', () => {
return { db: mockDb }
})
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/schedules/execute/route')
const response = await GET()
expect(response.status).toBe(200)
const data = await response.json()
@@ -194,7 +194,7 @@ describe('Scheduled Workflow Execution API Route', () => {
return { db: mockDb }
})
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/schedules/execute/route')
const response = await GET()
expect(response.status).toBe(500)
const data = await response.json()
@@ -226,7 +226,7 @@ describe('Scheduled Workflow Execution API Route', () => {
],
})
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/schedules/execute/route')
const response = await GET()
expect(response.status).toBe(200)
@@ -256,7 +256,7 @@ describe('Scheduled Workflow Execution API Route', () => {
],
})
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/schedules/execute/route')
const response = await GET()
expect(response.status).toBe(200)
diff --git a/apps/sim/app/api/schedules/route.test.ts b/apps/sim/app/api/schedules/route.test.ts
index 9879bc4d55..264a5d0932 100644
--- a/apps/sim/app/api/schedules/route.test.ts
+++ b/apps/sim/app/api/schedules/route.test.ts
@@ -156,7 +156,7 @@ describe('Schedule Configuration API Route', () => {
})
// Import the route handler after mocks are set up
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/schedules/route')
// Call the handler
const response = await POST(req)
@@ -251,7 +251,7 @@ describe('Schedule Configuration API Route', () => {
}))
// Import the route handler after mocks are set up
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/schedules/route')
// Call the handler
const response = await POST(req)
@@ -328,7 +328,7 @@ describe('Schedule Configuration API Route', () => {
})
// Import the route handler after mocks are set up
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/schedules/route')
// Call the handler
const response = await POST(req)
@@ -370,7 +370,7 @@ describe('Schedule Configuration API Route', () => {
})
// Import the route handler after mocks are set up
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/schedules/route')
// Call the handler
const response = await POST(req)
@@ -397,7 +397,7 @@ describe('Schedule Configuration API Route', () => {
})
// Import the route handler after mocks are set up
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/schedules/route')
// Call the handler
const response = await POST(req)
@@ -420,7 +420,7 @@ describe('Schedule Configuration API Route', () => {
})
// Import the route handler after mocks are set up
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/schedules/route')
// Call the handler
const response = await POST(req)
diff --git a/apps/sim/app/api/tools/confluence/pages/route.ts b/apps/sim/app/api/tools/confluence/pages/route.ts
index 947632eb27..934c5f61a9 100644
--- a/apps/sim/app/api/tools/confluence/pages/route.ts
+++ b/apps/sim/app/api/tools/confluence/pages/route.ts
@@ -2,7 +2,7 @@ import { NextResponse } from 'next/server'
import { createLogger } from '@/lib/logs/console/logger'
import { getConfluenceCloudId } from '@/tools/confluence/utils'
-const logger = createLogger('ConfluencePages')
+const logger = createLogger('ConfluencePagesAPI')
export const dynamic = 'force-dynamic'
diff --git a/apps/sim/app/api/tools/custom/route.test.ts b/apps/sim/app/api/tools/custom/route.test.ts
index d3c9d0321a..949ad1e647 100644
--- a/apps/sim/app/api/tools/custom/route.test.ts
+++ b/apps/sim/app/api/tools/custom/route.test.ts
@@ -163,7 +163,7 @@ describe('Custom Tools API Routes', () => {
mockWhere.mockReturnValueOnce(Promise.resolve(sampleTools))
// Import handler after mocks are set up
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/tools/custom/route')
// Call the handler
const response = await GET(req)
@@ -190,7 +190,7 @@ describe('Custom Tools API Routes', () => {
}))
// Import handler after mocks are set up
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/tools/custom/route')
// Call the handler
const response = await GET(req)
@@ -206,7 +206,7 @@ describe('Custom Tools API Routes', () => {
const req = new NextRequest('http://localhost:3000/api/tools/custom?workflowId=workflow-123')
// Import handler after mocks are set up
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/tools/custom/route')
// Call the handler
const _response = await GET(req)
@@ -247,7 +247,7 @@ describe('Custom Tools API Routes', () => {
const req = createMockRequest('POST', { tools: [newTool] })
// Import handler after mocks are set up
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/tools/custom/route')
// Call the handler
const response = await POST(req)
@@ -289,7 +289,7 @@ describe('Custom Tools API Routes', () => {
const req = createMockRequest('POST', { tools: [updateTool] })
// Import handler after mocks are set up
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/tools/custom/route')
// Call the handler
const response = await POST(req)
@@ -315,7 +315,7 @@ describe('Custom Tools API Routes', () => {
const req = createMockRequest('POST', { tools: [] })
// Import handler after mocks are set up
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/tools/custom/route')
// Call the handler
const response = await POST(req)
@@ -337,7 +337,7 @@ describe('Custom Tools API Routes', () => {
const req = createMockRequest('POST', { tools: [invalidTool] })
// Import handler after mocks are set up
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/tools/custom/route')
// Call the handler
const response = await POST(req)
@@ -362,7 +362,7 @@ describe('Custom Tools API Routes', () => {
const req = new NextRequest('http://localhost:3000/api/tools/custom?id=tool-1')
// Import handler after mocks are set up
- const { DELETE } = await import('./route')
+ const { DELETE } = await import('@/app/api/tools/custom/route')
// Call the handler
const response = await DELETE(req)
@@ -382,7 +382,7 @@ describe('Custom Tools API Routes', () => {
const req = createMockRequest('DELETE')
// Import handler after mocks are set up
- const { DELETE } = await import('./route')
+ const { DELETE } = await import('@/app/api/tools/custom/route')
// Call the handler
const response = await DELETE(req)
@@ -401,7 +401,7 @@ describe('Custom Tools API Routes', () => {
const req = new NextRequest('http://localhost:3000/api/tools/custom?id=non-existent')
// Import handler after mocks are set up
- const { DELETE } = await import('./route')
+ const { DELETE } = await import('@/app/api/tools/custom/route')
// Call the handler
const response = await DELETE(req)
@@ -421,7 +421,7 @@ describe('Custom Tools API Routes', () => {
const req = new NextRequest('http://localhost:3000/api/tools/custom?id=tool-1')
// Import handler after mocks are set up
- const { DELETE } = await import('./route')
+ const { DELETE } = await import('@/app/api/tools/custom/route')
// Call the handler
const response = await DELETE(req)
@@ -442,7 +442,7 @@ describe('Custom Tools API Routes', () => {
const req = new NextRequest('http://localhost:3000/api/tools/custom?id=tool-1')
// Import handler after mocks are set up
- const { DELETE } = await import('./route')
+ const { DELETE } = await import('@/app/api/tools/custom/route')
// Call the handler
const response = await DELETE(req)
diff --git a/apps/sim/app/api/tools/linear/projects/route.ts b/apps/sim/app/api/tools/linear/projects/route.ts
index 90ada406ba..8ebcd1ad32 100644
--- a/apps/sim/app/api/tools/linear/projects/route.ts
+++ b/apps/sim/app/api/tools/linear/projects/route.ts
@@ -7,7 +7,7 @@ import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils'
export const dynamic = 'force-dynamic'
-const logger = createLogger('LinearProjects')
+const logger = createLogger('LinearProjectsAPI')
export async function POST(request: Request) {
try {
diff --git a/apps/sim/app/api/tools/linear/teams/route.ts b/apps/sim/app/api/tools/linear/teams/route.ts
index df927c0c4c..334a73f5ef 100644
--- a/apps/sim/app/api/tools/linear/teams/route.ts
+++ b/apps/sim/app/api/tools/linear/teams/route.ts
@@ -7,7 +7,7 @@ import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils'
export const dynamic = 'force-dynamic'
-const logger = createLogger('LinearTeams')
+const logger = createLogger('LinearTeamsAPI')
export async function POST(request: Request) {
try {
diff --git a/apps/sim/app/api/tools/microsoft-teams/chats/route.ts b/apps/sim/app/api/tools/microsoft-teams/chats/route.ts
index feedc37960..0be25767ac 100644
--- a/apps/sim/app/api/tools/microsoft-teams/chats/route.ts
+++ b/apps/sim/app/api/tools/microsoft-teams/chats/route.ts
@@ -5,7 +5,7 @@ import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils'
export const dynamic = 'force-dynamic'
-const logger = createLogger('teams-chats')
+const logger = createLogger('TeamsChatsAPI')
// Helper function to get chat members and create a meaningful name
const getChatDisplayName = async (
diff --git a/apps/sim/app/api/tools/microsoft-teams/teams/route.ts b/apps/sim/app/api/tools/microsoft-teams/teams/route.ts
index 63c5b8b7b2..18d796d650 100644
--- a/apps/sim/app/api/tools/microsoft-teams/teams/route.ts
+++ b/apps/sim/app/api/tools/microsoft-teams/teams/route.ts
@@ -5,7 +5,7 @@ import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils'
export const dynamic = 'force-dynamic'
-const logger = createLogger('teams-teams')
+const logger = createLogger('TeamsTeamsAPI')
export async function POST(request: Request) {
try {
diff --git a/apps/sim/app/api/tools/stagehand/agent/route.ts b/apps/sim/app/api/tools/stagehand/agent/route.ts
index 9d01834b52..592b208aad 100644
--- a/apps/sim/app/api/tools/stagehand/agent/route.ts
+++ b/apps/sim/app/api/tools/stagehand/agent/route.ts
@@ -3,7 +3,7 @@ import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
import { env } from '@/lib/env'
import { createLogger } from '@/lib/logs/console/logger'
-import { ensureZodObject, normalizeUrl } from '../utils'
+import { ensureZodObject, normalizeUrl } from '@/app/api/tools/stagehand/utils'
const logger = createLogger('StagehandAgentAPI')
diff --git a/apps/sim/app/api/tools/stagehand/extract/route.ts b/apps/sim/app/api/tools/stagehand/extract/route.ts
index 9368d17173..b7a07e636c 100644
--- a/apps/sim/app/api/tools/stagehand/extract/route.ts
+++ b/apps/sim/app/api/tools/stagehand/extract/route.ts
@@ -3,7 +3,7 @@ import { type NextRequest, NextResponse } from 'next/server'
import { z } from 'zod'
import { env } from '@/lib/env'
import { createLogger } from '@/lib/logs/console/logger'
-import { ensureZodObject, normalizeUrl } from '../utils'
+import { ensureZodObject, normalizeUrl } from '@/app/api/tools/stagehand/utils'
const logger = createLogger('StagehandExtractAPI')
diff --git a/apps/sim/app/api/users/me/subscription/[id]/transfer/route.test.ts b/apps/sim/app/api/users/me/subscription/[id]/transfer/route.test.ts
index 3519e96fd7..8606665bfe 100644
--- a/apps/sim/app/api/users/me/subscription/[id]/transfer/route.test.ts
+++ b/apps/sim/app/api/users/me/subscription/[id]/transfer/route.test.ts
@@ -97,7 +97,7 @@ describe('Subscription Transfer API Routes', () => {
organizationId: 'org-456',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/users/me/subscription/[id]/transfer/route')
const response = await POST(req, { params: Promise.resolve({ id: 'sub-123' }) })
@@ -120,7 +120,7 @@ describe('Subscription Transfer API Routes', () => {
organizationId: 'org-456',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/users/me/subscription/[id]/transfer/route')
const response = await POST(req, { params: Promise.resolve({ id: 'sub-123' }) })
const data = await response.json()
@@ -149,7 +149,7 @@ describe('Subscription Transfer API Routes', () => {
organizationId: 'org-456',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/users/me/subscription/[id]/transfer/route')
const response = await POST(req, { params: Promise.resolve({ id: 'sub-123' }) })
const data = await response.json()
@@ -174,7 +174,7 @@ describe('Subscription Transfer API Routes', () => {
organizationId: 'org-456',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/users/me/subscription/[id]/transfer/route')
const response = await POST(req, { params: Promise.resolve({ id: 'sub-123' }) })
const data = await response.json()
@@ -214,7 +214,7 @@ describe('Subscription Transfer API Routes', () => {
organizationId: 'org-456',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/users/me/subscription/[id]/transfer/route')
const response = await POST(req, { params: Promise.resolve({ id: 'sub-123' }) })
const data = await response.json()
@@ -227,7 +227,7 @@ describe('Subscription Transfer API Routes', () => {
it('should reject invalid request parameters', async () => {
const req = createMockRequest('POST', {})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/users/me/subscription/[id]/transfer/route')
const response = await POST(req, { params: Promise.resolve({ id: 'sub-123' }) })
const data = await response.json()
@@ -246,7 +246,7 @@ describe('Subscription Transfer API Routes', () => {
organizationId: 'org-456',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/users/me/subscription/[id]/transfer/route')
const response = await POST(req, { params: Promise.resolve({ id: 'sub-123' }) })
const data = await response.json()
@@ -265,7 +265,7 @@ describe('Subscription Transfer API Routes', () => {
organizationId: 'org-456',
})
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/users/me/subscription/[id]/transfer/route')
const response = await POST(req, { params: Promise.resolve({ id: 'sub-123' }) })
const data = await response.json()
diff --git a/apps/sim/app/api/users/rate-limit/route.ts b/apps/sim/app/api/users/rate-limit/route.ts
index 5058fe0e5c..3a71ceca3b 100644
--- a/apps/sim/app/api/users/rate-limit/route.ts
+++ b/apps/sim/app/api/users/rate-limit/route.ts
@@ -5,10 +5,10 @@ import { createLogger } from '@/lib/logs/console/logger'
export const dynamic = 'force-dynamic'
+import { createErrorResponse } from '@/app/api/workflows/utils'
import { db } from '@/db'
import { apiKey as apiKeyTable, subscription } from '@/db/schema'
import { RateLimiter } from '@/services/queue'
-import { createErrorResponse } from '../../workflows/utils'
const logger = createLogger('RateLimitAPI')
diff --git a/apps/sim/app/api/webhooks/route.ts b/apps/sim/app/api/webhooks/route.ts
index db6e4a4515..a9d646a81f 100644
--- a/apps/sim/app/api/webhooks/route.ts
+++ b/apps/sim/app/api/webhooks/route.ts
@@ -4,9 +4,9 @@ import { type NextRequest, NextResponse } from 'next/server'
import { getSession } from '@/lib/auth'
import { env } from '@/lib/env'
import { createLogger } from '@/lib/logs/console/logger'
+import { getOAuthToken } from '@/app/api/auth/oauth/utils'
import { db } from '@/db'
import { webhook, workflow } from '@/db/schema'
-import { getOAuthToken } from '../auth/oauth/utils'
const logger = createLogger('WebhooksAPI')
diff --git a/apps/sim/app/api/webhooks/trigger/[path]/route.test.ts b/apps/sim/app/api/webhooks/trigger/[path]/route.test.ts
index dda7083ef5..cf6ab0a837 100644
--- a/apps/sim/app/api/webhooks/trigger/[path]/route.test.ts
+++ b/apps/sim/app/api/webhooks/trigger/[path]/route.test.ts
@@ -63,11 +63,11 @@ vi.mock('@/lib/webhooks/utils', () => ({
processWebhook: processWebhookMock,
}))
-vi.mock('./utils', () => ({
+vi.mock('@/app/api/webhooks/utils', () => ({
generateRequestHash: generateRequestHashMock,
}))
-vi.mock('../../utils', () => ({
+vi.mock('@/app/api/webhooks/utils', () => ({
validateSlackSignature: validateSlackSignatureMock,
}))
@@ -230,7 +230,7 @@ describe('Webhook Trigger API Route', () => {
const params = Promise.resolve({ path: 'whatsapp' })
// Import the handler after mocks are set up
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/webhooks/trigger/[path]/route')
// Call the handler
const response = await GET(req, { params })
@@ -271,7 +271,7 @@ describe('Webhook Trigger API Route', () => {
const params = Promise.resolve({ path: 'non-existent-path' })
// Import the handler after mocks are set up
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/webhooks/trigger/[path]/route')
// Call the handler
const response = await POST(req, { params })
@@ -328,7 +328,7 @@ describe('Webhook Trigger API Route', () => {
const params = Promise.resolve({ path: 'test-path' })
// Import the handler after mocks are set up
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/webhooks/trigger/[path]/route')
// Call the handler
const response = await POST(req, { params })
@@ -398,7 +398,7 @@ describe('Webhook Trigger API Route', () => {
const params = Promise.resolve({ path: 'test-path' })
// Import the handler after mocks are set up
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/webhooks/trigger/[path]/route')
// Call the handler
const response = await POST(req, { params })
@@ -484,7 +484,7 @@ describe('Webhook Trigger API Route', () => {
const params = Promise.resolve({ path: 'airtable-path' })
// Import the handler after mocks are set up
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/webhooks/trigger/[path]/route')
// Call the handler
const response = await POST(req, { params })
diff --git a/apps/sim/app/api/workflows/[id]/deploy/route.test.ts b/apps/sim/app/api/workflows/[id]/deploy/route.test.ts
index 1d73a0fe22..667a50798a 100644
--- a/apps/sim/app/api/workflows/[id]/deploy/route.test.ts
+++ b/apps/sim/app/api/workflows/[id]/deploy/route.test.ts
@@ -73,7 +73,7 @@ describe('Workflow Deployment API Route', () => {
}),
}))
- vi.doMock('../../middleware', () => ({
+ vi.doMock('@/app/api/workflows/middleware', () => ({
validateWorkflowAccess: vi.fn().mockResolvedValue({
workflow: {
id: 'workflow-id',
@@ -82,7 +82,7 @@ describe('Workflow Deployment API Route', () => {
}),
}))
- vi.doMock('../../utils', () => ({
+ vi.doMock('@/app/api/workflows/utils', () => ({
createSuccessResponse: vi.fn().mockImplementation((data) => {
return new Response(JSON.stringify(data), {
status: 200,
@@ -203,7 +203,7 @@ describe('Workflow Deployment API Route', () => {
const params = Promise.resolve({ id: 'workflow-id' })
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/workflows/[id]/deploy/route')
const response = await GET(req, { params })
@@ -281,7 +281,7 @@ describe('Workflow Deployment API Route', () => {
const params = Promise.resolve({ id: 'workflow-id' })
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/workflows/[id]/deploy/route')
const response = await POST(req, { params })
@@ -359,7 +359,7 @@ describe('Workflow Deployment API Route', () => {
const params = Promise.resolve({ id: 'workflow-id' })
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/workflows/[id]/deploy/route')
const response = await POST(req, { params })
@@ -391,7 +391,7 @@ describe('Workflow Deployment API Route', () => {
const params = Promise.resolve({ id: 'workflow-id' })
- const { DELETE } = await import('./route')
+ const { DELETE } = await import('@/app/api/workflows/[id]/deploy/route')
const response = await DELETE(req, { params })
@@ -410,7 +410,7 @@ describe('Workflow Deployment API Route', () => {
* Test error handling
*/
it('should handle errors when workflow is not found', async () => {
- vi.doMock('../../middleware', () => ({
+ vi.doMock('@/app/api/workflows/middleware', () => ({
validateWorkflowAccess: vi.fn().mockResolvedValue({
error: {
message: 'Workflow not found',
@@ -423,7 +423,7 @@ describe('Workflow Deployment API Route', () => {
const params = Promise.resolve({ id: 'invalid-id' })
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/workflows/[id]/deploy/route')
const response = await POST(req, { params })
@@ -438,7 +438,7 @@ describe('Workflow Deployment API Route', () => {
* Test unauthorized access
*/
it('should handle unauthorized access to workflow', async () => {
- vi.doMock('../../middleware', () => ({
+ vi.doMock('@/app/api/workflows/middleware', () => ({
validateWorkflowAccess: vi.fn().mockResolvedValue({
error: {
message: 'Unauthorized access',
@@ -451,7 +451,7 @@ describe('Workflow Deployment API Route', () => {
const params = Promise.resolve({ id: 'workflow-id' })
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/workflows/[id]/deploy/route')
const response = await POST(req, { params })
diff --git a/apps/sim/app/api/workflows/[id]/deploy/route.ts b/apps/sim/app/api/workflows/[id]/deploy/route.ts
index 58ad62fa4a..372dee5fec 100644
--- a/apps/sim/app/api/workflows/[id]/deploy/route.ts
+++ b/apps/sim/app/api/workflows/[id]/deploy/route.ts
@@ -3,10 +3,10 @@ import type { NextRequest } from 'next/server'
import { v4 as uuidv4 } from 'uuid'
import { createLogger } from '@/lib/logs/console/logger'
import { generateApiKey } from '@/lib/utils'
+import { validateWorkflowAccess } from '@/app/api/workflows/middleware'
+import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils'
import { db } from '@/db'
import { apiKey, workflow, workflowBlocks, workflowEdges, workflowSubflows } from '@/db/schema'
-import { validateWorkflowAccess } from '../../middleware'
-import { createErrorResponse, createSuccessResponse } from '../../utils'
const logger = createLogger('WorkflowDeployAPI')
diff --git a/apps/sim/app/api/workflows/[id]/deployed/route.ts b/apps/sim/app/api/workflows/[id]/deployed/route.ts
index b60b973b32..64e2a30cdd 100644
--- a/apps/sim/app/api/workflows/[id]/deployed/route.ts
+++ b/apps/sim/app/api/workflows/[id]/deployed/route.ts
@@ -1,10 +1,10 @@
import { eq } from 'drizzle-orm'
import type { NextRequest, NextResponse } from 'next/server'
import { createLogger } from '@/lib/logs/console/logger'
+import { validateWorkflowAccess } from '@/app/api/workflows/middleware'
+import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils'
import { db } from '@/db'
import { workflow } from '@/db/schema'
-import { validateWorkflowAccess } from '../../middleware'
-import { createErrorResponse, createSuccessResponse } from '../../utils'
const logger = createLogger('WorkflowDeployedStateAPI')
diff --git a/apps/sim/app/api/workflows/[id]/execute/route.test.ts b/apps/sim/app/api/workflows/[id]/execute/route.test.ts
index 4128fa420b..237ddb4cfe 100644
--- a/apps/sim/app/api/workflows/[id]/execute/route.test.ts
+++ b/apps/sim/app/api/workflows/[id]/execute/route.test.ts
@@ -252,7 +252,7 @@ describe('Workflow Execution API Route', () => {
const params = Promise.resolve({ id: 'workflow-id' })
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/workflows/[id]/execute/route')
const response = await GET(req, { params })
@@ -297,7 +297,7 @@ describe('Workflow Execution API Route', () => {
const params = Promise.resolve({ id: 'workflow-id' })
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/workflows/[id]/execute/route')
const response = await POST(req, { params })
@@ -351,7 +351,7 @@ describe('Workflow Execution API Route', () => {
const params = Promise.resolve({ id: 'workflow-id' })
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/workflows/[id]/execute/route')
const response = await POST(req, { params })
@@ -379,7 +379,7 @@ describe('Workflow Execution API Route', () => {
const params = Promise.resolve({ id: 'workflow-id' })
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/workflows/[id]/execute/route')
const response = await POST(req, { params })
@@ -414,7 +414,7 @@ describe('Workflow Execution API Route', () => {
const params = Promise.resolve({ id: 'workflow-id' })
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/workflows/[id]/execute/route')
const response = await POST(req, { params })
@@ -442,7 +442,7 @@ describe('Workflow Execution API Route', () => {
const params = Promise.resolve({ id: 'invalid-workflow-id' })
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/workflows/[id]/execute/route')
const response = await GET(req, { params })
@@ -483,7 +483,7 @@ describe('Workflow Execution API Route', () => {
const params = Promise.resolve({ id: 'workflow-id' })
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/workflows/[id]/execute/route')
const response = await GET(req, { params })
@@ -575,7 +575,7 @@ describe('Workflow Execution API Route', () => {
const params = Promise.resolve({ id: 'workflow-with-vars-id' })
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/workflows/[id]/execute/route')
await POST(req, { params })
diff --git a/apps/sim/app/api/workflows/[id]/execute/route.ts b/apps/sim/app/api/workflows/[id]/execute/route.ts
index 77efdfad50..bb19cefa2e 100644
--- a/apps/sim/app/api/workflows/[id]/execute/route.ts
+++ b/apps/sim/app/api/workflows/[id]/execute/route.ts
@@ -15,6 +15,8 @@ import {
updateWorkflowRunCounts,
workflowHasResponseBlock,
} from '@/lib/workflows/utils'
+import { validateWorkflowAccess } from '@/app/api/workflows/middleware'
+import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils'
import { db } from '@/db'
import { environment as environmentTable, subscription, userStats } from '@/db/schema'
import { Executor } from '@/executor'
@@ -26,8 +28,6 @@ import {
type TriggerType,
} from '@/services/queue'
import { mergeSubblockState } from '@/stores/workflows/server-utils'
-import { validateWorkflowAccess } from '../../middleware'
-import { createErrorResponse, createSuccessResponse } from '../../utils'
const logger = createLogger('WorkflowExecuteAPI')
diff --git a/apps/sim/app/api/workflows/[id]/log/route.ts b/apps/sim/app/api/workflows/[id]/log/route.ts
index 9f8dc9e64e..f6e17443ef 100644
--- a/apps/sim/app/api/workflows/[id]/log/route.ts
+++ b/apps/sim/app/api/workflows/[id]/log/route.ts
@@ -2,8 +2,8 @@ import type { NextRequest } from 'next/server'
import { createLogger } from '@/lib/logs/console/logger'
import { LoggingSession } from '@/lib/logs/execution/logging-session'
import { buildTraceSpans } from '@/lib/logs/execution/trace-spans/trace-spans'
-import { validateWorkflowAccess } from '../../middleware'
-import { createErrorResponse, createSuccessResponse } from '../../utils'
+import { validateWorkflowAccess } from '@/app/api/workflows/middleware'
+import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils'
const logger = createLogger('WorkflowLogAPI')
diff --git a/apps/sim/app/api/workflows/[id]/revert-to-deployed/route.ts b/apps/sim/app/api/workflows/[id]/revert-to-deployed/route.ts
index 81b529e0e9..1d329e0c18 100644
--- a/apps/sim/app/api/workflows/[id]/revert-to-deployed/route.ts
+++ b/apps/sim/app/api/workflows/[id]/revert-to-deployed/route.ts
@@ -4,11 +4,11 @@ import type { NextRequest } from 'next/server'
import { env } from '@/lib/env'
import { createLogger } from '@/lib/logs/console/logger'
import { saveWorkflowToNormalizedTables } from '@/lib/workflows/db-helpers'
+import { validateWorkflowAccess } from '@/app/api/workflows/middleware'
+import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils'
import { db } from '@/db'
import { workflow } from '@/db/schema'
import type { WorkflowState } from '@/stores/workflows/workflow/types'
-import { validateWorkflowAccess } from '../../middleware'
-import { createErrorResponse, createSuccessResponse } from '../../utils'
const logger = createLogger('RevertToDeployedAPI')
diff --git a/apps/sim/app/api/workflows/[id]/route.test.ts b/apps/sim/app/api/workflows/[id]/route.test.ts
index 029af8e332..930c3fb0d6 100644
--- a/apps/sim/app/api/workflows/[id]/route.test.ts
+++ b/apps/sim/app/api/workflows/[id]/route.test.ts
@@ -45,7 +45,7 @@ describe('Workflow By ID API Route', () => {
const req = new NextRequest('http://localhost:3000/api/workflows/workflow-123')
const params = Promise.resolve({ id: 'workflow-123' })
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/workflows/[id]/route')
const response = await GET(req, { params })
expect(response.status).toBe(401)
@@ -75,7 +75,7 @@ describe('Workflow By ID API Route', () => {
const req = new NextRequest('http://localhost:3000/api/workflows/nonexistent')
const params = Promise.resolve({ id: 'nonexistent' })
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/workflows/[id]/route')
const response = await GET(req, { params })
expect(response.status).toBe(404)
@@ -113,7 +113,7 @@ describe('Workflow By ID API Route', () => {
const req = new NextRequest('http://localhost:3000/api/workflows/workflow-123')
const params = Promise.resolve({ id: 'workflow-123' })
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/workflows/[id]/route')
const response = await GET(req, { params })
expect(response.status).toBe(200)
@@ -156,7 +156,7 @@ describe('Workflow By ID API Route', () => {
const req = new NextRequest('http://localhost:3000/api/workflows/workflow-123')
const params = Promise.resolve({ id: 'workflow-123' })
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/workflows/[id]/route')
const response = await GET(req, { params })
expect(response.status).toBe(200)
@@ -199,7 +199,7 @@ describe('Workflow By ID API Route', () => {
const req = new NextRequest('http://localhost:3000/api/workflows/workflow-123')
const params = Promise.resolve({ id: 'workflow-123' })
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/workflows/[id]/route')
const response = await GET(req, { params })
expect(response.status).toBe(403)
@@ -249,7 +249,7 @@ describe('Workflow By ID API Route', () => {
const req = new NextRequest('http://localhost:3000/api/workflows/workflow-123')
const params = Promise.resolve({ id: 'workflow-123' })
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/workflows/[id]/route')
const response = await GET(req, { params })
expect(response.status).toBe(200)
@@ -298,7 +298,7 @@ describe('Workflow By ID API Route', () => {
})
const params = Promise.resolve({ id: 'workflow-123' })
- const { DELETE } = await import('./route')
+ const { DELETE } = await import('@/app/api/workflows/[id]/route')
const response = await DELETE(req, { params })
expect(response.status).toBe(200)
@@ -349,7 +349,7 @@ describe('Workflow By ID API Route', () => {
})
const params = Promise.resolve({ id: 'workflow-123' })
- const { DELETE } = await import('./route')
+ const { DELETE } = await import('@/app/api/workflows/[id]/route')
const response = await DELETE(req, { params })
expect(response.status).toBe(200)
@@ -393,7 +393,7 @@ describe('Workflow By ID API Route', () => {
})
const params = Promise.resolve({ id: 'workflow-123' })
- const { DELETE } = await import('./route')
+ const { DELETE } = await import('@/app/api/workflows/[id]/route')
const response = await DELETE(req, { params })
expect(response.status).toBe(403)
@@ -444,7 +444,7 @@ describe('Workflow By ID API Route', () => {
})
const params = Promise.resolve({ id: 'workflow-123' })
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/workflows/[id]/route')
const response = await PUT(req, { params })
expect(response.status).toBe(200)
@@ -498,7 +498,7 @@ describe('Workflow By ID API Route', () => {
})
const params = Promise.resolve({ id: 'workflow-123' })
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/workflows/[id]/route')
const response = await PUT(req, { params })
expect(response.status).toBe(200)
@@ -545,7 +545,7 @@ describe('Workflow By ID API Route', () => {
})
const params = Promise.resolve({ id: 'workflow-123' })
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/workflows/[id]/route')
const response = await PUT(req, { params })
expect(response.status).toBe(403)
@@ -588,7 +588,7 @@ describe('Workflow By ID API Route', () => {
})
const params = Promise.resolve({ id: 'workflow-123' })
- const { PUT } = await import('./route')
+ const { PUT } = await import('@/app/api/workflows/[id]/route')
const response = await PUT(req, { params })
expect(response.status).toBe(400)
@@ -620,7 +620,7 @@ describe('Workflow By ID API Route', () => {
const req = new NextRequest('http://localhost:3000/api/workflows/workflow-123')
const params = Promise.resolve({ id: 'workflow-123' })
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/workflows/[id]/route')
const response = await GET(req, { params })
expect(response.status).toBe(500)
diff --git a/apps/sim/app/api/workflows/[id]/status/route.ts b/apps/sim/app/api/workflows/[id]/status/route.ts
index 25e2672906..5bd227b4c5 100644
--- a/apps/sim/app/api/workflows/[id]/status/route.ts
+++ b/apps/sim/app/api/workflows/[id]/status/route.ts
@@ -2,10 +2,10 @@ import { eq } from 'drizzle-orm'
import type { NextRequest } from 'next/server'
import { createLogger } from '@/lib/logs/console/logger'
import { hasWorkflowChanged } from '@/lib/workflows/utils'
+import { validateWorkflowAccess } from '@/app/api/workflows/middleware'
+import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils'
import { db } from '@/db'
import { workflowBlocks, workflowEdges, workflowSubflows } from '@/db/schema'
-import { validateWorkflowAccess } from '../../middleware'
-import { createErrorResponse, createSuccessResponse } from '../../utils'
const logger = createLogger('WorkflowStatusAPI')
diff --git a/apps/sim/app/api/workflows/[id]/variables/route.test.ts b/apps/sim/app/api/workflows/[id]/variables/route.test.ts
index b09cbb2909..50dc3b5a86 100644
--- a/apps/sim/app/api/workflows/[id]/variables/route.test.ts
+++ b/apps/sim/app/api/workflows/[id]/variables/route.test.ts
@@ -37,7 +37,7 @@ describe('Workflow Variables API Route', () => {
const req = new NextRequest('http://localhost:3000/api/workflows/workflow-123/variables')
const params = Promise.resolve({ id: 'workflow-123' })
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/workflows/[id]/variables/route')
const response = await GET(req, { params })
expect(response.status).toBe(401)
@@ -54,7 +54,7 @@ describe('Workflow Variables API Route', () => {
const req = new NextRequest('http://localhost:3000/api/workflows/nonexistent/variables')
const params = Promise.resolve({ id: 'nonexistent' })
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/workflows/[id]/variables/route')
const response = await GET(req, { params })
expect(response.status).toBe(404)
@@ -80,7 +80,7 @@ describe('Workflow Variables API Route', () => {
const req = new NextRequest('http://localhost:3000/api/workflows/workflow-123/variables')
const params = Promise.resolve({ id: 'workflow-123' })
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/workflows/[id]/variables/route')
const response = await GET(req, { params })
expect(response.status).toBe(200)
@@ -110,7 +110,7 @@ describe('Workflow Variables API Route', () => {
const req = new NextRequest('http://localhost:3000/api/workflows/workflow-123/variables')
const params = Promise.resolve({ id: 'workflow-123' })
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/workflows/[id]/variables/route')
const response = await GET(req, { params })
expect(response.status).toBe(200)
@@ -146,7 +146,7 @@ describe('Workflow Variables API Route', () => {
const req = new NextRequest('http://localhost:3000/api/workflows/workflow-123/variables')
const params = Promise.resolve({ id: 'workflow-123' })
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/workflows/[id]/variables/route')
const response = await GET(req, { params })
expect(response.status).toBe(401)
@@ -172,7 +172,7 @@ describe('Workflow Variables API Route', () => {
const req = new NextRequest('http://localhost:3000/api/workflows/workflow-123/variables')
const params = Promise.resolve({ id: 'workflow-123' })
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/workflows/[id]/variables/route')
const response = await GET(req, { params })
expect(response.status).toBe(200)
@@ -196,7 +196,7 @@ describe('Workflow Variables API Route', () => {
const req = new NextRequest('http://localhost:3000/api/workflows/workflow-123/variables')
const params = Promise.resolve({ id: 'workflow-123' })
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/workflows/[id]/variables/route')
const response = await GET(req, { params })
expect(response.status).toBe(200)
@@ -230,7 +230,7 @@ describe('Workflow Variables API Route', () => {
})
const params = Promise.resolve({ id: 'workflow-123' })
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/workflows/[id]/variables/route')
const response = await POST(req, { params })
expect(response.status).toBe(200)
@@ -265,7 +265,7 @@ describe('Workflow Variables API Route', () => {
})
const params = Promise.resolve({ id: 'workflow-123' })
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/workflows/[id]/variables/route')
const response = await POST(req, { params })
expect(response.status).toBe(401)
@@ -295,7 +295,7 @@ describe('Workflow Variables API Route', () => {
})
const params = Promise.resolve({ id: 'workflow-123' })
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/workflows/[id]/variables/route')
const response = await POST(req, { params })
expect(response.status).toBe(400)
@@ -314,7 +314,7 @@ describe('Workflow Variables API Route', () => {
const req = new NextRequest('http://localhost:3000/api/workflows/workflow-123/variables')
const params = Promise.resolve({ id: 'workflow-123' })
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/workflows/[id]/variables/route')
const response = await GET(req, { params })
expect(response.status).toBe(500)
diff --git a/apps/sim/app/api/workspaces/invitations/[id]/route.test.ts b/apps/sim/app/api/workspaces/invitations/[id]/route.test.ts
index a6d3aa34d5..a4391b74ed 100644
--- a/apps/sim/app/api/workspaces/invitations/[id]/route.test.ts
+++ b/apps/sim/app/api/workspaces/invitations/[id]/route.test.ts
@@ -2,9 +2,9 @@ import { NextRequest, NextResponse } from 'next/server'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import { getSession } from '@/lib/auth'
import { hasWorkspaceAdminAccess } from '@/lib/permissions/utils'
+import { DELETE } from '@/app/api/workspaces/invitations/[id]/route'
import { db } from '@/db'
import { workspaceInvitation } from '@/db/schema'
-import { DELETE } from './route'
vi.mock('@/lib/auth', () => ({
getSession: vi.fn(),
diff --git a/apps/sim/app/api/workspaces/invitations/route.test.ts b/apps/sim/app/api/workspaces/invitations/route.test.ts
index f46f218dc2..252d1881f1 100644
--- a/apps/sim/app/api/workspaces/invitations/route.test.ts
+++ b/apps/sim/app/api/workspaces/invitations/route.test.ts
@@ -110,7 +110,7 @@ describe('Workspace Invitations API Route', () => {
it('should return 401 when user is not authenticated', async () => {
mockGetSession.mockResolvedValue(null)
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/workspaces/invitations/route')
const req = createMockRequest('GET')
const response = await GET(req)
const data = await response.json()
@@ -123,7 +123,7 @@ describe('Workspace Invitations API Route', () => {
mockGetSession.mockResolvedValue({ user: { id: 'user-123' } })
mockDbResults = [[], []] // No workspaces, no invitations
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/workspaces/invitations/route')
const req = createMockRequest('GET')
const response = await GET(req)
const data = await response.json()
@@ -141,7 +141,7 @@ describe('Workspace Invitations API Route', () => {
]
mockDbResults = [mockWorkspaces, mockInvitations]
- const { GET } = await import('./route')
+ const { GET } = await import('@/app/api/workspaces/invitations/route')
const req = createMockRequest('GET')
const response = await GET(req)
const data = await response.json()
@@ -155,7 +155,7 @@ describe('Workspace Invitations API Route', () => {
it('should return 401 when user is not authenticated', async () => {
mockGetSession.mockResolvedValue(null)
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/workspaces/invitations/route')
const req = createMockRequest('POST', {
workspaceId: 'workspace-1',
email: 'test@example.com',
@@ -170,7 +170,7 @@ describe('Workspace Invitations API Route', () => {
it('should return 400 when workspaceId is missing', async () => {
mockGetSession.mockResolvedValue({ user: { id: 'user-123' } })
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/workspaces/invitations/route')
const req = createMockRequest('POST', { email: 'test@example.com' })
const response = await POST(req)
const data = await response.json()
@@ -182,7 +182,7 @@ describe('Workspace Invitations API Route', () => {
it('should return 400 when email is missing', async () => {
mockGetSession.mockResolvedValue({ user: { id: 'user-123' } })
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/workspaces/invitations/route')
const req = createMockRequest('POST', { workspaceId: 'workspace-1' })
const response = await POST(req)
const data = await response.json()
@@ -194,7 +194,7 @@ describe('Workspace Invitations API Route', () => {
it('should return 400 when permission type is invalid', async () => {
mockGetSession.mockResolvedValue({ user: { id: 'user-123' } })
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/workspaces/invitations/route')
const req = createMockRequest('POST', {
workspaceId: 'workspace-1',
email: 'test@example.com',
@@ -213,7 +213,7 @@ describe('Workspace Invitations API Route', () => {
mockGetSession.mockResolvedValue({ user: { id: 'user-123' } })
mockDbResults = [[]] // No admin permissions found
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/workspaces/invitations/route')
const req = createMockRequest('POST', {
workspaceId: 'workspace-1',
email: 'test@example.com',
@@ -232,7 +232,7 @@ describe('Workspace Invitations API Route', () => {
[], // Workspace not found
]
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/workspaces/invitations/route')
const req = createMockRequest('POST', {
workspaceId: 'workspace-1',
email: 'test@example.com',
@@ -253,7 +253,7 @@ describe('Workspace Invitations API Route', () => {
[{ permissionType: 'read' }], // User already has access
]
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/workspaces/invitations/route')
const req = createMockRequest('POST', {
workspaceId: 'workspace-1',
email: 'test@example.com',
@@ -277,7 +277,7 @@ describe('Workspace Invitations API Route', () => {
[mockInvitation], // Invitation exists
]
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/workspaces/invitations/route')
const req = createMockRequest('POST', {
workspaceId: 'workspace-1',
email: 'test@example.com',
@@ -303,7 +303,7 @@ describe('Workspace Invitations API Route', () => {
[], // No existing invitation
]
- const { POST } = await import('./route')
+ const { POST } = await import('@/app/api/workspaces/invitations/route')
const req = createMockRequest('POST', {
workspaceId: 'workspace-1',
email: 'test@example.com',
diff --git a/apps/sim/app/chat/[subdomain]/chat-client.tsx b/apps/sim/app/chat/[subdomain]/chat-client.tsx
index 309d4b24d0..4eba1ab8fa 100644
--- a/apps/sim/app/chat/[subdomain]/chat-client.tsx
+++ b/apps/sim/app/chat/[subdomain]/chat-client.tsx
@@ -5,17 +5,18 @@ import { v4 as uuidv4 } from 'uuid'
import { createLogger } from '@/lib/logs/console/logger'
import { noop } from '@/lib/utils'
import { getFormattedGitHubStars } from '@/app/(landing)/actions/github'
-import EmailAuth from './components/auth/email/email-auth'
-import PasswordAuth from './components/auth/password/password-auth'
-import { ChatErrorState } from './components/error-state/error-state'
-import { ChatHeader } from './components/header/header'
-import { ChatInput } from './components/input/input'
-import { ChatLoadingState } from './components/loading-state/loading-state'
-import type { ChatMessage } from './components/message/message'
-import { ChatMessageContainer } from './components/message-container/message-container'
-import { VoiceInterface } from './components/voice-interface/voice-interface'
-import { useAudioStreaming } from './hooks/use-audio-streaming'
-import { useChatStreaming } from './hooks/use-chat-streaming'
+import {
+ ChatErrorState,
+ ChatHeader,
+ ChatInput,
+ ChatLoadingState,
+ type ChatMessage,
+ ChatMessageContainer,
+ EmailAuth,
+ PasswordAuth,
+ VoiceInterface,
+} from '@/app/chat/[subdomain]/components'
+import { useAudioStreaming, useChatStreaming } from '@/app/chat/[subdomain]/hooks'
const logger = createLogger('ChatClient')
diff --git a/apps/sim/app/chat/[subdomain]/components/error-state/error-state.tsx b/apps/sim/app/chat/[subdomain]/components/error-state/error-state.tsx
index 8cc76061bc..4ab6bddc18 100644
--- a/apps/sim/app/chat/[subdomain]/components/error-state/error-state.tsx
+++ b/apps/sim/app/chat/[subdomain]/components/error-state/error-state.tsx
@@ -1,6 +1,6 @@
'use client'
-import { ChatHeader } from '../header/header'
+import { ChatHeader } from '../'
interface ChatErrorStateProps {
error: string
diff --git a/apps/sim/app/chat/[subdomain]/components/index.ts b/apps/sim/app/chat/[subdomain]/components/index.ts
new file mode 100644
index 0000000000..eef5a82c46
--- /dev/null
+++ b/apps/sim/app/chat/[subdomain]/components/index.ts
@@ -0,0 +1,9 @@
+export { default as EmailAuth } from './auth/email/email-auth'
+export { default as PasswordAuth } from './auth/password/password-auth'
+export { ChatErrorState } from './error-state/error-state'
+export { ChatHeader } from './header/header'
+export { ChatInput } from './input/input'
+export { ChatLoadingState } from './loading-state/loading-state'
+export type { ChatMessage } from './message/message'
+export { ChatMessageContainer } from './message-container/message-container'
+export { VoiceInterface } from './voice-interface/voice-interface'
diff --git a/apps/sim/app/chat/[subdomain]/components/input/input.tsx b/apps/sim/app/chat/[subdomain]/components/input/input.tsx
index 83a1feb4ec..d5befe2810 100644
--- a/apps/sim/app/chat/[subdomain]/components/input/input.tsx
+++ b/apps/sim/app/chat/[subdomain]/components/input/input.tsx
@@ -5,7 +5,7 @@ import { useEffect, useRef, useState } from 'react'
import { motion } from 'framer-motion'
import { Send, Square } from 'lucide-react'
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'
-import { VoiceInput } from './voice-input'
+import { VoiceInput } from '@/app/chat/[subdomain]/components/input/voice-input'
const PLACEHOLDER_MOBILE = 'Enter a message'
const PLACEHOLDER_DESKTOP = 'Enter a message or click the mic to speak'
diff --git a/apps/sim/app/chat/[subdomain]/components/message-container/message-container.tsx b/apps/sim/app/chat/[subdomain]/components/message-container/message-container.tsx
index 6c59e578d2..286d98cc90 100644
--- a/apps/sim/app/chat/[subdomain]/components/message-container/message-container.tsx
+++ b/apps/sim/app/chat/[subdomain]/components/message-container/message-container.tsx
@@ -3,7 +3,10 @@
import { memo, type RefObject } from 'react'
import { ArrowDown } from 'lucide-react'
import { Button } from '@/components/ui/button'
-import { type ChatMessage, ClientChatMessage } from '../message/message'
+import {
+ type ChatMessage,
+ ClientChatMessage,
+} from '@/app/chat/[subdomain]/components/message/message'
interface ChatMessageContainerProps {
messages: ChatMessage[]
diff --git a/apps/sim/app/chat/[subdomain]/components/message/message.tsx b/apps/sim/app/chat/[subdomain]/components/message/message.tsx
index 3ebdbf4d97..396fe4c79a 100644
--- a/apps/sim/app/chat/[subdomain]/components/message/message.tsx
+++ b/apps/sim/app/chat/[subdomain]/components/message/message.tsx
@@ -6,7 +6,7 @@ import { Button } from '@/components/ui/button'
import { ToolCallCompletion, ToolCallExecution } from '@/components/ui/tool-call'
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'
import { parseMessageContent, stripToolCallIndicators } from '@/lib/tool-call-parser'
-import MarkdownRenderer from './components/markdown-renderer'
+import MarkdownRenderer from '@/app/chat/[subdomain]/components/message/components/markdown-renderer'
export interface ChatMessage {
id: string
diff --git a/apps/sim/app/chat/[subdomain]/components/voice-interface/voice-interface.tsx b/apps/sim/app/chat/[subdomain]/components/voice-interface/voice-interface.tsx
index 772b025995..15efe748fb 100644
--- a/apps/sim/app/chat/[subdomain]/components/voice-interface/voice-interface.tsx
+++ b/apps/sim/app/chat/[subdomain]/components/voice-interface/voice-interface.tsx
@@ -5,7 +5,7 @@ import { Mic, MicOff, Phone } from 'lucide-react'
import { Button } from '@/components/ui/button'
import { createLogger } from '@/lib/logs/console/logger'
import { cn } from '@/lib/utils'
-import { ParticlesVisualization } from './components/particles'
+import { ParticlesVisualization } from '@/app/chat/[subdomain]/components/voice-interface/components/particles'
const logger = createLogger('VoiceInterface')
diff --git a/apps/sim/app/chat/[subdomain]/hooks/index.ts b/apps/sim/app/chat/[subdomain]/hooks/index.ts
new file mode 100644
index 0000000000..d1a9f6d293
--- /dev/null
+++ b/apps/sim/app/chat/[subdomain]/hooks/index.ts
@@ -0,0 +1,2 @@
+export { useAudioStreaming } from './use-audio-streaming'
+export { useChatStreaming } from './use-chat-streaming'
diff --git a/apps/sim/app/chat/[subdomain]/hooks/use-chat-streaming.ts b/apps/sim/app/chat/[subdomain]/hooks/use-chat-streaming.ts
index 4089696aae..67718c489c 100644
--- a/apps/sim/app/chat/[subdomain]/hooks/use-chat-streaming.ts
+++ b/apps/sim/app/chat/[subdomain]/hooks/use-chat-streaming.ts
@@ -2,7 +2,7 @@
import { useRef, useState } from 'react'
import { createLogger } from '@/lib/logs/console/logger'
-import type { ChatMessage } from '../components/message/message'
+import type { ChatMessage } from '@/app/chat/[subdomain]/components/message/message'
const logger = createLogger('UseChatStreaming')
diff --git a/apps/sim/app/chat/[subdomain]/page.tsx b/apps/sim/app/chat/[subdomain]/page.tsx
index bfb9d66b3c..52162b2c9e 100644
--- a/apps/sim/app/chat/[subdomain]/page.tsx
+++ b/apps/sim/app/chat/[subdomain]/page.tsx
@@ -1,4 +1,4 @@
-import ChatClient from './chat-client'
+import ChatClient from '@/app/chat/[subdomain]/chat-client'
export default async function ChatPage({ params }: { params: Promise<{ subdomain: string }> }) {
const { subdomain } = await params
diff --git a/apps/sim/app/invite/[id]/page.tsx b/apps/sim/app/invite/[id]/page.tsx
index cd792230aa..2f22144abc 100644
--- a/apps/sim/app/invite/[id]/page.tsx
+++ b/apps/sim/app/invite/[id]/page.tsx
@@ -1,3 +1,3 @@
-import Invite from './invite'
+import Invite from '@/app/invite/[id]/invite'
export default Invite
diff --git a/apps/sim/app/invite/invite-error/page.tsx b/apps/sim/app/invite/invite-error/page.tsx
index 9326826fb1..646f4a3d8e 100644
--- a/apps/sim/app/invite/invite-error/page.tsx
+++ b/apps/sim/app/invite/invite-error/page.tsx
@@ -1,6 +1,5 @@
-import InviteError from './invite-error'
+import InviteError from '@/app/invite/invite-error/invite-error'
-// Generate this page on-demand instead of at build time
export const dynamic = 'force-dynamic'
export default function InviteErrorPage() {
diff --git a/apps/sim/app/layout.tsx b/apps/sim/app/layout.tsx
index 3f1fb43427..e46684e6ca 100644
--- a/apps/sim/app/layout.tsx
+++ b/apps/sim/app/layout.tsx
@@ -4,9 +4,9 @@ import type { Metadata, Viewport } from 'next'
import { PublicEnvScript } from 'next-runtime-env'
import { createLogger } from '@/lib/logs/console/logger'
import { TelemetryConsentDialog } from '@/app/telemetry-consent-dialog'
-import './globals.css'
+import '@/app/globals.css'
-import { ZoomPrevention } from './zoom-prevention'
+import { ZoomPrevention } from '@/app/zoom-prevention'
const logger = createLogger('RootLayout')
diff --git a/apps/sim/app/page.tsx b/apps/sim/app/page.tsx
index 5195ceb433..bf563a84b8 100644
--- a/apps/sim/app/page.tsx
+++ b/apps/sim/app/page.tsx
@@ -1,3 +1,3 @@
-import Landing from './(landing)/landing'
+import Landing from '@/app/(landing)/landing'
export default Landing
diff --git a/apps/sim/app/unsubscribe/page.tsx b/apps/sim/app/unsubscribe/page.tsx
index d4897b63c3..ce2a6d0280 100644
--- a/apps/sim/app/unsubscribe/page.tsx
+++ b/apps/sim/app/unsubscribe/page.tsx
@@ -3,8 +3,7 @@
import { Suspense, useEffect, useState } from 'react'
import { CheckCircle, Heart, Info, Loader2, XCircle } from 'lucide-react'
import { useSearchParams } from 'next/navigation'
-import { Button } from '@/components/ui/button'
-import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'
+import { Button, Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui'
interface UnsubscribeData {
success: boolean
diff --git a/apps/sim/app/workspace/[workspaceId]/error.tsx b/apps/sim/app/workspace/[workspaceId]/error.tsx
index c5e6e668b8..2504830ecb 100644
--- a/apps/sim/app/workspace/[workspaceId]/error.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/error.tsx
@@ -1,5 +1,5 @@
'use client'
-import { NextError } from './w/[workflowId]/components/error'
+import { NextError } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/error'
export default NextError
diff --git a/apps/sim/app/workspace/[workspaceId]/global-error.tsx b/apps/sim/app/workspace/[workspaceId]/global-error.tsx
index d92a73ce25..09e7699154 100644
--- a/apps/sim/app/workspace/[workspaceId]/global-error.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/global-error.tsx
@@ -1,5 +1,5 @@
'use client'
-import { NextGlobalError } from './w/[workflowId]/components/error'
+import { NextGlobalError } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/error'
export default NextGlobalError
diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/document-loading.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/document-loading.tsx
index a82cb168bc..0b8fe12aaf 100644
--- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/document-loading.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/document-loading.tsx
@@ -3,8 +3,10 @@
import { Plus, Search } from 'lucide-react'
import { useParams } from 'next/navigation'
import { Button } from '@/components/ui/button'
-import { KnowledgeHeader } from '../../../components/knowledge-header/knowledge-header'
-import { ChunkTableSkeleton } from '../../../components/skeletons/table-skeleton'
+import {
+ ChunkTableSkeleton,
+ KnowledgeHeader,
+} from '@/app/workspace/[workspaceId]/knowledge/components'
interface DocumentLoadingProps {
knowledgeBaseId: string
diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/index.ts b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/index.ts
new file mode 100644
index 0000000000..a4dd9865f5
--- /dev/null
+++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/index.ts
@@ -0,0 +1,4 @@
+export { CreateChunkModal } from './create-chunk-modal/create-chunk-modal'
+export { DeleteChunkModal } from './delete-chunk-modal/delete-chunk-modal'
+export { DocumentLoading } from './document-loading'
+export { EditChunkModal } from './edit-chunk-modal/edit-chunk-modal'
diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/document.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/document.tsx
index 3e620eaf37..25ac0dad27 100644
--- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/document.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/document.tsx
@@ -3,21 +3,26 @@
import { useCallback, useEffect, useState } from 'react'
import { ChevronLeft, ChevronRight, Circle, CircleOff, FileText, Plus, Trash2 } from 'lucide-react'
import { useParams, useRouter, useSearchParams } from 'next/navigation'
-import { Button } from '@/components/ui/button'
-import { Checkbox } from '@/components/ui/checkbox'
-import { SearchHighlight } from '@/components/ui/search-highlight'
-import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
+import {
+ Button,
+ Checkbox,
+ SearchHighlight,
+ Tooltip,
+ TooltipContent,
+ TooltipTrigger,
+} from '@/components/ui'
import { createLogger } from '@/lib/logs/console/logger'
import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/components/providers/workspace-permissions-provider'
-import { ActionBar } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/action-bar/action-bar'
-import { SearchInput } from '@/app/workspace/[workspaceId]/knowledge/components/search-input/search-input'
+import {
+ CreateChunkModal,
+ DeleteChunkModal,
+ DocumentLoading,
+ EditChunkModal,
+} from '@/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components'
+import { ActionBar } from '@/app/workspace/[workspaceId]/knowledge/[id]/components'
+import { KnowledgeHeader, SearchInput } from '@/app/workspace/[workspaceId]/knowledge/components'
import { useDocumentChunks } from '@/hooks/use-knowledge'
import { type ChunkData, type DocumentData, useKnowledgeStore } from '@/stores/knowledge/store'
-import { KnowledgeHeader } from '../../components/knowledge-header/knowledge-header'
-import { CreateChunkModal } from './components/create-chunk-modal/create-chunk-modal'
-import { DeleteChunkModal } from './components/delete-chunk-modal/delete-chunk-modal'
-import { DocumentLoading } from './components/document-loading'
-import { EditChunkModal } from './components/edit-chunk-modal/edit-chunk-modal'
const logger = createLogger('Document')
diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/page.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/page.tsx
index 8649c5cce2..93d484d4d8 100644
--- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/page.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/page.tsx
@@ -1,4 +1,4 @@
-import { Document } from './document'
+import { Document } from '@/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/document'
interface DocumentPageProps {
params: Promise<{
diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/base.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/base.tsx
index 5e04994d17..7b49ceacba 100644
--- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/base.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/base.tsx
@@ -30,16 +30,20 @@ import { Checkbox } from '@/components/ui/checkbox'
import { SearchHighlight } from '@/components/ui/search-highlight'
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
import { createLogger } from '@/lib/logs/console/logger'
-import { ActionBar } from '@/app/workspace/[workspaceId]/knowledge/[id]/components/action-bar/action-bar'
-import { getDocumentIcon } from '@/app/workspace/[workspaceId]/knowledge/components/icons/document-icons'
-import { PrimaryButton } from '@/app/workspace/[workspaceId]/knowledge/components/primary-button/primary-button'
-import { SearchInput } from '@/app/workspace/[workspaceId]/knowledge/components/search-input/search-input'
+import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/components/providers/workspace-permissions-provider'
+import {
+ ActionBar,
+ KnowledgeBaseLoading,
+ UploadModal,
+} from '@/app/workspace/[workspaceId]/knowledge/[id]/components'
+import {
+ getDocumentIcon,
+ KnowledgeHeader,
+ PrimaryButton,
+ SearchInput,
+} from '@/app/workspace/[workspaceId]/knowledge/components'
import { useKnowledgeBase, useKnowledgeBaseDocuments } from '@/hooks/use-knowledge'
import { type DocumentData, useKnowledgeStore } from '@/stores/knowledge/store'
-import { useUserPermissionsContext } from '../../components/providers/workspace-permissions-provider'
-import { KnowledgeHeader } from '../components/knowledge-header/knowledge-header'
-import { KnowledgeBaseLoading } from './components/knowledge-base-loading/knowledge-base-loading'
-import { UploadModal } from './components/upload-modal/upload-modal'
const logger = createLogger('KnowledgeBase')
diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/index.ts b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/index.ts
new file mode 100644
index 0000000000..c4ea6586db
--- /dev/null
+++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/index.ts
@@ -0,0 +1,3 @@
+export { ActionBar } from './action-bar/action-bar'
+export { KnowledgeBaseLoading } from './knowledge-base-loading/knowledge-base-loading'
+export { UploadModal } from './upload-modal/upload-modal'
diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/knowledge-base-loading/knowledge-base-loading.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/knowledge-base-loading/knowledge-base-loading.tsx
index f826961465..46402dde4b 100644
--- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/knowledge-base-loading/knowledge-base-loading.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/knowledge-base-loading/knowledge-base-loading.tsx
@@ -3,8 +3,10 @@
import { Search } from 'lucide-react'
import { useParams } from 'next/navigation'
import { Button } from '@/components/ui/button'
-import { KnowledgeHeader } from '../../../components/knowledge-header/knowledge-header'
-import { DocumentTableSkeleton } from '../../../components/skeletons/table-skeleton'
+import {
+ DocumentTableSkeleton,
+ KnowledgeHeader,
+} from '@/app/workspace/[workspaceId]/knowledge/components'
interface KnowledgeBaseLoadingProps {
knowledgeBaseName: string
diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/upload-modal/upload-modal.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/upload-modal/upload-modal.tsx
index 25065d0240..c5b6ac616f 100644
--- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/upload-modal/upload-modal.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/upload-modal/upload-modal.tsx
@@ -6,8 +6,8 @@ import { Button } from '@/components/ui/button'
import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'
import { Label } from '@/components/ui/label'
import { createLogger } from '@/lib/logs/console/logger'
-import { type TagData, TagInput } from '../../../components/tag-input/tag-input'
-import { useKnowledgeUpload } from '../../../hooks/use-knowledge-upload'
+import { type TagData, TagInput } from '@/app/workspace/[workspaceId]/knowledge/components'
+import { useKnowledgeUpload } from '@/app/workspace/[workspaceId]/knowledge/hooks/use-knowledge-upload'
const logger = createLogger('UploadModal')
diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/page.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/page.tsx
index db17075138..7bb810feb4 100644
--- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/page.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/page.tsx
@@ -1,4 +1,4 @@
-import { KnowledgeBase } from './base'
+import { KnowledgeBase } from '@/app/workspace/[workspaceId]/knowledge/[id]/base'
interface PageProps {
params: Promise<{
diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/components/create-modal/create-modal.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/components/create-modal/create-modal.tsx
index 295c38657c..f71d262aa5 100644
--- a/apps/sim/app/workspace/[workspaceId]/knowledge/components/create-modal/create-modal.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/knowledge/components/create-modal/create-modal.tsx
@@ -13,10 +13,13 @@ import { Input } from '@/components/ui/input'
import { Label } from '@/components/ui/label'
import { Textarea } from '@/components/ui/textarea'
import { createLogger } from '@/lib/logs/console/logger'
-import { getDocumentIcon } from '@/app/workspace/[workspaceId]/knowledge/components/icons/document-icons'
+import {
+ getDocumentIcon,
+ type TagData,
+ TagInput,
+} from '@/app/workspace/[workspaceId]/knowledge/components'
+import { useKnowledgeUpload } from '@/app/workspace/[workspaceId]/knowledge/hooks/use-knowledge-upload'
import type { KnowledgeBaseData } from '@/stores/knowledge/store'
-import { useKnowledgeUpload } from '../../hooks/use-knowledge-upload'
-import { type TagData, TagInput } from '../tag-input/tag-input'
const logger = createLogger('CreateModal')
diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/components/index.ts b/apps/sim/app/workspace/[workspaceId]/knowledge/components/index.ts
new file mode 100644
index 0000000000..554bc81f16
--- /dev/null
+++ b/apps/sim/app/workspace/[workspaceId]/knowledge/components/index.ts
@@ -0,0 +1,11 @@
+export { BaseOverview } from './base-overview/base-overview'
+export { CreateModal } from './create-modal/create-modal'
+export { EmptyStateCard } from './empty-state-card/empty-state-card'
+export { getDocumentIcon } from './icons/document-icons'
+export { KnowledgeHeader } from './knowledge-header/knowledge-header'
+export { PrimaryButton } from './primary-button/primary-button'
+export { SearchInput } from './search-input/search-input'
+export { KnowledgeBaseCardSkeletonGrid } from './skeletons/knowledge-base-card-skeleton'
+export { ChunkTableSkeleton, DocumentTableSkeleton } from './skeletons/table-skeleton'
+export { type TagData, TagInput } from './tag-input/tag-input'
+export { WorkspaceSelector } from './workspace-selector/workspace-selector'
diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/components/knowledge-header/knowledge-header.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/components/knowledge-header/knowledge-header.tsx
index 14842c1521..90dbf36831 100644
--- a/apps/sim/app/workspace/[workspaceId]/knowledge/components/knowledge-header/knowledge-header.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/knowledge/components/knowledge-header/knowledge-header.tsx
@@ -9,7 +9,7 @@ import {
DropdownMenuItem,
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu'
-import { WorkspaceSelector } from '../workspace-selector/workspace-selector'
+import { WorkspaceSelector } from '@/app/workspace/[workspaceId]/knowledge/components'
interface BreadcrumbItem {
label: string
diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/knowledge.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/knowledge.tsx
index c143f50119..1f400cd16f 100644
--- a/apps/sim/app/workspace/[workspaceId]/knowledge/knowledge.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/knowledge/knowledge.tsx
@@ -5,15 +5,17 @@ import { LibraryBig, Plus } from 'lucide-react'
import { useParams } from 'next/navigation'
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/components/providers/workspace-permissions-provider'
+import {
+ BaseOverview,
+ CreateModal,
+ EmptyStateCard,
+ KnowledgeBaseCardSkeletonGrid,
+ KnowledgeHeader,
+ PrimaryButton,
+ SearchInput,
+} from '@/app/workspace/[workspaceId]/knowledge/components'
import { useKnowledgeBasesList } from '@/hooks/use-knowledge'
import type { KnowledgeBaseData } from '@/stores/knowledge/store'
-import { BaseOverview } from './components/base-overview/base-overview'
-import { CreateModal } from './components/create-modal/create-modal'
-import { EmptyStateCard } from './components/empty-state-card/empty-state-card'
-import { KnowledgeHeader } from './components/knowledge-header/knowledge-header'
-import { PrimaryButton } from './components/primary-button/primary-button'
-import { SearchInput } from './components/search-input/search-input'
-import { KnowledgeBaseCardSkeletonGrid } from './components/skeletons/knowledge-base-card-skeleton'
interface KnowledgeBaseWithDocCount extends KnowledgeBaseData {
docCount?: number
diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/loading.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/loading.tsx
index 8bd39d72cc..798d70b84d 100644
--- a/apps/sim/app/workspace/[workspaceId]/knowledge/loading.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/knowledge/loading.tsx
@@ -2,8 +2,10 @@
import { Plus, Search } from 'lucide-react'
import { Button } from '@/components/ui/button'
-import { KnowledgeHeader } from './components/knowledge-header/knowledge-header'
-import { KnowledgeBaseCardSkeletonGrid } from './components/skeletons/knowledge-base-card-skeleton'
+import {
+ KnowledgeBaseCardSkeletonGrid,
+ KnowledgeHeader,
+} from '@/app/workspace/[workspaceId]/knowledge/components'
export default function KnowledgeLoading() {
const breadcrumbs = [{ id: 'knowledge', label: 'Knowledge' }]
diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/page.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/page.tsx
index 439b92d218..cfd961ffcc 100644
--- a/apps/sim/app/workspace/[workspaceId]/knowledge/page.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/knowledge/page.tsx
@@ -1,4 +1,4 @@
-import { Knowledge } from './knowledge'
+import { Knowledge } from '@/app/workspace/[workspaceId]/knowledge/knowledge'
export default function KnowledgePage() {
return
diff --git a/apps/sim/app/workspace/[workspaceId]/layout.tsx b/apps/sim/app/workspace/[workspaceId]/layout.tsx
index 0391bffce9..dec79a0513 100644
--- a/apps/sim/app/workspace/[workspaceId]/layout.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/layout.tsx
@@ -1,5 +1,5 @@
-import Providers from './w/components/providers/providers'
-import { Sidebar } from './w/components/sidebar/sidebar'
+import Providers from '@/app/workspace/[workspaceId]/w/components/providers/providers'
+import { Sidebar } from '@/app/workspace/[workspaceId]/w/components/sidebar/sidebar'
export default function WorkspaceLayout({ children }: { children: React.ReactNode }) {
return (
diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/filters/components/index.ts b/apps/sim/app/workspace/[workspaceId]/logs/components/filters/components/index.ts
new file mode 100644
index 0000000000..661eace1f0
--- /dev/null
+++ b/apps/sim/app/workspace/[workspaceId]/logs/components/filters/components/index.ts
@@ -0,0 +1,6 @@
+export { default as FilterSection } from './filter-section'
+export { default as FolderFilter } from './folder'
+export { default as Level } from './level'
+export { default as Timeline } from './timeline'
+export { default as Trigger } from './trigger'
+export { default as Workflow } from './workflow'
diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/filters/components/trigger.tsx b/apps/sim/app/workspace/[workspaceId]/logs/components/filters/components/trigger.tsx
index e3e053daaa..ab5fc8994c 100644
--- a/apps/sim/app/workspace/[workspaceId]/logs/components/filters/components/trigger.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/logs/components/filters/components/trigger.tsx
@@ -8,7 +8,7 @@ import {
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu'
import { useFilterStore } from '@/stores/logs/filters/store'
-import type { TriggerType } from '../../../../../../../stores/logs/filters/types'
+import type { TriggerType } from '@/stores/logs/filters/types'
export default function Trigger() {
const { triggers, toggleTrigger, setTriggers } = useFilterStore()
diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/filters/filters.tsx b/apps/sim/app/workspace/[workspaceId]/logs/components/filters/filters.tsx
index 1b783a0518..bb32a0baaf 100644
--- a/apps/sim/app/workspace/[workspaceId]/logs/components/filters/filters.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/logs/components/filters/filters.tsx
@@ -1,15 +1,17 @@
'use client'
import { TimerOff } from 'lucide-react'
-import { Button } from '@/components/ui/button'
+import { Button } from '@/components/ui'
import { isProd } from '@/lib/environment'
+import {
+ FilterSection,
+ FolderFilter,
+ Level,
+ Timeline,
+ Trigger,
+ Workflow,
+} from '@/app/workspace/[workspaceId]/logs/components/filters/components'
import { useSubscriptionStore } from '@/stores/subscription/store'
-import FilterSection from './components/filter-section'
-import FolderFilter from './components/folder'
-import Level from './components/level'
-import Timeline from './components/timeline'
-import Trigger from './components/trigger'
-import Workflow from './components/workflow'
/**
* Filters component for logs page - includes timeline and other filter options
diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/frozen-canvas/frozen-canvas-modal.tsx b/apps/sim/app/workspace/[workspaceId]/logs/components/frozen-canvas/frozen-canvas-modal.tsx
index 281648f3ac..4a22b5f6fd 100644
--- a/apps/sim/app/workspace/[workspaceId]/logs/components/frozen-canvas/frozen-canvas-modal.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/logs/components/frozen-canvas/frozen-canvas-modal.tsx
@@ -6,7 +6,7 @@ import { Badge } from '@/components/ui/badge'
import { Button } from '@/components/ui/button'
import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'
import { cn } from '@/lib/utils'
-import { FrozenCanvas } from './frozen-canvas'
+import { FrozenCanvas } from '@/app/workspace/[workspaceId]/logs/components/frozen-canvas/frozen-canvas'
interface FrozenCanvasModalProps {
executionId: string
diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/sidebar/sidebar.tsx b/apps/sim/app/workspace/[workspaceId]/logs/components/sidebar/sidebar.tsx
index 0768cac385..c8bce63b75 100644
--- a/apps/sim/app/workspace/[workspaceId]/logs/components/sidebar/sidebar.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/logs/components/sidebar/sidebar.tsx
@@ -7,13 +7,13 @@ import { CopyButton } from '@/components/ui/copy-button'
import { ScrollArea } from '@/components/ui/scroll-area'
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'
import { redactApiKeys } from '@/lib/utils'
+import { FrozenCanvasModal } from '@/app/workspace/[workspaceId]/logs/components/frozen-canvas/frozen-canvas-modal'
+import LogMarkdownRenderer from '@/app/workspace/[workspaceId]/logs/components/sidebar/components/markdown-renderer'
+import { ToolCallsDisplay } from '@/app/workspace/[workspaceId]/logs/components/tool-calls/tool-calls-display'
+import { TraceSpansDisplay } from '@/app/workspace/[workspaceId]/logs/components/trace-spans/trace-spans-display'
import { formatDate } from '@/app/workspace/[workspaceId]/logs/utils/format-date'
import { formatCost } from '@/providers/utils'
import type { WorkflowLog } from '@/stores/logs/filters/types'
-import { FrozenCanvasModal } from '../frozen-canvas/frozen-canvas-modal'
-import { ToolCallsDisplay } from '../tool-calls/tool-calls-display'
-import { TraceSpansDisplay } from '../trace-spans/trace-spans-display'
-import LogMarkdownRenderer from './components/markdown-renderer'
interface LogSidebarProps {
log: WorkflowLog | null
diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/tool-calls/tool-calls-display.tsx b/apps/sim/app/workspace/[workspaceId]/logs/components/tool-calls/tool-calls-display.tsx
index 39191fb373..0696b1f5f7 100644
--- a/apps/sim/app/workspace/[workspaceId]/logs/components/tool-calls/tool-calls-display.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/logs/components/tool-calls/tool-calls-display.tsx
@@ -4,7 +4,7 @@ import { useState } from 'react'
import { AlertCircle, CheckCircle2, ChevronDown, ChevronRight, Clock } from 'lucide-react'
import { CopyButton } from '@/components/ui/copy-button'
import { cn } from '@/lib/utils'
-import type { ToolCall, ToolCallMetadata } from '../../../../../../stores/logs/filters/types'
+import type { ToolCall, ToolCallMetadata } from '@/stores/logs/filters/types'
interface ToolCallsDisplayProps {
metadata: ToolCallMetadata
diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/trace-spans/trace-spans-display.tsx b/apps/sim/app/workspace/[workspaceId]/logs/components/trace-spans/trace-spans-display.tsx
index 79344b8a89..092712d1e9 100644
--- a/apps/sim/app/workspace/[workspaceId]/logs/components/trace-spans/trace-spans-display.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/logs/components/trace-spans/trace-spans-display.tsx
@@ -11,7 +11,7 @@ import {
ConnectIcon,
} from '@/components/icons'
import { cn, redactApiKeys } from '@/lib/utils'
-import type { TraceSpan } from '../../../../../../stores/logs/filters/types'
+import type { TraceSpan } from '@/stores/logs/filters/types'
interface TraceSpansDisplayProps {
traceSpans?: TraceSpan[]
diff --git a/apps/sim/app/workspace/[workspaceId]/logs/logs.tsx b/apps/sim/app/workspace/[workspaceId]/logs/logs.tsx
index 959e81dd55..ba126965b5 100644
--- a/apps/sim/app/workspace/[workspaceId]/logs/logs.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/logs/logs.tsx
@@ -8,11 +8,11 @@ import { Input } from '@/components/ui/input'
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
import { createLogger } from '@/lib/logs/console/logger'
import { cn } from '@/lib/utils'
+import { Sidebar } from '@/app/workspace/[workspaceId]/logs/components/sidebar/sidebar'
+import { formatDate } from '@/app/workspace/[workspaceId]/logs/utils/format-date'
import { useDebounce } from '@/hooks/use-debounce'
-import { useFilterStore } from '../../../../stores/logs/filters/store'
-import type { LogsResponse, WorkflowLog } from '../../../../stores/logs/filters/types'
-import { Sidebar } from './components/sidebar/sidebar'
-import { formatDate } from './utils/format-date'
+import { useFilterStore } from '@/stores/logs/filters/store'
+import type { LogsResponse, WorkflowLog } from '@/stores/logs/filters/types'
const logger = createLogger('Logs')
const LOGS_PER_PAGE = 50
diff --git a/apps/sim/app/workspace/[workspaceId]/logs/page.tsx b/apps/sim/app/workspace/[workspaceId]/logs/page.tsx
index 2c4a787eef..ee3d9c0bcf 100644
--- a/apps/sim/app/workspace/[workspaceId]/logs/page.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/logs/page.tsx
@@ -1,3 +1,3 @@
-import Logs from './logs'
+import Logs from '@/app/workspace/[workspaceId]/logs/logs'
export default Logs
diff --git a/apps/sim/app/workspace/[workspaceId]/templates/[id]/page.tsx b/apps/sim/app/workspace/[workspaceId]/templates/[id]/page.tsx
index f0dab0ad89..ee6293106a 100644
--- a/apps/sim/app/workspace/[workspaceId]/templates/[id]/page.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/templates/[id]/page.tsx
@@ -2,10 +2,10 @@ import { and, eq } from 'drizzle-orm'
import { notFound } from 'next/navigation'
import { getSession } from '@/lib/auth'
import { createLogger } from '@/lib/logs/console/logger'
+import TemplateDetails from '@/app/workspace/[workspaceId]/templates/[id]/template'
+import type { Template } from '@/app/workspace/[workspaceId]/templates/templates'
import { db } from '@/db'
import { templateStars, templates } from '@/db/schema'
-import type { Template } from '../templates'
-import TemplateDetails from './template'
const logger = createLogger('TemplatePage')
diff --git a/apps/sim/app/workspace/[workspaceId]/templates/[id]/template.tsx b/apps/sim/app/workspace/[workspaceId]/templates/[id]/template.tsx
index a7fa3d3a11..b64b4c2e15 100644
--- a/apps/sim/app/workspace/[workspaceId]/templates/[id]/template.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/templates/[id]/template.tsx
@@ -49,10 +49,10 @@ import { useRouter } from 'next/navigation'
import { Button } from '@/components/ui/button'
import { createLogger } from '@/lib/logs/console/logger'
import { cn } from '@/lib/utils'
+import type { Template } from '@/app/workspace/[workspaceId]/templates/templates'
+import { categories } from '@/app/workspace/[workspaceId]/templates/templates'
import { WorkflowPreview } from '@/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview'
import type { WorkflowState } from '@/stores/workflows/workflow/types'
-import type { Template } from '../templates'
-import { categories } from '../templates'
const logger = createLogger('TemplateDetails')
diff --git a/apps/sim/app/workspace/[workspaceId]/templates/page.tsx b/apps/sim/app/workspace/[workspaceId]/templates/page.tsx
index 449a152578..d5e7e593b5 100644
--- a/apps/sim/app/workspace/[workspaceId]/templates/page.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/templates/page.tsx
@@ -1,9 +1,9 @@
import { and, desc, eq, sql } from 'drizzle-orm'
import { getSession } from '@/lib/auth'
+import type { Template } from '@/app/workspace/[workspaceId]/templates/templates'
+import Templates from '@/app/workspace/[workspaceId]/templates/templates'
import { db } from '@/db'
import { templateStars, templates } from '@/db/schema'
-import type { Template } from './templates'
-import Templates from './templates'
export default async function TemplatesPage() {
const session = await getSession()
diff --git a/apps/sim/app/workspace/[workspaceId]/templates/templates.tsx b/apps/sim/app/workspace/[workspaceId]/templates/templates.tsx
index 8337447449..3067038ee3 100644
--- a/apps/sim/app/workspace/[workspaceId]/templates/templates.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/templates/templates.tsx
@@ -5,9 +5,12 @@ import { ChevronRight, Search } from 'lucide-react'
import { useParams, useRouter } from 'next/navigation'
import { Input } from '@/components/ui/input'
import { createLogger } from '@/lib/logs/console/logger'
+import { NavigationTabs } from '@/app/workspace/[workspaceId]/templates/components/navigation-tabs'
+import {
+ TemplateCard,
+ TemplateCardSkeleton,
+} from '@/app/workspace/[workspaceId]/templates/components/template-card'
import type { WorkflowState } from '@/stores/workflows/workflow/types'
-import { NavigationTabs } from './components/navigation-tabs'
-import { TemplateCard, TemplateCardSkeleton } from './components/template-card'
const logger = createLogger('TemplatesPage')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/components/chat-deploy/chat-deploy.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/components/chat-deploy/chat-deploy.tsx
index 57648ddf9d..f7c8c701ac 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/components/chat-deploy/chat-deploy.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/components/chat-deploy/chat-deploy.tsx
@@ -33,7 +33,7 @@ import { Textarea } from '@/components/ui/textarea'
import { createLogger } from '@/lib/logs/console/logger'
import { getBaseDomain, getEmailDomain } from '@/lib/urls/utils'
import { cn } from '@/lib/utils'
-import { OutputSelect } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/chat/components/output-select/output-select'
+import { OutputSelect } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/chat/components'
import type { OutputConfig } from '@/stores/panel/chat/types'
const logger = createLogger('ChatDeploy')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/components/deployment-info/components/index.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/components/deployment-info/components/index.ts
new file mode 100644
index 0000000000..a765b6037f
--- /dev/null
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/components/deployment-info/components/index.ts
@@ -0,0 +1,4 @@
+export { ApiEndpoint } from './api-endpoint/api-endpoint'
+export { ApiKey } from './api-key/api-key'
+export { DeployStatus } from './deploy-status/deploy-status'
+export { ExampleCommand } from './example-command/example-command'
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/components/deployment-info/deployment-info.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/components/deployment-info/deployment-info.tsx
index 2713e84178..95a1050548 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/components/deployment-info/deployment-info.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/components/deployment-info/deployment-info.tsx
@@ -12,15 +12,17 @@ import {
AlertDialogHeader,
AlertDialogTitle,
AlertDialogTrigger,
-} from '@/components/ui/alert-dialog'
-import { Button } from '@/components/ui/button'
-import { Skeleton } from '@/components/ui/skeleton'
-import { ApiEndpoint } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/components/deployment-info/components/api-endpoint/api-endpoint'
-import { ApiKey } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/components/deployment-info/components/api-key/api-key'
-import { DeployStatus } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/components/deployment-info/components/deploy-status/deploy-status'
-import { ExampleCommand } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/components/deployment-info/components/example-command/example-command'
+ Button,
+ Skeleton,
+} from '@/components/ui'
+import {
+ ApiEndpoint,
+ ApiKey,
+ DeployStatus,
+ ExampleCommand,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/components/deployment-info/components'
+import { DeployedWorkflowModal } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deployment-controls/components/deployed-workflow-modal'
import type { WorkflowState } from '@/stores/workflows/workflow/types'
-import { DeployedWorkflowModal } from '../../../deployment-controls/components/deployed-workflow-modal'
interface WorkflowDeploymentInfo {
isDeployed: boolean
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/components/index.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/components/index.ts
new file mode 100644
index 0000000000..b583c7b2fc
--- /dev/null
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/components/index.ts
@@ -0,0 +1,3 @@
+export { ChatDeploy } from './chat-deploy/chat-deploy'
+export { DeployForm } from './deploy-form/deploy-form'
+export { DeploymentInfo } from './deployment-info/deployment-info'
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/deploy-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/deploy-modal.tsx
index f9dcb0849f..4857a5ced0 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/deploy-modal.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/deploy-modal.tsx
@@ -20,9 +20,11 @@ import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/u
import { getEnv } from '@/lib/env'
import { createLogger } from '@/lib/logs/console/logger'
import { cn } from '@/lib/utils'
-import { ChatDeploy } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/components/chat-deploy/chat-deploy'
-import { DeployForm } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/components/deploy-form/deploy-form'
-import { DeploymentInfo } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/components/deployment-info/deployment-info'
+import {
+ ChatDeploy,
+ DeployForm,
+ DeploymentInfo,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/components'
import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
import { useSubBlockStore } from '@/stores/workflows/subblock/store'
import { useWorkflowStore } from '@/stores/workflows/workflow/store'
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deployment-controls/components/deployed-workflow-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deployment-controls/components/deployed-workflow-modal.tsx
index b0e18919de..45500ca2a7 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deployment-controls/components/deployed-workflow-modal.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deployment-controls/components/deployed-workflow-modal.tsx
@@ -15,11 +15,11 @@ import {
import { Button } from '@/components/ui/button'
import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'
import { createLogger } from '@/lib/logs/console/logger'
+import { DeployedWorkflowCard } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deployment-controls/components/deployed-workflow-card'
import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
import { mergeSubblockState } from '@/stores/workflows/utils'
import { useWorkflowStore } from '@/stores/workflows/workflow/store'
import type { WorkflowState } from '@/stores/workflows/workflow/types'
-import { DeployedWorkflowCard } from './deployed-workflow-card'
const logger = createLogger('DeployedWorkflowModal')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deployment-controls/deployment-controls.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deployment-controls/deployment-controls.tsx
index dc518c2ea6..74bc725f7c 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deployment-controls/deployment-controls.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deployment-controls/deployment-controls.tsx
@@ -5,10 +5,10 @@ import { Loader2, Rocket } from 'lucide-react'
import { Button } from '@/components/ui/button'
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
import { cn } from '@/lib/utils'
+import { DeployModal } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components'
import type { WorkspaceUserPermissions } from '@/hooks/use-user-permissions'
import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
import type { WorkflowState } from '@/stores/workflows/workflow/types'
-import { DeployModal } from '../deploy-modal/deploy-modal'
interface DeploymentControlsProps {
activeWorkflowId: string | null
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/index.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/index.ts
new file mode 100644
index 0000000000..f6ef340555
--- /dev/null
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/index.ts
@@ -0,0 +1,5 @@
+export { DeployModal } from './deploy-modal/deploy-modal'
+export { DeploymentControls } from './deployment-controls/deployment-controls'
+export { ExportControls } from './export-controls/export-controls'
+export { TemplateModal } from './template-modal/template-modal'
+export { UserAvatarStack } from './user-avatar-stack/user-avatar-stack'
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/user-avatar-stack/user-avatar-stack.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/user-avatar-stack/user-avatar-stack.tsx
index 5ac7c5177a..a9533716ec 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/user-avatar-stack/user-avatar-stack.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/user-avatar-stack/user-avatar-stack.tsx
@@ -1,10 +1,10 @@
'use client'
import { useMemo } from 'react'
+import { ConnectionStatus } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/user-avatar-stack/components/connection-status/connection-status'
+import { UserAvatar } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/user-avatar-stack/components/user-avatar/user-avatar'
+import { usePresence } from '@/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-presence'
import { useCollaborativeWorkflow } from '@/hooks/use-collaborative-workflow'
-import { usePresence } from '../../../../hooks/use-presence'
-import { ConnectionStatus } from './components/connection-status/connection-status'
-import { UserAvatar } from './components/user-avatar/user-avatar'
interface User {
connectionId: string | number
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/control-bar.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/control-bar.tsx
index 9e59e5eb76..59efae27d1 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/control-bar.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/control-bar.tsx
@@ -26,13 +26,26 @@ import {
AlertDialogHeader,
AlertDialogTitle,
AlertDialogTrigger,
-} from '@/components/ui/alert-dialog'
-import { Button } from '@/components/ui/button'
-import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
+ Button,
+ Tooltip,
+ TooltipContent,
+ TooltipTrigger,
+} from '@/components/ui'
import { useSession } from '@/lib/auth-client'
import { createLogger } from '@/lib/logs/console/logger'
import { cn } from '@/lib/utils'
import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/components/providers/workspace-permissions-provider'
+import {
+ DeploymentControls,
+ ExportControls,
+ TemplateModal,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components'
+import { WorkflowTextEditorModal } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-text-editor/workflow-text-editor-modal'
+import { useWorkflowExecution } from '@/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-workflow-execution'
+import {
+ getKeyboardShortcutText,
+ useKeyboardShortcuts,
+} from '@/app/workspace/[workspaceId]/w/hooks/use-keyboard-shortcuts'
import { useFolderStore } from '@/stores/folders/store'
import { usePanelStore } from '@/stores/panel/store'
import { useGeneralStore } from '@/stores/settings/general/store'
@@ -41,15 +54,6 @@ import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
import { useSubBlockStore } from '@/stores/workflows/subblock/store'
import { useWorkflowStore } from '@/stores/workflows/workflow/store'
import type { WorkflowState } from '@/stores/workflows/workflow/types'
-import {
- getKeyboardShortcutText,
- useKeyboardShortcuts,
-} from '../../../hooks/use-keyboard-shortcuts'
-import { useWorkflowExecution } from '../../hooks/use-workflow-execution'
-import { WorkflowTextEditorModal } from '../workflow-text-editor/workflow-text-editor-modal'
-import { DeploymentControls } from './components/deployment-controls/deployment-controls'
-import { ExportControls } from './components/export-controls/export-controls'
-import { TemplateModal } from './components/template-modal/template-modal'
const logger = createLogger('ControlBar')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/index.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/index.ts
new file mode 100644
index 0000000000..201496f21d
--- /dev/null
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/index.ts
@@ -0,0 +1,10 @@
+export { CodePromptBar } from './code-prompt-bar/code-prompt-bar'
+export { ControlBar } from './control-bar/control-bar'
+export { ErrorBoundary } from './error/index'
+export { LoopNodeComponent } from './loop-node/loop-node'
+export { Panel } from './panel/panel'
+export { ParallelNodeComponent } from './parallel-node/parallel-node'
+export { SkeletonLoading } from './skeleton-loading/skeleton-loading'
+export { WorkflowBlock } from './workflow-block/workflow-block'
+export { WorkflowEdge } from './workflow-edge/workflow-edge'
+export { WorkflowTextEditorModal } from './workflow-text-editor/workflow-text-editor-modal'
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/loop-node/loop-node.test.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/loop-node/loop-node.test.tsx
index 89bf07360a..27c9b7115b 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/loop-node/loop-node.test.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/loop-node/loop-node.test.tsx
@@ -1,6 +1,6 @@
import { beforeEach, describe, expect, it, vi } from 'vitest'
+import { LoopNodeComponent } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/loop-node/loop-node'
import { useWorkflowStore } from '@/stores/workflows/workflow/store'
-import { LoopNodeComponent } from './loop-node'
vi.mock('@/stores/workflows/workflow/store', () => ({
useWorkflowStore: vi.fn(),
@@ -56,7 +56,7 @@ vi.mock('@/lib/utils', () => ({
cn: (...classes: any[]) => classes.filter(Boolean).join(' '),
}))
-vi.mock('./components/loop-badges', () => ({
+vi.mock('@/app/workspace/[workspaceId]/w/[workflowId]/components/loop-badges', () => ({
LoopBadges: ({ loopId }: any) => ({ loopId }),
}))
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/loop-node/loop-node.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/loop-node/loop-node.tsx
index 0131e04b79..53c5fa8b50 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/loop-node/loop-node.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/loop-node/loop-node.tsx
@@ -6,8 +6,8 @@ import { StartIcon } from '@/components/icons'
import { Button } from '@/components/ui/button'
import { Card } from '@/components/ui/card'
import { cn } from '@/lib/utils'
+import { LoopBadges } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/loop-node/components/loop-badges'
import { useCollaborativeWorkflow } from '@/hooks/use-collaborative-workflow'
-import { LoopBadges } from './components/loop-badges'
// Add these styles to your existing global CSS file or create a separate CSS module
const LoopNodeStyles: React.FC = () => {
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/chat/chat.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/chat/chat.tsx
index af02734302..14923f6c69 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/chat/chat.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/chat/chat.tsx
@@ -11,14 +11,16 @@ import {
extractPathFromOutputId,
parseOutputContentSafely,
} from '@/lib/response-format'
+import {
+ ChatMessage,
+ OutputSelect,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/chat/components'
+import { useWorkflowExecution } from '@/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-workflow-execution'
import type { BlockLog, ExecutionResult } from '@/executor/types'
import { useExecutionStore } from '@/stores/execution/store'
import { useChatStore } from '@/stores/panel/chat/store'
import { useConsoleStore } from '@/stores/panel/console/store'
import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
-import { useWorkflowExecution } from '../../../../hooks/use-workflow-execution'
-import { ChatMessage } from './components/chat-message/chat-message'
-import { OutputSelect } from './components/output-select/output-select'
const logger = createLogger('ChatPanel')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/chat/components/chat-modal/chat-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/chat/components/chat-modal/chat-modal.tsx
index c29b30882d..279ec0d725 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/chat/components/chat-modal/chat-modal.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/chat/components/chat-modal/chat-modal.tsx
@@ -4,7 +4,7 @@ import { type KeyboardEvent, useEffect, useMemo, useRef } from 'react'
import { ArrowUp, X } from 'lucide-react'
import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
-import { JSONView } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/console/components/json-view/json-view'
+import { JSONView } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/console/components'
import { useWorkflowExecution } from '@/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-workflow-execution'
import { useExecutionStore } from '@/stores/execution/store'
import { useChatStore } from '@/stores/panel/chat/store'
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/chat/components/index.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/chat/components/index.ts
new file mode 100644
index 0000000000..bca270bc4b
--- /dev/null
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/chat/components/index.ts
@@ -0,0 +1,3 @@
+export { ChatMessage } from './chat-message/chat-message'
+export { ChatModal } from './chat-modal/chat-modal'
+export { OutputSelect } from './output-select/output-select'
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/console/components/console-entry/console-entry.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/console/components/console-entry/console-entry.tsx
index d8ee59e7a8..d9ef4fa7dc 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/console/components/console-entry/console-entry.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/console/components/console-entry/console-entry.tsx
@@ -13,11 +13,13 @@ import {
import Image from 'next/image'
import { Button } from '@/components/ui/button'
import { createLogger } from '@/lib/logs/console/logger'
+import {
+ CodeDisplay,
+ JSONView,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/console/components'
import { getBlock } from '@/blocks'
import type { ConsoleEntry as ConsoleEntryType } from '@/stores/panel/console/types'
import { useGeneralStore } from '@/stores/settings/general/store'
-import { CodeDisplay } from '../code-display/code-display'
-import { JSONView } from '../json-view/json-view'
const logger = createLogger('ConsoleEntry')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/console/components/index.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/console/components/index.ts
new file mode 100644
index 0000000000..c8237364e6
--- /dev/null
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/console/components/index.ts
@@ -0,0 +1,3 @@
+export { CodeDisplay } from './code-display/code-display'
+export { ConsoleEntry } from './console-entry/console-entry'
+export { JSONView } from './json-view/json-view'
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/console/console.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/console/console.tsx
index bb15adce33..16b41a6442 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/console/console.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/console/console.tsx
@@ -2,9 +2,9 @@
import { useMemo } from 'react'
import { ScrollArea } from '@/components/ui/scroll-area'
+import { ConsoleEntry } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/console/components'
import { useConsoleStore } from '@/stores/panel/console/store'
import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
-import { ConsoleEntry } from './components/console-entry/console-entry'
interface ConsoleProps {
panelWidth: number
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/copilot-modal/copilot-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/copilot-modal/copilot-modal.tsx
index 7319698712..86d51fdd10 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/copilot-modal/copilot-modal.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/copilot-modal/copilot-modal.tsx
@@ -19,11 +19,13 @@ import {
} from '@/components/ui/dropdown-menu'
import type { CopilotChat } from '@/lib/copilot/api'
import { createLogger } from '@/lib/logs/console/logger'
+import {
+ CheckpointPanel,
+ CopilotWelcome,
+ ProfessionalInput,
+ ProfessionalMessage,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components'
import type { CopilotMessage } from '@/stores/copilot/types'
-import { CheckpointPanel } from '../checkpoint-panel'
-import { ProfessionalInput } from '../professional-input/professional-input'
-import { ProfessionalMessage } from '../professional-message/professional-message'
-import { CopilotWelcome } from '../welcome/welcome'
const logger = createLogger('CopilotModal')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/index.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/index.ts
new file mode 100644
index 0000000000..80ef5d11ef
--- /dev/null
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/index.ts
@@ -0,0 +1,5 @@
+export { CheckpointPanel } from './checkpoint-panel'
+export { CopilotModal } from './copilot-modal/copilot-modal'
+export { ProfessionalInput } from './professional-input/professional-input'
+export { ProfessionalMessage } from './professional-message/professional-message'
+export { CopilotWelcome } from './welcome/welcome'
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/copilot.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/copilot.tsx
index 69bc89f80b..8435c8f6f9 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/copilot.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/copilot.tsx
@@ -2,22 +2,24 @@
import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react'
import { Bot, ChevronDown, History, MessageSquarePlus, MoreHorizontal, Trash2 } from 'lucide-react'
-import { Button } from '@/components/ui/button'
import {
+ Button,
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger,
-} from '@/components/ui/dropdown-menu'
-import { ScrollArea } from '@/components/ui/scroll-area'
+ ScrollArea,
+} from '@/components/ui'
import { createLogger } from '@/lib/logs/console/logger'
+import {
+ CheckpointPanel,
+ CopilotModal,
+ CopilotWelcome,
+ ProfessionalInput,
+ ProfessionalMessage,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components'
import { useCopilotStore } from '@/stores/copilot/store'
import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
-import { CheckpointPanel } from './components/checkpoint-panel'
-import { CopilotModal } from './components/copilot-modal/copilot-modal'
-import { ProfessionalInput } from './components/professional-input/professional-input'
-import { ProfessionalMessage } from './components/professional-message/professional-message'
-import { CopilotWelcome } from './components/welcome/welcome'
const logger = createLogger('Copilot')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/index.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/index.ts
new file mode 100644
index 0000000000..6e11948900
--- /dev/null
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/index.ts
@@ -0,0 +1,4 @@
+export { Chat } from './chat/chat'
+export { Console } from './console/console'
+export { Copilot } from './copilot/copilot'
+export { Variables } from './variables/variables'
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/panel.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/panel.tsx
index 5f1f477fb3..76a34dac77 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/panel.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/panel.tsx
@@ -2,16 +2,18 @@
import { useCallback, useEffect, useRef, useState } from 'react'
import { ArrowDownToLine, CircleSlash, X } from 'lucide-react'
-import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
+import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui'
+import {
+ Chat,
+ Console,
+ Copilot,
+ Variables,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components'
+import { ChatModal } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/chat/components'
import { useChatStore } from '@/stores/panel/chat/store'
import { useConsoleStore } from '@/stores/panel/console/store'
import { usePanelStore } from '@/stores/panel/store'
import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
-import { Chat } from './components/chat/chat'
-import { ChatModal } from './components/chat/components/chat-modal/chat-modal'
-import { Console } from './components/console/console'
-import { Copilot } from './components/copilot/copilot'
-import { Variables } from './components/variables/variables'
export function Panel() {
const [chatMessage, setChatMessage] = useState('')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/parallel-node/parallel-node.test.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/parallel-node/parallel-node.test.tsx
index 39ad706810..6581790ede 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/parallel-node/parallel-node.test.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/parallel-node/parallel-node.test.tsx
@@ -1,6 +1,6 @@
import { beforeEach, describe, expect, it, vi } from 'vitest'
+import { ParallelNodeComponent } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/parallel-node/parallel-node'
import { useWorkflowStore } from '@/stores/workflows/workflow/store'
-import { ParallelNodeComponent } from './parallel-node'
vi.mock('@/stores/workflows/workflow/store', () => ({
useWorkflowStore: vi.fn(),
@@ -63,9 +63,12 @@ vi.mock('@/lib/utils', () => ({
cn: (...classes: any[]) => classes.filter(Boolean).join(' '),
}))
-vi.mock('./components/parallel-badges', () => ({
- ParallelBadges: ({ parallelId }: any) => ({ parallelId }),
-}))
+vi.mock(
+ '@/app/workspace/[workspaceId]/w/[workflowId]/components/parallel-node/components/parallel-badges',
+ () => ({
+ ParallelBadges: ({ parallelId }: any) => ({ parallelId }),
+ })
+)
describe('ParallelNodeComponent', () => {
const mockRemoveBlock = vi.fn()
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/parallel-node/parallel-node.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/parallel-node/parallel-node.tsx
index 688296190d..b561f5ba5c 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/parallel-node/parallel-node.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/parallel-node/parallel-node.tsx
@@ -6,8 +6,8 @@ import { StartIcon } from '@/components/icons'
import { Button } from '@/components/ui/button'
import { Card } from '@/components/ui/card'
import { cn } from '@/lib/utils'
+import { ParallelBadges } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/parallel-node/components/parallel-badges'
import { useCollaborativeWorkflow } from '@/hooks/use-collaborative-workflow'
-import { ParallelBadges } from './components/parallel-badges'
const ParallelNodeStyles: React.FC = () => {
return (
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/channel-selector/channel-selector-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/channel-selector/channel-selector-input.tsx
index 12754b70d7..eac138805e 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/channel-selector/channel-selector-input.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/channel-selector/channel-selector-input.tsx
@@ -2,10 +2,13 @@
import { useEffect, useState } from 'react'
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'
+import {
+ type SlackChannelInfo,
+ SlackChannelSelector,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/channel-selector/components/slack-channel-selector'
+import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/hooks/use-sub-block-value'
import type { SubBlockConfig } from '@/blocks/types'
import { useSubBlockStore } from '@/stores/workflows/subblock/store'
-import { useSubBlockValue } from '../../hooks/use-sub-block-value'
-import { type SlackChannelInfo, SlackChannelSelector } from './components/slack-channel-selector'
interface ChannelSelectorInputProps {
blockId: string
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/checkbox-list.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/checkbox-list.tsx
index 72f0deb46b..32eb010c3e 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/checkbox-list.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/checkbox-list.tsx
@@ -1,7 +1,7 @@
import { Checkbox } from '@/components/ui/checkbox'
import { Label } from '@/components/ui/label'
import { cn } from '@/lib/utils'
-import { useSubBlockValue } from '../hooks/use-sub-block-value'
+import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/hooks/use-sub-block-value'
interface CheckboxListProps {
blockId: string
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/code.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/code.tsx
index e7fa2686ec..ea784349b8 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/code.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/code.tsx
@@ -4,17 +4,16 @@ import { Wand2 } from 'lucide-react'
import { highlight, languages } from 'prismjs'
import 'prismjs/components/prism-javascript'
import 'prismjs/themes/prism.css'
-
import Editor from 'react-simple-code-editor'
import { Button } from '@/components/ui/button'
import { checkEnvVarTrigger, EnvVarDropdown } from '@/components/ui/env-var-dropdown'
import { checkTagTrigger, TagDropdown } from '@/components/ui/tag-dropdown'
import { createLogger } from '@/lib/logs/console/logger'
import { cn } from '@/lib/utils'
+import { CodePromptBar } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/code-prompt-bar/code-prompt-bar'
+import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/hooks/use-sub-block-value'
import { useCodeGeneration } from '@/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-code-generation'
import { useSubBlockStore } from '@/stores/workflows/subblock/store'
-import { CodePromptBar } from '../../../../code-prompt-bar/code-prompt-bar'
-import { useSubBlockValue } from '../hooks/use-sub-block-value'
const logger = createLogger('Code')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/combobox.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/combobox.tsx
index 8512494917..d0e957ff44 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/combobox.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/combobox.tsx
@@ -8,8 +8,8 @@ import { Input } from '@/components/ui/input'
import { checkTagTrigger, TagDropdown } from '@/components/ui/tag-dropdown'
import { createLogger } from '@/lib/logs/console/logger'
import { cn } from '@/lib/utils'
+import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/hooks/use-sub-block-value'
import type { SubBlockConfig } from '@/blocks/types'
-import { useSubBlockValue } from '../hooks/use-sub-block-value'
const logger = createLogger('ComboBox')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/condition-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/condition-input.tsx
index 73f437f500..51f5ccf051 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/condition-input.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/condition-input.tsx
@@ -13,8 +13,8 @@ import { checkTagTrigger, TagDropdown } from '@/components/ui/tag-dropdown'
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
import { createLogger } from '@/lib/logs/console/logger'
import { cn } from '@/lib/utils'
+import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/hooks/use-sub-block-value'
import { useWorkflowStore } from '@/stores/workflows/workflow/store'
-import { useSubBlockValue } from '../hooks/use-sub-block-value'
const logger = createLogger('ConditionInput')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/credential-selector/credential-selector.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/credential-selector/credential-selector.tsx
index e9d8895f6d..4416991e19 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/credential-selector/credential-selector.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/credential-selector/credential-selector.tsx
@@ -21,9 +21,9 @@ import {
type OAuthProvider,
parseProvider,
} from '@/lib/oauth'
+import { OAuthRequiredModal } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/credential-selector/components/oauth-required-modal'
+import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/hooks/use-sub-block-value'
import type { SubBlockConfig } from '@/blocks/types'
-import { useSubBlockValue } from '../../hooks/use-sub-block-value'
-import { OAuthRequiredModal } from './components/oauth-required-modal'
const logger = createLogger('CredentialSelector')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/date-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/date-input.tsx
index 7bda3c424d..7ba4776473 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/date-input.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/date-input.tsx
@@ -7,7 +7,7 @@ import { Button } from '@/components/ui/button'
import { Calendar } from '@/components/ui/calendar'
import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'
import { cn } from '@/lib/utils'
-import { useSubBlockValue } from '../hooks/use-sub-block-value'
+import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/hooks/use-sub-block-value'
interface DateInputProps {
blockId: string
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/document-selector/document-selector.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/document-selector/document-selector.tsx
index 751d6d3e01..04cabc49f1 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/document-selector/document-selector.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/document-selector/document-selector.tsx
@@ -12,8 +12,8 @@ import {
CommandList,
} from '@/components/ui/command'
import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'
+import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/hooks/use-sub-block-value'
import type { SubBlockConfig } from '@/blocks/types'
-import { useSubBlockValue } from '../../hooks/use-sub-block-value'
interface DocumentData {
id: string
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/dropdown.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/dropdown.tsx
index b23445907a..108b3bcb34 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/dropdown.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/dropdown.tsx
@@ -3,8 +3,8 @@ import { Check, ChevronDown } from 'lucide-react'
import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
import { cn } from '@/lib/utils'
+import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/hooks/use-sub-block-value'
import { ResponseBlockHandler } from '@/executor/handlers/response/response-handler'
-import { useSubBlockValue } from '../hooks/use-sub-block-value'
interface DropdownProps {
options:
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/eval-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/eval-input.tsx
index 1ef0070e2b..9ef7560e9c 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/eval-input.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/eval-input.tsx
@@ -3,7 +3,7 @@ import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
import { Label } from '@/components/ui/label'
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
-import { useSubBlockValue } from '../hooks/use-sub-block-value'
+import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/hooks/use-sub-block-value'
interface EvalMetric {
id: string
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/components/confluence-file-selector.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/components/confluence-file-selector.tsx
index e24237ef71..c187bee201 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/components/confluence-file-selector.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/components/confluence-file-selector.tsx
@@ -20,7 +20,7 @@ import {
getServiceIdFromScopes,
type OAuthProvider,
} from '@/lib/oauth'
-import { OAuthRequiredModal } from '../../credential-selector/components/oauth-required-modal'
+import { OAuthRequiredModal } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/credential-selector/components/oauth-required-modal'
const logger = createLogger('ConfluenceFileSelector')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/components/google-drive-picker.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/components/google-drive-picker.tsx
index 61eeb1cfab..55ac7c4b53 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/components/google-drive-picker.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/components/google-drive-picker.tsx
@@ -24,7 +24,7 @@ import {
type OAuthProvider,
parseProvider,
} from '@/lib/oauth'
-import { OAuthRequiredModal } from '../../credential-selector/components/oauth-required-modal'
+import { OAuthRequiredModal } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/credential-selector/components/oauth-required-modal'
const logger = createLogger('GoogleDrivePicker')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/components/index.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/components/index.ts
new file mode 100644
index 0000000000..3c1c250b09
--- /dev/null
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/components/index.ts
@@ -0,0 +1,16 @@
+export type { ConfluenceFileInfo } from './confluence-file-selector'
+export { ConfluenceFileSelector } from './confluence-file-selector'
+export type { DiscordChannelInfo } from './discord-channel-selector'
+export { DiscordChannelSelector } from './discord-channel-selector'
+export type { GoogleCalendarInfo } from './google-calendar-selector'
+export { GoogleCalendarSelector } from './google-calendar-selector'
+export type { FileInfo } from './google-drive-picker'
+export { GoogleDrivePicker } from './google-drive-picker'
+export type { JiraIssueInfo } from './jira-issue-selector'
+export { JiraIssueSelector } from './jira-issue-selector'
+export type { MicrosoftFileInfo } from './microsoft-file-selector'
+export { MicrosoftFileSelector } from './microsoft-file-selector'
+export type { TeamsMessageInfo } from './teams-message-selector'
+export { TeamsMessageSelector } from './teams-message-selector'
+export type { WealthboxItemInfo } from './wealthbox-file-selector'
+export { WealthboxFileSelector } from './wealthbox-file-selector'
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/components/jira-issue-selector.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/components/jira-issue-selector.tsx
index 941b2d2706..6421c2a999 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/components/jira-issue-selector.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/components/jira-issue-selector.tsx
@@ -20,9 +20,9 @@ import {
getServiceIdFromScopes,
type OAuthProvider,
} from '@/lib/oauth'
-import { OAuthRequiredModal } from '../../credential-selector/components/oauth-required-modal'
+import { OAuthRequiredModal } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/credential-selector/components/oauth-required-modal'
-const logger = new Logger('jira_issue_selector')
+const logger = new Logger('JiraIssueSelector')
export interface JiraIssueInfo {
id: string
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/components/microsoft-file-selector.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/components/microsoft-file-selector.tsx
index 52c0183f0b..9549f305ef 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/components/microsoft-file-selector.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/components/microsoft-file-selector.tsx
@@ -23,7 +23,7 @@ import {
type OAuthProvider,
parseProvider,
} from '@/lib/oauth'
-import { OAuthRequiredModal } from '../../credential-selector/components/oauth-required-modal'
+import { OAuthRequiredModal } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/credential-selector/components/oauth-required-modal'
const logger = createLogger('MicrosoftFileSelector')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/components/teams-message-selector.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/components/teams-message-selector.tsx
index 819a16e169..b121ff90d5 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/components/teams-message-selector.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/components/teams-message-selector.tsx
@@ -13,16 +13,16 @@ import {
CommandList,
} from '@/components/ui/command'
import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'
-import { Logger } from '@/lib/logs/console/logger'
+import { createLogger } from '@/lib/logs/console/logger'
import {
type Credential,
getProviderIdFromServiceId,
getServiceIdFromScopes,
type OAuthProvider,
} from '@/lib/oauth'
-import { OAuthRequiredModal } from '../../credential-selector/components/oauth-required-modal'
+import { OAuthRequiredModal } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/credential-selector/components/oauth-required-modal'
-const logger = new Logger('TeamsMessageSelector')
+const logger = createLogger('TeamsMessageSelector')
export interface TeamsMessageInfo {
id: string
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/components/wealthbox-file-selector.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/components/wealthbox-file-selector.tsx
index 186468d73e..8bc06d7458 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/components/wealthbox-file-selector.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/components/wealthbox-file-selector.tsx
@@ -19,7 +19,7 @@ import {
getServiceIdFromScopes,
type OAuthProvider,
} from '@/lib/oauth'
-import { OAuthRequiredModal } from '../../credential-selector/components/oauth-required-modal'
+import { OAuthRequiredModal } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/credential-selector/components/oauth-required-modal'
const logger = createLogger('WealthboxFileSelector')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/file-selector-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/file-selector-input.tsx
index aa3a6ec837..73100096e4 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/file-selector-input.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/file-selector-input.tsx
@@ -3,27 +3,29 @@
import { useEffect, useState } from 'react'
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'
import { getEnv } from '@/lib/env'
+import {
+ type ConfluenceFileInfo,
+ ConfluenceFileSelector,
+ type DiscordChannelInfo,
+ DiscordChannelSelector,
+ type FileInfo,
+ type GoogleCalendarInfo,
+ GoogleCalendarSelector,
+ GoogleDrivePicker,
+ type JiraIssueInfo,
+ JiraIssueSelector,
+ type MicrosoftFileInfo,
+ MicrosoftFileSelector,
+ type TeamsMessageInfo,
+ TeamsMessageSelector,
+ WealthboxFileSelector,
+ type WealthboxItemInfo,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-selector/components'
+import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/hooks/use-sub-block-value'
import type { SubBlockConfig } from '@/blocks/types'
import { useCollaborativeWorkflow } from '@/hooks/use-collaborative-workflow'
import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
import { useSubBlockStore } from '@/stores/workflows/subblock/store'
-import { useSubBlockValue } from '../../hooks/use-sub-block-value'
-import type { ConfluenceFileInfo } from './components/confluence-file-selector'
-import { ConfluenceFileSelector } from './components/confluence-file-selector'
-import type { DiscordChannelInfo } from './components/discord-channel-selector'
-import { DiscordChannelSelector } from './components/discord-channel-selector'
-import type { GoogleCalendarInfo } from './components/google-calendar-selector'
-import { GoogleCalendarSelector } from './components/google-calendar-selector'
-import type { FileInfo } from './components/google-drive-picker'
-import { GoogleDrivePicker } from './components/google-drive-picker'
-import type { JiraIssueInfo } from './components/jira-issue-selector'
-import { JiraIssueSelector } from './components/jira-issue-selector'
-import type { MicrosoftFileInfo } from './components/microsoft-file-selector'
-import { MicrosoftFileSelector } from './components/microsoft-file-selector'
-import type { TeamsMessageInfo } from './components/teams-message-selector'
-import { TeamsMessageSelector } from './components/teams-message-selector'
-import type { WealthboxItemInfo } from './components/wealthbox-file-selector'
-import { WealthboxFileSelector } from './components/wealthbox-file-selector'
interface FileSelectorInputProps {
blockId: string
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-upload.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-upload.tsx
index 7b7f94586a..bf4ab3b5d2 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-upload.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/file-upload.tsx
@@ -5,9 +5,9 @@ import { X } from 'lucide-react'
import { Button } from '@/components/ui/button'
import { Progress } from '@/components/ui/progress'
import { createLogger } from '@/lib/logs/console/logger'
+import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/hooks/use-sub-block-value'
import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
import { useWorkflowStore } from '@/stores/workflows/workflow/store'
-import { useSubBlockValue } from '../hooks/use-sub-block-value'
const logger = createLogger('FileUpload')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/folder-selector/components/folder-selector-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/folder-selector/components/folder-selector-input.tsx
index b723fe9525..f207bae804 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/folder-selector/components/folder-selector-input.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/folder-selector/components/folder-selector-input.tsx
@@ -1,9 +1,12 @@
'use client'
import { useEffect, useState } from 'react'
+import {
+ type FolderInfo,
+ FolderSelector,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/folder-selector/folder-selector'
import type { SubBlockConfig } from '@/blocks/types'
import { useSubBlockStore } from '@/stores/workflows/subblock/store'
-import { type FolderInfo, FolderSelector } from '../folder-selector'
interface FolderSelectorInputProps {
blockId: string
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/index.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/index.ts
new file mode 100644
index 0000000000..c2f8c5d6c3
--- /dev/null
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/index.ts
@@ -0,0 +1,26 @@
+export { ChannelSelectorInput } from './channel-selector/channel-selector-input'
+export { CheckboxList } from './checkbox-list'
+export { Code } from './code'
+export { ComboBox } from './combobox'
+export { ConditionInput } from './condition-input'
+export { CredentialSelector } from './credential-selector/credential-selector'
+export { DateInput } from './date-input'
+export { DocumentSelector } from './document-selector/document-selector'
+export { Dropdown } from './dropdown'
+export { EvalInput } from './eval-input'
+export { FileSelectorInput } from './file-selector/file-selector-input'
+export { FileUpload } from './file-upload'
+export { FolderSelectorInput } from './folder-selector/components/folder-selector-input'
+export { KnowledgeBaseSelector } from './knowledge-base-selector/knowledge-base-selector'
+export { LongInput } from './long-input'
+export { ProjectSelectorInput } from './project-selector/project-selector-input'
+export { ResponseFormat } from './response/response-format'
+export { ScheduleConfig } from './schedule/schedule-config'
+export { ShortInput } from './short-input'
+export { SliderInput } from './slider-input'
+export { InputFormat } from './starter/input-format'
+export { Switch } from './switch'
+export { Table } from './table'
+export { TimeInput } from './time-input'
+export { ToolInput } from './tool-input/tool-input'
+export { WebhookConfig } from './webhook/webhook'
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/knowledge-base-selector/knowledge-base-selector.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/knowledge-base-selector/knowledge-base-selector.tsx
index 223842c49e..9cb5ad6793 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/knowledge-base-selector/knowledge-base-selector.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/knowledge-base-selector/knowledge-base-selector.tsx
@@ -14,9 +14,9 @@ import {
CommandList,
} from '@/components/ui/command'
import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'
+import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/hooks/use-sub-block-value'
import type { SubBlockConfig } from '@/blocks/types'
import { type KnowledgeBaseData, useKnowledgeStore } from '@/stores/knowledge/store'
-import { useSubBlockValue } from '../../../sub-block/hooks/use-sub-block-value'
interface KnowledgeBaseSelectorProps {
blockId: string
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/long-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/long-input.tsx
index ed8fb44f89..1702713eba 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/long-input.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/long-input.tsx
@@ -7,8 +7,8 @@ import { checkTagTrigger, TagDropdown } from '@/components/ui/tag-dropdown'
import { Textarea } from '@/components/ui/textarea'
import { createLogger } from '@/lib/logs/console/logger'
import { cn } from '@/lib/utils'
+import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/hooks/use-sub-block-value'
import type { SubBlockConfig } from '@/blocks/types'
-import { useSubBlockValue } from '../hooks/use-sub-block-value'
const logger = createLogger('LongInput')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/project-selector/components/jira-project-selector.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/project-selector/components/jira-project-selector.tsx
index ec070ee86e..735f2af5a0 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/project-selector/components/jira-project-selector.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/project-selector/components/jira-project-selector.tsx
@@ -13,16 +13,16 @@ import {
CommandList,
} from '@/components/ui/command'
import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'
-import { Logger } from '@/lib/logs/console/logger'
+import { createLogger } from '@/lib/logs/console/logger'
import {
type Credential,
getProviderIdFromServiceId,
getServiceIdFromScopes,
type OAuthProvider,
} from '@/lib/oauth'
-import { OAuthRequiredModal } from '../../credential-selector/components/oauth-required-modal'
+import { OAuthRequiredModal } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/credential-selector/components/oauth-required-modal'
-const logger = new Logger('jira_project_selector')
+const logger = createLogger('JiraProjectSelector')
export interface JiraProjectInfo {
id: string
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/project-selector/project-selector-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/project-selector/project-selector-input.tsx
index 182048bfaf..10c63577c6 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/project-selector/project-selector-input.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/project-selector/project-selector-input.tsx
@@ -2,14 +2,26 @@
import { useEffect, useState } from 'react'
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'
+import {
+ type DiscordServerInfo,
+ DiscordServerSelector,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/project-selector/components/discord-server-selector'
+import {
+ type JiraProjectInfo,
+ JiraProjectSelector,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/project-selector/components/jira-project-selector'
+import {
+ type LinearProjectInfo,
+ LinearProjectSelector,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/project-selector/components/linear-project-selector'
+import {
+ type LinearTeamInfo,
+ LinearTeamSelector,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/project-selector/components/linear-team-selector'
+import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/hooks/use-sub-block-value'
import type { SubBlockConfig } from '@/blocks/types'
import { useCollaborativeWorkflow } from '@/hooks/use-collaborative-workflow'
import { useSubBlockStore } from '@/stores/workflows/subblock/store'
-import { useSubBlockValue } from '../../hooks/use-sub-block-value'
-import { type DiscordServerInfo, DiscordServerSelector } from './components/discord-server-selector'
-import { type JiraProjectInfo, JiraProjectSelector } from './components/jira-project-selector'
-import { type LinearProjectInfo, LinearProjectSelector } from './components/linear-project-selector'
-import { type LinearTeamInfo, LinearTeamSelector } from './components/linear-team-selector'
interface ProjectSelectorInputProps {
blockId: string
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/response/response-format.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/response/response-format.tsx
index 2f1b63b829..3f14840141 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/response/response-format.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/response/response-format.tsx
@@ -1,4 +1,4 @@
-import { ResponseFormat as SharedResponseFormat } from '../starter/input-format'
+import { ResponseFormat as SharedResponseFormat } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/starter/input-format'
export interface JSONProperty {
id: string
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/schedule/components/schedule-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/schedule/components/schedule-modal.tsx
index 2d4e6e8a9d..e8fe9077ea 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/schedule/components/schedule-modal.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/schedule/components/schedule-modal.tsx
@@ -1,7 +1,8 @@
import { useEffect, useState } from 'react'
import { Trash2, X } from 'lucide-react'
-import { Alert, AlertDescription } from '@/components/ui/alert'
import {
+ Alert,
+ AlertDescription,
AlertDialog,
AlertDialogAction,
AlertDialogCancel,
@@ -10,23 +11,24 @@ import {
AlertDialogFooter,
AlertDialogHeader,
AlertDialogTitle,
-} from '@/components/ui/alert-dialog'
-import { Button } from '@/components/ui/button'
-import { DialogContent, DialogFooter, DialogHeader, DialogTitle } from '@/components/ui/dialog'
-import { Input } from '@/components/ui/input'
-import {
+ Button,
+ DialogContent,
+ DialogFooter,
+ DialogHeader,
+ DialogTitle,
+ Input,
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
-} from '@/components/ui/select'
+} from '@/components/ui'
import { createLogger } from '@/lib/logs/console/logger'
import { cn } from '@/lib/utils'
+import { TimeInput } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components'
+import { UnsavedChangesDialog } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components'
+import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/hooks/use-sub-block-value'
import { useSubBlockStore } from '@/stores/workflows/subblock/store'
-import { useSubBlockValue } from '../../../hooks/use-sub-block-value'
-import { TimeInput } from '../../time-input'
-import { UnsavedChangesDialog } from '../../webhook/components/ui/confirmation'
const logger = createLogger('ScheduleModal')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/schedule/schedule-config.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/schedule/schedule-config.tsx
index 3810087a80..4b7ff9c99b 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/schedule/schedule-config.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/schedule/schedule-config.tsx
@@ -6,12 +6,12 @@ import { Dialog } from '@/components/ui/dialog'
import { createLogger } from '@/lib/logs/console/logger'
import { parseCronToHumanReadable } from '@/lib/schedules/utils'
import { formatDateTime } from '@/lib/utils'
+import { ScheduleModal } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/schedule/components/schedule-modal'
+import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/hooks/use-sub-block-value'
import { getBlockWithValues, getWorkflowWithValues } from '@/stores/workflows'
import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
import { useSubBlockStore } from '@/stores/workflows/subblock/store'
import { useWorkflowStore } from '@/stores/workflows/workflow/store'
-import { useSubBlockValue } from '../../hooks/use-sub-block-value'
-import { ScheduleModal } from './components/schedule-modal'
const logger = createLogger('ScheduleConfig')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/short-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/short-input.tsx
index 15bb688f3f..b11fe4e4c1 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/short-input.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/short-input.tsx
@@ -6,8 +6,8 @@ import { Input } from '@/components/ui/input'
import { checkTagTrigger, TagDropdown } from '@/components/ui/tag-dropdown'
import { createLogger } from '@/lib/logs/console/logger'
import { cn } from '@/lib/utils'
+import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/hooks/use-sub-block-value'
import type { SubBlockConfig } from '@/blocks/types'
-import { useSubBlockValue } from '../hooks/use-sub-block-value'
const logger = createLogger('ShortInput')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/slider-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/slider-input.tsx
index a8eb481062..1b6e295f9a 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/slider-input.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/slider-input.tsx
@@ -1,6 +1,6 @@
import { useEffect } from 'react'
import { Slider } from '@/components/ui/slider'
-import { useSubBlockValue } from '../hooks/use-sub-block-value'
+import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/hooks/use-sub-block-value'
interface SliderInputProps {
blockId: string
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/starter/input-format.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/starter/input-format.tsx
index a76fb684f8..684381858b 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/starter/input-format.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/starter/input-format.tsx
@@ -13,7 +13,7 @@ import { Input } from '@/components/ui/input'
import { Label } from '@/components/ui/label'
import { checkTagTrigger, TagDropdown } from '@/components/ui/tag-dropdown'
import { cn } from '@/lib/utils'
-import { useSubBlockValue } from '../../hooks/use-sub-block-value'
+import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/hooks/use-sub-block-value'
interface Field {
id: string
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/switch.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/switch.tsx
index 4812957ebe..60c2d26445 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/switch.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/switch.tsx
@@ -1,6 +1,6 @@
import { Label } from '@/components/ui/label'
import { Switch as UISwitch } from '@/components/ui/switch'
-import { useSubBlockValue } from '../hooks/use-sub-block-value'
+import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/hooks/use-sub-block-value'
interface SwitchProps {
blockId: string
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/table.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/table.tsx
index 510e55c352..ff1e1f5d54 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/table.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/table.tsx
@@ -6,7 +6,7 @@ import { formatDisplayText } from '@/components/ui/formatted-text'
import { Input } from '@/components/ui/input'
import { checkTagTrigger, TagDropdown } from '@/components/ui/tag-dropdown'
import { cn } from '@/lib/utils'
-import { useSubBlockValue } from '../hooks/use-sub-block-value'
+import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/hooks/use-sub-block-value'
interface TableProps {
blockId: string
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/time-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/time-input.tsx
index 43fa61208a..412111d5fa 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/time-input.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/time-input.tsx
@@ -6,7 +6,7 @@ import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'
import { cn } from '@/lib/utils'
-import { useSubBlockValue } from '../hooks/use-sub-block-value'
+import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/hooks/use-sub-block-value'
interface TimeInputProps {
blockId: string
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/tool-input/components/custom-tool-modal/custom-tool-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/tool-input/components/custom-tool-modal/custom-tool-modal.tsx
index 0c53307f80..fd3e9370e5 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/tool-input/components/custom-tool-modal/custom-tool-modal.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/tool-input/components/custom-tool-modal/custom-tool-modal.tsx
@@ -24,10 +24,10 @@ import { Label } from '@/components/ui/label'
import { checkTagTrigger, TagDropdown } from '@/components/ui/tag-dropdown'
import { createLogger } from '@/lib/logs/console/logger'
import { cn } from '@/lib/utils'
+import { CodePromptBar } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/code-prompt-bar/code-prompt-bar'
+import { CodeEditor } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/tool-input/components/code-editor/code-editor'
import { useCodeGeneration } from '@/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-code-generation'
import { useCustomToolsStore } from '@/stores/custom-tools/store'
-import { CodePromptBar } from '../../../../../../../code-prompt-bar/code-prompt-bar'
-import { CodeEditor } from '../code-editor/code-editor'
const logger = createLogger('CustomToolModal')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/tool-input/components/tool-credential-selector.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/tool-input/components/tool-credential-selector.tsx
index e7d6bd75a3..c115b6c7d3 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/tool-input/components/tool-credential-selector.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/tool-input/components/tool-credential-selector.tsx
@@ -17,7 +17,7 @@ import {
type OAuthService,
parseProvider,
} from '@/lib/oauth'
-import { OAuthRequiredModal } from '../../credential-selector/components/oauth-required-modal'
+import { OAuthRequiredModal } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/credential-selector/components/oauth-required-modal'
const logger = createLogger('ToolCredentialSelector')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/tool-input/tool-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/tool-input/tool-input.tsx
index 66eb1cad20..e2bea17d9e 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/tool-input/tool-input.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/tool-input/tool-input.tsx
@@ -15,6 +15,28 @@ import { Toggle } from '@/components/ui/toggle'
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
import type { OAuthProvider, OAuthService } from '@/lib/oauth/oauth'
import { cn } from '@/lib/utils'
+import {
+ ChannelSelectorInput,
+ CheckboxList,
+ Code,
+ ComboBox,
+ DateInput,
+ FileSelectorInput,
+ FileUpload,
+ LongInput,
+ ProjectSelectorInput,
+ ShortInput,
+ SliderInput,
+ Table,
+ TimeInput,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components'
+import {
+ type CustomTool,
+ CustomToolModal,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/tool-input/components/custom-tool-modal/custom-tool-modal'
+import { ToolCommand } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/tool-input/components/tool-command/tool-command'
+import { ToolCredentialSelector } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/tool-input/components/tool-credential-selector'
+import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/hooks/use-sub-block-value'
import { getAllBlocks } from '@/blocks'
import { getProviderFromModel, supportsToolUsageControl } from '@/providers/utils'
import { useCustomToolsStore } from '@/stores/custom-tools/store'
@@ -26,23 +48,6 @@ import {
isPasswordParameter,
type ToolParameterConfig,
} from '@/tools/params'
-import { useSubBlockValue } from '../../hooks/use-sub-block-value'
-import { ChannelSelectorInput } from '../channel-selector/channel-selector-input'
-import { CheckboxList } from '../checkbox-list'
-import { Code } from '../code'
-import { ComboBox } from '../combobox'
-import { DateInput } from '../date-input'
-import { FileSelectorInput } from '../file-selector/file-selector-input'
-import { FileUpload } from '../file-upload'
-import { LongInput } from '../long-input'
-import { ProjectSelectorInput } from '../project-selector/project-selector-input'
-import { ShortInput } from '../short-input'
-import { SliderInput } from '../slider-input'
-import { Table } from '../table'
-import { TimeInput } from '../time-input'
-import { type CustomTool, CustomToolModal } from './components/custom-tool-modal/custom-tool-modal'
-import { ToolCommand } from './components/tool-command/tool-command'
-import { ToolCredentialSelector } from './components/tool-credential-selector'
interface ToolInputProps {
blockId: string
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/index.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/index.ts
new file mode 100644
index 0000000000..b9bb24f2ae
--- /dev/null
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/index.ts
@@ -0,0 +1,25 @@
+export {
+ AirtableConfig,
+ DiscordConfig,
+ GenericConfig,
+ GithubConfig,
+ GmailConfig,
+ MicrosoftTeamsConfig,
+ SlackConfig,
+ StripeConfig,
+ TelegramConfig,
+ WhatsAppConfig,
+} from './providers'
+export {
+ ConfigField,
+ ConfigSection,
+ CopyableField,
+ DeleteConfirmDialog,
+ InstructionsSection,
+ TestResultDisplay,
+ UnsavedChangesDialog,
+ WebhookConfigField,
+ WebhookDialogFooter,
+ WebhookUrlField,
+} from './ui'
+export { WebhookModal } from './webhook-modal'
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/airtable.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/airtable.tsx
index 83ecba2084..1f872464c0 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/airtable.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/airtable.tsx
@@ -1,15 +1,21 @@
import { Info } from 'lucide-react'
-import { Button } from '@/components/ui/button'
-import { Input } from '@/components/ui/input'
-import { Label } from '@/components/ui/label'
-import { Skeleton } from '@/components/ui/skeleton'
-import { Switch } from '@/components/ui/switch'
-import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
-import { ConfigField } from '../ui/config-field'
-import { ConfigSection } from '../ui/config-section'
-import { InstructionsSection } from '../ui/instructions-section'
-import { TestResultDisplay as WebhookTestResult } from '../ui/test-result'
-import { WebhookConfigField } from '../ui/webhook-config-field'
+import {
+ Button,
+ Input,
+ Label,
+ Skeleton,
+ Switch,
+ Tooltip,
+ TooltipContent,
+ TooltipTrigger,
+} from '@/components/ui'
+import {
+ ConfigField,
+ ConfigSection,
+ InstructionsSection,
+ WebhookConfigField,
+ TestResultDisplay as WebhookTestResult,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components'
interface AirtableConfigProps {
baseId: string
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/discord.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/discord.tsx
index 1c0caabca5..4f9020b99c 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/discord.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/discord.tsx
@@ -1,11 +1,11 @@
import { Terminal } from 'lucide-react'
-import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'
-import { CodeBlock } from '@/components/ui/code-block'
-import { Input } from '@/components/ui/input'
-import { ConfigField } from '../ui/config-field'
-import { ConfigSection } from '../ui/config-section'
-import { InstructionsSection } from '../ui/instructions-section'
-import { TestResultDisplay } from '../ui/test-result'
+import { Alert, AlertDescription, AlertTitle, CodeBlock, Input } from '@/components/ui'
+import {
+ ConfigField,
+ ConfigSection,
+ InstructionsSection,
+ TestResultDisplay,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components'
interface DiscordConfigProps {
webhookName: string
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/generic.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/generic.tsx
index 659bad0334..30372a23d5 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/generic.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/generic.tsx
@@ -1,11 +1,11 @@
-import { Checkbox } from '@/components/ui/checkbox'
-import { Input } from '@/components/ui/input'
-import { Label } from '@/components/ui/label'
-import { ConfigField } from '../ui/config-field'
-import { ConfigSection } from '../ui/config-section'
-import { CopyableField } from '../ui/copyable'
-import { InstructionsSection } from '../ui/instructions-section'
-import { TestResultDisplay } from '../ui/test-result'
+import { Checkbox, Input, Label } from '@/components/ui'
+import {
+ ConfigField,
+ ConfigSection,
+ CopyableField,
+ InstructionsSection,
+ TestResultDisplay,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components'
interface GenericConfigProps {
requireAuth: boolean
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/github.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/github.tsx
index e22912d164..bf83190ed2 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/github.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/github.tsx
@@ -5,11 +5,13 @@ import {
SelectTrigger,
SelectValue,
} from '@/components/ui/select'
-import { ConfigField } from '../ui/config-field'
-import { ConfigSection } from '../ui/config-section'
-import { CopyableField } from '../ui/copyable'
-import { InstructionsSection } from '../ui/instructions-section'
-import { TestResultDisplay } from '../ui/test-result'
+import {
+ ConfigField,
+ ConfigSection,
+ CopyableField,
+ InstructionsSection,
+ TestResultDisplay,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components'
interface GithubConfigProps {
contentType: string
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/gmail.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/gmail.tsx
index 8f08c50b1c..79b7ec6586 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/gmail.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/gmail.tsx
@@ -1,23 +1,25 @@
import { useEffect, useState } from 'react'
import { Info } from 'lucide-react'
import { GmailIcon } from '@/components/icons'
-import { Badge } from '@/components/ui/badge'
-import { Button } from '@/components/ui/button'
-import { Checkbox } from '@/components/ui/checkbox'
-import { Label } from '@/components/ui/label'
-import { Notice } from '@/components/ui/notice'
import {
+ Badge,
+ Button,
+ Checkbox,
+ Label,
+ Notice,
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
-} from '@/components/ui/select'
-import { Skeleton } from '@/components/ui/skeleton'
-import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
+ Skeleton,
+ Tooltip,
+ TooltipContent,
+ TooltipTrigger,
+} from '@/components/ui'
import { Logger } from '@/lib/logs/console/logger'
-import { JSONView } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/console/components/json-view/json-view'
-import { ConfigSection } from '../ui/config-section'
+import { JSONView } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/console/components'
+import { ConfigSection } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components'
const logger = new Logger('GmailConfig')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/index.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/index.ts
new file mode 100644
index 0000000000..987395a2bd
--- /dev/null
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/index.ts
@@ -0,0 +1,10 @@
+export { AirtableConfig } from './airtable'
+export { DiscordConfig } from './discord'
+export { GenericConfig } from './generic'
+export { GithubConfig } from './github'
+export { GmailConfig } from './gmail'
+export { MicrosoftTeamsConfig } from './microsoftteams'
+export { SlackConfig } from './slack'
+export { StripeConfig } from './stripe'
+export { TelegramConfig } from './telegram'
+export { WhatsAppConfig } from './whatsapp'
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/microsoftteams.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/microsoftteams.tsx
index 163d958902..2bbacd3479 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/microsoftteams.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/microsoftteams.tsx
@@ -1,11 +1,11 @@
import { Shield, Terminal } from 'lucide-react'
-import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'
-import { CodeBlock } from '@/components/ui/code-block'
-import { Input } from '@/components/ui/input'
-import { ConfigField } from '../ui/config-field'
-import { ConfigSection } from '../ui/config-section'
-import { InstructionsSection } from '../ui/instructions-section'
-import { TestResultDisplay } from '../ui/test-result'
+import { Alert, AlertDescription, AlertTitle, CodeBlock, Input } from '@/components/ui'
+import {
+ ConfigField,
+ ConfigSection,
+ InstructionsSection,
+ TestResultDisplay,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components'
interface MicrosoftTeamsConfigProps {
hmacSecret: string
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/slack.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/slack.tsx
index 4bb03e252f..d3530c04c6 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/slack.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/slack.tsx
@@ -1,10 +1,12 @@
import { SlackIcon } from '@/components/icons'
-import { Notice } from '@/components/ui/notice'
-import { JSONView } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/console/components/json-view/json-view'
-import { ConfigSection } from '../ui/config-section'
-import { InstructionsSection } from '../ui/instructions-section'
-import { TestResultDisplay } from '../ui/test-result'
-import { WebhookConfigField } from '../ui/webhook-config-field'
+import { Notice } from '@/components/ui'
+import { JSONView } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/console/components'
+import {
+ ConfigSection,
+ InstructionsSection,
+ TestResultDisplay,
+ WebhookConfigField,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components'
interface SlackConfigProps {
signingSecret: string
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/stripe.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/stripe.tsx
index dbe9d78e38..7949fe7be9 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/stripe.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/stripe.tsx
@@ -1,7 +1,9 @@
import { ShieldCheck } from 'lucide-react'
import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'
-import { InstructionsSection } from '../ui/instructions-section'
-import { TestResultDisplay } from '../ui/test-result'
+import {
+ InstructionsSection,
+ TestResultDisplay,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components'
interface StripeConfigProps {
isLoadingToken: boolean
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/telegram.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/telegram.tsx
index c143cf73f8..a37dd3d0ec 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/telegram.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/telegram.tsx
@@ -1,9 +1,10 @@
-import { Input } from '@/components/ui/input'
-import { Skeleton } from '@/components/ui/skeleton'
-import { ConfigField } from '../ui/config-field'
-import { ConfigSection } from '../ui/config-section'
-import { InstructionsSection } from '../ui/instructions-section'
-import { TestResultDisplay as WebhookTestResult } from '../ui/test-result'
+import { Input, Skeleton } from '@/components/ui'
+import {
+ ConfigField,
+ ConfigSection,
+ InstructionsSection,
+ TestResultDisplay as WebhookTestResult,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components'
interface TelegramConfigProps {
botToken: string
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/whatsapp.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/whatsapp.tsx
index 080d9c5d74..996dfecd71 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/whatsapp.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/providers/whatsapp.tsx
@@ -1,10 +1,12 @@
import { Network } from 'lucide-react'
-import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'
-import { ConfigField } from '../ui/config-field'
-import { ConfigSection } from '../ui/config-section'
-import { CopyableField } from '../ui/copyable'
-import { InstructionsSection } from '../ui/instructions-section'
-import { TestResultDisplay } from '../ui/test-result'
+import { Alert, AlertDescription, AlertTitle } from '@/components/ui'
+import {
+ ConfigField,
+ ConfigSection,
+ CopyableField,
+ InstructionsSection,
+ TestResultDisplay,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components'
interface WhatsAppConfigProps {
verificationToken: string
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/ui/index.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/ui/index.ts
new file mode 100644
index 0000000000..750428ddd8
--- /dev/null
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/ui/index.ts
@@ -0,0 +1,9 @@
+export { ConfigField } from './config-field'
+export { ConfigSection } from './config-section'
+export { DeleteConfirmDialog, UnsavedChangesDialog } from './confirmation'
+export { CopyableField } from './copyable'
+export { InstructionsSection } from './instructions-section'
+export { TestResultDisplay } from './test-result'
+export { WebhookConfigField } from './webhook-config-field'
+export { WebhookDialogFooter } from './webhook-footer'
+export { WebhookUrlField } from './webhook-url'
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/webhook-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/webhook-modal.tsx
index 603ff7918f..4b5315129e 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/webhook-modal.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components/webhook-modal.tsx
@@ -9,20 +9,26 @@ import {
DialogTitle,
} from '@/components/ui/dialog'
import { createLogger } from '@/lib/logs/console/logger'
-import { type ProviderConfig, WEBHOOK_PROVIDERS } from '../webhook'
-import { AirtableConfig } from './providers/airtable'
-import { DiscordConfig } from './providers/discord'
-import { GenericConfig } from './providers/generic'
-import { GithubConfig } from './providers/github'
-import { GmailConfig } from './providers/gmail'
-import { MicrosoftTeamsConfig } from './providers/microsoftteams'
-import { SlackConfig } from './providers/slack'
-import { StripeConfig } from './providers/stripe'
-import { TelegramConfig } from './providers/telegram'
-import { WhatsAppConfig } from './providers/whatsapp'
-import { DeleteConfirmDialog, UnsavedChangesDialog } from './ui/confirmation'
-import { WebhookDialogFooter } from './ui/webhook-footer'
-import { WebhookUrlField } from './ui/webhook-url'
+import {
+ AirtableConfig,
+ DeleteConfirmDialog,
+ DiscordConfig,
+ GenericConfig,
+ GithubConfig,
+ GmailConfig,
+ MicrosoftTeamsConfig,
+ SlackConfig,
+ StripeConfig,
+ TelegramConfig,
+ UnsavedChangesDialog,
+ WebhookDialogFooter,
+ WebhookUrlField,
+ WhatsAppConfig,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components'
+import {
+ type ProviderConfig,
+ WEBHOOK_PROVIDERS,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/webhook'
const logger = createLogger('WebhookModal')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/webhook.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/webhook.tsx
index 3163b706ca..871160e2b9 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/webhook.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/webhook.tsx
@@ -14,10 +14,10 @@ import {
} from '@/components/icons'
import { Button } from '@/components/ui/button'
import { createLogger } from '@/lib/logs/console/logger'
+import { ToolCredentialSelector } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/tool-input/components/tool-credential-selector'
+import { WebhookModal } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/webhook/components'
+import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/hooks/use-sub-block-value'
import { useSubBlockStore } from '@/stores/workflows/subblock/store'
-import { useSubBlockValue } from '../../hooks/use-sub-block-value'
-import { ToolCredentialSelector } from '../tool-input/components/tool-credential-selector'
-import { WebhookModal } from './components/webhook-modal'
const logger = createLogger('WebhookConfig')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/sub-block.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/sub-block.tsx
index ef64bc7053..db826c9c46 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/sub-block.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/sub-block.tsx
@@ -1,36 +1,37 @@
import { useState } from 'react'
import { AlertTriangle, Info } from 'lucide-react'
-import { Label } from '@/components/ui/label'
-import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
+import { Label, Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui'
+import {
+ ChannelSelectorInput,
+ CheckboxList,
+ Code,
+ ComboBox,
+ ConditionInput,
+ CredentialSelector,
+ DateInput,
+ DocumentSelector,
+ Dropdown,
+ EvalInput,
+ FileSelectorInput,
+ FileUpload,
+ FolderSelectorInput,
+ InputFormat,
+ KnowledgeBaseSelector,
+ LongInput,
+ ProjectSelectorInput,
+ ResponseFormat,
+ ScheduleConfig,
+ ShortInput,
+ SliderInput,
+ Switch,
+ Table,
+ TimeInput,
+ ToolInput,
+ WebhookConfig,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components'
import { getBlock } from '@/blocks/index'
import type { SubBlockConfig } from '@/blocks/types'
import { useWorkflowStore } from '@/stores/workflows/workflow/store'
-import { ChannelSelectorInput } from './components/channel-selector/channel-selector-input'
-import { CheckboxList } from './components/checkbox-list'
-import { Code } from './components/code'
-import { ComboBox } from './components/combobox'
-import { ConditionInput } from './components/condition-input'
-import { CredentialSelector } from './components/credential-selector/credential-selector'
-import { DateInput } from './components/date-input'
-import { DocumentSelector } from './components/document-selector/document-selector'
-import { Dropdown } from './components/dropdown'
-import { EvalInput } from './components/eval-input'
-import { FileSelectorInput } from './components/file-selector/file-selector-input'
-import { FileUpload } from './components/file-upload'
-import { FolderSelectorInput } from './components/folder-selector/components/folder-selector-input'
-import { KnowledgeBaseSelector } from './components/knowledge-base-selector/knowledge-base-selector'
-import { LongInput } from './components/long-input'
-import { ProjectSelectorInput } from './components/project-selector/project-selector-input'
-import { ResponseFormat } from './components/response/response-format'
-import { ScheduleConfig } from './components/schedule/schedule-config'
-import { ShortInput } from './components/short-input'
-import { SliderInput } from './components/slider-input'
-import { InputFormat } from './components/starter/input-format'
-import { Switch } from './components/switch'
-import { Table } from './components/table'
-import { TimeInput } from './components/time-input'
-import { ToolInput } from './components/tool-input/tool-input'
-import { WebhookConfig } from './components/webhook/webhook'
interface SubBlockProps {
blockId: string
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/workflow-block.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/workflow-block.tsx
index 0105de9784..6428e423f6 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/workflow-block.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/workflow-block.tsx
@@ -2,13 +2,13 @@ import { useEffect, useRef, useState } from 'react'
import { BookOpen, Code, Info, RectangleHorizontal, RectangleVertical } from 'lucide-react'
import { useParams } from 'next/navigation'
import { Handle, type NodeProps, Position, useUpdateNodeInternals } from 'reactflow'
-import { Badge } from '@/components/ui/badge'
-import { Button } from '@/components/ui/button'
-import { Card } from '@/components/ui/card'
-import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
+import { Badge, Button, Card, Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui'
import { parseCronToHumanReadable } from '@/lib/schedules/utils'
import { cn, validateName } from '@/lib/utils'
import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/components/providers/workspace-permissions-provider'
+import { ActionBar } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/action-bar/action-bar'
+import { ConnectionBlocks } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/connection-blocks/connection-blocks'
+import { SubBlock } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/sub-block'
import type { BlockConfig, SubBlockConfig } from '@/blocks/types'
import { useCollaborativeWorkflow } from '@/hooks/use-collaborative-workflow'
import { useExecutionStore } from '@/stores/execution/store'
@@ -16,9 +16,6 @@ import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
import { useSubBlockStore } from '@/stores/workflows/subblock/store'
import { mergeSubblockState } from '@/stores/workflows/utils'
import { useWorkflowStore } from '@/stores/workflows/workflow/store'
-import { ActionBar } from './components/action-bar/action-bar'
-import { ConnectionBlocks } from './components/connection-blocks/connection-blocks'
-import { SubBlock } from './components/sub-block/sub-block'
interface WorkflowBlockProps {
type: string
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-text-editor/workflow-exporter.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-text-editor/workflow-exporter.ts
index ae70933d99..ee68e5a4d2 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-text-editor/workflow-exporter.ts
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-text-editor/workflow-exporter.ts
@@ -1,10 +1,10 @@
import { dump as yamlDump, load as yamlLoad } from 'js-yaml'
import { createLogger } from '@/lib/logs/console/logger'
import { generateWorkflowYaml } from '@/lib/workflows/yaml-generator'
+import type { EditorFormat } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-text-editor/workflow-text-editor'
import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
import { useSubBlockStore } from '@/stores/workflows/subblock/store'
import { useWorkflowStore } from '@/stores/workflows/workflow/store'
-import type { EditorFormat } from './workflow-text-editor'
const logger = createLogger('WorkflowExporter')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-text-editor/workflow-text-editor-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-text-editor/workflow-text-editor-modal.tsx
index 645e450ce0..05ac535014 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-text-editor/workflow-text-editor-modal.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-text-editor/workflow-text-editor-modal.tsx
@@ -14,10 +14,13 @@ import {
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
import { createLogger } from '@/lib/logs/console/logger'
import { cn } from '@/lib/utils'
+import { applyWorkflowDiff } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-text-editor/workflow-applier'
+import { exportWorkflow } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-text-editor/workflow-exporter'
+import {
+ type EditorFormat,
+ WorkflowTextEditor,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-text-editor/workflow-text-editor'
import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
-import { applyWorkflowDiff } from './workflow-applier'
-import { exportWorkflow } from './workflow-exporter'
-import { type EditorFormat, WorkflowTextEditor } from './workflow-text-editor'
const logger = createLogger('WorkflowTextEditorModal')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-text-editor/workflow-text-editor.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-text-editor/workflow-text-editor.tsx
index c96fb095c0..b520e89b22 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-text-editor/workflow-text-editor.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-text-editor/workflow-text-editor.tsx
@@ -9,7 +9,7 @@ import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs'
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
import { createLogger } from '@/lib/logs/console/logger'
import { cn } from '@/lib/utils'
-import { CodeEditor } from '../workflow-block/components/sub-block/components/tool-input/components/code-editor/code-editor'
+import { CodeEditor } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/sub-block/components/tool-input/components/code-editor/code-editor'
const logger = createLogger('WorkflowTextEditor')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/layout.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/layout.tsx
index 53da0dbdc5..368f2a2bab 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/layout.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/layout.tsx
@@ -1,4 +1,4 @@
-import { ErrorBoundary } from './components/error'
+import { ErrorBoundary } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/error'
export default function WorkflowLayout({ children }: { children: React.ReactNode }) {
return (
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/page.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/page.tsx
index 3ffb4e2a4a..602552e00f 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/page.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/page.tsx
@@ -1,3 +1,3 @@
-import WorkFlow from './workflow'
+import WorkFlow from '@/app/workspace/[workspaceId]/w/[workflowId]/workflow'
export default WorkFlow
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx
index 7ab8fd7664..064f22e003 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx
@@ -13,21 +13,15 @@ import ReactFlow, {
import 'reactflow/dist/style.css'
import { createLogger } from '@/lib/logs/console/logger'
import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/components/providers/workspace-permissions-provider'
-import { ControlBar } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/control-bar'
-import { ErrorBoundary } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/error/index'
-import { LoopNodeComponent } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/loop-node/loop-node'
-import { Panel } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/panel'
-import { ParallelNodeComponent } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/parallel-node/parallel-node'
-import { getBlock } from '@/blocks'
-import { useCollaborativeWorkflow } from '@/hooks/use-collaborative-workflow'
-import { useWorkspacePermissions } from '@/hooks/use-workspace-permissions'
-import { useExecutionStore } from '@/stores/execution/store'
-import { useVariablesStore } from '@/stores/panel/variables/store'
-import { useGeneralStore } from '@/stores/settings/general/store'
-import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
-import { useWorkflowStore } from '@/stores/workflows/workflow/store'
-import { WorkflowBlock } from './components/workflow-block/workflow-block'
-import { WorkflowEdge } from './components/workflow-edge/workflow-edge'
+import {
+ ControlBar,
+ ErrorBoundary,
+ LoopNodeComponent,
+ Panel,
+ ParallelNodeComponent,
+ WorkflowBlock,
+ WorkflowEdge,
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/components'
import {
applyAutoLayoutSmooth,
detectHandleOrientation,
@@ -37,7 +31,15 @@ import {
isPointInLoopNode,
resizeLoopNodes,
updateNodeParent as updateNodeParentUtil,
-} from './utils'
+} from '@/app/workspace/[workspaceId]/w/[workflowId]/utils'
+import { getBlock } from '@/blocks'
+import { useCollaborativeWorkflow } from '@/hooks/use-collaborative-workflow'
+import { useWorkspacePermissions } from '@/hooks/use-workspace-permissions'
+import { useExecutionStore } from '@/stores/execution/store'
+import { useVariablesStore } from '@/stores/panel/variables/store'
+import { useGeneralStore } from '@/stores/settings/general/store'
+import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
+import { useWorkflowStore } from '@/stores/workflows/workflow/store'
const logger = createLogger('Workflow')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/providers/providers.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/providers/providers.tsx
index d567359f19..86ae371e65 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/components/providers/providers.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/components/providers/providers.tsx
@@ -3,7 +3,7 @@
import React from 'react'
import { TooltipProvider } from '@/components/ui/tooltip'
import { WorkspacePermissionsProvider } from '@/app/workspace/[workspaceId]/components/providers/workspace-permissions-provider'
-import { ThemeProvider } from './theme-provider'
+import { ThemeProvider } from '@/app/workspace/[workspaceId]/w/components/providers/theme-provider'
interface ProvidersProps {
children: React.ReactNode
diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/search-modal/search-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/search-modal/search-modal.tsx
index 420a71e103..00dea62b07 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/components/search-modal/search-modal.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/components/search-modal/search-modal.tsx
@@ -7,9 +7,12 @@ import { BookOpen, Building2, LibraryBig, ScrollText, Search, Shapes, Workflow }
import { useParams, useRouter } from 'next/navigation'
import { Dialog, DialogOverlay, DialogPortal, DialogTitle } from '@/components/ui/dialog'
import { Input } from '@/components/ui/input'
+import {
+ TemplateCard,
+ TemplateCardSkeleton,
+} from '@/app/workspace/[workspaceId]/templates/components/template-card'
+import { getKeyboardShortcutText } from '@/app/workspace/[workspaceId]/w/hooks/use-keyboard-shortcuts'
import { getAllBlocks } from '@/blocks'
-import { TemplateCard, TemplateCardSkeleton } from '../../../templates/components/template-card'
-import { getKeyboardShortcutText } from '../../hooks/use-keyboard-shortcuts'
interface SearchModalProps {
open: boolean
diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/create-menu/create-menu.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/create-menu/create-menu.tsx
index 881f9909ea..d2b00183c1 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/create-menu/create-menu.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/create-menu/create-menu.tsx
@@ -9,8 +9,11 @@ import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover
import { generateFolderName } from '@/lib/naming'
import { cn } from '@/lib/utils'
import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/components/providers/workspace-permissions-provider'
+import {
+ ImportControls,
+ type ImportControlsRef,
+} from '@/app/workspace/[workspaceId]/w/components/sidebar/components/create-menu'
import { useFolderStore } from '@/stores/folders/store'
-import { ImportControls, type ImportControlsRef } from './import-controls'
interface CreateMenuProps {
onCreateWorkflow: (folderId?: string) => Promise
diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/create-menu/index.ts b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/create-menu/index.ts
new file mode 100644
index 0000000000..eadc204a42
--- /dev/null
+++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/create-menu/index.ts
@@ -0,0 +1,2 @@
+export { CreateMenu } from './create-menu'
+export { ImportControls, type ImportControlsRef } from './import-controls'
diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/folder-tree/components/folder-item.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/folder-tree/components/folder-item.tsx
index e5937245e3..82e88364d3 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/folder-tree/components/folder-item.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/folder-tree/components/folder-item.tsx
@@ -16,8 +16,8 @@ import {
} from '@/components/ui/alert-dialog'
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
import { createLogger } from '@/lib/logs/console/logger'
+import { FolderContextMenu } from '@/app/workspace/[workspaceId]/w/components/sidebar/components'
import { type FolderTreeNode, useFolderStore } from '@/stores/folders/store'
-import { FolderContextMenu } from '../../folder-context-menu/folder-context-menu'
const logger = createLogger('FolderItem')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/folder-tree/components/workflow-item.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/folder-tree/components/workflow-item.tsx
index 8bdac483fd..4c14c6c82f 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/folder-tree/components/workflow-item.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/folder-tree/components/workflow-item.tsx
@@ -6,10 +6,10 @@ import Link from 'next/link'
import { useParams } from 'next/navigation'
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
import { createLogger } from '@/lib/logs/console/logger'
+import { WorkflowContextMenu } from '@/app/workspace/[workspaceId]/w/components/sidebar/components'
import { useFolderStore, useIsWorkflowSelected } from '@/stores/folders/store'
import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
import type { WorkflowMetadata } from '@/stores/workflows/registry/types'
-import { WorkflowContextMenu } from '../../workflow-context-menu/workflow-context-menu'
const logger = createLogger('WorkflowItem')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/folder-tree/folder-tree.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/folder-tree/folder-tree.tsx
index f043ed7861..6863fc2f6c 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/folder-tree/folder-tree.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/folder-tree/folder-tree.tsx
@@ -5,11 +5,11 @@ import clsx from 'clsx'
import { useParams, usePathname } from 'next/navigation'
import { Skeleton } from '@/components/ui/skeleton'
import { createLogger } from '@/lib/logs/console/logger'
+import { FolderItem } from '@/app/workspace/[workspaceId]/w/components/sidebar/components/folder-tree/components/folder-item'
+import { WorkflowItem } from '@/app/workspace/[workspaceId]/w/components/sidebar/components/folder-tree/components/workflow-item'
import { type FolderTreeNode, useFolderStore } from '@/stores/folders/store'
import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
import type { WorkflowMetadata } from '@/stores/workflows/registry/types'
-import { FolderItem } from './components/folder-item'
-import { WorkflowItem } from './components/workflow-item'
const logger = createLogger('FolderTree')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/help-modal/help-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/help-modal/help-modal.tsx
index 4745677d8e..fe6d3dd8cf 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/help-modal/help-modal.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/help-modal/help-modal.tsx
@@ -4,7 +4,7 @@ import { useEffect } from 'react'
import { X } from 'lucide-react'
import { Button } from '@/components/ui/button'
import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'
-import { HelpForm } from './components/help-form/help-form'
+import { HelpForm } from '@/app/workspace/[workspaceId]/w/components/sidebar/components/help-modal/components/help-form/help-form'
interface HelpModalProps {
open: boolean
diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/index.ts b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/index.ts
new file mode 100644
index 0000000000..ce2efeb34a
--- /dev/null
+++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/index.ts
@@ -0,0 +1,11 @@
+export { CreateMenu } from './create-menu'
+export { FolderContextMenu } from './folder-context-menu/folder-context-menu'
+export { FolderTree } from './folder-tree/folder-tree'
+export { HelpModal } from './help-modal/help-modal'
+export { LogsFilters } from './logs-filters/logs-filters'
+export { SettingsModal } from './settings-modal/settings-modal'
+export { Toolbar } from './toolbar/toolbar'
+export { WorkflowContextMenu } from './workflow-context-menu/workflow-context-menu'
+export { WorkflowList } from './workflow-list/workflow-list'
+export { WorkspaceHeader } from './workspace-header/workspace-header'
+export { WorkspaceSelector } from './workspace-selector/workspace-selector'
diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/index.ts b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/index.ts
new file mode 100644
index 0000000000..47241b47b5
--- /dev/null
+++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/index.ts
@@ -0,0 +1,9 @@
+export { Account } from './account/account'
+export { ApiKeys } from './api-keys/api-keys'
+export { Credentials } from './credentials/credentials'
+export { EnvironmentVariables } from './environment/environment'
+export { General } from './general/general'
+export { Privacy } from './privacy/privacy'
+export { SettingsNavigation } from './settings-navigation/settings-navigation'
+export { Subscription } from './subscription/subscription'
+export { TeamManagement } from './team-management/team-management'
diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/subscription/components/index.ts b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/subscription/components/index.ts
new file mode 100644
index 0000000000..17c5db87cf
--- /dev/null
+++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/subscription/components/index.ts
@@ -0,0 +1,6 @@
+export { BillingSummary } from './billing-summary'
+export { CancelSubscription } from './cancel-subscription'
+export { EditMemberLimitDialog } from './edit-member-limit-dialog'
+export { TeamSeatsDialog } from './team-seats-dialog'
+export { TeamUsageOverview } from './team-usage-overview'
+export { UsageLimitEditor } from './usage-limit-editor'
diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/subscription/components/team-usage-overview.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/subscription/components/team-usage-overview.tsx
index c64fe8c150..7aeabf74f3 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/subscription/components/team-usage-overview.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/subscription/components/team-usage-overview.tsx
@@ -9,7 +9,7 @@ import { useActiveOrganization } from '@/lib/auth-client'
import { createLogger } from '@/lib/logs/console/logger'
import { useOrganizationStore } from '@/stores/organization'
import type { MemberUsageData } from '@/stores/organization/types'
-import { EditMemberLimitDialog } from './edit-member-limit-dialog'
+import { EditMemberLimitDialog } from './'
const logger = createLogger('TeamUsageOverview')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/subscription/subscription.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/subscription/subscription.tsx
index 0803758333..b5ef365263 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/subscription/subscription.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/subscription/subscription.tsx
@@ -1,17 +1,26 @@
import { useCallback, useEffect, useState } from 'react'
import { AlertCircle, Users } from 'lucide-react'
-import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'
-import { Button } from '@/components/ui/button'
-import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
-import { Skeleton } from '@/components/ui/skeleton'
+import {
+ Alert,
+ AlertDescription,
+ AlertTitle,
+ Button,
+ Card,
+ CardContent,
+ CardHeader,
+ CardTitle,
+ Skeleton,
+} from '@/components/ui'
import { useSession, useSubscription } from '@/lib/auth-client'
import { createLogger } from '@/lib/logs/console/logger'
+import {
+ BillingSummary,
+ CancelSubscription,
+ TeamSeatsDialog,
+ UsageLimitEditor,
+} from '@/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/subscription/components'
import { useOrganizationStore } from '@/stores/organization'
import { useSubscriptionStore } from '@/stores/subscription/store'
-import { BillingSummary } from './components/billing-summary'
-import { CancelSubscription } from './components/cancel-subscription'
-import { TeamSeatsDialog } from './components/team-seats-dialog'
-import { UsageLimitEditor } from './components/usage-limit-editor'
const logger = createLogger('Subscription')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/team-management/components/index.ts b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/team-management/components/index.ts
new file mode 100644
index 0000000000..3a6d760567
--- /dev/null
+++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/team-management/components/index.ts
@@ -0,0 +1,8 @@
+export { MemberInvitationCard } from './member-invitation-card'
+export { NoOrganizationView } from './no-organization-view'
+export { OrganizationCreationDialog } from './organization-creation-dialog'
+export { OrganizationSettingsTab } from './organization-settings-tab'
+export { PendingInvitationsList } from './pending-invitations-list'
+export { RemoveMemberDialog } from './remove-member-dialog'
+export { TeamMembersList } from './team-members-list'
+export { TeamSeatsOverview } from './team-seats-overview'
diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/team-management/components/no-organization-view.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/team-management/components/no-organization-view.tsx
index 672849fbfd..a5aa8f26c4 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/team-management/components/no-organization-view.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/team-management/components/no-organization-view.tsx
@@ -2,7 +2,7 @@ import { RefreshCw } from 'lucide-react'
import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'
import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
-import { OrganizationCreationDialog } from './organization-creation-dialog'
+import { OrganizationCreationDialog } from './'
interface NoOrganizationViewProps {
hasTeamPlan: boolean
diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/team-management/team-management.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/team-management/team-management.tsx
index 956d03868b..1b82071e06 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/team-management/team-management.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/team-management/team-management.tsx
@@ -1,22 +1,33 @@
import { useCallback, useEffect, useRef, useState } from 'react'
-import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'
-import { Skeleton } from '@/components/ui/skeleton'
-import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'
+import {
+ Alert,
+ AlertDescription,
+ AlertTitle,
+ Skeleton,
+ Tabs,
+ TabsContent,
+ TabsList,
+ TabsTrigger,
+} from '@/components/ui'
import { useSession } from '@/lib/auth-client'
import { checkEnterprisePlan } from '@/lib/billing/subscriptions/utils'
import { env } from '@/lib/env'
import { createLogger } from '@/lib/logs/console/logger'
+import {
+ TeamSeatsDialog,
+ TeamUsageOverview,
+} from '@/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/subscription/components'
+import {
+ MemberInvitationCard,
+ NoOrganizationView,
+ OrganizationSettingsTab,
+ PendingInvitationsList,
+ RemoveMemberDialog,
+ TeamMembersList,
+ TeamSeatsOverview,
+} from '@/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components/team-management/components'
import { generateSlug, useOrganizationStore } from '@/stores/organization'
import { useSubscriptionStore } from '@/stores/subscription/store'
-import { TeamSeatsDialog } from '../subscription/components/team-seats-dialog'
-import { TeamUsageOverview } from '../subscription/components/team-usage-overview'
-import { MemberInvitationCard } from './components/member-invitation-card'
-import { NoOrganizationView } from './components/no-organization-view'
-import { OrganizationSettingsTab } from './components/organization-settings-tab'
-import { PendingInvitationsList } from './components/pending-invitations-list'
-import { RemoveMemberDialog } from './components/remove-member-dialog'
-import { TeamMembersList } from './components/team-members-list'
-import { TeamSeatsOverview } from './components/team-seats-overview'
const logger = createLogger('TeamManagement')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/settings-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/settings-modal.tsx
index 4dc7a07082..d15ecbcac1 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/settings-modal.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/settings-modal.tsx
@@ -2,22 +2,23 @@
import { useEffect, useRef, useState } from 'react'
import { X } from 'lucide-react'
-import { Button } from '@/components/ui/button'
-import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'
+import { Button, Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui'
import { client } from '@/lib/auth-client'
import { createLogger } from '@/lib/logs/console/logger'
import { cn } from '@/lib/utils'
+import {
+ Account,
+ ApiKeys,
+ Credentials,
+ EnvironmentVariables,
+ General,
+ Privacy,
+ SettingsNavigation,
+ Subscription,
+ TeamManagement,
+} from '@/app/workspace/[workspaceId]/w/components/sidebar/components/settings-modal/components'
import { useOrganizationStore } from '@/stores/organization'
import { useGeneralStore } from '@/stores/settings/general/store'
-import { Account } from './components/account/account'
-import { ApiKeys } from './components/api-keys/api-keys'
-import { Credentials } from './components/credentials/credentials'
-import { EnvironmentVariables } from './components/environment/environment'
-import { General } from './components/general/general'
-import { Privacy } from './components/privacy/privacy'
-import { SettingsNavigation } from './components/settings-navigation/settings-navigation'
-import { Subscription } from './components/subscription/subscription'
-import { TeamManagement } from './components/team-management/team-management'
const logger = createLogger('SettingsModal')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/toolbar/components/toolbar-loop-block/toolbar-loop-block.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/toolbar/components/toolbar-loop-block/toolbar-loop-block.tsx
index 8757a0f364..9e74719732 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/toolbar/components/toolbar-loop-block/toolbar-loop-block.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/toolbar/components/toolbar-loop-block/toolbar-loop-block.tsx
@@ -2,7 +2,7 @@ import { useCallback } from 'react'
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
import { cn } from '@/lib/utils'
import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/components/providers/workspace-permissions-provider'
-import { LoopTool } from '../../../../../../[workflowId]/components/loop-node/loop-config'
+import { LoopTool } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/loop-node/loop-config'
type LoopToolbarItemProps = {
disabled?: boolean
diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/toolbar/components/toolbar-parallel-block/toolbar-parallel-block.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/toolbar/components/toolbar-parallel-block/toolbar-parallel-block.tsx
index ca532e9c5b..cc0e4fb578 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/toolbar/components/toolbar-parallel-block/toolbar-parallel-block.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/toolbar/components/toolbar-parallel-block/toolbar-parallel-block.tsx
@@ -2,7 +2,7 @@ import { useCallback } from 'react'
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
import { cn } from '@/lib/utils'
import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/components/providers/workspace-permissions-provider'
-import { ParallelTool } from '../../../../../../[workflowId]/components/parallel-node/parallel-config'
+import { ParallelTool } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/parallel-node/parallel-config'
type ParallelToolbarItemProps = {
disabled?: boolean
diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/toolbar/toolbar.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/toolbar/toolbar.tsx
index 678d3c7b4b..4555c9b5d4 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/toolbar/toolbar.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/toolbar/toolbar.tsx
@@ -4,11 +4,11 @@ import { useMemo, useState } from 'react'
import { Search } from 'lucide-react'
import { Input } from '@/components/ui/input'
import { ScrollArea } from '@/components/ui/scroll-area'
+import { ToolbarBlock } from '@/app/workspace/[workspaceId]/w/components/sidebar/components/toolbar/components/toolbar-block/toolbar-block'
+import LoopToolbarItem from '@/app/workspace/[workspaceId]/w/components/sidebar/components/toolbar/components/toolbar-loop-block/toolbar-loop-block'
+import ParallelToolbarItem from '@/app/workspace/[workspaceId]/w/components/sidebar/components/toolbar/components/toolbar-parallel-block/toolbar-parallel-block'
import { getAllBlocks } from '@/blocks'
import type { WorkspaceUserPermissions } from '@/hooks/use-user-permissions'
-import { ToolbarBlock } from './components/toolbar-block/toolbar-block'
-import LoopToolbarItem from './components/toolbar-loop-block/toolbar-loop-block'
-import ParallelToolbarItem from './components/toolbar-parallel-block/toolbar-parallel-block'
interface ToolbarProps {
userPermissions: WorkspaceUserPermissions
diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-selector/workspace-selector.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-selector/workspace-selector.tsx
index 39980f2b9a..4ba6b5776c 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-selector/workspace-selector.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-selector/workspace-selector.tsx
@@ -20,7 +20,7 @@ import { isDev } from '@/lib/environment'
import { createLogger } from '@/lib/logs/console/logger'
import { cn } from '@/lib/utils'
import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/components/providers/workspace-permissions-provider'
-import { InviteModal } from './components/invite-modal/invite-modal'
+import { InviteModal } from '@/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-selector/components/invite-modal/invite-modal'
const logger = createLogger('WorkspaceSelector')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsx
index 43798fc8a8..f10bbc0aaa 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsx
@@ -3,30 +3,30 @@
import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
import { HelpCircle, LibraryBig, ScrollText, Search, Settings, Shapes } from 'lucide-react'
import { useParams, usePathname, useRouter } from 'next/navigation'
-import { Button } from '@/components/ui/button'
-import { ScrollArea } from '@/components/ui/scroll-area'
-import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
+import { Button, ScrollArea, Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui'
import { useSession } from '@/lib/auth-client'
import { createLogger } from '@/lib/logs/console/logger'
import { generateWorkspaceName } from '@/lib/naming'
import { cn } from '@/lib/utils'
import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/components/providers/workspace-permissions-provider'
+import { SearchModal } from '@/app/workspace/[workspaceId]/w/components/search-modal/search-modal'
+import {
+ CreateMenu,
+ FolderTree,
+ HelpModal,
+ LogsFilters,
+ SettingsModal,
+ Toolbar,
+ WorkspaceHeader,
+ WorkspaceSelector,
+} from '@/app/workspace/[workspaceId]/w/components/sidebar/components'
+import { InviteModal } from '@/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-selector/components/invite-modal/invite-modal'
import {
getKeyboardShortcutText,
useGlobalShortcuts,
} from '@/app/workspace/[workspaceId]/w/hooks/use-keyboard-shortcuts'
import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
import type { WorkflowMetadata } from '@/stores/workflows/registry/types'
-import { SearchModal } from '../search-modal/search-modal'
-import { CreateMenu } from './components/create-menu/create-menu'
-import { FolderTree } from './components/folder-tree/folder-tree'
-import { HelpModal } from './components/help-modal/help-modal'
-import { LogsFilters } from './components/logs-filters/logs-filters'
-import { SettingsModal } from './components/settings-modal/settings-modal'
-import { Toolbar } from './components/toolbar/toolbar'
-import { WorkspaceHeader } from './components/workspace-header/workspace-header'
-import { InviteModal } from './components/workspace-selector/components/invite-modal/invite-modal'
-import { WorkspaceSelector } from './components/workspace-selector/workspace-selector'
const logger = createLogger('Sidebar')
diff --git a/apps/sim/blocks/blocks/index.ts b/apps/sim/blocks/blocks/index.ts
deleted file mode 100644
index 0613bd601b..0000000000
--- a/apps/sim/blocks/blocks/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export * from './qdrant'
diff --git a/apps/sim/blocks/blocks/qdrant.ts b/apps/sim/blocks/blocks/qdrant.ts
index f3d7b4a210..1074fabcd5 100644
--- a/apps/sim/blocks/blocks/qdrant.ts
+++ b/apps/sim/blocks/blocks/qdrant.ts
@@ -1,6 +1,6 @@
import { QdrantIcon } from '@/components/icons'
+import type { BlockConfig } from '@/blocks/types'
import type { QdrantResponse } from '@/tools/qdrant/types'
-import type { BlockConfig } from '../types'
export const QdrantBlock: BlockConfig = {
type: 'qdrant',
diff --git a/apps/sim/blocks/blocks/schedule.ts b/apps/sim/blocks/blocks/schedule.ts
index fe1af83378..3b1b6881de 100644
--- a/apps/sim/blocks/blocks/schedule.ts
+++ b/apps/sim/blocks/blocks/schedule.ts
@@ -1,5 +1,5 @@
import { ScheduleIcon } from '@/components/icons'
-import type { BlockConfig } from '../types'
+import type { BlockConfig } from '@/blocks/types'
export const ScheduleBlock: BlockConfig = {
type: 'schedule',
diff --git a/apps/sim/blocks/blocks/webhook.ts b/apps/sim/blocks/blocks/webhook.ts
index d8b3bfbac0..f9b13366b0 100644
--- a/apps/sim/blocks/blocks/webhook.ts
+++ b/apps/sim/blocks/blocks/webhook.ts
@@ -11,7 +11,7 @@ import {
WebhookIcon,
WhatsAppIcon,
} from '@/components/icons'
-import type { BlockConfig } from '../types'
+import type { BlockConfig } from '@/blocks/types'
const getWebhookProviderIcon = (provider: string) => {
const iconMap: Record> = {
diff --git a/apps/sim/components/emails/index.ts b/apps/sim/components/emails/index.ts
new file mode 100644
index 0000000000..a58b287ad6
--- /dev/null
+++ b/apps/sim/components/emails/index.ts
@@ -0,0 +1,8 @@
+export * from './base-styles'
+export { BatchInvitationEmail } from './batch-invitation-email'
+export { default as EmailFooter } from './footer'
+export { InvitationEmail } from './invitation-email'
+export { OTPVerificationEmail } from './otp-verification-email'
+export * from './render-email'
+export { ResetPasswordEmail } from './reset-password-email'
+export { WorkspaceInvitationEmail } from './workspace-invitation'
diff --git a/apps/sim/components/emails/render-email.ts b/apps/sim/components/emails/render-email.ts
index e57f26a226..2cd8829c41 100644
--- a/apps/sim/components/emails/render-email.ts
+++ b/apps/sim/components/emails/render-email.ts
@@ -1,8 +1,10 @@
import { render } from '@react-email/components'
-import { BatchInvitationEmail } from './batch-invitation-email'
-import { InvitationEmail } from './invitation-email'
-import { OTPVerificationEmail } from './otp-verification-email'
-import { ResetPasswordEmail } from './reset-password-email'
+import {
+ BatchInvitationEmail,
+ InvitationEmail,
+ OTPVerificationEmail,
+ ResetPasswordEmail,
+} from '@/components/emails'
export async function renderOTPEmail(
otp: string,
diff --git a/apps/sim/components/ui/index.ts b/apps/sim/components/ui/index.ts
new file mode 100644
index 0000000000..cafeccbbb1
--- /dev/null
+++ b/apps/sim/components/ui/index.ts
@@ -0,0 +1,138 @@
+export { Alert, AlertDescription, AlertTitle } from './alert'
+export {
+ AlertDialog,
+ AlertDialogAction,
+ AlertDialogCancel,
+ AlertDialogContent,
+ AlertDialogDescription,
+ AlertDialogFooter,
+ AlertDialogHeader,
+ AlertDialogTitle,
+ AlertDialogTrigger,
+} from './alert-dialog'
+export { Avatar, AvatarFallback, AvatarImage } from './avatar'
+export { Badge, badgeVariants } from './badge'
+export {
+ Breadcrumb,
+ BreadcrumbEllipsis,
+ BreadcrumbItem,
+ BreadcrumbLink,
+ BreadcrumbList,
+ BreadcrumbPage,
+ BreadcrumbSeparator,
+} from './breadcrumb'
+export { Button, buttonVariants } from './button'
+export { Calendar } from './calendar'
+export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from './card'
+export { Checkbox } from './checkbox'
+export { CodeBlock } from './code-block'
+export { Collapsible, CollapsibleContent, CollapsibleTrigger } from './collapsible'
+export { ColorPicker } from './color-picker'
+export {
+ Command,
+ CommandDialog,
+ CommandEmpty,
+ CommandGroup,
+ CommandInput,
+ CommandItem,
+ CommandList,
+ CommandSeparator,
+ CommandShortcut,
+} from './command'
+export { CopyButton } from './copy-button'
+export {
+ Dialog,
+ DialogClose,
+ DialogContent,
+ DialogDescription,
+ DialogFooter,
+ DialogHeader,
+ DialogOverlay,
+ DialogPortal,
+ DialogTitle,
+ DialogTrigger,
+} from './dialog'
+export {
+ DropdownMenu,
+ DropdownMenuCheckboxItem,
+ DropdownMenuContent,
+ DropdownMenuGroup,
+ DropdownMenuItem,
+ DropdownMenuLabel,
+ DropdownMenuPortal,
+ DropdownMenuRadioGroup,
+ DropdownMenuRadioItem,
+ DropdownMenuSeparator,
+ DropdownMenuShortcut,
+ DropdownMenuSub,
+ DropdownMenuSubContent,
+ DropdownMenuSubTrigger,
+ DropdownMenuTrigger,
+} from './dropdown-menu'
+export { checkEnvVarTrigger, EnvVarDropdown } from './env-var-dropdown'
+export {
+ Form,
+ FormControl,
+ FormDescription,
+ FormField,
+ FormItem,
+ FormLabel,
+ FormMessage,
+ useFormField,
+} from './form'
+export { formatDisplayText } from './formatted-text'
+export { Input } from './input'
+export { InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot } from './input-otp'
+export { OTPInputForm } from './input-otp-form'
+export { Label } from './label'
+export { LoadingAgent } from './loading-agent'
+export { Notice } from './notice'
+export { Popover, PopoverContent, PopoverTrigger } from './popover'
+export { Progress } from './progress'
+export { RadioGroup, RadioGroupItem } from './radio-group'
+export { ScrollArea, ScrollBar } from './scroll-area'
+export { SearchHighlight } from './search-highlight'
+export {
+ Select,
+ SelectContent,
+ SelectGroup,
+ SelectItem,
+ SelectLabel,
+ SelectScrollDownButton,
+ SelectScrollUpButton,
+ SelectSeparator,
+ SelectTrigger,
+ SelectValue,
+} from './select'
+export { Separator } from './separator'
+export {
+ Sheet,
+ SheetClose,
+ SheetContent,
+ SheetDescription,
+ SheetFooter,
+ SheetHeader,
+ SheetOverlay,
+ SheetPortal,
+ SheetTitle,
+ SheetTrigger,
+} from './sheet'
+export { Skeleton } from './skeleton'
+export { Slider } from './slider'
+export { Switch } from './switch'
+export {
+ Table,
+ TableBody,
+ TableCaption,
+ TableCell,
+ TableFooter,
+ TableHead,
+ TableHeader,
+ TableRow,
+} from './table'
+export { Tabs, TabsContent, TabsList, TabsTrigger } from './tabs'
+export { checkTagTrigger, TagDropdown } from './tag-dropdown'
+export { Textarea } from './textarea'
+export { Toggle, toggleVariants } from './toggle'
+export { ToolCallCompletion, ToolCallExecution } from './tool-call'
+export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './tooltip'
diff --git a/apps/sim/components/ui/input-otp-form.tsx b/apps/sim/components/ui/input-otp-form.tsx
index 3de39e5648..1fe8a3ef0b 100644
--- a/apps/sim/components/ui/input-otp-form.tsx
+++ b/apps/sim/components/ui/input-otp-form.tsx
@@ -2,8 +2,8 @@
import { useState } from 'react'
import { Loader2 } from 'lucide-react'
-import { Button } from './button'
-import { InputOTP, InputOTPGroup, InputOTPSlot } from './input-otp'
+import { Button } from '@/components/ui/button'
+import { InputOTP, InputOTPGroup, InputOTPSlot } from '@/components/ui/input-otp'
interface OTPInputFormProps {
onSubmit: (otp: string) => void
diff --git a/apps/sim/components/ui/tag-dropdown.test.tsx b/apps/sim/components/ui/tag-dropdown.test.tsx
index d95584d524..1af14fe9cd 100644
--- a/apps/sim/components/ui/tag-dropdown.test.tsx
+++ b/apps/sim/components/ui/tag-dropdown.test.tsx
@@ -1,8 +1,8 @@
import { describe, expect, test, vi } from 'vitest'
+import { checkTagTrigger } from '@/components/ui/tag-dropdown'
import { extractFieldsFromSchema, parseResponseFormatSafely } from '@/lib/response-format'
import type { BlockState } from '@/stores/workflows/workflow/types'
import { generateLoopBlocks } from '@/stores/workflows/workflow/utils'
-import { checkTagTrigger } from './tag-dropdown'
vi.mock('@/stores/workflows/workflow/store', () => ({
useWorkflowStore: vi.fn(() => ({
diff --git a/apps/sim/db/index.ts b/apps/sim/db/index.ts
index c9b9736c4b..0ba1bd9c76 100644
--- a/apps/sim/db/index.ts
+++ b/apps/sim/db/index.ts
@@ -2,7 +2,7 @@ import { drizzle, type PostgresJsDatabase } from 'drizzle-orm/postgres-js'
import postgres from 'postgres'
import { env } from '@/lib/env'
import { isDev } from '@/lib/environment'
-import * as schema from './schema'
+import * as schema from '@/db/schema'
// In production, use the Vercel-generated POSTGRES_URL
// In development, use the direct DATABASE_URL
diff --git a/apps/sim/executor/__test-utils__/executor-mocks.ts b/apps/sim/executor/__test-utils__/executor-mocks.ts
index 5c834d6706..94dda1279c 100644
--- a/apps/sim/executor/__test-utils__/executor-mocks.ts
+++ b/apps/sim/executor/__test-utils__/executor-mocks.ts
@@ -28,7 +28,7 @@ export const createMockHandler = (
* Setup all handler mocks with default behaviors
*/
export const setupHandlerMocks = () => {
- vi.doMock('../handlers', () => ({
+ vi.doMock('@/executor/handlers', () => ({
AgentBlockHandler: createMockHandler('agent'),
RouterBlockHandler: createMockHandler('router'),
ConditionBlockHandler: createMockHandler('condition'),
@@ -99,14 +99,14 @@ export const setupStoreMocks = (options?: {
* Setup core executor mocks (PathTracker, InputResolver, LoopManager, ParallelManager)
*/
export const setupExecutorCoreMocks = () => {
- vi.doMock('../path', () => ({
+ vi.doMock('@/executor/path', () => ({
PathTracker: vi.fn().mockImplementation(() => ({
updateExecutionPaths: vi.fn(),
isInActivePath: vi.fn().mockReturnValue(true),
})),
}))
- vi.doMock('../resolver', () => ({
+ vi.doMock('@/executor/resolver', () => ({
InputResolver: vi.fn().mockImplementation(() => ({
resolveInputs: vi.fn().mockReturnValue({}),
resolveBlockReferences: vi.fn().mockImplementation((value) => value),
@@ -115,7 +115,7 @@ export const setupExecutorCoreMocks = () => {
})),
}))
- vi.doMock('../loops', () => ({
+ vi.doMock('@/executor/loops', () => ({
LoopManager: vi.fn().mockImplementation(() => ({
processLoopIterations: vi.fn().mockResolvedValue(false),
getLoopIndex: vi.fn().mockImplementation((loopId, blockId, context) => {
@@ -124,7 +124,7 @@ export const setupExecutorCoreMocks = () => {
})),
}))
- vi.doMock('../parallels', () => ({
+ vi.doMock('@/executor/parallels', () => ({
ParallelManager: vi.fn().mockImplementation(() => ({
processParallelIterations: vi.fn().mockResolvedValue(false),
createVirtualBlockInstances: vi.fn().mockReturnValue([]),
@@ -904,14 +904,14 @@ export const setupParallelTestMocks = (options?: {
setupExecutorCoreMocks()
// Setup parallel manager with correct relative path
- vi.doMock('../parallels', () =>
+ vi.doMock('@/executor/parallels', () =>
createParallelManagerMock({
maxChecks: options?.maxParallelChecks,
})
)
// Setup loop manager with correct relative path
- vi.doMock('../loops', () => createLoopManagerMock())
+ vi.doMock('@/executor/loops', () => createLoopManagerMock())
}
/**
diff --git a/apps/sim/executor/__test-utils__/mock-dependencies.ts b/apps/sim/executor/__test-utils__/mock-dependencies.ts
index 1eafa379e7..ed47fa99bb 100644
--- a/apps/sim/executor/__test-utils__/mock-dependencies.ts
+++ b/apps/sim/executor/__test-utils__/mock-dependencies.ts
@@ -55,8 +55,8 @@ vi.mock('@/providers/utils', async (importOriginal) => {
})
// Executor utilities
-vi.mock('../../path')
-vi.mock('../../resolver', () => ({
+vi.mock('@/executor/path')
+vi.mock('@/executor/resolver', () => ({
InputResolver: vi.fn(),
}))
diff --git a/apps/sim/executor/__test-utils__/test-executor.ts b/apps/sim/executor/__test-utils__/test-executor.ts
index 973da3f0c6..281865b295 100644
--- a/apps/sim/executor/__test-utils__/test-executor.ts
+++ b/apps/sim/executor/__test-utils__/test-executor.ts
@@ -4,8 +4,8 @@
* A testable version of the Executor class that can be used in tests
* without requiring all the complex dependencies.
*/
-import { Executor } from '..'
-import type { ExecutionResult, NormalizedBlockOutput } from '../types'
+import { Executor } from '@/executor'
+import type { ExecutionResult, NormalizedBlockOutput } from '@/executor/types'
/**
* Test implementation of Executor for unit testing.
diff --git a/apps/sim/executor/handlers/agent/agent-handler.ts b/apps/sim/executor/handlers/agent/agent-handler.ts
index 7e04f014ef..9e64a95e69 100644
--- a/apps/sim/executor/handlers/agent/agent-handler.ts
+++ b/apps/sim/executor/handlers/agent/agent-handler.ts
@@ -149,7 +149,7 @@ export class AgentBlockHandler implements BlockHandler {
const userProvidedParams = tool.params || {}
// Import the utility function
- const { filterSchemaForLLM, mergeToolParameters } = await import('../../../tools/params')
+ const { filterSchemaForLLM, mergeToolParameters } = await import('@/tools/params')
// Create schema excluding user-provided parameters
const filteredSchema = filterSchemaForLLM(tool.schema.function.parameters, userProvidedParams)
diff --git a/apps/sim/executor/handlers/api/api-handler.test.ts b/apps/sim/executor/handlers/api/api-handler.test.ts
index 74b84357da..a689eb205c 100644
--- a/apps/sim/executor/handlers/api/api-handler.test.ts
+++ b/apps/sim/executor/handlers/api/api-handler.test.ts
@@ -1,4 +1,4 @@
-import '../../__test-utils__/mock-dependencies'
+import '@/executor/__test-utils__/mock-dependencies'
import { beforeEach, describe, expect, it, type Mock, vi } from 'vitest'
import { BlockType } from '@/executor/consts'
diff --git a/apps/sim/executor/handlers/condition/condition-handler.test.ts b/apps/sim/executor/handlers/condition/condition-handler.test.ts
index 5873bc74a5..75a399f27b 100644
--- a/apps/sim/executor/handlers/condition/condition-handler.test.ts
+++ b/apps/sim/executor/handlers/condition/condition-handler.test.ts
@@ -1,4 +1,4 @@
-import '../../__test-utils__/mock-dependencies'
+import '@/executor/__test-utils__/mock-dependencies'
import { beforeEach, describe, expect, it, type Mocked, type MockedClass, vi } from 'vitest'
import { BlockType } from '@/executor/consts'
diff --git a/apps/sim/executor/handlers/evaluator/evaluator-handler.test.ts b/apps/sim/executor/handlers/evaluator/evaluator-handler.test.ts
index a35ff4d3a1..ce370ed53e 100644
--- a/apps/sim/executor/handlers/evaluator/evaluator-handler.test.ts
+++ b/apps/sim/executor/handlers/evaluator/evaluator-handler.test.ts
@@ -1,4 +1,4 @@
-import '../../__test-utils__/mock-dependencies'
+import '@/executor/__test-utils__/mock-dependencies'
import { beforeEach, describe, expect, it, type Mock, vi } from 'vitest'
import { BlockType } from '@/executor/consts'
diff --git a/apps/sim/executor/handlers/generic/generic-handler.test.ts b/apps/sim/executor/handlers/generic/generic-handler.test.ts
index 22339e5b3a..ca53dbf296 100644
--- a/apps/sim/executor/handlers/generic/generic-handler.test.ts
+++ b/apps/sim/executor/handlers/generic/generic-handler.test.ts
@@ -1,4 +1,4 @@
-import '../../__test-utils__/mock-dependencies'
+import '@/executor/__test-utils__/mock-dependencies'
import { beforeEach, describe, expect, it, type Mock, vi } from 'vitest'
import { BlockType } from '@/executor/consts'
diff --git a/apps/sim/executor/handlers/router/router-handler.test.ts b/apps/sim/executor/handlers/router/router-handler.test.ts
index b6ef6ccb92..f1badc9c01 100644
--- a/apps/sim/executor/handlers/router/router-handler.test.ts
+++ b/apps/sim/executor/handlers/router/router-handler.test.ts
@@ -1,4 +1,4 @@
-import '../../__test-utils__/mock-dependencies'
+import '@/executor/__test-utils__/mock-dependencies'
import {
beforeEach,
diff --git a/apps/sim/executor/index.test.ts b/apps/sim/executor/index.test.ts
index b6d9c6e8c5..e9f838ecce 100644
--- a/apps/sim/executor/index.test.ts
+++ b/apps/sim/executor/index.test.ts
@@ -339,7 +339,7 @@ describe('Executor', () => {
setupAllMocks({ isDebugModeEnabled: true })
// Import Executor AFTER setting up mocks
- const { Executor } = await import('./index')
+ const { Executor } = await import('@/executor/index')
const workflow = createMinimalWorkflow()
const executor = new Executor(workflow)
@@ -357,7 +357,7 @@ describe('Executor', () => {
setupAllMocks({ isDebugModeEnabled: false })
// Import Executor AFTER setting up mocks
- const { Executor } = await import('./index')
+ const { Executor } = await import('@/executor/index')
const workflow = createMinimalWorkflow()
const executor = new Executor(workflow)
diff --git a/apps/sim/hooks/use-user-permissions.ts b/apps/sim/hooks/use-user-permissions.ts
index bd23012c64..1fc2ab6016 100644
--- a/apps/sim/hooks/use-user-permissions.ts
+++ b/apps/sim/hooks/use-user-permissions.ts
@@ -1,7 +1,7 @@
import { useMemo } from 'react'
import { useSession } from '@/lib/auth-client'
import { createLogger } from '@/lib/logs/console/logger'
-import type { PermissionType, WorkspacePermissions } from './use-workspace-permissions'
+import type { PermissionType, WorkspacePermissions } from '@/hooks/use-workspace-permissions'
const logger = createLogger('useUserPermissions')
diff --git a/apps/sim/lib/auth.ts b/apps/sim/lib/auth.ts
index 597e4c141c..af7cf4421f 100644
--- a/apps/sim/lib/auth.ts
+++ b/apps/sim/lib/auth.ts
@@ -1064,7 +1064,7 @@ export const auth = betterAuth({
// Initialize usage limits for new user
try {
- const { initializeUserUsageLimit } = await import('./billing')
+ const { initializeUserUsageLimit } = await import('@/lib/billing')
await initializeUserUsageLimit(user.id)
logger.info('Usage limits initialized for new user', { userId: user.id })
} catch (error) {
@@ -1267,8 +1267,10 @@ export const auth = betterAuth({
// Sync usage limits and initialize billing period for the user/organization
try {
- const { syncUsageLimitsFromSubscription } = await import('./billing')
- const { initializeBillingPeriod } = await import('./billing/core/billing-periods')
+ const { syncUsageLimitsFromSubscription } = await import('@/lib/billing')
+ const { initializeBillingPeriod } = await import(
+ '@/lib/billing/core/billing-periods'
+ )
await syncUsageLimitsFromSubscription(subscription.referenceId)
logger.info('Usage limits synced after subscription creation', {
@@ -1314,7 +1316,7 @@ export const auth = betterAuth({
// Sync usage limits for the user/organization
try {
- const { syncUsageLimitsFromSubscription } = await import('./billing')
+ const { syncUsageLimitsFromSubscription } = await import('@/lib/billing')
await syncUsageLimitsFromSubscription(subscription.referenceId)
logger.info('Usage limits synced after subscription update', {
referenceId: subscription.referenceId,
diff --git a/apps/sim/lib/autolayout/algorithms/hierarchical.ts b/apps/sim/lib/autolayout/algorithms/hierarchical.ts
index a9cb889844..47565f55ea 100644
--- a/apps/sim/lib/autolayout/algorithms/hierarchical.ts
+++ b/apps/sim/lib/autolayout/algorithms/hierarchical.ts
@@ -1,4 +1,4 @@
-import type { LayoutEdge, LayoutNode, LayoutOptions, LayoutResult } from '../types'
+import type { LayoutEdge, LayoutNode, LayoutOptions, LayoutResult } from '@/lib/autolayout/types'
interface LayerNode {
node: LayoutNode
diff --git a/apps/sim/lib/autolayout/algorithms/smart.ts b/apps/sim/lib/autolayout/algorithms/smart.ts
index a9e5fc5a08..35df5c275a 100644
--- a/apps/sim/lib/autolayout/algorithms/smart.ts
+++ b/apps/sim/lib/autolayout/algorithms/smart.ts
@@ -1,5 +1,5 @@
-import type { LayoutEdge, LayoutNode, LayoutOptions, LayoutResult } from '../types'
-import { calculateHierarchicalLayout } from './hierarchical'
+import { calculateHierarchicalLayout } from '@/lib/autolayout/algorithms/hierarchical'
+import type { LayoutEdge, LayoutNode, LayoutOptions, LayoutResult } from '@/lib/autolayout/types'
interface WorkflowAnalysis {
nodeCount: number
diff --git a/apps/sim/lib/autolayout/service.ts b/apps/sim/lib/autolayout/service.ts
index 35723f8c2f..e019c927ba 100644
--- a/apps/sim/lib/autolayout/service.ts
+++ b/apps/sim/lib/autolayout/service.ts
@@ -1,8 +1,14 @@
+import { calculateHierarchicalLayout } from '@/lib/autolayout/algorithms/hierarchical'
+import { calculateSmartLayout } from '@/lib/autolayout/algorithms/smart'
+import type {
+ LayoutEdge,
+ LayoutNode,
+ LayoutOptions,
+ LayoutResult,
+ WorkflowGraph,
+} from '@/lib/autolayout/types'
+import { BLOCK_CATEGORIES, BLOCK_DIMENSIONS } from '@/lib/autolayout/types'
import { createLogger } from '@/lib/logs/console/logger'
-import { calculateHierarchicalLayout } from './algorithms/hierarchical'
-import { calculateSmartLayout } from './algorithms/smart'
-import type { LayoutEdge, LayoutNode, LayoutOptions, LayoutResult, WorkflowGraph } from './types'
-import { BLOCK_CATEGORIES, BLOCK_DIMENSIONS } from './types'
const logger = createLogger('AutoLayoutService')
diff --git a/apps/sim/lib/billing/core/billing-periods.test.ts b/apps/sim/lib/billing/core/billing-periods.test.ts
index 66ae18077c..9b52c90cdf 100644
--- a/apps/sim/lib/billing/core/billing-periods.test.ts
+++ b/apps/sim/lib/billing/core/billing-periods.test.ts
@@ -1,5 +1,8 @@
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
-import { calculateBillingPeriod, calculateNextBillingPeriod } from './billing-periods'
+import {
+ calculateBillingPeriod,
+ calculateNextBillingPeriod,
+} from '@/lib/billing/core/billing-periods'
vi.mock('@/lib/logs/console/logger', () => ({
createLogger: vi.fn().mockReturnValue({
diff --git a/apps/sim/lib/billing/core/billing.test.ts b/apps/sim/lib/billing/core/billing.test.ts
index 4d2c8aa5fb..3f8a8424e4 100644
--- a/apps/sim/lib/billing/core/billing.test.ts
+++ b/apps/sim/lib/billing/core/billing.test.ts
@@ -1,6 +1,12 @@
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
-import { getPlanPricing, getUsersAndOrganizationsForOverageBilling } from './billing'
-import { calculateBillingPeriod, calculateNextBillingPeriod } from './billing-periods'
+import {
+ getPlanPricing,
+ getUsersAndOrganizationsForOverageBilling,
+} from '@/lib/billing/core/billing'
+import {
+ calculateBillingPeriod,
+ calculateNextBillingPeriod,
+} from '@/lib/billing/core/billing-periods'
vi.mock('@/db', () => ({
db: {
@@ -28,7 +34,7 @@ vi.mock('@/lib/billing/core/usage', () => ({
getUserUsageData: vi.fn(),
}))
-vi.mock('../stripe-client', () => ({
+vi.mock('@/lib/billing/core/stripe-client', () => ({
getStripeClient: vi.fn().mockReturnValue(null),
requireStripeClient: vi.fn().mockImplementation(() => {
throw new Error(
diff --git a/apps/sim/lib/billing/index.ts b/apps/sim/lib/billing/index.ts
index c02347e513..d2caa6935a 100644
--- a/apps/sim/lib/billing/index.ts
+++ b/apps/sim/lib/billing/index.ts
@@ -3,31 +3,31 @@
* Provides clean, organized exports for the billing system
*/
-export * from './calculations/usage-monitor'
-export * from './core/billing'
-export * from './core/billing-periods'
-export * from './core/organization-billing'
-export * from './core/subscription'
+export * from '@/lib/billing/calculations/usage-monitor'
+export * from '@/lib/billing/core/billing'
+export * from '@/lib/billing/core/billing-periods'
+export * from '@/lib/billing/core/organization-billing'
+export * from '@/lib/billing/core/subscription'
export {
getHighestPrioritySubscription as getActiveSubscription,
getUserSubscriptionState as getSubscriptionState,
isEnterprisePlan as hasEnterprisePlan,
isProPlan as hasProPlan,
isTeamPlan as hasTeamPlan,
-} from './core/subscription'
-export * from './core/usage'
+} from '@/lib/billing/core/subscription'
+export * from '@/lib/billing/core/usage'
export {
checkUsageStatus,
getTeamUsageLimits,
getUserUsageData as getUsageData,
getUserUsageLimit as getUsageLimit,
updateUserUsageLimit as updateUsageLimit,
-} from './core/usage'
-export * from './subscriptions/utils'
+} from '@/lib/billing/core/usage'
+export * from '@/lib/billing/subscriptions/utils'
export {
calculateDefaultUsageLimit as getDefaultLimit,
canEditUsageLimit as canEditLimit,
getMinimumUsageLimit as getMinimumLimit,
-} from './subscriptions/utils'
-export * from './types'
-export * from './validation/seat-management'
+} from '@/lib/billing/subscriptions/utils'
+export * from '@/lib/billing/types'
+export * from '@/lib/billing/validation/seat-management'
diff --git a/apps/sim/lib/copilot/config.ts b/apps/sim/lib/copilot/config.ts
index 64bc7d1e33..2ee75fa04c 100644
--- a/apps/sim/lib/copilot/config.ts
+++ b/apps/sim/lib/copilot/config.ts
@@ -1,7 +1,7 @@
+import { AGENT_MODE_SYSTEM_PROMPT } from '@/lib/copilot/prompts'
import { createLogger } from '@/lib/logs/console/logger'
import { getProviderDefaultModel } from '@/providers/models'
import type { ProviderId } from '@/providers/types'
-import { AGENT_MODE_SYSTEM_PROMPT } from './prompts'
const logger = createLogger('CopilotConfig')
diff --git a/apps/sim/lib/copilot/service.ts b/apps/sim/lib/copilot/service.ts
index 96c95dd665..4093fdd11f 100644
--- a/apps/sim/lib/copilot/service.ts
+++ b/apps/sim/lib/copilot/service.ts
@@ -1,4 +1,12 @@
import { and, desc, eq, sql } from 'drizzle-orm'
+import { getCopilotConfig, getCopilotModel } from '@/lib/copilot/config'
+import {
+ AGENT_MODE_SYSTEM_PROMPT,
+ ASK_MODE_SYSTEM_PROMPT,
+ TITLE_GENERATION_SYSTEM_PROMPT,
+ TITLE_GENERATION_USER_PROMPT,
+ validateSystemPrompts,
+} from '@/lib/copilot/prompts'
import { createLogger } from '@/lib/logs/console/logger'
import { getRotatingApiKey } from '@/lib/utils'
import { generateEmbeddings } from '@/app/api/knowledge/utils'
@@ -7,14 +15,6 @@ import { copilotChats, docsEmbeddings } from '@/db/schema'
import { executeProviderRequest } from '@/providers'
import type { ProviderToolConfig } from '@/providers/types'
import { getApiKey } from '@/providers/utils'
-import { getCopilotConfig, getCopilotModel } from './config'
-import {
- AGENT_MODE_SYSTEM_PROMPT,
- ASK_MODE_SYSTEM_PROMPT,
- TITLE_GENERATION_SYSTEM_PROMPT,
- TITLE_GENERATION_USER_PROMPT,
- validateSystemPrompts,
-} from './prompts'
const logger = createLogger('CopilotService')
diff --git a/apps/sim/lib/copilot/tools.ts b/apps/sim/lib/copilot/tools.ts
index 1c3279aa1b..ca414332e4 100644
--- a/apps/sim/lib/copilot/tools.ts
+++ b/apps/sim/lib/copilot/tools.ts
@@ -1,7 +1,7 @@
+import { searchDocumentation } from '@/lib/copilot/service'
import { createLogger } from '@/lib/logs/console/logger'
import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
import { useWorkflowYamlStore } from '@/stores/workflows/yaml/store'
-import { searchDocumentation } from './service'
const logger = createLogger('CopilotTools')
diff --git a/apps/sim/lib/email/mailer.test.ts b/apps/sim/lib/email/mailer.test.ts
index f21b4e47f0..015e2989c4 100644
--- a/apps/sim/lib/email/mailer.test.ts
+++ b/apps/sim/lib/email/mailer.test.ts
@@ -12,24 +12,24 @@ vi.mock('resend', () => {
}
})
-vi.mock('./unsubscribe', () => ({
+vi.mock('@/lib/email/unsubscribe', () => ({
isUnsubscribed: vi.fn(),
generateUnsubscribeToken: vi.fn(),
}))
-vi.mock('../env', () => ({
+vi.mock('@/lib/env', () => ({
env: {
RESEND_API_KEY: 'test-api-key',
NEXT_PUBLIC_APP_URL: 'https://test.simstudio.ai',
},
}))
-vi.mock('../urls/utils', () => ({
+vi.mock('@/lib/urls/utils', () => ({
getEmailDomain: vi.fn().mockReturnValue('simstudio.ai'),
}))
-import { type EmailType, sendEmail } from './mailer'
-import { generateUnsubscribeToken, isUnsubscribed } from './unsubscribe'
+import { type EmailType, sendEmail } from '@/lib/email/mailer'
+import { generateUnsubscribeToken, isUnsubscribed } from '@/lib/email/unsubscribe'
describe('mailer', () => {
const testEmailOptions = {
diff --git a/apps/sim/lib/email/unsubscribe.test.ts b/apps/sim/lib/email/unsubscribe.test.ts
index 032c0024e1..7f1b5d4d0a 100644
--- a/apps/sim/lib/email/unsubscribe.test.ts
+++ b/apps/sim/lib/email/unsubscribe.test.ts
@@ -1,12 +1,12 @@
import { describe, expect, it, vi } from 'vitest'
+import type { EmailType } from '@/lib/email/mailer'
import {
generateUnsubscribeToken,
isTransactionalEmail,
verifyUnsubscribeToken,
} from '@/lib/email/unsubscribe'
-import type { EmailType } from './mailer'
-vi.mock('../env', () => ({
+vi.mock('@/lib/env', () => ({
env: {
BETTER_AUTH_SECRET: 'test-secret-key',
},
diff --git a/apps/sim/lib/file-parsers/index.test.ts b/apps/sim/lib/file-parsers/index.test.ts
index 86d90194be..ef1f8dbae3 100644
--- a/apps/sim/lib/file-parsers/index.test.ts
+++ b/apps/sim/lib/file-parsers/index.test.ts
@@ -7,11 +7,9 @@ import path from 'path'
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import type { FileParseResult, FileParser } from '@/lib/file-parsers/types'
-// Mock file system modules
const mockExistsSync = vi.fn().mockReturnValue(true)
const mockReadFile = vi.fn().mockResolvedValue(Buffer.from('test content'))
-// Mock parser functions
const mockPdfParseFile = vi.fn().mockResolvedValue({
content: 'Parsed PDF content',
metadata: {
@@ -53,9 +51,7 @@ const mockMdParseFile = vi.fn().mockResolvedValue({
},
})
-// Create mock module implementation
const createMockModule = () => {
- // Create mock parsers
const mockParsers: Record = {
pdf: { parseFile: mockPdfParseFile },
csv: { parseFile: mockCsvParseFile },
@@ -64,7 +60,6 @@ const createMockModule = () => {
md: { parseFile: mockMdParseFile },
}
- // Create the mock module implementation
return {
parseFile: async (filePath: string): Promise => {
if (!filePath) {
@@ -94,11 +89,9 @@ const createMockModule = () => {
}
describe('File Parsers', () => {
- // Setup required mocks before each test
beforeEach(() => {
vi.resetModules()
- // Mock file system modules
vi.doMock('fs', () => ({
existsSync: mockExistsSync,
}))
@@ -107,29 +100,27 @@ describe('File Parsers', () => {
readFile: mockReadFile,
}))
- // Mock the file parser module with our implementation
- vi.doMock('./index', () => createMockModule())
+ vi.doMock('@/lib/file-parsers/index', () => createMockModule())
- // Mock parser classes
- vi.doMock('./pdf-parser', () => ({
+ vi.doMock('@/lib/file-parsers/pdf-parser', () => ({
PdfParser: vi.fn().mockImplementation(() => ({
parseFile: mockPdfParseFile,
})),
}))
- vi.doMock('./csv-parser', () => ({
+ vi.doMock('@/lib/file-parsers/csv-parser', () => ({
CsvParser: vi.fn().mockImplementation(() => ({
parseFile: mockCsvParseFile,
})),
}))
- vi.doMock('./docx-parser', () => ({
+ vi.doMock('@/lib/file-parsers/docx-parser', () => ({
DocxParser: vi.fn().mockImplementation(() => ({
parseFile: mockDocxParseFile,
})),
}))
- vi.doMock('./raw-pdf-parser', () => ({
+ vi.doMock('@/lib/file-parsers/raw-pdf-parser', () => ({
RawPdfParser: vi.fn().mockImplementation(() => ({
parseFile: vi.fn().mockResolvedValue({
content: 'Raw parsed PDF content',
@@ -140,19 +131,18 @@ describe('File Parsers', () => {
})),
}))
- vi.doMock('./txt-parser', () => ({
+ vi.doMock('@/lib/file-parsers/txt-parser', () => ({
TxtParser: vi.fn().mockImplementation(() => ({
parseFile: mockTxtParseFile,
})),
}))
- vi.doMock('./md-parser', () => ({
+ vi.doMock('@/lib/file-parsers/md-parser', () => ({
MdParser: vi.fn().mockImplementation(() => ({
parseFile: mockMdParseFile,
})),
}))
- // Silence console output during tests
global.console = {
...console,
log: vi.fn(),
@@ -170,11 +160,9 @@ describe('File Parsers', () => {
describe('parseFile', () => {
it('should validate file existence', async () => {
- // Mock file not existing for this test only
mockExistsSync.mockReturnValueOnce(false)
- // Dynamically import the module after mocks are set up
- const { parseFile } = await import('./index')
+ const { parseFile } = await import('@/lib/file-parsers/index')
const testFilePath = '/test/files/test.pdf'
await expect(parseFile(testFilePath)).rejects.toThrow('File not found')
@@ -182,7 +170,7 @@ describe('File Parsers', () => {
})
it('should throw error if file path is empty', async () => {
- const { parseFile } = await import('./index')
+ const { parseFile } = await import('@/lib/file-parsers/index')
await expect(parseFile('')).rejects.toThrow('No file path provided')
})
@@ -199,7 +187,7 @@ describe('File Parsers', () => {
mockPdfParseFile.mockResolvedValueOnce(expectedResult)
mockExistsSync.mockReturnValue(true)
- const { parseFile } = await import('./index')
+ const { parseFile } = await import('@/lib/file-parsers/index')
const result = await parseFile('/test/files/document.pdf')
expect(result).toEqual(expectedResult)
@@ -217,7 +205,7 @@ describe('File Parsers', () => {
mockCsvParseFile.mockResolvedValueOnce(expectedResult)
mockExistsSync.mockReturnValue(true)
- const { parseFile } = await import('./index')
+ const { parseFile } = await import('@/lib/file-parsers/index')
const result = await parseFile('/test/files/data.csv')
expect(result).toEqual(expectedResult)
@@ -235,7 +223,7 @@ describe('File Parsers', () => {
mockDocxParseFile.mockResolvedValueOnce(expectedResult)
mockExistsSync.mockReturnValue(true)
- const { parseFile } = await import('./index')
+ const { parseFile } = await import('@/lib/file-parsers/index')
const result = await parseFile('/test/files/document.docx')
expect(result).toEqual(expectedResult)
@@ -253,7 +241,7 @@ describe('File Parsers', () => {
mockTxtParseFile.mockResolvedValueOnce(expectedResult)
mockExistsSync.mockReturnValue(true)
- const { parseFile } = await import('./index')
+ const { parseFile } = await import('@/lib/file-parsers/index')
const result = await parseFile('/test/files/document.txt')
expect(result).toEqual(expectedResult)
@@ -271,35 +259,33 @@ describe('File Parsers', () => {
mockMdParseFile.mockResolvedValueOnce(expectedResult)
mockExistsSync.mockReturnValue(true)
- const { parseFile } = await import('./index')
+ const { parseFile } = await import('@/lib/file-parsers/index')
const result = await parseFile('/test/files/document.md')
})
it('should throw error for unsupported file types', async () => {
- // Make sure the file "exists" for this test
mockExistsSync.mockReturnValue(true)
- const { parseFile } = await import('./index')
+ const { parseFile } = await import('@/lib/file-parsers/index')
const unsupportedFilePath = '/test/files/image.png'
await expect(parseFile(unsupportedFilePath)).rejects.toThrow('Unsupported file type')
})
it('should handle errors during parsing', async () => {
- // Make sure the file "exists" for this test
mockExistsSync.mockReturnValue(true)
const parsingError = new Error('CSV parsing failed')
mockCsvParseFile.mockRejectedValueOnce(parsingError)
- const { parseFile } = await import('./index')
+ const { parseFile } = await import('@/lib/file-parsers/index')
await expect(parseFile('/test/files/data.csv')).rejects.toThrow('CSV parsing failed')
})
})
describe('isSupportedFileType', () => {
it('should return true for supported file types', async () => {
- const { isSupportedFileType } = await import('./index')
+ const { isSupportedFileType } = await import('@/lib/file-parsers/index')
expect(isSupportedFileType('pdf')).toBe(true)
expect(isSupportedFileType('csv')).toBe(true)
@@ -309,14 +295,14 @@ describe('File Parsers', () => {
})
it('should return false for unsupported file types', async () => {
- const { isSupportedFileType } = await import('./index')
+ const { isSupportedFileType } = await import('@/lib/file-parsers/index')
expect(isSupportedFileType('png')).toBe(false)
expect(isSupportedFileType('unknown')).toBe(false)
})
it('should handle uppercase extensions', async () => {
- const { isSupportedFileType } = await import('./index')
+ const { isSupportedFileType } = await import('@/lib/file-parsers/index')
expect(isSupportedFileType('PDF')).toBe(true)
expect(isSupportedFileType('CSV')).toBe(true)
@@ -325,20 +311,16 @@ describe('File Parsers', () => {
})
it('should handle errors gracefully', async () => {
- // Create a mock that throws an error when called
const errorMockModule = {
isSupportedFileType: () => {
throw new Error('Failed to get parsers')
},
}
- // Mock the module with our error-throwing implementation
- vi.doMock('./index', () => errorMockModule)
+ vi.doMock('@/lib/file-parsers/index', () => errorMockModule)
- // Import and test
- const { isSupportedFileType } = await import('./index')
+ const { isSupportedFileType } = await import('@/lib/file-parsers/index')
- // Should catch the error and return false
expect(() => isSupportedFileType('pdf')).toThrow('Failed to get parsers')
})
})
diff --git a/apps/sim/lib/file-parsers/index.ts b/apps/sim/lib/file-parsers/index.ts
index 9380879594..0f189a29c4 100644
--- a/apps/sim/lib/file-parsers/index.ts
+++ b/apps/sim/lib/file-parsers/index.ts
@@ -24,7 +24,7 @@ function getParserInstances(): Record {
try {
// First try to use the pdf-parse library
// Import the PdfParser using ES module import to avoid test file access
- const { PdfParser } = require('./pdf-parser')
+ const { PdfParser } = require('@/lib/file-parsers/pdf-parser')
parserInstances.pdf = new PdfParser()
logger.info('PDF parser loaded successfully')
} catch (pdfParseError) {
@@ -63,35 +63,35 @@ function getParserInstances(): Record {
}
try {
- const { CsvParser } = require('./csv-parser')
+ const { CsvParser } = require('@/lib/file-parsers/csv-parser')
parserInstances.csv = new CsvParser()
} catch (error) {
logger.error('Failed to load CSV parser:', error)
}
try {
- const { DocxParser } = require('./docx-parser')
+ const { DocxParser } = require('@/lib/file-parsers/docx-parser')
parserInstances.docx = new DocxParser()
} catch (error) {
logger.error('Failed to load DOCX parser:', error)
}
try {
- const { TxtParser } = require('./txt-parser')
+ const { TxtParser } = require('@/lib/file-parsers/txt-parser')
parserInstances.txt = new TxtParser()
} catch (error) {
logger.error('Failed to load TXT parser:', error)
}
try {
- const { MdParser } = require('./md-parser')
+ const { MdParser } = require('@/lib/file-parsers/md-parser')
parserInstances.md = new MdParser()
} catch (error) {
logger.error('Failed to load MD parser:', error)
}
try {
- const { XlsxParser } = require('./xlsx-parser')
+ const { XlsxParser } = require('@/lib/file-parsers/xlsx-parser')
parserInstances.xlsx = new XlsxParser()
parserInstances.xls = new XlsxParser() // Both xls and xlsx use the same parser
} catch (error) {
diff --git a/apps/sim/lib/logs/execution/logger.ts b/apps/sim/lib/logs/execution/logger.ts
index 03981cce5b..8c04a58ab5 100644
--- a/apps/sim/lib/logs/execution/logger.ts
+++ b/apps/sim/lib/logs/execution/logger.ts
@@ -3,8 +3,6 @@ import { v4 as uuidv4 } from 'uuid'
import { getCostMultiplier } from '@/lib/environment'
import { createLogger } from '@/lib/logs/console/logger'
import { snapshotService } from '@/lib/logs/execution/snapshot/service'
-import { db } from '@/db'
-import { userStats, workflow, workflowExecutionLogs } from '@/db/schema'
import type {
BlockOutputData,
ExecutionEnvironment,
@@ -14,7 +12,9 @@ import type {
WorkflowExecutionLog,
WorkflowExecutionSnapshot,
WorkflowState,
-} from '../types'
+} from '@/lib/logs/types'
+import { db } from '@/db'
+import { userStats, workflow, workflowExecutionLogs } from '@/db/schema'
export interface ToolCall {
name: string
diff --git a/apps/sim/lib/oauth/oauth.test.ts b/apps/sim/lib/oauth/oauth.test.ts
index 6d8996c526..90799c80d3 100644
--- a/apps/sim/lib/oauth/oauth.test.ts
+++ b/apps/sim/lib/oauth/oauth.test.ts
@@ -1,6 +1,6 @@
import { afterEach, beforeEach, describe, expect, it, type Mock, vi } from 'vitest'
-vi.mock('../env', () => ({
+vi.mock('@/lib/env', () => ({
env: {
GOOGLE_CLIENT_ID: 'google_client_id',
GOOGLE_CLIENT_SECRET: 'google_client_secret',
@@ -43,7 +43,7 @@ vi.mock('@/lib/logs/console/logger', () => ({
const mockFetch = vi.fn()
global.fetch = mockFetch
-import { refreshOAuthToken } from './oauth'
+import { refreshOAuthToken } from '@/lib/oauth/oauth'
describe('OAuth Token Refresh', () => {
beforeEach(() => {
diff --git a/apps/sim/lib/tokenization/utils.ts b/apps/sim/lib/tokenization/utils.ts
index db99241273..15927fddbd 100644
--- a/apps/sim/lib/tokenization/utils.ts
+++ b/apps/sim/lib/tokenization/utils.ts
@@ -3,10 +3,14 @@
*/
import { createLogger } from '@/lib/logs/console/logger'
+import {
+ LLM_BLOCK_TYPES,
+ MAX_PREVIEW_LENGTH,
+ TOKENIZATION_CONFIG,
+} from '@/lib/tokenization/constants'
+import { createTokenizationError } from '@/lib/tokenization/errors'
+import type { ProviderTokenizationConfig, TokenUsage } from '@/lib/tokenization/types'
import { getProviderFromModel } from '@/providers/utils'
-import { LLM_BLOCK_TYPES, MAX_PREVIEW_LENGTH, TOKENIZATION_CONFIG } from './constants'
-import { createTokenizationError } from './errors'
-import type { ProviderTokenizationConfig, TokenUsage } from './types'
const logger = createLogger('TokenizationUtils')
diff --git a/apps/sim/lib/uploads/blob/blob-client.test.ts b/apps/sim/lib/uploads/blob/blob-client.test.ts
index 6f7c416fcc..52608c1be3 100644
--- a/apps/sim/lib/uploads/blob/blob-client.test.ts
+++ b/apps/sim/lib/uploads/blob/blob-client.test.ts
@@ -5,7 +5,6 @@
*/
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
-// Mock Azure Storage Blob
const mockUpload = vi.fn()
const mockDownload = vi.fn()
const mockDelete = vi.fn()
@@ -30,8 +29,8 @@ vi.mock('@azure/storage-blob', () => ({
describe('Azure Blob Storage Client', () => {
beforeEach(() => {
vi.resetAllMocks()
+ vi.resetModules()
- // Mock the blob client chain
mockGetBlockBlobClient.mockReturnValue({
upload: mockUpload,
download: mockDownload,
@@ -55,8 +54,26 @@ describe('Azure Blob Storage Client', () => {
toString: () => 'sv=2021-06-08&se=2023-01-01T00%3A00%3A00Z&sr=b&sp=r&sig=test',
})
- // Mock BLOB_CONFIG
- vi.doMock('../setup', () => ({
+ vi.doMock('@/lib/env', () => ({
+ env: {
+ AZURE_ACCOUNT_NAME: 'testaccount',
+ AZURE_ACCOUNT_KEY: 'testkey',
+ AZURE_CONNECTION_STRING:
+ 'DefaultEndpointsProtocol=https;AccountName=testaccount;AccountKey=testkey;EndpointSuffix=core.windows.net',
+ AZURE_STORAGE_CONTAINER_NAME: 'testcontainer',
+ },
+ }))
+
+ vi.doMock('@/lib/logs/console/logger', () => ({
+ createLogger: vi.fn().mockReturnValue({
+ debug: vi.fn(),
+ info: vi.fn(),
+ warn: vi.fn(),
+ error: vi.fn(),
+ }),
+ }))
+
+ vi.doMock('@/lib/uploads/setup', () => ({
BLOB_CONFIG: {
accountName: 'testaccount',
accountKey: 'testkey',
@@ -65,17 +82,6 @@ describe('Azure Blob Storage Client', () => {
containerName: 'testcontainer',
},
}))
-
- // Mock env
- vi.doMock('../../env', () => ({
- env: {
- AZURE_STORAGE_ACCOUNT_NAME: 'testaccount',
- AZURE_STORAGE_ACCOUNT_KEY: 'testkey',
- AZURE_STORAGE_CONNECTION_STRING:
- 'DefaultEndpointsProtocol=https;AccountName=testaccount;AccountKey=testkey;EndpointSuffix=core.windows.net',
- AZURE_STORAGE_CONTAINER_NAME: 'testcontainer',
- },
- }))
})
afterEach(() => {
@@ -84,7 +90,7 @@ describe('Azure Blob Storage Client', () => {
describe('uploadToBlob', () => {
it('should upload a file to Azure Blob Storage', async () => {
- const { uploadToBlob } = await import('./blob-client')
+ const { uploadToBlob } = await import('@/lib/uploads/blob/blob-client')
const testBuffer = Buffer.from('test file content')
const fileName = 'test-file.txt'
@@ -114,7 +120,7 @@ describe('Azure Blob Storage Client', () => {
})
it('should handle custom blob configuration', async () => {
- const { uploadToBlob } = await import('./blob-client')
+ const { uploadToBlob } = await import('@/lib/uploads/blob/blob-client')
const testBuffer = Buffer.from('test file content')
const fileName = 'test-file.txt'
@@ -129,7 +135,6 @@ describe('Azure Blob Storage Client', () => {
const result = await uploadToBlob(testBuffer, fileName, contentType, customConfig)
- // Verify the container client is called with correct custom configuration
expect(mockGetContainerClient).toHaveBeenCalledWith('customcontainer')
expect(result.name).toBe(fileName)
expect(result.type).toBe(contentType)
@@ -138,12 +143,11 @@ describe('Azure Blob Storage Client', () => {
describe('downloadFromBlob', () => {
it('should download a file from Azure Blob Storage', async () => {
- const { downloadFromBlob } = await import('./blob-client')
+ const { downloadFromBlob } = await import('@/lib/uploads/blob/blob-client')
const testKey = 'test-file-key'
const testContent = Buffer.from('downloaded content')
- // Mock the readable stream
const mockReadableStream = {
on: vi.fn((event, callback) => {
if (event === 'data') {
@@ -168,7 +172,7 @@ describe('Azure Blob Storage Client', () => {
describe('deleteFromBlob', () => {
it('should delete a file from Azure Blob Storage', async () => {
- const { deleteFromBlob } = await import('./blob-client')
+ const { deleteFromBlob } = await import('@/lib/uploads/blob/blob-client')
const testKey = 'test-file-key'
@@ -183,7 +187,7 @@ describe('Azure Blob Storage Client', () => {
describe('getPresignedUrl', () => {
it('should generate a presigned URL for Azure Blob Storage', async () => {
- const { getPresignedUrl } = await import('./blob-client')
+ const { getPresignedUrl } = await import('@/lib/uploads/blob/blob-client')
const testKey = 'test-file-key'
const expiresIn = 3600
@@ -207,7 +211,7 @@ describe('Azure Blob Storage Client', () => {
]
test.each(testCases)('should sanitize "$input" to "$expected"', async ({ input, expected }) => {
- const { sanitizeFilenameForMetadata } = await import('./blob-client')
+ const { sanitizeFilenameForMetadata } = await import('@/lib/uploads/blob/blob-client')
expect(sanitizeFilenameForMetadata(input)).toBe(expected)
})
})
diff --git a/apps/sim/lib/uploads/blob/index.ts b/apps/sim/lib/uploads/blob/index.ts
index dd894f535d..f4be6ae119 100644
--- a/apps/sim/lib/uploads/blob/index.ts
+++ b/apps/sim/lib/uploads/blob/index.ts
@@ -8,4 +8,4 @@ export {
getPresignedUrlWithConfig,
sanitizeFilenameForMetadata,
uploadToBlob,
-} from './blob-client'
+} from '@/lib/uploads/blob/blob-client'
diff --git a/apps/sim/lib/uploads/index.ts b/apps/sim/lib/uploads/index.ts
index 77c257658f..fef62fda4d 100644
--- a/apps/sim/lib/uploads/index.ts
+++ b/apps/sim/lib/uploads/index.ts
@@ -1,5 +1,5 @@
-export * as BlobClient from './blob/blob-client'
-export * as S3Client from './s3/s3-client'
+export * as BlobClient from '@/lib/uploads/blob/blob-client'
+export * as S3Client from '@/lib/uploads/s3/s3-client'
export {
BLOB_CONFIG,
BLOB_KB_CONFIG,
@@ -9,7 +9,7 @@ export {
UPLOAD_DIR,
USE_BLOB_STORAGE,
USE_S3_STORAGE,
-} from './setup'
+} from '@/lib/uploads/setup'
export {
type CustomStorageConfig,
deleteFile,
@@ -21,4 +21,4 @@ export {
getStorageProvider,
isUsingCloudStorage,
uploadFile,
-} from './storage-client'
+} from '@/lib/uploads/storage-client'
diff --git a/apps/sim/lib/uploads/s3/index.ts b/apps/sim/lib/uploads/s3/index.ts
index a2b525c678..d39af344c8 100644
--- a/apps/sim/lib/uploads/s3/index.ts
+++ b/apps/sim/lib/uploads/s3/index.ts
@@ -8,4 +8,4 @@ export {
getS3Client,
sanitizeFilenameForMetadata,
uploadToS3,
-} from './s3-client'
+} from '@/lib/uploads/s3/s3-client'
diff --git a/apps/sim/lib/uploads/s3/s3-client.test.ts b/apps/sim/lib/uploads/s3/s3-client.test.ts
index a842ba5ed1..7188f11aa1 100644
--- a/apps/sim/lib/uploads/s3/s3-client.test.ts
+++ b/apps/sim/lib/uploads/s3/s3-client.test.ts
@@ -31,7 +31,25 @@ describe('S3 Client', () => {
getSignedUrl: mockGetSignedUrl,
}))
- vi.doMock('../setup', () => ({
+ vi.doMock('@/lib/env', () => ({
+ env: {
+ S3_BUCKET_NAME: 'test-bucket',
+ AWS_REGION: 'test-region',
+ AWS_ACCESS_KEY_ID: 'test-access-key',
+ AWS_SECRET_ACCESS_KEY: 'test-secret-key',
+ },
+ }))
+
+ vi.doMock('@/lib/logs/console/logger', () => ({
+ createLogger: vi.fn().mockReturnValue({
+ debug: vi.fn(),
+ info: vi.fn(),
+ warn: vi.fn(),
+ error: vi.fn(),
+ }),
+ }))
+
+ vi.doMock('@/lib/uploads/setup', () => ({
S3_CONFIG: {
bucket: 'test-bucket',
region: 'test-region',
@@ -50,7 +68,7 @@ describe('S3 Client', () => {
it('should upload a file to S3 and return file info', async () => {
mockSend.mockResolvedValueOnce({})
- const { uploadToS3 } = await import('./s3-client')
+ const { uploadToS3 } = await import('@/lib/uploads/s3/s3-client')
const file = Buffer.from('test content')
const fileName = 'test-file.txt'
@@ -83,7 +101,7 @@ describe('S3 Client', () => {
it('should handle spaces in filenames', async () => {
mockSend.mockResolvedValueOnce({})
- const { uploadToS3 } = await import('./s3-client')
+ const { uploadToS3 } = await import('@/lib/uploads/s3/s3-client')
const testFile = Buffer.from('test file content')
const fileName = 'test file with spaces.txt'
@@ -103,7 +121,7 @@ describe('S3 Client', () => {
it('should use provided size if available', async () => {
mockSend.mockResolvedValueOnce({})
- const { uploadToS3 } = await import('./s3-client')
+ const { uploadToS3 } = await import('@/lib/uploads/s3/s3-client')
const testFile = Buffer.from('test file content')
const fileName = 'test-file.txt'
@@ -119,7 +137,7 @@ describe('S3 Client', () => {
const error = new Error('Upload failed')
mockSend.mockRejectedValueOnce(error)
- const { uploadToS3 } = await import('./s3-client')
+ const { uploadToS3 } = await import('@/lib/uploads/s3/s3-client')
const testFile = Buffer.from('test file content')
const fileName = 'test-file.txt'
@@ -133,7 +151,7 @@ describe('S3 Client', () => {
it('should generate a presigned URL for a file', async () => {
mockGetSignedUrl.mockResolvedValueOnce('https://example.com/presigned-url')
- const { getPresignedUrl } = await import('./s3-client')
+ const { getPresignedUrl } = await import('@/lib/uploads/s3/s3-client')
const key = 'test-file.txt'
const expiresIn = 1800
@@ -153,7 +171,7 @@ describe('S3 Client', () => {
it('should use default expiration if not provided', async () => {
mockGetSignedUrl.mockResolvedValueOnce('https://example.com/presigned-url')
- const { getPresignedUrl } = await import('./s3-client')
+ const { getPresignedUrl } = await import('@/lib/uploads/s3/s3-client')
const key = 'test-file.txt'
@@ -170,7 +188,7 @@ describe('S3 Client', () => {
const error = new Error('Presigned URL generation failed')
mockGetSignedUrl.mockRejectedValueOnce(error)
- const { getPresignedUrl } = await import('./s3-client')
+ const { getPresignedUrl } = await import('@/lib/uploads/s3/s3-client')
const key = 'test-file.txt'
@@ -198,7 +216,7 @@ describe('S3 Client', () => {
$metadata: { httpStatusCode: 200 },
})
- const { downloadFromS3 } = await import('./s3-client')
+ const { downloadFromS3 } = await import('@/lib/uploads/s3/s3-client')
const key = 'test-file.txt'
@@ -229,7 +247,7 @@ describe('S3 Client', () => {
$metadata: { httpStatusCode: 200 },
})
- const { downloadFromS3 } = await import('./s3-client')
+ const { downloadFromS3 } = await import('@/lib/uploads/s3/s3-client')
const key = 'test-file.txt'
@@ -240,7 +258,7 @@ describe('S3 Client', () => {
const error = new Error('Download failed')
mockSend.mockRejectedValueOnce(error)
- const { downloadFromS3 } = await import('./s3-client')
+ const { downloadFromS3 } = await import('@/lib/uploads/s3/s3-client')
const key = 'test-file.txt'
@@ -252,7 +270,7 @@ describe('S3 Client', () => {
it('should delete a file from S3', async () => {
mockSend.mockResolvedValueOnce({})
- const { deleteFromS3 } = await import('./s3-client')
+ const { deleteFromS3 } = await import('@/lib/uploads/s3/s3-client')
const key = 'test-file.txt'
@@ -270,7 +288,7 @@ describe('S3 Client', () => {
const error = new Error('Delete failed')
mockSend.mockRejectedValueOnce(error)
- const { deleteFromS3 } = await import('./s3-client')
+ const { deleteFromS3 } = await import('@/lib/uploads/s3/s3-client')
const key = 'test-file.txt'
@@ -280,17 +298,24 @@ describe('S3 Client', () => {
describe('s3Client initialization', () => {
it('should initialize with correct configuration when credentials are available', async () => {
- // Mock env with credentials
- vi.doMock('../../env', () => ({
+ vi.doMock('@/lib/env', () => ({
env: {
+ S3_BUCKET_NAME: 'test-bucket',
+ AWS_REGION: 'test-region',
AWS_ACCESS_KEY_ID: 'test-access-key',
AWS_SECRET_ACCESS_KEY: 'test-secret-key',
},
}))
- // Re-import to get fresh module with mocked env
+ vi.doMock('@/lib/uploads/setup', () => ({
+ S3_CONFIG: {
+ bucket: 'test-bucket',
+ region: 'test-region',
+ },
+ }))
+
vi.resetModules()
- const { getS3Client } = await import('./s3-client')
+ const { getS3Client } = await import('@/lib/uploads/s3/s3-client')
const { S3Client } = await import('@aws-sdk/client-s3')
const client = getS3Client()
@@ -306,15 +331,24 @@ describe('S3 Client', () => {
})
it('should initialize without credentials when env vars are not available', async () => {
- vi.doMock('../../env', () => ({
+ vi.doMock('@/lib/env', () => ({
env: {
+ S3_BUCKET_NAME: 'test-bucket',
+ AWS_REGION: 'test-region',
AWS_ACCESS_KEY_ID: undefined,
AWS_SECRET_ACCESS_KEY: undefined,
},
}))
+ vi.doMock('@/lib/uploads/setup', () => ({
+ S3_CONFIG: {
+ bucket: 'test-bucket',
+ region: 'test-region',
+ },
+ }))
+
vi.resetModules()
- const { getS3Client } = await import('./s3-client')
+ const { getS3Client } = await import('@/lib/uploads/s3/s3-client')
const { S3Client } = await import('@aws-sdk/client-s3')
const client = getS3Client()
diff --git a/apps/sim/lib/utils.test.ts b/apps/sim/lib/utils.test.ts
index 361e3180a3..c0605ed49c 100644
--- a/apps/sim/lib/utils.test.ts
+++ b/apps/sim/lib/utils.test.ts
@@ -14,7 +14,7 @@ import {
isValidName,
redactApiKeys,
validateName,
-} from './utils'
+} from '@/lib/utils'
vi.mock('crypto', () => ({
createCipheriv: vi.fn().mockReturnValue({
diff --git a/apps/sim/lib/workflows/db-helpers.test.ts b/apps/sim/lib/workflows/db-helpers.test.ts
index 7d2c6eb5f3..7e187a4954 100644
--- a/apps/sim/lib/workflows/db-helpers.test.ts
+++ b/apps/sim/lib/workflows/db-helpers.test.ts
@@ -211,12 +211,12 @@ const mockWorkflowState: WorkflowState = {
}
describe('Database Helpers', () => {
- let dbHelpers: typeof import('./db-helpers')
+ let dbHelpers: typeof import('@/lib/workflows/db-helpers')
beforeEach(async () => {
vi.clearAllMocks()
// Import the module after mocks are set up
- dbHelpers = await import('./db-helpers')
+ dbHelpers = await import('@/lib/workflows/db-helpers')
})
afterEach(() => {
diff --git a/apps/sim/providers/anthropic/index.ts b/apps/sim/providers/anthropic/index.ts
index 52faba9f15..5ef9d02cae 100644
--- a/apps/sim/providers/anthropic/index.ts
+++ b/apps/sim/providers/anthropic/index.ts
@@ -1,10 +1,15 @@
import Anthropic from '@anthropic-ai/sdk'
import { createLogger } from '@/lib/logs/console/logger'
import type { StreamingExecution } from '@/executor/types'
+import { getProviderDefaultModel, getProviderModels } from '@/providers/models'
+import type {
+ ProviderConfig,
+ ProviderRequest,
+ ProviderResponse,
+ TimeSegment,
+} from '@/providers/types'
+import { prepareToolsWithUsageControl, trackForcedToolUsage } from '@/providers/utils'
import { executeTool } from '@/tools'
-import { getProviderDefaultModel, getProviderModels } from '../models'
-import type { ProviderConfig, ProviderRequest, ProviderResponse, TimeSegment } from '../types'
-import { prepareToolsWithUsageControl, trackForcedToolUsage } from '../utils'
const logger = createLogger('AnthropicProvider')
diff --git a/apps/sim/providers/azure-openai/index.ts b/apps/sim/providers/azure-openai/index.ts
index a654792e5a..b000765ecb 100644
--- a/apps/sim/providers/azure-openai/index.ts
+++ b/apps/sim/providers/azure-openai/index.ts
@@ -2,10 +2,15 @@ import { AzureOpenAI } from 'openai'
import { env } from '@/lib/env'
import { createLogger } from '@/lib/logs/console/logger'
import type { StreamingExecution } from '@/executor/types'
+import { getProviderDefaultModel, getProviderModels } from '@/providers/models'
+import type {
+ ProviderConfig,
+ ProviderRequest,
+ ProviderResponse,
+ TimeSegment,
+} from '@/providers/types'
+import { prepareToolsWithUsageControl, trackForcedToolUsage } from '@/providers/utils'
import { executeTool } from '@/tools'
-import { getProviderDefaultModel, getProviderModels } from '../models'
-import type { ProviderConfig, ProviderRequest, ProviderResponse, TimeSegment } from '../types'
-import { prepareToolsWithUsageControl, trackForcedToolUsage } from '../utils'
const logger = createLogger('AzureOpenAIProvider')
diff --git a/apps/sim/providers/cerebras/index.ts b/apps/sim/providers/cerebras/index.ts
index 4e64e4633b..380aae6277 100644
--- a/apps/sim/providers/cerebras/index.ts
+++ b/apps/sim/providers/cerebras/index.ts
@@ -1,9 +1,14 @@
import { Cerebras } from '@cerebras/cerebras_cloud_sdk'
import { createLogger } from '@/lib/logs/console/logger'
import type { StreamingExecution } from '@/executor/types'
+import { getProviderDefaultModel, getProviderModels } from '@/providers/models'
+import type {
+ ProviderConfig,
+ ProviderRequest,
+ ProviderResponse,
+ TimeSegment,
+} from '@/providers/types'
import { executeTool } from '@/tools'
-import { getProviderDefaultModel, getProviderModels } from '../models'
-import type { ProviderConfig, ProviderRequest, ProviderResponse, TimeSegment } from '../types'
const logger = createLogger('CerebrasProvider')
diff --git a/apps/sim/providers/deepseek/index.ts b/apps/sim/providers/deepseek/index.ts
index a1c76c7882..ad9ea15000 100644
--- a/apps/sim/providers/deepseek/index.ts
+++ b/apps/sim/providers/deepseek/index.ts
@@ -1,10 +1,15 @@
import OpenAI from 'openai'
import { createLogger } from '@/lib/logs/console/logger'
import type { StreamingExecution } from '@/executor/types'
+import { getProviderDefaultModel, getProviderModels } from '@/providers/models'
+import type {
+ ProviderConfig,
+ ProviderRequest,
+ ProviderResponse,
+ TimeSegment,
+} from '@/providers/types'
+import { prepareToolsWithUsageControl, trackForcedToolUsage } from '@/providers/utils'
import { executeTool } from '@/tools'
-import { getProviderDefaultModel, getProviderModels } from '../models'
-import type { ProviderConfig, ProviderRequest, ProviderResponse, TimeSegment } from '../types'
-import { prepareToolsWithUsageControl, trackForcedToolUsage } from '../utils'
const logger = createLogger('DeepseekProvider')
diff --git a/apps/sim/providers/google/index.ts b/apps/sim/providers/google/index.ts
index 6e8f9b42f6..0ff67344fd 100644
--- a/apps/sim/providers/google/index.ts
+++ b/apps/sim/providers/google/index.ts
@@ -1,9 +1,18 @@
import { createLogger } from '@/lib/logs/console/logger'
import type { StreamingExecution } from '@/executor/types'
+import { getProviderDefaultModel, getProviderModels } from '@/providers/models'
+import type {
+ ProviderConfig,
+ ProviderRequest,
+ ProviderResponse,
+ TimeSegment,
+} from '@/providers/types'
+import {
+ prepareToolExecution,
+ prepareToolsWithUsageControl,
+ trackForcedToolUsage,
+} from '@/providers/utils'
import { executeTool } from '@/tools'
-import { getProviderDefaultModel, getProviderModels } from '../models'
-import type { ProviderConfig, ProviderRequest, ProviderResponse, TimeSegment } from '../types'
-import { prepareToolExecution, prepareToolsWithUsageControl, trackForcedToolUsage } from '../utils'
const logger = createLogger('GoogleProvider')
diff --git a/apps/sim/providers/groq/index.ts b/apps/sim/providers/groq/index.ts
index df84c04ae9..a4f65d4345 100644
--- a/apps/sim/providers/groq/index.ts
+++ b/apps/sim/providers/groq/index.ts
@@ -1,9 +1,14 @@
import { Groq } from 'groq-sdk'
import { createLogger } from '@/lib/logs/console/logger'
import type { StreamingExecution } from '@/executor/types'
+import { getProviderDefaultModel, getProviderModels } from '@/providers/models'
+import type {
+ ProviderConfig,
+ ProviderRequest,
+ ProviderResponse,
+ TimeSegment,
+} from '@/providers/types'
import { executeTool } from '@/tools'
-import { getProviderDefaultModel, getProviderModels } from '../models'
-import type { ProviderConfig, ProviderRequest, ProviderResponse, TimeSegment } from '../types'
const logger = createLogger('GroqProvider')
diff --git a/apps/sim/providers/index.ts b/apps/sim/providers/index.ts
index 0a766263b7..95b8386a68 100644
--- a/apps/sim/providers/index.ts
+++ b/apps/sim/providers/index.ts
@@ -1,12 +1,12 @@
import { createLogger } from '@/lib/logs/console/logger'
import type { StreamingExecution } from '@/executor/types'
-import type { ProviderRequest, ProviderResponse } from './types'
+import type { ProviderRequest, ProviderResponse } from '@/providers/types'
import {
calculateCost,
generateStructuredOutputInstructions,
getProvider,
supportsTemperature,
-} from './utils'
+} from '@/providers/utils'
const logger = createLogger('Providers')
diff --git a/apps/sim/providers/ollama/index.ts b/apps/sim/providers/ollama/index.ts
index a874f0f1fc..7dc2bbb409 100644
--- a/apps/sim/providers/ollama/index.ts
+++ b/apps/sim/providers/ollama/index.ts
@@ -1,10 +1,15 @@
import OpenAI from 'openai'
import { env } from '@/lib/env'
import { createLogger } from '@/lib/logs/console/logger'
+import type { ModelsObject } from '@/providers/ollama/types'
+import type {
+ ProviderConfig,
+ ProviderRequest,
+ ProviderResponse,
+ TimeSegment,
+} from '@/providers/types'
import { useOllamaStore } from '@/stores/ollama/store'
import { executeTool } from '@/tools'
-import type { ProviderConfig, ProviderRequest, ProviderResponse, TimeSegment } from '../types'
-import type { ModelsObject } from './types'
const logger = createLogger('OllamaProvider')
const OLLAMA_HOST = env.OLLAMA_URL || 'http://localhost:11434'
diff --git a/apps/sim/providers/openai/index.ts b/apps/sim/providers/openai/index.ts
index c16ed320a0..3de716b56e 100644
--- a/apps/sim/providers/openai/index.ts
+++ b/apps/sim/providers/openai/index.ts
@@ -1,10 +1,19 @@
import OpenAI from 'openai'
import { createLogger } from '@/lib/logs/console/logger'
import type { StreamingExecution } from '@/executor/types'
+import { getProviderDefaultModel, getProviderModels } from '@/providers/models'
+import type {
+ ProviderConfig,
+ ProviderRequest,
+ ProviderResponse,
+ TimeSegment,
+} from '@/providers/types'
+import {
+ prepareToolExecution,
+ prepareToolsWithUsageControl,
+ trackForcedToolUsage,
+} from '@/providers/utils'
import { executeTool } from '@/tools'
-import { getProviderDefaultModel, getProviderModels } from '../models'
-import type { ProviderConfig, ProviderRequest, ProviderResponse, TimeSegment } from '../types'
-import { prepareToolExecution, prepareToolsWithUsageControl, trackForcedToolUsage } from '../utils'
const logger = createLogger('OpenAIProvider')
diff --git a/apps/sim/providers/utils.test.ts b/apps/sim/providers/utils.test.ts
index 30d8e18a8c..343171fcb0 100644
--- a/apps/sim/providers/utils.test.ts
+++ b/apps/sim/providers/utils.test.ts
@@ -26,7 +26,7 @@ import {
supportsToolUsageControl,
transformCustomTool,
updateOllamaProviderModels,
-} from './utils'
+} from '@/providers/utils'
const isHostedSpy = vi.spyOn(environmentModule, 'isHosted', 'get')
const mockGetRotatingApiKey = vi.fn().mockReturnValue('rotating-server-key')
diff --git a/apps/sim/providers/utils.ts b/apps/sim/providers/utils.ts
index f82623bb91..9bf2b35ab6 100644
--- a/apps/sim/providers/utils.ts
+++ b/apps/sim/providers/utils.ts
@@ -1,12 +1,11 @@
import { getCostMultiplier, isHosted } from '@/lib/environment'
import { createLogger } from '@/lib/logs/console/logger'
-import { useCustomToolsStore } from '@/stores/custom-tools/store'
-import { anthropicProvider } from './anthropic'
-import { azureOpenAIProvider } from './azure-openai'
-import { cerebrasProvider } from './cerebras'
-import { deepseekProvider } from './deepseek'
-import { googleProvider } from './google'
-import { groqProvider } from './groq'
+import { anthropicProvider } from '@/providers/anthropic'
+import { azureOpenAIProvider } from '@/providers/azure-openai'
+import { cerebrasProvider } from '@/providers/cerebras'
+import { deepseekProvider } from '@/providers/deepseek'
+import { googleProvider } from '@/providers/google'
+import { groqProvider } from '@/providers/groq'
import {
getComputerUseModels,
getEmbeddingModelPricing,
@@ -22,11 +21,12 @@ import {
supportsTemperature as supportsTemperatureFromDefinitions,
supportsToolUsageControl as supportsToolUsageControlFromDefinitions,
updateOllamaModels as updateOllamaModelsInDefinitions,
-} from './models'
-import { ollamaProvider } from './ollama'
-import { openaiProvider } from './openai'
-import type { ProviderConfig, ProviderId, ProviderToolConfig } from './types'
-import { xAIProvider } from './xai'
+} from '@/providers/models'
+import { ollamaProvider } from '@/providers/ollama'
+import { openaiProvider } from '@/providers/openai'
+import type { ProviderConfig, ProviderId, ProviderToolConfig } from '@/providers/types'
+import { xAIProvider } from '@/providers/xai'
+import { useCustomToolsStore } from '@/stores/custom-tools/store'
const logger = createLogger('ProviderUtils')
@@ -405,7 +405,7 @@ export async function transformBlockTool(
}
// Import the new tool parameter utilities
- const { createLLMToolSchema } = await import('../tools/params')
+ const { createLLMToolSchema } = await import('@/tools/params')
// Get user-provided parameters from the block
const userProvidedParams = block.params || {}
diff --git a/apps/sim/providers/xai/index.ts b/apps/sim/providers/xai/index.ts
index 7be94095a8..814d208cc0 100644
--- a/apps/sim/providers/xai/index.ts
+++ b/apps/sim/providers/xai/index.ts
@@ -1,10 +1,15 @@
import OpenAI from 'openai'
import { createLogger } from '@/lib/logs/console/logger'
import type { StreamingExecution } from '@/executor/types'
+import { getProviderDefaultModel, getProviderModels } from '@/providers/models'
+import type {
+ ProviderConfig,
+ ProviderRequest,
+ ProviderResponse,
+ TimeSegment,
+} from '@/providers/types'
+import { prepareToolsWithUsageControl, trackForcedToolUsage } from '@/providers/utils'
import { executeTool } from '@/tools'
-import { getProviderDefaultModel, getProviderModels } from '../models'
-import type { ProviderConfig, ProviderRequest, ProviderResponse, TimeSegment } from '../types'
-import { prepareToolsWithUsageControl, trackForcedToolUsage } from '../utils'
const logger = createLogger('XAIProvider')
diff --git a/apps/sim/scripts/insert-test-workflow.ts b/apps/sim/scripts/insert-test-workflow.ts
index 8c215d4e6e..718f2d11bc 100755
--- a/apps/sim/scripts/insert-test-workflow.ts
+++ b/apps/sim/scripts/insert-test-workflow.ts
@@ -1,7 +1,7 @@
#!/usr/bin/env bun
-import { db } from '../db'
-import { user, workflow, workspace } from '../db/schema'
+import { db } from '@/db'
+import { user, workflow, workspace } from '@/db/schema'
const testWorkflowState = {
blocks: {
diff --git a/apps/sim/scripts/migrate-workflow-states.ts b/apps/sim/scripts/migrate-workflow-states.ts
index 9c8f241589..f01c2f9fee 100755
--- a/apps/sim/scripts/migrate-workflow-states.ts
+++ b/apps/sim/scripts/migrate-workflow-states.ts
@@ -3,8 +3,8 @@
import { readFileSync } from 'fs'
import { and, eq, inArray, isNotNull } from 'drizzle-orm'
import { nanoid } from 'nanoid'
-import { db } from '../db'
-import { workflow, workflowBlocks, workflowEdges, workflowSubflows } from '../db/schema'
+import { db } from '@/db'
+import { workflow, workflowBlocks, workflowEdges, workflowSubflows } from '@/db/schema'
interface WorkflowState {
blocks: Record
diff --git a/apps/sim/serializer/index.test.ts b/apps/sim/serializer/index.test.ts
index c1223c3c24..348715aa7c 100644
--- a/apps/sim/serializer/index.test.ts
+++ b/apps/sim/serializer/index.test.ts
@@ -18,9 +18,9 @@ import {
createLoopWorkflowState,
createMinimalWorkflowState,
createMissingMetadataWorkflow,
-} from './__test-utils__/test-workflows'
-import { Serializer } from './index'
-import type { SerializedWorkflow } from './types'
+} from '@/serializer/__test-utils__/test-workflows'
+import { Serializer } from '@/serializer/index'
+import type { SerializedWorkflow } from '@/serializer/types'
// Mock getBlock function
vi.mock('@/blocks', () => ({
diff --git a/apps/sim/serializer/index.ts b/apps/sim/serializer/index.ts
index 0693a925f6..9bf9cbdc05 100644
--- a/apps/sim/serializer/index.ts
+++ b/apps/sim/serializer/index.ts
@@ -1,8 +1,8 @@
import type { Edge } from 'reactflow'
import { createLogger } from '@/lib/logs/console/logger'
import { getBlock } from '@/blocks'
+import type { SerializedBlock, SerializedWorkflow } from '@/serializer/types'
import type { BlockState, Loop, Parallel } from '@/stores/workflows/workflow/types'
-import type { SerializedBlock, SerializedWorkflow } from './types'
const logger = createLogger('Serializer')
diff --git a/apps/sim/services/queue/RateLimiter.test.ts b/apps/sim/services/queue/RateLimiter.test.ts
index c2ad391e50..5bee99252c 100644
--- a/apps/sim/services/queue/RateLimiter.test.ts
+++ b/apps/sim/services/queue/RateLimiter.test.ts
@@ -1,6 +1,6 @@
import { beforeEach, describe, expect, it, vi } from 'vitest'
-import { RateLimiter } from './RateLimiter'
-import { RATE_LIMITS } from './types'
+import { RateLimiter } from '@/services/queue/RateLimiter'
+import { RATE_LIMITS } from '@/services/queue/types'
// Mock the database module
vi.mock('@/db', () => ({
diff --git a/apps/sim/services/queue/RateLimiter.ts b/apps/sim/services/queue/RateLimiter.ts
index 0d891e8c8b..a95a3b520f 100644
--- a/apps/sim/services/queue/RateLimiter.ts
+++ b/apps/sim/services/queue/RateLimiter.ts
@@ -2,7 +2,7 @@ import { eq, sql } from 'drizzle-orm'
import { createLogger } from '@/lib/logs/console/logger'
import { db } from '@/db'
import { userRateLimits } from '@/db/schema'
-import { RATE_LIMITS, type SubscriptionPlan, type TriggerType } from './types'
+import { RATE_LIMITS, type SubscriptionPlan, type TriggerType } from '@/services/queue/types'
const logger = createLogger('RateLimiter')
diff --git a/apps/sim/services/queue/index.ts b/apps/sim/services/queue/index.ts
index bc77ad2039..beeb583f28 100644
--- a/apps/sim/services/queue/index.ts
+++ b/apps/sim/services/queue/index.ts
@@ -1,7 +1,7 @@
-export { RateLimiter } from './RateLimiter'
+export { RateLimiter } from '@/services/queue/RateLimiter'
export type {
RateLimitConfig,
SubscriptionPlan,
TriggerType,
-} from './types'
-export { RATE_LIMITS, RateLimitError } from './types'
+} from '@/services/queue/types'
+export { RATE_LIMITS, RateLimitError } from '@/services/queue/types'
diff --git a/apps/sim/socket-server/config/socket.ts b/apps/sim/socket-server/config/socket.ts
index 508881d147..eeb36dbdb7 100644
--- a/apps/sim/socket-server/config/socket.ts
+++ b/apps/sim/socket-server/config/socket.ts
@@ -2,7 +2,7 @@ import type { Server as HttpServer } from 'http'
import { Server } from 'socket.io'
import { env } from '@/lib/env'
import { isProd } from '@/lib/environment'
-import { createLogger } from '../../lib/logs/console/logger'
+import { createLogger } from '@/lib/logs/console/logger'
const logger = createLogger('SocketIOConfig')
diff --git a/apps/sim/socket-server/database/operations.ts b/apps/sim/socket-server/database/operations.ts
index e48113c534..3270c18585 100644
--- a/apps/sim/socket-server/database/operations.ts
+++ b/apps/sim/socket-server/database/operations.ts
@@ -4,8 +4,8 @@ import postgres from 'postgres'
import { env } from '@/lib/env'
import { createLogger } from '@/lib/logs/console/logger'
import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/db-helpers'
-import * as schema from '../../db/schema'
-import { workflow, workflowBlocks, workflowEdges, workflowSubflows } from '../../db/schema'
+import * as schema from '@/db/schema'
+import { workflow, workflowBlocks, workflowEdges, workflowSubflows } from '@/db/schema'
const logger = createLogger('SocketDatabase')
diff --git a/apps/sim/socket-server/handlers/connection.ts b/apps/sim/socket-server/handlers/connection.ts
index ccaad0243f..29c2e1800e 100644
--- a/apps/sim/socket-server/handlers/connection.ts
+++ b/apps/sim/socket-server/handlers/connection.ts
@@ -1,7 +1,7 @@
-import { createLogger } from '../../lib/logs/console/logger'
-import type { AuthenticatedSocket } from '../middleware/auth'
-import type { RoomManager } from '../rooms/manager'
-import type { HandlerDependencies } from './workflow'
+import { createLogger } from '@/lib/logs/console/logger'
+import type { HandlerDependencies } from '@/socket-server/handlers/workflow'
+import type { AuthenticatedSocket } from '@/socket-server/middleware/auth'
+import type { RoomManager } from '@/socket-server/rooms/manager'
const logger = createLogger('ConnectionHandlers')
diff --git a/apps/sim/socket-server/handlers/index.ts b/apps/sim/socket-server/handlers/index.ts
index cf8a2f4613..976b0aa110 100644
--- a/apps/sim/socket-server/handlers/index.ts
+++ b/apps/sim/socket-server/handlers/index.ts
@@ -1,10 +1,10 @@
-import type { AuthenticatedSocket } from '../middleware/auth'
-import type { RoomManager, UserPresence, WorkflowRoom } from '../rooms/manager'
-import { setupConnectionHandlers } from './connection'
-import { setupOperationsHandlers } from './operations'
-import { setupPresenceHandlers } from './presence'
-import { setupSubblocksHandlers } from './subblocks'
-import { setupWorkflowHandlers } from './workflow'
+import { setupConnectionHandlers } from '@/socket-server/handlers/connection'
+import { setupOperationsHandlers } from '@/socket-server/handlers/operations'
+import { setupPresenceHandlers } from '@/socket-server/handlers/presence'
+import { setupSubblocksHandlers } from '@/socket-server/handlers/subblocks'
+import { setupWorkflowHandlers } from '@/socket-server/handlers/workflow'
+import type { AuthenticatedSocket } from '@/socket-server/middleware/auth'
+import type { RoomManager, UserPresence, WorkflowRoom } from '@/socket-server/rooms/manager'
export type { UserPresence, WorkflowRoom }
diff --git a/apps/sim/socket-server/handlers/operations.ts b/apps/sim/socket-server/handlers/operations.ts
index 4e956eb003..11da962948 100644
--- a/apps/sim/socket-server/handlers/operations.ts
+++ b/apps/sim/socket-server/handlers/operations.ts
@@ -1,11 +1,11 @@
import { ZodError } from 'zod'
-import { createLogger } from '../../lib/logs/console/logger'
-import { persistWorkflowOperation } from '../database/operations'
-import type { AuthenticatedSocket } from '../middleware/auth'
-import { verifyOperationPermission } from '../middleware/permissions'
-import type { RoomManager } from '../rooms/manager'
-import { WorkflowOperationSchema } from '../validation/schemas'
-import type { HandlerDependencies } from './workflow'
+import { createLogger } from '@/lib/logs/console/logger'
+import { persistWorkflowOperation } from '@/socket-server/database/operations'
+import type { HandlerDependencies } from '@/socket-server/handlers/workflow'
+import type { AuthenticatedSocket } from '@/socket-server/middleware/auth'
+import { verifyOperationPermission } from '@/socket-server/middleware/permissions'
+import type { RoomManager } from '@/socket-server/rooms/manager'
+import { WorkflowOperationSchema } from '@/socket-server/validation/schemas'
const logger = createLogger('OperationsHandlers')
diff --git a/apps/sim/socket-server/handlers/presence.ts b/apps/sim/socket-server/handlers/presence.ts
index 3904c87c3b..05462e8a37 100644
--- a/apps/sim/socket-server/handlers/presence.ts
+++ b/apps/sim/socket-server/handlers/presence.ts
@@ -1,7 +1,7 @@
-import { createLogger } from '../../lib/logs/console/logger'
-import type { AuthenticatedSocket } from '../middleware/auth'
-import type { RoomManager } from '../rooms/manager'
-import type { HandlerDependencies } from './workflow'
+import { createLogger } from '@/lib/logs/console/logger'
+import type { HandlerDependencies } from '@/socket-server/handlers/workflow'
+import type { AuthenticatedSocket } from '@/socket-server/middleware/auth'
+import type { RoomManager } from '@/socket-server/rooms/manager'
const logger = createLogger('PresenceHandlers')
diff --git a/apps/sim/socket-server/handlers/subblocks.ts b/apps/sim/socket-server/handlers/subblocks.ts
index 18ad9b707d..a71a1fee19 100644
--- a/apps/sim/socket-server/handlers/subblocks.ts
+++ b/apps/sim/socket-server/handlers/subblocks.ts
@@ -1,10 +1,10 @@
import { and, eq } from 'drizzle-orm'
-import { db } from '../../db'
-import { workflow, workflowBlocks } from '../../db/schema'
-import { createLogger } from '../../lib/logs/console/logger'
-import type { AuthenticatedSocket } from '../middleware/auth'
-import type { RoomManager } from '../rooms/manager'
-import type { HandlerDependencies } from './workflow'
+import { createLogger } from '@/lib/logs/console/logger'
+import { db } from '@/db'
+import { workflow, workflowBlocks } from '@/db/schema'
+import type { HandlerDependencies } from '@/socket-server/handlers/workflow'
+import type { AuthenticatedSocket } from '@/socket-server/middleware/auth'
+import type { RoomManager } from '@/socket-server/rooms/manager'
const logger = createLogger('SubblocksHandlers')
diff --git a/apps/sim/socket-server/handlers/workflow.ts b/apps/sim/socket-server/handlers/workflow.ts
index 300e435608..23d72825e8 100644
--- a/apps/sim/socket-server/handlers/workflow.ts
+++ b/apps/sim/socket-server/handlers/workflow.ts
@@ -1,8 +1,8 @@
-import { createLogger } from '../../lib/logs/console/logger'
-import { getWorkflowState } from '../database/operations'
-import type { AuthenticatedSocket } from '../middleware/auth'
-import { verifyWorkflowAccess } from '../middleware/permissions'
-import type { RoomManager, UserPresence, WorkflowRoom } from '../rooms/manager'
+import { createLogger } from '@/lib/logs/console/logger'
+import { getWorkflowState } from '@/socket-server/database/operations'
+import type { AuthenticatedSocket } from '@/socket-server/middleware/auth'
+import { verifyWorkflowAccess } from '@/socket-server/middleware/permissions'
+import type { RoomManager, UserPresence, WorkflowRoom } from '@/socket-server/rooms/manager'
const logger = createLogger('WorkflowHandlers')
diff --git a/apps/sim/socket-server/index.test.ts b/apps/sim/socket-server/index.test.ts
index 0f2f1257c9..c8714eacdc 100644
--- a/apps/sim/socket-server/index.test.ts
+++ b/apps/sim/socket-server/index.test.ts
@@ -5,12 +5,12 @@
*/
import { createServer } from 'http'
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from 'vitest'
-import { createLogger } from '../lib/logs/console/logger'
-import { createSocketIOServer } from './config/socket'
-import { RoomManager } from './rooms/manager'
-import { createHttpHandler } from './routes/http'
+import { createLogger } from '@/lib/logs/console/logger'
+import { createSocketIOServer } from '@/socket-server/config/socket'
+import { RoomManager } from '@/socket-server/rooms/manager'
+import { createHttpHandler } from '@/socket-server/routes/http'
-vi.mock('../lib/auth', () => ({
+vi.mock('@/lib/auth', () => ({
auth: {
api: {
verifyOneTimeToken: vi.fn(),
@@ -18,7 +18,7 @@ vi.mock('../lib/auth', () => ({
},
}))
-vi.mock('../db', () => ({
+vi.mock('@/db', () => ({
db: {
select: vi.fn(),
insert: vi.fn(),
@@ -28,7 +28,7 @@ vi.mock('../db', () => ({
},
}))
-vi.mock('./middleware/auth', () => ({
+vi.mock('@/socket-server/middleware/auth', () => ({
authenticateSocket: vi.fn((socket, next) => {
socket.userId = 'test-user-id'
socket.userName = 'Test User'
@@ -37,7 +37,7 @@ vi.mock('./middleware/auth', () => ({
}),
}))
-vi.mock('./middleware/permissions', () => ({
+vi.mock('@/socket-server/middleware/permissions', () => ({
verifyWorkflowAccess: vi.fn().mockResolvedValue({
hasAccess: true,
role: 'owner',
@@ -47,7 +47,7 @@ vi.mock('./middleware/permissions', () => ({
}),
}))
-vi.mock('./database/operations', () => ({
+vi.mock('@/socket-server/database/operations', () => ({
getWorkflowState: vi.fn().mockResolvedValue({
id: 'test-workflow',
name: 'Test Workflow',
@@ -228,13 +228,13 @@ describe('Socket Server Index Integration', () => {
describe('Module Integration', () => {
it.concurrent('should properly import all extracted modules', async () => {
// Test that all modules can be imported without errors
- const { createSocketIOServer } = await import('./config/socket')
- const { createHttpHandler } = await import('./routes/http')
- const { RoomManager } = await import('./rooms/manager')
- const { authenticateSocket } = await import('./middleware/auth')
- const { verifyWorkflowAccess } = await import('./middleware/permissions')
- const { getWorkflowState } = await import('./database/operations')
- const { WorkflowOperationSchema } = await import('./validation/schemas')
+ const { createSocketIOServer } = await import('@/socket-server/config/socket')
+ const { createHttpHandler } = await import('@/socket-server/routes/http')
+ const { RoomManager } = await import('@/socket-server/rooms/manager')
+ const { authenticateSocket } = await import('@/socket-server/middleware/auth')
+ const { verifyWorkflowAccess } = await import('@/socket-server/middleware/permissions')
+ const { getWorkflowState } = await import('@/socket-server/database/operations')
+ const { WorkflowOperationSchema } = await import('@/socket-server/validation/schemas')
expect(createSocketIOServer).toBeTypeOf('function')
expect(createHttpHandler).toBeTypeOf('function')
@@ -285,7 +285,7 @@ describe('Socket Server Index Integration', () => {
describe('Validation and Utils', () => {
it.concurrent('should validate workflow operations', async () => {
- const { WorkflowOperationSchema } = await import('./validation/schemas')
+ const { WorkflowOperationSchema } = await import('@/socket-server/validation/schemas')
const validOperation = {
operation: 'add',
@@ -303,7 +303,7 @@ describe('Socket Server Index Integration', () => {
})
it.concurrent('should validate block operations with autoConnectEdge', async () => {
- const { WorkflowOperationSchema } = await import('./validation/schemas')
+ const { WorkflowOperationSchema } = await import('@/socket-server/validation/schemas')
const validOperationWithAutoEdge = {
operation: 'add',
@@ -329,7 +329,7 @@ describe('Socket Server Index Integration', () => {
})
it.concurrent('should validate edge operations', async () => {
- const { WorkflowOperationSchema } = await import('./validation/schemas')
+ const { WorkflowOperationSchema } = await import('@/socket-server/validation/schemas')
const validEdgeOperation = {
operation: 'add',
@@ -346,7 +346,7 @@ describe('Socket Server Index Integration', () => {
})
it('should validate subflow operations', async () => {
- const { WorkflowOperationSchema } = await import('./validation/schemas')
+ const { WorkflowOperationSchema } = await import('@/socket-server/validation/schemas')
const validSubflowOperation = {
operation: 'update',
diff --git a/apps/sim/socket-server/index.ts b/apps/sim/socket-server/index.ts
index bbe7d91373..1a475ef1e1 100644
--- a/apps/sim/socket-server/index.ts
+++ b/apps/sim/socket-server/index.ts
@@ -1,11 +1,11 @@
import { createServer } from 'http'
import { env } from '@/lib/env'
-import { createLogger } from '../lib/logs/console/logger'
-import { createSocketIOServer } from './config/socket'
-import { setupAllHandlers } from './handlers'
-import { type AuthenticatedSocket, authenticateSocket } from './middleware/auth'
-import { RoomManager } from './rooms/manager'
-import { createHttpHandler } from './routes/http'
+import { createLogger } from '@/lib/logs/console/logger'
+import { createSocketIOServer } from '@/socket-server/config/socket'
+import { setupAllHandlers } from '@/socket-server/handlers'
+import { type AuthenticatedSocket, authenticateSocket } from '@/socket-server/middleware/auth'
+import { RoomManager } from '@/socket-server/rooms/manager'
+import { createHttpHandler } from '@/socket-server/routes/http'
const logger = createLogger('CollaborativeSocketServer')
diff --git a/apps/sim/socket-server/middleware/permissions.ts b/apps/sim/socket-server/middleware/permissions.ts
index 6ae80ef8a7..3be2c835ca 100644
--- a/apps/sim/socket-server/middleware/permissions.ts
+++ b/apps/sim/socket-server/middleware/permissions.ts
@@ -1,8 +1,8 @@
import { eq } from 'drizzle-orm'
-import { db } from '../../db'
-import { workflow } from '../../db/schema'
-import { createLogger } from '../../lib/logs/console/logger'
-import { getUserEntityPermissions } from '../../lib/permissions/utils'
+import { createLogger } from '@/lib/logs/console/logger'
+import { getUserEntityPermissions } from '@/lib/permissions/utils'
+import { db } from '@/db'
+import { workflow } from '@/db/schema'
const logger = createLogger('SocketPermissions')
diff --git a/apps/sim/socket-server/routes/http.ts b/apps/sim/socket-server/routes/http.ts
index 0bb867e2ea..2a3cbd958a 100644
--- a/apps/sim/socket-server/routes/http.ts
+++ b/apps/sim/socket-server/routes/http.ts
@@ -1,5 +1,5 @@
import type { IncomingMessage, ServerResponse } from 'http'
-import type { RoomManager } from '../rooms/manager'
+import type { RoomManager } from '@/socket-server/rooms/manager'
interface Logger {
info: (message: string, ...args: any[]) => void
diff --git a/apps/sim/stores/constants.ts b/apps/sim/stores/constants.ts
index c781c1f4b5..82a5143f15 100644
--- a/apps/sim/stores/constants.ts
+++ b/apps/sim/stores/constants.ts
@@ -1,5 +1,3 @@
-// localStorage persistence removed - STORAGE_KEYS no longer needed
-
export const API_ENDPOINTS = {
SYNC: '/api/workflows/sync',
ENVIRONMENT: '/api/environment',
@@ -8,5 +6,3 @@ export const API_ENDPOINTS = {
WORKFLOWS: '/api/workflows',
WORKSPACE_PERMISSIONS: (id: string) => `/api/workspaces/${id}/permissions`,
}
-
-// Removed SYNC_INTERVALS - Socket.IO handles real-time sync
diff --git a/apps/sim/stores/copilot/index.ts b/apps/sim/stores/copilot/index.ts
index 11e2815ca6..472d568d9f 100644
--- a/apps/sim/stores/copilot/index.ts
+++ b/apps/sim/stores/copilot/index.ts
@@ -1,8 +1,8 @@
-export { useCopilotStore } from './store'
+export { useCopilotStore } from '@/stores/copilot/store'
export type {
CopilotActions,
CopilotChat,
CopilotMessage,
CopilotState,
CopilotStore,
-} from './types'
+} from '@/stores/copilot/types'
diff --git a/apps/sim/stores/copilot/store.ts b/apps/sim/stores/copilot/store.ts
index 0816693ba3..f66fc52070 100644
--- a/apps/sim/stores/copilot/store.ts
+++ b/apps/sim/stores/copilot/store.ts
@@ -14,7 +14,7 @@ import {
updateChatMessages,
} from '@/lib/copilot/api'
import { createLogger } from '@/lib/logs/console/logger'
-import type { CopilotStore } from './types'
+import type { CopilotStore } from '@/stores/copilot/types'
const logger = createLogger('CopilotStore')
diff --git a/apps/sim/stores/custom-tools/store.ts b/apps/sim/stores/custom-tools/store.ts
index 6a7f884a7c..318c57e48e 100644
--- a/apps/sim/stores/custom-tools/store.ts
+++ b/apps/sim/stores/custom-tools/store.ts
@@ -1,7 +1,7 @@
import { create } from 'zustand'
import { devtools, persist } from 'zustand/middleware'
import { createLogger } from '@/lib/logs/console/logger'
-import type { CustomToolsStore } from './types'
+import type { CustomToolsStore } from '@/stores/custom-tools/types'
const logger = createLogger('CustomToolsStore')
const API_ENDPOINT = '/api/tools/custom'
diff --git a/apps/sim/stores/execution/store.ts b/apps/sim/stores/execution/store.ts
index 5261bacbab..fa47d9bdda 100644
--- a/apps/sim/stores/execution/store.ts
+++ b/apps/sim/stores/execution/store.ts
@@ -1,12 +1,12 @@
import { create } from 'zustand'
-import { useGeneralStore } from '@/stores/settings/general/store'
import {
type ExecutionActions,
type ExecutionState,
initialState,
type PanToBlockCallback,
type SetPanToBlockCallback,
-} from './types'
+} from '@/stores/execution/types'
+import { useGeneralStore } from '@/stores/settings/general/store'
// Global callback for panning to active blocks
let panToBlockCallback: PanToBlockCallback | null = null
diff --git a/apps/sim/stores/folders/store.ts b/apps/sim/stores/folders/store.ts
index e74dac1946..7c60fb9064 100644
--- a/apps/sim/stores/folders/store.ts
+++ b/apps/sim/stores/folders/store.ts
@@ -1,7 +1,7 @@
import { create } from 'zustand'
import { devtools } from 'zustand/middleware'
import { createLogger } from '@/lib/logs/console/logger'
-import { useWorkflowRegistry } from '../workflows/registry/store'
+import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
const logger = createLogger('FoldersStore')
diff --git a/apps/sim/stores/index.ts b/apps/sim/stores/index.ts
index a5e83335ee..79727509ec 100644
--- a/apps/sim/stores/index.ts
+++ b/apps/sim/stores/index.ts
@@ -2,16 +2,16 @@
import { useEffect } from 'react'
import { createLogger } from '@/lib/logs/console/logger'
-import { useCopilotStore } from './copilot/store'
-import { useCustomToolsStore } from './custom-tools/store'
-import { useExecutionStore } from './execution/store'
-import { useConsoleStore } from './panel/console/store'
-import { useVariablesStore } from './panel/variables/store'
-import { useEnvironmentStore } from './settings/environment/store'
-import { useSubscriptionStore } from './subscription/store'
-import { useWorkflowRegistry } from './workflows/registry/store'
-import { useSubBlockStore } from './workflows/subblock/store'
-import { useWorkflowStore } from './workflows/workflow/store'
+import { useCopilotStore } from '@/stores/copilot/store'
+import { useCustomToolsStore } from '@/stores/custom-tools/store'
+import { useExecutionStore } from '@/stores/execution/store'
+import { useConsoleStore } from '@/stores/panel/console/store'
+import { useVariablesStore } from '@/stores/panel/variables/store'
+import { useEnvironmentStore } from '@/stores/settings/environment/store'
+import { useSubscriptionStore } from '@/stores/subscription/store'
+import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
+import { useSubBlockStore } from '@/stores/workflows/subblock/store'
+import { useWorkflowStore } from '@/stores/workflows/workflow/store'
const logger = createLogger('Stores')
diff --git a/apps/sim/stores/logs/filters/store.ts b/apps/sim/stores/logs/filters/store.ts
index 956a37ddd6..72325833de 100644
--- a/apps/sim/stores/logs/filters/store.ts
+++ b/apps/sim/stores/logs/filters/store.ts
@@ -1,5 +1,5 @@
import { create } from 'zustand'
-import type { FilterState, LogLevel, TimeRange, TriggerType } from './types'
+import type { FilterState, LogLevel, TimeRange, TriggerType } from '@/stores/logs/filters/types'
// Helper functions for URL synchronization
const getSearchParams = () => {
diff --git a/apps/sim/stores/ollama/store.ts b/apps/sim/stores/ollama/store.ts
index c9b3780c55..abc377ae01 100644
--- a/apps/sim/stores/ollama/store.ts
+++ b/apps/sim/stores/ollama/store.ts
@@ -1,7 +1,7 @@
import { create } from 'zustand'
import { createLogger } from '@/lib/logs/console/logger'
import { updateOllamaProviderModels } from '@/providers/utils'
-import type { OllamaStore } from './types'
+import type { OllamaStore } from '@/stores/ollama/types'
const logger = createLogger('OllamaStore')
diff --git a/apps/sim/stores/organization/index.ts b/apps/sim/stores/organization/index.ts
index 945de62802..f9c498fcdd 100644
--- a/apps/sim/stores/organization/index.ts
+++ b/apps/sim/stores/organization/index.ts
@@ -1,4 +1,4 @@
-export { useOrganizationStore } from './store'
+export { useOrganizationStore } from '@/stores/organization/store'
export type {
Invitation,
Member,
@@ -12,10 +12,10 @@ export type {
User,
Workspace,
WorkspaceInvitation,
-} from './types'
+} from '@/stores/organization/types'
export {
calculateSeatUsage,
generateSlug,
validateEmail,
validateSlug,
-} from './utils'
+} from '@/stores/organization/utils'
diff --git a/apps/sim/stores/organization/store.ts b/apps/sim/stores/organization/store.ts
index 0fe2a30c4d..7c39880894 100644
--- a/apps/sim/stores/organization/store.ts
+++ b/apps/sim/stores/organization/store.ts
@@ -3,8 +3,17 @@ import { devtools } from 'zustand/middleware'
import { client } from '@/lib/auth-client'
import { checkEnterprisePlan } from '@/lib/billing/subscriptions/utils'
import { createLogger } from '@/lib/logs/console/logger'
-import type { OrganizationStore, Subscription, WorkspaceInvitation } from './types'
-import { calculateSeatUsage, generateSlug, validateEmail, validateSlug } from './utils'
+import type {
+ OrganizationStore,
+ Subscription,
+ WorkspaceInvitation,
+} from '@/stores/organization/types'
+import {
+ calculateSeatUsage,
+ generateSlug,
+ validateEmail,
+ validateSlug,
+} from '@/stores/organization/utils'
const logger = createLogger('OrganizationStore')
diff --git a/apps/sim/stores/organization/utils.ts b/apps/sim/stores/organization/utils.ts
index 00202cdb85..9ae629b7cd 100644
--- a/apps/sim/stores/organization/utils.ts
+++ b/apps/sim/stores/organization/utils.ts
@@ -1,4 +1,4 @@
-import type { Organization } from './types'
+import type { Organization } from '@/stores/organization/types'
/**
* Calculate seat usage for an organization
diff --git a/apps/sim/stores/panel/chat/store.ts b/apps/sim/stores/panel/chat/store.ts
index 07e1aaddae..519b256d5e 100644
--- a/apps/sim/stores/panel/chat/store.ts
+++ b/apps/sim/stores/panel/chat/store.ts
@@ -1,7 +1,7 @@
import { v4 as uuidv4 } from 'uuid'
import { create } from 'zustand'
import { devtools, persist } from 'zustand/middleware'
-import type { ChatMessage, ChatStore } from './types'
+import type { ChatMessage, ChatStore } from '@/stores/panel/chat/types'
// MAX across all workflows
const MAX_MESSAGES = 50
diff --git a/apps/sim/stores/panel/console/store.test.ts b/apps/sim/stores/panel/console/store.test.ts
index 975ac85936..6217192d96 100644
--- a/apps/sim/stores/panel/console/store.test.ts
+++ b/apps/sim/stores/panel/console/store.test.ts
@@ -1,6 +1,6 @@
import { beforeEach, describe, expect, it, vi } from 'vitest'
-import { useConsoleStore } from './store'
-import type { ConsoleUpdate } from './types'
+import { useConsoleStore } from '@/stores/panel/console/store'
+import type { ConsoleUpdate } from '@/stores/panel/console/types'
vi.stubGlobal('crypto', {
randomUUID: vi.fn(() => 'test-uuid-123'),
diff --git a/apps/sim/stores/panel/console/store.ts b/apps/sim/stores/panel/console/store.ts
index 450de87cc8..28b45e8cd8 100644
--- a/apps/sim/stores/panel/console/store.ts
+++ b/apps/sim/stores/panel/console/store.ts
@@ -2,7 +2,7 @@ import { create } from 'zustand'
import { devtools, persist } from 'zustand/middleware'
import { redactApiKeys } from '@/lib/utils'
import type { NormalizedBlockOutput } from '@/executor/types'
-import type { ConsoleEntry, ConsoleStore } from './types'
+import type { ConsoleEntry, ConsoleStore } from '@/stores/panel/console/types'
const MAX_ENTRIES = 50 // MAX across all workflows
const MAX_IMAGE_DATA_SIZE = 1000 // Maximum size of image data to store (in characters)
@@ -269,7 +269,7 @@ export const useConsoleStore = create()(
updateConsole: (
blockId: string,
- update: string | import('./types').ConsoleUpdate,
+ update: string | import('@/stores/panel/console/types').ConsoleUpdate,
executionId?: string
) => {
set((state) => {
diff --git a/apps/sim/stores/panel/store.ts b/apps/sim/stores/panel/store.ts
index 800f49095f..a4e9274dd4 100644
--- a/apps/sim/stores/panel/store.ts
+++ b/apps/sim/stores/panel/store.ts
@@ -1,6 +1,6 @@
import { create } from 'zustand'
import { devtools, persist } from 'zustand/middleware'
-import type { PanelStore, PanelTab } from './types'
+import type { PanelStore, PanelTab } from '@/stores/panel/types'
export const usePanelStore = create()(
devtools(
diff --git a/apps/sim/stores/panel/variables/store.ts b/apps/sim/stores/panel/variables/store.ts
index 0973a123a2..01fe306c1e 100644
--- a/apps/sim/stores/panel/variables/store.ts
+++ b/apps/sim/stores/panel/variables/store.ts
@@ -2,9 +2,9 @@ import { create } from 'zustand'
import { devtools, persist } from 'zustand/middleware'
import { createLogger } from '@/lib/logs/console/logger'
import { API_ENDPOINTS } from '@/stores/constants'
+import type { Variable, VariablesStore } from '@/stores/panel/variables/types'
import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
import { useSubBlockStore } from '@/stores/workflows/subblock/store'
-import type { Variable, VariablesStore } from './types'
const logger = createLogger('VariablesStore')
const SAVE_DEBOUNCE_DELAY = 200 // Reduced debounce for variables (not real-time collaborative)
diff --git a/apps/sim/stores/settings/environment/store.ts b/apps/sim/stores/settings/environment/store.ts
index 1710aca7d4..fd8e99151d 100644
--- a/apps/sim/stores/settings/environment/store.ts
+++ b/apps/sim/stores/settings/environment/store.ts
@@ -1,7 +1,7 @@
import { create } from 'zustand'
import { createLogger } from '@/lib/logs/console/logger'
-import { API_ENDPOINTS } from '../../constants'
-import type { EnvironmentStore, EnvironmentVariable } from './types'
+import { API_ENDPOINTS } from '@/stores/constants'
+import type { EnvironmentStore, EnvironmentVariable } from '@/stores/settings/environment/types'
const logger = createLogger('EnvironmentStore')
diff --git a/apps/sim/stores/settings/general/store.ts b/apps/sim/stores/settings/general/store.ts
index 456b0c91a3..84fc85af43 100644
--- a/apps/sim/stores/settings/general/store.ts
+++ b/apps/sim/stores/settings/general/store.ts
@@ -1,7 +1,7 @@
import { create } from 'zustand'
import { devtools, persist } from 'zustand/middleware'
import { createLogger } from '@/lib/logs/console/logger'
-import type { General, GeneralStore, UserSettings } from './types'
+import type { General, GeneralStore, UserSettings } from '@/stores/settings/general/types'
const logger = createLogger('GeneralStore')
diff --git a/apps/sim/stores/subscription/store.ts b/apps/sim/stores/subscription/store.ts
index 5dac7332c1..aebb53b8d0 100644
--- a/apps/sim/stores/subscription/store.ts
+++ b/apps/sim/stores/subscription/store.ts
@@ -8,7 +8,7 @@ import type {
SubscriptionStore,
UsageData,
UsageLimitData,
-} from './types'
+} from '@/stores/subscription/types'
const logger = createLogger('SubscriptionStore')
diff --git a/apps/sim/stores/workflows/index.ts b/apps/sim/stores/workflows/index.ts
index 3d3d40e85e..635bdfeb83 100644
--- a/apps/sim/stores/workflows/index.ts
+++ b/apps/sim/stores/workflows/index.ts
@@ -1,8 +1,8 @@
import { createLogger } from '@/lib/logs/console/logger'
-import { useWorkflowRegistry } from './registry/store'
-import { mergeSubblockState } from './utils'
-import { useWorkflowStore } from './workflow/store'
-import type { BlockState, WorkflowState } from './workflow/types'
+import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
+import { mergeSubblockState } from '@/stores/workflows/utils'
+import { useWorkflowStore } from '@/stores/workflows/workflow/store'
+import type { BlockState, WorkflowState } from '@/stores/workflows/workflow/types'
const logger = createLogger('Workflows')
@@ -149,10 +149,10 @@ export function getAllWorkflowsWithValues() {
return result
}
-export { useWorkflowRegistry } from './registry/store'
-export type { WorkflowMetadata } from './registry/types'
-export { useSubBlockStore } from './subblock/store'
-export type { SubBlockStore } from './subblock/types'
-export { mergeSubblockState } from './utils'
-export { useWorkflowStore } from './workflow/store'
-export type { WorkflowState } from './workflow/types'
+export { useWorkflowRegistry } from '@/stores/workflows/registry/store'
+export type { WorkflowMetadata } from '@/stores/workflows/registry/types'
+export { useSubBlockStore } from '@/stores/workflows/subblock/store'
+export type { SubBlockStore } from '@/stores/workflows/subblock/types'
+export { mergeSubblockState } from '@/stores/workflows/utils'
+export { useWorkflowStore } from '@/stores/workflows/workflow/store'
+export type { WorkflowState } from '@/stores/workflows/workflow/types'
diff --git a/apps/sim/stores/workflows/middleware.ts b/apps/sim/stores/workflows/middleware.ts
index 9ea95e0791..e8751bc1df 100644
--- a/apps/sim/stores/workflows/middleware.ts
+++ b/apps/sim/stores/workflows/middleware.ts
@@ -1,7 +1,7 @@
import type { StateCreator } from 'zustand'
-import { useWorkflowRegistry } from './registry/store'
-import { useSubBlockStore } from './subblock/store'
-import type { WorkflowState, WorkflowStore } from './workflow/types'
+import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
+import { useSubBlockStore } from '@/stores/workflows/subblock/store'
+import type { WorkflowState, WorkflowStore } from '@/stores/workflows/workflow/types'
interface HistoryEntry {
state: WorkflowState
diff --git a/apps/sim/stores/workflows/registry/store.ts b/apps/sim/stores/workflows/registry/store.ts
index 8ce81e9f7f..f488d25d48 100644
--- a/apps/sim/stores/workflows/registry/store.ts
+++ b/apps/sim/stores/workflows/registry/store.ts
@@ -2,13 +2,17 @@ import { create } from 'zustand'
import { devtools } from 'zustand/middleware'
import { createLogger } from '@/lib/logs/console/logger'
import { generateCreativeWorkflowName } from '@/lib/naming'
+import { API_ENDPOINTS } from '@/stores/constants'
import { clearWorkflowVariablesTracking } from '@/stores/panel/variables/store'
-import { API_ENDPOINTS } from '../../constants'
-import { useSubBlockStore } from '../subblock/store'
-import { useWorkflowStore } from '../workflow/store'
-import type { BlockState } from '../workflow/types'
-import type { DeploymentStatus, WorkflowMetadata, WorkflowRegistry } from './types'
-import { getNextWorkflowColor } from './utils'
+import type {
+ DeploymentStatus,
+ WorkflowMetadata,
+ WorkflowRegistry,
+} from '@/stores/workflows/registry/types'
+import { getNextWorkflowColor } from '@/stores/workflows/registry/utils'
+import { useSubBlockStore } from '@/stores/workflows/subblock/store'
+import { useWorkflowStore } from '@/stores/workflows/workflow/store'
+import type { BlockState } from '@/stores/workflows/workflow/types'
const logger = createLogger('WorkflowRegistry')
diff --git a/apps/sim/stores/workflows/server-utils.ts b/apps/sim/stores/workflows/server-utils.ts
index 19884bb8f8..3f4e1641ca 100644
--- a/apps/sim/stores/workflows/server-utils.ts
+++ b/apps/sim/stores/workflows/server-utils.ts
@@ -8,7 +8,7 @@
* or React hooks, making it safe for use in Next.js API routes.
*/
-import type { BlockState, SubBlockState } from './workflow/types'
+import type { BlockState, SubBlockState } from '@/stores/workflows/workflow/types'
/**
* Server-safe version of mergeSubblockState for API routes
diff --git a/apps/sim/stores/workflows/subblock/store.ts b/apps/sim/stores/workflows/subblock/store.ts
index 8715b72e13..672cca20ec 100644
--- a/apps/sim/stores/workflows/subblock/store.ts
+++ b/apps/sim/stores/workflows/subblock/store.ts
@@ -1,11 +1,8 @@
import { create } from 'zustand'
import { devtools } from 'zustand/middleware'
import type { SubBlockConfig } from '@/blocks/types'
-import { useWorkflowRegistry } from '../registry/store'
-// Removed workflowSync import - Socket.IO handles real-time sync
-import type { SubBlockStore } from './types'
-
-// Removed debounce sync - Socket.IO handles real-time sync immediately
+import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
+import type { SubBlockStore } from '@/stores/workflows/subblock/types'
/**
* SubBlockState stores values for all subblocks in workflows
diff --git a/apps/sim/stores/workflows/utils.ts b/apps/sim/stores/workflows/utils.ts
index d793f48c1a..b2f43af6cf 100644
--- a/apps/sim/stores/workflows/utils.ts
+++ b/apps/sim/stores/workflows/utils.ts
@@ -1,5 +1,5 @@
-import { useSubBlockStore } from './subblock/store'
-import type { BlockState, SubBlockState } from './workflow/types'
+import { useSubBlockStore } from '@/stores/workflows/subblock/store'
+import type { BlockState, SubBlockState } from '@/stores/workflows/workflow/types'
/**
* Merges workflow block states with subblock values while maintaining block structure
diff --git a/apps/sim/stores/workflows/workflow/store.test.ts b/apps/sim/stores/workflows/workflow/store.test.ts
index a1bcbe146b..f2a0fe1134 100644
--- a/apps/sim/stores/workflows/workflow/store.test.ts
+++ b/apps/sim/stores/workflows/workflow/store.test.ts
@@ -1,7 +1,7 @@
import { beforeEach, describe, expect, it, vi } from 'vitest'
-import { useWorkflowRegistry } from '../registry/store'
-import { useSubBlockStore } from '../subblock/store'
-import { useWorkflowStore } from './store'
+import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
+import { useSubBlockStore } from '@/stores/workflows/subblock/store'
+import { useWorkflowStore } from '@/stores/workflows/workflow/store'
describe('workflow store', () => {
beforeEach(() => {
diff --git a/apps/sim/stores/workflows/workflow/store.ts b/apps/sim/stores/workflows/workflow/store.ts
index 056cdd8d49..f6454b4552 100644
--- a/apps/sim/stores/workflows/workflow/store.ts
+++ b/apps/sim/stores/workflows/workflow/store.ts
@@ -4,13 +4,21 @@ import { devtools } from 'zustand/middleware'
import { createLogger } from '@/lib/logs/console/logger'
import { getBlock } from '@/blocks'
import { resolveOutputType } from '@/blocks/utils'
-import { pushHistory, type WorkflowStoreWithHistory, withHistory } from '../middleware'
-import { useWorkflowRegistry } from '../registry/store'
-import { useSubBlockStore } from '../subblock/store'
-// import { markWorkflowsDirty, workflowSync } from '../sync' // Disabled for socket-based sync
-import { mergeSubblockState } from '../utils'
-import type { Position, SubBlockState, SyncControl, WorkflowState } from './types'
-import { generateLoopBlocks, generateParallelBlocks } from './utils'
+import {
+ pushHistory,
+ type WorkflowStoreWithHistory,
+ withHistory,
+} from '@/stores/workflows/middleware'
+import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
+import { useSubBlockStore } from '@/stores/workflows/subblock/store'
+import { mergeSubblockState } from '@/stores/workflows/utils'
+import type {
+ Position,
+ SubBlockState,
+ SyncControl,
+ WorkflowState,
+} from '@/stores/workflows/workflow/types'
+import { generateLoopBlocks, generateParallelBlocks } from '@/stores/workflows/workflow/utils'
const logger = createLogger('WorkflowStore')
diff --git a/apps/sim/stores/workflows/workflow/types.ts b/apps/sim/stores/workflows/workflow/types.ts
index 05b31bfbc2..f52b35b66c 100644
--- a/apps/sim/stores/workflows/workflow/types.ts
+++ b/apps/sim/stores/workflows/workflow/types.ts
@@ -1,6 +1,6 @@
import type { Edge } from 'reactflow'
import type { BlockOutput, SubBlockType } from '@/blocks/types'
-import type { DeploymentStatus } from '../registry/types'
+import type { DeploymentStatus } from '@/stores/workflows/registry/types'
export const SUBFLOW_TYPES = {
LOOP: 'loop',
diff --git a/apps/sim/stores/workflows/workflow/utils.test.ts b/apps/sim/stores/workflows/workflow/utils.test.ts
index 96ceb41319..e2ed70db06 100644
--- a/apps/sim/stores/workflows/workflow/utils.test.ts
+++ b/apps/sim/stores/workflows/workflow/utils.test.ts
@@ -1,6 +1,6 @@
import { describe, expect, test } from 'vitest'
-import type { BlockState } from './types'
-import { convertLoopBlockToLoop } from './utils'
+import type { BlockState } from '@/stores/workflows/workflow/types'
+import { convertLoopBlockToLoop } from '@/stores/workflows/workflow/utils'
describe('convertLoopBlockToLoop', () => {
test('should parse JSON array string for forEach loops', () => {
diff --git a/apps/sim/stores/workflows/workflow/utils.ts b/apps/sim/stores/workflows/workflow/utils.ts
index 8b9e8d4a37..15f0e3dcc9 100644
--- a/apps/sim/stores/workflows/workflow/utils.ts
+++ b/apps/sim/stores/workflows/workflow/utils.ts
@@ -1,4 +1,4 @@
-import type { BlockState, Loop, Parallel } from './types'
+import type { BlockState, Loop, Parallel } from '@/stores/workflows/workflow/types'
const DEFAULT_LOOP_ITERATIONS = 5
diff --git a/apps/sim/stores/workflows/yaml/importer.ts b/apps/sim/stores/workflows/yaml/importer.ts
index fe5cc11e93..06b626c707 100644
--- a/apps/sim/stores/workflows/yaml/importer.ts
+++ b/apps/sim/stores/workflows/yaml/importer.ts
@@ -9,7 +9,7 @@ import {
parseBlockConnections,
validateBlockReferences,
validateBlockStructure,
-} from './parsing-utils'
+} from '@/stores/workflows/yaml/parsing-utils'
const logger = createLogger('WorkflowYamlImporter')
diff --git a/apps/sim/stores/workflows/yaml/store.ts b/apps/sim/stores/workflows/yaml/store.ts
index 9d9389a8c5..8076e6090c 100644
--- a/apps/sim/stores/workflows/yaml/store.ts
+++ b/apps/sim/stores/workflows/yaml/store.ts
@@ -2,8 +2,8 @@ import { create } from 'zustand'
import { devtools } from 'zustand/middleware'
import { createLogger } from '@/lib/logs/console/logger'
import { generateWorkflowYaml } from '@/lib/workflows/yaml-generator'
-import { useSubBlockStore } from '../subblock/store'
-import { useWorkflowStore } from '../workflow/store'
+import { useSubBlockStore } from '@/stores/workflows/subblock/store'
+import { useWorkflowStore } from '@/stores/workflows/workflow/store'
const logger = createLogger('WorkflowYamlStore')
diff --git a/apps/sim/tools/__test-utils__/test-tools.ts b/apps/sim/tools/__test-utils__/test-tools.ts
index 507a2d297e..436bd0537a 100644
--- a/apps/sim/tools/__test-utils__/test-tools.ts
+++ b/apps/sim/tools/__test-utils__/test-tools.ts
@@ -5,7 +5,7 @@
* in a controlled environment without external dependencies.
*/
import { type Mock, vi } from 'vitest'
-import type { ToolConfig, ToolResponse } from '../types'
+import type { ToolConfig, ToolResponse } from '@/tools/types'
// Define a type that combines Mock with fetch properties
type MockFetch = Mock & {
diff --git a/apps/sim/tools/blocks/edit-workflow.ts b/apps/sim/tools/blocks/edit-workflow.ts
index 36a9d8ea63..e71699f0c0 100644
--- a/apps/sim/tools/blocks/edit-workflow.ts
+++ b/apps/sim/tools/blocks/edit-workflow.ts
@@ -1,4 +1,4 @@
-import type { ToolConfig, ToolResponse } from '../types'
+import type { ToolConfig, ToolResponse } from '@/tools/types'
interface EditWorkflowParams {
yamlContent: string
diff --git a/apps/sim/tools/blocks/get-all.ts b/apps/sim/tools/blocks/get-all.ts
index b020b2cd0a..f9176d5dea 100644
--- a/apps/sim/tools/blocks/get-all.ts
+++ b/apps/sim/tools/blocks/get-all.ts
@@ -1,4 +1,4 @@
-import type { ToolConfig, ToolResponse } from '../types'
+import type { ToolConfig, ToolResponse } from '@/tools/types'
interface GetAllBlocksParams {
includeDetails?: boolean
diff --git a/apps/sim/tools/blocks/get-metadata.ts b/apps/sim/tools/blocks/get-metadata.ts
index dfcb029a91..c3ae2db62e 100644
--- a/apps/sim/tools/blocks/get-metadata.ts
+++ b/apps/sim/tools/blocks/get-metadata.ts
@@ -1,4 +1,4 @@
-import type { ToolConfig, ToolResponse } from '../types'
+import type { ToolConfig, ToolResponse } from '@/tools/types'
interface GetBlockMetadataParams {
blockIds: string[]
diff --git a/apps/sim/tools/blocks/get-yaml-structure.ts b/apps/sim/tools/blocks/get-yaml-structure.ts
index cd3dc483ac..d57c03851f 100644
--- a/apps/sim/tools/blocks/get-yaml-structure.ts
+++ b/apps/sim/tools/blocks/get-yaml-structure.ts
@@ -1,4 +1,4 @@
-import type { ToolConfig, ToolResponse } from '../types'
+import type { ToolConfig, ToolResponse } from '@/tools/types'
type GetYamlStructureParams = Record
diff --git a/apps/sim/tools/elevenlabs/tts.ts b/apps/sim/tools/elevenlabs/tts.ts
index af806364fe..b5772459a5 100644
--- a/apps/sim/tools/elevenlabs/tts.ts
+++ b/apps/sim/tools/elevenlabs/tts.ts
@@ -1,6 +1,6 @@
import { createLogger } from '@/lib/logs/console/logger'
-import type { ToolConfig } from '../types'
-import type { ElevenLabsTtsParams, ElevenLabsTtsResponse } from './types'
+import type { ElevenLabsTtsParams, ElevenLabsTtsResponse } from '@/tools/elevenlabs/types'
+import type { ToolConfig } from '@/tools/types'
const logger = createLogger('ElevenLabsTool')
diff --git a/apps/sim/tools/elevenlabs/types.ts b/apps/sim/tools/elevenlabs/types.ts
index 0648ee48cf..e029eee3f6 100644
--- a/apps/sim/tools/elevenlabs/types.ts
+++ b/apps/sim/tools/elevenlabs/types.ts
@@ -1,4 +1,4 @@
-import type { ToolResponse } from '../types'
+import type { ToolResponse } from '@/tools/types'
export interface ElevenLabsTtsParams {
apiKey: string
diff --git a/apps/sim/tools/params.test.ts b/apps/sim/tools/params.test.ts
index 161170da3c..30667f34cf 100644
--- a/apps/sim/tools/params.test.ts
+++ b/apps/sim/tools/params.test.ts
@@ -53,7 +53,7 @@ const mockToolConfig = {
},
}
-vi.mock('./utils', () => ({
+vi.mock('@/tools/utils', () => ({
getTool: vi.fn((toolId: string) => {
if (toolId === 'test_tool') {
return mockToolConfig
diff --git a/apps/sim/tools/params.ts b/apps/sim/tools/params.ts
index d5b2fd6788..50fbc7aa55 100644
--- a/apps/sim/tools/params.ts
+++ b/apps/sim/tools/params.ts
@@ -108,7 +108,7 @@ let blockConfigCache: Record | null = null
function getBlockConfigurations(): Record {
if (!blockConfigCache) {
try {
- const { getAllBlocks } = require('../blocks')
+ const { getAllBlocks } = require('@/blocks')
const allBlocks = getAllBlocks()
blockConfigCache = {}
allBlocks.forEach((block: BlockConfig) => {
diff --git a/apps/sim/tools/qdrant/fetch_points.ts b/apps/sim/tools/qdrant/fetch_points.ts
index 9cf502566a..b4a1640d49 100644
--- a/apps/sim/tools/qdrant/fetch_points.ts
+++ b/apps/sim/tools/qdrant/fetch_points.ts
@@ -1,5 +1,5 @@
-import type { ToolConfig } from '../types'
-import type { QdrantFetchParams, QdrantResponse } from './types'
+import type { QdrantFetchParams, QdrantResponse } from '@/tools/qdrant/types'
+import type { ToolConfig } from '@/tools/types'
export const fetchPointsTool: ToolConfig = {
id: 'qdrant_fetch_points',
diff --git a/apps/sim/tools/qdrant/index.ts b/apps/sim/tools/qdrant/index.ts
index b991694987..82d59fb2cd 100644
--- a/apps/sim/tools/qdrant/index.ts
+++ b/apps/sim/tools/qdrant/index.ts
@@ -1,6 +1,6 @@
-import { fetchPointsTool } from './fetch_points'
-import { searchVectorTool } from './search_vector'
-import { upsertPointsTool } from './upsert_points'
+import { fetchPointsTool } from '@/tools/qdrant/fetch_points'
+import { searchVectorTool } from '@/tools/qdrant/search_vector'
+import { upsertPointsTool } from '@/tools/qdrant/upsert_points'
export const qdrantUpsertTool = upsertPointsTool
export const qdrantSearchTool = searchVectorTool
diff --git a/apps/sim/tools/qdrant/search_vector.ts b/apps/sim/tools/qdrant/search_vector.ts
index c05bd44a45..92a8eac8ed 100644
--- a/apps/sim/tools/qdrant/search_vector.ts
+++ b/apps/sim/tools/qdrant/search_vector.ts
@@ -1,5 +1,5 @@
-import type { ToolConfig } from '../types'
-import type { QdrantResponse, QdrantSearchParams } from './types'
+import type { QdrantResponse, QdrantSearchParams } from '@/tools/qdrant/types'
+import type { ToolConfig } from '@/tools/types'
export const searchVectorTool: ToolConfig = {
id: 'qdrant_search_vector',
diff --git a/apps/sim/tools/qdrant/types.ts b/apps/sim/tools/qdrant/types.ts
index f257df985b..0d85466ce5 100644
--- a/apps/sim/tools/qdrant/types.ts
+++ b/apps/sim/tools/qdrant/types.ts
@@ -1,4 +1,4 @@
-import type { ToolResponse } from '../types'
+import type { ToolResponse } from '@/tools/types'
export interface QdrantBaseParams {
url: string
diff --git a/apps/sim/tools/qdrant/upsert_points.ts b/apps/sim/tools/qdrant/upsert_points.ts
index df46f183b8..2550707bb5 100644
--- a/apps/sim/tools/qdrant/upsert_points.ts
+++ b/apps/sim/tools/qdrant/upsert_points.ts
@@ -1,5 +1,5 @@
-import type { ToolConfig } from '../types'
-import type { QdrantResponse, QdrantUpsertParams } from './types'
+import type { QdrantResponse, QdrantUpsertParams } from '@/tools/qdrant/types'
+import type { ToolConfig } from '@/tools/types'
export const upsertPointsTool: ToolConfig = {
id: 'qdrant_upsert_points',
diff --git a/apps/sim/tools/registry.ts b/apps/sim/tools/registry.ts
index 3fbf08ba9b..0210c407af 100644
--- a/apps/sim/tools/registry.ts
+++ b/apps/sim/tools/registry.ts
@@ -30,6 +30,8 @@ import {
githubPrTool,
githubRepoInfoTool,
} from '@/tools/github'
+import { gmailDraftTool, gmailReadTool, gmailSearchTool, gmailSendTool } from '@/tools/gmail'
+import { searchTool as googleSearchTool } from '@/tools/google'
import {
googleCalendarCreateTool,
googleCalendarGetTool,
@@ -126,8 +128,6 @@ import { whatsappSendMessageTool } from '@/tools/whatsapp'
import { workflowExecutorTool } from '@/tools/workflow'
import { xReadTool, xSearchTool, xUserTool, xWriteTool } from '@/tools/x'
import { youtubeSearchTool } from '@/tools/youtube'
-import { gmailDraftTool, gmailReadTool, gmailSearchTool, gmailSendTool } from './gmail'
-import { searchTool as googleSearchTool } from './google'
// Registry of all available tools
export const tools: Record = {
diff --git a/apps/sim/tools/wealthbox/read_contact.ts b/apps/sim/tools/wealthbox/read_contact.ts
index 7d1ceaba0a..8c3ead67d8 100644
--- a/apps/sim/tools/wealthbox/read_contact.ts
+++ b/apps/sim/tools/wealthbox/read_contact.ts
@@ -1,6 +1,6 @@
import { createLogger } from '@/lib/logs/console/logger'
-import type { ToolConfig } from '../types'
-import type { WealthboxReadParams, WealthboxReadResponse } from './types'
+import type { ToolConfig } from '@/tools/types'
+import type { WealthboxReadParams, WealthboxReadResponse } from '@/tools/wealthbox/types'
const logger = createLogger('WealthboxReadContact')
diff --git a/apps/sim/tools/wealthbox/read_note.ts b/apps/sim/tools/wealthbox/read_note.ts
index e6ebb6fc27..a51a9044e0 100644
--- a/apps/sim/tools/wealthbox/read_note.ts
+++ b/apps/sim/tools/wealthbox/read_note.ts
@@ -1,6 +1,6 @@
import { createLogger } from '@/lib/logs/console/logger'
-import type { ToolConfig } from '../types'
-import type { WealthboxReadParams, WealthboxReadResponse } from './types'
+import type { ToolConfig } from '@/tools/types'
+import type { WealthboxReadParams, WealthboxReadResponse } from '@/tools/wealthbox/types'
const logger = createLogger('WealthboxReadNote')
diff --git a/apps/sim/tools/wealthbox/read_task.ts b/apps/sim/tools/wealthbox/read_task.ts
index 8e43d73708..1b850910f1 100644
--- a/apps/sim/tools/wealthbox/read_task.ts
+++ b/apps/sim/tools/wealthbox/read_task.ts
@@ -1,6 +1,6 @@
import { createLogger } from '@/lib/logs/console/logger'
-import type { ToolConfig } from '../types'
-import type { WealthboxReadParams, WealthboxReadResponse } from './types'
+import type { ToolConfig } from '@/tools/types'
+import type { WealthboxReadParams, WealthboxReadResponse } from '@/tools/wealthbox/types'
const logger = createLogger('WealthboxReadTask')
diff --git a/apps/sim/tools/wealthbox/types.ts b/apps/sim/tools/wealthbox/types.ts
index 420bb11ec6..98d7152aab 100644
--- a/apps/sim/tools/wealthbox/types.ts
+++ b/apps/sim/tools/wealthbox/types.ts
@@ -1,6 +1,5 @@
-import type { ToolResponse } from '../types'
+import type { ToolResponse } from '@/tools/types'
-// Entity type definitions based on Wealthbox API responses
export interface WealthboxNote {
id: number
creator: number
diff --git a/apps/sim/tools/wealthbox/write_contact.ts b/apps/sim/tools/wealthbox/write_contact.ts
index 84ca4574e4..9f1d14e8f3 100644
--- a/apps/sim/tools/wealthbox/write_contact.ts
+++ b/apps/sim/tools/wealthbox/write_contact.ts
@@ -1,6 +1,6 @@
import { createLogger } from '@/lib/logs/console/logger'
-import type { ToolConfig } from '../types'
-import type { WealthboxWriteParams, WealthboxWriteResponse } from './types'
+import type { ToolConfig } from '@/tools/types'
+import type { WealthboxWriteParams, WealthboxWriteResponse } from '@/tools/wealthbox/types'
const logger = createLogger('WealthboxWriteContact')
diff --git a/apps/sim/tools/wealthbox/write_note.ts b/apps/sim/tools/wealthbox/write_note.ts
index d0c4aa9bbf..cce0492944 100644
--- a/apps/sim/tools/wealthbox/write_note.ts
+++ b/apps/sim/tools/wealthbox/write_note.ts
@@ -1,6 +1,6 @@
import { createLogger } from '@/lib/logs/console/logger'
-import type { ToolConfig } from '../types'
-import type { WealthboxWriteParams, WealthboxWriteResponse } from './types'
+import type { ToolConfig } from '@/tools/types'
+import type { WealthboxWriteParams, WealthboxWriteResponse } from '@/tools/wealthbox/types'
const logger = createLogger('WealthboxWriteNote')
diff --git a/apps/sim/tools/wealthbox/write_task.ts b/apps/sim/tools/wealthbox/write_task.ts
index bbea3c5634..9b7cc0b48c 100644
--- a/apps/sim/tools/wealthbox/write_task.ts
+++ b/apps/sim/tools/wealthbox/write_task.ts
@@ -1,6 +1,6 @@
import { createLogger } from '@/lib/logs/console/logger'
-import type { ToolConfig } from '../types'
-import type { WealthboxWriteParams, WealthboxWriteResponse } from './types'
+import type { ToolConfig } from '@/tools/types'
+import type { WealthboxWriteParams, WealthboxWriteResponse } from '@/tools/wealthbox/types'
const logger = createLogger('WealthboxWriteTask')