Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions apps/docs/app/[lang]/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import type { ReactNode } from 'react'
import { defineI18nUI } from 'fumadocs-ui/i18n'
import { DocsLayout } from 'fumadocs-ui/layouts/docs'
import { RootProvider } from 'fumadocs-ui/provider'
Expand Down Expand Up @@ -47,7 +46,7 @@ const GitHubLink = () => (
)

type LayoutProps = {
children: ReactNode
children: React.ReactNode
params: Promise<{ lang: string }>
}

Expand Down
4 changes: 1 addition & 3 deletions apps/docs/app/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
import type { ReactNode } from 'react'

export default function RootLayout({ children }: { children: ReactNode }) {
export default function RootLayout({ children }: { children: React.ReactNode }) {
return children
}

Expand Down
11 changes: 9 additions & 2 deletions apps/docs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,24 @@
"next-themes": "^0.4.6",
"react": "19.1.0",
"react-dom": "19.1.0",
"remark": "15.0.1",
"remark-gfm": "4.0.1",
"remark-mdx": "3.1.1",
"tailwind-merge": "^3.0.2"
},
"devDependencies": {
"@tailwindcss/postcss": "^4.0.12",
"@types/mdx": "^2.0.13",
"@types/node": "^22.14.1",
"@types/react": "^19.1.2",
"@types/react-dom": "^19.0.4",
"@types/react": "^19",
"@types/react-dom": "^19",
"dotenv-cli": "^8.0.0",
"postcss": "^8.5.3",
"tailwindcss": "^4.0.12",
"typescript": "^5.8.2"
},
"overrides": {
"@types/react": "^19.1.13",
"@types/react-dom": "^19.1.9"
}
}
95 changes: 49 additions & 46 deletions apps/sim/executor/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1397,58 +1397,61 @@ describe('Executor', () => {
}
)

it.concurrent.skip('should propagate errors from child workflows to parent workflow', async () => {
const workflow = {
version: '1.0',
blocks: [
{
id: 'starter',
position: { x: 0, y: 0 },
metadata: { id: BlockType.STARTER, name: 'Starter Block' },
config: { tool: 'starter', params: {} },
inputs: {} as Record<string, ParamType>,
outputs: {} as Record<string, BlockOutput>,
enabled: true,
},
{
id: 'workflow-block',
position: { x: 100, y: 0 },
metadata: { id: BlockType.WORKFLOW, name: 'Failing Workflow Block' },
config: {
tool: 'workflow',
params: {
workflowId: 'failing-child-workflow',
input: {},
it.concurrent.skip(
'should propagate errors from child workflows to parent workflow',
async () => {
const workflow = {
version: '1.0',
blocks: [
{
id: 'starter',
position: { x: 0, y: 0 },
metadata: { id: BlockType.STARTER, name: 'Starter Block' },
config: { tool: 'starter', params: {} },
inputs: {} as Record<string, ParamType>,
outputs: {} as Record<string, BlockOutput>,
enabled: true,
},
{
id: 'workflow-block',
position: { x: 100, y: 0 },
metadata: { id: BlockType.WORKFLOW, name: 'Failing Workflow Block' },
config: {
tool: 'workflow',
params: {
workflowId: 'failing-child-workflow',
input: {},
},
},
inputs: {} as Record<string, ParamType>,
outputs: { output: 'json' as BlockOutput },
enabled: true,
},
inputs: {} as Record<string, ParamType>,
outputs: { output: 'json' as BlockOutput },
enabled: true,
},
],
connections: [{ source: 'starter', target: 'workflow-block' }],
loops: {},
}

const executor = new Executor({
workflow,
workflowInput: {},
})
],
connections: [{ source: 'starter', target: 'workflow-block' }],
loops: {},
}

const result = await executor.execute('test-workflow-id')
const executor = new Executor({
workflow,
workflowInput: {},
})

// Verify that child workflow errors propagate to parent
expect(result).toBeDefined()
if ('success' in result) {
// The workflow should fail due to child workflow failure
expect(result.success).toBe(false)
expect(result.error).toBeDefined()
const result = await executor.execute('test-workflow-id')

// Error message should indicate it came from a child workflow
if (result.error && typeof result.error === 'string') {
expect(result.error).toContain('Error in child workflow')
// Verify that child workflow errors propagate to parent
expect(result).toBeDefined()
if ('success' in result) {
// The workflow should fail due to child workflow failure
expect(result.success).toBe(false)
expect(result.error).toBeDefined()

// Error message should indicate it came from a child workflow
if (result.error && typeof result.error === 'string') {
expect(result.error).toContain('Error in child workflow')
}
}
}
})
)
})
})
5 changes: 5 additions & 0 deletions apps/sim/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@
"@radix-ui/react-switch": "^1.1.2",
"@radix-ui/react-tabs": "^1.1.2",
"@radix-ui/react-toggle": "^1.1.2",
"@radix-ui/react-tooltip": "1.2.8",
"@radix-ui/react-visually-hidden": "1.2.3",
"@react-email/components": "^0.0.34",
"@react-email/render": "^1.4.0",
"@sentry/nextjs": "^9.15.0",
Expand All @@ -73,7 +75,9 @@
"@vercel/speed-insights": "^1.2.0",
"ai": "^4.3.2",
"better-auth": "1.2.9",
"binary-extensions": "3.1.0",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: Dependency Conflict with Binary-Extensions

