Fix workflow stack traces (no more evalmachine) - #256

Merged
pranaygp merged 1 commit into
mainfrom
copilot/fix-sourcemap-tracking
Nov 9, 2025
Merged

Fix workflow stack traces (no more evalmachine)#256
pranaygp merged 1 commit into
mainfrom
copilot/fix-sourcemap-tracking

Conversation

CopilotAI commented Nov 7, 2025

Copy link
Copy Markdown
Contributor

Don't mind the broken dev test. it seems a bit flaky and gets fixed properly down the PR stack

Workflow code executes in a VM context via runInContext(), which defaults to evalmachine.<anonymous> in stack traces, making debugging difficult:

Error: test error
at addTenWorkflow (evalmachine.<anonymous>:451:9)
at async ...

Fixes#151

Solution

This PR implements comprehensive source map support for workflow stack traces by:

  1. Generating inline source maps in the intermediate workflow bundle
  2. Providing meaningful filenames to the VM context via runInContext()
  3. Remapping stack traces using inline source maps to show original source locations

Changes

Core Runtime

  • packages/core/src/source-map.ts (NEW) - Source map remapping logic using @jridgewell/trace-mapping
  • packages/core/src/workflow.ts - Use parseWorkflowName() to extract clean file paths and pass as filename parameter to runInContext()
  • packages/core/src/runtime.ts - Apply source map remapping to workflow error logs

Builder Configuration

  • packages/builders/src/base-builder.ts - Set intermediate workflow bundle to use sourcemap: 'inline' (the VM-executed code needs inline source maps)

Tests

  • packages/core/src/workflow.test.ts - Added test for nested stack traces
  • packages/core/e2e/e2e.test.ts - Added e2e test for cross-file error stack traces
  • workbench/example/workflows/helpers.ts (NEW) - Test helper module for verifying cross-file stack traces
  • workbench/example/workflows/99_e2e.ts - Added nestedErrorWorkflow and crossFileErrorWorkflow with helper functions

Dependencies

  • Added @jridgewell/trace-mapping to @workflow/core for pure-JS source map processing (no WASM dependency)

Results

Before

Error: test error
at addTenWorkflow (evalmachine.<anonymous>:451:9)

After - Simple Error

Error: test error
at addTenWorkflow (example/workflows/99_e2e.ts:23:10)

After - Nested Functions (Same File)

Error: Error from deeply nested function
at deepFunction (../example/workflows/99_e2e.ts:33:10)
at middleFunction (../example/workflows/99_e2e.ts:37:4)
at topLevelHelper (../example/workflows/99_e2e.ts:41:4)
at addTenWorkflow (../example/workflows/99_e2e.ts:24:4)

After - Cross-File Errors (Imported Modules)

Error: Error from imported helper module
at throwError (../example/workflows/helpers.ts:3:10)
at callThrower (../example/workflows/helpers.ts:6:4)
at crossFileErrorWorkflow (../example/workflows/99_e2e.ts:447:4)

Stack traces now correctly show:

  • ✅ Actual source file paths (not evalmachine.<anonymous>)
  • ✅ Correct function names
  • ✅ Source-mapped line and column numbers
  • ✅ Cross-file call chains with correct file paths for each frame

Testing

  • All 186 unit tests pass (including new nested stack trace test)
  • New e2e test validates cross-file error stack traces
  • Tested with nested errors, cross-file imports, and complex call stacks

Fixes#151


This is part 1 of 3 in a stack made with GitButler:

@changeset-bot

changeset-botBot commented Nov 7, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 8c93c65

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 11 packages
NameType
@workflow/buildersPatch
@workflow/corePatch
@workflow/cliPatch
@workflow/nextPatch
@workflow/nitroPatch
@workflow/sveltekitPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/world-testingPatch
@workflow/nuxtPatch
@workflow/aiPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Nov 7, 2025

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentPreviewCommentsUpdated (UTC)
example-nextjs-workflow-turbopackReadyReadyPreviewCommentNov 9, 2025 8:00pm
example-nextjs-workflow-webpackReadyReadyPreviewCommentNov 9, 2025 8:00pm
example-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-nitro-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-nuxt-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-sveltekit-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-vite-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workflow-docsReadyReadyPreviewCommentNov 9, 2025 8:00pm

@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from c93cf92 to 0343d72CompareNovember 8, 2025 05:19
@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from 0343d72 to 984e756CompareNovember 8, 2025 05:21
@pranaygppranaygp changed the title Fix workflow stack traces to show source filenames instead of evalmachineFix workflow stack traces (no more evalmachine)Nov 8, 2025
@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from 1f0f74d to b128b07CompareNovember 8, 2025 05:50
@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from b128b07 to 3ffca64CompareNovember 8, 2025 05:51
This was referenced Nov 8, 2025
Comment threadpackages/builders/src/base-builder.ts Outdated
Comment threadpackages/core/src/workflow.ts Outdated

@TooTallNateTooTallNate left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Couple small nits/questions, but otherwise :lgtm:

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Stack traces in workflow context

3 participants

@TooTallNate@pranaygp
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Fix workflow stack traces (no more evalmachine) - #256

