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')