diff --git a/packages/cli-workflow/src/commands/workflow/add.ts b/packages/cli-workflow/src/commands/workflow/add.ts index 829446f..0e802b0 100644 --- a/packages/cli-workflow/src/commands/workflow/add.ts +++ b/packages/cli-workflow/src/commands/workflow/add.ts @@ -110,7 +110,7 @@ export async function cmdAdd( return validated; } - const extracted = await extractBundleExports(resolvedPath, { storageRoot }); + const extracted = await extractBundleExports(resolvedPath); if (!extracted.ok) { return extracted; } diff --git a/packages/workflow-execute/src/engine/worker.ts b/packages/workflow-execute/src/engine/worker.ts index 42c2fe8..7681873 100644 --- a/packages/workflow-execute/src/engine/worker.ts +++ b/packages/workflow-execute/src/engine/worker.ts @@ -4,7 +4,6 @@ import { createServer, type Socket } from "node:net"; import { dirname, join } from "node:path"; import { createCasStore } from "@uncaged/workflow-cas"; import { - ensureUncagedWorkflowSymlink, importWorkflowBundleModule, } from "@uncaged/workflow-register"; import type { RoleOutput, WorkflowFn } from "@uncaged/workflow-runtime"; @@ -365,7 +364,6 @@ async function main(): Promise { return; } - await ensureUncagedWorkflowSymlink(storageRoot); // Dynamic import required: user bundle path resolved at runtime const modUnknown: unknown = await importWorkflowBundleModule(bundlePath); const modRec = modUnknown as Record; diff --git a/packages/workflow-execute/src/workflow-adapter.ts b/packages/workflow-execute/src/workflow-adapter.ts index d3a581c..44a6442 100644 --- a/packages/workflow-execute/src/workflow-adapter.ts +++ b/packages/workflow-execute/src/workflow-adapter.ts @@ -69,7 +69,7 @@ async function resolveWorkflowBundle(workflowName: string, storageRoot: string, } const bundlePath = join(storageRoot, "bundles", `${entry.hash}.esm.js`); - const bundleExportsResult = await extractBundleExports(bundlePath, { storageRoot }); + const bundleExportsResult = await extractBundleExports(bundlePath); if (!bundleExportsResult.ok) { throw new Error(String(bundleExportsResult.error)); } diff --git a/packages/workflow-register/src/bundle/bundle-import-env.ts b/packages/workflow-register/src/bundle/bundle-import-env.ts index ef1bf1c..5dbb3ef 100644 --- a/packages/workflow-register/src/bundle/bundle-import-env.ts +++ b/packages/workflow-register/src/bundle/bundle-import-env.ts @@ -1,7 +1,7 @@ import { pathToFileURL } from "node:url"; /** - * Dynamic-import a workflow bundle path (see {@link extractBundleExports} — symlink must exist first). + * Dynamic-import a workflow bundle path. */ export async function importWorkflowBundleModule(bundlePath: string): Promise { return import(pathToFileURL(bundlePath).href); diff --git a/packages/workflow-register/src/bundle/ensure-uncaged-workflow-symlink.ts b/packages/workflow-register/src/bundle/ensure-uncaged-workflow-symlink.ts deleted file mode 100644 index cecc319..0000000 --- a/packages/workflow-register/src/bundle/ensure-uncaged-workflow-symlink.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { mkdir, readlink, symlink, unlink } from "node:fs/promises"; -import path from "node:path"; -import { fileURLToPath } from "node:url"; - -/** This module lives in `@uncaged/workflow-register/src/bundle`; grandparent dir is the package root. */ -function installedWorkflowPackageDir(): string { - return fileURLToPath(new URL("../..", import.meta.url)); -} - -/** - * Resolve sibling @uncaged/* package directory relative to workflow-register. - * In a monorepo workspace layout the sibling packages live next to workflow-register. - */ -function siblingPackageDir(packageName: string): string { - const registerRoot = installedWorkflowPackageDir(); - return path.resolve(registerRoot, "..", packageName); -} - -async function ensureSymlink(linkDir: string, name: string, target: string): Promise { - const linkPath = path.join(linkDir, name); - await mkdir(linkDir, { recursive: true }); - try { - const existing = await readlink(linkPath); - const normalizedExisting = path.resolve(linkDir, existing); - if (normalizedExisting === target) { - return; - } - await unlink(linkPath); - } catch (e) { - const errObj = e as NodeJS.ErrnoException; - if (errObj.code !== "ENOENT" && errObj.code !== "EINVAL") { - throw e; - } - } - const linkType = process.platform === "win32" ? "junction" : "dir"; - await symlink(target, linkPath, linkType); -} - -/** - * Ensures `/node_modules/@uncaged/*` symlinks point at installed packages - * so workflow bundles loaded from `/bundles/*.esm.js` can resolve their imports. - */ -export async function ensureUncagedWorkflowSymlink(storageRoot: string): Promise { - const linkDir = path.join(storageRoot, "node_modules", "@uncaged"); - - const packages = [ - { name: "workflow", dir: siblingPackageDir("workflow") }, - { name: "workflow-runtime", dir: siblingPackageDir("workflow-runtime") }, - { name: "workflow-cas", dir: siblingPackageDir("workflow-cas") }, - { name: "workflow-protocol", dir: siblingPackageDir("workflow-protocol") }, - ]; - - for (const pkg of packages) { - await ensureSymlink(linkDir, pkg.name, pkg.dir); - } -} diff --git a/packages/workflow-register/src/bundle/extract-bundle-exports.ts b/packages/workflow-register/src/bundle/extract-bundle-exports.ts index 8ddf99d..48914b9 100644 --- a/packages/workflow-register/src/bundle/extract-bundle-exports.ts +++ b/packages/workflow-register/src/bundle/extract-bundle-exports.ts @@ -1,21 +1,15 @@ import type { WorkflowFn } from "@uncaged/workflow-protocol"; import { err, ok, type Result } from "@uncaged/workflow-util"; import { importWorkflowBundleModule } from "./bundle-import-env.js"; -import { ensureUncagedWorkflowSymlink } from "./ensure-uncaged-workflow-symlink.js"; -import type { ExtractBundleExportsOptions, ExtractedBundleExports } from "./types.js"; +import type { ExtractedBundleExports } from "./types.js"; import { validateWorkflowDescriptor } from "./workflow-descriptor.js"; /** Load a workflow `.esm.js` bundle and read its named exports (`run`, `descriptor`). */ export async function extractBundleExports( bundlePath: string, - options: ExtractBundleExportsOptions = { storageRoot: null }, ): Promise> { let modUnknown: unknown; try { - if (options.storageRoot !== null) { - await ensureUncagedWorkflowSymlink(options.storageRoot); - } - // Dynamic import required: user bundle path resolved at runtime modUnknown = await importWorkflowBundleModule(bundlePath); } catch (e) { const message = e instanceof Error ? e.message : String(e); diff --git a/packages/workflow-register/src/bundle/index.ts b/packages/workflow-register/src/bundle/index.ts index c30c449..7c0f318 100644 --- a/packages/workflow-register/src/bundle/index.ts +++ b/packages/workflow-register/src/bundle/index.ts @@ -1,11 +1,9 @@ export { buildDescriptor } from "./build-descriptor.js"; export { importWorkflowBundleModule } from "./bundle-import-env.js"; export { validateWorkflowBundle } from "./bundle-validator.js"; -export { ensureUncagedWorkflowSymlink } from "./ensure-uncaged-workflow-symlink.js"; export { extractBundleExports } from "./extract-bundle-exports.js"; export { stringifyWorkflowDescriptor } from "./generate-descriptor.js"; export type { - ExtractBundleExportsOptions, ExtractedBundleExports, WorkflowBundleValidationInput, WorkflowDescriptor, diff --git a/packages/workflow-register/src/bundle/types.ts b/packages/workflow-register/src/bundle/types.ts index 55ad9f5..82b9855 100644 --- a/packages/workflow-register/src/bundle/types.ts +++ b/packages/workflow-register/src/bundle/types.ts @@ -20,8 +20,3 @@ export type ExtractedBundleExports = { run: WorkflowFn; descriptor: WorkflowDescriptor; }; - -export type ExtractBundleExportsOptions = { - /** When set, ensures `node_modules/@uncaged/workflow` exists under this root before import. */ - storageRoot: string | null; -}; diff --git a/packages/workflow-register/src/index.ts b/packages/workflow-register/src/index.ts index 8f6ce68..930662d 100644 --- a/packages/workflow-register/src/index.ts +++ b/packages/workflow-register/src/index.ts @@ -1,5 +1,4 @@ export type { - ExtractBundleExportsOptions, ExtractedBundleExports, WorkflowBundleValidationInput, WorkflowDescriptor, @@ -10,7 +9,6 @@ export type { } from "./bundle/index.js"; export { buildDescriptor, - ensureUncagedWorkflowSymlink, extractBundleExports, importWorkflowBundleModule, stringifyWorkflowDescriptor,