@assistant-ui/x-generative-compiler 0.0.9 → 0.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"compile.d.ts","names":[],"sources":["../src/compile.ts"],"mappings":";;KA0BY;UA2CK;;EAEf,QAAQ;;EAER;;EAEA;;;;;;;;;EASA;;UAGe;EACf;EACA;;;cAIW,+BAA+B;cAC9B,iBAAiB;;;iBASf,mBAAmB;;;;;iBA+InB,kBACd,cACA,SAAS,iBACR"}
1
+ {"version":3,"file":"compile.d.ts","names":[],"sources":["../src/compile.ts"],"mappings":";;KA0BY;UA2CK;;EAEf,QAAQ;;EAER;;EAEA;;;;;;;;;EASA;;UAGe;EACf;EACA;;;cAIW,+BAA+B;EAC9B,YAAA,iBAAiB;;;iBASf,mBAAmB;;;;;iBA+InB,kBACd,cACA,SAAS,iBACR"}
package/dist/compile.js CHANGED
@@ -169,7 +169,7 @@ function compileGenerative(code, options) {
169
169
  ensureDefaultExport(ast, filename);
170
170
  const generativeInstances = collectGenerativeInstances(ast);
171
171
  const interactableToolImports = collectInteractableToolImports(ast);
172
- const toolkitSpreadNames = collectToolkitSpreadNames(ast, filename, createToolkitNameContext());
172
+ const { spreadNames: toolkitSpreadNames, namespaceImports } = collectToolkitSpreadNames(ast, filename, createToolkitNameContext());
173
173
  const flags = {
174
174
  keptRender: false,
175
175
  keptBackendExecute: false
@@ -186,7 +186,7 @@ function compileGenerative(code, options) {
186
186
  }
187
187
  if (t.isIdentifier(callee, { name: TOOLKIT_WRAPPER })) {
188
188
  if (!object) throw new GenerativeCompileError(`${TOOLKIT_WRAPPER}() takes an inline object literal of tools`, filename);
189
- compileToolkit(object, target, generativeInstances, interactableToolImports, toolkitSpreadNames, flags, filename);
189
+ compileToolkit(object, target, generativeInstances, interactableToolImports, toolkitSpreadNames, namespaceImports, flags, filename);
190
190
  path.replaceWith(object);
191
191
  path.skip();
192
192
  }
@@ -397,9 +397,15 @@ function interactableToolConfig(value, imports) {
397
397
  * toolkit can't leak a backend `execute` to the client. Only the default
398
398
  * export crosses the generative-module boundary, so named imports don't
399
399
  * qualify — they would be `undefined` once that module is build-split.
400
+ *
401
+ * A namespace import (`import * as kit from "..."`) of a generative module is
402
+ * tracked separately in `namespaceImports` so a `...kit` / `...kit.default`
403
+ * spread can be rejected with a specific callout: only the default export
404
+ * crosses the boundary, so a namespace spread is never safe.
400
405
  */
401
406
  function collectToolkitSpreadNames(ast, filename, context) {
402
407
  const spreadNames = /* @__PURE__ */ new Map();
408
+ const namespaceImports = /* @__PURE__ */ new Set();
403
409
  const localToolkitCalls = /* @__PURE__ */ new Map();
404
410
  for (const statement of ast.program.body) {
405
411
  const localDeclaration = asVariableDeclaration(statement);
@@ -415,9 +421,12 @@ function collectToolkitSpreadNames(ast, filename, context) {
415
421
  }
416
422
  if (t.isImportDeclaration(statement)) {
417
423
  const defaultSpecifier = statement.specifiers.find((specifier) => t.isImportDefaultSpecifier(specifier));
418
- if (!defaultSpecifier) continue;
424
+ const namespaceSpecifier = statement.specifiers.find((specifier) => t.isImportNamespaceSpecifier(specifier));
425
+ if (!defaultSpecifier && !namespaceSpecifier) continue;
419
426
  const names = getGenerativeImportToolkitNames(statement.source.value, filename, context);
420
- if (names !== void 0) spreadNames.set(defaultSpecifier.local.name, names);
427
+ if (names === void 0) continue;
428
+ if (defaultSpecifier) spreadNames.set(defaultSpecifier.local.name, names);
429
+ if (namespaceSpecifier) namespaceImports.add(namespaceSpecifier.local.name);
421
430
  }
422
431
  }
423
432
  const resolveLocal = (name) => {
@@ -430,7 +439,10 @@ function collectToolkitSpreadNames(ast, filename, context) {
430
439
  return publicNames;
431
440
  };
432
441
  for (const name of localToolkitCalls.keys()) resolveLocal(name);
433
- return spreadNames;
442
+ return {
443
+ spreadNames,
444
+ namespaceImports
445
+ };
434
446
  }
435
447
  const MODULE_EXTENSIONS = [
436
448
  ".ts",
@@ -494,7 +506,7 @@ function getDefaultExportToolkitNames(ast, filename, context) {
494
506
  if (!def) return null;
495
507
  const toolkitCall = unwrapToToolkitCall(def.declaration);
496
508
  if (!toolkitCall || !t.isObjectExpression(toolkitCall.arguments[0])) return null;
497
- const spreadNames = collectToolkitSpreadNames(ast, filename, context);
509
+ const { spreadNames } = collectToolkitSpreadNames(ast, filename, context);
498
510
  return uniqueToolkitNames(collectToolkitObjectNames(toolkitCall.arguments[0], spreadNames));
499
511
  }
500
512
  /** Resolves an import specifier (relative or `tsconfig`-aliased) to a file on disk. */
@@ -662,20 +674,35 @@ function toolkitEntryNames(entry, toolkitSpreadNames) {
662
674
  }
663
675
  return [];
664
676
  }
677
+ function toolkitEntrySourceLabel(entry) {
678
+ if (t.isSpreadElement(entry)) {
679
+ if (t.isIdentifier(entry.argument)) return `...${entry.argument.name}`;
680
+ if (unwrapToCall(entry.argument, MCP_TOOLKIT_WRAPPER)) return `...${MCP_TOOLKIT_WRAPPER}(...)`;
681
+ return "...";
682
+ }
683
+ if (t.isObjectProperty(entry) || t.isObjectMethod(entry)) {
684
+ const line = entry.loc?.start.line;
685
+ return line === void 0 ? "inline property" : `inline property (line ${line})`;
686
+ }
687
+ return "inline property";
688
+ }
665
689
  function warnDuplicateToolkitNames(object, toolkitSpreadNames, filename) {
666
- const names = collectToolkitObjectNames(object, toolkitSpreadNames);
667
- if (!names) return;
668
- const seen = /* @__PURE__ */ new Set();
669
- const warned = /* @__PURE__ */ new Set();
670
- for (const name of names) {
671
- if (seen.has(name)) {
672
- if (!warned.has(name)) {
673
- console.warn(new GenerativeCompileError(`Duplicate tool name "${name}" while composing toolkits. JavaScript object spread keeps the last definition.`, filename).message);
674
- warned.add(name);
675
- }
676
- continue;
690
+ const sourcesByToolName = /* @__PURE__ */ new Map();
691
+ for (const entry of object.properties) {
692
+ const entryNames = toolkitEntryNames(entry, toolkitSpreadNames);
693
+ if (!entryNames) continue;
694
+ const source = toolkitEntrySourceLabel(entry);
695
+ for (const name of entryNames) {
696
+ const sources = sourcesByToolName.get(name);
697
+ if (sources) sources.push(source);
698
+ else sourcesByToolName.set(name, [source]);
677
699
  }
678
- seen.add(name);
700
+ }
701
+ for (const [name, sources] of sourcesByToolName) {
702
+ const winner = sources.at(-1);
703
+ const overridden = sources.slice(0, -1);
704
+ if (winner === void 0 || overridden.length === 0) continue;
705
+ console.warn(new GenerativeCompileError(`Duplicate tool name "${name}": ${winner} overrides ${overridden.join(", ")}. JavaScript object spread keeps the last definition.`, filename).message);
679
706
  }
680
707
  }
681
708
  function isSafeToolkitSpread(entry, toolkitSpreadNames) {
@@ -693,6 +720,15 @@ function describeUnsafeToolkitEntry(entry) {
693
720
  if (!toolName || !raw) return genericUnsafeToolkitEntryMessage();
694
721
  return `tool "${toolName}" cannot be \`${generate(raw).code}\`; use an inline object literal (\`${toolName}: { ... }\`) or a compiler-visible toolkit spread / generative tool so its \`execute\` can be routed`;
695
722
  }
723
+ function namespaceToolkitSpreadMessage() {
724
+ return `a namespace import (\`import * as kit from "..."\`) can't be spread into ${TOOLKIT_WRAPPER}({ ... }); only a generative module's default export crosses the build-split boundary, so import it as a default (\`import kit from "..."\`) and spread \`...kit\` instead`;
725
+ }
726
+ /** The `kit` in `...kit` or `...kit.default`, or null for a computed/opaque base. */
727
+ function namespaceSpreadBaseName(argument) {
728
+ if (t.isIdentifier(argument)) return argument.name;
729
+ if (t.isMemberExpression(argument) && !argument.computed && t.isIdentifier(argument.object)) return argument.object.name;
730
+ return null;
731
+ }
696
732
  /** The `JSONGenerativeUI` methods that produce a split-by-condition tool. */
697
733
  const GENERATIVE_TOOL_METHODS = /* @__PURE__ */ new Set(["present", "promptUser"]);
698
734
  /**
@@ -725,7 +761,7 @@ function compileComponents(object, target, flags, filename) {
725
761
  * `generative.present()` passes through, the library having already split it.
726
762
  * Mutates the object in place and records outcomes in {@link TargetFlags}.
727
763
  */
728
- function compileToolkit(object, target, instances, interactableToolImports, toolkitSpreadNames, flags, filename) {
764
+ function compileToolkit(object, target, instances, interactableToolImports, toolkitSpreadNames, namespaceImports, flags, filename) {
729
765
  if (target === "client") warnDuplicateToolkitNames(object, toolkitSpreadNames, filename);
730
766
  const nextProperties = [];
731
767
  for (const entry of object.properties) {
@@ -747,6 +783,10 @@ function compileToolkit(object, target, instances, interactableToolImports, tool
747
783
  nextProperties.push(entry);
748
784
  continue;
749
785
  }
786
+ if (t.isSpreadElement(entry)) {
787
+ const namespaceBase = namespaceSpreadBaseName(entry.argument);
788
+ if (namespaceBase && namespaceImports.has(namespaceBase)) throw new GenerativeCompileError(namespaceToolkitSpreadMessage(), filename);
789
+ }
750
790
  throw new GenerativeCompileError(describeUnsafeToolkitEntry(entry), filename);
751
791
  }
752
792
  const toolName = t.isObjectProperty(entry) ? memberName(entry.key, entry.computed) : void 0;
@@ -1 +1 @@
1
- {"version":3,"file":"compile.js","names":["pkgJson.version"],"sources":["../src/compile.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport * as nodePath from \"node:path\";\nimport { parse } from \"@babel/parser\";\nimport _traverse, { type NodePath } from \"@babel/traverse\";\nimport _generate from \"@babel/generator\";\nimport * as t from \"@babel/types\";\nimport { satisfies } from \"semver\";\nimport { DIRECTIVE, type Target } from \"./constants\";\nimport pkgJson from \"../package.json\" with { type: \"json\" };\n\nconst parserPlugins = [\n \"typescript\",\n \"jsx\",\n \"explicitResourceManagement\",\n] as NonNullable<NonNullable<Parameters<typeof parse>[1]>[\"plugins\"]>;\n\n// @babel/traverse and @babel/generator are CJS; their default export is the\n// function itself under some interop and `{ default }` under others.\nconst traverse = (\n typeof _traverse === \"function\" ? _traverse : (_traverse as any).default\n) as typeof _traverse;\nconst generate = (\n typeof _generate === \"function\" ? _generate : (_generate as any).default\n) as typeof _generate;\n\nexport type ToolType = \"frontend\" | \"backend\" | \"human\" | \"provider\";\n\n/** The required wrapper around a toolkit's tools (stripped at build time). */\nconst TOOLKIT_WRAPPER = \"defineToolkit\";\n/** The helper that produces MCP-only toolkit fragments. */\nconst MCP_TOOLKIT_WRAPPER = \"defineMcpToolkit\";\n/** The required wrapper around a generative-UI library (stripped at build time). */\nconst COMPONENTS_WRAPPER = \"defineGenerativeComponents\";\n/** The core package whose metadata declares supported compiler versions. */\nconst CORE_PACKAGE = \"@assistant-ui/core\";\n/** This package, checked against core's compatibility range. */\nconst COMPILER_PACKAGE = \"@assistant-ui/x-generative-compiler\";\n/** Packages that re-export core's generative markers. */\nconst DISTRIBUTION_PACKAGES = [\n CORE_PACKAGE,\n \"@assistant-ui/react\",\n \"@assistant-ui/react-native\",\n \"@assistant-ui/react-ink\",\n] as const;\n/** Package that exports the generative UI runtime split by export condition. */\nconst GENERATIVE_UI_PACKAGE = \"@assistant-ui/react-generative-ui\";\n/**\n * The class whose instances expose split-by-condition tools (`present()`,\n * `promptUser()`). A toolkit entry that calls a method on one of these passes\n * through untouched — the library, not this compiler, routes its halves.\n */\nconst GENERATIVE_FACTORY = \"JSONGenerativeUI\";\n/**\n * The factory producing an interactable's complete tool entry. Unlike\n * `JSONGenerativeUI`, its package has no per-target builds, so this compiler\n * splits the inline config: the client keeps `render`, the server drops it.\n * The factory's own `execute` is internal and client-safe (frontend tool).\n */\nconst INTERACTABLE_TOOL_FACTORY = \"unstable_interactableTool\";\n\n/** Mutable per-build outcomes the toolkit pass reports back for directive/guard injection. */\ninterface TargetFlags {\n /** A `render` survived on a client build (→ emit `\"use client\"`). */\n keptRender: boolean;\n /** A backend `execute` survived on a server build (→ emit `import \"server-only\"`). */\n keptBackendExecute: boolean;\n}\n\nexport interface CompileOptions {\n /** Which build target to emit. */\n target: Target;\n /** Source filename, used for error messages and source maps. */\n filename?: string;\n /** Emit a source map alongside the code. */\n sourceMaps?: boolean;\n /**\n * Whether the `server` target prepends `import \"server-only\"` when it keeps a\n * backend `execute`. Defaults to `true` (the Next.js/RSC convention, where the\n * guard fires via the `react-server` condition). Set `false` for bundlers\n * without a `react-server` layer (e.g. a Vite/TanStack Start `ssr` build),\n * where the split is already structural and importing `server-only` would\n * throw — see the Vite integration.\n */\n injectServerOnly?: boolean;\n}\n\nexport interface CompileResult {\n code: string;\n map?: object | null;\n}\n\n/** Thrown when a `\"use generative\"` file violates an authoring constraint. */\nexport class GenerativeCompileError extends Error {\n constructor(message: string, filename?: string) {\n super(\n `[assistant-ui/use-generative]${filename ? ` ${filename}:` : \"\"} ${message}`,\n );\n this.name = \"GenerativeCompileError\";\n }\n}\n\n/** Whether a source string opts into generative compilation via the directive. */\nexport function isGenerativeModule(code: string): boolean {\n // The directive must be a leading statement, preceded only by an optional BOM,\n // whitespace, and line/block comments. Scanned linearly — a regex over the\n // comment prefix is prone to catastrophic backtracking on crafted input.\n let i = code.charCodeAt(0) === 0xfeff ? 1 : 0;\n for (;;) {\n while (i < code.length && /\\s/.test(code[i]!)) i++;\n if (code.startsWith(\"//\", i)) {\n const nl = code.indexOf(\"\\n\", i);\n if (nl === -1) return false;\n i = nl + 1;\n } else if (code.startsWith(\"/*\", i)) {\n const end = code.indexOf(\"*/\", i + 2);\n if (end === -1) return false;\n i = end + 2;\n } else {\n break;\n }\n }\n\n const quote = code[i];\n if (quote !== '\"' && quote !== \"'\") return false;\n\n const directiveStart = i + 1;\n if (!code.startsWith(DIRECTIVE, directiveStart)) return false;\n\n const directiveEnd = directiveStart + DIRECTIVE.length;\n if (code[directiveEnd] !== quote) return false;\n\n return hasDirectiveTerminator(code, directiveEnd + 1);\n}\n\nfunction hasDirectiveTerminator(code: string, start: number): boolean {\n let i = start;\n let sawLineTerminator = false;\n for (;;) {\n if (i >= code.length) return true;\n\n const char = code.charCodeAt(i);\n if (isSemicolon(char)) return true;\n if (isLineTerminator(char)) {\n sawLineTerminator = true;\n i++;\n continue;\n }\n\n if (code.startsWith(\"//\", i)) {\n const lineEnd = nextLineTerminatorIndex(code, i + 2);\n if (lineEnd === -1) return true;\n sawLineTerminator = true;\n i = lineEnd + 1;\n continue;\n }\n\n if (code.startsWith(\"/*\", i)) {\n const end = code.indexOf(\"*/\", i + 2);\n if (end === -1) return false;\n sawLineTerminator ||= containsLineTerminator(code, i + 2, end);\n i = end + 2;\n continue;\n }\n\n if (/\\s/.test(code[i]!)) {\n i++;\n continue;\n }\n\n return sawLineTerminator && !startsExpressionContinuation(code, i);\n }\n}\n\nfunction nextLineTerminatorIndex(code: string, start: number): number {\n for (let i = start; i < code.length; i++) {\n if (isLineTerminator(code.charCodeAt(i))) return i;\n }\n return -1;\n}\n\nfunction containsLineTerminator(\n code: string,\n start: number,\n end: number,\n): boolean {\n for (let i = start; i < end; i++) {\n if (isLineTerminator(code.charCodeAt(i))) return true;\n }\n return false;\n}\n\nfunction startsExpressionContinuation(code: string, start: number): boolean {\n switch (code[start]) {\n case \".\":\n case \"+\":\n case \"-\":\n case \"*\":\n case \"/\":\n case \"%\":\n case \"<\":\n case \">\":\n case \"=\":\n case \"!\":\n case \"&\":\n case \"|\":\n case \"^\":\n case \"?\":\n case \":\":\n case \",\":\n case \"[\":\n case \"(\":\n case \"`\":\n return true;\n }\n\n return (\n startsKeywordContinuation(code, start, \"as\") ||\n startsKeywordContinuation(code, start, \"in\") ||\n startsKeywordContinuation(code, start, \"instanceof\") ||\n startsKeywordContinuation(code, start, \"satisfies\")\n );\n}\n\nfunction startsKeywordContinuation(\n code: string,\n start: number,\n keyword: string,\n): boolean {\n if (!code.startsWith(keyword, start)) return false;\n const next = code[start + keyword.length];\n return next === undefined || !/[\\p{ID_Continue}$]/u.test(next);\n}\n\nfunction isSemicolon(char: number): boolean {\n return char === 59;\n}\n\nfunction isLineTerminator(char: number): boolean {\n return char === 10 || char === 13 || char === 0x2028 || char === 0x2029;\n}\n\n/**\n * Rewrites a `\"use generative\"` module for a single build target, keeping only the\n * regions that target needs and pruning the imports the dropped regions used.\n */\nexport function compileGenerative(\n code: string,\n options: CompileOptions,\n): CompileResult {\n const { target, filename } = options;\n\n const ast = parse(code, {\n sourceType: \"module\",\n plugins: parserPlugins,\n });\n\n if (!ast.program.directives.some((d) => d.value.value === DIRECTIVE)) {\n throw new GenerativeCompileError(\n `missing \"${DIRECTIVE}\" directive`,\n filename,\n );\n }\n\n ensureCompilerCompatibleWithCore(ast, filename);\n\n // A module may hold several `defineToolkit(...)` / `defineGenerativeComponents(...)`\n // calls anywhere (e.g. a library built inside `new JSONGenerativeUI(...)` plus\n // the toolkit that exposes it). Tools may reference a `JSONGenerativeUI`\n // instance's `present()`/`promptUser()`, which the library — not this compiler —\n // splits across builds via export conditions; collect those instance names so\n // such entries pass through.\n ensureDefaultExport(ast, filename);\n const generativeInstances = collectGenerativeInstances(ast);\n const interactableToolImports = collectInteractableToolImports(ast);\n const toolkitSpreadNames = collectToolkitSpreadNames(\n ast,\n filename,\n createToolkitNameContext(),\n );\n\n const flags: TargetFlags = { keptRender: false, keptBackendExecute: false };\n\n traverse(ast, {\n CallExpression(path: NodePath<t.CallExpression>) {\n const callee = path.node.callee;\n const object = t.isObjectExpression(path.node.arguments[0])\n ? path.node.arguments[0]\n : null;\n\n if (t.isIdentifier(callee, { name: COMPONENTS_WRAPPER })) {\n if (!object) {\n throw new GenerativeCompileError(\n `${COMPONENTS_WRAPPER}() takes an inline object literal of components`,\n filename,\n );\n }\n compileComponents(object, target, flags, filename);\n // Unwrap the authoring helper to the bare library object so its import\n // can be pruned.\n path.replaceWith(object);\n path.skip();\n return;\n }\n\n if (t.isIdentifier(callee, { name: TOOLKIT_WRAPPER })) {\n if (!object) {\n throw new GenerativeCompileError(\n `${TOOLKIT_WRAPPER}() takes an inline object literal of tools`,\n filename,\n );\n }\n compileToolkit(\n object,\n target,\n generativeInstances,\n interactableToolImports,\n toolkitSpreadNames,\n flags,\n filename,\n );\n path.replaceWith(object);\n path.skip();\n }\n },\n });\n\n const { keptRender, keptBackendExecute } = flags;\n\n pruneUnused(ast);\n\n // Replace the module directives with the target-appropriate one.\n ast.program.directives = ast.program.directives.filter(\n (d) => d.value.value !== DIRECTIVE && d.value.value !== \"use client\",\n );\n if (target === \"client\" && keptRender) {\n ast.program.directives.unshift(\n t.directive(t.directiveLiteral(\"use client\")),\n );\n }\n if (\n target === \"server\" &&\n keptBackendExecute &&\n (options.injectServerOnly ?? true)\n ) {\n ast.program.body.unshift(\n t.importDeclaration([], t.stringLiteral(\"server-only\")),\n );\n }\n\n const result = generate(\n ast,\n {\n sourceMaps: options.sourceMaps ?? false,\n ...(filename ? { filename } : {}),\n jsescOption: { minimal: true },\n },\n code,\n );\n\n return { code: result.code, map: result.map };\n}\n\ninterface PackageJson {\n name?: string;\n version?: string;\n optionalDevDependencies?: Record<string, string>;\n}\n\nconst checkedCorePackageJsonPaths = new Set<string>();\n\n// This compiler's own version, inlined from package.json at build time. Read via\n// an import (not by walking the filesystem at runtime) so the literal survives\n// being bundled into a host package like `@assistant-ui/metro`, where no\n// standalone `@assistant-ui/x-generative-compiler` sits on disk to walk up to.\nconst COMPILER_VERSION = pkgJson.version;\n\nfunction ensureCompilerCompatibleWithCore(\n ast: t.File,\n filename: string | undefined,\n): void {\n const corePackageJsonPath = resolveCorePackageJson(ast, filename);\n if (\n !corePackageJsonPath ||\n checkedCorePackageJsonPaths.has(corePackageJsonPath)\n ) {\n return;\n }\n\n const corePackageJson = readPackageJson(corePackageJsonPath);\n const range = corePackageJson?.optionalDevDependencies?.[COMPILER_PACKAGE];\n if (!range) {\n checkedCorePackageJsonPaths.add(corePackageJsonPath);\n return;\n }\n\n let compatible = false;\n try {\n compatible = satisfies(COMPILER_VERSION, range, {\n includePrerelease: true,\n });\n } catch {\n throw new GenerativeCompileError(\n `${CORE_PACKAGE}@${corePackageJson.version ?? \"unknown\"} declares an ` +\n `invalid optionalDevDependencies range for ${COMPILER_PACKAGE}: ` +\n JSON.stringify(range),\n filename,\n );\n }\n\n if (!compatible) {\n throw new GenerativeCompileError(\n `${CORE_PACKAGE}@${corePackageJson.version ?? \"unknown\"} requires ` +\n `${COMPILER_PACKAGE} ${range}, but the current compiler is ` +\n `${COMPILER_VERSION}. Update @assistant-ui/next, @assistant-ui/vite, ` +\n \"or @assistant-ui/metro so their compiler satisfies the core package's \" +\n \"optionalDevDependencies range.\",\n filename,\n );\n }\n\n checkedCorePackageJsonPaths.add(corePackageJsonPath);\n}\n\nfunction resolveCorePackageJson(\n ast: t.File,\n filename: string | undefined,\n): string | null {\n for (const packageName of collectImportedDistributionPackages(ast)) {\n const packageJsonPath = resolvePackageJson(packageName, filename);\n if (!packageJsonPath) continue;\n if (packageName === CORE_PACKAGE) return packageJsonPath;\n\n const corePackageJsonPath = resolvePackageJson(\n CORE_PACKAGE,\n packageJsonPath,\n );\n if (corePackageJsonPath) return corePackageJsonPath;\n }\n\n return null;\n}\n\nfunction collectImportedDistributionPackages(ast: t.File): Set<string> {\n const packages = new Set<string>();\n\n for (const statement of ast.program.body) {\n const source =\n (t.isImportDeclaration(statement) ||\n t.isExportNamedDeclaration(statement) ||\n t.isExportAllDeclaration(statement)) &&\n statement.source\n ? statement.source.value\n : null;\n if (!source) continue;\n\n const packageName = packageNameFromSpecifier(source);\n if (packageName) packages.add(packageName);\n }\n\n return packages;\n}\n\nfunction packageNameFromSpecifier(specifier: string): string | null {\n for (const packageName of DISTRIBUTION_PACKAGES) {\n if (specifier === packageName || specifier.startsWith(`${packageName}/`)) {\n return packageName;\n }\n }\n\n return null;\n}\n\nfunction resolvePackageJson(\n packageName: string,\n filename: string | undefined,\n): string | null {\n const requirePath = normalizeRequirePath(filename);\n const require = createRequire(requirePath);\n\n try {\n return findPackageJson(require.resolve(packageName), packageName);\n } catch {\n return findPackageJsonFromNodeModules(packageName, requirePath);\n }\n}\n\nfunction normalizeRequirePath(filename: string | undefined): string {\n return cleanAbsoluteFilename(filename) ?? import.meta.url;\n}\n\n/** Strips a `?query`/`#hash` suffix and returns the path only if it is absolute. */\nfunction cleanAbsoluteFilename(filename: string | undefined): string | null {\n if (!filename) return null;\n const clean = filename.split(/[?#]/, 1)[0]!;\n return nodePath.isAbsolute(clean) ? clean : null;\n}\n\nfunction findPackageJson(\n fromPathOrUrl: string,\n packageName: string,\n): string | null {\n let current = nodePath.dirname(\n fromPathOrUrl.startsWith(\"file:\")\n ? new URL(fromPathOrUrl).pathname\n : nodePath.resolve(fromPathOrUrl),\n );\n\n for (;;) {\n const packageJsonPath = nodePath.join(current, \"package.json\");\n const packageJson = readPackageJson(packageJsonPath);\n if (packageJson?.name === packageName) return packageJsonPath;\n\n const parent = nodePath.dirname(current);\n if (parent === current) return null;\n current = parent;\n }\n}\n\nfunction findPackageJsonFromNodeModules(\n packageName: string,\n fromPathOrUrl: string,\n): string | null {\n const parts = packageName.split(\"/\");\n let current = nodePath.dirname(\n fromPathOrUrl.startsWith(\"file:\")\n ? new URL(fromPathOrUrl).pathname\n : nodePath.resolve(fromPathOrUrl),\n );\n\n for (;;) {\n const packageJsonPath = nodePath.join(\n current,\n \"node_modules\",\n ...parts,\n \"package.json\",\n );\n const packageJson = readPackageJson(packageJsonPath);\n if (packageJson?.name === packageName) return packageJsonPath;\n\n const parent = nodePath.dirname(current);\n if (parent === current) return null;\n current = parent;\n }\n}\n\nfunction readPackageJson(packageJsonPath: string): PackageJson | null {\n if (!existsSync(packageJsonPath)) return null;\n try {\n return JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as PackageJson;\n } catch (error) {\n throw new GenerativeCompileError(\n `could not parse package metadata at ${packageJsonPath}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n}\n\n/**\n * Errors unless the module's default export is the toolkit — a `defineToolkit(...)`\n * call (through `satisfies`/`as`/parens). This is the security boundary: the\n * default export is what the runtime registers, so it must be wrapped (and thus\n * split). A bare `export default { ... }` would ship a backend `execute` to the\n * client even if some *other* `defineToolkit(...)` exists elsewhere in the file.\n */\nfunction ensureDefaultExport(ast: t.File, filename: string | undefined): void {\n const def = ast.program.body.find(\n (stmt): stmt is t.ExportDefaultDeclaration =>\n t.isExportDefaultDeclaration(stmt),\n );\n if (!def) {\n throw new GenerativeCompileError(\"missing a default export\", filename);\n }\n if (!unwrapToToolkitCall(def.declaration)) {\n throw new GenerativeCompileError(\n `the default export must be ${TOOLKIT_WRAPPER}({ ... }) or ` +\n `${MCP_TOOLKIT_WRAPPER}({ ... }) (imported from \"@assistant-ui/react\"); ` +\n \"wrapping is required so a backend `execute` can't be authored in a way \" +\n \"that reaches the client\",\n filename,\n );\n }\n}\n\n/**\n * Unwraps a node through `satisfies`/`as`/parens to a call of the named function,\n * or returns `null`.\n */\nfunction unwrapToCall(node: t.Node, name: string): t.CallExpression | null {\n if (t.isTSSatisfiesExpression(node) || t.isTSAsExpression(node)) {\n return unwrapToCall(node.expression, name);\n }\n if (t.isParenthesizedExpression(node)) {\n return unwrapToCall(node.expression, name);\n }\n if (t.isCallExpression(node) && t.isIdentifier(node.callee, { name })) {\n return node;\n }\n return null;\n}\n\n/**\n * Unwraps a statement to its variable declaration through an `export` wrapper,\n * or returns `null`.\n */\nfunction asVariableDeclaration(\n statement: t.Statement,\n): t.VariableDeclaration | null {\n if (t.isVariableDeclaration(statement)) return statement;\n if (\n t.isExportNamedDeclaration(statement) &&\n t.isVariableDeclaration(statement.declaration)\n ) {\n return statement.declaration;\n }\n return null;\n}\n\n/**\n * Collects the names bound to `new JSONGenerativeUI(...)` (e.g.\n * `const generative = new JSONGenerativeUI({ library })`). A toolkit entry that\n * calls a method on one of these is a generative tool whose halves the library\n * routes by export condition, so it passes through the toolkit pass untouched.\n */\nfunction collectGenerativeInstances(ast: t.File): Set<string> {\n const names = new Set<string>();\n const generativeFactories = collectGenerativeFactoryImports(ast);\n for (const statement of ast.program.body) {\n const variableDeclaration = asVariableDeclaration(statement);\n if (!variableDeclaration) continue;\n for (const declaration of variableDeclaration.declarations) {\n const { id, init } = declaration;\n if (\n t.isIdentifier(id) &&\n t.isNewExpression(init) &&\n t.isIdentifier(init.callee) &&\n generativeFactories.has(init.callee.name)\n ) {\n names.add(id.name);\n }\n }\n }\n return names;\n}\n\nfunction collectGenerativeFactoryImports(ast: t.File): Set<string> {\n const names = new Set<string>();\n for (const statement of ast.program.body) {\n if (\n !t.isImportDeclaration(statement) ||\n statement.source.value !== GENERATIVE_UI_PACKAGE\n ) {\n continue;\n }\n\n for (const specifier of statement.specifiers) {\n if (\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.imported, { name: GENERATIVE_FACTORY })\n ) {\n names.add(specifier.local.name);\n }\n }\n }\n return names;\n}\n\ntype ToolkitStaticNames = readonly string[] | null;\ntype ToolkitSpreadNames = Map<string, ToolkitStaticNames>;\n\ninterface ToolkitNameContext {\n importedToolkitNamesByFile: Map<string, ToolkitStaticNames | undefined>;\n resolvingImportedToolkitNames: Set<string>;\n}\n\n/**\n * Collects the local names `unstable_interactableTool` is imported under from a\n * distribution package, so toolkit entries calling it can be recognized\n * (and a same-named local function can't smuggle an arbitrary call through).\n */\nfunction collectInteractableToolImports(ast: t.File): Set<string> {\n const names = new Set<string>();\n for (const statement of ast.program.body) {\n if (!t.isImportDeclaration(statement)) continue;\n if (!packageNameFromSpecifier(statement.source.value)) continue;\n for (const specifier of statement.specifiers) {\n if (\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.imported, { name: INTERACTABLE_TOOL_FACTORY })\n ) {\n names.add(specifier.local.name);\n }\n }\n }\n return names;\n}\n\nfunction createToolkitNameContext(): ToolkitNameContext {\n return {\n importedToolkitNamesByFile: new Map(),\n resolvingImportedToolkitNames: new Set(),\n };\n}\n\n/**\n * The inline config of an `unstable_interactableTool({ ... })` toolkit entry, or `null`\n * when the entry is some other expression.\n */\nfunction interactableToolConfig(\n value: t.Node,\n imports: Set<string>,\n): t.ObjectExpression | null {\n return t.isCallExpression(value) &&\n t.isIdentifier(value.callee) &&\n imports.has(value.callee.name) &&\n t.isObjectExpression(value.arguments[0])\n ? value.arguments[0]\n : null;\n}\n\n/**\n * Toolkit identifiers that are safe to spread into a `defineToolkit({ ... })`,\n * paired with the static tool names they contain. A `null` name list means the\n * spread is safe, but its names are not statically known for duplicate checks.\n *\n * Two kinds qualify:\n *\n * - A local variable whose initializer is visible to this compiler pass: a\n * `defineToolkit(...)` binding is compiled in-place before a later spread\n * reads it, and `defineMcpToolkit(...)` entries can't contain executable code.\n * - The default import of another `\"use generative\"` module: that module is\n * split per-target by its own compiler pass, so spreading its default-exported\n * toolkit can't leak a backend `execute` to the client. Only the default\n * export crosses the generative-module boundary, so named imports don't\n * qualify — they would be `undefined` once that module is build-split.\n */\nfunction collectToolkitSpreadNames(\n ast: t.File,\n filename: string | undefined,\n context: ToolkitNameContext,\n): ToolkitSpreadNames {\n const spreadNames: ToolkitSpreadNames = new Map();\n const localToolkitCalls = new Map<string, t.CallExpression>();\n\n for (const statement of ast.program.body) {\n const localDeclaration = asVariableDeclaration(statement);\n if (localDeclaration) {\n for (const declaration of localDeclaration.declarations) {\n const { id, init } = declaration;\n if (t.isIdentifier(id) && init) {\n const toolkitCall = unwrapToToolkitCall(init);\n if (toolkitCall) localToolkitCalls.set(id.name, toolkitCall);\n }\n }\n continue;\n }\n\n if (t.isImportDeclaration(statement)) {\n const defaultSpecifier = statement.specifiers.find(\n (specifier): specifier is t.ImportDefaultSpecifier =>\n t.isImportDefaultSpecifier(specifier),\n );\n if (!defaultSpecifier) continue;\n\n const names = getGenerativeImportToolkitNames(\n statement.source.value,\n filename,\n context,\n );\n if (names !== undefined) {\n spreadNames.set(defaultSpecifier.local.name, names);\n }\n }\n }\n\n const resolveLocal = (name: string): ToolkitStaticNames | undefined => {\n if (spreadNames.has(name)) return spreadNames.get(name);\n\n const call = localToolkitCalls.get(name);\n if (!call) return undefined;\n\n const object = t.isObjectExpression(call.arguments[0])\n ? call.arguments[0]\n : null;\n const names = object\n ? collectToolkitObjectNames(object, spreadNames)\n : null;\n const publicNames = uniqueToolkitNames(names);\n\n spreadNames.set(name, publicNames);\n return publicNames;\n };\n\n for (const name of localToolkitCalls.keys()) {\n resolveLocal(name);\n }\n\n return spreadNames;\n}\n\nconst MODULE_EXTENSIONS = [\n \".ts\",\n \".tsx\",\n \".mts\",\n \".cts\",\n \".js\",\n \".jsx\",\n \".mjs\",\n \".cjs\",\n] as const;\n\n/** Extensions a specifier may carry that actually map to a TS source file. */\nconst REWRITABLE_JS_EXTENSIONS = new Set([\".js\", \".jsx\", \".mjs\", \".cjs\"]);\n\n/**\n * Reads the static tool names from the default export of an imported\n * `\"use generative\"` module. Relative specifiers and `tsconfig` path aliases\n * (e.g. `@/tools`) are resolved; anything else (a bare package, an unresolvable\n * alias) is treated as non-generative, and thus an unsafe spread.\n */\nfunction getGenerativeImportToolkitNames(\n source: string,\n filename: string | undefined,\n context: ToolkitNameContext,\n): ToolkitStaticNames | undefined {\n const cleanFilename = cleanAbsoluteFilename(filename);\n if (!cleanFilename) return undefined;\n\n const resolved = resolveImportedModuleFile(source, cleanFilename);\n if (!resolved) return undefined;\n\n if (context.importedToolkitNamesByFile.has(resolved)) {\n return context.importedToolkitNamesByFile.get(resolved);\n }\n if (context.resolvingImportedToolkitNames.has(resolved)) return null;\n\n let code: string;\n try {\n code = readFileSync(resolved, \"utf8\");\n } catch {\n context.importedToolkitNamesByFile.set(resolved, undefined);\n return undefined;\n }\n\n if (!isGenerativeModule(code)) {\n context.importedToolkitNamesByFile.set(resolved, undefined);\n return undefined;\n }\n\n context.resolvingImportedToolkitNames.add(resolved);\n try {\n const importedAst = parse(code, {\n sourceType: \"module\",\n plugins: parserPlugins,\n });\n const names = getDefaultExportToolkitNames(importedAst, resolved, context);\n context.importedToolkitNamesByFile.set(resolved, names);\n return names;\n } catch (error) {\n if (error instanceof GenerativeCompileError) throw error;\n context.importedToolkitNamesByFile.set(resolved, null);\n return null;\n } finally {\n context.resolvingImportedToolkitNames.delete(resolved);\n }\n}\n\nfunction getDefaultExportToolkitNames(\n ast: t.File,\n filename: string | undefined,\n context: ToolkitNameContext,\n): ToolkitStaticNames {\n const def = ast.program.body.find(\n (stmt): stmt is t.ExportDefaultDeclaration =>\n t.isExportDefaultDeclaration(stmt),\n );\n if (!def) return null;\n\n const toolkitCall = unwrapToToolkitCall(def.declaration);\n if (!toolkitCall || !t.isObjectExpression(toolkitCall.arguments[0])) {\n return null;\n }\n\n const spreadNames = collectToolkitSpreadNames(ast, filename, context);\n return uniqueToolkitNames(\n collectToolkitObjectNames(toolkitCall.arguments[0], spreadNames),\n );\n}\n\n/** Resolves an import specifier (relative or `tsconfig`-aliased) to a file on disk. */\nfunction resolveImportedModuleFile(\n source: string,\n fromFilename: string,\n): string | null {\n if (source.startsWith(\".\")) {\n const base = nodePath.resolve(nodePath.dirname(fromFilename), source);\n return resolveModuleFileAtPath(base);\n }\n return resolveAliasImport(source, fromFilename);\n}\n\n/**\n * Resolves a candidate module path, trying TS/JS extensions then index files. A\n * specifier may carry a `.js`-family extension that maps to a `.ts`/`.tsx`\n * source (TypeScript's `bundler`/`nodenext` resolution), so the extension is\n * dropped before probing.\n */\nfunction resolveModuleFileAtPath(base: string): string | null {\n const ext = nodePath.extname(base);\n if (ext && existsSync(base)) return base;\n\n const stem = REWRITABLE_JS_EXTENSIONS.has(ext)\n ? base.slice(0, -ext.length)\n : base;\n\n for (const candidateExt of MODULE_EXTENSIONS) {\n const candidate = `${stem}${candidateExt}`;\n if (existsSync(candidate)) return candidate;\n }\n for (const candidateExt of MODULE_EXTENSIONS) {\n const candidate = nodePath.join(base, `index${candidateExt}`);\n if (existsSync(candidate)) return candidate;\n }\n return null;\n}\n\ninterface TsconfigAliases {\n /** Absolute directory that `paths` targets resolve against. */\n baseDir: string;\n paths: Record<string, string[]>;\n}\n\n/** Resolves a `tsconfig` path alias (e.g. `@/tools/x`) to a file on disk. */\nfunction resolveAliasImport(\n source: string,\n fromFilename: string,\n): string | null {\n const tsconfig = loadTsconfigAliases(nodePath.dirname(fromFilename));\n if (!tsconfig) return null;\n\n // TypeScript matches the most specific key first: an exact (wildcard-free) key\n // beats a wildcard one, and a longer static prefix beats a shorter one.\n const patterns = Object.entries(tsconfig.paths).sort(\n ([a], [b]) => aliasSpecificity(b) - aliasSpecificity(a),\n );\n\n for (const [pattern, targets] of patterns) {\n const matched = matchAliasPattern(pattern, source);\n if (matched === null) continue;\n\n for (const target of targets) {\n const specifier = substituteAliasWildcard(target, matched);\n const file = resolveModuleFileAtPath(\n nodePath.resolve(tsconfig.baseDir, specifier),\n );\n if (file) return file;\n }\n }\n return null;\n}\n\n/** Ranks a `paths` key: an exact key outranks any wildcard; longer prefixes win. */\nfunction aliasSpecificity(pattern: string): number {\n const star = pattern.indexOf(\"*\");\n return star === -1 ? pattern.length + 1 : star;\n}\n\n/** Substitutes the single `*` in a `paths` target with the matched text. */\nfunction substituteAliasWildcard(target: string, matched: string): string {\n const star = target.indexOf(\"*\");\n if (star === -1) return target;\n return target.slice(0, star) + matched + target.slice(star + 1);\n}\n\n/**\n * Matches an import specifier against a `tsconfig` `paths` key. Returns the text\n * captured by the key's `*` (or `\"\"` for an exact, wildcard-free key), or `null`\n * when the specifier doesn't match.\n */\nfunction matchAliasPattern(pattern: string, source: string): string | null {\n const star = pattern.indexOf(\"*\");\n if (star === -1) return pattern === source ? \"\" : null;\n\n const prefix = pattern.slice(0, star);\n const suffix = pattern.slice(star + 1);\n if (\n source.length >= prefix.length + suffix.length &&\n source.startsWith(prefix) &&\n source.endsWith(suffix)\n ) {\n return source.slice(prefix.length, source.length - suffix.length);\n }\n return null;\n}\n\n/**\n * Memoizes resolved aliases per start directory. The compiler runs once per\n * file across a build, so without this every aliased spread re-walks and\n * re-parses the same `tsconfig.json`. Process-lifetime, like\n * `checkedCorePackageJsonPaths`.\n */\nconst tsconfigAliasesByDir = new Map<string, TsconfigAliases | null>();\n\n/** Walks up from a directory to the nearest `tsconfig.json` that declares `paths`. */\nfunction loadTsconfigAliases(fromDir: string): TsconfigAliases | null {\n const cached = tsconfigAliasesByDir.get(fromDir);\n if (cached !== undefined) return cached;\n\n let aliases: TsconfigAliases | null = null;\n let dir = fromDir;\n for (;;) {\n const tsconfigPath = nodePath.join(dir, \"tsconfig.json\");\n if (existsSync(tsconfigPath)) {\n aliases = readTsconfigAliases(tsconfigPath, new Set());\n if (aliases) break;\n }\n const parent = nodePath.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n\n tsconfigAliasesByDir.set(fromDir, aliases);\n return aliases;\n}\n\n/** Reads `baseUrl`/`paths` from a tsconfig, following a single `extends` chain. */\nfunction readTsconfigAliases(\n tsconfigPath: string,\n seen: Set<string>,\n): TsconfigAliases | null {\n if (seen.has(tsconfigPath)) return null;\n seen.add(tsconfigPath);\n\n let config: {\n extends?: string | string[];\n compilerOptions?: { baseUrl?: string; paths?: Record<string, string[]> };\n } | null;\n try {\n config = parseJsonc(readFileSync(tsconfigPath, \"utf8\"));\n } catch {\n return null;\n }\n if (!config) return null;\n\n const configDir = nodePath.dirname(tsconfigPath);\n const { baseUrl, paths } = config.compilerOptions ?? {};\n\n if (paths) {\n return {\n baseDir: baseUrl ? nodePath.resolve(configDir, baseUrl) : configDir,\n paths,\n };\n }\n\n // `extends` may be a string or (TS 5.0+) a string array; later entries take\n // precedence, so try them last-first. Parsed from untrusted JSONC, so the\n // array case is a real runtime shape, not just a type.\n const extendsList = Array.isArray(config.extends)\n ? config.extends\n : config.extends\n ? [config.extends]\n : [];\n for (let i = extendsList.length - 1; i >= 0; i--) {\n const entry = extendsList[i];\n if (typeof entry !== \"string\") continue;\n const extended = resolveExtendedTsconfig(entry, configDir);\n if (extended) {\n const aliases = readTsconfigAliases(extended, seen);\n if (aliases) return aliases;\n }\n }\n return null;\n}\n\n/** Resolves a tsconfig `extends` value (relative path or installed package). */\nfunction resolveExtendedTsconfig(\n extendsValue: string,\n configDir: string,\n): string | null {\n if (extendsValue.startsWith(\".\")) {\n const base = nodePath.resolve(configDir, extendsValue);\n const candidates =\n nodePath.extname(base) === \".json\" ? [base] : [`${base}.json`, base];\n return candidates.find((candidate) => existsSync(candidate)) ?? null;\n }\n try {\n return createRequire(nodePath.join(configDir, \"package.json\")).resolve(\n extendsValue.endsWith(\".json\") ? extendsValue : `${extendsValue}.json`,\n );\n } catch {\n return null;\n }\n}\n\n/** Parses JSON with `//` and block comments and trailing commas stripped (tsconfig is JSONC). */\nfunction parseJsonc(text: string): any {\n const withoutComments = text.replace(\n /\"(?:[^\"\\\\]|\\\\.)*\"|\\/\\/[^\\n\\r]*|\\/\\*[\\s\\S]*?\\*\\//g,\n (match) => (match.startsWith('\"') ? match : \"\"),\n );\n const withoutTrailingCommas = withoutComments.replace(/,(\\s*[}\\]])/g, \"$1\");\n return JSON.parse(withoutTrailingCommas);\n}\n\nfunction unwrapToToolkitCall(node: t.Node): t.CallExpression | null {\n return (\n unwrapToCall(node, TOOLKIT_WRAPPER) ??\n unwrapToCall(node, MCP_TOOLKIT_WRAPPER)\n );\n}\n\nfunction collectToolkitObjectNames(\n object: t.ObjectExpression,\n toolkitSpreadNames: ToolkitSpreadNames,\n): ToolkitStaticNames {\n const names: string[] = [];\n\n for (const entry of object.properties) {\n const entryNames = toolkitEntryNames(entry, toolkitSpreadNames);\n if (!entryNames) return null;\n names.push(...entryNames);\n }\n\n return names;\n}\n\nfunction uniqueToolkitNames(names: ToolkitStaticNames): ToolkitStaticNames {\n return names ? [...new Set(names)] : names;\n}\n\nfunction toolkitEntryNames(\n entry: t.ObjectExpression[\"properties\"][number],\n toolkitSpreadNames: ToolkitSpreadNames,\n): ToolkitStaticNames {\n if (t.isSpreadElement(entry)) {\n if (t.isIdentifier(entry.argument)) {\n return toolkitSpreadNames.get(entry.argument.name) ?? null;\n }\n\n const directMcpToolkit = unwrapToCall(entry.argument, MCP_TOOLKIT_WRAPPER);\n if (\n directMcpToolkit &&\n t.isObjectExpression(directMcpToolkit.arguments[0])\n ) {\n return collectToolkitObjectNames(\n directMcpToolkit.arguments[0],\n toolkitSpreadNames,\n );\n }\n\n return null;\n }\n\n if (t.isObjectProperty(entry) || t.isObjectMethod(entry)) {\n const name = memberName(entry.key, entry.computed);\n return name ? [name] : [];\n }\n\n return [];\n}\n\nfunction warnDuplicateToolkitNames(\n object: t.ObjectExpression,\n toolkitSpreadNames: ToolkitSpreadNames,\n filename: string | undefined,\n): void {\n const names = collectToolkitObjectNames(object, toolkitSpreadNames);\n if (!names) return;\n\n const seen = new Set<string>();\n const warned = new Set<string>();\n for (const name of names) {\n if (seen.has(name)) {\n if (!warned.has(name)) {\n console.warn(\n new GenerativeCompileError(\n `Duplicate tool name \"${name}\" while composing toolkits. ` +\n \"JavaScript object spread keeps the last definition.\",\n filename,\n ).message,\n );\n warned.add(name);\n }\n continue;\n }\n seen.add(name);\n }\n}\n\nfunction isSafeToolkitSpread(\n entry: t.SpreadElement,\n toolkitSpreadNames: ToolkitSpreadNames,\n): boolean {\n if (t.isIdentifier(entry.argument)) {\n return toolkitSpreadNames.has(entry.argument.name);\n }\n\n const directMcpToolkit = unwrapToCall(entry.argument, MCP_TOOLKIT_WRAPPER);\n return (\n !!directMcpToolkit && t.isObjectExpression(directMcpToolkit.arguments[0])\n );\n}\n\nfunction genericUnsafeToolkitEntryMessage(): string {\n return (\n \"each tool must be an inline object literal (`name: { ... }`) or a \" +\n \"compiler-visible toolkit spread / generative tool (e.g. \" +\n \"`...defineMcpToolkit(...)`, `...baseToolkit`, \" +\n \"`generative.present()`, or `unstable_interactableTool(...)`) so its \" +\n \"`execute` can be routed\"\n );\n}\n\nfunction describeUnsafeToolkitEntry(entry: Entry): string {\n if (!t.isObjectProperty(entry)) return genericUnsafeToolkitEntryMessage();\n\n const toolName = memberName(entry.key, entry.computed);\n const raw = entryRawValue(entry);\n if (!toolName || !raw) return genericUnsafeToolkitEntryMessage();\n\n return (\n `tool \"${toolName}\" cannot be \\`${generate(raw).code}\\`; use an inline ` +\n `object literal (\\`${toolName}: { ... }\\`) or a compiler-visible toolkit ` +\n \"spread / generative tool so its `execute` can be routed\"\n );\n}\n\n/** The `JSONGenerativeUI` methods that produce a split-by-condition tool. */\nconst GENERATIVE_TOOL_METHODS = new Set([\"present\", \"promptUser\"]);\n\n/**\n * Whether a toolkit entry's value is a call to a tool-producing method on a\n * collected `JSONGenerativeUI` instance (`generative.present()`), which passes\n * through. The method name is checked too, so a typo like `generative.presnt()`\n * is a compile error here rather than a pass-through that fails at runtime.\n */\nfunction isGenerativeToolEntry(value: t.Node, instances: Set<string>): boolean {\n return (\n t.isCallExpression(value) &&\n t.isMemberExpression(value.callee) &&\n !value.callee.computed &&\n t.isIdentifier(value.callee.object) &&\n instances.has(value.callee.object.name) &&\n t.isIdentifier(value.callee.property) &&\n GENERATIVE_TOOL_METHODS.has(value.callee.property.name)\n );\n}\n\n/**\n * Splits a `defineGenerativeComponents({ ... })` library for a build target:\n * a component's `render` (and the client imports it alone uses) is dropped on\n * the server; `properties`/`description` stay on both, since they drive the tool\n * schema either way. Mutates the object in place.\n */\nfunction compileComponents(\n object: t.ObjectExpression,\n target: Target,\n flags: TargetFlags,\n filename: string | undefined,\n): void {\n for (const entry of object.properties) {\n const value = entryValue(entry);\n if (!value) {\n throw new GenerativeCompileError(\n `each component in ${COMPONENTS_WRAPPER}() must be an inline object ` +\n \"literal (`name: { ... }`) so its `render` can be routed\",\n filename,\n );\n }\n if (!findMember(value, \"render\")) continue;\n // The client keeps `render` (and so needs the module marked `\"use client\"`);\n // the server drops it, since only the schema reaches the model there.\n if (target === \"client\") flags.keptRender = true;\n else removeMember(value, \"render\");\n }\n}\n\n/**\n * Splits a `defineToolkit({ ... })` for a build target. Each inline tool is\n * routed by inferred type (see the per-entry logic); a generative entry like\n * `generative.present()` passes through, the library having already split it.\n * Mutates the object in place and records outcomes in {@link TargetFlags}.\n */\nfunction compileToolkit(\n object: t.ObjectExpression,\n target: Target,\n instances: Set<string>,\n interactableToolImports: Set<string>,\n toolkitSpreadNames: ToolkitSpreadNames,\n flags: TargetFlags,\n filename: string | undefined,\n): void {\n // Split builds compile both targets; emit target-independent warnings from\n // the client pass so each duplicate is logged once.\n if (target === \"client\") {\n warnDuplicateToolkitNames(object, toolkitSpreadNames, filename);\n }\n\n const nextProperties: t.ObjectExpression[\"properties\"] = [];\n\n for (const entry of object.properties) {\n const value = entryValue(entry);\n if (!value) {\n if (\n t.isSpreadElement(entry) &&\n isSafeToolkitSpread(entry, toolkitSpreadNames)\n ) {\n nextProperties.push(entry);\n continue;\n }\n // A generative tool (`generative.present()`) is split by the library's\n // export conditions, so it is safe to keep verbatim. Anything else — a\n // method or opaque call like `makeTool()` — can't be analyzed, so its\n // `execute` could reach the client unstripped.\n const raw = entryRawValue(entry);\n if (raw && isGenerativeToolEntry(raw, instances)) {\n nextProperties.push(entry);\n continue;\n }\n const config =\n raw && interactableToolConfig(raw, interactableToolImports);\n if (config) {\n if (target === \"client\") flags.keptRender = true;\n else removeMember(config, \"render\");\n nextProperties.push(entry);\n continue;\n }\n throw new GenerativeCompileError(\n describeUnsafeToolkitEntry(entry),\n filename,\n );\n }\n\n // Nature is inferred from `execute` (see inferToolType), not an authored\n // `type`. The resolved type is written back below so the runtime keeps it.\n const toolName = t.isObjectProperty(entry)\n ? memberName(entry.key, entry.computed)\n : undefined;\n const execute = findMember(value, \"execute\");\n const isStub = execute ? executeIsStubTool(execute) : false;\n const isExternal = execute ? executeIsExternalTool(execute) : false;\n const type = inferToolType(value, toolName, filename);\n const hasRender = !!findMember(value, \"render\");\n const hasRenderText = !!findMember(value, \"renderText\");\n\n if (type === \"frontend\" && !hasRender && !hasRenderText) {\n throw new GenerativeCompileError(\n `${typedToolSubject(\"frontend\", toolName)} must declare a ` +\n \"`render` or `renderText` \" +\n \"(it has no server execute to show otherwise)\",\n filename,\n );\n }\n\n if (type === \"human\" && !hasRender) {\n throw new GenerativeCompileError(\n `${typedToolSubject(\"human\", toolName)} must declare a ` +\n \"`render` so it can collect input\",\n filename,\n );\n }\n\n if (type === \"provider\" && execute) {\n applyProviderToolConfig(value, execute, toolName, filename);\n }\n\n if (isExternal) {\n if (!hasRender && !hasRenderText) {\n throw new GenerativeCompileError(\n `${typedToolSubject(\"external\", toolName)} must declare a ` +\n \"`render` or `renderText` \" +\n \"(assistant-ui only renders calls for tools defined elsewhere)\",\n filename,\n );\n }\n if (target === \"server\") continue;\n stripExternalToolMetadata(value);\n }\n\n if (target === \"client\") {\n // A non-stub frontend execute stays (its `\"use client\"` marker is no longer needed\n // once the module is client); backend, sentinel, and stub executes are dropped.\n if (execute && type === \"frontend\" && !isStub) stripUseClient(execute);\n else if (execute) removeMember(value, \"execute\");\n if (hasRender || hasRenderText) flags.keptRender = true;\n } else {\n // server: render is never needed; only a non-external backend execute survives.\n if (hasRender) removeMember(value, \"render\");\n if (hasRenderText) removeMember(value, \"renderText\");\n if (execute) {\n if (type === \"backend\" && !isExternal) flags.keptBackendExecute = true;\n else removeMember(value, \"execute\");\n }\n }\n\n setToolType(value, type);\n setBackendDefault(value, target, type);\n nextProperties.push(entry);\n }\n\n object.properties = nextProperties;\n}\n\nfunction applyProviderToolConfig(\n object: t.ObjectExpression,\n execute: t.ObjectProperty | t.ObjectMethod,\n toolName: string | undefined,\n filename: string | undefined,\n): void {\n if (\n !t.isObjectProperty(execute) ||\n !t.isCallExpression(execute.value) ||\n execute.value.arguments.length !== 1 ||\n !t.isObjectExpression(execute.value.arguments[0])\n ) {\n throw new GenerativeCompileError(\n \"`providerTool(...)` must receive an inline object literal\",\n filename,\n );\n }\n\n const existingNames = new Set(\n object.properties.flatMap((prop) => {\n if (!t.isObjectProperty(prop) && !t.isObjectMethod(prop)) return [];\n const name = memberName(prop.key, prop.computed);\n return name ? [name] : [];\n }),\n );\n const configNames = new Set<string>();\n\n for (const prop of execute.value.arguments[0].properties) {\n if (!t.isObjectProperty(prop)) {\n throw new GenerativeCompileError(\n \"`providerTool(...)` config can only contain object properties\",\n filename,\n );\n }\n const name = memberName(prop.key, prop.computed);\n if (!name) {\n throw new GenerativeCompileError(\n \"`providerTool(...)` config can only contain static property names\",\n filename,\n );\n }\n if (\n t.isFunctionExpression(prop.value) ||\n t.isArrowFunctionExpression(prop.value)\n ) {\n throw new GenerativeCompileError(\n \"`providerTool(...)` config cannot contain function-valued properties\",\n filename,\n );\n }\n if (existingNames.has(name) || configNames.has(name)) {\n const toolLabel = toolName ? ` for \"${toolName}\"` : \"\";\n throw new GenerativeCompileError(\n `\\`providerTool(...)\\` config${toolLabel} duplicates \"${name}\"`,\n filename,\n );\n }\n configNames.add(name);\n object.properties.push(prop);\n }\n}\n\ntype Entry = t.ObjectExpression[\"properties\"][number];\n\n/** The raw AST value of an entry (any expression), or null for spreads/methods. */\nfunction entryRawValue(entry: Entry): t.Expression | null {\n if (t.isObjectProperty(entry) && t.isExpression(entry.value)) {\n return entry.value;\n }\n return null;\n}\n\nfunction entryValue(entry: Entry): t.ObjectExpression | null {\n if (t.isObjectProperty(entry) && t.isObjectExpression(entry.value)) {\n return entry.value;\n }\n return null;\n}\n\n/** A member of an entry object: `render`/`execute`/`type`, as property or method. */\nfunction findMember(\n object: t.ObjectExpression,\n name: string,\n): t.ObjectProperty | t.ObjectMethod | undefined {\n return object.properties.find(\n (p): p is t.ObjectProperty | t.ObjectMethod =>\n (t.isObjectProperty(p) || t.isObjectMethod(p)) &&\n memberName(p.key, p.computed) === name,\n );\n}\n\nfunction removeMember(object: t.ObjectExpression, name: string): void {\n object.properties = object.properties.filter(\n (p) =>\n !(\n (t.isObjectProperty(p) || t.isObjectMethod(p)) &&\n memberName(p.key, p.computed) === name\n ),\n );\n}\n\n/** The `BlockStatement` body of an `execute` member, if it has one. */\nfunction executeBody(\n member: t.ObjectProperty | t.ObjectMethod,\n): t.BlockStatement | undefined {\n if (t.isObjectMethod(member)) return member.body;\n const value = member.value;\n if (\n (t.isArrowFunctionExpression(value) || t.isFunctionExpression(value)) &&\n t.isBlockStatement(value.body)\n ) {\n return value.body;\n }\n return undefined;\n}\n\n/** Whether an `execute` opts into the client via a leading `\"use client\"`. */\nfunction executeIsClient(member: t.ObjectProperty | t.ObjectMethod): boolean {\n return !!executeBody(member)?.directives.some(\n (d) => d.value.value === \"use client\",\n );\n}\n\nfunction executeIsSentinel(\n member: t.ObjectProperty | t.ObjectMethod,\n name: string,\n): boolean {\n return (\n t.isObjectProperty(member) &&\n t.isCallExpression(member.value) &&\n t.isIdentifier(member.value.callee, { name })\n );\n}\n\n/** Whether an `execute` is the human-in-the-loop sentinel. */\nfunction executeIsHumanTool(\n member: t.ObjectProperty | t.ObjectMethod,\n): boolean {\n return (\n executeIsSentinel(member, \"humanTool\") ||\n executeIsSentinel(member, \"hitlTool\") ||\n executeIsSentinel(member, \"hitl\")\n );\n}\n\n/** Whether an `execute` is the provider-tool sentinel. */\nfunction executeIsProviderTool(\n member: t.ObjectProperty | t.ObjectMethod,\n): boolean {\n return executeIsSentinel(member, \"providerTool\");\n}\n\n/** Whether an `execute` is the local override sentinel. */\nfunction executeIsStubTool(member: t.ObjectProperty | t.ObjectMethod): boolean {\n return executeIsSentinel(member, \"stubTool\");\n}\n\n/** Whether an `execute` is the externally-defined backend tool sentinel. */\nfunction executeIsExternalTool(\n member: t.ObjectProperty | t.ObjectMethod,\n): boolean {\n return executeIsSentinel(member, \"externalTool\");\n}\n\n/** Drops the `\"use client\"` directive from an `execute` body (kept frontend). */\nfunction stripUseClient(member: t.ObjectProperty | t.ObjectMethod): void {\n const body = executeBody(member);\n if (body) {\n body.directives = body.directives.filter(\n (d) => d.value.value !== \"use client\",\n );\n }\n}\n\n/**\n * The tool's nature, inferred from its (mandatory) `execute` rather than an\n * authored `type`: `humanTool()` → `human`; `providerTool(...)` → `provider`;\n * `stubTool()` → `frontend`; `externalTool()` → `backend`; `\"use client\"` →\n * `frontend`; otherwise `backend`.\n * The loader writes the result back as a `type` field (see {@link setToolType})\n * so the runtime keeps it.\n */\nfunction inferToolType(\n object: t.ObjectExpression,\n toolName: string | undefined,\n filename: string | undefined,\n): ToolType {\n const execute = findMember(object, \"execute\");\n if (!execute) {\n throw new GenerativeCompileError(\n `${toolSubject(toolName)} must declare an \\`execute\\`; use ` +\n \"`humanTool()` for a human-in-the-loop tool\",\n filename,\n );\n }\n if (executeIsHumanTool(execute)) return \"human\";\n if (executeIsProviderTool(execute)) return \"provider\";\n if (executeIsStubTool(execute)) return \"frontend\";\n if (executeIsExternalTool(execute)) return \"backend\";\n return executeIsClient(execute) ? \"frontend\" : \"backend\";\n}\n\nfunction toolSubject(toolName: string | undefined): string {\n return toolName ? `tool \"${toolName}\"` : \"every tool\";\n}\n\nfunction typedToolSubject(type: string, toolName: string | undefined): string {\n if (toolName) return `${type} tool \"${toolName}\"`;\n const article = /^[aeiou]/i.test(type) ? \"an\" : \"a\";\n return `${article} ${type} tool`;\n}\n\nfunction stripExternalToolMetadata(object: t.ObjectExpression): void {\n // Mirror BackendTool's forbidden metadata fields: execute is stripped by the\n // main routing loop, while streamCall is also removed because there is no\n // assistant-ui executor to stream from.\n removeMember(object, \"description\");\n removeMember(object, \"parameters\");\n removeMember(object, \"disabled\");\n removeMember(object, \"toModelOutput\");\n removeMember(object, \"experimental_onSchemaValidationError\");\n removeMember(object, \"providerOptions\");\n removeMember(object, \"streamCall\");\n}\n\n/** Writes the resolved `type` back onto the tool object (replacing any author's). */\nfunction setToolType(object: t.ObjectExpression, type: ToolType): void {\n removeMember(object, \"type\");\n // Append (not prepend) so the inferred type wins over any earlier spread.\n object.properties.push(\n t.objectProperty(t.identifier(\"type\"), t.stringLiteral(type)),\n );\n}\n\nfunction setBackendDefault(\n object: t.ObjectExpression,\n target: Target,\n type: ToolType,\n): void {\n // Always strip any hand-authored marker first; only re-add it for client\n // frontend/human tools whose schema is already known by the backend.\n removeMember(object, \"unstable_backendDefault\");\n if (target !== \"client\" || (type !== \"frontend\" && type !== \"human\")) return;\n\n object.properties.push(\n t.objectProperty(\n t.identifier(\"unstable_backendDefault\"),\n t.objectExpression([\n t.objectProperty(t.identifier(\"parameters\"), t.booleanLiteral(true)),\n ]),\n ),\n );\n}\n\nfunction memberName(\n key: t.Node,\n computed: boolean | undefined,\n): string | undefined {\n if (computed) return undefined;\n if (t.isIdentifier(key)) return key.name;\n if (t.isStringLiteral(key)) return key.value;\n return undefined;\n}\n\n/**\n * Removes declarations and import specifiers left unreferenced after region\n * removal, to a fixpoint (a dropped helper frees what it used). Keeps exports,\n * side-effect imports, and possibly-side-effectful initializers.\n */\nfunction pruneUnused(ast: t.File): void {\n const hadSpecifiers = new WeakSet<t.ImportDeclaration>();\n for (const stmt of ast.program.body) {\n if (t.isImportDeclaration(stmt) && stmt.specifiers.length > 0) {\n hadSpecifiers.add(stmt);\n }\n }\n\n let removedSomething = true;\n while (removedSomething) {\n removedSomething = false;\n traverse(ast, {\n Program(path: NodePath<t.Program>) {\n path.scope.crawl();\n const isUnused = (name: string): boolean => {\n const binding = path.scope.getBinding(name);\n return !!binding && !binding.referenced;\n };\n\n path.node.body = path.node.body.filter((stmt) => {\n if (\n (t.isFunctionDeclaration(stmt) || t.isClassDeclaration(stmt)) &&\n stmt.id &&\n isUnused(stmt.id.name)\n ) {\n removedSomething = true;\n return false;\n }\n if (t.isVariableDeclaration(stmt)) {\n stmt.declarations = stmt.declarations.filter((decl) => {\n // Handles destructuring too: drop the declarator only when *every*\n // bound name is unused (else a `const { a } = server` survives and\n // keeps a server import in the client graph). Restricted to plain\n // patterns so a default/computed-key side effect isn't dropped.\n const names = Object.keys(t.getBindingIdentifiers(decl.id));\n if (\n names.length > 0 &&\n isPlainPattern(decl.id) &&\n isRemovableInit(decl.init) &&\n names.every(isUnused)\n ) {\n removedSomething = true;\n return false;\n }\n return true;\n });\n if (stmt.declarations.length === 0) return false;\n }\n return true;\n });\n path.stop();\n },\n });\n }\n\n traverse(ast, {\n Program(path: NodePath<t.Program>) {\n path.scope.crawl();\n for (const stmt of path.node.body) {\n if (!t.isImportDeclaration(stmt)) continue;\n stmt.specifiers = stmt.specifiers.filter((spec) => {\n const binding = path.scope.getBinding(spec.local.name);\n return binding ? binding.referenced : true;\n });\n }\n path.node.body = path.node.body.filter(\n (stmt) =>\n !(\n t.isImportDeclaration(stmt) &&\n stmt.specifiers.length === 0 &&\n hadSpecifiers.has(stmt)\n ),\n );\n path.stop();\n },\n });\n}\n\n/**\n * Whether a binding pattern is side-effect-free to drop: a plain identifier, or\n * an object/array pattern of plain bindings — no default values\n * (`{ a = expr }`) or computed keys (`{ [expr]: a }`), which would evaluate (and\n * thus could have side effects) at destructuring time.\n */\nfunction isPlainPattern(node: t.Node): boolean {\n if (t.isIdentifier(node)) return true;\n if (t.isObjectPattern(node)) {\n return node.properties.every((p) =>\n t.isRestElement(p)\n ? isPlainPattern(p.argument)\n : !p.computed && isPlainPattern(p.value),\n );\n }\n if (t.isArrayPattern(node)) {\n return node.elements.every((el) => el == null || isPlainPattern(el));\n }\n return false; // AssignmentPattern (default), member expr, etc.\n}\n\n/** Whether a variable initializer is safe to drop (no observable side effects). */\nfunction isRemovableInit(node: t.Expression | null | undefined): boolean {\n if (node == null) return true;\n if (t.isTSAsExpression(node) || t.isTSSatisfiesExpression(node)) {\n return isRemovableInit(node.expression);\n }\n // Containers are removable only if every element is — a nested call (e.g.\n // `[track()]`) has an observable side effect that dropping would lose.\n if (t.isArrayExpression(node)) {\n return node.elements.every(\n (el) => el == null || (t.isExpression(el) && isRemovableInit(el)),\n );\n }\n if (t.isObjectExpression(node)) {\n return node.properties.every(\n (p) =>\n t.isObjectProperty(p) &&\n !p.computed &&\n t.isExpression(p.value) &&\n isRemovableInit(p.value),\n );\n }\n if (t.isTemplateLiteral(node)) {\n return node.expressions.every(\n (e) => t.isExpression(e) && isRemovableInit(e),\n );\n }\n return (\n t.isArrowFunctionExpression(node) ||\n t.isFunctionExpression(node) ||\n t.isClassExpression(node) ||\n t.isIdentifier(node) ||\n // non-computed only — `obj[fn()]` could hide a side-effectful key\n (t.isMemberExpression(node) && !node.computed) ||\n t.isJSXElement(node) ||\n t.isJSXFragment(node) ||\n t.isLiteral(node)\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"compile.js","names":["pkgJson.version"],"sources":["../src/compile.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport * as nodePath from \"node:path\";\nimport { parse } from \"@babel/parser\";\nimport _traverse, { type NodePath } from \"@babel/traverse\";\nimport _generate from \"@babel/generator\";\nimport * as t from \"@babel/types\";\nimport { satisfies } from \"semver\";\nimport { DIRECTIVE, type Target } from \"./constants\";\nimport pkgJson from \"../package.json\" with { type: \"json\" };\n\nconst parserPlugins = [\n \"typescript\",\n \"jsx\",\n \"explicitResourceManagement\",\n] as NonNullable<NonNullable<Parameters<typeof parse>[1]>[\"plugins\"]>;\n\n// @babel/traverse and @babel/generator are CJS; their default export is the\n// function itself under some interop and `{ default }` under others.\nconst traverse = (\n typeof _traverse === \"function\" ? _traverse : (_traverse as any).default\n) as typeof _traverse;\nconst generate = (\n typeof _generate === \"function\" ? _generate : (_generate as any).default\n) as typeof _generate;\n\nexport type ToolType = \"frontend\" | \"backend\" | \"human\" | \"provider\";\n\n/** The required wrapper around a toolkit's tools (stripped at build time). */\nconst TOOLKIT_WRAPPER = \"defineToolkit\";\n/** The helper that produces MCP-only toolkit fragments. */\nconst MCP_TOOLKIT_WRAPPER = \"defineMcpToolkit\";\n/** The required wrapper around a generative-UI library (stripped at build time). */\nconst COMPONENTS_WRAPPER = \"defineGenerativeComponents\";\n/** The core package whose metadata declares supported compiler versions. */\nconst CORE_PACKAGE = \"@assistant-ui/core\";\n/** This package, checked against core's compatibility range. */\nconst COMPILER_PACKAGE = \"@assistant-ui/x-generative-compiler\";\n/** Packages that re-export core's generative markers. */\nconst DISTRIBUTION_PACKAGES = [\n CORE_PACKAGE,\n \"@assistant-ui/react\",\n \"@assistant-ui/react-native\",\n \"@assistant-ui/react-ink\",\n] as const;\n/** Package that exports the generative UI runtime split by export condition. */\nconst GENERATIVE_UI_PACKAGE = \"@assistant-ui/react-generative-ui\";\n/**\n * The class whose instances expose split-by-condition tools (`present()`,\n * `promptUser()`). A toolkit entry that calls a method on one of these passes\n * through untouched — the library, not this compiler, routes its halves.\n */\nconst GENERATIVE_FACTORY = \"JSONGenerativeUI\";\n/**\n * The factory producing an interactable's complete tool entry. Unlike\n * `JSONGenerativeUI`, its package has no per-target builds, so this compiler\n * splits the inline config: the client keeps `render`, the server drops it.\n * The factory's own `execute` is internal and client-safe (frontend tool).\n */\nconst INTERACTABLE_TOOL_FACTORY = \"unstable_interactableTool\";\n\n/** Mutable per-build outcomes the toolkit pass reports back for directive/guard injection. */\ninterface TargetFlags {\n /** A `render` survived on a client build (→ emit `\"use client\"`). */\n keptRender: boolean;\n /** A backend `execute` survived on a server build (→ emit `import \"server-only\"`). */\n keptBackendExecute: boolean;\n}\n\nexport interface CompileOptions {\n /** Which build target to emit. */\n target: Target;\n /** Source filename, used for error messages and source maps. */\n filename?: string;\n /** Emit a source map alongside the code. */\n sourceMaps?: boolean;\n /**\n * Whether the `server` target prepends `import \"server-only\"` when it keeps a\n * backend `execute`. Defaults to `true` (the Next.js/RSC convention, where the\n * guard fires via the `react-server` condition). Set `false` for bundlers\n * without a `react-server` layer (e.g. a Vite/TanStack Start `ssr` build),\n * where the split is already structural and importing `server-only` would\n * throw — see the Vite integration.\n */\n injectServerOnly?: boolean;\n}\n\nexport interface CompileResult {\n code: string;\n map?: object | null;\n}\n\n/** Thrown when a `\"use generative\"` file violates an authoring constraint. */\nexport class GenerativeCompileError extends Error {\n constructor(message: string, filename?: string) {\n super(\n `[assistant-ui/use-generative]${filename ? ` ${filename}:` : \"\"} ${message}`,\n );\n this.name = \"GenerativeCompileError\";\n }\n}\n\n/** Whether a source string opts into generative compilation via the directive. */\nexport function isGenerativeModule(code: string): boolean {\n // The directive must be a leading statement, preceded only by an optional BOM,\n // whitespace, and line/block comments. Scanned linearly — a regex over the\n // comment prefix is prone to catastrophic backtracking on crafted input.\n let i = code.charCodeAt(0) === 0xfeff ? 1 : 0;\n for (;;) {\n while (i < code.length && /\\s/.test(code[i]!)) i++;\n if (code.startsWith(\"//\", i)) {\n const nl = code.indexOf(\"\\n\", i);\n if (nl === -1) return false;\n i = nl + 1;\n } else if (code.startsWith(\"/*\", i)) {\n const end = code.indexOf(\"*/\", i + 2);\n if (end === -1) return false;\n i = end + 2;\n } else {\n break;\n }\n }\n\n const quote = code[i];\n if (quote !== '\"' && quote !== \"'\") return false;\n\n const directiveStart = i + 1;\n if (!code.startsWith(DIRECTIVE, directiveStart)) return false;\n\n const directiveEnd = directiveStart + DIRECTIVE.length;\n if (code[directiveEnd] !== quote) return false;\n\n return hasDirectiveTerminator(code, directiveEnd + 1);\n}\n\nfunction hasDirectiveTerminator(code: string, start: number): boolean {\n let i = start;\n let sawLineTerminator = false;\n for (;;) {\n if (i >= code.length) return true;\n\n const char = code.charCodeAt(i);\n if (isSemicolon(char)) return true;\n if (isLineTerminator(char)) {\n sawLineTerminator = true;\n i++;\n continue;\n }\n\n if (code.startsWith(\"//\", i)) {\n const lineEnd = nextLineTerminatorIndex(code, i + 2);\n if (lineEnd === -1) return true;\n sawLineTerminator = true;\n i = lineEnd + 1;\n continue;\n }\n\n if (code.startsWith(\"/*\", i)) {\n const end = code.indexOf(\"*/\", i + 2);\n if (end === -1) return false;\n sawLineTerminator ||= containsLineTerminator(code, i + 2, end);\n i = end + 2;\n continue;\n }\n\n if (/\\s/.test(code[i]!)) {\n i++;\n continue;\n }\n\n return sawLineTerminator && !startsExpressionContinuation(code, i);\n }\n}\n\nfunction nextLineTerminatorIndex(code: string, start: number): number {\n for (let i = start; i < code.length; i++) {\n if (isLineTerminator(code.charCodeAt(i))) return i;\n }\n return -1;\n}\n\nfunction containsLineTerminator(\n code: string,\n start: number,\n end: number,\n): boolean {\n for (let i = start; i < end; i++) {\n if (isLineTerminator(code.charCodeAt(i))) return true;\n }\n return false;\n}\n\nfunction startsExpressionContinuation(code: string, start: number): boolean {\n switch (code[start]) {\n case \".\":\n case \"+\":\n case \"-\":\n case \"*\":\n case \"/\":\n case \"%\":\n case \"<\":\n case \">\":\n case \"=\":\n case \"!\":\n case \"&\":\n case \"|\":\n case \"^\":\n case \"?\":\n case \":\":\n case \",\":\n case \"[\":\n case \"(\":\n case \"`\":\n return true;\n }\n\n return (\n startsKeywordContinuation(code, start, \"as\") ||\n startsKeywordContinuation(code, start, \"in\") ||\n startsKeywordContinuation(code, start, \"instanceof\") ||\n startsKeywordContinuation(code, start, \"satisfies\")\n );\n}\n\nfunction startsKeywordContinuation(\n code: string,\n start: number,\n keyword: string,\n): boolean {\n if (!code.startsWith(keyword, start)) return false;\n const next = code[start + keyword.length];\n return next === undefined || !/[\\p{ID_Continue}$]/u.test(next);\n}\n\nfunction isSemicolon(char: number): boolean {\n return char === 59;\n}\n\nfunction isLineTerminator(char: number): boolean {\n return char === 10 || char === 13 || char === 0x2028 || char === 0x2029;\n}\n\n/**\n * Rewrites a `\"use generative\"` module for a single build target, keeping only the\n * regions that target needs and pruning the imports the dropped regions used.\n */\nexport function compileGenerative(\n code: string,\n options: CompileOptions,\n): CompileResult {\n const { target, filename } = options;\n\n const ast = parse(code, {\n sourceType: \"module\",\n plugins: parserPlugins,\n });\n\n if (!ast.program.directives.some((d) => d.value.value === DIRECTIVE)) {\n throw new GenerativeCompileError(\n `missing \"${DIRECTIVE}\" directive`,\n filename,\n );\n }\n\n ensureCompilerCompatibleWithCore(ast, filename);\n\n // A module may hold several `defineToolkit(...)` / `defineGenerativeComponents(...)`\n // calls anywhere (e.g. a library built inside `new JSONGenerativeUI(...)` plus\n // the toolkit that exposes it). Tools may reference a `JSONGenerativeUI`\n // instance's `present()`/`promptUser()`, which the library — not this compiler —\n // splits across builds via export conditions; collect those instance names so\n // such entries pass through.\n ensureDefaultExport(ast, filename);\n const generativeInstances = collectGenerativeInstances(ast);\n const interactableToolImports = collectInteractableToolImports(ast);\n const { spreadNames: toolkitSpreadNames, namespaceImports } =\n collectToolkitSpreadNames(ast, filename, createToolkitNameContext());\n\n const flags: TargetFlags = { keptRender: false, keptBackendExecute: false };\n\n traverse(ast, {\n CallExpression(path: NodePath<t.CallExpression>) {\n const callee = path.node.callee;\n const object = t.isObjectExpression(path.node.arguments[0])\n ? path.node.arguments[0]\n : null;\n\n if (t.isIdentifier(callee, { name: COMPONENTS_WRAPPER })) {\n if (!object) {\n throw new GenerativeCompileError(\n `${COMPONENTS_WRAPPER}() takes an inline object literal of components`,\n filename,\n );\n }\n compileComponents(object, target, flags, filename);\n // Unwrap the authoring helper to the bare library object so its import\n // can be pruned.\n path.replaceWith(object);\n path.skip();\n return;\n }\n\n if (t.isIdentifier(callee, { name: TOOLKIT_WRAPPER })) {\n if (!object) {\n throw new GenerativeCompileError(\n `${TOOLKIT_WRAPPER}() takes an inline object literal of tools`,\n filename,\n );\n }\n compileToolkit(\n object,\n target,\n generativeInstances,\n interactableToolImports,\n toolkitSpreadNames,\n namespaceImports,\n flags,\n filename,\n );\n path.replaceWith(object);\n path.skip();\n }\n },\n });\n\n const { keptRender, keptBackendExecute } = flags;\n\n pruneUnused(ast);\n\n // Replace the module directives with the target-appropriate one.\n ast.program.directives = ast.program.directives.filter(\n (d) => d.value.value !== DIRECTIVE && d.value.value !== \"use client\",\n );\n if (target === \"client\" && keptRender) {\n ast.program.directives.unshift(\n t.directive(t.directiveLiteral(\"use client\")),\n );\n }\n if (\n target === \"server\" &&\n keptBackendExecute &&\n (options.injectServerOnly ?? true)\n ) {\n ast.program.body.unshift(\n t.importDeclaration([], t.stringLiteral(\"server-only\")),\n );\n }\n\n const result = generate(\n ast,\n {\n sourceMaps: options.sourceMaps ?? false,\n ...(filename ? { filename } : {}),\n jsescOption: { minimal: true },\n },\n code,\n );\n\n return { code: result.code, map: result.map };\n}\n\ninterface PackageJson {\n name?: string;\n version?: string;\n optionalDevDependencies?: Record<string, string>;\n}\n\nconst checkedCorePackageJsonPaths = new Set<string>();\n\n// This compiler's own version, inlined from package.json at build time. Read via\n// an import (not by walking the filesystem at runtime) so the literal survives\n// being bundled into a host package like `@assistant-ui/metro`, where no\n// standalone `@assistant-ui/x-generative-compiler` sits on disk to walk up to.\nconst COMPILER_VERSION = pkgJson.version;\n\nfunction ensureCompilerCompatibleWithCore(\n ast: t.File,\n filename: string | undefined,\n): void {\n const corePackageJsonPath = resolveCorePackageJson(ast, filename);\n if (\n !corePackageJsonPath ||\n checkedCorePackageJsonPaths.has(corePackageJsonPath)\n ) {\n return;\n }\n\n const corePackageJson = readPackageJson(corePackageJsonPath);\n const range = corePackageJson?.optionalDevDependencies?.[COMPILER_PACKAGE];\n if (!range) {\n checkedCorePackageJsonPaths.add(corePackageJsonPath);\n return;\n }\n\n let compatible = false;\n try {\n compatible = satisfies(COMPILER_VERSION, range, {\n includePrerelease: true,\n });\n } catch {\n throw new GenerativeCompileError(\n `${CORE_PACKAGE}@${corePackageJson.version ?? \"unknown\"} declares an ` +\n `invalid optionalDevDependencies range for ${COMPILER_PACKAGE}: ` +\n JSON.stringify(range),\n filename,\n );\n }\n\n if (!compatible) {\n throw new GenerativeCompileError(\n `${CORE_PACKAGE}@${corePackageJson.version ?? \"unknown\"} requires ` +\n `${COMPILER_PACKAGE} ${range}, but the current compiler is ` +\n `${COMPILER_VERSION}. Update @assistant-ui/next, @assistant-ui/vite, ` +\n \"or @assistant-ui/metro so their compiler satisfies the core package's \" +\n \"optionalDevDependencies range.\",\n filename,\n );\n }\n\n checkedCorePackageJsonPaths.add(corePackageJsonPath);\n}\n\nfunction resolveCorePackageJson(\n ast: t.File,\n filename: string | undefined,\n): string | null {\n for (const packageName of collectImportedDistributionPackages(ast)) {\n const packageJsonPath = resolvePackageJson(packageName, filename);\n if (!packageJsonPath) continue;\n if (packageName === CORE_PACKAGE) return packageJsonPath;\n\n const corePackageJsonPath = resolvePackageJson(\n CORE_PACKAGE,\n packageJsonPath,\n );\n if (corePackageJsonPath) return corePackageJsonPath;\n }\n\n return null;\n}\n\nfunction collectImportedDistributionPackages(ast: t.File): Set<string> {\n const packages = new Set<string>();\n\n for (const statement of ast.program.body) {\n const source =\n (t.isImportDeclaration(statement) ||\n t.isExportNamedDeclaration(statement) ||\n t.isExportAllDeclaration(statement)) &&\n statement.source\n ? statement.source.value\n : null;\n if (!source) continue;\n\n const packageName = packageNameFromSpecifier(source);\n if (packageName) packages.add(packageName);\n }\n\n return packages;\n}\n\nfunction packageNameFromSpecifier(specifier: string): string | null {\n for (const packageName of DISTRIBUTION_PACKAGES) {\n if (specifier === packageName || specifier.startsWith(`${packageName}/`)) {\n return packageName;\n }\n }\n\n return null;\n}\n\nfunction resolvePackageJson(\n packageName: string,\n filename: string | undefined,\n): string | null {\n const requirePath = normalizeRequirePath(filename);\n const require = createRequire(requirePath);\n\n try {\n return findPackageJson(require.resolve(packageName), packageName);\n } catch {\n return findPackageJsonFromNodeModules(packageName, requirePath);\n }\n}\n\nfunction normalizeRequirePath(filename: string | undefined): string {\n return cleanAbsoluteFilename(filename) ?? import.meta.url;\n}\n\n/** Strips a `?query`/`#hash` suffix and returns the path only if it is absolute. */\nfunction cleanAbsoluteFilename(filename: string | undefined): string | null {\n if (!filename) return null;\n const clean = filename.split(/[?#]/, 1)[0]!;\n return nodePath.isAbsolute(clean) ? clean : null;\n}\n\nfunction findPackageJson(\n fromPathOrUrl: string,\n packageName: string,\n): string | null {\n let current = nodePath.dirname(\n fromPathOrUrl.startsWith(\"file:\")\n ? new URL(fromPathOrUrl).pathname\n : nodePath.resolve(fromPathOrUrl),\n );\n\n for (;;) {\n const packageJsonPath = nodePath.join(current, \"package.json\");\n const packageJson = readPackageJson(packageJsonPath);\n if (packageJson?.name === packageName) return packageJsonPath;\n\n const parent = nodePath.dirname(current);\n if (parent === current) return null;\n current = parent;\n }\n}\n\nfunction findPackageJsonFromNodeModules(\n packageName: string,\n fromPathOrUrl: string,\n): string | null {\n const parts = packageName.split(\"/\");\n let current = nodePath.dirname(\n fromPathOrUrl.startsWith(\"file:\")\n ? new URL(fromPathOrUrl).pathname\n : nodePath.resolve(fromPathOrUrl),\n );\n\n for (;;) {\n const packageJsonPath = nodePath.join(\n current,\n \"node_modules\",\n ...parts,\n \"package.json\",\n );\n const packageJson = readPackageJson(packageJsonPath);\n if (packageJson?.name === packageName) return packageJsonPath;\n\n const parent = nodePath.dirname(current);\n if (parent === current) return null;\n current = parent;\n }\n}\n\nfunction readPackageJson(packageJsonPath: string): PackageJson | null {\n if (!existsSync(packageJsonPath)) return null;\n try {\n return JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as PackageJson;\n } catch (error) {\n throw new GenerativeCompileError(\n `could not parse package metadata at ${packageJsonPath}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n}\n\n/**\n * Errors unless the module's default export is the toolkit — a `defineToolkit(...)`\n * call (through `satisfies`/`as`/parens). This is the security boundary: the\n * default export is what the runtime registers, so it must be wrapped (and thus\n * split). A bare `export default { ... }` would ship a backend `execute` to the\n * client even if some *other* `defineToolkit(...)` exists elsewhere in the file.\n */\nfunction ensureDefaultExport(ast: t.File, filename: string | undefined): void {\n const def = ast.program.body.find(\n (stmt): stmt is t.ExportDefaultDeclaration =>\n t.isExportDefaultDeclaration(stmt),\n );\n if (!def) {\n throw new GenerativeCompileError(\"missing a default export\", filename);\n }\n if (!unwrapToToolkitCall(def.declaration)) {\n throw new GenerativeCompileError(\n `the default export must be ${TOOLKIT_WRAPPER}({ ... }) or ` +\n `${MCP_TOOLKIT_WRAPPER}({ ... }) (imported from \"@assistant-ui/react\"); ` +\n \"wrapping is required so a backend `execute` can't be authored in a way \" +\n \"that reaches the client\",\n filename,\n );\n }\n}\n\n/**\n * Unwraps a node through `satisfies`/`as`/parens to a call of the named function,\n * or returns `null`.\n */\nfunction unwrapToCall(node: t.Node, name: string): t.CallExpression | null {\n if (t.isTSSatisfiesExpression(node) || t.isTSAsExpression(node)) {\n return unwrapToCall(node.expression, name);\n }\n if (t.isParenthesizedExpression(node)) {\n return unwrapToCall(node.expression, name);\n }\n if (t.isCallExpression(node) && t.isIdentifier(node.callee, { name })) {\n return node;\n }\n return null;\n}\n\n/**\n * Unwraps a statement to its variable declaration through an `export` wrapper,\n * or returns `null`.\n */\nfunction asVariableDeclaration(\n statement: t.Statement,\n): t.VariableDeclaration | null {\n if (t.isVariableDeclaration(statement)) return statement;\n if (\n t.isExportNamedDeclaration(statement) &&\n t.isVariableDeclaration(statement.declaration)\n ) {\n return statement.declaration;\n }\n return null;\n}\n\n/**\n * Collects the names bound to `new JSONGenerativeUI(...)` (e.g.\n * `const generative = new JSONGenerativeUI({ library })`). A toolkit entry that\n * calls a method on one of these is a generative tool whose halves the library\n * routes by export condition, so it passes through the toolkit pass untouched.\n */\nfunction collectGenerativeInstances(ast: t.File): Set<string> {\n const names = new Set<string>();\n const generativeFactories = collectGenerativeFactoryImports(ast);\n for (const statement of ast.program.body) {\n const variableDeclaration = asVariableDeclaration(statement);\n if (!variableDeclaration) continue;\n for (const declaration of variableDeclaration.declarations) {\n const { id, init } = declaration;\n if (\n t.isIdentifier(id) &&\n t.isNewExpression(init) &&\n t.isIdentifier(init.callee) &&\n generativeFactories.has(init.callee.name)\n ) {\n names.add(id.name);\n }\n }\n }\n return names;\n}\n\nfunction collectGenerativeFactoryImports(ast: t.File): Set<string> {\n const names = new Set<string>();\n for (const statement of ast.program.body) {\n if (\n !t.isImportDeclaration(statement) ||\n statement.source.value !== GENERATIVE_UI_PACKAGE\n ) {\n continue;\n }\n\n for (const specifier of statement.specifiers) {\n if (\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.imported, { name: GENERATIVE_FACTORY })\n ) {\n names.add(specifier.local.name);\n }\n }\n }\n return names;\n}\n\ntype ToolkitStaticNames = readonly string[] | null;\ntype ToolkitSpreadNames = Map<string, ToolkitStaticNames>;\n\ninterface ToolkitNameContext {\n importedToolkitNamesByFile: Map<string, ToolkitStaticNames | undefined>;\n resolvingImportedToolkitNames: Set<string>;\n}\n\n/**\n * The toolkit spreads a single module's pass can recognize: safe-to-spread\n * bindings plus the namespace imports that point at a generative module. The\n * namespace set is kept separate from {@link ToolkitSpreadNames} so a\n * whole-namespace `...kit` is not mistaken for a safe identifier spread — only\n * the default export crosses the build-split boundary, so a namespace spread is\n * rejected with a specific callout rather than allowed.\n */\ninterface ToolkitSpreadInfo {\n spreadNames: ToolkitSpreadNames;\n namespaceImports: Set<string>;\n}\n\n/**\n * Collects the local names `unstable_interactableTool` is imported under from a\n * distribution package, so toolkit entries calling it can be recognized\n * (and a same-named local function can't smuggle an arbitrary call through).\n */\nfunction collectInteractableToolImports(ast: t.File): Set<string> {\n const names = new Set<string>();\n for (const statement of ast.program.body) {\n if (!t.isImportDeclaration(statement)) continue;\n if (!packageNameFromSpecifier(statement.source.value)) continue;\n for (const specifier of statement.specifiers) {\n if (\n t.isImportSpecifier(specifier) &&\n t.isIdentifier(specifier.imported, { name: INTERACTABLE_TOOL_FACTORY })\n ) {\n names.add(specifier.local.name);\n }\n }\n }\n return names;\n}\n\nfunction createToolkitNameContext(): ToolkitNameContext {\n return {\n importedToolkitNamesByFile: new Map(),\n resolvingImportedToolkitNames: new Set(),\n };\n}\n\n/**\n * The inline config of an `unstable_interactableTool({ ... })` toolkit entry, or `null`\n * when the entry is some other expression.\n */\nfunction interactableToolConfig(\n value: t.Node,\n imports: Set<string>,\n): t.ObjectExpression | null {\n return t.isCallExpression(value) &&\n t.isIdentifier(value.callee) &&\n imports.has(value.callee.name) &&\n t.isObjectExpression(value.arguments[0])\n ? value.arguments[0]\n : null;\n}\n\n/**\n * Toolkit identifiers that are safe to spread into a `defineToolkit({ ... })`,\n * paired with the static tool names they contain. A `null` name list means the\n * spread is safe, but its names are not statically known for duplicate checks.\n *\n * Two kinds qualify:\n *\n * - A local variable whose initializer is visible to this compiler pass: a\n * `defineToolkit(...)` binding is compiled in-place before a later spread\n * reads it, and `defineMcpToolkit(...)` entries can't contain executable code.\n * - The default import of another `\"use generative\"` module: that module is\n * split per-target by its own compiler pass, so spreading its default-exported\n * toolkit can't leak a backend `execute` to the client. Only the default\n * export crosses the generative-module boundary, so named imports don't\n * qualify — they would be `undefined` once that module is build-split.\n *\n * A namespace import (`import * as kit from \"...\"`) of a generative module is\n * tracked separately in `namespaceImports` so a `...kit` / `...kit.default`\n * spread can be rejected with a specific callout: only the default export\n * crosses the boundary, so a namespace spread is never safe.\n */\nfunction collectToolkitSpreadNames(\n ast: t.File,\n filename: string | undefined,\n context: ToolkitNameContext,\n): ToolkitSpreadInfo {\n const spreadNames: ToolkitSpreadNames = new Map();\n const namespaceImports = new Set<string>();\n const localToolkitCalls = new Map<string, t.CallExpression>();\n\n for (const statement of ast.program.body) {\n const localDeclaration = asVariableDeclaration(statement);\n if (localDeclaration) {\n for (const declaration of localDeclaration.declarations) {\n const { id, init } = declaration;\n if (t.isIdentifier(id) && init) {\n const toolkitCall = unwrapToToolkitCall(init);\n if (toolkitCall) localToolkitCalls.set(id.name, toolkitCall);\n }\n }\n continue;\n }\n\n if (t.isImportDeclaration(statement)) {\n const defaultSpecifier = statement.specifiers.find(\n (specifier): specifier is t.ImportDefaultSpecifier =>\n t.isImportDefaultSpecifier(specifier),\n );\n const namespaceSpecifier = statement.specifiers.find(\n (specifier): specifier is t.ImportNamespaceSpecifier =>\n t.isImportNamespaceSpecifier(specifier),\n );\n if (!defaultSpecifier && !namespaceSpecifier) continue;\n\n const names = getGenerativeImportToolkitNames(\n statement.source.value,\n filename,\n context,\n );\n if (names === undefined) continue;\n\n if (defaultSpecifier) spreadNames.set(defaultSpecifier.local.name, names);\n if (namespaceSpecifier)\n namespaceImports.add(namespaceSpecifier.local.name);\n }\n }\n\n const resolveLocal = (name: string): ToolkitStaticNames | undefined => {\n if (spreadNames.has(name)) return spreadNames.get(name);\n\n const call = localToolkitCalls.get(name);\n if (!call) return undefined;\n\n const object = t.isObjectExpression(call.arguments[0])\n ? call.arguments[0]\n : null;\n const names = object\n ? collectToolkitObjectNames(object, spreadNames)\n : null;\n const publicNames = uniqueToolkitNames(names);\n\n spreadNames.set(name, publicNames);\n return publicNames;\n };\n\n for (const name of localToolkitCalls.keys()) {\n resolveLocal(name);\n }\n\n return { spreadNames, namespaceImports };\n}\n\nconst MODULE_EXTENSIONS = [\n \".ts\",\n \".tsx\",\n \".mts\",\n \".cts\",\n \".js\",\n \".jsx\",\n \".mjs\",\n \".cjs\",\n] as const;\n\n/** Extensions a specifier may carry that actually map to a TS source file. */\nconst REWRITABLE_JS_EXTENSIONS = new Set([\".js\", \".jsx\", \".mjs\", \".cjs\"]);\n\n/**\n * Reads the static tool names from the default export of an imported\n * `\"use generative\"` module. Relative specifiers and `tsconfig` path aliases\n * (e.g. `@/tools`) are resolved; anything else (a bare package, an unresolvable\n * alias) is treated as non-generative, and thus an unsafe spread.\n */\nfunction getGenerativeImportToolkitNames(\n source: string,\n filename: string | undefined,\n context: ToolkitNameContext,\n): ToolkitStaticNames | undefined {\n const cleanFilename = cleanAbsoluteFilename(filename);\n if (!cleanFilename) return undefined;\n\n const resolved = resolveImportedModuleFile(source, cleanFilename);\n if (!resolved) return undefined;\n\n if (context.importedToolkitNamesByFile.has(resolved)) {\n return context.importedToolkitNamesByFile.get(resolved);\n }\n if (context.resolvingImportedToolkitNames.has(resolved)) return null;\n\n let code: string;\n try {\n code = readFileSync(resolved, \"utf8\");\n } catch {\n context.importedToolkitNamesByFile.set(resolved, undefined);\n return undefined;\n }\n\n if (!isGenerativeModule(code)) {\n context.importedToolkitNamesByFile.set(resolved, undefined);\n return undefined;\n }\n\n context.resolvingImportedToolkitNames.add(resolved);\n try {\n const importedAst = parse(code, {\n sourceType: \"module\",\n plugins: parserPlugins,\n });\n const names = getDefaultExportToolkitNames(importedAst, resolved, context);\n context.importedToolkitNamesByFile.set(resolved, names);\n return names;\n } catch (error) {\n if (error instanceof GenerativeCompileError) throw error;\n context.importedToolkitNamesByFile.set(resolved, null);\n return null;\n } finally {\n context.resolvingImportedToolkitNames.delete(resolved);\n }\n}\n\nfunction getDefaultExportToolkitNames(\n ast: t.File,\n filename: string | undefined,\n context: ToolkitNameContext,\n): ToolkitStaticNames {\n const def = ast.program.body.find(\n (stmt): stmt is t.ExportDefaultDeclaration =>\n t.isExportDefaultDeclaration(stmt),\n );\n if (!def) return null;\n\n const toolkitCall = unwrapToToolkitCall(def.declaration);\n if (!toolkitCall || !t.isObjectExpression(toolkitCall.arguments[0])) {\n return null;\n }\n\n const { spreadNames } = collectToolkitSpreadNames(ast, filename, context);\n return uniqueToolkitNames(\n collectToolkitObjectNames(toolkitCall.arguments[0], spreadNames),\n );\n}\n\n/** Resolves an import specifier (relative or `tsconfig`-aliased) to a file on disk. */\nfunction resolveImportedModuleFile(\n source: string,\n fromFilename: string,\n): string | null {\n if (source.startsWith(\".\")) {\n const base = nodePath.resolve(nodePath.dirname(fromFilename), source);\n return resolveModuleFileAtPath(base);\n }\n return resolveAliasImport(source, fromFilename);\n}\n\n/**\n * Resolves a candidate module path, trying TS/JS extensions then index files. A\n * specifier may carry a `.js`-family extension that maps to a `.ts`/`.tsx`\n * source (TypeScript's `bundler`/`nodenext` resolution), so the extension is\n * dropped before probing.\n */\nfunction resolveModuleFileAtPath(base: string): string | null {\n const ext = nodePath.extname(base);\n if (ext && existsSync(base)) return base;\n\n const stem = REWRITABLE_JS_EXTENSIONS.has(ext)\n ? base.slice(0, -ext.length)\n : base;\n\n for (const candidateExt of MODULE_EXTENSIONS) {\n const candidate = `${stem}${candidateExt}`;\n if (existsSync(candidate)) return candidate;\n }\n for (const candidateExt of MODULE_EXTENSIONS) {\n const candidate = nodePath.join(base, `index${candidateExt}`);\n if (existsSync(candidate)) return candidate;\n }\n return null;\n}\n\ninterface TsconfigAliases {\n /** Absolute directory that `paths` targets resolve against. */\n baseDir: string;\n paths: Record<string, string[]>;\n}\n\n/** Resolves a `tsconfig` path alias (e.g. `@/tools/x`) to a file on disk. */\nfunction resolveAliasImport(\n source: string,\n fromFilename: string,\n): string | null {\n const tsconfig = loadTsconfigAliases(nodePath.dirname(fromFilename));\n if (!tsconfig) return null;\n\n // TypeScript matches the most specific key first: an exact (wildcard-free) key\n // beats a wildcard one, and a longer static prefix beats a shorter one.\n const patterns = Object.entries(tsconfig.paths).sort(\n ([a], [b]) => aliasSpecificity(b) - aliasSpecificity(a),\n );\n\n for (const [pattern, targets] of patterns) {\n const matched = matchAliasPattern(pattern, source);\n if (matched === null) continue;\n\n for (const target of targets) {\n const specifier = substituteAliasWildcard(target, matched);\n const file = resolveModuleFileAtPath(\n nodePath.resolve(tsconfig.baseDir, specifier),\n );\n if (file) return file;\n }\n }\n return null;\n}\n\n/** Ranks a `paths` key: an exact key outranks any wildcard; longer prefixes win. */\nfunction aliasSpecificity(pattern: string): number {\n const star = pattern.indexOf(\"*\");\n return star === -1 ? pattern.length + 1 : star;\n}\n\n/** Substitutes the single `*` in a `paths` target with the matched text. */\nfunction substituteAliasWildcard(target: string, matched: string): string {\n const star = target.indexOf(\"*\");\n if (star === -1) return target;\n return target.slice(0, star) + matched + target.slice(star + 1);\n}\n\n/**\n * Matches an import specifier against a `tsconfig` `paths` key. Returns the text\n * captured by the key's `*` (or `\"\"` for an exact, wildcard-free key), or `null`\n * when the specifier doesn't match.\n */\nfunction matchAliasPattern(pattern: string, source: string): string | null {\n const star = pattern.indexOf(\"*\");\n if (star === -1) return pattern === source ? \"\" : null;\n\n const prefix = pattern.slice(0, star);\n const suffix = pattern.slice(star + 1);\n if (\n source.length >= prefix.length + suffix.length &&\n source.startsWith(prefix) &&\n source.endsWith(suffix)\n ) {\n return source.slice(prefix.length, source.length - suffix.length);\n }\n return null;\n}\n\n/**\n * Memoizes resolved aliases per start directory. The compiler runs once per\n * file across a build, so without this every aliased spread re-walks and\n * re-parses the same `tsconfig.json`. Process-lifetime, like\n * `checkedCorePackageJsonPaths`.\n */\nconst tsconfigAliasesByDir = new Map<string, TsconfigAliases | null>();\n\n/** Walks up from a directory to the nearest `tsconfig.json` that declares `paths`. */\nfunction loadTsconfigAliases(fromDir: string): TsconfigAliases | null {\n const cached = tsconfigAliasesByDir.get(fromDir);\n if (cached !== undefined) return cached;\n\n let aliases: TsconfigAliases | null = null;\n let dir = fromDir;\n for (;;) {\n const tsconfigPath = nodePath.join(dir, \"tsconfig.json\");\n if (existsSync(tsconfigPath)) {\n aliases = readTsconfigAliases(tsconfigPath, new Set());\n if (aliases) break;\n }\n const parent = nodePath.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n\n tsconfigAliasesByDir.set(fromDir, aliases);\n return aliases;\n}\n\n/** Reads `baseUrl`/`paths` from a tsconfig, following a single `extends` chain. */\nfunction readTsconfigAliases(\n tsconfigPath: string,\n seen: Set<string>,\n): TsconfigAliases | null {\n if (seen.has(tsconfigPath)) return null;\n seen.add(tsconfigPath);\n\n let config: {\n extends?: string | string[];\n compilerOptions?: { baseUrl?: string; paths?: Record<string, string[]> };\n } | null;\n try {\n config = parseJsonc(readFileSync(tsconfigPath, \"utf8\"));\n } catch {\n return null;\n }\n if (!config) return null;\n\n const configDir = nodePath.dirname(tsconfigPath);\n const { baseUrl, paths } = config.compilerOptions ?? {};\n\n if (paths) {\n return {\n baseDir: baseUrl ? nodePath.resolve(configDir, baseUrl) : configDir,\n paths,\n };\n }\n\n // `extends` may be a string or (TS 5.0+) a string array; later entries take\n // precedence, so try them last-first. Parsed from untrusted JSONC, so the\n // array case is a real runtime shape, not just a type.\n const extendsList = Array.isArray(config.extends)\n ? config.extends\n : config.extends\n ? [config.extends]\n : [];\n for (let i = extendsList.length - 1; i >= 0; i--) {\n const entry = extendsList[i];\n if (typeof entry !== \"string\") continue;\n const extended = resolveExtendedTsconfig(entry, configDir);\n if (extended) {\n const aliases = readTsconfigAliases(extended, seen);\n if (aliases) return aliases;\n }\n }\n return null;\n}\n\n/** Resolves a tsconfig `extends` value (relative path or installed package). */\nfunction resolveExtendedTsconfig(\n extendsValue: string,\n configDir: string,\n): string | null {\n if (extendsValue.startsWith(\".\")) {\n const base = nodePath.resolve(configDir, extendsValue);\n const candidates =\n nodePath.extname(base) === \".json\" ? [base] : [`${base}.json`, base];\n return candidates.find((candidate) => existsSync(candidate)) ?? null;\n }\n try {\n return createRequire(nodePath.join(configDir, \"package.json\")).resolve(\n extendsValue.endsWith(\".json\") ? extendsValue : `${extendsValue}.json`,\n );\n } catch {\n return null;\n }\n}\n\n/** Parses JSON with `//` and block comments and trailing commas stripped (tsconfig is JSONC). */\nfunction parseJsonc(text: string): any {\n const withoutComments = text.replace(\n /\"(?:[^\"\\\\]|\\\\.)*\"|\\/\\/[^\\n\\r]*|\\/\\*[\\s\\S]*?\\*\\//g,\n (match) => (match.startsWith('\"') ? match : \"\"),\n );\n const withoutTrailingCommas = withoutComments.replace(/,(\\s*[}\\]])/g, \"$1\");\n return JSON.parse(withoutTrailingCommas);\n}\n\nfunction unwrapToToolkitCall(node: t.Node): t.CallExpression | null {\n return (\n unwrapToCall(node, TOOLKIT_WRAPPER) ??\n unwrapToCall(node, MCP_TOOLKIT_WRAPPER)\n );\n}\n\nfunction collectToolkitObjectNames(\n object: t.ObjectExpression,\n toolkitSpreadNames: ToolkitSpreadNames,\n): ToolkitStaticNames {\n const names: string[] = [];\n\n for (const entry of object.properties) {\n const entryNames = toolkitEntryNames(entry, toolkitSpreadNames);\n if (!entryNames) return null;\n names.push(...entryNames);\n }\n\n return names;\n}\n\nfunction uniqueToolkitNames(names: ToolkitStaticNames): ToolkitStaticNames {\n return names ? [...new Set(names)] : names;\n}\n\nfunction toolkitEntryNames(\n entry: t.ObjectExpression[\"properties\"][number],\n toolkitSpreadNames: ToolkitSpreadNames,\n): ToolkitStaticNames {\n if (t.isSpreadElement(entry)) {\n if (t.isIdentifier(entry.argument)) {\n return toolkitSpreadNames.get(entry.argument.name) ?? null;\n }\n\n const directMcpToolkit = unwrapToCall(entry.argument, MCP_TOOLKIT_WRAPPER);\n if (\n directMcpToolkit &&\n t.isObjectExpression(directMcpToolkit.arguments[0])\n ) {\n return collectToolkitObjectNames(\n directMcpToolkit.arguments[0],\n toolkitSpreadNames,\n );\n }\n\n return null;\n }\n\n if (t.isObjectProperty(entry) || t.isObjectMethod(entry)) {\n const name = memberName(entry.key, entry.computed);\n return name ? [name] : [];\n }\n\n return [];\n}\n\nfunction toolkitEntrySourceLabel(entry: Entry): string {\n if (t.isSpreadElement(entry)) {\n if (t.isIdentifier(entry.argument)) return `...${entry.argument.name}`;\n if (unwrapToCall(entry.argument, MCP_TOOLKIT_WRAPPER)) {\n return `...${MCP_TOOLKIT_WRAPPER}(...)`;\n }\n return \"...\";\n }\n\n if (t.isObjectProperty(entry) || t.isObjectMethod(entry)) {\n const line = entry.loc?.start.line;\n return line === undefined\n ? \"inline property\"\n : `inline property (line ${line})`;\n }\n\n return \"inline property\";\n}\n\nfunction warnDuplicateToolkitNames(\n object: t.ObjectExpression,\n toolkitSpreadNames: ToolkitSpreadNames,\n filename: string | undefined,\n): void {\n const sourcesByToolName = new Map<string, string[]>();\n for (const entry of object.properties) {\n const entryNames = toolkitEntryNames(entry, toolkitSpreadNames);\n if (!entryNames) continue;\n const source = toolkitEntrySourceLabel(entry);\n for (const name of entryNames) {\n const sources = sourcesByToolName.get(name);\n if (sources) sources.push(source);\n else sourcesByToolName.set(name, [source]);\n }\n }\n\n for (const [name, sources] of sourcesByToolName) {\n const winner = sources.at(-1);\n const overridden = sources.slice(0, -1);\n if (winner === undefined || overridden.length === 0) continue;\n console.warn(\n new GenerativeCompileError(\n `Duplicate tool name \"${name}\": ${winner} overrides ` +\n `${overridden.join(\", \")}. ` +\n \"JavaScript object spread keeps the last definition.\",\n filename,\n ).message,\n );\n }\n}\n\nfunction isSafeToolkitSpread(\n entry: t.SpreadElement,\n toolkitSpreadNames: ToolkitSpreadNames,\n): boolean {\n if (t.isIdentifier(entry.argument)) {\n return toolkitSpreadNames.has(entry.argument.name);\n }\n\n const directMcpToolkit = unwrapToCall(entry.argument, MCP_TOOLKIT_WRAPPER);\n return (\n !!directMcpToolkit && t.isObjectExpression(directMcpToolkit.arguments[0])\n );\n}\n\nfunction genericUnsafeToolkitEntryMessage(): string {\n return (\n \"each tool must be an inline object literal (`name: { ... }`) or a \" +\n \"compiler-visible toolkit spread / generative tool (e.g. \" +\n \"`...defineMcpToolkit(...)`, `...baseToolkit`, \" +\n \"`generative.present()`, or `unstable_interactableTool(...)`) so its \" +\n \"`execute` can be routed\"\n );\n}\n\nfunction describeUnsafeToolkitEntry(entry: Entry): string {\n if (!t.isObjectProperty(entry)) return genericUnsafeToolkitEntryMessage();\n\n const toolName = memberName(entry.key, entry.computed);\n const raw = entryRawValue(entry);\n if (!toolName || !raw) return genericUnsafeToolkitEntryMessage();\n\n return (\n `tool \"${toolName}\" cannot be \\`${generate(raw).code}\\`; use an inline ` +\n `object literal (\\`${toolName}: { ... }\\`) or a compiler-visible toolkit ` +\n \"spread / generative tool so its `execute` can be routed\"\n );\n}\n\nfunction namespaceToolkitSpreadMessage(): string {\n return (\n 'a namespace import (`import * as kit from \"...\"`) can\\'t be spread into ' +\n `${TOOLKIT_WRAPPER}({ ... }); only a generative module's default export ` +\n \"crosses the build-split boundary, so import it as a default \" +\n '(`import kit from \"...\"`) and spread `...kit` instead'\n );\n}\n\n/** The `kit` in `...kit` or `...kit.default`, or null for a computed/opaque base. */\nfunction namespaceSpreadBaseName(argument: t.Expression): string | null {\n if (t.isIdentifier(argument)) return argument.name;\n if (\n t.isMemberExpression(argument) &&\n !argument.computed &&\n t.isIdentifier(argument.object)\n ) {\n return argument.object.name;\n }\n return null;\n}\n\n/** The `JSONGenerativeUI` methods that produce a split-by-condition tool. */\nconst GENERATIVE_TOOL_METHODS = new Set([\"present\", \"promptUser\"]);\n\n/**\n * Whether a toolkit entry's value is a call to a tool-producing method on a\n * collected `JSONGenerativeUI` instance (`generative.present()`), which passes\n * through. The method name is checked too, so a typo like `generative.presnt()`\n * is a compile error here rather than a pass-through that fails at runtime.\n */\nfunction isGenerativeToolEntry(value: t.Node, instances: Set<string>): boolean {\n return (\n t.isCallExpression(value) &&\n t.isMemberExpression(value.callee) &&\n !value.callee.computed &&\n t.isIdentifier(value.callee.object) &&\n instances.has(value.callee.object.name) &&\n t.isIdentifier(value.callee.property) &&\n GENERATIVE_TOOL_METHODS.has(value.callee.property.name)\n );\n}\n\n/**\n * Splits a `defineGenerativeComponents({ ... })` library for a build target:\n * a component's `render` (and the client imports it alone uses) is dropped on\n * the server; `properties`/`description` stay on both, since they drive the tool\n * schema either way. Mutates the object in place.\n */\nfunction compileComponents(\n object: t.ObjectExpression,\n target: Target,\n flags: TargetFlags,\n filename: string | undefined,\n): void {\n for (const entry of object.properties) {\n const value = entryValue(entry);\n if (!value) {\n throw new GenerativeCompileError(\n `each component in ${COMPONENTS_WRAPPER}() must be an inline object ` +\n \"literal (`name: { ... }`) so its `render` can be routed\",\n filename,\n );\n }\n if (!findMember(value, \"render\")) continue;\n // The client keeps `render` (and so needs the module marked `\"use client\"`);\n // the server drops it, since only the schema reaches the model there.\n if (target === \"client\") flags.keptRender = true;\n else removeMember(value, \"render\");\n }\n}\n\n/**\n * Splits a `defineToolkit({ ... })` for a build target. Each inline tool is\n * routed by inferred type (see the per-entry logic); a generative entry like\n * `generative.present()` passes through, the library having already split it.\n * Mutates the object in place and records outcomes in {@link TargetFlags}.\n */\nfunction compileToolkit(\n object: t.ObjectExpression,\n target: Target,\n instances: Set<string>,\n interactableToolImports: Set<string>,\n toolkitSpreadNames: ToolkitSpreadNames,\n namespaceImports: Set<string>,\n flags: TargetFlags,\n filename: string | undefined,\n): void {\n // Split builds compile both targets; emit target-independent warnings from\n // the client pass so each duplicate is logged once.\n if (target === \"client\") {\n warnDuplicateToolkitNames(object, toolkitSpreadNames, filename);\n }\n\n const nextProperties: t.ObjectExpression[\"properties\"] = [];\n\n for (const entry of object.properties) {\n const value = entryValue(entry);\n if (!value) {\n if (\n t.isSpreadElement(entry) &&\n isSafeToolkitSpread(entry, toolkitSpreadNames)\n ) {\n nextProperties.push(entry);\n continue;\n }\n // A generative tool (`generative.present()`) is split by the library's\n // export conditions, so it is safe to keep verbatim. Anything else — a\n // method or opaque call like `makeTool()` — can't be analyzed, so its\n // `execute` could reach the client unstripped.\n const raw = entryRawValue(entry);\n if (raw && isGenerativeToolEntry(raw, instances)) {\n nextProperties.push(entry);\n continue;\n }\n const config =\n raw && interactableToolConfig(raw, interactableToolImports);\n if (config) {\n if (target === \"client\") flags.keptRender = true;\n else removeMember(config, \"render\");\n nextProperties.push(entry);\n continue;\n }\n if (t.isSpreadElement(entry)) {\n const namespaceBase = namespaceSpreadBaseName(entry.argument);\n if (namespaceBase && namespaceImports.has(namespaceBase)) {\n throw new GenerativeCompileError(\n namespaceToolkitSpreadMessage(),\n filename,\n );\n }\n }\n throw new GenerativeCompileError(\n describeUnsafeToolkitEntry(entry),\n filename,\n );\n }\n\n // Nature is inferred from `execute` (see inferToolType), not an authored\n // `type`. The resolved type is written back below so the runtime keeps it.\n const toolName = t.isObjectProperty(entry)\n ? memberName(entry.key, entry.computed)\n : undefined;\n const execute = findMember(value, \"execute\");\n const isStub = execute ? executeIsStubTool(execute) : false;\n const isExternal = execute ? executeIsExternalTool(execute) : false;\n const type = inferToolType(value, toolName, filename);\n const hasRender = !!findMember(value, \"render\");\n const hasRenderText = !!findMember(value, \"renderText\");\n\n if (type === \"frontend\" && !hasRender && !hasRenderText) {\n throw new GenerativeCompileError(\n `${typedToolSubject(\"frontend\", toolName)} must declare a ` +\n \"`render` or `renderText` \" +\n \"(it has no server execute to show otherwise)\",\n filename,\n );\n }\n\n if (type === \"human\" && !hasRender) {\n throw new GenerativeCompileError(\n `${typedToolSubject(\"human\", toolName)} must declare a ` +\n \"`render` so it can collect input\",\n filename,\n );\n }\n\n if (type === \"provider\" && execute) {\n applyProviderToolConfig(value, execute, toolName, filename);\n }\n\n if (isExternal) {\n if (!hasRender && !hasRenderText) {\n throw new GenerativeCompileError(\n `${typedToolSubject(\"external\", toolName)} must declare a ` +\n \"`render` or `renderText` \" +\n \"(assistant-ui only renders calls for tools defined elsewhere)\",\n filename,\n );\n }\n if (target === \"server\") continue;\n stripExternalToolMetadata(value);\n }\n\n if (target === \"client\") {\n // A non-stub frontend execute stays (its `\"use client\"` marker is no longer needed\n // once the module is client); backend, sentinel, and stub executes are dropped.\n if (execute && type === \"frontend\" && !isStub) stripUseClient(execute);\n else if (execute) removeMember(value, \"execute\");\n if (hasRender || hasRenderText) flags.keptRender = true;\n } else {\n // server: render is never needed; only a non-external backend execute survives.\n if (hasRender) removeMember(value, \"render\");\n if (hasRenderText) removeMember(value, \"renderText\");\n if (execute) {\n if (type === \"backend\" && !isExternal) flags.keptBackendExecute = true;\n else removeMember(value, \"execute\");\n }\n }\n\n setToolType(value, type);\n setBackendDefault(value, target, type);\n nextProperties.push(entry);\n }\n\n object.properties = nextProperties;\n}\n\nfunction applyProviderToolConfig(\n object: t.ObjectExpression,\n execute: t.ObjectProperty | t.ObjectMethod,\n toolName: string | undefined,\n filename: string | undefined,\n): void {\n if (\n !t.isObjectProperty(execute) ||\n !t.isCallExpression(execute.value) ||\n execute.value.arguments.length !== 1 ||\n !t.isObjectExpression(execute.value.arguments[0])\n ) {\n throw new GenerativeCompileError(\n \"`providerTool(...)` must receive an inline object literal\",\n filename,\n );\n }\n\n const existingNames = new Set(\n object.properties.flatMap((prop) => {\n if (!t.isObjectProperty(prop) && !t.isObjectMethod(prop)) return [];\n const name = memberName(prop.key, prop.computed);\n return name ? [name] : [];\n }),\n );\n const configNames = new Set<string>();\n\n for (const prop of execute.value.arguments[0].properties) {\n if (!t.isObjectProperty(prop)) {\n throw new GenerativeCompileError(\n \"`providerTool(...)` config can only contain object properties\",\n filename,\n );\n }\n const name = memberName(prop.key, prop.computed);\n if (!name) {\n throw new GenerativeCompileError(\n \"`providerTool(...)` config can only contain static property names\",\n filename,\n );\n }\n if (\n t.isFunctionExpression(prop.value) ||\n t.isArrowFunctionExpression(prop.value)\n ) {\n throw new GenerativeCompileError(\n \"`providerTool(...)` config cannot contain function-valued properties\",\n filename,\n );\n }\n if (existingNames.has(name) || configNames.has(name)) {\n const toolLabel = toolName ? ` for \"${toolName}\"` : \"\";\n throw new GenerativeCompileError(\n `\\`providerTool(...)\\` config${toolLabel} duplicates \"${name}\"`,\n filename,\n );\n }\n configNames.add(name);\n object.properties.push(prop);\n }\n}\n\ntype Entry = t.ObjectExpression[\"properties\"][number];\n\n/** The raw AST value of an entry (any expression), or null for spreads/methods. */\nfunction entryRawValue(entry: Entry): t.Expression | null {\n if (t.isObjectProperty(entry) && t.isExpression(entry.value)) {\n return entry.value;\n }\n return null;\n}\n\nfunction entryValue(entry: Entry): t.ObjectExpression | null {\n if (t.isObjectProperty(entry) && t.isObjectExpression(entry.value)) {\n return entry.value;\n }\n return null;\n}\n\n/** A member of an entry object: `render`/`execute`/`type`, as property or method. */\nfunction findMember(\n object: t.ObjectExpression,\n name: string,\n): t.ObjectProperty | t.ObjectMethod | undefined {\n return object.properties.find(\n (p): p is t.ObjectProperty | t.ObjectMethod =>\n (t.isObjectProperty(p) || t.isObjectMethod(p)) &&\n memberName(p.key, p.computed) === name,\n );\n}\n\nfunction removeMember(object: t.ObjectExpression, name: string): void {\n object.properties = object.properties.filter(\n (p) =>\n !(\n (t.isObjectProperty(p) || t.isObjectMethod(p)) &&\n memberName(p.key, p.computed) === name\n ),\n );\n}\n\n/** The `BlockStatement` body of an `execute` member, if it has one. */\nfunction executeBody(\n member: t.ObjectProperty | t.ObjectMethod,\n): t.BlockStatement | undefined {\n if (t.isObjectMethod(member)) return member.body;\n const value = member.value;\n if (\n (t.isArrowFunctionExpression(value) || t.isFunctionExpression(value)) &&\n t.isBlockStatement(value.body)\n ) {\n return value.body;\n }\n return undefined;\n}\n\n/** Whether an `execute` opts into the client via a leading `\"use client\"`. */\nfunction executeIsClient(member: t.ObjectProperty | t.ObjectMethod): boolean {\n return !!executeBody(member)?.directives.some(\n (d) => d.value.value === \"use client\",\n );\n}\n\nfunction executeIsSentinel(\n member: t.ObjectProperty | t.ObjectMethod,\n name: string,\n): boolean {\n return (\n t.isObjectProperty(member) &&\n t.isCallExpression(member.value) &&\n t.isIdentifier(member.value.callee, { name })\n );\n}\n\n/** Whether an `execute` is the human-in-the-loop sentinel. */\nfunction executeIsHumanTool(\n member: t.ObjectProperty | t.ObjectMethod,\n): boolean {\n return (\n executeIsSentinel(member, \"humanTool\") ||\n executeIsSentinel(member, \"hitlTool\") ||\n executeIsSentinel(member, \"hitl\")\n );\n}\n\n/** Whether an `execute` is the provider-tool sentinel. */\nfunction executeIsProviderTool(\n member: t.ObjectProperty | t.ObjectMethod,\n): boolean {\n return executeIsSentinel(member, \"providerTool\");\n}\n\n/** Whether an `execute` is the local override sentinel. */\nfunction executeIsStubTool(member: t.ObjectProperty | t.ObjectMethod): boolean {\n return executeIsSentinel(member, \"stubTool\");\n}\n\n/** Whether an `execute` is the externally-defined backend tool sentinel. */\nfunction executeIsExternalTool(\n member: t.ObjectProperty | t.ObjectMethod,\n): boolean {\n return executeIsSentinel(member, \"externalTool\");\n}\n\n/** Drops the `\"use client\"` directive from an `execute` body (kept frontend). */\nfunction stripUseClient(member: t.ObjectProperty | t.ObjectMethod): void {\n const body = executeBody(member);\n if (body) {\n body.directives = body.directives.filter(\n (d) => d.value.value !== \"use client\",\n );\n }\n}\n\n/**\n * The tool's nature, inferred from its (mandatory) `execute` rather than an\n * authored `type`: `humanTool()` → `human`; `providerTool(...)` → `provider`;\n * `stubTool()` → `frontend`; `externalTool()` → `backend`; `\"use client\"` →\n * `frontend`; otherwise `backend`.\n * The loader writes the result back as a `type` field (see {@link setToolType})\n * so the runtime keeps it.\n */\nfunction inferToolType(\n object: t.ObjectExpression,\n toolName: string | undefined,\n filename: string | undefined,\n): ToolType {\n const execute = findMember(object, \"execute\");\n if (!execute) {\n throw new GenerativeCompileError(\n `${toolSubject(toolName)} must declare an \\`execute\\`; use ` +\n \"`humanTool()` for a human-in-the-loop tool\",\n filename,\n );\n }\n if (executeIsHumanTool(execute)) return \"human\";\n if (executeIsProviderTool(execute)) return \"provider\";\n if (executeIsStubTool(execute)) return \"frontend\";\n if (executeIsExternalTool(execute)) return \"backend\";\n return executeIsClient(execute) ? \"frontend\" : \"backend\";\n}\n\nfunction toolSubject(toolName: string | undefined): string {\n return toolName ? `tool \"${toolName}\"` : \"every tool\";\n}\n\nfunction typedToolSubject(type: string, toolName: string | undefined): string {\n if (toolName) return `${type} tool \"${toolName}\"`;\n const article = /^[aeiou]/i.test(type) ? \"an\" : \"a\";\n return `${article} ${type} tool`;\n}\n\nfunction stripExternalToolMetadata(object: t.ObjectExpression): void {\n // Mirror BackendTool's forbidden metadata fields: execute is stripped by the\n // main routing loop, while streamCall is also removed because there is no\n // assistant-ui executor to stream from.\n removeMember(object, \"description\");\n removeMember(object, \"parameters\");\n removeMember(object, \"disabled\");\n removeMember(object, \"toModelOutput\");\n removeMember(object, \"experimental_onSchemaValidationError\");\n removeMember(object, \"providerOptions\");\n removeMember(object, \"streamCall\");\n}\n\n/** Writes the resolved `type` back onto the tool object (replacing any author's). */\nfunction setToolType(object: t.ObjectExpression, type: ToolType): void {\n removeMember(object, \"type\");\n // Append (not prepend) so the inferred type wins over any earlier spread.\n object.properties.push(\n t.objectProperty(t.identifier(\"type\"), t.stringLiteral(type)),\n );\n}\n\nfunction setBackendDefault(\n object: t.ObjectExpression,\n target: Target,\n type: ToolType,\n): void {\n // Always strip any hand-authored marker first; only re-add it for client\n // frontend/human tools whose schema is already known by the backend.\n removeMember(object, \"unstable_backendDefault\");\n if (target !== \"client\" || (type !== \"frontend\" && type !== \"human\")) return;\n\n object.properties.push(\n t.objectProperty(\n t.identifier(\"unstable_backendDefault\"),\n t.objectExpression([\n t.objectProperty(t.identifier(\"parameters\"), t.booleanLiteral(true)),\n ]),\n ),\n );\n}\n\nfunction memberName(\n key: t.Node,\n computed: boolean | undefined,\n): string | undefined {\n if (computed) return undefined;\n if (t.isIdentifier(key)) return key.name;\n if (t.isStringLiteral(key)) return key.value;\n return undefined;\n}\n\n/**\n * Removes declarations and import specifiers left unreferenced after region\n * removal, to a fixpoint (a dropped helper frees what it used). Keeps exports,\n * side-effect imports, and possibly-side-effectful initializers.\n */\nfunction pruneUnused(ast: t.File): void {\n const hadSpecifiers = new WeakSet<t.ImportDeclaration>();\n for (const stmt of ast.program.body) {\n if (t.isImportDeclaration(stmt) && stmt.specifiers.length > 0) {\n hadSpecifiers.add(stmt);\n }\n }\n\n let removedSomething = true;\n while (removedSomething) {\n removedSomething = false;\n traverse(ast, {\n Program(path: NodePath<t.Program>) {\n path.scope.crawl();\n const isUnused = (name: string): boolean => {\n const binding = path.scope.getBinding(name);\n return !!binding && !binding.referenced;\n };\n\n path.node.body = path.node.body.filter((stmt) => {\n if (\n (t.isFunctionDeclaration(stmt) || t.isClassDeclaration(stmt)) &&\n stmt.id &&\n isUnused(stmt.id.name)\n ) {\n removedSomething = true;\n return false;\n }\n if (t.isVariableDeclaration(stmt)) {\n stmt.declarations = stmt.declarations.filter((decl) => {\n // Handles destructuring too: drop the declarator only when *every*\n // bound name is unused (else a `const { a } = server` survives and\n // keeps a server import in the client graph). Restricted to plain\n // patterns so a default/computed-key side effect isn't dropped.\n const names = Object.keys(t.getBindingIdentifiers(decl.id));\n if (\n names.length > 0 &&\n isPlainPattern(decl.id) &&\n isRemovableInit(decl.init) &&\n names.every(isUnused)\n ) {\n removedSomething = true;\n return false;\n }\n return true;\n });\n if (stmt.declarations.length === 0) return false;\n }\n return true;\n });\n path.stop();\n },\n });\n }\n\n traverse(ast, {\n Program(path: NodePath<t.Program>) {\n path.scope.crawl();\n for (const stmt of path.node.body) {\n if (!t.isImportDeclaration(stmt)) continue;\n stmt.specifiers = stmt.specifiers.filter((spec) => {\n const binding = path.scope.getBinding(spec.local.name);\n return binding ? binding.referenced : true;\n });\n }\n path.node.body = path.node.body.filter(\n (stmt) =>\n !(\n t.isImportDeclaration(stmt) &&\n stmt.specifiers.length === 0 &&\n hadSpecifiers.has(stmt)\n ),\n );\n path.stop();\n },\n });\n}\n\n/**\n * Whether a binding pattern is side-effect-free to drop: a plain identifier, or\n * an object/array pattern of plain bindings — no default values\n * (`{ a = expr }`) or computed keys (`{ [expr]: a }`), which would evaluate (and\n * thus could have side effects) at destructuring time.\n */\nfunction isPlainPattern(node: t.Node): boolean {\n if (t.isIdentifier(node)) return true;\n if (t.isObjectPattern(node)) {\n return node.properties.every((p) =>\n t.isRestElement(p)\n ? isPlainPattern(p.argument)\n : !p.computed && isPlainPattern(p.value),\n );\n }\n if (t.isArrayPattern(node)) {\n return node.elements.every((el) => el == null || isPlainPattern(el));\n }\n return false; // AssignmentPattern (default), member expr, etc.\n}\n\n/** Whether a variable initializer is safe to drop (no observable side effects). */\nfunction isRemovableInit(node: t.Expression | null | undefined): boolean {\n if (node == null) return true;\n if (t.isTSAsExpression(node) || t.isTSSatisfiesExpression(node)) {\n return isRemovableInit(node.expression);\n }\n // Containers are removable only if every element is — a nested call (e.g.\n // `[track()]`) has an observable side effect that dropping would lose.\n if (t.isArrayExpression(node)) {\n return node.elements.every(\n (el) => el == null || (t.isExpression(el) && isRemovableInit(el)),\n );\n }\n if (t.isObjectExpression(node)) {\n return node.properties.every(\n (p) =>\n t.isObjectProperty(p) &&\n !p.computed &&\n t.isExpression(p.value) &&\n isRemovableInit(p.value),\n );\n }\n if (t.isTemplateLiteral(node)) {\n return node.expressions.every(\n (e) => t.isExpression(e) && isRemovableInit(e),\n );\n }\n return (\n t.isArrowFunctionExpression(node) ||\n t.isFunctionExpression(node) ||\n t.isClassExpression(node) ||\n t.isIdentifier(node) ||\n // non-computed only — `obj[fn()]` could hide a side-effectful key\n (t.isMemberExpression(node) && !node.computed) ||\n t.isJSXElement(node) ||\n t.isJSXFragment(node) ||\n t.isLiteral(node)\n );\n}\n"],"mappings":"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"}
package/dist/package.js CHANGED
@@ -1,5 +1,5 @@
1
1
  //#region package.json
2
- var version = "0.0.9";
2
+ var version = "0.0.11";
3
3
  //#endregion
4
4
  export { version };
5
5
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@assistant-ui/x-generative-compiler",
3
3
  "private": false,
4
- "version": "0.0.9",
4
+ "version": "0.0.11",
5
5
  "description": "Internal: the framework-agnostic \"use generative\" compiler that splits a colocated tool (schema + server-only execute + client-only render) into per-target builds. Shared by @assistant-ui/next and @assistant-ui/vite.",
6
6
  "keywords": [
7
7
  "assistant-ui",
@@ -41,7 +41,7 @@
41
41
  "@types/node": "^26.1.1",
42
42
  "@types/semver": "^7.7.1",
43
43
  "vitest": "^4.1.10",
44
- "@assistant-ui/x-buildutils": "0.0.18"
44
+ "@assistant-ui/x-buildutils": "0.0.20"
45
45
  },
46
46
  "publishConfig": {
47
47
  "access": "public",
@@ -808,7 +808,7 @@ export default defineToolkit({
808
808
  );
809
809
  expect(warn).toHaveBeenCalledWith(
810
810
  expect.stringContaining(
811
- 'Duplicate tool name "search" while composing toolkits. ' +
811
+ 'Duplicate tool name "search": ...calendarTools overrides ...weatherTools. ' +
812
812
  "JavaScript object spread keeps the last definition.",
813
813
  ),
814
814
  );
@@ -855,7 +855,7 @@ export default defineToolkit({
855
855
 
856
856
  expect(warn).toHaveBeenCalledWith(
857
857
  expect.stringContaining(
858
- 'Duplicate tool name "search" while composing toolkits. ' +
858
+ 'Duplicate tool name "search": ...calendarTools overrides ...weatherTools. ' +
859
859
  "JavaScript object spread keeps the last definition.",
860
860
  ),
861
861
  );
@@ -897,7 +897,7 @@ export default defineToolkit({
897
897
  expect(client).toContain("...emailTools");
898
898
  expect(warn).toHaveBeenCalledWith(
899
899
  expect.stringContaining(
900
- '[assistant-ui/use-generative] Duplicate tool name "search" while composing toolkits. ' +
900
+ '[assistant-ui/use-generative] Duplicate tool name "search": ...calendarTools overrides ...weatherTools. ' +
901
901
  "JavaScript object spread keeps the last definition.",
902
902
  ),
903
903
  );
@@ -928,7 +928,7 @@ export default defineToolkit({
928
928
  expect(warn).toHaveBeenCalledTimes(1);
929
929
  expect(warn).toHaveBeenCalledWith(
930
930
  expect.stringContaining(
931
- 'Duplicate tool name "search" while composing toolkits. ' +
931
+ 'Duplicate tool name "search": ...calendarTools overrides ...weatherTools. ' +
932
932
  "JavaScript object spread keeps the last definition.",
933
933
  ),
934
934
  );
@@ -961,7 +961,7 @@ export default defineToolkit({
961
961
 
962
962
  expect(warn).toHaveBeenCalledWith(
963
963
  expect.stringContaining(
964
- 'Duplicate tool name "search" while composing toolkits. ' +
964
+ 'Duplicate tool name "search": ...calendarTools overrides ...weatherTools. ' +
965
965
  "JavaScript object spread keeps the last definition.",
966
966
  ),
967
967
  );
@@ -988,7 +988,186 @@ export default defineToolkit({
988
988
  expect(warn).toHaveBeenCalledTimes(1);
989
989
  expect(warn).toHaveBeenCalledWith(
990
990
  expect.stringContaining(
991
- 'Duplicate tool name "search" while composing toolkits. ' +
991
+ 'Duplicate tool name "search": inline property (line 5) overrides inline property (line 4). ' +
992
+ "JavaScript object spread keeps the last definition.",
993
+ ),
994
+ );
995
+ } finally {
996
+ warn.mockRestore();
997
+ }
998
+ });
999
+
1000
+ it("names both sources when an inline tool overrides a spread", () => {
1001
+ const src = `"use generative";
1002
+ import { defineToolkit } from "@assistant-ui/react";
1003
+ const weatherTools = defineToolkit({
1004
+ search: { execute: async () => 1, render: () => null },
1005
+ });
1006
+ export default defineToolkit({
1007
+ ...weatherTools,
1008
+ search: { execute: async () => 2, render: () => null },
1009
+ });`;
1010
+ const warn = vi.spyOn(console, "warn").mockImplementation(() => {});
1011
+
1012
+ try {
1013
+ const client = compileGenerative(src, { target: "client" }).code;
1014
+
1015
+ expect(client).toContain("...weatherTools");
1016
+ expect(warn).toHaveBeenCalledTimes(1);
1017
+ expect(warn).toHaveBeenCalledWith(
1018
+ expect.stringContaining(
1019
+ 'Duplicate tool name "search": inline property (line 8) overrides ...weatherTools. ' +
1020
+ "JavaScript object spread keeps the last definition.",
1021
+ ),
1022
+ );
1023
+ } finally {
1024
+ warn.mockRestore();
1025
+ }
1026
+ });
1027
+
1028
+ it("warns about known collisions even when an opaque toolkit spread sits between them", () => {
1029
+ const filename = createMultiMergeFixture({
1030
+ "tools/weather.tsx": `"use generative";
1031
+ import { defineToolkit } from "@assistant-ui/react";
1032
+ export default defineToolkit({
1033
+ search: { execute: async () => 1, render: () => null },
1034
+ });`,
1035
+ "tools/mystery.tsx": `"use generative";
1036
+ import { defineToolkit } from "@assistant-ui/react";
1037
+ const tools = { lookup: { execute: async () => 1, render: () => null } };
1038
+ export default defineToolkit(tools);`,
1039
+ "tools/calendar.tsx": `"use generative";
1040
+ import { defineToolkit } from "@assistant-ui/react";
1041
+ export default defineToolkit({
1042
+ search: { execute: async () => 1, render: () => null },
1043
+ });`,
1044
+ });
1045
+ const src = `"use generative";
1046
+ import { defineToolkit } from "@assistant-ui/react";
1047
+ import weatherTools from "./tools/weather";
1048
+ import mysteryTools from "./tools/mystery";
1049
+ import calendarTools from "./tools/calendar";
1050
+ export default defineToolkit({
1051
+ ...weatherTools,
1052
+ ...mysteryTools,
1053
+ ...calendarTools,
1054
+ });`;
1055
+ const warn = vi.spyOn(console, "warn").mockImplementation(() => {});
1056
+
1057
+ try {
1058
+ compileGenerative(src, { target: "client", filename });
1059
+
1060
+ expect(warn).toHaveBeenCalledTimes(1);
1061
+ expect(warn).toHaveBeenCalledWith(
1062
+ expect.stringContaining(
1063
+ 'Duplicate tool name "search": ...calendarTools overrides ...weatherTools. ' +
1064
+ "JavaScript object spread keeps the last definition.",
1065
+ ),
1066
+ );
1067
+ } finally {
1068
+ warn.mockRestore();
1069
+ }
1070
+ });
1071
+
1072
+ it("keeps the pairwise message when an opaque toolkit spread follows the colliders", () => {
1073
+ const filename = createMultiMergeFixture({
1074
+ "tools/weather.tsx": `"use generative";
1075
+ import { defineToolkit } from "@assistant-ui/react";
1076
+ export default defineToolkit({
1077
+ search: { execute: async () => 1, render: () => null },
1078
+ });`,
1079
+ "tools/calendar.tsx": `"use generative";
1080
+ import { defineToolkit } from "@assistant-ui/react";
1081
+ export default defineToolkit({
1082
+ search: { execute: async () => 1, render: () => null },
1083
+ });`,
1084
+ "tools/mystery.tsx": `"use generative";
1085
+ import { defineToolkit } from "@assistant-ui/react";
1086
+ const tools = { lookup: { execute: async () => 1, render: () => null } };
1087
+ export default defineToolkit(tools);`,
1088
+ });
1089
+ const src = `"use generative";
1090
+ import { defineToolkit } from "@assistant-ui/react";
1091
+ import weatherTools from "./tools/weather";
1092
+ import calendarTools from "./tools/calendar";
1093
+ import mysteryTools from "./tools/mystery";
1094
+ export default defineToolkit({
1095
+ ...weatherTools,
1096
+ ...calendarTools,
1097
+ ...mysteryTools,
1098
+ });`;
1099
+ const warn = vi.spyOn(console, "warn").mockImplementation(() => {});
1100
+
1101
+ try {
1102
+ compileGenerative(src, { target: "client", filename });
1103
+
1104
+ expect(warn).toHaveBeenCalledTimes(1);
1105
+ expect(warn).toHaveBeenCalledWith(
1106
+ expect.stringContaining(
1107
+ 'Duplicate tool name "search": ...calendarTools overrides ...weatherTools. ' +
1108
+ "JavaScript object spread keeps the last definition.",
1109
+ ),
1110
+ );
1111
+ } finally {
1112
+ warn.mockRestore();
1113
+ }
1114
+ });
1115
+
1116
+ it("names the final winner and every overridden source when three toolkits collide", () => {
1117
+ const src = `"use generative";
1118
+ import { defineToolkit } from "@assistant-ui/react";
1119
+ const weatherTools = defineToolkit({
1120
+ search: { execute: async () => 1, render: () => null },
1121
+ });
1122
+ const databaseTools = defineToolkit({
1123
+ search: { execute: async () => 1, render: () => null },
1124
+ });
1125
+ const calendarTools = defineToolkit({
1126
+ search: { execute: async () => 1, render: () => null },
1127
+ });
1128
+ export default defineToolkit({
1129
+ ...weatherTools,
1130
+ ...databaseTools,
1131
+ ...calendarTools,
1132
+ });`;
1133
+ const warn = vi.spyOn(console, "warn").mockImplementation(() => {});
1134
+
1135
+ try {
1136
+ compileGenerative(src, { target: "client" });
1137
+
1138
+ expect(warn).toHaveBeenCalledTimes(1);
1139
+ expect(warn).toHaveBeenCalledWith(
1140
+ expect.stringContaining(
1141
+ 'Duplicate tool name "search": ...calendarTools overrides ...weatherTools, ...databaseTools. ' +
1142
+ "JavaScript object spread keeps the last definition.",
1143
+ ),
1144
+ );
1145
+ } finally {
1146
+ warn.mockRestore();
1147
+ }
1148
+ });
1149
+
1150
+ it("labels a direct defineMcpToolkit spread as the winning source", () => {
1151
+ const src = `"use generative";
1152
+ import { defineMcpToolkit, defineToolkit } from "@assistant-ui/react";
1153
+ const weatherTools = defineToolkit({
1154
+ search: { execute: async () => 1, render: () => null },
1155
+ });
1156
+ export default defineToolkit({
1157
+ ...weatherTools,
1158
+ ...defineMcpToolkit({
1159
+ search: { execute: async () => 1, render: () => null },
1160
+ }),
1161
+ });`;
1162
+ const warn = vi.spyOn(console, "warn").mockImplementation(() => {});
1163
+
1164
+ try {
1165
+ compileGenerative(src, { target: "client" });
1166
+
1167
+ expect(warn).toHaveBeenCalledTimes(1);
1168
+ expect(warn).toHaveBeenCalledWith(
1169
+ expect.stringContaining(
1170
+ 'Duplicate tool name "search": ...defineMcpToolkit(...) overrides ...weatherTools. ' +
992
1171
  "JavaScript object spread keeps the last definition.",
993
1172
  ),
994
1173
  );
@@ -1027,6 +1206,85 @@ export default defineToolkit({
1027
1206
  ).toThrow(/compiler-visible toolkit spread/);
1028
1207
  });
1029
1208
 
1209
+ it("rejects spreading the default of a namespace import with a specific callout", () => {
1210
+ const filename = createMergeFixture(generativeChild);
1211
+ const src = `"use generative";
1212
+ import { defineToolkit } from "@assistant-ui/react";
1213
+ import * as kit from "./tools/weather";
1214
+ export default defineToolkit({
1215
+ ...kit.default,
1216
+ });`;
1217
+
1218
+ let message = "";
1219
+ try {
1220
+ compileGenerative(src, { target: "client", filename });
1221
+ } catch (error) {
1222
+ message = (error as Error).message;
1223
+ }
1224
+ expect(message).toMatch(/namespace import/);
1225
+ expect(message).toMatch(/import kit from/);
1226
+ expect(message).not.toMatch(/compiler-visible toolkit spread/);
1227
+ });
1228
+
1229
+ it("rejects spreading a whole namespace import with a specific callout", () => {
1230
+ const filename = createMergeFixture(generativeChild);
1231
+ const src = `"use generative";
1232
+ import { defineToolkit } from "@assistant-ui/react";
1233
+ import * as kit from "./tools/weather";
1234
+ export default defineToolkit({
1235
+ ...kit,
1236
+ });`;
1237
+
1238
+ let message = "";
1239
+ try {
1240
+ compileGenerative(src, { target: "client", filename });
1241
+ } catch (error) {
1242
+ message = (error as Error).message;
1243
+ }
1244
+ expect(message).toMatch(/namespace import/);
1245
+ expect(message).not.toMatch(/compiler-visible toolkit spread/);
1246
+ });
1247
+
1248
+ it("rejects spreading a named member of a namespace import with a specific callout", () => {
1249
+ const filename = createMergeFixture(generativeChild);
1250
+ const src = `"use generative";
1251
+ import { defineToolkit } from "@assistant-ui/react";
1252
+ import * as kit from "./tools/weather";
1253
+ export default defineToolkit({
1254
+ ...kit.get_weather,
1255
+ });`;
1256
+
1257
+ let message = "";
1258
+ try {
1259
+ compileGenerative(src, { target: "client", filename });
1260
+ } catch (error) {
1261
+ message = (error as Error).message;
1262
+ }
1263
+ expect(message).toMatch(/namespace import/);
1264
+ expect(message).not.toMatch(/compiler-visible toolkit spread/);
1265
+ });
1266
+
1267
+ it("still rejects a namespace-import spread of a non-generative module with the generic message", () => {
1268
+ const filename = createMergeFixture(
1269
+ `export default { get_weather: { execute: async () => 1 } };\n`,
1270
+ );
1271
+ const src = `"use generative";
1272
+ import { defineToolkit } from "@assistant-ui/react";
1273
+ import * as kit from "./tools/weather";
1274
+ export default defineToolkit({
1275
+ ...kit.default,
1276
+ });`;
1277
+
1278
+ let message = "";
1279
+ try {
1280
+ compileGenerative(src, { target: "client", filename });
1281
+ } catch (error) {
1282
+ message = (error as Error).message;
1283
+ }
1284
+ expect(message).toMatch(/compiler-visible toolkit spread/);
1285
+ expect(message).not.toMatch(/namespace import/);
1286
+ });
1287
+
1030
1288
  it("resolves a tsconfig path alias when spreading a generative module", () => {
1031
1289
  const filename = createAliasMergeFixture(generativeChild);
1032
1290
  const src = `"use generative";
package/src/compile.ts CHANGED
@@ -273,11 +273,8 @@ export function compileGenerative(
273
273
  ensureDefaultExport(ast, filename);
274
274
  const generativeInstances = collectGenerativeInstances(ast);
275
275
  const interactableToolImports = collectInteractableToolImports(ast);
276
- const toolkitSpreadNames = collectToolkitSpreadNames(
277
- ast,
278
- filename,
279
- createToolkitNameContext(),
280
- );
276
+ const { spreadNames: toolkitSpreadNames, namespaceImports } =
277
+ collectToolkitSpreadNames(ast, filename, createToolkitNameContext());
281
278
 
282
279
  const flags: TargetFlags = { keptRender: false, keptBackendExecute: false };
283
280
 
@@ -316,6 +313,7 @@ export function compileGenerative(
316
313
  generativeInstances,
317
314
  interactableToolImports,
318
315
  toolkitSpreadNames,
316
+ namespaceImports,
319
317
  flags,
320
318
  filename,
321
319
  );
@@ -674,6 +672,19 @@ interface ToolkitNameContext {
674
672
  resolvingImportedToolkitNames: Set<string>;
675
673
  }
676
674
 
675
+ /**
676
+ * The toolkit spreads a single module's pass can recognize: safe-to-spread
677
+ * bindings plus the namespace imports that point at a generative module. The
678
+ * namespace set is kept separate from {@link ToolkitSpreadNames} so a
679
+ * whole-namespace `...kit` is not mistaken for a safe identifier spread — only
680
+ * the default export crosses the build-split boundary, so a namespace spread is
681
+ * rejected with a specific callout rather than allowed.
682
+ */
683
+ interface ToolkitSpreadInfo {
684
+ spreadNames: ToolkitSpreadNames;
685
+ namespaceImports: Set<string>;
686
+ }
687
+
677
688
  /**
678
689
  * Collects the local names `unstable_interactableTool` is imported under from a
679
690
  * distribution package, so toolkit entries calling it can be recognized
@@ -734,13 +745,19 @@ function interactableToolConfig(
734
745
  * toolkit can't leak a backend `execute` to the client. Only the default
735
746
  * export crosses the generative-module boundary, so named imports don't
736
747
  * qualify — they would be `undefined` once that module is build-split.
748
+ *
749
+ * A namespace import (`import * as kit from "..."`) of a generative module is
750
+ * tracked separately in `namespaceImports` so a `...kit` / `...kit.default`
751
+ * spread can be rejected with a specific callout: only the default export
752
+ * crosses the boundary, so a namespace spread is never safe.
737
753
  */
738
754
  function collectToolkitSpreadNames(
739
755
  ast: t.File,
740
756
  filename: string | undefined,
741
757
  context: ToolkitNameContext,
742
- ): ToolkitSpreadNames {
758
+ ): ToolkitSpreadInfo {
743
759
  const spreadNames: ToolkitSpreadNames = new Map();
760
+ const namespaceImports = new Set<string>();
744
761
  const localToolkitCalls = new Map<string, t.CallExpression>();
745
762
 
746
763
  for (const statement of ast.program.body) {
@@ -761,16 +778,22 @@ function collectToolkitSpreadNames(
761
778
  (specifier): specifier is t.ImportDefaultSpecifier =>
762
779
  t.isImportDefaultSpecifier(specifier),
763
780
  );
764
- if (!defaultSpecifier) continue;
781
+ const namespaceSpecifier = statement.specifiers.find(
782
+ (specifier): specifier is t.ImportNamespaceSpecifier =>
783
+ t.isImportNamespaceSpecifier(specifier),
784
+ );
785
+ if (!defaultSpecifier && !namespaceSpecifier) continue;
765
786
 
766
787
  const names = getGenerativeImportToolkitNames(
767
788
  statement.source.value,
768
789
  filename,
769
790
  context,
770
791
  );
771
- if (names !== undefined) {
772
- spreadNames.set(defaultSpecifier.local.name, names);
773
- }
792
+ if (names === undefined) continue;
793
+
794
+ if (defaultSpecifier) spreadNames.set(defaultSpecifier.local.name, names);
795
+ if (namespaceSpecifier)
796
+ namespaceImports.add(namespaceSpecifier.local.name);
774
797
  }
775
798
  }
776
799
 
@@ -796,7 +819,7 @@ function collectToolkitSpreadNames(
796
819
  resolveLocal(name);
797
820
  }
798
821
 
799
- return spreadNames;
822
+ return { spreadNames, namespaceImports };
800
823
  }
801
824
 
802
825
  const MODULE_EXTENSIONS = [
@@ -882,7 +905,7 @@ function getDefaultExportToolkitNames(
882
905
  return null;
883
906
  }
884
907
 
885
- const spreadNames = collectToolkitSpreadNames(ast, filename, context);
908
+ const { spreadNames } = collectToolkitSpreadNames(ast, filename, context);
886
909
  return uniqueToolkitNames(
887
910
  collectToolkitObjectNames(toolkitCall.arguments[0], spreadNames),
888
911
  );
@@ -1160,31 +1183,54 @@ function toolkitEntryNames(
1160
1183
  return [];
1161
1184
  }
1162
1185
 
1186
+ function toolkitEntrySourceLabel(entry: Entry): string {
1187
+ if (t.isSpreadElement(entry)) {
1188
+ if (t.isIdentifier(entry.argument)) return `...${entry.argument.name}`;
1189
+ if (unwrapToCall(entry.argument, MCP_TOOLKIT_WRAPPER)) {
1190
+ return `...${MCP_TOOLKIT_WRAPPER}(...)`;
1191
+ }
1192
+ return "...";
1193
+ }
1194
+
1195
+ if (t.isObjectProperty(entry) || t.isObjectMethod(entry)) {
1196
+ const line = entry.loc?.start.line;
1197
+ return line === undefined
1198
+ ? "inline property"
1199
+ : `inline property (line ${line})`;
1200
+ }
1201
+
1202
+ return "inline property";
1203
+ }
1204
+
1163
1205
  function warnDuplicateToolkitNames(
1164
1206
  object: t.ObjectExpression,
1165
1207
  toolkitSpreadNames: ToolkitSpreadNames,
1166
1208
  filename: string | undefined,
1167
1209
  ): void {
1168
- const names = collectToolkitObjectNames(object, toolkitSpreadNames);
1169
- if (!names) return;
1170
-
1171
- const seen = new Set<string>();
1172
- const warned = new Set<string>();
1173
- for (const name of names) {
1174
- if (seen.has(name)) {
1175
- if (!warned.has(name)) {
1176
- console.warn(
1177
- new GenerativeCompileError(
1178
- `Duplicate tool name "${name}" while composing toolkits. ` +
1179
- "JavaScript object spread keeps the last definition.",
1180
- filename,
1181
- ).message,
1182
- );
1183
- warned.add(name);
1184
- }
1185
- continue;
1210
+ const sourcesByToolName = new Map<string, string[]>();
1211
+ for (const entry of object.properties) {
1212
+ const entryNames = toolkitEntryNames(entry, toolkitSpreadNames);
1213
+ if (!entryNames) continue;
1214
+ const source = toolkitEntrySourceLabel(entry);
1215
+ for (const name of entryNames) {
1216
+ const sources = sourcesByToolName.get(name);
1217
+ if (sources) sources.push(source);
1218
+ else sourcesByToolName.set(name, [source]);
1186
1219
  }
1187
- seen.add(name);
1220
+ }
1221
+
1222
+ for (const [name, sources] of sourcesByToolName) {
1223
+ const winner = sources.at(-1);
1224
+ const overridden = sources.slice(0, -1);
1225
+ if (winner === undefined || overridden.length === 0) continue;
1226
+ console.warn(
1227
+ new GenerativeCompileError(
1228
+ `Duplicate tool name "${name}": ${winner} overrides ` +
1229
+ `${overridden.join(", ")}. ` +
1230
+ "JavaScript object spread keeps the last definition.",
1231
+ filename,
1232
+ ).message,
1233
+ );
1188
1234
  }
1189
1235
  }
1190
1236
 
@@ -1226,6 +1272,28 @@ function describeUnsafeToolkitEntry(entry: Entry): string {
1226
1272
  );
1227
1273
  }
1228
1274
 
1275
+ function namespaceToolkitSpreadMessage(): string {
1276
+ return (
1277
+ 'a namespace import (`import * as kit from "..."`) can\'t be spread into ' +
1278
+ `${TOOLKIT_WRAPPER}({ ... }); only a generative module's default export ` +
1279
+ "crosses the build-split boundary, so import it as a default " +
1280
+ '(`import kit from "..."`) and spread `...kit` instead'
1281
+ );
1282
+ }
1283
+
1284
+ /** The `kit` in `...kit` or `...kit.default`, or null for a computed/opaque base. */
1285
+ function namespaceSpreadBaseName(argument: t.Expression): string | null {
1286
+ if (t.isIdentifier(argument)) return argument.name;
1287
+ if (
1288
+ t.isMemberExpression(argument) &&
1289
+ !argument.computed &&
1290
+ t.isIdentifier(argument.object)
1291
+ ) {
1292
+ return argument.object.name;
1293
+ }
1294
+ return null;
1295
+ }
1296
+
1229
1297
  /** The `JSONGenerativeUI` methods that produce a split-by-condition tool. */
1230
1298
  const GENERATIVE_TOOL_METHODS = new Set(["present", "promptUser"]);
1231
1299
 
@@ -1288,6 +1356,7 @@ function compileToolkit(
1288
1356
  instances: Set<string>,
1289
1357
  interactableToolImports: Set<string>,
1290
1358
  toolkitSpreadNames: ToolkitSpreadNames,
1359
+ namespaceImports: Set<string>,
1291
1360
  flags: TargetFlags,
1292
1361
  filename: string | undefined,
1293
1362
  ): void {
@@ -1326,6 +1395,15 @@ function compileToolkit(
1326
1395
  nextProperties.push(entry);
1327
1396
  continue;
1328
1397
  }
1398
+ if (t.isSpreadElement(entry)) {
1399
+ const namespaceBase = namespaceSpreadBaseName(entry.argument);
1400
+ if (namespaceBase && namespaceImports.has(namespaceBase)) {
1401
+ throw new GenerativeCompileError(
1402
+ namespaceToolkitSpreadMessage(),
1403
+ filename,
1404
+ );
1405
+ }
1406
+ }
1329
1407
  throw new GenerativeCompileError(
1330
1408
  describeUnsafeToolkitEntry(entry),
1331
1409
  filename,