[world-local] Finish renaming embedded world to local world - #441

Merged
VaguelySerious merged 14 commits into
mainfrom
peter/finish-embedded-local-rename
Dec 2, 2025
Merged

[world-local] Finish renaming embedded world to local world#441
VaguelySerious merged 14 commits into
mainfrom
peter/finish-embedded-local-rename

Conversation

@VaguelySerious

Copy link
Copy Markdown
Member

No description provided.

@vercel

vercelBot commented Nov 26, 2025

Copy link
Copy Markdown
Contributor

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

ProjectDeploymentPreviewCommentsUpdated (UTC)
example-nextjs-workflow-turbopackReadyReadyPreviewCommentNov 30, 2025 7:12pm
example-nextjs-workflow-webpackReadyReadyPreviewCommentNov 30, 2025 7:12pm
example-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-express-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-fastify-workflowErrorErrorNov 30, 2025 7:12pm
workbench-hono-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-nitro-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-nuxt-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-sveltekit-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-vite-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
1 Skipped Deployment
ProjectDeploymentPreviewCommentsUpdated (UTC)
workflow-docsSkippedSkippedNov 30, 2025 7:12pm

@changeset-bot

changeset-botBot commented Nov 26, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 9ba3c29

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

This PR includes changesets to release 14 packages
NameType
@workflow/world-postgresPatch
@workflow/world-testingPatch
@workflow/world-localPatch
@workflow/corePatch
@workflow/nextPatch
@workflow/cliPatch
@workflow/webPatch
@workflow/buildersPatch
@workflow/nitroPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/sveltekitPatch
@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

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔧 Build Fix:

The peer dependency specifier for @workflow/world-postgres is set to "*", which does not match prerelease versions when pnpm's frozen-lockfile validation is enabled. The specifier should be ">=4.1.0-beta.15" to match the current version in the workspace.