Merged
pranaygp merged 1 commit into
mainfrom
copilot/fix-sourcemap-tracking
Nov 9, 2025
Merged

Fix workflow stack traces (no more evalmachine)#256
pranaygp merged 1 commit into
mainfrom
copilot/fix-sourcemap-tracking

Conversation

CopilotAI commented Nov 7, 2025

Copy link
Copy Markdown
Contributor

Don't mind the broken dev test. it seems a bit flaky and gets fixed properly down the PR stack

Workflow code executes in a VM context via runInContext(), which defaults to evalmachine.<anonymous> in stack traces, making debugging difficult:

Error: test error
at addTenWorkflow (evalmachine.<anonymous>:451:9)
at async ...

Fixes#151

Solution

This PR implements comprehensive source map support for workflow stack traces by:

  1. Generating inline source maps in the intermediate workflow bundle
  2. Providing meaningful filenames to the VM context via runInContext()
  3. Remapping stack traces using inline source maps to show original source locations

Changes

Core Runtime

  • packages/core/src/source-map.ts (NEW) - Source map remapping logic using @jridgewell/trace-mapping
  • packages/core/src/workflow.ts - Use parseWorkflowName() to extract clean file paths and pass as filename parameter to runInContext()
  • packages/core/src/runtime.ts - Apply source map remapping to workflow error logs

Builder Configuration

  • packages/builders/src/base-builder.ts - Set intermediate workflow bundle to use sourcemap: 'inline' (the VM-executed code needs inline source maps)

Tests

  • packages/core/src/workflow.test.ts - Added test for nested stack traces
  • packages/core/e2e/e2e.test.ts - Added e2e test for cross-file error stack traces
  • workbench/example/workflows/helpers.ts (NEW) - Test helper module for verifying cross-file stack traces
  • workbench/example/workflows/99_e2e.ts - Added nestedErrorWorkflow and crossFileErrorWorkflow with helper functions

Dependencies

  • Added @jridgewell/trace-mapping to @workflow/core for pure-JS source map processing (no WASM dependency)

Results

Before

Error: test error
at addTenWorkflow (evalmachine.<anonymous>:451:9)

After - Simple Error

Error: test error
at addTenWorkflow (example/workflows/99_e2e.ts:23:10)

After - Nested Functions (Same File)

Error: Error from deeply nested function
at deepFunction (../example/workflows/99_e2e.ts:33:10)
at middleFunction (../example/workflows/99_e2e.ts:37:4)
at topLevelHelper (../example/workflows/99_e2e.ts:41:4)
at addTenWorkflow (../example/workflows/99_e2e.ts:24:4)

After - Cross-File Errors (Imported Modules)

Error: Error from imported helper module
at throwError (../example/workflows/helpers.ts:3:10)
at callThrower (../example/workflows/helpers.ts:6:4)
at crossFileErrorWorkflow (../example/workflows/99_e2e.ts:447:4)

Stack traces now correctly show:

  • ✅ Actual source file paths (not evalmachine.<anonymous>)
  • ✅ Correct function names
  • ✅ Source-mapped line and column numbers
  • ✅ Cross-file call chains with correct file paths for each frame

Testing

  • All 186 unit tests pass (including new nested stack trace test)
  • New e2e test validates cross-file error stack traces
  • Tested with nested errors, cross-file imports, and complex call stacks

Fixes#151


This is part 1 of 3 in a stack made with GitButler:

@changeset-bot

changeset-botBot commented Nov 7, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 8c93c65

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 11 packages
NameType
@workflow/buildersPatch
@workflow/corePatch
@workflow/cliPatch
@workflow/nextPatch
@workflow/nitroPatch
@workflow/sveltekitPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/world-testingPatch
@workflow/nuxtPatch
@workflow/aiPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Nov 7, 2025

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentPreviewCommentsUpdated (UTC)
example-nextjs-workflow-turbopackReadyReadyPreviewCommentNov 9, 2025 8:00pm
example-nextjs-workflow-webpackReadyReadyPreviewCommentNov 9, 2025 8:00pm
example-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-nitro-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-nuxt-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-sveltekit-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-vite-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workflow-docsReadyReadyPreviewCommentNov 9, 2025 8:00pm

@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from c93cf92 to 0343d72CompareNovember 8, 2025 05:19
@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from 0343d72 to 984e756CompareNovember 8, 2025 05:21
@pranaygppranaygp changed the title Fix workflow stack traces to show source filenames instead of evalmachineFix workflow stack traces (no more evalmachine)Nov 8, 2025
@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from 1f0f74d to b128b07CompareNovember 8, 2025 05:50
@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from b128b07 to 3ffca64CompareNovember 8, 2025 05:51
This was referenced Nov 8, 2025
Comment threadpackages/builders/src/base-builder.ts Outdated
Comment threadpackages/core/src/workflow.ts Outdated

@TooTallNateTooTallNate left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Couple small nits/questions, but otherwise :lgtm:

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Stack traces in workflow context

3 participants

@TooTallNate@pranaygp
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix workflow stack traces (no more evalmachine) - #256

