@happyvertical/smrt-workbench 0.57.31 → 0.57.33

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.
@@ -4,7 +4,7 @@ import { createRequire } from "node:module";
4
4
  import { dirname, extname, isAbsolute, join, relative, resolve } from "node:path";
5
5
  import { pathToFileURL } from "node:url";
6
6
  import { createClassNamePredicate, resolveApiMethodExposure, resolveCustomActionMetadata, resolveEffectiveActionMetadata } from "@happyvertical/smrt-core/generators/custom-action";
7
- import fg from "fast-glob";
7
+ import { glob, globSync } from "tinyglobby";
8
8
  //#region src/discovery.ts
9
9
  var require = createRequire(import.meta.url);
10
10
  var TS_SOURCE_EXTENSIONS = /* @__PURE__ */ new Set([
@@ -715,28 +715,31 @@ function readApiSummary(packageDir, rootDir, packageName, knowledge, routeFiles)
715
715
  };
716
716
  }
717
717
  async function collectRouteFiles(packageDir) {
718
- return fg(["src/routes/**/*.{ts,svelte}", "routes/**/*.{ts,svelte}"], {
718
+ return glob(["src/routes/**/*.{ts,svelte}", "routes/**/*.{ts,svelte}"], {
719
719
  cwd: packageDir,
720
+ expandDirectories: false,
720
721
  absolute: true,
721
722
  onlyFiles: true,
722
723
  ignore: ["**/node_modules/**", "**/.svelte-kit/**"]
723
724
  });
724
725
  }
725
726
  async function collectMigrations(packageDir) {
726
- return fg(["migrations/**/*", "src/migrations/**/*"], {
727
+ return glob(["migrations/**/*", "src/migrations/**/*"], {
727
728
  cwd: packageDir,
729
+ expandDirectories: false,
728
730
  absolute: true,
729
731
  onlyFiles: true,
730
732
  ignore: ["**/node_modules/**"]
731
733
  });
732
734
  }
733
735
  async function collectExamples(packageDir, docs) {
734
- const fileExamples = (await fg([
736
+ const fileExamples = (await glob([
735
737
  "examples/**/*.{ts,tsx,svelte,md}",
736
738
  "src/**/*.{example,stories}.{ts,tsx,svelte}",
737
739
  "src/**/examples/**/*.{ts,tsx,svelte,md}"
738
740
  ], {
739
741
  cwd: packageDir,
742
+ expandDirectories: false,
740
743
  absolute: true,
741
744
  onlyFiles: true,
742
745
  ignore: [
@@ -830,8 +833,9 @@ async function summarizePackage(input, rootDir) {
830
833
  };
831
834
  }
832
835
  async function discoverWorkspacePackageDirs(workspaceRoot) {
833
- return (await fg("packages/*/package.json", {
836
+ return (await glob("packages/*/package.json", {
834
837
  cwd: workspaceRoot,
838
+ expandDirectories: false,
835
839
  absolute: true,
836
840
  onlyFiles: true
837
841
  })).map((packageJsonPath) => ({
@@ -874,8 +878,9 @@ async function discoverConsumerPackageDirs(projectRoot) {
874
878
  function resolvePackageByName(workspaceRoot, packageName) {
875
879
  const packagesDir = join(workspaceRoot, "packages");
876
880
  if (!existsSync(packagesDir)) return null;
877
- const packageJsonPaths = fg.sync("*/package.json", {
881
+ const packageJsonPaths = globSync("*/package.json", {
878
882
  cwd: packagesDir,
883
+ expandDirectories: false,
879
884
  absolute: true,
880
885
  onlyFiles: true
881
886
  });
@@ -920,8 +925,9 @@ async function buildWorkbenchProject(scope) {
920
925
  };
921
926
  }
922
927
  async function discoverWorkspaceWorkbenches(workspaceRoot, packagesPattern = "packages/*/src/workbench.ts") {
923
- return (await fg(packagesPattern, {
928
+ return (await glob(packagesPattern, {
924
929
  cwd: workspaceRoot,
930
+ expandDirectories: false,
925
931
  absolute: true,
926
932
  onlyFiles: true
927
933
  })).sort().map((sourcePath) => {
@@ -1010,4 +1016,4 @@ function describeWorkbenchSource(target, cwd = process.cwd()) {
1010
1016
  //#endregion
1011
1017
  export { discoverWorkbenchTargets as a, findProjectRoot as c, importWorkbenchModule as d, resolveWorkbenchScope as f, discoverInstalledWorkbenches as i, findSmrtWorkbenchWorkspaceRoot as l, describeWorkbenchSource as n, discoverWorkspaceWorkbenches as o, detectWorkbenchMode as r, findPackageDir as s, buildWorkbenchProject as t, findWorkspaceRoot as u };
1012
1018
 
1013
- //# sourceMappingURL=discovery-BOoinKLR.js.map
1019
+ //# sourceMappingURL=discovery-CdP0zOmb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery-CdP0zOmb.js","names":["targets"],"sources":["../../src/discovery.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport {\n dirname,\n extname,\n isAbsolute,\n join,\n relative,\n resolve,\n} from 'node:path';\nimport { pathToFileURL } from 'node:url';\n// The leaf `/generators/custom-action` subpath — not the package root, and not\n// the `/generators` barrel, which value-re-exports `MCPGenerator` and so reaches\n// `SmrtCollection` -> `SmrtObject` -> `SmrtClass` and its module-scope\n// `@happyvertical/ai` / `@happyvertical/sql` imports. Measured over `dist`:\n// this subpath is 2 modules with no `@happyvertical` external, the barrel is\n// 109 with the full AI/SQL surface, the root 151. `custom-action`'s only runtime\n// import is `tools/tool-generator`, whose own imports are type-only, which is\n// what keeps it a leaf — a build-time discovery helper should load none of the\n// rest (#2686).\nimport {\n createClassNamePredicate,\n resolveApiMethodExposure,\n resolveCustomActionMetadata,\n resolveEffectiveActionMetadata,\n} from '@happyvertical/smrt-core/generators/custom-action';\nimport { glob, globSync } from 'tinyglobby';\nimport { coerceWorkbenchModules } from './runtime.js';\nimport type {\n DiscoveredWorkbenchTarget,\n SmrtWorkbenchModule,\n SmrtWorkbenchProject,\n SmrtWorkbenchScopeMode,\n SmrtWorkbenchVitePluginOptions,\n WorkbenchApiObjectFieldSummary,\n WorkbenchApiObjectSummary,\n WorkbenchApiParameterLocation,\n WorkbenchApiParameterSummary,\n WorkbenchApiSummary,\n WorkbenchCliCommandSummary,\n WorkbenchDocumentSummary,\n WorkbenchExampleSummary,\n WorkbenchKnowledgeSummary,\n WorkbenchMcpToolSummary,\n WorkbenchPackageSummary,\n WorkbenchRestEndpointSummary,\n WorkbenchScopeResolution,\n} from './types.js';\nimport { commandIdForScript } from './utils.js';\n\nconst require = createRequire(import.meta.url);\nconst TS_SOURCE_EXTENSIONS = new Set(['.ts', '.tsx', '.mts', '.cts']);\nconst DOCUMENT_LIMIT = 20_000;\nconst EXAMPLE_LIMIT = 8_000;\n\ninterface PackageJsonLike {\n name?: string;\n version?: string;\n description?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n exports?: unknown;\n packageManager?: string;\n}\n\ninterface WorkbenchPackageDir {\n packageDir: string;\n packageJson: PackageJsonLike;\n source: 'workspace' | 'package' | 'app';\n}\n\nexport function findWorkspaceRoot(startDir = process.cwd()): string | null {\n let current = resolve(startDir);\n\n while (true) {\n if (existsSync(join(current, 'pnpm-workspace.yaml'))) {\n return current;\n }\n\n const parent = dirname(current);\n if (parent === current) {\n return null;\n }\n current = parent;\n }\n}\n\nexport function findSmrtWorkbenchWorkspaceRoot(\n startDir = process.cwd(),\n): string | null {\n const workspaceRoot = findWorkspaceRoot(startDir);\n if (!workspaceRoot) {\n return null;\n }\n\n const hostPackageJsonPath = join(\n workspaceRoot,\n 'packages',\n 'smrt-workbench',\n 'host',\n 'package.json',\n );\n\n return existsSync(hostPackageJsonPath) ? workspaceRoot : null;\n}\n\nexport function findProjectRoot(startDir = process.cwd()): string {\n let current = resolve(startDir);\n\n while (true) {\n if (existsSync(join(current, 'package.json'))) {\n return current;\n }\n\n const parent = dirname(current);\n if (parent === current) {\n return resolve(startDir);\n }\n current = parent;\n }\n}\n\nexport function findPackageDir(\n startDir = process.cwd(),\n workspaceRoot?: string,\n): string | null {\n let current = resolve(startDir);\n const boundary = workspaceRoot ? resolve(workspaceRoot) : null;\n\n while (true) {\n if (boundary && current === boundary) {\n return null;\n }\n\n const packageJsonPath = join(current, 'package.json');\n if (existsSync(packageJsonPath)) {\n return current;\n }\n\n const parent = dirname(current);\n if (parent === current) {\n return null;\n }\n current = parent;\n }\n}\n\nexport function detectWorkbenchMode(\n projectRoot = process.cwd(),\n): 'workspace' | 'consumer' {\n return findSmrtWorkbenchWorkspaceRoot(projectRoot) ? 'workspace' : 'consumer';\n}\n\nfunction readJson<T = Record<string, unknown>>(path: string): T {\n return JSON.parse(readFileSync(path, 'utf-8')) as T;\n}\n\nfunction readJsonIfExists<T = Record<string, unknown>>(path: string): T | null {\n return existsSync(path) ? readJson<T>(path) : null;\n}\n\nfunction detectPackageManager(projectRoot: string): 'pnpm' | 'yarn' | 'npm' {\n let current = resolve(projectRoot);\n\n while (true) {\n if (existsSync(join(current, 'pnpm-lock.yaml'))) return 'pnpm';\n if (existsSync(join(current, 'yarn.lock'))) return 'yarn';\n\n const packageManager = readJsonIfExists<PackageJsonLike>(\n join(current, 'package.json'),\n )?.packageManager;\n if (packageManager?.startsWith('pnpm@')) return 'pnpm';\n if (packageManager?.startsWith('yarn@')) return 'yarn';\n if (packageManager?.startsWith('npm@')) return 'npm';\n\n const parent = dirname(current);\n if (parent === current) return 'npm';\n current = parent;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction stringRecord(value: unknown): Record<string, string> {\n if (!isRecord(value)) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(value).filter(\n (entry): entry is [string, string] => typeof entry[1] === 'string',\n ),\n );\n}\n\nfunction countItems(value: unknown): number {\n if (Array.isArray(value)) {\n return value.length;\n }\n if (isRecord(value)) {\n return Object.keys(value).length;\n }\n return 0;\n}\n\nfunction truncate(\n value: string,\n limit: number,\n): {\n content: string;\n truncated: boolean;\n} {\n if (value.length <= limit) {\n return { content: value, truncated: false };\n }\n\n return { content: value.slice(0, limit), truncated: true };\n}\n\nfunction readDocument(\n packageDir: string,\n fileName: string,\n kind: WorkbenchDocumentSummary['kind'],\n): WorkbenchDocumentSummary | null {\n const path = join(packageDir, fileName);\n if (!existsSync(path)) {\n return null;\n }\n\n const { content, truncated } = truncate(\n readFileSync(path, 'utf-8'),\n DOCUMENT_LIMIT,\n );\n return {\n kind,\n title: fileName,\n path,\n content,\n truncated,\n };\n}\n\nfunction exportKeys(exportsField: unknown): string[] {\n if (!exportsField) {\n return [];\n }\n if (typeof exportsField === 'string') {\n return ['.'];\n }\n if (isRecord(exportsField)) {\n return Object.keys(exportsField).sort();\n }\n return [];\n}\n\nfunction dependencyNames(packageJson: PackageJsonLike): string[] {\n return Object.keys({\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n ...packageJson.peerDependencies,\n }).sort();\n}\n\nfunction smrtDependencyNames(packageJson: PackageJsonLike): string[] {\n return dependencyNames(packageJson).filter((name) =>\n name.startsWith('@happyvertical/smrt-'),\n );\n}\n\nfunction sdkDependencyNames(packageJson: PackageJsonLike): string[] {\n return dependencyNames(packageJson).filter(\n (name) =>\n name.startsWith('@happyvertical/') &&\n !name.startsWith('@happyvertical/smrt-'),\n );\n}\n\nfunction readKnowledgeSummary(packageDir: string): WorkbenchKnowledgeSummary {\n const knowledgeCandidates = [\n join(packageDir, '.smrt', 'smrt-knowledge.json'),\n join(packageDir, 'dist', 'smrt-knowledge.json'),\n ];\n const manifestCandidates = [\n join(packageDir, '.smrt', 'manifest.json'),\n join(packageDir, 'dist', 'manifest.json'),\n join(packageDir, 'src', 'manifest', 'manifest.json'),\n ];\n\n const knowledgePath = knowledgeCandidates.find((path) => existsSync(path));\n const manifestPath = manifestCandidates.find((path) => existsSync(path));\n const knowledge = knowledgePath\n ? readJsonIfExists<Record<string, unknown>>(knowledgePath)\n : null;\n const manifest = manifestPath\n ? readJsonIfExists<Record<string, unknown>>(manifestPath)\n : null;\n const knowledgeObjects = knowledge?.objects;\n const manifestObjects = manifest?.objects;\n const objects =\n countItems(knowledgeObjects) > 0 ? knowledgeObjects : manifestObjects;\n const objectNames = objectNamesFrom(objects);\n\n return {\n manifestPath,\n knowledgePath,\n objectCount: countItems(objects),\n relationshipCount:\n countItems(knowledge?.relationshipsV2) ||\n countItems(knowledge?.relationships),\n promptCount: countItems(knowledge?.prompts),\n mcpToolCount: countItems(knowledge?.mcpTools),\n surfaceCount: countItems(knowledge?.surfaces),\n tags: Array.isArray(knowledge?.tags)\n ? knowledge.tags.filter((tag): tag is string => typeof tag === 'string')\n : [],\n risks: Array.isArray(knowledge?.risks)\n ? knowledge.risks.filter(\n (risk): risk is string => typeof risk === 'string',\n )\n : [],\n objectNames,\n };\n}\n\nfunction objectNamesFrom(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value\n .map((item) => {\n if (!isRecord(item)) {\n return null;\n }\n return stringValue(item.qualifiedName) || stringValue(item.name);\n })\n .filter((name): name is string => Boolean(name))\n .sort();\n }\n\n if (isRecord(value)) {\n return Object.keys(value).sort();\n }\n\n return [];\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === 'string' && value.length > 0 ? value : null;\n}\n\nfunction booleanValue(value: unknown): boolean | undefined {\n return typeof value === 'boolean' ? value : undefined;\n}\n\nfunction objectRecordsFrom(value: unknown): Record<string, unknown>[] {\n if (Array.isArray(value)) {\n return value.filter(isRecord);\n }\n\n if (!isRecord(value)) {\n return [];\n }\n\n return Object.entries(value).map(([key, item]) => {\n if (isRecord(item)) {\n return {\n key,\n ...item,\n };\n }\n\n return {\n key,\n name: key,\n };\n });\n}\n\nfunction fieldSummariesFrom(value: unknown): WorkbenchApiObjectFieldSummary[] {\n if (Array.isArray(value)) {\n return value\n .filter(isRecord)\n .map((field) => ({\n name: stringValue(field.name) || 'unknown',\n type: stringValue(field.type) || undefined,\n required: booleanValue(field.required),\n related: stringValue(field.related) || undefined,\n }))\n .filter((field) => field.name !== 'unknown');\n }\n\n if (!isRecord(value)) {\n return [];\n }\n\n return Object.entries(value)\n .map(([name, field]) => {\n const fieldRecord = isRecord(field) ? field : {};\n return {\n name,\n type: stringValue(fieldRecord.type) || undefined,\n required: booleanValue(fieldRecord.required),\n related: stringValue(fieldRecord.related) || undefined,\n };\n })\n .sort((left, right) => left.name.localeCompare(right.name));\n}\n\nfunction resolveManifestSourcePath(\n rootDir: string,\n packageDir: string,\n sourcePath: string | null,\n): string | undefined {\n if (!sourcePath) {\n return undefined;\n }\n\n if (isAbsolute(sourcePath)) {\n return sourcePath;\n }\n\n const rootRelativePath = resolve(rootDir, sourcePath);\n if (existsSync(rootRelativePath)) {\n return rootRelativePath;\n }\n\n return resolve(packageDir, sourcePath);\n}\n\nfunction typedocPackageSlug(packageName: string | undefined): string | null {\n if (!packageName?.startsWith('@happyvertical/smrt-')) {\n return null;\n }\n\n return packageName.replace('@happyvertical/smrt-', '');\n}\n\nfunction findTypedocClassPath(\n rootDir: string,\n packageDir: string,\n packageName: string | undefined,\n className: string,\n): string | undefined {\n const slug = typedocPackageSlug(packageName);\n const candidates = [\n slug\n ? join(\n rootDir,\n 'docs',\n 'content',\n 'api',\n slug,\n 'classes',\n `${className}.md`,\n )\n : null,\n join(packageDir, 'docs', 'classes', `${className}.md`),\n join(packageDir, 'docs', `${className}.md`),\n ].filter((path): path is string => Boolean(path));\n\n return candidates.find((path) => existsSync(path));\n}\n\nfunction extractTypedocSummary(content: string): string | undefined {\n const lines = content.split(/\\r?\\n/);\n const summary: string[] = [];\n let hasSeenTitle = false;\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (!hasSeenTitle) {\n if (trimmed.startsWith('# ')) {\n hasSeenTitle = true;\n }\n continue;\n }\n\n if (!trimmed || trimmed.startsWith('Defined in:')) {\n continue;\n }\n if (trimmed.startsWith('## ')) {\n break;\n }\n if (trimmed.startsWith('> ')) {\n continue;\n }\n\n summary.push(trimmed);\n }\n\n const value = summary.join('\\n').trim();\n return value.length > 0 ? value : undefined;\n}\n\nfunction readTypedocSummary(path: string | undefined): string | undefined {\n if (!path) {\n return undefined;\n }\n\n return extractTypedocSummary(readFileSync(path, 'utf-8'));\n}\n\nconst CRUD_ACTIONS = ['list', 'get', 'create', 'update', 'delete'] as const;\nconst SERVER_MANAGED_FIELDS = new Set([\n 'id',\n 'tenantId',\n 'tenant_id',\n 'createdAt',\n 'created_at',\n 'updatedAt',\n 'updated_at',\n]);\n\nfunction arrayOfStrings(value: unknown): string[] {\n return Array.isArray(value)\n ? value.filter((item): item is string => typeof item === 'string')\n : [];\n}\n\nfunction configObject(value: unknown): Record<string, unknown> {\n return isRecord(value) ? value : {};\n}\n\nfunction parameterRequired(\n value: Record<string, unknown>,\n): boolean | undefined {\n if (typeof value.required === 'boolean') {\n return value.required;\n }\n\n const meta = configObject(value._meta);\n return typeof meta.required === 'boolean' ? meta.required : undefined;\n}\n\nfunction parameterDescription(\n value: Record<string, unknown>,\n): string | undefined {\n return (\n stringValue(value.description) ||\n stringValue(configObject(value._meta).description) ||\n undefined\n );\n}\n\nfunction parameterDefaultValue(\n value: Record<string, unknown>,\n): string | undefined {\n if (!Object.hasOwn(value, 'default')) {\n return undefined;\n }\n\n const defaultValue = value.default;\n if (\n typeof defaultValue === 'string' ||\n typeof defaultValue === 'number' ||\n typeof defaultValue === 'boolean'\n ) {\n return String(defaultValue);\n }\n\n if (defaultValue === null) {\n return 'null';\n }\n\n try {\n return JSON.stringify(defaultValue);\n } catch {\n return undefined;\n }\n}\n\nfunction fieldParameter(\n name: string,\n field: Record<string, unknown>,\n location: WorkbenchApiParameterLocation,\n requiredOverride?: boolean,\n): WorkbenchApiParameterSummary {\n return {\n name,\n type: stringValue(field.type) || undefined,\n required: requiredOverride ?? parameterRequired(field),\n location,\n description: parameterDescription(field),\n defaultValue: parameterDefaultValue(field),\n };\n}\n\nfunction writableFieldEntries(\n object: Record<string, unknown>,\n): Array<[string, Record<string, unknown>]> {\n const fields = configObject(object.fields);\n const apiConfig = configObject(configObject(object.decoratorConfig).api);\n const writableAllowlist = new Set(arrayOfStrings(apiConfig.writable));\n const hasWritableAllowlist = writableAllowlist.size > 0;\n\n return Object.entries(fields)\n .filter((entry): entry is [string, Record<string, unknown>] =>\n isRecord(entry[1]),\n )\n .filter(([name, field]) => {\n if (name.startsWith('_')) {\n return false;\n }\n if (SERVER_MANAGED_FIELDS.has(name)) {\n return false;\n }\n if (\n field.readonly === true ||\n configObject(field._meta).readonly === true\n ) {\n return false;\n }\n return !hasWritableAllowlist || writableAllowlist.has(name);\n })\n .sort(([left], [right]) => left.localeCompare(right));\n}\n\nfunction writableFieldParameters(\n object: Record<string, unknown>,\n location: WorkbenchApiParameterLocation,\n requiredMode: 'field' | 'optional',\n): WorkbenchApiParameterSummary[] {\n return writableFieldEntries(object).map(([name, field]) =>\n fieldParameter(\n name,\n field,\n location,\n requiredMode === 'field' ? parameterRequired(field) : false,\n ),\n );\n}\n\nfunction methodParameterSummaries(\n object: Record<string, unknown>,\n action: string,\n location: WorkbenchApiParameterLocation,\n): WorkbenchApiParameterSummary[] {\n const parameters = methodDefinition(object, action).parameters;\n if (!Array.isArray(parameters)) {\n return [];\n }\n\n return parameters.filter(isRecord).map((parameter) => ({\n name: stringValue(parameter.name) || 'parameter',\n type: stringValue(parameter.type) || undefined,\n required: parameter.optional !== true,\n location,\n description: parameterDescription(parameter),\n defaultValue: parameterDefaultValue(parameter),\n }));\n}\n\nfunction pathParameterNames(path: string): string[] {\n return Array.from(path.matchAll(/\\{([^}]+)\\}/g))\n .map((match) => match[1]?.trim())\n .filter((name): name is string => Boolean(name));\n}\n\nfunction pathParameters(path: string): WorkbenchApiParameterSummary[] {\n return pathParameterNames(path).map((name) => ({\n name,\n type: 'string',\n required: true,\n location: 'path',\n }));\n}\n\nfunction restCrudParameters(\n object: Record<string, unknown>,\n action: string,\n path: string,\n): WorkbenchApiParameterSummary[] {\n if (action === 'list') {\n return [\n {\n name: 'limit',\n type: 'integer',\n required: false,\n location: 'query',\n description: 'Maximum number of items to return.',\n defaultValue: '50',\n },\n {\n name: 'offset',\n type: 'integer',\n required: false,\n location: 'query',\n description: 'Number of items to skip.',\n defaultValue: '0',\n },\n ];\n }\n\n if (action === 'create') {\n return writableFieldParameters(object, 'body', 'field');\n }\n\n if (action === 'update') {\n return [\n ...pathParameters(path),\n ...writableFieldParameters(object, 'body', 'optional'),\n ];\n }\n\n return pathParameters(path);\n}\n\nfunction restCustomParameters(\n object: Record<string, unknown>,\n action: string,\n method: string,\n path: string,\n): WorkbenchApiParameterSummary[] {\n const pathParams = pathParameters(path);\n const pathParamNameSet = new Set(pathParams.map((param) => param.name));\n const bodyOrQueryParams = methodParameterSummaries(\n object,\n action,\n method === 'GET' ? 'query' : 'body',\n ).filter((param) => !pathParamNameSet.has(param.name));\n\n return [...pathParams, ...bodyOrQueryParams];\n}\n\nfunction cliCrudParameters(\n object: Record<string, unknown>,\n action: string,\n): WorkbenchApiParameterSummary[] {\n if (action === 'list') {\n return [\n {\n name: '--limit',\n type: 'integer',\n required: false,\n location: 'option',\n description: 'Maximum number of items to return.',\n defaultValue: '50',\n },\n {\n name: '--offset',\n type: 'integer',\n required: false,\n location: 'option',\n description: 'Number of items to skip.',\n defaultValue: '0',\n },\n {\n name: '--order-by',\n type: 'string',\n required: false,\n location: 'option',\n description: 'Ordering expression, for example \"created_at DESC\".',\n },\n {\n name: '--where',\n type: 'object',\n required: false,\n location: 'option',\n description: 'JSON filter conditions.',\n },\n ];\n }\n\n if (action === 'get' || action === 'delete') {\n return [\n {\n name: 'id',\n type: 'string',\n required: true,\n location: 'argument',\n description: 'Object ID. May also be passed as --id.',\n },\n ];\n }\n\n const bodyParameters = writableFieldParameters(\n object,\n 'option',\n action === 'create' ? 'field' : 'optional',\n ).map((param) => ({\n ...param,\n name: `--${param.name}`,\n }));\n\n if (action === 'create') {\n return [\n {\n name: '--from-file',\n type: 'path',\n required: false,\n location: 'option',\n description: 'Path to a JSON object payload.',\n },\n ...bodyParameters,\n ];\n }\n\n return [\n {\n name: 'id',\n type: 'string',\n required: true,\n location: 'argument',\n description: 'Object ID. May also be passed as --id.',\n },\n {\n name: '--from-file',\n type: 'path',\n required: false,\n location: 'option',\n description: 'Path to a JSON object payload.',\n },\n ...bodyParameters,\n ];\n}\n\nfunction cliCustomParameters(\n object: Record<string, unknown>,\n action: string,\n): WorkbenchApiParameterSummary[] {\n const params = methodParameterSummaries(object, action, 'option').map(\n (param) => ({\n ...param,\n name: `--${param.name}`,\n required: false,\n }),\n );\n\n return [\n {\n name: 'id',\n type: 'string',\n required: false,\n location: 'argument',\n description:\n 'Optional object ID for instance actions. May also be passed as --id.',\n },\n ...params,\n ];\n}\n\nfunction mcpCrudParameters(\n object: Record<string, unknown>,\n action: string,\n): WorkbenchApiParameterSummary[] {\n if (action === 'list') {\n return [\n {\n name: 'limit',\n type: 'integer',\n required: false,\n location: 'input',\n description: 'Maximum number of items to return.',\n defaultValue: '50',\n },\n {\n name: 'offset',\n type: 'integer',\n required: false,\n location: 'input',\n description: 'Number of items to skip.',\n defaultValue: '0',\n },\n {\n name: 'orderBy',\n type: 'string',\n required: false,\n location: 'input',\n description: 'Ordering expression, for example \"created_at DESC\".',\n },\n {\n name: 'where',\n type: 'object',\n required: false,\n location: 'input',\n description: 'Filter conditions as key-value pairs.',\n },\n ];\n }\n\n if (action === 'get') {\n return [\n {\n name: 'id',\n type: 'string',\n required: true,\n location: 'input',\n description: 'Unique identifier of the object.',\n },\n {\n name: 'slug',\n type: 'string',\n required: false,\n location: 'input',\n description: 'URL-friendly identifier of the object.',\n },\n ];\n }\n\n if (action === 'delete') {\n return [\n {\n name: 'id',\n type: 'string',\n required: true,\n location: 'input',\n description: 'ID of the object to delete.',\n },\n ];\n }\n\n if (action === 'create') {\n return writableFieldParameters(object, 'input', 'field');\n }\n\n return [\n {\n name: 'id',\n type: 'string',\n required: true,\n location: 'input',\n description: 'ID of the object to update.',\n },\n ...writableFieldParameters(object, 'input', 'optional'),\n ];\n}\n\nfunction mcpCustomParameters(\n _object: Record<string, unknown>,\n _action: string,\n): WorkbenchApiParameterSummary[] {\n return [\n {\n name: 'id',\n type: 'string',\n required: true,\n location: 'input',\n description: 'ID of the object to execute the action on.',\n },\n {\n name: 'options',\n type: 'object',\n required: false,\n location: 'input',\n description: 'Additional options for the custom action.',\n },\n ];\n}\n\nfunction enabledCrudActions(config: unknown): string[] {\n if (config === false) {\n return [];\n }\n\n const include = arrayOfStrings(configObject(config).include);\n const exclude = new Set(arrayOfStrings(configObject(config).exclude));\n const actions =\n include.length > 0\n ? include.filter((action) => CRUD_ACTIONS.includes(action as never))\n : [...CRUD_ACTIONS];\n\n return actions.filter((action) => !exclude.has(action));\n}\n\nfunction publicCustomMethodNames(object: Record<string, unknown>): string[] {\n return Object.entries(configObject(object.methods))\n .filter(([name, method]) => {\n if (CRUD_ACTIONS.includes(name as never) || !isRecord(method)) {\n return false;\n }\n return method.isPublic === true;\n })\n .map(([name]) => name)\n .sort();\n}\n\nfunction enabledCustomActions(\n object: Record<string, unknown>,\n surface: 'api' | 'cli' | 'mcp',\n isModelClassName?: (name: string) => boolean,\n): string[] {\n const decoratorConfig = configObject(object.decoratorConfig);\n const surfaceConfig = decoratorConfig[surface];\n if (surfaceConfig === false) {\n return [];\n }\n\n const include = arrayOfStrings(configObject(surfaceConfig).include);\n const exclude = new Set(arrayOfStrings(configObject(surfaceConfig).exclude));\n const publicMethods = publicCustomMethodNames(object);\n\n if (surface === 'mcp' && include.length > 0) {\n return include\n .filter((name) => !CRUD_ACTIONS.includes(name as never))\n .filter((name) => publicMethods.includes(name))\n .filter((name) => !exclude.has(name));\n }\n\n // `api` reads the framework's ONE exposure resolver rather than a local copy\n // of the include/exclude rule. This summary is an agent-facing discovery\n // artifact, so a stale copy advertises endpoints the route emitters never\n // wrote -- the wire-ability gate, the framework-lifecycle exclusion, and\n // `@method({ expose })` all decide here too (#2686). `cli`/`mcp` keep their\n // own projection; #2692 owns those defaults.\n if (surface === 'api') {\n const methods = configObject(object.methods);\n const isCollectionClass =\n stringValue(object.extends) === 'SmrtCollection' ||\n object.extendsTypeArg !== undefined;\n return Object.keys(methods)\n .sort()\n .filter(\n (name) =>\n resolveApiMethodExposure({\n actionName: name,\n method: configObject(methods[name]),\n apiConfig: decoratorConfig.api,\n isCollectionClass,\n ...(isModelClassName ? { isModelClassName } : {}),\n }).exposed,\n );\n }\n\n const customMethodsInInclude = include.filter(\n (name) => !CRUD_ACTIONS.includes(name as never),\n );\n return publicMethods\n .filter(\n (name) =>\n customMethodsInInclude.length === 0 ||\n customMethodsInInclude.includes(name),\n )\n .filter((name) => !exclude.has(name));\n}\n\nfunction methodDefinition(\n object: Record<string, unknown>,\n action: string,\n): Record<string, unknown> {\n return configObject(configObject(object.methods)[action]);\n}\n\n/**\n * The effective route metadata for one custom action: `@method()` wins field by\n * field over the class-level `api.routes` entry, exactly as the emitters and\n * the knowledge artifact resolve it. Reading the map alone printed the\n * pre-migration verb and path for a class that had moved to the decorator\n * (#2686).\n */\nfunction effectiveRoute(\n object: Record<string, unknown>,\n action: string,\n): { httpMethod?: string; path?: string; scope?: string } {\n return resolveEffectiveActionMetadata({\n actionName: action,\n method: methodDefinition(object, action),\n apiConfig: configObject(object.decoratorConfig).api,\n });\n}\n\nfunction customRouteMethod(\n object: Record<string, unknown>,\n action: string,\n): string {\n return effectiveRoute(object, action).httpMethod || 'POST';\n}\n\n/**\n * The scope the emitters will actually route under.\n *\n * NOT `resolveEffectiveActionMetadata(...).scope`, which returns the raw\n * declaration: a `scope` is a declaration about a method, never a relocation of\n * it, and `resolveCustomActionMetadata` is what collapses a contradicting one\n * back onto the executable receiver. Reading the raw value printed the\n * collection URL for a route emitted under `[id]` — and, with no declaration at\n * all, printed `{id}` for every instance action on a COLLECTION class, whose\n * host makes it collection-scoped (#2686).\n */\nfunction effectiveScope(\n object: Record<string, unknown>,\n action: string,\n): 'item' | 'collection' {\n const method = methodDefinition(object, action);\n const isCollectionClass =\n stringValue(object.extends) === 'SmrtCollection' ||\n object.extendsTypeArg !== undefined;\n const defaultScope: 'item' | 'collection' =\n isCollectionClass || method.isStatic === true ? 'collection' : 'item';\n try {\n return resolveCustomActionMetadata({\n actionName: action,\n method,\n apiConfig: configObject(object.decoratorConfig).api,\n defaultScope,\n }).scope;\n } catch {\n // The shared resolver validates as it resolves; one malformed action must\n // not fail a whole discovery pass, and a declaration cannot change the\n // receiver anyway.\n return defaultScope;\n }\n}\n\nfunction customRoutePath(\n object: Record<string, unknown>,\n action: string,\n): string {\n const collection =\n stringValue(object.collection) || stringValue(object.name) || action;\n const configuredPath = effectiveRoute(object, action).path || action;\n const normalizedPath = configuredPath\n .split('/')\n .map((segment) => segment.trim())\n .filter(Boolean)\n .join('/')\n .replace(/\\[([^\\]]+)\\]/g, '{$1}');\n\n return effectiveScope(object, action) === 'collection'\n ? `/api/v1/${collection}/${normalizedPath}`\n : `/api/v1/${collection}/{id}/${normalizedPath}`;\n}\n\n/**\n * Exported for the parity test that pins this summary against the framework's\n * own `resolveApiActionSet`. This is a published agent-facing discovery\n * artifact, so \"the workbench and the route emitters agree\" has to be a test,\n * not a convention (#2686).\n */\nexport function restEndpointsFrom(\n object: Record<string, unknown>,\n isModelClassName?: (name: string) => boolean,\n): WorkbenchRestEndpointSummary[] {\n const className =\n stringValue(object.className) || stringValue(object.name) || 'Object';\n const collection = stringValue(object.collection) || className.toLowerCase();\n const apiConfig = configObject(object.decoratorConfig).api;\n const endpoints: WorkbenchRestEndpointSummary[] = [];\n\n const crudActions =\n stringValue(object.extends) === 'SmrtCollection'\n ? []\n : enabledCrudActions(apiConfig);\n for (const action of crudActions) {\n const route =\n action === 'list'\n ? ['GET', `/api/v1/${collection}`, `List ${className} objects`]\n : action === 'create'\n ? ['POST', `/api/v1/${collection}`, `Create ${className}`]\n : action === 'get'\n ? ['GET', `/api/v1/${collection}/{id}`, `Get ${className} by ID`]\n : action === 'update'\n ? ['PUT', `/api/v1/${collection}/{id}`, `Update ${className}`]\n : ['DELETE', `/api/v1/${collection}/{id}`, `Delete ${className}`];\n\n endpoints.push({\n objectName: className,\n action,\n method: route[0],\n path: route[1],\n description: route[2],\n parameters: restCrudParameters(object, action, route[1]),\n });\n }\n\n for (const action of enabledCustomActions(object, 'api', isModelClassName)) {\n const method = customRouteMethod(object, action);\n endpoints.push({\n objectName: className,\n action,\n method,\n path: customRoutePath(object, action),\n description: `Run ${className}.${action}`,\n parameters: restCustomParameters(\n object,\n action,\n method,\n customRoutePath(object, action),\n ),\n });\n }\n\n return endpoints;\n}\n\nfunction cliCommandsFrom(\n object: Record<string, unknown>,\n): WorkbenchCliCommandSummary[] {\n const className =\n stringValue(object.className) || stringValue(object.name) || 'Object';\n const lowerName = className.toLowerCase();\n const cliConfig = configObject(object.decoratorConfig).cli;\n const commands: WorkbenchCliCommandSummary[] = [];\n\n for (const action of enabledCrudActions(cliConfig)) {\n const description =\n action === 'list'\n ? `List ${className} objects`\n : action === 'get'\n ? `Get ${className} by ID or slug`\n : action === 'create'\n ? `Create new ${className}`\n : action === 'update'\n ? `Update ${className}`\n : `Delete ${className}`;\n\n commands.push({\n objectName: className,\n action,\n command: `${lowerName}:${action}`,\n description,\n parameters: cliCrudParameters(object, action),\n });\n }\n\n for (const action of enabledCustomActions(object, 'cli')) {\n commands.push({\n objectName: className,\n action,\n command: `${lowerName}:${action}`,\n description: `Run ${className}.${action}`,\n parameters: cliCustomParameters(object, action),\n });\n }\n\n return commands;\n}\n\nfunction mcpToolsFrom(\n object: Record<string, unknown>,\n): WorkbenchMcpToolSummary[] {\n const className =\n stringValue(object.className) || stringValue(object.name) || 'Object';\n const lowerName = className.toLowerCase();\n const mcpConfig = configObject(object.decoratorConfig).mcp;\n const tools: WorkbenchMcpToolSummary[] = [];\n\n for (const action of enabledCrudActions(mcpConfig)) {\n const description =\n action === 'list'\n ? `List ${className} objects with optional filtering`\n : action === 'get'\n ? `Get a specific ${className} by ID or slug`\n : action === 'create'\n ? `Create a new ${className}`\n : action === 'update'\n ? `Update an existing ${className}`\n : `Delete a ${className} by ID`;\n\n tools.push({\n objectName: className,\n action,\n toolName: `${lowerName}_${action}`,\n description,\n parameters: mcpCrudParameters(object, action),\n });\n }\n\n for (const action of enabledCustomActions(object, 'mcp')) {\n tools.push({\n objectName: className,\n action,\n toolName: `${lowerName}_${action}`.toLowerCase(),\n description: `Execute ${action} action on ${className}`,\n parameters: mcpCustomParameters(object, action),\n });\n }\n\n return tools;\n}\n\nfunction readApiSummary(\n packageDir: string,\n rootDir: string,\n packageName: string,\n knowledge: WorkbenchKnowledgeSummary,\n routeFiles: string[],\n): WorkbenchApiSummary {\n const manifest = knowledge.manifestPath\n ? readJsonIfExists<Record<string, unknown>>(knowledge.manifestPath)\n : null;\n const objectRecords = objectRecordsFrom(manifest?.objects);\n\n const objects: WorkbenchApiObjectSummary[] = objectRecords.map((object) => {\n const name =\n stringValue(object.className) ||\n stringValue(object.name) ||\n stringValue(object.key) ||\n 'unknown';\n const className = stringValue(object.className) || name;\n const sourcePath = resolveManifestSourcePath(\n rootDir,\n packageDir,\n stringValue(object.filePath) || stringValue(object.sourcePath),\n );\n const typedocPath = findTypedocClassPath(\n rootDir,\n packageDir,\n packageName,\n className,\n );\n const fields = fieldSummariesFrom(object.fields);\n\n return {\n name,\n className,\n qualifiedName: stringValue(object.qualifiedName) || undefined,\n collection: stringValue(object.collection) || undefined,\n sourcePath,\n typedocPath,\n description: readTypedocSummary(typedocPath),\n fields,\n };\n });\n\n const objectNames =\n objects.length > 0\n ? objects\n .map(\n (object) => object.qualifiedName || object.className || object.name,\n )\n .filter(Boolean)\n .sort()\n : knowledge.objectNames;\n // The wire-ability gate needs a class inventory to tell a model instance from\n // an options interface. Without one it half-applies and this summary keeps\n // advertising the `addAsset(asset: Asset)` shape (#2686).\n const isModelClassName = createClassNamePredicate(\n objectRecords.flatMap((record) =>\n [\n stringValue(record.className),\n stringValue(record.name),\n stringValue(record.qualifiedName),\n ].filter((name): name is string => Boolean(name)),\n ),\n );\n const restEndpoints = objectRecords.flatMap((record) =>\n restEndpointsFrom(record, isModelClassName),\n );\n\n return {\n objectNames,\n objects,\n restEndpoints,\n cliCommands: objectRecords.flatMap(cliCommandsFrom),\n mcpTools: objectRecords.flatMap(mcpToolsFrom),\n endpointCount: restEndpoints.length,\n routeFiles,\n };\n}\n\nasync function collectRouteFiles(packageDir: string): Promise<string[]> {\n return glob(['src/routes/**/*.{ts,svelte}', 'routes/**/*.{ts,svelte}'], {\n cwd: packageDir,\n expandDirectories: false,\n absolute: true,\n onlyFiles: true,\n ignore: ['**/node_modules/**', '**/.svelte-kit/**'],\n });\n}\n\nasync function collectMigrations(packageDir: string): Promise<string[]> {\n return glob(['migrations/**/*', 'src/migrations/**/*'], {\n cwd: packageDir,\n expandDirectories: false,\n absolute: true,\n onlyFiles: true,\n ignore: ['**/node_modules/**'],\n });\n}\n\nasync function collectExamples(\n packageDir: string,\n docs: WorkbenchDocumentSummary[],\n): Promise<WorkbenchExampleSummary[]> {\n const fileMatches = await glob(\n [\n 'examples/**/*.{ts,tsx,svelte,md}',\n 'src/**/*.{example,stories}.{ts,tsx,svelte}',\n 'src/**/examples/**/*.{ts,tsx,svelte,md}',\n ],\n {\n cwd: packageDir,\n expandDirectories: false,\n absolute: true,\n onlyFiles: true,\n ignore: ['**/node_modules/**', '**/dist/**', '**/.svelte-kit/**'],\n },\n );\n\n const fileExamples = fileMatches.slice(0, 16).map((path, index) => ({\n id: `file:${index}`,\n title: relative(packageDir, path),\n path,\n source: 'file' as const,\n }));\n\n const readme = docs.find((doc) => doc.kind === 'readme');\n const readmeExamples = readme?.content\n ? extractReadmeCodeBlocks(readme.content).slice(0, 8)\n : [];\n\n return [...fileExamples, ...readmeExamples];\n}\n\nfunction extractReadmeCodeBlocks(content: string): WorkbenchExampleSummary[] {\n const examples: WorkbenchExampleSummary[] = [];\n const blockPattern = /```([A-Za-z0-9_-]*)\\n([\\s\\S]*?)```/g;\n let index = 0;\n let match = blockPattern.exec(content);\n\n while (match) {\n const language = match[1] || undefined;\n const code = match[2] || '';\n if (!code.trim()) {\n match = blockPattern.exec(content);\n continue;\n }\n\n const { content: trimmedCode } = truncate(code, EXAMPLE_LIMIT);\n examples.push({\n id: `readme:${index}`,\n title: `README example ${index + 1}`,\n language,\n code: trimmedCode,\n source: 'readme',\n });\n index += 1;\n match = blockPattern.exec(content);\n }\n\n return examples;\n}\n\nasync function summarizePackage(\n input: WorkbenchPackageDir,\n rootDir: string,\n): Promise<WorkbenchPackageSummary> {\n const { packageDir, packageJson, source } = input;\n const packageName =\n packageJson.name || relative(rootDir, packageDir) || packageDir;\n const docs = [\n readDocument(packageDir, 'README.md', 'readme'),\n readDocument(packageDir, 'AGENTS.md', 'agents'),\n readDocument(packageDir, 'CHANGELOG.md', 'changelog'),\n ].filter((doc): doc is WorkbenchDocumentSummary => Boolean(doc));\n const examples = await collectExamples(packageDir, docs);\n const knowledge = readKnowledgeSummary(packageDir);\n const routeFiles = await collectRouteFiles(packageDir);\n const migrations = await collectMigrations(packageDir);\n const scripts = stringRecord(packageJson.scripts);\n const api = readApiSummary(\n packageDir,\n rootDir,\n packageName,\n knowledge,\n routeFiles,\n );\n\n return {\n name: packageName,\n version: packageJson.version,\n description: packageJson.description,\n source,\n directory: packageDir,\n relativeDirectory: relative(rootDir, packageDir) || '.',\n scripts,\n dependencies: stringRecord(packageJson.dependencies),\n devDependencies: stringRecord(packageJson.devDependencies),\n peerDependencies: stringRecord(packageJson.peerDependencies),\n smrtDependencies: smrtDependencyNames(packageJson),\n sdkDependencies: sdkDependencyNames(packageJson),\n exportKeys: exportKeys(packageJson.exports),\n docs,\n examples,\n knowledge,\n api,\n migrations,\n routeModuleCount: 0,\n routeCount: 0,\n playgroundEntryCount: 0,\n recommendedCommands: Object.keys(scripts)\n .filter((scriptName) =>\n ['test', 'typecheck', 'check', 'build', 'dev', 'workbench'].includes(\n scriptName,\n ),\n )\n .sort()\n .map((scriptName) => ({\n id: commandIdForScript(packageName, scriptName),\n label: scriptName,\n command: `pnpm --filter ${packageName} ${scriptName}`,\n })),\n };\n}\n\nasync function discoverWorkspacePackageDirs(\n workspaceRoot: string,\n): Promise<WorkbenchPackageDir[]> {\n const packageJsonPaths = await glob('packages/*/package.json', {\n cwd: workspaceRoot,\n expandDirectories: false,\n absolute: true,\n onlyFiles: true,\n });\n\n return packageJsonPaths\n .map((packageJsonPath) => ({\n packageDir: dirname(packageJsonPath),\n packageJson: readJson<PackageJsonLike>(packageJsonPath),\n source: 'workspace' as const,\n }))\n .filter(\n (item) =>\n typeof item.packageJson.name === 'string' &&\n item.packageJson.name.startsWith('@happyvertical/smrt-'),\n )\n .sort((left, right) =>\n (left.packageJson.name || '').localeCompare(right.packageJson.name || ''),\n );\n}\n\nfunction resolveNodeModulePackageDir(\n projectRoot: string,\n packageName: string,\n): string | null {\n const packageJsonPath = join(\n projectRoot,\n 'node_modules',\n packageName,\n 'package.json',\n );\n return existsSync(packageJsonPath) ? dirname(packageJsonPath) : null;\n}\n\nasync function discoverConsumerPackageDirs(\n projectRoot: string,\n): Promise<WorkbenchPackageDir[]> {\n const packageJsonPath = join(projectRoot, 'package.json');\n if (!existsSync(packageJsonPath)) {\n return [];\n }\n\n const packageJson = readJson<PackageJsonLike>(packageJsonPath);\n const dependencies = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n ...packageJson.peerDependencies,\n };\n const packageDirs: WorkbenchPackageDir[] = [];\n\n packageDirs.push({\n packageDir: projectRoot,\n packageJson,\n source: packageJson.name?.startsWith('@happyvertical/smrt-')\n ? 'package'\n : 'app',\n });\n\n for (const dependencyName of Object.keys(dependencies).sort()) {\n if (\n !dependencyName.startsWith('@happyvertical/smrt-') ||\n dependencyName === '@happyvertical/smrt-workbench'\n ) {\n continue;\n }\n\n const packageDir = resolveNodeModulePackageDir(projectRoot, dependencyName);\n if (!packageDir) {\n continue;\n }\n\n packageDirs.push({\n packageDir,\n packageJson: readJson<PackageJsonLike>(join(packageDir, 'package.json')),\n source: 'package',\n });\n }\n\n return packageDirs;\n}\n\nfunction resolvePackageByName(\n workspaceRoot: string,\n packageName: string,\n): string | null {\n const packagesDir = join(workspaceRoot, 'packages');\n if (!existsSync(packagesDir)) {\n return null;\n }\n\n const packageJsonPaths = globSync('*/package.json', {\n cwd: packagesDir,\n expandDirectories: false,\n absolute: true,\n onlyFiles: true,\n });\n\n for (const packageJsonPath of packageJsonPaths) {\n const packageJson = readJson<PackageJsonLike>(packageJsonPath);\n if (packageJson.name === packageName) {\n return dirname(packageJsonPath);\n }\n }\n\n return null;\n}\n\nexport function resolveWorkbenchScope(\n cwd = process.cwd(),\n options: Pick<\n SmrtWorkbenchVitePluginOptions,\n 'projectRoot' | 'workspaceRoot' | 'packageName'\n > = {},\n): WorkbenchScopeResolution {\n const resolvedCwd = resolve(cwd);\n const requestedProjectRoot = options.projectRoot\n ? resolve(options.projectRoot)\n : undefined;\n const workspaceRoot =\n options.workspaceRoot ||\n (requestedProjectRoot\n ? findSmrtWorkbenchWorkspaceRoot(requestedProjectRoot)\n : null) ||\n findSmrtWorkbenchWorkspaceRoot(resolvedCwd);\n\n if (workspaceRoot) {\n const packageDir =\n (options.packageName\n ? resolvePackageByName(workspaceRoot, options.packageName)\n : null) ||\n findPackageDir(resolvedCwd, workspaceRoot) ||\n undefined;\n const packageJson = packageDir\n ? readJsonIfExists<PackageJsonLike>(join(packageDir, 'package.json'))\n : null;\n const packageName = options.packageName || packageJson?.name;\n const mode: SmrtWorkbenchScopeMode = packageName ? 'package' : 'workspace';\n\n return {\n mode,\n cwd: resolvedCwd,\n projectRoot: workspaceRoot,\n workspaceRoot,\n packageName,\n packageDir,\n packageManager: 'pnpm',\n };\n }\n\n const projectRoot = requestedProjectRoot || findProjectRoot(resolvedCwd);\n return {\n mode: 'consumer',\n cwd: resolvedCwd,\n projectRoot,\n packageName: options.packageName,\n packageManager: detectPackageManager(projectRoot),\n };\n}\n\nexport async function buildWorkbenchProject(\n scope: WorkbenchScopeResolution,\n): Promise<SmrtWorkbenchProject> {\n const packageDirs =\n scope.mode === 'consumer'\n ? await discoverConsumerPackageDirs(scope.projectRoot)\n : await discoverWorkspacePackageDirs(scope.projectRoot);\n\n const filteredPackageDirs = scope.packageName\n ? packageDirs.filter((item) => item.packageJson.name === scope.packageName)\n : packageDirs;\n\n const packages = await Promise.all(\n filteredPackageDirs.map((item) =>\n summarizePackage(item, scope.projectRoot),\n ),\n );\n\n return {\n generatedAt: new Date().toISOString(),\n scope,\n packages,\n };\n}\n\nexport async function discoverWorkspaceWorkbenches(\n workspaceRoot: string,\n packagesPattern = 'packages/*/src/workbench.ts',\n): Promise<DiscoveredWorkbenchTarget[]> {\n const matches = await glob(packagesPattern, {\n cwd: workspaceRoot,\n expandDirectories: false,\n absolute: true,\n onlyFiles: true,\n });\n\n return matches.sort().map((sourcePath) => {\n const packageDir = dirname(dirname(sourcePath));\n const packageJsonPath = join(packageDir, 'package.json');\n const packageJson = readJson<PackageJsonLike>(packageJsonPath);\n const runtimePath = join(packageDir, 'dist', 'workbench.js');\n\n return {\n packageName: packageJson.name,\n source: 'workspace' as const,\n sourcePath,\n runtimePath: existsSync(runtimePath) ? runtimePath : undefined,\n };\n });\n}\n\nexport async function discoverInstalledWorkbenches(\n projectRoot = process.cwd(),\n): Promise<DiscoveredWorkbenchTarget[]> {\n const packageJsonPath = join(projectRoot, 'package.json');\n if (!existsSync(packageJsonPath)) {\n return [];\n }\n\n const packageJson = readJson<PackageJsonLike>(packageJsonPath);\n const dependencies = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n ...packageJson.peerDependencies,\n };\n const discovered: DiscoveredWorkbenchTarget[] = [];\n\n for (const dependencyName of Object.keys(dependencies).sort()) {\n if (\n !dependencyName.startsWith('@happyvertical/smrt-') ||\n dependencyName === '@happyvertical/smrt-workbench'\n ) {\n continue;\n }\n\n const packageDir = resolveNodeModulePackageDir(projectRoot, dependencyName);\n if (!packageDir) {\n continue;\n }\n\n const dependencyPackageJson = readJson<PackageJsonLike>(\n join(packageDir, 'package.json'),\n );\n if (exportKeys(dependencyPackageJson.exports).includes('./workbench')) {\n discovered.push({\n packageName: dependencyName,\n source: 'package',\n importSpecifier: `${dependencyName}/workbench`,\n });\n }\n }\n\n return discovered;\n}\n\nexport async function discoverWorkbenchTargets(\n projectRoot = process.cwd(),\n mode: 'auto' | 'workspace' | 'consumer' = 'auto',\n localWorkbenchPath = 'src/workbench.ts',\n packageName?: string,\n packagesPattern = 'packages/*/src/workbench.ts',\n): Promise<DiscoveredWorkbenchTarget[]> {\n const effectiveMode =\n mode === 'auto' ? detectWorkbenchMode(projectRoot) : mode;\n\n if (effectiveMode === 'workspace') {\n const workspaceRoot =\n mode === 'workspace'\n ? findWorkspaceRoot(projectRoot)\n : findSmrtWorkbenchWorkspaceRoot(projectRoot);\n if (!workspaceRoot) {\n return [];\n }\n\n const targets = await discoverWorkspaceWorkbenches(\n workspaceRoot,\n packagesPattern,\n );\n return packageName\n ? targets.filter((target) => target.packageName === packageName)\n : targets;\n }\n\n const targets = await discoverInstalledWorkbenches(projectRoot);\n const localPath = resolve(projectRoot, localWorkbenchPath);\n if (existsSync(localPath)) {\n const localPackageJson = readJsonIfExists<PackageJsonLike>(\n join(projectRoot, 'package.json'),\n );\n targets.push({\n packageName: localPackageJson?.name,\n source: 'app',\n sourcePath: localPath,\n });\n }\n\n return packageName\n ? targets.filter((target) => target.packageName === packageName)\n : targets;\n}\n\nexport async function importWorkbenchModule(\n input: string,\n): Promise<SmrtWorkbenchModule[]> {\n const imported =\n isAbsolute(input) || input.startsWith('.')\n ? await importPathModule(resolve(input))\n : await import(/* @vite-ignore */ input);\n\n const module = imported.default ?? imported.workbench ?? imported;\n return module && typeof module === 'object'\n ? coerceWorkbenchModules(module as SmrtWorkbenchModule)\n : [];\n}\n\nasync function importPathModule(inputPath: string): Promise<unknown> {\n if (!TS_SOURCE_EXTENSIONS.has(extname(inputPath))) {\n return import(/* @vite-ignore */ pathToFileURL(inputPath).href);\n }\n\n let tsxApiPath: string;\n try {\n tsxApiPath = require.resolve('tsx/esm/api');\n } catch (tsxError) {\n throw new Error(\n `Failed to load workbench module from ${inputPath}: source workbench discovery requires the \"tsx\" package.`,\n { cause: tsxError },\n );\n }\n\n const { tsImport } = await import(\n /* @vite-ignore */ pathToFileURL(tsxApiPath).href\n );\n return tsImport(pathToFileURL(inputPath).href, {\n parentURL: import.meta.url,\n });\n}\n\nexport function describeWorkbenchSource(\n target: DiscoveredWorkbenchTarget,\n cwd = process.cwd(),\n): string {\n if (target.source === 'package') {\n return target.importSpecifier || target.packageName || 'installed package';\n }\n\n const path = target.sourcePath || target.runtimePath;\n return path ? relative(cwd, path) || '.' : target.source;\n}\n"],"mappings":"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AG,cACL;CAGF,OAAO;EACL;GACE,MAAM;GACN,MAAM;GACN,UAAU;GACV,UAAU;GACV,aAAa;EACf;EACA;GACE,MAAM;GACN,MAAM;GACN,UAAU;GACV,UAAU;GACV,aAAa;EACf;EACA,GAAG;CACL;AACF;AAEA,SAAS,oBACP,QACA,QACgC;CAShC,OAAO,CACL;EACE,MAAM;EACN,MAAM;EACN,UAAU;EACV,UAAU;EACV,aACE;CACJ,GACA,GAjBa,yBAAyB,QAAQ,QAAQ,QAAQ,CAAA,CAAE,KAC/D,WAAW;EACV,GAAG;EACH,MAAM,KAAK,MAAM;EACjB,UAAU;CACZ,EAYG,CACL;AACF;AAEA,SAAS,kBACP,QACA,QACgC;CAChC,IAAI,WAAW,QACb,OAAO;EACL;GACE,MAAM;GACN,MAAM;GACN,UAAU;GACV,UAAU;GACV,aAAa;GACb,cAAc;EAChB;EACA;GACE,MAAM;GACN,MAAM;GACN,UAAU;GACV,UAAU;GACV,aAAa;GACb,cAAc;EAChB;EACA;GACE,MAAM;GACN,MAAM;GACN,UAAU;GACV,UAAU;GACV,aAAa;EACf;EACA;GACE,MAAM;GACN,MAAM;GACN,UAAU;GACV,UAAU;GACV,aAAa;EACf;CACF;CAGF,IAAI,WAAW,OACb,OAAO,CACL;EACE,MAAM;EACN,MAAM;EACN,UAAU;EACV,UAAU;EACV,aAAa;CACf,GACA;EACE,MAAM;EACN,MAAM;EACN,UAAU;EACV,UAAU;EACV,aAAa;CACf,CACF;CAGF,IAAI,WAAW,UACb,OAAO,CACL;EACE,MAAM;EACN,MAAM;EACN,UAAU;EACV,UAAU;EACV,aAAa;CACf,CACF;CAGF,IAAI,WAAW,UACb,OAAO,wBAAwB,QAAQ,SAAS,OAAO;CAGzD,OAAO,CACL;EACE,MAAM;EACN,MAAM;EACN,UAAU;EACV,UAAU;EACV,aAAa;CACf,GACA,GAAG,wBAAwB,QAAQ,SAAS,UAAU,CACxD;AACF;AAEA,SAAS,oBACP,SACA,SACgC;CAChC,OAAO,CACL;EACE,MAAM;EACN,MAAM;EACN,UAAU;EACV,UAAU;EACV,aAAa;CACf,GACA;EACE,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"}
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EACV,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,EAEpB,8BAA8B,EAY9B,4BAA4B,EAC5B,wBAAwB,EACzB,MAAM,YAAY,CAAC;AA0BpB,wBAAgB,iBAAiB,CAAC,QAAQ,SAAgB,GAAG,MAAM,GAAG,IAAI,CAczE;AAED,wBAAgB,8BAA8B,CAC5C,QAAQ,SAAgB,GACvB,MAAM,GAAG,IAAI,CAef;AAED,wBAAgB,eAAe,CAAC,QAAQ,SAAgB,GAAG,MAAM,CAchE;AAED,wBAAgB,cAAc,CAC5B,QAAQ,SAAgB,EACxB,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,GAAG,IAAI,CAoBf;AAED,wBAAgB,mBAAmB,CACjC,WAAW,SAAgB,GAC1B,WAAW,GAAG,UAAU,CAE1B;AA48BD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GAC3C,4BAA4B,EAAE,CAmDhC;AAoaD,wBAAgB,qBAAqB,CACnC,GAAG,SAAgB,EACnB,OAAO,GAAE,IAAI,CACX,8BAA8B,EAC9B,aAAa,GAAG,eAAe,GAAG,aAAa,CAC3C,GACL,wBAAwB,CA4C1B;AAED,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,oBAAoB,CAAC,CAqB/B;AAED,wBAAsB,4BAA4B,CAChD,aAAa,EAAE,MAAM,EACrB,eAAe,SAAgC,GAC9C,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAoBtC;AAED,wBAAsB,4BAA4B,CAChD,WAAW,SAAgB,GAC1B,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAwCtC;AAED,wBAAsB,wBAAwB,CAC5C,WAAW,SAAgB,EAC3B,IAAI,GAAE,MAAM,GAAG,WAAW,GAAG,UAAmB,EAChD,kBAAkB,SAAqB,EACvC,WAAW,CAAC,EAAE,MAAM,EACpB,eAAe,SAAgC,GAC9C,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAsCtC;AAED,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAUhC;AAyBD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,yBAAyB,EACjC,GAAG,SAAgB,GAClB,MAAM,CAOR"}
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EACV,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,EAEpB,8BAA8B,EAY9B,4BAA4B,EAC5B,wBAAwB,EACzB,MAAM,YAAY,CAAC;AA0BpB,wBAAgB,iBAAiB,CAAC,QAAQ,SAAgB,GAAG,MAAM,GAAG,IAAI,CAczE;AAED,wBAAgB,8BAA8B,CAC5C,QAAQ,SAAgB,GACvB,MAAM,GAAG,IAAI,CAef;AAED,wBAAgB,eAAe,CAAC,QAAQ,SAAgB,GAAG,MAAM,CAchE;AAED,wBAAgB,cAAc,CAC5B,QAAQ,SAAgB,EACxB,aAAa,CAAC,EAAE,MAAM,GACrB,MAAM,GAAG,IAAI,CAoBf;AAED,wBAAgB,mBAAmB,CACjC,WAAW,SAAgB,GAC1B,WAAW,GAAG,UAAU,CAE1B;AA48BD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GAC3C,4BAA4B,EAAE,CAmDhC;AAyaD,wBAAgB,qBAAqB,CACnC,GAAG,SAAgB,EACnB,OAAO,GAAE,IAAI,CACX,8BAA8B,EAC9B,aAAa,GAAG,eAAe,GAAG,aAAa,CAC3C,GACL,wBAAwB,CA4C1B;AAED,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,oBAAoB,CAAC,CAqB/B;AAED,wBAAsB,4BAA4B,CAChD,aAAa,EAAE,MAAM,EACrB,eAAe,SAAgC,GAC9C,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAqBtC;AAED,wBAAsB,4BAA4B,CAChD,WAAW,SAAgB,GAC1B,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAwCtC;AAED,wBAAsB,wBAAwB,CAC5C,WAAW,SAAgB,EAC3B,IAAI,GAAE,MAAM,GAAG,WAAW,GAAG,UAAmB,EAChD,kBAAkB,SAAqB,EACvC,WAAW,CAAC,EAAE,MAAM,EACpB,eAAe,SAAgC,GAC9C,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAsCtC;AAED,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAUhC;AAyBD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,yBAAyB,EACjC,GAAG,SAAgB,GAClB,MAAM,CAOR"}
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  import { a as normalizeWorkbenchModule, i as mergeWorkbenchModules, n as defineWorkbenchModule, o as qualifyWorkbenchRouteId, t as coerceWorkbenchModules } from "./chunks/runtime-BTiu5fuP.js";
2
- import { a as discoverWorkbenchTargets, c as findProjectRoot, d as importWorkbenchModule, f as resolveWorkbenchScope, i as discoverInstalledWorkbenches, l as findSmrtWorkbenchWorkspaceRoot, n as describeWorkbenchSource, o as discoverWorkspaceWorkbenches, r as detectWorkbenchMode, s as findPackageDir, t as buildWorkbenchProject, u as findWorkspaceRoot } from "./chunks/discovery-BOoinKLR.js";
2
+ import { a as discoverWorkbenchTargets, c as findProjectRoot, d as importWorkbenchModule, f as resolveWorkbenchScope, i as discoverInstalledWorkbenches, l as findSmrtWorkbenchWorkspaceRoot, n as describeWorkbenchSource, o as discoverWorkspaceWorkbenches, r as detectWorkbenchMode, s as findPackageDir, t as buildWorkbenchProject, u as findWorkspaceRoot } from "./chunks/discovery-CdP0zOmb.js";
3
3
  export { buildWorkbenchProject, coerceWorkbenchModules, defineWorkbenchModule, describeWorkbenchSource, detectWorkbenchMode, discoverInstalledWorkbenches, discoverWorkbenchTargets, discoverWorkspaceWorkbenches, findPackageDir, findProjectRoot, findSmrtWorkbenchWorkspaceRoot, findWorkspaceRoot, importWorkbenchModule, mergeWorkbenchModules, normalizeWorkbenchModule, qualifyWorkbenchRouteId, resolveWorkbenchScope };
@@ -1 +1 @@
1
- {"version":3,"file":"vite.d.ts","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AAQlD,OAAO,KAAK,EAEV,8BAA8B,EAC/B,MAAM,YAAY,CAAC;AAEpB,QAAA,MAAM,mCAAmC,mCAAmC,CAAC;AA0L7E,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,8BAAmC,GAC3C,MAAM,CAgGR;AAED,OAAO,EAAE,mCAAmC,EAAE,CAAC"}
1
+ {"version":3,"file":"vite.d.ts","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AAQlD,OAAO,KAAK,EAEV,8BAA8B,EAC/B,MAAM,YAAY,CAAC;AAEpB,QAAA,MAAM,mCAAmC,mCAAmC,CAAC;AA2L7E,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,8BAAmC,GAC3C,MAAM,CAgGR;AAED,OAAO,EAAE,mCAAmC,EAAE,CAAC"}
package/dist/vite.js CHANGED
@@ -1,7 +1,7 @@
1
- import { a as discoverWorkbenchTargets, f as resolveWorkbenchScope, r as detectWorkbenchMode, t as buildWorkbenchProject, u as findWorkspaceRoot } from "./chunks/discovery-BOoinKLR.js";
1
+ import { a as discoverWorkbenchTargets, f as resolveWorkbenchScope, r as detectWorkbenchMode, t as buildWorkbenchProject, u as findWorkspaceRoot } from "./chunks/discovery-CdP0zOmb.js";
2
2
  import { existsSync, readFileSync } from "node:fs";
3
3
  import { dirname, isAbsolute, join, resolve } from "node:path";
4
- import fg from "fast-glob";
4
+ import { glob } from "tinyglobby";
5
5
  import { normalizePath } from "vite";
6
6
  //#region src/vite.ts
7
7
  var VIRTUAL_WORKBENCH_PROJECT_MODULE_ID = "virtual:smrt-workbench/project";
@@ -29,8 +29,9 @@ function dependencyNames(packageJson) {
29
29
  }).sort();
30
30
  }
31
31
  async function discoverWorkspacePlaygroundSpecifiers(workspaceRoot, packageName) {
32
- return (await fg("packages/*/src/svelte/playground.ts", {
32
+ return (await glob("packages/*/src/svelte/playground.ts", {
33
33
  cwd: workspaceRoot,
34
+ expandDirectories: false,
34
35
  absolute: true,
35
36
  onlyFiles: true
36
37
  })).sort().map((sourcePath) => {
package/dist/vite.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"vite.js","names":[],"sources":["../src/vite.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { dirname, isAbsolute, join, resolve } from 'node:path';\nimport fg from 'fast-glob';\nimport { normalizePath, type Plugin } from 'vite';\nimport {\n buildWorkbenchProject,\n detectWorkbenchMode,\n discoverWorkbenchTargets,\n findWorkspaceRoot,\n resolveWorkbenchScope,\n} from './discovery.js';\nimport type {\n DiscoveredWorkbenchTarget,\n SmrtWorkbenchVitePluginOptions,\n} from './types.js';\n\nconst VIRTUAL_WORKBENCH_PROJECT_MODULE_ID = 'virtual:smrt-workbench/project';\nconst RESOLVED_VIRTUAL_WORKBENCH_PROJECT_MODULE_ID = `\\0${VIRTUAL_WORKBENCH_PROJECT_MODULE_ID}`;\n\ninterface PlaygroundSpecifier {\n packageName?: string;\n specifier: string;\n}\n\nfunction toViteImportSpecifier(specifier: string): string {\n if (!isAbsolute(specifier)) {\n return specifier;\n }\n\n return `/@fs/${normalizePath(specifier)}`;\n}\n\nfunction targetSpecifier(target: DiscoveredWorkbenchTarget): string | null {\n return (\n target.importSpecifier || target.sourcePath || target.runtimePath || null\n );\n}\n\nfunction readJson(path: string): Record<string, unknown> {\n return JSON.parse(readFileSync(path, 'utf-8')) as Record<string, unknown>;\n}\n\nfunction exportKeys(exportsField: unknown): string[] {\n if (typeof exportsField === 'string') {\n return ['.'];\n }\n\n if (\n exportsField &&\n typeof exportsField === 'object' &&\n !Array.isArray(exportsField)\n ) {\n return Object.keys(exportsField).sort();\n }\n\n return [];\n}\n\nfunction dependencyNames(packageJson: Record<string, unknown>): string[] {\n return Object.keys({\n ...(packageJson.dependencies as Record<string, string> | undefined),\n ...(packageJson.devDependencies as Record<string, string> | undefined),\n ...(packageJson.peerDependencies as Record<string, string> | undefined),\n }).sort();\n}\n\nasync function discoverWorkspacePlaygroundSpecifiers(\n workspaceRoot: string,\n packageName?: string,\n): Promise<PlaygroundSpecifier[]> {\n const matches = await fg('packages/*/src/svelte/playground.ts', {\n cwd: workspaceRoot,\n absolute: true,\n onlyFiles: true,\n });\n\n return matches\n .sort()\n .map((sourcePath) => {\n const packageDir = dirname(dirname(dirname(sourcePath)));\n const packageJson = readJson(join(packageDir, 'package.json'));\n return {\n packageName:\n typeof packageJson.name === 'string' ? packageJson.name : undefined,\n specifier: normalizePath(sourcePath),\n };\n })\n .filter((target) =>\n packageName ? target.packageName === packageName : true,\n );\n}\n\nasync function discoverConsumerPlaygroundSpecifiers(\n projectRoot: string,\n localPlaygroundPath: string,\n packageName?: string,\n): Promise<PlaygroundSpecifier[]> {\n const packageJsonPath = resolve(projectRoot, 'package.json');\n if (!existsSync(packageJsonPath)) {\n return [];\n }\n\n const packageJson = readJson(packageJsonPath);\n const specifiers: PlaygroundSpecifier[] = [];\n\n for (const dependencyName of dependencyNames(packageJson)) {\n if (\n !dependencyName.startsWith('@happyvertical/smrt-') ||\n dependencyName === '@happyvertical/smrt-playground' ||\n dependencyName === '@happyvertical/smrt-workbench'\n ) {\n continue;\n }\n\n if (packageName && dependencyName !== packageName) {\n continue;\n }\n\n const dependencyPackageJsonPath = resolve(\n projectRoot,\n 'node_modules',\n dependencyName,\n 'package.json',\n );\n if (!existsSync(dependencyPackageJsonPath)) {\n continue;\n }\n\n const dependencyPackageJson = readJson(dependencyPackageJsonPath);\n if (exportKeys(dependencyPackageJson.exports).includes('./playground')) {\n specifiers.push({\n packageName: dependencyName,\n specifier: `${dependencyName}/playground`,\n });\n }\n }\n\n const localPlayground = resolve(projectRoot, localPlaygroundPath);\n if (!packageName && existsSync(localPlayground)) {\n specifiers.push({\n specifier: normalizePath(localPlayground),\n });\n }\n\n return specifiers;\n}\n\nfunction buildVirtualModuleCode(\n projectJson: string,\n workbenchSpecifiers: string[],\n playgroundSpecifiers: string[],\n): string {\n const workbenchImports = workbenchSpecifiers\n .map(\n (specifier, index) =>\n `import workbench${index} from ${JSON.stringify(toViteImportSpecifier(specifier))};`,\n )\n .join('\\n');\n const playgroundImports = playgroundSpecifiers\n .map(\n (specifier, index) =>\n `import playground${index} from ${JSON.stringify(toViteImportSpecifier(specifier))};`,\n )\n .join('\\n');\n const workbenchList = workbenchSpecifiers\n .map((_, index) => `...toModules(workbench${index})`)\n .join(', ');\n const playgroundList = playgroundSpecifiers\n .map((_, index) => `...toModules(playground${index})`)\n .join(', ');\n\n return `${workbenchImports}\n${playgroundImports}\n\nconst toModules = (value) => {\n if (!value) return [];\n if (Array.isArray(value)) return value.filter(Boolean);\n if (Array.isArray(value.modules)) return value.modules.filter(Boolean);\n return [value];\n};\n\nexport const workbenchProject = ${projectJson};\nexport const workbenchModules = [${workbenchList}].filter(Boolean);\nexport const playgroundModules = [${playgroundList}].filter(Boolean);\nexport default { workbenchProject, workbenchModules, playgroundModules };\n`;\n}\n\nfunction envValue(name: string): string | undefined {\n const value = process.env[name];\n return value && value.length > 0 ? value : undefined;\n}\n\nfunction addWatchFileIfExists(\n context: { addWatchFile(path: string): void },\n path: string,\n) {\n if (existsSync(path)) {\n context.addWatchFile(path);\n }\n}\n\nexport function smrtWorkbenchVitePlugin(\n options: SmrtWorkbenchVitePluginOptions = {},\n): Plugin {\n return {\n name: 'smrt-workbench-vite-plugin',\n enforce: 'pre',\n resolveId(id) {\n if (id === VIRTUAL_WORKBENCH_PROJECT_MODULE_ID) {\n return RESOLVED_VIRTUAL_WORKBENCH_PROJECT_MODULE_ID;\n }\n return null;\n },\n async load(id) {\n if (id !== RESOLVED_VIRTUAL_WORKBENCH_PROJECT_MODULE_ID) {\n return null;\n }\n\n const cwd =\n options.cwd || envValue('SMRT_WORKBENCH_CWD') || process.cwd();\n const projectRoot =\n options.projectRoot || envValue('SMRT_WORKBENCH_PROJECT_ROOT') || cwd;\n const packageName =\n options.packageName || envValue('SMRT_WORKBENCH_PACKAGE');\n const scope = resolveWorkbenchScope(cwd, {\n projectRoot,\n workspaceRoot: options.workspaceRoot,\n packageName,\n });\n const effectiveMode =\n options.mode === 'auto' || !options.mode\n ? detectWorkbenchMode(scope.projectRoot)\n : options.mode;\n const project = await buildWorkbenchProject(scope);\n const workbenchTargets = await discoverWorkbenchTargets(\n scope.projectRoot,\n effectiveMode,\n options.localWorkbenchPath || 'src/workbench.ts',\n scope.packageName,\n options.packagesPattern,\n );\n const playgroundTargetSpecifiers =\n effectiveMode === 'workspace'\n ? await discoverWorkspacePlaygroundSpecifiers(\n scope.projectRoot,\n scope.packageName,\n )\n : await discoverConsumerPlaygroundSpecifiers(\n scope.projectRoot,\n options.localPlaygroundPath || 'src/playground.ts',\n scope.packageName,\n );\n const workbenchSpecifiers = workbenchTargets\n .map(targetSpecifier)\n .filter((specifier): specifier is string => Boolean(specifier));\n const playgroundSpecifiers = playgroundTargetSpecifiers.map(\n (target) => target.specifier,\n );\n\n addWatchFileIfExists(this, resolve(scope.projectRoot, 'package.json'));\n addWatchFileIfExists(\n this,\n resolve(scope.projectRoot, 'pnpm-workspace.yaml'),\n );\n\n const workspaceRoot =\n options.workspaceRoot || findWorkspaceRoot(scope.projectRoot);\n if (workspaceRoot) {\n addWatchFileIfExists(\n this,\n resolve(workspaceRoot, 'pnpm-workspace.yaml'),\n );\n }\n\n for (const packageSummary of project.packages) {\n if (packageSummary.directory) {\n addWatchFileIfExists(\n this,\n resolve(packageSummary.directory, 'package.json'),\n );\n }\n }\n\n for (const specifier of [\n ...workbenchSpecifiers,\n ...playgroundSpecifiers,\n ]) {\n if (isAbsolute(specifier)) {\n this.addWatchFile(specifier);\n }\n }\n\n return buildVirtualModuleCode(\n JSON.stringify(project),\n workbenchSpecifiers,\n playgroundSpecifiers,\n );\n },\n };\n}\n\nexport { VIRTUAL_WORKBENCH_PROJECT_MODULE_ID };\n"],"mappings":";;;;;;AAgBA,IAAM,sCAAsC;AAC5C,IAAM,+CAA+C,KAAK;AAO1D,SAAS,sBAAsB,WAA2B;CACxD,IAAI,CAAC,WAAW,SAAS,GACvB,OAAO;CAGT,OAAO,QAAQ,cAAc,SAAS;AACxC;AAEA,SAAS,gBAAgB,QAAkD;CACzE,OACE,OAAO,mBAAmB,OAAO,cAAc,OAAO,eAAe;AAEzE;AAEA,SAAS,SAAS,MAAuC;CACvD,OAAO,KAAK,MAAM,aAAa,MAAM,OAAO,CAAC;AAC/C;AAEA,SAAS,WAAW,cAAiC;CACnD,IAAI,OAAO,iBAAiB,UAC1B,OAAO,CAAC,GAAG;CAGb,IACE,gBACA,OAAO,iBAAiB,YACxB,CAAC,MAAM,QAAQ,YAAY,GAE3B,OAAO,OAAO,KAAK,YAAY,CAAA,CAAE,KAAK;CAGxC,OAAO,CAAC;AACV;AAEA,SAAS,gBAAgB,aAAgD;CACvE,OAAO,OAAO,KAAK;EACjB,GAAI,YAAY;EAChB,GAAI,YAAY;EAChB,GAAI,YAAY;CAClB,CAAC,CAAA,CAAE,KAAK;AACV;AAEA,eAAe,sCACb,eACA,aACgC;CAOhC,QAAO,MANe,GAAG,uCAAuC;EAC9D,KAAK;EACL,UAAU;EACV,WAAW;CACb,CAAC,EAAA,CAGE,KAAK,CAAA,CACL,KAAK,eAAe;EAEnB,MAAM,cAAc,SAAS,KADV,QAAQ,QAAQ,QAAQ,UAAU,CAAC,CACpB,GAAY,cAAc,CAAC;EAC7D,OAAO;GACL,aACE,OAAO,YAAY,SAAS,WAAW,YAAY,OAAO,KAAA;GAC5D,WAAW,cAAc,UAAU;EACrC;CACF,CAAC,CAAA,CACA,QAAQ,WACP,cAAc,OAAO,gBAAgB,cAAc,IACrD;AACJ;AAEA,eAAe,qCACb,aACA,qBACA,aACgC;CAChC,MAAM,kBAAkB,QAAQ,aAAa,cAAc;CAC3D,IAAI,CAAC,WAAW,eAAe,GAC7B,OAAO,CAAC;CAGV,MAAM,cAAc,SAAS,eAAe;CAC5C,MAAM,aAAoC,CAAC;CAE3C,KAAA,MAAW,kBAAkB,gBAAgB,WAAW,GAAG;EACzD,IACE,CAAC,eAAe,WAAW,sBAAsB,KACjD,mBAAmB,oCACnB,mBAAmB,iCAEnB;EAGF,IAAI,eAAe,mBAAmB,aACpC;EAGF,MAAM,4BAA4B,QAChC,aACA,gBACA,gBACA,cACF;EACA,IAAI,CAAC,WAAW,yBAAyB,GACvC;EAIF,IAAI,WAD0B,SAAS,yBACxB,CAAA,CAAsB,OAAO,CAAA,CAAE,SAAS,cAAc,GACnE,WAAW,KAAK;GACd,aAAa;GACb,WAAW,GAAG,eAAc;EAC9B,CAAC;CAEL;CAEA,MAAM,kBAAkB,QAAQ,aAAa,mBAAmB;CAChE,IAAI,CAAC,eAAe,WAAW,eAAe,GAC5C,WAAW,KAAK,EACd,WAAW,cAAc,eAAe,EAC1C,CAAC;CAGH,OAAO;AACT;AAEA,SAAS,uBACP,aACA,qBACA,sBACQ;CAoBR,OAAO,GAnBkB,oBACtB,KACE,WAAW,UACV,mBAAmB,MAAK,QAAS,KAAK,UAAU,sBAAsB,SAAS,CAAC,EAAC,EACrF,CAAA,CACC,KAAK,IAcE,EAAgB;EAbA,qBACvB,KACE,WAAW,UACV,oBAAoB,MAAK,QAAS,KAAK,UAAU,sBAAsB,SAAS,CAAC,EAAC,EACtF,CAAA,CACC,KAAK,IASR,EAAiB;;;;;;;;;kCASe,YAAW;mCAjBrB,oBACnB,KAAK,GAAG,UAAU,yBAAyB,MAAK,EAAG,CAAA,CACnD,KAAK,IAgByB,EAAa;oCAfvB,qBACpB,KAAK,GAAG,UAAU,0BAA0B,MAAK,EAAG,CAAA,CACpD,KAAK,IAc0B,EAAc;;;AAGlD;AAEA,SAAS,SAAS,MAAkC;CAClD,MAAM,QAAQ,QAAQ,IAAI;CAC1B,OAAO,SAAS,MAAM,SAAS,IAAI,QAAQ,KAAA;AAC7C;AAEA,SAAS,qBACP,SACA,MACA;CACA,IAAI,WAAW,IAAI,GACjB,QAAQ,aAAa,IAAI;AAE7B;AAEO,SAAS,wBACd,UAA0C,CAAC,GACnC;CACR,OAAO;EACL,MAAM;EACN,SAAS;EACT,UAAU,IAAI;GACZ,IAAI,OAAA,kCACF,OAAO;GAET,OAAO;EACT;EACA,MAAM,KAAK,IAAI;GACb,IAAI,OAAO,8CACT,OAAO;GAGT,MAAM,MACJ,QAAQ,OAAO,SAAS,oBAAoB,KAAK,QAAQ,IAAI;GAC/D,MAAM,cACJ,QAAQ,eAAe,SAAS,6BAA6B,KAAK;GACpE,MAAM,cACJ,QAAQ,eAAe,SAAS,wBAAwB;GAC1D,MAAM,QAAQ,sBAAsB,KAAK;IACvC;IACA,eAAe,QAAQ;IACvB;GACF,CAAC;GACD,MAAM,gBACJ,QAAQ,SAAS,UAAU,CAAC,QAAQ,OAChC,oBAAoB,MAAM,WAAW,IACrC,QAAQ;GACd,MAAM,UAAU,MAAM,sBAAsB,KAAK;GACjD,MAAM,mBAAmB,MAAM,yBAC7B,MAAM,aACN,eACA,QAAQ,sBAAsB,oBAC9B,MAAM,aACN,QAAQ,eACV;GACA,MAAM,6BACJ,kBAAkB,cACd,MAAM,sCACJ,MAAM,aACN,MAAM,WACR,IACA,MAAM,qCACJ,MAAM,aACN,QAAQ,uBAAuB,qBAC/B,MAAM,WACR;GACN,MAAM,sBAAsB,iBACzB,IAAI,eAAe,CAAA,CACnB,QAAQ,cAAmC,QAAQ,SAAS,CAAC;GAChE,MAAM,uBAAuB,2BAA2B,KACrD,WAAW,OAAO,SACrB;GAEA,qBAAqB,MAAM,QAAQ,MAAM,aAAa,cAAc,CAAC;GACrE,qBACE,MACA,QAAQ,MAAM,aAAa,qBAAqB,CAClD;GAEA,MAAM,gBACJ,QAAQ,iBAAiB,kBAAkB,MAAM,WAAW;GAC9D,IAAI,eACF,qBACE,MACA,QAAQ,eAAe,qBAAqB,CAC9C;GAGF,KAAA,MAAW,kBAAkB,QAAQ,UACnC,IAAI,eAAe,WACjB,qBACE,MACA,QAAQ,eAAe,WAAW,cAAc,CAClD;GAIJ,KAAA,MAAW,aAAa,CACtB,GAAG,qBACH,GAAG,oBACL,GACE,IAAI,WAAW,SAAS,GACtB,KAAK,aAAa,SAAS;GAI/B,OAAO,uBACL,KAAK,UAAU,OAAO,GACtB,qBACA,oBACF;EACF;CACF;AACF"}
1
+ {"version":3,"file":"vite.js","names":[],"sources":["../src/vite.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { dirname, isAbsolute, join, resolve } from 'node:path';\nimport { glob } from 'tinyglobby';\nimport { normalizePath, type Plugin } from 'vite';\nimport {\n buildWorkbenchProject,\n detectWorkbenchMode,\n discoverWorkbenchTargets,\n findWorkspaceRoot,\n resolveWorkbenchScope,\n} from './discovery.js';\nimport type {\n DiscoveredWorkbenchTarget,\n SmrtWorkbenchVitePluginOptions,\n} from './types.js';\n\nconst VIRTUAL_WORKBENCH_PROJECT_MODULE_ID = 'virtual:smrt-workbench/project';\nconst RESOLVED_VIRTUAL_WORKBENCH_PROJECT_MODULE_ID = `\\0${VIRTUAL_WORKBENCH_PROJECT_MODULE_ID}`;\n\ninterface PlaygroundSpecifier {\n packageName?: string;\n specifier: string;\n}\n\nfunction toViteImportSpecifier(specifier: string): string {\n if (!isAbsolute(specifier)) {\n return specifier;\n }\n\n return `/@fs/${normalizePath(specifier)}`;\n}\n\nfunction targetSpecifier(target: DiscoveredWorkbenchTarget): string | null {\n return (\n target.importSpecifier || target.sourcePath || target.runtimePath || null\n );\n}\n\nfunction readJson(path: string): Record<string, unknown> {\n return JSON.parse(readFileSync(path, 'utf-8')) as Record<string, unknown>;\n}\n\nfunction exportKeys(exportsField: unknown): string[] {\n if (typeof exportsField === 'string') {\n return ['.'];\n }\n\n if (\n exportsField &&\n typeof exportsField === 'object' &&\n !Array.isArray(exportsField)\n ) {\n return Object.keys(exportsField).sort();\n }\n\n return [];\n}\n\nfunction dependencyNames(packageJson: Record<string, unknown>): string[] {\n return Object.keys({\n ...(packageJson.dependencies as Record<string, string> | undefined),\n ...(packageJson.devDependencies as Record<string, string> | undefined),\n ...(packageJson.peerDependencies as Record<string, string> | undefined),\n }).sort();\n}\n\nasync function discoverWorkspacePlaygroundSpecifiers(\n workspaceRoot: string,\n packageName?: string,\n): Promise<PlaygroundSpecifier[]> {\n const matches = await glob('packages/*/src/svelte/playground.ts', {\n cwd: workspaceRoot,\n expandDirectories: false,\n absolute: true,\n onlyFiles: true,\n });\n\n return matches\n .sort()\n .map((sourcePath) => {\n const packageDir = dirname(dirname(dirname(sourcePath)));\n const packageJson = readJson(join(packageDir, 'package.json'));\n return {\n packageName:\n typeof packageJson.name === 'string' ? packageJson.name : undefined,\n specifier: normalizePath(sourcePath),\n };\n })\n .filter((target) =>\n packageName ? target.packageName === packageName : true,\n );\n}\n\nasync function discoverConsumerPlaygroundSpecifiers(\n projectRoot: string,\n localPlaygroundPath: string,\n packageName?: string,\n): Promise<PlaygroundSpecifier[]> {\n const packageJsonPath = resolve(projectRoot, 'package.json');\n if (!existsSync(packageJsonPath)) {\n return [];\n }\n\n const packageJson = readJson(packageJsonPath);\n const specifiers: PlaygroundSpecifier[] = [];\n\n for (const dependencyName of dependencyNames(packageJson)) {\n if (\n !dependencyName.startsWith('@happyvertical/smrt-') ||\n dependencyName === '@happyvertical/smrt-playground' ||\n dependencyName === '@happyvertical/smrt-workbench'\n ) {\n continue;\n }\n\n if (packageName && dependencyName !== packageName) {\n continue;\n }\n\n const dependencyPackageJsonPath = resolve(\n projectRoot,\n 'node_modules',\n dependencyName,\n 'package.json',\n );\n if (!existsSync(dependencyPackageJsonPath)) {\n continue;\n }\n\n const dependencyPackageJson = readJson(dependencyPackageJsonPath);\n if (exportKeys(dependencyPackageJson.exports).includes('./playground')) {\n specifiers.push({\n packageName: dependencyName,\n specifier: `${dependencyName}/playground`,\n });\n }\n }\n\n const localPlayground = resolve(projectRoot, localPlaygroundPath);\n if (!packageName && existsSync(localPlayground)) {\n specifiers.push({\n specifier: normalizePath(localPlayground),\n });\n }\n\n return specifiers;\n}\n\nfunction buildVirtualModuleCode(\n projectJson: string,\n workbenchSpecifiers: string[],\n playgroundSpecifiers: string[],\n): string {\n const workbenchImports = workbenchSpecifiers\n .map(\n (specifier, index) =>\n `import workbench${index} from ${JSON.stringify(toViteImportSpecifier(specifier))};`,\n )\n .join('\\n');\n const playgroundImports = playgroundSpecifiers\n .map(\n (specifier, index) =>\n `import playground${index} from ${JSON.stringify(toViteImportSpecifier(specifier))};`,\n )\n .join('\\n');\n const workbenchList = workbenchSpecifiers\n .map((_, index) => `...toModules(workbench${index})`)\n .join(', ');\n const playgroundList = playgroundSpecifiers\n .map((_, index) => `...toModules(playground${index})`)\n .join(', ');\n\n return `${workbenchImports}\n${playgroundImports}\n\nconst toModules = (value) => {\n if (!value) return [];\n if (Array.isArray(value)) return value.filter(Boolean);\n if (Array.isArray(value.modules)) return value.modules.filter(Boolean);\n return [value];\n};\n\nexport const workbenchProject = ${projectJson};\nexport const workbenchModules = [${workbenchList}].filter(Boolean);\nexport const playgroundModules = [${playgroundList}].filter(Boolean);\nexport default { workbenchProject, workbenchModules, playgroundModules };\n`;\n}\n\nfunction envValue(name: string): string | undefined {\n const value = process.env[name];\n return value && value.length > 0 ? value : undefined;\n}\n\nfunction addWatchFileIfExists(\n context: { addWatchFile(path: string): void },\n path: string,\n) {\n if (existsSync(path)) {\n context.addWatchFile(path);\n }\n}\n\nexport function smrtWorkbenchVitePlugin(\n options: SmrtWorkbenchVitePluginOptions = {},\n): Plugin {\n return {\n name: 'smrt-workbench-vite-plugin',\n enforce: 'pre',\n resolveId(id) {\n if (id === VIRTUAL_WORKBENCH_PROJECT_MODULE_ID) {\n return RESOLVED_VIRTUAL_WORKBENCH_PROJECT_MODULE_ID;\n }\n return null;\n },\n async load(id) {\n if (id !== RESOLVED_VIRTUAL_WORKBENCH_PROJECT_MODULE_ID) {\n return null;\n }\n\n const cwd =\n options.cwd || envValue('SMRT_WORKBENCH_CWD') || process.cwd();\n const projectRoot =\n options.projectRoot || envValue('SMRT_WORKBENCH_PROJECT_ROOT') || cwd;\n const packageName =\n options.packageName || envValue('SMRT_WORKBENCH_PACKAGE');\n const scope = resolveWorkbenchScope(cwd, {\n projectRoot,\n workspaceRoot: options.workspaceRoot,\n packageName,\n });\n const effectiveMode =\n options.mode === 'auto' || !options.mode\n ? detectWorkbenchMode(scope.projectRoot)\n : options.mode;\n const project = await buildWorkbenchProject(scope);\n const workbenchTargets = await discoverWorkbenchTargets(\n scope.projectRoot,\n effectiveMode,\n options.localWorkbenchPath || 'src/workbench.ts',\n scope.packageName,\n options.packagesPattern,\n );\n const playgroundTargetSpecifiers =\n effectiveMode === 'workspace'\n ? await discoverWorkspacePlaygroundSpecifiers(\n scope.projectRoot,\n scope.packageName,\n )\n : await discoverConsumerPlaygroundSpecifiers(\n scope.projectRoot,\n options.localPlaygroundPath || 'src/playground.ts',\n scope.packageName,\n );\n const workbenchSpecifiers = workbenchTargets\n .map(targetSpecifier)\n .filter((specifier): specifier is string => Boolean(specifier));\n const playgroundSpecifiers = playgroundTargetSpecifiers.map(\n (target) => target.specifier,\n );\n\n addWatchFileIfExists(this, resolve(scope.projectRoot, 'package.json'));\n addWatchFileIfExists(\n this,\n resolve(scope.projectRoot, 'pnpm-workspace.yaml'),\n );\n\n const workspaceRoot =\n options.workspaceRoot || findWorkspaceRoot(scope.projectRoot);\n if (workspaceRoot) {\n addWatchFileIfExists(\n this,\n resolve(workspaceRoot, 'pnpm-workspace.yaml'),\n );\n }\n\n for (const packageSummary of project.packages) {\n if (packageSummary.directory) {\n addWatchFileIfExists(\n this,\n resolve(packageSummary.directory, 'package.json'),\n );\n }\n }\n\n for (const specifier of [\n ...workbenchSpecifiers,\n ...playgroundSpecifiers,\n ]) {\n if (isAbsolute(specifier)) {\n this.addWatchFile(specifier);\n }\n }\n\n return buildVirtualModuleCode(\n JSON.stringify(project),\n workbenchSpecifiers,\n playgroundSpecifiers,\n );\n },\n };\n}\n\nexport { VIRTUAL_WORKBENCH_PROJECT_MODULE_ID };\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@happyvertical/smrt-workbench",
3
- "version": "0.57.31",
3
+ "version": "0.57.33",
4
4
  "smrtJsdoc": "strict",
5
5
  "description": "Shared SMRT package and project workbench",
6
6
  "type": "module",
@@ -42,15 +42,15 @@
42
42
  }
43
43
  },
44
44
  "dependencies": {
45
- "@happyvertical/smrt-core": "0.57.31",
46
- "@happyvertical/smrt-playground": "0.57.31",
47
- "@happyvertical/smrt-svelte": "0.57.31",
48
- "@happyvertical/smrt-ui": "0.57.31",
45
+ "@happyvertical/smrt-core": "0.57.33",
46
+ "@happyvertical/smrt-playground": "0.57.33",
47
+ "@happyvertical/smrt-svelte": "0.57.33",
48
+ "@happyvertical/smrt-ui": "0.57.33",
49
49
  "@sveltejs/adapter-static": "^3.0.10",
50
50
  "@sveltejs/kit": "2.69.1",
51
51
  "@sveltejs/vite-plugin-svelte": "^7.3.0",
52
- "fast-glob": "3.3.3",
53
52
  "svelte": "^5.57.1",
53
+ "tinyglobby": "0.2.17",
54
54
  "tsx": "^4.23.13",
55
55
  "vite": "8.1.6"
56
56
  },
package/src/discovery.ts CHANGED
@@ -24,7 +24,7 @@ import {
24
24
  resolveCustomActionMetadata,
25
25
  resolveEffectiveActionMetadata,
26
26
  } from '@happyvertical/smrt-core/generators/custom-action';
27
- import fg from 'fast-glob';
27
+ import { glob, globSync } from 'tinyglobby';
28
28
  import { coerceWorkbenchModules } from './runtime.js';
29
29
  import type {
30
30
  DiscoveredWorkbenchTarget,
@@ -1352,8 +1352,9 @@ function readApiSummary(
1352
1352
  }
1353
1353
 
1354
1354
  async function collectRouteFiles(packageDir: string): Promise<string[]> {
1355
- return fg(['src/routes/**/*.{ts,svelte}', 'routes/**/*.{ts,svelte}'], {
1355
+ return glob(['src/routes/**/*.{ts,svelte}', 'routes/**/*.{ts,svelte}'], {
1356
1356
  cwd: packageDir,
1357
+ expandDirectories: false,
1357
1358
  absolute: true,
1358
1359
  onlyFiles: true,
1359
1360
  ignore: ['**/node_modules/**', '**/.svelte-kit/**'],
@@ -1361,8 +1362,9 @@ async function collectRouteFiles(packageDir: string): Promise<string[]> {
1361
1362
  }
1362
1363
 
1363
1364
  async function collectMigrations(packageDir: string): Promise<string[]> {
1364
- return fg(['migrations/**/*', 'src/migrations/**/*'], {
1365
+ return glob(['migrations/**/*', 'src/migrations/**/*'], {
1365
1366
  cwd: packageDir,
1367
+ expandDirectories: false,
1366
1368
  absolute: true,
1367
1369
  onlyFiles: true,
1368
1370
  ignore: ['**/node_modules/**'],
@@ -1373,7 +1375,7 @@ async function collectExamples(
1373
1375
  packageDir: string,
1374
1376
  docs: WorkbenchDocumentSummary[],
1375
1377
  ): Promise<WorkbenchExampleSummary[]> {
1376
- const fileMatches = await fg(
1378
+ const fileMatches = await glob(
1377
1379
  [
1378
1380
  'examples/**/*.{ts,tsx,svelte,md}',
1379
1381
  'src/**/*.{example,stories}.{ts,tsx,svelte}',
@@ -1381,6 +1383,7 @@ async function collectExamples(
1381
1383
  ],
1382
1384
  {
1383
1385
  cwd: packageDir,
1386
+ expandDirectories: false,
1384
1387
  absolute: true,
1385
1388
  onlyFiles: true,
1386
1389
  ignore: ['**/node_modules/**', '**/dist/**', '**/.svelte-kit/**'],
@@ -1496,8 +1499,9 @@ async function summarizePackage(
1496
1499
  async function discoverWorkspacePackageDirs(
1497
1500
  workspaceRoot: string,
1498
1501
  ): Promise<WorkbenchPackageDir[]> {
1499
- const packageJsonPaths = await fg('packages/*/package.json', {
1502
+ const packageJsonPaths = await glob('packages/*/package.json', {
1500
1503
  cwd: workspaceRoot,
1504
+ expandDirectories: false,
1501
1505
  absolute: true,
1502
1506
  onlyFiles: true,
1503
1507
  });
@@ -1587,8 +1591,9 @@ function resolvePackageByName(
1587
1591
  return null;
1588
1592
  }
1589
1593
 
1590
- const packageJsonPaths = fg.sync('*/package.json', {
1594
+ const packageJsonPaths = globSync('*/package.json', {
1591
1595
  cwd: packagesDir,
1596
+ expandDirectories: false,
1592
1597
  absolute: true,
1593
1598
  onlyFiles: true,
1594
1599
  });
@@ -1684,8 +1689,9 @@ export async function discoverWorkspaceWorkbenches(
1684
1689
  workspaceRoot: string,
1685
1690
  packagesPattern = 'packages/*/src/workbench.ts',
1686
1691
  ): Promise<DiscoveredWorkbenchTarget[]> {
1687
- const matches = await fg(packagesPattern, {
1692
+ const matches = await glob(packagesPattern, {
1688
1693
  cwd: workspaceRoot,
1694
+ expandDirectories: false,
1689
1695
  absolute: true,
1690
1696
  onlyFiles: true,
1691
1697
  });
package/src/vite.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { existsSync, readFileSync } from 'node:fs';
2
2
  import { dirname, isAbsolute, join, resolve } from 'node:path';
3
- import fg from 'fast-glob';
3
+ import { glob } from 'tinyglobby';
4
4
  import { normalizePath, type Plugin } from 'vite';
5
5
  import {
6
6
  buildWorkbenchProject,
@@ -68,8 +68,9 @@ async function discoverWorkspacePlaygroundSpecifiers(
68
68
  workspaceRoot: string,
69
69
  packageName?: string,
70
70
  ): Promise<PlaygroundSpecifier[]> {
71
- const matches = await fg('packages/*/src/svelte/playground.ts', {
71
+ const matches = await glob('packages/*/src/svelte/playground.ts', {
72
72
  cwd: workspaceRoot,
73
+ expandDirectories: false,
73
74
  absolute: true,
74
75
  onlyFiles: true,
75
76
  });
@@ -1 +0,0 @@
1
- {"version":3,"file":"discovery-BOoinKLR.js","names":["targets"],"sources":["../../src/discovery.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport {\n dirname,\n extname,\n isAbsolute,\n join,\n relative,\n resolve,\n} from 'node:path';\nimport { pathToFileURL } from 'node:url';\n// The leaf `/generators/custom-action` subpath — not the package root, and not\n// the `/generators` barrel, which value-re-exports `MCPGenerator` and so reaches\n// `SmrtCollection` -> `SmrtObject` -> `SmrtClass` and its module-scope\n// `@happyvertical/ai` / `@happyvertical/sql` imports. Measured over `dist`:\n// this subpath is 2 modules with no `@happyvertical` external, the barrel is\n// 109 with the full AI/SQL surface, the root 151. `custom-action`'s only runtime\n// import is `tools/tool-generator`, whose own imports are type-only, which is\n// what keeps it a leaf — a build-time discovery helper should load none of the\n// rest (#2686).\nimport {\n createClassNamePredicate,\n resolveApiMethodExposure,\n resolveCustomActionMetadata,\n resolveEffectiveActionMetadata,\n} from '@happyvertical/smrt-core/generators/custom-action';\nimport fg from 'fast-glob';\nimport { coerceWorkbenchModules } from './runtime.js';\nimport type {\n DiscoveredWorkbenchTarget,\n SmrtWorkbenchModule,\n SmrtWorkbenchProject,\n SmrtWorkbenchScopeMode,\n SmrtWorkbenchVitePluginOptions,\n WorkbenchApiObjectFieldSummary,\n WorkbenchApiObjectSummary,\n WorkbenchApiParameterLocation,\n WorkbenchApiParameterSummary,\n WorkbenchApiSummary,\n WorkbenchCliCommandSummary,\n WorkbenchDocumentSummary,\n WorkbenchExampleSummary,\n WorkbenchKnowledgeSummary,\n WorkbenchMcpToolSummary,\n WorkbenchPackageSummary,\n WorkbenchRestEndpointSummary,\n WorkbenchScopeResolution,\n} from './types.js';\nimport { commandIdForScript } from './utils.js';\n\nconst require = createRequire(import.meta.url);\nconst TS_SOURCE_EXTENSIONS = new Set(['.ts', '.tsx', '.mts', '.cts']);\nconst DOCUMENT_LIMIT = 20_000;\nconst EXAMPLE_LIMIT = 8_000;\n\ninterface PackageJsonLike {\n name?: string;\n version?: string;\n description?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n exports?: unknown;\n packageManager?: string;\n}\n\ninterface WorkbenchPackageDir {\n packageDir: string;\n packageJson: PackageJsonLike;\n source: 'workspace' | 'package' | 'app';\n}\n\nexport function findWorkspaceRoot(startDir = process.cwd()): string | null {\n let current = resolve(startDir);\n\n while (true) {\n if (existsSync(join(current, 'pnpm-workspace.yaml'))) {\n return current;\n }\n\n const parent = dirname(current);\n if (parent === current) {\n return null;\n }\n current = parent;\n }\n}\n\nexport function findSmrtWorkbenchWorkspaceRoot(\n startDir = process.cwd(),\n): string | null {\n const workspaceRoot = findWorkspaceRoot(startDir);\n if (!workspaceRoot) {\n return null;\n }\n\n const hostPackageJsonPath = join(\n workspaceRoot,\n 'packages',\n 'smrt-workbench',\n 'host',\n 'package.json',\n );\n\n return existsSync(hostPackageJsonPath) ? workspaceRoot : null;\n}\n\nexport function findProjectRoot(startDir = process.cwd()): string {\n let current = resolve(startDir);\n\n while (true) {\n if (existsSync(join(current, 'package.json'))) {\n return current;\n }\n\n const parent = dirname(current);\n if (parent === current) {\n return resolve(startDir);\n }\n current = parent;\n }\n}\n\nexport function findPackageDir(\n startDir = process.cwd(),\n workspaceRoot?: string,\n): string | null {\n let current = resolve(startDir);\n const boundary = workspaceRoot ? resolve(workspaceRoot) : null;\n\n while (true) {\n if (boundary && current === boundary) {\n return null;\n }\n\n const packageJsonPath = join(current, 'package.json');\n if (existsSync(packageJsonPath)) {\n return current;\n }\n\n const parent = dirname(current);\n if (parent === current) {\n return null;\n }\n current = parent;\n }\n}\n\nexport function detectWorkbenchMode(\n projectRoot = process.cwd(),\n): 'workspace' | 'consumer' {\n return findSmrtWorkbenchWorkspaceRoot(projectRoot) ? 'workspace' : 'consumer';\n}\n\nfunction readJson<T = Record<string, unknown>>(path: string): T {\n return JSON.parse(readFileSync(path, 'utf-8')) as T;\n}\n\nfunction readJsonIfExists<T = Record<string, unknown>>(path: string): T | null {\n return existsSync(path) ? readJson<T>(path) : null;\n}\n\nfunction detectPackageManager(projectRoot: string): 'pnpm' | 'yarn' | 'npm' {\n let current = resolve(projectRoot);\n\n while (true) {\n if (existsSync(join(current, 'pnpm-lock.yaml'))) return 'pnpm';\n if (existsSync(join(current, 'yarn.lock'))) return 'yarn';\n\n const packageManager = readJsonIfExists<PackageJsonLike>(\n join(current, 'package.json'),\n )?.packageManager;\n if (packageManager?.startsWith('pnpm@')) return 'pnpm';\n if (packageManager?.startsWith('yarn@')) return 'yarn';\n if (packageManager?.startsWith('npm@')) return 'npm';\n\n const parent = dirname(current);\n if (parent === current) return 'npm';\n current = parent;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction stringRecord(value: unknown): Record<string, string> {\n if (!isRecord(value)) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(value).filter(\n (entry): entry is [string, string] => typeof entry[1] === 'string',\n ),\n );\n}\n\nfunction countItems(value: unknown): number {\n if (Array.isArray(value)) {\n return value.length;\n }\n if (isRecord(value)) {\n return Object.keys(value).length;\n }\n return 0;\n}\n\nfunction truncate(\n value: string,\n limit: number,\n): {\n content: string;\n truncated: boolean;\n} {\n if (value.length <= limit) {\n return { content: value, truncated: false };\n }\n\n return { content: value.slice(0, limit), truncated: true };\n}\n\nfunction readDocument(\n packageDir: string,\n fileName: string,\n kind: WorkbenchDocumentSummary['kind'],\n): WorkbenchDocumentSummary | null {\n const path = join(packageDir, fileName);\n if (!existsSync(path)) {\n return null;\n }\n\n const { content, truncated } = truncate(\n readFileSync(path, 'utf-8'),\n DOCUMENT_LIMIT,\n );\n return {\n kind,\n title: fileName,\n path,\n content,\n truncated,\n };\n}\n\nfunction exportKeys(exportsField: unknown): string[] {\n if (!exportsField) {\n return [];\n }\n if (typeof exportsField === 'string') {\n return ['.'];\n }\n if (isRecord(exportsField)) {\n return Object.keys(exportsField).sort();\n }\n return [];\n}\n\nfunction dependencyNames(packageJson: PackageJsonLike): string[] {\n return Object.keys({\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n ...packageJson.peerDependencies,\n }).sort();\n}\n\nfunction smrtDependencyNames(packageJson: PackageJsonLike): string[] {\n return dependencyNames(packageJson).filter((name) =>\n name.startsWith('@happyvertical/smrt-'),\n );\n}\n\nfunction sdkDependencyNames(packageJson: PackageJsonLike): string[] {\n return dependencyNames(packageJson).filter(\n (name) =>\n name.startsWith('@happyvertical/') &&\n !name.startsWith('@happyvertical/smrt-'),\n );\n}\n\nfunction readKnowledgeSummary(packageDir: string): WorkbenchKnowledgeSummary {\n const knowledgeCandidates = [\n join(packageDir, '.smrt', 'smrt-knowledge.json'),\n join(packageDir, 'dist', 'smrt-knowledge.json'),\n ];\n const manifestCandidates = [\n join(packageDir, '.smrt', 'manifest.json'),\n join(packageDir, 'dist', 'manifest.json'),\n join(packageDir, 'src', 'manifest', 'manifest.json'),\n ];\n\n const knowledgePath = knowledgeCandidates.find((path) => existsSync(path));\n const manifestPath = manifestCandidates.find((path) => existsSync(path));\n const knowledge = knowledgePath\n ? readJsonIfExists<Record<string, unknown>>(knowledgePath)\n : null;\n const manifest = manifestPath\n ? readJsonIfExists<Record<string, unknown>>(manifestPath)\n : null;\n const knowledgeObjects = knowledge?.objects;\n const manifestObjects = manifest?.objects;\n const objects =\n countItems(knowledgeObjects) > 0 ? knowledgeObjects : manifestObjects;\n const objectNames = objectNamesFrom(objects);\n\n return {\n manifestPath,\n knowledgePath,\n objectCount: countItems(objects),\n relationshipCount:\n countItems(knowledge?.relationshipsV2) ||\n countItems(knowledge?.relationships),\n promptCount: countItems(knowledge?.prompts),\n mcpToolCount: countItems(knowledge?.mcpTools),\n surfaceCount: countItems(knowledge?.surfaces),\n tags: Array.isArray(knowledge?.tags)\n ? knowledge.tags.filter((tag): tag is string => typeof tag === 'string')\n : [],\n risks: Array.isArray(knowledge?.risks)\n ? knowledge.risks.filter(\n (risk): risk is string => typeof risk === 'string',\n )\n : [],\n objectNames,\n };\n}\n\nfunction objectNamesFrom(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value\n .map((item) => {\n if (!isRecord(item)) {\n return null;\n }\n return stringValue(item.qualifiedName) || stringValue(item.name);\n })\n .filter((name): name is string => Boolean(name))\n .sort();\n }\n\n if (isRecord(value)) {\n return Object.keys(value).sort();\n }\n\n return [];\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === 'string' && value.length > 0 ? value : null;\n}\n\nfunction booleanValue(value: unknown): boolean | undefined {\n return typeof value === 'boolean' ? value : undefined;\n}\n\nfunction objectRecordsFrom(value: unknown): Record<string, unknown>[] {\n if (Array.isArray(value)) {\n return value.filter(isRecord);\n }\n\n if (!isRecord(value)) {\n return [];\n }\n\n return Object.entries(value).map(([key, item]) => {\n if (isRecord(item)) {\n return {\n key,\n ...item,\n };\n }\n\n return {\n key,\n name: key,\n };\n });\n}\n\nfunction fieldSummariesFrom(value: unknown): WorkbenchApiObjectFieldSummary[] {\n if (Array.isArray(value)) {\n return value\n .filter(isRecord)\n .map((field) => ({\n name: stringValue(field.name) || 'unknown',\n type: stringValue(field.type) || undefined,\n required: booleanValue(field.required),\n related: stringValue(field.related) || undefined,\n }))\n .filter((field) => field.name !== 'unknown');\n }\n\n if (!isRecord(value)) {\n return [];\n }\n\n return Object.entries(value)\n .map(([name, field]) => {\n const fieldRecord = isRecord(field) ? field : {};\n return {\n name,\n type: stringValue(fieldRecord.type) || undefined,\n required: booleanValue(fieldRecord.required),\n related: stringValue(fieldRecord.related) || undefined,\n };\n })\n .sort((left, right) => left.name.localeCompare(right.name));\n}\n\nfunction resolveManifestSourcePath(\n rootDir: string,\n packageDir: string,\n sourcePath: string | null,\n): string | undefined {\n if (!sourcePath) {\n return undefined;\n }\n\n if (isAbsolute(sourcePath)) {\n return sourcePath;\n }\n\n const rootRelativePath = resolve(rootDir, sourcePath);\n if (existsSync(rootRelativePath)) {\n return rootRelativePath;\n }\n\n return resolve(packageDir, sourcePath);\n}\n\nfunction typedocPackageSlug(packageName: string | undefined): string | null {\n if (!packageName?.startsWith('@happyvertical/smrt-')) {\n return null;\n }\n\n return packageName.replace('@happyvertical/smrt-', '');\n}\n\nfunction findTypedocClassPath(\n rootDir: string,\n packageDir: string,\n packageName: string | undefined,\n className: string,\n): string | undefined {\n const slug = typedocPackageSlug(packageName);\n const candidates = [\n slug\n ? join(\n rootDir,\n 'docs',\n 'content',\n 'api',\n slug,\n 'classes',\n `${className}.md`,\n )\n : null,\n join(packageDir, 'docs', 'classes', `${className}.md`),\n join(packageDir, 'docs', `${className}.md`),\n ].filter((path): path is string => Boolean(path));\n\n return candidates.find((path) => existsSync(path));\n}\n\nfunction extractTypedocSummary(content: string): string | undefined {\n const lines = content.split(/\\r?\\n/);\n const summary: string[] = [];\n let hasSeenTitle = false;\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (!hasSeenTitle) {\n if (trimmed.startsWith('# ')) {\n hasSeenTitle = true;\n }\n continue;\n }\n\n if (!trimmed || trimmed.startsWith('Defined in:')) {\n continue;\n }\n if (trimmed.startsWith('## ')) {\n break;\n }\n if (trimmed.startsWith('> ')) {\n continue;\n }\n\n summary.push(trimmed);\n }\n\n const value = summary.join('\\n').trim();\n return value.length > 0 ? value : undefined;\n}\n\nfunction readTypedocSummary(path: string | undefined): string | undefined {\n if (!path) {\n return undefined;\n }\n\n return extractTypedocSummary(readFileSync(path, 'utf-8'));\n}\n\nconst CRUD_ACTIONS = ['list', 'get', 'create', 'update', 'delete'] as const;\nconst SERVER_MANAGED_FIELDS = new Set([\n 'id',\n 'tenantId',\n 'tenant_id',\n 'createdAt',\n 'created_at',\n 'updatedAt',\n 'updated_at',\n]);\n\nfunction arrayOfStrings(value: unknown): string[] {\n return Array.isArray(value)\n ? value.filter((item): item is string => typeof item === 'string')\n : [];\n}\n\nfunction configObject(value: unknown): Record<string, unknown> {\n return isRecord(value) ? value : {};\n}\n\nfunction parameterRequired(\n value: Record<string, unknown>,\n): boolean | undefined {\n if (typeof value.required === 'boolean') {\n return value.required;\n }\n\n const meta = configObject(value._meta);\n return typeof meta.required === 'boolean' ? meta.required : undefined;\n}\n\nfunction parameterDescription(\n value: Record<string, unknown>,\n): string | undefined {\n return (\n stringValue(value.description) ||\n stringValue(configObject(value._meta).description) ||\n undefined\n );\n}\n\nfunction parameterDefaultValue(\n value: Record<string, unknown>,\n): string | undefined {\n if (!Object.hasOwn(value, 'default')) {\n return undefined;\n }\n\n const defaultValue = value.default;\n if (\n typeof defaultValue === 'string' ||\n typeof defaultValue === 'number' ||\n typeof defaultValue === 'boolean'\n ) {\n return String(defaultValue);\n }\n\n if (defaultValue === null) {\n return 'null';\n }\n\n try {\n return JSON.stringify(defaultValue);\n } catch {\n return undefined;\n }\n}\n\nfunction fieldParameter(\n name: string,\n field: Record<string, unknown>,\n location: WorkbenchApiParameterLocation,\n requiredOverride?: boolean,\n): WorkbenchApiParameterSummary {\n return {\n name,\n type: stringValue(field.type) || undefined,\n required: requiredOverride ?? parameterRequired(field),\n location,\n description: parameterDescription(field),\n defaultValue: parameterDefaultValue(field),\n };\n}\n\nfunction writableFieldEntries(\n object: Record<string, unknown>,\n): Array<[string, Record<string, unknown>]> {\n const fields = configObject(object.fields);\n const apiConfig = configObject(configObject(object.decoratorConfig).api);\n const writableAllowlist = new Set(arrayOfStrings(apiConfig.writable));\n const hasWritableAllowlist = writableAllowlist.size > 0;\n\n return Object.entries(fields)\n .filter((entry): entry is [string, Record<string, unknown>] =>\n isRecord(entry[1]),\n )\n .filter(([name, field]) => {\n if (name.startsWith('_')) {\n return false;\n }\n if (SERVER_MANAGED_FIELDS.has(name)) {\n return false;\n }\n if (\n field.readonly === true ||\n configObject(field._meta).readonly === true\n ) {\n return false;\n }\n return !hasWritableAllowlist || writableAllowlist.has(name);\n })\n .sort(([left], [right]) => left.localeCompare(right));\n}\n\nfunction writableFieldParameters(\n object: Record<string, unknown>,\n location: WorkbenchApiParameterLocation,\n requiredMode: 'field' | 'optional',\n): WorkbenchApiParameterSummary[] {\n return writableFieldEntries(object).map(([name, field]) =>\n fieldParameter(\n name,\n field,\n location,\n requiredMode === 'field' ? parameterRequired(field) : false,\n ),\n );\n}\n\nfunction methodParameterSummaries(\n object: Record<string, unknown>,\n action: string,\n location: WorkbenchApiParameterLocation,\n): WorkbenchApiParameterSummary[] {\n const parameters = methodDefinition(object, action).parameters;\n if (!Array.isArray(parameters)) {\n return [];\n }\n\n return parameters.filter(isRecord).map((parameter) => ({\n name: stringValue(parameter.name) || 'parameter',\n type: stringValue(parameter.type) || undefined,\n required: parameter.optional !== true,\n location,\n description: parameterDescription(parameter),\n defaultValue: parameterDefaultValue(parameter),\n }));\n}\n\nfunction pathParameterNames(path: string): string[] {\n return Array.from(path.matchAll(/\\{([^}]+)\\}/g))\n .map((match) => match[1]?.trim())\n .filter((name): name is string => Boolean(name));\n}\n\nfunction pathParameters(path: string): WorkbenchApiParameterSummary[] {\n return pathParameterNames(path).map((name) => ({\n name,\n type: 'string',\n required: true,\n location: 'path',\n }));\n}\n\nfunction restCrudParameters(\n object: Record<string, unknown>,\n action: string,\n path: string,\n): WorkbenchApiParameterSummary[] {\n if (action === 'list') {\n return [\n {\n name: 'limit',\n type: 'integer',\n required: false,\n location: 'query',\n description: 'Maximum number of items to return.',\n defaultValue: '50',\n },\n {\n name: 'offset',\n type: 'integer',\n required: false,\n location: 'query',\n description: 'Number of items to skip.',\n defaultValue: '0',\n },\n ];\n }\n\n if (action === 'create') {\n return writableFieldParameters(object, 'body', 'field');\n }\n\n if (action === 'update') {\n return [\n ...pathParameters(path),\n ...writableFieldParameters(object, 'body', 'optional'),\n ];\n }\n\n return pathParameters(path);\n}\n\nfunction restCustomParameters(\n object: Record<string, unknown>,\n action: string,\n method: string,\n path: string,\n): WorkbenchApiParameterSummary[] {\n const pathParams = pathParameters(path);\n const pathParamNameSet = new Set(pathParams.map((param) => param.name));\n const bodyOrQueryParams = methodParameterSummaries(\n object,\n action,\n method === 'GET' ? 'query' : 'body',\n ).filter((param) => !pathParamNameSet.has(param.name));\n\n return [...pathParams, ...bodyOrQueryParams];\n}\n\nfunction cliCrudParameters(\n object: Record<string, unknown>,\n action: string,\n): WorkbenchApiParameterSummary[] {\n if (action === 'list') {\n return [\n {\n name: '--limit',\n type: 'integer',\n required: false,\n location: 'option',\n description: 'Maximum number of items to return.',\n defaultValue: '50',\n },\n {\n name: '--offset',\n type: 'integer',\n required: false,\n location: 'option',\n description: 'Number of items to skip.',\n defaultValue: '0',\n },\n {\n name: '--order-by',\n type: 'string',\n required: false,\n location: 'option',\n description: 'Ordering expression, for example \"created_at DESC\".',\n },\n {\n name: '--where',\n type: 'object',\n required: false,\n location: 'option',\n description: 'JSON filter conditions.',\n },\n ];\n }\n\n if (action === 'get' || action === 'delete') {\n return [\n {\n name: 'id',\n type: 'string',\n required: true,\n location: 'argument',\n description: 'Object ID. May also be passed as --id.',\n },\n ];\n }\n\n const bodyParameters = writableFieldParameters(\n object,\n 'option',\n action === 'create' ? 'field' : 'optional',\n ).map((param) => ({\n ...param,\n name: `--${param.name}`,\n }));\n\n if (action === 'create') {\n return [\n {\n name: '--from-file',\n type: 'path',\n required: false,\n location: 'option',\n description: 'Path to a JSON object payload.',\n },\n ...bodyParameters,\n ];\n }\n\n return [\n {\n name: 'id',\n type: 'string',\n required: true,\n location: 'argument',\n description: 'Object ID. May also be passed as --id.',\n },\n {\n name: '--from-file',\n type: 'path',\n required: false,\n location: 'option',\n description: 'Path to a JSON object payload.',\n },\n ...bodyParameters,\n ];\n}\n\nfunction cliCustomParameters(\n object: Record<string, unknown>,\n action: string,\n): WorkbenchApiParameterSummary[] {\n const params = methodParameterSummaries(object, action, 'option').map(\n (param) => ({\n ...param,\n name: `--${param.name}`,\n required: false,\n }),\n );\n\n return [\n {\n name: 'id',\n type: 'string',\n required: false,\n location: 'argument',\n description:\n 'Optional object ID for instance actions. May also be passed as --id.',\n },\n ...params,\n ];\n}\n\nfunction mcpCrudParameters(\n object: Record<string, unknown>,\n action: string,\n): WorkbenchApiParameterSummary[] {\n if (action === 'list') {\n return [\n {\n name: 'limit',\n type: 'integer',\n required: false,\n location: 'input',\n description: 'Maximum number of items to return.',\n defaultValue: '50',\n },\n {\n name: 'offset',\n type: 'integer',\n required: false,\n location: 'input',\n description: 'Number of items to skip.',\n defaultValue: '0',\n },\n {\n name: 'orderBy',\n type: 'string',\n required: false,\n location: 'input',\n description: 'Ordering expression, for example \"created_at DESC\".',\n },\n {\n name: 'where',\n type: 'object',\n required: false,\n location: 'input',\n description: 'Filter conditions as key-value pairs.',\n },\n ];\n }\n\n if (action === 'get') {\n return [\n {\n name: 'id',\n type: 'string',\n required: true,\n location: 'input',\n description: 'Unique identifier of the object.',\n },\n {\n name: 'slug',\n type: 'string',\n required: false,\n location: 'input',\n description: 'URL-friendly identifier of the object.',\n },\n ];\n }\n\n if (action === 'delete') {\n return [\n {\n name: 'id',\n type: 'string',\n required: true,\n location: 'input',\n description: 'ID of the object to delete.',\n },\n ];\n }\n\n if (action === 'create') {\n return writableFieldParameters(object, 'input', 'field');\n }\n\n return [\n {\n name: 'id',\n type: 'string',\n required: true,\n location: 'input',\n description: 'ID of the object to update.',\n },\n ...writableFieldParameters(object, 'input', 'optional'),\n ];\n}\n\nfunction mcpCustomParameters(\n _object: Record<string, unknown>,\n _action: string,\n): WorkbenchApiParameterSummary[] {\n return [\n {\n name: 'id',\n type: 'string',\n required: true,\n location: 'input',\n description: 'ID of the object to execute the action on.',\n },\n {\n name: 'options',\n type: 'object',\n required: false,\n location: 'input',\n description: 'Additional options for the custom action.',\n },\n ];\n}\n\nfunction enabledCrudActions(config: unknown): string[] {\n if (config === false) {\n return [];\n }\n\n const include = arrayOfStrings(configObject(config).include);\n const exclude = new Set(arrayOfStrings(configObject(config).exclude));\n const actions =\n include.length > 0\n ? include.filter((action) => CRUD_ACTIONS.includes(action as never))\n : [...CRUD_ACTIONS];\n\n return actions.filter((action) => !exclude.has(action));\n}\n\nfunction publicCustomMethodNames(object: Record<string, unknown>): string[] {\n return Object.entries(configObject(object.methods))\n .filter(([name, method]) => {\n if (CRUD_ACTIONS.includes(name as never) || !isRecord(method)) {\n return false;\n }\n return method.isPublic === true;\n })\n .map(([name]) => name)\n .sort();\n}\n\nfunction enabledCustomActions(\n object: Record<string, unknown>,\n surface: 'api' | 'cli' | 'mcp',\n isModelClassName?: (name: string) => boolean,\n): string[] {\n const decoratorConfig = configObject(object.decoratorConfig);\n const surfaceConfig = decoratorConfig[surface];\n if (surfaceConfig === false) {\n return [];\n }\n\n const include = arrayOfStrings(configObject(surfaceConfig).include);\n const exclude = new Set(arrayOfStrings(configObject(surfaceConfig).exclude));\n const publicMethods = publicCustomMethodNames(object);\n\n if (surface === 'mcp' && include.length > 0) {\n return include\n .filter((name) => !CRUD_ACTIONS.includes(name as never))\n .filter((name) => publicMethods.includes(name))\n .filter((name) => !exclude.has(name));\n }\n\n // `api` reads the framework's ONE exposure resolver rather than a local copy\n // of the include/exclude rule. This summary is an agent-facing discovery\n // artifact, so a stale copy advertises endpoints the route emitters never\n // wrote -- the wire-ability gate, the framework-lifecycle exclusion, and\n // `@method({ expose })` all decide here too (#2686). `cli`/`mcp` keep their\n // own projection; #2692 owns those defaults.\n if (surface === 'api') {\n const methods = configObject(object.methods);\n const isCollectionClass =\n stringValue(object.extends) === 'SmrtCollection' ||\n object.extendsTypeArg !== undefined;\n return Object.keys(methods)\n .sort()\n .filter(\n (name) =>\n resolveApiMethodExposure({\n actionName: name,\n method: configObject(methods[name]),\n apiConfig: decoratorConfig.api,\n isCollectionClass,\n ...(isModelClassName ? { isModelClassName } : {}),\n }).exposed,\n );\n }\n\n const customMethodsInInclude = include.filter(\n (name) => !CRUD_ACTIONS.includes(name as never),\n );\n return publicMethods\n .filter(\n (name) =>\n customMethodsInInclude.length === 0 ||\n customMethodsInInclude.includes(name),\n )\n .filter((name) => !exclude.has(name));\n}\n\nfunction methodDefinition(\n object: Record<string, unknown>,\n action: string,\n): Record<string, unknown> {\n return configObject(configObject(object.methods)[action]);\n}\n\n/**\n * The effective route metadata for one custom action: `@method()` wins field by\n * field over the class-level `api.routes` entry, exactly as the emitters and\n * the knowledge artifact resolve it. Reading the map alone printed the\n * pre-migration verb and path for a class that had moved to the decorator\n * (#2686).\n */\nfunction effectiveRoute(\n object: Record<string, unknown>,\n action: string,\n): { httpMethod?: string; path?: string; scope?: string } {\n return resolveEffectiveActionMetadata({\n actionName: action,\n method: methodDefinition(object, action),\n apiConfig: configObject(object.decoratorConfig).api,\n });\n}\n\nfunction customRouteMethod(\n object: Record<string, unknown>,\n action: string,\n): string {\n return effectiveRoute(object, action).httpMethod || 'POST';\n}\n\n/**\n * The scope the emitters will actually route under.\n *\n * NOT `resolveEffectiveActionMetadata(...).scope`, which returns the raw\n * declaration: a `scope` is a declaration about a method, never a relocation of\n * it, and `resolveCustomActionMetadata` is what collapses a contradicting one\n * back onto the executable receiver. Reading the raw value printed the\n * collection URL for a route emitted under `[id]` — and, with no declaration at\n * all, printed `{id}` for every instance action on a COLLECTION class, whose\n * host makes it collection-scoped (#2686).\n */\nfunction effectiveScope(\n object: Record<string, unknown>,\n action: string,\n): 'item' | 'collection' {\n const method = methodDefinition(object, action);\n const isCollectionClass =\n stringValue(object.extends) === 'SmrtCollection' ||\n object.extendsTypeArg !== undefined;\n const defaultScope: 'item' | 'collection' =\n isCollectionClass || method.isStatic === true ? 'collection' : 'item';\n try {\n return resolveCustomActionMetadata({\n actionName: action,\n method,\n apiConfig: configObject(object.decoratorConfig).api,\n defaultScope,\n }).scope;\n } catch {\n // The shared resolver validates as it resolves; one malformed action must\n // not fail a whole discovery pass, and a declaration cannot change the\n // receiver anyway.\n return defaultScope;\n }\n}\n\nfunction customRoutePath(\n object: Record<string, unknown>,\n action: string,\n): string {\n const collection =\n stringValue(object.collection) || stringValue(object.name) || action;\n const configuredPath = effectiveRoute(object, action).path || action;\n const normalizedPath = configuredPath\n .split('/')\n .map((segment) => segment.trim())\n .filter(Boolean)\n .join('/')\n .replace(/\\[([^\\]]+)\\]/g, '{$1}');\n\n return effectiveScope(object, action) === 'collection'\n ? `/api/v1/${collection}/${normalizedPath}`\n : `/api/v1/${collection}/{id}/${normalizedPath}`;\n}\n\n/**\n * Exported for the parity test that pins this summary against the framework's\n * own `resolveApiActionSet`. This is a published agent-facing discovery\n * artifact, so \"the workbench and the route emitters agree\" has to be a test,\n * not a convention (#2686).\n */\nexport function restEndpointsFrom(\n object: Record<string, unknown>,\n isModelClassName?: (name: string) => boolean,\n): WorkbenchRestEndpointSummary[] {\n const className =\n stringValue(object.className) || stringValue(object.name) || 'Object';\n const collection = stringValue(object.collection) || className.toLowerCase();\n const apiConfig = configObject(object.decoratorConfig).api;\n const endpoints: WorkbenchRestEndpointSummary[] = [];\n\n const crudActions =\n stringValue(object.extends) === 'SmrtCollection'\n ? []\n : enabledCrudActions(apiConfig);\n for (const action of crudActions) {\n const route =\n action === 'list'\n ? ['GET', `/api/v1/${collection}`, `List ${className} objects`]\n : action === 'create'\n ? ['POST', `/api/v1/${collection}`, `Create ${className}`]\n : action === 'get'\n ? ['GET', `/api/v1/${collection}/{id}`, `Get ${className} by ID`]\n : action === 'update'\n ? ['PUT', `/api/v1/${collection}/{id}`, `Update ${className}`]\n : ['DELETE', `/api/v1/${collection}/{id}`, `Delete ${className}`];\n\n endpoints.push({\n objectName: className,\n action,\n method: route[0],\n path: route[1],\n description: route[2],\n parameters: restCrudParameters(object, action, route[1]),\n });\n }\n\n for (const action of enabledCustomActions(object, 'api', isModelClassName)) {\n const method = customRouteMethod(object, action);\n endpoints.push({\n objectName: className,\n action,\n method,\n path: customRoutePath(object, action),\n description: `Run ${className}.${action}`,\n parameters: restCustomParameters(\n object,\n action,\n method,\n customRoutePath(object, action),\n ),\n });\n }\n\n return endpoints;\n}\n\nfunction cliCommandsFrom(\n object: Record<string, unknown>,\n): WorkbenchCliCommandSummary[] {\n const className =\n stringValue(object.className) || stringValue(object.name) || 'Object';\n const lowerName = className.toLowerCase();\n const cliConfig = configObject(object.decoratorConfig).cli;\n const commands: WorkbenchCliCommandSummary[] = [];\n\n for (const action of enabledCrudActions(cliConfig)) {\n const description =\n action === 'list'\n ? `List ${className} objects`\n : action === 'get'\n ? `Get ${className} by ID or slug`\n : action === 'create'\n ? `Create new ${className}`\n : action === 'update'\n ? `Update ${className}`\n : `Delete ${className}`;\n\n commands.push({\n objectName: className,\n action,\n command: `${lowerName}:${action}`,\n description,\n parameters: cliCrudParameters(object, action),\n });\n }\n\n for (const action of enabledCustomActions(object, 'cli')) {\n commands.push({\n objectName: className,\n action,\n command: `${lowerName}:${action}`,\n description: `Run ${className}.${action}`,\n parameters: cliCustomParameters(object, action),\n });\n }\n\n return commands;\n}\n\nfunction mcpToolsFrom(\n object: Record<string, unknown>,\n): WorkbenchMcpToolSummary[] {\n const className =\n stringValue(object.className) || stringValue(object.name) || 'Object';\n const lowerName = className.toLowerCase();\n const mcpConfig = configObject(object.decoratorConfig).mcp;\n const tools: WorkbenchMcpToolSummary[] = [];\n\n for (const action of enabledCrudActions(mcpConfig)) {\n const description =\n action === 'list'\n ? `List ${className} objects with optional filtering`\n : action === 'get'\n ? `Get a specific ${className} by ID or slug`\n : action === 'create'\n ? `Create a new ${className}`\n : action === 'update'\n ? `Update an existing ${className}`\n : `Delete a ${className} by ID`;\n\n tools.push({\n objectName: className,\n action,\n toolName: `${lowerName}_${action}`,\n description,\n parameters: mcpCrudParameters(object, action),\n });\n }\n\n for (const action of enabledCustomActions(object, 'mcp')) {\n tools.push({\n objectName: className,\n action,\n toolName: `${lowerName}_${action}`.toLowerCase(),\n description: `Execute ${action} action on ${className}`,\n parameters: mcpCustomParameters(object, action),\n });\n }\n\n return tools;\n}\n\nfunction readApiSummary(\n packageDir: string,\n rootDir: string,\n packageName: string,\n knowledge: WorkbenchKnowledgeSummary,\n routeFiles: string[],\n): WorkbenchApiSummary {\n const manifest = knowledge.manifestPath\n ? readJsonIfExists<Record<string, unknown>>(knowledge.manifestPath)\n : null;\n const objectRecords = objectRecordsFrom(manifest?.objects);\n\n const objects: WorkbenchApiObjectSummary[] = objectRecords.map((object) => {\n const name =\n stringValue(object.className) ||\n stringValue(object.name) ||\n stringValue(object.key) ||\n 'unknown';\n const className = stringValue(object.className) || name;\n const sourcePath = resolveManifestSourcePath(\n rootDir,\n packageDir,\n stringValue(object.filePath) || stringValue(object.sourcePath),\n );\n const typedocPath = findTypedocClassPath(\n rootDir,\n packageDir,\n packageName,\n className,\n );\n const fields = fieldSummariesFrom(object.fields);\n\n return {\n name,\n className,\n qualifiedName: stringValue(object.qualifiedName) || undefined,\n collection: stringValue(object.collection) || undefined,\n sourcePath,\n typedocPath,\n description: readTypedocSummary(typedocPath),\n fields,\n };\n });\n\n const objectNames =\n objects.length > 0\n ? objects\n .map(\n (object) => object.qualifiedName || object.className || object.name,\n )\n .filter(Boolean)\n .sort()\n : knowledge.objectNames;\n // The wire-ability gate needs a class inventory to tell a model instance from\n // an options interface. Without one it half-applies and this summary keeps\n // advertising the `addAsset(asset: Asset)` shape (#2686).\n const isModelClassName = createClassNamePredicate(\n objectRecords.flatMap((record) =>\n [\n stringValue(record.className),\n stringValue(record.name),\n stringValue(record.qualifiedName),\n ].filter((name): name is string => Boolean(name)),\n ),\n );\n const restEndpoints = objectRecords.flatMap((record) =>\n restEndpointsFrom(record, isModelClassName),\n );\n\n return {\n objectNames,\n objects,\n restEndpoints,\n cliCommands: objectRecords.flatMap(cliCommandsFrom),\n mcpTools: objectRecords.flatMap(mcpToolsFrom),\n endpointCount: restEndpoints.length,\n routeFiles,\n };\n}\n\nasync function collectRouteFiles(packageDir: string): Promise<string[]> {\n return fg(['src/routes/**/*.{ts,svelte}', 'routes/**/*.{ts,svelte}'], {\n cwd: packageDir,\n absolute: true,\n onlyFiles: true,\n ignore: ['**/node_modules/**', '**/.svelte-kit/**'],\n });\n}\n\nasync function collectMigrations(packageDir: string): Promise<string[]> {\n return fg(['migrations/**/*', 'src/migrations/**/*'], {\n cwd: packageDir,\n absolute: true,\n onlyFiles: true,\n ignore: ['**/node_modules/**'],\n });\n}\n\nasync function collectExamples(\n packageDir: string,\n docs: WorkbenchDocumentSummary[],\n): Promise<WorkbenchExampleSummary[]> {\n const fileMatches = await fg(\n [\n 'examples/**/*.{ts,tsx,svelte,md}',\n 'src/**/*.{example,stories}.{ts,tsx,svelte}',\n 'src/**/examples/**/*.{ts,tsx,svelte,md}',\n ],\n {\n cwd: packageDir,\n absolute: true,\n onlyFiles: true,\n ignore: ['**/node_modules/**', '**/dist/**', '**/.svelte-kit/**'],\n },\n );\n\n const fileExamples = fileMatches.slice(0, 16).map((path, index) => ({\n id: `file:${index}`,\n title: relative(packageDir, path),\n path,\n source: 'file' as const,\n }));\n\n const readme = docs.find((doc) => doc.kind === 'readme');\n const readmeExamples = readme?.content\n ? extractReadmeCodeBlocks(readme.content).slice(0, 8)\n : [];\n\n return [...fileExamples, ...readmeExamples];\n}\n\nfunction extractReadmeCodeBlocks(content: string): WorkbenchExampleSummary[] {\n const examples: WorkbenchExampleSummary[] = [];\n const blockPattern = /```([A-Za-z0-9_-]*)\\n([\\s\\S]*?)```/g;\n let index = 0;\n let match = blockPattern.exec(content);\n\n while (match) {\n const language = match[1] || undefined;\n const code = match[2] || '';\n if (!code.trim()) {\n match = blockPattern.exec(content);\n continue;\n }\n\n const { content: trimmedCode } = truncate(code, EXAMPLE_LIMIT);\n examples.push({\n id: `readme:${index}`,\n title: `README example ${index + 1}`,\n language,\n code: trimmedCode,\n source: 'readme',\n });\n index += 1;\n match = blockPattern.exec(content);\n }\n\n return examples;\n}\n\nasync function summarizePackage(\n input: WorkbenchPackageDir,\n rootDir: string,\n): Promise<WorkbenchPackageSummary> {\n const { packageDir, packageJson, source } = input;\n const packageName =\n packageJson.name || relative(rootDir, packageDir) || packageDir;\n const docs = [\n readDocument(packageDir, 'README.md', 'readme'),\n readDocument(packageDir, 'AGENTS.md', 'agents'),\n readDocument(packageDir, 'CHANGELOG.md', 'changelog'),\n ].filter((doc): doc is WorkbenchDocumentSummary => Boolean(doc));\n const examples = await collectExamples(packageDir, docs);\n const knowledge = readKnowledgeSummary(packageDir);\n const routeFiles = await collectRouteFiles(packageDir);\n const migrations = await collectMigrations(packageDir);\n const scripts = stringRecord(packageJson.scripts);\n const api = readApiSummary(\n packageDir,\n rootDir,\n packageName,\n knowledge,\n routeFiles,\n );\n\n return {\n name: packageName,\n version: packageJson.version,\n description: packageJson.description,\n source,\n directory: packageDir,\n relativeDirectory: relative(rootDir, packageDir) || '.',\n scripts,\n dependencies: stringRecord(packageJson.dependencies),\n devDependencies: stringRecord(packageJson.devDependencies),\n peerDependencies: stringRecord(packageJson.peerDependencies),\n smrtDependencies: smrtDependencyNames(packageJson),\n sdkDependencies: sdkDependencyNames(packageJson),\n exportKeys: exportKeys(packageJson.exports),\n docs,\n examples,\n knowledge,\n api,\n migrations,\n routeModuleCount: 0,\n routeCount: 0,\n playgroundEntryCount: 0,\n recommendedCommands: Object.keys(scripts)\n .filter((scriptName) =>\n ['test', 'typecheck', 'check', 'build', 'dev', 'workbench'].includes(\n scriptName,\n ),\n )\n .sort()\n .map((scriptName) => ({\n id: commandIdForScript(packageName, scriptName),\n label: scriptName,\n command: `pnpm --filter ${packageName} ${scriptName}`,\n })),\n };\n}\n\nasync function discoverWorkspacePackageDirs(\n workspaceRoot: string,\n): Promise<WorkbenchPackageDir[]> {\n const packageJsonPaths = await fg('packages/*/package.json', {\n cwd: workspaceRoot,\n absolute: true,\n onlyFiles: true,\n });\n\n return packageJsonPaths\n .map((packageJsonPath) => ({\n packageDir: dirname(packageJsonPath),\n packageJson: readJson<PackageJsonLike>(packageJsonPath),\n source: 'workspace' as const,\n }))\n .filter(\n (item) =>\n typeof item.packageJson.name === 'string' &&\n item.packageJson.name.startsWith('@happyvertical/smrt-'),\n )\n .sort((left, right) =>\n (left.packageJson.name || '').localeCompare(right.packageJson.name || ''),\n );\n}\n\nfunction resolveNodeModulePackageDir(\n projectRoot: string,\n packageName: string,\n): string | null {\n const packageJsonPath = join(\n projectRoot,\n 'node_modules',\n packageName,\n 'package.json',\n );\n return existsSync(packageJsonPath) ? dirname(packageJsonPath) : null;\n}\n\nasync function discoverConsumerPackageDirs(\n projectRoot: string,\n): Promise<WorkbenchPackageDir[]> {\n const packageJsonPath = join(projectRoot, 'package.json');\n if (!existsSync(packageJsonPath)) {\n return [];\n }\n\n const packageJson = readJson<PackageJsonLike>(packageJsonPath);\n const dependencies = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n ...packageJson.peerDependencies,\n };\n const packageDirs: WorkbenchPackageDir[] = [];\n\n packageDirs.push({\n packageDir: projectRoot,\n packageJson,\n source: packageJson.name?.startsWith('@happyvertical/smrt-')\n ? 'package'\n : 'app',\n });\n\n for (const dependencyName of Object.keys(dependencies).sort()) {\n if (\n !dependencyName.startsWith('@happyvertical/smrt-') ||\n dependencyName === '@happyvertical/smrt-workbench'\n ) {\n continue;\n }\n\n const packageDir = resolveNodeModulePackageDir(projectRoot, dependencyName);\n if (!packageDir) {\n continue;\n }\n\n packageDirs.push({\n packageDir,\n packageJson: readJson<PackageJsonLike>(join(packageDir, 'package.json')),\n source: 'package',\n });\n }\n\n return packageDirs;\n}\n\nfunction resolvePackageByName(\n workspaceRoot: string,\n packageName: string,\n): string | null {\n const packagesDir = join(workspaceRoot, 'packages');\n if (!existsSync(packagesDir)) {\n return null;\n }\n\n const packageJsonPaths = fg.sync('*/package.json', {\n cwd: packagesDir,\n absolute: true,\n onlyFiles: true,\n });\n\n for (const packageJsonPath of packageJsonPaths) {\n const packageJson = readJson<PackageJsonLike>(packageJsonPath);\n if (packageJson.name === packageName) {\n return dirname(packageJsonPath);\n }\n }\n\n return null;\n}\n\nexport function resolveWorkbenchScope(\n cwd = process.cwd(),\n options: Pick<\n SmrtWorkbenchVitePluginOptions,\n 'projectRoot' | 'workspaceRoot' | 'packageName'\n > = {},\n): WorkbenchScopeResolution {\n const resolvedCwd = resolve(cwd);\n const requestedProjectRoot = options.projectRoot\n ? resolve(options.projectRoot)\n : undefined;\n const workspaceRoot =\n options.workspaceRoot ||\n (requestedProjectRoot\n ? findSmrtWorkbenchWorkspaceRoot(requestedProjectRoot)\n : null) ||\n findSmrtWorkbenchWorkspaceRoot(resolvedCwd);\n\n if (workspaceRoot) {\n const packageDir =\n (options.packageName\n ? resolvePackageByName(workspaceRoot, options.packageName)\n : null) ||\n findPackageDir(resolvedCwd, workspaceRoot) ||\n undefined;\n const packageJson = packageDir\n ? readJsonIfExists<PackageJsonLike>(join(packageDir, 'package.json'))\n : null;\n const packageName = options.packageName || packageJson?.name;\n const mode: SmrtWorkbenchScopeMode = packageName ? 'package' : 'workspace';\n\n return {\n mode,\n cwd: resolvedCwd,\n projectRoot: workspaceRoot,\n workspaceRoot,\n packageName,\n packageDir,\n packageManager: 'pnpm',\n };\n }\n\n const projectRoot = requestedProjectRoot || findProjectRoot(resolvedCwd);\n return {\n mode: 'consumer',\n cwd: resolvedCwd,\n projectRoot,\n packageName: options.packageName,\n packageManager: detectPackageManager(projectRoot),\n };\n}\n\nexport async function buildWorkbenchProject(\n scope: WorkbenchScopeResolution,\n): Promise<SmrtWorkbenchProject> {\n const packageDirs =\n scope.mode === 'consumer'\n ? await discoverConsumerPackageDirs(scope.projectRoot)\n : await discoverWorkspacePackageDirs(scope.projectRoot);\n\n const filteredPackageDirs = scope.packageName\n ? packageDirs.filter((item) => item.packageJson.name === scope.packageName)\n : packageDirs;\n\n const packages = await Promise.all(\n filteredPackageDirs.map((item) =>\n summarizePackage(item, scope.projectRoot),\n ),\n );\n\n return {\n generatedAt: new Date().toISOString(),\n scope,\n packages,\n };\n}\n\nexport async function discoverWorkspaceWorkbenches(\n workspaceRoot: string,\n packagesPattern = 'packages/*/src/workbench.ts',\n): Promise<DiscoveredWorkbenchTarget[]> {\n const matches = await fg(packagesPattern, {\n cwd: workspaceRoot,\n absolute: true,\n onlyFiles: true,\n });\n\n return matches.sort().map((sourcePath) => {\n const packageDir = dirname(dirname(sourcePath));\n const packageJsonPath = join(packageDir, 'package.json');\n const packageJson = readJson<PackageJsonLike>(packageJsonPath);\n const runtimePath = join(packageDir, 'dist', 'workbench.js');\n\n return {\n packageName: packageJson.name,\n source: 'workspace' as const,\n sourcePath,\n runtimePath: existsSync(runtimePath) ? runtimePath : undefined,\n };\n });\n}\n\nexport async function discoverInstalledWorkbenches(\n projectRoot = process.cwd(),\n): Promise<DiscoveredWorkbenchTarget[]> {\n const packageJsonPath = join(projectRoot, 'package.json');\n if (!existsSync(packageJsonPath)) {\n return [];\n }\n\n const packageJson = readJson<PackageJsonLike>(packageJsonPath);\n const dependencies = {\n ...packageJson.dependencies,\n ...packageJson.devDependencies,\n ...packageJson.peerDependencies,\n };\n const discovered: DiscoveredWorkbenchTarget[] = [];\n\n for (const dependencyName of Object.keys(dependencies).sort()) {\n if (\n !dependencyName.startsWith('@happyvertical/smrt-') ||\n dependencyName === '@happyvertical/smrt-workbench'\n ) {\n continue;\n }\n\n const packageDir = resolveNodeModulePackageDir(projectRoot, dependencyName);\n if (!packageDir) {\n continue;\n }\n\n const dependencyPackageJson = readJson<PackageJsonLike>(\n join(packageDir, 'package.json'),\n );\n if (exportKeys(dependencyPackageJson.exports).includes('./workbench')) {\n discovered.push({\n packageName: dependencyName,\n source: 'package',\n importSpecifier: `${dependencyName}/workbench`,\n });\n }\n }\n\n return discovered;\n}\n\nexport async function discoverWorkbenchTargets(\n projectRoot = process.cwd(),\n mode: 'auto' | 'workspace' | 'consumer' = 'auto',\n localWorkbenchPath = 'src/workbench.ts',\n packageName?: string,\n packagesPattern = 'packages/*/src/workbench.ts',\n): Promise<DiscoveredWorkbenchTarget[]> {\n const effectiveMode =\n mode === 'auto' ? detectWorkbenchMode(projectRoot) : mode;\n\n if (effectiveMode === 'workspace') {\n const workspaceRoot =\n mode === 'workspace'\n ? findWorkspaceRoot(projectRoot)\n : findSmrtWorkbenchWorkspaceRoot(projectRoot);\n if (!workspaceRoot) {\n return [];\n }\n\n const targets = await discoverWorkspaceWorkbenches(\n workspaceRoot,\n packagesPattern,\n );\n return packageName\n ? targets.filter((target) => target.packageName === packageName)\n : targets;\n }\n\n const targets = await discoverInstalledWorkbenches(projectRoot);\n const localPath = resolve(projectRoot, localWorkbenchPath);\n if (existsSync(localPath)) {\n const localPackageJson = readJsonIfExists<PackageJsonLike>(\n join(projectRoot, 'package.json'),\n );\n targets.push({\n packageName: localPackageJson?.name,\n source: 'app',\n sourcePath: localPath,\n });\n }\n\n return packageName\n ? targets.filter((target) => target.packageName === packageName)\n : targets;\n}\n\nexport async function importWorkbenchModule(\n input: string,\n): Promise<SmrtWorkbenchModule[]> {\n const imported =\n isAbsolute(input) || input.startsWith('.')\n ? await importPathModule(resolve(input))\n : await import(/* @vite-ignore */ input);\n\n const module = imported.default ?? imported.workbench ?? imported;\n return module && typeof module === 'object'\n ? coerceWorkbenchModules(module as SmrtWorkbenchModule)\n : [];\n}\n\nasync function importPathModule(inputPath: string): Promise<unknown> {\n if (!TS_SOURCE_EXTENSIONS.has(extname(inputPath))) {\n return import(/* @vite-ignore */ pathToFileURL(inputPath).href);\n }\n\n let tsxApiPath: string;\n try {\n tsxApiPath = require.resolve('tsx/esm/api');\n } catch (tsxError) {\n throw new Error(\n `Failed to load workbench module from ${inputPath}: source workbench discovery requires the \"tsx\" package.`,\n { cause: tsxError },\n );\n }\n\n const { tsImport } = await import(\n /* @vite-ignore */ pathToFileURL(tsxApiPath).href\n );\n return tsImport(pathToFileURL(inputPath).href, {\n parentURL: import.meta.url,\n });\n}\n\nexport function describeWorkbenchSource(\n target: DiscoveredWorkbenchTarget,\n cwd = process.cwd(),\n): string {\n if (target.source === 'package') {\n return target.importSpecifier || target.packageName || 'installed package';\n }\n\n const path = target.sourcePath || target.runtimePath;\n return path ? relative(cwd, path) || '.' : target.source;\n}\n"],"mappings":"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AG,cACL;CAGF,OAAO;EACL;GACE,MAAM;GACN,MAAM;GACN,UAAU;GACV,UAAU;GACV,aAAa;EACf;EACA;GACE,MAAM;GACN,MAAM;GACN,UAAU;GACV,UAAU;GACV,aAAa;EACf;EACA,GAAG;CACL;AACF;AAEA,SAAS,oBACP,QACA,QACgC;CAShC,OAAO,CACL;EACE,MAAM;EACN,MAAM;EACN,UAAU;EACV,UAAU;EACV,aACE;CACJ,GACA,GAjBa,yBAAyB,QAAQ,QAAQ,QAAQ,CAAA,CAAE,KAC/D,WAAW;EACV,GAAG;EACH,MAAM,KAAK,MAAM;EACjB,UAAU;CACZ,EAYG,CACL;AACF;AAEA,SAAS,kBACP,QACA,QACgC;CAChC,IAAI,WAAW,QACb,OAAO;EACL;GACE,MAAM;GACN,MAAM;GACN,UAAU;GACV,UAAU;GACV,aAAa;GACb,cAAc;EAChB;EACA;GACE,MAAM;GACN,MAAM;GACN,UAAU;GACV,UAAU;GACV,aAAa;GACb,cAAc;EAChB;EACA;GACE,MAAM;GACN,MAAM;GACN,UAAU;GACV,UAAU;GACV,aAAa;EACf;EACA;GACE,MAAM;GACN,MAAM;GACN,UAAU;GACV,UAAU;GACV,aAAa;EACf;CACF;CAGF,IAAI,WAAW,OACb,OAAO,CACL;EACE,MAAM;EACN,MAAM;EACN,UAAU;EACV,UAAU;EACV,aAAa;CACf,GACA;EACE,MAAM;EACN,MAAM;EACN,UAAU;EACV,UAAU;EACV,aAAa;CACf,CACF;CAGF,IAAI,WAAW,UACb,OAAO,CACL;EACE,MAAM;EACN,MAAM;EACN,UAAU;EACV,UAAU;EACV,aAAa;CACf,CACF;CAGF,IAAI,WAAW,UACb,OAAO,wBAAwB,QAAQ,SAAS,OAAO;CAGzD,OAAO,CACL;EACE,MAAM;EACN,MAAM;EACN,UAAU;EACV,UAAU;EACV,aAAa;CACf,GACA,GAAG,wBAAwB,QAAQ,SAAS,UAAU,CACxD;AACF;AAEA,SAAS,oBACP,SACA,SACgC;CAChC,OAAO,CACL;EACE,MAAM;EACN,MAAM;EACN,UAAU;EACV,UAAU;EACV,aAAa;CACf,GACA;EACE,MAAM;EACN,MAAM;EACN,UAAU;EACV,UAAU;EACV,aAAa;CACf,CACF;AACF;AAEA,SAAS,mBAAmB,QAA2B;CACrD,IAAI,WAAW,OACb,OAAO,CAAC;CAGV,MAAM,UAAU,eAAe,aAAa,MAAM,CAAA,CAAE,OAAO;CAC3D,MAAM,UAAU,IAAI,IAAI,eAAe,aAAa,MAAM,CAAA,CAAE,OAAO,CAAC;CAMpE,QAJE,QAAQ,SAAS,IACb,QAAQ,QAAQ,WAAW,aAAa,SAAS,MAAe,CAAC,IACjE,CAAC,GAAG,YAAY,EAAA,CAEP,QAAQ,WAAW,CAAC,QAAQ,IAAI,MAAM,CAAC;AACxD;AAEA,SAAS,wBAAwB,QAA2C;CAC1E,OAAO,OAAO,QAAQ,aAAa,OAAO,OAAO,CAAC,CAAA,CAC/C,QAAQ,CAAC,MAAM,YAAY;EAC1B,IAAI,aAAa,SAAS,IAAa,KAAK,CAAC,SAAS,MAAM,GAC1D,OAAO;EAET,OAAO,OAAO,aAAa;CAC7B,CAAC,CAAA,CACA,KAAK,CAAC,UAAU,IAAI,CAAA,CACpB,KAAK;AACV;AAEA,SAAS,qBACP,QACA,SACA,kBACU;CACV,MAAM,kBAAkB,aAAa,OAAO,eAAe;CAC3D,MAAM,gBAAgB,gBAAgB;CACtC,IAAI,kBAAkB,OACpB,OAAO,CAAC;CAGV,MAAM,UAAU,eAAe,aAAa,aAAa,CAAA,CAAE,OAAO;CAClE,MAAM,UAAU,IAAI,IAAI,eAAe,aAAa,aAAa,CAAA,CAAE,OAAO,CAAC;CAC3E,MAAM,gBAAgB,wBAAwB,MAAM;CAEpD,IAAI,YAAY,SAAS,QAAQ,SAAS,GACxC,OAAO,QACJ,QAAQ,SAAS,CAAC,aAAa,SAAS,IAAa,CAAC,CAAA,CACtD,QAAQ,SAAS,cAAc,SAAS,IAAI,CAAC,CAAA,CAC7C,QAAQ,SAAS,CAAC,QAAQ,IAAI,IAAI,CAAC;CASxC,IAAI,YAAY,OAAO;EACrB,MAAM,UAAU,aAAa,OAAO,OAAO;EAC3C,MAAM,oBACJ,YAAY,OAAO,OAAO,MAAM,oBAChC,OAAO,mBAAmB,KAAA;EAC5B,OAAO,OAAO,KAAK,OAAO,CAAA,CACvB,KAAK,CAAA,CACL,QACE,SACC,yBAAyB;GACvB,YAAY;GACZ,QAAQ,aAAa,QAAQ,KAAK;GAClC,WAAW,gBAAgB;GAC3B;GACA,GAAI,mBAAmB,EAAE,iBAAiB,IAAI,CAAC;EACjD,CAAC,CAAA,CAAE,OACP;CACJ;CAEA,MAAM,yBAAyB,QAAQ,QACpC,SAAS,CAAC,aAAa,SAAS,IAAa,CAChD;CACA,OAAO,cACJ,QACE,SACC,uBAAuB,WAAW,KAClC,uBAAuB,SAAS,IAAI,CACxC,CAAA,CACC,QAAQ,SAAS,CAAC,QAAQ,IAAI,IAAI,CAAC;AACxC;AAEA,SAAS,iBACP,QACA,QACyB;CACzB,OAAO,aAAa,aAAa,OAAO,OAAO,CAAA,CAAE,OAAO;AAC1D;AASA,SAAS,eACP,QACA,QACwD;CACxD,OAAO,+BAA+B;EACpC,YAAY;EACZ,QAAQ,iBAAiB,QAAQ,MAAM;EACvC,WAAW,aAAa,OAAO,eAAe,CAAA,CAAE;CAClD,CAAC;AACH;AAEA,SAAS,kBACP,QACA,QACQ;CACR,OAAO,eAAe,QAAQ,MAAM,CAAA,CAAE,cAAc;AACtD;AAaA,SAAS,eACP,QACA,QACuB;CACvB,MAAM,SAAS,iBAAiB,QAAQ,MAAM;CAI9C,MAAM,eAFJ,YAAY,OAAO,OAAO,MAAM,oBAChC,OAAO,mBAAmB,KAAA,KAEL,OAAO,aAAa,OAAO,eAAe;CACjE,IAAI;EACF,OAAO,4BAA4B;GACjC,YAAY;GACZ;GACA,WAAW,aAAa,OAAO,eAAe,CAAA,CAAE;GAChD;EACF,CAAC,CAAA,CAAE;CACL,QAAQ;EAIN,OAAO;CACT;AACF;AAEA,SAAS,gBACP,QACA,QACQ;CACR,MAAM,aACJ,YAAY,OAAO,UAAU,KAAK,YAAY,OAAO,IAAI,KAAK;CAEhE,MAAM,kBADiB,eAAe,QAAQ,MAAM,CAAA,CAAE,QAAQ,OAAA,CAE3D,MAAM,GAAG,CAAA,CACT,KAAK,YAAY,QAAQ,KAAK,CAAC,CAAA,CAC/B,OAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA,CACR,QAAQ,iBAAiB,MAAM;CAElC,OAAO,eAAe,QAAQ,MAAM,MAAM,eACtC,WAAW,WAAU,GAAI,mBACzB,WAAW,WAAU,QAAS;AACpC;AAQO,SAAS,kBACd,QACA,kBACgC;CAChC,MAAM,YACJ,YAAY,OAAO,SAAS,KAAK,YAAY,OAAO,IAAI,KAAK;CAC/D,MAAM,aAAa,YAAY,OAAO,UAAU,KAAK,UAAU,YAAY;CAC3E,MAAM,YAAY,aAAa,OAAO,eAAe,CAAA,CAAE;CACvD,MAAM,YAA4C,CAAC;CAEnD,MAAM,cACJ,YAAY,OAAO,OAAO,MAAM,mBAC5B,CAAC,IACD,mBAAmB,SAAS;CAClC,KAAA,MAAW,UAAU,aAAa;EAChC,MAAM,QACJ,WAAW,SACP;GAAC;GAAO,WAAW;GAAc,QAAQ,UAAS;EAAU,IAC5D,WAAW,WACT;GAAC;GAAQ,WAAW;GAAc,UAAU;EAAW,IACvD,WAAW,QACT;GAAC;GAAO,WAAW,WAAU;GAAS,OAAO,UAAS;EAAQ,IAC9D,WAAW,WACT;GAAC;GAAO,WAAW,WAAU;GAAS,UAAU;EAAW,IAC3D;GAAC;GAAU,WAAW,WAAU;GAAS,UAAU;EAAW;EAE1E,UAAU,KAAK;GACb,YAAY;GACZ;GACA,QAAQ,MAAM;GACd,MAAM,MAAM;GACZ,aAAa,MAAM;GACnB,YAAY,mBAAmB,QAAQ,QAAQ,MAAM,EAAE;EACzD,CAAC;CACH;CAEA,KAAA,MAAW,UAAU,qBAAqB,QAAQ,OAAO,gBAAgB,GAAG;EAC1E,MAAM,SAAS,kBAAkB,QAAQ,MAAM;EAC/C,UAAU,KAAK;GACb,YAAY;GACZ;GACA;GACA,MAAM,gBAAgB,QAAQ,MAAM;GACpC,aAAa,OAAO,UAAS,GAAI;GACjC,YAAY,qBACV,QACA,QACA,QACA,gBAAgB,QAAQ,MAAM,CAChC;EACF,CAAC;CACH;CAEA,OAAO;AACT;AAEA,SAAS,gBACP,QAC8B;CAC9B,MAAM,YACJ,YAAY,OAAO,SAAS,KAAK,YAAY,OAAO,IAAI,KAAK;CAC/D,MAAM,YAAY,UAAU,YAAY;CACxC,MAAM,YAAY,aAAa,OAAO,eAAe,CAAA,CAAE;CACvD,MAAM,WAAyC,CAAC;CAEhD,KAAA,MAAW,UAAU,mBAAmB,SAAS,GAAG;EAClD,MAAM,cACJ,WAAW,SACP,QAAQ,UAAS,YACjB,WAAW,QACT,OAAO,UAAS,kBAChB,WAAW,WACT,cAAc,cACd,WAAW,WACT,UAAU,cACV,UAAU;EAEtB,SAAS,KAAK;GACZ,YAAY;GACZ;GACA,SAAS,GAAG,UAAS,GAAI;GACzB;GACA,YAAY,kBAAkB,QAAQ,MAAM;EAC9C,CAAC;CACH;CAEA,KAAA,MAAW,UAAU,qBAAqB,QAAQ,KAAK,GACrD,SAAS,KAAK;EACZ,YAAY;EACZ;EACA,SAAS,GAAG,UAAS,GAAI;EACzB,aAAa,OAAO,UAAS,GAAI;EACjC,YAAY,oBAAoB,QAAQ,MAAM;CAChD,CAAC;CAGH,OAAO;AACT;AAEA,SAAS,aACP,QAC2B;CAC3B,MAAM,YACJ,YAAY,OAAO,SAAS,KAAK,YAAY,OAAO,IAAI,KAAK;CAC/D,MAAM,YAAY,UAAU,YAAY;CACxC,MAAM,YAAY,aAAa,OAAO,eAAe,CAAA,CAAE;CACvD,MAAM,QAAmC,CAAC;CAE1C,KAAA,MAAW,UAAU,mBAAmB,SAAS,GAAG;EAClD,MAAM,cACJ,WAAW,SACP,QAAQ,UAAS,oCACjB,WAAW,QACT,kBAAkB,UAAS,kBAC3B,WAAW,WACT,gBAAgB,cAChB,WAAW,WACT,sBAAsB,cACtB,YAAY,UAAS;EAEjC,MAAM,KAAK;GACT,YAAY;GACZ;GACA,UAAU,GAAG,UAAS,GAAI;GAC1B;GACA,YAAY,kBAAkB,QAAQ,MAAM;EAC9C,CAAC;CACH;CAEA,KAAA,MAAW,UAAU,qBAAqB,QAAQ,KAAK,GACrD,MAAM,KAAK;EACT,YAAY;EACZ;EACA,UAAU,GAAG,UAAS,GAAI,SAAS,YAAY;EAC/C,aAAa,WAAW,OAAM,aAAc;EAC5C,YAAY,oBAAoB,QAAQ,MAAM;CAChD,CAAC;CAGH,OAAO;AACT;AAEA,SAAS,eACP,YACA,SACA,aACA,WACA,YACqB;CAIrB,MAAM,gBAAgB,mBAHL,UAAU,eACvB,iBAA0C,UAAU,YAAY,IAChE,KAAA,EAC8C,OAAO;CAEzD,MAAM,UAAuC,cAAc,KAAK,WAAW;EACzE,MAAM,OACJ,YAAY,OAAO,SAAS,KAC5B,YAAY,OAAO,IAAI,KACvB,YAAY,OAAO,GAAG,KACtB;EACF,MAAM,YAAY,YAAY,OAAO,SAAS,KAAK;EACnD,MAAM,aAAa,0BACjB,SACA,YACA,YAAY,OAAO,QAAQ,KAAK,YAAY,OAAO,UAAU,CAC/D;EACA,MAAM,cAAc,qBAClB,SACA,YACA,aACA,SACF;EACA,MAAM,SAAS,mBAAmB,OAAO,MAAM;EAE/C,OAAO;GACL;GACA;GACA,eAAe,YAAY,OAAO,aAAa,KAAK,KAAA;GACpD,YAAY,YAAY,OAAO,UAAU,KAAK,KAAA;GAC9C;GACA;GACA,aAAa,mBAAmB,WAAW;GAC3C;EACF;CACF,CAAC;CAED,MAAM,cACJ,QAAQ,SAAS,IACb,QACG,KACE,WAAW,OAAO,iBAAiB,OAAO,aAAa,OAAO,IACjE,CAAA,CACC,OAAO,OAAO,CAAA,CACd,KAAK,IACR,UAAU;CAIhB,MAAM,mBAAmB,yBACvB,cAAc,SAAS,WACrB;EACE,YAAY,OAAO,SAAS;EAC5B,YAAY,OAAO,IAAI;EACvB,YAAY,OAAO,aAAa;CAClC,CAAA,CAAE,QAAQ,SAAyB,QAAQ,IAAI,CAAC,CAClD,CACF;CACA,MAAM,gBAAgB,cAAc,SAAS,WAC3C,kBAAkB,QAAQ,gBAAgB,CAC5C;CAEA,OAAO;EACL;EACA;EACA;EACA,aAAa,cAAc,QAAQ,eAAe;EAClD,UAAU,cAAc,QAAQ,YAAY;EAC5C,eAAe,cAAc;EAC7B;CACF;AACF;AAEA,eAAe,kBAAkB,YAAuC;CACtE,OAAO,GAAG,CAAC,+BAA+B,yBAAyB,GAAG;EACpE,KAAK;EACL,UAAU;EACV,WAAW;EACX,QAAQ,CAAC,sBAAsB,mBAAmB;CACpD,CAAC;AACH;AAEA,eAAe,kBAAkB,YAAuC;CACtE,OAAO,GAAG,CAAC,mBAAmB,qBAAqB,GAAG;EACpD,KAAK;EACL,UAAU;EACV,WAAW;EACX,QAAQ,CAAC,oBAAoB;CAC/B,CAAC;AACH;AAEA,eAAe,gBACb,YACA,MACoC;CAepC,MAAM,gBAAe,MAdK,GACxB;EACE;EACA;EACA;CACF,GACA;EACE,KAAK;EACL,UAAU;EACV,WAAW;EACX,QAAQ;GAAC;GAAsB;GAAc;EAAmB;CAClE,CACF,EAAA,CAEiC,MAAM,GAAG,EAAE,CAAA,CAAE,KAAK,MAAM,WAAW;EAClE,IAAI,QAAQ;EACZ,OAAO,SAAS,YAAY,IAAI;EAChC;EACA,QAAQ;CACV,EAAE;CAEF,MAAM,SAAS,KAAK,MAAM,QAAQ,IAAI,SAAS,QAAQ;CACvD,MAAM,iBAAiB,QAAQ,UAC3B,wBAAwB,OAAO,OAAO,CAAA,CAAE,MAAM,GAAG,CAAC,IAClD,CAAC;CAEL,OAAO,CAAC,GAAG,cAAc,GAAG,cAAc;AAC5C;AAEA,SAAS,wBAAwB,SAA4C;CAC3E,MAAM,WAAsC,CAAC;CAC7C,MAAM,eAAe;CACrB,IAAI,QAAQ;CACZ,IAAI,QAAQ,aAAa,KAAK,OAAO;CAErC,OAAO,OAAO;EACZ,MAAM,WAAW,MAAM,MAAM,KAAA;EAC7B,MAAM,OAAO,MAAM,MAAM;EACzB,IAAI,CAAC,KAAK,KAAK,GAAG;GAChB,QAAQ,aAAa,KAAK,OAAO;GACjC;EACF;EAEA,MAAM,EAAE,SAAS,gBAAgB,SAAS,MAAM,aAAa;EAC7D,SAAS,KAAK;GACZ,IAAI,UAAU;GACd,OAAO,kBAAkB,QAAQ;GACjC;GACA,MAAM;GACN,QAAQ;EACV,CAAC;EACD,SAAS;EACT,QAAQ,aAAa,KAAK,OAAO;CACnC;CAEA,OAAO;AACT;AAEA,eAAe,iBACb,OACA,SACkC;CAClC,MAAM,EAAE,YAAY,aAAa,WAAW;CAC5C,MAAM,cACJ,YAAY,QAAQ,SAAS,SAAS,UAAU,KAAK;CACvD,MAAM,OAAO;EACX,aAAa,YAAY,aAAa,QAAQ;EAC9C,aAAa,YAAY,aAAa,QAAQ;EAC9C,aAAa,YAAY,gBAAgB,WAAW;CACtD,CAAA,CAAE,QAAQ,QAAyC,QAAQ,GAAG,CAAC;CAC/D,MAAM,WAAW,MAAM,gBAAgB,YAAY,IAAI;CACvD,MAAM,YAAY,qBAAqB,UAAU;CACjD,MAAM,aAAa,MAAM,kBAAkB,UAAU;CACrD,MAAM,aAAa,MAAM,kBAAkB,UAAU;CACrD,MAAM,UAAU,aAAa,YAAY,OAAO;CAChD,MAAM,MAAM,eACV,YACA,SACA,aACA,WACA,UACF;CAEA,OAAO;EACL,MAAM;EACN,SAAS,YAAY;EACrB,aAAa,YAAY;EACzB;EACA,WAAW;EACX,mBAAmB,SAAS,SAAS,UAAU,KAAK;EACpD;EACA,cAAc,aAAa,YAAY,YAAY;EACnD,iBAAiB,aAAa,YAAY,eAAe;EACzD,kBAAkB,aAAa,YAAY,gBAAgB;EAC3D,kBAAkB,oBAAoB,WAAW;EACjD,iBAAiB,mBAAmB,WAAW;EAC/C,YAAY,WAAW,YAAY,OAAO;EAC1C;EACA;EACA;EACA;EACA;EACA,kBAAkB;EAClB,YAAY;EACZ,sBAAsB;EACtB,qBAAqB,OAAO,KAAK,OAAO,CAAA,CACrC,QAAQ,eACP;GAAC;GAAQ;GAAa;GAAS;GAAS;GAAO;EAAW,CAAA,CAAE,SAC1D,UACF,CACF,CAAA,CACC,KAAK,CAAA,CACL,KAAK,gBAAgB;GACpB,IAAI,mBAAmB,aAAa,UAAU;GAC9C,OAAO;GACP,SAAS,iBAAiB,YAAW,GAAI;EAC3C,EAAE;CACN;AACF;AAEA,eAAe,6BACb,eACgC;CAOhC,QAAO,MANwB,GAAG,2BAA2B;EAC3D,KAAK;EACL,UAAU;EACV,WAAW;CACb,CAAC,EAAA,CAGE,KAAK,qBAAqB;EACzB,YAAY,QAAQ,eAAe;EACnC,aAAa,SAA0B,eAAe;EACtD,QAAQ;CACV,EAAE,CAAA,CACD,QACE,SACC,OAAO,KAAK,YAAY,SAAS,YACjC,KAAK,YAAY,KAAK,WAAW,sBAAsB,CAC3D,CAAA,CACC,MAAM,MAAM,WACV,KAAK,YAAY,QAAQ,GAAA,CAAI,cAAc,MAAM,YAAY,QAAQ,EAAE,CAC1E;AACJ;AAEA,SAAS,4BACP,aACA,aACe;CACf,MAAM,kBAAkB,KACtB,aACA,gBACA,aACA,cACF;CACA,OAAO,WAAW,eAAe,IAAI,QAAQ,eAAe,IAAI;AAClE;AAEA,eAAe,4BACb,aACgC;CAChC,MAAM,kBAAkB,KAAK,aAAa,cAAc;CACxD,IAAI,CAAC,WAAW,eAAe,GAC7B,OAAO,CAAC;CAGV,MAAM,cAAc,SAA0B,eAAe;CAC7D,MAAM,eAAe;EACnB,GAAG,YAAY;EACf,GAAG,YAAY;EACf,GAAG,YAAY;CACjB;CACA,MAAM,cAAqC,CAAC;CAE5C,YAAY,KAAK;EACf,YAAY;EACZ;EACA,QAAQ,YAAY,MAAM,WAAW,sBAAsB,IACvD,YACA;CACN,CAAC;CAED,KAAA,MAAW,kBAAkB,OAAO,KAAK,YAAY,CAAA,CAAE,KAAK,GAAG;EAC7D,IACE,CAAC,eAAe,WAAW,sBAAsB,KACjD,mBAAmB,iCAEnB;EAGF,MAAM,aAAa,4BAA4B,aAAa,cAAc;EAC1E,IAAI,CAAC,YACH;EAGF,YAAY,KAAK;GACf;GACA,aAAa,SAA0B,KAAK,YAAY,cAAc,CAAC;GACvE,QAAQ;EACV,CAAC;CACH;CAEA,OAAO;AACT;AAEA,SAAS,qBACP,eACA,aACe;CACf,MAAM,cAAc,KAAK,eAAe,UAAU;CAClD,IAAI,CAAC,WAAW,WAAW,GACzB,OAAO;CAGT,MAAM,mBAAmB,GAAG,KAAK,kBAAkB;EACjD,KAAK;EACL,UAAU;EACV,WAAW;CACb,CAAC;CAED,KAAA,MAAW,mBAAmB,kBAE5B,IADoB,SAA0B,eAC1C,CAAA,CAAY,SAAS,aACvB,OAAO,QAAQ,eAAe;CAIlC,OAAO;AACT;AAEO,SAAS,sBACd,MAAM,QAAQ,IAAI,GAClB,UAGI,CAAC,GACqB;CAC1B,MAAM,cAAc,QAAQ,GAAG;CAC/B,MAAM,uBAAuB,QAAQ,cACjC,QAAQ,QAAQ,WAAW,IAC3B,KAAA;CACJ,MAAM,gBACJ,QAAQ,kBACP,uBACG,+BAA+B,oBAAoB,IACnD,SACJ,+BAA+B,WAAW;CAE5C,IAAI,eAAe;EACjB,MAAM,cACH,QAAQ,cACL,qBAAqB,eAAe,QAAQ,WAAW,IACvD,SACJ,eAAe,aAAa,aAAa,KACzC,KAAA;EACF,MAAM,cAAc,aAChB,iBAAkC,KAAK,YAAY,cAAc,CAAC,IAClE;EACJ,MAAM,cAAc,QAAQ,eAAe,aAAa;EAGxD,OAAO;GACL,MAHmC,cAAc,YAAY;GAI7D,KAAK;GACL,aAAa;GACb;GACA;GACA;GACA,gBAAgB;EAClB;CACF;CAEA,MAAM,cAAc,wBAAwB,gBAAgB,WAAW;CACvE,OAAO;EACL,MAAM;EACN,KAAK;EACL;EACA,aAAa,QAAQ;EACrB,gBAAgB,qBAAqB,WAAW;CAClD;AACF;AAEA,eAAsB,sBACpB,OAC+B;CAC/B,MAAM,cACJ,MAAM,SAAS,aACX,MAAM,4BAA4B,MAAM,WAAW,IACnD,MAAM,6BAA6B,MAAM,WAAW;CAE1D,MAAM,sBAAsB,MAAM,cAC9B,YAAY,QAAQ,SAAS,KAAK,YAAY,SAAS,MAAM,WAAW,IACxE;CAEJ,MAAM,WAAW,MAAM,QAAQ,IAC7B,oBAAoB,KAAK,SACvB,iBAAiB,MAAM,MAAM,WAAW,CAC1C,CACF;CAEA,OAAO;EACL,8BAAa,IAAI,KAAK,EAAA,CAAE,YAAY;EACpC;EACA;CACF;AACF;AAEA,eAAsB,6BACpB,eACA,kBAAkB,+BACoB;CAOtC,QAAO,MANe,GAAG,iBAAiB;EACxC,KAAK;EACL,UAAU;EACV,WAAW;CACb,CAAC,EAAA,CAEc,KAAK,CAAA,CAAE,KAAK,eAAe;EACxC,MAAM,aAAa,QAAQ,QAAQ,UAAU,CAAC;EAE9C,MAAM,cAAc,SADI,KAAK,YAAY,cACK,CAAe;EAC7D,MAAM,cAAc,KAAK,YAAY,QAAQ,cAAc;EAE3D,OAAO;GACL,aAAa,YAAY;GACzB,QAAQ;GACR;GACA,aAAa,WAAW,WAAW,IAAI,cAAc,KAAA;EACvD;CACF,CAAC;AACH;AAEA,eAAsB,6BACpB,cAAc,QAAQ,IAAI,GACY;CACtC,MAAM,kBAAkB,KAAK,aAAa,cAAc;CACxD,IAAI,CAAC,WAAW,eAAe,GAC7B,OAAO,CAAC;CAGV,MAAM,cAAc,SAA0B,eAAe;CAC7D,MAAM,eAAe;EACnB,GAAG,YAAY;EACf,GAAG,YAAY;EACf,GAAG,YAAY;CACjB;CACA,MAAM,aAA0C,CAAC;CAEjD,KAAA,MAAW,kBAAkB,OAAO,KAAK,YAAY,CAAA,CAAE,KAAK,GAAG;EAC7D,IACE,CAAC,eAAe,WAAW,sBAAsB,KACjD,mBAAmB,iCAEnB;EAGF,MAAM,aAAa,4BAA4B,aAAa,cAAc;EAC1E,IAAI,CAAC,YACH;EAMF,IAAI,WAH0B,SAC5B,KAAK,YAAY,cAAc,CAElB,CAAA,CAAsB,OAAO,CAAA,CAAE,SAAS,aAAa,GAClE,WAAW,KAAK;GACd,aAAa;GACb,QAAQ;GACR,iBAAiB,GAAG,eAAc;EACpC,CAAC;CAEL;CAEA,OAAO;AACT;AAEA,eAAsB,yBACpB,cAAc,QAAQ,IAAI,GAC1B,OAA0C,QAC1C,qBAAqB,oBACrB,aACA,kBAAkB,+BACoB;CAItC,KAFE,SAAS,SAAS,oBAAoB,WAAW,IAAI,UAEjC,aAAa;EACjC,MAAM,gBACJ,SAAS,cACL,kBAAkB,WAAW,IAC7B,+BAA+B,WAAW;EAChD,IAAI,CAAC,eACH,OAAO,CAAC;EAGV,MAAMA,WAAU,MAAM,6BACpB,eACA,eACF;EACA,OAAO,cACHA,SAAQ,QAAQ,WAAW,OAAO,gBAAgB,WAAW,IAC7DA;CACN;CAEA,MAAM,UAAU,MAAM,6BAA6B,WAAW;CAC9D,MAAM,YAAY,QAAQ,aAAa,kBAAkB;CACzD,IAAI,WAAW,SAAS,GAAG;EACzB,MAAM,mBAAmB,iBACvB,KAAK,aAAa,cAAc,CAClC;EACA,QAAQ,KAAK;GACX,aAAa,kBAAkB;GAC/B,QAAQ;GACR,YAAY;EACd,CAAC;CACH;CAEA,OAAO,cACH,QAAQ,QAAQ,WAAW,OAAO,gBAAgB,WAAW,IAC7D;AACN;AAEA,eAAsB,sBACpB,OACgC;CAChC,MAAM,WACJ,WAAW,KAAK,KAAK,MAAM,WAAW,GAAG,IACrC,MAAM,iBAAiB,QAAQ,KAAK,CAAC,IACrC,MAAM;;EAA0B;;CAEtC,MAAM,SAAS,SAAS,WAAW,SAAS,aAAa;CACzD,OAAO,UAAU,OAAO,WAAW,WAC/B,uBAAuB,MAA6B,IACpD,CAAC;AACP;AAEA,eAAe,iBAAiB,WAAqC;CACnE,IAAI,CAAC,qBAAqB,IAAI,QAAQ,SAAS,CAAC,GAC9C,OAAO;;EAA0B,cAAc,SAAS,CAAA,CAAE;;CAG5D,IAAI;CACJ,IAAI;EACF,aAAa,QAAQ,QAAQ,aAAa;CAC5C,SAAS,UAAU;EACjB,MAAM,IAAI,MACR,wCAAwC,UAAS,2DACjD,EAAE,OAAO,SAAS,CACpB;CACF;CAEA,MAAM,EAAE,aAAa,MAAM;;EACN,cAAc,UAAU,CAAA,CAAE;;CAE/C,OAAO,SAAS,cAAc,SAAS,CAAA,CAAE,MAAM,EAC7C,WAAW,OAAA,KAAY,IACzB,CAAC;AACH;AAEO,SAAS,wBACd,QACA,MAAM,QAAQ,IAAI,GACV;CACR,IAAI,OAAO,WAAW,WACpB,OAAO,OAAO,mBAAmB,OAAO,eAAe;CAGzD,MAAM,OAAO,OAAO,cAAc,OAAO;CACzC,OAAO,OAAO,SAAS,KAAK,IAAI,KAAK,MAAM,OAAO;AACpD"}