View Details
📝 Patch Details
diff --git a/packages/web/package.json b/packages/web/package.json
index eec8149..3b49cc0 100644
--- a/packages/web/package.json+++ b/packages/web/package.json@@ -29,7 +29,7 @@
"next": "15.5.4"
},
"peerDependencies": {
- "@workflow/world-postgres": "*"+ "@workflow/world-postgres": ">=4.1.0-beta.15"
},
"peerDependenciesMeta": {
"@workflow/world-postgres": {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 0d1684f..ae9dccb 100644
--- a/pnpm-lock.yaml+++ b/pnpm-lock.yaml@@ -776,7 +776,7 @@ importers:
packages/web:
dependencies:
'@workflow/world-postgres':
- specifier: '*'+ specifier: '>=4.1.0-beta.15'
version: 4.1.0-beta.15(@opentelemetry/api@1.9.0)(better-sqlite3@11.10.0)(pg@8.16.3)
next:
specifier: 15.5.4

Analysis

pnpm frozen-lockfile incompatible with prerelease peer dependency version

What fails:pnpm install --frozen-lockfile fails during the Vercel build because the peer dependency constraint in @workflow/web does not satisfy the prerelease version of @workflow/world-postgres.

How to reproduce:

pnpm install --frozen-lockfile

Result:

[ERROR] ERR_PNPM_OUTDATED_LOCKFILE Cannot install with "frozen-lockfile" because pnpm-lock.yaml is not up to date with <ROOT>/packages/web/package.json
[ERROR] Failure reason:
[ERROR] The importer resolution is broken at dependency "@workflow/world-postgres": version "4.1.0-beta.15" doesn't satisfy range "*"
[ERROR] Error: Command "pnpm install" exited with 1

Root cause: The packages/web/package.json declares @workflow/world-postgres as an optional peer dependency with specifier "*", but pnpm's frozen-lockfile mode does not consider prerelease versions (like 4.1.0-beta.15) to match the "*" range. The pnpm-lock.yaml had become out of sync with the package.json.

Fix: Update the peer dependency specifier to explicitly include the prerelease version constraint ">=4.1.0-beta.15" so that pnpm can validate the lockfile correctly with frozen-lockfile enabled.

Fix on Vercel

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Additional Suggestion:

The KNOWN_WORLDS array still has id: 'embedded' and displayName: 'Embedded', but the codebase now expects the backend to be 'local'. This will cause UI feature detection and conditional logic to fail.

View Details
📝 Patch Details
diff --git a/packages/web/src/lib/config-world.ts b/packages/web/src/lib/config-world.ts
index f2989b2..635b413 100644
--- a/packages/web/src/lib/config-world.ts+++ b/packages/web/src/lib/config-world.ts@@ -37,7 +37,7 @@ export interface WorldAvailability {
/**
* Check which world packages are installed.
*
- * Built-in worlds (embedded, vercel) are always available.+ * Built-in worlds (local, vercel) are always available.
* Third-party worlds are checked by attempting to resolve their package.
*/
export async function checkWorldsAvailability(): Promise<WorldAvailability[]> {
diff --git a/packages/web/src/lib/known-worlds.ts b/packages/web/src/lib/known-worlds.ts
index d26a61e..70af02f 100644
--- a/packages/web/src/lib/known-worlds.ts+++ b/packages/web/src/lib/known-worlds.ts@@ -22,13 +22,13 @@ export interface KnownWorld {
/**
* List of known worlds that can be configured in the UI.
*
- * Built-in worlds (embedded, vercel) are always available as they're bundled+ * Built-in worlds (local, vercel) are always available as they're bundled
* with @workflow/core. Third-party worlds need to be installed separately.
*/
export const KNOWN_WORLDS: KnownWorld[] = [
{
- id: 'embedded',- displayName: 'Embedded',+ id: 'local',+ displayName: 'Local',
packageName: null,
description: 'Local file-based storage, ideal for development',
isBuiltIn: true,

Analysis

KNOWN_WORLDS array has incorrect id 'embedded' instead of 'local'

What fails: The settings sidebar backend selector shows "Embedded" as the first option, but when selected, it sets backend: 'embedded'. All conditional logic throughout the codebase checks for backend === 'local', causing the local backend UI features (Port, Data Directory fields) to fail to render.

How to reproduce:

  1. Open the settings sidebar in the workflow web UI
  2. Click on the Backend dropdown
  3. Select "Embedded" (first option)
  4. Observe: Port and Data Directory input fields do NOT appear
  5. The isLocal check in settings-sidebar.tsx (line 38) returns false, so the local-specific fields remain hidden

Result: When the first world is selected from the dropdown, backend becomes 'embedded' (from KNOWN_WORLDS[0].id), but all checks throughout the code look for backend === 'local':

  • settings-sidebar.tsx line 38: const isLocal = backend === 'local'; → returns false
  • connection-status.tsx line 28: if (backend === 'local') → skipped
  • config-world.ts line 76: if (backend === 'local') → validation skipped

Expected: The first world should have id: 'local' and displayName: 'Local' to match the backend === 'local' checks used throughout the codebase and the default value of backend: 'local' in config.ts.

Root cause: The KNOWN_WORLDS array was added after the embedding-to-local rename refactoring (commit 78e3917) was completed. The file was created in commit 109fe59 with the old 'embedded' identifier instead of the 'local' identifier used everywhere else.

Fix on Vercel

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Additional Suggestion:

The documentation contains 19 outdated references to the old createEmbeddedWorld function name and WORKFLOW_EMBEDDED_* environment variables that should be createLocalWorld and WORKFLOW_LOCAL_* respectively.

View Details
📝 Patch Details
diff --git a/docs/content/docs/deploying/world/local-world.mdx b/docs/content/docs/deploying/world/local-world.mdx
index 717736e..ddd7a57 100644
--- a/docs/content/docs/deploying/world/local-world.mdx+++ b/docs/content/docs/deploying/world/local-world.mdx@@ -62,15 +62,15 @@ By default, workflow data is stored in `.workflow-data/` in your project root. T
**Environment variable:**
```bash
-export WORKFLOW_EMBEDDED_DATA_DIR=./custom-workflow-data+export WORKFLOW_LOCAL_DATA_DIR=./custom-workflow-data
```
**Programmatically:**
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';-const world = createEmbeddedWorld({ dataDir: './custom-workflow-data' });+const world = createLocalWorld({ dataDir: './custom-workflow-data' });
```
### Port
@@ -80,10 +80,10 @@ By default, the local world **automatically detects** which port your applicatio
**Auto-detection example** (recommended):
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';
// Port is automatically detected - no configuration needed!
-const world = createEmbeddedWorld();+const world = createLocalWorld();
```
If auto-detection fails, the world will fall back to the `PORT` environment variable, then to port `3000`.
@@ -93,9 +93,9 @@ If auto-detection fails, the world will fall back to the `PORT` environment vari
You can override the auto-detected port by specifying it explicitly:
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';-const world = createEmbeddedWorld({ port: 3000 });+const world = createLocalWorld({ port: 3000 });
```
### Base URL
@@ -111,21 +111,21 @@ For advanced use cases like HTTPS or custom hostnames, you can override the enti
**Environment variable:**
```bash
-export WORKFLOW_EMBEDDED_BASE_URL=https://local.example.com:3000+export WORKFLOW_LOCAL_BASE_URL=https://local.example.com:3000
```
**Programmatically:**
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';
// HTTPS
-const world = createEmbeddedWorld({+const world = createLocalWorld({
baseUrl: 'https://localhost:3000'
});
// Custom hostname
-const world = createEmbeddedWorld({+const world = createLocalWorld({
baseUrl: 'https://local.example.com:3000'
});
```
@@ -203,12 +203,12 @@ For production deployments, use the [Vercel World](/docs/deploying/world/vercel-
## API Reference
-### `createEmbeddedWorld`+### `createLocalWorld`
Creates a local world instance:
```typescript
-function createEmbeddedWorld(+function createLocalWorld(
args?: Partial<{
dataDir: string;
port: number;
@@ -220,9 +220,9 @@ function createEmbeddedWorld(
**Parameters:**
- `args` - Optional configuration object:
- - `dataDir` - Directory for storing workflow data (default: `.workflow-data/` or `WORKFLOW_EMBEDDED_DATA_DIR` env var)+ - `dataDir` - Directory for storing workflow data (default: `.workflow-data/` or `WORKFLOW_LOCAL_DATA_DIR` env var)
- `port` - Port override for queue transport (default: auto-detected → `PORT` env var → `3000`)
- - `baseUrl` - Full base URL override for queue transport (default: `http://localhost:{port}` or `WORKFLOW_EMBEDDED_BASE_URL` env var)+ - `baseUrl` - Full base URL override for queue transport (default: `http://localhost:{port}` or `WORKFLOW_LOCAL_BASE_URL` env var)
**Returns:**
@@ -231,24 +231,24 @@ function createEmbeddedWorld(
**Examples:**
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';
// Use all defaults (recommended - auto-detects port)
-const world = createEmbeddedWorld();+const world = createLocalWorld();
// Custom data directory
-const world = createEmbeddedWorld({ dataDir: './my-data' });+const world = createLocalWorld({ dataDir: './my-data' });
// Override port
-const world = createEmbeddedWorld({ port: 3000 });+const world = createLocalWorld({ port: 3000 });
// HTTPS with custom hostname
-const world = createEmbeddedWorld({+const world = createLocalWorld({
baseUrl: 'https://local.example.com:3000'
});
// Multiple options
-const world = createEmbeddedWorld({+const world = createLocalWorld({
dataDir: './my-data',
baseUrl: 'https://localhost:3000'
});

Analysis

Documentation contains outdated references to renamed createEmbeddedWorld function and environment variables

What fails: Developers following code examples in docs/content/docs/deploying/world/local-world.mdx will get import errors because the documented createEmbeddedWorld function no longer exists - it was renamed to createLocalWorld in the source code. Similarly, environment variable references to WORKFLOW_EMBEDDED_DATA_DIR and WORKFLOW_EMBEDDED_BASE_URL are outdated - they should be WORKFLOW_LOCAL_DATA_DIR and WORKFLOW_LOCAL_BASE_URL.

How to reproduce:

  1. Read the documentation at docs/content/docs/deploying/world/local-world.mdx
  2. Copy any of the code examples that uses createEmbeddedWorld
  3. Try to use it in a project: import { createEmbeddedWorld } from '@workflow/world-local'
  4. Get error: Module @workflow/world-local has no exported member named createEmbeddedWorld

Evidence of the issue:

  • Source code in packages/world-local/src/index.ts exports only createLocalWorld(), not createEmbeddedWorld()
  • Config in packages/world-local/src/config.ts uses WORKFLOW_LOCAL_DATA_DIR and WORKFLOW_LOCAL_BASE_URL environment variables
  • Core orchestrator in packages/core/src/runtime/world.ts imports createLocalWorld (confirming the API has been renamed)
  • Documentation contained 19 references to the old function name and environment variable names across multiple code examples and API reference sections

Resolution: Replaced all occurrences of:

  • createEmbeddedWorldcreateLocalWorld
  • WORKFLOW_EMBEDDED_DATA_DIRWORKFLOW_LOCAL_DATA_DIR
  • WORKFLOW_EMBEDDED_BASE_URLWORKFLOW_LOCAL_BASE_URL

This ensures developers can now copy working code examples from the documentation.

Fix on Vercel

vercelBotand others added 5 commits November 30, 2025 19:08
…Name: 'Embedded'`\, but the codebase now expects the backend to be `'local'`\. This will cause UI feature detection and conditional logic to fail\.
…eateEmbeddedWorld` function name and `WORKFLOW_EMBEDDED_*` environment variables that should be `createLocalWorld` and `WORKFLOW_LOCAL_*` respectively\.
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.

3 participants

@VaguelySerious@TooTallNate@adriandlam
, '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

[world-local] Finish renaming embedded world to local world - #441

Merged
VaguelySerious merged 14 commits into
mainfrom
peter/finish-embedded-local-rename
Dec 2, 2025
Merged

[world-local] Finish renaming embedded world to local world#441
VaguelySerious merged 14 commits into
mainfrom
peter/finish-embedded-local-rename

Conversation

@VaguelySerious

Copy link
Copy Markdown
Member

No description provided.

@vercel

vercelBot commented Nov 26, 2025

Copy link
Copy Markdown
Contributor

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

ProjectDeploymentPreviewCommentsUpdated (UTC)
example-nextjs-workflow-turbopackReadyReadyPreviewCommentNov 30, 2025 7:12pm
example-nextjs-workflow-webpackReadyReadyPreviewCommentNov 30, 2025 7:12pm
example-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-express-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-fastify-workflowErrorErrorNov 30, 2025 7:12pm
workbench-hono-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-nitro-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-nuxt-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-sveltekit-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-vite-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
1 Skipped Deployment
ProjectDeploymentPreviewCommentsUpdated (UTC)
workflow-docsSkippedSkippedNov 30, 2025 7:12pm

@changeset-bot

changeset-botBot commented Nov 26, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 9ba3c29

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

This PR includes changesets to release 14 packages
NameType
@workflow/world-postgresPatch
@workflow/world-testingPatch
@workflow/world-localPatch
@workflow/corePatch
@workflow/nextPatch
@workflow/cliPatch
@workflow/webPatch
@workflow/buildersPatch
@workflow/nitroPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/sveltekitPatch
@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

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔧 Build Fix:

The peer dependency specifier for @workflow/world-postgres is set to "*", which does not match prerelease versions when pnpm's frozen-lockfile validation is enabled. The specifier should be ">=4.1.0-beta.15" to match the current version in the workspace.

View Details
📝 Patch Details
diff --git a/packages/web/package.json b/packages/web/package.json
index eec8149..3b49cc0 100644
--- a/packages/web/package.json+++ b/packages/web/package.json@@ -29,7 +29,7 @@
"next": "15.5.4"
},
"peerDependencies": {
- "@workflow/world-postgres": "*"+ "@workflow/world-postgres": ">=4.1.0-beta.15"
},
"peerDependenciesMeta": {
"@workflow/world-postgres": {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 0d1684f..ae9dccb 100644
--- a/pnpm-lock.yaml+++ b/pnpm-lock.yaml@@ -776,7 +776,7 @@ importers:
packages/web:
dependencies:
'@workflow/world-postgres':
- specifier: '*'+ specifier: '>=4.1.0-beta.15'
version: 4.1.0-beta.15(@opentelemetry/api@1.9.0)(better-sqlite3@11.10.0)(pg@8.16.3)
next:
specifier: 15.5.4

Analysis

pnpm frozen-lockfile incompatible with prerelease peer dependency version

What fails:pnpm install --frozen-lockfile fails during the Vercel build because the peer dependency constraint in @workflow/web does not satisfy the prerelease version of @workflow/world-postgres.

How to reproduce:

pnpm install --frozen-lockfile

Result:

[ERROR] ERR_PNPM_OUTDATED_LOCKFILE Cannot install with "frozen-lockfile" because pnpm-lock.yaml is not up to date with <ROOT>/packages/web/package.json
[ERROR] Failure reason:
[ERROR] The importer resolution is broken at dependency "@workflow/world-postgres": version "4.1.0-beta.15" doesn't satisfy range "*"
[ERROR] Error: Command "pnpm install" exited with 1

Root cause: The packages/web/package.json declares @workflow/world-postgres as an optional peer dependency with specifier "*", but pnpm's frozen-lockfile mode does not consider prerelease versions (like 4.1.0-beta.15) to match the "*" range. The pnpm-lock.yaml had become out of sync with the package.json.

Fix: Update the peer dependency specifier to explicitly include the prerelease version constraint ">=4.1.0-beta.15" so that pnpm can validate the lockfile correctly with frozen-lockfile enabled.

Fix on Vercel

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Additional Suggestion:

The KNOWN_WORLDS array still has id: 'embedded' and displayName: 'Embedded', but the codebase now expects the backend to be 'local'. This will cause UI feature detection and conditional logic to fail.

View Details
📝 Patch Details
diff --git a/packages/web/src/lib/config-world.ts b/packages/web/src/lib/config-world.ts
index f2989b2..635b413 100644
--- a/packages/web/src/lib/config-world.ts+++ b/packages/web/src/lib/config-world.ts@@ -37,7 +37,7 @@ export interface WorldAvailability {
/**
* Check which world packages are installed.
*
- * Built-in worlds (embedded, vercel) are always available.+ * Built-in worlds (local, vercel) are always available.
* Third-party worlds are checked by attempting to resolve their package.
*/
export async function checkWorldsAvailability(): Promise<WorldAvailability[]> {
diff --git a/packages/web/src/lib/known-worlds.ts b/packages/web/src/lib/known-worlds.ts
index d26a61e..70af02f 100644
--- a/packages/web/src/lib/known-worlds.ts+++ b/packages/web/src/lib/known-worlds.ts@@ -22,13 +22,13 @@ export interface KnownWorld {
/**
* List of known worlds that can be configured in the UI.
*
- * Built-in worlds (embedded, vercel) are always available as they're bundled+ * Built-in worlds (local, vercel) are always available as they're bundled
* with @workflow/core. Third-party worlds need to be installed separately.
*/
export const KNOWN_WORLDS: KnownWorld[] = [
{
- id: 'embedded',- displayName: 'Embedded',+ id: 'local',+ displayName: 'Local',
packageName: null,
description: 'Local file-based storage, ideal for development',
isBuiltIn: true,

Analysis

KNOWN_WORLDS array has incorrect id 'embedded' instead of 'local'

What fails: The settings sidebar backend selector shows "Embedded" as the first option, but when selected, it sets backend: 'embedded'. All conditional logic throughout the codebase checks for backend === 'local', causing the local backend UI features (Port, Data Directory fields) to fail to render.

How to reproduce:

  1. Open the settings sidebar in the workflow web UI
  2. Click on the Backend dropdown
  3. Select "Embedded" (first option)
  4. Observe: Port and Data Directory input fields do NOT appear
  5. The isLocal check in settings-sidebar.tsx (line 38) returns false, so the local-specific fields remain hidden

Result: When the first world is selected from the dropdown, backend becomes 'embedded' (from KNOWN_WORLDS[0].id), but all checks throughout the code look for backend === 'local':

  • settings-sidebar.tsx line 38: const isLocal = backend === 'local'; → returns false
  • connection-status.tsx line 28: if (backend === 'local') → skipped
  • config-world.ts line 76: if (backend === 'local') → validation skipped

Expected: The first world should have id: 'local' and displayName: 'Local' to match the backend === 'local' checks used throughout the codebase and the default value of backend: 'local' in config.ts.

Root cause: The KNOWN_WORLDS array was added after the embedding-to-local rename refactoring (commit 78e3917) was completed. The file was created in commit 109fe59 with the old 'embedded' identifier instead of the 'local' identifier used everywhere else.

Fix on Vercel

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Additional Suggestion:

The documentation contains 19 outdated references to the old createEmbeddedWorld function name and WORKFLOW_EMBEDDED_* environment variables that should be createLocalWorld and WORKFLOW_LOCAL_* respectively.

View Details
📝 Patch Details
diff --git a/docs/content/docs/deploying/world/local-world.mdx b/docs/content/docs/deploying/world/local-world.mdx
index 717736e..ddd7a57 100644
--- a/docs/content/docs/deploying/world/local-world.mdx+++ b/docs/content/docs/deploying/world/local-world.mdx@@ -62,15 +62,15 @@ By default, workflow data is stored in `.workflow-data/` in your project root. T
**Environment variable:**
```bash
-export WORKFLOW_EMBEDDED_DATA_DIR=./custom-workflow-data+export WORKFLOW_LOCAL_DATA_DIR=./custom-workflow-data
```
**Programmatically:**
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';-const world = createEmbeddedWorld({ dataDir: './custom-workflow-data' });+const world = createLocalWorld({ dataDir: './custom-workflow-data' });
```
### Port
@@ -80,10 +80,10 @@ By default, the local world **automatically detects** which port your applicatio
**Auto-detection example** (recommended):
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';
// Port is automatically detected - no configuration needed!
-const world = createEmbeddedWorld();+const world = createLocalWorld();
```
If auto-detection fails, the world will fall back to the `PORT` environment variable, then to port `3000`.
@@ -93,9 +93,9 @@ If auto-detection fails, the world will fall back to the `PORT` environment vari
You can override the auto-detected port by specifying it explicitly:
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';-const world = createEmbeddedWorld({ port: 3000 });+const world = createLocalWorld({ port: 3000 });
```
### Base URL
@@ -111,21 +111,21 @@ For advanced use cases like HTTPS or custom hostnames, you can override the enti
**Environment variable:**
```bash
-export WORKFLOW_EMBEDDED_BASE_URL=https://local.example.com:3000+export WORKFLOW_LOCAL_BASE_URL=https://local.example.com:3000
```
**Programmatically:**
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';
// HTTPS
-const world = createEmbeddedWorld({+const world = createLocalWorld({
baseUrl: 'https://localhost:3000'
});
// Custom hostname
-const world = createEmbeddedWorld({+const world = createLocalWorld({
baseUrl: 'https://local.example.com:3000'
});
```
@@ -203,12 +203,12 @@ For production deployments, use the [Vercel World](/docs/deploying/world/vercel-
## API Reference
-### `createEmbeddedWorld`+### `createLocalWorld`
Creates a local world instance:
```typescript
-function createEmbeddedWorld(+function createLocalWorld(
args?: Partial<{
dataDir: string;
port: number;
@@ -220,9 +220,9 @@ function createEmbeddedWorld(
**Parameters:**
- `args` - Optional configuration object:
- - `dataDir` - Directory for storing workflow data (default: `.workflow-data/` or `WORKFLOW_EMBEDDED_DATA_DIR` env var)+ - `dataDir` - Directory for storing workflow data (default: `.workflow-data/` or `WORKFLOW_LOCAL_DATA_DIR` env var)
- `port` - Port override for queue transport (default: auto-detected → `PORT` env var → `3000`)
- - `baseUrl` - Full base URL override for queue transport (default: `http://localhost:{port}` or `WORKFLOW_EMBEDDED_BASE_URL` env var)+ - `baseUrl` - Full base URL override for queue transport (default: `http://localhost:{port}` or `WORKFLOW_LOCAL_BASE_URL` env var)
**Returns:**
@@ -231,24 +231,24 @@ function createEmbeddedWorld(
**Examples:**
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';
// Use all defaults (recommended - auto-detects port)
-const world = createEmbeddedWorld();+const world = createLocalWorld();
// Custom data directory
-const world = createEmbeddedWorld({ dataDir: './my-data' });+const world = createLocalWorld({ dataDir: './my-data' });
// Override port
-const world = createEmbeddedWorld({ port: 3000 });+const world = createLocalWorld({ port: 3000 });
// HTTPS with custom hostname
-const world = createEmbeddedWorld({+const world = createLocalWorld({
baseUrl: 'https://local.example.com:3000'
});
// Multiple options
-const world = createEmbeddedWorld({+const world = createLocalWorld({
dataDir: './my-data',
baseUrl: 'https://localhost:3000'
});

Analysis

Documentation contains outdated references to renamed createEmbeddedWorld function and environment variables

What fails: Developers following code examples in docs/content/docs/deploying/world/local-world.mdx will get import errors because the documented createEmbeddedWorld function no longer exists - it was renamed to createLocalWorld in the source code. Similarly, environment variable references to WORKFLOW_EMBEDDED_DATA_DIR and WORKFLOW_EMBEDDED_BASE_URL are outdated - they should be WORKFLOW_LOCAL_DATA_DIR and WORKFLOW_LOCAL_BASE_URL.

How to reproduce:

  1. Read the documentation at docs/content/docs/deploying/world/local-world.mdx
  2. Copy any of the code examples that uses createEmbeddedWorld
  3. Try to use it in a project: import { createEmbeddedWorld } from '@workflow/world-local'
  4. Get error: Module @workflow/world-local has no exported member named createEmbeddedWorld

Evidence of the issue:

  • Source code in packages/world-local/src/index.ts exports only createLocalWorld(), not createEmbeddedWorld()
  • Config in packages/world-local/src/config.ts uses WORKFLOW_LOCAL_DATA_DIR and WORKFLOW_LOCAL_BASE_URL environment variables
  • Core orchestrator in packages/core/src/runtime/world.ts imports createLocalWorld (confirming the API has been renamed)
  • Documentation contained 19 references to the old function name and environment variable names across multiple code examples and API reference sections

Resolution: Replaced all occurrences of:

  • createEmbeddedWorldcreateLocalWorld
  • WORKFLOW_EMBEDDED_DATA_DIRWORKFLOW_LOCAL_DATA_DIR
  • WORKFLOW_EMBEDDED_BASE_URLWORKFLOW_LOCAL_BASE_URL

This ensures developers can now copy working code examples from the documentation.

Fix on Vercel

vercelBotand others added 5 commits November 30, 2025 19:08
…Name: 'Embedded'`\, but the codebase now expects the backend to be `'local'`\. This will cause UI feature detection and conditional logic to fail\.
…eateEmbeddedWorld` function name and `WORKFLOW_EMBEDDED_*` environment variables that should be `createLocalWorld` and `WORKFLOW_LOCAL_*` respectively\.
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.

3 participants

@VaguelySerious@TooTallNate@adriandlam
, '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

[world-local] Finish renaming embedded world to local world - #441

Merged
VaguelySerious merged 14 commits into
mainfrom
peter/finish-embedded-local-rename
Dec 2, 2025
Merged

[world-local] Finish renaming embedded world to local world#441
VaguelySerious merged 14 commits into
mainfrom
peter/finish-embedded-local-rename

Conversation

@VaguelySerious

Copy link
Copy Markdown
Member

No description provided.

@vercel

vercelBot commented Nov 26, 2025

Copy link
Copy Markdown
Contributor

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

ProjectDeploymentPreviewCommentsUpdated (UTC)
example-nextjs-workflow-turbopackReadyReadyPreviewCommentNov 30, 2025 7:12pm
example-nextjs-workflow-webpackReadyReadyPreviewCommentNov 30, 2025 7:12pm
example-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-express-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-fastify-workflowErrorErrorNov 30, 2025 7:12pm
workbench-hono-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-nitro-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-nuxt-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-sveltekit-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-vite-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
1 Skipped Deployment
ProjectDeploymentPreviewCommentsUpdated (UTC)
workflow-docsSkippedSkippedNov 30, 2025 7:12pm

@changeset-bot

changeset-botBot commented Nov 26, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 9ba3c29

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

This PR includes changesets to release 14 packages
NameType
@workflow/world-postgresPatch
@workflow/world-testingPatch
@workflow/world-localPatch
@workflow/corePatch
@workflow/nextPatch
@workflow/cliPatch
@workflow/webPatch
@workflow/buildersPatch
@workflow/nitroPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/sveltekitPatch
@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

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔧 Build Fix:

The peer dependency specifier for @workflow/world-postgres is set to "*", which does not match prerelease versions when pnpm's frozen-lockfile validation is enabled. The specifier should be ">=4.1.0-beta.15" to match the current version in the workspace.

View Details
📝 Patch Details
diff --git a/packages/web/package.json b/packages/web/package.json
index eec8149..3b49cc0 100644
--- a/packages/web/package.json+++ b/packages/web/package.json@@ -29,7 +29,7 @@
"next": "15.5.4"
},
"peerDependencies": {
- "@workflow/world-postgres": "*"+ "@workflow/world-postgres": ">=4.1.0-beta.15"
},
"peerDependenciesMeta": {
"@workflow/world-postgres": {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 0d1684f..ae9dccb 100644
--- a/pnpm-lock.yaml+++ b/pnpm-lock.yaml@@ -776,7 +776,7 @@ importers:
packages/web:
dependencies:
'@workflow/world-postgres':
- specifier: '*'+ specifier: '>=4.1.0-beta.15'
version: 4.1.0-beta.15(@opentelemetry/api@1.9.0)(better-sqlite3@11.10.0)(pg@8.16.3)
next:
specifier: 15.5.4

Analysis

pnpm frozen-lockfile incompatible with prerelease peer dependency version

What fails:pnpm install --frozen-lockfile fails during the Vercel build because the peer dependency constraint in @workflow/web does not satisfy the prerelease version of @workflow/world-postgres.

How to reproduce:

pnpm install --frozen-lockfile

Result:

[ERROR] ERR_PNPM_OUTDATED_LOCKFILE Cannot install with "frozen-lockfile" because pnpm-lock.yaml is not up to date with <ROOT>/packages/web/package.json
[ERROR] Failure reason:
[ERROR] The importer resolution is broken at dependency "@workflow/world-postgres": version "4.1.0-beta.15" doesn't satisfy range "*"
[ERROR] Error: Command "pnpm install" exited with 1

Root cause: The packages/web/package.json declares @workflow/world-postgres as an optional peer dependency with specifier "*", but pnpm's frozen-lockfile mode does not consider prerelease versions (like 4.1.0-beta.15) to match the "*" range. The pnpm-lock.yaml had become out of sync with the package.json.

Fix: Update the peer dependency specifier to explicitly include the prerelease version constraint ">=4.1.0-beta.15" so that pnpm can validate the lockfile correctly with frozen-lockfile enabled.

Fix on Vercel

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Additional Suggestion:

The KNOWN_WORLDS array still has id: 'embedded' and displayName: 'Embedded', but the codebase now expects the backend to be 'local'. This will cause UI feature detection and conditional logic to fail.

View Details
📝 Patch Details
diff --git a/packages/web/src/lib/config-world.ts b/packages/web/src/lib/config-world.ts
index f2989b2..635b413 100644
--- a/packages/web/src/lib/config-world.ts+++ b/packages/web/src/lib/config-world.ts@@ -37,7 +37,7 @@ export interface WorldAvailability {
/**
* Check which world packages are installed.
*
- * Built-in worlds (embedded, vercel) are always available.+ * Built-in worlds (local, vercel) are always available.
* Third-party worlds are checked by attempting to resolve their package.
*/
export async function checkWorldsAvailability(): Promise<WorldAvailability[]> {
diff --git a/packages/web/src/lib/known-worlds.ts b/packages/web/src/lib/known-worlds.ts
index d26a61e..70af02f 100644
--- a/packages/web/src/lib/known-worlds.ts+++ b/packages/web/src/lib/known-worlds.ts@@ -22,13 +22,13 @@ export interface KnownWorld {
/**
* List of known worlds that can be configured in the UI.
*
- * Built-in worlds (embedded, vercel) are always available as they're bundled+ * Built-in worlds (local, vercel) are always available as they're bundled
* with @workflow/core. Third-party worlds need to be installed separately.
*/
export const KNOWN_WORLDS: KnownWorld[] = [
{
- id: 'embedded',- displayName: 'Embedded',+ id: 'local',+ displayName: 'Local',
packageName: null,
description: 'Local file-based storage, ideal for development',
isBuiltIn: true,

Analysis

KNOWN_WORLDS array has incorrect id 'embedded' instead of 'local'

What fails: The settings sidebar backend selector shows "Embedded" as the first option, but when selected, it sets backend: 'embedded'. All conditional logic throughout the codebase checks for backend === 'local', causing the local backend UI features (Port, Data Directory fields) to fail to render.

How to reproduce:

  1. Open the settings sidebar in the workflow web UI
  2. Click on the Backend dropdown
  3. Select "Embedded" (first option)
  4. Observe: Port and Data Directory input fields do NOT appear
  5. The isLocal check in settings-sidebar.tsx (line 38) returns false, so the local-specific fields remain hidden

Result: When the first world is selected from the dropdown, backend becomes 'embedded' (from KNOWN_WORLDS[0].id), but all checks throughout the code look for backend === 'local':

  • settings-sidebar.tsx line 38: const isLocal = backend === 'local'; → returns false
  • connection-status.tsx line 28: if (backend === 'local') → skipped
  • config-world.ts line 76: if (backend === 'local') → validation skipped

Expected: The first world should have id: 'local' and displayName: 'Local' to match the backend === 'local' checks used throughout the codebase and the default value of backend: 'local' in config.ts.

Root cause: The KNOWN_WORLDS array was added after the embedding-to-local rename refactoring (commit 78e3917) was completed. The file was created in commit 109fe59 with the old 'embedded' identifier instead of the 'local' identifier used everywhere else.

Fix on Vercel

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Additional Suggestion:

The documentation contains 19 outdated references to the old createEmbeddedWorld function name and WORKFLOW_EMBEDDED_* environment variables that should be createLocalWorld and WORKFLOW_LOCAL_* respectively.

View Details
📝 Patch Details
diff --git a/docs/content/docs/deploying/world/local-world.mdx b/docs/content/docs/deploying/world/local-world.mdx
index 717736e..ddd7a57 100644
--- a/docs/content/docs/deploying/world/local-world.mdx+++ b/docs/content/docs/deploying/world/local-world.mdx@@ -62,15 +62,15 @@ By default, workflow data is stored in `.workflow-data/` in your project root. T
**Environment variable:**
```bash
-export WORKFLOW_EMBEDDED_DATA_DIR=./custom-workflow-data+export WORKFLOW_LOCAL_DATA_DIR=./custom-workflow-data
```
**Programmatically:**
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';-const world = createEmbeddedWorld({ dataDir: './custom-workflow-data' });+const world = createLocalWorld({ dataDir: './custom-workflow-data' });
```
### Port
@@ -80,10 +80,10 @@ By default, the local world **automatically detects** which port your applicatio
**Auto-detection example** (recommended):
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';
// Port is automatically detected - no configuration needed!
-const world = createEmbeddedWorld();+const world = createLocalWorld();
```
If auto-detection fails, the world will fall back to the `PORT` environment variable, then to port `3000`.
@@ -93,9 +93,9 @@ If auto-detection fails, the world will fall back to the `PORT` environment vari
You can override the auto-detected port by specifying it explicitly:
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';-const world = createEmbeddedWorld({ port: 3000 });+const world = createLocalWorld({ port: 3000 });
```
### Base URL
@@ -111,21 +111,21 @@ For advanced use cases like HTTPS or custom hostnames, you can override the enti
**Environment variable:**
```bash
-export WORKFLOW_EMBEDDED_BASE_URL=https://local.example.com:3000+export WORKFLOW_LOCAL_BASE_URL=https://local.example.com:3000
```
**Programmatically:**
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';
// HTTPS
-const world = createEmbeddedWorld({+const world = createLocalWorld({
baseUrl: 'https://localhost:3000'
});
// Custom hostname
-const world = createEmbeddedWorld({+const world = createLocalWorld({
baseUrl: 'https://local.example.com:3000'
});
```
@@ -203,12 +203,12 @@ For production deployments, use the [Vercel World](/docs/deploying/world/vercel-
## API Reference
-### `createEmbeddedWorld`+### `createLocalWorld`
Creates a local world instance:
```typescript
-function createEmbeddedWorld(+function createLocalWorld(
args?: Partial<{
dataDir: string;
port: number;
@@ -220,9 +220,9 @@ function createEmbeddedWorld(
**Parameters:**
- `args` - Optional configuration object:
- - `dataDir` - Directory for storing workflow data (default: `.workflow-data/` or `WORKFLOW_EMBEDDED_DATA_DIR` env var)+ - `dataDir` - Directory for storing workflow data (default: `.workflow-data/` or `WORKFLOW_LOCAL_DATA_DIR` env var)
- `port` - Port override for queue transport (default: auto-detected → `PORT` env var → `3000`)
- - `baseUrl` - Full base URL override for queue transport (default: `http://localhost:{port}` or `WORKFLOW_EMBEDDED_BASE_URL` env var)+ - `baseUrl` - Full base URL override for queue transport (default: `http://localhost:{port}` or `WORKFLOW_LOCAL_BASE_URL` env var)
**Returns:**
@@ -231,24 +231,24 @@ function createEmbeddedWorld(
**Examples:**
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';
// Use all defaults (recommended - auto-detects port)
-const world = createEmbeddedWorld();+const world = createLocalWorld();
// Custom data directory
-const world = createEmbeddedWorld({ dataDir: './my-data' });+const world = createLocalWorld({ dataDir: './my-data' });
// Override port
-const world = createEmbeddedWorld({ port: 3000 });+const world = createLocalWorld({ port: 3000 });
// HTTPS with custom hostname
-const world = createEmbeddedWorld({+const world = createLocalWorld({
baseUrl: 'https://local.example.com:3000'
});
// Multiple options
-const world = createEmbeddedWorld({+const world = createLocalWorld({
dataDir: './my-data',
baseUrl: 'https://localhost:3000'
});

Analysis

Documentation contains outdated references to renamed createEmbeddedWorld function and environment variables

What fails: Developers following code examples in docs/content/docs/deploying/world/local-world.mdx will get import errors because the documented createEmbeddedWorld function no longer exists - it was renamed to createLocalWorld in the source code. Similarly, environment variable references to WORKFLOW_EMBEDDED_DATA_DIR and WORKFLOW_EMBEDDED_BASE_URL are outdated - they should be WORKFLOW_LOCAL_DATA_DIR and WORKFLOW_LOCAL_BASE_URL.

How to reproduce:

  1. Read the documentation at docs/content/docs/deploying/world/local-world.mdx
  2. Copy any of the code examples that uses createEmbeddedWorld
  3. Try to use it in a project: import { createEmbeddedWorld } from '@workflow/world-local'
  4. Get error: Module @workflow/world-local has no exported member named createEmbeddedWorld

Evidence of the issue:

  • Source code in packages/world-local/src/index.ts exports only createLocalWorld(), not createEmbeddedWorld()
  • Config in packages/world-local/src/config.ts uses WORKFLOW_LOCAL_DATA_DIR and WORKFLOW_LOCAL_BASE_URL environment variables
  • Core orchestrator in packages/core/src/runtime/world.ts imports createLocalWorld (confirming the API has been renamed)
  • Documentation contained 19 references to the old function name and environment variable names across multiple code examples and API reference sections

Resolution: Replaced all occurrences of:

  • createEmbeddedWorldcreateLocalWorld
  • WORKFLOW_EMBEDDED_DATA_DIRWORKFLOW_LOCAL_DATA_DIR
  • WORKFLOW_EMBEDDED_BASE_URLWORKFLOW_LOCAL_BASE_URL

This ensures developers can now copy working code examples from the documentation.

Fix on Vercel

vercelBotand others added 5 commits November 30, 2025 19:08
…Name: 'Embedded'`\, but the codebase now expects the backend to be `'local'`\. This will cause UI feature detection and conditional logic to fail\.
…eateEmbeddedWorld` function name and `WORKFLOW_EMBEDDED_*` environment variables that should be `createLocalWorld` and `WORKFLOW_LOCAL_*` respectively\.
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.

3 participants

@VaguelySerious@TooTallNate@adriandlam
, '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

[world-local] Finish renaming embedded world to local world - #441

Merged
VaguelySerious merged 14 commits into
mainfrom
peter/finish-embedded-local-rename
Dec 2, 2025
Merged

[world-local] Finish renaming embedded world to local world#441
VaguelySerious merged 14 commits into
mainfrom
peter/finish-embedded-local-rename

Conversation

@VaguelySerious

Copy link
Copy Markdown
Member

No description provided.

@vercel

vercelBot commented Nov 26, 2025

Copy link
Copy Markdown
Contributor

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

ProjectDeploymentPreviewCommentsUpdated (UTC)
example-nextjs-workflow-turbopackReadyReadyPreviewCommentNov 30, 2025 7:12pm
example-nextjs-workflow-webpackReadyReadyPreviewCommentNov 30, 2025 7:12pm
example-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-express-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-fastify-workflowErrorErrorNov 30, 2025 7:12pm
workbench-hono-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-nitro-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-nuxt-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-sveltekit-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-vite-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
1 Skipped Deployment
ProjectDeploymentPreviewCommentsUpdated (UTC)
workflow-docsSkippedSkippedNov 30, 2025 7:12pm

@changeset-bot

changeset-botBot commented Nov 26, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 9ba3c29

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

This PR includes changesets to release 14 packages
NameType
@workflow/world-postgresPatch
@workflow/world-testingPatch
@workflow/world-localPatch
@workflow/corePatch
@workflow/nextPatch
@workflow/cliPatch
@workflow/webPatch
@workflow/buildersPatch
@workflow/nitroPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/sveltekitPatch
@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

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔧 Build Fix:

The peer dependency specifier for @workflow/world-postgres is set to "*", which does not match prerelease versions when pnpm's frozen-lockfile validation is enabled. The specifier should be ">=4.1.0-beta.15" to match the current version in the workspace.

View Details
📝 Patch Details
diff --git a/packages/web/package.json b/packages/web/package.json
index eec8149..3b49cc0 100644
--- a/packages/web/package.json+++ b/packages/web/package.json@@ -29,7 +29,7 @@
"next": "15.5.4"
},
"peerDependencies": {
- "@workflow/world-postgres": "*"+ "@workflow/world-postgres": ">=4.1.0-beta.15"
},
"peerDependenciesMeta": {
"@workflow/world-postgres": {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 0d1684f..ae9dccb 100644
--- a/pnpm-lock.yaml+++ b/pnpm-lock.yaml@@ -776,7 +776,7 @@ importers:
packages/web:
dependencies:
'@workflow/world-postgres':
- specifier: '*'+ specifier: '>=4.1.0-beta.15'
version: 4.1.0-beta.15(@opentelemetry/api@1.9.0)(better-sqlite3@11.10.0)(pg@8.16.3)
next:
specifier: 15.5.4

Analysis

pnpm frozen-lockfile incompatible with prerelease peer dependency version

What fails:pnpm install --frozen-lockfile fails during the Vercel build because the peer dependency constraint in @workflow/web does not satisfy the prerelease version of @workflow/world-postgres.

How to reproduce:

pnpm install --frozen-lockfile

Result:

[ERROR] ERR_PNPM_OUTDATED_LOCKFILE Cannot install with "frozen-lockfile" because pnpm-lock.yaml is not up to date with <ROOT>/packages/web/package.json
[ERROR] Failure reason:
[ERROR] The importer resolution is broken at dependency "@workflow/world-postgres": version "4.1.0-beta.15" doesn't satisfy range "*"
[ERROR] Error: Command "pnpm install" exited with 1

Root cause: The packages/web/package.json declares @workflow/world-postgres as an optional peer dependency with specifier "*", but pnpm's frozen-lockfile mode does not consider prerelease versions (like 4.1.0-beta.15) to match the "*" range. The pnpm-lock.yaml had become out of sync with the package.json.

Fix: Update the peer dependency specifier to explicitly include the prerelease version constraint ">=4.1.0-beta.15" so that pnpm can validate the lockfile correctly with frozen-lockfile enabled.

Fix on Vercel

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Additional Suggestion:

The KNOWN_WORLDS array still has id: 'embedded' and displayName: 'Embedded', but the codebase now expects the backend to be 'local'. This will cause UI feature detection and conditional logic to fail.

View Details
📝 Patch Details
diff --git a/packages/web/src/lib/config-world.ts b/packages/web/src/lib/config-world.ts
index f2989b2..635b413 100644
--- a/packages/web/src/lib/config-world.ts+++ b/packages/web/src/lib/config-world.ts@@ -37,7 +37,7 @@ export interface WorldAvailability {
/**
* Check which world packages are installed.
*
- * Built-in worlds (embedded, vercel) are always available.+ * Built-in worlds (local, vercel) are always available.
* Third-party worlds are checked by attempting to resolve their package.
*/
export async function checkWorldsAvailability(): Promise<WorldAvailability[]> {
diff --git a/packages/web/src/lib/known-worlds.ts b/packages/web/src/lib/known-worlds.ts
index d26a61e..70af02f 100644
--- a/packages/web/src/lib/known-worlds.ts+++ b/packages/web/src/lib/known-worlds.ts@@ -22,13 +22,13 @@ export interface KnownWorld {
/**
* List of known worlds that can be configured in the UI.
*
- * Built-in worlds (embedded, vercel) are always available as they're bundled+ * Built-in worlds (local, vercel) are always available as they're bundled
* with @workflow/core. Third-party worlds need to be installed separately.
*/
export const KNOWN_WORLDS: KnownWorld[] = [
{
- id: 'embedded',- displayName: 'Embedded',+ id: 'local',+ displayName: 'Local',
packageName: null,
description: 'Local file-based storage, ideal for development',
isBuiltIn: true,

Analysis

KNOWN_WORLDS array has incorrect id 'embedded' instead of 'local'

What fails: The settings sidebar backend selector shows "Embedded" as the first option, but when selected, it sets backend: 'embedded'. All conditional logic throughout the codebase checks for backend === 'local', causing the local backend UI features (Port, Data Directory fields) to fail to render.

How to reproduce:

  1. Open the settings sidebar in the workflow web UI
  2. Click on the Backend dropdown
  3. Select "Embedded" (first option)
  4. Observe: Port and Data Directory input fields do NOT appear
  5. The isLocal check in settings-sidebar.tsx (line 38) returns false, so the local-specific fields remain hidden

Result: When the first world is selected from the dropdown, backend becomes 'embedded' (from KNOWN_WORLDS[0].id), but all checks throughout the code look for backend === 'local':

  • settings-sidebar.tsx line 38: const isLocal = backend === 'local'; → returns false
  • connection-status.tsx line 28: if (backend === 'local') → skipped
  • config-world.ts line 76: if (backend === 'local') → validation skipped

Expected: The first world should have id: 'local' and displayName: 'Local' to match the backend === 'local' checks used throughout the codebase and the default value of backend: 'local' in config.ts.

Root cause: The KNOWN_WORLDS array was added after the embedding-to-local rename refactoring (commit 78e3917) was completed. The file was created in commit 109fe59 with the old 'embedded' identifier instead of the 'local' identifier used everywhere else.

Fix on Vercel

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Additional Suggestion:

The documentation contains 19 outdated references to the old createEmbeddedWorld function name and WORKFLOW_EMBEDDED_* environment variables that should be createLocalWorld and WORKFLOW_LOCAL_* respectively.

View Details
📝 Patch Details
diff --git a/docs/content/docs/deploying/world/local-world.mdx b/docs/content/docs/deploying/world/local-world.mdx
index 717736e..ddd7a57 100644
--- a/docs/content/docs/deploying/world/local-world.mdx+++ b/docs/content/docs/deploying/world/local-world.mdx@@ -62,15 +62,15 @@ By default, workflow data is stored in `.workflow-data/` in your project root. T
**Environment variable:**
```bash
-export WORKFLOW_EMBEDDED_DATA_DIR=./custom-workflow-data+export WORKFLOW_LOCAL_DATA_DIR=./custom-workflow-data
```
**Programmatically:**
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';-const world = createEmbeddedWorld({ dataDir: './custom-workflow-data' });+const world = createLocalWorld({ dataDir: './custom-workflow-data' });
```
### Port
@@ -80,10 +80,10 @@ By default, the local world **automatically detects** which port your applicatio
**Auto-detection example** (recommended):
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';
// Port is automatically detected - no configuration needed!
-const world = createEmbeddedWorld();+const world = createLocalWorld();
```
If auto-detection fails, the world will fall back to the `PORT` environment variable, then to port `3000`.
@@ -93,9 +93,9 @@ If auto-detection fails, the world will fall back to the `PORT` environment vari
You can override the auto-detected port by specifying it explicitly:
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';-const world = createEmbeddedWorld({ port: 3000 });+const world = createLocalWorld({ port: 3000 });
```
### Base URL
@@ -111,21 +111,21 @@ For advanced use cases like HTTPS or custom hostnames, you can override the enti
**Environment variable:**
```bash
-export WORKFLOW_EMBEDDED_BASE_URL=https://local.example.com:3000+export WORKFLOW_LOCAL_BASE_URL=https://local.example.com:3000
```
**Programmatically:**
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';
// HTTPS
-const world = createEmbeddedWorld({+const world = createLocalWorld({
baseUrl: 'https://localhost:3000'
});
// Custom hostname
-const world = createEmbeddedWorld({+const world = createLocalWorld({
baseUrl: 'https://local.example.com:3000'
});
```
@@ -203,12 +203,12 @@ For production deployments, use the [Vercel World](/docs/deploying/world/vercel-
## API Reference
-### `createEmbeddedWorld`+### `createLocalWorld`
Creates a local world instance:
```typescript
-function createEmbeddedWorld(+function createLocalWorld(
args?: Partial<{
dataDir: string;
port: number;
@@ -220,9 +220,9 @@ function createEmbeddedWorld(
**Parameters:**
- `args` - Optional configuration object:
- - `dataDir` - Directory for storing workflow data (default: `.workflow-data/` or `WORKFLOW_EMBEDDED_DATA_DIR` env var)+ - `dataDir` - Directory for storing workflow data (default: `.workflow-data/` or `WORKFLOW_LOCAL_DATA_DIR` env var)
- `port` - Port override for queue transport (default: auto-detected → `PORT` env var → `3000`)
- - `baseUrl` - Full base URL override for queue transport (default: `http://localhost:{port}` or `WORKFLOW_EMBEDDED_BASE_URL` env var)+ - `baseUrl` - Full base URL override for queue transport (default: `http://localhost:{port}` or `WORKFLOW_LOCAL_BASE_URL` env var)
**Returns:**
@@ -231,24 +231,24 @@ function createEmbeddedWorld(
**Examples:**
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';
// Use all defaults (recommended - auto-detects port)
-const world = createEmbeddedWorld();+const world = createLocalWorld();
// Custom data directory
-const world = createEmbeddedWorld({ dataDir: './my-data' });+const world = createLocalWorld({ dataDir: './my-data' });
// Override port
-const world = createEmbeddedWorld({ port: 3000 });+const world = createLocalWorld({ port: 3000 });
// HTTPS with custom hostname
-const world = createEmbeddedWorld({+const world = createLocalWorld({
baseUrl: 'https://local.example.com:3000'
});
// Multiple options
-const world = createEmbeddedWorld({+const world = createLocalWorld({
dataDir: './my-data',
baseUrl: 'https://localhost:3000'
});

Analysis

Documentation contains outdated references to renamed createEmbeddedWorld function and environment variables

What fails: Developers following code examples in docs/content/docs/deploying/world/local-world.mdx will get import errors because the documented createEmbeddedWorld function no longer exists - it was renamed to createLocalWorld in the source code. Similarly, environment variable references to WORKFLOW_EMBEDDED_DATA_DIR and WORKFLOW_EMBEDDED_BASE_URL are outdated - they should be WORKFLOW_LOCAL_DATA_DIR and WORKFLOW_LOCAL_BASE_URL.

How to reproduce:

  1. Read the documentation at docs/content/docs/deploying/world/local-world.mdx
  2. Copy any of the code examples that uses createEmbeddedWorld
  3. Try to use it in a project: import { createEmbeddedWorld } from '@workflow/world-local'
  4. Get error: Module @workflow/world-local has no exported member named createEmbeddedWorld

Evidence of the issue:

  • Source code in packages/world-local/src/index.ts exports only createLocalWorld(), not createEmbeddedWorld()
  • Config in packages/world-local/src/config.ts uses WORKFLOW_LOCAL_DATA_DIR and WORKFLOW_LOCAL_BASE_URL environment variables
  • Core orchestrator in packages/core/src/runtime/world.ts imports createLocalWorld (confirming the API has been renamed)
  • Documentation contained 19 references to the old function name and environment variable names across multiple code examples and API reference sections

Resolution: Replaced all occurrences of:

  • createEmbeddedWorldcreateLocalWorld
  • WORKFLOW_EMBEDDED_DATA_DIRWORKFLOW_LOCAL_DATA_DIR
  • WORKFLOW_EMBEDDED_BASE_URLWORKFLOW_LOCAL_BASE_URL

This ensures developers can now copy working code examples from the documentation.

Fix on Vercel

vercelBotand others added 5 commits November 30, 2025 19:08
…Name: 'Embedded'`\, but the codebase now expects the backend to be `'local'`\. This will cause UI feature detection and conditional logic to fail\.
…eateEmbeddedWorld` function name and `WORKFLOW_EMBEDDED_*` environment variables that should be `createLocalWorld` and `WORKFLOW_LOCAL_*` respectively\.
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.

3 participants

@VaguelySerious@TooTallNate@adriandlam
, '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

[world-local] Finish renaming embedded world to local world - #441

Merged
VaguelySerious merged 14 commits into
mainfrom
peter/finish-embedded-local-rename
Dec 2, 2025
Merged

[world-local] Finish renaming embedded world to local world#441
VaguelySerious merged 14 commits into
mainfrom
peter/finish-embedded-local-rename

Conversation

@VaguelySerious

Copy link
Copy Markdown
Member

No description provided.

@vercel

vercelBot commented Nov 26, 2025

Copy link
Copy Markdown
Contributor

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

ProjectDeploymentPreviewCommentsUpdated (UTC)
example-nextjs-workflow-turbopackReadyReadyPreviewCommentNov 30, 2025 7:12pm
example-nextjs-workflow-webpackReadyReadyPreviewCommentNov 30, 2025 7:12pm
example-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-express-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-fastify-workflowErrorErrorNov 30, 2025 7:12pm
workbench-hono-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-nitro-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-nuxt-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-sveltekit-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-vite-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
1 Skipped Deployment
ProjectDeploymentPreviewCommentsUpdated (UTC)
workflow-docsSkippedSkippedNov 30, 2025 7:12pm

@changeset-bot

changeset-botBot commented Nov 26, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 9ba3c29

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

This PR includes changesets to release 14 packages
NameType
@workflow/world-postgresPatch
@workflow/world-testingPatch
@workflow/world-localPatch
@workflow/corePatch
@workflow/nextPatch
@workflow/cliPatch
@workflow/webPatch
@workflow/buildersPatch
@workflow/nitroPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/sveltekitPatch
@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

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔧 Build Fix:

The peer dependency specifier for @workflow/world-postgres is set to "*", which does not match prerelease versions when pnpm's frozen-lockfile validation is enabled. The specifier should be ">=4.1.0-beta.15" to match the current version in the workspace.

View Details
📝 Patch Details
diff --git a/packages/web/package.json b/packages/web/package.json
index eec8149..3b49cc0 100644
--- a/packages/web/package.json+++ b/packages/web/package.json@@ -29,7 +29,7 @@
"next": "15.5.4"
},
"peerDependencies": {
- "@workflow/world-postgres": "*"+ "@workflow/world-postgres": ">=4.1.0-beta.15"
},
"peerDependenciesMeta": {
"@workflow/world-postgres": {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 0d1684f..ae9dccb 100644
--- a/pnpm-lock.yaml+++ b/pnpm-lock.yaml@@ -776,7 +776,7 @@ importers:
packages/web:
dependencies:
'@workflow/world-postgres':
- specifier: '*'+ specifier: '>=4.1.0-beta.15'
version: 4.1.0-beta.15(@opentelemetry/api@1.9.0)(better-sqlite3@11.10.0)(pg@8.16.3)
next:
specifier: 15.5.4

Analysis

pnpm frozen-lockfile incompatible with prerelease peer dependency version

What fails:pnpm install --frozen-lockfile fails during the Vercel build because the peer dependency constraint in @workflow/web does not satisfy the prerelease version of @workflow/world-postgres.

How to reproduce:

pnpm install --frozen-lockfile

Result:

[ERROR] ERR_PNPM_OUTDATED_LOCKFILE Cannot install with "frozen-lockfile" because pnpm-lock.yaml is not up to date with <ROOT>/packages/web/package.json
[ERROR] Failure reason:
[ERROR] The importer resolution is broken at dependency "@workflow/world-postgres": version "4.1.0-beta.15" doesn't satisfy range "*"
[ERROR] Error: Command "pnpm install" exited with 1

Root cause: The packages/web/package.json declares @workflow/world-postgres as an optional peer dependency with specifier "*", but pnpm's frozen-lockfile mode does not consider prerelease versions (like 4.1.0-beta.15) to match the "*" range. The pnpm-lock.yaml had become out of sync with the package.json.

Fix: Update the peer dependency specifier to explicitly include the prerelease version constraint ">=4.1.0-beta.15" so that pnpm can validate the lockfile correctly with frozen-lockfile enabled.

Fix on Vercel

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Additional Suggestion:

The KNOWN_WORLDS array still has id: 'embedded' and displayName: 'Embedded', but the codebase now expects the backend to be 'local'. This will cause UI feature detection and conditional logic to fail.

View Details
📝 Patch Details
diff --git a/packages/web/src/lib/config-world.ts b/packages/web/src/lib/config-world.ts
index f2989b2..635b413 100644
--- a/packages/web/src/lib/config-world.ts+++ b/packages/web/src/lib/config-world.ts@@ -37,7 +37,7 @@ export interface WorldAvailability {
/**
* Check which world packages are installed.
*
- * Built-in worlds (embedded, vercel) are always available.+ * Built-in worlds (local, vercel) are always available.
* Third-party worlds are checked by attempting to resolve their package.
*/
export async function checkWorldsAvailability(): Promise<WorldAvailability[]> {
diff --git a/packages/web/src/lib/known-worlds.ts b/packages/web/src/lib/known-worlds.ts
index d26a61e..70af02f 100644
--- a/packages/web/src/lib/known-worlds.ts+++ b/packages/web/src/lib/known-worlds.ts@@ -22,13 +22,13 @@ export interface KnownWorld {
/**
* List of known worlds that can be configured in the UI.
*
- * Built-in worlds (embedded, vercel) are always available as they're bundled+ * Built-in worlds (local, vercel) are always available as they're bundled
* with @workflow/core. Third-party worlds need to be installed separately.
*/
export const KNOWN_WORLDS: KnownWorld[] = [
{
- id: 'embedded',- displayName: 'Embedded',+ id: 'local',+ displayName: 'Local',
packageName: null,
description: 'Local file-based storage, ideal for development',
isBuiltIn: true,

Analysis

KNOWN_WORLDS array has incorrect id 'embedded' instead of 'local'

What fails: The settings sidebar backend selector shows "Embedded" as the first option, but when selected, it sets backend: 'embedded'. All conditional logic throughout the codebase checks for backend === 'local', causing the local backend UI features (Port, Data Directory fields) to fail to render.

How to reproduce:

  1. Open the settings sidebar in the workflow web UI
  2. Click on the Backend dropdown
  3. Select "Embedded" (first option)
  4. Observe: Port and Data Directory input fields do NOT appear
  5. The isLocal check in settings-sidebar.tsx (line 38) returns false, so the local-specific fields remain hidden

Result: When the first world is selected from the dropdown, backend becomes 'embedded' (from KNOWN_WORLDS[0].id), but all checks throughout the code look for backend === 'local':

  • settings-sidebar.tsx line 38: const isLocal = backend === 'local'; → returns false
  • connection-status.tsx line 28: if (backend === 'local') → skipped
  • config-world.ts line 76: if (backend === 'local') → validation skipped

Expected: The first world should have id: 'local' and displayName: 'Local' to match the backend === 'local' checks used throughout the codebase and the default value of backend: 'local' in config.ts.

Root cause: The KNOWN_WORLDS array was added after the embedding-to-local rename refactoring (commit 78e3917) was completed. The file was created in commit 109fe59 with the old 'embedded' identifier instead of the 'local' identifier used everywhere else.

Fix on Vercel

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Additional Suggestion:

The documentation contains 19 outdated references to the old createEmbeddedWorld function name and WORKFLOW_EMBEDDED_* environment variables that should be createLocalWorld and WORKFLOW_LOCAL_* respectively.

View Details
📝 Patch Details
diff --git a/docs/content/docs/deploying/world/local-world.mdx b/docs/content/docs/deploying/world/local-world.mdx
index 717736e..ddd7a57 100644
--- a/docs/content/docs/deploying/world/local-world.mdx+++ b/docs/content/docs/deploying/world/local-world.mdx@@ -62,15 +62,15 @@ By default, workflow data is stored in `.workflow-data/` in your project root. T
**Environment variable:**
```bash
-export WORKFLOW_EMBEDDED_DATA_DIR=./custom-workflow-data+export WORKFLOW_LOCAL_DATA_DIR=./custom-workflow-data
```
**Programmatically:**
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';-const world = createEmbeddedWorld({ dataDir: './custom-workflow-data' });+const world = createLocalWorld({ dataDir: './custom-workflow-data' });
```
### Port
@@ -80,10 +80,10 @@ By default, the local world **automatically detects** which port your applicatio
**Auto-detection example** (recommended):
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';
// Port is automatically detected - no configuration needed!
-const world = createEmbeddedWorld();+const world = createLocalWorld();
```
If auto-detection fails, the world will fall back to the `PORT` environment variable, then to port `3000`.
@@ -93,9 +93,9 @@ If auto-detection fails, the world will fall back to the `PORT` environment vari
You can override the auto-detected port by specifying it explicitly:
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';-const world = createEmbeddedWorld({ port: 3000 });+const world = createLocalWorld({ port: 3000 });
```
### Base URL
@@ -111,21 +111,21 @@ For advanced use cases like HTTPS or custom hostnames, you can override the enti
**Environment variable:**
```bash
-export WORKFLOW_EMBEDDED_BASE_URL=https://local.example.com:3000+export WORKFLOW_LOCAL_BASE_URL=https://local.example.com:3000
```
**Programmatically:**
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';
// HTTPS
-const world = createEmbeddedWorld({+const world = createLocalWorld({
baseUrl: 'https://localhost:3000'
});
// Custom hostname
-const world = createEmbeddedWorld({+const world = createLocalWorld({
baseUrl: 'https://local.example.com:3000'
});
```
@@ -203,12 +203,12 @@ For production deployments, use the [Vercel World](/docs/deploying/world/vercel-
## API Reference
-### `createEmbeddedWorld`+### `createLocalWorld`
Creates a local world instance:
```typescript
-function createEmbeddedWorld(+function createLocalWorld(
args?: Partial<{
dataDir: string;
port: number;
@@ -220,9 +220,9 @@ function createEmbeddedWorld(
**Parameters:**
- `args` - Optional configuration object:
- - `dataDir` - Directory for storing workflow data (default: `.workflow-data/` or `WORKFLOW_EMBEDDED_DATA_DIR` env var)+ - `dataDir` - Directory for storing workflow data (default: `.workflow-data/` or `WORKFLOW_LOCAL_DATA_DIR` env var)
- `port` - Port override for queue transport (default: auto-detected → `PORT` env var → `3000`)
- - `baseUrl` - Full base URL override for queue transport (default: `http://localhost:{port}` or `WORKFLOW_EMBEDDED_BASE_URL` env var)+ - `baseUrl` - Full base URL override for queue transport (default: `http://localhost:{port}` or `WORKFLOW_LOCAL_BASE_URL` env var)
**Returns:**
@@ -231,24 +231,24 @@ function createEmbeddedWorld(
**Examples:**
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';
// Use all defaults (recommended - auto-detects port)
-const world = createEmbeddedWorld();+const world = createLocalWorld();
// Custom data directory
-const world = createEmbeddedWorld({ dataDir: './my-data' });+const world = createLocalWorld({ dataDir: './my-data' });
// Override port
-const world = createEmbeddedWorld({ port: 3000 });+const world = createLocalWorld({ port: 3000 });
// HTTPS with custom hostname
-const world = createEmbeddedWorld({+const world = createLocalWorld({
baseUrl: 'https://local.example.com:3000'
});
// Multiple options
-const world = createEmbeddedWorld({+const world = createLocalWorld({
dataDir: './my-data',
baseUrl: 'https://localhost:3000'
});

Analysis

Documentation contains outdated references to renamed createEmbeddedWorld function and environment variables

What fails: Developers following code examples in docs/content/docs/deploying/world/local-world.mdx will get import errors because the documented createEmbeddedWorld function no longer exists - it was renamed to createLocalWorld in the source code. Similarly, environment variable references to WORKFLOW_EMBEDDED_DATA_DIR and WORKFLOW_EMBEDDED_BASE_URL are outdated - they should be WORKFLOW_LOCAL_DATA_DIR and WORKFLOW_LOCAL_BASE_URL.

How to reproduce:

  1. Read the documentation at docs/content/docs/deploying/world/local-world.mdx
  2. Copy any of the code examples that uses createEmbeddedWorld
  3. Try to use it in a project: import { createEmbeddedWorld } from '@workflow/world-local'
  4. Get error: Module @workflow/world-local has no exported member named createEmbeddedWorld

Evidence of the issue:

  • Source code in packages/world-local/src/index.ts exports only createLocalWorld(), not createEmbeddedWorld()
  • Config in packages/world-local/src/config.ts uses WORKFLOW_LOCAL_DATA_DIR and WORKFLOW_LOCAL_BASE_URL environment variables
  • Core orchestrator in packages/core/src/runtime/world.ts imports createLocalWorld (confirming the API has been renamed)
  • Documentation contained 19 references to the old function name and environment variable names across multiple code examples and API reference sections

Resolution: Replaced all occurrences of:

  • createEmbeddedWorldcreateLocalWorld
  • WORKFLOW_EMBEDDED_DATA_DIRWORKFLOW_LOCAL_DATA_DIR
  • WORKFLOW_EMBEDDED_BASE_URLWORKFLOW_LOCAL_BASE_URL

This ensures developers can now copy working code examples from the documentation.

Fix on Vercel

vercelBotand others added 5 commits November 30, 2025 19:08
…Name: 'Embedded'`\, but the codebase now expects the backend to be `'local'`\. This will cause UI feature detection and conditional logic to fail\.
…eateEmbeddedWorld` function name and `WORKFLOW_EMBEDDED_*` environment variables that should be `createLocalWorld` and `WORKFLOW_LOCAL_*` respectively\.
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.

3 participants

@VaguelySerious@TooTallNate@adriandlam
, '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

[world-local] Finish renaming embedded world to local world - #441

Merged
VaguelySerious merged 14 commits into
mainfrom
peter/finish-embedded-local-rename
Dec 2, 2025
Merged

[world-local] Finish renaming embedded world to local world#441
VaguelySerious merged 14 commits into
mainfrom
peter/finish-embedded-local-rename

Conversation

@VaguelySerious

Copy link
Copy Markdown
Member

No description provided.

@vercel

vercelBot commented Nov 26, 2025

Copy link
Copy Markdown
Contributor

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

ProjectDeploymentPreviewCommentsUpdated (UTC)
example-nextjs-workflow-turbopackReadyReadyPreviewCommentNov 30, 2025 7:12pm
example-nextjs-workflow-webpackReadyReadyPreviewCommentNov 30, 2025 7:12pm
example-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-express-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-fastify-workflowErrorErrorNov 30, 2025 7:12pm
workbench-hono-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-nitro-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-nuxt-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-sveltekit-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-vite-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
1 Skipped Deployment
ProjectDeploymentPreviewCommentsUpdated (UTC)
workflow-docsSkippedSkippedNov 30, 2025 7:12pm

@changeset-bot

changeset-botBot commented Nov 26, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 9ba3c29

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

This PR includes changesets to release 14 packages
NameType
@workflow/world-postgresPatch
@workflow/world-testingPatch
@workflow/world-localPatch
@workflow/corePatch
@workflow/nextPatch
@workflow/cliPatch
@workflow/webPatch
@workflow/buildersPatch
@workflow/nitroPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/sveltekitPatch
@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

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔧 Build Fix:

The peer dependency specifier for @workflow/world-postgres is set to "*", which does not match prerelease versions when pnpm's frozen-lockfile validation is enabled. The specifier should be ">=4.1.0-beta.15" to match the current version in the workspace.

View Details
📝 Patch Details
diff --git a/packages/web/package.json b/packages/web/package.json
index eec8149..3b49cc0 100644
--- a/packages/web/package.json+++ b/packages/web/package.json@@ -29,7 +29,7 @@
"next": "15.5.4"
},
"peerDependencies": {
- "@workflow/world-postgres": "*"+ "@workflow/world-postgres": ">=4.1.0-beta.15"
},
"peerDependenciesMeta": {
"@workflow/world-postgres": {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 0d1684f..ae9dccb 100644
--- a/pnpm-lock.yaml+++ b/pnpm-lock.yaml@@ -776,7 +776,7 @@ importers:
packages/web:
dependencies:
'@workflow/world-postgres':
- specifier: '*'+ specifier: '>=4.1.0-beta.15'
version: 4.1.0-beta.15(@opentelemetry/api@1.9.0)(better-sqlite3@11.10.0)(pg@8.16.3)
next:
specifier: 15.5.4

Analysis

pnpm frozen-lockfile incompatible with prerelease peer dependency version

What fails:pnpm install --frozen-lockfile fails during the Vercel build because the peer dependency constraint in @workflow/web does not satisfy the prerelease version of @workflow/world-postgres.

How to reproduce:

pnpm install --frozen-lockfile

Result:

[ERROR] ERR_PNPM_OUTDATED_LOCKFILE Cannot install with "frozen-lockfile" because pnpm-lock.yaml is not up to date with <ROOT>/packages/web/package.json
[ERROR] Failure reason:
[ERROR] The importer resolution is broken at dependency "@workflow/world-postgres": version "4.1.0-beta.15" doesn't satisfy range "*"
[ERROR] Error: Command "pnpm install" exited with 1

Root cause: The packages/web/package.json declares @workflow/world-postgres as an optional peer dependency with specifier "*", but pnpm's frozen-lockfile mode does not consider prerelease versions (like 4.1.0-beta.15) to match the "*" range. The pnpm-lock.yaml had become out of sync with the package.json.

Fix: Update the peer dependency specifier to explicitly include the prerelease version constraint ">=4.1.0-beta.15" so that pnpm can validate the lockfile correctly with frozen-lockfile enabled.

Fix on Vercel

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Additional Suggestion:

The KNOWN_WORLDS array still has id: 'embedded' and displayName: 'Embedded', but the codebase now expects the backend to be 'local'. This will cause UI feature detection and conditional logic to fail.

View Details
📝 Patch Details
diff --git a/packages/web/src/lib/config-world.ts b/packages/web/src/lib/config-world.ts
index f2989b2..635b413 100644
--- a/packages/web/src/lib/config-world.ts+++ b/packages/web/src/lib/config-world.ts@@ -37,7 +37,7 @@ export interface WorldAvailability {
/**
* Check which world packages are installed.
*
- * Built-in worlds (embedded, vercel) are always available.+ * Built-in worlds (local, vercel) are always available.
* Third-party worlds are checked by attempting to resolve their package.
*/
export async function checkWorldsAvailability(): Promise<WorldAvailability[]> {
diff --git a/packages/web/src/lib/known-worlds.ts b/packages/web/src/lib/known-worlds.ts
index d26a61e..70af02f 100644
--- a/packages/web/src/lib/known-worlds.ts+++ b/packages/web/src/lib/known-worlds.ts@@ -22,13 +22,13 @@ export interface KnownWorld {
/**
* List of known worlds that can be configured in the UI.
*
- * Built-in worlds (embedded, vercel) are always available as they're bundled+ * Built-in worlds (local, vercel) are always available as they're bundled
* with @workflow/core. Third-party worlds need to be installed separately.
*/
export const KNOWN_WORLDS: KnownWorld[] = [
{
- id: 'embedded',- displayName: 'Embedded',+ id: 'local',+ displayName: 'Local',
packageName: null,
description: 'Local file-based storage, ideal for development',
isBuiltIn: true,

Analysis

KNOWN_WORLDS array has incorrect id 'embedded' instead of 'local'

What fails: The settings sidebar backend selector shows "Embedded" as the first option, but when selected, it sets backend: 'embedded'. All conditional logic throughout the codebase checks for backend === 'local', causing the local backend UI features (Port, Data Directory fields) to fail to render.

How to reproduce:

  1. Open the settings sidebar in the workflow web UI
  2. Click on the Backend dropdown
  3. Select "Embedded" (first option)
  4. Observe: Port and Data Directory input fields do NOT appear
  5. The isLocal check in settings-sidebar.tsx (line 38) returns false, so the local-specific fields remain hidden

Result: When the first world is selected from the dropdown, backend becomes 'embedded' (from KNOWN_WORLDS[0].id), but all checks throughout the code look for backend === 'local':

  • settings-sidebar.tsx line 38: const isLocal = backend === 'local'; → returns false
  • connection-status.tsx line 28: if (backend === 'local') → skipped
  • config-world.ts line 76: if (backend === 'local') → validation skipped

Expected: The first world should have id: 'local' and displayName: 'Local' to match the backend === 'local' checks used throughout the codebase and the default value of backend: 'local' in config.ts.

Root cause: The KNOWN_WORLDS array was added after the embedding-to-local rename refactoring (commit 78e3917) was completed. The file was created in commit 109fe59 with the old 'embedded' identifier instead of the 'local' identifier used everywhere else.

Fix on Vercel

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Additional Suggestion:

The documentation contains 19 outdated references to the old createEmbeddedWorld function name and WORKFLOW_EMBEDDED_* environment variables that should be createLocalWorld and WORKFLOW_LOCAL_* respectively.

View Details
📝 Patch Details
diff --git a/docs/content/docs/deploying/world/local-world.mdx b/docs/content/docs/deploying/world/local-world.mdx
index 717736e..ddd7a57 100644
--- a/docs/content/docs/deploying/world/local-world.mdx+++ b/docs/content/docs/deploying/world/local-world.mdx@@ -62,15 +62,15 @@ By default, workflow data is stored in `.workflow-data/` in your project root. T
**Environment variable:**
```bash
-export WORKFLOW_EMBEDDED_DATA_DIR=./custom-workflow-data+export WORKFLOW_LOCAL_DATA_DIR=./custom-workflow-data
```
**Programmatically:**
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';-const world = createEmbeddedWorld({ dataDir: './custom-workflow-data' });+const world = createLocalWorld({ dataDir: './custom-workflow-data' });
```
### Port
@@ -80,10 +80,10 @@ By default, the local world **automatically detects** which port your applicatio
**Auto-detection example** (recommended):
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';
// Port is automatically detected - no configuration needed!
-const world = createEmbeddedWorld();+const world = createLocalWorld();
```
If auto-detection fails, the world will fall back to the `PORT` environment variable, then to port `3000`.
@@ -93,9 +93,9 @@ If auto-detection fails, the world will fall back to the `PORT` environment vari
You can override the auto-detected port by specifying it explicitly:
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';-const world = createEmbeddedWorld({ port: 3000 });+const world = createLocalWorld({ port: 3000 });
```
### Base URL
@@ -111,21 +111,21 @@ For advanced use cases like HTTPS or custom hostnames, you can override the enti
**Environment variable:**
```bash
-export WORKFLOW_EMBEDDED_BASE_URL=https://local.example.com:3000+export WORKFLOW_LOCAL_BASE_URL=https://local.example.com:3000
```
**Programmatically:**
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';
// HTTPS
-const world = createEmbeddedWorld({+const world = createLocalWorld({
baseUrl: 'https://localhost:3000'
});
// Custom hostname
-const world = createEmbeddedWorld({+const world = createLocalWorld({
baseUrl: 'https://local.example.com:3000'
});
```
@@ -203,12 +203,12 @@ For production deployments, use the [Vercel World](/docs/deploying/world/vercel-
## API Reference
-### `createEmbeddedWorld`+### `createLocalWorld`
Creates a local world instance:
```typescript
-function createEmbeddedWorld(+function createLocalWorld(
args?: Partial<{
dataDir: string;
port: number;
@@ -220,9 +220,9 @@ function createEmbeddedWorld(
**Parameters:**
- `args` - Optional configuration object:
- - `dataDir` - Directory for storing workflow data (default: `.workflow-data/` or `WORKFLOW_EMBEDDED_DATA_DIR` env var)+ - `dataDir` - Directory for storing workflow data (default: `.workflow-data/` or `WORKFLOW_LOCAL_DATA_DIR` env var)
- `port` - Port override for queue transport (default: auto-detected → `PORT` env var → `3000`)
- - `baseUrl` - Full base URL override for queue transport (default: `http://localhost:{port}` or `WORKFLOW_EMBEDDED_BASE_URL` env var)+ - `baseUrl` - Full base URL override for queue transport (default: `http://localhost:{port}` or `WORKFLOW_LOCAL_BASE_URL` env var)
**Returns:**
@@ -231,24 +231,24 @@ function createEmbeddedWorld(
**Examples:**
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';
// Use all defaults (recommended - auto-detects port)
-const world = createEmbeddedWorld();+const world = createLocalWorld();
// Custom data directory
-const world = createEmbeddedWorld({ dataDir: './my-data' });+const world = createLocalWorld({ dataDir: './my-data' });
// Override port
-const world = createEmbeddedWorld({ port: 3000 });+const world = createLocalWorld({ port: 3000 });
// HTTPS with custom hostname
-const world = createEmbeddedWorld({+const world = createLocalWorld({
baseUrl: 'https://local.example.com:3000'
});
// Multiple options
-const world = createEmbeddedWorld({+const world = createLocalWorld({
dataDir: './my-data',
baseUrl: 'https://localhost:3000'
});

Analysis

Documentation contains outdated references to renamed createEmbeddedWorld function and environment variables

What fails: Developers following code examples in docs/content/docs/deploying/world/local-world.mdx will get import errors because the documented createEmbeddedWorld function no longer exists - it was renamed to createLocalWorld in the source code. Similarly, environment variable references to WORKFLOW_EMBEDDED_DATA_DIR and WORKFLOW_EMBEDDED_BASE_URL are outdated - they should be WORKFLOW_LOCAL_DATA_DIR and WORKFLOW_LOCAL_BASE_URL.

How to reproduce:

  1. Read the documentation at docs/content/docs/deploying/world/local-world.mdx
  2. Copy any of the code examples that uses createEmbeddedWorld
  3. Try to use it in a project: import { createEmbeddedWorld } from '@workflow/world-local'
  4. Get error: Module @workflow/world-local has no exported member named createEmbeddedWorld

Evidence of the issue:

  • Source code in packages/world-local/src/index.ts exports only createLocalWorld(), not createEmbeddedWorld()
  • Config in packages/world-local/src/config.ts uses WORKFLOW_LOCAL_DATA_DIR and WORKFLOW_LOCAL_BASE_URL environment variables
  • Core orchestrator in packages/core/src/runtime/world.ts imports createLocalWorld (confirming the API has been renamed)
  • Documentation contained 19 references to the old function name and environment variable names across multiple code examples and API reference sections

Resolution: Replaced all occurrences of:

  • createEmbeddedWorldcreateLocalWorld
  • WORKFLOW_EMBEDDED_DATA_DIRWORKFLOW_LOCAL_DATA_DIR
  • WORKFLOW_EMBEDDED_BASE_URLWORKFLOW_LOCAL_BASE_URL

This ensures developers can now copy working code examples from the documentation.

Fix on Vercel

vercelBotand others added 5 commits November 30, 2025 19:08
…Name: 'Embedded'`\, but the codebase now expects the backend to be `'local'`\. This will cause UI feature detection and conditional logic to fail\.
…eateEmbeddedWorld` function name and `WORKFLOW_EMBEDDED_*` environment variables that should be `createLocalWorld` and `WORKFLOW_LOCAL_*` respectively\.
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.

3 participants

@VaguelySerious@TooTallNate@adriandlam
, '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

[world-local] Finish renaming embedded world to local world - #441

Merged
VaguelySerious merged 14 commits into
mainfrom
peter/finish-embedded-local-rename
Dec 2, 2025
Merged

[world-local] Finish renaming embedded world to local world#441
VaguelySerious merged 14 commits into
mainfrom
peter/finish-embedded-local-rename

Conversation

@VaguelySerious

Copy link
Copy Markdown
Member

No description provided.

@vercel

vercelBot commented Nov 26, 2025

Copy link
Copy Markdown
Contributor

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

ProjectDeploymentPreviewCommentsUpdated (UTC)
example-nextjs-workflow-turbopackReadyReadyPreviewCommentNov 30, 2025 7:12pm
example-nextjs-workflow-webpackReadyReadyPreviewCommentNov 30, 2025 7:12pm
example-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-express-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-fastify-workflowErrorErrorNov 30, 2025 7:12pm
workbench-hono-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-nitro-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-nuxt-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-sveltekit-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-vite-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
1 Skipped Deployment
ProjectDeploymentPreviewCommentsUpdated (UTC)
workflow-docsSkippedSkippedNov 30, 2025 7:12pm

@changeset-bot

changeset-botBot commented Nov 26, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 9ba3c29

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

This PR includes changesets to release 14 packages
NameType
@workflow/world-postgresPatch
@workflow/world-testingPatch
@workflow/world-localPatch
@workflow/corePatch
@workflow/nextPatch
@workflow/cliPatch
@workflow/webPatch
@workflow/buildersPatch
@workflow/nitroPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/sveltekitPatch
@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

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔧 Build Fix:

The peer dependency specifier for @workflow/world-postgres is set to "*", which does not match prerelease versions when pnpm's frozen-lockfile validation is enabled. The specifier should be ">=4.1.0-beta.15" to match the current version in the workspace.

View Details
📝 Patch Details
diff --git a/packages/web/package.json b/packages/web/package.json
index eec8149..3b49cc0 100644
--- a/packages/web/package.json+++ b/packages/web/package.json@@ -29,7 +29,7 @@
"next": "15.5.4"
},
"peerDependencies": {
- "@workflow/world-postgres": "*"+ "@workflow/world-postgres": ">=4.1.0-beta.15"
},
"peerDependenciesMeta": {
"@workflow/world-postgres": {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 0d1684f..ae9dccb 100644
--- a/pnpm-lock.yaml+++ b/pnpm-lock.yaml@@ -776,7 +776,7 @@ importers:
packages/web:
dependencies:
'@workflow/world-postgres':
- specifier: '*'+ specifier: '>=4.1.0-beta.15'
version: 4.1.0-beta.15(@opentelemetry/api@1.9.0)(better-sqlite3@11.10.0)(pg@8.16.3)
next:
specifier: 15.5.4

Analysis

pnpm frozen-lockfile incompatible with prerelease peer dependency version

What fails:pnpm install --frozen-lockfile fails during the Vercel build because the peer dependency constraint in @workflow/web does not satisfy the prerelease version of @workflow/world-postgres.

How to reproduce:

pnpm install --frozen-lockfile

Result:

[ERROR] ERR_PNPM_OUTDATED_LOCKFILE Cannot install with "frozen-lockfile" because pnpm-lock.yaml is not up to date with <ROOT>/packages/web/package.json
[ERROR] Failure reason:
[ERROR] The importer resolution is broken at dependency "@workflow/world-postgres": version "4.1.0-beta.15" doesn't satisfy range "*"
[ERROR] Error: Command "pnpm install" exited with 1

Root cause: The packages/web/package.json declares @workflow/world-postgres as an optional peer dependency with specifier "*", but pnpm's frozen-lockfile mode does not consider prerelease versions (like 4.1.0-beta.15) to match the "*" range. The pnpm-lock.yaml had become out of sync with the package.json.

Fix: Update the peer dependency specifier to explicitly include the prerelease version constraint ">=4.1.0-beta.15" so that pnpm can validate the lockfile correctly with frozen-lockfile enabled.

Fix on Vercel

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Additional Suggestion:

The KNOWN_WORLDS array still has id: 'embedded' and displayName: 'Embedded', but the codebase now expects the backend to be 'local'. This will cause UI feature detection and conditional logic to fail.

View Details
📝 Patch Details
diff --git a/packages/web/src/lib/config-world.ts b/packages/web/src/lib/config-world.ts
index f2989b2..635b413 100644
--- a/packages/web/src/lib/config-world.ts+++ b/packages/web/src/lib/config-world.ts@@ -37,7 +37,7 @@ export interface WorldAvailability {
/**
* Check which world packages are installed.
*
- * Built-in worlds (embedded, vercel) are always available.+ * Built-in worlds (local, vercel) are always available.
* Third-party worlds are checked by attempting to resolve their package.
*/
export async function checkWorldsAvailability(): Promise<WorldAvailability[]> {
diff --git a/packages/web/src/lib/known-worlds.ts b/packages/web/src/lib/known-worlds.ts
index d26a61e..70af02f 100644
--- a/packages/web/src/lib/known-worlds.ts+++ b/packages/web/src/lib/known-worlds.ts@@ -22,13 +22,13 @@ export interface KnownWorld {
/**
* List of known worlds that can be configured in the UI.
*
- * Built-in worlds (embedded, vercel) are always available as they're bundled+ * Built-in worlds (local, vercel) are always available as they're bundled
* with @workflow/core. Third-party worlds need to be installed separately.
*/
export const KNOWN_WORLDS: KnownWorld[] = [
{
- id: 'embedded',- displayName: 'Embedded',+ id: 'local',+ displayName: 'Local',
packageName: null,
description: 'Local file-based storage, ideal for development',
isBuiltIn: true,

Analysis

KNOWN_WORLDS array has incorrect id 'embedded' instead of 'local'

What fails: The settings sidebar backend selector shows "Embedded" as the first option, but when selected, it sets backend: 'embedded'. All conditional logic throughout the codebase checks for backend === 'local', causing the local backend UI features (Port, Data Directory fields) to fail to render.

How to reproduce:

  1. Open the settings sidebar in the workflow web UI
  2. Click on the Backend dropdown
  3. Select "Embedded" (first option)
  4. Observe: Port and Data Directory input fields do NOT appear
  5. The isLocal check in settings-sidebar.tsx (line 38) returns false, so the local-specific fields remain hidden

Result: When the first world is selected from the dropdown, backend becomes 'embedded' (from KNOWN_WORLDS[0].id), but all checks throughout the code look for backend === 'local':

  • settings-sidebar.tsx line 38: const isLocal = backend === 'local'; → returns false
  • connection-status.tsx line 28: if (backend === 'local') → skipped
  • config-world.ts line 76: if (backend === 'local') → validation skipped

Expected: The first world should have id: 'local' and displayName: 'Local' to match the backend === 'local' checks used throughout the codebase and the default value of backend: 'local' in config.ts.

Root cause: The KNOWN_WORLDS array was added after the embedding-to-local rename refactoring (commit 78e3917) was completed. The file was created in commit 109fe59 with the old 'embedded' identifier instead of the 'local' identifier used everywhere else.

Fix on Vercel

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Additional Suggestion:

The documentation contains 19 outdated references to the old createEmbeddedWorld function name and WORKFLOW_EMBEDDED_* environment variables that should be createLocalWorld and WORKFLOW_LOCAL_* respectively.

View Details
📝 Patch Details
diff --git a/docs/content/docs/deploying/world/local-world.mdx b/docs/content/docs/deploying/world/local-world.mdx
index 717736e..ddd7a57 100644
--- a/docs/content/docs/deploying/world/local-world.mdx+++ b/docs/content/docs/deploying/world/local-world.mdx@@ -62,15 +62,15 @@ By default, workflow data is stored in `.workflow-data/` in your project root. T
**Environment variable:**
```bash
-export WORKFLOW_EMBEDDED_DATA_DIR=./custom-workflow-data+export WORKFLOW_LOCAL_DATA_DIR=./custom-workflow-data
```
**Programmatically:**
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';-const world = createEmbeddedWorld({ dataDir: './custom-workflow-data' });+const world = createLocalWorld({ dataDir: './custom-workflow-data' });
```
### Port
@@ -80,10 +80,10 @@ By default, the local world **automatically detects** which port your applicatio
**Auto-detection example** (recommended):
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';
// Port is automatically detected - no configuration needed!
-const world = createEmbeddedWorld();+const world = createLocalWorld();
```
If auto-detection fails, the world will fall back to the `PORT` environment variable, then to port `3000`.
@@ -93,9 +93,9 @@ If auto-detection fails, the world will fall back to the `PORT` environment vari
You can override the auto-detected port by specifying it explicitly:
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';-const world = createEmbeddedWorld({ port: 3000 });+const world = createLocalWorld({ port: 3000 });
```
### Base URL
@@ -111,21 +111,21 @@ For advanced use cases like HTTPS or custom hostnames, you can override the enti
**Environment variable:**
```bash
-export WORKFLOW_EMBEDDED_BASE_URL=https://local.example.com:3000+export WORKFLOW_LOCAL_BASE_URL=https://local.example.com:3000
```
**Programmatically:**
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';
// HTTPS
-const world = createEmbeddedWorld({+const world = createLocalWorld({
baseUrl: 'https://localhost:3000'
});
// Custom hostname
-const world = createEmbeddedWorld({+const world = createLocalWorld({
baseUrl: 'https://local.example.com:3000'
});
```
@@ -203,12 +203,12 @@ For production deployments, use the [Vercel World](/docs/deploying/world/vercel-
## API Reference
-### `createEmbeddedWorld`+### `createLocalWorld`
Creates a local world instance:
```typescript
-function createEmbeddedWorld(+function createLocalWorld(
args?: Partial<{
dataDir: string;
port: number;
@@ -220,9 +220,9 @@ function createEmbeddedWorld(
**Parameters:**
- `args` - Optional configuration object:
- - `dataDir` - Directory for storing workflow data (default: `.workflow-data/` or `WORKFLOW_EMBEDDED_DATA_DIR` env var)+ - `dataDir` - Directory for storing workflow data (default: `.workflow-data/` or `WORKFLOW_LOCAL_DATA_DIR` env var)
- `port` - Port override for queue transport (default: auto-detected → `PORT` env var → `3000`)
- - `baseUrl` - Full base URL override for queue transport (default: `http://localhost:{port}` or `WORKFLOW_EMBEDDED_BASE_URL` env var)+ - `baseUrl` - Full base URL override for queue transport (default: `http://localhost:{port}` or `WORKFLOW_LOCAL_BASE_URL` env var)
**Returns:**
@@ -231,24 +231,24 @@ function createEmbeddedWorld(
**Examples:**
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';
// Use all defaults (recommended - auto-detects port)
-const world = createEmbeddedWorld();+const world = createLocalWorld();
// Custom data directory
-const world = createEmbeddedWorld({ dataDir: './my-data' });+const world = createLocalWorld({ dataDir: './my-data' });
// Override port
-const world = createEmbeddedWorld({ port: 3000 });+const world = createLocalWorld({ port: 3000 });
// HTTPS with custom hostname
-const world = createEmbeddedWorld({+const world = createLocalWorld({
baseUrl: 'https://local.example.com:3000'
});
// Multiple options
-const world = createEmbeddedWorld({+const world = createLocalWorld({
dataDir: './my-data',
baseUrl: 'https://localhost:3000'
});

Analysis

Documentation contains outdated references to renamed createEmbeddedWorld function and environment variables

What fails: Developers following code examples in docs/content/docs/deploying/world/local-world.mdx will get import errors because the documented createEmbeddedWorld function no longer exists - it was renamed to createLocalWorld in the source code. Similarly, environment variable references to WORKFLOW_EMBEDDED_DATA_DIR and WORKFLOW_EMBEDDED_BASE_URL are outdated - they should be WORKFLOW_LOCAL_DATA_DIR and WORKFLOW_LOCAL_BASE_URL.

How to reproduce:

  1. Read the documentation at docs/content/docs/deploying/world/local-world.mdx
  2. Copy any of the code examples that uses createEmbeddedWorld
  3. Try to use it in a project: import { createEmbeddedWorld } from '@workflow/world-local'
  4. Get error: Module @workflow/world-local has no exported member named createEmbeddedWorld

Evidence of the issue:

  • Source code in packages/world-local/src/index.ts exports only createLocalWorld(), not createEmbeddedWorld()
  • Config in packages/world-local/src/config.ts uses WORKFLOW_LOCAL_DATA_DIR and WORKFLOW_LOCAL_BASE_URL environment variables
  • Core orchestrator in packages/core/src/runtime/world.ts imports createLocalWorld (confirming the API has been renamed)
  • Documentation contained 19 references to the old function name and environment variable names across multiple code examples and API reference sections

Resolution: Replaced all occurrences of:

  • createEmbeddedWorldcreateLocalWorld
  • WORKFLOW_EMBEDDED_DATA_DIRWORKFLOW_LOCAL_DATA_DIR
  • WORKFLOW_EMBEDDED_BASE_URLWORKFLOW_LOCAL_BASE_URL

This ensures developers can now copy working code examples from the documentation.

Fix on Vercel

vercelBotand others added 5 commits November 30, 2025 19:08
…Name: 'Embedded'`\, but the codebase now expects the backend to be `'local'`\. This will cause UI feature detection and conditional logic to fail\.
…eateEmbeddedWorld` function name and `WORKFLOW_EMBEDDED_*` environment variables that should be `createLocalWorld` and `WORKFLOW_LOCAL_*` respectively\.
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.

3 participants

@VaguelySerious@TooTallNate@adriandlam
, '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

[world-local] Finish renaming embedded world to local world - #441

Merged
VaguelySerious merged 14 commits into
mainfrom
peter/finish-embedded-local-rename
Dec 2, 2025
Merged

[world-local] Finish renaming embedded world to local world#441
VaguelySerious merged 14 commits into
mainfrom
peter/finish-embedded-local-rename

Conversation

@VaguelySerious

Copy link
Copy Markdown
Member

No description provided.

@vercel

vercelBot commented Nov 26, 2025

Copy link
Copy Markdown
Contributor

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

ProjectDeploymentPreviewCommentsUpdated (UTC)
example-nextjs-workflow-turbopackReadyReadyPreviewCommentNov 30, 2025 7:12pm
example-nextjs-workflow-webpackReadyReadyPreviewCommentNov 30, 2025 7:12pm
example-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-express-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-fastify-workflowErrorErrorNov 30, 2025 7:12pm
workbench-hono-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-nitro-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-nuxt-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-sveltekit-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
workbench-vite-workflowReadyReadyPreviewCommentNov 30, 2025 7:12pm
1 Skipped Deployment
ProjectDeploymentPreviewCommentsUpdated (UTC)
workflow-docsSkippedSkippedNov 30, 2025 7:12pm

@changeset-bot

changeset-botBot commented Nov 26, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 9ba3c29

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

This PR includes changesets to release 14 packages
NameType
@workflow/world-postgresPatch
@workflow/world-testingPatch
@workflow/world-localPatch
@workflow/corePatch
@workflow/nextPatch
@workflow/cliPatch
@workflow/webPatch
@workflow/buildersPatch
@workflow/nitroPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/sveltekitPatch
@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

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔧 Build Fix:

The peer dependency specifier for @workflow/world-postgres is set to "*", which does not match prerelease versions when pnpm's frozen-lockfile validation is enabled. The specifier should be ">=4.1.0-beta.15" to match the current version in the workspace.

View Details
📝 Patch Details
diff --git a/packages/web/package.json b/packages/web/package.json
index eec8149..3b49cc0 100644
--- a/packages/web/package.json+++ b/packages/web/package.json@@ -29,7 +29,7 @@
"next": "15.5.4"
},
"peerDependencies": {
- "@workflow/world-postgres": "*"+ "@workflow/world-postgres": ">=4.1.0-beta.15"
},
"peerDependenciesMeta": {
"@workflow/world-postgres": {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 0d1684f..ae9dccb 100644
--- a/pnpm-lock.yaml+++ b/pnpm-lock.yaml@@ -776,7 +776,7 @@ importers:
packages/web:
dependencies:
'@workflow/world-postgres':
- specifier: '*'+ specifier: '>=4.1.0-beta.15'
version: 4.1.0-beta.15(@opentelemetry/api@1.9.0)(better-sqlite3@11.10.0)(pg@8.16.3)
next:
specifier: 15.5.4

Analysis

pnpm frozen-lockfile incompatible with prerelease peer dependency version

What fails:pnpm install --frozen-lockfile fails during the Vercel build because the peer dependency constraint in @workflow/web does not satisfy the prerelease version of @workflow/world-postgres.

How to reproduce:

pnpm install --frozen-lockfile

Result:

[ERROR] ERR_PNPM_OUTDATED_LOCKFILE Cannot install with "frozen-lockfile" because pnpm-lock.yaml is not up to date with <ROOT>/packages/web/package.json
[ERROR] Failure reason:
[ERROR] The importer resolution is broken at dependency "@workflow/world-postgres": version "4.1.0-beta.15" doesn't satisfy range "*"
[ERROR] Error: Command "pnpm install" exited with 1

Root cause: The packages/web/package.json declares @workflow/world-postgres as an optional peer dependency with specifier "*", but pnpm's frozen-lockfile mode does not consider prerelease versions (like 4.1.0-beta.15) to match the "*" range. The pnpm-lock.yaml had become out of sync with the package.json.

Fix: Update the peer dependency specifier to explicitly include the prerelease version constraint ">=4.1.0-beta.15" so that pnpm can validate the lockfile correctly with frozen-lockfile enabled.

Fix on Vercel

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Additional Suggestion:

The KNOWN_WORLDS array still has id: 'embedded' and displayName: 'Embedded', but the codebase now expects the backend to be 'local'. This will cause UI feature detection and conditional logic to fail.

View Details
📝 Patch Details
diff --git a/packages/web/src/lib/config-world.ts b/packages/web/src/lib/config-world.ts
index f2989b2..635b413 100644
--- a/packages/web/src/lib/config-world.ts+++ b/packages/web/src/lib/config-world.ts@@ -37,7 +37,7 @@ export interface WorldAvailability {
/**
* Check which world packages are installed.
*
- * Built-in worlds (embedded, vercel) are always available.+ * Built-in worlds (local, vercel) are always available.
* Third-party worlds are checked by attempting to resolve their package.
*/
export async function checkWorldsAvailability(): Promise<WorldAvailability[]> {
diff --git a/packages/web/src/lib/known-worlds.ts b/packages/web/src/lib/known-worlds.ts
index d26a61e..70af02f 100644
--- a/packages/web/src/lib/known-worlds.ts+++ b/packages/web/src/lib/known-worlds.ts@@ -22,13 +22,13 @@ export interface KnownWorld {
/**
* List of known worlds that can be configured in the UI.
*
- * Built-in worlds (embedded, vercel) are always available as they're bundled+ * Built-in worlds (local, vercel) are always available as they're bundled
* with @workflow/core. Third-party worlds need to be installed separately.
*/
export const KNOWN_WORLDS: KnownWorld[] = [
{
- id: 'embedded',- displayName: 'Embedded',+ id: 'local',+ displayName: 'Local',
packageName: null,
description: 'Local file-based storage, ideal for development',
isBuiltIn: true,

Analysis

KNOWN_WORLDS array has incorrect id 'embedded' instead of 'local'

What fails: The settings sidebar backend selector shows "Embedded" as the first option, but when selected, it sets backend: 'embedded'. All conditional logic throughout the codebase checks for backend === 'local', causing the local backend UI features (Port, Data Directory fields) to fail to render.

How to reproduce:

  1. Open the settings sidebar in the workflow web UI
  2. Click on the Backend dropdown
  3. Select "Embedded" (first option)
  4. Observe: Port and Data Directory input fields do NOT appear
  5. The isLocal check in settings-sidebar.tsx (line 38) returns false, so the local-specific fields remain hidden

Result: When the first world is selected from the dropdown, backend becomes 'embedded' (from KNOWN_WORLDS[0].id), but all checks throughout the code look for backend === 'local':

  • settings-sidebar.tsx line 38: const isLocal = backend === 'local'; → returns false
  • connection-status.tsx line 28: if (backend === 'local') → skipped
  • config-world.ts line 76: if (backend === 'local') → validation skipped

Expected: The first world should have id: 'local' and displayName: 'Local' to match the backend === 'local' checks used throughout the codebase and the default value of backend: 'local' in config.ts.

Root cause: The KNOWN_WORLDS array was added after the embedding-to-local rename refactoring (commit 78e3917) was completed. The file was created in commit 109fe59 with the old 'embedded' identifier instead of the 'local' identifier used everywhere else.

Fix on Vercel

@vercelvercelBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Additional Suggestion:

The documentation contains 19 outdated references to the old createEmbeddedWorld function name and WORKFLOW_EMBEDDED_* environment variables that should be createLocalWorld and WORKFLOW_LOCAL_* respectively.

View Details
📝 Patch Details
diff --git a/docs/content/docs/deploying/world/local-world.mdx b/docs/content/docs/deploying/world/local-world.mdx
index 717736e..ddd7a57 100644
--- a/docs/content/docs/deploying/world/local-world.mdx+++ b/docs/content/docs/deploying/world/local-world.mdx@@ -62,15 +62,15 @@ By default, workflow data is stored in `.workflow-data/` in your project root. T
**Environment variable:**
```bash
-export WORKFLOW_EMBEDDED_DATA_DIR=./custom-workflow-data+export WORKFLOW_LOCAL_DATA_DIR=./custom-workflow-data
```
**Programmatically:**
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';-const world = createEmbeddedWorld({ dataDir: './custom-workflow-data' });+const world = createLocalWorld({ dataDir: './custom-workflow-data' });
```
### Port
@@ -80,10 +80,10 @@ By default, the local world **automatically detects** which port your applicatio
**Auto-detection example** (recommended):
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';
// Port is automatically detected - no configuration needed!
-const world = createEmbeddedWorld();+const world = createLocalWorld();
```
If auto-detection fails, the world will fall back to the `PORT` environment variable, then to port `3000`.
@@ -93,9 +93,9 @@ If auto-detection fails, the world will fall back to the `PORT` environment vari
You can override the auto-detected port by specifying it explicitly:
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';-const world = createEmbeddedWorld({ port: 3000 });+const world = createLocalWorld({ port: 3000 });
```
### Base URL
@@ -111,21 +111,21 @@ For advanced use cases like HTTPS or custom hostnames, you can override the enti
**Environment variable:**
```bash
-export WORKFLOW_EMBEDDED_BASE_URL=https://local.example.com:3000+export WORKFLOW_LOCAL_BASE_URL=https://local.example.com:3000
```
**Programmatically:**
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';
// HTTPS
-const world = createEmbeddedWorld({+const world = createLocalWorld({
baseUrl: 'https://localhost:3000'
});
// Custom hostname
-const world = createEmbeddedWorld({+const world = createLocalWorld({
baseUrl: 'https://local.example.com:3000'
});
```
@@ -203,12 +203,12 @@ For production deployments, use the [Vercel World](/docs/deploying/world/vercel-
## API Reference
-### `createEmbeddedWorld`+### `createLocalWorld`
Creates a local world instance:
```typescript
-function createEmbeddedWorld(+function createLocalWorld(
args?: Partial<{
dataDir: string;
port: number;
@@ -220,9 +220,9 @@ function createEmbeddedWorld(
**Parameters:**
- `args` - Optional configuration object:
- - `dataDir` - Directory for storing workflow data (default: `.workflow-data/` or `WORKFLOW_EMBEDDED_DATA_DIR` env var)+ - `dataDir` - Directory for storing workflow data (default: `.workflow-data/` or `WORKFLOW_LOCAL_DATA_DIR` env var)
- `port` - Port override for queue transport (default: auto-detected → `PORT` env var → `3000`)
- - `baseUrl` - Full base URL override for queue transport (default: `http://localhost:{port}` or `WORKFLOW_EMBEDDED_BASE_URL` env var)+ - `baseUrl` - Full base URL override for queue transport (default: `http://localhost:{port}` or `WORKFLOW_LOCAL_BASE_URL` env var)
**Returns:**
@@ -231,24 +231,24 @@ function createEmbeddedWorld(
**Examples:**
```typescript
-import { createEmbeddedWorld } from '@workflow/world-local';+import { createLocalWorld } from '@workflow/world-local';
// Use all defaults (recommended - auto-detects port)
-const world = createEmbeddedWorld();+const world = createLocalWorld();
// Custom data directory
-const world = createEmbeddedWorld({ dataDir: './my-data' });+const world = createLocalWorld({ dataDir: './my-data' });
// Override port
-const world = createEmbeddedWorld({ port: 3000 });+const world = createLocalWorld({ port: 3000 });
// HTTPS with custom hostname
-const world = createEmbeddedWorld({+const world = createLocalWorld({
baseUrl: 'https://local.example.com:3000'
});
// Multiple options
-const world = createEmbeddedWorld({+const world = createLocalWorld({
dataDir: './my-data',
baseUrl: 'https://localhost:3000'
});

Analysis

Documentation contains outdated references to renamed createEmbeddedWorld function and environment variables

What fails: Developers following code examples in docs/content/docs/deploying/world/local-world.mdx will get import errors because the documented createEmbeddedWorld function no longer exists - it was renamed to createLocalWorld in the source code. Similarly, environment variable references to WORKFLOW_EMBEDDED_DATA_DIR and WORKFLOW_EMBEDDED_BASE_URL are outdated - they should be WORKFLOW_LOCAL_DATA_DIR and WORKFLOW_LOCAL_BASE_URL.

How to reproduce:

  1. Read the documentation at docs/content/docs/deploying/world/local-world.mdx
  2. Copy any of the code examples that uses createEmbeddedWorld
  3. Try to use it in a project: import { createEmbeddedWorld } from '@workflow/world-local'
  4. Get error: Module @workflow/world-local has no exported member named createEmbeddedWorld

Evidence of the issue:

  • Source code in packages/world-local/src/index.ts exports only createLocalWorld(), not createEmbeddedWorld()
  • Config in packages/world-local/src/config.ts uses WORKFLOW_LOCAL_DATA_DIR and WORKFLOW_LOCAL_BASE_URL environment variables
  • Core orchestrator in packages/core/src/runtime/world.ts imports createLocalWorld (confirming the API has been renamed)
  • Documentation contained 19 references to the old function name and environment variable names across multiple code examples and API reference sections

Resolution: Replaced all occurrences of:

  • createEmbeddedWorldcreateLocalWorld
  • WORKFLOW_EMBEDDED_DATA_DIRWORKFLOW_LOCAL_DATA_DIR
  • WORKFLOW_EMBEDDED_BASE_URLWORKFLOW_LOCAL_BASE_URL

This ensures developers can now copy working code examples from the documentation.

Fix on Vercel

vercelBotand others added 5 commits November 30, 2025 19:08
…Name: 'Embedded'`\, but the codebase now expects the backend to be `'local'`\. This will cause UI feature detection and conditional logic to fail\.
…eateEmbeddedWorld` function name and `WORKFLOW_EMBEDDED_*` environment variables that should be `createLocalWorld` and `WORKFLOW_LOCAL_*` respectively\.
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.

3 participants

@VaguelySerious@TooTallNate@adriandlam