Merged
pranaygp merged 1 commit into
mainfrom
copilot/fix-sourcemap-tracking
Nov 9, 2025
Merged

Fix workflow stack traces (no more evalmachine)#256
pranaygp merged 1 commit into
mainfrom
copilot/fix-sourcemap-tracking

Conversation

CopilotAI commented Nov 7, 2025

Copy link
Copy Markdown
Contributor

Don't mind the broken dev test. it seems a bit flaky and gets fixed properly down the PR stack

Workflow code executes in a VM context via runInContext(), which defaults to evalmachine.<anonymous> in stack traces, making debugging difficult:

Error: test error
at addTenWorkflow (evalmachine.<anonymous>:451:9)
at async ...

Fixes#151

Solution

This PR implements comprehensive source map support for workflow stack traces by:

  1. Generating inline source maps in the intermediate workflow bundle
  2. Providing meaningful filenames to the VM context via runInContext()
  3. Remapping stack traces using inline source maps to show original source locations

Changes

Core Runtime

  • packages/core/src/source-map.ts (NEW) - Source map remapping logic using @jridgewell/trace-mapping
  • packages/core/src/workflow.ts - Use parseWorkflowName() to extract clean file paths and pass as filename parameter to runInContext()
  • packages/core/src/runtime.ts - Apply source map remapping to workflow error logs

Builder Configuration

  • packages/builders/src/base-builder.ts - Set intermediate workflow bundle to use sourcemap: 'inline' (the VM-executed code needs inline source maps)

Tests

  • packages/core/src/workflow.test.ts - Added test for nested stack traces
  • packages/core/e2e/e2e.test.ts - Added e2e test for cross-file error stack traces
  • workbench/example/workflows/helpers.ts (NEW) - Test helper module for verifying cross-file stack traces
  • workbench/example/workflows/99_e2e.ts - Added nestedErrorWorkflow and crossFileErrorWorkflow with helper functions

Dependencies

  • Added @jridgewell/trace-mapping to @workflow/core for pure-JS source map processing (no WASM dependency)

Results

Before

Error: test error
at addTenWorkflow (evalmachine.<anonymous>:451:9)

After - Simple Error

Error: test error
at addTenWorkflow (example/workflows/99_e2e.ts:23:10)

After - Nested Functions (Same File)

Error: Error from deeply nested function
at deepFunction (../example/workflows/99_e2e.ts:33:10)
at middleFunction (../example/workflows/99_e2e.ts:37:4)
at topLevelHelper (../example/workflows/99_e2e.ts:41:4)
at addTenWorkflow (../example/workflows/99_e2e.ts:24:4)

After - Cross-File Errors (Imported Modules)

Error: Error from imported helper module
at throwError (../example/workflows/helpers.ts:3:10)
at callThrower (../example/workflows/helpers.ts:6:4)
at crossFileErrorWorkflow (../example/workflows/99_e2e.ts:447:4)

Stack traces now correctly show:

  • ✅ Actual source file paths (not evalmachine.<anonymous>)
  • ✅ Correct function names
  • ✅ Source-mapped line and column numbers
  • ✅ Cross-file call chains with correct file paths for each frame

Testing

  • All 186 unit tests pass (including new nested stack trace test)
  • New e2e test validates cross-file error stack traces
  • Tested with nested errors, cross-file imports, and complex call stacks

Fixes#151


This is part 1 of 3 in a stack made with GitButler:

@changeset-bot

changeset-botBot commented Nov 7, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 8c93c65

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 11 packages
NameType
@workflow/buildersPatch
@workflow/corePatch
@workflow/cliPatch
@workflow/nextPatch
@workflow/nitroPatch
@workflow/sveltekitPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/world-testingPatch
@workflow/nuxtPatch
@workflow/aiPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Nov 7, 2025

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentPreviewCommentsUpdated (UTC)
example-nextjs-workflow-turbopackReadyReadyPreviewCommentNov 9, 2025 8:00pm
example-nextjs-workflow-webpackReadyReadyPreviewCommentNov 9, 2025 8:00pm
example-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-nitro-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-nuxt-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-sveltekit-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-vite-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workflow-docsReadyReadyPreviewCommentNov 9, 2025 8:00pm

@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from c93cf92 to 0343d72CompareNovember 8, 2025 05:19
@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from 0343d72 to 984e756CompareNovember 8, 2025 05:21
@pranaygppranaygp changed the title Fix workflow stack traces to show source filenames instead of evalmachineFix workflow stack traces (no more evalmachine)Nov 8, 2025
@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from 1f0f74d to b128b07CompareNovember 8, 2025 05:50
@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from b128b07 to 3ffca64CompareNovember 8, 2025 05:51
This was referenced Nov 8, 2025
Comment threadpackages/builders/src/base-builder.ts Outdated
Comment threadpackages/core/src/workflow.ts Outdated

@TooTallNateTooTallNate left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Couple small nits/questions, but otherwise :lgtm:

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Stack traces in workflow context

3 participants

@TooTallNate@pranaygp
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix workflow stack traces (no more evalmachine) - #256

