diff --git a/apps/sim/app/workspace/[workspaceId]/chat/[chatId]/loading.tsx b/apps/sim/app/workspace/[workspaceId]/chat/[chatId]/loading.tsx
new file mode 100644
index 00000000000..ff1e96e036e
--- /dev/null
+++ b/apps/sim/app/workspace/[workspaceId]/chat/[chatId]/loading.tsx
@@ -0,0 +1,19 @@
+import { HomeFallback } from '@/app/workspace/[workspaceId]/home/home-fallback'
+
+/**
+ * Route-level loading boundary for a chat.
+ *
+ * Its real job is prefetching, not painting. With `cacheComponents` off, a
+ * default `` prefetch degrades to Next's LoadingBoundary strategy, which
+ * prefetches a dynamic route only as far as its nearest `loading` segment — so
+ * a route without one is prefetched as nothing, and clicking a chat leaves the
+ * previous chat frozen on screen until the server responds. This file is what
+ * makes that click commit immediately.
+ *
+ * Renders the same surface `HomeFallback` gives the Suspense boundary inside
+ * the page, so the loading frame and the mounted frame share a background and
+ * the transition reads as one step rather than two.
+ */
+export default function ChatLoading() {
+ return
+}
diff --git a/apps/sim/app/workspace/[workspaceId]/files/files.tsx b/apps/sim/app/workspace/[workspaceId]/files/files.tsx
index 71800c82e2c..bd49e947710 100644
--- a/apps/sim/app/workspace/[workspaceId]/files/files.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/files/files.tsx
@@ -128,7 +128,6 @@ import {
} from '@/app/workspace/[workspaceId]/files/untitled-title'
import { useRegisterGlobalCommands } from '@/app/workspace/[workspaceId]/providers/global-commands-provider'
import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider'
-import { useContextMenu } from '@/app/workspace/[workspaceId]/w/components/sidebar/hooks'
import { usePinItem, usePinnedIds, useUnpinItem } from '@/hooks/queries/pinned-items'
import { useWorkspaceMembersQuery, type WorkspaceMember } from '@/hooks/queries/workspace'
import {
@@ -147,6 +146,7 @@ import {
useUploadWorkspaceFile,
useWorkspaceFiles,
} from '@/hooks/queries/workspace-files'
+import { useContextMenu } from '@/hooks/use-context-menu'
import { useDebouncedSearchSetter } from '@/hooks/use-debounced-search-setter'
import { useInlineRename } from '@/hooks/use-inline-rename'
import { usePermissionConfig } from '@/hooks/use-permission-config'
diff --git a/apps/sim/app/workspace/[workspaceId]/home/components/mothership-view/components/resource-content/components/terminal-session/terminal-session.tsx b/apps/sim/app/workspace/[workspaceId]/home/components/mothership-view/components/resource-content/components/terminal-session/terminal-session.tsx
index e6ffdb0eaa7..badaa075443 100644
--- a/apps/sim/app/workspace/[workspaceId]/home/components/mothership-view/components/resource-content/components/terminal-session/terminal-session.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/home/components/mothership-view/components/resource-content/components/terminal-session/terminal-session.tsx
@@ -34,6 +34,7 @@ import { WebLinksAddon } from '@xterm/addon-web-links'
import { WebglAddon } from '@xterm/addon-webgl'
import { type IBufferRange, Terminal } from '@xterm/xterm'
import { useTheme } from 'next-themes'
+import { useContextMenu } from '@/hooks/use-context-menu'
import '@xterm/xterm/css/xterm.css'
import {
describeRunningCommand,
@@ -73,7 +74,6 @@ import { useMothershipResources } from '@/app/workspace/[workspaceId]/home/compo
import { TerminalContextMenu } from '@/app/workspace/[workspaceId]/home/components/mothership-view/components/resource-content/components/terminal-session/terminal-context-menu'
import { TerminalTabIcon } from '@/app/workspace/[workspaceId]/home/components/mothership-view/components/resource-content/components/terminal-session/terminal-tab-icon'
import { ContextMenu } from '@/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/components/context-menu/context-menu'
-import { useContextMenu } from '@/app/workspace/[workspaceId]/w/components/sidebar/hooks'
import { useDesktopPreferenceMutation } from '@/hooks/use-desktop-preference-mutation'
import { useCopilotTerminalStore } from '@/stores/copilot-terminal/store'
import type { ChatContext, TerminalTextSelection } from '@/stores/panel'
diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/chunk-editor/chunk-editor.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/chunk-editor/chunk-editor.tsx
index fd6e1f23667..db86183c216 100644
--- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/chunk-editor/chunk-editor.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/chunk-editor/chunk-editor.tsx
@@ -6,7 +6,7 @@ import { isApiClientError } from '@/lib/api/client/errors'
import { requestJson } from '@/lib/api/client/request'
import { getKnowledgeChunkContract } from '@/lib/api/contracts/knowledge'
import type { ChunkData, DocumentData } from '@/lib/knowledge/types'
-import { getAccurateTokenCount, getTokenStrings } from '@/lib/tokenization/estimators'
+import { getAccurateTokenCount, getTokenStrings } from '@/lib/tokenization/accurate'
import { useCreateChunk, useUpdateChunk } from '@/hooks/queries/kb/knowledge'
import { useAutosave } from '@/hooks/use-autosave'
diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/document.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/document.tsx
index 3edc0720140..2c381a7cf1f 100644
--- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/document.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/document.tsx
@@ -59,7 +59,6 @@ import {
import { ActionBar } from '@/app/workspace/[workspaceId]/knowledge/[id]/components'
import { getDocumentIcon } from '@/app/workspace/[workspaceId]/knowledge/components'
import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider'
-import { useContextMenu } from '@/app/workspace/[workspaceId]/w/components/sidebar/hooks'
import { CONNECTOR_META_REGISTRY } from '@/connectors/registry'
import { useDocument, useDocumentChunks, useKnowledgeBase } from '@/hooks/kb/use-knowledge'
import {
@@ -69,6 +68,7 @@ import {
useUpdateChunk,
useUpdateDocument,
} from '@/hooks/queries/kb/knowledge'
+import { useContextMenu } from '@/hooks/use-context-menu'
import { useDebounce } from '@/hooks/use-debounce'
import { useDebouncedSearchSetter } from '@/hooks/use-debounced-search-setter'
import { useInlineRename } from '@/hooks/use-inline-rename'
diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/base.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/base.tsx
index 1a29f058115..76a061a032d 100644
--- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/base.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/base.tsx
@@ -97,7 +97,6 @@ import {
import { getDocumentIcon } from '@/app/workspace/[workspaceId]/knowledge/components'
import { useRegisterGlobalCommands } from '@/app/workspace/[workspaceId]/providers/global-commands-provider'
import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider'
-import { useContextMenu } from '@/app/workspace/[workspaceId]/w/components/sidebar/hooks'
import { BrandIcon } from '@/blocks/brand-icon'
import { CONNECTOR_META_REGISTRY } from '@/connectors/registry'
import {
@@ -119,6 +118,7 @@ import {
useUpdateDocument,
useUpdateKnowledgeBase,
} from '@/hooks/queries/kb/knowledge'
+import { useContextMenu } from '@/hooks/use-context-menu'
import { useDebounce } from '@/hooks/use-debounce'
import { useDebouncedSearchSetter } from '@/hooks/use-debounced-search-setter'
import { useInlineRename } from '@/hooks/use-inline-rename'
diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/knowledge.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/knowledge.tsx
index 6176f1abe9b..8ed1934a1a2 100644
--- a/apps/sim/app/workspace/[workspaceId]/knowledge/knowledge.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/knowledge/knowledge.tsx
@@ -79,7 +79,6 @@ import {
} from '@/app/workspace/[workspaceId]/knowledge/search-params'
import { useRegisterGlobalCommands } from '@/app/workspace/[workspaceId]/providers/global-commands-provider'
import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider'
-import { useContextMenu } from '@/app/workspace/[workspaceId]/w/components/sidebar/hooks'
import { BrandIcon } from '@/blocks/brand-icon'
import { CONNECTOR_META_REGISTRY } from '@/connectors/registry'
import { useKnowledgeBasesList } from '@/hooks/kb/use-knowledge'
@@ -92,6 +91,7 @@ import {
} from '@/hooks/queries/kb/knowledge'
import { usePinItem, usePinnedIds, useUnpinItem } from '@/hooks/queries/pinned-items'
import { useWorkspaceMembersQuery, type WorkspaceMember } from '@/hooks/queries/workspace'
+import { useContextMenu } from '@/hooks/use-context-menu'
import { useDebouncedSearchSetter } from '@/hooks/use-debounced-search-setter'
import { useInlineRename } from '@/hooks/use-inline-rename'
import { usePermissionConfig } from '@/hooks/use-permission-config'
diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/dashboard/components/workflows-list/workflows-list.tsx b/apps/sim/app/workspace/[workspaceId]/logs/components/dashboard/components/workflows-list/workflows-list.tsx
index e46027442d5..3dae7eee182 100644
--- a/apps/sim/app/workspace/[workspaceId]/logs/components/dashboard/components/workflows-list/workflows-list.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/logs/components/dashboard/components/workflows-list/workflows-list.tsx
@@ -1,8 +1,8 @@
import { memo } from 'react'
import { cn, handleKeyboardActivation } from '@sim/emcn'
import { Workflow } from '@sim/emcn/icons'
+import { DELETED_WORKFLOW_LABEL } from '@/lib/workflows/workflow-labels'
import { FloatingOverflowText } from '@/app/workspace/[workspaceId]/components'
-import { DELETED_WORKFLOW_LABEL } from '@/app/workspace/[workspaceId]/logs/utils'
import { StatusBar, type StatusBarSegment } from '..'
export interface WorkflowExecutionItem {
diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/log-details/log-details.tsx b/apps/sim/app/workspace/[workspaceId]/logs/components/log-details/log-details.tsx
index 7a8c9506a5e..33adb2639ff 100644
--- a/apps/sim/app/workspace/[workspaceId]/logs/components/log-details/log-details.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/logs/components/log-details/log-details.tsx
@@ -47,6 +47,7 @@ import { MothershipHandoffStorage } from '@/lib/core/utils/browser-storage'
import { filterHiddenOutputKeys } from '@/lib/logs/execution/trace-spans/trace-spans'
import type { TraceSpan } from '@/lib/logs/types'
import { sendMothershipMessage } from '@/lib/mothership/events'
+import { DELETED_WORKFLOW_LABEL } from '@/lib/workflows/workflow-labels'
import {
ExecutionSnapshot,
FileCards,
@@ -58,7 +59,6 @@ import {
logDetailsTabUrlKeys,
} from '@/app/workspace/[workspaceId]/logs/search-params'
import {
- DELETED_WORKFLOW_LABEL,
formatDate,
getDisplayStatus,
resolveLogWorkflowId,
diff --git a/apps/sim/app/workspace/[workspaceId]/logs/logs.tsx b/apps/sim/app/workspace/[workspaceId]/logs/logs.tsx
index d49b7a691fa..054a9e5ae03 100644
--- a/apps/sim/app/workspace/[workspaceId]/logs/logs.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/logs/logs.tsx
@@ -49,6 +49,7 @@ import {
type WorkflowData,
} from '@/lib/logs/search-suggestions'
import { SEARCH_DEBOUNCE_MS } from '@/lib/url-state'
+import { DELETED_WORKFLOW_LABEL } from '@/lib/workflows/workflow-labels'
import type {
FilterTag,
ResourceAction,
@@ -94,7 +95,6 @@ import { useFilterStore } from '@/stores/logs/filters/store'
import { CORE_TRIGGER_TYPES } from '@/stores/logs/filters/types'
import { Dashboard, ExecutionSnapshot, LogDetails, LogRowContextMenu } from './components'
import {
- DELETED_WORKFLOW_LABEL,
formatDate,
getDisplayStatus,
type LogStatus,
diff --git a/apps/sim/app/workspace/[workspaceId]/logs/utils.ts b/apps/sim/app/workspace/[workspaceId]/logs/utils.ts
index 05820985af3..4736430b5b2 100644
--- a/apps/sim/app/workspace/[workspaceId]/logs/utils.ts
+++ b/apps/sim/app/workspace/[workspaceId]/logs/utils.ts
@@ -15,8 +15,6 @@ export const LOG_COLUMNS = {
duration: { width: 'w-[20%]', minWidth: 'min-w-[100px]', label: 'Duration' },
} as const
-export const DELETED_WORKFLOW_LABEL = 'Deleted Workflow'
-
/**
* Resolves the workflow a log row points at, or null when there is nowhere to
* navigate. Sim agent jobs have no workflow of their own, and a deleted
diff --git a/apps/sim/app/workspace/[workspaceId]/settings/secrets/[credentialId]/components/secret-usage-panel/secret-usage-panel.tsx b/apps/sim/app/workspace/[workspaceId]/settings/secrets/[credentialId]/components/secret-usage-panel/secret-usage-panel.tsx
index ea94acb2b74..1e59583d091 100644
--- a/apps/sim/app/workspace/[workspaceId]/settings/secrets/[credentialId]/components/secret-usage-panel/secret-usage-panel.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/settings/secrets/[credentialId]/components/secret-usage-panel/secret-usage-panel.tsx
@@ -5,8 +5,9 @@ import { ChipLink } from '@sim/emcn'
import { formatDateTime } from '@sim/utils/formatting'
import { SettingsActionChip } from '@/components/settings/settings-header'
import type { SecretUsageEntryPayload, SecretUsageScope } from '@/lib/api/contracts'
+import { DELETED_WORKFLOW_LABEL } from '@/lib/workflows/workflow-labels'
import { FloatingOverflowText } from '@/app/workspace/[workspaceId]/components'
-import { DELETED_WORKFLOW_LABEL, TriggerBadge } from '@/app/workspace/[workspaceId]/logs/utils'
+import { TriggerBadge } from '@/app/workspace/[workspaceId]/logs/utils'
import {
ActivityLog,
type ActivityLogEntry,
diff --git a/apps/sim/app/workspace/[workspaceId]/tables/tables.tsx b/apps/sim/app/workspace/[workspaceId]/tables/tables.tsx
index b5ffc797b04..c6d3c51f10f 100644
--- a/apps/sim/app/workspace/[workspaceId]/tables/tables.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/tables/tables.tsx
@@ -77,7 +77,6 @@ import {
tablesSortParams,
tablesUrlKeys,
} from '@/app/workspace/[workspaceId]/tables/search-params'
-import { useContextMenu } from '@/app/workspace/[workspaceId]/w/components/sidebar/hooks'
import { useCreateFolder, useDeleteFolderMutation, useUpdateFolder } from '@/hooks/queries/folders'
import { usePinItem, usePinnedIds, useUnpinItem } from '@/hooks/queries/pinned-items'
import {
@@ -93,6 +92,7 @@ import {
} from '@/hooks/queries/tables'
import { getCanonicalFolderPath } from '@/hooks/queries/utils/folder-tree'
import { useWorkspaceMembersQuery, type WorkspaceMember } from '@/hooks/queries/workspace'
+import { useContextMenu } from '@/hooks/use-context-menu'
import { useDebouncedSearchSetter } from '@/hooks/use-debounced-search-setter'
import { useInlineRename } from '@/hooks/use-inline-rename'
import { usePermissionConfig } from '@/hooks/use-permission-config'
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/workflow-selector/workflow-selector-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/workflow-selector/workflow-selector-input.tsx
index 4d1266b273f..c92fe8dc311 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/workflow-selector/workflow-selector-input.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/workflow-selector/workflow-selector-input.tsx
@@ -2,7 +2,7 @@
import { useMemo } from 'react'
import { useParams } from 'next/navigation'
-import { DELETED_WORKFLOW_LABEL } from '@/app/workspace/[workspaceId]/logs/utils'
+import { DELETED_WORKFLOW_LABEL } from '@/lib/workflows/workflow-labels'
import { SelectorCombobox } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/selector-combobox/selector-combobox'
import type { SubBlockConfig } from '@/blocks/types'
import type { SelectorContext } from '@/hooks/selectors/types'
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/terminal/components/output-panel/output-panel.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/terminal/components/output-panel/output-panel.tsx
index 8582f06c58e..5cf8d3fb57f 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/terminal/components/output-panel/output-panel.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/terminal/components/output-panel/output-panel.tsx
@@ -34,8 +34,8 @@ import {
StructuredOutput,
} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/terminal/components/output-panel/components'
import { ToggleButton } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/terminal/components/toggle-button'
-import { useContextMenu } from '@/app/workspace/[workspaceId]/w/components/sidebar/hooks'
import { useCodeViewerFeatures } from '@/hooks/use-code-viewer'
+import { useContextMenu } from '@/hooks/use-context-menu'
import type { ConsoleEntry } from '@/stores/terminal'
import { safeConsoleStringify, useTerminalStore } from '@/stores/terminal'
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/terminal/terminal.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/terminal/terminal.tsx
index adbffa83d00..ee8e48aa4b0 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/terminal/terminal.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/terminal/terminal.tsx
@@ -47,7 +47,7 @@ import {
TERMINAL_CONFIG,
type VisibleTerminalRow,
} from '@/app/workspace/[workspaceId]/w/[workflowId]/components/terminal/utils'
-import { useContextMenu } from '@/app/workspace/[workspaceId]/w/components/sidebar/hooks'
+import { useContextMenu } from '@/hooks/use-context-menu'
import { OUTPUT_PANEL_WIDTH, TERMINAL_HEIGHT } from '@/stores/constants'
import type { ConsoleEntry } from '@/stores/terminal'
import {
diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/preview/components/preview-editor/preview-editor.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/preview/components/preview-editor/preview-editor.tsx
index e7dd73f90ce..6bb5e293f16 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/components/preview/components/preview-editor/preview-editor.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/components/preview/components/preview-editor/preview-editor.tsx
@@ -37,11 +37,10 @@ import {
isSubBlockVisibleForMode,
isToolInputOnlySubBlock,
} from '@/lib/workflows/subblocks/visibility'
-import { DELETED_WORKFLOW_LABEL } from '@/app/workspace/[workspaceId]/logs/utils'
+import { DELETED_WORKFLOW_LABEL } from '@/lib/workflows/workflow-labels'
import { SubBlock } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components'
import { PreviewContextMenu } from '@/app/workspace/[workspaceId]/w/components/preview/components/preview-context-menu'
import { PreviewWorkflow } from '@/app/workspace/[workspaceId]/w/components/preview/components/preview-workflow'
-import { useContextMenu } from '@/app/workspace/[workspaceId]/w/components/sidebar/hooks'
import { getBlock } from '@/blocks'
import { BlockTile } from '@/blocks/block-tile'
import type { BlockConfig, SubBlockConfig, SubBlockType } from '@/blocks/types'
@@ -49,6 +48,7 @@ import { normalizeName } from '@/executor/constants'
import { navigatePath } from '@/executor/variables/resolvers/reference'
import { useWorkflowState } from '@/hooks/queries/workflows'
import { useCodeViewerFeatures } from '@/hooks/use-code-viewer'
+import { useContextMenu } from '@/hooks/use-context-menu'
import type { BlockState, Loop, Parallel, WorkflowState } from '@/stores/workflows/workflow/types'
/**
diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/components/folder-item/folder-item.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/components/folder-item/folder-item.tsx
index 34032ed3f25..0cc55efc27c 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/components/folder-item/folder-item.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/components/folder-item/folder-item.tsx
@@ -13,7 +13,6 @@ import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/provide
import { ContextMenu } from '@/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/components/context-menu/context-menu'
import { DeleteModal } from '@/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/components/delete-modal/delete-modal'
import {
- useContextMenu,
useFolderExpand,
useItemDrag,
useItemRename,
@@ -41,6 +40,7 @@ import {
} from '@/hooks/queries/utils/folder-tree'
import { getWorkflows } from '@/hooks/queries/utils/workflow-cache'
import { useCreateWorkflow } from '@/hooks/queries/workflows'
+import { useContextMenu } from '@/hooks/use-context-menu'
import { useFolderStore } from '@/stores/folders/store'
import type { FolderTreeNode } from '@/stores/folders/types'
import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/components/workflow-item/workflow-item.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/components/workflow-item/workflow-item.tsx
index 5eb559647d7..472e967cc9d 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/components/workflow-item/workflow-item.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/components/workflow-item/workflow-item.tsx
@@ -11,7 +11,6 @@ import { ContextMenu } from '@/app/workspace/[workspaceId]/w/components/sidebar/
import { DeleteModal } from '@/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/components/delete-modal/delete-modal'
import { Avatars } from '@/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/components/workflow-item/avatars/avatars'
import {
- useContextMenu,
useItemDrag,
useItemRename,
useSidebarListContext,
@@ -37,6 +36,7 @@ import {
} from '@/hooks/queries/utils/folder-tree'
import { getWorkflows } from '@/hooks/queries/utils/workflow-cache'
import { useUpdateWorkflow } from '@/hooks/queries/workflows'
+import { useContextMenu } from '@/hooks/use-context-menu'
import { useFolderStore } from '@/stores/folders/store'
import type { WorkflowMetadata } from '@/stores/workflows/registry/types'
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 0110c116536..0ae374bc2c6 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
@@ -9,7 +9,6 @@ import { FolderItem } from '@/app/workspace/[workspaceId]/w/components/sidebar/c
import { WorkflowItem } from '@/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/components/workflow-item/workflow-item'
import {
SidebarListContext,
- useContextMenu,
useDragDrop,
useFolderSelection,
useSidebarListContextValue,
@@ -20,6 +19,7 @@ import {
groupWorkflowsByFolder,
} from '@/app/workspace/[workspaceId]/w/components/sidebar/utils'
import { useFolderMap, useFolders } from '@/hooks/queries/folders'
+import { useContextMenu } from '@/hooks/use-context-menu'
import { useFolderStore } from '@/stores/folders/store'
import type { FolderTreeNode } from '@/stores/folders/types'
import type { WorkflowMetadata } from '@/stores/workflows/registry/types'
diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/hooks/index.ts b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/hooks/index.ts
index a9f5875e5c4..abd21345589 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/hooks/index.ts
+++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/hooks/index.ts
@@ -1,6 +1,5 @@
export { useAutoScroll } from './use-auto-scroll'
export { useChatSelection } from './use-chat-selection'
-export { useContextMenu } from './use-context-menu'
export { type DropIndicator, useDragDrop } from './use-drag-drop'
export { useFlyoutInlineRename } from './use-flyout-inline-rename'
export { useFolderExpand } from './use-folder-expand'
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 c5e8d34319a..47fc7095c30 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsx
@@ -84,7 +84,6 @@ import {
} from '@/app/workspace/[workspaceId]/w/components/sidebar/constants'
import {
useChatSelection,
- useContextMenu,
useFlyoutInlineRename,
useFolderOperations,
useHoverMenu,
@@ -115,6 +114,7 @@ import {
} from '@/hooks/queries/mothership-chats'
import { useUpdateWorkflow } from '@/hooks/queries/workflows'
import type { Workspace } from '@/hooks/queries/workspace'
+import { useContextMenu } from '@/hooks/use-context-menu'
import { useMothershipChatEvents } from '@/hooks/use-mothership-chat-events'
import { usePermissionConfig } from '@/hooks/use-permission-config'
import { useSettingsNavigation } from '@/hooks/use-settings-navigation'
diff --git a/apps/sim/executor/handlers/agent/memory.test.ts b/apps/sim/executor/handlers/agent/memory.test.ts
index 9a1186b7a4b..465dec67f15 100644
--- a/apps/sim/executor/handlers/agent/memory.test.ts
+++ b/apps/sim/executor/handlers/agent/memory.test.ts
@@ -33,7 +33,7 @@ const mockMemoryLogger = vi.mocked(loggerMock.createLogger).mock.results[
vi.mocked(loggerMock.createLogger).mock.calls.findIndex(([name]) => name === 'Memory')
].value
-vi.mock('@/lib/tokenization/estimators', () => ({
+vi.mock('@/lib/tokenization/accurate', () => ({
getAccurateTokenCount: vi.fn((text: string) => {
return Math.ceil(text.length / 4)
}),
diff --git a/apps/sim/executor/handlers/agent/memory.ts b/apps/sim/executor/handlers/agent/memory.ts
index b33d86b0b94..2498aba5dd0 100644
--- a/apps/sim/executor/handlers/agent/memory.ts
+++ b/apps/sim/executor/handlers/agent/memory.ts
@@ -20,7 +20,7 @@ import {
readBoundMemorySecretProvenance,
replaceMemorySecretProvenanceInTx,
} from '@/lib/memory/secret-provenance'
-import { getAccurateTokenCount } from '@/lib/tokenization/estimators'
+import { getAccurateTokenCount } from '@/lib/tokenization/accurate'
import { MEMORY } from '@/executor/constants'
import type { AgentInputs, Message } from '@/executor/handlers/agent/types'
import type { ExecutionContext } from '@/executor/types'
diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/hooks/use-context-menu.ts b/apps/sim/hooks/use-context-menu.ts
similarity index 100%
rename from apps/sim/app/workspace/[workspaceId]/w/components/sidebar/hooks/use-context-menu.ts
rename to apps/sim/hooks/use-context-menu.ts
diff --git a/apps/sim/lib/embeddings/client.ts b/apps/sim/lib/embeddings/client.ts
index 825f96d8b6c..28bfe63ccfc 100644
--- a/apps/sim/lib/embeddings/client.ts
+++ b/apps/sim/lib/embeddings/client.ts
@@ -33,7 +33,8 @@ import {
isRetryableError,
retryWithExponentialBackoff,
} from '@/lib/knowledge/documents/utils'
-import { batchByTokenLimit, estimateTokenCount, truncateToTokenLimit } from '@/lib/tokenization'
+import { estimateTokenCount } from '@/lib/tokenization'
+import { batchByTokenLimit, truncateToTokenLimit } from '@/lib/tokenization/accurate'
const logger = createLogger('EmbeddingClient')
diff --git a/apps/sim/lib/tokenization/accurate.ts b/apps/sim/lib/tokenization/accurate.ts
new file mode 100644
index 00000000000..160196f7a4d
--- /dev/null
+++ b/apps/sim/lib/tokenization/accurate.ts
@@ -0,0 +1,186 @@
+/**
+ * Exact token counting backed by `js-tiktoken`.
+ *
+ * Split out of `estimators.ts` because `js-tiktoken` embeds every BPE rank table
+ * (5.4 MB of source, 2.5 MB over the wire). `estimators.ts` is reached from the
+ * workflow editor through `tokenization/index` -> `calculators` -> `estimators`,
+ * so a static import there put the whole tokenizer on the critical path of a
+ * route that only needs the character-heuristic estimators. Callers that need an
+ * exact count import this module directly; nothing re-exports it from the
+ * barrel, which is what keeps it out of the shared client chunk.
+ */
+
+import { createLogger } from '@sim/logger'
+import { encodingForModel, type Tiktoken } from 'js-tiktoken'
+
+const logger = createLogger('TokenizationAccurate')
+
+const encodingCache = new Map()
+
+/**
+ * Get or create a cached encoding for a model
+ */
+function getEncoding(modelName: string): Tiktoken {
+ if (encodingCache.has(modelName)) {
+ return encodingCache.get(modelName)!
+ }
+
+ try {
+ const encoding = encodingForModel(modelName as Parameters[0])
+ encodingCache.set(modelName, encoding)
+ return encoding
+ } catch (error) {
+ logger.warn(`Failed to get encoding for model ${modelName}, falling back to cl100k_base`)
+ const encoding = encodingForModel('gpt-4')
+ encodingCache.set(modelName, encoding)
+ return encoding
+ }
+}
+
+if (typeof process !== 'undefined') {
+ process.on('beforeExit', () => {
+ clearEncodingCache()
+ })
+}
+
+/**
+ * Get accurate token count for text using tiktoken
+ * This is the exact count OpenAI's API will use
+ */
+export function getAccurateTokenCount(text: string, modelName = 'text-embedding-3-small'): number {
+ if (!text || text.length === 0) {
+ return 0
+ }
+
+ try {
+ const encoding = getEncoding(modelName)
+ const tokens = encoding.encode(text)
+ return tokens.length
+ } catch (error) {
+ logger.error('Error counting tokens with tiktoken:', error)
+ return Math.ceil(text.length / 4)
+ }
+}
+
+/**
+ * Get individual tokens as strings for visualization
+ * Returns an array of token strings that can be displayed with colors
+ */
+export function getTokenStrings(text: string, modelName = 'text-embedding-3-small'): string[] {
+ if (!text || text.length === 0) {
+ return []
+ }
+
+ try {
+ const encoding = getEncoding(modelName)
+ const tokenIds = encoding.encode(text)
+
+ const textChars = [...text]
+ const result: string[] = []
+ let prevCharCount = 0
+
+ for (let i = 0; i < tokenIds.length; i++) {
+ const decoded = encoding.decode(tokenIds.slice(0, i + 1))
+ const currentCharCount = [...decoded].length
+ const tokenCharCount = currentCharCount - prevCharCount
+
+ const tokenStr = textChars.slice(prevCharCount, prevCharCount + tokenCharCount).join('')
+ result.push(tokenStr)
+ prevCharCount = currentCharCount
+ }
+
+ return result
+ } catch (error) {
+ logger.error('Error getting token strings:', error)
+ return text.split(/(\s+)/).filter((s) => s.length > 0)
+ }
+}
+
+/**
+ * Truncate text to a maximum token count
+ * Useful for handling texts that exceed model limits
+ */
+export function truncateToTokenLimit(
+ text: string,
+ maxTokens: number,
+ modelName = 'text-embedding-3-small'
+): string {
+ if (!text || maxTokens <= 0) {
+ return ''
+ }
+
+ try {
+ const encoding = getEncoding(modelName)
+ const tokens = encoding.encode(text)
+
+ if (tokens.length <= maxTokens) {
+ return text
+ }
+
+ const truncatedTokens = tokens.slice(0, maxTokens)
+ const truncatedText = encoding.decode(truncatedTokens)
+
+ logger.warn(
+ `Truncated text from ${tokens.length} to ${maxTokens} tokens (${text.length} to ${truncatedText.length} chars)`
+ )
+
+ return truncatedText
+ } catch (error) {
+ logger.error('Error truncating text:', error)
+ const maxChars = maxTokens * 4
+ return text.slice(0, maxChars)
+ }
+}
+
+/**
+ * Batch texts by token count to stay within API limits
+ * Returns array of batches where each batch's total tokens <= maxTokensPerBatch
+ */
+export function batchByTokenLimit(
+ texts: string[],
+ maxTokensPerBatch: number,
+ modelName = 'text-embedding-3-small'
+): string[][] {
+ const batches: string[][] = []
+ let currentBatch: string[] = []
+ let currentTokenCount = 0
+
+ for (const text of texts) {
+ const tokenCount = getAccurateTokenCount(text, modelName)
+
+ if (tokenCount > maxTokensPerBatch) {
+ if (currentBatch.length > 0) {
+ batches.push(currentBatch)
+ currentBatch = []
+ currentTokenCount = 0
+ }
+
+ const truncated = truncateToTokenLimit(text, maxTokensPerBatch, modelName)
+ batches.push([truncated])
+ continue
+ }
+
+ if (currentBatch.length > 0 && currentTokenCount + tokenCount > maxTokensPerBatch) {
+ batches.push(currentBatch)
+ currentBatch = [text]
+ currentTokenCount = tokenCount
+ } else {
+ currentBatch.push(text)
+ currentTokenCount += tokenCount
+ }
+ }
+
+ if (currentBatch.length > 0) {
+ batches.push(currentBatch)
+ }
+
+ return batches
+}
+
+/**
+ * Clean up cached encodings (call when shutting down)
+ */
+export function clearEncodingCache(): void {
+ encodingCache.clear()
+ logger.info('Cleared tiktoken encoding cache')
+}
diff --git a/apps/sim/lib/tokenization/estimators.ts b/apps/sim/lib/tokenization/estimators.ts
index 01aed1c1e6d..7e3dac06d13 100644
--- a/apps/sim/lib/tokenization/estimators.ts
+++ b/apps/sim/lib/tokenization/estimators.ts
@@ -1,185 +1,12 @@
/**
- * Token estimation and accurate counting functions for different providers
+ * Character-heuristic token estimation. Exact, tokenizer-backed counting lives
+ * in `@/lib/tokenization/accurate`.
*/
-import { createLogger } from '@sim/logger'
-import { encodingForModel, type Tiktoken } from 'js-tiktoken'
import { MIN_TEXT_LENGTH_FOR_ESTIMATION, TOKENIZATION_CONFIG } from '@/lib/tokenization/constants'
import type { TokenEstimate } from '@/lib/tokenization/types'
import { getProviderConfig } from '@/lib/tokenization/utils'
-const logger = createLogger('TokenizationEstimators')
-
-const encodingCache = new Map()
-
-/**
- * Get or create a cached encoding for a model
- */
-function getEncoding(modelName: string): Tiktoken {
- if (encodingCache.has(modelName)) {
- return encodingCache.get(modelName)!
- }
-
- try {
- const encoding = encodingForModel(modelName as Parameters[0])
- encodingCache.set(modelName, encoding)
- return encoding
- } catch (error) {
- logger.warn(`Failed to get encoding for model ${modelName}, falling back to cl100k_base`)
- const encoding = encodingForModel('gpt-4')
- encodingCache.set(modelName, encoding)
- return encoding
- }
-}
-
-if (typeof process !== 'undefined') {
- process.on('beforeExit', () => {
- clearEncodingCache()
- })
-}
-
-/**
- * Get accurate token count for text using tiktoken
- * This is the exact count OpenAI's API will use
- */
-export function getAccurateTokenCount(text: string, modelName = 'text-embedding-3-small'): number {
- if (!text || text.length === 0) {
- return 0
- }
-
- try {
- const encoding = getEncoding(modelName)
- const tokens = encoding.encode(text)
- return tokens.length
- } catch (error) {
- logger.error('Error counting tokens with tiktoken:', error)
- return Math.ceil(text.length / 4)
- }
-}
-
-/**
- * Get individual tokens as strings for visualization
- * Returns an array of token strings that can be displayed with colors
- */
-export function getTokenStrings(text: string, modelName = 'text-embedding-3-small'): string[] {
- if (!text || text.length === 0) {
- return []
- }
-
- try {
- const encoding = getEncoding(modelName)
- const tokenIds = encoding.encode(text)
-
- const textChars = [...text]
- const result: string[] = []
- let prevCharCount = 0
-
- for (let i = 0; i < tokenIds.length; i++) {
- const decoded = encoding.decode(tokenIds.slice(0, i + 1))
- const currentCharCount = [...decoded].length
- const tokenCharCount = currentCharCount - prevCharCount
-
- const tokenStr = textChars.slice(prevCharCount, prevCharCount + tokenCharCount).join('')
- result.push(tokenStr)
- prevCharCount = currentCharCount
- }
-
- return result
- } catch (error) {
- logger.error('Error getting token strings:', error)
- return text.split(/(\s+)/).filter((s) => s.length > 0)
- }
-}
-
-/**
- * Truncate text to a maximum token count
- * Useful for handling texts that exceed model limits
- */
-export function truncateToTokenLimit(
- text: string,
- maxTokens: number,
- modelName = 'text-embedding-3-small'
-): string {
- if (!text || maxTokens <= 0) {
- return ''
- }
-
- try {
- const encoding = getEncoding(modelName)
- const tokens = encoding.encode(text)
-
- if (tokens.length <= maxTokens) {
- return text
- }
-
- const truncatedTokens = tokens.slice(0, maxTokens)
- const truncatedText = encoding.decode(truncatedTokens)
-
- logger.warn(
- `Truncated text from ${tokens.length} to ${maxTokens} tokens (${text.length} to ${truncatedText.length} chars)`
- )
-
- return truncatedText
- } catch (error) {
- logger.error('Error truncating text:', error)
- const maxChars = maxTokens * 4
- return text.slice(0, maxChars)
- }
-}
-
-/**
- * Batch texts by token count to stay within API limits
- * Returns array of batches where each batch's total tokens <= maxTokensPerBatch
- */
-export function batchByTokenLimit(
- texts: string[],
- maxTokensPerBatch: number,
- modelName = 'text-embedding-3-small'
-): string[][] {
- const batches: string[][] = []
- let currentBatch: string[] = []
- let currentTokenCount = 0
-
- for (const text of texts) {
- const tokenCount = getAccurateTokenCount(text, modelName)
-
- if (tokenCount > maxTokensPerBatch) {
- if (currentBatch.length > 0) {
- batches.push(currentBatch)
- currentBatch = []
- currentTokenCount = 0
- }
-
- const truncated = truncateToTokenLimit(text, maxTokensPerBatch, modelName)
- batches.push([truncated])
- continue
- }
-
- if (currentBatch.length > 0 && currentTokenCount + tokenCount > maxTokensPerBatch) {
- batches.push(currentBatch)
- currentBatch = [text]
- currentTokenCount = tokenCount
- } else {
- currentBatch.push(text)
- currentTokenCount += tokenCount
- }
- }
-
- if (currentBatch.length > 0) {
- batches.push(currentBatch)
- }
-
- return batches
-}
-
-/**
- * Clean up cached encodings (call when shutting down)
- */
-export function clearEncodingCache(): void {
- encodingCache.clear()
- logger.info('Cleared tiktoken encoding cache')
-}
-
/**
* Estimates token count for text using provider-specific heuristics
*/
diff --git a/apps/sim/lib/tokenization/index.ts b/apps/sim/lib/tokenization/index.ts
index 1093aa97a2c..32750225ad5 100644
--- a/apps/sim/lib/tokenization/index.ts
+++ b/apps/sim/lib/tokenization/index.ts
@@ -5,14 +5,16 @@ export {
} from '@/lib/tokenization/calculators'
export { LLM_BLOCK_TYPES, TOKENIZATION_CONFIG } from '@/lib/tokenization/constants'
export { createTokenizationError, TokenizationError } from '@/lib/tokenization/errors'
+/**
+ * The exact, `js-tiktoken`-backed counters are deliberately NOT re-exported here.
+ * Re-exporting them would put the tokenizer's 5.4 MB of BPE rank tables back into
+ * every client graph that touches this barrel. Import `@/lib/tokenization/accurate`
+ * directly when an exact count is required.
+ */
export {
- batchByTokenLimit,
- clearEncodingCache,
estimateInputTokens,
estimateOutputTokens,
estimateTokenCount,
- getAccurateTokenCount,
- truncateToTokenLimit,
} from '@/lib/tokenization/estimators'
export { processStreamingBlockLog, processStreamingBlockLogs } from '@/lib/tokenization/streaming'
export {
diff --git a/apps/sim/lib/webhooks/providers/gong-config.ts b/apps/sim/lib/webhooks/providers/gong-config.ts
new file mode 100644
index 00000000000..5535a458bb6
--- /dev/null
+++ b/apps/sim/lib/webhooks/providers/gong-config.ts
@@ -0,0 +1,9 @@
+/**
+ * Provider-config keys for the Gong webhook trigger.
+ *
+ * Separate from `providers/gong.ts` for the same reason as
+ * `salesforce-payload.ts`: the Gong trigger definition is client-reachable
+ * through the trigger registry, and the provider module reaches `@sim/security`
+ * -> `node:crypto`, which Next polyfills to `crypto-browserify` in the browser.
+ */
+export const GONG_JWT_PUBLIC_KEY_CONFIG_KEY = 'gongJwtPublicKeyPem'
diff --git a/apps/sim/lib/webhooks/providers/gong.test.ts b/apps/sim/lib/webhooks/providers/gong.test.ts
index d6841cf6194..fd139d07c70 100644
--- a/apps/sim/lib/webhooks/providers/gong.test.ts
+++ b/apps/sim/lib/webhooks/providers/gong.test.ts
@@ -3,11 +3,11 @@ import * as jose from 'jose'
import { NextRequest } from 'next/server'
import { describe, expect, it } from 'vitest'
import {
- GONG_JWT_PUBLIC_KEY_CONFIG_KEY,
gongHandler,
normalizeGongPublicKeyPem,
verifyGongJwtAuth,
} from '@/lib/webhooks/providers/gong'
+import { GONG_JWT_PUBLIC_KEY_CONFIG_KEY } from '@/lib/webhooks/providers/gong-config'
describe('normalizeGongPublicKeyPem', () => {
it('passes through PEM', () => {
diff --git a/apps/sim/lib/webhooks/providers/gong.ts b/apps/sim/lib/webhooks/providers/gong.ts
index 399e9074d20..609b595be90 100644
--- a/apps/sim/lib/webhooks/providers/gong.ts
+++ b/apps/sim/lib/webhooks/providers/gong.ts
@@ -3,6 +3,7 @@ import { sha256Hex } from '@sim/security/hash'
import { toError } from '@sim/utils/errors'
import * as jose from 'jose'
import { NextResponse } from 'next/server'
+import { GONG_JWT_PUBLIC_KEY_CONFIG_KEY } from '@/lib/webhooks/providers/gong-config'
import type {
AuthContext,
FormatInputContext,
@@ -13,7 +14,6 @@ import type {
const logger = createLogger('WebhookProvider:Gong')
/** providerConfig key: PEM or raw base64 RSA public key from Gong (Signed JWT header auth). */
-export const GONG_JWT_PUBLIC_KEY_CONFIG_KEY = 'gongJwtPublicKeyPem'
/**
* Gong automation webhooks support either URL secrecy (token in path) or a signed JWT in
diff --git a/apps/sim/lib/webhooks/providers/salesforce-payload.ts b/apps/sim/lib/webhooks/providers/salesforce-payload.ts
new file mode 100644
index 00000000000..ec10073da50
--- /dev/null
+++ b/apps/sim/lib/webhooks/providers/salesforce-payload.ts
@@ -0,0 +1,43 @@
+/**
+ * Salesforce webhook payload shape helpers.
+ *
+ * Separate from `providers/salesforce.ts` because the Salesforce *trigger*
+ * definition needs this function, and the trigger registry is client-reachable.
+ * The provider module imports `providers/utils`, which reaches `@sim/security`
+ * and therefore `node:crypto` — Next polyfills that to `crypto-browserify`
+ * (~320 KB) in the browser layer, so importing it from a trigger shipped
+ * server-only signature verification to every workspace route.
+ */
+
+import { isRecordLike } from '@sim/utils/object'
+
+export function extractSalesforceObjectTypeFromPayload(
+ body: Record
+): string | undefined {
+ const direct =
+ (typeof body.objectType === 'string' && body.objectType) ||
+ (typeof body.sobjectType === 'string' && body.sobjectType) ||
+ undefined
+ if (direct) {
+ return direct
+ }
+
+ const attrs = body.attributes as Record | undefined
+ if (typeof attrs?.type === 'string') {
+ return attrs.type
+ }
+
+ const record = body.record
+ if (isRecordLike(record)) {
+ const r = record as Record
+ if (typeof r.sobjectType === 'string') {
+ return r.sobjectType
+ }
+ const ra = r.attributes as Record | undefined
+ if (typeof ra?.type === 'string') {
+ return ra.type
+ }
+ }
+
+ return undefined
+}
diff --git a/apps/sim/lib/webhooks/providers/salesforce.ts b/apps/sim/lib/webhooks/providers/salesforce.ts
index f53dcf65f54..0331da2d260 100644
--- a/apps/sim/lib/webhooks/providers/salesforce.ts
+++ b/apps/sim/lib/webhooks/providers/salesforce.ts
@@ -1,6 +1,7 @@
import { createLogger } from '@sim/logger'
import { isRecordLike, toRecord } from '@sim/utils/object'
import { NextResponse } from 'next/server'
+import { extractSalesforceObjectTypeFromPayload } from '@/lib/webhooks/providers/salesforce-payload'
import type {
AuthContext,
EventMatchContext,
@@ -10,37 +11,6 @@ import type {
} from '@/lib/webhooks/providers/types'
import { buildFallbackDeliveryFingerprint, verifyTokenAuth } from '@/lib/webhooks/providers/utils'
-export function extractSalesforceObjectTypeFromPayload(
- body: Record
-): string | undefined {
- const direct =
- (typeof body.objectType === 'string' && body.objectType) ||
- (typeof body.sobjectType === 'string' && body.sobjectType) ||
- undefined
- if (direct) {
- return direct
- }
-
- const attrs = body.attributes as Record | undefined
- if (typeof attrs?.type === 'string') {
- return attrs.type
- }
-
- const record = body.record
- if (isRecordLike(record)) {
- const r = record as Record
- if (typeof r.sobjectType === 'string') {
- return r.sobjectType
- }
- const ra = r.attributes as Record | undefined
- if (typeof ra?.type === 'string') {
- return ra.type
- }
- }
-
- return undefined
-}
-
const logger = createLogger('WebhookProvider:Salesforce')
function verifySalesforceSharedSecret(request: Request, secret: string): boolean {
diff --git a/apps/sim/lib/workflows/subblocks/display.ts b/apps/sim/lib/workflows/subblocks/display.ts
index 37f3f1f9785..fd315db7b77 100644
--- a/apps/sim/lib/workflows/subblocks/display.ts
+++ b/apps/sim/lib/workflows/subblocks/display.ts
@@ -9,7 +9,7 @@
import { isRecordLike } from '@sim/utils/object'
import { truncate } from '@sim/utils/string'
import type { FilterRule, SortRule } from '@/lib/table/types'
-import { DELETED_WORKFLOW_LABEL } from '@/app/workspace/[workspaceId]/logs/utils'
+import { DELETED_WORKFLOW_LABEL } from '@/lib/workflows/workflow-labels'
import { getBlock } from '@/blocks'
import type { SubBlockConfig } from '@/blocks/types'
diff --git a/apps/sim/lib/workflows/workflow-labels.ts b/apps/sim/lib/workflows/workflow-labels.ts
new file mode 100644
index 00000000000..350f80f48fc
--- /dev/null
+++ b/apps/sim/lib/workflows/workflow-labels.ts
@@ -0,0 +1,10 @@
+/**
+ * Display labels for workflow references that no longer resolve.
+ *
+ * Lives in `lib/` rather than beside the logs table that first needed it because
+ * `lib/workflows/subblocks/display.ts` reads it too, and importing it from
+ * `app/workspace/[workspaceId]/logs/utils` inverted the app/lib layering while
+ * pulling React, `@sim/emcn`, and the block registry into every consumer of that
+ * module for the sake of one string.
+ */
+export const DELETED_WORKFLOW_LABEL = 'Deleted Workflow'
diff --git a/apps/sim/triggers/gong/utils.ts b/apps/sim/triggers/gong/utils.ts
index f218eb86cf5..ed484b2d39f 100644
--- a/apps/sim/triggers/gong/utils.ts
+++ b/apps/sim/triggers/gong/utils.ts
@@ -1,4 +1,4 @@
-import { GONG_JWT_PUBLIC_KEY_CONFIG_KEY } from '@/lib/webhooks/providers/gong'
+import { GONG_JWT_PUBLIC_KEY_CONFIG_KEY } from '@/lib/webhooks/providers/gong-config'
import type { SubBlockConfig } from '@/blocks/types'
import type { TriggerOutput } from '@/triggers/types'
diff --git a/apps/sim/triggers/salesforce/utils.ts b/apps/sim/triggers/salesforce/utils.ts
index 1da79f322ec..5d5c8064209 100644
--- a/apps/sim/triggers/salesforce/utils.ts
+++ b/apps/sim/triggers/salesforce/utils.ts
@@ -1,4 +1,4 @@
-import { extractSalesforceObjectTypeFromPayload } from '@/lib/webhooks/providers/salesforce'
+import { extractSalesforceObjectTypeFromPayload } from '@/lib/webhooks/providers/salesforce-payload'
import type { SubBlockConfig } from '@/blocks/types'
import type { TriggerOutput } from '@/triggers/types'
import { normalizeToken } from '@/triggers/utils/tokens'
diff --git a/scripts/check-tool-registry-boundary.baseline.json b/scripts/check-tool-registry-boundary.baseline.json
index b8106a8cb7c..55a080b7f42 100644
--- a/scripts/check-tool-registry-boundary.baseline.json
+++ b/scripts/check-tool-registry-boundary.baseline.json
@@ -10,29 +10,29 @@
"gateways": {}
},
"app/workspace/[workspaceId]/chat/[chatId]/page.tsx": {
- "modules": 3039,
+ "modules": 3050,
"gateways": {
- "apps/sim/app/workspace/[workspaceId]/home/home.tsx": 1375,
- "apps/sim/app/workspace/[workspaceId]/home/components/mothership-view/mothership-view.tsx": 1027,
- "apps/sim/app/workspace/[workspaceId]/home/components/mothership-view/components/index.ts": 888,
- "apps/sim/app/workspace/[workspaceId]/home/components/mothership-view/components/resource-content/index.ts": 885,
+ "apps/sim/app/workspace/[workspaceId]/home/home.tsx": 1383,
+ "apps/sim/app/workspace/[workspaceId]/home/components/mothership-view/mothership-view.tsx": 1033,
+ "apps/sim/app/workspace/[workspaceId]/home/components/mothership-view/components/index.ts": 894,
+ "apps/sim/app/workspace/[workspaceId]/home/components/mothership-view/components/resource-content/index.ts": 891,
"apps/sim/triggers/registry.ts": 452,
+ "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx": 334,
"apps/sim/blocks/registry.ts": 315,
- "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx": 308,
- "apps/sim/lib/auth/index.ts": 224
+ "apps/sim/lib/auth/index.ts": 228
}
},
"app/workspace/[workspaceId]/files/[fileId]/page.tsx": {
- "modules": 2030,
+ "modules": 2007,
"gateways": {
"apps/sim/triggers/registry.ts": 452,
"apps/sim/blocks/registry.ts": 341,
- "apps/sim/app/workspace/[workspaceId]/files/files.tsx": 299,
- "apps/sim/lib/auth/index.ts": 230,
- "apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/index.ts": 148,
- "apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/file-viewer.tsx": 131,
- "apps/sim/lib/api/contracts/index.ts": 108,
- "apps/sim/lib/webhooks/providers/index.ts": 104
+ "apps/sim/app/workspace/[workspaceId]/files/files.tsx": 273,
+ "apps/sim/lib/auth/index.ts": 234,
+ "apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/index.ts": 151,
+ "apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/file-viewer.tsx": 134,
+ "apps/sim/lib/api/contracts/index.ts": 109,
+ "apps/sim/lib/webhooks/providers/index.ts": 107
}
},
"app/workspace/[workspaceId]/files/[fileId]/view/page.tsx": {
@@ -43,16 +43,16 @@
}
},
"app/workspace/[workspaceId]/files/page.tsx": {
- "modules": 2030,
+ "modules": 2007,
"gateways": {
"apps/sim/triggers/registry.ts": 452,
"apps/sim/blocks/registry.ts": 341,
- "apps/sim/app/workspace/[workspaceId]/files/files.tsx": 301,
- "apps/sim/lib/auth/index.ts": 230,
- "apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/index.ts": 148,
- "apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/file-viewer.tsx": 131,
- "apps/sim/lib/api/contracts/index.ts": 108,
- "apps/sim/lib/webhooks/providers/index.ts": 104
+ "apps/sim/app/workspace/[workspaceId]/files/files.tsx": 275,
+ "apps/sim/lib/auth/index.ts": 234,
+ "apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/index.ts": 151,
+ "apps/sim/app/workspace/[workspaceId]/files/components/file-viewer/file-viewer.tsx": 134,
+ "apps/sim/lib/api/contracts/index.ts": 109,
+ "apps/sim/lib/webhooks/providers/index.ts": 107
}
},
"app/workspace/[workspaceId]/home/layout.tsx": {
@@ -60,23 +60,23 @@
"gateways": {}
},
"app/workspace/[workspaceId]/home/page.tsx": {
- "modules": 3039,
+ "modules": 3050,
"gateways": {
- "apps/sim/app/workspace/[workspaceId]/home/home.tsx": 1375,
- "apps/sim/app/workspace/[workspaceId]/home/components/mothership-view/mothership-view.tsx": 1027,
- "apps/sim/app/workspace/[workspaceId]/home/components/mothership-view/components/index.ts": 888,
- "apps/sim/app/workspace/[workspaceId]/home/components/mothership-view/components/resource-content/index.ts": 885,
+ "apps/sim/app/workspace/[workspaceId]/home/home.tsx": 1383,
+ "apps/sim/app/workspace/[workspaceId]/home/components/mothership-view/mothership-view.tsx": 1033,
+ "apps/sim/app/workspace/[workspaceId]/home/components/mothership-view/components/index.ts": 894,
+ "apps/sim/app/workspace/[workspaceId]/home/components/mothership-view/components/resource-content/index.ts": 891,
"apps/sim/triggers/registry.ts": 452,
+ "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx": 334,
"apps/sim/blocks/registry.ts": 315,
- "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx": 308,
- "apps/sim/lib/auth/index.ts": 224
+ "apps/sim/lib/auth/index.ts": 228
}
},
"app/workspace/[workspaceId]/integrations/[block]/page.tsx": {
- "modules": 1330,
+ "modules": 1329,
"gateways": {
- "apps/sim/app/workspace/[workspaceId]/integrations/[block]/integration-block-detail.tsx": 1304,
- "apps/sim/triggers/index.ts": 489,
+ "apps/sim/app/workspace/[workspaceId]/integrations/[block]/integration-block-detail.tsx": 1303,
+ "apps/sim/triggers/index.ts": 488,
"apps/sim/blocks/registry.ts": 447,
"apps/sim/lib/api/contracts/index.ts": 129,
"apps/sim/blocks/blocks/credential-group.ts": 106,
@@ -86,24 +86,24 @@
}
},
"app/workspace/[workspaceId]/integrations/connected/[credentialId]/page.tsx": {
- "modules": 1309,
+ "modules": 1307,
"gateways": {
- "apps/sim/app/workspace/[workspaceId]/integrations/connected/[credentialId]/connected-credential-detail.tsx": 1308,
- "apps/sim/triggers/registry.ts": 488,
+ "apps/sim/app/workspace/[workspaceId]/integrations/connected/[credentialId]/connected-credential-detail.tsx": 1306,
+ "apps/sim/triggers/registry.ts": 487,
"apps/sim/blocks/registry.ts": 348,
"apps/sim/lib/api/contracts/index.ts": 135,
- "apps/sim/stores/workflows/registry/store.ts": 76,
- "apps/sim/hooks/queries/deployments.ts": 73,
- "apps/sim/lib/workflows/comparison/compare.ts": 70,
- "apps/sim/lib/workflows/comparison/resolve-values.ts": 67
+ "apps/sim/stores/workflows/registry/store.ts": 77,
+ "apps/sim/hooks/queries/deployments.ts": 74,
+ "apps/sim/lib/workflows/comparison/compare.ts": 71,
+ "apps/sim/lib/workflows/comparison/resolve-values.ts": 68
}
},
"app/workspace/[workspaceId]/integrations/page.tsx": {
- "modules": 1315,
+ "modules": 1314,
"gateways": {
- "apps/sim/app/workspace/[workspaceId]/integrations/integrations.tsx": 1025,
- "apps/sim/blocks/registry.ts": 941,
- "apps/sim/triggers/index.ts": 489,
+ "apps/sim/app/workspace/[workspaceId]/integrations/integrations.tsx": 1024,
+ "apps/sim/blocks/registry.ts": 940,
+ "apps/sim/triggers/index.ts": 488,
"apps/sim/lib/api/contracts/index.ts": 131,
"apps/sim/blocks/blocks/credential-group.ts": 107,
"apps/sim/stores/workflows/registry/store.ts": 81,
@@ -112,68 +112,68 @@
}
},
"app/workspace/[workspaceId]/knowledge/[id]/[documentId]/page.tsx": {
- "modules": 1538,
+ "modules": 1509,
"gateways": {
- "apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/document.tsx": 1245,
- "apps/sim/triggers/registry.ts": 488,
+ "apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/document.tsx": 1216,
+ "apps/sim/triggers/registry.ts": 487,
"apps/sim/blocks/registry.ts": 344,
"apps/sim/blocks/registry-maps.ts": 341,
- "apps/sim/lib/api/contracts/index.ts": 120,
+ "apps/sim/lib/api/contracts/index.ts": 129,
"apps/sim/connectors/registry.ts": 65,
- "apps/sim/app/workspace/[workspaceId]/components/index.ts": 60,
+ "apps/sim/app/workspace/[workspaceId]/components/index.ts": 61,
"apps/sim/lib/api/contracts/tools/index.ts": 60
}
},
"app/workspace/[workspaceId]/knowledge/[id]/page.tsx": {
- "modules": 1553,
+ "modules": 1521,
"gateways": {
- "apps/sim/app/workspace/[workspaceId]/knowledge/[id]/base.tsx": 1260,
- "apps/sim/triggers/registry.ts": 488,
- "apps/sim/blocks/registry.ts": 344,
- "apps/sim/blocks/registry-maps.ts": 341,
- "apps/sim/lib/api/contracts/index.ts": 120,
+ "apps/sim/app/workspace/[workspaceId]/knowledge/[id]/base.tsx": 1227,
+ "apps/sim/triggers/registry.ts": 487,
+ "apps/sim/blocks/registry.ts": 349,
+ "apps/sim/blocks/registry-maps.ts": 346,
+ "apps/sim/lib/api/contracts/index.ts": 129,
"apps/sim/connectors/registry.ts": 65,
- "apps/sim/app/workspace/[workspaceId]/components/index.ts": 60,
+ "apps/sim/app/workspace/[workspaceId]/components/index.ts": 61,
"apps/sim/lib/api/contracts/tools/index.ts": 60
}
},
"app/workspace/[workspaceId]/knowledge/page.tsx": {
- "modules": 2255,
+ "modules": 2231,
"gateways": {
"apps/sim/triggers/registry.ts": 452,
"apps/sim/blocks/registry.ts": 339,
- "apps/sim/app/workspace/[workspaceId]/knowledge/prefetch.ts": 289,
- "apps/sim/lib/knowledge/application/knowledge-bases.ts": 233,
- "apps/sim/app/workspace/[workspaceId]/knowledge/knowledge.tsx": 183,
- "apps/sim/lib/auth/index.ts": 178,
+ "apps/sim/app/workspace/[workspaceId]/knowledge/prefetch.ts": 291,
+ "apps/sim/lib/knowledge/application/knowledge-bases.ts": 235,
+ "apps/sim/lib/auth/index.ts": 182,
+ "apps/sim/app/workspace/[workspaceId]/knowledge/knowledge.tsx": 154,
"apps/sim/lib/knowledge/orchestration/index.ts": 148,
"apps/sim/lib/knowledge/orchestration/connectors.ts": 142
}
},
"app/workspace/[workspaceId]/layout.tsx": {
- "modules": 2081,
+ "modules": 2083,
"gateways": {
"apps/sim/triggers/registry.ts": 452,
"apps/sim/blocks/registry.ts": 340,
"apps/sim/app/workspace/[workspaceId]/components/workspace-chrome/index.ts": 305,
- "apps/sim/lib/auth/index.ts": 301,
+ "apps/sim/lib/auth/index.ts": 305,
"apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsx": 297,
"apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/index.ts": 205,
"apps/sim/lib/api/contracts/index.ts": 109,
- "apps/sim/lib/webhooks/providers/index.ts": 104
+ "apps/sim/lib/webhooks/providers/index.ts": 107
}
},
"app/workspace/[workspaceId]/logs/page.tsx": {
- "modules": 1770,
+ "modules": 1748,
"gateways": {
- "apps/sim/app/workspace/[workspaceId]/logs/logs.tsx": 1479,
- "apps/sim/triggers/registry.ts": 488,
- "apps/sim/app/workspace/[workspaceId]/logs/components/index.ts": 421,
- "apps/sim/app/workspace/[workspaceId]/logs/components/log-details/components/execution-snapshot/index.ts": 367,
+ "apps/sim/app/workspace/[workspaceId]/logs/logs.tsx": 1457,
+ "apps/sim/triggers/registry.ts": 487,
+ "apps/sim/app/workspace/[workspaceId]/logs/components/index.ts": 399,
+ "apps/sim/app/workspace/[workspaceId]/logs/components/log-details/components/execution-snapshot/index.ts": 345,
"apps/sim/blocks/registry.ts": 335,
- "apps/sim/app/workspace/[workspaceId]/w/components/preview/components/preview-editor/index.ts": 323,
- "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/index.ts": 288,
- "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/sub-block.tsx": 256
+ "apps/sim/app/workspace/[workspaceId]/w/components/preview/components/preview-editor/index.ts": 301,
+ "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/index.ts": 297,
+ "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/sub-block.tsx": 265
}
},
"app/workspace/[workspaceId]/page.tsx": {
@@ -185,16 +185,16 @@
"gateways": {}
},
"app/workspace/[workspaceId]/settings/[section]/page.tsx": {
- "modules": 2098,
+ "modules": 2102,
"gateways": {
"apps/sim/triggers/registry.ts": 452,
- "apps/sim/app/workspace/[workspaceId]/settings/[section]/settings.tsx": 444,
+ "apps/sim/app/workspace/[workspaceId]/settings/[section]/settings.tsx": 445,
"apps/sim/blocks/registry.ts": 339,
- "apps/sim/lib/auth/index.ts": 310,
+ "apps/sim/lib/auth/index.ts": 314,
"apps/sim/lib/api/contracts/index.ts": 107,
- "apps/sim/lib/webhooks/providers/index.ts": 104,
- "apps/sim/lib/api/contracts/tools/index.ts": 59,
- "apps/sim/lib/uploads/utils/file-utils.server.ts": 46
+ "apps/sim/lib/webhooks/providers/index.ts": 107,
+ "apps/sim/lib/webhooks/providers/registry.ts": 105,
+ "apps/sim/lib/api/contracts/tools/index.ts": 59
}
},
"app/workspace/[workspaceId]/settings/billing/credit-usage/layout.tsx": {
@@ -202,9 +202,9 @@
"gateways": {}
},
"app/workspace/[workspaceId]/settings/billing/credit-usage/page.tsx": {
- "modules": 1661,
+ "modules": 1664,
"gateways": {
- "apps/sim/lib/auth/index.ts": 1524,
+ "apps/sim/lib/auth/index.ts": 1527,
"apps/sim/blocks/registry.ts": 616,
"apps/sim/blocks/registry-maps.ts": 613,
"apps/sim/triggers/index.ts": 453,
@@ -223,23 +223,23 @@
"gateways": {}
},
"app/workspace/[workspaceId]/settings/secrets/[credentialId]/page.tsx": {
- "modules": 1347,
+ "modules": 1354,
"gateways": {
- "apps/sim/triggers/registry.ts": 488,
+ "apps/sim/triggers/registry.ts": 487,
"apps/sim/blocks/registry.ts": 350,
"apps/sim/blocks/registry-maps.ts": 347,
"apps/sim/lib/api/contracts/index.ts": 136,
+ "apps/sim/app/workspace/[workspaceId]/settings/secrets/[credentialId]/secret-detail.tsx": 77,
"apps/sim/stores/workflows/registry/store.ts": 76,
"apps/sim/hooks/queries/deployments.ts": 73,
- "apps/sim/lib/workflows/comparison/compare.ts": 70,
- "apps/sim/app/workspace/[workspaceId]/settings/secrets/[credentialId]/secret-detail.tsx": 68
+ "apps/sim/lib/workflows/comparison/compare.ts": 70
}
},
"app/workspace/[workspaceId]/skills/[skillId]/page.tsx": {
- "modules": 1432,
+ "modules": 1430,
"gateways": {
- "apps/sim/app/workspace/[workspaceId]/skills/[skillId]/skill-detail.tsx": 1431,
- "apps/sim/triggers/registry.ts": 488,
+ "apps/sim/app/workspace/[workspaceId]/skills/[skillId]/skill-detail.tsx": 1429,
+ "apps/sim/triggers/registry.ts": 487,
"apps/sim/blocks/registry.ts": 349,
"apps/sim/blocks/registry-maps.ts": 347,
"apps/sim/lib/api/contracts/index.ts": 127,
@@ -249,10 +249,10 @@
}
},
"app/workspace/[workspaceId]/skills/new/page.tsx": {
- "modules": 1430,
+ "modules": 1428,
"gateways": {
- "apps/sim/app/workspace/[workspaceId]/skills/new/skill-create.tsx": 1429,
- "apps/sim/triggers/registry.ts": 488,
+ "apps/sim/app/workspace/[workspaceId]/skills/new/skill-create.tsx": 1427,
+ "apps/sim/triggers/registry.ts": 487,
"apps/sim/blocks/registry.ts": 349,
"apps/sim/blocks/registry-maps.ts": 347,
"apps/sim/lib/api/contracts/index.ts": 127,
@@ -262,42 +262,42 @@
}
},
"app/workspace/[workspaceId]/skills/page.tsx": {
- "modules": 1298,
+ "modules": 1297,
"gateways": {
- "apps/sim/app/workspace/[workspaceId]/skills/skills.tsx": 1008,
- "apps/sim/app/workspace/[workspaceId]/integrations/components/showcase-with-explore/index.ts": 996,
- "apps/sim/blocks/registry.ts": 984,
- "apps/sim/blocks/registry-maps.ts": 982,
- "apps/sim/triggers/index.ts": 489,
+ "apps/sim/app/workspace/[workspaceId]/skills/skills.tsx": 1007,
+ "apps/sim/app/workspace/[workspaceId]/integrations/components/showcase-with-explore/index.ts": 995,
+ "apps/sim/blocks/registry.ts": 983,
+ "apps/sim/blocks/registry-maps.ts": 981,
+ "apps/sim/triggers/index.ts": 488,
"apps/sim/lib/api/contracts/index.ts": 136,
"apps/sim/blocks/blocks/credential-group.ts": 120,
"apps/sim/stores/workflows/registry/store.ts": 92
}
},
"app/workspace/[workspaceId]/tables/[tableId]/page.tsx": {
- "modules": 2293,
+ "modules": 2275,
"gateways": {
- "apps/sim/app/workspace/[workspaceId]/tables/[tableId]/table.tsx": 585,
+ "apps/sim/app/workspace/[workspaceId]/tables/[tableId]/table.tsx": 564,
"apps/sim/triggers/registry.ts": 452,
- "apps/sim/app/workspace/[workspaceId]/w/components/preview/index.ts": 337,
- "apps/sim/lib/auth/index.ts": 332,
+ "apps/sim/lib/auth/index.ts": 336,
+ "apps/sim/app/workspace/[workspaceId]/w/components/preview/index.ts": 315,
"apps/sim/blocks/registry.ts": 315,
- "apps/sim/app/workspace/[workspaceId]/w/components/preview/components/preview-editor/index.ts": 295,
- "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/index.ts": 267,
- "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/sub-block.tsx": 236
+ "apps/sim/app/workspace/[workspaceId]/w/components/preview/components/preview-editor/index.ts": 273,
+ "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/index.ts": 269,
+ "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/sub-block.tsx": 238
}
},
"app/workspace/[workspaceId]/tables/page.tsx": {
- "modules": 1885,
+ "modules": 1852,
"gateways": {
"apps/sim/triggers/registry.ts": 452,
"apps/sim/blocks/registry.ts": 340,
- "apps/sim/lib/auth/index.ts": 321,
- "apps/sim/app/workspace/[workspaceId]/tables/tables.tsx": 142,
- "apps/sim/lib/api/contracts/index.ts": 112,
- "apps/sim/lib/webhooks/providers/index.ts": 104,
- "apps/sim/lib/api/contracts/tools/index.ts": 60,
- "apps/sim/app/workspace/[workspaceId]/components/index.ts": 58
+ "apps/sim/lib/auth/index.ts": 325,
+ "apps/sim/lib/api/contracts/index.ts": 116,
+ "apps/sim/lib/webhooks/providers/index.ts": 107,
+ "apps/sim/app/workspace/[workspaceId]/tables/tables.tsx": 106,
+ "apps/sim/lib/webhooks/providers/registry.ts": 105,
+ "apps/sim/lib/api/contracts/tools/index.ts": 60
}
},
"app/workspace/[workspaceId]/upgrade/page.tsx": {
@@ -314,62 +314,62 @@
}
},
"app/workspace/[workspaceId]/w/[workflowId]/layout.tsx": {
- "modules": 2240,
+ "modules": 2242,
"gateways": {
- "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/error/index.tsx": 2239,
- "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/index.ts": 544,
- "apps/sim/triggers/registry.ts": 488,
- "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/index.ts": 461,
+ "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/error/index.tsx": 2241,
+ "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/index.ts": 548,
+ "apps/sim/triggers/registry.ts": 487,
+ "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/index.ts": 465,
"apps/sim/blocks/registry.ts": 335,
- "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/index.ts": 289,
- "apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsx": 162,
+ "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/index.ts": 290,
+ "apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsx": 182,
"apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/index.ts": 151
}
},
"app/workspace/[workspaceId]/w/[workflowId]/page.tsx": {
- "modules": 2267,
+ "modules": 2272,
"gateways": {
- "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx": 2266,
- "apps/sim/triggers/registry.ts": 488,
+ "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx": 2271,
+ "apps/sim/triggers/registry.ts": 487,
"apps/sim/blocks/registry.ts": 335,
- "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/index.ts": 308,
- "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/index.ts": 270,
- "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/index.ts": 227,
- "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/error/index.tsx": 155,
- "apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/index.ts": 144
+ "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/index.ts": 309,
+ "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/index.ts": 271,
+ "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/index.ts": 228,
+ "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/error/index.tsx": 176,
+ "apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsx": 174
}
},
"app/workspace/[workspaceId]/w/page.tsx": {
- "modules": 2240,
+ "modules": 2242,
"gateways": {
- "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/index.ts": 950,
- "apps/sim/triggers/registry.ts": 488,
- "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/index.ts": 461,
+ "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/index.ts": 955,
+ "apps/sim/triggers/registry.ts": 487,
+ "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/index.ts": 465,
"apps/sim/blocks/registry.ts": 335,
- "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/index.ts": 289,
+ "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/index.ts": 290,
"apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/error/index.tsx": 163,
"apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/index.ts": 151,
- "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/index.ts": 145
+ "apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/index.ts": 146
}
},
"app/workspace/layout.tsx": {
- "modules": 1244,
+ "modules": 1242,
"gateways": {
- "apps/sim/app/workspace/providers/socket-provider.tsx": 1234,
- "apps/sim/triggers/registry.ts": 488,
+ "apps/sim/app/workspace/providers/socket-provider.tsx": 1232,
+ "apps/sim/triggers/registry.ts": 487,
"apps/sim/blocks/registry.ts": 350,
"apps/sim/blocks/registry-maps.ts": 347,
- "apps/sim/stores/workflows/registry/store.ts": 274,
- "apps/sim/hooks/queries/deployments.ts": 271,
- "apps/sim/lib/workflows/comparison/compare.ts": 265,
- "apps/sim/lib/workflows/comparison/resolve-values.ts": 262
+ "apps/sim/stores/workflows/registry/store.ts": 275,
+ "apps/sim/hooks/queries/deployments.ts": 272,
+ "apps/sim/lib/workflows/comparison/compare.ts": 266,
+ "apps/sim/lib/workflows/comparison/resolve-values.ts": 263
}
},
"app/workspace/page.tsx": {
- "modules": 1238,
+ "modules": 1237,
"gateways": {
- "apps/sim/lib/auth/stale-session-recovery.ts": 1001,
- "apps/sim/triggers/index.ts": 489,
+ "apps/sim/lib/auth/stale-session-recovery.ts": 1000,
+ "apps/sim/triggers/index.ts": 488,
"apps/sim/blocks/registry.ts": 350,
"apps/sim/blocks/registry-maps.ts": 347,
"apps/sim/lib/api/contracts/index.ts": 139,