From 41c068c023214584825aa619ea9783eaaea24583 Mon Sep 17 00:00:00 2001 From: Waleed Date: Tue, 2 Dec 2025 14:17:41 -0800 Subject: [PATCH] improvement(lib): refactored lib/ to be more aligned with queries and api directory (#2160) * fix(lib): consolidate into core dir in lib/ * refactored lib/ --- .../app/(auth)/components/auth-background.tsx | 2 +- .../components/oauth-provider-checker.tsx | 4 +- .../components/social-login-buttons.tsx | 2 +- .../(auth)/components/sso-login-button.tsx | 4 +- apps/sim/app/(auth)/login/login-form.tsx | 10 +- .../reset-password/reset-password-form.tsx | 2 +- apps/sim/app/(auth)/signup/page.tsx | 2 +- apps/sim/app/(auth)/signup/signup-form.tsx | 8 +- apps/sim/app/(auth)/sso/page.tsx | 2 +- apps/sim/app/(auth)/sso/sso-form.tsx | 8 +- apps/sim/app/(auth)/verify/page.tsx | 4 +- .../sim/app/(auth)/verify/use-verification.ts | 2 +- apps/sim/app/(auth)/verify/verify-content.tsx | 2 +- apps/sim/app/(landing)/careers/page.tsx | 6 +- .../components/background/background.tsx | 2 +- .../components/landing-canvas/dot-pattern.tsx | 2 +- .../app/(landing)/components/hero/hero.tsx | 2 +- .../landing-pricing/landing-pricing.tsx | 2 +- .../app/(landing)/components/legal-layout.tsx | 2 +- apps/sim/app/(landing)/components/nav/nav.tsx | 2 +- apps/sim/app/(landing)/privacy/page.tsx | 2 +- apps/sim/app/(landing)/terms/page.tsx | 2 +- .../app/_shell/providers/posthog-provider.tsx | 2 +- .../app/_shell/providers/session-provider.tsx | 2 +- apps/sim/app/api/__test-utils__/utils.ts | 36 +- .../app/api/auth/oauth/connections/route.ts | 2 +- .../app/api/auth/oauth/credentials/route.ts | 4 +- .../app/api/auth/oauth/disconnect/route.ts | 2 +- .../api/auth/oauth/microsoft/file/route.ts | 4 +- .../api/auth/oauth/microsoft/files/route.ts | 2 +- apps/sim/app/api/auth/oauth/token/route.ts | 2 +- .../api/auth/oauth/wealthbox/item/route.ts | 4 +- .../api/auth/oauth/wealthbox/items/route.ts | 2 +- apps/sim/app/api/auth/sso/register/route.ts | 2 +- .../app/api/auth/trello/authorize/route.ts | 4 +- .../sim/app/api/auth/trello/callback/route.ts | 2 +- apps/sim/app/api/auth/trello/store/route.ts | 2 +- apps/sim/app/api/billing/portal/route.ts | 2 +- apps/sim/app/api/billing/update-cost/route.ts | 4 +- apps/sim/app/api/careers/submit/route.ts | 4 +- .../app/api/chat/[identifier]/otp/route.ts | 6 +- .../app/api/chat/[identifier]/route.test.ts | 15 +- apps/sim/app/api/chat/[identifier]/route.ts | 6 +- .../app/api/chat/manage/[id]/route.test.ts | 8 +- apps/sim/app/api/chat/manage/[id]/route.ts | 8 +- apps/sim/app/api/chat/route.test.ts | 8 +- apps/sim/app/api/chat/route.ts | 8 +- apps/sim/app/api/chat/utils.test.ts | 11 +- apps/sim/app/api/chat/utils.ts | 6 +- .../api/copilot/api-keys/generate/route.ts | 4 +- apps/sim/app/api/copilot/api-keys/route.ts | 4 +- apps/sim/app/api/copilot/chat/route.test.ts | 7 +- apps/sim/app/api/copilot/chat/route.ts | 10 +- .../api/copilot/chat/update-messages/route.ts | 2 +- apps/sim/app/api/copilot/chats/route.ts | 2 +- .../copilot/checkpoints/revert/route.test.ts | 2 +- .../api/copilot/checkpoints/revert/route.ts | 6 +- apps/sim/app/api/copilot/checkpoints/route.ts | 2 +- .../sim/app/api/copilot/confirm/route.test.ts | 17 +- apps/sim/app/api/copilot/confirm/route.ts | 4 +- .../app/api/copilot/context-usage/route.ts | 4 +- .../execute-copilot-server-tool/route.ts | 2 +- apps/sim/app/api/copilot/feedback/route.ts | 2 +- apps/sim/app/api/copilot/stats/route.ts | 6 +- .../api/copilot/tools/mark-complete/route.ts | 6 +- .../api/copilot/training/examples/route.ts | 2 +- apps/sim/app/api/copilot/training/route.ts | 2 +- apps/sim/app/api/creators/[id]/route.ts | 2 +- .../sim/app/api/creators/[id]/verify/route.ts | 2 +- apps/sim/app/api/creators/route.ts | 2 +- apps/sim/app/api/environment/route.ts | 3 +- apps/sim/app/api/files/authorization.ts | 2 +- apps/sim/app/api/files/download/route.ts | 2 +- apps/sim/app/api/files/parse/route.ts | 4 +- apps/sim/app/api/files/upload/route.ts | 2 +- .../app/api/folders/[id]/duplicate/route.ts | 6 +- apps/sim/app/api/folders/[id]/route.test.ts | 2 +- apps/sim/app/api/folders/[id]/route.ts | 2 +- apps/sim/app/api/folders/route.test.ts | 2 +- apps/sim/app/api/folders/route.ts | 2 +- .../app/api/function/execute/route.test.ts | 6 +- apps/sim/app/api/function/execute/route.ts | 6 +- apps/sim/app/api/guardrails/validate/route.ts | 2 +- apps/sim/app/api/help/route.ts | 10 +- apps/sim/app/api/jobs/[jobId]/route.ts | 2 +- .../documents/[documentId]/chunks/route.ts | 2 +- .../[id]/documents/[documentId]/route.ts | 2 +- .../[documentId]/tag-definitions/route.ts | 2 +- .../app/api/knowledge/[id]/documents/route.ts | 4 +- apps/sim/app/api/knowledge/[id]/route.ts | 2 +- .../knowledge/[id]/tag-definitions/route.ts | 2 +- apps/sim/app/api/knowledge/route.ts | 2 +- .../app/api/knowledge/search/route.test.ts | 4 +- apps/sim/app/api/knowledge/search/route.ts | 4 +- .../app/api/knowledge/search/utils.test.ts | 20 +- apps/sim/app/api/knowledge/search/utils.ts | 2 +- apps/sim/app/api/knowledge/utils.test.ts | 10 +- apps/sim/app/api/knowledge/utils.ts | 2 +- apps/sim/app/api/logs/[id]/route.ts | 2 +- apps/sim/app/api/logs/cleanup/route.ts | 2 +- apps/sim/app/api/logs/route.ts | 2 +- apps/sim/app/api/logs/triggers/route.ts | 2 +- apps/sim/app/api/mcp/servers/route.ts | 2 +- apps/sim/app/api/mcp/tools/execute/route.ts | 2 +- apps/sim/app/api/memory/[id]/route.ts | 2 +- apps/sim/app/api/memory/route.ts | 2 +- .../organizations/[id]/invitations/route.ts | 8 +- .../api/organizations/[id]/members/route.ts | 6 +- .../app/api/organizations/[id]/seats/route.ts | 2 +- .../app/api/providers/ollama/models/route.ts | 2 +- apps/sim/app/api/providers/route.ts | 2 +- .../app/api/providers/vllm/models/route.ts | 2 +- apps/sim/app/api/proxy/image/route.ts | 4 +- apps/sim/app/api/proxy/route.ts | 8 +- apps/sim/app/api/proxy/tts/route.ts | 4 +- apps/sim/app/api/proxy/tts/stream/route.ts | 4 +- apps/sim/app/api/proxy/tts/unified/route.ts | 2 +- apps/sim/app/api/proxy/video/route.ts | 2 +- .../[executionId]/[contextId]/route.ts | 2 +- apps/sim/app/api/schedules/[id]/route.ts | 4 +- .../app/api/schedules/[id]/status/route.ts | 4 +- .../app/api/schedules/execute/route.test.ts | 8 +- apps/sim/app/api/schedules/execute/route.ts | 4 +- apps/sim/app/api/schedules/route.test.ts | 4 +- apps/sim/app/api/schedules/route.ts | 8 +- apps/sim/app/api/stars/route.ts | 2 +- apps/sim/app/api/telemetry/route.ts | 4 +- .../app/api/templates/[id]/approve/route.ts | 2 +- .../app/api/templates/[id]/reject/route.ts | 2 +- apps/sim/app/api/templates/[id]/route.ts | 6 +- apps/sim/app/api/templates/[id]/star/route.ts | 2 +- apps/sim/app/api/templates/[id]/use/route.ts | 8 +- .../api/templates/approved/sanitized/route.ts | 4 +- apps/sim/app/api/templates/route.ts | 4 +- .../app/api/tools/asana/add-comment/route.ts | 2 +- .../app/api/tools/asana/create-task/route.ts | 2 +- .../app/api/tools/asana/get-projects/route.ts | 2 +- .../sim/app/api/tools/asana/get-task/route.ts | 2 +- .../app/api/tools/asana/search-tasks/route.ts | 2 +- .../app/api/tools/asana/update-task/route.ts | 2 +- .../api/tools/confluence/attachment/route.ts | 2 +- .../api/tools/confluence/attachments/route.ts | 2 +- .../app/api/tools/confluence/comment/route.ts | 2 +- .../api/tools/confluence/comments/route.ts | 2 +- .../api/tools/confluence/create-page/route.ts | 2 +- .../app/api/tools/confluence/labels/route.ts | 2 +- .../app/api/tools/confluence/page/route.ts | 2 +- .../app/api/tools/confluence/pages/route.ts | 2 +- .../app/api/tools/confluence/search/route.ts | 2 +- .../app/api/tools/confluence/space/route.ts | 2 +- .../app/api/tools/confluence/spaces/route.ts | 2 +- apps/sim/app/api/tools/custom/route.test.ts | 6 +- apps/sim/app/api/tools/custom/route.ts | 6 +- .../app/api/tools/discord/channels/route.ts | 2 +- .../api/tools/discord/send-message/route.ts | 2 +- .../app/api/tools/discord/servers/route.ts | 2 +- apps/sim/app/api/tools/drive/file/route.ts | 4 +- apps/sim/app/api/tools/drive/files/route.ts | 2 +- .../app/api/tools/gmail/add-label/route.ts | 2 +- apps/sim/app/api/tools/gmail/archive/route.ts | 2 +- apps/sim/app/api/tools/gmail/delete/route.ts | 2 +- apps/sim/app/api/tools/gmail/draft/route.ts | 2 +- apps/sim/app/api/tools/gmail/label/route.ts | 4 +- apps/sim/app/api/tools/gmail/labels/route.ts | 2 +- .../app/api/tools/gmail/mark-read/route.ts | 2 +- .../app/api/tools/gmail/mark-unread/route.ts | 2 +- apps/sim/app/api/tools/gmail/move/route.ts | 2 +- .../app/api/tools/gmail/remove-label/route.ts | 2 +- apps/sim/app/api/tools/gmail/send/route.ts | 2 +- .../app/api/tools/gmail/unarchive/route.ts | 2 +- .../tools/google_calendar/calendars/route.ts | 2 +- .../api/tools/google_drive/upload/route.ts | 2 +- apps/sim/app/api/tools/jira/issue/route.ts | 2 +- apps/sim/app/api/tools/jira/issues/route.ts | 2 +- apps/sim/app/api/tools/jira/projects/route.ts | 2 +- apps/sim/app/api/tools/jira/update/route.ts | 2 +- apps/sim/app/api/tools/jira/write/route.ts | 2 +- .../app/api/tools/linear/projects/route.ts | 2 +- apps/sim/app/api/tools/linear/teams/route.ts | 2 +- apps/sim/app/api/tools/mail/send/route.ts | 2 +- .../api/tools/microsoft-teams/teams/route.ts | 2 +- .../tools/microsoft_planner/tasks/route.ts | 2 +- .../delete_chat_message/route.ts | 2 +- .../microsoft_teams/write_channel/route.ts | 2 +- .../tools/microsoft_teams/write_chat/route.ts | 2 +- apps/sim/app/api/tools/mistral/parse/route.ts | 4 +- .../app/api/tools/onedrive/folder/route.ts | 2 +- .../app/api/tools/onedrive/upload/route.ts | 2 +- apps/sim/app/api/tools/outlook/copy/route.ts | 2 +- .../sim/app/api/tools/outlook/delete/route.ts | 2 +- apps/sim/app/api/tools/outlook/draft/route.ts | 2 +- .../app/api/tools/outlook/folders/route.ts | 2 +- .../app/api/tools/outlook/mark-read/route.ts | 2 +- .../api/tools/outlook/mark-unread/route.ts | 2 +- apps/sim/app/api/tools/outlook/move/route.ts | 2 +- apps/sim/app/api/tools/outlook/send/route.ts | 2 +- .../sim/app/api/tools/s3/copy-object/route.ts | 2 +- .../app/api/tools/s3/delete-object/route.ts | 2 +- .../app/api/tools/s3/list-objects/route.ts | 2 +- apps/sim/app/api/tools/s3/put-object/route.ts | 2 +- apps/sim/app/api/tools/search/route.ts | 2 +- .../app/api/tools/sharepoint/site/route.ts | 2 +- .../app/api/tools/sharepoint/upload/route.ts | 2 +- .../app/api/tools/slack/add-reaction/route.ts | 2 +- .../sim/app/api/tools/slack/channels/route.ts | 2 +- .../api/tools/slack/delete-message/route.ts | 2 +- .../app/api/tools/slack/send-message/route.ts | 2 +- .../api/tools/slack/update-message/route.ts | 2 +- apps/sim/app/api/tools/sms/send/route.ts | 6 +- apps/sim/app/api/tools/smtp/send/route.ts | 2 +- .../app/api/tools/stagehand/agent/route.ts | 2 +- .../app/api/tools/stagehand/extract/route.ts | 2 +- .../api/tools/telegram/send-document/route.ts | 2 +- apps/sim/app/api/tools/thinking/route.ts | 2 +- .../sim/app/api/tools/vision/analyze/route.ts | 2 +- .../sim/app/api/tools/wealthbox/item/route.ts | 4 +- .../app/api/tools/wealthbox/items/route.ts | 2 +- apps/sim/app/api/user/super-user/route.ts | 2 +- .../app/api/users/me/api-keys/[id]/route.ts | 2 +- apps/sim/app/api/users/me/profile/route.ts | 2 +- apps/sim/app/api/users/me/settings/route.ts | 2 +- .../users/me/settings/unsubscribe/route.ts | 8 +- apps/sim/app/api/wand/route.ts | 6 +- apps/sim/app/api/webhooks/[id]/route.ts | 8 +- .../app/api/webhooks/[id]/test-url/route.ts | 6 +- .../api/webhooks/cleanup/idempotency/route.ts | 4 +- apps/sim/app/api/webhooks/poll/gmail/route.ts | 2 +- .../app/api/webhooks/poll/outlook/route.ts | 2 +- apps/sim/app/api/webhooks/route.ts | 14 +- apps/sim/app/api/webhooks/test/[id]/route.ts | 2 +- apps/sim/app/api/webhooks/test/route.ts | 4 +- .../api/webhooks/trigger/[path]/route.test.ts | 2 +- .../app/api/webhooks/trigger/[path]/route.ts | 4 +- .../api/workflows/[id]/autolayout/route.ts | 4 +- .../api/workflows/[id]/chat/status/route.ts | 2 +- .../app/api/workflows/[id]/deploy/route.ts | 8 +- .../app/api/workflows/[id]/deployed/route.ts | 2 +- .../deployments/[version]/activate/route.ts | 2 +- .../deployments/[version]/revert/route.ts | 6 +- .../[id]/deployments/[version]/route.ts | 2 +- .../api/workflows/[id]/deployments/route.ts | 2 +- .../app/api/workflows/[id]/duplicate/route.ts | 4 +- .../app/api/workflows/[id]/execute/route.ts | 13 +- .../[id]/log-webhook/[webhookId]/route.ts | 2 +- .../api/workflows/[id]/log-webhook/route.ts | 2 +- .../workflows/[id]/log-webhook/test/route.ts | 2 +- apps/sim/app/api/workflows/[id]/log/route.ts | 2 +- apps/sim/app/api/workflows/[id]/route.test.ts | 10 +- apps/sim/app/api/workflows/[id]/route.ts | 8 +- .../sim/app/api/workflows/[id]/state/route.ts | 12 +- .../app/api/workflows/[id]/status/route.ts | 4 +- .../app/api/workflows/[id]/variables/route.ts | 2 +- apps/sim/app/api/workflows/middleware.ts | 2 +- .../app/api/workflows/public/[id]/route.ts | 2 +- apps/sim/app/api/workflows/route.ts | 6 +- apps/sim/app/api/workflows/utils.ts | 2 +- .../app/api/workflows/yaml/convert/route.ts | 4 +- .../app/api/workflows/yaml/export/route.ts | 8 +- .../workspaces/[id]/api-keys/[keyId]/route.ts | 4 +- .../app/api/workspaces/[id]/api-keys/route.ts | 4 +- .../api/workspaces/[id]/duplicate/route.ts | 2 +- .../api/workspaces/[id]/environment/route.ts | 5 +- .../[id]/files/[fileId]/download/route.ts | 4 +- .../workspaces/[id]/files/[fileId]/route.ts | 4 +- .../app/api/workspaces/[id]/files/route.ts | 4 +- .../api/workspaces/[id]/permissions/route.ts | 5 +- apps/sim/app/api/workspaces/[id]/route.ts | 2 +- .../invitations/[invitationId]/route.test.ts | 8 +- .../invitations/[invitationId]/route.ts | 8 +- .../api/workspaces/invitations/route.test.ts | 4 +- .../app/api/workspaces/invitations/route.ts | 6 +- .../app/api/workspaces/members/[id]/route.ts | 2 +- apps/sim/app/api/workspaces/route.ts | 2 +- apps/sim/app/api/yaml/autolayout/route.ts | 2 +- apps/sim/app/chat/[identifier]/chat.tsx | 2 +- .../chat/components/auth/email/email-auth.tsx | 4 +- .../auth/password/password-auth.tsx | 2 +- .../app/chat/components/auth/sso/sso-auth.tsx | 4 +- .../voice-interface/voice-interface.tsx | 2 +- apps/sim/app/invite/[id]/invite.tsx | 2 +- apps/sim/app/page.tsx | 2 +- apps/sim/app/sitemap.ts | 2 +- apps/sim/app/templates/[id]/template.tsx | 8 +- .../templates/components/template-card.tsx | 2 +- apps/sim/app/templates/templates.tsx | 2 +- .../[id]/components/action-bar/action-bar.tsx | 2 +- .../document-tag-entry/document-tag-entry.tsx | 2 +- .../primary-button/primary-button.tsx | 2 +- .../components/tag-input/tag-input.tsx | 2 +- .../logs/components/dashboard/controls.tsx | 2 +- .../components/dashboard/workflow-details.tsx | 2 +- .../logs/components/filters/filters.tsx | 4 +- .../frozen-canvas/frozen-canvas-modal.tsx | 2 +- .../frozen-canvas/frozen-canvas.tsx | 3 +- .../logs/components/search/search.tsx | 2 +- .../tool-calls/tool-calls-display.tsx | 2 +- .../components/trace-span-item.tsx | 2 +- .../logs/components/trace-spans/utils.ts | 2 +- .../app/workspace/[workspaceId]/logs/logs.tsx | 2 +- .../providers/settings-loader.tsx | 2 +- .../templates/components/navigation-tabs.tsx | 2 +- .../templates/components/template-card.tsx | 2 +- .../w/[workflowId]/components/chat/chat.tsx | 10 +- .../output-select/output-select.tsx | 5 +- .../components/command-list/command-list.tsx | 2 +- .../components/cursors/cursors.tsx | 2 +- .../components/note-block/note-block.tsx | 2 +- .../inline-tool-call/inline-tool-call.tsx | 2 +- .../plan-mode-section/plan-mode-section.tsx | 2 +- .../components/todo-list/todo-list.tsx | 2 +- .../mode-selector/mode-selector.tsx | 2 +- .../components/user-input/user-input.tsx | 4 +- .../copilot/hooks/use-landing-prompt.ts | 2 +- .../deploy-modal/components/auth-selector.tsx | 5 +- .../deploy-modal/components/chat-deploy.tsx | 2 +- .../deploy-modal/components/deploy-status.tsx | 2 +- .../components/deployed-workflow-card.tsx | 2 +- .../components/example-command.tsx | 2 +- .../components/identifier-input.tsx | 4 +- .../deploy-modal/components/success-view.tsx | 2 +- .../components/template-deploy.tsx | 2 +- .../components/deploy-modal/deploy-modal.tsx | 6 +- .../sub-block/components/code/code.tsx | 4 +- .../components/combobox/combobox.tsx | 2 +- .../condition-input/condition-input.tsx | 4 +- .../components/oauth-required-modal.tsx | 2 +- .../document-tag-entry/document-tag-entry.tsx | 4 +- .../sub-block/components/env-var-dropdown.tsx | 2 +- .../components/eval-input/eval-input.tsx | 2 +- .../sub-block/components/formatted-text.tsx | 2 +- .../input-mapping/input-mapping.tsx | 2 +- .../components/long-input/long-input.tsx | 2 +- .../mcp-dynamic-args/mcp-dynamic-args.tsx | 2 +- .../messages-input/messages-input.tsx | 2 +- .../schedule-save/schedule-save.tsx | 4 +- .../components/short-input/short-input.tsx | 2 +- .../components/starter/input-format.tsx | 2 +- .../sub-block/components/table/table.tsx | 2 +- .../components/tag-dropdown/tag-dropdown.tsx | 11 +- .../components/time-input/time-input.tsx | 2 +- .../components/code-editor/code-editor.tsx | 2 +- .../custom-tool-modal/custom-tool-modal.tsx | 2 +- .../components/tool-command/tool-command.tsx | 2 +- .../components/tool-input/tool-input.tsx | 2 +- .../components/trigger-save/trigger-save.tsx | 2 +- .../variables-input/variables-input.tsx | 2 +- .../editor/components/sub-block/sub-block.tsx | 2 +- .../editor/hooks/use-block-connections.ts | 9 +- .../hooks/use-editor-subblock-layout.ts | 2 +- .../editor/hooks/use-subflow-editor.ts | 2 +- .../panel/components/toolbar/toolbar.tsx | 2 +- .../workflow-controls/workflow-controls.tsx | 2 +- .../components/subflows/subflow-node.tsx | 2 +- .../training-controls/training-controls.tsx | 2 +- .../training-floating-button.tsx | 2 +- .../training-controls/training-modal.tsx | 4 +- .../components/variables/variables.tsx | 3 +- .../wand-prompt-bar/wand-prompt-bar.tsx | 2 +- .../webhook-settings/webhook-settings.tsx | 3 +- .../components/action-bar/action-bar.tsx | 2 +- .../workflow-block/hooks/use-schedule-info.ts | 2 +- .../workflow-block/workflow-block.tsx | 4 +- .../use-accessible-reference-prefixes.ts | 4 +- .../hooks/use-block-connections.ts | 6 +- .../hooks/use-block-dimensions.ts | 2 +- .../hooks/use-block-output-fields.ts | 6 +- .../[workflowId]/hooks/use-node-utilities.ts | 2 +- .../hooks/use-workflow-execution.ts | 16 +- .../w/[workflowId]/utils/block-ring-utils.ts | 2 +- .../[workspaceId]/w/[workflowId]/workflow.tsx | 2 +- .../components-new/help-modal/help-modal.tsx | 2 +- .../search-modal/search-modal.tsx | 4 +- .../components/account/account.tsx | 4 +- .../components/api-keys/api-keys.tsx | 2 +- .../creator-profile/creator-profile.tsx | 2 +- .../components/credentials/credentials.tsx | 2 +- .../settings-modal/components/files/files.tsx | 4 +- .../components/general/general.tsx | 4 +- .../settings-navigation.tsx | 14 +- .../components/shared/usage-header.tsx | 4 +- .../settings-modal/components/sso/sso.tsx | 12 +- .../cancel-subscription.tsx | 8 +- .../components/plan-card/plan-card.tsx | 2 +- .../components/usage-limit/usage-limit.tsx | 2 +- .../components/subscription/subscription.tsx | 10 +- .../member-invitation-card.tsx | 4 +- .../components/team-members/team-members.tsx | 2 +- .../team-seats-overview.tsx | 2 +- .../components/team-seats/team-seats.tsx | 2 +- .../components/team-usage/team-usage.tsx | 6 +- .../team-management/team-management.tsx | 11 +- .../settings-modal/settings-modal.tsx | 2 +- .../usage-indicator/rotating-digit.tsx | 2 +- .../usage-indicator/usage-indicator.tsx | 6 +- .../workflow-item/avatars/avatars.tsx | 2 +- .../components/invite-modal/invite-modal.tsx | 8 +- .../components/create-menu/create-menu.tsx | 4 +- .../keyboard-shortcut/keyboard-shortcut.tsx | 2 +- .../components/document-list.tsx | 2 +- .../knowledge-base-tags.tsx | 2 +- .../knowledge-tags/knowledge-tags.tsx | 2 +- .../navigation-item/navigation-item.tsx | 2 +- .../subscription-modal/subscription-modal.tsx | 8 +- .../workflow-list/workflow-list.tsx | 2 +- .../workspace-header/workspace-header.tsx | 2 +- .../workspace-selector/workspace-selector.tsx | 6 +- .../w/components/sidebar/sidebar-new.tsx | 4 +- .../w/components/sidebar/sidebar.tsx | 6 +- .../workflow-preview/workflow-preview.tsx | 2 +- .../w/hooks/use-export-workflow.ts | 2 +- .../w/hooks/use-export-workspace.ts | 5 +- .../w/hooks/use-import-workflow.ts | 2 +- .../w/hooks/use-import-workspace.ts | 5 +- apps/sim/app/workspace/layout.tsx | 2 +- apps/sim/app/workspace/page.tsx | 2 +- .../workspace/providers/socket-provider.tsx | 2 +- apps/sim/background/knowledge-processing.ts | 2 +- apps/sim/background/logs-webhook-delivery.ts | 2 +- apps/sim/background/schedule-execution.ts | 13 +- apps/sim/background/webhook-execution.ts | 8 +- apps/sim/blocks/blocks/agent.ts | 2 +- apps/sim/blocks/blocks/evaluator.ts | 2 +- apps/sim/blocks/blocks/guardrails.ts | 2 +- apps/sim/blocks/blocks/router.ts | 2 +- apps/sim/blocks/blocks/translate.ts | 2 +- apps/sim/components.json | 2 +- .../components/analytics/onedollarstats.tsx | 2 +- .../emails/batch-invitation-email.tsx | 2 +- .../billing/enterprise-subscription-email.tsx | 2 +- .../billing/free-tier-upgrade-email.tsx | 2 +- .../emails/billing/payment-failed-email.tsx | 2 +- .../emails/billing/plan-welcome-email.tsx | 2 +- .../emails/billing/usage-threshold-email.tsx | 2 +- .../careers/careers-confirmation-email.tsx | 2 +- .../careers/careers-submission-email.tsx | 2 +- apps/sim/components/emails/footer.tsx | 4 +- .../emails/help-confirmation-email.tsx | 2 +- .../components/emails/invitation-email.tsx | 2 +- .../emails/otp-verification-email.tsx | 2 +- apps/sim/components/emails/render-email.ts | 2 +- .../emails/reset-password-email.tsx | 2 +- .../emails/workspace-invitation.tsx | 2 +- .../emcn/components/badge/badge.tsx | 2 +- .../emcn/components/button/button.tsx | 2 +- .../components/emcn/components/code/code.tsx | 2 +- .../emcn/components/combobox/combobox.tsx | 2 +- .../emcn/components/input/input.tsx | 2 +- .../emcn/components/label/label.tsx | 2 +- .../emcn/components/modal/modal.tsx | 2 +- .../emcn/components/popover/popover.tsx | 2 +- .../emcn/components/textarea/textarea.tsx | 2 +- .../emcn/components/tooltip/tooltip.tsx | 2 +- apps/sim/components/ui/alert-dialog.tsx | 2 +- apps/sim/components/ui/alert.tsx | 2 +- apps/sim/components/ui/avatar.tsx | 2 +- apps/sim/components/ui/badge.tsx | 2 +- apps/sim/components/ui/breadcrumb.tsx | 2 +- apps/sim/components/ui/button.tsx | 2 +- apps/sim/components/ui/card.tsx | 2 +- apps/sim/components/ui/checkbox.tsx | 2 +- apps/sim/components/ui/code-block.tsx | 2 +- apps/sim/components/ui/color-picker.tsx | 4 +- apps/sim/components/ui/command.tsx | 2 +- apps/sim/components/ui/dialog.tsx | 2 +- apps/sim/components/ui/dropdown-menu.tsx | 2 +- apps/sim/components/ui/form.tsx | 2 +- apps/sim/components/ui/input-otp.tsx | 2 +- apps/sim/components/ui/input.tsx | 2 +- apps/sim/components/ui/label.tsx | 2 +- apps/sim/components/ui/notice.tsx | 2 +- apps/sim/components/ui/popover.tsx | 2 +- apps/sim/components/ui/progress.tsx | 2 +- apps/sim/components/ui/radio-group.tsx | 2 +- apps/sim/components/ui/scroll-area.tsx | 2 +- apps/sim/components/ui/select.tsx | 2 +- apps/sim/components/ui/separator.tsx | 2 +- apps/sim/components/ui/sheet.tsx | 2 +- apps/sim/components/ui/skeleton.tsx | 2 +- apps/sim/components/ui/slider.tsx | 2 +- apps/sim/components/ui/switch.tsx | 2 +- apps/sim/components/ui/table.tsx | 2 +- apps/sim/components/ui/tabs.tsx | 2 +- apps/sim/components/ui/tag-input.tsx | 2 +- apps/sim/components/ui/textarea.tsx | 2 +- apps/sim/components/ui/toggle.tsx | 2 +- apps/sim/components/ui/tool-call.tsx | 2 +- apps/sim/components/ui/verified-badge.tsx | 2 +- apps/sim/drizzle.config.ts | 2 +- .../__test-utils__/mock-dependencies.ts | 7 +- apps/sim/executor/execution/block-executor.ts | 2 +- apps/sim/executor/execution/executor.ts | 2 +- .../handlers/agent/agent-handler.test.ts | 4 +- .../human-in-the-loop-handler.ts | 2 +- .../handlers/router/router-handler.ts | 2 +- apps/sim/executor/utils/http.ts | 2 +- .../executor/utils/reference-validation.ts | 2 +- apps/sim/executor/utils/start-block.test.ts | 2 +- apps/sim/executor/utils/start-block.ts | 4 +- .../executor/variables/resolvers/workflow.ts | 2 +- apps/sim/hooks/queries/copilot-keys.ts | 2 +- apps/sim/hooks/queries/oauth-connections.ts | 2 +- apps/sim/hooks/queries/organization.ts | 2 +- apps/sim/hooks/use-collaborative-workflow.ts | 6 +- apps/sim/{lib => hooks}/use-forwarded-ref.ts | 0 .../use-knowledge-base-tag-definitions.ts | 2 +- apps/sim/hooks/use-tag-definitions.ts | 2 +- apps/sim/hooks/use-undo-redo.ts | 4 +- apps/sim/hooks/use-user-permissions.ts | 2 +- apps/sim/hooks/use-webhook-management.ts | 2 +- apps/sim/instrumentation-client.ts | 2 +- apps/sim/instrumentation-node.ts | 2 +- apps/sim/lib/api-key/auth.ts | 2 +- apps/sim/lib/api-key/crypto.ts | 2 +- apps/sim/lib/api-key/service.ts | 2 +- apps/sim/lib/{ => auth}/auth-client.ts | 6 +- apps/sim/lib/{ => auth}/auth.ts | 14 +- apps/sim/lib/auth/credential-access.ts | 2 +- apps/sim/lib/auth/index.ts | 1 + apps/sim/lib/auth/internal.ts | 2 +- .../{sso/consts.ts => auth/sso/constants.ts} | 0 .../lib/billing/calculations/usage-monitor.ts | 2 +- .../{subscription => billing/client}/index.ts | 16 +- .../{subscription => billing/client}/types.ts | 0 .../client}/upgrade.ts | 2 +- .../client}/usage-visualization.ts | 0 .../helpers.ts => billing/client/utils.ts} | 2 +- apps/sim/lib/billing/core/subscription.ts | 6 +- apps/sim/lib/billing/core/usage.ts | 8 +- apps/sim/lib/billing/plans.ts | 2 +- apps/sim/lib/billing/storage/limits.ts | 4 +- apps/sim/lib/billing/storage/tracking.ts | 2 +- apps/sim/lib/billing/stripe-client.ts | 2 +- apps/sim/lib/billing/subscriptions/utils.ts | 2 +- apps/sim/lib/billing/threshold-billing.ts | 2 +- .../lib/billing/validation/seat-management.ts | 2 +- apps/sim/lib/billing/webhooks/enterprise.ts | 4 +- apps/sim/lib/billing/webhooks/invoices.ts | 6 +- apps/sim/lib/branding/branding.ts | 2 +- apps/sim/lib/branding/metadata.ts | 2 +- apps/sim/lib/chunkers/docs-chunker.ts | 2 +- apps/sim/lib/copilot/auth/permissions.ts | 2 +- .../utils.ts => copilot/chat-title.ts} | 2 +- apps/sim/lib/{sim-agent => copilot}/client.ts | 6 +- .../lib/{sim-agent => copilot}/constants.ts | 0 apps/sim/lib/copilot/process-contents.ts | 4 +- .../copilot/{auth.ts => request-helpers.ts} | 2 +- .../tools/client/workflow/deploy-workflow.ts | 2 +- .../tools/client/workflow/edit-workflow.ts | 2 +- .../client/workflow/get-user-workflow.ts | 2 +- .../client/workflow/get-workflow-from-name.ts | 2 +- .../tools/server/docs/search-documentation.ts | 2 +- .../tools/server/other/search-online.ts | 2 +- .../tools/server/user/get-credentials.ts | 2 +- .../server/user/set-environment-variables.ts | 2 +- .../tools/server/workflow/edit-workflow.ts | 8 +- apps/sim/lib/copilot/utils.ts | 2 +- apps/sim/lib/core/config/api-keys.ts | 42 ++ apps/sim/lib/{ => core/config}/env.ts | 0 apps/sim/lib/{ => core/config}/environment.ts | 0 apps/sim/lib/{ => core/config}/redis.ts | 2 +- .../sim/lib/{ => core}/idempotency/cleanup.ts | 0 apps/sim/lib/{ => core}/idempotency/index.ts | 0 .../sim/lib/{ => core}/idempotency/service.ts | 2 +- apps/sim/lib/{ => core}/security/csp.ts | 2 +- apps/sim/lib/core/security/encryption.ts | 84 +++ .../security/input-validation.test.ts | 2 +- .../{ => core}/security/input-validation.ts | 0 apps/sim/lib/core/security/redaction.ts | 34 + .../tracer.ts => core/telemetry.ts} | 0 apps/sim/lib/{ => core}/utils.test.ts | 19 +- .../lib/{ => core/utils}/browser-storage.ts | 0 apps/sim/lib/core/utils/cn.ts | 9 + apps/sim/lib/core/utils/display-filters.ts | 85 +++ apps/sim/lib/core/utils/formatting.ts | 141 ++++ apps/sim/lib/core/utils/optimistic-update.ts | 103 +++ apps/sim/lib/core/utils/request.ts | 11 + .../lib/{ => core/utils}/response-format.ts | 0 apps/sim/lib/core/utils/scheduling.ts | 51 ++ apps/sim/lib/core/utils/sse.ts | 21 + .../{theme-sync.ts => core/utils/theme.ts} | 0 .../lib/{urls/utils.ts => core/utils/urls.ts} | 4 +- apps/sim/lib/core/utils/validation.ts | 33 + apps/sim/lib/environment/utils.ts | 2 +- apps/sim/lib/execution/e2b.ts | 2 +- apps/sim/lib/execution/files.ts | 2 +- .../lib/guardrails/validate_hallucination.ts | 2 +- apps/sim/lib/knowledge/chunks/service.ts | 2 +- .../lib/knowledge/{consts.ts => constants.ts} | 0 .../knowledge/documents/document-processor.ts | 4 +- apps/sim/lib/knowledge/documents/queue.ts | 2 +- apps/sim/lib/knowledge/documents/service.ts | 8 +- .../utils.ts => knowledge/embeddings.ts} | 2 +- apps/sim/lib/knowledge/service.ts | 2 +- apps/sim/lib/knowledge/tags/service.ts | 2 +- apps/sim/lib/logs/console/logger.ts | 2 +- apps/sim/lib/logs/execution/logger.ts | 5 +- .../sim/lib/logs/execution/logging-factory.ts | 2 +- .../sim/lib/logs/execution/logging-session.ts | 4 +- apps/sim/lib/mcp/middleware.ts | 4 +- apps/sim/lib/mcp/service.ts | 4 +- .../lib/{ => messaging}/email/mailer.test.ts | 10 +- apps/sim/lib/{ => messaging}/email/mailer.ts | 8 +- .../{ => messaging}/email/unsubscribe.test.ts | 6 +- .../lib/{ => messaging}/email/unsubscribe.ts | 4 +- .../lib/{ => messaging}/email/utils.test.ts | 22 +- apps/sim/lib/{ => messaging}/email/utils.ts | 4 +- .../{ => messaging}/email/validation.test.ts | 2 +- .../lib/{ => messaging}/email/validation.ts | 0 apps/sim/lib/{ => messaging}/sms/service.ts | 2 +- apps/sim/lib/oauth/oauth.test.ts | 2 +- apps/sim/lib/oauth/oauth.ts | 2 +- apps/sim/lib/organization/utils.ts | 37 -- apps/sim/lib/sim-agent/index.ts | 11 - apps/sim/lib/uploads/config.ts | 2 +- .../execution/execution-file-manager.ts | 9 +- .../lib/uploads/contexts/execution/index.ts | 2 +- .../{execution-file-helpers.ts => utils.ts} | 0 apps/sim/lib/uploads/core/setup.server.ts | 2 +- apps/sim/lib/uploads/core/storage-service.ts | 2 +- .../lib/uploads/providers/blob/client.test.ts | 2 +- .../lib/uploads/providers/s3/client.test.ts | 6 +- apps/sim/lib/uploads/providers/s3/client.ts | 2 +- .../lib/uploads/utils/file-utils.server.ts | 2 +- apps/sim/lib/utils.ts | 608 ------------------ .../sim/lib/webhooks/gmail-polling-service.ts | 4 +- .../lib/webhooks/outlook-polling-service.ts | 4 +- apps/sim/lib/webhooks/processor.ts | 2 +- ...k-helpers.ts => provider-subscriptions.ts} | 2 +- apps/sim/lib/webhooks/test-tokens.ts | 2 +- .../sim/lib/workflows/autolayout/constants.ts | 4 +- .../lib/workflows/autolayout/containers.ts | 2 +- apps/sim/lib/workflows/autolayout/targeted.ts | 2 +- apps/sim/lib/workflows/autolayout/utils.ts | 2 +- .../blocks/block-dimensions.ts | 0 .../workflows/{ => blocks}/block-outputs.ts | 6 +- .../blocks}/block-path-calculator.ts | 0 .../{ => credentials}/credential-extractor.ts | 0 .../{ => credentials}/credential-resolver.ts | 0 .../custom-tools/operations.ts | 2 +- apps/sim/lib/workflows/defaults.ts | 2 +- .../lib/workflows/executor/execution-core.ts | 4 +- .../{ => operations}/deployment-utils.ts | 2 +- .../{ => operations}/import-export.ts | 2 +- .../{ => operations}/socket-operations.ts | 2 +- .../custom-tools-persistence.ts | 2 +- .../workflows/{ => persistence}/duplicate.ts | 2 +- .../utils.test.ts} | 2 +- .../{db-helpers.ts => persistence/utils.ts} | 4 +- .../{ => sanitization}/json-sanitizer.ts | 2 +- .../{ => sanitization}/references.test.ts | 5 +- .../{ => sanitization}/references.ts | 0 .../{ => sanitization}/validation.ts | 0 .../{ => workflows}/schedules/utils.test.ts | 2 +- .../lib/{ => workflows}/schedules/utils.ts | 2 +- .../workflows/{ => streaming}/streaming.ts | 6 +- .../training/compute-edit-sequence.ts | 2 +- .../{ => triggers}/execution-events.ts | 0 .../workflows/{ => triggers}/trigger-utils.ts | 6 +- .../lib/workflows/{ => triggers}/triggers.ts | 0 apps/sim/lib/workflows/utils.ts | 4 +- .../variables/variable-manager.test.ts | 2 +- .../variables/variable-manager.ts | 0 apps/sim/lib/workspaces/duplicate.ts | 4 +- apps/sim/lib/workspaces/naming.ts | 2 +- .../{ => workspaces}/organization/index.ts | 14 +- .../{ => workspaces}/organization/types.ts | 0 .../organization/utils.ts} | 33 +- .../permissions/utils.test.ts | 2 +- .../lib/{ => workspaces}/permissions/utils.ts | 0 .../presence-colors.ts | 0 apps/sim/middleware.ts | 4 +- apps/sim/next.config.ts | 6 +- apps/sim/providers/azure-openai/index.ts | 2 +- apps/sim/providers/index.ts | 2 +- apps/sim/providers/ollama/index.ts | 2 +- apps/sim/providers/utils.test.ts | 2 +- apps/sim/providers/utils.ts | 6 +- apps/sim/providers/vllm/index.ts | 2 +- apps/sim/scripts/export-workflow.ts | 4 +- apps/sim/scripts/process-docs.ts | 2 +- apps/sim/serializer/index.ts | 2 +- apps/sim/services/queue/types.ts | 2 +- apps/sim/socket-server/config/socket.ts | 6 +- apps/sim/socket-server/database/operations.ts | 6 +- apps/sim/socket-server/index.ts | 2 +- .../socket-server/middleware/permissions.ts | 2 +- apps/sim/socket-server/rooms/manager.ts | 2 +- apps/sim/stores/copilot-training/store.ts | 2 +- apps/sim/stores/terminal/console/store.ts | 2 +- apps/sim/stores/workflow-diff/store.ts | 4 +- apps/sim/stores/workflows/json/store.ts | 5 +- apps/sim/stores/workflows/registry/store.ts | 2 +- apps/sim/stores/workflows/workflow/store.ts | 4 +- apps/sim/telemetry.config.ts | 2 +- apps/sim/tools/http/utils.ts | 4 +- apps/sim/tools/index.ts | 4 +- apps/sim/tools/mistral/parser.ts | 2 +- apps/sim/tools/openai/image.ts | 2 +- apps/sim/tools/trello/add_comment.ts | 2 +- apps/sim/tools/trello/create_card.ts | 2 +- apps/sim/tools/trello/get_actions.ts | 2 +- apps/sim/tools/trello/list_cards.ts | 2 +- apps/sim/tools/trello/list_lists.ts | 2 +- apps/sim/tools/trello/update_card.ts | 2 +- apps/sim/tools/utils.ts | 2 +- apps/sim/trigger.config.ts | 2 +- apps/sim/triggers/index.ts | 2 +- 707 files changed, 1771 insertions(+), 1748 deletions(-) rename apps/sim/{lib => hooks}/use-forwarded-ref.ts (100%) rename apps/sim/lib/{ => auth}/auth-client.ts (90%) rename apps/sim/lib/{ => auth}/auth.ts (99%) create mode 100644 apps/sim/lib/auth/index.ts rename apps/sim/lib/{sso/consts.ts => auth/sso/constants.ts} (100%) rename apps/sim/lib/{subscription => billing/client}/index.ts (64%) rename apps/sim/lib/{subscription => billing/client}/types.ts (100%) rename apps/sim/lib/{subscription => billing/client}/upgrade.ts (99%) rename apps/sim/lib/{subscription => billing/client}/usage-visualization.ts (100%) rename apps/sim/lib/{subscription/helpers.ts => billing/client/utils.ts} (99%) rename apps/sim/lib/{sim-agent/utils.ts => copilot/chat-title.ts} (97%) rename apps/sim/lib/{sim-agent => copilot}/client.ts (95%) rename apps/sim/lib/{sim-agent => copilot}/constants.ts (100%) rename apps/sim/lib/copilot/{auth.ts => request-helpers.ts} (97%) create mode 100644 apps/sim/lib/core/config/api-keys.ts rename apps/sim/lib/{ => core/config}/env.ts (100%) rename apps/sim/lib/{ => core/config}/environment.ts (100%) rename apps/sim/lib/{ => core/config}/redis.ts (99%) rename apps/sim/lib/{ => core}/idempotency/cleanup.ts (100%) rename apps/sim/lib/{ => core}/idempotency/index.ts (100%) rename apps/sim/lib/{ => core}/idempotency/service.ts (99%) rename apps/sim/lib/{ => core}/security/csp.ts (99%) create mode 100644 apps/sim/lib/core/security/encryption.ts rename apps/sim/lib/{ => core}/security/input-validation.test.ts (99%) rename apps/sim/lib/{ => core}/security/input-validation.ts (100%) create mode 100644 apps/sim/lib/core/security/redaction.ts rename apps/sim/lib/{telemetry/tracer.ts => core/telemetry.ts} (100%) rename apps/sim/lib/{ => core}/utils.test.ts (96%) rename apps/sim/lib/{ => core/utils}/browser-storage.ts (100%) create mode 100644 apps/sim/lib/core/utils/cn.ts create mode 100644 apps/sim/lib/core/utils/display-filters.ts create mode 100644 apps/sim/lib/core/utils/formatting.ts create mode 100644 apps/sim/lib/core/utils/optimistic-update.ts create mode 100644 apps/sim/lib/core/utils/request.ts rename apps/sim/lib/{ => core/utils}/response-format.ts (100%) create mode 100644 apps/sim/lib/core/utils/scheduling.ts create mode 100644 apps/sim/lib/core/utils/sse.ts rename apps/sim/lib/{theme-sync.ts => core/utils/theme.ts} (100%) rename apps/sim/lib/{urls/utils.ts => core/utils/urls.ts} (94%) create mode 100644 apps/sim/lib/core/utils/validation.ts rename apps/sim/lib/knowledge/{consts.ts => constants.ts} (100%) rename apps/sim/lib/{embeddings/utils.ts => knowledge/embeddings.ts} (99%) rename apps/sim/lib/{ => messaging}/email/mailer.test.ts (98%) rename apps/sim/lib/{ => messaging}/email/mailer.ts (98%) rename apps/sim/lib/{ => messaging}/email/unsubscribe.test.ts (96%) rename apps/sim/lib/{ => messaging}/email/unsubscribe.ts (98%) rename apps/sim/lib/{ => messaging}/email/utils.test.ts (87%) rename apps/sim/lib/{ => messaging}/email/utils.ts (76%) rename apps/sim/lib/{ => messaging}/email/validation.test.ts (97%) rename apps/sim/lib/{ => messaging}/email/validation.ts (100%) rename apps/sim/lib/{ => messaging}/sms/service.ts (99%) delete mode 100644 apps/sim/lib/organization/utils.ts delete mode 100644 apps/sim/lib/sim-agent/index.ts rename apps/sim/lib/uploads/contexts/execution/{execution-file-helpers.ts => utils.ts} (100%) delete mode 100644 apps/sim/lib/utils.ts rename apps/sim/lib/webhooks/{webhook-helpers.ts => provider-subscriptions.ts} (99%) rename apps/sim/lib/{ => workflows}/blocks/block-dimensions.ts (100%) rename apps/sim/lib/workflows/{ => blocks}/block-outputs.ts (98%) rename apps/sim/lib/{ => workflows/blocks}/block-path-calculator.ts (100%) rename apps/sim/lib/workflows/{ => credentials}/credential-extractor.ts (100%) rename apps/sim/lib/workflows/{ => credentials}/credential-resolver.ts (100%) rename apps/sim/lib/{ => workflows}/custom-tools/operations.ts (97%) rename apps/sim/lib/workflows/{ => operations}/deployment-utils.ts (99%) rename apps/sim/lib/workflows/{ => operations}/import-export.ts (98%) rename apps/sim/lib/workflows/{ => operations}/socket-operations.ts (97%) rename apps/sim/lib/workflows/{ => persistence}/custom-tools-persistence.ts (98%) rename apps/sim/lib/workflows/{ => persistence}/duplicate.ts (99%) rename apps/sim/lib/workflows/{db-helpers.test.ts => persistence/utils.test.ts} (99%) rename apps/sim/lib/workflows/{db-helpers.ts => persistence/utils.ts} (99%) rename apps/sim/lib/workflows/{ => sanitization}/json-sanitizer.ts (99%) rename apps/sim/lib/workflows/{ => sanitization}/references.test.ts (92%) rename apps/sim/lib/workflows/{ => sanitization}/references.ts (100%) rename apps/sim/lib/workflows/{ => sanitization}/validation.ts (100%) rename apps/sim/lib/{ => workflows}/schedules/utils.test.ts (99%) rename apps/sim/lib/{ => workflows}/schedules/utils.ts (99%) rename apps/sim/lib/workflows/{ => streaming}/streaming.ts (98%) rename apps/sim/lib/workflows/{ => triggers}/execution-events.ts (100%) rename apps/sim/lib/workflows/{ => triggers}/trigger-utils.ts (99%) rename apps/sim/lib/workflows/{ => triggers}/triggers.ts (100%) rename apps/sim/lib/{ => workflows}/variables/variable-manager.test.ts (99%) rename apps/sim/lib/{ => workflows}/variables/variable-manager.ts (100%) rename apps/sim/lib/{ => workspaces}/organization/index.ts (65%) rename apps/sim/lib/{ => workspaces}/organization/types.ts (100%) rename apps/sim/lib/{organization/helpers.ts => workspaces/organization/utils.ts} (61%) rename apps/sim/lib/{ => workspaces}/permissions/utils.test.ts (99%) rename apps/sim/lib/{ => workspaces}/permissions/utils.ts (100%) rename apps/sim/lib/{collaboration => workspaces}/presence-colors.ts (100%) diff --git a/apps/sim/app/(auth)/components/auth-background.tsx b/apps/sim/app/(auth)/components/auth-background.tsx index ec12774a19..a06ec0cdbf 100644 --- a/apps/sim/app/(auth)/components/auth-background.tsx +++ b/apps/sim/app/(auth)/components/auth-background.tsx @@ -1,4 +1,4 @@ -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import AuthBackgroundSVG from '@/app/(auth)/components/auth-background-svg' type AuthBackgroundProps = { diff --git a/apps/sim/app/(auth)/components/oauth-provider-checker.tsx b/apps/sim/app/(auth)/components/oauth-provider-checker.tsx index 43766112bb..5651e1d5ec 100644 --- a/apps/sim/app/(auth)/components/oauth-provider-checker.tsx +++ b/apps/sim/app/(auth)/components/oauth-provider-checker.tsx @@ -1,7 +1,7 @@ 'use server' -import { env } from '@/lib/env' -import { isProd } from '@/lib/environment' +import { env } from '@/lib/core/config/env' +import { isProd } from '@/lib/core/config/environment' export async function getOAuthProviderStatus() { const githubAvailable = !!(env.GITHUB_CLIENT_ID && env.GITHUB_CLIENT_SECRET) diff --git a/apps/sim/app/(auth)/components/social-login-buttons.tsx b/apps/sim/app/(auth)/components/social-login-buttons.tsx index 19d2a8cb5c..541c242a12 100644 --- a/apps/sim/app/(auth)/components/social-login-buttons.tsx +++ b/apps/sim/app/(auth)/components/social-login-buttons.tsx @@ -3,7 +3,7 @@ import { type ReactNode, useEffect, useState } from 'react' import { GithubIcon, GoogleIcon } from '@/components/icons' import { Button } from '@/components/ui/button' -import { client } from '@/lib/auth-client' +import { client } from '@/lib/auth/auth-client' import { inter } from '@/app/_styles/fonts/inter/inter' interface SocialLoginButtonsProps { diff --git a/apps/sim/app/(auth)/components/sso-login-button.tsx b/apps/sim/app/(auth)/components/sso-login-button.tsx index eeaa650a7d..395a8d4541 100644 --- a/apps/sim/app/(auth)/components/sso-login-button.tsx +++ b/apps/sim/app/(auth)/components/sso-login-button.tsx @@ -2,8 +2,8 @@ import { useRouter } from 'next/navigation' import { Button } from '@/components/ui/button' -import { getEnv, isTruthy } from '@/lib/env' -import { cn } from '@/lib/utils' +import { getEnv, isTruthy } from '@/lib/core/config/env' +import { cn } from '@/lib/core/utils/cn' interface SSOLoginButtonProps { callbackURL?: string diff --git a/apps/sim/app/(auth)/login/login-form.tsx b/apps/sim/app/(auth)/login/login-form.tsx index 37a948f4f9..bb3d22d1f6 100644 --- a/apps/sim/app/(auth)/login/login-form.tsx +++ b/apps/sim/app/(auth)/login/login-form.tsx @@ -14,12 +14,12 @@ import { } from '@/components/ui/dialog' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' -import { client } from '@/lib/auth-client' -import { quickValidateEmail } from '@/lib/email/validation' -import { getEnv, isFalsy, isTruthy } from '@/lib/env' +import { client } from '@/lib/auth/auth-client' +import { getEnv, isFalsy, isTruthy } from '@/lib/core/config/env' +import { cn } from '@/lib/core/utils/cn' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' -import { cn } from '@/lib/utils' +import { quickValidateEmail } from '@/lib/messaging/email/validation' import { inter } from '@/app/_styles/fonts/inter/inter' import { soehne } from '@/app/_styles/fonts/soehne/soehne' import { SocialLoginButtons } from '@/app/(auth)/components/social-login-buttons' diff --git a/apps/sim/app/(auth)/reset-password/reset-password-form.tsx b/apps/sim/app/(auth)/reset-password/reset-password-form.tsx index 5c8a30e842..7f5b8647d5 100644 --- a/apps/sim/app/(auth)/reset-password/reset-password-form.tsx +++ b/apps/sim/app/(auth)/reset-password/reset-password-form.tsx @@ -5,7 +5,7 @@ import { ArrowRight, ChevronRight, Eye, EyeOff } from 'lucide-react' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { inter } from '@/app/_styles/fonts/inter/inter' interface RequestResetFormProps { diff --git a/apps/sim/app/(auth)/signup/page.tsx b/apps/sim/app/(auth)/signup/page.tsx index 6e0734a1f9..f8878e8aa8 100644 --- a/apps/sim/app/(auth)/signup/page.tsx +++ b/apps/sim/app/(auth)/signup/page.tsx @@ -1,4 +1,4 @@ -import { env, isTruthy } from '@/lib/env' +import { env, isTruthy } from '@/lib/core/config/env' import { getOAuthProviderStatus } from '@/app/(auth)/components/oauth-provider-checker' import SignupForm from '@/app/(auth)/signup/signup-form' diff --git a/apps/sim/app/(auth)/signup/signup-form.tsx b/apps/sim/app/(auth)/signup/signup-form.tsx index c908d006a9..654676f0e6 100644 --- a/apps/sim/app/(auth)/signup/signup-form.tsx +++ b/apps/sim/app/(auth)/signup/signup-form.tsx @@ -7,11 +7,11 @@ import { useRouter, useSearchParams } from 'next/navigation' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' -import { client, useSession } from '@/lib/auth-client' -import { quickValidateEmail } from '@/lib/email/validation' -import { getEnv, isFalsy, isTruthy } from '@/lib/env' +import { client, useSession } from '@/lib/auth/auth-client' +import { getEnv, isFalsy, isTruthy } from '@/lib/core/config/env' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' +import { quickValidateEmail } from '@/lib/messaging/email/validation' import { inter } from '@/app/_styles/fonts/inter/inter' import { soehne } from '@/app/_styles/fonts/soehne/soehne' import { SocialLoginButtons } from '@/app/(auth)/components/social-login-buttons' diff --git a/apps/sim/app/(auth)/sso/page.tsx b/apps/sim/app/(auth)/sso/page.tsx index ba8b82d022..18ff14f905 100644 --- a/apps/sim/app/(auth)/sso/page.tsx +++ b/apps/sim/app/(auth)/sso/page.tsx @@ -1,5 +1,5 @@ import { redirect } from 'next/navigation' -import { getEnv, isTruthy } from '@/lib/env' +import { getEnv, isTruthy } from '@/lib/core/config/env' import SSOForm from '@/app/(auth)/sso/sso-form' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/(auth)/sso/sso-form.tsx b/apps/sim/app/(auth)/sso/sso-form.tsx index 497a4d8c27..ae699134e6 100644 --- a/apps/sim/app/(auth)/sso/sso-form.tsx +++ b/apps/sim/app/(auth)/sso/sso-form.tsx @@ -6,11 +6,11 @@ import { useRouter, useSearchParams } from 'next/navigation' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' -import { client } from '@/lib/auth-client' -import { quickValidateEmail } from '@/lib/email/validation' -import { env, isFalsy } from '@/lib/env' +import { client } from '@/lib/auth/auth-client' +import { env, isFalsy } from '@/lib/core/config/env' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' +import { quickValidateEmail } from '@/lib/messaging/email/validation' import { inter } from '@/app/_styles/fonts/inter/inter' import { soehne } from '@/app/_styles/fonts/soehne/soehne' diff --git a/apps/sim/app/(auth)/verify/page.tsx b/apps/sim/app/(auth)/verify/page.tsx index c841e42c35..0c9eeca10d 100644 --- a/apps/sim/app/(auth)/verify/page.tsx +++ b/apps/sim/app/(auth)/verify/page.tsx @@ -1,5 +1,5 @@ -import { hasEmailService } from '@/lib/email/mailer' -import { isEmailVerificationEnabled, isProd } from '@/lib/environment' +import { isEmailVerificationEnabled, isProd } from '@/lib/core/config/environment' +import { hasEmailService } from '@/lib/messaging/email/mailer' import { VerifyContent } from '@/app/(auth)/verify/verify-content' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/(auth)/verify/use-verification.ts b/apps/sim/app/(auth)/verify/use-verification.ts index af88eb4289..fd30e960f3 100644 --- a/apps/sim/app/(auth)/verify/use-verification.ts +++ b/apps/sim/app/(auth)/verify/use-verification.ts @@ -2,7 +2,7 @@ import { useEffect, useState } from 'react' import { useRouter, useSearchParams } from 'next/navigation' -import { client, useSession } from '@/lib/auth-client' +import { client, useSession } from '@/lib/auth/auth-client' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('useVerification') diff --git a/apps/sim/app/(auth)/verify/verify-content.tsx b/apps/sim/app/(auth)/verify/verify-content.tsx index d622f4257d..7259205bc8 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 { useRouter } from 'next/navigation' import { Button } from '@/components/ui/button' import { InputOTP, InputOTPGroup, InputOTPSlot } from '@/components/ui/input-otp' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { inter } from '@/app/_styles/fonts/inter/inter' import { soehne } from '@/app/_styles/fonts/soehne/soehne' import { useVerification } from '@/app/(auth)/verify/use-verification' diff --git a/apps/sim/app/(landing)/careers/page.tsx b/apps/sim/app/(landing)/careers/page.tsx index f531615264..78318e7d7c 100644 --- a/apps/sim/app/(landing)/careers/page.tsx +++ b/apps/sim/app/(landing)/careers/page.tsx @@ -13,10 +13,10 @@ import { SelectValue, } from '@/components/ui/select' import { Textarea } from '@/components/ui/textarea' -import { quickValidateEmail } from '@/lib/email/validation' -import { isHosted } from '@/lib/environment' +import { isHosted } from '@/lib/core/config/environment' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' +import { quickValidateEmail } from '@/lib/messaging/email/validation' import { soehne } from '@/app/_styles/fonts/soehne/soehne' import Footer from '@/app/(landing)/components/footer/footer' import Nav from '@/app/(landing)/components/nav/nav' diff --git a/apps/sim/app/(landing)/components/background/background.tsx b/apps/sim/app/(landing)/components/background/background.tsx index 03920259f5..5fae578aec 100644 --- a/apps/sim/app/(landing)/components/background/background.tsx +++ b/apps/sim/app/(landing)/components/background/background.tsx @@ -1,5 +1,5 @@ import dynamic from 'next/dynamic' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' // Lazy load the SVG to reduce initial bundle size const BackgroundSVG = dynamic(() => import('./background-svg'), { diff --git a/apps/sim/app/(landing)/components/hero/components/landing-canvas/dot-pattern.tsx b/apps/sim/app/(landing)/components/hero/components/landing-canvas/dot-pattern.tsx index 46af1c5173..d3ce55cc3d 100644 --- a/apps/sim/app/(landing)/components/hero/components/landing-canvas/dot-pattern.tsx +++ b/apps/sim/app/(landing)/components/hero/components/landing-canvas/dot-pattern.tsx @@ -2,7 +2,7 @@ import type React from 'react' import { useEffect, useId, useRef, useState } from 'react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' /** * DotPattern Component Props diff --git a/apps/sim/app/(landing)/components/hero/hero.tsx b/apps/sim/app/(landing)/components/hero/hero.tsx index c925147e6f..7c94b011e3 100644 --- a/apps/sim/app/(landing)/components/hero/hero.tsx +++ b/apps/sim/app/(landing)/components/hero/hero.tsx @@ -32,7 +32,7 @@ import { StripeIcon, SupabaseIcon, } from '@/components/icons' -import { LandingPromptStorage } from '@/lib/browser-storage' +import { LandingPromptStorage } from '@/lib/core/utils/browser-storage' import { soehne } from '@/app/_styles/fonts/soehne/soehne' import { CARD_WIDTH, diff --git a/apps/sim/app/(landing)/components/landing-pricing/landing-pricing.tsx b/apps/sim/app/(landing)/components/landing-pricing/landing-pricing.tsx index 012f5b6de7..2b26ba9e47 100644 --- a/apps/sim/app/(landing)/components/landing-pricing/landing-pricing.tsx +++ b/apps/sim/app/(landing)/components/landing-pricing/landing-pricing.tsx @@ -12,8 +12,8 @@ import { Workflow, } from 'lucide-react' import { useRouter } from 'next/navigation' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { inter } from '@/app/_styles/fonts/inter/inter' import { ENTERPRISE_PLAN_FEATURES, diff --git a/apps/sim/app/(landing)/components/legal-layout.tsx b/apps/sim/app/(landing)/components/legal-layout.tsx index d817fd60f5..f75599d20b 100644 --- a/apps/sim/app/(landing)/components/legal-layout.tsx +++ b/apps/sim/app/(landing)/components/legal-layout.tsx @@ -1,6 +1,6 @@ 'use client' -import { isHosted } from '@/lib/environment' +import { isHosted } from '@/lib/core/config/environment' import { soehne } from '@/app/_styles/fonts/soehne/soehne' import Footer from '@/app/(landing)/components/footer/footer' import Nav from '@/app/(landing)/components/nav/nav' diff --git a/apps/sim/app/(landing)/components/nav/nav.tsx b/apps/sim/app/(landing)/components/nav/nav.tsx index 721cd5dd7f..1725c2b164 100644 --- a/apps/sim/app/(landing)/components/nav/nav.tsx +++ b/apps/sim/app/(landing)/components/nav/nav.tsx @@ -7,7 +7,7 @@ import Link from 'next/link' import { useRouter } from 'next/navigation' import { GithubIcon } from '@/components/icons' import { useBrandConfig } from '@/lib/branding/branding' -import { isHosted } from '@/lib/environment' +import { isHosted } from '@/lib/core/config/environment' import { createLogger } from '@/lib/logs/console/logger' import { soehne } from '@/app/_styles/fonts/soehne/soehne' import { getFormattedGitHubStars } from '@/app/(landing)/actions/github' diff --git a/apps/sim/app/(landing)/privacy/page.tsx b/apps/sim/app/(landing)/privacy/page.tsx index 1586afcb98..7f6a0ee7d6 100644 --- a/apps/sim/app/(landing)/privacy/page.tsx +++ b/apps/sim/app/(landing)/privacy/page.tsx @@ -2,7 +2,7 @@ import { useEffect } from 'react' import Link from 'next/link' -import { getEnv } from '@/lib/env' +import { getEnv } from '@/lib/core/config/env' import { LegalLayout } from '@/app/(landing)/components' export default function PrivacyPolicy() { diff --git a/apps/sim/app/(landing)/terms/page.tsx b/apps/sim/app/(landing)/terms/page.tsx index 47ffd72d1b..9b56a567ee 100644 --- a/apps/sim/app/(landing)/terms/page.tsx +++ b/apps/sim/app/(landing)/terms/page.tsx @@ -2,7 +2,7 @@ import { useEffect } from 'react' import Link from 'next/link' -import { getEnv } from '@/lib/env' +import { getEnv } from '@/lib/core/config/env' import { LegalLayout } from '@/app/(landing)/components' export default function TermsOfService() { diff --git a/apps/sim/app/_shell/providers/posthog-provider.tsx b/apps/sim/app/_shell/providers/posthog-provider.tsx index 01261cbeba..6e7ae038eb 100644 --- a/apps/sim/app/_shell/providers/posthog-provider.tsx +++ b/apps/sim/app/_shell/providers/posthog-provider.tsx @@ -3,7 +3,7 @@ import { useEffect } from 'react' import posthog from 'posthog-js' import { PostHogProvider as PHProvider } from 'posthog-js/react' -import { getEnv, isTruthy } from '../../../lib/env' +import { getEnv, isTruthy } from '@/lib/core/config/env' export function PostHogProvider({ children }: { children: React.ReactNode }) { useEffect(() => { diff --git a/apps/sim/app/_shell/providers/session-provider.tsx b/apps/sim/app/_shell/providers/session-provider.tsx index 19d881516a..70fe344bd0 100644 --- a/apps/sim/app/_shell/providers/session-provider.tsx +++ b/apps/sim/app/_shell/providers/session-provider.tsx @@ -3,7 +3,7 @@ import type React from 'react' import { createContext, useCallback, useEffect, useMemo, useState } from 'react' import posthog from 'posthog-js' -import { client } from '@/lib/auth-client' +import { client } from '@/lib/auth/auth-client' export type AppSession = { user: { diff --git a/apps/sim/app/api/__test-utils__/utils.ts b/apps/sim/app/api/__test-utils__/utils.ts index 781b122f14..8b85d79dc5 100644 --- a/apps/sim/app/api/__test-utils__/utils.ts +++ b/apps/sim/app/api/__test-utils__/utils.ts @@ -305,24 +305,20 @@ export function createMockRequest( } export function mockExecutionDependencies() { - vi.mock('@/lib/utils', async () => { - const actual = await vi.importActual('@/lib/utils') - return { - ...(actual as any), - decryptSecret: vi.fn().mockImplementation((encrypted: string) => { - const entries = Object.entries(mockEnvironmentVars) - const found = entries.find(([_, val]) => val === encrypted) - const key = found ? found[0] : null + vi.mock('@/lib/core/security/encryption', () => ({ + decryptSecret: vi.fn().mockImplementation((encrypted: string) => { + const entries = Object.entries(mockEnvironmentVars) + const found = entries.find(([_, val]) => val === encrypted) + const key = found ? found[0] : null - return Promise.resolve({ - decrypted: - key && key in mockDecryptedEnvVars - ? mockDecryptedEnvVars[key as keyof typeof mockDecryptedEnvVars] - : 'decrypted-value', - }) - }), - } - }) + return Promise.resolve({ + decrypted: + key && key in mockDecryptedEnvVars + ? mockDecryptedEnvVars[key as keyof typeof mockDecryptedEnvVars] + : 'decrypted-value', + }) + }), + })) vi.mock('@/lib/logs/execution/trace-spans/trace-spans', () => ({ buildTraceSpans: vi.fn().mockReturnValue({ @@ -455,7 +451,7 @@ export function mockWorkflowAccessValidation(shouldSucceed = true) { } export async function getMockedDependencies() { - const utilsModule = await import('@/lib/utils') + const encryptionModule = await import('@/lib/core/security/encryption') const traceSpansModule = await import('@/lib/logs/execution/trace-spans/trace-spans') const workflowUtilsModule = await import('@/lib/workflows/utils') const executorModule = await import('@/executor') @@ -463,7 +459,7 @@ export async function getMockedDependencies() { const dbModule = await import('@sim/db') return { - decryptSecret: utilsModule.decryptSecret, + decryptSecret: encryptionModule.decryptSecret, buildTraceSpans: traceSpansModule.buildTraceSpans, updateWorkflowRunCounts: workflowUtilsModule.updateWorkflowRunCounts, Executor: executorModule.Executor, @@ -801,7 +797,7 @@ export function mockFileSystem( export function mockEncryption(options: { encryptedValue?: string; decryptedValue?: string } = {}) { const { encryptedValue = 'encrypted-value', decryptedValue = 'decrypted-value' } = options - vi.doMock('@/lib/utils', () => ({ + vi.doMock('@/lib/core/security/encryption', () => ({ encryptSecret: vi.fn().mockResolvedValue({ encrypted: encryptedValue }), decryptSecret: vi.fn().mockResolvedValue({ decrypted: decryptedValue }), })) diff --git a/apps/sim/app/api/auth/oauth/connections/route.ts b/apps/sim/app/api/auth/oauth/connections/route.ts index 0a824ebcbf..8ec7c85993 100644 --- a/apps/sim/app/api/auth/oauth/connections/route.ts +++ b/apps/sim/app/api/auth/oauth/connections/route.ts @@ -3,10 +3,10 @@ import { eq } from 'drizzle-orm' import { jwtDecode } from 'jwt-decode' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import type { OAuthProvider } from '@/lib/oauth/oauth' import { evaluateScopeCoverage, parseProvider } from '@/lib/oauth/oauth' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('OAuthConnectionsAPI') diff --git a/apps/sim/app/api/auth/oauth/credentials/route.ts b/apps/sim/app/api/auth/oauth/credentials/route.ts index 21f02d9de8..6f5f40de81 100644 --- a/apps/sim/app/api/auth/oauth/credentials/route.ts +++ b/apps/sim/app/api/auth/oauth/credentials/route.ts @@ -5,10 +5,10 @@ import { jwtDecode } from 'jwt-decode' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { evaluateScopeCoverage, parseProvider } from '@/lib/oauth/oauth' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { generateRequestId } from '@/lib/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/auth/oauth/disconnect/route.ts b/apps/sim/app/api/auth/oauth/disconnect/route.ts index 265e86f480..39f3b8648b 100644 --- a/apps/sim/app/api/auth/oauth/disconnect/route.ts +++ b/apps/sim/app/api/auth/oauth/disconnect/route.ts @@ -4,8 +4,8 @@ import { and, eq, like, or } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' 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 c6400477ce..4bb6de84ce 100644 --- a/apps/sim/app/api/auth/oauth/microsoft/file/route.ts +++ b/apps/sim/app/api/auth/oauth/microsoft/file/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { authorizeCredentialUse } from '@/lib/auth/credential-access' +import { validateMicrosoftGraphId } from '@/lib/core/security/input-validation' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { validateMicrosoftGraphId } from '@/lib/security/input-validation' -import { generateRequestId } from '@/lib/utils' import { getCredential, refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/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 020fec07c2..a5fe878875 100644 --- a/apps/sim/app/api/auth/oauth/microsoft/files/route.ts +++ b/apps/sim/app/api/auth/oauth/microsoft/files/route.ts @@ -1,7 +1,7 @@ import { type NextRequest, NextResponse } from 'next/server' import { authorizeCredentialUse } from '@/lib/auth/credential-access' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { getCredential, refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/auth/oauth/token/route.ts b/apps/sim/app/api/auth/oauth/token/route.ts index f70955b5fb..b89aff1aa9 100644 --- a/apps/sim/app/api/auth/oauth/token/route.ts +++ b/apps/sim/app/api/auth/oauth/token/route.ts @@ -2,8 +2,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { authorizeCredentialUse } from '@/lib/auth/credential-access' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { getCredential, refreshTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' 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 8cead83d0f..4337033779 100644 --- a/apps/sim/app/api/auth/oauth/wealthbox/item/route.ts +++ b/apps/sim/app/api/auth/oauth/wealthbox/item/route.ts @@ -3,9 +3,9 @@ import { account } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { validateEnum, validatePathSegment } from '@/lib/core/security/input-validation' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { validateEnum, validatePathSegment } from '@/lib/security/input-validation' -import { generateRequestId } from '@/lib/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/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 eea0ebff83..83ba588ba2 100644 --- a/apps/sim/app/api/auth/oauth/wealthbox/items/route.ts +++ b/apps/sim/app/api/auth/oauth/wealthbox/items/route.ts @@ -3,8 +3,8 @@ import { account } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/auth/sso/register/route.ts b/apps/sim/app/api/auth/sso/register/route.ts index 0e8c18815c..ccda1314b1 100644 --- a/apps/sim/app/api/auth/sso/register/route.ts +++ b/apps/sim/app/api/auth/sso/register/route.ts @@ -1,7 +1,7 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { auth } from '@/lib/auth' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('SSO-Register') diff --git a/apps/sim/app/api/auth/trello/authorize/route.ts b/apps/sim/app/api/auth/trello/authorize/route.ts index 5172db53f6..d3c05f9137 100644 --- a/apps/sim/app/api/auth/trello/authorize/route.ts +++ b/apps/sim/app/api/auth/trello/authorize/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' const logger = createLogger('TrelloAuthorize') diff --git a/apps/sim/app/api/auth/trello/callback/route.ts b/apps/sim/app/api/auth/trello/callback/route.ts index e1732b9ffe..2aa76dc8ad 100644 --- a/apps/sim/app/api/auth/trello/callback/route.ts +++ b/apps/sim/app/api/auth/trello/callback/route.ts @@ -1,5 +1,5 @@ import { type NextRequest, NextResponse } from 'next/server' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/auth/trello/store/route.ts b/apps/sim/app/api/auth/trello/store/route.ts index 11ba70af08..7bebff6591 100644 --- a/apps/sim/app/api/auth/trello/store/route.ts +++ b/apps/sim/app/api/auth/trello/store/route.ts @@ -1,7 +1,7 @@ import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' import { db } from '@/../../packages/db' import { account } from '@/../../packages/db/schema' diff --git a/apps/sim/app/api/billing/portal/route.ts b/apps/sim/app/api/billing/portal/route.ts index 959a83cd7f..c68b24e669 100644 --- a/apps/sim/app/api/billing/portal/route.ts +++ b/apps/sim/app/api/billing/portal/route.ts @@ -4,8 +4,8 @@ import { and, eq, or } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' import { requireStripeClient } from '@/lib/billing/stripe-client' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' const logger = createLogger('BillingPortal') diff --git a/apps/sim/app/api/billing/update-cost/route.ts b/apps/sim/app/api/billing/update-cost/route.ts index 75c7979a29..c22a21cdbb 100644 --- a/apps/sim/app/api/billing/update-cost/route.ts +++ b/apps/sim/app/api/billing/update-cost/route.ts @@ -5,9 +5,9 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkAndBillOverageThreshold } from '@/lib/billing/threshold-billing' import { checkInternalApiKey } from '@/lib/copilot/utils' -import { isBillingEnabled } from '@/lib/environment' +import { isBillingEnabled } from '@/lib/core/config/environment' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('BillingUpdateCostAPI') diff --git a/apps/sim/app/api/careers/submit/route.ts b/apps/sim/app/api/careers/submit/route.ts index bf0d492e05..5ed4b418ce 100644 --- a/apps/sim/app/api/careers/submit/route.ts +++ b/apps/sim/app/api/careers/submit/route.ts @@ -3,9 +3,9 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import CareersConfirmationEmail from '@/components/emails/careers/careers-confirmation-email' import CareersSubmissionEmail from '@/components/emails/careers/careers-submission-email' -import { sendEmail } from '@/lib/email/mailer' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' +import { sendEmail } from '@/lib/messaging/email/mailer' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/chat/[identifier]/otp/route.ts b/apps/sim/app/api/chat/[identifier]/otp/route.ts index 8ba425972d..37412a55f9 100644 --- a/apps/sim/app/api/chat/[identifier]/otp/route.ts +++ b/apps/sim/app/api/chat/[identifier]/otp/route.ts @@ -4,10 +4,10 @@ import { eq } from 'drizzle-orm' import type { NextRequest } from 'next/server' import { z } from 'zod' import { renderOTPEmail } from '@/components/emails/render-email' -import { sendEmail } from '@/lib/email/mailer' +import { getRedisClient, markMessageAsProcessed, releaseLock } from '@/lib/core/config/redis' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { getRedisClient, markMessageAsProcessed, releaseLock } from '@/lib/redis' -import { generateRequestId } from '@/lib/utils' +import { sendEmail } from '@/lib/messaging/email/mailer' import { addCorsHeaders, setChatAuthCookie } from '@/app/api/chat/utils' import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils' diff --git a/apps/sim/app/api/chat/[identifier]/route.test.ts b/apps/sim/app/api/chat/[identifier]/route.test.ts index c7cc5754e4..7e119786b3 100644 --- a/apps/sim/app/api/chat/[identifier]/route.test.ts +++ b/apps/sim/app/api/chat/[identifier]/route.test.ts @@ -53,17 +53,20 @@ vi.mock('@/lib/logs/execution/logging-session', () => ({ })), })) -vi.mock('@/lib/workflows/streaming', () => ({ +vi.mock('@/lib/workflows/streaming/streaming', () => ({ createStreamingResponse: vi.fn().mockImplementation(async () => createMockStream()), })) -vi.mock('@/lib/utils', () => ({ +vi.mock('@/lib/core/utils/sse', () => ({ SSE_HEADERS: { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', Connection: 'keep-alive', 'X-Accel-Buffering': 'no', }, +})) + +vi.mock('@/lib/core/utils/request', () => ({ generateRequestId: vi.fn().mockReturnValue('test-request-id'), })) @@ -388,7 +391,7 @@ describe('Chat Identifier API Route', () => { const params = Promise.resolve({ identifier: 'test-chat' }) const { POST } = await import('@/app/api/chat/[identifier]/route') - const { createStreamingResponse } = await import('@/lib/workflows/streaming') + const { createStreamingResponse } = await import('@/lib/workflows/streaming/streaming') const response = await POST(req, { params }) @@ -440,7 +443,7 @@ describe('Chat Identifier API Route', () => { }) it('should handle workflow execution errors gracefully', async () => { - const { createStreamingResponse } = await import('@/lib/workflows/streaming') + const { createStreamingResponse } = await import('@/lib/workflows/streaming/streaming') const originalStreamingResponse = vi.mocked(createStreamingResponse).getMockImplementation() vi.mocked(createStreamingResponse).mockImplementationOnce(async () => { throw new Error('Execution failed') @@ -492,7 +495,7 @@ describe('Chat Identifier API Route', () => { const params = Promise.resolve({ identifier: 'test-chat' }) const { POST } = await import('@/app/api/chat/[identifier]/route') - const { createStreamingResponse } = await import('@/lib/workflows/streaming') + const { createStreamingResponse } = await import('@/lib/workflows/streaming/streaming') await POST(req, { params }) @@ -511,7 +514,7 @@ describe('Chat Identifier API Route', () => { const params = Promise.resolve({ identifier: 'test-chat' }) const { POST } = await import('@/app/api/chat/[identifier]/route') - const { createStreamingResponse } = await import('@/lib/workflows/streaming') + const { createStreamingResponse } = await import('@/lib/workflows/streaming/streaming') await POST(req, { params }) diff --git a/apps/sim/app/api/chat/[identifier]/route.ts b/apps/sim/app/api/chat/[identifier]/route.ts index cac8f60dff..60a4c0ae78 100644 --- a/apps/sim/app/api/chat/[identifier]/route.ts +++ b/apps/sim/app/api/chat/[identifier]/route.ts @@ -4,11 +4,11 @@ import { chat } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' +import { generateRequestId } from '@/lib/core/utils/request' import { preprocessExecution } from '@/lib/execution/preprocessing' import { createLogger } from '@/lib/logs/console/logger' import { LoggingSession } from '@/lib/logs/execution/logging-session' import { ChatFiles } from '@/lib/uploads' -import { generateRequestId } from '@/lib/utils' import { addCorsHeaders, setChatAuthCookie, @@ -182,8 +182,8 @@ export async function POST( } } - const { createStreamingResponse } = await import('@/lib/workflows/streaming') - const { SSE_HEADERS } = await import('@/lib/utils') + const { createStreamingResponse } = await import('@/lib/workflows/streaming/streaming') + const { SSE_HEADERS } = await import('@/lib/core/utils/sse') const { createFilteredResult } = await import('@/app/api/workflows/[id]/execute/route') const workflowInput: any = { input, conversationId } diff --git a/apps/sim/app/api/chat/manage/[id]/route.test.ts b/apps/sim/app/api/chat/manage/[id]/route.test.ts index e5fe704ad5..7c1c3ff9fb 100644 --- a/apps/sim/app/api/chat/manage/[id]/route.test.ts +++ b/apps/sim/app/api/chat/manage/[id]/route.test.ts @@ -69,15 +69,15 @@ describe('Chat Edit API Route', () => { }), })) - vi.doMock('@/lib/utils', () => ({ + vi.doMock('@/lib/core/security/encryption', () => ({ encryptSecret: mockEncryptSecret.mockResolvedValue({ encrypted: 'encrypted-password' }), })) - vi.doMock('@/lib/urls/utils', () => ({ + vi.doMock('@/lib/core/utils/urls', () => ({ getEmailDomain: vi.fn().mockReturnValue('localhost:3000'), })) - vi.doMock('@/lib/environment', () => ({ + vi.doMock('@/lib/core/config/environment', () => ({ isDev: true, })) @@ -86,7 +86,7 @@ describe('Chat Edit API Route', () => { })) mockDeployWorkflow.mockResolvedValue({ success: true, version: 1 }) - vi.doMock('@/lib/workflows/db-helpers', () => ({ + vi.doMock('@/lib/workflows/persistence/utils', () => ({ deployWorkflow: mockDeployWorkflow, })) diff --git a/apps/sim/app/api/chat/manage/[id]/route.ts b/apps/sim/app/api/chat/manage/[id]/route.ts index 5048030782..c624582e97 100644 --- a/apps/sim/app/api/chat/manage/[id]/route.ts +++ b/apps/sim/app/api/chat/manage/[id]/route.ts @@ -4,11 +4,11 @@ import { eq } from 'drizzle-orm' import type { NextRequest } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' -import { isDev } from '@/lib/environment' +import { isDev } from '@/lib/core/config/environment' +import { encryptSecret } from '@/lib/core/security/encryption' +import { getEmailDomain } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getEmailDomain } from '@/lib/urls/utils' -import { encryptSecret } from '@/lib/utils' -import { deployWorkflow } from '@/lib/workflows/db-helpers' +import { deployWorkflow } from '@/lib/workflows/persistence/utils' import { checkChatAccess } from '@/app/api/chat/utils' import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils' diff --git a/apps/sim/app/api/chat/route.test.ts b/apps/sim/app/api/chat/route.test.ts index 567d02c2f1..7156c80c72 100644 --- a/apps/sim/app/api/chat/route.test.ts +++ b/apps/sim/app/api/chat/route.test.ts @@ -66,7 +66,7 @@ describe('Chat API Route', () => { }), })) - vi.doMock('@/lib/utils', () => ({ + vi.doMock('@/lib/core/security/encryption', () => ({ encryptSecret: mockEncryptSecret.mockResolvedValue({ encrypted: 'encrypted-password' }), })) @@ -78,7 +78,7 @@ describe('Chat API Route', () => { checkWorkflowAccessForChatCreation: mockCheckWorkflowAccessForChatCreation, })) - vi.doMock('@/lib/workflows/db-helpers', () => ({ + vi.doMock('@/lib/workflows/persistence/utils', () => ({ deployWorkflow: mockDeployWorkflow.mockResolvedValue({ success: true, version: 1, @@ -249,7 +249,7 @@ describe('Chat API Route', () => { }), })) - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { NODE_ENV: 'development', NEXT_PUBLIC_APP_URL: 'http://localhost:3000', @@ -296,7 +296,7 @@ describe('Chat API Route', () => { }), })) - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { NODE_ENV: 'development', NEXT_PUBLIC_APP_URL: 'http://localhost:3000', diff --git a/apps/sim/app/api/chat/route.ts b/apps/sim/app/api/chat/route.ts index ea0153fdeb..a2476424ce 100644 --- a/apps/sim/app/api/chat/route.ts +++ b/apps/sim/app/api/chat/route.ts @@ -5,11 +5,11 @@ import type { NextRequest } from 'next/server' import { v4 as uuidv4 } from 'uuid' import { z } from 'zod' import { getSession } from '@/lib/auth' -import { isDev } from '@/lib/environment' +import { isDev } from '@/lib/core/config/environment' +import { encryptSecret } from '@/lib/core/security/encryption' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' -import { encryptSecret } from '@/lib/utils' -import { deployWorkflow } from '@/lib/workflows/db-helpers' +import { deployWorkflow } from '@/lib/workflows/persistence/utils' import { checkWorkflowAccessForChatCreation } from '@/app/api/chat/utils' import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils' diff --git a/apps/sim/app/api/chat/utils.test.ts b/apps/sim/app/api/chat/utils.test.ts index bc7bca71a2..9faa65b1ea 100644 --- a/apps/sim/app/api/chat/utils.test.ts +++ b/apps/sim/app/api/chat/utils.test.ts @@ -5,7 +5,7 @@ import type { NextResponse } from 'next/server' * @vitest-environment node */ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' vi.mock('@sim/db', () => ({ db: { @@ -36,8 +36,11 @@ vi.mock('@/stores/workflows/server-utils', () => ({ const mockDecryptSecret = vi.fn() -vi.mock('@/lib/utils', () => ({ +vi.mock('@/lib/core/security/encryption', () => ({ decryptSecret: mockDecryptSecret, +})) + +vi.mock('@/lib/core/utils/request', () => ({ generateRequestId: vi.fn(), })) @@ -60,7 +63,7 @@ describe('Chat API Utils', () => { }, }) - vi.doMock('@/lib/environment', () => ({ + vi.doMock('@/lib/core/config/environment', () => ({ isDev: true, isHosted: false, })) @@ -229,7 +232,7 @@ describe('Chat API Utils', () => { it('should validate password for POST requests', async () => { const { validateChatAuth } = await import('@/app/api/chat/utils') - const { decryptSecret } = await import('@/lib/utils') + const { decryptSecret } = await import('@/lib/core/security/encryption') const deployment = { id: 'chat-id', diff --git a/apps/sim/app/api/chat/utils.ts b/apps/sim/app/api/chat/utils.ts index 88c2062f32..1e41f92012 100644 --- a/apps/sim/app/api/chat/utils.ts +++ b/apps/sim/app/api/chat/utils.ts @@ -2,10 +2,10 @@ import { db } from '@sim/db' import { chat, workflow } from '@sim/db/schema' import { eq } from 'drizzle-orm' import type { NextRequest, NextResponse } from 'next/server' -import { isDev } from '@/lib/environment' +import { isDev } from '@/lib/core/config/environment' +import { decryptSecret } from '@/lib/core/security/encryption' import { createLogger } from '@/lib/logs/console/logger' -import { hasAdminPermission } from '@/lib/permissions/utils' -import { decryptSecret } from '@/lib/utils' +import { hasAdminPermission } from '@/lib/workspaces/permissions/utils' const logger = createLogger('ChatAuthUtils') diff --git a/apps/sim/app/api/copilot/api-keys/generate/route.ts b/apps/sim/app/api/copilot/api-keys/generate/route.ts index 081f345b50..2971babf49 100644 --- a/apps/sim/app/api/copilot/api-keys/generate/route.ts +++ b/apps/sim/app/api/copilot/api-keys/generate/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' -import { env } from '@/lib/env' -import { SIM_AGENT_API_URL_DEFAULT } from '@/lib/sim-agent/constants' +import { SIM_AGENT_API_URL_DEFAULT } from '@/lib/copilot/constants' +import { env } from '@/lib/core/config/env' const GenerateApiKeySchema = z.object({}).optional() diff --git a/apps/sim/app/api/copilot/api-keys/route.ts b/apps/sim/app/api/copilot/api-keys/route.ts index 3de2b0feb0..9e61ba281e 100644 --- a/apps/sim/app/api/copilot/api-keys/route.ts +++ b/apps/sim/app/api/copilot/api-keys/route.ts @@ -1,7 +1,7 @@ import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' -import { env } from '@/lib/env' -import { SIM_AGENT_API_URL_DEFAULT } from '@/lib/sim-agent/constants' +import { SIM_AGENT_API_URL_DEFAULT } from '@/lib/copilot/constants' +import { env } from '@/lib/core/config/env' export async function GET(request: NextRequest) { try { diff --git a/apps/sim/app/api/copilot/chat/route.test.ts b/apps/sim/app/api/copilot/chat/route.test.ts index 80b30dabf5..c680890bd8 100644 --- a/apps/sim/app/api/copilot/chat/route.test.ts +++ b/apps/sim/app/api/copilot/chat/route.test.ts @@ -97,8 +97,11 @@ describe('Copilot Chat API Route', () => { mockGetRotatingApiKey.mockReturnValue('test-api-key') - vi.doMock('@/lib/utils', () => ({ + vi.doMock('@/lib/core/config/api-keys', () => ({ getRotatingApiKey: mockGetRotatingApiKey, + })) + + vi.doMock('@/lib/core/utils/request', () => ({ generateRequestId: vi.fn(() => 'test-request-id'), })) @@ -110,7 +113,7 @@ describe('Copilot Chat API Route', () => { NODE_ENV: 'test', } as const - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: mockEnvValues, getEnv: (variable: string) => mockEnvValues[variable as keyof typeof mockEnvValues], isTruthy: (value: string | boolean | number | undefined) => diff --git a/apps/sim/app/api/copilot/chat/route.ts b/apps/sim/app/api/copilot/chat/route.ts index d20145e097..8981c5dd24 100644 --- a/apps/sim/app/api/copilot/chat/route.ts +++ b/apps/sim/app/api/copilot/chat/route.ts @@ -4,19 +4,19 @@ import { and, desc, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateChatTitle } from '@/lib/copilot/chat-title' +import { getCopilotModel } from '@/lib/copilot/config' +import { SIM_AGENT_API_URL_DEFAULT, SIM_AGENT_VERSION } from '@/lib/copilot/constants' import { authenticateCopilotRequestSessionOnly, createBadRequestResponse, createInternalServerErrorResponse, createRequestTracker, createUnauthorizedResponse, -} from '@/lib/copilot/auth' -import { getCopilotModel } from '@/lib/copilot/config' +} from '@/lib/copilot/request-helpers' import type { CopilotProviderConfig } from '@/lib/copilot/types' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' -import { SIM_AGENT_API_URL_DEFAULT, SIM_AGENT_VERSION } from '@/lib/sim-agent/constants' -import { generateChatTitle } from '@/lib/sim-agent/utils' import { CopilotFiles } from '@/lib/uploads' import { createFileContent } from '@/lib/uploads/utils/file-utils' diff --git a/apps/sim/app/api/copilot/chat/update-messages/route.ts b/apps/sim/app/api/copilot/chat/update-messages/route.ts index f58e2f7a53..bc17ddad52 100644 --- a/apps/sim/app/api/copilot/chat/update-messages/route.ts +++ b/apps/sim/app/api/copilot/chat/update-messages/route.ts @@ -9,7 +9,7 @@ import { createNotFoundResponse, createRequestTracker, createUnauthorizedResponse, -} from '@/lib/copilot/auth' +} from '@/lib/copilot/request-helpers' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('CopilotChatUpdateAPI') diff --git a/apps/sim/app/api/copilot/chats/route.ts b/apps/sim/app/api/copilot/chats/route.ts index 49301e8db1..e51d3fb597 100644 --- a/apps/sim/app/api/copilot/chats/route.ts +++ b/apps/sim/app/api/copilot/chats/route.ts @@ -6,7 +6,7 @@ import { authenticateCopilotRequestSessionOnly, createInternalServerErrorResponse, createUnauthorizedResponse, -} from '@/lib/copilot/auth' +} from '@/lib/copilot/request-helpers' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('CopilotChatsListAPI') diff --git a/apps/sim/app/api/copilot/checkpoints/revert/route.test.ts b/apps/sim/app/api/copilot/checkpoints/revert/route.test.ts index 6d2d3e89b7..9725413985 100644 --- a/apps/sim/app/api/copilot/checkpoints/revert/route.test.ts +++ b/apps/sim/app/api/copilot/checkpoints/revert/route.test.ts @@ -24,7 +24,7 @@ describe('Copilot Checkpoints Revert API Route', () => { mockCryptoUuid() // Mock getBaseUrl to return localhost for tests - vi.doMock('@/lib/urls/utils', () => ({ + vi.doMock('@/lib/core/utils/urls', () => ({ getBaseUrl: vi.fn(() => 'http://localhost:3000'), getBaseDomain: vi.fn(() => 'localhost:3000'), getEmailDomain: vi.fn(() => 'localhost:3000'), diff --git a/apps/sim/app/api/copilot/checkpoints/revert/route.ts b/apps/sim/app/api/copilot/checkpoints/revert/route.ts index a6a7f29998..e47f2f6d11 100644 --- a/apps/sim/app/api/copilot/checkpoints/revert/route.ts +++ b/apps/sim/app/api/copilot/checkpoints/revert/route.ts @@ -9,10 +9,10 @@ import { createNotFoundResponse, createRequestTracker, createUnauthorizedResponse, -} from '@/lib/copilot/auth' +} from '@/lib/copilot/request-helpers' +import { validateUUID } from '@/lib/core/security/input-validation' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { validateUUID } from '@/lib/security/input-validation' -import { getBaseUrl } from '@/lib/urls/utils' const logger = createLogger('CheckpointRevertAPI') diff --git a/apps/sim/app/api/copilot/checkpoints/route.ts b/apps/sim/app/api/copilot/checkpoints/route.ts index 55722b430e..5110ae12f9 100644 --- a/apps/sim/app/api/copilot/checkpoints/route.ts +++ b/apps/sim/app/api/copilot/checkpoints/route.ts @@ -9,7 +9,7 @@ import { createInternalServerErrorResponse, createRequestTracker, createUnauthorizedResponse, -} from '@/lib/copilot/auth' +} from '@/lib/copilot/request-helpers' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('WorkflowCheckpointsAPI') diff --git a/apps/sim/app/api/copilot/confirm/route.test.ts b/apps/sim/app/api/copilot/confirm/route.test.ts index 75db10f4df..6fc1bfa7e8 100644 --- a/apps/sim/app/api/copilot/confirm/route.test.ts +++ b/apps/sim/app/api/copilot/confirm/route.test.ts @@ -28,27 +28,23 @@ describe('Copilot Confirm API Route', () => { } mockGetRedisClient.mockReturnValue(mockRedisClient) - mockRedisExists.mockResolvedValue(1) // Tool call exists by default + mockRedisExists.mockResolvedValue(1) mockRedisSet.mockResolvedValue('OK') - vi.doMock('@/lib/redis', () => ({ + vi.doMock('@/lib/core/config/redis', () => ({ getRedisClient: mockGetRedisClient, })) - // Mock setTimeout to control polling behavior vi.spyOn(global, 'setTimeout').mockImplementation((callback, _delay) => { - // Immediately call callback to avoid delays if (typeof callback === 'function') { setImmediate(callback) } return setTimeout(() => {}, 0) as any }) - // Mock Date.now to control timeout behavior let mockTime = 1640995200000 vi.spyOn(Date, 'now').mockImplementation(() => { - // Increment time rapidly to trigger timeout for non-existent keys - mockTime += 10000 // Add 10 seconds each call + mockTime += 10000 return mockTime }) }) @@ -82,7 +78,6 @@ describe('Copilot Confirm API Route', () => { const req = createMockRequest('POST', { status: 'success', - // Missing toolCallId }) const { POST } = await import('@/app/api/copilot/confirm/route') @@ -149,7 +144,6 @@ describe('Copilot Confirm API Route', () => { status: 'success', }) - // Verify Redis operations were called expect(mockRedisExists).toHaveBeenCalled() expect(mockRedisSet).toHaveBeenCalled() }) @@ -252,7 +246,6 @@ describe('Copilot Confirm API Route', () => { const authMocks = mockAuth() authMocks.setAuthenticated() - // Mock Redis client as unavailable mockGetRedisClient.mockReturnValue(null) const req = createMockRequest('POST', { @@ -272,7 +265,6 @@ describe('Copilot Confirm API Route', () => { const authMocks = mockAuth() authMocks.setAuthenticated() - // Mock tool call as not existing in Redis mockRedisExists.mockResolvedValue(0) const req = createMockRequest('POST', { @@ -292,7 +284,6 @@ describe('Copilot Confirm API Route', () => { const authMocks = mockAuth() authMocks.setAuthenticated() - // Mock Redis operations to throw an error mockRedisExists.mockRejectedValue(new Error('Redis connection failed')) const req = createMockRequest('POST', { @@ -312,7 +303,6 @@ describe('Copilot Confirm API Route', () => { const authMocks = mockAuth() authMocks.setAuthenticated() - // Tool call exists but set operation fails mockRedisExists.mockResolvedValue(1) mockRedisSet.mockRejectedValue(new Error('Redis set failed')) @@ -333,7 +323,6 @@ describe('Copilot Confirm API Route', () => { const authMocks = mockAuth() authMocks.setAuthenticated() - // Create a request with invalid JSON const req = new NextRequest('http://localhost:3000/api/copilot/confirm', { method: 'POST', body: '{invalid-json', diff --git a/apps/sim/app/api/copilot/confirm/route.ts b/apps/sim/app/api/copilot/confirm/route.ts index a58426f852..fed0ad3dff 100644 --- a/apps/sim/app/api/copilot/confirm/route.ts +++ b/apps/sim/app/api/copilot/confirm/route.ts @@ -7,9 +7,9 @@ import { createRequestTracker, createUnauthorizedResponse, type NotificationStatus, -} from '@/lib/copilot/auth' +} from '@/lib/copilot/request-helpers' +import { getRedisClient } from '@/lib/core/config/redis' import { createLogger } from '@/lib/logs/console/logger' -import { getRedisClient } from '@/lib/redis' const logger = createLogger('CopilotConfirmAPI') diff --git a/apps/sim/app/api/copilot/context-usage/route.ts b/apps/sim/app/api/copilot/context-usage/route.ts index fdac63b836..edb2b31c59 100644 --- a/apps/sim/app/api/copilot/context-usage/route.ts +++ b/apps/sim/app/api/copilot/context-usage/route.ts @@ -2,10 +2,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' import { getCopilotModel } from '@/lib/copilot/config' +import { SIM_AGENT_API_URL_DEFAULT } from '@/lib/copilot/constants' import type { CopilotProviderConfig } from '@/lib/copilot/types' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' -import { SIM_AGENT_API_URL_DEFAULT } from '@/lib/sim-agent/constants' const logger = createLogger('ContextUsageAPI') diff --git a/apps/sim/app/api/copilot/execute-copilot-server-tool/route.ts b/apps/sim/app/api/copilot/execute-copilot-server-tool/route.ts index 333e5bed43..c4bdbf4d8c 100644 --- a/apps/sim/app/api/copilot/execute-copilot-server-tool/route.ts +++ b/apps/sim/app/api/copilot/execute-copilot-server-tool/route.ts @@ -6,7 +6,7 @@ import { createInternalServerErrorResponse, createRequestTracker, createUnauthorizedResponse, -} from '@/lib/copilot/auth' +} from '@/lib/copilot/request-helpers' import { routeExecution } from '@/lib/copilot/tools/server/router' import { createLogger } from '@/lib/logs/console/logger' diff --git a/apps/sim/app/api/copilot/feedback/route.ts b/apps/sim/app/api/copilot/feedback/route.ts index a71e293f89..86a95a9fc0 100644 --- a/apps/sim/app/api/copilot/feedback/route.ts +++ b/apps/sim/app/api/copilot/feedback/route.ts @@ -8,7 +8,7 @@ import { createInternalServerErrorResponse, createRequestTracker, createUnauthorizedResponse, -} from '@/lib/copilot/auth' +} from '@/lib/copilot/request-helpers' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('CopilotFeedbackAPI') diff --git a/apps/sim/app/api/copilot/stats/route.ts b/apps/sim/app/api/copilot/stats/route.ts index 643900c32c..ea52c1c58b 100644 --- a/apps/sim/app/api/copilot/stats/route.ts +++ b/apps/sim/app/api/copilot/stats/route.ts @@ -1,14 +1,14 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' +import { SIM_AGENT_API_URL_DEFAULT } from '@/lib/copilot/constants' import { authenticateCopilotRequestSessionOnly, createBadRequestResponse, createInternalServerErrorResponse, createRequestTracker, createUnauthorizedResponse, -} from '@/lib/copilot/auth' -import { env } from '@/lib/env' -import { SIM_AGENT_API_URL_DEFAULT } from '@/lib/sim-agent/constants' +} from '@/lib/copilot/request-helpers' +import { env } from '@/lib/core/config/env' const SIM_AGENT_API_URL = env.SIM_AGENT_API_URL || SIM_AGENT_API_URL_DEFAULT diff --git a/apps/sim/app/api/copilot/tools/mark-complete/route.ts b/apps/sim/app/api/copilot/tools/mark-complete/route.ts index 601a652d0a..93bfef7d2d 100644 --- a/apps/sim/app/api/copilot/tools/mark-complete/route.ts +++ b/apps/sim/app/api/copilot/tools/mark-complete/route.ts @@ -1,15 +1,15 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' +import { SIM_AGENT_API_URL_DEFAULT } from '@/lib/copilot/constants' import { authenticateCopilotRequestSessionOnly, createBadRequestResponse, createInternalServerErrorResponse, createRequestTracker, createUnauthorizedResponse, -} from '@/lib/copilot/auth' -import { env } from '@/lib/env' +} from '@/lib/copilot/request-helpers' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' -import { SIM_AGENT_API_URL_DEFAULT } from '@/lib/sim-agent/constants' const logger = createLogger('CopilotMarkToolCompleteAPI') diff --git a/apps/sim/app/api/copilot/training/examples/route.ts b/apps/sim/app/api/copilot/training/examples/route.ts index cb5919af41..7d735427df 100644 --- a/apps/sim/app/api/copilot/training/examples/route.ts +++ b/apps/sim/app/api/copilot/training/examples/route.ts @@ -1,6 +1,6 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('CopilotTrainingExamplesAPI') diff --git a/apps/sim/app/api/copilot/training/route.ts b/apps/sim/app/api/copilot/training/route.ts index 278132e48c..aed162af6a 100644 --- a/apps/sim/app/api/copilot/training/route.ts +++ b/apps/sim/app/api/copilot/training/route.ts @@ -1,6 +1,6 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('CopilotTrainingAPI') diff --git a/apps/sim/app/api/creators/[id]/route.ts b/apps/sim/app/api/creators/[id]/route.ts index 886f5b7ddf..c55b915cbf 100644 --- a/apps/sim/app/api/creators/[id]/route.ts +++ b/apps/sim/app/api/creators/[id]/route.ts @@ -4,8 +4,8 @@ import { and, eq, or } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('CreatorProfileByIdAPI') diff --git a/apps/sim/app/api/creators/[id]/verify/route.ts b/apps/sim/app/api/creators/[id]/verify/route.ts index 9e29bbdfe5..2bb13115bd 100644 --- a/apps/sim/app/api/creators/[id]/verify/route.ts +++ b/apps/sim/app/api/creators/[id]/verify/route.ts @@ -3,8 +3,8 @@ import { templateCreators, user } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('CreatorVerificationAPI') diff --git a/apps/sim/app/api/creators/route.ts b/apps/sim/app/api/creators/route.ts index 13c6d34f18..96548e83e3 100644 --- a/apps/sim/app/api/creators/route.ts +++ b/apps/sim/app/api/creators/route.ts @@ -5,8 +5,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { v4 as uuidv4 } from 'uuid' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import type { CreatorProfileDetails } from '@/app/_types/creator-profile' const logger = createLogger('CreatorProfilesAPI') diff --git a/apps/sim/app/api/environment/route.ts b/apps/sim/app/api/environment/route.ts index c26c1dbfd6..6425305f3b 100644 --- a/apps/sim/app/api/environment/route.ts +++ b/apps/sim/app/api/environment/route.ts @@ -4,8 +4,9 @@ import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { decryptSecret, encryptSecret } from '@/lib/core/security/encryption' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { decryptSecret, encryptSecret, generateRequestId } from '@/lib/utils' import type { EnvironmentVariable } from '@/stores/settings/environment/types' const logger = createLogger('EnvironmentAPI') diff --git a/apps/sim/app/api/files/authorization.ts b/apps/sim/app/api/files/authorization.ts index d40635b7f1..6083a92c74 100644 --- a/apps/sim/app/api/files/authorization.ts +++ b/apps/sim/app/api/files/authorization.ts @@ -2,7 +2,6 @@ import { db } from '@sim/db' import { document, workspaceFile } from '@sim/db/schema' import { eq, like, or } from 'drizzle-orm' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' import { getFileMetadata } from '@/lib/uploads' import type { StorageContext } from '@/lib/uploads/config' import { @@ -14,6 +13,7 @@ import { import type { StorageConfig } from '@/lib/uploads/core/storage-client' import { getFileMetadataByKey } from '@/lib/uploads/server/metadata' import { inferContextFromKey } from '@/lib/uploads/utils/file-utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('FileAuthorization') diff --git a/apps/sim/app/api/files/download/route.ts b/apps/sim/app/api/files/download/route.ts index 0d2642965a..38de9b4021 100644 --- a/apps/sim/app/api/files/download/route.ts +++ b/apps/sim/app/api/files/download/route.ts @@ -61,7 +61,7 @@ export async function POST(request: NextRequest) { throw new FileNotFoundError(`File not found: ${key}`) } - const { getBaseUrl } = await import('@/lib/urls/utils') + const { getBaseUrl } = await import('@/lib/core/utils/urls') const downloadUrl = `${getBaseUrl()}/api/files/serve/${encodeURIComponent(key)}?context=${storageContext}` logger.info(`Generated download URL for ${storageContext} file: ${key}`) diff --git a/apps/sim/app/api/files/parse/route.ts b/apps/sim/app/api/files/parse/route.ts index b1c5d5cc3e..a81560ea41 100644 --- a/apps/sim/app/api/files/parse/route.ts +++ b/apps/sim/app/api/files/parse/route.ts @@ -5,10 +5,9 @@ import path from 'path' import binaryExtensionsList from 'binary-extensions' import { type NextRequest, NextResponse } from 'next/server' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { validateExternalUrl } from '@/lib/core/security/input-validation' import { isSupportedFileType, parseFile } from '@/lib/file-parsers' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { validateExternalUrl } from '@/lib/security/input-validation' import { isUsingCloudStorage, type StorageContext, StorageService } from '@/lib/uploads' import { UPLOAD_DIR_SERVER } from '@/lib/uploads/core/setup.server' import { getFileMetadataByKey } from '@/lib/uploads/server/metadata' @@ -19,6 +18,7 @@ import { getViewerUrl, inferContextFromKey, } from '@/lib/uploads/utils/file-utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' import { verifyFileAccess } from '@/app/api/files/authorization' import '@/lib/uploads/core/setup.server' diff --git a/apps/sim/app/api/files/upload/route.ts b/apps/sim/app/api/files/upload/route.ts index c2f629fa4e..89d911e89d 100644 --- a/apps/sim/app/api/files/upload/route.ts +++ b/apps/sim/app/api/files/upload/route.ts @@ -2,10 +2,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { createLogger } from '@/lib/logs/console/logger' import '@/lib/uploads/core/setup.server' import { getSession } from '@/lib/auth' -import { getUserEntityPermissions } from '@/lib/permissions/utils' import type { StorageContext } from '@/lib/uploads/config' import { isImageFileType } from '@/lib/uploads/utils/file-utils' import { validateFileType } from '@/lib/uploads/utils/validation' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' import { createErrorResponse, createOptionsResponse, diff --git a/apps/sim/app/api/folders/[id]/duplicate/route.ts b/apps/sim/app/api/folders/[id]/duplicate/route.ts index eff6180644..914485a3b6 100644 --- a/apps/sim/app/api/folders/[id]/duplicate/route.ts +++ b/apps/sim/app/api/folders/[id]/duplicate/route.ts @@ -4,10 +4,10 @@ import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { generateRequestId } from '@/lib/utils' -import { duplicateWorkflow } from '@/lib/workflows/duplicate' +import { duplicateWorkflow } from '@/lib/workflows/persistence/duplicate' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('FolderDuplicateAPI') diff --git a/apps/sim/app/api/folders/[id]/route.test.ts b/apps/sim/app/api/folders/[id]/route.test.ts index 9fdd18cd40..5b5f3c8c28 100644 --- a/apps/sim/app/api/folders/[id]/route.test.ts +++ b/apps/sim/app/api/folders/[id]/route.test.ts @@ -113,7 +113,7 @@ describe('Individual Folder API Route', () => { mockGetUserEntityPermissions.mockResolvedValue('admin') - vi.doMock('@/lib/permissions/utils', () => ({ + vi.doMock('@/lib/workspaces/permissions/utils', () => ({ getUserEntityPermissions: mockGetUserEntityPermissions, })) }) diff --git a/apps/sim/app/api/folders/[id]/route.ts b/apps/sim/app/api/folders/[id]/route.ts index faa15aaa79..8c42b96569 100644 --- a/apps/sim/app/api/folders/[id]/route.ts +++ b/apps/sim/app/api/folders/[id]/route.ts @@ -5,7 +5,7 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('FoldersIDAPI') diff --git a/apps/sim/app/api/folders/route.test.ts b/apps/sim/app/api/folders/route.test.ts index 6f59c4a888..d7da4f779c 100644 --- a/apps/sim/app/api/folders/route.test.ts +++ b/apps/sim/app/api/folders/route.test.ts @@ -83,7 +83,7 @@ describe('Folders API Route', () => { }, })) - vi.doMock('@/lib/permissions/utils', () => ({ + vi.doMock('@/lib/workspaces/permissions/utils', () => ({ getUserEntityPermissions: mockGetUserEntityPermissions, })) }) diff --git a/apps/sim/app/api/folders/route.ts b/apps/sim/app/api/folders/route.ts index 7e11b17823..050d8524d7 100644 --- a/apps/sim/app/api/folders/route.ts +++ b/apps/sim/app/api/folders/route.ts @@ -4,7 +4,7 @@ import { and, asc, desc, eq, isNull } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('FoldersAPI') diff --git a/apps/sim/app/api/function/execute/route.test.ts b/apps/sim/app/api/function/execute/route.test.ts index 0d8345632c..a8aff5f9fb 100644 --- a/apps/sim/app/api/function/execute/route.test.ts +++ b/apps/sim/app/api/function/execute/route.test.ts @@ -66,7 +66,7 @@ describe('Function Execute API Route', () => { }) it.concurrent('should block SSRF attacks through secure fetch wrapper', async () => { - const { validateProxyUrl } = await import('@/lib/security/input-validation') + const { validateProxyUrl } = await import('@/lib/core/security/input-validation') expect(validateProxyUrl('http://169.254.169.254/latest/meta-data/').isValid).toBe(false) expect(validateProxyUrl('http://127.0.0.1:8080/admin').isValid).toBe(false) @@ -75,7 +75,7 @@ describe('Function Execute API Route', () => { }) it.concurrent('should allow legitimate external URLs', async () => { - const { validateProxyUrl } = await import('@/lib/security/input-validation') + const { validateProxyUrl } = await import('@/lib/core/security/input-validation') expect(validateProxyUrl('https://api.github.com/user').isValid).toBe(true) expect(validateProxyUrl('https://httpbin.org/get').isValid).toBe(true) @@ -83,7 +83,7 @@ describe('Function Execute API Route', () => { }) it.concurrent('should block dangerous protocols', async () => { - const { validateProxyUrl } = await import('@/lib/security/input-validation') + const { validateProxyUrl } = await import('@/lib/core/security/input-validation') expect(validateProxyUrl('file:///etc/passwd').isValid).toBe(false) expect(validateProxyUrl('ftp://internal.server/files').isValid).toBe(false) diff --git a/apps/sim/app/api/function/execute/route.ts b/apps/sim/app/api/function/execute/route.ts index 8a0f7058a0..5a6e5d8719 100644 --- a/apps/sim/app/api/function/execute/route.ts +++ b/apps/sim/app/api/function/execute/route.ts @@ -1,11 +1,11 @@ import { createContext, Script } from 'vm' import { type NextRequest, NextResponse } from 'next/server' -import { env, isTruthy } from '@/lib/env' +import { env, isTruthy } from '@/lib/core/config/env' +import { validateProxyUrl } from '@/lib/core/security/input-validation' +import { generateRequestId } from '@/lib/core/utils/request' import { executeInE2B } from '@/lib/execution/e2b' import { CodeLanguage, DEFAULT_CODE_LANGUAGE, isValidCodeLanguage } from '@/lib/execution/languages' import { createLogger } from '@/lib/logs/console/logger' -import { validateProxyUrl } from '@/lib/security/input-validation' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' export const runtime = 'nodejs' diff --git a/apps/sim/app/api/guardrails/validate/route.ts b/apps/sim/app/api/guardrails/validate/route.ts index 83c27eb139..93be5e8b47 100644 --- a/apps/sim/app/api/guardrails/validate/route.ts +++ b/apps/sim/app/api/guardrails/validate/route.ts @@ -1,10 +1,10 @@ import { type NextRequest, NextResponse } from 'next/server' +import { generateRequestId } from '@/lib/core/utils/request' import { validateHallucination } from '@/lib/guardrails/validate_hallucination' import { validateJson } from '@/lib/guardrails/validate_json' import { validatePII } from '@/lib/guardrails/validate_pii' import { validateRegex } from '@/lib/guardrails/validate_regex' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('GuardrailsValidateAPI') diff --git a/apps/sim/app/api/help/route.ts b/apps/sim/app/api/help/route.ts index ad90a3230c..27a9d03afa 100644 --- a/apps/sim/app/api/help/route.ts +++ b/apps/sim/app/api/help/route.ts @@ -2,12 +2,12 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { renderHelpConfirmationEmail } from '@/components/emails' import { getSession } from '@/lib/auth' -import { sendEmail } from '@/lib/email/mailer' -import { getFromEmailAddress } from '@/lib/email/utils' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' +import { generateRequestId } from '@/lib/core/utils/request' +import { getEmailDomain } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getEmailDomain } from '@/lib/urls/utils' -import { generateRequestId } from '@/lib/utils' +import { sendEmail } from '@/lib/messaging/email/mailer' +import { getFromEmailAddress } from '@/lib/messaging/email/utils' const logger = createLogger('HelpAPI') diff --git a/apps/sim/app/api/jobs/[jobId]/route.ts b/apps/sim/app/api/jobs/[jobId]/route.ts index bf5fd3ed93..faa4f17439 100644 --- a/apps/sim/app/api/jobs/[jobId]/route.ts +++ b/apps/sim/app/api/jobs/[jobId]/route.ts @@ -2,8 +2,8 @@ import { runs } from '@trigger.dev/sdk' import { type NextRequest, NextResponse } from 'next/server' import { authenticateApiKeyFromHeader, updateApiKeyLastUsed } from '@/lib/api-key/service' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { createErrorResponse } from '@/app/api/workflows/utils' const logger = createLogger('TaskStatusAPI') diff --git a/apps/sim/app/api/knowledge/[id]/documents/[documentId]/chunks/route.ts b/apps/sim/app/api/knowledge/[id]/documents/[documentId]/chunks/route.ts index 9a9b50636b..659328ddaf 100644 --- a/apps/sim/app/api/knowledge/[id]/documents/[documentId]/chunks/route.ts +++ b/apps/sim/app/api/knowledge/[id]/documents/[documentId]/chunks/route.ts @@ -1,9 +1,9 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { batchChunkOperation, createChunk, queryChunks } from '@/lib/knowledge/chunks/service' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { getUserId } from '@/app/api/auth/oauth/utils' import { checkDocumentAccess, checkDocumentWriteAccess } from '@/app/api/knowledge/utils' import { calculateCost } from '@/providers/utils' 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 4bd4307d14..66f15071c3 100644 --- a/apps/sim/app/api/knowledge/[id]/documents/[documentId]/route.ts +++ b/apps/sim/app/api/knowledge/[id]/documents/[documentId]/route.ts @@ -1,6 +1,7 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { deleteDocument, markDocumentAsFailedTimeout, @@ -8,7 +9,6 @@ import { updateDocument, } from '@/lib/knowledge/documents/service' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { checkDocumentAccess, checkDocumentWriteAccess } from '@/app/api/knowledge/utils' const logger = createLogger('DocumentByIdAPI') diff --git a/apps/sim/app/api/knowledge/[id]/documents/[documentId]/tag-definitions/route.ts b/apps/sim/app/api/knowledge/[id]/documents/[documentId]/tag-definitions/route.ts index 18bb9988f5..5403857e48 100644 --- a/apps/sim/app/api/knowledge/[id]/documents/[documentId]/tag-definitions/route.ts +++ b/apps/sim/app/api/knowledge/[id]/documents/[documentId]/tag-definitions/route.ts @@ -2,7 +2,7 @@ import { randomUUID } from 'crypto' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' -import { SUPPORTED_FIELD_TYPES } from '@/lib/knowledge/consts' +import { SUPPORTED_FIELD_TYPES } from '@/lib/knowledge/constants' import { cleanupUnusedTagDefinitions, createOrUpdateTagDefinitionsBulk, diff --git a/apps/sim/app/api/knowledge/[id]/documents/route.ts b/apps/sim/app/api/knowledge/[id]/documents/route.ts index 4c93d1dd29..6229650101 100644 --- a/apps/sim/app/api/knowledge/[id]/documents/route.ts +++ b/apps/sim/app/api/knowledge/[id]/documents/route.ts @@ -189,7 +189,7 @@ export async function POST(req: NextRequest, { params }: { params: Promise<{ id: // Track bulk document upload try { - const { trackPlatformEvent } = await import('@/lib/telemetry/tracer') + const { trackPlatformEvent } = await import('@/lib/core/telemetry') trackPlatformEvent('platform.knowledge_base.documents_uploaded', { 'knowledge_base.id': knowledgeBaseId, 'documents.count': createdDocuments.length, @@ -253,7 +253,7 @@ export async function POST(req: NextRequest, { params }: { params: Promise<{ id: // Track single document upload try { - const { trackPlatformEvent } = await import('@/lib/telemetry/tracer') + const { trackPlatformEvent } = await import('@/lib/core/telemetry') trackPlatformEvent('platform.knowledge_base.documents_uploaded', { 'knowledge_base.id': knowledgeBaseId, 'documents.count': 1, diff --git a/apps/sim/app/api/knowledge/[id]/route.ts b/apps/sim/app/api/knowledge/[id]/route.ts index bce2006b32..6e006d1a81 100644 --- a/apps/sim/app/api/knowledge/[id]/route.ts +++ b/apps/sim/app/api/knowledge/[id]/route.ts @@ -1,13 +1,13 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { deleteKnowledgeBase, getKnowledgeBaseById, updateKnowledgeBase, } from '@/lib/knowledge/service' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { checkKnowledgeBaseAccess, checkKnowledgeBaseWriteAccess } from '@/app/api/knowledge/utils' const logger = createLogger('KnowledgeBaseByIdAPI') diff --git a/apps/sim/app/api/knowledge/[id]/tag-definitions/route.ts b/apps/sim/app/api/knowledge/[id]/tag-definitions/route.ts index 41762ab621..6e45c64d13 100644 --- a/apps/sim/app/api/knowledge/[id]/tag-definitions/route.ts +++ b/apps/sim/app/api/knowledge/[id]/tag-definitions/route.ts @@ -2,7 +2,7 @@ import { randomUUID } from 'crypto' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' -import { SUPPORTED_FIELD_TYPES } from '@/lib/knowledge/consts' +import { SUPPORTED_FIELD_TYPES } from '@/lib/knowledge/constants' import { createTagDefinition, getTagDefinitions } from '@/lib/knowledge/tags/service' import { createLogger } from '@/lib/logs/console/logger' import { checkKnowledgeBaseAccess } from '@/app/api/knowledge/utils' diff --git a/apps/sim/app/api/knowledge/route.ts b/apps/sim/app/api/knowledge/route.ts index 31ad493600..d79520f2ed 100644 --- a/apps/sim/app/api/knowledge/route.ts +++ b/apps/sim/app/api/knowledge/route.ts @@ -1,9 +1,9 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createKnowledgeBase, getKnowledgeBases } from '@/lib/knowledge/service' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('KnowledgeBaseAPI') diff --git a/apps/sim/app/api/knowledge/search/route.test.ts b/apps/sim/app/api/knowledge/search/route.test.ts index 50c3c3a7f0..3195988f08 100644 --- a/apps/sim/app/api/knowledge/search/route.test.ts +++ b/apps/sim/app/api/knowledge/search/route.test.ts @@ -26,7 +26,7 @@ vi.mock('drizzle-orm', () => ({ mockKnowledgeSchemas() -vi.mock('@/lib/env', () => ({ +vi.mock('@/lib/core/config/env', () => ({ env: { OPENAI_API_KEY: 'test-api-key', }, @@ -34,7 +34,7 @@ vi.mock('@/lib/env', () => ({ typeof value === 'string' ? value === 'true' || value === '1' : Boolean(value), })) -vi.mock('@/lib/utils', () => ({ +vi.mock('@/lib/core/utils/request', () => ({ generateRequestId: vi.fn(() => 'test-request-id'), })) diff --git a/apps/sim/app/api/knowledge/search/route.ts b/apps/sim/app/api/knowledge/search/route.ts index 645ecd040c..1bd86c40a4 100644 --- a/apps/sim/app/api/knowledge/search/route.ts +++ b/apps/sim/app/api/knowledge/search/route.ts @@ -1,10 +1,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' -import { TAG_SLOTS } from '@/lib/knowledge/consts' +import { generateRequestId } from '@/lib/core/utils/request' +import { TAG_SLOTS } from '@/lib/knowledge/constants' import { getDocumentTagDefinitions } from '@/lib/knowledge/tags/service' import { createLogger } from '@/lib/logs/console/logger' import { estimateTokenCount } from '@/lib/tokenization/estimators' -import { generateRequestId } from '@/lib/utils' import { getUserId } from '@/app/api/auth/oauth/utils' import { generateSearchEmbedding, diff --git a/apps/sim/app/api/knowledge/search/utils.test.ts b/apps/sim/app/api/knowledge/search/utils.test.ts index c95a07fceb..1834873f52 100644 --- a/apps/sim/app/api/knowledge/search/utils.test.ts +++ b/apps/sim/app/api/knowledge/search/utils.test.ts @@ -30,7 +30,7 @@ vi.stubGlobal( }) ) -vi.mock('@/lib/env', () => ({ +vi.mock('@/lib/core/config/env', () => ({ env: {}, getEnv: (key: string) => process.env[key], isTruthy: (value: string | boolean | number | undefined) => @@ -179,7 +179,7 @@ describe('Knowledge Search Utils', () => { describe('generateSearchEmbedding', () => { it('should use Azure OpenAI when KB-specific config is provided', async () => { - const { env } = await import('@/lib/env') + const { env } = await import('@/lib/core/config/env') Object.keys(env).forEach((key) => delete (env as any)[key]) Object.assign(env, { AZURE_OPENAI_API_KEY: 'test-azure-key', @@ -214,7 +214,7 @@ describe('Knowledge Search Utils', () => { }) it('should fallback to OpenAI when no KB Azure config provided', async () => { - const { env } = await import('@/lib/env') + const { env } = await import('@/lib/core/config/env') Object.keys(env).forEach((key) => delete (env as any)[key]) Object.assign(env, { OPENAI_API_KEY: 'test-openai-key', @@ -245,7 +245,7 @@ describe('Knowledge Search Utils', () => { }) it('should use default API version when not provided in Azure config', async () => { - const { env } = await import('@/lib/env') + const { env } = await import('@/lib/core/config/env') Object.keys(env).forEach((key) => delete (env as any)[key]) Object.assign(env, { AZURE_OPENAI_API_KEY: 'test-azure-key', @@ -274,7 +274,7 @@ describe('Knowledge Search Utils', () => { }) it('should use custom model name when provided in Azure config', async () => { - const { env } = await import('@/lib/env') + const { env } = await import('@/lib/core/config/env') Object.keys(env).forEach((key) => delete (env as any)[key]) Object.assign(env, { AZURE_OPENAI_API_KEY: 'test-azure-key', @@ -304,7 +304,7 @@ describe('Knowledge Search Utils', () => { }) it('should throw error when no API configuration provided', async () => { - const { env } = await import('@/lib/env') + const { env } = await import('@/lib/core/config/env') Object.keys(env).forEach((key) => delete (env as any)[key]) await expect(generateSearchEmbedding('test query')).rejects.toThrow( @@ -313,7 +313,7 @@ describe('Knowledge Search Utils', () => { }) it('should handle Azure OpenAI API errors properly', async () => { - const { env } = await import('@/lib/env') + const { env } = await import('@/lib/core/config/env') Object.keys(env).forEach((key) => delete (env as any)[key]) Object.assign(env, { AZURE_OPENAI_API_KEY: 'test-azure-key', @@ -337,7 +337,7 @@ describe('Knowledge Search Utils', () => { }) it('should handle OpenAI API errors properly', async () => { - const { env } = await import('@/lib/env') + const { env } = await import('@/lib/core/config/env') Object.keys(env).forEach((key) => delete (env as any)[key]) Object.assign(env, { OPENAI_API_KEY: 'test-openai-key', @@ -358,7 +358,7 @@ describe('Knowledge Search Utils', () => { }) it('should include correct request body for Azure OpenAI', async () => { - const { env } = await import('@/lib/env') + const { env } = await import('@/lib/core/config/env') Object.keys(env).forEach((key) => delete (env as any)[key]) Object.assign(env, { AZURE_OPENAI_API_KEY: 'test-azure-key', @@ -392,7 +392,7 @@ describe('Knowledge Search Utils', () => { }) it('should include correct request body for OpenAI', async () => { - const { env } = await import('@/lib/env') + const { env } = await import('@/lib/core/config/env') Object.keys(env).forEach((key) => delete (env as any)[key]) Object.assign(env, { OPENAI_API_KEY: 'test-openai-key', diff --git a/apps/sim/app/api/knowledge/search/utils.ts b/apps/sim/app/api/knowledge/search/utils.ts index 365623e87c..b25b07fb27 100644 --- a/apps/sim/app/api/knowledge/search/utils.ts +++ b/apps/sim/app/api/knowledge/search/utils.ts @@ -54,7 +54,7 @@ export interface SearchParams { } // Use shared embedding utility -export { generateSearchEmbedding } from '@/lib/embeddings/utils' +export { generateSearchEmbedding } from '@/lib/knowledge/embeddings' function getTagFilters(filters: Record, embedding: any) { return Object.entries(filters).map(([key, value]) => { diff --git a/apps/sim/app/api/knowledge/utils.test.ts b/apps/sim/app/api/knowledge/utils.test.ts index 3e4112f73b..7ac7c4f4af 100644 --- a/apps/sim/app/api/knowledge/utils.test.ts +++ b/apps/sim/app/api/knowledge/utils.test.ts @@ -15,7 +15,7 @@ vi.mock('drizzle-orm', () => ({ sql: (strings: TemplateStringsArray, ...expr: any[]) => ({ strings, expr }), })) -vi.mock('@/lib/env', () => ({ +vi.mock('@/lib/core/config/env', () => ({ env: { OPENAI_API_KEY: 'test-key' }, getEnv: (key: string) => process.env[key], isTruthy: (value: string | boolean | number | undefined) => @@ -164,8 +164,8 @@ vi.mock('@sim/db', () => { } }) -import { generateEmbeddings } from '@/lib/embeddings/utils' import { processDocumentAsync } from '@/lib/knowledge/documents/service' +import { generateEmbeddings } from '@/lib/knowledge/embeddings' import { checkChunkAccess, checkDocumentAccess, @@ -272,7 +272,7 @@ describe('Knowledge Utils', () => { }) it('should use Azure OpenAI when Azure config is provided', async () => { - const { env } = await import('@/lib/env') + const { env } = await import('@/lib/core/config/env') Object.keys(env).forEach((key) => delete (env as any)[key]) Object.assign(env, { AZURE_OPENAI_API_KEY: 'test-azure-key', @@ -305,7 +305,7 @@ describe('Knowledge Utils', () => { }) it('should fallback to OpenAI when no Azure config provided', async () => { - const { env } = await import('@/lib/env') + const { env } = await import('@/lib/core/config/env') Object.keys(env).forEach((key) => delete (env as any)[key]) Object.assign(env, { OPENAI_API_KEY: 'test-openai-key', @@ -334,7 +334,7 @@ describe('Knowledge Utils', () => { }) it('should throw error when no API configuration provided', async () => { - const { env } = await import('@/lib/env') + const { env } = await import('@/lib/core/config/env') Object.keys(env).forEach((key) => delete (env as any)[key]) await expect(generateEmbeddings(['test text'])).rejects.toThrow( diff --git a/apps/sim/app/api/knowledge/utils.ts b/apps/sim/app/api/knowledge/utils.ts index 29ec910b25..d1fc0d867d 100644 --- a/apps/sim/app/api/knowledge/utils.ts +++ b/apps/sim/app/api/knowledge/utils.ts @@ -1,7 +1,7 @@ import { db } from '@sim/db' import { document, embedding, knowledgeBase } from '@sim/db/schema' import { and, eq, isNull } from 'drizzle-orm' -import { getUserEntityPermissions } from '@/lib/permissions/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' export interface KnowledgeBaseData { id: string diff --git a/apps/sim/app/api/logs/[id]/route.ts b/apps/sim/app/api/logs/[id]/route.ts index 015197597a..82e8deb09d 100644 --- a/apps/sim/app/api/logs/[id]/route.ts +++ b/apps/sim/app/api/logs/[id]/route.ts @@ -3,8 +3,8 @@ import { permissions, workflow, workflowExecutionLogs } from '@sim/db/schema' import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('LogDetailsByIdAPI') diff --git a/apps/sim/app/api/logs/cleanup/route.ts b/apps/sim/app/api/logs/cleanup/route.ts index bbc4eb4461..7f55cfd373 100644 --- a/apps/sim/app/api/logs/cleanup/route.ts +++ b/apps/sim/app/api/logs/cleanup/route.ts @@ -3,7 +3,7 @@ import { subscription, user, workflow, workflowExecutionLogs } from '@sim/db/sch import { and, eq, inArray, lt, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { verifyCronAuth } from '@/lib/auth/internal' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' import { snapshotService } from '@/lib/logs/execution/snapshot/service' import { isUsingCloudStorage, StorageService } from '@/lib/uploads' diff --git a/apps/sim/app/api/logs/route.ts b/apps/sim/app/api/logs/route.ts index 3d7e532825..5f187515db 100644 --- a/apps/sim/app/api/logs/route.ts +++ b/apps/sim/app/api/logs/route.ts @@ -4,8 +4,8 @@ import { and, desc, eq, gte, inArray, lte, type SQL, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('LogsAPI') diff --git a/apps/sim/app/api/logs/triggers/route.ts b/apps/sim/app/api/logs/triggers/route.ts index f5562049ac..ace20752aa 100644 --- a/apps/sim/app/api/logs/triggers/route.ts +++ b/apps/sim/app/api/logs/triggers/route.ts @@ -4,8 +4,8 @@ import { and, eq, isNotNull, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('TriggersAPI') diff --git a/apps/sim/app/api/mcp/servers/route.ts b/apps/sim/app/api/mcp/servers/route.ts index 8e30ef8022..370ddac581 100644 --- a/apps/sim/app/api/mcp/servers/route.ts +++ b/apps/sim/app/api/mcp/servers/route.ts @@ -109,7 +109,7 @@ export const POST = withMcpAuth('write')( // Track MCP server registration try { - const { trackPlatformEvent } = await import('@/lib/telemetry/tracer') + const { trackPlatformEvent } = await import('@/lib/core/telemetry') trackPlatformEvent('platform.mcp.server_added', { 'mcp.server_id': serverId, 'mcp.server_name': body.name, diff --git a/apps/sim/app/api/mcp/tools/execute/route.ts b/apps/sim/app/api/mcp/tools/execute/route.ts index 63845865fc..48205811d4 100644 --- a/apps/sim/app/api/mcp/tools/execute/route.ts +++ b/apps/sim/app/api/mcp/tools/execute/route.ts @@ -199,7 +199,7 @@ export const POST = withMcpAuth('read')( // Track MCP tool execution try { - const { trackPlatformEvent } = await import('@/lib/telemetry/tracer') + const { trackPlatformEvent } = await import('@/lib/core/telemetry') trackPlatformEvent('platform.mcp.tool_executed', { 'mcp.server_id': serverId, 'mcp.tool_name': toolName, diff --git a/apps/sim/app/api/memory/[id]/route.ts b/apps/sim/app/api/memory/[id]/route.ts index 4408ad3d07..73b31024f0 100644 --- a/apps/sim/app/api/memory/[id]/route.ts +++ b/apps/sim/app/api/memory/[id]/route.ts @@ -3,8 +3,8 @@ import { memory, workflowBlocks } from '@sim/db/schema' import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('MemoryByIdAPI') diff --git a/apps/sim/app/api/memory/route.ts b/apps/sim/app/api/memory/route.ts index 3b7c621427..065ee64661 100644 --- a/apps/sim/app/api/memory/route.ts +++ b/apps/sim/app/api/memory/route.ts @@ -3,8 +3,8 @@ import { memory, workflowBlocks } from '@sim/db/schema' import { and, eq, inArray, isNull, like } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { getWorkflowAccessContext } from '@/lib/workflows/utils' const logger = createLogger('MemoryAPI') diff --git a/apps/sim/app/api/organizations/[id]/invitations/route.ts b/apps/sim/app/api/organizations/[id]/invitations/route.ts index 1506a89164..5a61a277a5 100644 --- a/apps/sim/app/api/organizations/[id]/invitations/route.ts +++ b/apps/sim/app/api/organizations/[id]/invitations/route.ts @@ -21,11 +21,11 @@ import { validateBulkInvitations, validateSeatAvailability, } from '@/lib/billing/validation/seat-management' -import { sendEmail } from '@/lib/email/mailer' -import { quickValidateEmail } from '@/lib/email/validation' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { hasWorkspaceAdminAccess } from '@/lib/permissions/utils' -import { getBaseUrl } from '@/lib/urls/utils' +import { sendEmail } from '@/lib/messaging/email/mailer' +import { quickValidateEmail } from '@/lib/messaging/email/validation' +import { hasWorkspaceAdminAccess } from '@/lib/workspaces/permissions/utils' const logger = createLogger('OrganizationInvitations') diff --git a/apps/sim/app/api/organizations/[id]/members/route.ts b/apps/sim/app/api/organizations/[id]/members/route.ts index 43e69e4813..9b54abf607 100644 --- a/apps/sim/app/api/organizations/[id]/members/route.ts +++ b/apps/sim/app/api/organizations/[id]/members/route.ts @@ -7,10 +7,10 @@ import { getEmailSubject, renderInvitationEmail } from '@/components/emails/rend import { getSession } from '@/lib/auth' import { getUserUsageData } from '@/lib/billing/core/usage' import { validateSeatAvailability } from '@/lib/billing/validation/seat-management' -import { sendEmail } from '@/lib/email/mailer' -import { quickValidateEmail } from '@/lib/email/validation' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' +import { sendEmail } from '@/lib/messaging/email/mailer' +import { quickValidateEmail } from '@/lib/messaging/email/validation' const logger = createLogger('OrganizationMembersAPI') diff --git a/apps/sim/app/api/organizations/[id]/seats/route.ts b/apps/sim/app/api/organizations/[id]/seats/route.ts index 8812b3673f..c107b42a81 100644 --- a/apps/sim/app/api/organizations/[id]/seats/route.ts +++ b/apps/sim/app/api/organizations/[id]/seats/route.ts @@ -5,7 +5,7 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' import { requireStripeClient } from '@/lib/billing/stripe-client' -import { isBillingEnabled } from '@/lib/environment' +import { isBillingEnabled } from '@/lib/core/config/environment' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('OrganizationSeatsAPI') diff --git a/apps/sim/app/api/providers/ollama/models/route.ts b/apps/sim/app/api/providers/ollama/models/route.ts index 767d8a4eef..16a448028b 100644 --- a/apps/sim/app/api/providers/ollama/models/route.ts +++ b/apps/sim/app/api/providers/ollama/models/route.ts @@ -1,5 +1,5 @@ import { type NextRequest, NextResponse } from 'next/server' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' import type { ModelsObject } from '@/providers/ollama/types' diff --git a/apps/sim/app/api/providers/route.ts b/apps/sim/app/api/providers/route.ts index ba98cfa9a2..6b95f67e9f 100644 --- a/apps/sim/app/api/providers/route.ts +++ b/apps/sim/app/api/providers/route.ts @@ -1,6 +1,6 @@ import { type NextRequest, NextResponse } from 'next/server' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import type { StreamingExecution } from '@/executor/types' import { executeProviderRequest } from '@/providers' import { getApiKey } from '@/providers/utils' diff --git a/apps/sim/app/api/providers/vllm/models/route.ts b/apps/sim/app/api/providers/vllm/models/route.ts index 71c4dd04a2..843ea9fa67 100644 --- a/apps/sim/app/api/providers/vllm/models/route.ts +++ b/apps/sim/app/api/providers/vllm/models/route.ts @@ -1,5 +1,5 @@ import { type NextRequest, NextResponse } from 'next/server' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('VLLMModelsAPI') diff --git a/apps/sim/app/api/proxy/image/route.ts b/apps/sim/app/api/proxy/image/route.ts index c4f0b91e66..70d1fd81d3 100644 --- a/apps/sim/app/api/proxy/image/route.ts +++ b/apps/sim/app/api/proxy/image/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { validateImageUrl } from '@/lib/core/security/input-validation' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { validateImageUrl } from '@/lib/security/input-validation' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('ImageProxyAPI') diff --git a/apps/sim/app/api/proxy/route.ts b/apps/sim/app/api/proxy/route.ts index efe50d029c..96e59273bb 100644 --- a/apps/sim/app/api/proxy/route.ts +++ b/apps/sim/app/api/proxy/route.ts @@ -3,11 +3,11 @@ import { NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' import { generateInternalToken } from '@/lib/auth/internal' -import { isDev } from '@/lib/environment' +import { isDev } from '@/lib/core/config/environment' +import { validateProxyUrl } from '@/lib/core/security/input-validation' +import { generateRequestId } from '@/lib/core/utils/request' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { validateProxyUrl } from '@/lib/security/input-validation' -import { getBaseUrl } from '@/lib/urls/utils' -import { generateRequestId } from '@/lib/utils' import { executeTool } from '@/tools' import { getTool, validateRequiredParametersAfterMerge } from '@/tools/utils' diff --git a/apps/sim/app/api/proxy/tts/route.ts b/apps/sim/app/api/proxy/tts/route.ts index ee92b9acd0..f3db903461 100644 --- a/apps/sim/app/api/proxy/tts/route.ts +++ b/apps/sim/app/api/proxy/tts/route.ts @@ -1,10 +1,10 @@ import type { NextRequest } from 'next/server' import { NextResponse } from 'next/server' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { validateAlphanumericId } from '@/lib/core/security/input-validation' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId } from '@/lib/security/input-validation' import { StorageService } from '@/lib/uploads' -import { getBaseUrl } from '@/lib/urls/utils' const logger = createLogger('ProxyTTSAPI') diff --git a/apps/sim/app/api/proxy/tts/stream/route.ts b/apps/sim/app/api/proxy/tts/stream/route.ts index 1f090d36d6..84c8c05b0f 100644 --- a/apps/sim/app/api/proxy/tts/stream/route.ts +++ b/apps/sim/app/api/proxy/tts/stream/route.ts @@ -1,8 +1,8 @@ import type { NextRequest } from 'next/server' import { checkHybridAuth } from '@/lib/auth/hybrid' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' +import { validateAlphanumericId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId } from '@/lib/security/input-validation' const logger = createLogger('ProxyTTSStreamAPI') diff --git a/apps/sim/app/api/proxy/tts/unified/route.ts b/apps/sim/app/api/proxy/tts/unified/route.ts index dadfe50f50..9937a513a3 100644 --- a/apps/sim/app/api/proxy/tts/unified/route.ts +++ b/apps/sim/app/api/proxy/tts/unified/route.ts @@ -1,9 +1,9 @@ import type { NextRequest } from 'next/server' import { NextResponse } from 'next/server' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' import { StorageService } from '@/lib/uploads' -import { getBaseUrl } from '@/lib/urls/utils' import type { AzureTtsParams, CartesiaTtsParams, diff --git a/apps/sim/app/api/proxy/video/route.ts b/apps/sim/app/api/proxy/video/route.ts index fe3bf433f1..01f75fdba9 100644 --- a/apps/sim/app/api/proxy/video/route.ts +++ b/apps/sim/app/api/proxy/video/route.ts @@ -232,7 +232,7 @@ export async function POST(request: NextRequest) { } const { StorageService } = await import('@/lib/uploads') - const { getBaseUrl } = await import('@/lib/urls/utils') + const { getBaseUrl } = await import('@/lib/core/utils/urls') const timestamp = Date.now() const fileName = `video-${provider}-${timestamp}.mp4` diff --git a/apps/sim/app/api/resume/[workflowId]/[executionId]/[contextId]/route.ts b/apps/sim/app/api/resume/[workflowId]/[executionId]/[contextId]/route.ts index 7185519756..8fcdfe59d8 100644 --- a/apps/sim/app/api/resume/[workflowId]/[executionId]/[contextId]/route.ts +++ b/apps/sim/app/api/resume/[workflowId]/[executionId]/[contextId]/route.ts @@ -1,8 +1,8 @@ import { randomUUID } from 'crypto' import { type NextRequest, NextResponse } from 'next/server' +import { generateRequestId } from '@/lib/core/utils/request' import { preprocessExecution } from '@/lib/execution/preprocessing' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { PauseResumeManager } from '@/lib/workflows/executor/human-in-the-loop-manager' import { validateWorkflowAccess } from '@/app/api/workflows/middleware' diff --git a/apps/sim/app/api/schedules/[id]/route.ts b/apps/sim/app/api/schedules/[id]/route.ts index abf50d9155..cd50005178 100644 --- a/apps/sim/app/api/schedules/[id]/route.ts +++ b/apps/sim/app/api/schedules/[id]/route.ts @@ -4,9 +4,9 @@ import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { generateRequestId } from '@/lib/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('ScheduleAPI') diff --git a/apps/sim/app/api/schedules/[id]/status/route.ts b/apps/sim/app/api/schedules/[id]/status/route.ts index 3f3d3d7b29..59c7533b6e 100644 --- a/apps/sim/app/api/schedules/[id]/status/route.ts +++ b/apps/sim/app/api/schedules/[id]/status/route.ts @@ -3,9 +3,9 @@ import { workflow, workflowSchedule } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { generateRequestId } from '@/lib/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('ScheduleStatusAPI') diff --git a/apps/sim/app/api/schedules/execute/route.test.ts b/apps/sim/app/api/schedules/execute/route.test.ts index 5f43cde8b6..43d5367a2b 100644 --- a/apps/sim/app/api/schedules/execute/route.test.ts +++ b/apps/sim/app/api/schedules/execute/route.test.ts @@ -42,7 +42,7 @@ describe('Scheduled Workflow Execution API Route', () => { executeScheduleJob: mockExecuteScheduleJob, })) - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { TRIGGER_DEV_ENABLED: false, }, @@ -119,7 +119,7 @@ describe('Scheduled Workflow Execution API Route', () => { }, })) - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { TRIGGER_DEV_ENABLED: true, }, @@ -191,7 +191,7 @@ describe('Scheduled Workflow Execution API Route', () => { executeScheduleJob: vi.fn().mockResolvedValue(undefined), })) - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { TRIGGER_DEV_ENABLED: false, }, @@ -250,7 +250,7 @@ describe('Scheduled Workflow Execution API Route', () => { executeScheduleJob: vi.fn().mockResolvedValue(undefined), })) - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { TRIGGER_DEV_ENABLED: false, }, diff --git a/apps/sim/app/api/schedules/execute/route.ts b/apps/sim/app/api/schedules/execute/route.ts index 8fe872c0b5..4368ab192e 100644 --- a/apps/sim/app/api/schedules/execute/route.ts +++ b/apps/sim/app/api/schedules/execute/route.ts @@ -3,9 +3,9 @@ import { tasks } from '@trigger.dev/sdk' import { and, eq, isNull, lt, lte, not, or } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { verifyCronAuth } from '@/lib/auth/internal' -import { env, isTruthy } from '@/lib/env' +import { env, isTruthy } from '@/lib/core/config/env' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { executeScheduleJob } from '@/background/schedule-execution' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/schedules/route.test.ts b/apps/sim/app/api/schedules/route.test.ts index cc5a510acd..650eb0017b 100644 --- a/apps/sim/app/api/schedules/route.test.ts +++ b/apps/sim/app/api/schedules/route.test.ts @@ -25,7 +25,7 @@ describe('Schedule Configuration API Route', () => { }), })) - vi.doMock('@/lib/permissions/utils', () => ({ + vi.doMock('@/lib/workspaces/permissions/utils', () => ({ getUserEntityPermissions: vi.fn().mockResolvedValue('admin'), // User has admin permissions })) @@ -112,7 +112,7 @@ describe('Schedule Configuration API Route', () => { }, })) - vi.doMock('@/lib/schedules/utils', () => ({ + vi.doMock('@/lib/workflows/schedules/utils', () => ({ getScheduleTimeValues: vi.fn().mockReturnValue({ scheduleTime: '09:30', minutesInterval: 15, diff --git a/apps/sim/app/api/schedules/route.ts b/apps/sim/app/api/schedules/route.ts index 011297ddb0..65c0ad30c1 100644 --- a/apps/sim/app/api/schedules/route.ts +++ b/apps/sim/app/api/schedules/route.ts @@ -4,8 +4,8 @@ import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' import { type BlockState, calculateNextRunTime, @@ -13,8 +13,8 @@ import { getScheduleTimeValues, getSubBlockValue, validateCronExpression, -} from '@/lib/schedules/utils' -import { generateRequestId } from '@/lib/utils' +} from '@/lib/workflows/schedules/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('ScheduledAPI') @@ -373,7 +373,7 @@ export async function POST(req: NextRequest) { }) try { - const { trackPlatformEvent } = await import('@/lib/telemetry/tracer') + const { trackPlatformEvent } = await import('@/lib/core/telemetry') trackPlatformEvent('platform.schedule.created', { 'workflow.id': workflowId, 'schedule.type': scheduleType || 'daily', diff --git a/apps/sim/app/api/stars/route.ts b/apps/sim/app/api/stars/route.ts index f4fce257f7..e0e9d48ea8 100644 --- a/apps/sim/app/api/stars/route.ts +++ b/apps/sim/app/api/stars/route.ts @@ -1,5 +1,5 @@ import { NextResponse } from 'next/server' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' function formatStarCount(num: number): string { if (num < 1000) return String(num) diff --git a/apps/sim/app/api/telemetry/route.ts b/apps/sim/app/api/telemetry/route.ts index d2fc0c43c9..f711d3d0c2 100644 --- a/apps/sim/app/api/telemetry/route.ts +++ b/apps/sim/app/api/telemetry/route.ts @@ -1,6 +1,6 @@ import { type NextRequest, NextResponse } from 'next/server' -import { env } from '@/lib/env' -import { isProd } from '@/lib/environment' +import { env } from '@/lib/core/config/env' +import { isProd } from '@/lib/core/config/environment' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('TelemetryAPI') diff --git a/apps/sim/app/api/templates/[id]/approve/route.ts b/apps/sim/app/api/templates/[id]/approve/route.ts index 0f36e1dc1a..cce2fd08a1 100644 --- a/apps/sim/app/api/templates/[id]/approve/route.ts +++ b/apps/sim/app/api/templates/[id]/approve/route.ts @@ -3,8 +3,8 @@ import { templates, user } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('TemplateApprovalAPI') diff --git a/apps/sim/app/api/templates/[id]/reject/route.ts b/apps/sim/app/api/templates/[id]/reject/route.ts index db29efa54b..8d9cea574e 100644 --- a/apps/sim/app/api/templates/[id]/reject/route.ts +++ b/apps/sim/app/api/templates/[id]/reject/route.ts @@ -3,8 +3,8 @@ import { templates, user } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('TemplateRejectionAPI') diff --git a/apps/sim/app/api/templates/[id]/route.ts b/apps/sim/app/api/templates/[id]/route.ts index 22821fc53e..e2801c66d5 100644 --- a/apps/sim/app/api/templates/[id]/route.ts +++ b/apps/sim/app/api/templates/[id]/route.ts @@ -4,12 +4,12 @@ import { and, eq, or, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { extractRequiredCredentials, sanitizeCredentials, -} from '@/lib/workflows/credential-extractor' +} from '@/lib/workflows/credentials/credential-extractor' const logger = createLogger('TemplateByIdAPI') @@ -163,7 +163,7 @@ export async function PUT(request: NextRequest, { params }: { params: Promise<{ // Only update the state if explicitly requested and the template has a connected workflow if (updateState && existingTemplate[0].workflowId) { // Load the current workflow state from normalized tables - const { loadWorkflowFromNormalizedTables } = await import('@/lib/workflows/db-helpers') + const { loadWorkflowFromNormalizedTables } = await import('@/lib/workflows/persistence/utils') const normalizedData = await loadWorkflowFromNormalizedTables(existingTemplate[0].workflowId) if (normalizedData) { diff --git a/apps/sim/app/api/templates/[id]/star/route.ts b/apps/sim/app/api/templates/[id]/star/route.ts index 9bcf55e319..26fd3a9b4a 100644 --- a/apps/sim/app/api/templates/[id]/star/route.ts +++ b/apps/sim/app/api/templates/[id]/star/route.ts @@ -4,8 +4,8 @@ import { and, eq, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { v4 as uuidv4 } from 'uuid' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('TemplateStarAPI') diff --git a/apps/sim/app/api/templates/[id]/use/route.ts b/apps/sim/app/api/templates/[id]/use/route.ts index 4047e9f3da..d32572611b 100644 --- a/apps/sim/app/api/templates/[id]/use/route.ts +++ b/apps/sim/app/api/templates/[id]/use/route.ts @@ -4,10 +4,10 @@ import { eq, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { v4 as uuidv4 } from 'uuid' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' -import { generateRequestId } from '@/lib/utils' -import { regenerateWorkflowStateIds } from '@/lib/workflows/db-helpers' +import { regenerateWorkflowStateIds } from '@/lib/workflows/persistence/utils' const logger = createLogger('TemplateUseAPI') @@ -171,7 +171,7 @@ export async function POST(request: NextRequest, { params }: { params: Promise<{ // Track template usage try { - const { trackPlatformEvent } = await import('@/lib/telemetry/tracer') + const { trackPlatformEvent } = await import('@/lib/core/telemetry') const templateState = templateData.state as any trackPlatformEvent('platform.template.used', { 'template.id': id, diff --git a/apps/sim/app/api/templates/approved/sanitized/route.ts b/apps/sim/app/api/templates/approved/sanitized/route.ts index 7615f145b8..d8ddb6a97f 100644 --- a/apps/sim/app/api/templates/approved/sanitized/route.ts +++ b/apps/sim/app/api/templates/approved/sanitized/route.ts @@ -3,9 +3,9 @@ import { templates } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalApiKey } from '@/lib/copilot/utils' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' -import { sanitizeForCopilot } from '@/lib/workflows/json-sanitizer' +import { sanitizeForCopilot } from '@/lib/workflows/sanitization/json-sanitizer' const logger = createLogger('TemplatesSanitizedAPI') diff --git a/apps/sim/app/api/templates/route.ts b/apps/sim/app/api/templates/route.ts index 6d805d0127..ee4df30e9e 100644 --- a/apps/sim/app/api/templates/route.ts +++ b/apps/sim/app/api/templates/route.ts @@ -13,12 +13,12 @@ import { type NextRequest, NextResponse } from 'next/server' import { v4 as uuidv4 } from 'uuid' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { extractRequiredCredentials, sanitizeCredentials, -} from '@/lib/workflows/credential-extractor' +} from '@/lib/workflows/credentials/credential-extractor' const logger = createLogger('TemplatesAPI') diff --git a/apps/sim/app/api/tools/asana/add-comment/route.ts b/apps/sim/app/api/tools/asana/add-comment/route.ts index 2bc422a5f4..fa9bf681f2 100644 --- a/apps/sim/app/api/tools/asana/add-comment/route.ts +++ b/apps/sim/app/api/tools/asana/add-comment/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateAlphanumericId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId } from '@/lib/security/input-validation' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/asana/create-task/route.ts b/apps/sim/app/api/tools/asana/create-task/route.ts index 956b64bdff..70bd00f1b4 100644 --- a/apps/sim/app/api/tools/asana/create-task/route.ts +++ b/apps/sim/app/api/tools/asana/create-task/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateAlphanumericId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId } from '@/lib/security/input-validation' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/asana/get-projects/route.ts b/apps/sim/app/api/tools/asana/get-projects/route.ts index 32e132d474..5e93e93c4b 100644 --- a/apps/sim/app/api/tools/asana/get-projects/route.ts +++ b/apps/sim/app/api/tools/asana/get-projects/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateAlphanumericId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId } from '@/lib/security/input-validation' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/asana/get-task/route.ts b/apps/sim/app/api/tools/asana/get-task/route.ts index 816ac5ede7..8122986e9e 100644 --- a/apps/sim/app/api/tools/asana/get-task/route.ts +++ b/apps/sim/app/api/tools/asana/get-task/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateAlphanumericId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId } from '@/lib/security/input-validation' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/asana/search-tasks/route.ts b/apps/sim/app/api/tools/asana/search-tasks/route.ts index bec2f71bb9..c6e7d8cb62 100644 --- a/apps/sim/app/api/tools/asana/search-tasks/route.ts +++ b/apps/sim/app/api/tools/asana/search-tasks/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateAlphanumericId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId } from '@/lib/security/input-validation' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/asana/update-task/route.ts b/apps/sim/app/api/tools/asana/update-task/route.ts index 4aac2bc9fb..2eca4d7c78 100644 --- a/apps/sim/app/api/tools/asana/update-task/route.ts +++ b/apps/sim/app/api/tools/asana/update-task/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateAlphanumericId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId } from '@/lib/security/input-validation' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/confluence/attachment/route.ts b/apps/sim/app/api/tools/confluence/attachment/route.ts index 798bb7858e..bfaa2e82a2 100644 --- a/apps/sim/app/api/tools/confluence/attachment/route.ts +++ b/apps/sim/app/api/tools/confluence/attachment/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId, validateJiraCloudId } from '@/lib/security/input-validation' import { getConfluenceCloudId } from '@/tools/confluence/utils' const logger = createLogger('ConfluenceAttachmentAPI') diff --git a/apps/sim/app/api/tools/confluence/attachments/route.ts b/apps/sim/app/api/tools/confluence/attachments/route.ts index 40f4981ae3..869c3b988d 100644 --- a/apps/sim/app/api/tools/confluence/attachments/route.ts +++ b/apps/sim/app/api/tools/confluence/attachments/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId, validateJiraCloudId } from '@/lib/security/input-validation' import { getConfluenceCloudId } from '@/tools/confluence/utils' const logger = createLogger('ConfluenceAttachmentsAPI') diff --git a/apps/sim/app/api/tools/confluence/comment/route.ts b/apps/sim/app/api/tools/confluence/comment/route.ts index d3a34187d7..94fd963af4 100644 --- a/apps/sim/app/api/tools/confluence/comment/route.ts +++ b/apps/sim/app/api/tools/confluence/comment/route.ts @@ -1,7 +1,7 @@ import { NextResponse } from 'next/server' import { z } from 'zod' +import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId, validateJiraCloudId } from '@/lib/security/input-validation' import { getConfluenceCloudId } from '@/tools/confluence/utils' const logger = createLogger('ConfluenceCommentAPI') diff --git a/apps/sim/app/api/tools/confluence/comments/route.ts b/apps/sim/app/api/tools/confluence/comments/route.ts index 66245e588f..b9717e73d3 100644 --- a/apps/sim/app/api/tools/confluence/comments/route.ts +++ b/apps/sim/app/api/tools/confluence/comments/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId, validateJiraCloudId } from '@/lib/security/input-validation' import { getConfluenceCloudId } from '@/tools/confluence/utils' const logger = createLogger('ConfluenceCommentsAPI') diff --git a/apps/sim/app/api/tools/confluence/create-page/route.ts b/apps/sim/app/api/tools/confluence/create-page/route.ts index 8dd0942f47..f049b86722 100644 --- a/apps/sim/app/api/tools/confluence/create-page/route.ts +++ b/apps/sim/app/api/tools/confluence/create-page/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId, validateJiraCloudId } from '@/lib/security/input-validation' import { getConfluenceCloudId } from '@/tools/confluence/utils' const logger = createLogger('ConfluenceCreatePageAPI') diff --git a/apps/sim/app/api/tools/confluence/labels/route.ts b/apps/sim/app/api/tools/confluence/labels/route.ts index 5b438a9292..6ab71167a5 100644 --- a/apps/sim/app/api/tools/confluence/labels/route.ts +++ b/apps/sim/app/api/tools/confluence/labels/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId, validateJiraCloudId } from '@/lib/security/input-validation' import { getConfluenceCloudId } from '@/tools/confluence/utils' const logger = createLogger('ConfluenceLabelsAPI') diff --git a/apps/sim/app/api/tools/confluence/page/route.ts b/apps/sim/app/api/tools/confluence/page/route.ts index 5d18cdcb21..d9fdceb0eb 100644 --- a/apps/sim/app/api/tools/confluence/page/route.ts +++ b/apps/sim/app/api/tools/confluence/page/route.ts @@ -1,7 +1,7 @@ import { NextResponse } from 'next/server' import { z } from 'zod' +import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId, validateJiraCloudId } from '@/lib/security/input-validation' import { getConfluenceCloudId } from '@/tools/confluence/utils' const logger = createLogger('ConfluencePageAPI') diff --git a/apps/sim/app/api/tools/confluence/pages/route.ts b/apps/sim/app/api/tools/confluence/pages/route.ts index 30bd72ffbb..67fed46f71 100644 --- a/apps/sim/app/api/tools/confluence/pages/route.ts +++ b/apps/sim/app/api/tools/confluence/pages/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateJiraCloudId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateJiraCloudId } from '@/lib/security/input-validation' import { getConfluenceCloudId } from '@/tools/confluence/utils' const logger = createLogger('ConfluencePagesAPI') diff --git a/apps/sim/app/api/tools/confluence/search/route.ts b/apps/sim/app/api/tools/confluence/search/route.ts index fb8b3cd90c..1c522898c6 100644 --- a/apps/sim/app/api/tools/confluence/search/route.ts +++ b/apps/sim/app/api/tools/confluence/search/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateJiraCloudId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateJiraCloudId } from '@/lib/security/input-validation' import { getConfluenceCloudId } from '@/tools/confluence/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/confluence/space/route.ts b/apps/sim/app/api/tools/confluence/space/route.ts index 81f6d46c64..75bf8b324d 100644 --- a/apps/sim/app/api/tools/confluence/space/route.ts +++ b/apps/sim/app/api/tools/confluence/space/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId, validateJiraCloudId } from '@/lib/security/input-validation' import { getConfluenceCloudId } from '@/tools/confluence/utils' const logger = createLogger('ConfluenceSpaceAPI') diff --git a/apps/sim/app/api/tools/confluence/spaces/route.ts b/apps/sim/app/api/tools/confluence/spaces/route.ts index 064f2697f2..028257e975 100644 --- a/apps/sim/app/api/tools/confluence/spaces/route.ts +++ b/apps/sim/app/api/tools/confluence/spaces/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateJiraCloudId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateJiraCloudId } from '@/lib/security/input-validation' import { getConfluenceCloudId } from '@/tools/confluence/utils' const logger = createLogger('ConfluenceSpacesAPI') diff --git a/apps/sim/app/api/tools/custom/route.test.ts b/apps/sim/app/api/tools/custom/route.test.ts index 60cdd1e4d1..5894171a24 100644 --- a/apps/sim/app/api/tools/custom/route.test.ts +++ b/apps/sim/app/api/tools/custom/route.test.ts @@ -204,7 +204,7 @@ describe('Custom Tools API Routes', () => { })) // Mock permissions - vi.doMock('@/lib/permissions/utils', () => ({ + vi.doMock('@/lib/workspaces/permissions/utils', () => ({ getUserEntityPermissions: vi.fn().mockResolvedValue('admin'), })) @@ -233,12 +233,12 @@ describe('Custom Tools API Routes', () => { }) // Mock utils - vi.doMock('@/lib/utils', () => ({ + vi.doMock('@/lib/core/utils/request', () => ({ generateRequestId: vi.fn().mockReturnValue('test-request-id'), })) // Mock custom tools operations - vi.doMock('@/lib/custom-tools/operations', () => ({ + vi.doMock('@/lib/workflows/custom-tools/operations', () => ({ upsertCustomTools: vi.fn().mockResolvedValue(sampleTools), })) }) diff --git a/apps/sim/app/api/tools/custom/route.ts b/apps/sim/app/api/tools/custom/route.ts index 933d56dbc5..0bb32c5148 100644 --- a/apps/sim/app/api/tools/custom/route.ts +++ b/apps/sim/app/api/tools/custom/route.ts @@ -4,10 +4,10 @@ import { and, desc, eq, isNull, or } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' -import { upsertCustomTools } from '@/lib/custom-tools/operations' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { generateRequestId } from '@/lib/utils' +import { upsertCustomTools } from '@/lib/workflows/custom-tools/operations' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('CustomToolsAPI') diff --git a/apps/sim/app/api/tools/discord/channels/route.ts b/apps/sim/app/api/tools/discord/channels/route.ts index 643860d2fc..25eed7c5c0 100644 --- a/apps/sim/app/api/tools/discord/channels/route.ts +++ b/apps/sim/app/api/tools/discord/channels/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateNumericId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateNumericId } from '@/lib/security/input-validation' interface DiscordChannel { id: string diff --git a/apps/sim/app/api/tools/discord/send-message/route.ts b/apps/sim/app/api/tools/discord/send-message/route.ts index 5751134b04..205149a7df 100644 --- a/apps/sim/app/api/tools/discord/send-message/route.ts +++ b/apps/sim/app/api/tools/discord/send-message/route.ts @@ -1,10 +1,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { processFilesToUserFiles } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/discord/servers/route.ts b/apps/sim/app/api/tools/discord/servers/route.ts index 9588a5a88c..c7fa8c7561 100644 --- a/apps/sim/app/api/tools/discord/servers/route.ts +++ b/apps/sim/app/api/tools/discord/servers/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateNumericId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateNumericId } from '@/lib/security/input-validation' interface DiscordServer { id: string diff --git a/apps/sim/app/api/tools/drive/file/route.ts b/apps/sim/app/api/tools/drive/file/route.ts index 02e116288e..edc1e77f1e 100644 --- a/apps/sim/app/api/tools/drive/file/route.ts +++ b/apps/sim/app/api/tools/drive/file/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { authorizeCredentialUse } from '@/lib/auth/credential-access' +import { validateAlphanumericId } from '@/lib/core/security/input-validation' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId } from '@/lib/security/input-validation' -import { generateRequestId } from '@/lib/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/drive/files/route.ts b/apps/sim/app/api/tools/drive/files/route.ts index 74481fefde..a142821b14 100644 --- a/apps/sim/app/api/tools/drive/files/route.ts +++ b/apps/sim/app/api/tools/drive/files/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' import { authorizeCredentialUse } from '@/lib/auth/credential-access' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/gmail/add-label/route.ts b/apps/sim/app/api/tools/gmail/add-label/route.ts index 2cfb8c6de0..d4ddcdefb8 100644 --- a/apps/sim/app/api/tools/gmail/add-label/route.ts +++ b/apps/sim/app/api/tools/gmail/add-label/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/gmail/archive/route.ts b/apps/sim/app/api/tools/gmail/archive/route.ts index 79af4ff363..2f62d211ed 100644 --- a/apps/sim/app/api/tools/gmail/archive/route.ts +++ b/apps/sim/app/api/tools/gmail/archive/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/gmail/delete/route.ts b/apps/sim/app/api/tools/gmail/delete/route.ts index 7d853ee32b..ce3779c9d6 100644 --- a/apps/sim/app/api/tools/gmail/delete/route.ts +++ b/apps/sim/app/api/tools/gmail/delete/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/gmail/draft/route.ts b/apps/sim/app/api/tools/gmail/draft/route.ts index eda64213c5..90f849b0d0 100644 --- a/apps/sim/app/api/tools/gmail/draft/route.ts +++ b/apps/sim/app/api/tools/gmail/draft/route.ts @@ -1,10 +1,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { processFilesToUserFiles } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' -import { generateRequestId } from '@/lib/utils' import { base64UrlEncode, buildMimeMessage, diff --git a/apps/sim/app/api/tools/gmail/label/route.ts b/apps/sim/app/api/tools/gmail/label/route.ts index 2da053cfe2..c7042034c3 100644 --- a/apps/sim/app/api/tools/gmail/label/route.ts +++ b/apps/sim/app/api/tools/gmail/label/route.ts @@ -3,9 +3,9 @@ import { account } from '@sim/db/schema' import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { validateAlphanumericId } from '@/lib/core/security/input-validation' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId } from '@/lib/security/input-validation' -import { generateRequestId } from '@/lib/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/gmail/labels/route.ts b/apps/sim/app/api/tools/gmail/labels/route.ts index 70a62c7952..e4c8aab4bd 100644 --- a/apps/sim/app/api/tools/gmail/labels/route.ts +++ b/apps/sim/app/api/tools/gmail/labels/route.ts @@ -3,8 +3,8 @@ import { account } from '@sim/db/schema' import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/gmail/mark-read/route.ts b/apps/sim/app/api/tools/gmail/mark-read/route.ts index 1ef8926ea3..3525869567 100644 --- a/apps/sim/app/api/tools/gmail/mark-read/route.ts +++ b/apps/sim/app/api/tools/gmail/mark-read/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/gmail/mark-unread/route.ts b/apps/sim/app/api/tools/gmail/mark-unread/route.ts index 7c3d1f0818..17aca8e7fc 100644 --- a/apps/sim/app/api/tools/gmail/mark-unread/route.ts +++ b/apps/sim/app/api/tools/gmail/mark-unread/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/gmail/move/route.ts b/apps/sim/app/api/tools/gmail/move/route.ts index 57a8369bad..358768fe3e 100644 --- a/apps/sim/app/api/tools/gmail/move/route.ts +++ b/apps/sim/app/api/tools/gmail/move/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/gmail/remove-label/route.ts b/apps/sim/app/api/tools/gmail/remove-label/route.ts index 8978e79823..928d44c361 100644 --- a/apps/sim/app/api/tools/gmail/remove-label/route.ts +++ b/apps/sim/app/api/tools/gmail/remove-label/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/gmail/send/route.ts b/apps/sim/app/api/tools/gmail/send/route.ts index eda82deeb4..d9c3dc9ecc 100644 --- a/apps/sim/app/api/tools/gmail/send/route.ts +++ b/apps/sim/app/api/tools/gmail/send/route.ts @@ -1,10 +1,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { processFilesToUserFiles } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' -import { generateRequestId } from '@/lib/utils' import { base64UrlEncode, buildMimeMessage, diff --git a/apps/sim/app/api/tools/gmail/unarchive/route.ts b/apps/sim/app/api/tools/gmail/unarchive/route.ts index 4e0768657e..28bf5b879c 100644 --- a/apps/sim/app/api/tools/gmail/unarchive/route.ts +++ b/apps/sim/app/api/tools/gmail/unarchive/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/google_calendar/calendars/route.ts b/apps/sim/app/api/tools/google_calendar/calendars/route.ts index 9fdafa9bd5..2e92521db4 100644 --- a/apps/sim/app/api/tools/google_calendar/calendars/route.ts +++ b/apps/sim/app/api/tools/google_calendar/calendars/route.ts @@ -1,7 +1,7 @@ import { type NextRequest, NextResponse } from 'next/server' import { authorizeCredentialUse } from '@/lib/auth/credential-access' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/google_drive/upload/route.ts b/apps/sim/app/api/tools/google_drive/upload/route.ts index ffc31e780d..13acfd3b25 100644 --- a/apps/sim/app/api/tools/google_drive/upload/route.ts +++ b/apps/sim/app/api/tools/google_drive/upload/route.ts @@ -1,10 +1,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { processSingleFileToUserFile } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' -import { generateRequestId } from '@/lib/utils' import { GOOGLE_WORKSPACE_MIME_TYPES, handleSheetsFormat, diff --git a/apps/sim/app/api/tools/jira/issue/route.ts b/apps/sim/app/api/tools/jira/issue/route.ts index 60ba1a1365..5e2f8e6436 100644 --- a/apps/sim/app/api/tools/jira/issue/route.ts +++ b/apps/sim/app/api/tools/jira/issue/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/security/input-validation' import { getJiraCloudId } from '@/tools/jira/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/jira/issues/route.ts b/apps/sim/app/api/tools/jira/issues/route.ts index 99f58d67ff..68368596cc 100644 --- a/apps/sim/app/api/tools/jira/issues/route.ts +++ b/apps/sim/app/api/tools/jira/issues/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId, validateJiraCloudId } from '@/lib/security/input-validation' import { getJiraCloudId } from '@/tools/jira/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/jira/projects/route.ts b/apps/sim/app/api/tools/jira/projects/route.ts index 6f7b856caf..9551cde78d 100644 --- a/apps/sim/app/api/tools/jira/projects/route.ts +++ b/apps/sim/app/api/tools/jira/projects/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId, validateJiraCloudId } from '@/lib/security/input-validation' import { getJiraCloudId } from '@/tools/jira/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/jira/update/route.ts b/apps/sim/app/api/tools/jira/update/route.ts index 8601f09149..1a924faa23 100644 --- a/apps/sim/app/api/tools/jira/update/route.ts +++ b/apps/sim/app/api/tools/jira/update/route.ts @@ -1,7 +1,7 @@ import { NextResponse } from 'next/server' import { z } from 'zod' +import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/security/input-validation' import { getJiraCloudId } from '@/tools/jira/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/jira/write/route.ts b/apps/sim/app/api/tools/jira/write/route.ts index 90683a9892..48b90da5e2 100644 --- a/apps/sim/app/api/tools/jira/write/route.ts +++ b/apps/sim/app/api/tools/jira/write/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId, validateJiraCloudId } from '@/lib/security/input-validation' import { getJiraCloudId } from '@/tools/jira/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/linear/projects/route.ts b/apps/sim/app/api/tools/linear/projects/route.ts index 72523399d5..51863961d9 100644 --- a/apps/sim/app/api/tools/linear/projects/route.ts +++ b/apps/sim/app/api/tools/linear/projects/route.ts @@ -2,8 +2,8 @@ import type { Project } from '@linear/sdk' import { LinearClient } from '@linear/sdk' import { NextResponse } from 'next/server' import { authorizeCredentialUse } from '@/lib/auth/credential-access' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/linear/teams/route.ts b/apps/sim/app/api/tools/linear/teams/route.ts index c4a1c08434..cf1e36ce20 100644 --- a/apps/sim/app/api/tools/linear/teams/route.ts +++ b/apps/sim/app/api/tools/linear/teams/route.ts @@ -2,8 +2,8 @@ import type { Team } from '@linear/sdk' import { LinearClient } from '@linear/sdk' import { NextResponse } from 'next/server' import { authorizeCredentialUse } from '@/lib/auth/credential-access' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/mail/send/route.ts b/apps/sim/app/api/tools/mail/send/route.ts index 05fe843bf1..ede1dc9a64 100644 --- a/apps/sim/app/api/tools/mail/send/route.ts +++ b/apps/sim/app/api/tools/mail/send/route.ts @@ -2,8 +2,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { Resend } from 'resend' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' 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 0cc35c1025..4dc4513535 100644 --- a/apps/sim/app/api/tools/microsoft-teams/teams/route.ts +++ b/apps/sim/app/api/tools/microsoft-teams/teams/route.ts @@ -1,7 +1,7 @@ import { NextResponse } from 'next/server' import { authorizeCredentialUse } from '@/lib/auth/credential-access' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/microsoft_planner/tasks/route.ts b/apps/sim/app/api/tools/microsoft_planner/tasks/route.ts index 82f90022b2..69b075399f 100644 --- a/apps/sim/app/api/tools/microsoft_planner/tasks/route.ts +++ b/apps/sim/app/api/tools/microsoft_planner/tasks/route.ts @@ -4,8 +4,8 @@ import { account } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { validateMicrosoftGraphId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateMicrosoftGraphId } from '@/lib/security/input-validation' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' import type { PlannerTask } from '@/tools/microsoft_planner/types' diff --git a/apps/sim/app/api/tools/microsoft_teams/delete_chat_message/route.ts b/apps/sim/app/api/tools/microsoft_teams/delete_chat_message/route.ts index 4f62a05534..44f91f1e8f 100644 --- a/apps/sim/app/api/tools/microsoft_teams/delete_chat_message/route.ts +++ b/apps/sim/app/api/tools/microsoft_teams/delete_chat_message/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/microsoft_teams/write_channel/route.ts b/apps/sim/app/api/tools/microsoft_teams/write_channel/route.ts index 1ce0fc88bb..a3f703b30e 100644 --- a/apps/sim/app/api/tools/microsoft_teams/write_channel/route.ts +++ b/apps/sim/app/api/tools/microsoft_teams/write_channel/route.ts @@ -1,10 +1,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { processFilesToUserFiles } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' -import { generateRequestId } from '@/lib/utils' import { resolveMentionsForChannel, type TeamsMention } from '@/tools/microsoft_teams/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/microsoft_teams/write_chat/route.ts b/apps/sim/app/api/tools/microsoft_teams/write_chat/route.ts index 526af5b853..635f48f917 100644 --- a/apps/sim/app/api/tools/microsoft_teams/write_chat/route.ts +++ b/apps/sim/app/api/tools/microsoft_teams/write_chat/route.ts @@ -1,10 +1,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { processFilesToUserFiles } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' -import { generateRequestId } from '@/lib/utils' import { resolveMentionsForChat, type TeamsMention } from '@/tools/microsoft_teams/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/mistral/parse/route.ts b/apps/sim/app/api/tools/mistral/parse/route.ts index 2f15da76ee..d3cd52c582 100644 --- a/apps/sim/app/api/tools/mistral/parse/route.ts +++ b/apps/sim/app/api/tools/mistral/parse/route.ts @@ -1,11 +1,11 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' import { StorageService } from '@/lib/uploads' import { extractStorageKey, inferContextFromKey } from '@/lib/uploads/utils/file-utils' -import { getBaseUrl } from '@/lib/urls/utils' -import { generateRequestId } from '@/lib/utils' import { verifyFileAccess } from '@/app/api/files/authorization' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/onedrive/folder/route.ts b/apps/sim/app/api/tools/onedrive/folder/route.ts index 503c1fbf68..7f93d0e3fd 100644 --- a/apps/sim/app/api/tools/onedrive/folder/route.ts +++ b/apps/sim/app/api/tools/onedrive/folder/route.ts @@ -4,8 +4,8 @@ import { account } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { validateMicrosoftGraphId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateMicrosoftGraphId } from '@/lib/security/input-validation' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/onedrive/upload/route.ts b/apps/sim/app/api/tools/onedrive/upload/route.ts index 1f4a0f9f49..43875ce2a5 100644 --- a/apps/sim/app/api/tools/onedrive/upload/route.ts +++ b/apps/sim/app/api/tools/onedrive/upload/route.ts @@ -2,10 +2,10 @@ import { type NextRequest, NextResponse } from 'next/server' import * as XLSX from 'xlsx' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { processSingleFileToUserFile } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' -import { generateRequestId } from '@/lib/utils' import { normalizeExcelValues } from '@/tools/onedrive/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/outlook/copy/route.ts b/apps/sim/app/api/tools/outlook/copy/route.ts index b805e6d4e3..b4435931b5 100644 --- a/apps/sim/app/api/tools/outlook/copy/route.ts +++ b/apps/sim/app/api/tools/outlook/copy/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/outlook/delete/route.ts b/apps/sim/app/api/tools/outlook/delete/route.ts index 495a49bde0..7e47dafb02 100644 --- a/apps/sim/app/api/tools/outlook/delete/route.ts +++ b/apps/sim/app/api/tools/outlook/delete/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/outlook/draft/route.ts b/apps/sim/app/api/tools/outlook/draft/route.ts index b3ca22a1aa..16ed64c02b 100644 --- a/apps/sim/app/api/tools/outlook/draft/route.ts +++ b/apps/sim/app/api/tools/outlook/draft/route.ts @@ -1,10 +1,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { processFilesToUserFiles } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/outlook/folders/route.ts b/apps/sim/app/api/tools/outlook/folders/route.ts index 78d75e494d..90e4de55eb 100644 --- a/apps/sim/app/api/tools/outlook/folders/route.ts +++ b/apps/sim/app/api/tools/outlook/folders/route.ts @@ -3,8 +3,8 @@ import { account } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/outlook/mark-read/route.ts b/apps/sim/app/api/tools/outlook/mark-read/route.ts index 8186e27746..1873249d7a 100644 --- a/apps/sim/app/api/tools/outlook/mark-read/route.ts +++ b/apps/sim/app/api/tools/outlook/mark-read/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/outlook/mark-unread/route.ts b/apps/sim/app/api/tools/outlook/mark-unread/route.ts index c4921f2dfd..7b52941b52 100644 --- a/apps/sim/app/api/tools/outlook/mark-unread/route.ts +++ b/apps/sim/app/api/tools/outlook/mark-unread/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/outlook/move/route.ts b/apps/sim/app/api/tools/outlook/move/route.ts index f5bb633359..5cdbc56f76 100644 --- a/apps/sim/app/api/tools/outlook/move/route.ts +++ b/apps/sim/app/api/tools/outlook/move/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/outlook/send/route.ts b/apps/sim/app/api/tools/outlook/send/route.ts index 73248161a1..59293f535b 100644 --- a/apps/sim/app/api/tools/outlook/send/route.ts +++ b/apps/sim/app/api/tools/outlook/send/route.ts @@ -1,10 +1,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { processFilesToUserFiles } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/s3/copy-object/route.ts b/apps/sim/app/api/tools/s3/copy-object/route.ts index 2c94f6d689..4c96284be0 100644 --- a/apps/sim/app/api/tools/s3/copy-object/route.ts +++ b/apps/sim/app/api/tools/s3/copy-object/route.ts @@ -2,8 +2,8 @@ import { CopyObjectCommand, type ObjectCannedACL, S3Client } from '@aws-sdk/clie import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/s3/delete-object/route.ts b/apps/sim/app/api/tools/s3/delete-object/route.ts index 8b9879115d..1a3566a020 100644 --- a/apps/sim/app/api/tools/s3/delete-object/route.ts +++ b/apps/sim/app/api/tools/s3/delete-object/route.ts @@ -2,8 +2,8 @@ import { DeleteObjectCommand, S3Client } from '@aws-sdk/client-s3' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/s3/list-objects/route.ts b/apps/sim/app/api/tools/s3/list-objects/route.ts index d4c93185ed..2d773fe30b 100644 --- a/apps/sim/app/api/tools/s3/list-objects/route.ts +++ b/apps/sim/app/api/tools/s3/list-objects/route.ts @@ -2,8 +2,8 @@ import { ListObjectsV2Command, S3Client } from '@aws-sdk/client-s3' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/s3/put-object/route.ts b/apps/sim/app/api/tools/s3/put-object/route.ts index ad03c937c3..3d84b9a23a 100644 --- a/apps/sim/app/api/tools/s3/put-object/route.ts +++ b/apps/sim/app/api/tools/s3/put-object/route.ts @@ -2,10 +2,10 @@ import { type ObjectCannedACL, PutObjectCommand, S3Client } from '@aws-sdk/clien import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { processSingleFileToUserFile } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/search/route.ts b/apps/sim/app/api/tools/search/route.ts index f3a748e2b9..fb7815da85 100644 --- a/apps/sim/app/api/tools/search/route.ts +++ b/apps/sim/app/api/tools/search/route.ts @@ -2,7 +2,7 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' import { SEARCH_TOOL_COST } from '@/lib/billing/constants' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' import { executeTool } from '@/tools' diff --git a/apps/sim/app/api/tools/sharepoint/site/route.ts b/apps/sim/app/api/tools/sharepoint/site/route.ts index 803ba2c820..ffa8d74b61 100644 --- a/apps/sim/app/api/tools/sharepoint/site/route.ts +++ b/apps/sim/app/api/tools/sharepoint/site/route.ts @@ -4,8 +4,8 @@ import { account } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { validateMicrosoftGraphId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateMicrosoftGraphId } from '@/lib/security/input-validation' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/sharepoint/upload/route.ts b/apps/sim/app/api/tools/sharepoint/upload/route.ts index da9409098f..00a4c7633e 100644 --- a/apps/sim/app/api/tools/sharepoint/upload/route.ts +++ b/apps/sim/app/api/tools/sharepoint/upload/route.ts @@ -1,10 +1,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { processFilesToUserFiles } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/slack/add-reaction/route.ts b/apps/sim/app/api/tools/slack/add-reaction/route.ts index 00de3e2430..f6fba4a906 100644 --- a/apps/sim/app/api/tools/slack/add-reaction/route.ts +++ b/apps/sim/app/api/tools/slack/add-reaction/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/slack/channels/route.ts b/apps/sim/app/api/tools/slack/channels/route.ts index 6f171b495b..be572492b9 100644 --- a/apps/sim/app/api/tools/slack/channels/route.ts +++ b/apps/sim/app/api/tools/slack/channels/route.ts @@ -1,7 +1,7 @@ import { NextResponse } from 'next/server' import { authorizeCredentialUse } from '@/lib/auth/credential-access' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/slack/delete-message/route.ts b/apps/sim/app/api/tools/slack/delete-message/route.ts index eb1c202f23..02116bec52 100644 --- a/apps/sim/app/api/tools/slack/delete-message/route.ts +++ b/apps/sim/app/api/tools/slack/delete-message/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/slack/send-message/route.ts b/apps/sim/app/api/tools/slack/send-message/route.ts index a9f3b5f34c..9a82b6e5a7 100644 --- a/apps/sim/app/api/tools/slack/send-message/route.ts +++ b/apps/sim/app/api/tools/slack/send-message/route.ts @@ -1,10 +1,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { processFilesToUserFiles } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/slack/update-message/route.ts b/apps/sim/app/api/tools/slack/update-message/route.ts index 7eaab100ee..c40b6d34c0 100644 --- a/apps/sim/app/api/tools/slack/update-message/route.ts +++ b/apps/sim/app/api/tools/slack/update-message/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/sms/send/route.ts b/apps/sim/app/api/tools/sms/send/route.ts index e7fc14d7d5..d16a1c57c1 100644 --- a/apps/sim/app/api/tools/sms/send/route.ts +++ b/apps/sim/app/api/tools/sms/send/route.ts @@ -1,10 +1,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { type SMSOptions, sendSMS } from '@/lib/sms/service' -import { generateRequestId } from '@/lib/utils' +import { type SMSOptions, sendSMS } from '@/lib/messaging/sms/service' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/smtp/send/route.ts b/apps/sim/app/api/tools/smtp/send/route.ts index 49c4eb9b13..d20b27b328 100644 --- a/apps/sim/app/api/tools/smtp/send/route.ts +++ b/apps/sim/app/api/tools/smtp/send/route.ts @@ -2,10 +2,10 @@ import { type NextRequest, NextResponse } from 'next/server' import nodemailer from 'nodemailer' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { processFilesToUserFiles } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/stagehand/agent/route.ts b/apps/sim/app/api/tools/stagehand/agent/route.ts index 96d9b2e5e1..fc1ef7e7ea 100644 --- a/apps/sim/app/api/tools/stagehand/agent/route.ts +++ b/apps/sim/app/api/tools/stagehand/agent/route.ts @@ -1,7 +1,7 @@ import { Stagehand } from '@browserbasehq/stagehand' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' import { ensureZodObject, normalizeUrl } from '@/app/api/tools/stagehand/utils' diff --git a/apps/sim/app/api/tools/stagehand/extract/route.ts b/apps/sim/app/api/tools/stagehand/extract/route.ts index b7a07e636c..0ebdd9896c 100644 --- a/apps/sim/app/api/tools/stagehand/extract/route.ts +++ b/apps/sim/app/api/tools/stagehand/extract/route.ts @@ -1,7 +1,7 @@ import { Stagehand } from '@browserbasehq/stagehand' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' import { ensureZodObject, normalizeUrl } from '@/app/api/tools/stagehand/utils' diff --git a/apps/sim/app/api/tools/telegram/send-document/route.ts b/apps/sim/app/api/tools/telegram/send-document/route.ts index fc01b6a165..968b110785 100644 --- a/apps/sim/app/api/tools/telegram/send-document/route.ts +++ b/apps/sim/app/api/tools/telegram/send-document/route.ts @@ -1,10 +1,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { processFilesToUserFiles } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' -import { generateRequestId } from '@/lib/utils' import { convertMarkdownToHTML } from '@/tools/telegram/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/thinking/route.ts b/apps/sim/app/api/tools/thinking/route.ts index 02fd5fff75..97e41ff3eb 100644 --- a/apps/sim/app/api/tools/thinking/route.ts +++ b/apps/sim/app/api/tools/thinking/route.ts @@ -1,6 +1,6 @@ import { type NextRequest, NextResponse } from 'next/server' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import type { ThinkingToolParams, ThinkingToolResponse } from '@/tools/thinking/types' const logger = createLogger('ThinkingToolAPI') diff --git a/apps/sim/app/api/tools/vision/analyze/route.ts b/apps/sim/app/api/tools/vision/analyze/route.ts index e05d3f4146..ded0b5dc85 100644 --- a/apps/sim/app/api/tools/vision/analyze/route.ts +++ b/apps/sim/app/api/tools/vision/analyze/route.ts @@ -1,10 +1,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { processSingleFileToUserFile } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/wealthbox/item/route.ts b/apps/sim/app/api/tools/wealthbox/item/route.ts index 57ecac5baf..12c423fcd5 100644 --- a/apps/sim/app/api/tools/wealthbox/item/route.ts +++ b/apps/sim/app/api/tools/wealthbox/item/route.ts @@ -3,9 +3,9 @@ import { account } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { validateEnum, validatePathSegment } from '@/lib/core/security/input-validation' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { validateEnum, validatePathSegment } from '@/lib/security/input-validation' -import { generateRequestId } from '@/lib/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/wealthbox/items/route.ts b/apps/sim/app/api/tools/wealthbox/items/route.ts index 579cd90871..b8b7a514dd 100644 --- a/apps/sim/app/api/tools/wealthbox/items/route.ts +++ b/apps/sim/app/api/tools/wealthbox/items/route.ts @@ -3,8 +3,8 @@ import { account } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/user/super-user/route.ts b/apps/sim/app/api/user/super-user/route.ts index 9557c988d5..cc39943434 100644 --- a/apps/sim/app/api/user/super-user/route.ts +++ b/apps/sim/app/api/user/super-user/route.ts @@ -3,8 +3,8 @@ import { user } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('SuperUserAPI') diff --git a/apps/sim/app/api/users/me/api-keys/[id]/route.ts b/apps/sim/app/api/users/me/api-keys/[id]/route.ts index cbd093092e..fb5ea90e8d 100644 --- a/apps/sim/app/api/users/me/api-keys/[id]/route.ts +++ b/apps/sim/app/api/users/me/api-keys/[id]/route.ts @@ -3,8 +3,8 @@ import { apiKey } from '@sim/db/schema' import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('ApiKeyAPI') diff --git a/apps/sim/app/api/users/me/profile/route.ts b/apps/sim/app/api/users/me/profile/route.ts index 364ad230c1..7f6ebe1489 100644 --- a/apps/sim/app/api/users/me/profile/route.ts +++ b/apps/sim/app/api/users/me/profile/route.ts @@ -4,8 +4,8 @@ import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('UpdateUserProfileAPI') diff --git a/apps/sim/app/api/users/me/settings/route.ts b/apps/sim/app/api/users/me/settings/route.ts index 6a543f9bf0..1e93894631 100644 --- a/apps/sim/app/api/users/me/settings/route.ts +++ b/apps/sim/app/api/users/me/settings/route.ts @@ -5,8 +5,8 @@ import { nanoid } from 'nanoid' import { NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('UserSettingsAPI') diff --git a/apps/sim/app/api/users/me/settings/unsubscribe/route.ts b/apps/sim/app/api/users/me/settings/unsubscribe/route.ts index 99611f1eed..348802f529 100644 --- a/apps/sim/app/api/users/me/settings/unsubscribe/route.ts +++ b/apps/sim/app/api/users/me/settings/unsubscribe/route.ts @@ -1,15 +1,15 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' -import type { EmailType } from '@/lib/email/mailer' +import { generateRequestId } from '@/lib/core/utils/request' +import { createLogger } from '@/lib/logs/console/logger' +import type { EmailType } from '@/lib/messaging/email/mailer' import { getEmailPreferences, isTransactionalEmail, unsubscribeFromAll, updateEmailPreferences, verifyUnsubscribeToken, -} from '@/lib/email/unsubscribe' -import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' +} from '@/lib/messaging/email/unsubscribe' const logger = createLogger('UnsubscribeAPI') diff --git a/apps/sim/app/api/wand/route.ts b/apps/sim/app/api/wand/route.ts index 88cb8442c4..48f0dd7820 100644 --- a/apps/sim/app/api/wand/route.ts +++ b/apps/sim/app/api/wand/route.ts @@ -4,10 +4,10 @@ import { eq, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import OpenAI, { AzureOpenAI } from 'openai' import { checkAndBillOverageThreshold } from '@/lib/billing/threshold-billing' -import { env } from '@/lib/env' -import { getCostMultiplier, isBillingEnabled } from '@/lib/environment' +import { env } from '@/lib/core/config/env' +import { getCostMultiplier, isBillingEnabled } from '@/lib/core/config/environment' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { getModelPricing } from '@/providers/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/webhooks/[id]/route.ts b/apps/sim/app/api/webhooks/[id]/route.ts index cf3e1734a7..286472f25e 100644 --- a/apps/sim/app/api/webhooks/[id]/route.ts +++ b/apps/sim/app/api/webhooks/[id]/route.ts @@ -3,10 +3,10 @@ import { webhook, workflow } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { validateInteger } from '@/lib/core/security/input-validation' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { validateInteger } from '@/lib/security/input-validation' -import { generateRequestId } from '@/lib/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('WebhookAPI') @@ -277,7 +277,7 @@ export async function DELETE( const foundWebhook = webhookData.webhook - const { cleanupExternalWebhook } = await import('@/lib/webhooks/webhook-helpers') + const { cleanupExternalWebhook } = await import('@/lib/webhooks/provider-subscriptions') await cleanupExternalWebhook(foundWebhook, webhookData.workflow, requestId) await db.delete(webhook).where(eq(webhook.id, id)) diff --git a/apps/sim/app/api/webhooks/[id]/test-url/route.ts b/apps/sim/app/api/webhooks/[id]/test-url/route.ts index b844dc8d61..066c6b3cae 100644 --- a/apps/sim/app/api/webhooks/[id]/test-url/route.ts +++ b/apps/sim/app/api/webhooks/[id]/test-url/route.ts @@ -2,11 +2,11 @@ import { db, webhook, workflow } from '@sim/db' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { getBaseUrl } from '@/lib/urls/utils' -import { generateRequestId } from '@/lib/utils' import { signTestWebhookToken } from '@/lib/webhooks/test-tokens' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('MintWebhookTestUrlAPI') diff --git a/apps/sim/app/api/webhooks/cleanup/idempotency/route.ts b/apps/sim/app/api/webhooks/cleanup/idempotency/route.ts index de9a5f5543..0b6be60936 100644 --- a/apps/sim/app/api/webhooks/cleanup/idempotency/route.ts +++ b/apps/sim/app/api/webhooks/cleanup/idempotency/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { verifyCronAuth } from '@/lib/auth/internal' -import { cleanupExpiredIdempotencyKeys, getIdempotencyKeyStats } from '@/lib/idempotency' +import { cleanupExpiredIdempotencyKeys, getIdempotencyKeyStats } from '@/lib/core/idempotency' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('IdempotencyCleanupAPI') diff --git a/apps/sim/app/api/webhooks/poll/gmail/route.ts b/apps/sim/app/api/webhooks/poll/gmail/route.ts index c6fc45412d..d3b97ba306 100644 --- a/apps/sim/app/api/webhooks/poll/gmail/route.ts +++ b/apps/sim/app/api/webhooks/poll/gmail/route.ts @@ -1,8 +1,8 @@ import { nanoid } from 'nanoid' import { type NextRequest, NextResponse } from 'next/server' import { verifyCronAuth } from '@/lib/auth/internal' +import { acquireLock, releaseLock } from '@/lib/core/config/redis' import { createLogger } from '@/lib/logs/console/logger' -import { acquireLock, releaseLock } from '@/lib/redis' import { pollGmailWebhooks } from '@/lib/webhooks/gmail-polling-service' const logger = createLogger('GmailPollingAPI') diff --git a/apps/sim/app/api/webhooks/poll/outlook/route.ts b/apps/sim/app/api/webhooks/poll/outlook/route.ts index dbe01b8786..6ccde73c8b 100644 --- a/apps/sim/app/api/webhooks/poll/outlook/route.ts +++ b/apps/sim/app/api/webhooks/poll/outlook/route.ts @@ -1,8 +1,8 @@ import { nanoid } from 'nanoid' import { type NextRequest, NextResponse } from 'next/server' import { verifyCronAuth } from '@/lib/auth/internal' +import { acquireLock, releaseLock } from '@/lib/core/config/redis' import { createLogger } from '@/lib/logs/console/logger' -import { acquireLock, releaseLock } from '@/lib/redis' import { pollOutlookWebhooks } from '@/lib/webhooks/outlook-polling-service' const logger = createLogger('OutlookPollingAPI') diff --git a/apps/sim/app/api/webhooks/route.ts b/apps/sim/app/api/webhooks/route.ts index 53b8d0c820..b1ddfc4982 100644 --- a/apps/sim/app/api/webhooks/route.ts +++ b/apps/sim/app/api/webhooks/route.ts @@ -4,10 +4,10 @@ import { and, desc, eq } from 'drizzle-orm' import { nanoid } from 'nanoid' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { getBaseUrl } from '@/lib/urls/utils' -import { generateRequestId } from '@/lib/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' import { getOAuthToken } from '@/app/api/auth/oauth/utils' const logger = createLogger('WebhooksAPI') @@ -323,7 +323,7 @@ export async function POST(request: NextRequest) { } if (provider === 'microsoft-teams') { - const { createTeamsSubscription } = await import('@/lib/webhooks/webhook-helpers') + const { createTeamsSubscription } = await import('@/lib/webhooks/provider-subscriptions') logger.info(`[${requestId}] Creating Teams subscription before saving to database`) try { await createTeamsSubscription(request, createTempWebhookData(), workflowRecord, requestId) @@ -341,7 +341,7 @@ export async function POST(request: NextRequest) { } if (provider === 'telegram') { - const { createTelegramWebhook } = await import('@/lib/webhooks/webhook-helpers') + const { createTelegramWebhook } = await import('@/lib/webhooks/provider-subscriptions') logger.info(`[${requestId}] Creating Telegram webhook before saving to database`) try { await createTelegramWebhook(request, createTempWebhookData(), requestId) @@ -384,7 +384,7 @@ export async function POST(request: NextRequest) { } if (provider === 'typeform') { - const { createTypeformWebhook } = await import('@/lib/webhooks/webhook-helpers') + const { createTypeformWebhook } = await import('@/lib/webhooks/provider-subscriptions') logger.info(`[${requestId}] Creating Typeform webhook before saving to database`) try { const usedTag = await createTypeformWebhook(request, createTempWebhookData(), requestId) @@ -456,7 +456,7 @@ export async function POST(request: NextRequest) { if (externalSubscriptionCreated) { logger.error(`[${requestId}] DB save failed, cleaning up external subscription`, dbError) try { - const { cleanupExternalWebhook } = await import('@/lib/webhooks/webhook-helpers') + const { cleanupExternalWebhook } = await import('@/lib/webhooks/provider-subscriptions') await cleanupExternalWebhook(createTempWebhookData(), workflowRecord, requestId) } catch (cleanupError) { logger.error( diff --git a/apps/sim/app/api/webhooks/test/[id]/route.ts b/apps/sim/app/api/webhooks/test/[id]/route.ts index d4dda3b5c3..68f37a2792 100644 --- a/apps/sim/app/api/webhooks/test/[id]/route.ts +++ b/apps/sim/app/api/webhooks/test/[id]/route.ts @@ -1,6 +1,6 @@ import { type NextRequest, NextResponse } from 'next/server' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { checkWebhookPreprocessing, findWebhookAndWorkflow, diff --git a/apps/sim/app/api/webhooks/test/route.ts b/apps/sim/app/api/webhooks/test/route.ts index 3de2e19b1b..021dc670bd 100644 --- a/apps/sim/app/api/webhooks/test/route.ts +++ b/apps/sim/app/api/webhooks/test/route.ts @@ -2,9 +2,9 @@ import { db } from '@sim/db' import { webhook } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' +import { generateRequestId } from '@/lib/core/utils/request' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('WebhookTestAPI') 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 cbed4a68a8..6b9002bc49 100644 --- a/apps/sim/app/api/webhooks/trigger/[path]/route.test.ts +++ b/apps/sim/app/api/webhooks/trigger/[path]/route.test.ts @@ -159,7 +159,7 @@ vi.mock('@/services/queue', () => ({ }, })) -vi.mock('@/lib/workflows/db-helpers', () => ({ +vi.mock('@/lib/workflows/persistence/utils', () => ({ loadWorkflowFromNormalizedTables: vi.fn().mockResolvedValue({ blocks: {}, edges: [], diff --git a/apps/sim/app/api/webhooks/trigger/[path]/route.ts b/apps/sim/app/api/webhooks/trigger/[path]/route.ts index 26cd3bb882..b7ec7bafbe 100644 --- a/apps/sim/app/api/webhooks/trigger/[path]/route.ts +++ b/apps/sim/app/api/webhooks/trigger/[path]/route.ts @@ -1,6 +1,6 @@ import { type NextRequest, NextResponse } from 'next/server' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { checkWebhookPreprocessing, findWebhookAndWorkflow, @@ -9,7 +9,7 @@ import { queueWebhookExecution, verifyProviderAuth, } from '@/lib/webhooks/processor' -import { blockExistsInDeployment } from '@/lib/workflows/db-helpers' +import { blockExistsInDeployment } from '@/lib/workflows/persistence/utils' const logger = createLogger('WebhookTriggerAPI') diff --git a/apps/sim/app/api/workflows/[id]/autolayout/route.ts b/apps/sim/app/api/workflows/[id]/autolayout/route.ts index 57ca10e708..a08c82fb72 100644 --- a/apps/sim/app/api/workflows/[id]/autolayout/route.ts +++ b/apps/sim/app/api/workflows/[id]/autolayout/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { applyAutoLayout } from '@/lib/workflows/autolayout' import { DEFAULT_HORIZONTAL_SPACING, @@ -12,7 +12,7 @@ import { import { loadWorkflowFromNormalizedTables, type NormalizedWorkflowData, -} from '@/lib/workflows/db-helpers' +} from '@/lib/workflows/persistence/utils' import { getWorkflowAccessContext } from '@/lib/workflows/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/workflows/[id]/chat/status/route.ts b/apps/sim/app/api/workflows/[id]/chat/status/route.ts index 6bd8ccbc4c..21b3758a7b 100644 --- a/apps/sim/app/api/workflows/[id]/chat/status/route.ts +++ b/apps/sim/app/api/workflows/[id]/chat/status/route.ts @@ -1,8 +1,8 @@ import { db } from '@sim/db' import { chat } from '@sim/db/schema' import { eq } from 'drizzle-orm' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils' const logger = createLogger('ChatStatusAPI') diff --git a/apps/sim/app/api/workflows/[id]/deploy/route.ts b/apps/sim/app/api/workflows/[id]/deploy/route.ts index e3a4e23230..58a291ea26 100644 --- a/apps/sim/app/api/workflows/[id]/deploy/route.ts +++ b/apps/sim/app/api/workflows/[id]/deploy/route.ts @@ -1,9 +1,9 @@ import { db, workflow, workflowDeploymentVersion } from '@sim/db' import { and, desc, eq } from 'drizzle-orm' import type { NextRequest } from 'next/server' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' -import { deployWorkflow } from '@/lib/workflows/db-helpers' +import { deployWorkflow } from '@/lib/workflows/persistence/utils' import { validateWorkflowPermissions } from '@/lib/workflows/utils' import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils' @@ -52,7 +52,7 @@ export async function GET(request: NextRequest, { params }: { params: Promise<{ .limit(1) if (active?.state) { - const { loadWorkflowFromNormalizedTables } = await import('@/lib/workflows/db-helpers') + const { loadWorkflowFromNormalizedTables } = await import('@/lib/workflows/persistence/utils') const normalizedData = await loadWorkflowFromNormalizedTables(id) if (normalizedData) { const currentState = { @@ -171,7 +171,7 @@ export async function DELETE( // Track workflow undeployment try { - const { trackPlatformEvent } = await import('@/lib/telemetry/tracer') + const { trackPlatformEvent } = await import('@/lib/core/telemetry') trackPlatformEvent('platform.workflow.undeployed', { 'workflow.id': id, }) diff --git a/apps/sim/app/api/workflows/[id]/deployed/route.ts b/apps/sim/app/api/workflows/[id]/deployed/route.ts index b3afeeaa04..735b481e62 100644 --- a/apps/sim/app/api/workflows/[id]/deployed/route.ts +++ b/apps/sim/app/api/workflows/[id]/deployed/route.ts @@ -2,8 +2,8 @@ import { db, workflowDeploymentVersion } from '@sim/db' import { and, desc, eq } from 'drizzle-orm' import type { NextRequest, NextResponse } from 'next/server' import { verifyInternalToken } from '@/lib/auth/internal' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { validateWorkflowPermissions } from '@/lib/workflows/utils' import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils' diff --git a/apps/sim/app/api/workflows/[id]/deployments/[version]/activate/route.ts b/apps/sim/app/api/workflows/[id]/deployments/[version]/activate/route.ts index ceb51049d8..4961ec65d0 100644 --- a/apps/sim/app/api/workflows/[id]/deployments/[version]/activate/route.ts +++ b/apps/sim/app/api/workflows/[id]/deployments/[version]/activate/route.ts @@ -1,8 +1,8 @@ import { db, workflow, workflowDeploymentVersion } from '@sim/db' import { and, eq } from 'drizzle-orm' import type { NextRequest } from 'next/server' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { validateWorkflowPermissions } from '@/lib/workflows/utils' import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils' diff --git a/apps/sim/app/api/workflows/[id]/deployments/[version]/revert/route.ts b/apps/sim/app/api/workflows/[id]/deployments/[version]/revert/route.ts index 01c0e0705b..a3153290ca 100644 --- a/apps/sim/app/api/workflows/[id]/deployments/[version]/revert/route.ts +++ b/apps/sim/app/api/workflows/[id]/deployments/[version]/revert/route.ts @@ -1,10 +1,10 @@ import { db, workflow, workflowDeploymentVersion } from '@sim/db' import { and, eq } from 'drizzle-orm' import type { NextRequest } from 'next/server' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' -import { saveWorkflowToNormalizedTables } from '@/lib/workflows/db-helpers' +import { saveWorkflowToNormalizedTables } from '@/lib/workflows/persistence/utils' import { validateWorkflowPermissions } from '@/lib/workflows/utils' import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils' diff --git a/apps/sim/app/api/workflows/[id]/deployments/[version]/route.ts b/apps/sim/app/api/workflows/[id]/deployments/[version]/route.ts index 65783c9ff3..3206798d70 100644 --- a/apps/sim/app/api/workflows/[id]/deployments/[version]/route.ts +++ b/apps/sim/app/api/workflows/[id]/deployments/[version]/route.ts @@ -2,8 +2,8 @@ import { db, workflowDeploymentVersion } from '@sim/db' import { and, eq } from 'drizzle-orm' import type { NextRequest } from 'next/server' import { z } from 'zod' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { validateWorkflowPermissions } from '@/lib/workflows/utils' import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils' diff --git a/apps/sim/app/api/workflows/[id]/deployments/route.ts b/apps/sim/app/api/workflows/[id]/deployments/route.ts index cfa5c182e5..a74c015ffb 100644 --- a/apps/sim/app/api/workflows/[id]/deployments/route.ts +++ b/apps/sim/app/api/workflows/[id]/deployments/route.ts @@ -1,8 +1,8 @@ import { db, user, workflowDeploymentVersion } from '@sim/db' import { desc, eq } from 'drizzle-orm' import type { NextRequest } from 'next/server' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { validateWorkflowPermissions } from '@/lib/workflows/utils' import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils' diff --git a/apps/sim/app/api/workflows/[id]/duplicate/route.ts b/apps/sim/app/api/workflows/[id]/duplicate/route.ts index 20eacd7367..8e1bfe6497 100644 --- a/apps/sim/app/api/workflows/[id]/duplicate/route.ts +++ b/apps/sim/app/api/workflows/[id]/duplicate/route.ts @@ -1,9 +1,9 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' -import { duplicateWorkflow } from '@/lib/workflows/duplicate' +import { duplicateWorkflow } from '@/lib/workflows/persistence/duplicate' const logger = createLogger('WorkflowDuplicateAPI') diff --git a/apps/sim/app/api/workflows/[id]/execute/route.ts b/apps/sim/app/api/workflows/[id]/execute/route.ts index 0ac192b6a5..ada7b7c5be 100644 --- a/apps/sim/app/api/workflows/[id]/execute/route.ts +++ b/apps/sim/app/api/workflows/[id]/execute/route.ts @@ -2,19 +2,20 @@ import { type NextRequest, NextResponse } from 'next/server' import { validate as uuidValidate, v4 as uuidv4 } from 'uuid' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' +import { SSE_HEADERS } from '@/lib/core/utils/sse' import { processInputFileFields } from '@/lib/execution/files' import { preprocessExecution } from '@/lib/execution/preprocessing' import { createLogger } from '@/lib/logs/console/logger' import { LoggingSession } from '@/lib/logs/execution/logging-session' -import { generateRequestId, SSE_HEADERS } from '@/lib/utils' -import { - loadDeployedWorkflowState, - loadWorkflowFromNormalizedTables, -} from '@/lib/workflows/db-helpers' import { executeWorkflowCore } from '@/lib/workflows/executor/execution-core' import { type ExecutionEvent, encodeSSEEvent } from '@/lib/workflows/executor/execution-events' import { PauseResumeManager } from '@/lib/workflows/executor/human-in-the-loop-manager' -import { createStreamingResponse } from '@/lib/workflows/streaming' +import { + loadDeployedWorkflowState, + loadWorkflowFromNormalizedTables, +} from '@/lib/workflows/persistence/utils' +import { createStreamingResponse } from '@/lib/workflows/streaming/streaming' import { createHttpResponseFromBlock, workflowHasResponseBlock } from '@/lib/workflows/utils' import { type ExecutionMetadata, ExecutionSnapshot } from '@/executor/execution/snapshot' import type { StreamingExecution } from '@/executor/types' diff --git a/apps/sim/app/api/workflows/[id]/log-webhook/[webhookId]/route.ts b/apps/sim/app/api/workflows/[id]/log-webhook/[webhookId]/route.ts index db2100fda1..a957f62c90 100644 --- a/apps/sim/app/api/workflows/[id]/log-webhook/[webhookId]/route.ts +++ b/apps/sim/app/api/workflows/[id]/log-webhook/[webhookId]/route.ts @@ -4,8 +4,8 @@ import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { encryptSecret } from '@/lib/core/security/encryption' import { createLogger } from '@/lib/logs/console/logger' -import { encryptSecret } from '@/lib/utils' const logger = createLogger('WorkflowLogWebhookUpdate') diff --git a/apps/sim/app/api/workflows/[id]/log-webhook/route.ts b/apps/sim/app/api/workflows/[id]/log-webhook/route.ts index 5287effc7b..51f5bfbbd7 100644 --- a/apps/sim/app/api/workflows/[id]/log-webhook/route.ts +++ b/apps/sim/app/api/workflows/[id]/log-webhook/route.ts @@ -5,8 +5,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { v4 as uuidv4 } from 'uuid' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { encryptSecret } from '@/lib/core/security/encryption' import { createLogger } from '@/lib/logs/console/logger' -import { encryptSecret } from '@/lib/utils' const logger = createLogger('WorkflowLogWebhookAPI') diff --git a/apps/sim/app/api/workflows/[id]/log-webhook/test/route.ts b/apps/sim/app/api/workflows/[id]/log-webhook/test/route.ts index fdd9be09d9..44d93521c0 100644 --- a/apps/sim/app/api/workflows/[id]/log-webhook/test/route.ts +++ b/apps/sim/app/api/workflows/[id]/log-webhook/test/route.ts @@ -5,8 +5,8 @@ import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { v4 as uuidv4 } from 'uuid' import { getSession } from '@/lib/auth' +import { decryptSecret } from '@/lib/core/security/encryption' import { createLogger } from '@/lib/logs/console/logger' -import { decryptSecret } from '@/lib/utils' const logger = createLogger('WorkflowLogWebhookTestAPI') diff --git a/apps/sim/app/api/workflows/[id]/log/route.ts b/apps/sim/app/api/workflows/[id]/log/route.ts index 66936a3505..8b65b7012d 100644 --- a/apps/sim/app/api/workflows/[id]/log/route.ts +++ b/apps/sim/app/api/workflows/[id]/log/route.ts @@ -1,9 +1,9 @@ import type { NextRequest } from 'next/server' import { z } from 'zod' +import { generateRequestId } from '@/lib/core/utils/request' 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 { generateRequestId } from '@/lib/utils' import { validateWorkflowAccess } from '@/app/api/workflows/middleware' import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils' import type { ExecutionResult } from '@/executor/types' diff --git a/apps/sim/app/api/workflows/[id]/route.test.ts b/apps/sim/app/api/workflows/[id]/route.test.ts index c03d50baaf..f2412f32e4 100644 --- a/apps/sim/app/api/workflows/[id]/route.test.ts +++ b/apps/sim/app/api/workflows/[id]/route.test.ts @@ -30,7 +30,7 @@ describe('Workflow By ID API Route', () => { createLogger: vi.fn().mockReturnValue(mockLogger), })) - vi.doMock('@/lib/workflows/db-helpers', () => ({ + vi.doMock('@/lib/workflows/persistence/utils', () => ({ loadWorkflowFromNormalizedTables: vi.fn().mockResolvedValue(null), })) @@ -128,7 +128,7 @@ describe('Workflow By ID API Route', () => { isWorkspaceOwner: false, }) - vi.doMock('@/lib/workflows/db-helpers', () => ({ + vi.doMock('@/lib/workflows/persistence/utils', () => ({ loadWorkflowFromNormalizedTables: vi.fn().mockResolvedValue(mockNormalizedData), })) @@ -183,7 +183,7 @@ describe('Workflow By ID API Route', () => { isWorkspaceOwner: false, }) - vi.doMock('@/lib/workflows/db-helpers', () => ({ + vi.doMock('@/lib/workflows/persistence/utils', () => ({ loadWorkflowFromNormalizedTables: vi.fn().mockResolvedValue(mockNormalizedData), })) @@ -196,7 +196,7 @@ describe('Workflow By ID API Route', () => { isWorkspaceOwner: false, }) - vi.doMock('@/lib/permissions/utils', () => ({ + vi.doMock('@/lib/workspaces/permissions/utils', () => ({ getUserEntityPermissions: vi.fn().mockResolvedValue('read'), hasAdminPermission: vi.fn().mockResolvedValue(false), })) @@ -277,7 +277,7 @@ describe('Workflow By ID API Route', () => { isWorkspaceOwner: false, }) - vi.doMock('@/lib/workflows/db-helpers', () => ({ + vi.doMock('@/lib/workflows/persistence/utils', () => ({ loadWorkflowFromNormalizedTables: vi.fn().mockResolvedValue(mockNormalizedData), })) diff --git a/apps/sim/app/api/workflows/[id]/route.ts b/apps/sim/app/api/workflows/[id]/route.ts index 1b51895c46..8cf89b337a 100644 --- a/apps/sim/app/api/workflows/[id]/route.ts +++ b/apps/sim/app/api/workflows/[id]/route.ts @@ -6,10 +6,10 @@ import { z } from 'zod' import { authenticateApiKeyFromHeader, updateApiKeyLastUsed } from '@/lib/api-key/service' import { getSession } from '@/lib/auth' import { verifyInternalToken } from '@/lib/auth/internal' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' -import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/db-helpers' +import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/persistence/utils' import { getWorkflowAccessContext, getWorkflowById } from '@/lib/workflows/utils' const logger = createLogger('WorkflowByIdAPI') @@ -262,7 +262,7 @@ export async function DELETE( // Clean up external webhooks before deleting workflow try { - const { cleanupExternalWebhook } = await import('@/lib/webhooks/webhook-helpers') + const { cleanupExternalWebhook } = await import('@/lib/webhooks/provider-subscriptions') const webhooksToCleanup = await db .select({ webhook: webhook, diff --git a/apps/sim/app/api/workflows/[id]/state/route.ts b/apps/sim/app/api/workflows/[id]/state/route.ts index 9003f79812..0d85044b2b 100644 --- a/apps/sim/app/api/workflows/[id]/state/route.ts +++ b/apps/sim/app/api/workflows/[id]/state/route.ts @@ -4,19 +4,19 @@ import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' +import { extractAndPersistCustomTools } from '@/lib/workflows/persistence/custom-tools-persistence' +import { saveWorkflowToNormalizedTables } from '@/lib/workflows/persistence/utils' +import { sanitizeAgentToolsInBlocks } from '@/lib/workflows/sanitization/validation' import { calculateNextRunTime, generateCronExpression, getScheduleTimeValues, validateCronExpression, -} from '@/lib/schedules/utils' -import { generateRequestId } from '@/lib/utils' -import { extractAndPersistCustomTools } from '@/lib/workflows/custom-tools-persistence' -import { saveWorkflowToNormalizedTables } from '@/lib/workflows/db-helpers' +} from '@/lib/workflows/schedules/utils' import { getWorkflowAccessContext } from '@/lib/workflows/utils' -import { sanitizeAgentToolsInBlocks } from '@/lib/workflows/validation' import type { BlockState } from '@/stores/workflows/workflow/types' import { generateLoopBlocks, generateParallelBlocks } from '@/stores/workflows/workflow/utils' import { getTrigger } from '@/triggers' diff --git a/apps/sim/app/api/workflows/[id]/status/route.ts b/apps/sim/app/api/workflows/[id]/status/route.ts index 21b759c7d6..b25b21a6e8 100644 --- a/apps/sim/app/api/workflows/[id]/status/route.ts +++ b/apps/sim/app/api/workflows/[id]/status/route.ts @@ -1,9 +1,9 @@ import { db, workflowDeploymentVersion } from '@sim/db' import { and, desc, eq } from 'drizzle-orm' import type { NextRequest } from 'next/server' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' -import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/db-helpers' +import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/persistence/utils' import { hasWorkflowChanged } from '@/lib/workflows/utils' import { validateWorkflowAccess } from '@/app/api/workflows/middleware' import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils' diff --git a/apps/sim/app/api/workflows/[id]/variables/route.ts b/apps/sim/app/api/workflows/[id]/variables/route.ts index c4befb40fa..88f80ce05d 100644 --- a/apps/sim/app/api/workflows/[id]/variables/route.ts +++ b/apps/sim/app/api/workflows/[id]/variables/route.ts @@ -4,8 +4,8 @@ import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { getWorkflowAccessContext } from '@/lib/workflows/utils' import type { Variable } from '@/stores/panel/variables/types' diff --git a/apps/sim/app/api/workflows/middleware.ts b/apps/sim/app/api/workflows/middleware.ts index f23510ba19..5c1b941865 100644 --- a/apps/sim/app/api/workflows/middleware.ts +++ b/apps/sim/app/api/workflows/middleware.ts @@ -4,7 +4,7 @@ import { authenticateApiKeyFromHeader, updateApiKeyLastUsed, } from '@/lib/api-key/service' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' import { getWorkflowById } from '@/lib/workflows/utils' diff --git a/apps/sim/app/api/workflows/public/[id]/route.ts b/apps/sim/app/api/workflows/public/[id]/route.ts index b94c849b45..74b2d6d863 100644 --- a/apps/sim/app/api/workflows/public/[id]/route.ts +++ b/apps/sim/app/api/workflows/public/[id]/route.ts @@ -2,8 +2,8 @@ import { db } from '@sim/db' import { marketplace, workflow } from '@sim/db/schema' import { eq } from 'drizzle-orm' import type { NextRequest } from 'next/server' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils' const logger = createLogger('PublicWorkflowAPI') diff --git a/apps/sim/app/api/workflows/route.ts b/apps/sim/app/api/workflows/route.ts index d89af62d51..6b78495c55 100644 --- a/apps/sim/app/api/workflows/route.ts +++ b/apps/sim/app/api/workflows/route.ts @@ -4,9 +4,9 @@ import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { generateRequestId } from '@/lib/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' import { verifyWorkspaceMembership } from '@/app/api/workflows/utils' const logger = createLogger('WorkflowAPI') @@ -118,7 +118,7 @@ export async function POST(req: NextRequest) { logger.info(`[${requestId}] Creating workflow ${workflowId} for user ${session.user.id}`) - import('@/lib/telemetry/tracer') + import('@/lib/core/telemetry') .then(({ trackPlatformEvent }) => { trackPlatformEvent('platform.workflow.created', { 'workflow.id': workflowId, diff --git a/apps/sim/app/api/workflows/utils.ts b/apps/sim/app/api/workflows/utils.ts index 10478bcfda..348bedcb1e 100644 --- a/apps/sim/app/api/workflows/utils.ts +++ b/apps/sim/app/api/workflows/utils.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('WorkflowUtils') diff --git a/apps/sim/app/api/workflows/yaml/convert/route.ts b/apps/sim/app/api/workflows/yaml/convert/route.ts index a601a1eb2f..899585dfad 100644 --- a/apps/sim/app/api/workflows/yaml/convert/route.ts +++ b/apps/sim/app/api/workflows/yaml/convert/route.ts @@ -1,7 +1,7 @@ import { type NextRequest, NextResponse } from 'next/server' +import { simAgentClient } from '@/lib/copilot/client' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { simAgentClient } from '@/lib/sim-agent/client' -import { generateRequestId } from '@/lib/utils' import { getAllBlocks } from '@/blocks/registry' import type { BlockConfig } from '@/blocks/types' import { resolveOutputType } from '@/blocks/utils' diff --git a/apps/sim/app/api/workflows/yaml/export/route.ts b/apps/sim/app/api/workflows/yaml/export/route.ts index 284da1bf6e..4292e82d4d 100644 --- a/apps/sim/app/api/workflows/yaml/export/route.ts +++ b/apps/sim/app/api/workflows/yaml/export/route.ts @@ -3,11 +3,11 @@ import { workflow } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { simAgentClient } from '@/lib/copilot/client' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { simAgentClient } from '@/lib/sim-agent/client' -import { generateRequestId } from '@/lib/utils' -import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/db-helpers' +import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/persistence/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' import { getAllBlocks } from '@/blocks/registry' import type { BlockConfig } from '@/blocks/types' import { resolveOutputType } from '@/blocks/utils' diff --git a/apps/sim/app/api/workspaces/[id]/api-keys/[keyId]/route.ts b/apps/sim/app/api/workspaces/[id]/api-keys/[keyId]/route.ts index bca567aa50..34f9909295 100644 --- a/apps/sim/app/api/workspaces/[id]/api-keys/[keyId]/route.ts +++ b/apps/sim/app/api/workspaces/[id]/api-keys/[keyId]/route.ts @@ -4,9 +4,9 @@ import { and, eq, not } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { generateRequestId } from '@/lib/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('WorkspaceApiKeyAPI') diff --git a/apps/sim/app/api/workspaces/[id]/api-keys/route.ts b/apps/sim/app/api/workspaces/[id]/api-keys/route.ts index f6e82a658c..11d94cb0fd 100644 --- a/apps/sim/app/api/workspaces/[id]/api-keys/route.ts +++ b/apps/sim/app/api/workspaces/[id]/api-keys/route.ts @@ -6,9 +6,9 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { createApiKey, getApiKeyDisplayFormat } from '@/lib/api-key/auth' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { generateRequestId } from '@/lib/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('WorkspaceApiKeysAPI') diff --git a/apps/sim/app/api/workspaces/[id]/duplicate/route.ts b/apps/sim/app/api/workspaces/[id]/duplicate/route.ts index 0dbd33803c..1354bec588 100644 --- a/apps/sim/app/api/workspaces/[id]/duplicate/route.ts +++ b/apps/sim/app/api/workspaces/[id]/duplicate/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { duplicateWorkspace } from '@/lib/workspaces/duplicate' const logger = createLogger('WorkspaceDuplicateAPI') diff --git a/apps/sim/app/api/workspaces/[id]/environment/route.ts b/apps/sim/app/api/workspaces/[id]/environment/route.ts index 6ea1478ae2..8328cf19e1 100644 --- a/apps/sim/app/api/workspaces/[id]/environment/route.ts +++ b/apps/sim/app/api/workspaces/[id]/environment/route.ts @@ -4,9 +4,10 @@ import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { decryptSecret, encryptSecret } from '@/lib/core/security/encryption' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { decryptSecret, encryptSecret, generateRequestId } from '@/lib/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('WorkspaceEnvironmentAPI') diff --git a/apps/sim/app/api/workspaces/[id]/files/[fileId]/download/route.ts b/apps/sim/app/api/workspaces/[id]/files/[fileId]/download/route.ts index 59601f9e1e..f3719ab874 100644 --- a/apps/sim/app/api/workspaces/[id]/files/[fileId]/download/route.ts +++ b/apps/sim/app/api/workspaces/[id]/files/[fileId]/download/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { getWorkspaceFile } from '@/lib/uploads/contexts/workspace' -import { generateRequestId } from '@/lib/utils' import { verifyWorkspaceMembership } from '@/app/api/workflows/utils' export const dynamic = 'force-dynamic' @@ -40,7 +40,7 @@ export async function POST( return NextResponse.json({ error: 'File not found' }, { status: 404 }) } - const { getBaseUrl } = await import('@/lib/urls/utils') + const { getBaseUrl } = await import('@/lib/core/utils/urls') const serveUrl = `${getBaseUrl()}/api/files/serve/${encodeURIComponent(fileRecord.key)}?context=workspace` const viewerUrl = `${getBaseUrl()}/workspace/${workspaceId}/files/${fileId}/view` diff --git a/apps/sim/app/api/workspaces/[id]/files/[fileId]/route.ts b/apps/sim/app/api/workspaces/[id]/files/[fileId]/route.ts index 7b0d409402..cf00bd1dd4 100644 --- a/apps/sim/app/api/workspaces/[id]/files/[fileId]/route.ts +++ b/apps/sim/app/api/workspaces/[id]/files/[fileId]/route.ts @@ -1,9 +1,9 @@ import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' import { deleteWorkspaceFile } from '@/lib/uploads/contexts/workspace' -import { generateRequestId } from '@/lib/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/workspaces/[id]/files/route.ts b/apps/sim/app/api/workspaces/[id]/files/route.ts index 6c971246f9..7527081008 100644 --- a/apps/sim/app/api/workspaces/[id]/files/route.ts +++ b/apps/sim/app/api/workspaces/[id]/files/route.ts @@ -1,9 +1,9 @@ import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' import { listWorkspaceFiles, uploadWorkspaceFile } from '@/lib/uploads/contexts/workspace' -import { generateRequestId } from '@/lib/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' import { verifyWorkspaceMembership } from '@/app/api/workflows/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/workspaces/[id]/permissions/route.ts b/apps/sim/app/api/workspaces/[id]/permissions/route.ts index 72b754dd31..4c2e0dae3e 100644 --- a/apps/sim/app/api/workspaces/[id]/permissions/route.ts +++ b/apps/sim/app/api/workspaces/[id]/permissions/route.ts @@ -6,7 +6,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' import { createLogger } from '@/lib/logs/console/logger' -import { getUsersWithPermissions, hasWorkspaceAdminAccess } from '@/lib/permissions/utils' +import { + getUsersWithPermissions, + hasWorkspaceAdminAccess, +} from '@/lib/workspaces/permissions/utils' const logger = createLogger('WorkspacesPermissionsAPI') diff --git a/apps/sim/app/api/workspaces/[id]/route.ts b/apps/sim/app/api/workspaces/[id]/route.ts index 83e55a3606..5161915791 100644 --- a/apps/sim/app/api/workspaces/[id]/route.ts +++ b/apps/sim/app/api/workspaces/[id]/route.ts @@ -9,7 +9,7 @@ const logger = createLogger('WorkspaceByIdAPI') import { db } from '@sim/db' import { knowledgeBase, permissions, templates, workspace } from '@sim/db/schema' -import { getUserEntityPermissions } from '@/lib/permissions/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const patchWorkspaceSchema = z.object({ name: z.string().trim().min(1).optional(), diff --git a/apps/sim/app/api/workspaces/invitations/[invitationId]/route.test.ts b/apps/sim/app/api/workspaces/invitations/[invitationId]/route.test.ts index 1213c622a0..4616cf54bc 100644 --- a/apps/sim/app/api/workspaces/invitations/[invitationId]/route.test.ts +++ b/apps/sim/app/api/workspaces/invitations/[invitationId]/route.test.ts @@ -57,11 +57,11 @@ describe('Workspace Invitation [invitationId] API Route', () => { })) mockHasWorkspaceAdminAccess = vi.fn() - vi.doMock('@/lib/permissions/utils', () => ({ + vi.doMock('@/lib/workspaces/permissions/utils', () => ({ hasWorkspaceAdminAccess: mockHasWorkspaceAdminAccess, })) - vi.doMock('@/lib/env', () => { + vi.doMock('@/lib/core/config/env', () => { const mockEnv = { NEXT_PUBLIC_APP_URL: 'https://test.sim.ai', BILLING_ENABLED: false, @@ -385,10 +385,10 @@ describe('Workspace Invitation [invitationId] API Route', () => { vi.doMock('@/lib/auth', () => ({ getSession: vi.fn().mockResolvedValue({ user: mockUser }), })) - vi.doMock('@/lib/permissions/utils', () => ({ + vi.doMock('@/lib/workspaces/permissions/utils', () => ({ hasWorkspaceAdminAccess: vi.fn(), })) - vi.doMock('@/lib/env', () => { + vi.doMock('@/lib/core/config/env', () => { const mockEnv = { NEXT_PUBLIC_APP_URL: 'https://test.sim.ai', BILLING_ENABLED: false, diff --git a/apps/sim/app/api/workspaces/invitations/[invitationId]/route.ts b/apps/sim/app/api/workspaces/invitations/[invitationId]/route.ts index d9d2adead4..986a3efeef 100644 --- a/apps/sim/app/api/workspaces/invitations/[invitationId]/route.ts +++ b/apps/sim/app/api/workspaces/invitations/[invitationId]/route.ts @@ -12,11 +12,11 @@ import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { WorkspaceInvitationEmail } from '@/components/emails/workspace-invitation' import { getSession } from '@/lib/auth' -import { sendEmail } from '@/lib/email/mailer' -import { getFromEmailAddress } from '@/lib/email/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { hasWorkspaceAdminAccess } from '@/lib/permissions/utils' -import { getBaseUrl } from '@/lib/urls/utils' +import { sendEmail } from '@/lib/messaging/email/mailer' +import { getFromEmailAddress } from '@/lib/messaging/email/utils' +import { hasWorkspaceAdminAccess } from '@/lib/workspaces/permissions/utils' const logger = createLogger('WorkspaceInvitationAPI') diff --git a/apps/sim/app/api/workspaces/invitations/route.test.ts b/apps/sim/app/api/workspaces/invitations/route.test.ts index d27221b547..96370bf63d 100644 --- a/apps/sim/app/api/workspaces/invitations/route.test.ts +++ b/apps/sim/app/api/workspaces/invitations/route.test.ts @@ -87,7 +87,7 @@ describe('Workspace Invitations API Route', () => { WorkspaceInvitationEmail: vi.fn(), })) - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { RESEND_API_KEY: 'test-resend-key', NEXT_PUBLIC_APP_URL: 'https://test.sim.ai', @@ -96,7 +96,7 @@ describe('Workspace Invitations API Route', () => { }, })) - vi.doMock('@/lib/urls/utils', () => ({ + vi.doMock('@/lib/core/utils/urls', () => ({ getEmailDomain: vi.fn().mockReturnValue('sim.ai'), })) diff --git a/apps/sim/app/api/workspaces/invitations/route.ts b/apps/sim/app/api/workspaces/invitations/route.ts index 99b89f2b73..62cfff3d97 100644 --- a/apps/sim/app/api/workspaces/invitations/route.ts +++ b/apps/sim/app/api/workspaces/invitations/route.ts @@ -13,10 +13,10 @@ import { and, eq, inArray } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { WorkspaceInvitationEmail } from '@/components/emails/workspace-invitation' import { getSession } from '@/lib/auth' -import { sendEmail } from '@/lib/email/mailer' -import { getFromEmailAddress } from '@/lib/email/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' +import { sendEmail } from '@/lib/messaging/email/mailer' +import { getFromEmailAddress } from '@/lib/messaging/email/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/workspaces/members/[id]/route.ts b/apps/sim/app/api/workspaces/members/[id]/route.ts index e9816320c2..b835d89336 100644 --- a/apps/sim/app/api/workspaces/members/[id]/route.ts +++ b/apps/sim/app/api/workspaces/members/[id]/route.ts @@ -5,7 +5,7 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' import { createLogger } from '@/lib/logs/console/logger' -import { hasWorkspaceAdminAccess } from '@/lib/permissions/utils' +import { hasWorkspaceAdminAccess } from '@/lib/workspaces/permissions/utils' const logger = createLogger('WorkspaceMemberAPI') const deleteMemberSchema = z.object({ diff --git a/apps/sim/app/api/workspaces/route.ts b/apps/sim/app/api/workspaces/route.ts index dacadd8ce3..b052d60495 100644 --- a/apps/sim/app/api/workspaces/route.ts +++ b/apps/sim/app/api/workspaces/route.ts @@ -5,8 +5,8 @@ import { NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' import { createLogger } from '@/lib/logs/console/logger' -import { saveWorkflowToNormalizedTables } from '@/lib/workflows/db-helpers' import { buildDefaultWorkflowArtifacts } from '@/lib/workflows/defaults' +import { saveWorkflowToNormalizedTables } from '@/lib/workflows/persistence/utils' const logger = createLogger('Workspaces') diff --git a/apps/sim/app/api/yaml/autolayout/route.ts b/apps/sim/app/api/yaml/autolayout/route.ts index 02855a4b6b..3361813854 100644 --- a/apps/sim/app/api/yaml/autolayout/route.ts +++ b/apps/sim/app/api/yaml/autolayout/route.ts @@ -1,7 +1,7 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { applyAutoLayout } from '@/lib/workflows/autolayout' import { DEFAULT_HORIZONTAL_SPACING, diff --git a/apps/sim/app/chat/[identifier]/chat.tsx b/apps/sim/app/chat/[identifier]/chat.tsx index d0524e8ef2..fe63fbf18f 100644 --- a/apps/sim/app/chat/[identifier]/chat.tsx +++ b/apps/sim/app/chat/[identifier]/chat.tsx @@ -2,8 +2,8 @@ import { type RefObject, useCallback, useEffect, useRef, useState } from 'react' import { v4 as uuidv4 } from 'uuid' +import { noop } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { noop } from '@/lib/utils' import { getFormattedGitHubStars } from '@/app/(landing)/actions/github' import { ChatErrorState, diff --git a/apps/sim/app/chat/components/auth/email/email-auth.tsx b/apps/sim/app/chat/components/auth/email/email-auth.tsx index d8161e5b33..63281b454e 100644 --- a/apps/sim/app/chat/components/auth/email/email-auth.tsx +++ b/apps/sim/app/chat/components/auth/email/email-auth.tsx @@ -6,9 +6,9 @@ import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { InputOTP, InputOTPGroup, InputOTPSlot } from '@/components/ui/input-otp' import { Label } from '@/components/ui/label' -import { quickValidateEmail } from '@/lib/email/validation' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' +import { quickValidateEmail } from '@/lib/messaging/email/validation' import { inter } from '@/app/_styles/fonts/inter/inter' import { soehne } from '@/app/_styles/fonts/soehne/soehne' import Nav from '@/app/(landing)/components/nav/nav' diff --git a/apps/sim/app/chat/components/auth/password/password-auth.tsx b/apps/sim/app/chat/components/auth/password/password-auth.tsx index 5820ceefcb..e132e9562b 100644 --- a/apps/sim/app/chat/components/auth/password/password-auth.tsx +++ b/apps/sim/app/chat/components/auth/password/password-auth.tsx @@ -5,8 +5,8 @@ import { Eye, EyeOff } from 'lucide-react' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { inter } from '@/app/_styles/fonts/inter/inter' import { soehne } from '@/app/_styles/fonts/soehne/soehne' import Nav from '@/app/(landing)/components/nav/nav' diff --git a/apps/sim/app/chat/components/auth/sso/sso-auth.tsx b/apps/sim/app/chat/components/auth/sso/sso-auth.tsx index 80da21f5d8..fca79215f7 100644 --- a/apps/sim/app/chat/components/auth/sso/sso-auth.tsx +++ b/apps/sim/app/chat/components/auth/sso/sso-auth.tsx @@ -5,9 +5,9 @@ import { useRouter } from 'next/navigation' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' -import { quickValidateEmail } from '@/lib/email/validation' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' +import { quickValidateEmail } from '@/lib/messaging/email/validation' import { inter } from '@/app/_styles/fonts/inter/inter' import { soehne } from '@/app/_styles/fonts/soehne/soehne' import Nav from '@/app/(landing)/components/nav/nav' diff --git a/apps/sim/app/chat/components/voice-interface/voice-interface.tsx b/apps/sim/app/chat/components/voice-interface/voice-interface.tsx index 96c2300a10..a4f2ad095e 100644 --- a/apps/sim/app/chat/components/voice-interface/voice-interface.tsx +++ b/apps/sim/app/chat/components/voice-interface/voice-interface.tsx @@ -3,8 +3,8 @@ import { type RefObject, useCallback, useEffect, useRef, useState } from 'react' import { Mic, MicOff, Phone } from 'lucide-react' import { Button } from '@/components/ui/button' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { ParticlesVisualization } from '@/app/chat/components/voice-interface/components/particles' const logger = createLogger('VoiceInterface') diff --git a/apps/sim/app/invite/[id]/invite.tsx b/apps/sim/app/invite/[id]/invite.tsx index f82b7fa218..8283acd40e 100644 --- a/apps/sim/app/invite/[id]/invite.tsx +++ b/apps/sim/app/invite/[id]/invite.tsx @@ -2,7 +2,7 @@ import { useEffect, useState } from 'react' import { useParams, useRouter, useSearchParams } from 'next/navigation' -import { client, useSession } from '@/lib/auth-client' +import { client, useSession } from '@/lib/auth/auth-client' import { createLogger } from '@/lib/logs/console/logger' import { getErrorMessage } from '@/app/invite/[id]/utils' import { InviteLayout, InviteStatusCard } from '@/app/invite/components' diff --git a/apps/sim/app/page.tsx b/apps/sim/app/page.tsx index 1a6df40d40..74c2236e6b 100644 --- a/apps/sim/app/page.tsx +++ b/apps/sim/app/page.tsx @@ -1,5 +1,5 @@ import type { Metadata } from 'next' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' import Landing from '@/app/(landing)/landing' const baseUrl = getBaseUrl() diff --git a/apps/sim/app/sitemap.ts b/apps/sim/app/sitemap.ts index cd06767a9b..1f4d4e8a72 100644 --- a/apps/sim/app/sitemap.ts +++ b/apps/sim/app/sitemap.ts @@ -1,6 +1,6 @@ import type { MetadataRoute } from 'next' import { getAllPostMeta } from '@/lib/blog/registry' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' export default async function sitemap(): Promise { const baseUrl = getBaseUrl() diff --git a/apps/sim/app/templates/[id]/template.tsx b/apps/sim/app/templates/[id]/template.tsx index 881141e6af..2f3ff23f15 100644 --- a/apps/sim/app/templates/[id]/template.tsx +++ b/apps/sim/app/templates/[id]/template.tsx @@ -30,11 +30,11 @@ import { DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' import { VerifiedBadge } from '@/components/ui/verified-badge' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' +import { cn } from '@/lib/core/utils/cn' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' -import { cn } from '@/lib/utils' -import type { CredentialRequirement } from '@/lib/workflows/credential-extractor' +import type { CredentialRequirement } from '@/lib/workflows/credentials/credential-extractor' import { WorkflowPreview } from '@/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview' import { getBlock } from '@/blocks/registry' import { useStarTemplate, useTemplate } from '@/hooks/queries/templates' diff --git a/apps/sim/app/templates/components/template-card.tsx b/apps/sim/app/templates/components/template-card.tsx index 1731cc97f1..67b8bf71d9 100644 --- a/apps/sim/app/templates/components/template-card.tsx +++ b/apps/sim/app/templates/components/template-card.tsx @@ -2,8 +2,8 @@ import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react' import { Star, User } from 'lucide-react' import { useParams, useRouter } from 'next/navigation' import { VerifiedBadge } from '@/components/ui/verified-badge' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { WorkflowPreview } from '@/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview' import { getBlock } from '@/blocks/registry' import { useStarTemplate } from '@/hooks/queries/templates' diff --git a/apps/sim/app/templates/templates.tsx b/apps/sim/app/templates/templates.tsx index 75b4e5905a..d6e23222cf 100644 --- a/apps/sim/app/templates/templates.tsx +++ b/apps/sim/app/templates/templates.tsx @@ -6,7 +6,7 @@ import { useRouter } from 'next/navigation' import { Button } from '@/components/emcn' import { Input } from '@/components/ui/input' import { createLogger } from '@/lib/logs/console/logger' -import type { CredentialRequirement } from '@/lib/workflows/credential-extractor' +import type { CredentialRequirement } from '@/lib/workflows/credentials/credential-extractor' import type { CreatorProfileDetails } from '@/app/_types/creator-profile' import { TemplateCard, TemplateCardSkeleton } from '@/app/templates/components/template-card' import { useDebounce } from '@/hooks/use-debounce' diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/action-bar/action-bar.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/action-bar/action-bar.tsx index efca6929af..74c0c5b5e9 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/action-bar/action-bar.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/action-bar/action-bar.tsx @@ -2,7 +2,7 @@ import { motion } from 'framer-motion' import { Circle, CircleOff, Trash2 } from 'lucide-react' import { Tooltip } from '@/components/emcn' import { Button } from '@/components/ui/button' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider' interface ActionBarProps { diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/components/document-tag-entry/document-tag-entry.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/components/document-tag-entry/document-tag-entry.tsx index a784bf23e1..4026f93fc2 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/components/document-tag-entry/document-tag-entry.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/components/document-tag-entry/document-tag-entry.tsx @@ -22,7 +22,7 @@ import { SelectTrigger, SelectValue, } from '@/components/ui' -import { MAX_TAG_SLOTS, type TagSlot } from '@/lib/knowledge/consts' +import { MAX_TAG_SLOTS, type TagSlot } from '@/lib/knowledge/constants' import { createLogger } from '@/lib/logs/console/logger' import { useKnowledgeBaseTagDefinitions } from '@/hooks/use-knowledge-base-tag-definitions' import { useNextAvailableSlot } from '@/hooks/use-next-available-slot' diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/components/primary-button/primary-button.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/components/primary-button/primary-button.tsx index a27a42d6c1..847c6daa4b 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/components/primary-button/primary-button.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/components/primary-button/primary-button.tsx @@ -1,7 +1,7 @@ 'use client' import { Button } from '@/components/emcn' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' interface PrimaryButtonProps { children: React.ReactNode diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/components/tag-input/tag-input.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/components/tag-input/tag-input.tsx index adfdb2956c..a104c287b1 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/components/tag-input/tag-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/components/tag-input/tag-input.tsx @@ -6,7 +6,7 @@ import { Button } from '@/components/ui/button' import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' -import { TAG_SLOTS, type TagSlot } from '@/lib/knowledge/consts' +import { TAG_SLOTS, type TagSlot } from '@/lib/knowledge/constants' import { useKnowledgeBaseTagDefinitions } from '@/hooks/use-knowledge-base-tag-definitions' export type TagData = { diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/dashboard/controls.tsx b/apps/sim/app/workspace/[workspaceId]/logs/components/dashboard/controls.tsx index 57962e59f5..7456240e0b 100644 --- a/apps/sim/app/workspace/[workspaceId]/logs/components/dashboard/controls.tsx +++ b/apps/sim/app/workspace/[workspaceId]/logs/components/dashboard/controls.tsx @@ -2,7 +2,7 @@ import type { ReactNode } from 'react' import { ArrowUp, Loader2, RefreshCw, Search } from 'lucide-react' import { Button, Tooltip } from '@/components/emcn' import { Input } from '@/components/ui/input' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { soehne } from '@/app/_styles/fonts/soehne/soehne' import Timeline from '@/app/workspace/[workspaceId]/logs/components/filters/components/timeline' diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/dashboard/workflow-details.tsx b/apps/sim/app/workspace/[workspaceId]/logs/components/dashboard/workflow-details.tsx index eb7c302b7b..1904f5d92b 100644 --- a/apps/sim/app/workspace/[workspaceId]/logs/components/dashboard/workflow-details.tsx +++ b/apps/sim/app/workspace/[workspaceId]/logs/components/dashboard/workflow-details.tsx @@ -7,7 +7,7 @@ import 'prismjs/components/prism-javascript' import 'prismjs/components/prism-python' import 'prismjs/components/prism-json' import { CopyButton } from '@/components/ui/copy-button' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import LineChart, { type LineChartPoint, } from '@/app/workspace/[workspaceId]/logs/components/dashboard/line-chart' 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 eb74bdc68b..5551c2f37b 100644 --- a/apps/sim/app/workspace/[workspaceId]/logs/components/filters/filters.tsx +++ b/apps/sim/app/workspace/[workspaceId]/logs/components/filters/filters.tsx @@ -2,8 +2,8 @@ import { TimerOff } from 'lucide-react' import { Button } from '@/components/emcn' -import { isProd } from '@/lib/environment' -import { getSubscriptionStatus } from '@/lib/subscription/helpers' +import { getSubscriptionStatus } from '@/lib/billing/client/utils' +import { isProd } from '@/lib/core/config/environment' import { FilterSection, FolderFilter, 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 c35c5135d1..40c1db6c9d 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 @@ -5,7 +5,7 @@ import { Maximize2, Minimize2, X } from 'lucide-react' import { Button } from '@/components/emcn' import { Badge } from '@/components/ui/badge' import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { FrozenCanvas } from '@/app/workspace/[workspaceId]/logs/components/frozen-canvas/frozen-canvas' interface FrozenCanvasModalProps { diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/frozen-canvas/frozen-canvas.tsx b/apps/sim/app/workspace/[workspaceId]/logs/components/frozen-canvas/frozen-canvas.tsx index 312de84b72..05220d130e 100644 --- a/apps/sim/app/workspace/[workspaceId]/logs/components/frozen-canvas/frozen-canvas.tsx +++ b/apps/sim/app/workspace/[workspaceId]/logs/components/frozen-canvas/frozen-canvas.tsx @@ -17,8 +17,9 @@ import { } from 'lucide-react' import { Badge } from '@/components/ui/badge' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' +import { redactApiKeys } from '@/lib/core/security/redaction' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn, redactApiKeys } from '@/lib/utils' import { WorkflowPreview } from '@/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview' import type { WorkflowState } from '@/stores/workflows/workflow/types' diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/search/search.tsx b/apps/sim/app/workspace/[workspaceId]/logs/components/search/search.tsx index 25b37bcf55..21a5fe77f2 100644 --- a/apps/sim/app/workspace/[workspaceId]/logs/components/search/search.tsx +++ b/apps/sim/app/workspace/[workspaceId]/logs/components/search/search.tsx @@ -4,6 +4,7 @@ import { useEffect, useMemo, useState } from 'react' import { Search, X } from 'lucide-react' import { useParams } from 'next/navigation' import { Button, Popover, PopoverAnchor, PopoverContent } from '@/components/emcn' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' import { getIntegrationMetadata } from '@/lib/logs/get-trigger-options' import { type ParsedFilter, parseQuery } from '@/lib/logs/query-parser' @@ -13,7 +14,6 @@ import { type TriggerData, type WorkflowData, } from '@/lib/logs/search-suggestions' -import { cn } from '@/lib/utils' import { useSearchState } from '@/app/workspace/[workspaceId]/logs/hooks/use-search-state' import { useFolderStore } from '@/stores/folders/store' import { useWorkflowRegistry } from '@/stores/workflows/registry/store' 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 83151c99a3..070dae34f9 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 @@ -3,7 +3,7 @@ import { useMemo, 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 { cn } from '@/lib/core/utils/cn' import type { ToolCall, ToolCallMetadata } from '@/stores/logs/filters/types' interface ToolCallsDisplayProps { diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/trace-spans/components/trace-span-item.tsx b/apps/sim/app/workspace/[workspaceId]/logs/components/trace-spans/components/trace-span-item.tsx index fd444d4823..59ccd4d54d 100644 --- a/apps/sim/app/workspace/[workspaceId]/logs/components/trace-spans/components/trace-span-item.tsx +++ b/apps/sim/app/workspace/[workspaceId]/logs/components/trace-spans/components/trace-span-item.tsx @@ -10,7 +10,7 @@ import { ConditionalIcon, ConnectIcon, } from '@/components/icons' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { CollapsibleInputOutput, normalizeChildWorkflowSpan, diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/trace-spans/utils.ts b/apps/sim/app/workspace/[workspaceId]/logs/components/trace-spans/utils.ts index 2a339dad87..3342f57f63 100644 --- a/apps/sim/app/workspace/[workspaceId]/logs/components/trace-spans/utils.ts +++ b/apps/sim/app/workspace/[workspaceId]/logs/components/trace-spans/utils.ts @@ -1,4 +1,4 @@ -import { redactApiKeys } from '@/lib/utils' +import { redactApiKeys } from '@/lib/core/security/redaction' import type { TraceSpan } from '@/stores/logs/filters/types' export function getSpanKey(span: TraceSpan): string { diff --git a/apps/sim/app/workspace/[workspaceId]/logs/logs.tsx b/apps/sim/app/workspace/[workspaceId]/logs/logs.tsx index 0738cd6153..b8ef9d1a80 100644 --- a/apps/sim/app/workspace/[workspaceId]/logs/logs.tsx +++ b/apps/sim/app/workspace/[workspaceId]/logs/logs.tsx @@ -4,9 +4,9 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { AlertCircle, ArrowUpRight, Info, Loader2 } from 'lucide-react' import Link from 'next/link' import { useParams } from 'next/navigation' +import { cn } from '@/lib/core/utils/cn' import { getIntegrationMetadata } from '@/lib/logs/get-trigger-options' import { parseQuery, queryToApiParams } from '@/lib/logs/query-parser' -import { cn } from '@/lib/utils' import Controls from '@/app/workspace/[workspaceId]/logs/components/dashboard/controls' import { AutocompleteSearch } from '@/app/workspace/[workspaceId]/logs/components/search/search' import { Sidebar } from '@/app/workspace/[workspaceId]/logs/components/sidebar/sidebar' diff --git a/apps/sim/app/workspace/[workspaceId]/providers/settings-loader.tsx b/apps/sim/app/workspace/[workspaceId]/providers/settings-loader.tsx index 4187e216f3..705d8993b1 100644 --- a/apps/sim/app/workspace/[workspaceId]/providers/settings-loader.tsx +++ b/apps/sim/app/workspace/[workspaceId]/providers/settings-loader.tsx @@ -1,7 +1,7 @@ 'use client' import { useEffect, useRef } from 'react' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' import { useGeneralSettings } from '@/hooks/queries/general-settings' /** diff --git a/apps/sim/app/workspace/[workspaceId]/templates/components/navigation-tabs.tsx b/apps/sim/app/workspace/[workspaceId]/templates/components/navigation-tabs.tsx index f3a6271f10..82d87bc008 100644 --- a/apps/sim/app/workspace/[workspaceId]/templates/components/navigation-tabs.tsx +++ b/apps/sim/app/workspace/[workspaceId]/templates/components/navigation-tabs.tsx @@ -1,4 +1,4 @@ -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' interface NavigationTab { id: string diff --git a/apps/sim/app/workspace/[workspaceId]/templates/components/template-card.tsx b/apps/sim/app/workspace/[workspaceId]/templates/components/template-card.tsx index c8ce068b90..d0f0bead47 100644 --- a/apps/sim/app/workspace/[workspaceId]/templates/components/template-card.tsx +++ b/apps/sim/app/workspace/[workspaceId]/templates/components/template-card.tsx @@ -2,8 +2,8 @@ import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react' import { Star, User } from 'lucide-react' import { useParams, useRouter } from 'next/navigation' import { VerifiedBadge } from '@/components/ui/verified-badge' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { WorkflowPreview } from '@/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview' import { getBlock } from '@/blocks/registry' import { useStarTemplate } from '@/hooks/queries/templates' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/chat/chat.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/chat/chat.tsx index 35c9dd7e2a..ae4e71ae27 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/chat/chat.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/chat/chat.tsx @@ -13,16 +13,16 @@ import { PopoverTrigger, Trash, } from '@/components/emcn' -import { useSession } from '@/lib/auth-client' -import { createLogger } from '@/lib/logs/console/logger' +import { useSession } from '@/lib/auth/auth-client' +import { cn } from '@/lib/core/utils/cn' import { extractBlockIdFromOutputId, extractPathFromOutputId, parseOutputContentSafely, -} from '@/lib/response-format' -import { cn } from '@/lib/utils' +} from '@/lib/core/utils/response-format' +import { createLogger } from '@/lib/logs/console/logger' import { normalizeInputFormatValue } from '@/lib/workflows/input-format-utils' -import { StartBlockPath, TriggerUtils } from '@/lib/workflows/triggers' +import { StartBlockPath, TriggerUtils } from '@/lib/workflows/triggers/triggers' import { START_BLOCK_RESERVED_FIELDS } from '@/lib/workflows/types' import { ChatMessage, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/chat/components/output-select/output-select.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/chat/components/output-select/output-select.tsx index cceeb25145..239ee18963 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/chat/components/output-select/output-select.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/chat/components/output-select/output-select.tsx @@ -10,7 +10,10 @@ import { PopoverSection, PopoverTrigger, } from '@/components/emcn' -import { extractFieldsFromSchema, parseResponseFormatSafely } from '@/lib/response-format' +import { + extractFieldsFromSchema, + parseResponseFormatSafely, +} from '@/lib/core/utils/response-format' import { getBlock } from '@/blocks' import { useWorkflowDiffStore } from '@/stores/workflow-diff/store' import { useSubBlockStore } from '@/stores/workflows/subblock/store' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/command-list/command-list.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/command-list/command-list.tsx index 3df6b2f7c2..22ccc5b9ae 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/command-list/command-list.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/command-list/command-list.tsx @@ -6,8 +6,8 @@ import Image from 'next/image' import { useParams, useRouter } from 'next/navigation' import { Button } from '@/components/emcn' import { AgentIcon } from '@/components/icons' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { useSearchModalStore } from '@/stores/search-modal/store' const logger = createLogger('WorkflowCommandList') diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/cursors/cursors.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/cursors/cursors.tsx index 49b76fed27..a7c46d8a0a 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/cursors/cursors.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/cursors/cursors.tsx @@ -2,7 +2,7 @@ import { memo, useMemo } from 'react' import { useViewport } from 'reactflow' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' import { getUserColor } from '@/app/workspace/[workspaceId]/w/utils/get-user-color' import { useSocket } from '@/app/workspace/providers/socket-provider' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/note-block/note-block.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/note-block/note-block.tsx index 7e134e3900..9e5e870f3e 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/note-block/note-block.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/note-block/note-block.tsx @@ -2,7 +2,7 @@ import { memo, useCallback, useMemo } from 'react' import ReactMarkdown from 'react-markdown' import type { NodeProps } from 'reactflow' import remarkGfm from 'remark-gfm' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider' import { useBlockCore } from '@/app/workspace/[workspaceId]/w/[workflowId]/hooks' import { diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/inline-tool-call/inline-tool-call.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/inline-tool-call/inline-tool-call.tsx index 270775c386..c43ae69edc 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/inline-tool-call/inline-tool-call.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/inline-tool-call/inline-tool-call.tsx @@ -8,7 +8,7 @@ import { GoogleDriveIcon } from '@/components/icons' import { ClientToolCallState } from '@/lib/copilot/tools/client/base-tool' import { getClientTool } from '@/lib/copilot/tools/client/manager' import { getRegisteredTools } from '@/lib/copilot/tools/client/registry' -import { getEnv } from '@/lib/env' +import { getEnv } from '@/lib/core/config/env' import { CLASS_TOOL_METADATA, useCopilotStore } from '@/stores/panel/copilot/store' import type { CopilotToolCall } from '@/stores/panel/copilot/types' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/plan-mode-section/plan-mode-section.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/plan-mode-section/plan-mode-section.tsx index b9031f9bbe..23f016823f 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/plan-mode-section/plan-mode-section.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/plan-mode-section/plan-mode-section.tsx @@ -29,7 +29,7 @@ import { Check, GripHorizontal, Pencil, X } from 'lucide-react' import { Button } from '@/components/emcn' import { Trash } from '@/components/emcn/icons/trash' import { Textarea } from '@/components/ui' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import CopilotMarkdownRenderer from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/copilot-message/components/markdown-renderer' /** diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/todo-list/todo-list.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/todo-list/todo-list.tsx index a5a173db62..26a7e417b1 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/todo-list/todo-list.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/todo-list/todo-list.tsx @@ -3,7 +3,7 @@ import { memo, useEffect, useState } from 'react' import { Check, ChevronDown, ChevronRight, Loader2, X } from 'lucide-react' import { Button } from '@/components/emcn' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' /** * Represents a single todo item diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/components/mode-selector/mode-selector.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/components/mode-selector/mode-selector.tsx index 03f1c6e4eb..c6cc61ad29 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/components/mode-selector/mode-selector.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/components/mode-selector/mode-selector.tsx @@ -10,7 +10,7 @@ import { PopoverItem, PopoverScrollArea, } from '@/components/emcn' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' interface ModeSelectorProps { /** Current mode - 'ask', 'build', or 'plan' */ diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/user-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/user-input.tsx index 3e203a5085..2176d22e3e 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/user-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/user-input.tsx @@ -13,9 +13,9 @@ import { useParams } from 'next/navigation' import { createPortal } from 'react-dom' import { Badge, Button } from '@/components/emcn' import { Textarea } from '@/components/ui' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { AttachedFilesDisplay, ContextPills, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/hooks/use-landing-prompt.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/hooks/use-landing-prompt.ts index 783a938aa5..be11cba04d 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/hooks/use-landing-prompt.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/hooks/use-landing-prompt.ts @@ -1,7 +1,7 @@ 'use client' import { useEffect, useRef } from 'react' -import { LandingPromptStorage } from '@/lib/browser-storage' +import { LandingPromptStorage } from '@/lib/core/utils/browser-storage' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('useLandingPrompt') diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/auth-selector.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/auth-selector.tsx index 1bd5d72c26..f5080afef4 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/auth-selector.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/auth-selector.tsx @@ -3,8 +3,9 @@ import { Check, Copy, Eye, EyeOff, Plus, RefreshCw } from 'lucide-react' import { Button, Input, Label } from '@/components/emcn' import { Trash } from '@/components/emcn/icons/trash' import { Card, CardContent } from '@/components/ui' -import { getEnv, isTruthy } from '@/lib/env' -import { cn, generatePassword } from '@/lib/utils' +import { getEnv, isTruthy } from '@/lib/core/config/env' +import { generatePassword } from '@/lib/core/security/encryption' +import { cn } from '@/lib/core/utils/cn' import type { AuthType } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/hooks/hooks/use-chat-form' interface AuthSelectorProps { diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/chat-deploy.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/chat-deploy.tsx index 1ed663db4c..11547a2553 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/chat-deploy.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/chat-deploy.tsx @@ -15,8 +15,8 @@ import { Textarea, } from '@/components/emcn' import { Alert, AlertDescription, Skeleton } from '@/components/ui' +import { getEmailDomain } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getEmailDomain } from '@/lib/urls/utils' import { OutputSelect } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/chat/components/output-select/output-select' import { AuthSelector } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/auth-selector' import { IdentifierInput } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/identifier-input' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/deploy-status.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/deploy-status.tsx index 9251bbfccb..2a5e733305 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/deploy-status.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/deploy-status.tsx @@ -1,6 +1,6 @@ 'use client' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' interface DeployStatusProps { needsRedeployment: boolean diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/deployed-workflow-card.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/deployed-workflow-card.tsx index b9e0c09df4..2d68a5d747 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/deployed-workflow-card.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/deployed-workflow-card.tsx @@ -2,8 +2,8 @@ import { useMemo, useState } from 'react' import { Card, CardContent, CardHeader } from '@/components/ui/card' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { WorkflowPreview } from '@/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview' import { useWorkflowRegistry } from '@/stores/workflows/registry/store' import type { WorkflowState } from '@/stores/workflows/workflow/types' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/example-command.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/example-command.tsx index 36e2b50d1d..c35910e235 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/example-command.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/example-command.tsx @@ -11,7 +11,7 @@ import { DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' -import { getEnv, isTruthy } from '@/lib/env' +import { getEnv, isTruthy } from '@/lib/core/config/env' import { OutputSelect } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/chat/components/output-select/output-select' interface ExampleCommandProps { diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/identifier-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/identifier-input.tsx index 464c1dfe63..d6989bb879 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/identifier-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/identifier-input.tsx @@ -1,7 +1,7 @@ import { useEffect } from 'react' import { Input, Label } from '@/components/emcn' -import { getEmailDomain } from '@/lib/urls/utils' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' +import { getEmailDomain } from '@/lib/core/utils/urls' import { useIdentifierValidation } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/components/chat-deploy/hooks/use-identifier-validation' interface IdentifierInputProps { diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/success-view.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/success-view.tsx index 4a361022c1..1f8404097e 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/success-view.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/success-view.tsx @@ -1,5 +1,5 @@ import { Label } from '@/components/emcn' -import { getBaseDomain, getEmailDomain } from '@/lib/urls/utils' +import { getBaseDomain, getEmailDomain } from '@/lib/core/utils/urls' interface ExistingChat { id: string diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/template-deploy.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/template-deploy.tsx index 76e5e8ebd2..893f2e56e0 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/template-deploy.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/template-deploy.tsx @@ -24,7 +24,7 @@ import { SelectValue, } from '@/components/ui' import { TagInput } from '@/components/ui/tag-input' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' import { createLogger } from '@/lib/logs/console/logger' import { WorkflowPreview } from '@/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview' import { diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/deploy-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/deploy-modal.tsx index e9d00ebd42..36164f6b67 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/deploy-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/deploy-modal.tsx @@ -11,10 +11,10 @@ import { PopoverTrigger, } from '@/components/emcn' import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui' -import { getEnv } from '@/lib/env' +import { getEnv } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' -import type { WorkflowDeploymentVersionResponse } from '@/lib/workflows/db-helpers' -import { getInputFormatExample as getInputFormatExampleUtil } from '@/lib/workflows/deployment-utils' +import { getInputFormatExample as getInputFormatExampleUtil } from '@/lib/workflows/operations/deployment-utils' +import type { WorkflowDeploymentVersionResponse } from '@/lib/workflows/persistence/utils' import { ChatDeploy } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/chat-deploy' import { DeployedWorkflowModal } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/deployed-workflow-modal' import { DeploymentInfo } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/deployment-info' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/code/code.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/code/code.tsx index b18ca98c58..3336dadf80 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/code/code.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/code/code.tsx @@ -13,14 +13,14 @@ import { languages, } from '@/components/emcn/components/code/code' import { Button } from '@/components/ui/button' +import { cn } from '@/lib/core/utils/cn' import { CodeLanguage } from '@/lib/execution/languages' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { isLikelyReferenceSegment, SYSTEM_REFERENCE_PREFIXES, splitReferenceSegment, -} from '@/lib/workflows/references' +} from '@/lib/workflows/sanitization/references' import { checkEnvVarTrigger, EnvVarDropdown, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/combobox/combobox.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/combobox/combobox.tsx index df1ea3712d..cc277f6532 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/combobox/combobox.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/combobox/combobox.tsx @@ -1,7 +1,7 @@ import { useCallback, useEffect, useMemo, useState } from 'react' import { useReactFlow } from 'reactflow' import { Combobox, type ComboboxOption } from '@/components/emcn/components' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { formatDisplayText } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/formatted-text' import { SubBlockInputController } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/sub-block-input-controller' import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/hooks/use-sub-block-value' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/condition-input/condition-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/condition-input/condition-input.tsx index b44f7ccc21..c215ae6447 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/condition-input/condition-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/condition-input/condition-input.tsx @@ -14,13 +14,13 @@ import { languages, } from '@/components/emcn/components/code/code' import { Trash } from '@/components/emcn/icons/trash' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { isLikelyReferenceSegment, SYSTEM_REFERENCE_PREFIXES, splitReferenceSegment, -} from '@/lib/workflows/references' +} from '@/lib/workflows/sanitization/references' import { checkEnvVarTrigger, EnvVarDropdown, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/components/oauth-required-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/components/oauth-required-modal.tsx index 21b3892423..e98c3a880b 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/components/oauth-required-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/components/oauth-required-modal.tsx @@ -10,7 +10,7 @@ import { ModalHeader, ModalTitle, } from '@/components/emcn' -import { client } from '@/lib/auth-client' +import { client } from '@/lib/auth/auth-client' import { createLogger } from '@/lib/logs/console/logger' import { getProviderIdFromServiceId, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/document-tag-entry/document-tag-entry.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/document-tag-entry/document-tag-entry.tsx index f6b7d2a35a..52fa2d9b21 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/document-tag-entry/document-tag-entry.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/document-tag-entry/document-tag-entry.tsx @@ -5,8 +5,8 @@ import { Plus } from 'lucide-react' import { Trash } from '@/components/emcn/icons/trash' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' -import { MAX_TAG_SLOTS } from '@/lib/knowledge/consts' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' +import { MAX_TAG_SLOTS } from '@/lib/knowledge/constants' import { formatDisplayText } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/formatted-text' import { TagDropdown } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tag-dropdown/tag-dropdown' import { useSubBlockInput } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/hooks/use-sub-block-input' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/env-var-dropdown.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/env-var-dropdown.tsx index 344867905d..32a6dd33c4 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/env-var-dropdown.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/env-var-dropdown.tsx @@ -8,7 +8,7 @@ import { PopoverScrollArea, PopoverSection, } from '@/components/emcn' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { usePersonalEnvironment, useWorkspaceEnvironment, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/eval-input/eval-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/eval-input/eval-input.tsx index 7affdd17dd..4b2e9be22c 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/eval-input/eval-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/eval-input/eval-input.tsx @@ -6,7 +6,7 @@ import { Input } from '@/components/emcn/components/input/input' import { Textarea } from '@/components/emcn/components/textarea/textarea' import { Trash } from '@/components/emcn/icons/trash' import { Label } from '@/components/ui/label' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { formatDisplayText } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/formatted-text' import { TagDropdown } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tag-dropdown/tag-dropdown' import { useSubBlockInput } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/hooks/use-sub-block-input' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/formatted-text.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/formatted-text.tsx index 6ce3443f39..06820c35ee 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/formatted-text.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/formatted-text.tsx @@ -1,7 +1,7 @@ 'use client' import type { ReactNode } from 'react' -import { splitReferenceSegment } from '@/lib/workflows/references' +import { splitReferenceSegment } from '@/lib/workflows/sanitization/references' import { REFERENCE } from '@/executor/consts' import { createCombinedPattern } from '@/executor/utils/reference-validation' import { normalizeBlockName } from '@/stores/workflows/utils' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/input-mapping/input-mapping.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/input-mapping/input-mapping.tsx index 94ee807068..ed5a437b91 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/input-mapping/input-mapping.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/input-mapping/input-mapping.tsx @@ -2,7 +2,7 @@ import { useEffect, useMemo, useRef, useState } from 'react' import { Badge } from '@/components/emcn' import { Input } from '@/components/emcn/components/input/input' import { Label } from '@/components/ui/label' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { formatDisplayText } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/formatted-text' import { TagDropdown } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tag-dropdown/tag-dropdown' import { useSubBlockInput } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/hooks/use-sub-block-input' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/long-input/long-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/long-input/long-input.tsx index 1ae3e3590b..6e6112c4ba 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/long-input/long-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/long-input/long-input.tsx @@ -10,8 +10,8 @@ import { import { ChevronsUpDown, Wand2 } from 'lucide-react' import { Textarea } from '@/components/emcn' import { Button } from '@/components/ui/button' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { formatDisplayText } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/formatted-text' import { SubBlockInputController } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/sub-block-input-controller' import { useSubBlockInput } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/hooks/use-sub-block-input' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/mcp-dynamic-args/mcp-dynamic-args.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/mcp-dynamic-args/mcp-dynamic-args.tsx index fd5e8209a0..4b71c5fd67 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/mcp-dynamic-args/mcp-dynamic-args.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/mcp-dynamic-args/mcp-dynamic-args.tsx @@ -3,8 +3,8 @@ import { useParams } from 'next/navigation' import { Combobox, Input, Label, Textarea } from '@/components/emcn/components' import { Slider } from '@/components/ui/slider' import { Switch } from '@/components/ui/switch' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { formatDisplayText } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/formatted-text' import { checkTagTrigger, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/messages-input/messages-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/messages-input/messages-input.tsx index 67ca40be54..33a4d64cb0 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/messages-input/messages-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/messages-input/messages-input.tsx @@ -2,7 +2,7 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { ChevronDown, ChevronsUpDown, ChevronUp, Plus } from 'lucide-react' import { Button, Popover, PopoverContent, PopoverItem, PopoverTrigger } from '@/components/emcn' import { Trash } from '@/components/emcn/icons/trash' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { EnvVarDropdown } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/env-var-dropdown' import { formatDisplayText } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/formatted-text' import { TagDropdown } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tag-dropdown/tag-dropdown' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/schedule-save/schedule-save.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/schedule-save/schedule-save.tsx index dc0e26a765..2d18d2e9c2 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/schedule-save/schedule-save.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/schedule-save/schedule-save.tsx @@ -11,9 +11,9 @@ import { } from '@/components/emcn' import { Trash } from '@/components/emcn/icons/trash' import { Alert, AlertDescription } from '@/components/ui/alert' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { parseCronToHumanReadable } from '@/lib/schedules/utils' -import { cn } from '@/lib/utils' +import { parseCronToHumanReadable } from '@/lib/workflows/schedules/utils' import { useCollaborativeWorkflow } from '@/hooks/use-collaborative-workflow' import { useScheduleManagement } from '@/hooks/use-schedule-management' import { useSubBlockStore } from '@/stores/workflows/subblock/store' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/short-input/short-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/short-input/short-input.tsx index f917cc0eea..0a2f6ad988 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/short-input/short-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/short-input/short-input.tsx @@ -3,7 +3,7 @@ import { Check, Copy, Wand2 } from 'lucide-react' import { useReactFlow } from 'reactflow' import { Input } from '@/components/emcn/components/input/input' import { Button } from '@/components/ui/button' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { formatDisplayText } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/formatted-text' import { SubBlockInputController } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/sub-block-input-controller' import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/hooks/use-sub-block-value' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/starter/input-format.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/starter/input-format.tsx index 3420d6a62b..8d6524e48a 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/starter/input-format.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/starter/input-format.tsx @@ -13,7 +13,7 @@ import { } from '@/components/emcn/components/code/code' import type { ComboboxOption } from '@/components/emcn/components/combobox/combobox' import { Label } from '@/components/ui/label' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { formatDisplayText } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/formatted-text' import { TagDropdown } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tag-dropdown/tag-dropdown' import { useSubBlockInput } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/hooks/use-sub-block-input' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/table/table.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/table/table.tsx index a5e3ff5a63..ad3595f7c6 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/table/table.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/table/table.tsx @@ -3,8 +3,8 @@ import { useParams } from 'next/navigation' import { Button } from '@/components/emcn/components/button/button' import { Trash } from '@/components/emcn/icons/trash' import { Input } from '@/components/ui/input' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { EnvVarDropdown } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/env-var-dropdown' import { formatDisplayText } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/formatted-text' import { TagDropdown } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tag-dropdown/tag-dropdown' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tag-dropdown/tag-dropdown.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tag-dropdown/tag-dropdown.tsx index 8130beef1c..b72c66d1f6 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tag-dropdown/tag-dropdown.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tag-dropdown/tag-dropdown.tsx @@ -11,11 +11,14 @@ import { PopoverSection, usePopoverContext, } from '@/components/emcn' +import { cn } from '@/lib/core/utils/cn' +import { + extractFieldsFromSchema, + parseResponseFormatSafely, +} from '@/lib/core/utils/response-format' import { createLogger } from '@/lib/logs/console/logger' -import { extractFieldsFromSchema, parseResponseFormatSafely } from '@/lib/response-format' -import { cn } from '@/lib/utils' -import { getBlockOutputPaths, getBlockOutputType } from '@/lib/workflows/block-outputs' -import { TRIGGER_TYPES } from '@/lib/workflows/triggers' +import { getBlockOutputPaths, getBlockOutputType } from '@/lib/workflows/blocks/block-outputs' +import { TRIGGER_TYPES } from '@/lib/workflows/triggers/triggers' import { KeyboardNavigationHandler } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tag-dropdown/components/keyboard-navigation-handler' import type { BlockTagGroup, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/time-input/time-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/time-input/time-input.tsx index 764f189d23..ef018e6632 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/time-input/time-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/time-input/time-input.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import { Button, Input, Popover, PopoverContent, PopoverTrigger } from '@/components/emcn' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/hooks/use-sub-block-value' interface TimeInputProps { diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/code-editor/code-editor.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/code-editor/code-editor.tsx index d6e4e771f9..2c68e264f8 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/code-editor/code-editor.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/code-editor/code-editor.tsx @@ -12,7 +12,7 @@ import { languages, } from '@/components/emcn/components/code/code' import { Button } from '@/components/ui/button' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' interface CodeEditorProps { value: string diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/custom-tool-modal/custom-tool-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/custom-tool-modal/custom-tool-modal.tsx index 0c80099fa9..fbdde60322 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/custom-tool-modal/custom-tool-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/custom-tool-modal/custom-tool-modal.tsx @@ -27,8 +27,8 @@ import { DialogTitle, } from '@/components/ui/dialog' import { Label } from '@/components/ui/label' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { checkEnvVarTrigger, EnvVarDropdown, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/tool-command/tool-command.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/tool-command/tool-command.tsx index 585402cdde..08d223219f 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/tool-command/tool-command.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/tool-command/tool-command.tsx @@ -7,7 +7,7 @@ import React, { useMemo, useState, } from 'react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' type CommandContextType = { searchQuery: string diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/tool-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/tool-input.tsx index 5be254f93e..8f97804302 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/tool-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/tool-input.tsx @@ -15,6 +15,7 @@ import { } from '@/components/emcn' import { Switch } from '@/components/ui/switch' import { Toggle } from '@/components/ui/toggle' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' import { getCanonicalScopesForProvider, @@ -22,7 +23,6 @@ import { type OAuthProvider, type OAuthService, } from '@/lib/oauth/oauth' -import { cn } from '@/lib/utils' import { ChannelSelectorInput, CheckboxList, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/trigger-save/trigger-save.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/trigger-save/trigger-save.tsx index 8c5fbbf7fd..6991ee6213 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/trigger-save/trigger-save.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/trigger-save/trigger-save.tsx @@ -9,8 +9,8 @@ import { } from '@/components/emcn/components' import { Trash } from '@/components/emcn/icons/trash' import { Alert, AlertDescription } from '@/components/ui/alert' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { useCollaborativeWorkflow } from '@/hooks/use-collaborative-workflow' import { useTriggerConfigAggregation } from '@/hooks/use-trigger-config-aggregation' import { useWebhookManagement } from '@/hooks/use-webhook-management' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/variables-input/variables-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/variables-input/variables-input.tsx index 48e07c76db..a905da653e 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/variables-input/variables-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/variables-input/variables-input.tsx @@ -5,7 +5,7 @@ import { Badge, Button, Combobox, Input } from '@/components/emcn' import { Trash } from '@/components/emcn/icons/trash' import { Label } from '@/components/ui/label' import { Textarea } from '@/components/ui/textarea' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { formatDisplayText } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/formatted-text' import { checkTagTrigger, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/sub-block.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/sub-block.tsx index 7a9f622230..33e497d96e 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/sub-block.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/sub-block.tsx @@ -2,7 +2,7 @@ import { type JSX, type MouseEvent, memo, useRef, useState } from 'react' import { AlertTriangle, Wand2 } from 'lucide-react' import { Label, Tooltip } from '@/components/emcn/components' import { Button } from '@/components/ui/button' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import type { FieldDiffStatus } from '@/lib/workflows/diff/types' import { ChannelSelectorInput, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/hooks/use-block-connections.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/hooks/use-block-connections.ts index eb3bcfdeb9..5f1d854ebe 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/hooks/use-block-connections.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/hooks/use-block-connections.ts @@ -1,7 +1,10 @@ import { useShallow } from 'zustand/react/shallow' -import { BlockPathCalculator } from '@/lib/block-path-calculator' -import { extractFieldsFromSchema, parseResponseFormatSafely } from '@/lib/response-format' -import { getBlockOutputs } from '@/lib/workflows/block-outputs' +import { + extractFieldsFromSchema, + parseResponseFormatSafely, +} from '@/lib/core/utils/response-format' +import { getBlockOutputs } from '@/lib/workflows/blocks/block-outputs' +import { BlockPathCalculator } from '@/lib/workflows/blocks/block-path-calculator' 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/panel/components/editor/hooks/use-editor-subblock-layout.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/hooks/use-editor-subblock-layout.ts index d0c9d86014..d41139bb95 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/hooks/use-editor-subblock-layout.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/hooks/use-editor-subblock-layout.ts @@ -1,5 +1,5 @@ import { useMemo } from 'react' -import { getEnv, isTruthy } from '@/lib/env' +import { getEnv, isTruthy } from '@/lib/core/config/env' import type { BlockConfig, SubBlockConfig, SubBlockType } from '@/blocks/types' import { useWorkflowDiffStore } from '@/stores/workflow-diff' import { mergeSubblockState } from '@/stores/workflows/utils' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/hooks/use-subflow-editor.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/hooks/use-subflow-editor.ts index cecc220ffa..85bf822007 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/hooks/use-subflow-editor.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/hooks/use-subflow-editor.ts @@ -4,7 +4,7 @@ import { isLikelyReferenceSegment, SYSTEM_REFERENCE_PREFIXES, splitReferenceSegment, -} from '@/lib/workflows/references' +} from '@/lib/workflows/sanitization/references' import { checkTagTrigger } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tag-dropdown/tag-dropdown' import { useAccessibleReferencePrefixes } from '@/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-accessible-reference-prefixes' import { createEnvVarPattern, createReferencePattern } from '@/executor/utils/reference-validation' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/toolbar/toolbar.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/toolbar/toolbar.tsx index cb01d75f8e..ba06408056 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/toolbar/toolbar.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/toolbar/toolbar.tsx @@ -16,7 +16,7 @@ import { getBlocksForSidebar, getTriggersForSidebar, hasTriggerCapability, -} from '@/lib/workflows/trigger-utils' +} from '@/lib/workflows/triggers/trigger-utils' import { calculateTriggerHeights, useToolbarItemInteractions, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/workflow-controls/workflow-controls.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/workflow-controls/workflow-controls.tsx index 88d5c5bc41..d5c05894f2 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/workflow-controls/workflow-controls.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/workflow-controls/workflow-controls.tsx @@ -6,7 +6,7 @@ import { useStore } from 'reactflow' import { Button, Redo, Undo } from '@/components/emcn' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' import { useCollaborativeWorkflow } from '@/hooks/use-collaborative-workflow' import { useUndoRedoStore } from '@/stores/undo-redo' import { useWorkflowRegistry } from '@/stores/workflows/registry/store' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/subflow-node.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/subflow-node.tsx index de23983551..3df3d38a36 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/subflow-node.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/subflow-node.tsx @@ -2,7 +2,7 @@ import { memo, useMemo, useRef } from 'react' import { RepeatIcon, SplitIcon } from 'lucide-react' import { Handle, type NodeProps, Position, useReactFlow } from 'reactflow' import { Button, Trash } from '@/components/emcn' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { type DiffStatus, hasDiffStatus } from '@/lib/workflows/diff/types' import { useCurrentWorkflow } from '@/app/workspace/[workspaceId]/w/[workflowId]/hooks' import { useCollaborativeWorkflow } from '@/hooks/use-collaborative-workflow' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/training-controls/training-controls.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/training-controls/training-controls.tsx index c9e98a9d0b..4136b93590 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/training-controls/training-controls.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/training-controls/training-controls.tsx @@ -1,7 +1,7 @@ 'use client' import { useEffect, useState } from 'react' -import { getEnv, isTruthy } from '@/lib/env' +import { getEnv, isTruthy } from '@/lib/core/config/env' import { TrainingFloatingButton } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/training-controls/training-floating-button' import { TrainingModal } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/training-controls/training-modal' import { useCopilotTrainingStore } from '@/stores/copilot-training/store' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/training-controls/training-floating-button.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/training-controls/training-floating-button.tsx index 0cc54a95a1..f555eb60e1 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/training-controls/training-floating-button.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/training-controls/training-floating-button.tsx @@ -3,7 +3,7 @@ import { Database, Pause } from 'lucide-react' import { Tooltip } from '@/components/emcn' import { Button } from '@/components/ui/button' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { useCopilotTrainingStore } from '@/stores/copilot-training/store' interface TrainingFloatingButtonProps { diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/training-controls/training-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/training-controls/training-modal.tsx index e18bb69c9a..1327d7d1c5 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/training-controls/training-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/training-controls/training-modal.tsx @@ -27,9 +27,9 @@ import { Label } from '@/components/ui/label' import { ScrollArea } from '@/components/ui/scroll-area' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' import { Textarea } from '@/components/ui/textarea' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' -import { sanitizeForCopilot } from '@/lib/workflows/json-sanitizer' +import { sanitizeForCopilot } from '@/lib/workflows/sanitization/json-sanitizer' import { formatEditSequence } from '@/lib/workflows/training/compute-edit-sequence' import { useCurrentWorkflow } from '@/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-current-workflow' import { useCopilotTrainingStore } from '@/stores/copilot-training/store' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/variables/variables.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/variables/variables.tsx index 4dfc5129bf..bbd33012bd 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/variables/variables.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/variables/variables.tsx @@ -17,7 +17,8 @@ import { } from '@/components/emcn' import { Label } from '@/components/emcn/components/label/label' import { Trash } from '@/components/emcn/icons/trash' -import { cn, validateName } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' +import { validateName } from '@/lib/core/utils/validation' import { useCollaborativeWorkflow } from '@/hooks/use-collaborative-workflow' import { useVariablesStore as usePanelVariablesStore } from '@/stores/panel/variables/store' import { getVariablesPosition, useVariablesStore } from '@/stores/variables/store' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/wand-prompt-bar/wand-prompt-bar.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/wand-prompt-bar/wand-prompt-bar.tsx index 16c3fc9288..a15022ea52 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/wand-prompt-bar/wand-prompt-bar.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/wand-prompt-bar/wand-prompt-bar.tsx @@ -2,7 +2,7 @@ import { useEffect, useRef, useState } from 'react' import { SendIcon, XIcon } from 'lucide-react' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' interface WandPromptBarProps { isVisible: boolean diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/webhook-settings/webhook-settings.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/webhook-settings/webhook-settings.tsx index 81c44cfd63..89dec61406 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/webhook-settings/webhook-settings.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/webhook-settings/webhook-settings.tsx @@ -35,8 +35,9 @@ import { Skeleton, Switch, } from '@/components/ui' +import { generatePassword } from '@/lib/core/security/encryption' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn, generatePassword } from '@/lib/utils' import type { LogLevel as StoreLogLevel, TriggerType as StoreTriggerType, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/action-bar/action-bar.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/action-bar/action-bar.tsx index c7cb27ccf6..7452dd4ef6 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/action-bar/action-bar.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/action-bar/action-bar.tsx @@ -1,7 +1,7 @@ import { memo, useCallback } from 'react' import { ArrowLeftRight, ArrowUpDown, Circle, CircleOff, LogOut } from 'lucide-react' import { Button, Duplicate, Tooltip, Trash2 } from '@/components/emcn' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider' import { useCollaborativeWorkflow } from '@/hooks/use-collaborative-workflow' import { useWorkflowStore } from '@/stores/workflows/workflow/store' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/hooks/use-schedule-info.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/hooks/use-schedule-info.ts index 8a61fd9ceb..459dbffd0d 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/hooks/use-schedule-info.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/hooks/use-schedule-info.ts @@ -1,6 +1,6 @@ import { useCallback, useEffect, useState } from 'react' import { createLogger } from '@/lib/logs/console/logger' -import { parseCronToHumanReadable } from '@/lib/schedules/utils' +import { parseCronToHumanReadable } from '@/lib/workflows/schedules/utils' import type { ScheduleInfo } from '../types' const logger = createLogger('useScheduleInfo') 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 5a3e43ca81..1d7eb9963d 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 @@ -3,11 +3,11 @@ import { useParams } from 'next/navigation' import { Handle, type NodeProps, Position, useUpdateNodeInternals } from 'reactflow' import { Badge } from '@/components/emcn/components/badge/badge' import { Tooltip } from '@/components/emcn/components/tooltip/tooltip' -import { getEnv, isTruthy } from '@/lib/env' +import { getEnv, isTruthy } from '@/lib/core/config/env' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' import { createMcpToolId } from '@/lib/mcp/utils' import { getProviderIdFromServiceId } from '@/lib/oauth' -import { cn } from '@/lib/utils' import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider' import { ActionBar, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-accessible-reference-prefixes.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-accessible-reference-prefixes.ts index c51ea06ac1..313df16c6d 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-accessible-reference-prefixes.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-accessible-reference-prefixes.ts @@ -1,7 +1,7 @@ import { useMemo } from 'react' import { useShallow } from 'zustand/react/shallow' -import { BlockPathCalculator } from '@/lib/block-path-calculator' -import { SYSTEM_REFERENCE_PREFIXES } from '@/lib/workflows/references' +import { BlockPathCalculator } from '@/lib/workflows/blocks/block-path-calculator' +import { SYSTEM_REFERENCE_PREFIXES } from '@/lib/workflows/sanitization/references' import { normalizeBlockName } from '@/stores/workflows/utils' import { useWorkflowStore } from '@/stores/workflows/workflow/store' import type { Loop, Parallel } from '@/stores/workflows/workflow/types' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-block-connections.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-block-connections.ts index a0bdf64047..5671a4caa9 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-block-connections.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-block-connections.ts @@ -1,8 +1,8 @@ import { useShallow } from 'zustand/react/shallow' -import { BlockPathCalculator } from '@/lib/block-path-calculator' import { createLogger } from '@/lib/logs/console/logger' -import { getBlockOutputs } from '@/lib/workflows/block-outputs' -import { TriggerUtils } from '@/lib/workflows/triggers' +import { getBlockOutputs } from '@/lib/workflows/blocks/block-outputs' +import { BlockPathCalculator } from '@/lib/workflows/blocks/block-path-calculator' +import { TriggerUtils } from '@/lib/workflows/triggers/triggers' 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]/hooks/use-block-dimensions.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-block-dimensions.ts index d8857c37d8..e6167df3e9 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-block-dimensions.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-block-dimensions.ts @@ -3,7 +3,7 @@ import { useUpdateNodeInternals } from 'reactflow' import { useWorkflowStore } from '@/stores/workflows/workflow/store' // Re-export for backwards compatibility -export { BLOCK_DIMENSIONS } from '@/lib/blocks/block-dimensions' +export { BLOCK_DIMENSIONS } from '@/lib/workflows/blocks/block-dimensions' interface BlockDimensions { width: number diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-block-output-fields.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-block-output-fields.ts index 622fed70ef..321e507ec0 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-block-output-fields.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-block-output-fields.ts @@ -1,9 +1,9 @@ 'use client' import { useMemo } from 'react' -import { extractFieldsFromSchema } from '@/lib/response-format' -import { getBlockOutputPaths, getBlockOutputs } from '@/lib/workflows/block-outputs' -import { TRIGGER_TYPES } from '@/lib/workflows/triggers' +import { extractFieldsFromSchema } from '@/lib/core/utils/response-format' +import { getBlockOutputPaths, getBlockOutputs } from '@/lib/workflows/blocks/block-outputs' +import { TRIGGER_TYPES } from '@/lib/workflows/triggers/triggers' import type { SchemaField } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/connection-blocks/components/field-item/field-item' import { getBlock } from '@/blocks' import type { BlockConfig } from '@/blocks/types' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-node-utilities.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-node-utilities.ts index 07ce2736c9..78f0086393 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-node-utilities.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-node-utilities.ts @@ -1,7 +1,7 @@ import { useCallback } from 'react' import { useReactFlow } from 'reactflow' -import { BLOCK_DIMENSIONS, CONTAINER_DIMENSIONS } from '@/lib/blocks/block-dimensions' import { createLogger } from '@/lib/logs/console/logger' +import { BLOCK_DIMENSIONS, CONTAINER_DIMENSIONS } from '@/lib/workflows/blocks/block-dimensions' const logger = createLogger('NodeUtilities') diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-workflow-execution.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-workflow-execution.ts index 574cd0b657..042be27bf4 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-workflow-execution.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-workflow-execution.ts @@ -8,8 +8,12 @@ import { extractTriggerMockPayload, selectBestTrigger, triggerNeedsMockPayload, -} from '@/lib/workflows/trigger-utils' -import { resolveStartCandidates, StartBlockPath, TriggerUtils } from '@/lib/workflows/triggers' +} from '@/lib/workflows/triggers/trigger-utils' +import { + resolveStartCandidates, + StartBlockPath, + TriggerUtils, +} from '@/lib/workflows/triggers/triggers' import { useCurrentWorkflow } from '@/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-current-workflow' import type { BlockLog, ExecutionResult, StreamingExecution } from '@/executor/types' import { subscriptionKeys } from '@/hooks/queries/subscription' @@ -309,7 +313,7 @@ export function useWorkflowExecution() { if (isChatExecution) { const stream = new ReadableStream({ async start(controller) { - const { encodeSSE } = await import('@/lib/utils') + const { encodeSSE } = await import('@/lib/core/utils/sse') const executionId = uuidv4() const streamedContent = new Map() const streamReadingPromises: Promise[] = [] @@ -458,7 +462,7 @@ export function useWorkflowExecution() { if (!selectedOutputs?.length) return const { extractBlockIdFromOutputId, extractPathFromOutputId, traverseObjectPath } = - await import('@/lib/response-format') + await import('@/lib/core/utils/response-format') // Check if this block's output is selected const matchingOutputs = selectedOutputs.filter( @@ -564,7 +568,7 @@ export function useWorkflowExecution() { queryClient.invalidateQueries({ queryKey: subscriptionKeys.user() }) queryClient.invalidateQueries({ queryKey: subscriptionKeys.usage() }) - const { encodeSSE } = await import('@/lib/utils') + const { encodeSSE } = await import('@/lib/core/utils/sse') controller.enqueue(encodeSSE({ event: 'final', data: result })) // Note: Logs are already persisted server-side via execution-core.ts } @@ -583,7 +587,7 @@ export function useWorkflowExecution() { } // Send the error as final event so downstream handlers can treat it uniformly - const { encodeSSE } = await import('@/lib/utils') + const { encodeSSE } = await import('@/lib/core/utils/sse') controller.enqueue(encodeSSE({ event: 'final', data: errorResult })) // Do not error the controller to allow consumers to process the final event diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/utils/block-ring-utils.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/utils/block-ring-utils.ts index b3b7ab814c..8b6cc5f1f4 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/utils/block-ring-utils.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/utils/block-ring-utils.ts @@ -1,4 +1,4 @@ -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' export type BlockDiffStatus = 'new' | 'edited' | null | undefined diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx index b9d335d88d..13fc26e11e 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx @@ -12,7 +12,7 @@ import ReactFlow, { } from 'reactflow' import 'reactflow/dist/style.css' import { createLogger } from '@/lib/logs/console/logger' -import { TriggerUtils } from '@/lib/workflows/triggers' +import { TriggerUtils } from '@/lib/workflows/triggers/triggers' import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider' import { CommandList, diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/help-modal/help-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/help-modal/help-modal.tsx index 172e1b5009..e29dcc4022 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/help-modal/help-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/help-modal/help-modal.tsx @@ -17,8 +17,8 @@ import { Textarea, } from '@/components/emcn' import { Label } from '@/components/ui/label' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' const logger = createLogger('HelpModal') diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/search-modal/search-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/search-modal/search-modal.tsx index 6129da68fc..22b4181589 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/search-modal/search-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/search-modal/search-modal.tsx @@ -7,8 +7,8 @@ import { BookOpen, Layout, RepeatIcon, ScrollText, Search, SplitIcon } from 'luc import { useParams, useRouter } from 'next/navigation' import { Dialog, DialogPortal, DialogTitle } from '@/components/ui/dialog' import { useBrandConfig } from '@/lib/branding/branding' -import { cn } from '@/lib/utils' -import { getTriggersForSidebar, hasTriggerCapability } from '@/lib/workflows/trigger-utils' +import { cn } from '@/lib/core/utils/cn' +import { getTriggersForSidebar, hasTriggerCapability } from '@/lib/workflows/triggers/trigger-utils' import { searchItems } from '@/app/workspace/[workspaceId]/w/components/sidebar/components-new/search-modal/search-utils' import { getAllBlocks } from '@/blocks' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/account/account.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/account/account.tsx index d2747bb063..7da137cda0 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/account/account.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/account/account.tsx @@ -8,10 +8,10 @@ import { Button } from '@/components/emcn' import { AgentIcon } from '@/components/icons' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' -import { signOut } from '@/lib/auth-client' +import { signOut } from '@/lib/auth/auth-client' import { useBrandConfig } from '@/lib/branding/branding' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' import { useProfilePictureUpload } from '@/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/account/hooks/use-profile-picture-upload' import { useUpdateUserProfile, useUserProfile } from '@/hooks/queries/user-profile' import { clearUserData } from '@/stores' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/api-keys/api-keys.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/api-keys/api-keys.tsx index 0ace598589..569d577009 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/api-keys/api-keys.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/api-keys/api-keys.tsx @@ -14,7 +14,7 @@ import { } from '@/components/emcn' import { Tooltip } from '@/components/emcn/components/tooltip/tooltip' import { Input, Label, Skeleton, Switch } from '@/components/ui' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' import { createLogger } from '@/lib/logs/console/logger' import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider' import { diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/creator-profile/creator-profile.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/creator-profile/creator-profile.tsx index cb9cbd063c..f309a725b2 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/creator-profile/creator-profile.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/creator-profile/creator-profile.tsx @@ -9,7 +9,7 @@ import { z } from 'zod' import { Button, Combobox, Input, Textarea } from '@/components/emcn' import { AgentIcon } from '@/components/icons' import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@/components/ui' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' import { createLogger } from '@/lib/logs/console/logger' import type { CreatorProfileDetails } from '@/app/_types/creator-profile' import { useProfilePictureUpload } from '@/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/account/hooks/use-profile-picture-upload' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/credentials/credentials.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/credentials/credentials.tsx index 25c4c61df4..7e1e7cdbf5 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/credentials/credentials.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/credentials/credentials.tsx @@ -5,9 +5,9 @@ import { Check, ChevronDown, ExternalLink, Search } from 'lucide-react' import { useRouter, useSearchParams } from 'next/navigation' import { Button } from '@/components/emcn' import { Input, Label } from '@/components/ui' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' import { OAUTH_PROVIDERS } from '@/lib/oauth/oauth' -import { cn } from '@/lib/utils' import { type ServiceInfo, useConnectOAuthService, diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/files/files.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/files/files.tsx index 9c8e8f1152..640f613f81 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/files/files.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/files/files.tsx @@ -13,11 +13,11 @@ import { TableHeader, TableRow, } from '@/components/ui/table' -import { getEnv, isTruthy } from '@/lib/env' +import { getEnv, isTruthy } from '@/lib/core/config/env' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' import type { WorkspaceFileRecord } from '@/lib/uploads/contexts/workspace' import { getFileExtension } from '@/lib/uploads/utils/file-utils' -import { cn } from '@/lib/utils' import { getDocumentIcon } from '@/app/workspace/[workspaceId]/knowledge/components' import { useDeleteWorkspaceFile, diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/general/general.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/general/general.tsx index 658df0cdc9..37ce2dc297 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/general/general.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/general/general.tsx @@ -12,8 +12,8 @@ import { Label } from '@/components/ui/label' // SelectValue, // } from '@/components/ui/select' import { Switch } from '@/components/ui/switch' -import { useSession } from '@/lib/auth-client' -import { getEnv, isTruthy } from '@/lib/env' +import { useSession } from '@/lib/auth/auth-client' +import { getEnv, isTruthy } from '@/lib/core/config/env' import { useGeneralSettings, useUpdateGeneralSetting } from '@/hooks/queries/general-settings' const TOOLTIPS = { diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/settings-navigation/settings-navigation.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/settings-navigation/settings-navigation.tsx index 2f198c8b2d..04bf7e9b10 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/settings-navigation/settings-navigation.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/settings-navigation/settings-navigation.tsx @@ -17,12 +17,12 @@ import { Waypoints, Wrench, } from 'lucide-react' -import { useSession } from '@/lib/auth-client' -import { getEnv, isTruthy } from '@/lib/env' -import { isHosted } from '@/lib/environment' -import { getUserRole } from '@/lib/organization/helpers' -import { getSubscriptionStatus } from '@/lib/subscription/helpers' -import { cn } from '@/lib/utils' +import { useSession } from '@/lib/auth/auth-client' +import { getSubscriptionStatus } from '@/lib/billing/client/utils' +import { getEnv, isTruthy } from '@/lib/core/config/env' +import { isHosted } from '@/lib/core/config/environment' +import { cn } from '@/lib/core/utils/cn' +import { getUserRole } from '@/lib/workspaces/organization/utils' import { generalSettingsKeys } from '@/hooks/queries/general-settings' import { organizationKeys, useOrganizations } from '@/hooks/queries/organization' import { ssoKeys, useSSOProviders } from '@/hooks/queries/sso' @@ -273,7 +273,7 @@ export function SettingsNavigation({ queryClient.prefetchQuery({ queryKey: organizationKeys.lists(), queryFn: async () => { - const { client } = await import('@/lib/auth-client') + const { client } = await import('@/lib/auth/auth-client') const [orgsResponse, activeOrgResponse, billingResponse] = await Promise.all([ client.organization.list(), client.organization.getFullOrganization(), diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/shared/usage-header.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/shared/usage-header.tsx index a7275686e4..062a978fbd 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/shared/usage-header.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/shared/usage-header.tsx @@ -2,8 +2,8 @@ import type { ReactNode } from 'react' import { Badge } from '@/components/emcn' -import { calculateFilledPills, USAGE_PILL_COUNT } from '@/lib/subscription/usage-visualization' -import { cn } from '@/lib/utils' +import { calculateFilledPills, USAGE_PILL_COUNT } from '@/lib/billing/client/usage-visualization' +import { cn } from '@/lib/core/utils/cn' const GRADIENT_BADGE_STYLES = 'gradient-text h-[1.125rem] rounded-[6px] border-gradient-primary/20 bg-gradient-to-b from-gradient-primary via-gradient-secondary to-gradient-primary px-2 py-0 font-medium text-xs cursor-pointer' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/sso/sso.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/sso/sso.tsx index 26f90dba4f..842ccb678c 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/sso/sso.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/sso/sso.tsx @@ -5,13 +5,13 @@ import { Check, ChevronDown, Copy, Eye, EyeOff } from 'lucide-react' import { Button, Combobox, Input, Label } from '@/components/emcn' import { Alert, AlertDescription } from '@/components/ui' import { Skeleton } from '@/components/ui/skeleton' -import { useSession } from '@/lib/auth-client' -import { isBillingEnabled } from '@/lib/environment' +import { useSession } from '@/lib/auth/auth-client' +import { getSubscriptionStatus } from '@/lib/billing/client/utils' +import { isBillingEnabled } from '@/lib/core/config/environment' +import { cn } from '@/lib/core/utils/cn' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getUserRole } from '@/lib/organization/helpers' -import { getSubscriptionStatus } from '@/lib/subscription/helpers' -import { getBaseUrl } from '@/lib/urls/utils' -import { cn } from '@/lib/utils' +import { getUserRole } from '@/lib/workspaces/organization/utils' import { useOrganizations } from '@/hooks/queries/organization' import { useConfigureSSO, useSSOProviders } from '@/hooks/queries/sso' import { useSubscriptionData } from '@/hooks/queries/subscription' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/components/cancel-subscription/cancel-subscription.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/components/cancel-subscription/cancel-subscription.tsx index 293b7aa97d..2e014e6b5f 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/components/cancel-subscription/cancel-subscription.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/components/cancel-subscription/cancel-subscription.tsx @@ -11,11 +11,11 @@ import { ModalHeader, ModalTitle, } from '@/components/emcn' -import { useSession, useSubscription } from '@/lib/auth-client' +import { useSession, useSubscription } from '@/lib/auth/auth-client' +import { getSubscriptionStatus } from '@/lib/billing/client/utils' +import { cn } from '@/lib/core/utils/cn' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getSubscriptionStatus } from '@/lib/subscription/helpers' -import { getBaseUrl } from '@/lib/urls/utils' -import { cn } from '@/lib/utils' import { organizationKeys, useOrganizations } from '@/hooks/queries/organization' import { subscriptionKeys, useSubscriptionData } from '@/hooks/queries/subscription' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/components/plan-card/plan-card.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/components/plan-card/plan-card.tsx index 46009c821a..244c5123be 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/components/plan-card/plan-card.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/components/plan-card/plan-card.tsx @@ -3,7 +3,7 @@ import type { ReactNode } from 'react' import type { LucideIcon } from 'lucide-react' import { Button } from '@/components/ui' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' export interface PlanFeature { icon: LucideIcon diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/components/usage-limit/usage-limit.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/components/usage-limit/usage-limit.tsx index 8539c8a5a1..134624d4a2 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/components/usage-limit/usage-limit.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/components/usage-limit/usage-limit.tsx @@ -3,8 +3,8 @@ import { forwardRef, useEffect, useImperativeHandle, useRef, useState } from 'react' import { Check, Pencil, X } from 'lucide-react' import { Button } from '@/components/ui/button' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { useUpdateOrganizationUsageLimit } from '@/hooks/queries/organization' import { useUpdateUsageLimit } from '@/hooks/queries/subscription' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/subscription.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/subscription.tsx index eb53590357..4b6d2c6301 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/subscription.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/subscription.tsx @@ -11,12 +11,12 @@ import { SelectTrigger, SelectValue, } from '@/components/ui/select' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' +import { useSubscriptionUpgrade } from '@/lib/billing/client/upgrade' +import { cn } from '@/lib/core/utils/cn' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getUserRole } from '@/lib/organization/helpers' -import { useSubscriptionUpgrade } from '@/lib/subscription/upgrade' -import { getBaseUrl } from '@/lib/urls/utils' -import { cn } from '@/lib/utils' +import { getUserRole } from '@/lib/workspaces/organization/utils' import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider' import { UsageHeader } from '@/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/shared/usage-header' import { diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/member-invitation-card/member-invitation-card.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/member-invitation-card/member-invitation-card.tsx index 78ee9adf79..c577713a3c 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/member-invitation-card/member-invitation-card.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/member-invitation-card/member-invitation-card.tsx @@ -9,8 +9,8 @@ import { PopoverTrigger, } from '@/components/emcn' import { Checkbox } from '@/components/ui/checkbox' -import { quickValidateEmail } from '@/lib/email/validation' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' +import { quickValidateEmail } from '@/lib/messaging/email/validation' type PermissionType = 'read' | 'write' | 'admin' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-members/team-members.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-members/team-members.tsx index be14eabb72..69d08e3705 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-members/team-members.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-members/team-members.tsx @@ -2,7 +2,7 @@ import { useState } from 'react' import { Button } from '@/components/emcn' import { UserAvatar } from '@/components/user-avatar/user-avatar' import { createLogger } from '@/lib/logs/console/logger' -import type { Invitation, Member, Organization } from '@/lib/organization' +import type { Invitation, Member, Organization } from '@/lib/workspaces/organization' import { useCancelInvitation, useOrganizationMembers } from '@/hooks/queries/organization' const logger = createLogger('TeamMembers') diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-seats-overview/team-seats-overview.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-seats-overview/team-seats-overview.tsx index 08a13ed244..7240f9797a 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-seats-overview/team-seats-overview.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-seats-overview/team-seats-overview.tsx @@ -1,7 +1,7 @@ import { Badge, Button } from '@/components/emcn' import { Skeleton } from '@/components/ui/skeleton' import { checkEnterprisePlan } from '@/lib/billing/subscriptions/utils' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const PILL_COUNT = 8 diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-seats/team-seats.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-seats/team-seats.tsx index cd4c8d6f10..e29d657a57 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-seats/team-seats.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-seats/team-seats.tsx @@ -13,7 +13,7 @@ import { } from '@/components/emcn' import { Label } from '@/components/ui/label' import { DEFAULT_TEAM_TIER_COST_LIMIT } from '@/lib/billing/constants' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' interface TeamSeatsProps { open: boolean diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-usage/team-usage.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-usage/team-usage.tsx index b1255e6312..8db05bf9e2 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-usage/team-usage.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-usage/team-usage.tsx @@ -1,8 +1,8 @@ import { useRef } from 'react' import { Skeleton } from '@/components/ui/skeleton' -import { useActiveOrganization } from '@/lib/auth-client' -import { getSubscriptionStatus } from '@/lib/subscription/helpers' -import { getBaseUrl } from '@/lib/urls/utils' +import { useActiveOrganization } from '@/lib/auth/auth-client' +import { getSubscriptionStatus } from '@/lib/billing/client/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' import { UsageHeader } from '@/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/shared/usage-header' import { UsageLimit, diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/team-management.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/team-management.tsx index 784758df48..5ddb240cbe 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/team-management.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/team-management.tsx @@ -1,11 +1,16 @@ import { useCallback, useEffect, useState } from 'react' import { Skeleton } from '@/components/ui' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' import { DEFAULT_TEAM_TIER_COST_LIMIT } from '@/lib/billing/constants' import { checkEnterprisePlan } from '@/lib/billing/subscriptions/utils' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' -import { generateSlug, getUsedSeats, getUserRole, isAdminOrOwner } from '@/lib/organization' +import { + generateSlug, + getUsedSeats, + getUserRole, + isAdminOrOwner, +} from '@/lib/workspaces/organization' import { MemberInvitationCard, NoOrganizationView, diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/settings-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/settings-modal.tsx index 0e092b80e4..3330879cf2 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/settings-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/settings-modal.tsx @@ -3,7 +3,7 @@ import { useCallback, useEffect, useRef, useState } from 'react' import * as VisuallyHidden from '@radix-ui/react-visually-hidden' import { Modal, ModalContent, ModalDescription, ModalTitle } from '@/components/emcn' -import { getEnv, isTruthy } from '@/lib/env' +import { getEnv, isTruthy } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' import { Account, diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/usage-indicator/rotating-digit.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/usage-indicator/rotating-digit.tsx index 202743c9db..48eb745885 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/usage-indicator/rotating-digit.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/usage-indicator/rotating-digit.tsx @@ -1,6 +1,6 @@ 'use client' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' export interface RotatingDigitProps { value: number | string diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/usage-indicator/usage-indicator.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/usage-indicator/usage-indicator.tsx index 7f01e43be5..d0c624c05d 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/usage-indicator/usage-indicator.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/usage-indicator/usage-indicator.tsx @@ -4,14 +4,14 @@ import { useEffect, useMemo, useState } from 'react' import { useQueryClient } from '@tanstack/react-query' import { Button } from '@/components/emcn' import { Skeleton } from '@/components/ui' -import { createLogger } from '@/lib/logs/console/logger' +import { isUsageAtLimit, USAGE_PILL_COLORS } from '@/lib/billing/client/usage-visualization' import { canUpgrade, getBillingStatus, getSubscriptionStatus, getUsage, -} from '@/lib/subscription/helpers' -import { isUsageAtLimit, USAGE_PILL_COLORS } from '@/lib/subscription/usage-visualization' +} from '@/lib/billing/client/utils' +import { createLogger } from '@/lib/logs/console/logger' import { RotatingDigit } from '@/app/workspace/[workspaceId]/w/components/sidebar/components-new/usage-indicator/rotating-digit' import { useSocket } from '@/app/workspace/providers/socket-provider' import { subscriptionKeys, useSubscriptionData } from '@/hooks/queries/subscription' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/workflow-list/components/workflow-item/avatars/avatars.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/workflow-list/components/workflow-item/avatars/avatars.tsx index 077ed8970b..f843e62a81 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/workflow-list/components/workflow-item/avatars/avatars.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/workflow-list/components/workflow-item/avatars/avatars.tsx @@ -3,7 +3,7 @@ import { type CSSProperties, useEffect, useMemo, useState } from 'react' import Image from 'next/image' import { Tooltip } from '@/components/emcn' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' import { getUserColor } from '@/app/workspace/[workspaceId]/w/utils/get-user-color' import { useSocket } from '@/app/workspace/providers/socket-provider' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/workspace-header/components/invite-modal/invite-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/workspace-header/components/invite-modal/invite-modal.tsx index cc18ec15f1..31e3abb330 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/workspace-header/components/invite-modal/invite-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/workspace-header/components/invite-modal/invite-modal.tsx @@ -5,11 +5,11 @@ import { Loader2, RotateCw, X } from 'lucide-react' import { useParams } from 'next/navigation' import { Badge, Button, Input, Modal, ModalContent, Tooltip } from '@/components/emcn' import { Skeleton } from '@/components/ui/skeleton' -import { useSession } from '@/lib/auth-client' -import { quickValidateEmail } from '@/lib/email/validation' +import { useSession } from '@/lib/auth/auth-client' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import type { PermissionType } from '@/lib/permissions/utils' -import { cn } from '@/lib/utils' +import { quickValidateEmail } from '@/lib/messaging/email/validation' +import type { PermissionType } from '@/lib/workspaces/permissions/utils' import { useUserPermissionsContext, useWorkspacePermissionsContext, 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 a355f6f243..7d214f9a97 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 @@ -5,13 +5,13 @@ import { Download, Folder, Plus } from 'lucide-react' import { useParams, useRouter } from 'next/navigation' import { Button } from '@/components/ui/button' import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { extractWorkflowName, extractWorkflowsFromFiles, extractWorkflowsFromZip, -} from '@/lib/workflows/import-export' +} from '@/lib/workflows/operations/import-export' import { generateFolderName } from '@/lib/workspaces/naming' import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider' import { useCreateFolder } from '@/hooks/queries/folders' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/keyboard-shortcut/keyboard-shortcut.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/keyboard-shortcut/keyboard-shortcut.tsx index 734dec1432..d864fcf6aa 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/keyboard-shortcut/keyboard-shortcut.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/keyboard-shortcut/keyboard-shortcut.tsx @@ -1,4 +1,4 @@ -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' interface KeyboardShortcutProps { shortcut: string diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/knowledge-base-tags/components/document-list.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/knowledge-base-tags/components/document-list.tsx index 389a3ee7f5..730006c1d8 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/knowledge-base-tags/components/document-list.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/knowledge-base-tags/components/document-list.tsx @@ -1,4 +1,4 @@ -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { getDocumentIcon } from '@/app/workspace/[workspaceId]/knowledge/components/icons/document-icons' interface Document { diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/knowledge-base-tags/knowledge-base-tags.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/knowledge-base-tags/knowledge-base-tags.tsx index df57a2cade..307c217621 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/knowledge-base-tags/knowledge-base-tags.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/knowledge-base-tags/knowledge-base-tags.tsx @@ -33,7 +33,7 @@ import { AlertDialogTitle, } from '@/components/ui/alert-dialog' import { ScrollArea } from '@/components/ui/scroll-area' -import { MAX_TAG_SLOTS } from '@/lib/knowledge/consts' +import { MAX_TAG_SLOTS } from '@/lib/knowledge/constants' import { createLogger } from '@/lib/logs/console/logger' import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider' import { DocumentList } from '@/app/workspace/[workspaceId]/w/components/sidebar/components/knowledge-base-tags/components/document-list' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/knowledge-tags/knowledge-tags.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/knowledge-tags/knowledge-tags.tsx index 1cb522a2cc..94538e2ac1 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/knowledge-tags/knowledge-tags.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/knowledge-tags/knowledge-tags.tsx @@ -17,7 +17,7 @@ import { SelectValue, } from '@/components/ui' import { ScrollArea } from '@/components/ui/scroll-area' -import { MAX_TAG_SLOTS, TAG_SLOTS, type TagSlot } from '@/lib/knowledge/consts' +import { MAX_TAG_SLOTS, TAG_SLOTS, type TagSlot } from '@/lib/knowledge/constants' import { createLogger } from '@/lib/logs/console/logger' import type { DocumentTag } from '@/app/workspace/[workspaceId]/knowledge/components/document-tag-entry/document-tag-entry' import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/navigation-item/navigation-item.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/navigation-item/navigation-item.tsx index ca0e00428e..95c2b8703b 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/navigation-item/navigation-item.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/navigation-item/navigation-item.tsx @@ -1,6 +1,6 @@ import { Tooltip } from '@/components/emcn' import { Button } from '@/components/ui' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' interface NavigationItemProps { item: { diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/subscription-modal/subscription-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/subscription-modal/subscription-modal.tsx index d09a6721a9..04b2b1a657 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/subscription-modal/subscription-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/subscription-modal/subscription-modal.tsx @@ -23,11 +23,11 @@ import { AlertDialogTitle, } from '@/components/ui/alert-dialog' import { Button } from '@/components/ui/button' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' +import { useSubscriptionUpgrade } from '@/lib/billing/client/upgrade' +import { getSubscriptionStatus } from '@/lib/billing/client/utils' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { getSubscriptionStatus } from '@/lib/subscription/helpers' -import { useSubscriptionUpgrade } from '@/lib/subscription/upgrade' -import { cn } from '@/lib/utils' import { useOrganizations } from '@/hooks/queries/organization' import { useSubscriptionData } from '@/hooks/queries/subscription' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/workflow-list.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/workflow-list.tsx index 527270dfe5..4f4128e58b 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/workflow-list.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/workflow-list.tsx @@ -5,7 +5,7 @@ import clsx from 'clsx' import Link from 'next/link' import { useParams, usePathname } from 'next/navigation' import { Skeleton } from '@/components/ui/skeleton' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' import type { WorkflowMetadata } from '@/stores/workflows/registry/types' interface WorkflowItemProps { diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-header/workspace-header.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-header/workspace-header.tsx index aee5172563..7e8b1978b9 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-header/workspace-header.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-header/workspace-header.tsx @@ -5,7 +5,7 @@ import { ChevronDown, ChevronUp, PanelLeft } from 'lucide-react' import { Tooltip } from '@/components/emcn' import { Button } from '@/components/ui/button' import { Skeleton } from '@/components/ui/skeleton' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' /** * Workspace entity interface 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 b370e767b6..834cd91bca 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 @@ -15,9 +15,9 @@ import { Button as UIButton } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { ScrollArea } from '@/components/ui/scroll-area' import { Skeleton } from '@/components/ui/skeleton' -import { isDev } from '@/lib/environment' +import { isDev } from '@/lib/core/config/environment' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider' import { InviteModal } from '@/app/workspace/[workspaceId]/w/components/sidebar/components-new/workspace-header/components/invite-modal/invite-modal' @@ -309,7 +309,7 @@ export function WorkspaceSelector({ setIsExporting(true) try { - const { exportWorkspaceToZip } = await import('@/lib/workflows/import-export') + const { exportWorkspaceToZip } = await import('@/lib/workflows/operations/import-export') const { useFolderStore } = await import('@/stores/folders/store') const workflowsUrl = new URL('/api/workflows', window.location.origin) diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar-new.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar-new.tsx index 6162db6f86..c59aa829f6 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar-new.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar-new.tsx @@ -4,8 +4,8 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { ArrowDown, Plus, Search } from 'lucide-react' import { useParams, useRouter } from 'next/navigation' import { Button, FolderPlus, Tooltip } from '@/components/emcn' -import { useSession } from '@/lib/auth-client' -import { getEnv, isTruthy } from '@/lib/env' +import { useSession } from '@/lib/auth/auth-client' +import { getEnv, isTruthy } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' import { useRegisterGlobalCommands } from '@/app/workspace/[workspaceId]/providers/global-commands-provider' import { createCommands } from '@/app/workspace/[workspaceId]/utils/commands-utils' 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 40f6715a94..a22ecc7337 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsx @@ -4,10 +4,10 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { Search } from 'lucide-react' import { useParams, usePathname, useRouter } from 'next/navigation' import { ScrollArea } from '@/components/ui' -import { useSession } from '@/lib/auth-client' -import { getEnv, isTruthy } from '@/lib/env' +import { useSession } from '@/lib/auth/auth-client' +import { canUpgrade, getBillingStatus } from '@/lib/billing/client/utils' +import { getEnv, isTruthy } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' -import { canUpgrade, getBillingStatus } from '@/lib/subscription/helpers' import { generateWorkspaceName } from '@/lib/workspaces/naming' import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider' import { diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview.tsx index 33dfa4b7ac..ca4674596f 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview.tsx @@ -12,8 +12,8 @@ import ReactFlow, { } from 'reactflow' import 'reactflow/dist/style.css' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { NoteBlock } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/note-block/note-block' import { SubflowNodeComponent } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/subflow-node' import { WorkflowBlock } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/workflow-block' diff --git a/apps/sim/app/workspace/[workspaceId]/w/hooks/use-export-workflow.ts b/apps/sim/app/workspace/[workspaceId]/w/hooks/use-export-workflow.ts index 453d7c8718..31b654d316 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/hooks/use-export-workflow.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/hooks/use-export-workflow.ts @@ -1,7 +1,7 @@ import { useCallback, useState } from 'react' import JSZip from 'jszip' import { createLogger } from '@/lib/logs/console/logger' -import { sanitizeForExport } from '@/lib/workflows/json-sanitizer' +import { sanitizeForExport } from '@/lib/workflows/sanitization/json-sanitizer' import { useFolderStore } from '@/stores/folders/store' import { useWorkflowRegistry } from '@/stores/workflows/registry/store' diff --git a/apps/sim/app/workspace/[workspaceId]/w/hooks/use-export-workspace.ts b/apps/sim/app/workspace/[workspaceId]/w/hooks/use-export-workspace.ts index 6581f0eae0..e82b5b7529 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/hooks/use-export-workspace.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/hooks/use-export-workspace.ts @@ -1,6 +1,9 @@ import { useCallback, useState } from 'react' import { createLogger } from '@/lib/logs/console/logger' -import { exportWorkspaceToZip, type WorkflowExportData } from '@/lib/workflows/import-export' +import { + exportWorkspaceToZip, + type WorkflowExportData, +} from '@/lib/workflows/operations/import-export' const logger = createLogger('useExportWorkspace') diff --git a/apps/sim/app/workspace/[workspaceId]/w/hooks/use-import-workflow.ts b/apps/sim/app/workspace/[workspaceId]/w/hooks/use-import-workflow.ts index 361b21e236..921f3f7a0b 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/hooks/use-import-workflow.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/hooks/use-import-workflow.ts @@ -6,7 +6,7 @@ import { extractWorkflowName, extractWorkflowsFromFiles, extractWorkflowsFromZip, -} from '@/lib/workflows/import-export' +} from '@/lib/workflows/operations/import-export' import { folderKeys, useCreateFolder } from '@/hooks/queries/folders' import { useCreateWorkflow, workflowKeys } from '@/hooks/queries/workflows' import { useWorkflowDiffStore } from '@/stores/workflow-diff/store' diff --git a/apps/sim/app/workspace/[workspaceId]/w/hooks/use-import-workspace.ts b/apps/sim/app/workspace/[workspaceId]/w/hooks/use-import-workspace.ts index 518d390d6b..0a9d1bf63e 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/hooks/use-import-workspace.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/hooks/use-import-workspace.ts @@ -1,7 +1,10 @@ import { useCallback, useState } from 'react' import { useRouter } from 'next/navigation' import { createLogger } from '@/lib/logs/console/logger' -import { extractWorkflowName, extractWorkflowsFromZip } from '@/lib/workflows/import-export' +import { + extractWorkflowName, + extractWorkflowsFromZip, +} from '@/lib/workflows/operations/import-export' import { useCreateFolder } from '@/hooks/queries/folders' import { useWorkflowDiffStore } from '@/stores/workflow-diff/store' import { parseWorkflowJson } from '@/stores/workflows/json/importer' diff --git a/apps/sim/app/workspace/layout.tsx b/apps/sim/app/workspace/layout.tsx index e15dd21384..a6ed2dc814 100644 --- a/apps/sim/app/workspace/layout.tsx +++ b/apps/sim/app/workspace/layout.tsx @@ -1,6 +1,6 @@ 'use client' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' import { SocketProvider } from '@/app/workspace/providers/socket-provider' interface WorkspaceRootLayoutProps { diff --git a/apps/sim/app/workspace/page.tsx b/apps/sim/app/workspace/page.tsx index 5e9ddf0e3a..8119142e47 100644 --- a/apps/sim/app/workspace/page.tsx +++ b/apps/sim/app/workspace/page.tsx @@ -3,7 +3,7 @@ import { useEffect } from 'react' import { Loader2 } from 'lucide-react' import { useRouter } from 'next/navigation' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('WorkspacePage') diff --git a/apps/sim/app/workspace/providers/socket-provider.tsx b/apps/sim/app/workspace/providers/socket-provider.tsx index 5f8feb1115..df89bee5c1 100644 --- a/apps/sim/app/workspace/providers/socket-provider.tsx +++ b/apps/sim/app/workspace/providers/socket-provider.tsx @@ -11,7 +11,7 @@ import { } from 'react' import { useParams } from 'next/navigation' import { io, type Socket } from 'socket.io-client' -import { getEnv } from '@/lib/env' +import { getEnv } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('SocketContext') diff --git a/apps/sim/background/knowledge-processing.ts b/apps/sim/background/knowledge-processing.ts index f5b2d6880d..2d5e9a9821 100644 --- a/apps/sim/background/knowledge-processing.ts +++ b/apps/sim/background/knowledge-processing.ts @@ -1,5 +1,5 @@ import { task } from '@trigger.dev/sdk' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { processDocumentAsync } from '@/lib/knowledge/documents/service' import { createLogger } from '@/lib/logs/console/logger' diff --git a/apps/sim/background/logs-webhook-delivery.ts b/apps/sim/background/logs-webhook-delivery.ts index 9ad0df2d91..394af902ec 100644 --- a/apps/sim/background/logs-webhook-delivery.ts +++ b/apps/sim/background/logs-webhook-delivery.ts @@ -8,9 +8,9 @@ import { import { task, wait } from '@trigger.dev/sdk' import { and, eq, isNull, lte, or, sql } from 'drizzle-orm' import { v4 as uuidv4 } from 'uuid' +import { decryptSecret } from '@/lib/core/security/encryption' import { createLogger } from '@/lib/logs/console/logger' import type { WorkflowExecutionLog } from '@/lib/logs/types' -import { decryptSecret } from '@/lib/utils' const logger = createLogger('LogsWebhookDelivery') diff --git a/apps/sim/background/schedule-execution.ts b/apps/sim/background/schedule-execution.ts index e6cfd408ce..34a352e8e7 100644 --- a/apps/sim/background/schedule-execution.ts +++ b/apps/sim/background/schedule-execution.ts @@ -4,20 +4,23 @@ import { Cron } from 'croner' import { eq } from 'drizzle-orm' import { v4 as uuidv4 } from 'uuid' import type { ZodRecord, ZodString } from 'zod' +import { decryptSecret } from '@/lib/core/security/encryption' import { getPersonalAndWorkspaceEnv } from '@/lib/environment/utils' import { preprocessExecution } from '@/lib/execution/preprocessing' import { createLogger } from '@/lib/logs/console/logger' import { LoggingSession } from '@/lib/logs/execution/logging-session' +import { executeWorkflowCore } from '@/lib/workflows/executor/execution-core' +import { PauseResumeManager } from '@/lib/workflows/executor/human-in-the-loop-manager' +import { + blockExistsInDeployment, + loadDeployedWorkflowState, +} from '@/lib/workflows/persistence/utils' import { type BlockState, calculateNextRunTime as calculateNextTime, getScheduleTimeValues, getSubBlockValue, -} from '@/lib/schedules/utils' -import { decryptSecret } from '@/lib/utils' -import { blockExistsInDeployment, loadDeployedWorkflowState } from '@/lib/workflows/db-helpers' -import { executeWorkflowCore } from '@/lib/workflows/executor/execution-core' -import { PauseResumeManager } from '@/lib/workflows/executor/human-in-the-loop-manager' +} from '@/lib/workflows/schedules/utils' import { type ExecutionMetadata, ExecutionSnapshot } from '@/executor/execution/snapshot' import { mergeSubblockState } from '@/stores/workflows/server-utils' diff --git a/apps/sim/background/webhook-execution.ts b/apps/sim/background/webhook-execution.ts index 74428f0d01..ea8bc11d28 100644 --- a/apps/sim/background/webhook-execution.ts +++ b/apps/sim/background/webhook-execution.ts @@ -3,19 +3,19 @@ import { webhook, workflow as workflowTable } from '@sim/db/schema' import { task } from '@trigger.dev/sdk' import { eq } from 'drizzle-orm' import { v4 as uuidv4 } from 'uuid' +import { IdempotencyService, webhookIdempotency } from '@/lib/core/idempotency' import { processExecutionFiles } from '@/lib/execution/files' -import { IdempotencyService, webhookIdempotency } from '@/lib/idempotency' 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 { WebhookAttachmentProcessor } from '@/lib/webhooks/attachment-processor' import { fetchAndProcessAirtablePayloads, formatWebhookInput } from '@/lib/webhooks/utils.server' +import { executeWorkflowCore } from '@/lib/workflows/executor/execution-core' +import { PauseResumeManager } from '@/lib/workflows/executor/human-in-the-loop-manager' import { loadDeployedWorkflowState, loadWorkflowFromNormalizedTables, -} from '@/lib/workflows/db-helpers' -import { executeWorkflowCore } from '@/lib/workflows/executor/execution-core' -import { PauseResumeManager } from '@/lib/workflows/executor/human-in-the-loop-manager' +} from '@/lib/workflows/persistence/utils' import { getWorkflowById } from '@/lib/workflows/utils' import { type ExecutionMetadata, ExecutionSnapshot } from '@/executor/execution/snapshot' import type { ExecutionResult } from '@/executor/types' diff --git a/apps/sim/blocks/blocks/agent.ts b/apps/sim/blocks/blocks/agent.ts index 3e2c3e0829..d57b7d3021 100644 --- a/apps/sim/blocks/blocks/agent.ts +++ b/apps/sim/blocks/blocks/agent.ts @@ -1,5 +1,5 @@ import { AgentIcon } from '@/components/icons' -import { isHosted } from '@/lib/environment' +import { isHosted } from '@/lib/core/config/environment' import { createLogger } from '@/lib/logs/console/logger' import type { BlockConfig } from '@/blocks/types' import { AuthMode } from '@/blocks/types' diff --git a/apps/sim/blocks/blocks/evaluator.ts b/apps/sim/blocks/blocks/evaluator.ts index 2ea9f6ec89..fa291521c9 100644 --- a/apps/sim/blocks/blocks/evaluator.ts +++ b/apps/sim/blocks/blocks/evaluator.ts @@ -1,5 +1,5 @@ import { ChartBarIcon } from '@/components/icons' -import { isHosted } from '@/lib/environment' +import { isHosted } from '@/lib/core/config/environment' import { createLogger } from '@/lib/logs/console/logger' import type { BlockConfig, ParamType } from '@/blocks/types' import type { ProviderId } from '@/providers/types' diff --git a/apps/sim/blocks/blocks/guardrails.ts b/apps/sim/blocks/blocks/guardrails.ts index 3a39892ccc..5af165f3ee 100644 --- a/apps/sim/blocks/blocks/guardrails.ts +++ b/apps/sim/blocks/blocks/guardrails.ts @@ -1,5 +1,5 @@ import { ShieldCheckIcon } from '@/components/icons' -import { isHosted } from '@/lib/environment' +import { isHosted } from '@/lib/core/config/environment' import type { BlockConfig } from '@/blocks/types' import { getHostedModels, getProviderIcon } from '@/providers/utils' import { useProvidersStore } from '@/stores/providers/store' diff --git a/apps/sim/blocks/blocks/router.ts b/apps/sim/blocks/blocks/router.ts index 2e6d829bbd..31daa27e2d 100644 --- a/apps/sim/blocks/blocks/router.ts +++ b/apps/sim/blocks/blocks/router.ts @@ -1,5 +1,5 @@ import { ConnectIcon } from '@/components/icons' -import { isHosted } from '@/lib/environment' +import { isHosted } from '@/lib/core/config/environment' import { AuthMode, type BlockConfig } from '@/blocks/types' import type { ProviderId } from '@/providers/types' import { diff --git a/apps/sim/blocks/blocks/translate.ts b/apps/sim/blocks/blocks/translate.ts index 65ff1f8c08..7b81ec6a66 100644 --- a/apps/sim/blocks/blocks/translate.ts +++ b/apps/sim/blocks/blocks/translate.ts @@ -1,5 +1,5 @@ import { TranslateIcon } from '@/components/icons' -import { isHosted } from '@/lib/environment' +import { isHosted } from '@/lib/core/config/environment' import { AuthMode, type BlockConfig } from '@/blocks/types' import { getAllModelProviders, diff --git a/apps/sim/components.json b/apps/sim/components.json index 111910b2cc..eea8c1fbb8 100644 --- a/apps/sim/components.json +++ b/apps/sim/components.json @@ -12,7 +12,7 @@ }, "aliases": { "components": "@/components", - "utils": "@/lib/utils", + "utils": "@/lib/core/utils/cn", "ui": "@/components/ui", "lib": "@/lib", "hooks": "@/hooks", diff --git a/apps/sim/components/analytics/onedollarstats.tsx b/apps/sim/components/analytics/onedollarstats.tsx index 8bf27d2bf0..2a22093be5 100644 --- a/apps/sim/components/analytics/onedollarstats.tsx +++ b/apps/sim/components/analytics/onedollarstats.tsx @@ -2,7 +2,7 @@ import { useEffect } from 'react' import { configure } from 'onedollarstats' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' export function OneDollarStats() { useEffect(() => { diff --git a/apps/sim/components/emails/batch-invitation-email.tsx b/apps/sim/components/emails/batch-invitation-email.tsx index 9ec2f16ef2..fa67ae096c 100644 --- a/apps/sim/components/emails/batch-invitation-email.tsx +++ b/apps/sim/components/emails/batch-invitation-email.tsx @@ -14,7 +14,7 @@ import { import { baseStyles } from '@/components/emails/base-styles' import EmailFooter from '@/components/emails/footer' import { getBrandConfig } from '@/lib/branding/branding' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' interface WorkspaceInvitation { workspaceId: string diff --git a/apps/sim/components/emails/billing/enterprise-subscription-email.tsx b/apps/sim/components/emails/billing/enterprise-subscription-email.tsx index dc09fe20dc..f65930ad20 100644 --- a/apps/sim/components/emails/billing/enterprise-subscription-email.tsx +++ b/apps/sim/components/emails/billing/enterprise-subscription-email.tsx @@ -15,7 +15,7 @@ import { format } from 'date-fns' import { baseStyles } from '@/components/emails/base-styles' import EmailFooter from '@/components/emails/footer' import { getBrandConfig } from '@/lib/branding/branding' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' interface EnterpriseSubscriptionEmailProps { userName?: string diff --git a/apps/sim/components/emails/billing/free-tier-upgrade-email.tsx b/apps/sim/components/emails/billing/free-tier-upgrade-email.tsx index 592f4a1323..857a3e9a9a 100644 --- a/apps/sim/components/emails/billing/free-tier-upgrade-email.tsx +++ b/apps/sim/components/emails/billing/free-tier-upgrade-email.tsx @@ -15,7 +15,7 @@ import { import { baseStyles } from '@/components/emails/base-styles' import EmailFooter from '@/components/emails/footer' import { getBrandConfig } from '@/lib/branding/branding' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' interface FreeTierUpgradeEmailProps { userName?: string diff --git a/apps/sim/components/emails/billing/payment-failed-email.tsx b/apps/sim/components/emails/billing/payment-failed-email.tsx index 1d7f41810f..17d9087a20 100644 --- a/apps/sim/components/emails/billing/payment-failed-email.tsx +++ b/apps/sim/components/emails/billing/payment-failed-email.tsx @@ -15,7 +15,7 @@ import { import { baseStyles } from '@/components/emails/base-styles' import EmailFooter from '@/components/emails/footer' import { getBrandConfig } from '@/lib/branding/branding' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' interface PaymentFailedEmailProps { userName?: string diff --git a/apps/sim/components/emails/billing/plan-welcome-email.tsx b/apps/sim/components/emails/billing/plan-welcome-email.tsx index ca3745cbfb..fbac398b81 100644 --- a/apps/sim/components/emails/billing/plan-welcome-email.tsx +++ b/apps/sim/components/emails/billing/plan-welcome-email.tsx @@ -15,7 +15,7 @@ import { import { baseStyles } from '@/components/emails/base-styles' import EmailFooter from '@/components/emails/footer' import { getBrandConfig } from '@/lib/branding/branding' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' interface PlanWelcomeEmailProps { planName: 'Pro' | 'Team' diff --git a/apps/sim/components/emails/billing/usage-threshold-email.tsx b/apps/sim/components/emails/billing/usage-threshold-email.tsx index d1b9f3b122..1885e2e60a 100644 --- a/apps/sim/components/emails/billing/usage-threshold-email.tsx +++ b/apps/sim/components/emails/billing/usage-threshold-email.tsx @@ -15,7 +15,7 @@ import { import { baseStyles } from '@/components/emails/base-styles' import EmailFooter from '@/components/emails/footer' import { getBrandConfig } from '@/lib/branding/branding' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' interface UsageThresholdEmailProps { userName?: string diff --git a/apps/sim/components/emails/careers/careers-confirmation-email.tsx b/apps/sim/components/emails/careers/careers-confirmation-email.tsx index 0577686da6..6c15c1c09a 100644 --- a/apps/sim/components/emails/careers/careers-confirmation-email.tsx +++ b/apps/sim/components/emails/careers/careers-confirmation-email.tsx @@ -14,7 +14,7 @@ import { format } from 'date-fns' import { baseStyles } from '@/components/emails/base-styles' import EmailFooter from '@/components/emails/footer' import { getBrandConfig } from '@/lib/branding/branding' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' interface CareersConfirmationEmailProps { name: string diff --git a/apps/sim/components/emails/careers/careers-submission-email.tsx b/apps/sim/components/emails/careers/careers-submission-email.tsx index 5d3e79d89b..9beed5d3ad 100644 --- a/apps/sim/components/emails/careers/careers-submission-email.tsx +++ b/apps/sim/components/emails/careers/careers-submission-email.tsx @@ -13,7 +13,7 @@ import { import { format } from 'date-fns' import { baseStyles } from '@/components/emails/base-styles' import { getBrandConfig } from '@/lib/branding/branding' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' interface CareersSubmissionEmailProps { name: string diff --git a/apps/sim/components/emails/footer.tsx b/apps/sim/components/emails/footer.tsx index 7ee919fcfb..6b45e7e011 100644 --- a/apps/sim/components/emails/footer.tsx +++ b/apps/sim/components/emails/footer.tsx @@ -1,7 +1,7 @@ import { Container, Img, Link, Section, Text } from '@react-email/components' import { getBrandConfig } from '@/lib/branding/branding' -import { isHosted } from '@/lib/environment' -import { getBaseUrl } from '@/lib/urls/utils' +import { isHosted } from '@/lib/core/config/environment' +import { getBaseUrl } from '@/lib/core/utils/urls' interface UnsubscribeOptions { unsubscribeToken?: string diff --git a/apps/sim/components/emails/help-confirmation-email.tsx b/apps/sim/components/emails/help-confirmation-email.tsx index f6b6320564..834fd233ec 100644 --- a/apps/sim/components/emails/help-confirmation-email.tsx +++ b/apps/sim/components/emails/help-confirmation-email.tsx @@ -14,7 +14,7 @@ import { format } from 'date-fns' import { baseStyles } from '@/components/emails/base-styles' import EmailFooter from '@/components/emails/footer' import { getBrandConfig } from '@/lib/branding/branding' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' interface HelpConfirmationEmailProps { userEmail?: string diff --git a/apps/sim/components/emails/invitation-email.tsx b/apps/sim/components/emails/invitation-email.tsx index d8eb567398..a698fa3b82 100644 --- a/apps/sim/components/emails/invitation-email.tsx +++ b/apps/sim/components/emails/invitation-email.tsx @@ -15,8 +15,8 @@ import { format } from 'date-fns' import { baseStyles } from '@/components/emails/base-styles' import EmailFooter from '@/components/emails/footer' import { getBrandConfig } from '@/lib/branding/branding' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' interface InvitationEmailProps { inviterName?: string diff --git a/apps/sim/components/emails/otp-verification-email.tsx b/apps/sim/components/emails/otp-verification-email.tsx index 913a2936fb..1fdaa87ffe 100644 --- a/apps/sim/components/emails/otp-verification-email.tsx +++ b/apps/sim/components/emails/otp-verification-email.tsx @@ -13,7 +13,7 @@ import { import { baseStyles } from '@/components/emails/base-styles' import EmailFooter from '@/components/emails/footer' import { getBrandConfig } from '@/lib/branding/branding' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' interface OTPVerificationEmailProps { otp: string diff --git a/apps/sim/components/emails/render-email.ts b/apps/sim/components/emails/render-email.ts index 313a74f145..48fd0bbc12 100644 --- a/apps/sim/components/emails/render-email.ts +++ b/apps/sim/components/emails/render-email.ts @@ -11,7 +11,7 @@ import { } from '@/components/emails' import FreeTierUpgradeEmail from '@/components/emails/billing/free-tier-upgrade-email' import { getBrandConfig } from '@/lib/branding/branding' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' export async function renderOTPEmail( otp: string, diff --git a/apps/sim/components/emails/reset-password-email.tsx b/apps/sim/components/emails/reset-password-email.tsx index db921ef5e9..92d86b1ca8 100644 --- a/apps/sim/components/emails/reset-password-email.tsx +++ b/apps/sim/components/emails/reset-password-email.tsx @@ -15,7 +15,7 @@ import { format } from 'date-fns' import { baseStyles } from '@/components/emails/base-styles' import EmailFooter from '@/components/emails/footer' import { getBrandConfig } from '@/lib/branding/branding' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' interface ResetPasswordEmailProps { username?: string diff --git a/apps/sim/components/emails/workspace-invitation.tsx b/apps/sim/components/emails/workspace-invitation.tsx index 89ff2ac28e..61e2429ff2 100644 --- a/apps/sim/components/emails/workspace-invitation.tsx +++ b/apps/sim/components/emails/workspace-invitation.tsx @@ -14,8 +14,8 @@ import { import { baseStyles } from '@/components/emails/base-styles' import EmailFooter from '@/components/emails/footer' import { getBrandConfig } from '@/lib/branding/branding' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' const logger = createLogger('WorkspaceInvitationEmail') diff --git a/apps/sim/components/emcn/components/badge/badge.tsx b/apps/sim/components/emcn/components/badge/badge.tsx index 9bd5bbabc2..0508f92cd7 100644 --- a/apps/sim/components/emcn/components/badge/badge.tsx +++ b/apps/sim/components/emcn/components/badge/badge.tsx @@ -1,6 +1,6 @@ import type * as React from 'react' import { cva, type VariantProps } from 'class-variance-authority' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const badgeVariants = cva( 'inline-flex items-center px-[9px] py-[2.25px] text-[13px] font-medium gap-[4px] rounded-[40px] focus:outline-none transition-colors', diff --git a/apps/sim/components/emcn/components/button/button.tsx b/apps/sim/components/emcn/components/button/button.tsx index 91e55bddcd..553d165e1d 100644 --- a/apps/sim/components/emcn/components/button/button.tsx +++ b/apps/sim/components/emcn/components/button/button.tsx @@ -1,6 +1,6 @@ import type * as React from 'react' import { cva, type VariantProps } from 'class-variance-authority' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const buttonVariants = cva( 'inline-flex items-center text-[var(--text-secondary)] hover:text-[var(--text-primary)] dark:hover:text-[var(--text-primary)] dark:text-[var(--text-secondary)] justify-center font-medium transition-colors disabled:pointer-events-none disabled:opacity-50 outline-none focus:outline-none focus-visible:outline-none rounded-[4px] px-[8px] py-[6px] text-[12px]', diff --git a/apps/sim/components/emcn/components/code/code.tsx b/apps/sim/components/emcn/components/code/code.tsx index 7f883837df..addaf40b46 100644 --- a/apps/sim/components/emcn/components/code/code.tsx +++ b/apps/sim/components/emcn/components/code/code.tsx @@ -3,7 +3,7 @@ import { highlight, languages } from 'prismjs' import 'prismjs/components/prism-javascript' import 'prismjs/components/prism-python' import 'prismjs/components/prism-json' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import './code.css' /** diff --git a/apps/sim/components/emcn/components/combobox/combobox.tsx b/apps/sim/components/emcn/components/combobox/combobox.tsx index af21d087f4..e44d0c5ddb 100644 --- a/apps/sim/components/emcn/components/combobox/combobox.tsx +++ b/apps/sim/components/emcn/components/combobox/combobox.tsx @@ -14,7 +14,7 @@ import { } from 'react' import { cva, type VariantProps } from 'class-variance-authority' import { Check, ChevronDown, Loader2 } from 'lucide-react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { Input } from '../input/input' import { Popover, PopoverAnchor, PopoverContent, PopoverScrollArea } from '../popover/popover' diff --git a/apps/sim/components/emcn/components/input/input.tsx b/apps/sim/components/emcn/components/input/input.tsx index 0b9a2551a1..9828370499 100644 --- a/apps/sim/components/emcn/components/input/input.tsx +++ b/apps/sim/components/emcn/components/input/input.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import { cva, type VariantProps } from 'class-variance-authority' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const inputVariants = cva( 'flex w-full rounded-[4px] border border-[var(--surface-11)] bg-[var(--surface-6)] dark:bg-[var(--surface-9)] px-[8px] py-[6px] font-medium font-sans text-sm text-foreground transition-colors placeholder:text-[var(--text-muted)] dark:placeholder:text-[var(--text-muted)] outline-none focus:outline-none focus-visible:outline-none focus-visible:ring-0 focus-visible:ring-offset-0 disabled:cursor-not-allowed disabled:opacity-50', diff --git a/apps/sim/components/emcn/components/label/label.tsx b/apps/sim/components/emcn/components/label/label.tsx index ad87c3860d..eeb5dbbfb6 100644 --- a/apps/sim/components/emcn/components/label/label.tsx +++ b/apps/sim/components/emcn/components/label/label.tsx @@ -1,7 +1,7 @@ 'use client' import * as LabelPrimitive from '@radix-ui/react-label' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' export interface LabelProps extends React.ComponentPropsWithoutRef {} diff --git a/apps/sim/components/emcn/components/modal/modal.tsx b/apps/sim/components/emcn/components/modal/modal.tsx index 2c736407c2..debada6593 100644 --- a/apps/sim/components/emcn/components/modal/modal.tsx +++ b/apps/sim/components/emcn/components/modal/modal.tsx @@ -37,7 +37,7 @@ import * as React from 'react' import * as DialogPrimitive from '@radix-ui/react-dialog' import { X } from 'lucide-react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' /** * Modal z-index configuration diff --git a/apps/sim/components/emcn/components/popover/popover.tsx b/apps/sim/components/emcn/components/popover/popover.tsx index 9be2759f15..21e034b707 100644 --- a/apps/sim/components/emcn/components/popover/popover.tsx +++ b/apps/sim/components/emcn/components/popover/popover.tsx @@ -52,7 +52,7 @@ import * as React from 'react' import * as PopoverPrimitive from '@radix-ui/react-popover' import { Check, ChevronLeft, ChevronRight, Search } from 'lucide-react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' /** * Shared base styles for all popover interactive items. diff --git a/apps/sim/components/emcn/components/textarea/textarea.tsx b/apps/sim/components/emcn/components/textarea/textarea.tsx index 8d68b915db..55b969d05d 100644 --- a/apps/sim/components/emcn/components/textarea/textarea.tsx +++ b/apps/sim/components/emcn/components/textarea/textarea.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import { cva, type VariantProps } from 'class-variance-authority' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const textareaVariants = cva( 'flex w-full rounded-[4px] border border-[var(--surface-11)] bg-[var(--surface-6)] dark:bg-[var(--surface-9)] px-[8px] py-[8px] font-medium font-sans text-sm text-[var(--text-primary)] transition-colors placeholder:text-[var(--text-muted)] dark:placeholder:text-[var(--text-muted)] outline-none focus:outline-none focus-visible:outline-none focus-visible:ring-0 focus-visible:ring-offset-0 resize overflow-auto disabled:cursor-not-allowed disabled:opacity-50', diff --git a/apps/sim/components/emcn/components/tooltip/tooltip.tsx b/apps/sim/components/emcn/components/tooltip/tooltip.tsx index 0a395b464c..60a8d0d766 100644 --- a/apps/sim/components/emcn/components/tooltip/tooltip.tsx +++ b/apps/sim/components/emcn/components/tooltip/tooltip.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import * as TooltipPrimitive from '@radix-ui/react-tooltip' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' /** * Tooltip provider component that must wrap your app or tooltip usage area. diff --git a/apps/sim/components/ui/alert-dialog.tsx b/apps/sim/components/ui/alert-dialog.tsx index 1c5fa95415..0832617d86 100644 --- a/apps/sim/components/ui/alert-dialog.tsx +++ b/apps/sim/components/ui/alert-dialog.tsx @@ -4,7 +4,7 @@ import * as React from 'react' import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog' import { X } from 'lucide-react' import { buttonVariants } from '@/components/ui/button' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const AlertDialog = AlertDialogPrimitive.Root diff --git a/apps/sim/components/ui/alert.tsx b/apps/sim/components/ui/alert.tsx index 9bf24b2b01..03e20be290 100644 --- a/apps/sim/components/ui/alert.tsx +++ b/apps/sim/components/ui/alert.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import { cva, type VariantProps } from 'class-variance-authority' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const alertVariants = cva( 'relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground', diff --git a/apps/sim/components/ui/avatar.tsx b/apps/sim/components/ui/avatar.tsx index 6ecb201311..9c21457ce5 100644 --- a/apps/sim/components/ui/avatar.tsx +++ b/apps/sim/components/ui/avatar.tsx @@ -3,7 +3,7 @@ import * as React from 'react' import * as AvatarPrimitive from '@radix-ui/react-avatar' import { cva, type VariantProps } from 'class-variance-authority' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const avatarStatusVariants = cva( 'flex items-center rounded-full size-2 border-2 border-background', diff --git a/apps/sim/components/ui/badge.tsx b/apps/sim/components/ui/badge.tsx index e26d4647bd..5aec0acf32 100644 --- a/apps/sim/components/ui/badge.tsx +++ b/apps/sim/components/ui/badge.tsx @@ -1,6 +1,6 @@ import type * as React from 'react' import { cva, type VariantProps } from 'class-variance-authority' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const badgeVariants = cva( 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2', diff --git a/apps/sim/components/ui/breadcrumb.tsx b/apps/sim/components/ui/breadcrumb.tsx index 8609298f4c..56bba3ca1c 100644 --- a/apps/sim/components/ui/breadcrumb.tsx +++ b/apps/sim/components/ui/breadcrumb.tsx @@ -1,7 +1,7 @@ import * as React from 'react' import { Slot } from '@radix-ui/react-slot' import { ChevronRight, MoreHorizontal } from 'lucide-react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const Breadcrumb = React.forwardRef< HTMLElement, diff --git a/apps/sim/components/ui/button.tsx b/apps/sim/components/ui/button.tsx index 7ece855e4b..735d5d909e 100644 --- a/apps/sim/components/ui/button.tsx +++ b/apps/sim/components/ui/button.tsx @@ -1,7 +1,7 @@ import * as React from 'react' import { Slot } from '@radix-ui/react-slot' import { cva, type VariantProps } from 'class-variance-authority' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const buttonVariants = cva( 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0', diff --git a/apps/sim/components/ui/card.tsx b/apps/sim/components/ui/card.tsx index 32aa74e045..3fab3a3a40 100644 --- a/apps/sim/components/ui/card.tsx +++ b/apps/sim/components/ui/card.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const Card = React.forwardRef>( ({ className, ...props }, ref) => ( diff --git a/apps/sim/components/ui/checkbox.tsx b/apps/sim/components/ui/checkbox.tsx index 7a0f9adb94..e3f5cb3bfd 100644 --- a/apps/sim/components/ui/checkbox.tsx +++ b/apps/sim/components/ui/checkbox.tsx @@ -3,7 +3,7 @@ import * as React from 'react' import * as CheckboxPrimitive from '@radix-ui/react-checkbox' import { Check } from 'lucide-react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const Checkbox = React.forwardRef< React.ElementRef, diff --git a/apps/sim/components/ui/code-block.tsx b/apps/sim/components/ui/code-block.tsx index 12b744f61a..fdabac45b4 100644 --- a/apps/sim/components/ui/code-block.tsx +++ b/apps/sim/components/ui/code-block.tsx @@ -1,6 +1,6 @@ import type React from 'react' import { CopyButton } from '@/components/ui/copy-button' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' interface CodeBlockProps extends React.HTMLAttributes { code: string diff --git a/apps/sim/components/ui/color-picker.tsx b/apps/sim/components/ui/color-picker.tsx index b9938e1a5c..64ac30d811 100644 --- a/apps/sim/components/ui/color-picker.tsx +++ b/apps/sim/components/ui/color-picker.tsx @@ -6,8 +6,8 @@ import type { ButtonProps } from '@/components/ui/button' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover' -import { useForwardedRef } from '@/lib/use-forwarded-ref' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' +import { useForwardedRef } from '@/hooks/use-forwarded-ref' interface ColorPickerProps { value: string diff --git a/apps/sim/components/ui/command.tsx b/apps/sim/components/ui/command.tsx index 6b82b0bdb4..1819e736f2 100644 --- a/apps/sim/components/ui/command.tsx +++ b/apps/sim/components/ui/command.tsx @@ -7,7 +7,7 @@ import type { DialogProps } from '@radix-ui/react-dialog' import { Command as CommandPrimitive } from 'cmdk' import { Search } from 'lucide-react' import { Dialog, DialogContent } from '@/components/ui/dialog' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' // This file is not typed correctly from shadcn, so we're disabling the type checker // @ts-nocheck diff --git a/apps/sim/components/ui/dialog.tsx b/apps/sim/components/ui/dialog.tsx index ab299dfc76..4e69d43bf5 100644 --- a/apps/sim/components/ui/dialog.tsx +++ b/apps/sim/components/ui/dialog.tsx @@ -3,7 +3,7 @@ import * as React from 'react' import * as DialogPrimitive from '@radix-ui/react-dialog' import { X } from 'lucide-react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const Dialog = DialogPrimitive.Root diff --git a/apps/sim/components/ui/dropdown-menu.tsx b/apps/sim/components/ui/dropdown-menu.tsx index dea7de6c3c..6cea410abe 100644 --- a/apps/sim/components/ui/dropdown-menu.tsx +++ b/apps/sim/components/ui/dropdown-menu.tsx @@ -3,7 +3,7 @@ import * as React from 'react' import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu' import { Check, ChevronRight, Circle } from 'lucide-react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const DropdownMenu = DropdownMenuPrimitive.Root diff --git a/apps/sim/components/ui/form.tsx b/apps/sim/components/ui/form.tsx index 5150e7d9d6..d0cd9c2f76 100644 --- a/apps/sim/components/ui/form.tsx +++ b/apps/sim/components/ui/form.tsx @@ -12,7 +12,7 @@ import { useFormContext, } from 'react-hook-form' import { Label } from '@/components/ui/label' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const Form = FormProvider diff --git a/apps/sim/components/ui/input-otp.tsx b/apps/sim/components/ui/input-otp.tsx index 52bbd95efc..56399cfded 100644 --- a/apps/sim/components/ui/input-otp.tsx +++ b/apps/sim/components/ui/input-otp.tsx @@ -3,7 +3,7 @@ import * as React from 'react' import { OTPInput, OTPInputContext } from 'input-otp' import { Minus } from 'lucide-react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const InputOTP = React.forwardRef< React.ElementRef, diff --git a/apps/sim/components/ui/input.tsx b/apps/sim/components/ui/input.tsx index 8624a7a51d..e1e4c2b793 100644 --- a/apps/sim/components/ui/input.tsx +++ b/apps/sim/components/ui/input.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const Input = React.forwardRef>( ({ className, type, autoComplete = 'off', ...props }, ref) => { diff --git a/apps/sim/components/ui/label.tsx b/apps/sim/components/ui/label.tsx index 200a9e240f..8ea90a4b3a 100644 --- a/apps/sim/components/ui/label.tsx +++ b/apps/sim/components/ui/label.tsx @@ -3,7 +3,7 @@ import * as React from 'react' import * as LabelPrimitive from '@radix-ui/react-label' import { cva, type VariantProps } from 'class-variance-authority' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const labelVariants = cva( 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70' diff --git a/apps/sim/components/ui/notice.tsx b/apps/sim/components/ui/notice.tsx index 2d7342d7ed..f224397bb2 100644 --- a/apps/sim/components/ui/notice.tsx +++ b/apps/sim/components/ui/notice.tsx @@ -1,6 +1,6 @@ import type React from 'react' import { AlertCircle, AlertTriangle, Check, Info } from 'lucide-react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' export type NoticeVariant = 'info' | 'warning' | 'success' | 'error' | 'default' diff --git a/apps/sim/components/ui/popover.tsx b/apps/sim/components/ui/popover.tsx index 8b4612d64f..296abb4bbf 100644 --- a/apps/sim/components/ui/popover.tsx +++ b/apps/sim/components/ui/popover.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import * as PopoverPrimitive from '@radix-ui/react-popover' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const Popover = PopoverPrimitive.Root diff --git a/apps/sim/components/ui/progress.tsx b/apps/sim/components/ui/progress.tsx index 28ef70b547..df6dc5ac6f 100644 --- a/apps/sim/components/ui/progress.tsx +++ b/apps/sim/components/ui/progress.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import * as ProgressPrimitive from '@radix-ui/react-progress' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' interface ProgressProps extends React.ComponentPropsWithoutRef { indicatorClassName?: string diff --git a/apps/sim/components/ui/radio-group.tsx b/apps/sim/components/ui/radio-group.tsx index d21d908faa..b5c6a8cd70 100644 --- a/apps/sim/components/ui/radio-group.tsx +++ b/apps/sim/components/ui/radio-group.tsx @@ -3,7 +3,7 @@ import * as React from 'react' import * as RadioGroupPrimitive from '@radix-ui/react-radio-group' import { Circle } from 'lucide-react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const RadioGroup = React.forwardRef< React.ElementRef, diff --git a/apps/sim/components/ui/scroll-area.tsx b/apps/sim/components/ui/scroll-area.tsx index e0c23ea3dd..d4fb41e959 100644 --- a/apps/sim/components/ui/scroll-area.tsx +++ b/apps/sim/components/ui/scroll-area.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const ScrollArea = React.forwardRef< React.ElementRef, diff --git a/apps/sim/components/ui/select.tsx b/apps/sim/components/ui/select.tsx index 5f585a3e23..bf6e2ece62 100644 --- a/apps/sim/components/ui/select.tsx +++ b/apps/sim/components/ui/select.tsx @@ -3,7 +3,7 @@ import * as React from 'react' import * as SelectPrimitive from '@radix-ui/react-select' import { Check, ChevronDown, ChevronUp } from 'lucide-react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const Select = SelectPrimitive.Root diff --git a/apps/sim/components/ui/separator.tsx b/apps/sim/components/ui/separator.tsx index b497617461..957f8fe0cd 100644 --- a/apps/sim/components/ui/separator.tsx +++ b/apps/sim/components/ui/separator.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import * as SeparatorPrimitive from '@radix-ui/react-separator' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const Separator = React.forwardRef< React.ElementRef, diff --git a/apps/sim/components/ui/sheet.tsx b/apps/sim/components/ui/sheet.tsx index 85655e9c18..3ccf58c3e3 100644 --- a/apps/sim/components/ui/sheet.tsx +++ b/apps/sim/components/ui/sheet.tsx @@ -4,7 +4,7 @@ import * as React from 'react' import * as SheetPrimitive from '@radix-ui/react-dialog' import { cva, type VariantProps } from 'class-variance-authority' import { X } from 'lucide-react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const Sheet = SheetPrimitive.Root diff --git a/apps/sim/components/ui/skeleton.tsx b/apps/sim/components/ui/skeleton.tsx index 7347fdff94..c7c73d1630 100644 --- a/apps/sim/components/ui/skeleton.tsx +++ b/apps/sim/components/ui/skeleton.tsx @@ -1,4 +1,4 @@ -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' function Skeleton({ className, ...props }: React.HTMLAttributes) { return
diff --git a/apps/sim/components/ui/slider.tsx b/apps/sim/components/ui/slider.tsx index 471aa4b12b..c131ff2220 100644 --- a/apps/sim/components/ui/slider.tsx +++ b/apps/sim/components/ui/slider.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import * as SliderPrimitive from '@radix-ui/react-slider' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const Slider = React.forwardRef< React.ElementRef, diff --git a/apps/sim/components/ui/switch.tsx b/apps/sim/components/ui/switch.tsx index 113c38ada2..7f2f60b9df 100644 --- a/apps/sim/components/ui/switch.tsx +++ b/apps/sim/components/ui/switch.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import * as SwitchPrimitives from '@radix-ui/react-switch' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const Switch = React.forwardRef< React.ElementRef, diff --git a/apps/sim/components/ui/table.tsx b/apps/sim/components/ui/table.tsx index 0dd713cd5b..a90905fa02 100644 --- a/apps/sim/components/ui/table.tsx +++ b/apps/sim/components/ui/table.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const Table = React.forwardRef>( ({ className, ...props }, ref) => ( diff --git a/apps/sim/components/ui/tabs.tsx b/apps/sim/components/ui/tabs.tsx index d60a8c8c6b..eee254f5fe 100644 --- a/apps/sim/components/ui/tabs.tsx +++ b/apps/sim/components/ui/tabs.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import * as TabsPrimitive from '@radix-ui/react-tabs' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const Tabs = TabsPrimitive.Root diff --git a/apps/sim/components/ui/tag-input.tsx b/apps/sim/components/ui/tag-input.tsx index 0b725b6053..2a9a516da1 100644 --- a/apps/sim/components/ui/tag-input.tsx +++ b/apps/sim/components/ui/tag-input.tsx @@ -4,7 +4,7 @@ import { type KeyboardEvent, useRef, useState } from 'react' import { X } from 'lucide-react' import { Badge } from '@/components/ui/badge' import { Input } from '@/components/ui/input' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' interface TagInputProps { value: string[] diff --git a/apps/sim/components/ui/textarea.tsx b/apps/sim/components/ui/textarea.tsx index ba9ec4cf8c..796ce2425b 100644 --- a/apps/sim/components/ui/textarea.tsx +++ b/apps/sim/components/ui/textarea.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const Textarea = React.forwardRef>( ({ className, ...props }, ref) => { diff --git a/apps/sim/components/ui/toggle.tsx b/apps/sim/components/ui/toggle.tsx index 7cc8d27bb8..2c8ebb4598 100644 --- a/apps/sim/components/ui/toggle.tsx +++ b/apps/sim/components/ui/toggle.tsx @@ -3,7 +3,7 @@ import * as React from 'react' import * as TogglePrimitive from '@radix-ui/react-toggle' import { cva, type VariantProps } from 'class-variance-authority' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' // TODO: FIX STYLING const toggleVariants = cva( diff --git a/apps/sim/components/ui/tool-call.tsx b/apps/sim/components/ui/tool-call.tsx index 510acce351..99b47c2ba0 100644 --- a/apps/sim/components/ui/tool-call.tsx +++ b/apps/sim/components/ui/tool-call.tsx @@ -6,7 +6,7 @@ import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible' import type { ToolCallGroup, ToolCallState } from '@/lib/copilot/types' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' interface ToolCallProps { toolCall: ToolCallState diff --git a/apps/sim/components/ui/verified-badge.tsx b/apps/sim/components/ui/verified-badge.tsx index e17dd53d0a..347f524609 100644 --- a/apps/sim/components/ui/verified-badge.tsx +++ b/apps/sim/components/ui/verified-badge.tsx @@ -1,4 +1,4 @@ -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' interface VerifiedBadgeProps { className?: string diff --git a/apps/sim/drizzle.config.ts b/apps/sim/drizzle.config.ts index 3f0cfbd898..d93370d17e 100644 --- a/apps/sim/drizzle.config.ts +++ b/apps/sim/drizzle.config.ts @@ -1,5 +1,5 @@ import type { Config } from 'drizzle-kit' -import { env } from './lib/env' +import { env } from './lib/core/config/env' export default { schema: '../../packages/db/schema.ts', diff --git a/apps/sim/executor/__test-utils__/mock-dependencies.ts b/apps/sim/executor/__test-utils__/mock-dependencies.ts index 2d3939deda..039ea27b10 100644 --- a/apps/sim/executor/__test-utils__/mock-dependencies.ts +++ b/apps/sim/executor/__test-utils__/mock-dependencies.ts @@ -31,8 +31,11 @@ vi.mock('@/tools/utils', () => ({ })) // Utils -vi.mock('@/lib/utils', () => ({ - isHosted: vi.fn().mockReturnValue(false), +vi.mock('@/lib/core/config/environment', () => ({ + isHosted: false, +})) + +vi.mock('@/lib/core/config/api-keys', () => ({ getRotatingApiKey: vi.fn(), })) diff --git a/apps/sim/executor/execution/block-executor.ts b/apps/sim/executor/execution/block-executor.ts index 59e6d5474b..5949b41cf4 100644 --- a/apps/sim/executor/execution/block-executor.ts +++ b/apps/sim/executor/execution/block-executor.ts @@ -1,5 +1,5 @@ +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' import { BlockType, buildResumeApiUrl, diff --git a/apps/sim/executor/execution/executor.ts b/apps/sim/executor/execution/executor.ts index 5039fc839a..44697eb429 100644 --- a/apps/sim/executor/execution/executor.ts +++ b/apps/sim/executor/execution/executor.ts @@ -1,5 +1,5 @@ import { createLogger } from '@/lib/logs/console/logger' -import { StartBlockPath } from '@/lib/workflows/triggers' +import { StartBlockPath } from '@/lib/workflows/triggers/triggers' import type { BlockOutput } from '@/blocks/types' import { DAGBuilder } from '@/executor/dag/builder' import { BlockExecutor } from '@/executor/execution/block-executor' diff --git a/apps/sim/executor/handlers/agent/agent-handler.test.ts b/apps/sim/executor/handlers/agent/agent-handler.test.ts index f1234a5851..72df94c722 100644 --- a/apps/sim/executor/handlers/agent/agent-handler.test.ts +++ b/apps/sim/executor/handlers/agent/agent-handler.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, type Mock, vi } from 'vitest' -import { isHosted } from '@/lib/environment' +import { isHosted } from '@/lib/core/config/environment' import { getAllBlocks } from '@/blocks' import { BlockType } from '@/executor/consts' import { AgentBlockHandler } from '@/executor/handlers/agent/agent-handler' @@ -11,7 +11,7 @@ import { executeTool } from '@/tools' process.env.NEXT_PUBLIC_APP_URL = 'http://localhost:3000' -vi.mock('@/lib/environment', () => ({ +vi.mock('@/lib/core/config/environment', () => ({ isHosted: vi.fn().mockReturnValue(false), isProd: vi.fn().mockReturnValue(false), isDev: vi.fn().mockReturnValue(true), diff --git a/apps/sim/executor/handlers/human-in-the-loop/human-in-the-loop-handler.ts b/apps/sim/executor/handlers/human-in-the-loop/human-in-the-loop-handler.ts index 918f250a11..be354f5920 100644 --- a/apps/sim/executor/handlers/human-in-the-loop/human-in-the-loop-handler.ts +++ b/apps/sim/executor/handlers/human-in-the-loop/human-in-the-loop-handler.ts @@ -1,5 +1,5 @@ +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' import type { BlockOutput } from '@/blocks/types' import { BlockType, diff --git a/apps/sim/executor/handlers/router/router-handler.ts b/apps/sim/executor/handlers/router/router-handler.ts index 05ade6613d..cc21c2132c 100644 --- a/apps/sim/executor/handlers/router/router-handler.ts +++ b/apps/sim/executor/handlers/router/router-handler.ts @@ -1,5 +1,5 @@ +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' import { generateRouterPrompt } from '@/blocks/blocks/router' import type { BlockOutput } from '@/blocks/types' import { BlockType, DEFAULTS, HTTP, isAgentBlockType, ROUTER } from '@/executor/consts' diff --git a/apps/sim/executor/utils/http.ts b/apps/sim/executor/utils/http.ts index 937e05bbbf..d9db5a1fd9 100644 --- a/apps/sim/executor/utils/http.ts +++ b/apps/sim/executor/utils/http.ts @@ -1,5 +1,5 @@ import { generateInternalToken } from '@/lib/auth/internal' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' import { HTTP } from '@/executor/consts' export async function buildAuthHeaders(): Promise> { diff --git a/apps/sim/executor/utils/reference-validation.ts b/apps/sim/executor/utils/reference-validation.ts index 906af32876..d1f72ce0c1 100644 --- a/apps/sim/executor/utils/reference-validation.ts +++ b/apps/sim/executor/utils/reference-validation.ts @@ -1,4 +1,4 @@ -import { isLikelyReferenceSegment } from '@/lib/workflows/references' +import { isLikelyReferenceSegment } from '@/lib/workflows/sanitization/references' import { REFERENCE } from '@/executor/consts' /** diff --git a/apps/sim/executor/utils/start-block.test.ts b/apps/sim/executor/utils/start-block.test.ts index f1403548be..aee3f798f6 100644 --- a/apps/sim/executor/utils/start-block.test.ts +++ b/apps/sim/executor/utils/start-block.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest' -import { StartBlockPath } from '@/lib/workflows/triggers' +import { StartBlockPath } from '@/lib/workflows/triggers/triggers' import type { UserFile } from '@/executor/types' import { buildResolutionFromBlock, diff --git a/apps/sim/executor/utils/start-block.ts b/apps/sim/executor/utils/start-block.ts index ce20328a40..17192906b8 100644 --- a/apps/sim/executor/utils/start-block.ts +++ b/apps/sim/executor/utils/start-block.ts @@ -1,10 +1,10 @@ -import { isUserFile } from '@/lib/utils' +import { isUserFile } from '@/lib/core/utils/display-filters' import { classifyStartBlockType, getLegacyStarterMode, resolveStartCandidates, StartBlockPath, -} from '@/lib/workflows/triggers' +} from '@/lib/workflows/triggers/triggers' import type { InputFormatField } from '@/lib/workflows/types' import type { NormalizedBlockOutput, UserFile } from '@/executor/types' import type { SerializedBlock } from '@/serializer/types' diff --git a/apps/sim/executor/variables/resolvers/workflow.ts b/apps/sim/executor/variables/resolvers/workflow.ts index 60e8070c2e..e1c7536827 100644 --- a/apps/sim/executor/variables/resolvers/workflow.ts +++ b/apps/sim/executor/variables/resolvers/workflow.ts @@ -1,5 +1,5 @@ import { createLogger } from '@/lib/logs/console/logger' -import { VariableManager } from '@/lib/variables/variable-manager' +import { VariableManager } from '@/lib/workflows/variables/variable-manager' import { isReference, parseReferencePath, REFERENCE } from '@/executor/consts' import { navigatePath, diff --git a/apps/sim/hooks/queries/copilot-keys.ts b/apps/sim/hooks/queries/copilot-keys.ts index e1690c142c..210effc632 100644 --- a/apps/sim/hooks/queries/copilot-keys.ts +++ b/apps/sim/hooks/queries/copilot-keys.ts @@ -1,5 +1,5 @@ import { keepPreviousData, useMutation, useQuery, useQueryClient } from '@tanstack/react-query' -import { isHosted } from '@/lib/environment' +import { isHosted } from '@/lib/core/config/environment' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('CopilotKeysQuery') diff --git a/apps/sim/hooks/queries/oauth-connections.ts b/apps/sim/hooks/queries/oauth-connections.ts index 9405511a64..70b9932e3f 100644 --- a/apps/sim/hooks/queries/oauth-connections.ts +++ b/apps/sim/hooks/queries/oauth-connections.ts @@ -1,5 +1,5 @@ import { keepPreviousData, useMutation, useQuery, useQueryClient } from '@tanstack/react-query' -import { client } from '@/lib/auth-client' +import { client } from '@/lib/auth/auth-client' import { createLogger } from '@/lib/logs/console/logger' import { OAUTH_PROVIDERS, type OAuthServiceConfig } from '@/lib/oauth/oauth' diff --git a/apps/sim/hooks/queries/organization.ts b/apps/sim/hooks/queries/organization.ts index 95d13115e3..8ccdabc389 100644 --- a/apps/sim/hooks/queries/organization.ts +++ b/apps/sim/hooks/queries/organization.ts @@ -1,5 +1,5 @@ import { keepPreviousData, useMutation, useQuery, useQueryClient } from '@tanstack/react-query' -import { client } from '@/lib/auth-client' +import { client } from '@/lib/auth/auth-client' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('OrganizationQueries') diff --git a/apps/sim/hooks/use-collaborative-workflow.ts b/apps/sim/hooks/use-collaborative-workflow.ts index 2fb8b9b7c1..149965ec72 100644 --- a/apps/sim/hooks/use-collaborative-workflow.ts +++ b/apps/sim/hooks/use-collaborative-workflow.ts @@ -1,9 +1,9 @@ import { useCallback, useEffect, useRef } from 'react' import type { Edge } from 'reactflow' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' import { createLogger } from '@/lib/logs/console/logger' -import { getBlockOutputs } from '@/lib/workflows/block-outputs' -import { TriggerUtils } from '@/lib/workflows/triggers' +import { getBlockOutputs } from '@/lib/workflows/blocks/block-outputs' +import { TriggerUtils } from '@/lib/workflows/triggers/triggers' import { useSocket } from '@/app/workspace/providers/socket-provider' import { getBlock } from '@/blocks' import { useUndoRedo } from '@/hooks/use-undo-redo' diff --git a/apps/sim/lib/use-forwarded-ref.ts b/apps/sim/hooks/use-forwarded-ref.ts similarity index 100% rename from apps/sim/lib/use-forwarded-ref.ts rename to apps/sim/hooks/use-forwarded-ref.ts diff --git a/apps/sim/hooks/use-knowledge-base-tag-definitions.ts b/apps/sim/hooks/use-knowledge-base-tag-definitions.ts index f29eb7e921..57c0cac368 100644 --- a/apps/sim/hooks/use-knowledge-base-tag-definitions.ts +++ b/apps/sim/hooks/use-knowledge-base-tag-definitions.ts @@ -1,7 +1,7 @@ 'use client' import { useCallback, useEffect, useState } from 'react' -import type { TagSlot } from '@/lib/knowledge/consts' +import type { TagSlot } from '@/lib/knowledge/constants' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('useKnowledgeBaseTagDefinitions') diff --git a/apps/sim/hooks/use-tag-definitions.ts b/apps/sim/hooks/use-tag-definitions.ts index 24b36a3c01..5e15b2786d 100644 --- a/apps/sim/hooks/use-tag-definitions.ts +++ b/apps/sim/hooks/use-tag-definitions.ts @@ -1,7 +1,7 @@ 'use client' import { useCallback, useEffect, useState } from 'react' -import type { TagSlot } from '@/lib/knowledge/consts' +import type { TagSlot } from '@/lib/knowledge/constants' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('useTagDefinitions') diff --git a/apps/sim/hooks/use-undo-redo.ts b/apps/sim/hooks/use-undo-redo.ts index 1e4a3d8678..0035136268 100644 --- a/apps/sim/hooks/use-undo-redo.ts +++ b/apps/sim/hooks/use-undo-redo.ts @@ -1,8 +1,8 @@ import { useCallback } from 'react' import type { Edge } from 'reactflow' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' import { createLogger } from '@/lib/logs/console/logger' -import { enqueueReplaceWorkflowState } from '@/lib/workflows/socket-operations' +import { enqueueReplaceWorkflowState } from '@/lib/workflows/operations/socket-operations' import { useOperationQueue } from '@/stores/operation-queue/store' import { createOperationEntry, diff --git a/apps/sim/hooks/use-user-permissions.ts b/apps/sim/hooks/use-user-permissions.ts index 14bcf665cd..2ee2bb2bff 100644 --- a/apps/sim/hooks/use-user-permissions.ts +++ b/apps/sim/hooks/use-user-permissions.ts @@ -1,5 +1,5 @@ import { useMemo } from 'react' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' import { createLogger } from '@/lib/logs/console/logger' import type { PermissionType, WorkspacePermissions } from '@/hooks/use-workspace-permissions' diff --git a/apps/sim/hooks/use-webhook-management.ts b/apps/sim/hooks/use-webhook-management.ts index 8c0ea53fd4..d29018c4e2 100644 --- a/apps/sim/hooks/use-webhook-management.ts +++ b/apps/sim/hooks/use-webhook-management.ts @@ -1,7 +1,7 @@ import { useCallback, useEffect, useMemo, useState } from 'react' import { useParams } from 'next/navigation' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' import { getBlock } from '@/blocks' import { populateTriggerFieldsFromConfig } from '@/hooks/use-trigger-config-aggregation' import { useSubBlockStore } from '@/stores/workflows/subblock/store' diff --git a/apps/sim/instrumentation-client.ts b/apps/sim/instrumentation-client.ts index 4f5852ae47..59cfe3017f 100644 --- a/apps/sim/instrumentation-client.ts +++ b/apps/sim/instrumentation-client.ts @@ -2,7 +2,7 @@ * Sim Telemetry - Client-side Instrumentation */ -import { env } from './lib/env' +import { env } from './lib/core/config/env' if (typeof window !== 'undefined') { const TELEMETRY_STATUS_KEY = 'simstudio-telemetry-status' diff --git a/apps/sim/instrumentation-node.ts b/apps/sim/instrumentation-node.ts index 23d2109384..86c10996e6 100644 --- a/apps/sim/instrumentation-node.ts +++ b/apps/sim/instrumentation-node.ts @@ -3,7 +3,7 @@ */ import { DiagConsoleLogger, DiagLogLevel, diag } from '@opentelemetry/api' -import { env } from './lib/env' +import { env } from './lib/core/config/env' import { createLogger } from './lib/logs/console/logger' diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.ERROR) diff --git a/apps/sim/lib/api-key/auth.ts b/apps/sim/lib/api-key/auth.ts index 20c773a90d..0ea9ec058d 100644 --- a/apps/sim/lib/api-key/auth.ts +++ b/apps/sim/lib/api-key/auth.ts @@ -6,7 +6,7 @@ import { isEncryptedApiKeyFormat, isLegacyApiKeyFormat, } from '@/lib/api-key/crypto' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('ApiKeyAuth') diff --git a/apps/sim/lib/api-key/crypto.ts b/apps/sim/lib/api-key/crypto.ts index 5ff470bf42..aaa3de3b89 100644 --- a/apps/sim/lib/api-key/crypto.ts +++ b/apps/sim/lib/api-key/crypto.ts @@ -1,5 +1,5 @@ import { createCipheriv, createDecipheriv, randomBytes } from 'crypto' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('ApiKeyCrypto') diff --git a/apps/sim/lib/api-key/service.ts b/apps/sim/lib/api-key/service.ts index aa503452af..7136f6f64e 100644 --- a/apps/sim/lib/api-key/service.ts +++ b/apps/sim/lib/api-key/service.ts @@ -3,7 +3,7 @@ import { apiKey as apiKeyTable } from '@sim/db/schema' import { and, eq } from 'drizzle-orm' import { authenticateApiKey } from '@/lib/api-key/auth' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' import { getWorkspaceBillingSettings } from '@/lib/workspaces/utils' const logger = createLogger('ApiKeyService') diff --git a/apps/sim/lib/auth-client.ts b/apps/sim/lib/auth/auth-client.ts similarity index 90% rename from apps/sim/lib/auth-client.ts rename to apps/sim/lib/auth/auth-client.ts index a3c1f8efed..817902a0b4 100644 --- a/apps/sim/lib/auth-client.ts +++ b/apps/sim/lib/auth/auth-client.ts @@ -9,9 +9,9 @@ import { } from 'better-auth/client/plugins' import { createAuthClient } from 'better-auth/react' import type { auth } from '@/lib/auth' -import { env } from '@/lib/env' -import { isBillingEnabled } from '@/lib/environment' -import { getBaseUrl } from '@/lib/urls/utils' +import { env } from '@/lib/core/config/env' +import { isBillingEnabled } from '@/lib/core/config/environment' +import { getBaseUrl } from '@/lib/core/utils/urls' import { SessionContext, type SessionHookResult } from '@/app/_shell/providers/session-provider' export const client = createAuthClient({ diff --git a/apps/sim/lib/auth.ts b/apps/sim/lib/auth/auth.ts similarity index 99% rename from apps/sim/lib/auth.ts rename to apps/sim/lib/auth/auth.ts index a22affc129..650d9acd08 100644 --- a/apps/sim/lib/auth.ts +++ b/apps/sim/lib/auth/auth.ts @@ -38,14 +38,14 @@ import { handleSubscriptionCreated, handleSubscriptionDeleted, } from '@/lib/billing/webhooks/subscription' -import { sendEmail } from '@/lib/email/mailer' -import { getFromEmailAddress } from '@/lib/email/utils' -import { quickValidateEmail } from '@/lib/email/validation' -import { env, isTruthy } from '@/lib/env' -import { isBillingEnabled, isEmailVerificationEnabled } from '@/lib/environment' +import { env, isTruthy } from '@/lib/core/config/env' +import { isBillingEnabled, isEmailVerificationEnabled } from '@/lib/core/config/environment' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { SSO_TRUSTED_PROVIDERS } from '@/lib/sso/consts' -import { getBaseUrl } from '@/lib/urls/utils' +import { sendEmail } from '@/lib/messaging/email/mailer' +import { getFromEmailAddress } from '@/lib/messaging/email/utils' +import { quickValidateEmail } from '@/lib/messaging/email/validation' +import { SSO_TRUSTED_PROVIDERS } from './sso/constants' const logger = createLogger('Auth') diff --git a/apps/sim/lib/auth/credential-access.ts b/apps/sim/lib/auth/credential-access.ts index adf9d1a392..be7b7e1bd2 100644 --- a/apps/sim/lib/auth/credential-access.ts +++ b/apps/sim/lib/auth/credential-access.ts @@ -3,7 +3,7 @@ import { account, workflow as workflowTable } from '@sim/db/schema' import { eq } from 'drizzle-orm' import type { NextRequest } from 'next/server' import { checkHybridAuth } from '@/lib/auth/hybrid' -import { getUserEntityPermissions } from '@/lib/permissions/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' export interface CredentialAccessResult { ok: boolean diff --git a/apps/sim/lib/auth/index.ts b/apps/sim/lib/auth/index.ts new file mode 100644 index 0000000000..84c42e215b --- /dev/null +++ b/apps/sim/lib/auth/index.ts @@ -0,0 +1 @@ +export { auth, getSession, signIn, signUp } from './auth' diff --git a/apps/sim/lib/auth/internal.ts b/apps/sim/lib/auth/internal.ts index c9c5f5b94b..cba5036dc8 100644 --- a/apps/sim/lib/auth/internal.ts +++ b/apps/sim/lib/auth/internal.ts @@ -1,6 +1,6 @@ import { jwtVerify, SignJWT } from 'jose' import { type NextRequest, NextResponse } from 'next/server' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('CronAuth') diff --git a/apps/sim/lib/sso/consts.ts b/apps/sim/lib/auth/sso/constants.ts similarity index 100% rename from apps/sim/lib/sso/consts.ts rename to apps/sim/lib/auth/sso/constants.ts diff --git a/apps/sim/lib/billing/calculations/usage-monitor.ts b/apps/sim/lib/billing/calculations/usage-monitor.ts index 46f0c021c4..956468d9ad 100644 --- a/apps/sim/lib/billing/calculations/usage-monitor.ts +++ b/apps/sim/lib/billing/calculations/usage-monitor.ts @@ -3,7 +3,7 @@ import { member, organization, userStats } from '@sim/db/schema' import { eq, inArray } from 'drizzle-orm' import { getOrganizationSubscription, getPlanPricing } from '@/lib/billing/core/billing' import { getUserUsageLimit } from '@/lib/billing/core/usage' -import { isBillingEnabled } from '@/lib/environment' +import { isBillingEnabled } from '@/lib/core/config/environment' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('UsageMonitor') diff --git a/apps/sim/lib/subscription/index.ts b/apps/sim/lib/billing/client/index.ts similarity index 64% rename from apps/sim/lib/subscription/index.ts rename to apps/sim/lib/billing/client/index.ts index e4e10afceb..24ef12179f 100644 --- a/apps/sim/lib/subscription/index.ts +++ b/apps/sim/lib/billing/client/index.ts @@ -1,4 +1,9 @@ -// Export helper functions for subscription data +export type { + BillingStatus, + SubscriptionData, + UsageData, + UsageLimitData, +} from './types' export { canUpgrade, getBillingStatus, @@ -8,11 +13,4 @@ export { getUsage, isAtLeastPro, isAtLeastTeam, -} from '@/lib/subscription/helpers' -// Export types -export type { - BillingStatus, - SubscriptionData, - UsageData, - UsageLimitData, -} from '@/lib/subscription/types' +} from './utils' diff --git a/apps/sim/lib/subscription/types.ts b/apps/sim/lib/billing/client/types.ts similarity index 100% rename from apps/sim/lib/subscription/types.ts rename to apps/sim/lib/billing/client/types.ts diff --git a/apps/sim/lib/subscription/upgrade.ts b/apps/sim/lib/billing/client/upgrade.ts similarity index 99% rename from apps/sim/lib/subscription/upgrade.ts rename to apps/sim/lib/billing/client/upgrade.ts index 6ad93e6e21..297efe3bb6 100644 --- a/apps/sim/lib/subscription/upgrade.ts +++ b/apps/sim/lib/billing/client/upgrade.ts @@ -1,6 +1,6 @@ import { useCallback } from 'react' import { useQueryClient } from '@tanstack/react-query' -import { client, useSession, useSubscription } from '@/lib/auth-client' +import { client, useSession, useSubscription } from '@/lib/auth/auth-client' import { createLogger } from '@/lib/logs/console/logger' import { organizationKeys } from '@/hooks/queries/organization' diff --git a/apps/sim/lib/subscription/usage-visualization.ts b/apps/sim/lib/billing/client/usage-visualization.ts similarity index 100% rename from apps/sim/lib/subscription/usage-visualization.ts rename to apps/sim/lib/billing/client/usage-visualization.ts diff --git a/apps/sim/lib/subscription/helpers.ts b/apps/sim/lib/billing/client/utils.ts similarity index 99% rename from apps/sim/lib/subscription/helpers.ts rename to apps/sim/lib/billing/client/utils.ts index 60558f28f8..6ac38e90d6 100644 --- a/apps/sim/lib/subscription/helpers.ts +++ b/apps/sim/lib/billing/client/utils.ts @@ -4,7 +4,7 @@ */ import { DEFAULT_FREE_CREDITS } from '@/lib/billing/constants' -import type { BillingStatus, SubscriptionData, UsageData } from '@/lib/subscription/types' +import type { BillingStatus, SubscriptionData, UsageData } from './types' const defaultUsage: UsageData = { current: 0, diff --git a/apps/sim/lib/billing/core/subscription.ts b/apps/sim/lib/billing/core/subscription.ts index dda969d114..4aa977abe9 100644 --- a/apps/sim/lib/billing/core/subscription.ts +++ b/apps/sim/lib/billing/core/subscription.ts @@ -9,9 +9,9 @@ import { getPerUserMinimumLimit, } from '@/lib/billing/subscriptions/utils' import type { UserSubscriptionState } from '@/lib/billing/types' -import { isProd } from '@/lib/environment' +import { isProd } from '@/lib/core/config/environment' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' const logger = createLogger('SubscriptionCore') @@ -301,7 +301,7 @@ export async function sendPlanWelcomeEmail(subscription: any): Promise { const { getEmailSubject, renderPlanWelcomeEmail } = await import( '@/components/emails/render-email' ) - const { sendEmail } = await import('@/lib/email/mailer') + const { sendEmail } = await import('@/lib/messaging/email/mailer') const baseUrl = getBaseUrl() const html = await renderPlanWelcomeEmail({ diff --git a/apps/sim/lib/billing/core/usage.ts b/apps/sim/lib/billing/core/usage.ts index 2a0eab57f4..0c493cb3ab 100644 --- a/apps/sim/lib/billing/core/usage.ts +++ b/apps/sim/lib/billing/core/usage.ts @@ -13,11 +13,11 @@ import { getPerUserMinimumLimit, } from '@/lib/billing/subscriptions/utils' import type { BillingData, UsageData, UsageLimitInfo } from '@/lib/billing/types' -import { sendEmail } from '@/lib/email/mailer' -import { getEmailPreferences } from '@/lib/email/unsubscribe' -import { isBillingEnabled } from '@/lib/environment' +import { isBillingEnabled } from '@/lib/core/config/environment' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' +import { sendEmail } from '@/lib/messaging/email/mailer' +import { getEmailPreferences } from '@/lib/messaging/email/unsubscribe' const logger = createLogger('UsageManagement') diff --git a/apps/sim/lib/billing/plans.ts b/apps/sim/lib/billing/plans.ts index ca02eccb3e..d8f88ec493 100644 --- a/apps/sim/lib/billing/plans.ts +++ b/apps/sim/lib/billing/plans.ts @@ -3,7 +3,7 @@ import { getProTierLimit, getTeamTierLimitPerSeat, } from '@/lib/billing/subscriptions/utils' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' export interface BillingPlan { name: string diff --git a/apps/sim/lib/billing/storage/limits.ts b/apps/sim/lib/billing/storage/limits.ts index 6ba7851e9b..f188f8bc24 100644 --- a/apps/sim/lib/billing/storage/limits.ts +++ b/apps/sim/lib/billing/storage/limits.ts @@ -12,8 +12,8 @@ import { } from '@sim/db/consts' import { organization, subscription, userStats } from '@sim/db/schema' import { eq } from 'drizzle-orm' -import { getEnv } from '@/lib/env' -import { isBillingEnabled } from '@/lib/environment' +import { getEnv } from '@/lib/core/config/env' +import { isBillingEnabled } from '@/lib/core/config/environment' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('StorageLimits') diff --git a/apps/sim/lib/billing/storage/tracking.ts b/apps/sim/lib/billing/storage/tracking.ts index 1aad79dbbe..b094769e70 100644 --- a/apps/sim/lib/billing/storage/tracking.ts +++ b/apps/sim/lib/billing/storage/tracking.ts @@ -7,7 +7,7 @@ import { db } from '@sim/db' import { organization, userStats } from '@sim/db/schema' import { eq, sql } from 'drizzle-orm' -import { isBillingEnabled } from '@/lib/environment' +import { isBillingEnabled } from '@/lib/core/config/environment' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('StorageTracking') diff --git a/apps/sim/lib/billing/stripe-client.ts b/apps/sim/lib/billing/stripe-client.ts index 7a93a0bf45..264d922d68 100644 --- a/apps/sim/lib/billing/stripe-client.ts +++ b/apps/sim/lib/billing/stripe-client.ts @@ -1,5 +1,5 @@ import Stripe from 'stripe' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('StripeClient') diff --git a/apps/sim/lib/billing/subscriptions/utils.ts b/apps/sim/lib/billing/subscriptions/utils.ts index baabb5e421..e218cef73a 100644 --- a/apps/sim/lib/billing/subscriptions/utils.ts +++ b/apps/sim/lib/billing/subscriptions/utils.ts @@ -4,7 +4,7 @@ import { DEFAULT_PRO_TIER_COST_LIMIT, DEFAULT_TEAM_TIER_COST_LIMIT, } from '@/lib/billing/constants' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' /** * Get the free tier limit from env or fallback to default diff --git a/apps/sim/lib/billing/threshold-billing.ts b/apps/sim/lib/billing/threshold-billing.ts index 28ca37055f..515a4a5077 100644 --- a/apps/sim/lib/billing/threshold-billing.ts +++ b/apps/sim/lib/billing/threshold-billing.ts @@ -6,7 +6,7 @@ import { DEFAULT_OVERAGE_THRESHOLD } from '@/lib/billing/constants' import { calculateSubscriptionOverage, getPlanPricing } from '@/lib/billing/core/billing' import { getHighestPrioritySubscription } from '@/lib/billing/core/subscription' import { requireStripeClient } from '@/lib/billing/stripe-client' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('ThresholdBilling') diff --git a/apps/sim/lib/billing/validation/seat-management.ts b/apps/sim/lib/billing/validation/seat-management.ts index be4dd4b31d..923c08b93f 100644 --- a/apps/sim/lib/billing/validation/seat-management.ts +++ b/apps/sim/lib/billing/validation/seat-management.ts @@ -2,8 +2,8 @@ import { db } from '@sim/db' import { invitation, member, organization, subscription, user, userStats } from '@sim/db/schema' import { and, count, eq } from 'drizzle-orm' import { getOrganizationSubscription } from '@/lib/billing/core/billing' -import { quickValidateEmail } from '@/lib/email/validation' import { createLogger } from '@/lib/logs/console/logger' +import { quickValidateEmail } from '@/lib/messaging/email/validation' const logger = createLogger('SeatManagement') diff --git a/apps/sim/lib/billing/webhooks/enterprise.ts b/apps/sim/lib/billing/webhooks/enterprise.ts index 0ee325d6fa..1f06806d9d 100644 --- a/apps/sim/lib/billing/webhooks/enterprise.ts +++ b/apps/sim/lib/billing/webhooks/enterprise.ts @@ -6,9 +6,9 @@ import { getEmailSubject, renderEnterpriseSubscriptionEmail, } from '@/components/emails/render-email' -import { sendEmail } from '@/lib/email/mailer' -import { getFromEmailAddress } from '@/lib/email/utils' import { createLogger } from '@/lib/logs/console/logger' +import { sendEmail } from '@/lib/messaging/email/mailer' +import { getFromEmailAddress } from '@/lib/messaging/email/utils' import type { EnterpriseSubscriptionMetadata } from '../types' const logger = createLogger('BillingEnterprise') diff --git a/apps/sim/lib/billing/webhooks/invoices.ts b/apps/sim/lib/billing/webhooks/invoices.ts index 9d39d8817c..8d272aad62 100644 --- a/apps/sim/lib/billing/webhooks/invoices.ts +++ b/apps/sim/lib/billing/webhooks/invoices.ts @@ -12,10 +12,10 @@ import type Stripe from 'stripe' import PaymentFailedEmail from '@/components/emails/billing/payment-failed-email' import { calculateSubscriptionOverage } from '@/lib/billing/core/billing' import { requireStripeClient } from '@/lib/billing/stripe-client' -import { sendEmail } from '@/lib/email/mailer' -import { quickValidateEmail } from '@/lib/email/validation' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' +import { sendEmail } from '@/lib/messaging/email/mailer' +import { quickValidateEmail } from '@/lib/messaging/email/validation' const logger = createLogger('StripeInvoiceWebhooks') diff --git a/apps/sim/lib/branding/branding.ts b/apps/sim/lib/branding/branding.ts index 2b46ef3317..e6964c05c0 100644 --- a/apps/sim/lib/branding/branding.ts +++ b/apps/sim/lib/branding/branding.ts @@ -1,4 +1,4 @@ -import { getEnv } from '@/lib/env' +import { getEnv } from '@/lib/core/config/env' export interface ThemeColors { primaryColor?: string diff --git a/apps/sim/lib/branding/metadata.ts b/apps/sim/lib/branding/metadata.ts index 34f7ff1024..bfe0863f9f 100644 --- a/apps/sim/lib/branding/metadata.ts +++ b/apps/sim/lib/branding/metadata.ts @@ -1,6 +1,6 @@ import type { Metadata } from 'next' import { getBrandConfig } from '@/lib/branding/branding' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' /** * Generate dynamic metadata based on brand configuration diff --git a/apps/sim/lib/chunkers/docs-chunker.ts b/apps/sim/lib/chunkers/docs-chunker.ts index e0da552800..e8d43b9aad 100644 --- a/apps/sim/lib/chunkers/docs-chunker.ts +++ b/apps/sim/lib/chunkers/docs-chunker.ts @@ -2,7 +2,7 @@ import fs from 'fs/promises' import path from 'path' import { TextChunker } from '@/lib/chunkers/text-chunker' import type { DocChunk, DocsChunkerOptions } from '@/lib/chunkers/types' -import { generateEmbeddings } from '@/lib/embeddings/utils' +import { generateEmbeddings } from '@/lib/knowledge/embeddings' import { createLogger } from '@/lib/logs/console/logger' interface HeaderInfo { diff --git a/apps/sim/lib/copilot/auth/permissions.ts b/apps/sim/lib/copilot/auth/permissions.ts index 2cbf7f2f3e..204db549ed 100644 --- a/apps/sim/lib/copilot/auth/permissions.ts +++ b/apps/sim/lib/copilot/auth/permissions.ts @@ -2,7 +2,7 @@ import { db } from '@sim/db' import { workflow } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions, type PermissionType } from '@/lib/permissions/utils' +import { getUserEntityPermissions, type PermissionType } from '@/lib/workspaces/permissions/utils' const logger = createLogger('CopilotPermissions') diff --git a/apps/sim/lib/sim-agent/utils.ts b/apps/sim/lib/copilot/chat-title.ts similarity index 97% rename from apps/sim/lib/sim-agent/utils.ts rename to apps/sim/lib/copilot/chat-title.ts index 3e4c2e1c57..430cf73065 100644 --- a/apps/sim/lib/sim-agent/utils.ts +++ b/apps/sim/lib/copilot/chat-title.ts @@ -1,5 +1,5 @@ import OpenAI, { AzureOpenAI } from 'openai' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('SimAgentUtils') diff --git a/apps/sim/lib/sim-agent/client.ts b/apps/sim/lib/copilot/client.ts similarity index 95% rename from apps/sim/lib/sim-agent/client.ts rename to apps/sim/lib/copilot/client.ts index 9f298e2709..4b7864248c 100644 --- a/apps/sim/lib/sim-agent/client.ts +++ b/apps/sim/lib/copilot/client.ts @@ -1,7 +1,7 @@ -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { SIM_AGENT_API_URL_DEFAULT } from '@/lib/sim-agent/constants' -import { generateRequestId } from '@/lib/utils' +import { SIM_AGENT_API_URL_DEFAULT } from './constants' const logger = createLogger('SimAgentClient') diff --git a/apps/sim/lib/sim-agent/constants.ts b/apps/sim/lib/copilot/constants.ts similarity index 100% rename from apps/sim/lib/sim-agent/constants.ts rename to apps/sim/lib/copilot/constants.ts diff --git a/apps/sim/lib/copilot/process-contents.ts b/apps/sim/lib/copilot/process-contents.ts index cac8a1d052..3bf6cf564f 100644 --- a/apps/sim/lib/copilot/process-contents.ts +++ b/apps/sim/lib/copilot/process-contents.ts @@ -2,8 +2,8 @@ import { db } from '@sim/db' import { copilotChats, document, knowledgeBase, templates } from '@sim/db/schema' import { and, eq, isNull } from 'drizzle-orm' import { createLogger } from '@/lib/logs/console/logger' -import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/db-helpers' -import { sanitizeForCopilot } from '@/lib/workflows/json-sanitizer' +import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/persistence/utils' +import { sanitizeForCopilot } from '@/lib/workflows/sanitization/json-sanitizer' import type { ChatContext } from '@/stores/panel/copilot/types' export type AgentContextType = diff --git a/apps/sim/lib/copilot/auth.ts b/apps/sim/lib/copilot/request-helpers.ts similarity index 97% rename from apps/sim/lib/copilot/auth.ts rename to apps/sim/lib/copilot/request-helpers.ts index 622632a292..bb2536f02b 100644 --- a/apps/sim/lib/copilot/auth.ts +++ b/apps/sim/lib/copilot/request-helpers.ts @@ -1,7 +1,7 @@ import { type NextRequest, NextResponse } from 'next/server' import { authenticateApiKeyFromHeader, updateApiKeyLastUsed } from '@/lib/api-key/service' import { getSession } from '@/lib/auth' -import { generateRequestId } from '@/lib/utils' +import { generateRequestId } from '@/lib/core/utils/request' export type { NotificationStatus } from '@/lib/copilot/types' diff --git a/apps/sim/lib/copilot/tools/client/workflow/deploy-workflow.ts b/apps/sim/lib/copilot/tools/client/workflow/deploy-workflow.ts index 9f2fbefade..28cd675775 100644 --- a/apps/sim/lib/copilot/tools/client/workflow/deploy-workflow.ts +++ b/apps/sim/lib/copilot/tools/client/workflow/deploy-workflow.ts @@ -5,7 +5,7 @@ import { ClientToolCallState, } from '@/lib/copilot/tools/client/base-tool' import { createLogger } from '@/lib/logs/console/logger' -import { getInputFormatExample } from '@/lib/workflows/deployment-utils' +import { getInputFormatExample } from '@/lib/workflows/operations/deployment-utils' import { useCopilotStore } from '@/stores/panel/copilot/store' import { useWorkflowRegistry } from '@/stores/workflows/registry/store' diff --git a/apps/sim/lib/copilot/tools/client/workflow/edit-workflow.ts b/apps/sim/lib/copilot/tools/client/workflow/edit-workflow.ts index fef18c7315..dedb8edc38 100644 --- a/apps/sim/lib/copilot/tools/client/workflow/edit-workflow.ts +++ b/apps/sim/lib/copilot/tools/client/workflow/edit-workflow.ts @@ -7,7 +7,7 @@ import { import { ExecuteResponseSuccessSchema } from '@/lib/copilot/tools/shared/schemas' import { createLogger } from '@/lib/logs/console/logger' import { stripWorkflowDiffMarkers } from '@/lib/workflows/diff' -import { sanitizeForCopilot } from '@/lib/workflows/json-sanitizer' +import { sanitizeForCopilot } from '@/lib/workflows/sanitization/json-sanitizer' import { useWorkflowDiffStore } from '@/stores/workflow-diff/store' import { useWorkflowRegistry } from '@/stores/workflows/registry/store' import { mergeSubblockState } from '@/stores/workflows/utils' diff --git a/apps/sim/lib/copilot/tools/client/workflow/get-user-workflow.ts b/apps/sim/lib/copilot/tools/client/workflow/get-user-workflow.ts index 531b10e719..b66d03f7da 100644 --- a/apps/sim/lib/copilot/tools/client/workflow/get-user-workflow.ts +++ b/apps/sim/lib/copilot/tools/client/workflow/get-user-workflow.ts @@ -6,7 +6,7 @@ import { } from '@/lib/copilot/tools/client/base-tool' import { createLogger } from '@/lib/logs/console/logger' import { stripWorkflowDiffMarkers } from '@/lib/workflows/diff' -import { sanitizeForCopilot } from '@/lib/workflows/json-sanitizer' +import { sanitizeForCopilot } from '@/lib/workflows/sanitization/json-sanitizer' import { useWorkflowRegistry } from '@/stores/workflows/registry/store' import { mergeSubblockState } from '@/stores/workflows/utils' import { useWorkflowStore } from '@/stores/workflows/workflow/store' diff --git a/apps/sim/lib/copilot/tools/client/workflow/get-workflow-from-name.ts b/apps/sim/lib/copilot/tools/client/workflow/get-workflow-from-name.ts index 161b925c28..b310748a38 100644 --- a/apps/sim/lib/copilot/tools/client/workflow/get-workflow-from-name.ts +++ b/apps/sim/lib/copilot/tools/client/workflow/get-workflow-from-name.ts @@ -5,7 +5,7 @@ import { ClientToolCallState, } from '@/lib/copilot/tools/client/base-tool' import { createLogger } from '@/lib/logs/console/logger' -import { sanitizeForCopilot } from '@/lib/workflows/json-sanitizer' +import { sanitizeForCopilot } from '@/lib/workflows/sanitization/json-sanitizer' import { useWorkflowRegistry } from '@/stores/workflows/registry/store' const logger = createLogger('GetWorkflowFromNameClientTool') diff --git a/apps/sim/lib/copilot/tools/server/docs/search-documentation.ts b/apps/sim/lib/copilot/tools/server/docs/search-documentation.ts index c0cccf4f1a..4702edd8bb 100644 --- a/apps/sim/lib/copilot/tools/server/docs/search-documentation.ts +++ b/apps/sim/lib/copilot/tools/server/docs/search-documentation.ts @@ -23,7 +23,7 @@ export const searchDocumentationServerTool: BaseServerTool | Array<{ name: string; value: string }> diff --git a/apps/sim/lib/copilot/tools/server/workflow/edit-workflow.ts b/apps/sim/lib/copilot/tools/server/workflow/edit-workflow.ts index 2e6e5ed0f4..6d18c49aed 100644 --- a/apps/sim/lib/copilot/tools/server/workflow/edit-workflow.ts +++ b/apps/sim/lib/copilot/tools/server/workflow/edit-workflow.ts @@ -4,10 +4,10 @@ import { workflow as workflowTable } from '@sim/db/schema' import { eq } from 'drizzle-orm' import type { BaseServerTool } from '@/lib/copilot/tools/server/base-tool' import { createLogger } from '@/lib/logs/console/logger' -import { getBlockOutputs } from '@/lib/workflows/block-outputs' -import { extractAndPersistCustomTools } from '@/lib/workflows/custom-tools-persistence' -import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/db-helpers' -import { validateWorkflowState } from '@/lib/workflows/validation' +import { getBlockOutputs } from '@/lib/workflows/blocks/block-outputs' +import { extractAndPersistCustomTools } from '@/lib/workflows/persistence/custom-tools-persistence' +import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/persistence/utils' +import { validateWorkflowState } from '@/lib/workflows/sanitization/validation' import { getAllBlocks } from '@/blocks/registry' import { generateLoopBlocks, generateParallelBlocks } from '@/stores/workflows/workflow/utils' import { TRIGGER_RUNTIME_SUBBLOCK_IDS } from '@/triggers/consts' diff --git a/apps/sim/lib/copilot/utils.ts b/apps/sim/lib/copilot/utils.ts index 07a4254cdc..6e2357611e 100644 --- a/apps/sim/lib/copilot/utils.ts +++ b/apps/sim/lib/copilot/utils.ts @@ -1,5 +1,5 @@ import type { NextRequest } from 'next/server' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' export function checkInternalApiKey(req: NextRequest) { const apiKey = req.headers.get('x-api-key') diff --git a/apps/sim/lib/core/config/api-keys.ts b/apps/sim/lib/core/config/api-keys.ts new file mode 100644 index 0000000000..f17e484392 --- /dev/null +++ b/apps/sim/lib/core/config/api-keys.ts @@ -0,0 +1,42 @@ +import { env } from '@/lib/core/config/env' + +/** + * Rotates through available API keys for a provider + * @param provider - The provider to get a key for (e.g., 'openai') + * @returns The selected API key + * @throws Error if no API keys are configured for rotation + */ +export function getRotatingApiKey(provider: string): string { + if (provider !== 'openai' && provider !== 'anthropic' && provider !== 'gemini') { + throw new Error(`No rotation implemented for provider: ${provider}`) + } + + const keys = [] + + if (provider === 'openai') { + if (env.OPENAI_API_KEY_1) keys.push(env.OPENAI_API_KEY_1) + if (env.OPENAI_API_KEY_2) keys.push(env.OPENAI_API_KEY_2) + if (env.OPENAI_API_KEY_3) keys.push(env.OPENAI_API_KEY_3) + } else if (provider === 'anthropic') { + if (env.ANTHROPIC_API_KEY_1) keys.push(env.ANTHROPIC_API_KEY_1) + if (env.ANTHROPIC_API_KEY_2) keys.push(env.ANTHROPIC_API_KEY_2) + if (env.ANTHROPIC_API_KEY_3) keys.push(env.ANTHROPIC_API_KEY_3) + } else if (provider === 'gemini') { + if (env.GEMINI_API_KEY_1) keys.push(env.GEMINI_API_KEY_1) + if (env.GEMINI_API_KEY_2) keys.push(env.GEMINI_API_KEY_2) + if (env.GEMINI_API_KEY_3) keys.push(env.GEMINI_API_KEY_3) + } + + if (keys.length === 0) { + throw new Error( + `No API keys configured for rotation. Please configure ${provider.toUpperCase()}_API_KEY_1, ${provider.toUpperCase()}_API_KEY_2, or ${provider.toUpperCase()}_API_KEY_3.` + ) + } + + // Simple round-robin rotation based on current minute + // This distributes load across keys and is stateless + const currentMinute = new Date().getMinutes() + const keyIndex = currentMinute % keys.length + + return keys[keyIndex] +} diff --git a/apps/sim/lib/env.ts b/apps/sim/lib/core/config/env.ts similarity index 100% rename from apps/sim/lib/env.ts rename to apps/sim/lib/core/config/env.ts diff --git a/apps/sim/lib/environment.ts b/apps/sim/lib/core/config/environment.ts similarity index 100% rename from apps/sim/lib/environment.ts rename to apps/sim/lib/core/config/environment.ts diff --git a/apps/sim/lib/redis.ts b/apps/sim/lib/core/config/redis.ts similarity index 99% rename from apps/sim/lib/redis.ts rename to apps/sim/lib/core/config/redis.ts index 4944329a48..19fdc16a8d 100644 --- a/apps/sim/lib/redis.ts +++ b/apps/sim/lib/core/config/redis.ts @@ -1,5 +1,5 @@ import Redis from 'ioredis' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('Redis') diff --git a/apps/sim/lib/idempotency/cleanup.ts b/apps/sim/lib/core/idempotency/cleanup.ts similarity index 100% rename from apps/sim/lib/idempotency/cleanup.ts rename to apps/sim/lib/core/idempotency/cleanup.ts diff --git a/apps/sim/lib/idempotency/index.ts b/apps/sim/lib/core/idempotency/index.ts similarity index 100% rename from apps/sim/lib/idempotency/index.ts rename to apps/sim/lib/core/idempotency/index.ts diff --git a/apps/sim/lib/idempotency/service.ts b/apps/sim/lib/core/idempotency/service.ts similarity index 99% rename from apps/sim/lib/idempotency/service.ts rename to apps/sim/lib/core/idempotency/service.ts index 31495c2a99..bc9fbf0eae 100644 --- a/apps/sim/lib/idempotency/service.ts +++ b/apps/sim/lib/core/idempotency/service.ts @@ -2,8 +2,8 @@ import { randomUUID } from 'crypto' import { db } from '@sim/db' import { idempotencyKey } from '@sim/db/schema' import { and, eq } from 'drizzle-orm' +import { getRedisClient } from '@/lib/core/config/redis' import { createLogger } from '@/lib/logs/console/logger' -import { getRedisClient } from '@/lib/redis' import { extractProviderIdentifierFromBody } from '@/lib/webhooks/provider-utils' const logger = createLogger('IdempotencyService') diff --git a/apps/sim/lib/security/csp.ts b/apps/sim/lib/core/security/csp.ts similarity index 99% rename from apps/sim/lib/security/csp.ts rename to apps/sim/lib/core/security/csp.ts index 3c502e1529..01ce111f14 100644 --- a/apps/sim/lib/security/csp.ts +++ b/apps/sim/lib/core/security/csp.ts @@ -1,4 +1,4 @@ -import { env, getEnv } from '../env' +import { env, getEnv } from '../config/env' /** * Content Security Policy (CSP) configuration builder diff --git a/apps/sim/lib/core/security/encryption.ts b/apps/sim/lib/core/security/encryption.ts new file mode 100644 index 0000000000..5ff0c9c845 --- /dev/null +++ b/apps/sim/lib/core/security/encryption.ts @@ -0,0 +1,84 @@ +import { createCipheriv, createDecipheriv, randomBytes } from 'crypto' +import { env } from '@/lib/core/config/env' +import { createLogger } from '@/lib/logs/console/logger' + +const logger = createLogger('Encryption') + +function getEncryptionKey(): Buffer { + const key = env.ENCRYPTION_KEY + if (!key || key.length !== 64) { + throw new Error('ENCRYPTION_KEY must be set to a 64-character hex string (32 bytes)') + } + return Buffer.from(key, 'hex') +} + +/** + * Encrypts a secret using AES-256-GCM + * @param secret - The secret to encrypt + * @returns A promise that resolves to an object containing the encrypted secret and IV + */ +export async function encryptSecret(secret: string): Promise<{ encrypted: string; iv: string }> { + const iv = randomBytes(16) + const key = getEncryptionKey() + + const cipher = createCipheriv('aes-256-gcm', key, iv) + let encrypted = cipher.update(secret, 'utf8', 'hex') + encrypted += cipher.final('hex') + + const authTag = cipher.getAuthTag() + + // Format: iv:encrypted:authTag + return { + encrypted: `${iv.toString('hex')}:${encrypted}:${authTag.toString('hex')}`, + iv: iv.toString('hex'), + } +} + +/** + * Decrypts an encrypted secret + * @param encryptedValue - The encrypted value in format "iv:encrypted:authTag" + * @returns A promise that resolves to an object containing the decrypted secret + */ +export async function decryptSecret(encryptedValue: string): Promise<{ decrypted: string }> { + const parts = encryptedValue.split(':') + const ivHex = parts[0] + const authTagHex = parts[parts.length - 1] + const encrypted = parts.slice(1, -1).join(':') + + if (!ivHex || !encrypted || !authTagHex) { + throw new Error('Invalid encrypted value format. Expected "iv:encrypted:authTag"') + } + + const key = getEncryptionKey() + const iv = Buffer.from(ivHex, 'hex') + const authTag = Buffer.from(authTagHex, 'hex') + + try { + const decipher = createDecipheriv('aes-256-gcm', key, iv) + decipher.setAuthTag(authTag) + + let decrypted = decipher.update(encrypted, 'hex', 'utf8') + decrypted += decipher.final('utf8') + + return { decrypted } + } catch (error: any) { + logger.error('Decryption error:', { error: error.message }) + throw error + } +} + +/** + * Generates a secure random password + * @param length - The length of the password (default: 24) + * @returns A new secure password string + */ +export function generatePassword(length = 24): string { + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_-+=' + let result = '' + + for (let i = 0; i < length; i++) { + result += chars.charAt(Math.floor(Math.random() * chars.length)) + } + + return result +} diff --git a/apps/sim/lib/security/input-validation.test.ts b/apps/sim/lib/core/security/input-validation.test.ts similarity index 99% rename from apps/sim/lib/security/input-validation.test.ts rename to apps/sim/lib/core/security/input-validation.test.ts index 2a9b5b4df7..e8250f34da 100644 --- a/apps/sim/lib/security/input-validation.test.ts +++ b/apps/sim/lib/core/security/input-validation.test.ts @@ -8,7 +8,7 @@ import { validateNumericId, validatePathSegment, validateUUID, -} from '@/lib/security/input-validation' +} from '@/lib/core/security/input-validation' describe('validatePathSegment', () => { describe('valid inputs', () => { diff --git a/apps/sim/lib/security/input-validation.ts b/apps/sim/lib/core/security/input-validation.ts similarity index 100% rename from apps/sim/lib/security/input-validation.ts rename to apps/sim/lib/core/security/input-validation.ts diff --git a/apps/sim/lib/core/security/redaction.ts b/apps/sim/lib/core/security/redaction.ts new file mode 100644 index 0000000000..64e795deb2 --- /dev/null +++ b/apps/sim/lib/core/security/redaction.ts @@ -0,0 +1,34 @@ +/** + * Recursively redacts API keys in an object + * @param obj The object to redact API keys from + * @returns A new object with API keys redacted + */ +export const redactApiKeys = (obj: any): any => { + if (!obj || typeof obj !== 'object') { + return obj + } + + if (Array.isArray(obj)) { + return obj.map(redactApiKeys) + } + + const result: Record = {} + + for (const [key, value] of Object.entries(obj)) { + if ( + key.toLowerCase() === 'apikey' || + key.toLowerCase() === 'api_key' || + key.toLowerCase() === 'access_token' || + /\bsecret\b/i.test(key.toLowerCase()) || + /\bpassword\b/i.test(key.toLowerCase()) + ) { + result[key] = '***REDACTED***' + } else if (typeof value === 'object' && value !== null) { + result[key] = redactApiKeys(value) + } else { + result[key] = value + } + } + + return result +} diff --git a/apps/sim/lib/telemetry/tracer.ts b/apps/sim/lib/core/telemetry.ts similarity index 100% rename from apps/sim/lib/telemetry/tracer.ts rename to apps/sim/lib/core/telemetry.ts diff --git a/apps/sim/lib/utils.test.ts b/apps/sim/lib/core/utils.test.ts similarity index 96% rename from apps/sim/lib/utils.test.ts rename to apps/sim/lib/core/utils.test.ts index 4b04c23858..7b69a51ace 100644 --- a/apps/sim/lib/utils.test.ts +++ b/apps/sim/lib/core/utils.test.ts @@ -1,20 +1,17 @@ import { afterEach, describe, expect, it, vi } from 'vitest' +import { getRotatingApiKey } from '@/lib/core/config/api-keys' +import { decryptSecret, encryptSecret } from '@/lib/core/security/encryption' +import { redactApiKeys } from '@/lib/core/security/redaction' +import { cn } from '@/lib/core/utils/cn' import { - cn, - convertScheduleOptionsToCron, - decryptSecret, - encryptSecret, formatDate, formatDateTime, formatDuration, formatTime, - getInvalidCharacters, - getRotatingApiKey, getTimezoneAbbreviation, - isValidName, - redactApiKeys, - validateName, -} from '@/lib/utils' +} from '@/lib/core/utils/formatting' +import { convertScheduleOptionsToCron } from '@/lib/core/utils/scheduling' +import { getInvalidCharacters, isValidName, validateName } from '@/lib/core/utils/validation' vi.mock('crypto', () => ({ createCipheriv: vi.fn().mockReturnValue({ @@ -34,7 +31,7 @@ vi.mock('crypto', () => ({ }), })) -vi.mock('@/lib/env', () => ({ +vi.mock('@/lib/core/config/env', () => ({ env: { ENCRYPTION_KEY: '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef', OPENAI_API_KEY_1: 'test-openai-key-1', diff --git a/apps/sim/lib/browser-storage.ts b/apps/sim/lib/core/utils/browser-storage.ts similarity index 100% rename from apps/sim/lib/browser-storage.ts rename to apps/sim/lib/core/utils/browser-storage.ts diff --git a/apps/sim/lib/core/utils/cn.ts b/apps/sim/lib/core/utils/cn.ts new file mode 100644 index 0000000000..952d546a76 --- /dev/null +++ b/apps/sim/lib/core/utils/cn.ts @@ -0,0 +1,9 @@ +import { type ClassValue, clsx } from 'clsx' +import { twMerge } from 'tailwind-merge' + +/** + * Combines class names using clsx and tailwind-merge + */ +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/apps/sim/lib/core/utils/display-filters.ts b/apps/sim/lib/core/utils/display-filters.ts new file mode 100644 index 0000000000..c55a7669cf --- /dev/null +++ b/apps/sim/lib/core/utils/display-filters.ts @@ -0,0 +1,85 @@ +/** + * Type guard to check if an object is a UserFile + */ +export function isUserFile(candidate: unknown): candidate is { + id: string + name: string + url: string + key: string + size: number + type: string + context?: string +} { + if (!candidate || typeof candidate !== 'object') { + return false + } + + const value = candidate as Record + return ( + typeof value.id === 'string' && + typeof value.key === 'string' && + typeof value.url === 'string' && + typeof value.name === 'string' + ) +} + +/** + * Filter function that transforms UserFile objects for display + * Removes internal fields: key, context + * Keeps user-friendly fields: id, name, url, size, type + */ +function filterUserFile(data: any): any { + if (isUserFile(data)) { + const { id, name, url, size, type } = data + return { id, name, url, size, type } + } + return data +} + +/** + * Registry of filter functions to apply to data for cleaner display in logs/console. + * Add new filter functions here to handle additional data types. + */ +const DISPLAY_FILTERS = [ + filterUserFile, + // Add more filters here as needed +] + +/** + * Generic helper to filter internal/technical fields from data for cleaner display in logs and console. + * Applies all registered filters recursively to the data structure. + * + * To add a new filter: + * 1. Create a filter function that checks and transforms a specific data type + * 2. Add it to the DISPLAY_FILTERS array above + * + * @param data - Data to filter (objects, arrays, primitives) + * @returns Filtered data with internal fields removed + */ +export function filterForDisplay(data: any): any { + if (!data || typeof data !== 'object') { + return data + } + + // Apply all registered filters + const filtered = data + for (const filterFn of DISPLAY_FILTERS) { + const result = filterFn(filtered) + if (result !== filtered) { + // Filter matched and transformed the data + return result + } + } + + // No filters matched - recursively filter nested structures + if (Array.isArray(filtered)) { + return filtered.map(filterForDisplay) + } + + // Recursively filter object properties + const result: any = {} + for (const [key, value] of Object.entries(filtered)) { + result[key] = filterForDisplay(value) + } + return result +} diff --git a/apps/sim/lib/core/utils/formatting.ts b/apps/sim/lib/core/utils/formatting.ts new file mode 100644 index 0000000000..5543026f56 --- /dev/null +++ b/apps/sim/lib/core/utils/formatting.ts @@ -0,0 +1,141 @@ +/** + * Get a user-friendly timezone abbreviation + * @param timezone - IANA timezone string + * @param date - Date to check for DST + * @returns A simplified timezone string (e.g., "PST" instead of "America/Los_Angeles") + */ +export function getTimezoneAbbreviation(timezone: string, date: Date = new Date()): string { + if (timezone === 'UTC') return 'UTC' + + // Common timezone mappings + const timezoneMap: Record = { + 'America/Los_Angeles': { standard: 'PST', daylight: 'PDT' }, + 'America/Denver': { standard: 'MST', daylight: 'MDT' }, + 'America/Chicago': { standard: 'CST', daylight: 'CDT' }, + 'America/New_York': { standard: 'EST', daylight: 'EDT' }, + 'Europe/London': { standard: 'GMT', daylight: 'BST' }, + 'Europe/Paris': { standard: 'CET', daylight: 'CEST' }, + 'Asia/Tokyo': { standard: 'JST', daylight: 'JST' }, // Japan doesn't use DST + 'Australia/Sydney': { standard: 'AEST', daylight: 'AEDT' }, + 'Asia/Singapore': { standard: 'SGT', daylight: 'SGT' }, // Singapore doesn't use DST + } + + // If we have a mapping for this timezone + if (timezone in timezoneMap) { + // January 1 is guaranteed to be standard time in northern hemisphere + // July 1 is guaranteed to be daylight time in northern hemisphere (if observed) + const januaryDate = new Date(date.getFullYear(), 0, 1) + const julyDate = new Date(date.getFullYear(), 6, 1) + + // Get offset in January (standard time) + const januaryFormatter = new Intl.DateTimeFormat('en-US', { + timeZone: timezone, + timeZoneName: 'short', + }) + + // Get offset in July (likely daylight time) + const julyFormatter = new Intl.DateTimeFormat('en-US', { + timeZone: timezone, + timeZoneName: 'short', + }) + + // If offsets are different, timezone observes DST + const isDSTObserved = januaryFormatter.format(januaryDate) !== julyFormatter.format(julyDate) + + // If DST is observed, check if current date is in DST by comparing its offset + // with January's offset (standard time) + if (isDSTObserved) { + const currentFormatter = new Intl.DateTimeFormat('en-US', { + timeZone: timezone, + timeZoneName: 'short', + }) + + const isDST = currentFormatter.format(date) !== januaryFormatter.format(januaryDate) + return isDST ? timezoneMap[timezone].daylight : timezoneMap[timezone].standard + } + + // If DST is not observed, always use standard + return timezoneMap[timezone].standard + } + + // For unknown timezones, use full IANA name + return timezone +} + +/** + * Format a date into a human-readable format + * @param date - The date to format + * @param timezone - Optional IANA timezone string (e.g., 'America/Los_Angeles', 'UTC') + * @returns A formatted date string in the format "MMM D, YYYY h:mm A" + */ +export function formatDateTime(date: Date, timezone?: string): string { + const formattedDate = date.toLocaleString('en-US', { + month: 'short', + day: 'numeric', + year: 'numeric', + hour: 'numeric', + minute: '2-digit', + hour12: true, + timeZone: timezone || undefined, + }) + + // If timezone is provided, add a friendly timezone abbreviation + if (timezone) { + const tzAbbr = getTimezoneAbbreviation(timezone, date) + return `${formattedDate} ${tzAbbr}` + } + + return formattedDate +} + +/** + * Format a date into a short format + * @param date - The date to format + * @returns A formatted date string in the format "MMM D, YYYY" + */ +export function formatDate(date: Date): string { + return date.toLocaleString('en-US', { + month: 'short', + day: 'numeric', + year: 'numeric', + }) +} + +/** + * Format a time into a short format + * @param date - The date to format + * @returns A formatted time string in the format "h:mm A" + */ +export function formatTime(date: Date): string { + return date.toLocaleString('en-US', { + hour: 'numeric', + minute: '2-digit', + hour12: true, + }) +} + +/** + * Format a duration in milliseconds to a human-readable format + * @param durationMs - The duration in milliseconds + * @returns A formatted duration string + */ +export function formatDuration(durationMs: number): string { + if (durationMs < 1000) { + return `${durationMs}ms` + } + + const seconds = Math.floor(durationMs / 1000) + if (seconds < 60) { + return `${seconds}s` + } + + const minutes = Math.floor(seconds / 60) + const remainingSeconds = seconds % 60 + if (minutes < 60) { + return `${minutes}m ${remainingSeconds}s` + } + + const hours = Math.floor(minutes / 60) + const remainingMinutes = minutes % 60 + return `${hours}h ${remainingMinutes}m` +} diff --git a/apps/sim/lib/core/utils/optimistic-update.ts b/apps/sim/lib/core/utils/optimistic-update.ts new file mode 100644 index 0000000000..e0776c718f --- /dev/null +++ b/apps/sim/lib/core/utils/optimistic-update.ts @@ -0,0 +1,103 @@ +import { createLogger } from '@/lib/logs/console/logger' + +const logger = createLogger('OptimisticUpdate') + +/** + * Options for performing an optimistic update with automatic rollback on error + */ +export interface OptimisticUpdateOptions { + /** + * Function that returns the current state value (for rollback purposes) + */ + getCurrentState: () => T + /** + * Function that performs the optimistic update to the UI state + */ + optimisticUpdate: () => void + /** + * Async function that performs the actual API call + */ + apiCall: () => Promise + /** + * Function that rolls back the state to the original value + * @param originalValue - The value returned by getCurrentState before the update + */ + rollback: (originalValue: T) => void + /** + * Optional error message to log if the operation fails + */ + errorMessage?: string + /** + * Optional callback to execute on error (e.g., show toast notification) + */ + onError?: (error: Error, originalValue: T) => void + /** + * Optional callback that always runs regardless of success or error (e.g., to clear loading states) + */ + onComplete?: () => void +} + +/** + * Performs an optimistic update with automatic rollback on error. + * This utility standardizes the pattern of: + * 1. Save current state + * 2. Update UI optimistically + * 3. Make API call + * 4. Rollback on error + * + * @example + * ```typescript + * await withOptimisticUpdate({ + * getCurrentState: () => get().folders[id], + * optimisticUpdate: () => set(state => ({ + * folders: { ...state.folders, [id]: { ...folder, name: newName } } + * })), + * apiCall: async () => { + * await fetch(`/api/folders/${id}`, { + * method: 'PUT', + * body: JSON.stringify({ name: newName }) + * }) + * }, + * rollback: (originalFolder) => set(state => ({ + * folders: { ...state.folders, [id]: originalFolder } + * })), + * errorMessage: 'Failed to rename folder', + * onError: (error) => toast.error('Could not rename folder') + * }) + * ``` + */ +export async function withOptimisticUpdate(options: OptimisticUpdateOptions): Promise { + const { + getCurrentState, + optimisticUpdate, + apiCall, + rollback, + errorMessage, + onError, + onComplete, + } = options + + const originalValue = getCurrentState() + + optimisticUpdate() + + try { + await apiCall() + } catch (error) { + rollback(originalValue) + + if (errorMessage) { + logger.error(errorMessage, { error }) + } + + if (onError && error instanceof Error) { + onError(error, originalValue) + } + + throw error + } finally { + if (onComplete) { + onComplete() + } + } +} diff --git a/apps/sim/lib/core/utils/request.ts b/apps/sim/lib/core/utils/request.ts new file mode 100644 index 0000000000..6e64b9b108 --- /dev/null +++ b/apps/sim/lib/core/utils/request.ts @@ -0,0 +1,11 @@ +/** + * Generate a short request ID for correlation + */ +export function generateRequestId(): string { + return crypto.randomUUID().slice(0, 8) +} + +/** + * No-operation function for use as default callback + */ +export const noop = () => {} diff --git a/apps/sim/lib/response-format.ts b/apps/sim/lib/core/utils/response-format.ts similarity index 100% rename from apps/sim/lib/response-format.ts rename to apps/sim/lib/core/utils/response-format.ts diff --git a/apps/sim/lib/core/utils/scheduling.ts b/apps/sim/lib/core/utils/scheduling.ts new file mode 100644 index 0000000000..ad24ae7d2b --- /dev/null +++ b/apps/sim/lib/core/utils/scheduling.ts @@ -0,0 +1,51 @@ +/** + * Converts schedule options to a cron expression + */ +export function convertScheduleOptionsToCron( + scheduleType: string, + options: Record +): string { + switch (scheduleType) { + case 'minutes': { + const interval = options.minutesInterval || '15' + // For example, if options.minutesStartingAt is provided, use that as the start minute. + return `*/${interval} * * * *` + } + case 'hourly': { + // When scheduling hourly, take the specified minute offset + return `${options.hourlyMinute || '00'} * * * *` + } + case 'daily': { + // Expected dailyTime in HH:MM + const [minute, hour] = (options.dailyTime || '00:09').split(':') + return `${minute || '00'} ${hour || '09'} * * *` + } + case 'weekly': { + // Expected weeklyDay as MON, TUE, etc. and weeklyDayTime in HH:MM + const dayMap: Record = { + MON: 1, + TUE: 2, + WED: 3, + THU: 4, + FRI: 5, + SAT: 6, + SUN: 0, + } + const day = dayMap[options.weeklyDay || 'MON'] + const [minute, hour] = (options.weeklyDayTime || '00:09').split(':') + return `${minute || '00'} ${hour || '09'} * * ${day}` + } + case 'monthly': { + // Expected monthlyDay and monthlyTime in HH:MM + const day = options.monthlyDay || '1' + const [minute, hour] = (options.monthlyTime || '00:09').split(':') + return `${minute || '00'} ${hour || '09'} ${day} * *` + } + case 'custom': { + // Use the provided cron expression directly + return options.cronExpression + } + default: + throw new Error('Unsupported schedule type') + } +} diff --git a/apps/sim/lib/core/utils/sse.ts b/apps/sim/lib/core/utils/sse.ts new file mode 100644 index 0000000000..93041ca279 --- /dev/null +++ b/apps/sim/lib/core/utils/sse.ts @@ -0,0 +1,21 @@ +/** + * Standard headers for Server-Sent Events responses + */ +export const SSE_HEADERS = { + 'Content-Type': 'text/event-stream', + 'Cache-Control': 'no-cache', + Connection: 'keep-alive', + 'X-Accel-Buffering': 'no', +} as const + +/** + * Encodes data as a Server-Sent Events (SSE) message. + * Formats the data as a JSON string prefixed with "data:" and suffixed with two newlines, + * then encodes it as a Uint8Array for streaming. + * + * @param data - The data to encode and send via SSE + * @returns The encoded SSE message as a Uint8Array + */ +export function encodeSSE(data: any): Uint8Array { + return new TextEncoder().encode(`data: ${JSON.stringify(data)}\n\n`) +} diff --git a/apps/sim/lib/theme-sync.ts b/apps/sim/lib/core/utils/theme.ts similarity index 100% rename from apps/sim/lib/theme-sync.ts rename to apps/sim/lib/core/utils/theme.ts diff --git a/apps/sim/lib/urls/utils.ts b/apps/sim/lib/core/utils/urls.ts similarity index 94% rename from apps/sim/lib/urls/utils.ts rename to apps/sim/lib/core/utils/urls.ts index 0b623b1ebf..e740ac52fc 100644 --- a/apps/sim/lib/urls/utils.ts +++ b/apps/sim/lib/core/utils/urls.ts @@ -1,5 +1,5 @@ -import { getEnv } from '@/lib/env' -import { isProd } from '@/lib/environment' +import { getEnv } from '@/lib/core/config/env' +import { isProd } from '@/lib/core/config/environment' /** * Returns the base URL of the application from NEXT_PUBLIC_APP_URL diff --git a/apps/sim/lib/core/utils/validation.ts b/apps/sim/lib/core/utils/validation.ts new file mode 100644 index 0000000000..b8b221fac0 --- /dev/null +++ b/apps/sim/lib/core/utils/validation.ts @@ -0,0 +1,33 @@ +/** + * Validates a name by removing any characters that could cause issues + * with variable references or node naming. + * + * @param name - The name to validate + * @returns The validated name with invalid characters removed, trimmed, and collapsed whitespace + */ +export function validateName(name: string): string { + return name + .replace(/[^a-zA-Z0-9_\s]/g, '') // Remove invalid characters + .replace(/\s+/g, ' ') // Collapse multiple spaces into single spaces +} + +/** + * Checks if a name contains invalid characters + * + * @param name - The name to check + * @returns True if the name is valid, false otherwise + */ +export function isValidName(name: string): boolean { + return /^[a-zA-Z0-9_\s]*$/.test(name) +} + +/** + * Gets a list of invalid characters in a name + * + * @param name - The name to check + * @returns Array of invalid characters found + */ +export function getInvalidCharacters(name: string): string[] { + const invalidChars = name.match(/[^a-zA-Z0-9_\s]/g) + return invalidChars ? [...new Set(invalidChars)] : [] +} diff --git a/apps/sim/lib/environment/utils.ts b/apps/sim/lib/environment/utils.ts index 74e25f59fd..764361cd2c 100644 --- a/apps/sim/lib/environment/utils.ts +++ b/apps/sim/lib/environment/utils.ts @@ -1,8 +1,8 @@ import { db } from '@sim/db' import { environment, workspaceEnvironment } from '@sim/db/schema' import { eq } from 'drizzle-orm' +import { decryptSecret } from '@/lib/core/security/encryption' import { createLogger } from '@/lib/logs/console/logger' -import { decryptSecret } from '@/lib/utils' const logger = createLogger('EnvironmentUtils') diff --git a/apps/sim/lib/execution/e2b.ts b/apps/sim/lib/execution/e2b.ts index c11995ee66..fb6312c6d2 100644 --- a/apps/sim/lib/execution/e2b.ts +++ b/apps/sim/lib/execution/e2b.ts @@ -1,5 +1,5 @@ import { Sandbox } from '@e2b/code-interpreter' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { CodeLanguage } from '@/lib/execution/languages' import { createLogger } from '@/lib/logs/console/logger' diff --git a/apps/sim/lib/execution/files.ts b/apps/sim/lib/execution/files.ts index efa84af5e6..718d1e203a 100644 --- a/apps/sim/lib/execution/files.ts +++ b/apps/sim/lib/execution/files.ts @@ -1,7 +1,7 @@ import { v4 as uuidv4 } from 'uuid' import { createLogger } from '@/lib/logs/console/logger' import { uploadExecutionFile } from '@/lib/uploads/contexts/execution' -import { TRIGGER_TYPES } from '@/lib/workflows/triggers' +import { TRIGGER_TYPES } from '@/lib/workflows/triggers/triggers' import type { InputFormatField } from '@/lib/workflows/types' import type { UserFile } from '@/executor/types' import type { SerializedBlock } from '@/serializer/types' diff --git a/apps/sim/lib/guardrails/validate_hallucination.ts b/apps/sim/lib/guardrails/validate_hallucination.ts index 409b8bb2ef..fd57526db7 100644 --- a/apps/sim/lib/guardrails/validate_hallucination.ts +++ b/apps/sim/lib/guardrails/validate_hallucination.ts @@ -1,5 +1,5 @@ +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' import { executeProviderRequest } from '@/providers' import { getApiKey, getProviderFromModel } from '@/providers/utils' diff --git a/apps/sim/lib/knowledge/chunks/service.ts b/apps/sim/lib/knowledge/chunks/service.ts index b63f7dbde1..50cd0bc594 100644 --- a/apps/sim/lib/knowledge/chunks/service.ts +++ b/apps/sim/lib/knowledge/chunks/service.ts @@ -2,7 +2,6 @@ import { createHash, randomUUID } from 'crypto' import { db } from '@sim/db' import { document, embedding } from '@sim/db/schema' import { and, asc, eq, ilike, inArray, sql } from 'drizzle-orm' -import { generateEmbeddings } from '@/lib/embeddings/utils' import type { BatchOperationResult, ChunkData, @@ -10,6 +9,7 @@ import type { ChunkQueryResult, CreateChunkData, } from '@/lib/knowledge/chunks/types' +import { generateEmbeddings } from '@/lib/knowledge/embeddings' import { createLogger } from '@/lib/logs/console/logger' import { estimateTokenCount } from '@/lib/tokenization/estimators' diff --git a/apps/sim/lib/knowledge/consts.ts b/apps/sim/lib/knowledge/constants.ts similarity index 100% rename from apps/sim/lib/knowledge/consts.ts rename to apps/sim/lib/knowledge/constants.ts diff --git a/apps/sim/lib/knowledge/documents/document-processor.ts b/apps/sim/lib/knowledge/documents/document-processor.ts index c11ce78dc8..f3473b5b24 100644 --- a/apps/sim/lib/knowledge/documents/document-processor.ts +++ b/apps/sim/lib/knowledge/documents/document-processor.ts @@ -1,5 +1,5 @@ import { type Chunk, JsonYamlChunker, StructuredDataChunker, TextChunker } from '@/lib/chunkers' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { parseBuffer, parseFile } from '@/lib/file-parsers' import { retryWithExponentialBackoff } from '@/lib/knowledge/documents/utils' import { createLogger } from '@/lib/logs/console/logger' @@ -400,7 +400,7 @@ async function parseWithMistralOCR( const isInternalRoute = url.startsWith('/') if (isInternalRoute) { - const { getBaseUrl } = await import('@/lib/urls/utils') + const { getBaseUrl } = await import('@/lib/core/utils/urls') url = `${getBaseUrl()}${url}` } diff --git a/apps/sim/lib/knowledge/documents/queue.ts b/apps/sim/lib/knowledge/documents/queue.ts index 93fa4e6013..caf05fe66d 100644 --- a/apps/sim/lib/knowledge/documents/queue.ts +++ b/apps/sim/lib/knowledge/documents/queue.ts @@ -1,5 +1,5 @@ +import { getRedisClient } from '@/lib/core/config/redis' import { createLogger } from '@/lib/logs/console/logger' -import { getRedisClient } from '@/lib/redis' const logger = createLogger('DocumentQueue') diff --git a/apps/sim/lib/knowledge/documents/service.ts b/apps/sim/lib/knowledge/documents/service.ts index 77c83875fd..cee66e1ed7 100644 --- a/apps/sim/lib/knowledge/documents/service.ts +++ b/apps/sim/lib/knowledge/documents/service.ts @@ -3,15 +3,15 @@ import { db } from '@sim/db' import { document, embedding, knowledgeBase, knowledgeBaseTagDefinitions } from '@sim/db/schema' import { tasks } from '@trigger.dev/sdk' import { and, asc, desc, eq, inArray, isNull, sql } from 'drizzle-orm' -import { generateEmbeddings } from '@/lib/embeddings/utils' -import { env } from '@/lib/env' -import { getSlotsForFieldType, type TAG_SLOT_CONFIG } from '@/lib/knowledge/consts' +import { env } from '@/lib/core/config/env' +import { getRedisClient } from '@/lib/core/config/redis' +import { getSlotsForFieldType, type TAG_SLOT_CONFIG } from '@/lib/knowledge/constants' import { processDocument } from '@/lib/knowledge/documents/document-processor' import { DocumentProcessingQueue } from '@/lib/knowledge/documents/queue' import type { DocumentSortField, SortOrder } from '@/lib/knowledge/documents/types' +import { generateEmbeddings } from '@/lib/knowledge/embeddings' import { getNextAvailableSlot } from '@/lib/knowledge/tags/service' import { createLogger } from '@/lib/logs/console/logger' -import { getRedisClient } from '@/lib/redis' import type { DocumentProcessingPayload } from '@/background/knowledge-processing' const logger = createLogger('DocumentService') diff --git a/apps/sim/lib/embeddings/utils.ts b/apps/sim/lib/knowledge/embeddings.ts similarity index 99% rename from apps/sim/lib/embeddings/utils.ts rename to apps/sim/lib/knowledge/embeddings.ts index 76c24b117a..a867d701e4 100644 --- a/apps/sim/lib/embeddings/utils.ts +++ b/apps/sim/lib/knowledge/embeddings.ts @@ -1,4 +1,4 @@ -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { isRetryableError, retryWithExponentialBackoff } from '@/lib/knowledge/documents/utils' import { createLogger } from '@/lib/logs/console/logger' import { batchByTokenLimit, getTotalTokenCount } from '@/lib/tokenization' diff --git a/apps/sim/lib/knowledge/service.ts b/apps/sim/lib/knowledge/service.ts index 52b8585c7a..bb43dab672 100644 --- a/apps/sim/lib/knowledge/service.ts +++ b/apps/sim/lib/knowledge/service.ts @@ -8,7 +8,7 @@ import type { KnowledgeBaseWithCounts, } from '@/lib/knowledge/types' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('KnowledgeBaseService') diff --git a/apps/sim/lib/knowledge/tags/service.ts b/apps/sim/lib/knowledge/tags/service.ts index 17ce0f962a..dd9dca1941 100644 --- a/apps/sim/lib/knowledge/tags/service.ts +++ b/apps/sim/lib/knowledge/tags/service.ts @@ -6,7 +6,7 @@ import { getSlotsForFieldType, SUPPORTED_FIELD_TYPES, type TAG_SLOT_CONFIG, -} from '@/lib/knowledge/consts' +} from '@/lib/knowledge/constants' import type { BulkTagDefinitionsData, DocumentTagDefinition } from '@/lib/knowledge/tags/types' import type { CreateTagDefinitionData, diff --git a/apps/sim/lib/logs/console/logger.ts b/apps/sim/lib/logs/console/logger.ts index 0c218d2ba1..5046ae818c 100644 --- a/apps/sim/lib/logs/console/logger.ts +++ b/apps/sim/lib/logs/console/logger.ts @@ -5,7 +5,7 @@ * It is separate from the user-facing logging system in logging.ts. */ import chalk from 'chalk' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' /** * LogLevel enum defines the severity levels for logging diff --git a/apps/sim/lib/logs/execution/logger.ts b/apps/sim/lib/logs/execution/logger.ts index 3b0b978a7b..046cd77e69 100644 --- a/apps/sim/lib/logs/execution/logger.ts +++ b/apps/sim/lib/logs/execution/logger.ts @@ -12,7 +12,9 @@ import { v4 as uuidv4 } from 'uuid' import { getHighestPrioritySubscription } from '@/lib/billing/core/subscription' import { checkUsageStatus, maybeSendUsageThresholdEmail } from '@/lib/billing/core/usage' import { checkAndBillOverageThreshold } from '@/lib/billing/threshold-billing' -import { isBillingEnabled } from '@/lib/environment' +import { isBillingEnabled } from '@/lib/core/config/environment' +import { redactApiKeys } from '@/lib/core/security/redaction' +import { filterForDisplay } from '@/lib/core/utils/display-filters' import { createLogger } from '@/lib/logs/console/logger' import { emitWorkflowExecutionCompleted } from '@/lib/logs/events' import { snapshotService } from '@/lib/logs/execution/snapshot/service' @@ -26,7 +28,6 @@ import type { WorkflowExecutionSnapshot, WorkflowState, } from '@/lib/logs/types' -import { filterForDisplay, redactApiKeys } from '@/lib/utils' export interface ToolCall { name: string diff --git a/apps/sim/lib/logs/execution/logging-factory.ts b/apps/sim/lib/logs/execution/logging-factory.ts index ba208619e4..0cc5a243dd 100644 --- a/apps/sim/lib/logs/execution/logging-factory.ts +++ b/apps/sim/lib/logs/execution/logging-factory.ts @@ -1,6 +1,6 @@ import { BASE_EXECUTION_CHARGE } from '@/lib/billing/constants' import type { ExecutionEnvironment, ExecutionTrigger, WorkflowState } from '@/lib/logs/types' -import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/db-helpers' +import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/persistence/utils' export function createTriggerObject( type: ExecutionTrigger['type'], diff --git a/apps/sim/lib/logs/execution/logging-session.ts b/apps/sim/lib/logs/execution/logging-session.ts index 227e55fa5c..d19904e5da 100644 --- a/apps/sim/lib/logs/execution/logging-session.ts +++ b/apps/sim/lib/logs/execution/logging-session.ts @@ -140,7 +140,7 @@ export class LoggingSession { // Track workflow execution outcome if (traceSpans && traceSpans.length > 0) { try { - const { trackPlatformEvent } = await import('@/lib/telemetry/tracer') + const { trackPlatformEvent } = await import('@/lib/core/telemetry') // Determine status from trace spans const hasErrors = traceSpans.some((span: any) => { @@ -227,7 +227,7 @@ export class LoggingSession { // Track workflow execution error outcome try { - const { trackPlatformEvent } = await import('@/lib/telemetry/tracer') + const { trackPlatformEvent } = await import('@/lib/core/telemetry') trackPlatformEvent('platform.workflow.executed', { 'workflow.id': this.workflowId, 'execution.duration_ms': Math.max(1, durationMs), diff --git a/apps/sim/lib/mcp/middleware.ts b/apps/sim/lib/mcp/middleware.ts index 4cb109b4a9..82b0fc6e04 100644 --- a/apps/sim/lib/mcp/middleware.ts +++ b/apps/sim/lib/mcp/middleware.ts @@ -1,9 +1,9 @@ import type { NextRequest, NextResponse } from 'next/server' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { createMcpErrorResponse } from '@/lib/mcp/utils' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { generateRequestId } from '@/lib/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('McpAuthMiddleware') diff --git a/apps/sim/lib/mcp/service.ts b/apps/sim/lib/mcp/service.ts index ac741e11bc..64e9afb5d1 100644 --- a/apps/sim/lib/mcp/service.ts +++ b/apps/sim/lib/mcp/service.ts @@ -5,7 +5,8 @@ import { db } from '@sim/db' import { mcpServers } from '@sim/db/schema' import { and, eq, isNull } from 'drizzle-orm' -import { isTest } from '@/lib/environment' +import { isTest } from '@/lib/core/config/environment' +import { generateRequestId } from '@/lib/core/utils/request' import { getEffectiveDecryptedEnv } from '@/lib/environment/utils' import { createLogger } from '@/lib/logs/console/logger' import { McpClient } from '@/lib/mcp/client' @@ -18,7 +19,6 @@ import type { McpTransport, } from '@/lib/mcp/types' import { MCP_CONSTANTS } from '@/lib/mcp/utils' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('McpService') diff --git a/apps/sim/lib/email/mailer.test.ts b/apps/sim/lib/messaging/email/mailer.test.ts similarity index 98% rename from apps/sim/lib/email/mailer.test.ts rename to apps/sim/lib/messaging/email/mailer.test.ts index c9c4ca17e6..021e513e6b 100644 --- a/apps/sim/lib/email/mailer.test.ts +++ b/apps/sim/lib/messaging/email/mailer.test.ts @@ -26,12 +26,12 @@ vi.mock('@azure/communication-email', () => { } }) -vi.mock('@/lib/email/unsubscribe', () => ({ +vi.mock('@/lib/messaging/email/unsubscribe', () => ({ isUnsubscribed: vi.fn(), generateUnsubscribeToken: vi.fn(), })) -vi.mock('@/lib/env', () => ({ +vi.mock('@/lib/core/config/env', () => ({ env: { RESEND_API_KEY: 'test-api-key', AZURE_ACS_CONNECTION_STRING: 'test-azure-connection-string', @@ -41,13 +41,13 @@ vi.mock('@/lib/env', () => ({ }, })) -vi.mock('@/lib/urls/utils', () => ({ +vi.mock('@/lib/core/utils/urls', () => ({ getEmailDomain: vi.fn().mockReturnValue('sim.ai'), getBaseUrl: vi.fn().mockReturnValue('https://test.sim.ai'), })) -import { type EmailType, sendBatchEmails, sendEmail } from '@/lib/email/mailer' -import { generateUnsubscribeToken, isUnsubscribed } from '@/lib/email/unsubscribe' +import { type EmailType, sendBatchEmails, sendEmail } from '@/lib/messaging/email/mailer' +import { generateUnsubscribeToken, isUnsubscribed } from '@/lib/messaging/email/unsubscribe' describe('mailer', () => { const testEmailOptions = { diff --git a/apps/sim/lib/email/mailer.ts b/apps/sim/lib/messaging/email/mailer.ts similarity index 98% rename from apps/sim/lib/email/mailer.ts rename to apps/sim/lib/messaging/email/mailer.ts index 08f49226cc..6f3333f344 100644 --- a/apps/sim/lib/email/mailer.ts +++ b/apps/sim/lib/messaging/email/mailer.ts @@ -1,10 +1,10 @@ import { EmailClient, type EmailMessage } from '@azure/communication-email' import { Resend } from 'resend' -import { generateUnsubscribeToken, isUnsubscribed } from '@/lib/email/unsubscribe' -import { getFromEmailAddress } from '@/lib/email/utils' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' +import { generateUnsubscribeToken, isUnsubscribed } from '@/lib/messaging/email/unsubscribe' +import { getFromEmailAddress } from '@/lib/messaging/email/utils' const logger = createLogger('Mailer') diff --git a/apps/sim/lib/email/unsubscribe.test.ts b/apps/sim/lib/messaging/email/unsubscribe.test.ts similarity index 96% rename from apps/sim/lib/email/unsubscribe.test.ts rename to apps/sim/lib/messaging/email/unsubscribe.test.ts index 390c0801b3..11aba184ee 100644 --- a/apps/sim/lib/email/unsubscribe.test.ts +++ b/apps/sim/lib/messaging/email/unsubscribe.test.ts @@ -1,12 +1,12 @@ import { describe, expect, it, vi } from 'vitest' -import type { EmailType } from '@/lib/email/mailer' +import type { EmailType } from '@/lib/messaging/email/mailer' import { generateUnsubscribeToken, isTransactionalEmail, verifyUnsubscribeToken, -} from '@/lib/email/unsubscribe' +} from '@/lib/messaging/email/unsubscribe' -vi.mock('@/lib/env', () => ({ +vi.mock('@/lib/core/config/env', () => ({ env: { BETTER_AUTH_SECRET: 'test-secret-key', }, diff --git a/apps/sim/lib/email/unsubscribe.ts b/apps/sim/lib/messaging/email/unsubscribe.ts similarity index 98% rename from apps/sim/lib/email/unsubscribe.ts rename to apps/sim/lib/messaging/email/unsubscribe.ts index 837d0071da..4a522705e2 100644 --- a/apps/sim/lib/email/unsubscribe.ts +++ b/apps/sim/lib/messaging/email/unsubscribe.ts @@ -2,9 +2,9 @@ import { createHash, randomBytes } from 'crypto' import { db } from '@sim/db' import { settings, user } from '@sim/db/schema' import { eq } from 'drizzle-orm' -import type { EmailType } from '@/lib/email/mailer' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' +import type { EmailType } from '@/lib/messaging/email/mailer' const logger = createLogger('Unsubscribe') diff --git a/apps/sim/lib/email/utils.test.ts b/apps/sim/lib/messaging/email/utils.test.ts similarity index 87% rename from apps/sim/lib/email/utils.test.ts rename to apps/sim/lib/messaging/email/utils.test.ts index 4937c4227e..bbf429c5d1 100644 --- a/apps/sim/lib/email/utils.test.ts +++ b/apps/sim/lib/messaging/email/utils.test.ts @@ -1,7 +1,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' // Mock the env module -vi.mock('@/lib/env', () => ({ +vi.mock('@/lib/core/config/env', () => ({ env: { FROM_EMAIL_ADDRESS: undefined, EMAIL_DOMAIN: undefined, @@ -9,7 +9,7 @@ vi.mock('@/lib/env', () => ({ })) // Mock the getEmailDomain function -vi.mock('@/lib/urls/utils', () => ({ +vi.mock('@/lib/core/utils/urls', () => ({ getEmailDomain: vi.fn().mockReturnValue('fallback.com'), })) @@ -21,7 +21,7 @@ describe('getFromEmailAddress', () => { it('should return FROM_EMAIL_ADDRESS when set', async () => { // Mock env with FROM_EMAIL_ADDRESS - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { FROM_EMAIL_ADDRESS: 'Sim ', EMAIL_DOMAIN: 'example.com', @@ -35,7 +35,7 @@ describe('getFromEmailAddress', () => { }) it('should return simple email format when FROM_EMAIL_ADDRESS is set without display name', async () => { - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { FROM_EMAIL_ADDRESS: 'noreply@sim.ai', EMAIL_DOMAIN: 'example.com', @@ -49,7 +49,7 @@ describe('getFromEmailAddress', () => { }) it('should return Azure ACS format when FROM_EMAIL_ADDRESS is set', async () => { - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { FROM_EMAIL_ADDRESS: 'DoNotReply@customer.azurecomm.net', EMAIL_DOMAIN: 'example.com', @@ -63,7 +63,7 @@ describe('getFromEmailAddress', () => { }) it('should construct from EMAIL_DOMAIN when FROM_EMAIL_ADDRESS is not set', async () => { - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { FROM_EMAIL_ADDRESS: undefined, EMAIL_DOMAIN: 'example.com', @@ -77,7 +77,7 @@ describe('getFromEmailAddress', () => { }) it('should use getEmailDomain fallback when both FROM_EMAIL_ADDRESS and EMAIL_DOMAIN are not set', async () => { - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { FROM_EMAIL_ADDRESS: undefined, EMAIL_DOMAIN: undefined, @@ -85,7 +85,7 @@ describe('getFromEmailAddress', () => { })) const mockGetEmailDomain = vi.fn().mockReturnValue('fallback.com') - vi.doMock('@/lib/urls/utils', () => ({ + vi.doMock('@/lib/core/utils/urls', () => ({ getEmailDomain: mockGetEmailDomain, })) @@ -97,7 +97,7 @@ describe('getFromEmailAddress', () => { }) it('should prioritize FROM_EMAIL_ADDRESS over EMAIL_DOMAIN when both are set', async () => { - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { FROM_EMAIL_ADDRESS: 'Custom ', EMAIL_DOMAIN: 'ignored.com', @@ -111,7 +111,7 @@ describe('getFromEmailAddress', () => { }) it('should handle empty string FROM_EMAIL_ADDRESS by falling back to EMAIL_DOMAIN', async () => { - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { FROM_EMAIL_ADDRESS: '', EMAIL_DOMAIN: 'fallback.com', @@ -125,7 +125,7 @@ describe('getFromEmailAddress', () => { }) it('should handle whitespace-only FROM_EMAIL_ADDRESS by falling back to EMAIL_DOMAIN', async () => { - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { FROM_EMAIL_ADDRESS: ' ', EMAIL_DOMAIN: 'fallback.com', diff --git a/apps/sim/lib/email/utils.ts b/apps/sim/lib/messaging/email/utils.ts similarity index 76% rename from apps/sim/lib/email/utils.ts rename to apps/sim/lib/messaging/email/utils.ts index 27f19c4928..4b342c5d49 100644 --- a/apps/sim/lib/email/utils.ts +++ b/apps/sim/lib/messaging/email/utils.ts @@ -1,5 +1,5 @@ -import { env } from '@/lib/env' -import { getEmailDomain } from '@/lib/urls/utils' +import { env } from '@/lib/core/config/env' +import { getEmailDomain } from '@/lib/core/utils/urls' /** * Get the from email address, preferring FROM_EMAIL_ADDRESS over EMAIL_DOMAIN diff --git a/apps/sim/lib/email/validation.test.ts b/apps/sim/lib/messaging/email/validation.test.ts similarity index 97% rename from apps/sim/lib/email/validation.test.ts rename to apps/sim/lib/messaging/email/validation.test.ts index 50d97a0c67..d8b9e7b340 100644 --- a/apps/sim/lib/email/validation.test.ts +++ b/apps/sim/lib/messaging/email/validation.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest' -import { quickValidateEmail, validateEmail } from '@/lib/email/validation' +import { quickValidateEmail, validateEmail } from '@/lib/messaging/email/validation' describe('Email Validation', () => { describe('validateEmail', () => { diff --git a/apps/sim/lib/email/validation.ts b/apps/sim/lib/messaging/email/validation.ts similarity index 100% rename from apps/sim/lib/email/validation.ts rename to apps/sim/lib/messaging/email/validation.ts diff --git a/apps/sim/lib/sms/service.ts b/apps/sim/lib/messaging/sms/service.ts similarity index 99% rename from apps/sim/lib/sms/service.ts rename to apps/sim/lib/messaging/sms/service.ts index 6e410cc55c..3900b8e992 100644 --- a/apps/sim/lib/sms/service.ts +++ b/apps/sim/lib/messaging/sms/service.ts @@ -1,5 +1,5 @@ import { Twilio } from 'twilio' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('SMSService') diff --git a/apps/sim/lib/oauth/oauth.test.ts b/apps/sim/lib/oauth/oauth.test.ts index 9e23ec15b1..4acee4d348 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('@/lib/env', () => ({ +vi.mock('@/lib/core/config/env', () => ({ env: { GOOGLE_CLIENT_ID: 'google_client_id', GOOGLE_CLIENT_SECRET: 'google_client_secret', diff --git a/apps/sim/lib/oauth/oauth.ts b/apps/sim/lib/oauth/oauth.ts index ed51f34433..69d65ffc88 100644 --- a/apps/sim/lib/oauth/oauth.ts +++ b/apps/sim/lib/oauth/oauth.ts @@ -34,7 +34,7 @@ import { WebflowIcon, xIcon, } from '@/components/icons' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('OAuth') diff --git a/apps/sim/lib/organization/utils.ts b/apps/sim/lib/organization/utils.ts deleted file mode 100644 index 446d7f5ffa..0000000000 --- a/apps/sim/lib/organization/utils.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { quickValidateEmail } from '@/lib/email/validation' -import type { Organization } from '@/lib/organization/types' - -/** - * Calculate seat usage for an organization - */ -export function calculateSeatUsage(org?: Organization | null) { - const members = org?.members?.length ?? 0 - const pending = org?.invitations?.filter((inv) => inv.status === 'pending').length ?? 0 - return { used: members + pending, members, pending } -} - -/** - * Generate a URL-friendly slug from a name - */ -export function generateSlug(name: string): string { - return name - .toLowerCase() - .replace(/[^a-z0-9]/g, '-') // Replace non-alphanumeric with hyphens - .replace(/-+/g, '-') // Replace consecutive hyphens with single hyphen - .replace(/^-|-$/g, '') // Remove leading and trailing hyphens -} - -/** - * Validate organization slug format - */ -export function validateSlug(slug: string): boolean { - const slugRegex = /^[a-z0-9-_]+$/ - return slugRegex.test(slug) -} - -/** - * Validate email format - */ -export function validateEmail(email: string): boolean { - return quickValidateEmail(email.trim().toLowerCase()).isValid -} diff --git a/apps/sim/lib/sim-agent/index.ts b/apps/sim/lib/sim-agent/index.ts deleted file mode 100644 index f2fe623f02..0000000000 --- a/apps/sim/lib/sim-agent/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -// Export the main client and types - -export type { SimAgentRequest, SimAgentResponse } from './client' -export { SimAgentClient, simAgentClient } from './client' -export { SIM_AGENT_API_URL_DEFAULT, SIM_AGENT_VERSION } from './constants' - -// Import for default export -import { simAgentClient } from './client' - -// Re-export for convenience -export default simAgentClient diff --git a/apps/sim/lib/uploads/config.ts b/apps/sim/lib/uploads/config.ts index 0de71198f5..09759bc4c4 100644 --- a/apps/sim/lib/uploads/config.ts +++ b/apps/sim/lib/uploads/config.ts @@ -1,4 +1,4 @@ -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import type { StorageConfig, StorageContext } from '@/lib/uploads/shared/types' export type { StorageConfig, StorageContext } from '@/lib/uploads/shared/types' diff --git a/apps/sim/lib/uploads/contexts/execution/execution-file-manager.ts b/apps/sim/lib/uploads/contexts/execution/execution-file-manager.ts index 0eb6419510..52c2d457cf 100644 --- a/apps/sim/lib/uploads/contexts/execution/execution-file-manager.ts +++ b/apps/sim/lib/uploads/contexts/execution/execution-file-manager.ts @@ -1,10 +1,7 @@ +import { isUserFile } from '@/lib/core/utils/display-filters' import { createLogger } from '@/lib/logs/console/logger' -import type { ExecutionContext } from '@/lib/uploads/contexts/execution/execution-file-helpers' -import { - generateExecutionFileKey, - generateFileId, -} from '@/lib/uploads/contexts/execution/execution-file-helpers' -import { isUserFile } from '@/lib/utils' +import type { ExecutionContext } from '@/lib/uploads/contexts/execution/utils' +import { generateExecutionFileKey, generateFileId } from '@/lib/uploads/contexts/execution/utils' import type { UserFile } from '@/executor/types' const logger = createLogger('ExecutionFileStorage') diff --git a/apps/sim/lib/uploads/contexts/execution/index.ts b/apps/sim/lib/uploads/contexts/execution/index.ts index 5cfea0f0fb..20b2c1b79b 100644 --- a/apps/sim/lib/uploads/contexts/execution/index.ts +++ b/apps/sim/lib/uploads/contexts/execution/index.ts @@ -1,2 +1,2 @@ -export * from './execution-file-helpers' export * from './execution-file-manager' +export * from './utils' diff --git a/apps/sim/lib/uploads/contexts/execution/execution-file-helpers.ts b/apps/sim/lib/uploads/contexts/execution/utils.ts similarity index 100% rename from apps/sim/lib/uploads/contexts/execution/execution-file-helpers.ts rename to apps/sim/lib/uploads/contexts/execution/utils.ts diff --git a/apps/sim/lib/uploads/core/setup.server.ts b/apps/sim/lib/uploads/core/setup.server.ts index 36b1a12206..7f144cfc33 100644 --- a/apps/sim/lib/uploads/core/setup.server.ts +++ b/apps/sim/lib/uploads/core/setup.server.ts @@ -1,7 +1,7 @@ import { existsSync } from 'fs' import { mkdir } from 'fs/promises' import path, { join } from 'path' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' import { getStorageProvider, USE_BLOB_STORAGE, USE_S3_STORAGE } from '@/lib/uploads/config' diff --git a/apps/sim/lib/uploads/core/storage-service.ts b/apps/sim/lib/uploads/core/storage-service.ts index 3db903ff5c..aaa9dca6af 100644 --- a/apps/sim/lib/uploads/core/storage-service.ts +++ b/apps/sim/lib/uploads/core/storage-service.ts @@ -444,7 +444,7 @@ export async function generatePresignedDownloadUrl( return getPresignedUrlWithConfig(key, createBlobConfig(config), expirationSeconds) } - const { getBaseUrl } = await import('@/lib/urls/utils') + const { getBaseUrl } = await import('@/lib/core/utils/urls') const baseUrl = getBaseUrl() return `${baseUrl}/api/files/serve/${encodeURIComponent(key)}` } diff --git a/apps/sim/lib/uploads/providers/blob/client.test.ts b/apps/sim/lib/uploads/providers/blob/client.test.ts index 01c5ecd73d..b90b4d5822 100644 --- a/apps/sim/lib/uploads/providers/blob/client.test.ts +++ b/apps/sim/lib/uploads/providers/blob/client.test.ts @@ -54,7 +54,7 @@ describe('Azure Blob Storage Client', () => { toString: () => 'sv=2021-06-08&se=2023-01-01T00%3A00%3A00Z&sr=b&sp=r&sig=test', }) - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { AZURE_ACCOUNT_NAME: 'testaccount', AZURE_ACCOUNT_KEY: 'testkey', diff --git a/apps/sim/lib/uploads/providers/s3/client.test.ts b/apps/sim/lib/uploads/providers/s3/client.test.ts index aefd7ea42a..881481b1be 100644 --- a/apps/sim/lib/uploads/providers/s3/client.test.ts +++ b/apps/sim/lib/uploads/providers/s3/client.test.ts @@ -31,7 +31,7 @@ describe('S3 Client', () => { getSignedUrl: mockGetSignedUrl, })) - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { S3_BUCKET_NAME: 'test-bucket', AWS_REGION: 'test-region', @@ -298,7 +298,7 @@ describe('S3 Client', () => { describe('s3Client initialization', () => { it('should initialize with correct configuration when credentials are available', async () => { - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { S3_BUCKET_NAME: 'test-bucket', AWS_REGION: 'test-region', @@ -331,7 +331,7 @@ describe('S3 Client', () => { }) it('should initialize without credentials when env vars are not available', async () => { - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { S3_BUCKET_NAME: 'test-bucket', AWS_REGION: 'test-region', diff --git a/apps/sim/lib/uploads/providers/s3/client.ts b/apps/sim/lib/uploads/providers/s3/client.ts index e866d899c0..800477b1a9 100644 --- a/apps/sim/lib/uploads/providers/s3/client.ts +++ b/apps/sim/lib/uploads/providers/s3/client.ts @@ -9,7 +9,7 @@ import { UploadPartCommand, } from '@aws-sdk/client-s3' import { getSignedUrl } from '@aws-sdk/s3-request-presigner' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { S3_CONFIG, S3_KB_CONFIG } from '@/lib/uploads/config' import type { S3Config, diff --git a/apps/sim/lib/uploads/utils/file-utils.server.ts b/apps/sim/lib/uploads/utils/file-utils.server.ts index ebd651197e..f021e07b21 100644 --- a/apps/sim/lib/uploads/utils/file-utils.server.ts +++ b/apps/sim/lib/uploads/utils/file-utils.server.ts @@ -2,7 +2,7 @@ import type { Logger } from '@/lib/logs/console/logger' import type { StorageContext } from '@/lib/uploads' -import { isExecutionFile } from '@/lib/uploads/contexts/execution/execution-file-helpers' +import { isExecutionFile } from '@/lib/uploads/contexts/execution/utils' import { inferContextFromKey } from '@/lib/uploads/utils/file-utils' import type { UserFile } from '@/executor/types' diff --git a/apps/sim/lib/utils.ts b/apps/sim/lib/utils.ts deleted file mode 100644 index 17ed8c30d3..0000000000 --- a/apps/sim/lib/utils.ts +++ /dev/null @@ -1,608 +0,0 @@ -import { createCipheriv, createDecipheriv, randomBytes } from 'crypto' -import { type ClassValue, clsx } from 'clsx' -import { twMerge } from 'tailwind-merge' -import { env } from '@/lib/env' -import { createLogger } from '@/lib/logs/console/logger' - -const logger = createLogger('Utils') - -export function cn(...inputs: ClassValue[]) { - return twMerge(clsx(inputs)) -} - -function getEncryptionKey(): Buffer { - const key = env.ENCRYPTION_KEY - if (!key || key.length !== 64) { - throw new Error('ENCRYPTION_KEY must be set to a 64-character hex string (32 bytes)') - } - return Buffer.from(key, 'hex') -} - -/** - * Encrypts a secret using AES-256-GCM - * @param secret - The secret to encrypt - * @returns A promise that resolves to an object containing the encrypted secret and IV - */ -export async function encryptSecret(secret: string): Promise<{ encrypted: string; iv: string }> { - const iv = randomBytes(16) - const key = getEncryptionKey() - - const cipher = createCipheriv('aes-256-gcm', key, iv) - let encrypted = cipher.update(secret, 'utf8', 'hex') - encrypted += cipher.final('hex') - - const authTag = cipher.getAuthTag() - - // Format: iv:encrypted:authTag - return { - encrypted: `${iv.toString('hex')}:${encrypted}:${authTag.toString('hex')}`, - iv: iv.toString('hex'), - } -} - -/** - * Decrypts an encrypted secret - * @param encryptedValue - The encrypted value in format "iv:encrypted:authTag" - * @returns A promise that resolves to an object containing the decrypted secret - */ -export async function decryptSecret(encryptedValue: string): Promise<{ decrypted: string }> { - const parts = encryptedValue.split(':') - const ivHex = parts[0] - const authTagHex = parts[parts.length - 1] - const encrypted = parts.slice(1, -1).join(':') - - if (!ivHex || !encrypted || !authTagHex) { - throw new Error('Invalid encrypted value format. Expected "iv:encrypted:authTag"') - } - - const key = getEncryptionKey() - const iv = Buffer.from(ivHex, 'hex') - const authTag = Buffer.from(authTagHex, 'hex') - - try { - const decipher = createDecipheriv('aes-256-gcm', key, iv) - decipher.setAuthTag(authTag) - - let decrypted = decipher.update(encrypted, 'hex', 'utf8') - decrypted += decipher.final('utf8') - - return { decrypted } - } catch (error: any) { - logger.error('Decryption error:', { error: error.message }) - throw error - } -} - -export function convertScheduleOptionsToCron( - scheduleType: string, - options: Record -): string { - switch (scheduleType) { - case 'minutes': { - const interval = options.minutesInterval || '15' - // For example, if options.minutesStartingAt is provided, use that as the start minute. - return `*/${interval} * * * *` - } - case 'hourly': { - // When scheduling hourly, take the specified minute offset - return `${options.hourlyMinute || '00'} * * * *` - } - case 'daily': { - // Expected dailyTime in HH:MM - const [minute, hour] = (options.dailyTime || '00:09').split(':') - return `${minute || '00'} ${hour || '09'} * * *` - } - case 'weekly': { - // Expected weeklyDay as MON, TUE, etc. and weeklyDayTime in HH:MM - const dayMap: Record = { - MON: 1, - TUE: 2, - WED: 3, - THU: 4, - FRI: 5, - SAT: 6, - SUN: 0, - } - const day = dayMap[options.weeklyDay || 'MON'] - const [minute, hour] = (options.weeklyDayTime || '00:09').split(':') - return `${minute || '00'} ${hour || '09'} * * ${day}` - } - case 'monthly': { - // Expected monthlyDay and monthlyTime in HH:MM - const day = options.monthlyDay || '1' - const [minute, hour] = (options.monthlyTime || '00:09').split(':') - return `${minute || '00'} ${hour || '09'} ${day} * *` - } - case 'custom': { - // Use the provided cron expression directly - return options.cronExpression - } - default: - throw new Error('Unsupported schedule type') - } -} - -/** - * Get a user-friendly timezone abbreviation - * @param timezone - IANA timezone string - * @param date - Date to check for DST - * @returns A simplified timezone string (e.g., "PST" instead of "America/Los_Angeles") - */ -export function getTimezoneAbbreviation(timezone: string, date: Date = new Date()): string { - if (timezone === 'UTC') return 'UTC' - - // Common timezone mappings - const timezoneMap: Record = { - 'America/Los_Angeles': { standard: 'PST', daylight: 'PDT' }, - 'America/Denver': { standard: 'MST', daylight: 'MDT' }, - 'America/Chicago': { standard: 'CST', daylight: 'CDT' }, - 'America/New_York': { standard: 'EST', daylight: 'EDT' }, - 'Europe/London': { standard: 'GMT', daylight: 'BST' }, - 'Europe/Paris': { standard: 'CET', daylight: 'CEST' }, - 'Asia/Tokyo': { standard: 'JST', daylight: 'JST' }, // Japan doesn't use DST - 'Australia/Sydney': { standard: 'AEST', daylight: 'AEDT' }, - 'Asia/Singapore': { standard: 'SGT', daylight: 'SGT' }, // Singapore doesn't use DST - } - - // If we have a mapping for this timezone - if (timezone in timezoneMap) { - // January 1 is guaranteed to be standard time in northern hemisphere - // July 1 is guaranteed to be daylight time in northern hemisphere (if observed) - const januaryDate = new Date(date.getFullYear(), 0, 1) - const julyDate = new Date(date.getFullYear(), 6, 1) - - // Get offset in January (standard time) - const januaryFormatter = new Intl.DateTimeFormat('en-US', { - timeZone: timezone, - timeZoneName: 'short', - }) - - // Get offset in July (likely daylight time) - const julyFormatter = new Intl.DateTimeFormat('en-US', { - timeZone: timezone, - timeZoneName: 'short', - }) - - // If offsets are different, timezone observes DST - const isDSTObserved = januaryFormatter.format(januaryDate) !== julyFormatter.format(julyDate) - - // If DST is observed, check if current date is in DST by comparing its offset - // with January's offset (standard time) - if (isDSTObserved) { - const currentFormatter = new Intl.DateTimeFormat('en-US', { - timeZone: timezone, - timeZoneName: 'short', - }) - - const isDST = currentFormatter.format(date) !== januaryFormatter.format(januaryDate) - return isDST ? timezoneMap[timezone].daylight : timezoneMap[timezone].standard - } - - // If DST is not observed, always use standard - return timezoneMap[timezone].standard - } - - // For unknown timezones, use full IANA name - return timezone -} - -/** - * Format a date into a human-readable format - * @param date - The date to format - * @param timezone - Optional IANA timezone string (e.g., 'America/Los_Angeles', 'UTC') - * @returns A formatted date string in the format "MMM D, YYYY h:mm A" - */ -export function formatDateTime(date: Date, timezone?: string): string { - const formattedDate = date.toLocaleString('en-US', { - month: 'short', - day: 'numeric', - year: 'numeric', - hour: 'numeric', - minute: '2-digit', - hour12: true, - timeZone: timezone || undefined, - }) - - // If timezone is provided, add a friendly timezone abbreviation - if (timezone) { - const tzAbbr = getTimezoneAbbreviation(timezone, date) - return `${formattedDate} ${tzAbbr}` - } - - return formattedDate -} - -/** - * Format a date into a short format - * @param date - The date to format - * @returns A formatted date string in the format "MMM D, YYYY" - */ -export function formatDate(date: Date): string { - return date.toLocaleString('en-US', { - month: 'short', - day: 'numeric', - year: 'numeric', - }) -} - -/** - * Format a time into a short format - * @param date - The date to format - * @returns A formatted time string in the format "h:mm A" - */ -export function formatTime(date: Date): string { - return date.toLocaleString('en-US', { - hour: 'numeric', - minute: '2-digit', - hour12: true, - }) -} - -/** - * Format a duration in milliseconds to a human-readable format - * @param durationMs - The duration in milliseconds - * @returns A formatted duration string - */ -export function formatDuration(durationMs: number): string { - if (durationMs < 1000) { - return `${durationMs}ms` - } - - const seconds = Math.floor(durationMs / 1000) - if (seconds < 60) { - return `${seconds}s` - } - - const minutes = Math.floor(seconds / 60) - const remainingSeconds = seconds % 60 - if (minutes < 60) { - return `${minutes}m ${remainingSeconds}s` - } - - const hours = Math.floor(minutes / 60) - const remainingMinutes = minutes % 60 - return `${hours}h ${remainingMinutes}m` -} - -/** - * Generates a secure random password - * @param length - The length of the password (default: 24) - * @returns A new secure password string - */ -export function generatePassword(length = 24): string { - const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_-+=' - let result = '' - - for (let i = 0; i < length; i++) { - result += chars.charAt(Math.floor(Math.random() * chars.length)) - } - - return result -} - -/** - * Rotates through available API keys for a provider - * @param provider - The provider to get a key for (e.g., 'openai') - * @returns The selected API key - * @throws Error if no API keys are configured for rotation - */ -export function getRotatingApiKey(provider: string): string { - if (provider !== 'openai' && provider !== 'anthropic' && provider !== 'gemini') { - throw new Error(`No rotation implemented for provider: ${provider}`) - } - - const keys = [] - - if (provider === 'openai') { - if (env.OPENAI_API_KEY_1) keys.push(env.OPENAI_API_KEY_1) - if (env.OPENAI_API_KEY_2) keys.push(env.OPENAI_API_KEY_2) - if (env.OPENAI_API_KEY_3) keys.push(env.OPENAI_API_KEY_3) - } else if (provider === 'anthropic') { - if (env.ANTHROPIC_API_KEY_1) keys.push(env.ANTHROPIC_API_KEY_1) - if (env.ANTHROPIC_API_KEY_2) keys.push(env.ANTHROPIC_API_KEY_2) - if (env.ANTHROPIC_API_KEY_3) keys.push(env.ANTHROPIC_API_KEY_3) - } else if (provider === 'gemini') { - if (env.GEMINI_API_KEY_1) keys.push(env.GEMINI_API_KEY_1) - if (env.GEMINI_API_KEY_2) keys.push(env.GEMINI_API_KEY_2) - if (env.GEMINI_API_KEY_3) keys.push(env.GEMINI_API_KEY_3) - } - - if (keys.length === 0) { - throw new Error( - `No API keys configured for rotation. Please configure ${provider.toUpperCase()}_API_KEY_1, ${provider.toUpperCase()}_API_KEY_2, or ${provider.toUpperCase()}_API_KEY_3.` - ) - } - - // Simple round-robin rotation based on current minute - // This distributes load across keys and is stateless - const currentMinute = new Date().getMinutes() - const keyIndex = currentMinute % keys.length - - return keys[keyIndex] -} - -/** - * Recursively redacts API keys in an object - * @param obj The object to redact API keys from - * @returns A new object with API keys redacted - */ -export const redactApiKeys = (obj: any): any => { - if (!obj || typeof obj !== 'object') { - return obj - } - - if (Array.isArray(obj)) { - return obj.map(redactApiKeys) - } - - const result: Record = {} - - for (const [key, value] of Object.entries(obj)) { - if ( - key.toLowerCase() === 'apikey' || - key.toLowerCase() === 'api_key' || - key.toLowerCase() === 'access_token' || - /\bsecret\b/i.test(key.toLowerCase()) || - /\bpassword\b/i.test(key.toLowerCase()) - ) { - result[key] = '***REDACTED***' - } else if (typeof value === 'object' && value !== null) { - result[key] = redactApiKeys(value) - } else { - result[key] = value - } - } - - return result -} - -/** - * Type guard to check if an object is a UserFile - */ -export function isUserFile(candidate: unknown): candidate is { - id: string - name: string - url: string - key: string - size: number - type: string - context?: string -} { - if (!candidate || typeof candidate !== 'object') { - return false - } - - const value = candidate as Record - return ( - typeof value.id === 'string' && - typeof value.key === 'string' && - typeof value.url === 'string' && - typeof value.name === 'string' - ) -} - -/** - * Filter function that transforms UserFile objects for display - * Removes internal fields: key, context - * Keeps user-friendly fields: id, name, url, size, type - */ -function filterUserFile(data: any): any { - if (isUserFile(data)) { - const { id, name, url, size, type } = data - return { id, name, url, size, type } - } - return data -} - -/** - * Registry of filter functions to apply to data for cleaner display in logs/console. - * Add new filter functions here to handle additional data types. - */ -const DISPLAY_FILTERS = [ - filterUserFile, - // Add more filters here as needed -] - -/** - * Generic helper to filter internal/technical fields from data for cleaner display in logs and console. - * Applies all registered filters recursively to the data structure. - * - * To add a new filter: - * 1. Create a filter function that checks and transforms a specific data type - * 2. Add it to the DISPLAY_FILTERS array above - * - * @param data - Data to filter (objects, arrays, primitives) - * @returns Filtered data with internal fields removed - */ -export function filterForDisplay(data: any): any { - if (!data || typeof data !== 'object') { - return data - } - - // Apply all registered filters - const filtered = data - for (const filterFn of DISPLAY_FILTERS) { - const result = filterFn(filtered) - if (result !== filtered) { - // Filter matched and transformed the data - return result - } - } - - // No filters matched - recursively filter nested structures - if (Array.isArray(filtered)) { - return filtered.map(filterForDisplay) - } - - // Recursively filter object properties - const result: any = {} - for (const [key, value] of Object.entries(filtered)) { - result[key] = filterForDisplay(value) - } - return result -} - -/** - * Validates a name by removing any characters that could cause issues - * with variable references or node naming. - * - * @param name - The name to validate - * @returns The validated name with invalid characters removed, trimmed, and collapsed whitespace - */ -export function validateName(name: string): string { - return name - .replace(/[^a-zA-Z0-9_\s]/g, '') // Remove invalid characters - .replace(/\s+/g, ' ') // Collapse multiple spaces into single spaces -} - -/** - * Checks if a name contains invalid characters - * - * @param name - The name to check - * @returns True if the name is valid, false otherwise - */ -export function isValidName(name: string): boolean { - return /^[a-zA-Z0-9_\s]*$/.test(name) -} - -export const SSE_HEADERS = { - 'Content-Type': 'text/event-stream', - 'Cache-Control': 'no-cache', - Connection: 'keep-alive', - 'X-Accel-Buffering': 'no', -} as const - -/** - * Encodes data as a Server-Sent Events (SSE) message. - * Formats the data as a JSON string prefixed with "data:" and suffixed with two newlines, - * then encodes it as a Uint8Array for streaming. - * - * @param data - The data to encode and send via SSE - * @returns The encoded SSE message as a Uint8Array - */ -export function encodeSSE(data: any): Uint8Array { - return new TextEncoder().encode(`data: ${JSON.stringify(data)}\n\n`) -} - -/** - * Gets a list of invalid characters in a name - * - * @param name - The name to check - * @returns Array of invalid characters found - */ -export function getInvalidCharacters(name: string): string[] { - const invalidChars = name.match(/[^a-zA-Z0-9_\s]/g) - return invalidChars ? [...new Set(invalidChars)] : [] -} - -/** - * Generate a short request ID for correlation - */ -export function generateRequestId(): string { - return crypto.randomUUID().slice(0, 8) -} - -/** - * No-operation function for use as default callback - */ -export const noop = () => {} - -/** - * Options for performing an optimistic update with automatic rollback on error - */ -export interface OptimisticUpdateOptions { - /** - * Function that returns the current state value (for rollback purposes) - */ - getCurrentState: () => T - /** - * Function that performs the optimistic update to the UI state - */ - optimisticUpdate: () => void - /** - * Async function that performs the actual API call - */ - apiCall: () => Promise - /** - * Function that rolls back the state to the original value - * @param originalValue - The value returned by getCurrentState before the update - */ - rollback: (originalValue: T) => void - /** - * Optional error message to log if the operation fails - */ - errorMessage?: string - /** - * Optional callback to execute on error (e.g., show toast notification) - */ - onError?: (error: Error, originalValue: T) => void - /** - * Optional callback that always runs regardless of success or error (e.g., to clear loading states) - */ - onComplete?: () => void -} - -/** - * Performs an optimistic update with automatic rollback on error. - * This utility standardizes the pattern of: - * 1. Save current state - * 2. Update UI optimistically - * 3. Make API call - * 4. Rollback on error - * - * @example - * ```typescript - * await withOptimisticUpdate({ - * getCurrentState: () => get().folders[id], - * optimisticUpdate: () => set(state => ({ - * folders: { ...state.folders, [id]: { ...folder, name: newName } } - * })), - * apiCall: async () => { - * await fetch(`/api/folders/${id}`, { - * method: 'PUT', - * body: JSON.stringify({ name: newName }) - * }) - * }, - * rollback: (originalFolder) => set(state => ({ - * folders: { ...state.folders, [id]: originalFolder } - * })), - * errorMessage: 'Failed to rename folder', - * onError: (error) => toast.error('Could not rename folder') - * }) - * ``` - */ -export async function withOptimisticUpdate(options: OptimisticUpdateOptions): Promise { - const { - getCurrentState, - optimisticUpdate, - apiCall, - rollback, - errorMessage, - onError, - onComplete, - } = options - - const originalValue = getCurrentState() - - optimisticUpdate() - - try { - await apiCall() - } catch (error) { - rollback(originalValue) - - if (errorMessage) { - logger.error(errorMessage, { error }) - } - - if (onError && error instanceof Error) { - onError(error, originalValue) - } - - throw error - } finally { - if (onComplete) { - onComplete() - } - } -} diff --git a/apps/sim/lib/webhooks/gmail-polling-service.ts b/apps/sim/lib/webhooks/gmail-polling-service.ts index b3d7f134e0..efbe26115a 100644 --- a/apps/sim/lib/webhooks/gmail-polling-service.ts +++ b/apps/sim/lib/webhooks/gmail-polling-service.ts @@ -2,9 +2,9 @@ import { db } from '@sim/db' import { account, webhook } from '@sim/db/schema' import { and, eq, sql } from 'drizzle-orm' import { nanoid } from 'nanoid' -import { pollingIdempotency } from '@/lib/idempotency/service' +import { pollingIdempotency } from '@/lib/core/idempotency/service' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' import { getOAuthToken, refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' import type { GmailAttachment } from '@/tools/gmail/types' import { downloadAttachments, extractAttachmentInfo } from '@/tools/gmail/utils' diff --git a/apps/sim/lib/webhooks/outlook-polling-service.ts b/apps/sim/lib/webhooks/outlook-polling-service.ts index 9ffdc06b5d..c679562f96 100644 --- a/apps/sim/lib/webhooks/outlook-polling-service.ts +++ b/apps/sim/lib/webhooks/outlook-polling-service.ts @@ -3,9 +3,9 @@ import { account, webhook } from '@sim/db/schema' import { and, eq, sql } from 'drizzle-orm' import { htmlToText } from 'html-to-text' import { nanoid } from 'nanoid' -import { pollingIdempotency } from '@/lib/idempotency' +import { pollingIdempotency } from '@/lib/core/idempotency' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' import { getOAuthToken, refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' const logger = createLogger('OutlookPollingService') diff --git a/apps/sim/lib/webhooks/processor.ts b/apps/sim/lib/webhooks/processor.ts index e961247cb4..6b762821b4 100644 --- a/apps/sim/lib/webhooks/processor.ts +++ b/apps/sim/lib/webhooks/processor.ts @@ -3,7 +3,7 @@ import { tasks } from '@trigger.dev/sdk' import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { v4 as uuidv4 } from 'uuid' -import { env, isTruthy } from '@/lib/env' +import { env, isTruthy } from '@/lib/core/config/env' import { preprocessExecution } from '@/lib/execution/preprocessing' import { createLogger } from '@/lib/logs/console/logger' import { convertSquareBracketsToTwiML } from '@/lib/webhooks/utils' diff --git a/apps/sim/lib/webhooks/webhook-helpers.ts b/apps/sim/lib/webhooks/provider-subscriptions.ts similarity index 99% rename from apps/sim/lib/webhooks/webhook-helpers.ts rename to apps/sim/lib/webhooks/provider-subscriptions.ts index eb5edee768..087d9e7975 100644 --- a/apps/sim/lib/webhooks/webhook-helpers.ts +++ b/apps/sim/lib/webhooks/provider-subscriptions.ts @@ -1,6 +1,6 @@ import type { NextRequest } from 'next/server' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' import { getOAuthToken, refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' const teamsLogger = createLogger('TeamsSubscription') diff --git a/apps/sim/lib/webhooks/test-tokens.ts b/apps/sim/lib/webhooks/test-tokens.ts index a11ccbf31e..26495bde1e 100644 --- a/apps/sim/lib/webhooks/test-tokens.ts +++ b/apps/sim/lib/webhooks/test-tokens.ts @@ -1,5 +1,5 @@ import { jwtVerify, SignJWT } from 'jose' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' type TestTokenPayload = { typ: 'webhook_test' diff --git a/apps/sim/lib/workflows/autolayout/constants.ts b/apps/sim/lib/workflows/autolayout/constants.ts index a97051287b..0d92258975 100644 --- a/apps/sim/lib/workflows/autolayout/constants.ts +++ b/apps/sim/lib/workflows/autolayout/constants.ts @@ -2,11 +2,11 @@ * Autolayout Constants * * Layout algorithm specific constants for spacing, padding, and overlap detection. - * Block dimensions are imported from the shared source: @/lib/blocks/block-dimensions + * Block dimensions are imported from the shared source: @/lib/workflows/blocks/block-dimensions */ // Re-export block dimensions for autolayout consumers -export { BLOCK_DIMENSIONS, CONTAINER_DIMENSIONS } from '@/lib/blocks/block-dimensions' +export { BLOCK_DIMENSIONS, CONTAINER_DIMENSIONS } from '@/lib/workflows/blocks/block-dimensions' /** * Horizontal spacing between layers (columns) diff --git a/apps/sim/lib/workflows/autolayout/containers.ts b/apps/sim/lib/workflows/autolayout/containers.ts index 311b436211..53cfd0c0bc 100644 --- a/apps/sim/lib/workflows/autolayout/containers.ts +++ b/apps/sim/lib/workflows/autolayout/containers.ts @@ -1,4 +1,3 @@ -import { CONTAINER_DIMENSIONS } from '@/lib/blocks/block-dimensions' import { createLogger } from '@/lib/logs/console/logger' import { CONTAINER_PADDING_X, @@ -8,6 +7,7 @@ import { import { layoutBlocksCore } from '@/lib/workflows/autolayout/core' import type { Edge, LayoutOptions } from '@/lib/workflows/autolayout/types' import { filterLayoutEligibleBlockIds, getBlocksByParent } from '@/lib/workflows/autolayout/utils' +import { CONTAINER_DIMENSIONS } from '@/lib/workflows/blocks/block-dimensions' import type { BlockState } from '@/stores/workflows/workflow/types' const logger = createLogger('AutoLayout:Containers') diff --git a/apps/sim/lib/workflows/autolayout/targeted.ts b/apps/sim/lib/workflows/autolayout/targeted.ts index d9b7f977da..f53e7df7a0 100644 --- a/apps/sim/lib/workflows/autolayout/targeted.ts +++ b/apps/sim/lib/workflows/autolayout/targeted.ts @@ -1,4 +1,3 @@ -import { CONTAINER_DIMENSIONS } from '@/lib/blocks/block-dimensions' import { createLogger } from '@/lib/logs/console/logger' import { CONTAINER_PADDING, @@ -14,6 +13,7 @@ import { isContainerType, shouldSkipAutoLayout, } from '@/lib/workflows/autolayout/utils' +import { CONTAINER_DIMENSIONS } from '@/lib/workflows/blocks/block-dimensions' import type { BlockState } from '@/stores/workflows/workflow/types' const logger = createLogger('AutoLayout:Targeted') diff --git a/apps/sim/lib/workflows/autolayout/utils.ts b/apps/sim/lib/workflows/autolayout/utils.ts index 52b6f3b712..32f1d3b161 100644 --- a/apps/sim/lib/workflows/autolayout/utils.ts +++ b/apps/sim/lib/workflows/autolayout/utils.ts @@ -1,4 +1,3 @@ -import { BLOCK_DIMENSIONS, CONTAINER_DIMENSIONS } from '@/lib/blocks/block-dimensions' import { AUTO_LAYOUT_EXCLUDED_TYPES, CONTAINER_BLOCK_TYPES, @@ -9,6 +8,7 @@ import { ROOT_PADDING_Y, } from '@/lib/workflows/autolayout/constants' import type { BlockMetrics, BoundingBox, GraphNode } from '@/lib/workflows/autolayout/types' +import { BLOCK_DIMENSIONS, CONTAINER_DIMENSIONS } from '@/lib/workflows/blocks/block-dimensions' import type { BlockState } from '@/stores/workflows/workflow/types' // Re-export layout constants for backwards compatibility diff --git a/apps/sim/lib/blocks/block-dimensions.ts b/apps/sim/lib/workflows/blocks/block-dimensions.ts similarity index 100% rename from apps/sim/lib/blocks/block-dimensions.ts rename to apps/sim/lib/workflows/blocks/block-dimensions.ts diff --git a/apps/sim/lib/workflows/block-outputs.ts b/apps/sim/lib/workflows/blocks/block-outputs.ts similarity index 98% rename from apps/sim/lib/workflows/block-outputs.ts rename to apps/sim/lib/workflows/blocks/block-outputs.ts index 3027e113ff..789ad7410f 100644 --- a/apps/sim/lib/workflows/block-outputs.ts +++ b/apps/sim/lib/workflows/blocks/block-outputs.ts @@ -1,5 +1,9 @@ import { normalizeInputFormatValue } from '@/lib/workflows/input-format-utils' -import { classifyStartBlockType, StartBlockPath, TRIGGER_TYPES } from '@/lib/workflows/triggers' +import { + classifyStartBlockType, + StartBlockPath, + TRIGGER_TYPES, +} from '@/lib/workflows/triggers/triggers' import { type InputFormatField, START_BLOCK_RESERVED_FIELDS, diff --git a/apps/sim/lib/block-path-calculator.ts b/apps/sim/lib/workflows/blocks/block-path-calculator.ts similarity index 100% rename from apps/sim/lib/block-path-calculator.ts rename to apps/sim/lib/workflows/blocks/block-path-calculator.ts diff --git a/apps/sim/lib/workflows/credential-extractor.ts b/apps/sim/lib/workflows/credentials/credential-extractor.ts similarity index 100% rename from apps/sim/lib/workflows/credential-extractor.ts rename to apps/sim/lib/workflows/credentials/credential-extractor.ts diff --git a/apps/sim/lib/workflows/credential-resolver.ts b/apps/sim/lib/workflows/credentials/credential-resolver.ts similarity index 100% rename from apps/sim/lib/workflows/credential-resolver.ts rename to apps/sim/lib/workflows/credentials/credential-resolver.ts diff --git a/apps/sim/lib/custom-tools/operations.ts b/apps/sim/lib/workflows/custom-tools/operations.ts similarity index 97% rename from apps/sim/lib/custom-tools/operations.ts rename to apps/sim/lib/workflows/custom-tools/operations.ts index af84144691..c5b97bf752 100644 --- a/apps/sim/lib/custom-tools/operations.ts +++ b/apps/sim/lib/workflows/custom-tools/operations.ts @@ -2,8 +2,8 @@ import { db } from '@sim/db' import { customTools } from '@sim/db/schema' import { and, desc, eq, isNull } from 'drizzle-orm' import { nanoid } from 'nanoid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('CustomToolsOperations') diff --git a/apps/sim/lib/workflows/defaults.ts b/apps/sim/lib/workflows/defaults.ts index 8b15deb8b3..cfb0a20bbf 100644 --- a/apps/sim/lib/workflows/defaults.ts +++ b/apps/sim/lib/workflows/defaults.ts @@ -1,4 +1,4 @@ -import { getBlockOutputs } from '@/lib/workflows/block-outputs' +import { getBlockOutputs } from '@/lib/workflows/blocks/block-outputs' import { getBlock } from '@/blocks' import type { BlockConfig, SubBlockConfig } from '@/blocks/types' import type { BlockState, SubBlockState, WorkflowState } from '@/stores/workflows/workflow/types' diff --git a/apps/sim/lib/workflows/executor/execution-core.ts b/apps/sim/lib/workflows/executor/execution-core.ts index e018b2d9bc..1096aa1623 100644 --- a/apps/sim/lib/workflows/executor/execution-core.ts +++ b/apps/sim/lib/workflows/executor/execution-core.ts @@ -12,8 +12,8 @@ import { buildTraceSpans } from '@/lib/logs/execution/trace-spans/trace-spans' import { loadDeployedWorkflowState, loadWorkflowFromNormalizedTables, -} from '@/lib/workflows/db-helpers' -import { TriggerUtils } from '@/lib/workflows/triggers' +} from '@/lib/workflows/persistence/utils' +import { TriggerUtils } from '@/lib/workflows/triggers/triggers' import { updateWorkflowRunCounts } from '@/lib/workflows/utils' import { Executor } from '@/executor' import type { ExecutionCallbacks, ExecutionSnapshot } from '@/executor/execution/snapshot' diff --git a/apps/sim/lib/workflows/deployment-utils.ts b/apps/sim/lib/workflows/operations/deployment-utils.ts similarity index 99% rename from apps/sim/lib/workflows/deployment-utils.ts rename to apps/sim/lib/workflows/operations/deployment-utils.ts index b4fdf193ba..f46238bad0 100644 --- a/apps/sim/lib/workflows/deployment-utils.ts +++ b/apps/sim/lib/workflows/operations/deployment-utils.ts @@ -1,5 +1,5 @@ import { createLogger } from '@/lib/logs/console/logger' -import { resolveStartCandidates, StartBlockPath } from '@/lib/workflows/triggers' +import { resolveStartCandidates, StartBlockPath } from '@/lib/workflows/triggers/triggers' import { useSubBlockStore } from '@/stores/workflows/subblock/store' import { useWorkflowStore } from '@/stores/workflows/workflow/store' diff --git a/apps/sim/lib/workflows/import-export.ts b/apps/sim/lib/workflows/operations/import-export.ts similarity index 98% rename from apps/sim/lib/workflows/import-export.ts rename to apps/sim/lib/workflows/operations/import-export.ts index 1dbb592b4e..eddc21d93e 100644 --- a/apps/sim/lib/workflows/import-export.ts +++ b/apps/sim/lib/workflows/operations/import-export.ts @@ -1,6 +1,6 @@ import JSZip from 'jszip' import { createLogger } from '@/lib/logs/console/logger' -import { sanitizeForExport } from '@/lib/workflows/json-sanitizer' +import { sanitizeForExport } from '@/lib/workflows/sanitization/json-sanitizer' import type { WorkflowState } from '@/stores/workflows/workflow/types' const logger = createLogger('WorkflowImportExport') diff --git a/apps/sim/lib/workflows/socket-operations.ts b/apps/sim/lib/workflows/operations/socket-operations.ts similarity index 97% rename from apps/sim/lib/workflows/socket-operations.ts rename to apps/sim/lib/workflows/operations/socket-operations.ts index 40ea1b42ee..5679b20861 100644 --- a/apps/sim/lib/workflows/socket-operations.ts +++ b/apps/sim/lib/workflows/operations/socket-operations.ts @@ -1,4 +1,4 @@ -import { client } from '@/lib/auth-client' +import { client } from '@/lib/auth/auth-client' import { createLogger } from '@/lib/logs/console/logger' import { useOperationQueueStore } from '@/stores/operation-queue/store' import type { WorkflowState } from '@/stores/workflows/workflow/types' diff --git a/apps/sim/lib/workflows/custom-tools-persistence.ts b/apps/sim/lib/workflows/persistence/custom-tools-persistence.ts similarity index 98% rename from apps/sim/lib/workflows/custom-tools-persistence.ts rename to apps/sim/lib/workflows/persistence/custom-tools-persistence.ts index facb124637..a8936c8b88 100644 --- a/apps/sim/lib/workflows/custom-tools-persistence.ts +++ b/apps/sim/lib/workflows/persistence/custom-tools-persistence.ts @@ -1,5 +1,5 @@ -import { upsertCustomTools } from '@/lib/custom-tools/operations' import { createLogger } from '@/lib/logs/console/logger' +import { upsertCustomTools } from '@/lib/workflows/custom-tools/operations' const logger = createLogger('CustomToolsPersistence') diff --git a/apps/sim/lib/workflows/duplicate.ts b/apps/sim/lib/workflows/persistence/duplicate.ts similarity index 99% rename from apps/sim/lib/workflows/duplicate.ts rename to apps/sim/lib/workflows/persistence/duplicate.ts index 7f6bb03e4f..bf6fde02ce 100644 --- a/apps/sim/lib/workflows/duplicate.ts +++ b/apps/sim/lib/workflows/persistence/duplicate.ts @@ -2,7 +2,7 @@ import { db } from '@sim/db' import { workflow, workflowBlocks, workflowEdges, workflowSubflows } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' import type { Variable } from '@/stores/panel/variables/types' import type { LoopConfig, ParallelConfig } from '@/stores/workflows/workflow/types' diff --git a/apps/sim/lib/workflows/db-helpers.test.ts b/apps/sim/lib/workflows/persistence/utils.test.ts similarity index 99% rename from apps/sim/lib/workflows/db-helpers.test.ts rename to apps/sim/lib/workflows/persistence/utils.test.ts index c3f876a1ef..0efb0fa283 100644 --- a/apps/sim/lib/workflows/db-helpers.test.ts +++ b/apps/sim/lib/workflows/persistence/utils.test.ts @@ -93,7 +93,7 @@ vi.mock('@/lib/logs/console/logger', () => ({ })), })) -import * as dbHelpers from '@/lib/workflows/db-helpers' +import * as dbHelpers from '@/lib/workflows/persistence/utils' const mockWorkflowId = 'test-workflow-123' diff --git a/apps/sim/lib/workflows/db-helpers.ts b/apps/sim/lib/workflows/persistence/utils.ts similarity index 99% rename from apps/sim/lib/workflows/db-helpers.ts rename to apps/sim/lib/workflows/persistence/utils.ts index e58172e6c8..aaa125680d 100644 --- a/apps/sim/lib/workflows/db-helpers.ts +++ b/apps/sim/lib/workflows/persistence/utils.ts @@ -13,7 +13,7 @@ import { and, desc, eq, sql } from 'drizzle-orm' import type { Edge } from 'reactflow' import { v4 as uuidv4 } from 'uuid' import { createLogger } from '@/lib/logs/console/logger' -import { sanitizeAgentToolsInBlocks } from '@/lib/workflows/validation' +import { sanitizeAgentToolsInBlocks } from '@/lib/workflows/sanitization/validation' import type { BlockState, Loop, Parallel, WorkflowState } from '@/stores/workflows/workflow/types' import { SUBFLOW_TYPES } from '@/stores/workflows/workflow/types' import { generateLoopBlocks, generateParallelBlocks } from '@/stores/workflows/workflow/utils' @@ -560,7 +560,7 @@ export async function deployWorkflow(params: { // Track deployment telemetry if workflow name is provided if (workflowName) { try { - const { trackPlatformEvent } = await import('@/lib/telemetry/tracer') + const { trackPlatformEvent } = await import('@/lib/core/telemetry') const blockTypeCounts: Record = {} for (const block of Object.values(currentState.blocks)) { diff --git a/apps/sim/lib/workflows/json-sanitizer.ts b/apps/sim/lib/workflows/sanitization/json-sanitizer.ts similarity index 99% rename from apps/sim/lib/workflows/json-sanitizer.ts rename to apps/sim/lib/workflows/sanitization/json-sanitizer.ts index f5b2651ace..d7dab0673e 100644 --- a/apps/sim/lib/workflows/json-sanitizer.ts +++ b/apps/sim/lib/workflows/sanitization/json-sanitizer.ts @@ -1,5 +1,5 @@ import type { Edge } from 'reactflow' -import { sanitizeWorkflowForSharing } from '@/lib/workflows/credential-extractor' +import { sanitizeWorkflowForSharing } from '@/lib/workflows/credentials/credential-extractor' import type { BlockState, Loop, Parallel, WorkflowState } from '@/stores/workflows/workflow/types' import { generateLoopBlocks, generateParallelBlocks } from '@/stores/workflows/workflow/utils' import { TRIGGER_PERSISTED_SUBBLOCK_IDS } from '@/triggers/consts' diff --git a/apps/sim/lib/workflows/references.test.ts b/apps/sim/lib/workflows/sanitization/references.test.ts similarity index 92% rename from apps/sim/lib/workflows/references.test.ts rename to apps/sim/lib/workflows/sanitization/references.test.ts index 04b950635d..4aece4c771 100644 --- a/apps/sim/lib/workflows/references.test.ts +++ b/apps/sim/lib/workflows/sanitization/references.test.ts @@ -1,5 +1,8 @@ import { describe, expect, it } from 'vitest' -import { isLikelyReferenceSegment, splitReferenceSegment } from '@/lib/workflows/references' +import { + isLikelyReferenceSegment, + splitReferenceSegment, +} from '@/lib/workflows/sanitization/references' describe('splitReferenceSegment', () => { it('should return leading and reference for simple segments', () => { diff --git a/apps/sim/lib/workflows/references.ts b/apps/sim/lib/workflows/sanitization/references.ts similarity index 100% rename from apps/sim/lib/workflows/references.ts rename to apps/sim/lib/workflows/sanitization/references.ts diff --git a/apps/sim/lib/workflows/validation.ts b/apps/sim/lib/workflows/sanitization/validation.ts similarity index 100% rename from apps/sim/lib/workflows/validation.ts rename to apps/sim/lib/workflows/sanitization/validation.ts diff --git a/apps/sim/lib/schedules/utils.test.ts b/apps/sim/lib/workflows/schedules/utils.test.ts similarity index 99% rename from apps/sim/lib/schedules/utils.test.ts rename to apps/sim/lib/workflows/schedules/utils.test.ts index 1e9033de81..949cb32311 100644 --- a/apps/sim/lib/schedules/utils.test.ts +++ b/apps/sim/lib/workflows/schedules/utils.test.ts @@ -12,7 +12,7 @@ import { parseCronToHumanReadable, parseTimeString, validateCronExpression, -} from '@/lib/schedules/utils' +} from '@/lib/workflows/schedules/utils' describe('Schedule Utilities', () => { describe('parseTimeString', () => { diff --git a/apps/sim/lib/schedules/utils.ts b/apps/sim/lib/workflows/schedules/utils.ts similarity index 99% rename from apps/sim/lib/schedules/utils.ts rename to apps/sim/lib/workflows/schedules/utils.ts index 9d2904ce26..233715c711 100644 --- a/apps/sim/lib/schedules/utils.ts +++ b/apps/sim/lib/workflows/schedules/utils.ts @@ -1,7 +1,7 @@ import { Cron } from 'croner' import cronstrue from 'cronstrue' +import { formatDateTime } from '@/lib/core/utils/formatting' import { createLogger } from '@/lib/logs/console/logger' -import { formatDateTime } from '@/lib/utils' const logger = createLogger('ScheduleUtils') diff --git a/apps/sim/lib/workflows/streaming.ts b/apps/sim/lib/workflows/streaming/streaming.ts similarity index 98% rename from apps/sim/lib/workflows/streaming.ts rename to apps/sim/lib/workflows/streaming/streaming.ts index 27f4342875..46e1d92478 100644 --- a/apps/sim/lib/workflows/streaming.ts +++ b/apps/sim/lib/workflows/streaming/streaming.ts @@ -1,5 +1,5 @@ +import { encodeSSE } from '@/lib/core/utils/sse' import { createLogger } from '@/lib/logs/console/logger' -import { encodeSSE } from '@/lib/utils' import type { ExecutionResult } from '@/executor/types' const logger = createLogger('WorkflowStreaming') @@ -105,7 +105,7 @@ export async function createStreamingResponse( if (!streamConfig.selectedOutputs?.length) return const { extractBlockIdFromOutputId, extractPathFromOutputId, traverseObjectPath } = - await import('@/lib/response-format') + await import('@/lib/core/utils/response-format') const matchingOutputs = streamConfig.selectedOutputs.filter( (outputId) => extractBlockIdFromOutputId(outputId) === blockId @@ -195,7 +195,7 @@ export async function createStreamingResponse( if (streamConfig.selectedOutputs?.length && result.output) { const { extractBlockIdFromOutputId, extractPathFromOutputId, traverseObjectPath } = - await import('@/lib/response-format') + await import('@/lib/core/utils/response-format') for (const outputId of streamConfig.selectedOutputs) { const blockId = extractBlockIdFromOutputId(outputId) diff --git a/apps/sim/lib/workflows/training/compute-edit-sequence.ts b/apps/sim/lib/workflows/training/compute-edit-sequence.ts index bcc686dae2..bf4204376e 100644 --- a/apps/sim/lib/workflows/training/compute-edit-sequence.ts +++ b/apps/sim/lib/workflows/training/compute-edit-sequence.ts @@ -1,4 +1,4 @@ -import type { CopilotWorkflowState } from '@/lib/workflows/json-sanitizer' +import type { CopilotWorkflowState } from '@/lib/workflows/sanitization/json-sanitizer' import { TRIGGER_RUNTIME_SUBBLOCK_IDS } from '@/triggers/consts' export interface EditOperation { diff --git a/apps/sim/lib/workflows/execution-events.ts b/apps/sim/lib/workflows/triggers/execution-events.ts similarity index 100% rename from apps/sim/lib/workflows/execution-events.ts rename to apps/sim/lib/workflows/triggers/execution-events.ts diff --git a/apps/sim/lib/workflows/trigger-utils.ts b/apps/sim/lib/workflows/triggers/trigger-utils.ts similarity index 99% rename from apps/sim/lib/workflows/trigger-utils.ts rename to apps/sim/lib/workflows/triggers/trigger-utils.ts index 4c4d52b978..aaf6dbb697 100644 --- a/apps/sim/lib/workflows/trigger-utils.ts +++ b/apps/sim/lib/workflows/triggers/trigger-utils.ts @@ -1,5 +1,9 @@ import { createLogger } from '@/lib/logs/console/logger' -import { type StartBlockCandidate, StartBlockPath, TRIGGER_TYPES } from '@/lib/workflows/triggers' +import { + type StartBlockCandidate, + StartBlockPath, + TRIGGER_TYPES, +} from '@/lib/workflows/triggers/triggers' import { getAllBlocks, getBlock } from '@/blocks' import type { BlockConfig } from '@/blocks/types' import { getTrigger } from '@/triggers' diff --git a/apps/sim/lib/workflows/triggers.ts b/apps/sim/lib/workflows/triggers/triggers.ts similarity index 100% rename from apps/sim/lib/workflows/triggers.ts rename to apps/sim/lib/workflows/triggers/triggers.ts diff --git a/apps/sim/lib/workflows/utils.ts b/apps/sim/lib/workflows/utils.ts index a64e3355d3..b2573610a9 100644 --- a/apps/sim/lib/workflows/utils.ts +++ b/apps/sim/lib/workflows/utils.ts @@ -4,9 +4,9 @@ import type { InferSelectModel } from 'drizzle-orm' import { and, eq } from 'drizzle-orm' import { NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import type { PermissionType } from '@/lib/permissions/utils' -import { getBaseUrl } from '@/lib/urls/utils' +import type { PermissionType } from '@/lib/workspaces/permissions/utils' import type { ExecutionResult } from '@/executor/types' import type { WorkflowState } from '@/stores/workflows/workflow/types' diff --git a/apps/sim/lib/variables/variable-manager.test.ts b/apps/sim/lib/workflows/variables/variable-manager.test.ts similarity index 99% rename from apps/sim/lib/variables/variable-manager.test.ts rename to apps/sim/lib/workflows/variables/variable-manager.test.ts index 850f2bfc1a..4796ce19b9 100644 --- a/apps/sim/lib/variables/variable-manager.test.ts +++ b/apps/sim/lib/workflows/variables/variable-manager.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest' -import { VariableManager } from '@/lib/variables/variable-manager' +import { VariableManager } from '@/lib/workflows/variables/variable-manager' describe('VariableManager', () => { describe('parseInputForStorage', () => { diff --git a/apps/sim/lib/variables/variable-manager.ts b/apps/sim/lib/workflows/variables/variable-manager.ts similarity index 100% rename from apps/sim/lib/variables/variable-manager.ts rename to apps/sim/lib/workflows/variables/variable-manager.ts diff --git a/apps/sim/lib/workspaces/duplicate.ts b/apps/sim/lib/workspaces/duplicate.ts index 4678911aa5..9bda00d5f4 100644 --- a/apps/sim/lib/workspaces/duplicate.ts +++ b/apps/sim/lib/workspaces/duplicate.ts @@ -2,8 +2,8 @@ import { db } from '@sim/db' import { permissions, workflow, workflowFolder, workspace as workspaceTable } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { duplicateWorkflow } from '@/lib/workflows/duplicate' +import { duplicateWorkflow } from '@/lib/workflows/persistence/duplicate' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('WorkspaceDuplicate') diff --git a/apps/sim/lib/workspaces/naming.ts b/apps/sim/lib/workspaces/naming.ts index 49701acbfb..4c08f5eda2 100644 --- a/apps/sim/lib/workspaces/naming.ts +++ b/apps/sim/lib/workspaces/naming.ts @@ -2,7 +2,7 @@ * Utility functions for generating names for workspaces and folders */ -import type { Workspace } from '@/lib/organization/types' +import type { Workspace } from '@/lib/workspaces/organization/types' import type { WorkflowFolder } from '@/stores/folders/store' export interface NameableEntity { diff --git a/apps/sim/lib/organization/index.ts b/apps/sim/lib/workspaces/organization/index.ts similarity index 65% rename from apps/sim/lib/organization/index.ts rename to apps/sim/lib/workspaces/organization/index.ts index d128aecbf5..1d86441175 100644 --- a/apps/sim/lib/organization/index.ts +++ b/apps/sim/lib/workspaces/organization/index.ts @@ -1,10 +1,3 @@ -// Export helper functions -export { - calculateSeatUsage as calculateSeatUsageHelper, - getUsedSeats, - getUserRole, - isAdminOrOwner, -} from '@/lib/organization/helpers' // Export types export type { Invitation, @@ -17,11 +10,14 @@ export type { User, Workspace, WorkspaceInvitation, -} from '@/lib/organization/types' +} from '@/lib/workspaces/organization/types' // Export utility functions export { calculateSeatUsage, generateSlug, + getUsedSeats, + getUserRole, + isAdminOrOwner, validateEmail, validateSlug, -} from '@/lib/organization/utils' +} from '@/lib/workspaces/organization/utils' diff --git a/apps/sim/lib/organization/types.ts b/apps/sim/lib/workspaces/organization/types.ts similarity index 100% rename from apps/sim/lib/organization/types.ts rename to apps/sim/lib/workspaces/organization/types.ts diff --git a/apps/sim/lib/organization/helpers.ts b/apps/sim/lib/workspaces/organization/utils.ts similarity index 61% rename from apps/sim/lib/organization/helpers.ts rename to apps/sim/lib/workspaces/organization/utils.ts index 3edc4d67cd..b619677d1e 100644 --- a/apps/sim/lib/organization/helpers.ts +++ b/apps/sim/lib/workspaces/organization/utils.ts @@ -1,9 +1,10 @@ /** - * Helper functions for organization-related computations + * Utility functions for organization-related operations * These are pure functions that compute values from organization data */ -import type { Organization } from '@/lib/organization/types' +import { quickValidateEmail } from '@/lib/messaging/email/validation' +import type { Organization } from '@/lib/workspaces/organization/types' /** * Get the role of a user in an organization @@ -55,8 +56,34 @@ export function calculateSeatUsage(organization: Organization | null | undefined /** * Get used seats from an organization - * Alias for calculateSeatUsage for backward compatibility + * Alias for calculateSeatUsage */ export function getUsedSeats(organization: Organization | null | undefined) { return calculateSeatUsage(organization) } + +/** + * Generate a URL-friendly slug from a name + */ +export function generateSlug(name: string): string { + return name + .toLowerCase() + .replace(/[^a-z0-9]/g, '-') // Replace non-alphanumeric with hyphens + .replace(/-+/g, '-') // Replace consecutive hyphens with single hyphen + .replace(/^-|-$/g, '') // Remove leading and trailing hyphens +} + +/** + * Validate organization slug format + */ +export function validateSlug(slug: string): boolean { + const slugRegex = /^[a-z0-9-_]+$/ + return slugRegex.test(slug) +} + +/** + * Validate email format + */ +export function validateEmail(email: string): boolean { + return quickValidateEmail(email.trim().toLowerCase()).isValid +} diff --git a/apps/sim/lib/permissions/utils.test.ts b/apps/sim/lib/workspaces/permissions/utils.test.ts similarity index 99% rename from apps/sim/lib/permissions/utils.test.ts rename to apps/sim/lib/workspaces/permissions/utils.test.ts index f4c4852399..f997e14265 100644 --- a/apps/sim/lib/permissions/utils.test.ts +++ b/apps/sim/lib/workspaces/permissions/utils.test.ts @@ -48,7 +48,7 @@ import { getUsersWithPermissions, hasAdminPermission, hasWorkspaceAdminAccess, -} from '@/lib/permissions/utils' +} from '@/lib/workspaces/permissions/utils' const mockDb = db as any type PermissionType = 'admin' | 'write' | 'read' diff --git a/apps/sim/lib/permissions/utils.ts b/apps/sim/lib/workspaces/permissions/utils.ts similarity index 100% rename from apps/sim/lib/permissions/utils.ts rename to apps/sim/lib/workspaces/permissions/utils.ts diff --git a/apps/sim/lib/collaboration/presence-colors.ts b/apps/sim/lib/workspaces/presence-colors.ts similarity index 100% rename from apps/sim/lib/collaboration/presence-colors.ts rename to apps/sim/lib/workspaces/presence-colors.ts diff --git a/apps/sim/middleware.ts b/apps/sim/middleware.ts index a922ab9feb..e9ffd2da67 100644 --- a/apps/sim/middleware.ts +++ b/apps/sim/middleware.ts @@ -1,8 +1,8 @@ import { getSessionCookie } from 'better-auth/cookies' import { type NextRequest, NextResponse } from 'next/server' -import { isHosted } from './lib/environment' +import { isHosted } from './lib/core/config/environment' +import { generateRuntimeCSP } from './lib/core/security/csp' import { createLogger } from './lib/logs/console/logger' -import { generateRuntimeCSP } from './lib/security/csp' const logger = createLogger('Middleware') diff --git a/apps/sim/next.config.ts b/apps/sim/next.config.ts index 628ee264fd..4307448017 100644 --- a/apps/sim/next.config.ts +++ b/apps/sim/next.config.ts @@ -1,7 +1,7 @@ import type { NextConfig } from 'next' -import { env, getEnv, isTruthy } from './lib/env' -import { isDev, isHosted } from './lib/environment' -import { getMainCSPPolicy, getWorkflowExecutionCSPPolicy } from './lib/security/csp' +import { env, getEnv, isTruthy } from './lib/core/config/env' +import { isDev, isHosted } from './lib/core/config/environment' +import { getMainCSPPolicy, getWorkflowExecutionCSPPolicy } from './lib/core/security/csp' const nextConfig: NextConfig = { devIndicators: false, diff --git a/apps/sim/providers/azure-openai/index.ts b/apps/sim/providers/azure-openai/index.ts index b4af62f63a..fd4f71a563 100644 --- a/apps/sim/providers/azure-openai/index.ts +++ b/apps/sim/providers/azure-openai/index.ts @@ -1,5 +1,5 @@ import { AzureOpenAI } from 'openai' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' import type { StreamingExecution } from '@/executor/types' import { getProviderDefaultModel, getProviderModels } from '@/providers/models' diff --git a/apps/sim/providers/index.ts b/apps/sim/providers/index.ts index d4af6e5c18..0b6d7b1ac7 100644 --- a/apps/sim/providers/index.ts +++ b/apps/sim/providers/index.ts @@ -1,4 +1,4 @@ -import { getCostMultiplier } from '@/lib/environment' +import { getCostMultiplier } from '@/lib/core/config/environment' import { createLogger } from '@/lib/logs/console/logger' import type { StreamingExecution } from '@/executor/types' import type { ProviderRequest, ProviderResponse } from '@/providers/types' diff --git a/apps/sim/providers/ollama/index.ts b/apps/sim/providers/ollama/index.ts index c1f2820462..0118e53ffc 100644 --- a/apps/sim/providers/ollama/index.ts +++ b/apps/sim/providers/ollama/index.ts @@ -1,5 +1,5 @@ import OpenAI from 'openai' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' import type { StreamingExecution } from '@/executor/types' import type { ModelsObject } from '@/providers/ollama/types' diff --git a/apps/sim/providers/utils.test.ts b/apps/sim/providers/utils.test.ts index 21ea471164..7c30ac3c3a 100644 --- a/apps/sim/providers/utils.test.ts +++ b/apps/sim/providers/utils.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import * as environmentModule from '@/lib/environment' +import * as environmentModule from '@/lib/core/config/environment' import { calculateCost, extractAndParseJSON, diff --git a/apps/sim/providers/utils.ts b/apps/sim/providers/utils.ts index b554efd03d..85718667a5 100644 --- a/apps/sim/providers/utils.ts +++ b/apps/sim/providers/utils.ts @@ -1,5 +1,5 @@ -import { getEnv, isTruthy } from '@/lib/env' -import { isHosted } from '@/lib/environment' +import { getEnv, isTruthy } from '@/lib/core/config/env' +import { isHosted } from '@/lib/core/config/environment' import { createLogger } from '@/lib/logs/console/logger' import { anthropicProvider } from '@/providers/anthropic' import { azureOpenAIProvider } from '@/providers/azure-openai' @@ -645,7 +645,7 @@ export function getApiKey(provider: string, model: string, userProvidedKey?: str if (isHosted && (isOpenAIModel || isClaudeModel || isGeminiModel)) { try { // Import the key rotation function - const { getRotatingApiKey } = require('@/lib/utils') + const { getRotatingApiKey } = require('@/lib/core/config/api-keys') const serverKey = getRotatingApiKey(isGeminiModel ? 'gemini' : provider) return serverKey } catch (_error) { diff --git a/apps/sim/providers/vllm/index.ts b/apps/sim/providers/vllm/index.ts index 7a9ee6afe9..be59f5480e 100644 --- a/apps/sim/providers/vllm/index.ts +++ b/apps/sim/providers/vllm/index.ts @@ -1,5 +1,5 @@ import OpenAI from 'openai' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' import type { StreamingExecution } from '@/executor/types' import { getProviderDefaultModel, getProviderModels } from '@/providers/models' diff --git a/apps/sim/scripts/export-workflow.ts b/apps/sim/scripts/export-workflow.ts index c64e018dca..f842922377 100755 --- a/apps/sim/scripts/export-workflow.ts +++ b/apps/sim/scripts/export-workflow.ts @@ -26,8 +26,8 @@ console.error = () => {} import { writeFileSync } from 'fs' import { eq } from 'drizzle-orm' import { db, workflow } from '../../../packages/db/index.js' -import { loadWorkflowFromNormalizedTables } from '../lib/workflows/db-helpers.js' -import { sanitizeForExport } from '../lib/workflows/json-sanitizer.js' +import { loadWorkflowFromNormalizedTables } from '../lib/workflows/persistence/utils.js' +import { sanitizeForExport } from '../lib/workflows/sanitization/json-sanitizer.js' // ---------- CLI argument parsing ---------- const args = process.argv.slice(2) diff --git a/apps/sim/scripts/process-docs.ts b/apps/sim/scripts/process-docs.ts index 029594df96..2a53e78fc5 100644 --- a/apps/sim/scripts/process-docs.ts +++ b/apps/sim/scripts/process-docs.ts @@ -5,7 +5,7 @@ import { db } from '@sim/db' import { docsEmbeddings } from '@sim/db/schema' import { sql } from 'drizzle-orm' import { type DocChunk, DocsChunker } from '@/lib/chunkers' -import { isDev } from '@/lib/environment' +import { isDev } from '@/lib/core/config/environment' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('ProcessDocs') diff --git a/apps/sim/serializer/index.ts b/apps/sim/serializer/index.ts index 3fb005c695..0b03bd2af7 100644 --- a/apps/sim/serializer/index.ts +++ b/apps/sim/serializer/index.ts @@ -1,6 +1,6 @@ import type { Edge } from 'reactflow' -import { BlockPathCalculator } from '@/lib/block-path-calculator' import { createLogger } from '@/lib/logs/console/logger' +import { BlockPathCalculator } from '@/lib/workflows/blocks/block-path-calculator' import { getBlock } from '@/blocks' import type { SubBlockConfig } from '@/blocks/types' import type { SerializedBlock, SerializedWorkflow } from '@/serializer/types' diff --git a/apps/sim/services/queue/types.ts b/apps/sim/services/queue/types.ts index ac620b8643..607c977061 100644 --- a/apps/sim/services/queue/types.ts +++ b/apps/sim/services/queue/types.ts @@ -1,6 +1,6 @@ import type { userRateLimits } from '@sim/db/schema' import type { InferSelectModel } from 'drizzle-orm' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' // Database types export type UserRateLimit = InferSelectModel diff --git a/apps/sim/socket-server/config/socket.ts b/apps/sim/socket-server/config/socket.ts index 9bbe853d82..2eab72f588 100644 --- a/apps/sim/socket-server/config/socket.ts +++ b/apps/sim/socket-server/config/socket.ts @@ -1,9 +1,9 @@ import type { Server as HttpServer } from 'http' import { Server } from 'socket.io' -import { env } from '@/lib/env' -import { isProd } from '@/lib/environment' +import { env } from '@/lib/core/config/env' +import { isProd } from '@/lib/core/config/environment' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' const logger = createLogger('SocketIOConfig') diff --git a/apps/sim/socket-server/database/operations.ts b/apps/sim/socket-server/database/operations.ts index e985d169f8..09a4f48d12 100644 --- a/apps/sim/socket-server/database/operations.ts +++ b/apps/sim/socket-server/database/operations.ts @@ -3,10 +3,10 @@ import { webhook, workflow, workflowBlocks, workflowEdges, workflowSubflows } fr import { and, eq, inArray, or, sql } from 'drizzle-orm' import { drizzle } from 'drizzle-orm/postgres-js' import postgres from 'postgres' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' -import { cleanupExternalWebhook } from '@/lib/webhooks/webhook-helpers' -import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/db-helpers' +import { cleanupExternalWebhook } from '@/lib/webhooks/provider-subscriptions' +import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/persistence/utils' const logger = createLogger('SocketDatabase') diff --git a/apps/sim/socket-server/index.ts b/apps/sim/socket-server/index.ts index 1a475ef1e1..1a88dfaebf 100644 --- a/apps/sim/socket-server/index.ts +++ b/apps/sim/socket-server/index.ts @@ -1,5 +1,5 @@ import { createServer } from 'http' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' import { createSocketIOServer } from '@/socket-server/config/socket' import { setupAllHandlers } from '@/socket-server/handlers' diff --git a/apps/sim/socket-server/middleware/permissions.ts b/apps/sim/socket-server/middleware/permissions.ts index 71ed1f3cb1..7ce8db17e1 100644 --- a/apps/sim/socket-server/middleware/permissions.ts +++ b/apps/sim/socket-server/middleware/permissions.ts @@ -2,7 +2,7 @@ import { db } from '@sim/db' import { workflow } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('SocketPermissions') diff --git a/apps/sim/socket-server/rooms/manager.ts b/apps/sim/socket-server/rooms/manager.ts index 5b6a429f27..b8f4948798 100644 --- a/apps/sim/socket-server/rooms/manager.ts +++ b/apps/sim/socket-server/rooms/manager.ts @@ -4,7 +4,7 @@ import { and, eq, isNull } from 'drizzle-orm' import { drizzle } from 'drizzle-orm/postgres-js' import postgres from 'postgres' import type { Server } from 'socket.io' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' const connectionString = env.DATABASE_URL diff --git a/apps/sim/stores/copilot-training/store.ts b/apps/sim/stores/copilot-training/store.ts index 481b4914e9..f9841849d6 100644 --- a/apps/sim/stores/copilot-training/store.ts +++ b/apps/sim/stores/copilot-training/store.ts @@ -1,7 +1,7 @@ import { create } from 'zustand' import { devtools } from 'zustand/middleware' import { createLogger } from '@/lib/logs/console/logger' -import { sanitizeForCopilot } from '@/lib/workflows/json-sanitizer' +import { sanitizeForCopilot } from '@/lib/workflows/sanitization/json-sanitizer' import { computeEditSequence, type EditOperation, diff --git a/apps/sim/stores/terminal/console/store.ts b/apps/sim/stores/terminal/console/store.ts index a8b1eab0bb..a02d5bb19e 100644 --- a/apps/sim/stores/terminal/console/store.ts +++ b/apps/sim/stores/terminal/console/store.ts @@ -1,7 +1,7 @@ import { create } from 'zustand' import { devtools, persist } from 'zustand/middleware' +import { redactApiKeys } from '@/lib/core/security/redaction' import { createLogger } from '@/lib/logs/console/logger' -import { redactApiKeys } from '@/lib/utils' import type { NormalizedBlockOutput } from '@/executor/types' import { useExecutionStore } from '@/stores/execution/store' import { useNotificationStore } from '@/stores/notifications' diff --git a/apps/sim/stores/workflow-diff/store.ts b/apps/sim/stores/workflow-diff/store.ts index 1676ccfba8..bef5512ff2 100644 --- a/apps/sim/stores/workflow-diff/store.ts +++ b/apps/sim/stores/workflow-diff/store.ts @@ -8,8 +8,8 @@ import { type WorkflowDiff, WorkflowDiffEngine, } from '@/lib/workflows/diff' -import { enqueueReplaceWorkflowState } from '@/lib/workflows/socket-operations' -import { validateWorkflowState } from '@/lib/workflows/validation' +import { enqueueReplaceWorkflowState } from '@/lib/workflows/operations/socket-operations' +import { validateWorkflowState } from '@/lib/workflows/sanitization/validation' import { Serializer } from '@/serializer' import { useWorkflowRegistry } from '../workflows/registry/store' import { useSubBlockStore } from '../workflows/subblock/store' diff --git a/apps/sim/stores/workflows/json/store.ts b/apps/sim/stores/workflows/json/store.ts index 82d663b8ec..0b1550091d 100644 --- a/apps/sim/stores/workflows/json/store.ts +++ b/apps/sim/stores/workflows/json/store.ts @@ -1,7 +1,10 @@ import { create } from 'zustand' import { devtools } from 'zustand/middleware' import { createLogger } from '@/lib/logs/console/logger' -import { type ExportWorkflowState, sanitizeForExport } from '@/lib/workflows/json-sanitizer' +import { + type ExportWorkflowState, + sanitizeForExport, +} from '@/lib/workflows/sanitization/json-sanitizer' import { getWorkflowWithValues } from '@/stores/workflows' import { useWorkflowRegistry } from '../registry/store' diff --git a/apps/sim/stores/workflows/registry/store.ts b/apps/sim/stores/workflows/registry/store.ts index de69fa8448..ab871a22d8 100644 --- a/apps/sim/stores/workflows/registry/store.ts +++ b/apps/sim/stores/workflows/registry/store.ts @@ -1,7 +1,7 @@ import { create } from 'zustand' import { devtools } from 'zustand/middleware' +import { withOptimisticUpdate } from '@/lib/core/utils/optimistic-update' import { createLogger } from '@/lib/logs/console/logger' -import { withOptimisticUpdate } from '@/lib/utils' import { buildDefaultWorkflowArtifacts } from '@/lib/workflows/defaults' import { API_ENDPOINTS } from '@/stores/constants' import { useVariablesStore } from '@/stores/panel/variables/store' diff --git a/apps/sim/stores/workflows/workflow/store.ts b/apps/sim/stores/workflows/workflow/store.ts index dfb22918a0..842a1ff40f 100644 --- a/apps/sim/stores/workflows/workflow/store.ts +++ b/apps/sim/stores/workflows/workflow/store.ts @@ -2,8 +2,8 @@ import type { Edge } from 'reactflow' import { create } from 'zustand' import { devtools } from 'zustand/middleware' import { createLogger } from '@/lib/logs/console/logger' -import { getBlockOutputs } from '@/lib/workflows/block-outputs' -import { TriggerUtils } from '@/lib/workflows/triggers' +import { getBlockOutputs } from '@/lib/workflows/blocks/block-outputs' +import { TriggerUtils } from '@/lib/workflows/triggers/triggers' import { getBlock } from '@/blocks' import type { SubBlockConfig } from '@/blocks/types' import { isAnnotationOnlyBlock } from '@/executor/consts' diff --git a/apps/sim/telemetry.config.ts b/apps/sim/telemetry.config.ts index 621560b297..0256b3f32d 100644 --- a/apps/sim/telemetry.config.ts +++ b/apps/sim/telemetry.config.ts @@ -23,7 +23,7 @@ * - API keys or tokens * - IP addresses or geolocation data */ -import { env } from './lib/env' +import { env } from './lib/core/config/env' const config = { /** diff --git a/apps/sim/tools/http/utils.ts b/apps/sim/tools/http/utils.ts index d252010125..1c99a162db 100644 --- a/apps/sim/tools/http/utils.ts +++ b/apps/sim/tools/http/utils.ts @@ -1,6 +1,6 @@ -import { isTest } from '@/lib/environment' +import { isTest } from '@/lib/core/config/environment' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' import type { TableRow } from '@/tools/types' const logger = createLogger('HTTPRequestUtils') diff --git a/apps/sim/tools/index.ts b/apps/sim/tools/index.ts index 597fdb8099..7624c33854 100644 --- a/apps/sim/tools/index.ts +++ b/apps/sim/tools/index.ts @@ -1,8 +1,8 @@ import { generateInternalToken } from '@/lib/auth/internal' +import { generateRequestId } from '@/lib/core/utils/request' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' import { parseMcpToolId } from '@/lib/mcp/utils' -import { getBaseUrl } from '@/lib/urls/utils' -import { generateRequestId } from '@/lib/utils' import type { ExecutionContext } from '@/executor/types' import type { ErrorInfo } from '@/tools/error-extractors' import { extractErrorMessage } from '@/tools/error-extractors' diff --git a/apps/sim/tools/mistral/parser.ts b/apps/sim/tools/mistral/parser.ts index 825469ba4f..33a70e85be 100644 --- a/apps/sim/tools/mistral/parser.ts +++ b/apps/sim/tools/mistral/parser.ts @@ -1,5 +1,5 @@ +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' import type { MistralParserInput, MistralParserOutput } from '@/tools/mistral/types' import type { ToolConfig } from '@/tools/types' diff --git a/apps/sim/tools/openai/image.ts b/apps/sim/tools/openai/image.ts index 141c9a3aea..b65a59923f 100644 --- a/apps/sim/tools/openai/image.ts +++ b/apps/sim/tools/openai/image.ts @@ -1,5 +1,5 @@ +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' import type { BaseImageRequestBody } from '@/tools/openai/types' import type { ToolConfig } from '@/tools/types' diff --git a/apps/sim/tools/trello/add_comment.ts b/apps/sim/tools/trello/add_comment.ts index 6462127b59..e84e65ffe8 100644 --- a/apps/sim/tools/trello/add_comment.ts +++ b/apps/sim/tools/trello/add_comment.ts @@ -1,4 +1,4 @@ -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import type { TrelloAddCommentParams, TrelloAddCommentResponse } from '@/tools/trello/types' import type { ToolConfig } from '@/tools/types' diff --git a/apps/sim/tools/trello/create_card.ts b/apps/sim/tools/trello/create_card.ts index e1bdb791a3..0cee7d752f 100644 --- a/apps/sim/tools/trello/create_card.ts +++ b/apps/sim/tools/trello/create_card.ts @@ -1,4 +1,4 @@ -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import type { TrelloCreateCardParams, TrelloCreateCardResponse } from '@/tools/trello/types' import type { ToolConfig } from '@/tools/types' diff --git a/apps/sim/tools/trello/get_actions.ts b/apps/sim/tools/trello/get_actions.ts index 7f70259444..9ab5ff4161 100644 --- a/apps/sim/tools/trello/get_actions.ts +++ b/apps/sim/tools/trello/get_actions.ts @@ -1,4 +1,4 @@ -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import type { TrelloGetActionsParams, TrelloGetActionsResponse } from '@/tools/trello/types' import type { ToolConfig } from '@/tools/types' diff --git a/apps/sim/tools/trello/list_cards.ts b/apps/sim/tools/trello/list_cards.ts index f116479df1..ddbbe1b595 100644 --- a/apps/sim/tools/trello/list_cards.ts +++ b/apps/sim/tools/trello/list_cards.ts @@ -1,4 +1,4 @@ -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import type { TrelloListCardsParams, TrelloListCardsResponse } from '@/tools/trello/types' import type { ToolConfig } from '@/tools/types' diff --git a/apps/sim/tools/trello/list_lists.ts b/apps/sim/tools/trello/list_lists.ts index cf0ce87336..f0579755d9 100644 --- a/apps/sim/tools/trello/list_lists.ts +++ b/apps/sim/tools/trello/list_lists.ts @@ -1,4 +1,4 @@ -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import type { TrelloListListsParams, TrelloListListsResponse } from '@/tools/trello/types' import type { ToolConfig } from '@/tools/types' diff --git a/apps/sim/tools/trello/update_card.ts b/apps/sim/tools/trello/update_card.ts index 39dae6f80c..3a6c7f9c2e 100644 --- a/apps/sim/tools/trello/update_card.ts +++ b/apps/sim/tools/trello/update_card.ts @@ -1,4 +1,4 @@ -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import type { TrelloUpdateCardParams, TrelloUpdateCardResponse } from '@/tools/trello/types' import type { ToolConfig } from '@/tools/types' diff --git a/apps/sim/tools/utils.ts b/apps/sim/tools/utils.ts index 5c052b3151..8cf07a5301 100644 --- a/apps/sim/tools/utils.ts +++ b/apps/sim/tools/utils.ts @@ -1,5 +1,5 @@ +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' import { useCustomToolsStore } from '@/stores/custom-tools/store' import { useEnvironmentStore } from '@/stores/settings/environment/store' import { tools } from '@/tools/registry' diff --git a/apps/sim/trigger.config.ts b/apps/sim/trigger.config.ts index 4d82d04e2c..543d112f07 100644 --- a/apps/sim/trigger.config.ts +++ b/apps/sim/trigger.config.ts @@ -1,6 +1,6 @@ import { additionalPackages } from '@trigger.dev/build/extensions/core' import { defineConfig } from '@trigger.dev/sdk' -import { env } from './lib/env' +import { env } from './lib/core/config/env' export default defineConfig({ project: env.TRIGGER_PROJECT_ID!, diff --git a/apps/sim/triggers/index.ts b/apps/sim/triggers/index.ts index 88e7653fdc..3bc5fe793e 100644 --- a/apps/sim/triggers/index.ts +++ b/apps/sim/triggers/index.ts @@ -1,4 +1,4 @@ -import { generateMockPayloadFromOutputsDefinition } from '@/lib/workflows/trigger-utils' +import { generateMockPayloadFromOutputsDefinition } from '@/lib/workflows/triggers/trigger-utils' import type { SubBlockConfig } from '@/blocks/types' import { TRIGGER_REGISTRY } from '@/triggers/registry' import type { TriggerConfig } from '@/triggers/types'