Merged
pranaygp merged 1 commit into
mainfrom
copilot/fix-sourcemap-tracking
Nov 9, 2025
Merged

Fix workflow stack traces (no more evalmachine)#256
pranaygp merged 1 commit into
mainfrom
copilot/fix-sourcemap-tracking

Conversation

CopilotAI commented Nov 7, 2025

Copy link
Copy Markdown
Contributor

Don't mind the broken dev test. it seems a bit flaky and gets fixed properly down the PR stack

Workflow code executes in a VM context via runInContext(), which defaults to evalmachine.<anonymous> in stack traces, making debugging difficult:

Error: test error
at addTenWorkflow (evalmachine.<anonymous>:451:9)
at async ...

Fixes#151

Solution

This PR implements comprehensive source map support for workflow stack traces by:

  1. Generating inline source maps in the intermediate workflow bundle
  2. Providing meaningful filenames to the VM context via runInContext()
  3. Remapping stack traces using inline source maps to show original source locations

Changes

Core Runtime

  • packages/core/src/source-map.ts (NEW) - Source map remapping logic using @jridgewell/trace-mapping
  • packages/core/src/workflow.ts - Use parseWorkflowName() to extract clean file paths and pass as filename parameter to runInContext()
  • packages/core/src/runtime.ts - Apply source map remapping to workflow error logs

Builder Configuration

  • packages/builders/src/base-builder.ts - Set intermediate workflow bundle to use sourcemap: 'inline' (the VM-executed code needs inline source maps)

Tests

  • packages/core/src/workflow.test.ts - Added test for nested stack traces
  • packages/core/e2e/e2e.test.ts - Added e2e test for cross-file error stack traces
  • workbench/example/workflows/helpers.ts (NEW) - Test helper module for verifying cross-file stack traces
  • workbench/example/workflows/99_e2e.ts - Added nestedErrorWorkflow and crossFileErrorWorkflow with helper functions

Dependencies

  • Added @jridgewell/trace-mapping to @workflow/core for pure-JS source map processing (no WASM dependency)

Results

Before

Error: test error
at addTenWorkflow (evalmachine.<anonymous>:451:9)

After - Simple Error

Error: test error
at addTenWorkflow (example/workflows/99_e2e.ts:23:10)

After - Nested Functions (Same File)

Error: Error from deeply nested function
at deepFunction (../example/workflows/99_e2e.ts:33:10)
at middleFunction (../example/workflows/99_e2e.ts:37:4)
at topLevelHelper (../example/workflows/99_e2e.ts:41:4)
at addTenWorkflow (../example/workflows/99_e2e.ts:24:4)

After - Cross-File Errors (Imported Modules)

Error: Error from imported helper module
at throwError (../example/workflows/helpers.ts:3:10)
at callThrower (../example/workflows/helpers.ts:6:4)
at crossFileErrorWorkflow (../example/workflows/99_e2e.ts:447:4)

Stack traces now correctly show:

  • ✅ Actual source file paths (not evalmachine.<anonymous>)
  • ✅ Correct function names
  • ✅ Source-mapped line and column numbers
  • ✅ Cross-file call chains with correct file paths for each frame

Testing

  • All 186 unit tests pass (including new nested stack trace test)
  • New e2e test validates cross-file error stack traces
  • Tested with nested errors, cross-file imports, and complex call stacks

Fixes#151


This is part 1 of 3 in a stack made with GitButler:

@changeset-bot

changeset-botBot commented Nov 7, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 8c93c65

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 11 packages
NameType
@workflow/buildersPatch
@workflow/corePatch
@workflow/cliPatch
@workflow/nextPatch
@workflow/nitroPatch
@workflow/sveltekitPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/world-testingPatch
@workflow/nuxtPatch
@workflow/aiPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Nov 7, 2025

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentPreviewCommentsUpdated (UTC)
example-nextjs-workflow-turbopackReadyReadyPreviewCommentNov 9, 2025 8:00pm
example-nextjs-workflow-webpackReadyReadyPreviewCommentNov 9, 2025 8:00pm
example-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-nitro-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-nuxt-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-sveltekit-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-vite-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workflow-docsReadyReadyPreviewCommentNov 9, 2025 8:00pm

@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from c93cf92 to 0343d72CompareNovember 8, 2025 05:19
@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from 0343d72 to 984e756CompareNovember 8, 2025 05:21
@pranaygppranaygp changed the title Fix workflow stack traces to show source filenames instead of evalmachineFix workflow stack traces (no more evalmachine)Nov 8, 2025
@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from 1f0f74d to b128b07CompareNovember 8, 2025 05:50
@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from b128b07 to 3ffca64CompareNovember 8, 2025 05:51
This was referenced Nov 8, 2025
Comment threadpackages/builders/src/base-builder.ts Outdated
Comment threadpackages/core/src/workflow.ts Outdated

@TooTallNateTooTallNate left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Couple small nits/questions, but otherwise :lgtm:

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Stack traces in workflow context

3 participants

@TooTallNate@pranaygp
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Fix workflow stack traces (no more evalmachine) - #256

