diff --git a/.changeset/twenty-forks-grab.md b/.changeset/twenty-forks-grab.md new file mode 100644 index 000000000..34bf90519 --- /dev/null +++ b/.changeset/twenty-forks-grab.md @@ -0,0 +1,11 @@ +--- +"@workflow/world-postgres": patch +"@workflow/world-testing": patch +"@workflow/world-local": patch +"@workflow/core": patch +"@workflow/next": patch +"@workflow/cli": patch +"@workflow/web": patch +--- + +Rename leftover references to "embedded world" to be "local world" diff --git a/docs/content/docs/deploying/world/local-world.mdx b/docs/content/docs/deploying/world/local-world.mdx index a2388c242..ddd7a57cb 100644 --- a/docs/content/docs/deploying/world/local-world.mdx +++ b/docs/content/docs/deploying/world/local-world.mdx @@ -62,28 +62,28 @@ 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 -By default, the embedded world **automatically detects** which port your application is listening on using process introspection. This works seamlessly with frameworks like SvelteKit, Vite, and others that use non-standard ports. +By default, the local world **automatically detects** which port your application is listening on using process introspection. This works seamlessly with frameworks like SvelteKit, Vite, and others that use non-standard ports. **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 @@ -103,6 +103,7 @@ const world = createEmbeddedWorld({ port: 3000 }); For advanced use cases like HTTPS or custom hostnames, you can override the entire base URL. When set, this takes precedence over all port detection and configuration. **Use cases:** + - HTTPS dev servers (e.g., `next dev --experimental-https`) - Custom hostnames (e.g., `local.example.com`) - Non-localhost development @@ -110,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' }); ``` @@ -147,7 +148,7 @@ npm run dev You can explicitly set the local world through environment variables: ```bash -export WORKFLOW_TARGET_WORLD=embedded +export WORKFLOW_TARGET_WORLD=local npm run dev ``` @@ -202,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; @@ -219,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:** @@ -230,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' }); @@ -258,4 +259,3 @@ const world = createEmbeddedWorld({ - [World Interface](/docs/deploying/world) - Understanding the World interface - [Vercel World](/docs/deploying/world/vercel-world) - For production deployments - [Observability](/docs/observability) - Monitoring and debugging tools - diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index a3717c94d..93b0270cb 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -284,7 +284,7 @@ ### Patch Changes - 66332f2: Rename vercel-static builder to standalone -- dbf2207: Fix --backend flag not finding world when using embedded world package name explicitly +- dbf2207: Fix --backend flag not finding world when using local world package name explicitly - Updated dependencies [dbf2207] - Updated dependencies [eadf588] - @workflow/web@4.0.1-beta.4 diff --git a/packages/cli/src/lib/inspect/env.ts b/packages/cli/src/lib/inspect/env.ts index fccb83b90..89fb80c44 100644 --- a/packages/cli/src/lib/inspect/env.ts +++ b/packages/cli/src/lib/inspect/env.ts @@ -43,7 +43,7 @@ export const getEnvVars = (): Record => { WORKFLOW_VERCEL_PROXY_URL: env.WORKFLOW_VERCEL_PROXY_URL || '', WORKFLOW_LOCAL_UI: env.WORKFLOW_LOCAL_UI || '', PORT: env.PORT || '', - WORKFLOW_EMBEDDED_DATA_DIR: env.WORKFLOW_EMBEDDED_DATA_DIR || '', + WORKFLOW_LOCAL_DATA_DIR: env.WORKFLOW_LOCAL_DATA_DIR || '', }; }; @@ -75,10 +75,10 @@ async function findWorkflowDataDir(cwd: string) { } /** - * Overwrites process.env variables related to embedded world configuration, + * Overwrites process.env variables related to local world configuration, * if relevant environment variables aren't set already. */ -export const inferEmbeddedWorldEnvVars = async () => { +export const inferLocalWorldEnvVars = async () => { const envVars = getEnvVars(); if (!envVars.PORT) { logger.warn( @@ -89,12 +89,12 @@ export const inferEmbeddedWorldEnvVars = async () => { } // Paths to check, in order of preference - if (!envVars.WORKFLOW_EMBEDDED_DATA_DIR) { + if (!envVars.WORKFLOW_LOCAL_DATA_DIR) { const cwd = getWorkflowConfig().workingDir; const localPath = await findWorkflowDataDir(cwd); if (localPath) { - envVars.WORKFLOW_EMBEDDED_DATA_DIR = localPath; + envVars.WORKFLOW_LOCAL_DATA_DIR = localPath; writeEnvVars(envVars); return; } @@ -104,7 +104,7 @@ export const inferEmbeddedWorldEnvVars = async () => { if (repoRoot) { const repoPath = await findWorkflowDataDir(repoRoot); if (repoPath) { - envVars.WORKFLOW_EMBEDDED_DATA_DIR = repoPath; + envVars.WORKFLOW_LOCAL_DATA_DIR = repoPath; writeEnvVars(envVars); return; } diff --git a/packages/cli/src/lib/inspect/flags.ts b/packages/cli/src/lib/inspect/flags.ts index ec9289d44..0d84d28ac 100644 --- a/packages/cli/src/lib/inspect/flags.ts +++ b/packages/cli/src/lib/inspect/flags.ts @@ -30,12 +30,12 @@ export const cliFlags = { description: 'backend to inspect', required: false, char: 'b', - default: 'embedded', + default: 'local', env: 'WORKFLOW_TARGET_WORLD', helpGroup: 'Target', helpLabel: '-b, --backend', - helpValue: ['embedded', 'vercel', ''], - defaultHelp: 'embedded', + helpValue: ['local', 'vercel', ''], + defaultHelp: 'local', }), authToken: Flags.string({ description: diff --git a/packages/cli/src/lib/inspect/setup.ts b/packages/cli/src/lib/inspect/setup.ts index b88f6ca04..6db7cf044 100644 --- a/packages/cli/src/lib/inspect/setup.ts +++ b/packages/cli/src/lib/inspect/setup.ts @@ -3,7 +3,7 @@ import chalk from 'chalk'; import terminalLink from 'terminal-link'; import { logger, setJsonMode, setVerboseMode } from '../config/log.js'; import { - inferEmbeddedWorldEnvVars, + inferLocalWorldEnvVars, inferVercelEnvVars, writeEnvVars, } from './env.js'; @@ -52,10 +52,10 @@ export const setupCliWorld = async ( ) { await inferVercelEnvVars(); } else if ( - flags.backend === 'embedded' || + flags.backend === 'local' || flags.backend === '@workflow/world-local' ) { - await inferEmbeddedWorldEnvVars(); + await inferLocalWorldEnvVars(); } logger.debug('Initializing world'); diff --git a/packages/cli/src/lib/inspect/web.ts b/packages/cli/src/lib/inspect/web.ts index 2ffc6a515..037d86c05 100644 --- a/packages/cli/src/lib/inspect/web.ts +++ b/packages/cli/src/lib/inspect/web.ts @@ -369,7 +369,7 @@ function envToQueryParams( WORKFLOW_VERCEL_PROJECT: 'project', WORKFLOW_VERCEL_TEAM: 'team', PORT: 'port', - WORKFLOW_EMBEDDED_DATA_DIR: 'dataDir', + WORKFLOW_LOCAL_DATA_DIR: 'dataDir', }; for (const [envName, paramName] of Object.entries(envToQueryParamMappings)) { diff --git a/packages/core/package.json b/packages/core/package.json index a8ba0228f..913aa6521 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -41,7 +41,7 @@ "build": "tsc", "dev": "tsc --watch", "clean": "tsc --build --clean && rm -r dist ||:", - "test": "cross-env WORKFLOW_TARGET_WORLD=embedded vitest run src", + "test": "cross-env WORKFLOW_TARGET_WORLD=local vitest run src", "test:e2e": "vitest run e2e", "typecheck": "tsc --noEmit" }, diff --git a/packages/core/src/observability.ts b/packages/core/src/observability.ts index 1a7e7b3fb..e4acbfac0 100644 --- a/packages/core/src/observability.ts +++ b/packages/core/src/observability.ts @@ -30,6 +30,18 @@ const streamToStreamId = (value: any): string => { return `${STREAM_ID_PREFIX}null`; }; +const serializedStepFunctionToString = (value: unknown): string => { + if (!value) return 'null'; + if (typeof value !== 'object') return 'null'; + if ('stepId' in value) { + const stepId = value.stepId; + // TODO: Add closure vars to the string representation. + // value.closureVars + return ``; + } + return ''; +}; + /** * This is an extra reviver for devalue that takes any streams that would be converted, * into actual streams, and instead formats them as string links for printing in CLI output. @@ -41,7 +53,7 @@ const streamPrintRevivers: Record any> = { ReadableStream: streamToStreamId, WritableStream: streamToStreamId, TransformStream: streamToStreamId, - StepFunction: (value) => ``, + StepFunction: serializedStepFunctionToString, }; const hydrateStepIO = < diff --git a/packages/core/src/runtime/world.ts b/packages/core/src/runtime/world.ts index 732a1aa52..8ea9395d7 100644 --- a/packages/core/src/runtime/world.ts +++ b/packages/core/src/runtime/world.ts @@ -1,7 +1,7 @@ import { createRequire } from 'node:module'; import { join } from 'node:path'; import type { World } from '@workflow/world'; -import { createEmbeddedWorld } from '@workflow/world-local'; +import { createLocalWorld } from '@workflow/world-local'; import { createVercelWorld } from '@workflow/world-vercel'; const require = createRequire(join(process.cwd(), 'index.js')); @@ -14,12 +14,12 @@ const globalSymbols: typeof globalThis & { [StubbedWorldCache]?: World; } = globalThis; -function defaultWorld(): 'vercel' | 'embedded' { +function defaultWorld(): 'vercel' | 'local' { if (process.env.VERCEL_DEPLOYMENT_ID) { return 'vercel'; } - return 'embedded'; + return 'local'; } /** @@ -42,9 +42,9 @@ export const createWorld = (): World => { }); } - if (targetWorld === 'embedded') { - return createEmbeddedWorld({ - dataDir: process.env.WORKFLOW_EMBEDDED_DATA_DIR, + if (targetWorld === 'local') { + return createLocalWorld({ + dataDir: process.env.WORKFLOW_LOCAL_DATA_DIR, }); } diff --git a/packages/core/src/workflow.ts b/packages/core/src/workflow.ts index f27f4453f..542d97a9c 100644 --- a/packages/core/src/workflow.ts +++ b/packages/core/src/workflow.ts @@ -7,6 +7,7 @@ import * as nanoid from 'nanoid'; import { monotonicFactory } from 'ulid'; import { EventConsumerResult, EventsConsumer } from './events-consumer.js'; import { ENOTSUP } from './global.js'; +import { parseWorkflowName } from './parse-name.js'; import type { WorkflowOrchestratorContext } from './private.js'; import { dehydrateWorkflowReturnValue, @@ -28,7 +29,6 @@ import type { WorkflowMetadata } from './workflow/get-workflow-metadata.js'; import { WORKFLOW_CONTEXT_SYMBOL } from './workflow/get-workflow-metadata.js'; import { createCreateHook } from './workflow/hook.js'; import { createSleep } from './workflow/sleep.js'; -import { parseWorkflowName } from './parse-name.js'; export async function runWorkflow( workflowCode: string, @@ -104,7 +104,7 @@ export async function runWorkflow( getWorkflowRunStreamId(workflowRun.runId, namespace); // TODO: there should be a getUrl method on the world interface itself. This - // solution only works for vercel + embedded worlds. + // solution only works for vercel + local worlds. const url = process.env.VERCEL_URL ? `https://${process.env.VERCEL_URL}` : `http://localhost:${port ?? 3000}`; diff --git a/packages/next/src/index.ts b/packages/next/src/index.ts index ab29ddaa6..886b37973 100644 --- a/packages/next/src/index.ts +++ b/packages/next/src/index.ts @@ -13,7 +13,7 @@ export function withWorkflow( workflows, }: { workflows?: { - embedded?: { + local?: { port?: number; dataDir?: string; }; @@ -22,10 +22,10 @@ export function withWorkflow( ) { if (!process.env.VERCEL_DEPLOYMENT_ID) { if (!process.env.WORKFLOW_TARGET_WORLD) { - process.env.WORKFLOW_TARGET_WORLD = 'embedded'; - process.env.WORKFLOW_EMBEDDED_DATA_DIR = '.next/workflow-data'; + process.env.WORKFLOW_TARGET_WORLD = 'local'; + process.env.WORKFLOW_LOCAL_DATA_DIR = '.next/workflow-data'; } - const maybePort = workflows?.embedded?.port; + const maybePort = workflows?.local?.port; if (maybePort) { process.env.PORT = maybePort.toString(); } diff --git a/packages/web/src/components/display-utils/connection-status.tsx b/packages/web/src/components/display-utils/connection-status.tsx index 9fac111bf..868b3100a 100644 --- a/packages/web/src/components/display-utils/connection-status.tsx +++ b/packages/web/src/components/display-utils/connection-status.tsx @@ -25,22 +25,22 @@ const getConnectionInfo = ( return { provider: 'Vercel', parts }; } - if (backend === 'embedded') { - // Embedded backend + if (backend === 'local') { + // Local backend const parts: string[] = []; if (config.dataDir) { parts.push(`dir: ${config.dataDir}`); } if (config.port) parts.push(`port: ${config.port}`); - return { provider: 'Embedded', parts }; + return { provider: 'Local', parts }; } return { provider: config.backend || 'unknown', parts: [] }; }; export function ConnectionStatus({ config }: ConnectionStatusProps) { - const backend = config.backend || 'embedded'; + const backend = config.backend || 'local'; const { provider, parts } = getConnectionInfo(backend, config); return ( diff --git a/packages/web/src/components/settings-sidebar.tsx b/packages/web/src/components/settings-sidebar.tsx index 3b3682e53..bbc212b3d 100644 --- a/packages/web/src/components/settings-sidebar.tsx +++ b/packages/web/src/components/settings-sidebar.tsx @@ -34,8 +34,8 @@ export function SettingsSidebar() { const { data: worldsAvailability = [], isLoading: isLoadingWorlds } = useWorldsAvailability(); - const backend = localConfig.backend || 'embedded'; - const isEmbedded = backend === 'embedded'; + const backend = localConfig.backend || 'local'; + const isLocal = backend === 'local'; const isPostgres = backend === 'postgres'; // Update local config when query params change @@ -117,7 +117,7 @@ export function SettingsSidebar() {