From e87f2facf6045067bbebc10d8f303f31cf147760 Mon Sep 17 00:00:00 2001
From: waleed
Date: Fri, 16 Jan 2026 14:55:02 -0800
Subject: [PATCH 1/5] feat(readme): added deepwiki to readme, consolidated
utils
---
README.md | 2 +-
apps/sim/app/api/form/[identifier]/route.ts | 6 ++---
.../components/action-bar/action-bar.tsx | 3 ++-
.../components/block-menu/block-menu.tsx | 5 ++---
.../deploy-modal/components/form/form.tsx | 3 ++-
.../deploy-modal/components/mcp/mcp.tsx | 2 +-
.../use-accessible-reference-prefixes.ts | 5 ++---
.../workflow/get-block-upstream-references.ts | 5 ++---
apps/sim/lib/mcp/workflow-tool-schema.ts | 2 +-
apps/sim/lib/workflows/input-format.ts | 3 ++-
.../workflows/triggers/start-block-types.ts | 21 ++++++++++++++++++
.../lib/workflows/triggers/trigger-utils.ts | 22 +------------------
12 files changed, 39 insertions(+), 40 deletions(-)
create mode 100644 apps/sim/lib/workflows/triggers/start-block-types.ts
diff --git a/README.md b/README.md
index 23c10de618..f25393ba18 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,7 @@
-
+
diff --git a/apps/sim/app/api/form/[identifier]/route.ts b/apps/sim/app/api/form/[identifier]/route.ts
index 907051f92a..e75dd236c6 100644
--- a/apps/sim/app/api/form/[identifier]/route.ts
+++ b/apps/sim/app/api/form/[identifier]/route.ts
@@ -11,6 +11,7 @@ import { preprocessExecution } from '@/lib/execution/preprocessing'
import { LoggingSession } from '@/lib/logs/execution/logging-session'
import { normalizeInputFormatValue } from '@/lib/workflows/input-format'
import { createStreamingResponse } from '@/lib/workflows/streaming/streaming'
+import { isValidStartBlockType } from '@/lib/workflows/triggers/start-block-types'
import { setFormAuthCookie, validateFormAuth } from '@/app/api/form/utils'
import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils'
@@ -35,10 +36,7 @@ async function getWorkflowInputSchema(workflowId: string): Promise {
.from(workflowBlocks)
.where(eq(workflowBlocks.workflowId, workflowId))
- const startBlock = blocks.find(
- (block) =>
- block.type === 'starter' || block.type === 'start_trigger' || block.type === 'input_trigger'
- )
+ const startBlock = blocks.find((block) => isValidStartBlockType(block.type))
if (!startBlock) {
return []
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/action-bar/action-bar.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/action-bar/action-bar.tsx
index 57cfc4f4d1..c2f7ee340a 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/action-bar/action-bar.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/action-bar/action-bar.tsx
@@ -2,6 +2,7 @@ import { memo, useCallback } from 'react'
import { ArrowLeftRight, ArrowUpDown, Circle, CircleOff, LogOut } from 'lucide-react'
import { Button, Copy, Tooltip, Trash2 } from '@/components/emcn'
import { cn } from '@/lib/core/utils/cn'
+import { isValidStartBlockType } from '@/lib/workflows/triggers/start-block-types'
import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider'
import { useCollaborativeWorkflow } from '@/hooks/use-collaborative-workflow'
import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
@@ -97,7 +98,7 @@ export const ActionBar = memo(
const userPermissions = useUserPermissionsContext()
- const isStartBlock = blockType === 'starter' || blockType === 'start_trigger'
+ const isStartBlock = isValidStartBlockType(blockType)
const isResponseBlock = blockType === 'response'
const isNoteBlock = blockType === 'note'
const isSubflowBlock = blockType === 'loop' || blockType === 'parallel'
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/block-menu/block-menu.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/block-menu/block-menu.tsx
index e0f7fac613..5d6af16f24 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/block-menu/block-menu.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/block-menu/block-menu.tsx
@@ -8,6 +8,7 @@ import {
PopoverDivider,
PopoverItem,
} from '@/components/emcn'
+import { isValidStartBlockType } from '@/lib/workflows/triggers/start-block-types'
/**
* Block information for context menu actions
@@ -73,9 +74,7 @@ export function BlockMenu({
const allEnabled = selectedBlocks.every((b) => b.enabled)
const allDisabled = selectedBlocks.every((b) => !b.enabled)
- const hasStarterBlock = selectedBlocks.some(
- (b) => b.type === 'starter' || b.type === 'start_trigger'
- )
+ const hasStarterBlock = selectedBlocks.some((b) => isValidStartBlockType(b.type))
const allNoteBlocks = selectedBlocks.every((b) => b.type === 'note')
const isSubflow =
isSingleBlock && (selectedBlocks[0]?.type === 'loop' || selectedBlocks[0]?.type === 'parallel')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/form/form.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/form/form.tsx
index 35adc9f2da..68e80d506d 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/form/form.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/form/form.tsx
@@ -17,6 +17,7 @@ import { Skeleton } from '@/components/ui'
import { isDev } from '@/lib/core/config/feature-flags'
import { cn } from '@/lib/core/utils/cn'
import { getBaseUrl, getEmailDomain } from '@/lib/core/utils/urls'
+import { isValidStartBlockType } from '@/lib/workflows/triggers/start-block-types'
import {
type FieldConfig,
useCreateForm,
@@ -146,7 +147,7 @@ export function FormDeploy({
useEffect(() => {
const blocks = Object.values(useWorkflowStore.getState().blocks)
- const startBlock = blocks.find((b) => b.type === 'starter' || b.type === 'start_trigger')
+ const startBlock = blocks.find((b) => isValidStartBlockType(b.type))
if (startBlock) {
const inputFormat = useSubBlockStore.getState().getValue(startBlock.id, 'inputFormat')
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/mcp/mcp.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/mcp/mcp.tsx
index 1620b68885..75c7bb326a 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/mcp/mcp.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/mcp/mcp.tsx
@@ -15,7 +15,7 @@ import {
import { Skeleton } from '@/components/ui'
import { generateToolInputSchema, sanitizeToolName } from '@/lib/mcp/workflow-tool-schema'
import { normalizeInputFormatValue } from '@/lib/workflows/input-format'
-import { isValidStartBlockType } from '@/lib/workflows/triggers/trigger-utils'
+import { isValidStartBlockType } from '@/lib/workflows/triggers/start-block-types'
import type { InputFormatField } from '@/lib/workflows/types'
import {
useAddWorkflowMcpTool,
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 55aa01c217..a30d565023 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
@@ -2,6 +2,7 @@ import { useMemo } from 'react'
import { useShallow } from 'zustand/react/shallow'
import { BlockPathCalculator } from '@/lib/workflows/blocks/block-path-calculator'
import { SYSTEM_REFERENCE_PREFIXES } from '@/lib/workflows/sanitization/references'
+import { isValidStartBlockType } from '@/lib/workflows/triggers/start-block-types'
import { normalizeName } from '@/executor/constants'
import { useWorkflowStore } from '@/stores/workflows/workflow/store'
import type { Loop, Parallel } from '@/stores/workflows/workflow/types'
@@ -26,9 +27,7 @@ export function useAccessibleReferencePrefixes(blockId?: string | null): Set(ancestorIds)
accessibleIds.add(blockId)
- const starterBlock = Object.values(blocks).find(
- (block) => block.type === 'starter' || block.type === 'start_trigger'
- )
+ const starterBlock = Object.values(blocks).find((block) => isValidStartBlockType(block.type))
if (starterBlock && ancestorIds.includes(starterBlock.id)) {
accessibleIds.add(starterBlock.id)
}
diff --git a/apps/sim/lib/copilot/tools/client/workflow/get-block-upstream-references.ts b/apps/sim/lib/copilot/tools/client/workflow/get-block-upstream-references.ts
index 749c04919a..a0b03e9232 100644
--- a/apps/sim/lib/copilot/tools/client/workflow/get-block-upstream-references.ts
+++ b/apps/sim/lib/copilot/tools/client/workflow/get-block-upstream-references.ts
@@ -17,6 +17,7 @@ import {
type GetBlockUpstreamReferencesResultType,
} from '@/lib/copilot/tools/shared/schemas'
import { BlockPathCalculator } from '@/lib/workflows/blocks/block-path-calculator'
+import { isValidStartBlockType } from '@/lib/workflows/triggers/start-block-types'
import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
import { useWorkflowStore } from '@/stores/workflows/workflow/store'
import type { Loop, Parallel } from '@/stores/workflows/workflow/types'
@@ -140,9 +141,7 @@ export class GetBlockUpstreamReferencesClientTool extends BaseClientTool {
const accessibleIds = new Set(ancestorIds)
accessibleIds.add(blockId)
- const starterBlock = Object.values(blocks).find(
- (b) => b.type === 'starter' || b.type === 'start_trigger'
- )
+ const starterBlock = Object.values(blocks).find((b) => isValidStartBlockType(b.type))
if (starterBlock && ancestorIds.includes(starterBlock.id)) {
accessibleIds.add(starterBlock.id)
}
diff --git a/apps/sim/lib/mcp/workflow-tool-schema.ts b/apps/sim/lib/mcp/workflow-tool-schema.ts
index 45572ea52c..3e7555c3f6 100644
--- a/apps/sim/lib/mcp/workflow-tool-schema.ts
+++ b/apps/sim/lib/mcp/workflow-tool-schema.ts
@@ -1,6 +1,6 @@
import { z } from 'zod'
import { normalizeInputFormatValue } from '@/lib/workflows/input-format'
-import { isValidStartBlockType } from '@/lib/workflows/triggers/trigger-utils'
+import { isValidStartBlockType } from '@/lib/workflows/triggers/start-block-types'
import type { InputFormatField } from '@/lib/workflows/types'
import type { McpToolSchema } from './types'
diff --git a/apps/sim/lib/workflows/input-format.ts b/apps/sim/lib/workflows/input-format.ts
index 5e857464d4..d4c8b242f6 100644
--- a/apps/sim/lib/workflows/input-format.ts
+++ b/apps/sim/lib/workflows/input-format.ts
@@ -1,3 +1,4 @@
+import { isValidStartBlockType } from '@/lib/workflows/triggers/start-block-types'
import type { InputFormatField } from '@/lib/workflows/types'
/**
@@ -23,7 +24,7 @@ export function extractInputFieldsFromBlocks(
// Find trigger block
const triggerEntry = Object.entries(blocks).find(([, block]) => {
const b = block as Record
- return b.type === 'start_trigger' || b.type === 'input_trigger' || b.type === 'starter'
+ return typeof b.type === 'string' && isValidStartBlockType(b.type)
})
if (!triggerEntry) return []
diff --git a/apps/sim/lib/workflows/triggers/start-block-types.ts b/apps/sim/lib/workflows/triggers/start-block-types.ts
new file mode 100644
index 0000000000..5bf389f91f
--- /dev/null
+++ b/apps/sim/lib/workflows/triggers/start-block-types.ts
@@ -0,0 +1,21 @@
+/**
+ * Valid start block types that can trigger a workflow
+ * This module is kept lightweight with no dependencies to avoid circular imports
+ */
+export const VALID_START_BLOCK_TYPES = [
+ 'starter',
+ 'start',
+ 'start_trigger',
+ 'api',
+ 'api_trigger',
+ 'input_trigger',
+] as const
+
+export type ValidStartBlockType = (typeof VALID_START_BLOCK_TYPES)[number]
+
+/**
+ * Check if a block type is a valid start block type
+ */
+export function isValidStartBlockType(blockType: string): blockType is ValidStartBlockType {
+ return VALID_START_BLOCK_TYPES.includes(blockType as ValidStartBlockType)
+}
diff --git a/apps/sim/lib/workflows/triggers/trigger-utils.ts b/apps/sim/lib/workflows/triggers/trigger-utils.ts
index 718101fa93..de68af8a7b 100644
--- a/apps/sim/lib/workflows/triggers/trigger-utils.ts
+++ b/apps/sim/lib/workflows/triggers/trigger-utils.ts
@@ -1,4 +1,5 @@
import { createLogger } from '@sim/logger'
+import { isValidStartBlockType } from '@/lib/workflows/triggers/start-block-types'
import {
type StartBlockCandidate,
StartBlockPath,
@@ -11,27 +12,6 @@ import { getTrigger } from '@/triggers'
const logger = createLogger('TriggerUtils')
-/**
- * Valid start block types that can trigger a workflow
- */
-export const VALID_START_BLOCK_TYPES = [
- 'starter',
- 'start',
- 'start_trigger',
- 'api',
- 'api_trigger',
- 'input_trigger',
-] as const
-
-export type ValidStartBlockType = (typeof VALID_START_BLOCK_TYPES)[number]
-
-/**
- * Check if a block type is a valid start block type
- */
-export function isValidStartBlockType(blockType: string): blockType is ValidStartBlockType {
- return VALID_START_BLOCK_TYPES.includes(blockType as ValidStartBlockType)
-}
-
/**
* Check if a workflow state has a valid start block
*/
From e589aa1f6327a1b078224d7dc5e95bdd10f76b33 Mon Sep 17 00:00:00 2001
From: Waleed Latif
Date: Fri, 16 Jan 2026 15:11:18 -0800
Subject: [PATCH 2/5] standardized all modals
---
.../delete-chunk-modal/delete-chunk-modal.tsx | 2 +-
.../knowledge/[id]/[documentId]/document.tsx | 10 ++-
.../[workspaceId]/knowledge/[id]/base.tsx | 19 +++---
.../delete-knowledge-base-modal.tsx | 2 +-
.../w/[workflowId]/components/panel/panel.tsx | 9 ++-
.../cancel-subscription.tsx | 2 +-
.../remove-member-dialog.tsx | 14 ++--
.../components/delete-modal/delete-modal.tsx | 2 +-
.../components/invite-modal/invite-modal.tsx | 2 +-
.../workspace-header/workspace-header.tsx | 66 +++++++++++++++++--
10 files changed, 100 insertions(+), 28 deletions(-)
diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/delete-chunk-modal/delete-chunk-modal.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/delete-chunk-modal/delete-chunk-modal.tsx
index 7d69f5e146..ff841ddec9 100644
--- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/delete-chunk-modal/delete-chunk-modal.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/[documentId]/components/delete-chunk-modal/delete-chunk-modal.tsx
@@ -77,7 +77,7 @@ export function DeleteChunkModal({
-