Merged
pranaygp merged 1 commit into
mainfrom
copilot/fix-sourcemap-tracking
Nov 9, 2025
Merged

Fix workflow stack traces (no more evalmachine)#256
pranaygp merged 1 commit into
mainfrom
copilot/fix-sourcemap-tracking

Conversation

CopilotAI commented Nov 7, 2025

Copy link
Copy Markdown
Contributor

Don't mind the broken dev test. it seems a bit flaky and gets fixed properly down the PR stack

Workflow code executes in a VM context via runInContext(), which defaults to evalmachine.<anonymous> in stack traces, making debugging difficult:

Error: test error
at addTenWorkflow (evalmachine.<anonymous>:451:9)
at async ...

Fixes#151

Solution

This PR implements comprehensive source map support for workflow stack traces by:

  1. Generating inline source maps in the intermediate workflow bundle
  2. Providing meaningful filenames to the VM context via runInContext()
  3. Remapping stack traces using inline source maps to show original source locations

Changes

Core Runtime

  • packages/core/src/source-map.ts (NEW) - Source map remapping logic using @jridgewell/trace-mapping
  • packages/core/src/workflow.ts - Use parseWorkflowName() to extract clean file paths and pass as filename parameter to runInContext()
  • packages/core/src/runtime.ts - Apply source map remapping to workflow error logs

Builder Configuration

  • packages/builders/src/base-builder.ts - Set intermediate workflow bundle to use sourcemap: 'inline' (the VM-executed code needs inline source maps)

Tests

  • packages/core/src/workflow.test.ts - Added test for nested stack traces
  • packages/core/e2e/e2e.test.ts - Added e2e test for cross-file error stack traces
  • workbench/example/workflows/helpers.ts (NEW) - Test helper module for verifying cross-file stack traces
  • workbench/example/workflows/99_e2e.ts - Added nestedErrorWorkflow and crossFileErrorWorkflow with helper functions

Dependencies

  • Added @jridgewell/trace-mapping to @workflow/core for pure-JS source map processing (no WASM dependency)

Results

Before

Error: test error
at addTenWorkflow (evalmachine.<anonymous>:451:9)

After - Simple Error

Error: test error
at addTenWorkflow (example/workflows/99_e2e.ts:23:10)

After - Nested Functions (Same File)

Error: Error from deeply nested function
at deepFunction (../example/workflows/99_e2e.ts:33:10)
at middleFunction (../example/workflows/99_e2e.ts:37:4)
at topLevelHelper (../example/workflows/99_e2e.ts:41:4)
at addTenWorkflow (../example/workflows/99_e2e.ts:24:4)

After - Cross-File Errors (Imported Modules)

Error: Error from imported helper module
at throwError (../example/workflows/helpers.ts:3:10)
at callThrower (../example/workflows/helpers.ts:6:4)
at crossFileErrorWorkflow (../example/workflows/99_e2e.ts:447:4)

Stack traces now correctly show:

  • ✅ Actual source file paths (not evalmachine.<anonymous>)
  • ✅ Correct function names
  • ✅ Source-mapped line and column numbers
  • ✅ Cross-file call chains with correct file paths for each frame

Testing

  • All 186 unit tests pass (including new nested stack trace test)
  • New e2e test validates cross-file error stack traces
  • Tested with nested errors, cross-file imports, and complex call stacks

Fixes#151


This is part 1 of 3 in a stack made with GitButler:

@changeset-bot

changeset-botBot commented Nov 7, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 8c93c65

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 11 packages
NameType
@workflow/buildersPatch
@workflow/corePatch
@workflow/cliPatch
@workflow/nextPatch
@workflow/nitroPatch
@workflow/sveltekitPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/world-testingPatch
@workflow/nuxtPatch
@workflow/aiPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Nov 7, 2025

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentPreviewCommentsUpdated (UTC)
example-nextjs-workflow-turbopackReadyReadyPreviewCommentNov 9, 2025 8:00pm
example-nextjs-workflow-webpackReadyReadyPreviewCommentNov 9, 2025 8:00pm
example-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-nitro-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-nuxt-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-sveltekit-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-vite-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workflow-docsReadyReadyPreviewCommentNov 9, 2025 8:00pm

@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from c93cf92 to 0343d72CompareNovember 8, 2025 05:19
@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from 0343d72 to 984e756CompareNovember 8, 2025 05:21
@pranaygppranaygp changed the title Fix workflow stack traces to show source filenames instead of evalmachineFix workflow stack traces (no more evalmachine)Nov 8, 2025
@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from 1f0f74d to b128b07CompareNovember 8, 2025 05:50
@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from b128b07 to 3ffca64CompareNovember 8, 2025 05:51
This was referenced Nov 8, 2025
Comment threadpackages/builders/src/base-builder.ts Outdated
Comment threadpackages/core/src/workflow.ts Outdated

@TooTallNateTooTallNate left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Couple small nits/questions, but otherwise :lgtm:

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Stack traces in workflow context

3 participants

@TooTallNate@pranaygp
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix workflow stack traces (no more evalmachine) - #256