Added "binary-extensions": "3.1.0" as a direct dependency creates a version conflict. The code in apps/sim/app/api/files/parse/route.ts imports and uses binary-extensions expecting it to be an array (line 369: binaryExtensionsList.includes(extension)). However, transitive dependency is-binary-path@2.1.0 requires binary-extensions@^2.0.0, creating a situation where both v3.1.0 and v2.3.0 could be present in node_modules. This major version bump may have breaking changes and the lock file (bun.lock line 4016) shows both versions being pinned, indicating a dependency conflict that wasn't present before this change.

Fix in Cursor Fix in Web

"browser-image-compression": "^2.0.2",
"chalk": "5.6.2",
"cheerio": "1.1.2",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
Expand All @@ -95,6 +99,7 @@
"js-yaml": "4.1.0",
"jwt-decode": "^4.0.0",
"lenis": "^1.2.3",
"lodash": "4.17.21",
"lucide-react": "^0.479.0",
"mammoth": "^1.9.0",
"mysql2": "3.14.3",
Expand Down
23 changes: 8 additions & 15 deletions apps/sim/providers/gatewayz/index.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,9 @@
import OpenAI from 'openai'
import { createLogger } from '@/lib/logs/console/logger'
import { env } from '@/lib/env'
import { createLogger } from '@/lib/logs/console/logger'
import type { StreamingExecution } from '@/executor/types'
import type {
ProviderConfig,
ProviderRequest,
ProviderResponse,
TimeSegment,
} from '@/providers/types'
import {
prepareToolExecution,
prepareToolsWithUsageControl,
trackForcedToolUsage,
} from '@/providers/utils'
import type { ProviderConfig, ProviderRequest, ProviderResponse } from '@/providers/types'
import { prepareToolExecution, prepareToolsWithUsageControl } from '@/providers/utils'
import { executeTool } from '@/tools'

const logger = createLogger('GatewayzProvider')
Expand Down Expand Up @@ -69,7 +60,9 @@ export const gatewayzProvider: ProviderConfig = {
models: [], // Will be populated dynamically
defaultModel: '', // Will be determined by the gateway

executeRequest: async (request: ProviderRequest): Promise<ProviderResponse | StreamingExecution> => {
executeRequest: async (
request: ProviderRequest
): Promise<ProviderResponse | StreamingExecution> => {
logger.info('Preparing Gatewayz request', {
model: request.model,
hasSystemPrompt: !!request.systemPrompt,
Expand Down Expand Up @@ -178,7 +171,7 @@ async function executeNonStreamingRequest(
return {
content: message.content || '',
model: request.model,
toolCalls: message.tool_calls.map(tc => ({
toolCalls: message.tool_calls.map((tc) => ({
name: tc.function.name,
arguments: JSON.parse(tc.function.arguments),
})),
Expand Down Expand Up @@ -234,4 +227,4 @@ async function executeStreamingRequest(
logger.error('Gatewayz stream failed:', error)
throw error
}
}
}
2 changes: 1 addition & 1 deletion apps/sim/providers/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { anthropicProvider } from '@/providers/anthropic'
import { azureOpenAIProvider } from '@/providers/azure-openai'
import { cerebrasProvider } from '@/providers/cerebras'
import { deepseekProvider } from '@/providers/deepseek'
import { gatewayzProvider } from '@/providers/gatewayz'
import { googleProvider } from '@/providers/google'
import { groqProvider } from '@/providers/groq'
import {
Expand All @@ -29,7 +30,6 @@ import { openaiProvider } from '@/providers/openai'
import { openRouterProvider } from '@/providers/openrouter'
import type { ProviderConfig, ProviderId, ProviderToolConfig } from '@/providers/types'
import { xAIProvider } from '@/providers/xai'
import { gatewayzProvider } from '@/providers/gatewayz'
import { useCustomToolsStore } from '@/stores/custom-tools/store'
import { useProvidersStore } from '@/stores/providers/store'

Expand Down
Binary file added apps/sim/public/android-chrome-192x192.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added apps/sim/public/android-chrome-512x512.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
11 changes: 11 additions & 0 deletions apps/sim/public/site.webmanifest
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"name": "",
"short_name": "",
Comment on lines +2 to +3

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Empty PWA name fields will result in poor installation experience.

The name and short_name fields are currently empty strings. When users attempt to install this PWA, browsers will typically display the URL or "Untitled" instead of a meaningful app name. Please update these fields with appropriate values before promoting PWA installation.

🤖 Prompt for AI Agents
In apps/sim/public/site.webmanifest around lines 2 to 3, the "name" and
"short_name" fields are empty which leads to poor PWA install UX; update them to
meaningful values by setting "name" to the full application display name (e.g.,
"Simulator App" or the project's proper title) and "short_name" to a shorter
label (<=12 characters) suitable for launcher/shortcut displays, ensuring they
are localized if needed and valid non-empty strings.

"icons": [
{ "src": "/android-chrome-192x192.png", "sizes": "192x192", "type": "image/png" },
{ "src": "/android-chrome-512x512.png", "sizes": "512x512", "type": "image/png" }
],
"theme_color": "#ffffff",
"background_color": "#ffffff",
"display": "standalone"
}
Loading
Loading