Merged
pranaygp merged 1 commit into
mainfrom
copilot/fix-sourcemap-tracking
Nov 9, 2025
Merged

Fix workflow stack traces (no more evalmachine)#256
pranaygp merged 1 commit into
mainfrom
copilot/fix-sourcemap-tracking

Conversation

CopilotAI commented Nov 7, 2025

Copy link
Copy Markdown
Contributor

Don't mind the broken dev test. it seems a bit flaky and gets fixed properly down the PR stack

Workflow code executes in a VM context via runInContext(), which defaults to evalmachine.<anonymous> in stack traces, making debugging difficult:

Error: test error
at addTenWorkflow (evalmachine.<anonymous>:451:9)
at async ...

Fixes#151

Solution

This PR implements comprehensive source map support for workflow stack traces by:

  1. Generating inline source maps in the intermediate workflow bundle
  2. Providing meaningful filenames to the VM context via runInContext()
  3. Remapping stack traces using inline source maps to show original source locations

Changes

Core Runtime

  • packages/core/src/source-map.ts (NEW) - Source map remapping logic using @jridgewell/trace-mapping
  • packages/core/src/workflow.ts - Use parseWorkflowName() to extract clean file paths and pass as filename parameter to runInContext()
  • packages/core/src/runtime.ts - Apply source map remapping to workflow error logs

Builder Configuration

  • packages/builders/src/base-builder.ts - Set intermediate workflow bundle to use sourcemap: 'inline' (the VM-executed code needs inline source maps)

Tests

  • packages/core/src/workflow.test.ts - Added test for nested stack traces
  • packages/core/e2e/e2e.test.ts - Added e2e test for cross-file error stack traces
  • workbench/example/workflows/helpers.ts (NEW) - Test helper module for verifying cross-file stack traces
  • workbench/example/workflows/99_e2e.ts - Added nestedErrorWorkflow and crossFileErrorWorkflow with helper functions

Dependencies

  • Added @jridgewell/trace-mapping to @workflow/core for pure-JS source map processing (no WASM dependency)

Results

Before

Error: test error
at addTenWorkflow (evalmachine.<anonymous>:451:9)

After - Simple Error

Error: test error
at addTenWorkflow (example/workflows/99_e2e.ts:23:10)

After - Nested Functions (Same File)

Error: Error from deeply nested function
at deepFunction (../example/workflows/99_e2e.ts:33:10)
at middleFunction (../example/workflows/99_e2e.ts:37:4)
at topLevelHelper (../example/workflows/99_e2e.ts:41:4)
at addTenWorkflow (../example/workflows/99_e2e.ts:24:4)

After - Cross-File Errors (Imported Modules)

Error: Error from imported helper module
at throwError (../example/workflows/helpers.ts:3:10)
at callThrower (../example/workflows/helpers.ts:6:4)
at crossFileErrorWorkflow (../example/workflows/99_e2e.ts:447:4)

Stack traces now correctly show:

  • ✅ Actual source file paths (not evalmachine.<anonymous>)
  • ✅ Correct function names
  • ✅ Source-mapped line and column numbers
  • ✅ Cross-file call chains with correct file paths for each frame

Testing

  • All 186 unit tests pass (including new nested stack trace test)
  • New e2e test validates cross-file error stack traces
  • Tested with nested errors, cross-file imports, and complex call stacks

Fixes#151


This is part 1 of 3 in a stack made with GitButler:

@changeset-bot

changeset-botBot commented Nov 7, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 8c93c65

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 11 packages
NameType
@workflow/buildersPatch
@workflow/corePatch
@workflow/cliPatch
@workflow/nextPatch
@workflow/nitroPatch
@workflow/sveltekitPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/world-testingPatch
@workflow/nuxtPatch
@workflow/aiPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Nov 7, 2025

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentPreviewCommentsUpdated (UTC)
example-nextjs-workflow-turbopackReadyReadyPreviewCommentNov 9, 2025 8:00pm
example-nextjs-workflow-webpackReadyReadyPreviewCommentNov 9, 2025 8:00pm
example-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-nitro-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-nuxt-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-sveltekit-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-vite-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workflow-docsReadyReadyPreviewCommentNov 9, 2025 8:00pm

@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from c93cf92 to 0343d72CompareNovember 8, 2025 05:19
@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from 0343d72 to 984e756CompareNovember 8, 2025 05:21
@pranaygppranaygp changed the title Fix workflow stack traces to show source filenames instead of evalmachineFix workflow stack traces (no more evalmachine)Nov 8, 2025
@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from 1f0f74d to b128b07CompareNovember 8, 2025 05:50
@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from b128b07 to 3ffca64CompareNovember 8, 2025 05:51
This was referenced Nov 8, 2025
Comment threadpackages/builders/src/base-builder.ts Outdated
Comment threadpackages/core/src/workflow.ts Outdated

@TooTallNateTooTallNate left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Couple small nits/questions, but otherwise :lgtm:

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Stack traces in workflow context

3 participants

@TooTallNate@pranaygp
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix workflow stack traces (no more evalmachine) - #256

Merged
pranaygp merged 1 commit into
mainfrom
copilot/fix-sourcemap-tracking
Nov 9, 2025
Merged

Fix workflow stack traces (no more evalmachine)#256
pranaygp merged 1 commit into
mainfrom
copilot/fix-sourcemap-tracking

Conversation

CopilotAI commented Nov 7, 2025

Copy link
Copy Markdown
Contributor

Don't mind the broken dev test. it seems a bit flaky and gets fixed properly down the PR stack

Workflow code executes in a VM context via runInContext(), which defaults to evalmachine.<anonymous> in stack traces, making debugging difficult:

Error: test error
at addTenWorkflow (evalmachine.<anonymous>:451:9)
at async ...

Fixes#151

Solution

This PR implements comprehensive source map support for workflow stack traces by:

  1. Generating inline source maps in the intermediate workflow bundle
  2. Providing meaningful filenames to the VM context via runInContext()
  3. Remapping stack traces using inline source maps to show original source locations

Changes

Core Runtime

  • packages/core/src/source-map.ts (NEW) - Source map remapping logic using @jridgewell/trace-mapping
  • packages/core/src/workflow.ts - Use parseWorkflowName() to extract clean file paths and pass as filename parameter to runInContext()
  • packages/core/src/runtime.ts - Apply source map remapping to workflow error logs

Builder Configuration

  • packages/builders/src/base-builder.ts - Set intermediate workflow bundle to use sourcemap: 'inline' (the VM-executed code needs inline source maps)

Tests

  • packages/core/src/workflow.test.ts - Added test for nested stack traces
  • packages/core/e2e/e2e.test.ts - Added e2e test for cross-file error stack traces
  • workbench/example/workflows/helpers.ts (NEW) - Test helper module for verifying cross-file stack traces
  • workbench/example/workflows/99_e2e.ts - Added nestedErrorWorkflow and crossFileErrorWorkflow with helper functions

Dependencies

  • Added @jridgewell/trace-mapping to @workflow/core for pure-JS source map processing (no WASM dependency)

Results

Before

Error: test error
at addTenWorkflow (evalmachine.<anonymous>:451:9)

After - Simple Error

Error: test error
at addTenWorkflow (example/workflows/99_e2e.ts:23:10)

After - Nested Functions (Same File)

Error: Error from deeply nested function
at deepFunction (../example/workflows/99_e2e.ts:33:10)
at middleFunction (../example/workflows/99_e2e.ts:37:4)
at topLevelHelper (../example/workflows/99_e2e.ts:41:4)
at addTenWorkflow (../example/workflows/99_e2e.ts:24:4)

After - Cross-File Errors (Imported Modules)

Error: Error from imported helper module
at throwError (../example/workflows/helpers.ts:3:10)
at callThrower (../example/workflows/helpers.ts:6:4)
at crossFileErrorWorkflow (../example/workflows/99_e2e.ts:447:4)

Stack traces now correctly show:

  • ✅ Actual source file paths (not evalmachine.<anonymous>)
  • ✅ Correct function names
  • ✅ Source-mapped line and column numbers
  • ✅ Cross-file call chains with correct file paths for each frame

Testing

  • All 186 unit tests pass (including new nested stack trace test)
  • New e2e test validates cross-file error stack traces
  • Tested with nested errors, cross-file imports, and complex call stacks

Fixes#151


This is part 1 of 3 in a stack made with GitButler:

@changeset-bot

changeset-botBot commented Nov 7, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 8c93c65

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 11 packages
NameType
@workflow/buildersPatch
@workflow/corePatch
@workflow/cliPatch
@workflow/nextPatch
@workflow/nitroPatch
@workflow/sveltekitPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/world-testingPatch
@workflow/nuxtPatch
@workflow/aiPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Nov 7, 2025

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentPreviewCommentsUpdated (UTC)
example-nextjs-workflow-turbopackReadyReadyPreviewCommentNov 9, 2025 8:00pm
example-nextjs-workflow-webpackReadyReadyPreviewCommentNov 9, 2025 8:00pm
example-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-nitro-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-nuxt-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-sveltekit-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-vite-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workflow-docsReadyReadyPreviewCommentNov 9, 2025 8:00pm

@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from c93cf92 to 0343d72CompareNovember 8, 2025 05:19
@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from 0343d72 to 984e756CompareNovember 8, 2025 05:21
@pranaygppranaygp changed the title Fix workflow stack traces to show source filenames instead of evalmachineFix workflow stack traces (no more evalmachine)Nov 8, 2025
@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from 1f0f74d to b128b07CompareNovember 8, 2025 05:50
@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from b128b07 to 3ffca64CompareNovember 8, 2025 05:51
This was referenced Nov 8, 2025
Comment threadpackages/builders/src/base-builder.ts Outdated
Comment threadpackages/core/src/workflow.ts Outdated

@TooTallNateTooTallNate left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Couple small nits/questions, but otherwise :lgtm:

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Stack traces in workflow context

3 participants

@TooTallNate@pranaygp
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Fix workflow stack traces (no more evalmachine) - #256

Merged
pranaygp merged 1 commit into
mainfrom
copilot/fix-sourcemap-tracking
Nov 9, 2025
Merged

Fix workflow stack traces (no more evalmachine)#256
pranaygp merged 1 commit into
mainfrom
copilot/fix-sourcemap-tracking

Conversation

CopilotAI commented Nov 7, 2025

Copy link
Copy Markdown
Contributor

Don't mind the broken dev test. it seems a bit flaky and gets fixed properly down the PR stack

Workflow code executes in a VM context via runInContext(), which defaults to evalmachine.<anonymous> in stack traces, making debugging difficult:

Error: test error
at addTenWorkflow (evalmachine.<anonymous>:451:9)
at async ...

Fixes#151

Solution

This PR implements comprehensive source map support for workflow stack traces by:

  1. Generating inline source maps in the intermediate workflow bundle
  2. Providing meaningful filenames to the VM context via runInContext()
  3. Remapping stack traces using inline source maps to show original source locations

Changes

Core Runtime

  • packages/core/src/source-map.ts (NEW) - Source map remapping logic using @jridgewell/trace-mapping
  • packages/core/src/workflow.ts - Use parseWorkflowName() to extract clean file paths and pass as filename parameter to runInContext()
  • packages/core/src/runtime.ts - Apply source map remapping to workflow error logs

Builder Configuration

  • packages/builders/src/base-builder.ts - Set intermediate workflow bundle to use sourcemap: 'inline' (the VM-executed code needs inline source maps)

Tests

  • packages/core/src/workflow.test.ts - Added test for nested stack traces
  • packages/core/e2e/e2e.test.ts - Added e2e test for cross-file error stack traces
  • workbench/example/workflows/helpers.ts (NEW) - Test helper module for verifying cross-file stack traces
  • workbench/example/workflows/99_e2e.ts - Added nestedErrorWorkflow and crossFileErrorWorkflow with helper functions

Dependencies

  • Added @jridgewell/trace-mapping to @workflow/core for pure-JS source map processing (no WASM dependency)

Results

Before

Error: test error
at addTenWorkflow (evalmachine.<anonymous>:451:9)

After - Simple Error

Error: test error
at addTenWorkflow (example/workflows/99_e2e.ts:23:10)

After - Nested Functions (Same File)

Error: Error from deeply nested function
at deepFunction (../example/workflows/99_e2e.ts:33:10)
at middleFunction (../example/workflows/99_e2e.ts:37:4)
at topLevelHelper (../example/workflows/99_e2e.ts:41:4)
at addTenWorkflow (../example/workflows/99_e2e.ts:24:4)

After - Cross-File Errors (Imported Modules)

Error: Error from imported helper module
at throwError (../example/workflows/helpers.ts:3:10)
at callThrower (../example/workflows/helpers.ts:6:4)
at crossFileErrorWorkflow (../example/workflows/99_e2e.ts:447:4)

Stack traces now correctly show:

  • ✅ Actual source file paths (not evalmachine.<anonymous>)
  • ✅ Correct function names
  • ✅ Source-mapped line and column numbers
  • ✅ Cross-file call chains with correct file paths for each frame

Testing

  • All 186 unit tests pass (including new nested stack trace test)
  • New e2e test validates cross-file error stack traces
  • Tested with nested errors, cross-file imports, and complex call stacks

Fixes#151


This is part 1 of 3 in a stack made with GitButler:

@changeset-bot

changeset-botBot commented Nov 7, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 8c93c65

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 11 packages
NameType
@workflow/buildersPatch
@workflow/corePatch
@workflow/cliPatch
@workflow/nextPatch
@workflow/nitroPatch
@workflow/sveltekitPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/world-testingPatch
@workflow/nuxtPatch
@workflow/aiPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Nov 7, 2025

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentPreviewCommentsUpdated (UTC)
example-nextjs-workflow-turbopackReadyReadyPreviewCommentNov 9, 2025 8:00pm
example-nextjs-workflow-webpackReadyReadyPreviewCommentNov 9, 2025 8:00pm
example-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-nitro-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-nuxt-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-sveltekit-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workbench-vite-workflowReadyReadyPreviewCommentNov 9, 2025 8:00pm
workflow-docsReadyReadyPreviewCommentNov 9, 2025 8:00pm

@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from c93cf92 to 0343d72CompareNovember 8, 2025 05:19
@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from 0343d72 to 984e756CompareNovember 8, 2025 05:21
@pranaygppranaygp changed the title Fix workflow stack traces to show source filenames instead of evalmachineFix workflow stack traces (no more evalmachine)Nov 8, 2025
@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from 1f0f74d to b128b07CompareNovember 8, 2025 05:50
@pranaygp
pranaygpforce-pushed the copilot/fix-sourcemap-tracking branch from b128b07 to 3ffca64CompareNovember 8, 2025 05:51
This was referenced Nov 8, 2025
Comment threadpackages/builders/src/base-builder.ts Outdated
Comment threadpackages/core/src/workflow.ts Outdated

@TooTallNateTooTallNate left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Couple small nits/questions, but otherwise :lgtm:

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Stack traces in workflow context

3 participants

@TooTallNate@pranaygp