@happyvertical/smrt-dev-mcp 0.47.2 → 0.49.0

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.
Files changed (39) hide show
  1. package/AGENTS.md +7 -9
  2. package/README.md +88 -66
  3. package/dist/dev-plane.d.ts +48 -0
  4. package/dist/dev-plane.d.ts.map +1 -0
  5. package/dist/dev-plane.js +211 -0
  6. package/dist/dev-plane.js.map +1 -0
  7. package/dist/http-TeoaK9Xr.js +168 -0
  8. package/dist/http-TeoaK9Xr.js.map +1 -0
  9. package/dist/http.d.ts +1 -0
  10. package/dist/http.d.ts.map +1 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +31 -850
  13. package/dist/index.js.map +1 -1
  14. package/dist/knowledge/index.d.ts +27 -1
  15. package/dist/knowledge/index.d.ts.map +1 -1
  16. package/dist/{knowledge-CY6sQzpj.js → knowledge-BOsSAdPo.js} +81 -713
  17. package/dist/knowledge-BOsSAdPo.js.map +1 -0
  18. package/dist/knowledge.js +2 -2
  19. package/dist/observation-VJgHaPps.js +802 -0
  20. package/dist/observation-VJgHaPps.js.map +1 -0
  21. package/dist/runtime.d.ts +21 -0
  22. package/dist/runtime.d.ts.map +1 -0
  23. package/dist/runtime.js +18 -0
  24. package/dist/runtime.js.map +1 -0
  25. package/dist/tool-catalog-Zl-bcimC.js +643 -0
  26. package/dist/tool-catalog-Zl-bcimC.js.map +1 -0
  27. package/dist/tool-catalog.d.ts.map +1 -1
  28. package/dist/tools/introspect-project.d.ts +8 -0
  29. package/dist/tools/introspect-project.d.ts.map +1 -1
  30. package/dist/tools/runtime/boot.d.ts +10 -0
  31. package/dist/tools/runtime/boot.d.ts.map +1 -1
  32. package/dist/tools/runtime/connection.d.ts +19 -0
  33. package/dist/tools/runtime/connection.d.ts.map +1 -1
  34. package/dist/tools/runtime/observation.d.ts +12 -0
  35. package/dist/tools/runtime/observation.d.ts.map +1 -1
  36. package/dist/tools/runtime/tools.d.ts.map +1 -1
  37. package/package.json +13 -5
  38. package/skills/smrt-code-review/SKILL.md +1 -1
  39. package/dist/knowledge-CY6sQzpj.js.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/agent-skills.ts","../src/server-info.ts","../src/tools/runtime/boot.ts","../src/tools/runtime/connection.ts","../src/tools/runtime/tools.ts","../src/tools/runtime/observation.ts","../src/http.ts","../src/tools/generate-smrt-class.ts","../src/tools/introspect-project.ts","../src/tools/review-smrt-project.ts","../src/index.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport interface AgentSkillSummary {\n name: string;\n description: string;\n path: string;\n references: string[];\n}\n\nexport interface AgentSkillBundle extends AgentSkillSummary {\n skillMarkdown: string;\n referenceFiles: Array<{\n path: string;\n content: string;\n }>;\n}\n\ninterface AgentSkillDefinition extends AgentSkillSummary {\n skillFile: string;\n}\n\nconst AGENT_SKILLS: AgentSkillDefinition[] = [\n {\n name: 'smrt-code-review',\n description:\n 'Harness-agnostic downstream SMRT code review workflow using smrt-dev-mcp deterministic context and prompt bundles.',\n path: 'skills/smrt-code-review/SKILL.md',\n skillFile: 'skills/smrt-code-review/SKILL.md',\n references: ['skills/smrt-code-review/references/review-output.md'],\n },\n];\n\nexport function listAgentSkills(): AgentSkillSummary[] {\n return AGENT_SKILLS.map(({ skillFile: _skillFile, ...skill }) => skill);\n}\n\nexport function getAgentSkill(options: {\n name: string;\n includeReferences?: boolean;\n}): AgentSkillBundle {\n const skill = AGENT_SKILLS.find((item) => item.name === options.name);\n if (!skill) {\n throw new Error(`Unknown agent skill: ${options.name}`);\n }\n\n return {\n name: skill.name,\n description: skill.description,\n path: skill.path,\n references: skill.references,\n skillMarkdown: readPackageFile(skill.skillFile),\n referenceFiles:\n options.includeReferences === false\n ? []\n : skill.references.map((path) => ({\n path,\n content: readPackageFile(path),\n })),\n };\n}\n\nfunction readPackageFile(relativePath: string): string {\n const packageRoot = resolvePackageRoot();\n return readFileSync(join(packageRoot, relativePath), 'utf8');\n}\n\nfunction resolvePackageRoot(): string {\n // Works in both source tests (`src/agent-skills.ts`) and built packages\n // (`dist/agent-skills.js`); guard it so packaging layout drift fails clearly.\n const packageRoot = dirname(dirname(fileURLToPath(import.meta.url)));\n if (!existsSync(join(packageRoot, 'package.json'))) {\n throw new Error(\n `Unable to resolve smrt-dev-mcp package root from ${import.meta.url}`,\n );\n }\n return packageRoot;\n}\n","import { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport const SERVER_NAME = 'smrt-dev-mcp';\n\nfunction readPackageVersion(): string {\n try {\n const packageRoot = dirname(fileURLToPath(import.meta.url));\n const packageJsonPath = join(packageRoot, '..', 'package.json');\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8')) as {\n version?: unknown;\n };\n return typeof packageJson.version === 'string'\n ? packageJson.version\n : '0.0.0';\n } catch {\n return '0.0.0';\n }\n}\n\nexport const SERVER_VERSION = readPackageVersion();\n","/**\n * Confined runtime bootstrap for the Level 2 observation plane (#1831).\n *\n * \"Booting\" here means registering *manifests* into the in-process\n * `ObjectRegistry` — the project's own `.smrt/manifest.json` (or built\n * `dist/manifest.json`) plus every installed SMRT package manifest that the\n * project's dependency tree resolves to. No project source is imported, no\n * module is executed, no database is touched. That confinement is the safety\n * boundary: an observing agent sees what the runtime *would* register, never\n * what arbitrary project code does on import.\n *\n * The registry is a process-global singleton, so a process boots once. There\n * is deliberately no re-boot tool; restart the process to observe a rebuilt\n * manifest.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { basename, isAbsolute, join, relative, resolve, sep } from 'node:path';\nimport { ObjectRegistry } from '@happyvertical/smrt-core';\nimport {\n discoverSmrtPackages,\n resolveManifestPath,\n} from '@happyvertical/smrt-core/manifest/discover-smrt-packages';\n\n/** Provenance label for facts read from authored/installed manifests. */\nexport const DECLARED_PROVENANCE = 'declared (manifest)';\n\n/** Project manifest candidates, most authoritative first. */\nconst PROJECT_MANIFEST_CANDIDATES = [\n '.smrt/manifest.json',\n 'dist/manifest.json',\n] as const;\n\nexport interface BootDiagnostic {\n severity: 'info' | 'warning' | 'error';\n code: string;\n message: string;\n}\n\nexport interface BootedManifest {\n /** `project` for the project's own manifest, `dependency` for installed packages. */\n kind: 'project' | 'dependency';\n packageName: string | null;\n /** Path relative to the project root (never absolute). */\n path: string;\n objectCount: number;\n}\n\nexport interface RuntimeBoot {\n provenance: typeof DECLARED_PROVENANCE;\n bootedAt: string;\n /** Basename only; the absolute project root never leaves the process. */\n projectName: string;\n manifests: BootedManifest[];\n objectCount: number;\n diagnostics: BootDiagnostic[];\n}\n\ninterface ManifestLike {\n packageName?: unknown;\n moduleType?: unknown;\n objects?: Record<string, unknown>;\n}\n\nfunction relativePath(projectRoot: string, path: string): string {\n const rel = relative(projectRoot, path);\n // Anything outside the root — the parent itself, a `..` walk, or a path on\n // another drive (Windows keeps those absolute) — is reduced to a basename.\n if (rel === '..' || rel.startsWith(`..${sep}`) || isAbsolute(rel)) {\n return basename(path);\n }\n return rel.split(sep).join('/');\n}\n\nfunction readManifest(path: string): ManifestLike | null {\n try {\n const parsed = JSON.parse(readFileSync(path, 'utf8')) as unknown;\n return parsed && typeof parsed === 'object'\n ? (parsed as ManifestLike)\n : null;\n } catch {\n return null;\n }\n}\n\nfunction registerManifest(\n manifest: ManifestLike,\n fallbackPackageName: string | null,\n): number {\n const manifestPackageName =\n typeof manifest.packageName === 'string' && manifest.packageName\n ? manifest.packageName\n : (fallbackPackageName ?? undefined);\n let count = 0;\n for (const [name, definition] of Object.entries(manifest.objects ?? {})) {\n if (!definition || typeof definition !== 'object') continue;\n // An aggregate project manifest (consumer plugin output) carries\n // dependency objects that keep their own `packageName`; registering them\n // under the app's name would mint false `@app:Object` identities that\n // collide with the dependency's own manifest. Per-object ownership wins.\n const ownPackage = (definition as { packageName?: unknown }).packageName;\n ObjectRegistry.registerFromManifest(\n name,\n definition as Parameters<typeof ObjectRegistry.registerFromManifest>[1],\n typeof ownPackage === 'string' && ownPackage\n ? ownPackage\n : manifestPackageName,\n );\n count += 1;\n }\n return count;\n}\n\nlet booted: RuntimeBoot | null = null;\nlet bootedProjectRoot: string | null = null;\n\n/** The boot record for this process, or `null` before {@link bootRuntime}. */\nexport function getRuntimeBoot(): RuntimeBoot | null {\n return booted;\n}\n\n/**\n * The resolved root the process booted from. Consumers must relativize\n * paths against *this* root, never a per-request argument, or a caller could\n * widen the root (e.g. `/`) and read the layout back through \"relative\" paths.\n */\nexport function getBootedProjectRoot(): string | null {\n return bootedProjectRoot;\n}\n\n/** Test seam: forget the boot record (the registry itself is cleared by the caller). */\nexport function resetRuntimeBootForTests(): void {\n booted = null;\n bootedProjectRoot = null;\n}\n\nexport interface BootRuntimeOptions {\n projectRoot?: string;\n /** Clock for `bootedAt` (defaults to `new Date()`). */\n now?: Date;\n}\n\n/**\n * Boot the confined runtime once per process. A second call returns the\n * existing record without touching the registry.\n */\nexport async function bootRuntime(\n options: BootRuntimeOptions = {},\n): Promise<RuntimeBoot> {\n if (booted) return booted;\n const projectRoot = resolve(options.projectRoot ?? process.cwd());\n const diagnostics: BootDiagnostic[] = [];\n const manifests: BootedManifest[] = [];\n\n const projectManifestPath = PROJECT_MANIFEST_CANDIDATES.map((candidate) =>\n join(projectRoot, candidate),\n ).find((path) => existsSync(path));\n const projectPackageName = readProjectPackageName(projectRoot);\n\n if (!projectManifestPath) {\n diagnostics.push({\n severity: 'warning',\n code: 'project_manifest_missing',\n message:\n 'No project manifest found (.smrt/manifest.json or dist/manifest.json); run the project build so the runtime manifest exists.',\n });\n } else {\n const manifest = readManifest(projectManifestPath);\n if (!manifest) {\n diagnostics.push({\n severity: 'error',\n code: 'project_manifest_invalid',\n message: `Project manifest at ${relativePath(projectRoot, projectManifestPath)} is not valid JSON.`,\n });\n } else {\n manifests.push({\n kind: 'project',\n packageName:\n typeof manifest.packageName === 'string'\n ? manifest.packageName\n : projectPackageName,\n path: relativePath(projectRoot, projectManifestPath),\n objectCount: registerManifest(manifest, projectPackageName),\n });\n }\n }\n\n let dependencyNames: string[] = [];\n try {\n // `noCache` keeps discovery from writing `.smrt/discovery-cache.json`:\n // observing a project must never dirty it.\n dependencyNames = discoverSmrtPackages({\n baseDir: projectRoot,\n noCache: true,\n });\n } catch (error) {\n diagnostics.push({\n severity: 'warning',\n code: 'dependency_discovery_failed',\n message: `Installed SMRT package discovery failed: ${error instanceof Error ? error.message : 'unknown error'}`,\n });\n }\n for (const dependency of dependencyNames.sort()) {\n const manifestPath = resolveManifestPath(dependency, projectRoot);\n if (!manifestPath) {\n diagnostics.push({\n severity: 'info',\n code: 'dependency_manifest_missing',\n message: `Installed SMRT package ${dependency} exposes no runtime manifest.`,\n });\n continue;\n }\n const manifest = readManifest(manifestPath);\n if (!manifest) {\n diagnostics.push({\n severity: 'warning',\n code: 'dependency_manifest_invalid',\n message: `Manifest for ${dependency} is not valid JSON.`,\n });\n continue;\n }\n manifests.push({\n kind: 'dependency',\n packageName: dependency,\n path: relativePath(projectRoot, manifestPath),\n objectCount: registerManifest(manifest, dependency),\n });\n }\n\n bootedProjectRoot = projectRoot;\n booted = {\n provenance: DECLARED_PROVENANCE,\n bootedAt: (options.now ?? new Date()).toISOString(),\n projectName: projectPackageName ?? basename(projectRoot),\n manifests,\n objectCount: manifests.reduce((sum, m) => sum + m.objectCount, 0),\n diagnostics,\n };\n return booted;\n}\n\nfunction readProjectPackageName(projectRoot: string): string | null {\n try {\n const parsed = JSON.parse(\n readFileSync(join(projectRoot, 'package.json'), 'utf8'),\n ) as { name?: unknown };\n return typeof parsed.name === 'string' && parsed.name ? parsed.name : null;\n } catch {\n return null;\n }\n}\n","/**\n * Optional read-only dev-database connection resolution for runtime\n * diagnostics tools (#1824).\n *\n * Resolution order per call:\n * 1. explicit `dbUrl`/`dbType` tool arguments\n * 2. `SMRT_DEV_DB_URL` environment variable\n * 3. the project's cosmiconfig CLI section (`getPackageConfig('cli', ...)`\n * from `@happyvertical/smrt-config`) → `database.{type,url}`\n *\n * No configured connection → `db: null` with `source: 'none'`; callers return\n * a successful static-only envelope. A connection is always opened lazily per\n * call and closed in the caller's `finally` — nothing is cached across calls\n * and the server never holds a database handle.\n *\n * Sensitive handling: connection strings are never logged or echoed. Every\n * surfaced URL passes through {@link redactConnectionString}; driver errors\n * are surfaced only through {@link safeErrorMessage}, which strips anything\n * that looks like a credential-bearing URL.\n */\n\nimport { getPackageConfig, loadConfig } from '@happyvertical/smrt-config';\nimport type { DatabaseInterface } from '@happyvertical/sql';\nimport { getDatabase } from '@happyvertical/sql';\n\n/** Engine labels `@happyvertical/sql`'s `getDatabase` accepts. */\nexport type RuntimeDatabaseType = 'sqlite' | 'postgres' | 'duckdb';\n\nconst RUNTIME_DATABASE_TYPES: readonly RuntimeDatabaseType[] = [\n 'sqlite',\n 'postgres',\n 'duckdb',\n];\n\nfunction isRuntimeDatabaseType(value: string): value is RuntimeDatabaseType {\n return (RUNTIME_DATABASE_TYPES as readonly string[]).includes(value);\n}\n\n/** Tool arguments every runtime-diagnostics tool accepts. */\nexport interface RuntimeDatabaseArgs {\n /** Optional database URL/connection string (overrides env and config). */\n dbUrl?: string;\n /**\n * Optional engine hint for `dbUrl` or the environment connection.\n * Must be `'sqlite'` | `'postgres'` | `'duckdb'` (case-insensitive); any\n * other non-empty hint surfaces a safe diagnostic error rather than\n * silently opening the wrong adapter. When absent, the engine is inferred\n * from the URL scheme.\n */\n dbType?: string;\n}\n\nexport type ConnectionSource = 'argument' | 'environment' | 'config' | 'none';\n\nexport interface ResolvedRuntimeConnection {\n /** Open connection, or `null` when no connection is configured. */\n db: DatabaseInterface | null;\n source: ConnectionSource;\n /** Redacted connection string for display; '' when no connection. */\n displayUrl: string;\n /**\n * Normalized engine label for the resolved connection (`sqlite`,\n * `postgres`, or `duckdb`); `null` when no connection is configured.\n */\n databaseType: string | null;\n}\n\n/**\n * Sensitive query-parameter names. Matching normalizes the key (lowercase,\n * `_`/`-` stripped), so camelCase (`authToken`, `accessToken`) and hyphen\n * variants (`api-key`) are masked exactly like their snake_case forms.\n */\nconst SENSITIVE_QUERY_PARAMS = [\n 'access_token',\n 'apikey',\n 'api_key',\n 'auth',\n 'auth_token',\n 'connectionstring',\n 'connection_string',\n 'password',\n 'token',\n];\n\nfunction normalizeQueryParamName(key: string): string {\n return key.toLowerCase().replace(/[_-]/g, '');\n}\n\nconst SENSITIVE_QUERY_PARAM_NAMES = new Set(\n SENSITIVE_QUERY_PARAMS.map(normalizeQueryParamName),\n);\n\nconst DEFAULT_CLI_DATABASE = {\n database: { type: 'sqlite', url: ':memory:' },\n};\n\n/**\n * Redact a connection string so it can be shown to an agent without leaking\n * credentials. Mirrors the CLI's `redactConnectionString` (which is CLI\n * private); patterned identically so dev-mcp never depends on the CLI.\n *\n * Query-parameter masking normalizes each key (lowercase, `_`/`-` stripped),\n * so camelCase forms such as Turso/libsql's `?authToken=` mask exactly like\n * their snake_case forms. A final regex pass also masks `key=value` pairs\n * embedded in free text (driver error messages often quote the URL); it treats\n * the start of the string, `?`, `&`, `,`, `(`, and whitespace as the\n * preceding boundary.\n */\nexport function redactConnectionString(value: string): string {\n let redacted = value;\n\n try {\n const url = new URL(value);\n if (url.password) {\n url.password = '***';\n }\n for (const key of [...url.searchParams.keys()]) {\n if (SENSITIVE_QUERY_PARAM_NAMES.has(normalizeQueryParamName(key))) {\n url.searchParams.set(key, '***');\n }\n }\n redacted = url.toString();\n } catch {\n redacted = value.replace(\n // The password run may itself contain unencoded `@` (invalid but real\n // in driver errors); each interior `@` is consumed only when another\n // `@` follows before whitespace, so the mask always reaches the final\n // userinfo terminator instead of stopping at the first `@`.\n /([a-z][a-z0-9+.-]*:\\/\\/[^:\\s/@]+:)(?:[^@\\s]|@(?=[^@\\s]*@))+(@)/gi,\n '$1***$2',\n );\n }\n\n // Local database files: a `file:` URL or a driver error quoting the path\n // (POSIX or Windows separators) reveals the filesystem layout. Keep only\n // the basename.\n redacted = redacted.replace(\n /(?:[A-Za-z]:)?(?:[\\\\/][^\\s\\\\/'\"`]+)+[\\\\/]([^\\s\\\\/'\"`]+\\.(?:db|sqlite3?|duckdb))/g,\n '…/$1',\n );\n\n // Free-text pass: mask the value of any sensitive `key=value` pair the URL\n // parse above may have left intact (e.g. a URL quoted inside an error\n // message, where `?`/`&` boundaries do not delimit params for `new URL`).\n return redacted.replace(\n /((?:^|[?&,(\\s])([a-z][a-z0-9_-]{0,30})=)([^&,\\s)]+)/gi,\n (match, prefix: string, key: string) =>\n SENSITIVE_QUERY_PARAM_NAMES.has(normalizeQueryParamName(key))\n ? `${prefix}***`\n : match,\n );\n}\n\n/**\n * Build a safe, redacted error message for a database failure. Connection\n * strings and raw driver error objects are never surfaced verbatim.\n */\nexport function safeErrorMessage(error: unknown): string {\n const message =\n error instanceof Error ? error.message : String(error ?? 'unknown error');\n return redactConnectionString(message);\n}\n\n/**\n * Normalize a type hint into an engine `getDatabase` accepts. Unknown values\n * throw a safe error (no URL is included) so the caller can surface a\n * diagnostic instead of silently opening the wrong adapter.\n */\nexport function toRuntimeDatabaseType(value: string): RuntimeDatabaseType {\n const normalized = value.trim().toLowerCase();\n if (isRuntimeDatabaseType(normalized)) {\n return normalized;\n }\n throw new Error(\n `Unsupported runtime database type \"${normalized}\"; expected sqlite, postgres, or duckdb`,\n );\n}\n\n/** Infer an engine hint from a URL scheme when no explicit type is given. */\nexport function inferDatabaseType(url: string, hint?: string): string {\n if (hint && hint.trim().length > 0) return hint;\n if (/^postgres(ql)?:/i.test(url)) return 'postgres';\n if (/^duckdb:/i.test(url)) return 'duckdb';\n return 'sqlite';\n}\n\n/**\n * Resolve the dev-database connection for one tool call.\n *\n * Returns `db: null` (never throws) when no connection is configured; callers\n * must treat that as \"no runtime database\" and return a static-only envelope.\n * A thrown connect error is propagated to the caller, which converts it into\n * a diagnostic envelope — it must never reach the MCP transport.\n */\nexport async function resolveRuntimeConnection(\n args: RuntimeDatabaseArgs = {},\n): Promise<ResolvedRuntimeConnection> {\n const argUrl = args.dbUrl?.trim();\n if (argUrl && argUrl !== ':memory:') {\n const databaseType = toRuntimeDatabaseType(\n inferDatabaseType(argUrl, args.dbType),\n );\n const db = await getDatabaseInstance({ type: databaseType, url: argUrl });\n return {\n db,\n source: 'argument',\n displayUrl: redactConnectionString(argUrl),\n databaseType,\n };\n }\n\n const envUrl = process.env.SMRT_DEV_DB_URL?.trim();\n if (envUrl && envUrl !== ':memory:') {\n const databaseType = toRuntimeDatabaseType(\n inferDatabaseType(envUrl, args.dbType),\n );\n const db = await getDatabaseInstance({ type: databaseType, url: envUrl });\n return {\n db,\n source: 'environment',\n displayUrl: redactConnectionString(envUrl),\n databaseType,\n };\n }\n\n const config = await loadCliDatabaseConfig();\n const configUrl = config?.database?.url?.trim();\n if (configUrl && configUrl !== ':memory:') {\n const databaseType = toRuntimeDatabaseType(\n config.database?.type || inferDatabaseType(configUrl, args.dbType),\n );\n const db = await getDatabaseInstance({\n type: databaseType,\n url: configUrl,\n });\n return {\n db,\n source: 'config',\n displayUrl: redactConnectionString(configUrl),\n databaseType,\n };\n }\n\n return { db: null, source: 'none', displayUrl: '', databaseType: null };\n}\n\ninterface DatabaseConfigLike {\n database?: { type?: string; url?: string };\n}\n\nasync function loadCliDatabaseConfig(): Promise<DatabaseConfigLike> {\n try {\n // `getPackageConfig` only reads the synchronous cache and answers with\n // defaults until `loadConfig()` has run; nothing else in this server loads\n // the project config, so load it here. Cosmiconfig is resolved from the\n // server's cwd (the project the agent is working in); a missing or invalid\n // config falls back to the defaults.\n await loadConfig();\n const config = getPackageConfig(\n 'cli',\n DEFAULT_CLI_DATABASE as unknown as Record<string, unknown>,\n );\n const database = (config as DatabaseConfigLike).database;\n if (database && typeof database.url === 'string') {\n return { database };\n }\n return {};\n } catch {\n return {};\n }\n}\n\nasync function getDatabaseInstance(options: {\n type: RuntimeDatabaseType;\n url: string;\n}): Promise<DatabaseInterface> {\n return getDatabase(options);\n}\n\ntype MaybeCloseableDatabase = {\n close?: () => unknown | Promise<unknown>;\n client?: {\n close?: () => unknown | Promise<unknown>;\n end?: () => unknown | Promise<unknown>;\n };\n};\n\n/**\n * Best-effort close of a resolved connection. Never throws; diagnostics must\n * not fail because cleanup hiccuped.\n */\nexport async function closeRuntimeConnection(db: unknown): Promise<void> {\n if (!db || typeof db !== 'object') return;\n const closeable = db as MaybeCloseableDatabase;\n const close =\n closeable.close ?? closeable.client?.end ?? closeable.client?.close;\n if (typeof close !== 'function') return;\n try {\n await close.call(closeable.close ? closeable : closeable.client);\n } catch {\n // Cleanup failures are not diagnostic failures.\n }\n}\n","/**\n * Runtime diagnostics tools (#1824): read-only views over a project's dev\n * database `_smrt_*` system tables, powered by the shared SELECT-only\n * system-diagnostics reader in `@happyvertical/smrt-core`.\n *\n * Contract:\n * - **Optional connection.** No configured connection returns a successful\n * static-only envelope — the server always starts and static tools are\n * unaffected. A live connection is opened lazily per call and closed in\n * `finally`; nothing is cached across calls.\n * - **Read-only.** Every underlying statement is a bounded SELECT; the reader\n * never selects sensitive columns (job payloads/results, schedule\n * `agentConfig`/`methodArgs`, dispatch `payload`/`metadata`).\n * - **Provenance-labeled.** Live results carry `provenance: 'runtime (live DB)'`;\n * static-only results carry `provenance: 'static'` — agents must never\n * conflate runtime facts with declared/manifest facts.\n * - **Fail-safe.** A connect/read error becomes a diagnostic envelope; it must\n * never reach the MCP transport and never includes raw driver text or URLs.\n */\n\nimport { createHash } from 'node:crypto';\nimport {\n readDispatchHealth,\n readJobHealth,\n readMigrationStatus,\n readRecentChanges,\n readRegistryDrift,\n readScheduleHealth,\n} from '@happyvertical/smrt-core';\nimport type { DatabaseInterface } from '@happyvertical/sql';\nimport {\n closeRuntimeConnection,\n type RuntimeDatabaseArgs,\n redactConnectionString,\n resolveRuntimeConnection,\n safeErrorMessage,\n} from './connection.js';\n\n/** Provenance labels separating runtime facts from static/declared facts. */\nexport const RUNTIME_PROVENANCE = 'runtime (live DB)';\nexport const STATIC_PROVENANCE = 'static';\n\nexport interface RuntimeDiagnostic {\n severity: 'info' | 'warning';\n code: string;\n message: string;\n}\n\nexport interface RuntimeToolEnvelope {\n ok: true;\n coverage: null;\n diagnostics: RuntimeDiagnostic[];\n data: Record<string, unknown>;\n}\n\ntype RuntimeReadParts = {\n data: Record<string, unknown>;\n diagnostics: RuntimeDiagnostic[];\n};\n\ntype RuntimeRead = (db: DatabaseInterface) => Promise<RuntimeReadParts>;\n\n/**\n * Serialize resolve → read → close per connection target so overlapping tool\n * calls never close a shared cached handle out from under each other.\n *\n * `@happyvertical/sql`'s `getDatabase` returns a cached handle per URL (no\n * opt-out in its public API). `closeRuntimeConnection` only calls the handle's\n * own `close`/`end`, but the SDK wraps those so a close also evicts the handle\n * from its connection cache. Two concurrent diagnostics calls resolving the\n * same URL would therefore share one handle, with the first finisher closing\n * it mid-read for the second. A per-key promise chain keeps each call's\n * lifecycle private: every call resolves its own view of the connection,\n * performs its read, and only then closes — the next queued call re-resolves\n * a fresh handle.\n *\n * The key is a digest of the resolved target, never the raw URL, so a\n * credential-bearing connection string is not retained in this map.\n */\nconst runtimeReadQueues = new Map<string, Promise<unknown>>();\n\nfunction connectionQueueKey(args: RuntimeDatabaseArgs): string {\n const target =\n args.dbUrl?.trim() || process.env.SMRT_DEV_DB_URL?.trim() || 'cli.config';\n return createHash('sha256').update(target).digest('hex');\n}\n\nasync function enqueueRuntimeRead<T>(\n key: string,\n operation: () => Promise<T>,\n): Promise<T> {\n const previous = runtimeReadQueues.get(key) ?? Promise.resolve();\n const run = previous.then(operation, operation);\n // Track a never-rejecting tail so later calls chain regardless of outcome,\n // then drop the entry once this is the settled tail to bound map size.\n const tail = run.catch(() => undefined);\n runtimeReadQueues.set(key, tail);\n void tail.then(() => {\n if (runtimeReadQueues.get(key) === tail) {\n runtimeReadQueues.delete(key);\n }\n });\n return run;\n}\n\n/**\n * Run one read against the optional runtime connection, mapping every outcome\n * to a successful MCP envelope:\n *\n * - no connection configured → static-only envelope (`connected: false`)\n * - connect failure → static envelope with a safe diagnostic\n * - read failure → connected envelope with a safe diagnostic\n * - success → live result under `provenance: 'runtime (live DB)'`; a\n * category-unavailable reader result keeps its `available: false` data and\n * surfaces its message as a diagnostic\n */\nexport async function withRuntimeConnection(\n args: RuntimeDatabaseArgs,\n read: RuntimeRead,\n staticHint: string,\n): Promise<RuntimeToolEnvelope> {\n // Serialize the full resolve → read → close lifecycle per connection target\n // (see `runtimeReadQueues`) so concurrent calls sharing one cached handle\n // cannot close it mid-read for each other.\n return enqueueRuntimeRead(connectionQueueKey(args), () =>\n runWithRuntimeConnection(args, read, staticHint),\n );\n}\n\nasync function runWithRuntimeConnection(\n args: RuntimeDatabaseArgs,\n read: RuntimeRead,\n staticHint: string,\n): Promise<RuntimeToolEnvelope> {\n let resolved: Awaited<ReturnType<typeof resolveRuntimeConnection>>;\n try {\n resolved = await resolveRuntimeConnection(args);\n } catch (error) {\n return {\n ok: true,\n coverage: null,\n diagnostics: [\n {\n severity: 'warning',\n code: 'runtime_connection_error',\n message: safeErrorMessage(error),\n },\n ],\n data: {\n provenance: STATIC_PROVENANCE,\n connected: false,\n },\n };\n }\n\n if (!resolved.db) {\n return {\n ok: true,\n coverage: null,\n diagnostics: [\n {\n severity: 'info',\n code: 'runtime_connection_unavailable',\n message: `No runtime dev database configured (set SMRT_DEV_DB_URL or cli.database); returning static-only result: ${staticHint}. Static tools are unaffected.`,\n },\n ],\n data: {\n provenance: STATIC_PROVENANCE,\n connected: false,\n },\n };\n }\n\n const { db, source, displayUrl, databaseType } = resolved;\n try {\n const { data, diagnostics } = await read(db);\n return {\n ok: true,\n coverage: null,\n diagnostics,\n data: {\n provenance: RUNTIME_PROVENANCE,\n connected: true,\n connectionSource: source,\n databaseType,\n displayUrl,\n ...data,\n },\n };\n } catch (error) {\n return {\n ok: true,\n coverage: null,\n diagnostics: [\n {\n severity: 'warning',\n code: 'runtime_read_error',\n message: safeErrorMessage(error),\n },\n ],\n data: {\n provenance: RUNTIME_PROVENANCE,\n connected: true,\n connectionSource: source,\n databaseType,\n displayUrl,\n },\n };\n } finally {\n await closeRuntimeConnection(db);\n }\n}\n\n/**\n * Stored error columns (`error_message`, `last_error`) are free text written\n * at failure time and routinely quote connection URLs or credentials. Every\n * string in a live result passes through {@link redactConnectionString}\n * before it reaches an MCP client; structure and non-string values are kept.\n */\nfunction redactStrings<T>(value: T): T {\n if (typeof value === 'string') {\n return redactConnectionString(value) as T;\n }\n if (Array.isArray(value)) {\n return value.map((item) => redactStrings(item)) as T;\n }\n if (value !== null && typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(\n value as Record<string, unknown>,\n )) {\n out[key] = redactStrings(item);\n }\n return out as T;\n }\n return value;\n}\n\n/** Convert a reader result into envelope data + diagnostics. */\nfunction toEnvelopeParts(rawResult: unknown): {\n data: Record<string, unknown>;\n diagnostics: RuntimeDiagnostic[];\n} {\n const result = redactStrings(rawResult);\n if (\n result !== null &&\n typeof result === 'object' &&\n 'available' in result &&\n (result as { available: unknown }).available === false\n ) {\n const unavailable = result as unknown as {\n reason: string;\n message: string;\n tableName?: string;\n [key: string]: unknown;\n };\n const { message, ...rest } = unavailable;\n const severity: RuntimeDiagnostic['severity'] =\n unavailable.reason === 'retired' ? 'info' : 'warning';\n return {\n data: rest,\n diagnostics: [\n {\n severity,\n code: `category_unavailable_${String(unavailable.reason).replace(/-/g, '_')}`,\n message: String(message),\n },\n ],\n };\n }\n return { data: result as Record<string, unknown>, diagnostics: [] };\n}\n\nfunction readToParts(read: Promise<unknown>): Promise<RuntimeReadParts> {\n return read.then((result) => toEnvelopeParts(result));\n}\n\nexport interface MigrationStatusArgs extends RuntimeDatabaseArgs {\n /** Row budget for latest/failed lists (default 50, capped at 500). */\n limit?: number;\n}\n\nexport async function runtimeMigrationStatus(\n args: MigrationStatusArgs = {},\n): Promise<RuntimeToolEnvelope> {\n const { limit, ...connectionArgs } = args;\n return withRuntimeConnection(\n connectionArgs,\n (db) => readToParts(readMigrationStatus(db, { limit })),\n 'no migration status — the manifest still reports the declared schema',\n );\n}\n\nexport interface JobHealthArgs extends RuntimeDatabaseArgs {\n /** Row budget for the jobs list (default 50, capped at 500). */\n limit?: number;\n}\n\nexport async function runtimeJobHealth(\n args: JobHealthArgs = {},\n): Promise<RuntimeToolEnvelope> {\n const { limit, ...connectionArgs } = args;\n return withRuntimeConnection(\n connectionArgs,\n (db) => readToParts(readJobHealth(db, { limit })),\n 'no job health snapshot — the manifest still reports declared job queues',\n );\n}\n\nexport interface ScheduleHealthArgs extends RuntimeDatabaseArgs {\n /** Row budget for the schedules list (default 50, capped at 500). */\n limit?: number;\n}\n\nexport async function runtimeScheduleHealth(\n args: ScheduleHealthArgs = {},\n): Promise<RuntimeToolEnvelope> {\n const { limit, ...connectionArgs } = args;\n return withRuntimeConnection(\n connectionArgs,\n (db) => readToParts(readScheduleHealth(db, { limit })),\n 'no schedule health snapshot — the manifest still reports declared schedules',\n );\n}\n\nexport interface DispatchHealthArgs extends RuntimeDatabaseArgs {\n /** Row budget for messages/subscriptions lists (default 50, capped at 500). */\n limit?: number;\n}\n\nexport async function runtimeDispatchHealth(\n args: DispatchHealthArgs = {},\n): Promise<RuntimeToolEnvelope> {\n const { limit, ...connectionArgs } = args;\n return withRuntimeConnection(\n connectionArgs,\n (db) => readToParts(readDispatchHealth(db, { limit })),\n 'no dispatch health snapshot — the manifest still reports declared dispatch topology',\n );\n}\n\nexport interface RecentChangesArgs extends RuntimeDatabaseArgs {\n /** Cursor to read after (default 0). */\n since?: number;\n /** Restrict to these physical table names. */\n tables?: string[];\n /** Tenant narrowing filter. */\n tenantId?: string;\n /** Page size (default 200, capped at 500). */\n limit?: number;\n}\n\nexport async function runtimeRecentChanges(\n args: RecentChangesArgs = {},\n): Promise<RuntimeToolEnvelope> {\n const { since, tables, tenantId, limit, ...connectionArgs } = args;\n return withRuntimeConnection(\n connectionArgs,\n (db) =>\n readToParts(readRecentChanges(db, { since, tables, tenantId, limit })),\n 'no recent changes — static knowledge artifacts are unchanged',\n );\n}\n\nexport async function runtimeRegistryDrift(\n args: RuntimeDatabaseArgs = {},\n): Promise<RuntimeToolEnvelope> {\n return withRuntimeConnection(\n args,\n (db) => readToParts(readRegistryDrift(db)),\n 'no registry drift report — _smrt_registry is retired; declared objects come from the manifest',\n );\n}\n","/**\n * Level 2 read-only observation tools over the booted runtime (#1831).\n *\n * Three facts planes, labelled separately in every envelope:\n * - `declared (manifest)`: what the confined boot registered ({@link bootRuntime});\n * - `booted (registry)`: the in-process `ObjectRegistry` projected through the\n * sanitized {@link snapshotRegistry} DTO;\n * - `runtime (live DB)`: the optional read-only connection, reused from Level 1.\n *\n * Nothing here mutates: no writes, no `do()`, no generated CRUD, no project\n * code execution. `runtime-schema-diff` only *introspects* the live schema.\n */\n\nimport {\n ObjectRegistry,\n type RegistrySnapshotObject,\n snapshotRegistry,\n} from '@happyvertical/smrt-core';\nimport { SchemaComparer } from '@happyvertical/smrt-core/migrations';\nimport { bootRuntime, getBootedProjectRoot, type RuntimeBoot } from './boot.js';\nimport type { RuntimeDatabaseArgs } from './connection.js';\nimport {\n type RuntimeDiagnostic,\n type RuntimeToolEnvelope,\n withRuntimeConnection,\n} from './tools.js';\n\n/** Row budget for `runtime-schema-diff` change lists. */\nconst SCHEMA_DIFF_CHANGE_LIMIT = 200;\n\nexport interface RuntimeProjectArgs {\n /** Project root to boot from (defaults to the server's cwd). */\n projectPath?: string;\n}\n\nfunction bootDiagnostics(boot: RuntimeBoot): RuntimeDiagnostic[] {\n return boot.diagnostics\n .filter((d) => d.severity !== 'info')\n .map((d) => ({\n severity: d.severity === 'error' ? 'warning' : d.severity,\n code: `boot_${d.code}`,\n message: d.message,\n }));\n}\n\nfunction bootSummary(boot: RuntimeBoot) {\n return {\n provenance: boot.provenance,\n bootedAt: boot.bootedAt,\n projectName: boot.projectName,\n manifests: boot.manifests,\n objectCount: boot.objectCount,\n };\n}\n\nexport interface RuntimeRegistryArgs extends RuntimeProjectArgs {\n /** Restrict object detail to these simple or qualified names. */\n objects?: string[];\n /** Include field/method detail (default: only when `objects` is given). */\n detail?: boolean;\n}\n\n/** `runtime-registry`: sanitized snapshot of the booted registry. */\nexport async function runtimeRegistry(\n args: RuntimeRegistryArgs = {},\n): Promise<RuntimeToolEnvelope> {\n const boot = await bootRuntime({ projectRoot: args.projectPath });\n // Paths are relativized against the root the process actually booted from,\n // never the per-request argument (which is ignored after the first boot).\n const snapshot = snapshotRegistry({\n projectRoot: getBootedProjectRoot() ?? undefined,\n objects: args.objects,\n detail: args.detail ?? Boolean(args.objects?.length),\n });\n return {\n ok: true,\n coverage: null,\n diagnostics: bootDiagnostics(boot),\n data: {\n provenance: snapshot.provenance,\n boot: bootSummary(boot),\n snapshot,\n },\n };\n}\n\nexport interface RuntimeObjectArgs extends RuntimeProjectArgs {\n /** Simple or qualified object name. */\n name: string;\n /** Engine for the generated DDL preview (default: the registry's default). */\n engine?: 'sqlite' | 'postgres' | 'duckdb';\n}\n\n/** `runtime-object`: one object's sanitized definition plus its generated DDL. */\nexport async function runtimeObject(\n args: RuntimeObjectArgs,\n): Promise<RuntimeToolEnvelope> {\n const boot = await bootRuntime({ projectRoot: args.projectPath });\n const name = typeof args.name === 'string' ? args.name.trim() : '';\n const snapshot = snapshotRegistry({\n projectRoot: getBootedProjectRoot() ?? undefined,\n objects: name ? [name] : [],\n detail: true,\n });\n const diagnostics = bootDiagnostics(boot);\n let object: RegistrySnapshotObject | null = snapshot.objects[0] ?? null;\n if (snapshot.objects.length > 1) {\n // Two packages registering the same simple name is legal; picking one\n // silently would misreport identity. Ask for the qualified name instead.\n object = null;\n diagnostics.push({\n severity: 'warning',\n code: 'object_ambiguous',\n message: `${name} is registered by several packages; pass a qualified name: ${snapshot.objects\n .map((candidate) => candidate.qualifiedName ?? candidate.name)\n .join(', ')}`,\n });\n } else if (!object) {\n diagnostics.push({\n severity: 'warning',\n code: 'object_not_found',\n message: name\n ? `No booted object named ${name}; use runtime-registry to list names.`\n : 'name is required.',\n });\n }\n let ddl: string | null = null;\n if (object) {\n try {\n // Resolve by qualified identity so a same-name class in another package\n // can never answer for this one.\n ddl =\n ObjectRegistry.getSchemaDDL(\n object.qualifiedName ?? object.name,\n args.engine,\n ) ?? null;\n } catch (error) {\n diagnostics.push({\n severity: 'warning',\n code: 'ddl_unavailable',\n message: `Generated DDL unavailable: ${error instanceof Error ? error.message : 'unknown error'}`,\n });\n }\n }\n return {\n ok: true,\n coverage: null,\n diagnostics,\n data: {\n provenance: snapshot.provenance,\n boot: bootSummary(boot),\n object,\n ddl,\n },\n };\n}\n\nexport interface RuntimeSchemaDiffArgs\n extends RuntimeDatabaseArgs,\n RuntimeProjectArgs {}\n\n/**\n * `runtime-schema-diff`: booted registry schemas versus the live database,\n * using the same comparer `db:diff`/`db:migrate` use. Introspection only —\n * drop/relax options are pinned off and nothing is executed.\n */\nexport async function runtimeSchemaDiff(\n args: RuntimeSchemaDiffArgs = {},\n): Promise<RuntimeToolEnvelope> {\n const boot = await bootRuntime({ projectRoot: args.projectPath });\n const envelope = await withRuntimeConnection(\n args,\n async (db) => {\n const comparer = new SchemaComparer(db, {\n includeDroppedTables: false,\n includeDroppedColumns: false,\n includeDroppedIndexes: false,\n relaxColumns: false,\n });\n const diff = await comparer.compare(\n ObjectRegistry.getAllSchemasAsDefinitions(),\n );\n const byType: Record<string, number> = {};\n for (const change of diff.changes) {\n const type = String((change as { type?: unknown }).type ?? 'unknown');\n byType[type] = (byType[type] ?? 0) + 1;\n }\n return {\n data: {\n boot: bootSummary(boot),\n hasChanges: diff.has_changes,\n addedTables: diff.added_tables.map((t) => t.tableName),\n droppedTables: diff.dropped_tables,\n orphanTables: diff.orphan_tables ?? [],\n changeCount: diff.changes.length,\n changesByType: byType,\n changes: diff.changes.slice(0, SCHEMA_DIFF_CHANGE_LIMIT),\n truncated: diff.changes.length > SCHEMA_DIFF_CHANGE_LIMIT,\n },\n diagnostics: [],\n };\n },\n 'booted registry schemas only; connect a dev database to diff against live tables',\n );\n envelope.diagnostics = [...bootDiagnostics(boot), ...envelope.diagnostics];\n return envelope;\n}\n","/**\n * Standalone Level 2 runtime dev-plane host (#1831).\n *\n * Serves a *positive* read-only tool catalog over the stateless 2026-07-28\n * Streamable HTTP transport (#2147): `createMcpHandler` with `legacy: 'reject'`\n * and `maxSubscriptions: 0`, adapted to Node with `toNodeHandler`. No SSE,\n * no session header, no sticky routing.\n *\n * Security boundary (development only):\n * - binds loopback only; SDK localhost Host/Origin validation runs first;\n * - every request needs `Authorization: Bearer <token>` (constant-time\n * compare) — from `SMRT_DEV_MCP_TOKEN` or minted per process;\n * - no authenticated principal exists here, so scope stays fail-closed\n * global-only exactly as in Level 1;\n * - the catalog never includes generated CRUD, custom actions, `do()`, or\n * tool-backed `is()`.\n */\n\nimport { randomBytes, timingSafeEqual } from 'node:crypto';\nimport {\n createServer as createHttpServer,\n type Server as HttpServer,\n type IncomingMessage,\n type ServerResponse,\n} from 'node:http';\nimport type { AddressInfo } from 'node:net';\nimport {\n localhostHostValidation,\n localhostOriginValidation,\n toNodeHandler,\n} from '@modelcontextprotocol/node';\nimport type { CallToolResult } from '@modelcontextprotocol/server';\nimport { createMcpHandler, Server } from '@modelcontextprotocol/server';\nimport { SERVER_NAME, SERVER_VERSION } from './server-info.js';\nimport { TOOLS } from './tool-catalog.js';\nimport { bootRuntime, type RuntimeBoot } from './tools/runtime/boot.js';\nimport {\n runtimeObject,\n runtimeRegistry,\n runtimeSchemaDiff,\n} from './tools/runtime/observation.js';\nimport {\n runtimeDispatchHealth,\n runtimeJobHealth,\n runtimeMigrationStatus,\n runtimeRecentChanges,\n runtimeRegistryDrift,\n runtimeScheduleHealth,\n} from './tools/runtime/tools.js';\n\n/**\n * The complete Level 2 catalog. A tool is exposed over HTTP only if it is\n * named here; the static stdio catalog is deliberately not mounted.\n */\nexport const RUNTIME_HTTP_TOOL_NAMES = [\n 'runtime-registry',\n 'runtime-object',\n 'runtime-schema-diff',\n 'migration-status',\n 'job-health',\n 'schedule-health',\n 'dispatch-health',\n 'recent-changes',\n 'registry-drift',\n] as const;\n\nexport type RuntimeHttpToolName = (typeof RUNTIME_HTTP_TOOL_NAMES)[number];\n\nconst RUNTIME_HTTP_HANDLERS: Record<\n RuntimeHttpToolName,\n (args: Record<string, unknown>) => Promise<unknown>\n> = {\n 'runtime-registry': (args) => runtimeRegistry(args as never),\n 'runtime-object': (args) => runtimeObject(args as never),\n 'runtime-schema-diff': (args) => runtimeSchemaDiff(args as never),\n 'migration-status': (args) => runtimeMigrationStatus(args as never),\n 'job-health': (args) => runtimeJobHealth(args as never),\n 'schedule-health': (args) => runtimeScheduleHealth(args as never),\n 'dispatch-health': (args) => runtimeDispatchHealth(args as never),\n 'recent-changes': (args) => runtimeRecentChanges(args as never),\n 'registry-drift': (args) => runtimeRegistryDrift(args as never),\n};\n\n/** Catalog definitions for the HTTP plane, in catalog order. */\nexport function runtimeHttpTools() {\n const names = new Set<string>(RUNTIME_HTTP_TOOL_NAMES);\n return TOOLS.filter((tool) => names.has(tool.name));\n}\n\n/**\n * Build a fresh protocol server per request (stateless transport contract).\n * `projectRoot` is fixed at host start; per-request `projectPath` arguments\n * are ignored so a client cannot re-point the booted process.\n */\nexport function createRuntimeProtocolServer(projectRoot: string): Server {\n const server = new Server(\n { name: `${SERVER_NAME}-runtime`, version: SERVER_VERSION },\n { capabilities: { tools: {} } },\n );\n server.setRequestHandler('tools/list', async () => ({\n tools: runtimeHttpTools(),\n }));\n server.setRequestHandler('tools/call', async (request) => {\n const name = request.params.name as string;\n const handler = (RUNTIME_HTTP_HANDLERS as Record<string, unknown>)[name];\n if (typeof handler !== 'function') {\n throw new Error(`Unknown runtime tool: ${name}`);\n }\n const { projectPath: _ignored, ...args } = (request.params.arguments ??\n {}) as Record<string, unknown>;\n const result = await (\n handler as (a: Record<string, unknown>) => Promise<unknown>\n )({ ...args, projectPath: projectRoot });\n const text = JSON.stringify(result, null, 2);\n return {\n content: [{ type: 'text', text }],\n structuredContent: result as Record<string, unknown>,\n } satisfies CallToolResult;\n });\n return server;\n}\n\nexport interface RuntimeHttpHostOptions {\n projectRoot?: string;\n /** Loopback interface only; anything else is refused at startup. */\n host?: '127.0.0.1' | 'localhost' | '::1';\n /** `0` (default) picks a free port. */\n port?: number;\n /** Bearer token; defaults to `SMRT_DEV_MCP_TOKEN` or a per-process random token. */\n token?: string;\n /** Path the MCP endpoint is mounted on (default `/mcp`). */\n path?: string;\n}\n\nexport interface RuntimeHttpHost {\n url: string;\n token: string;\n boot: RuntimeBoot;\n close(): Promise<void>;\n}\n\nconst LOOPBACK_HOSTS = new Set(['127.0.0.1', 'localhost', '::1']);\n\nfunction bearerMatches(header: string | undefined, token: string): boolean {\n if (!header?.startsWith('Bearer ')) return false;\n const presented = Buffer.from(header.slice('Bearer '.length));\n const expected = Buffer.from(token);\n return (\n presented.length === expected.length && timingSafeEqual(presented, expected)\n );\n}\n\nfunction deny(res: ServerResponse, status: number, message: string): void {\n res.statusCode = status;\n res.setHeader('content-type', 'application/json');\n if (status === 401) {\n res.setHeader('www-authenticate', 'Bearer realm=\"smrt-dev-mcp runtime\"');\n }\n res.end(JSON.stringify({ error: message }));\n}\n\n/** Start the Level 2 host. Boots the confined runtime before listening. */\nexport async function startRuntimeHttpHost(\n options: RuntimeHttpHostOptions = {},\n): Promise<RuntimeHttpHost> {\n const host = options.host ?? '127.0.0.1';\n if (!LOOPBACK_HOSTS.has(host)) {\n throw new Error(\n 'The runtime dev-plane binds loopback only (127.0.0.1, localhost, ::1).',\n );\n }\n const path = options.path ?? '/mcp';\n const token =\n options.token ??\n process.env.SMRT_DEV_MCP_TOKEN?.trim() ??\n randomBytes(24).toString('base64url');\n if (!token) {\n throw new Error('SMRT_DEV_MCP_TOKEN must not be empty.');\n }\n const projectRoot = options.projectRoot ?? process.cwd();\n const boot = await bootRuntime({ projectRoot });\n\n const mcp = toNodeHandler(\n createMcpHandler(() => createRuntimeProtocolServer(projectRoot), {\n legacy: 'reject',\n maxSubscriptions: 0,\n }),\n );\n const hostGuard = localhostHostValidation();\n const originGuard = localhostOriginValidation();\n\n const httpServer: HttpServer = createHttpServer(\n (req: IncomingMessage, res: ServerResponse) => {\n // Guards answer and end the response themselves when they return false.\n if (!hostGuard(req, res)) return;\n if (!originGuard(req, res)) return;\n const url = new URL(req.url ?? '/', 'http://localhost');\n if (url.pathname !== path) {\n deny(res, 404, 'not found');\n return;\n }\n if (!bearerMatches(req.headers.authorization, token)) {\n deny(res, 401, 'missing or invalid bearer token');\n return;\n }\n void mcp(req, res);\n },\n );\n\n await new Promise<void>((resolve, reject) => {\n httpServer.once('error', reject);\n httpServer.listen(options.port ?? 0, host, () => {\n httpServer.off('error', reject);\n resolve();\n });\n });\n const address = httpServer.address() as AddressInfo;\n const urlHost =\n address.family === 'IPv6' ? `[${address.address}]` : address.address;\n return {\n url: `http://${urlHost}:${address.port}${path}`,\n token,\n boot,\n close: () =>\n new Promise<void>((resolve, reject) => {\n httpServer.closeAllConnections?.();\n httpServer.close((error) => (error ? reject(error) : resolve()));\n }),\n };\n}\n","/**\n * Generate SMRT Class Tool\n * Creates a package-ready SMRT class using current object-package patterns.\n */\n\ntype PropertyType =\n | 'text'\n | 'integer'\n | 'decimal'\n | 'boolean'\n | 'datetime'\n | 'json';\ntype BaseClass = 'SmrtObject' | 'SmrtCollection';\ntype TemplateVariant =\n | 'basic'\n | 'global-catalog'\n | 'optional-catalog'\n | 'tenant-project-object'\n | 'tenant-event-log-object'\n | 'cross-package-reference';\ntype RelationshipType =\n | 'foreignKey'\n | 'crossPackageRef'\n | 'oneToMany'\n | 'manyToMany';\n\ninterface PropertyDefinition {\n name: string;\n type: PropertyType;\n required?: boolean;\n nullable?: boolean;\n description?: string;\n defaultValue?: unknown;\n}\n\ninterface RelationshipDefinition {\n name: string;\n type: RelationshipType;\n related: string;\n required?: boolean;\n nullable?: boolean;\n description?: string;\n validate?: boolean;\n foreignKey?: string;\n through?: string;\n sourceKey?: string;\n targetKey?: string;\n}\n\ninterface TenantScopedDefinition {\n mode?: 'required' | 'optional';\n field?: string;\n autoFilter?: boolean;\n autoPopulate?: boolean;\n allowSuperAdminBypass?: boolean;\n}\n\ninterface GenerateSmrtClassArgs {\n className: string;\n properties: PropertyDefinition[];\n baseClass?: BaseClass;\n template?: TemplateVariant;\n tableName?: string;\n conflictColumns?: string[];\n tenantScoped?: boolean | TenantScopedDefinition;\n includeTenantIdField?: boolean;\n relationships?: RelationshipDefinition[];\n includeApiConfig?: boolean;\n includeMcpConfig?: boolean;\n includeCliConfig?: boolean;\n includeCompanionSnippets?: boolean;\n}\n\ninterface NormalizedGenerateSmrtClassArgs {\n className: string;\n properties: PropertyDefinition[];\n baseClass: BaseClass;\n template: TemplateVariant;\n tableName?: string;\n conflictColumns: string[];\n tenantScoped?: TenantScopedDefinition;\n includeTenantIdField: boolean;\n relationships: RelationshipDefinition[];\n includeApiConfig: boolean;\n includeMcpConfig: boolean;\n includeCliConfig: boolean;\n includeCompanionSnippets: boolean;\n}\n\nconst TYPE_MAPPING: Record<\n PropertyType,\n { tsType: string; defaultValue: string }\n> = {\n text: { tsType: 'string', defaultValue: \"''\" },\n integer: { tsType: 'number', defaultValue: '0' },\n decimal: { tsType: 'number', defaultValue: '0.0' },\n boolean: { tsType: 'boolean', defaultValue: 'false' },\n datetime: { tsType: 'Date', defaultValue: 'new Date()' },\n json: { tsType: 'any', defaultValue: '{}' },\n};\n\nexport async function generateSmrtClass(\n args: GenerateSmrtClassArgs,\n): Promise<string> {\n const normalized = normalizeArgs(args);\n const {\n className,\n properties,\n relationships,\n baseClass,\n tableName,\n conflictColumns,\n tenantScoped,\n includeTenantIdField,\n includeApiConfig,\n includeMcpConfig,\n includeCliConfig,\n includeCompanionSnippets,\n } = normalized;\n\n const coreImports = new Set<string>([baseClass, 'smrt']);\n if (needsFieldDecorator(properties)) coreImports.add('field');\n for (const relationship of relationships) {\n coreImports.add(relationship.type);\n }\n\n const imports = [\n `import { ${Array.from(coreImports).join(', ')} } from '@happyvertical/smrt-core';`,\n ];\n\n if (tenantScoped) {\n const tenancyImports = ['TenantScoped'];\n if (includeTenantIdField) tenancyImports.push('tenantId');\n imports.push(\n `import { ${tenancyImports.join(', ')} } from '@happyvertical/smrt-tenancy';`,\n );\n }\n\n const decoratorLines = [\n ...(tenantScoped\n ? [`@TenantScoped(${renderObjectLiteral({ ...tenantScoped })})`]\n : []),\n renderSmrtDecorator({\n includeApiConfig,\n includeMcpConfig,\n includeCliConfig,\n tableName,\n conflictColumns,\n }),\n ];\n\n const classMembers = [\n ...(includeTenantIdField && tenantScoped\n ? [renderTenantIdField(tenantScoped)]\n : []),\n ...properties.map(renderProperty),\n ...relationships.map(renderRelationship),\n ].filter(Boolean);\n\n const companionSnippets = includeCompanionSnippets\n ? `\\n${renderCompanionSnippets(className, Boolean(tenantScoped))}`\n : '';\n\n return `${imports.join('\\n')}\n\n${decoratorLines.join('\\n')}\nexport class ${className} extends ${baseClass} {\n${classMembers.join('\\n\\n')}\n\n constructor(options: any = {}) {\n super(options);\n Object.assign(this, options);\n }\n}\n${companionSnippets}`;\n}\n\nfunction normalizeArgs(\n args: GenerateSmrtClassArgs,\n): NormalizedGenerateSmrtClassArgs {\n const template = args.template ?? 'basic';\n const templateDefaults = defaultsForTemplate(template);\n const tenantScoped =\n args.tenantScoped === true\n ? (templateDefaults.tenantScoped ?? { mode: 'required' as const })\n : args.tenantScoped === false\n ? undefined\n : (args.tenantScoped ?? templateDefaults.tenantScoped);\n\n return {\n className: args.className,\n properties: args.properties,\n baseClass: args.baseClass ?? 'SmrtObject',\n template,\n tableName: args.tableName ?? templateDefaults.tableName,\n conflictColumns:\n args.conflictColumns ?? templateDefaults.conflictColumns ?? [],\n tenantScoped: normalizeTenantScoped(tenantScoped),\n includeTenantIdField:\n args.includeTenantIdField ??\n templateDefaults.includeTenantIdField ??\n Boolean(tenantScoped),\n relationships: args.relationships ?? [],\n includeApiConfig: args.includeApiConfig ?? true,\n includeMcpConfig: args.includeMcpConfig ?? true,\n includeCliConfig: args.includeCliConfig ?? true,\n includeCompanionSnippets: args.includeCompanionSnippets ?? false,\n };\n}\n\nfunction defaultsForTemplate(template: TemplateVariant): {\n tableName?: string;\n conflictColumns?: string[];\n tenantScoped?: TenantScopedDefinition;\n includeTenantIdField?: boolean;\n} {\n switch (template) {\n case 'optional-catalog':\n return {\n tenantScoped: { mode: 'optional' },\n includeTenantIdField: true,\n conflictColumns: ['tenant_id', 'slug'],\n };\n case 'tenant-project-object':\n return {\n tenantScoped: { mode: 'required' },\n includeTenantIdField: true,\n };\n case 'tenant-event-log-object':\n return {\n tenantScoped: { mode: 'optional' },\n includeTenantIdField: true,\n };\n case 'global-catalog':\n return { conflictColumns: ['slug'] };\n case 'cross-package-reference':\n case 'basic':\n return {};\n }\n}\n\nfunction normalizeTenantScoped(\n value: boolean | TenantScopedDefinition | undefined,\n): TenantScopedDefinition | undefined {\n if (!value) return undefined;\n return {\n mode: typeof value === 'object' ? (value.mode ?? 'required') : 'required',\n field: typeof value === 'object' ? (value.field ?? 'tenantId') : 'tenantId',\n autoFilter: typeof value === 'object' ? value.autoFilter : undefined,\n autoPopulate: typeof value === 'object' ? value.autoPopulate : undefined,\n allowSuperAdminBypass:\n typeof value === 'object' ? value.allowSuperAdminBypass : undefined,\n };\n}\n\nfunction renderSmrtDecorator(options: {\n includeApiConfig: boolean;\n includeMcpConfig: boolean;\n includeCliConfig: boolean;\n tableName?: string;\n conflictColumns: string[];\n}): string {\n const decoratorConfig: Record<string, unknown> = {};\n\n if (options.tableName) {\n decoratorConfig.tableName = options.tableName;\n }\n\n if (options.conflictColumns.length > 0) {\n decoratorConfig.conflictColumns = options.conflictColumns;\n }\n\n if (options.includeApiConfig) {\n decoratorConfig.api = {\n include: ['list', 'get', 'create', 'update'],\n exclude: ['delete'],\n };\n }\n\n if (options.includeMcpConfig) {\n decoratorConfig.mcp = {\n include: ['list', 'get'],\n };\n }\n\n if (options.includeCliConfig) {\n decoratorConfig.cli = true;\n }\n\n return Object.keys(decoratorConfig).length > 0\n ? `@smrt(${JSON.stringify(decoratorConfig, null, 2)})`\n : '@smrt()';\n}\n\nfunction renderTenantIdField(tenantScoped: TenantScopedDefinition): string {\n const nullable = tenantScoped.mode === 'optional';\n const field = tenantScoped.field ?? 'tenantId';\n return nullable\n ? ` @tenantId({ nullable: true })\\n ${field}: string | null = null;`\n : ` @tenantId()\\n ${field}: string = '';`;\n}\n\nfunction renderProperty(prop: PropertyDefinition): string {\n const mapping = TYPE_MAPPING[prop.type];\n const nullable = prop.nullable === true;\n const tsType = nullable ? `${mapping.tsType} | null` : mapping.tsType;\n const defaultValue =\n prop.defaultValue !== undefined\n ? renderLiteral(prop.defaultValue)\n : nullable\n ? 'null'\n : mapping.defaultValue;\n const fieldOptions = compactObject({\n required: prop.required,\n nullable: prop.nullable,\n description: prop.description,\n });\n const jsdoc = prop.description ? ` /** ${prop.description} */\\n` : '';\n const decorator =\n Object.keys(fieldOptions).length > 0\n ? ` @field(${JSON.stringify(fieldOptions)})\\n`\n : '';\n\n return `${jsdoc}${decorator} ${prop.name}: ${tsType} = ${defaultValue};`;\n}\n\nfunction renderRelationship(relationship: RelationshipDefinition): string {\n const options = compactObject({\n required: relationship.required,\n nullable: relationship.nullable,\n description: relationship.description,\n validate: relationship.validate,\n foreignKey: relationship.foreignKey,\n through: relationship.through,\n sourceKey: relationship.sourceKey,\n targetKey: relationship.targetKey,\n });\n const args = [\n renderLiteral(relationship.related),\n ...(Object.keys(options).length > 0 ? [JSON.stringify(options)] : []),\n ];\n const decorator = `@${relationship.type}(${args.join(', ')})`;\n const fieldType =\n relationship.type === 'oneToMany' || relationship.type === 'manyToMany'\n ? 'unknown[]'\n : relationship.nullable\n ? 'string | null'\n : 'string';\n const defaultValue =\n relationship.type === 'oneToMany' || relationship.type === 'manyToMany'\n ? '[]'\n : relationship.nullable\n ? 'null'\n : \"''\";\n\n return ` ${decorator}\\n ${relationship.name}: ${fieldType} = ${defaultValue};`;\n}\n\nfunction needsFieldDecorator(properties: PropertyDefinition[]): boolean {\n return properties.some(\n (property) =>\n property.required !== undefined ||\n property.nullable !== undefined ||\n property.description !== undefined,\n );\n}\n\nfunction renderCompanionSnippets(\n className: string,\n usesTenantScoped: boolean,\n): string {\n const dependencyNote = usesTenantScoped\n ? `\\n * - Ensure package.json declares \"@happyvertical/smrt-tenancy\".`\n : '';\n return `/*\n * Package wiring:\n * - Export ${className} from the package entrypoint used by consumers.\n * - Import this module from any package registration file that eagerly loads objects.${dependencyNote}\n */`;\n}\n\nfunction renderObjectLiteral(value: Record<string, unknown>): string {\n return JSON.stringify(compactObject(value), null, 2);\n}\n\nfunction renderLiteral(value: unknown): string {\n if (typeof value === 'string') return JSON.stringify(value);\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n if (value === null) return 'null';\n return JSON.stringify(value, null, 2);\n}\n\nfunction compactObject<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n ) as T;\n}\n","/**\n * Project Introspection Tool\n * Returns a manifest-equivalent inventory of SMRT objects in a project.\n */\n\nimport type { Dirent } from 'node:fs';\nimport { access, readdir, readFile } from 'node:fs/promises';\nimport { isAbsolute, join, relative, resolve } from 'node:path';\nimport {\n ManifestGenerator,\n type SmartObjectManifest,\n} from '@happyvertical/smrt-core/scanner';\nimport type { ScanError } from '@happyvertical/smrt-scanner';\nimport { ManifestAdapter, OxcScanner } from '@happyvertical/smrt-scanner';\n\n/**\n * `summary` (default) returns one compact record per object; `full` returns the\n * verbose shape. A 42-object project produced 338,462 characters in the only\n * mode that used to exist, which put every call over tool-result budgets and\n * forced callers to write-to-file and `jq` (#2143).\n */\nexport type IntrospectDetail = 'summary' | 'full';\n\n/** Common shape both detail modes emit, so the two branches share a list. */\ntype IntrospectedObject = Record<string, unknown> & { className: string };\n\ninterface IntrospectProjectArgs {\n directory?: string;\n manifestPath?: string;\n includeFields?: boolean;\n includeRelationships?: boolean;\n includeMethods?: boolean;\n detail?: IntrospectDetail;\n /**\n * Overrides the default character budget for the serialized `objects` array.\n *\n * Project metadata and diagnostics are deliberately exempt: a diagnostic is\n * how discovery reports that it found nothing (#2143), so budgeting it away\n * would hide the very failure the caller needs to see. The full response is\n * therefore somewhat larger than this budget.\n */\n maxChars?: number;\n}\n\ntype DiagnosticSeverity = 'error' | 'warning' | 'info';\n\ninterface Diagnostic {\n severity: DiagnosticSeverity;\n message: string;\n filePath?: string;\n line?: number;\n column?: number;\n}\n\ninterface ManifestLike {\n version?: string;\n packageName?: string;\n packageVersion?: string;\n objects?: Record<string, ManifestObject>;\n}\n\ninterface ManifestObject {\n name?: string;\n className: string;\n qualifiedName?: string;\n collection?: string;\n filePath: string;\n packageName?: string;\n packageVersion?: string;\n importPath?: string;\n modulePath?: string;\n exportName?: string;\n collectionExportName?: string;\n fields?: Record<string, ManifestField>;\n methods?: Record<string, ManifestMethod>;\n decoratorConfig?: Record<string, unknown>;\n extends?: string;\n extendsTypeArg?: string;\n schema?: ManifestSchema;\n staticProperties?: Record<string, unknown>;\n validationRules?: Record<string, unknown>;\n}\n\ninterface ManifestField {\n type: string;\n required?: boolean;\n default?: unknown;\n related?: string;\n description?: string;\n _meta?: Record<string, unknown>;\n transient?: boolean;\n}\n\ninterface ManifestMethod {\n name?: string;\n async?: boolean;\n parameters?: Array<{\n name: string;\n type?: string;\n optional?: boolean;\n default?: unknown;\n }>;\n returnType?: string;\n description?: string;\n isStatic?: boolean;\n isPublic?: boolean;\n}\n\ninterface ManifestSchema {\n tableName?: string;\n ddl?: string;\n columns?: Record<string, unknown>;\n indexes?: Array<{\n name?: string;\n columns?: string[];\n unique?: boolean;\n where?: string;\n jsonPath?: unknown;\n }>;\n version?: string;\n}\n\ninterface PackageMetadata {\n name?: string;\n version?: string;\n json?: Record<string, unknown>;\n}\n\nconst DEFAULT_MANIFEST_PATHS = [\n '.smrt/manifest.json',\n 'dist/manifest.json',\n 'src/manifest/manifest.json',\n];\n\nconst SCAN_EXCLUDE = [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/.git/**',\n '**/.smrt/**',\n '**/*.d.ts',\n '**/*.test.ts',\n '**/*.spec.ts',\n '**/__tests__/**',\n];\n\nconst RELATIONSHIP_TYPES = new Set([\n 'foreignKey',\n 'crossPackageRef',\n 'oneToMany',\n 'manyToMany',\n]);\n\n/**\n * Response budget in characters. Generous enough that a 42-object summary never\n * truncates, while still capping a runaway payload instead of emitting one.\n */\nconst DEFAULT_MAX_CHARS = 50_000;\n\nconst DEFAULT_MCP_OPERATIONS = ['list', 'get', 'create', 'update', 'delete'];\n\nexport async function introspectProject(\n args: IntrospectProjectArgs,\n): Promise<string> {\n const {\n directory = process.cwd(),\n includeFields = true,\n includeRelationships = true,\n includeMethods = true,\n detail = 'summary',\n maxChars = DEFAULT_MAX_CHARS,\n } = args;\n const projectPath = resolve(directory);\n\n const exists = await pathExists(projectPath);\n if (!exists) {\n return JSON.stringify(\n {\n projectPath,\n manifestSource: 'none',\n objectCount: 0,\n objects: [],\n diagnostics: [\n {\n severity: 'warning',\n message: `Project directory does not exist: ${projectPath}`,\n },\n ],\n },\n null,\n 2,\n );\n }\n\n const packageMetadata = await readPackageMetadata(projectPath);\n const tenantScopes = await scanTenantScopes(projectPath);\n const manifestResult =\n (await loadManifestArtifact(projectPath, args.manifestPath)) ??\n (await scanSourceManifest(projectPath, packageMetadata));\n\n const entries = Object.entries(manifestResult.manifest.objects ?? {});\n const objects: IntrospectedObject[] =\n detail === 'summary'\n ? entries.map(([manifestKey, object]) =>\n summarizeObject({\n manifestKey,\n object,\n projectPath,\n tenantScope: tenantScopes.get(object.className),\n }),\n )\n : entries.map(([manifestKey, object]) =>\n formatObject({\n manifestKey,\n object,\n projectPath,\n includeFields,\n includeRelationships,\n includeMethods,\n tenantScope: tenantScopes.get(object.className),\n }),\n );\n objects.sort((left, right) => left.className.localeCompare(right.className));\n\n const { kept, omitted } = applyObjectBudget(objects, maxChars);\n\n const output = {\n projectPath,\n manifestSource: manifestResult.source,\n manifestPath:\n 'path' in manifestResult\n ? relative(projectPath, manifestResult.path)\n : undefined,\n packageName:\n manifestResult.manifest.packageName ?? packageMetadata.name ?? undefined,\n packageVersion:\n manifestResult.manifest.packageVersion ??\n packageMetadata.version ??\n undefined,\n detail,\n objectCount: objects.length,\n scannedFileCount: manifestResult.scannedFileCount,\n parseTimeMs: manifestResult.parseTimeMs,\n ...(omitted > 0\n ? {\n truncated: {\n returnedObjectCount: kept.length,\n omittedObjectCount: omitted,\n budgetChars: maxChars,\n guidance:\n 'The object list hit its character budget; metadata and diagnostics are still complete. Narrow the scan with `directory` (a single package), keep `detail: \"summary\"`, or raise `maxChars` deliberately. Object names are sorted alphabetically, so omitted objects are the alphabetical tail.',\n },\n }\n : {}),\n objects: kept,\n diagnostics: manifestResult.diagnostics,\n };\n\n return JSON.stringify(output, null, 2);\n}\n\n/**\n * Trims the object list to the character budget, always keeping at least one so\n * a caller sees the shape rather than an empty list.\n */\nfunction applyObjectBudget<T>(\n objects: T[],\n maxChars: number,\n): { kept: T[]; omitted: number } {\n const kept: T[] = [];\n let used = 0;\n\n for (const object of objects) {\n const size = JSON.stringify(object, null, 2).length + 2;\n if (used + size > maxChars && kept.length > 0) break;\n used += size;\n kept.push(object);\n }\n\n return { kept, omitted: objects.length - kept.length };\n}\n\nfunction summarizeObject({\n manifestKey,\n object,\n projectPath,\n tenantScope,\n}: {\n manifestKey: string;\n object: ManifestObject;\n projectPath: string;\n tenantScope?: Record<string, unknown>;\n}) {\n const fields = Object.entries(object.fields ?? {});\n const decoratorConfig = object.decoratorConfig ?? {};\n\n return compactObject({\n manifestKey,\n className: object.className,\n qualifiedName: object.qualifiedName,\n filePath: sanitizePath(projectPath, object.filePath),\n extends: object.extends,\n collection: object.collection,\n tableName:\n object.schema?.tableName ??\n stringFromConfig(decoratorConfig.tableName) ??\n object.collection,\n tenantScope:\n tenantScope ?? normalizeTenantScopedConfig(decoratorConfig.tenantScoped),\n fieldCount: fields.length,\n relationships:\n fields\n .filter(([, field]) => RELATIONSHIP_TYPES.has(field.type))\n .map(\n ([name, field]) =>\n `${name} -> ${field.related ?? ''} (${field.type})`,\n )\n .join(', ') || undefined,\n mcpOperations: mcpOperationsFromConfig(decoratorConfig.mcp),\n });\n}\n\n/**\n * An omitted `mcp` config means full CRUD, not a closed surface — the same rule\n * the knowledge index applies.\n */\nfunction mcpOperationsFromConfig(config: unknown): string[] {\n if (config === false) return [];\n if (typeof config !== 'object' || config === null || Array.isArray(config)) {\n return [...DEFAULT_MCP_OPERATIONS];\n }\n\n const record = config as Record<string, unknown>;\n const include = Array.isArray(record.include)\n ? record.include.filter((item): item is string => typeof item === 'string')\n : DEFAULT_MCP_OPERATIONS;\n const exclude = new Set(\n Array.isArray(record.exclude)\n ? record.exclude.filter(\n (item): item is string => typeof item === 'string',\n )\n : [],\n );\n\n return include.filter((operation) => !exclude.has(operation));\n}\n\nasync function loadManifestArtifact(\n projectPath: string,\n manifestPath: string | undefined,\n): Promise<\n | {\n source: 'manifest';\n path: string;\n manifest: ManifestLike;\n diagnostics: Diagnostic[];\n scannedFileCount?: number;\n parseTimeMs?: number;\n }\n | undefined\n> {\n const candidates = manifestPath\n ? [resolve(projectPath, manifestPath)]\n : DEFAULT_MANIFEST_PATHS.map((candidate) => join(projectPath, candidate));\n\n const diagnostics: Diagnostic[] = [];\n for (const candidate of candidates) {\n if (!(await pathExists(candidate))) {\n continue;\n }\n\n try {\n const parsed = JSON.parse(await readFile(candidate, 'utf-8')) as unknown;\n if (isManifestLike(parsed)) {\n return {\n source: 'manifest',\n path: candidate,\n manifest: parsed,\n diagnostics,\n };\n }\n\n diagnostics.push({\n severity: 'warning',\n filePath: candidate,\n message: 'Manifest artifact is present but does not contain objects.',\n });\n } catch (error) {\n diagnostics.push({\n severity: 'error',\n filePath: candidate,\n message: `Unable to parse manifest artifact: ${messageFromError(error)}`,\n });\n }\n }\n\n return manifestPath\n ? {\n source: 'manifest',\n path: resolve(projectPath, manifestPath),\n manifest: { objects: {} },\n diagnostics: [\n ...diagnostics,\n {\n severity: 'warning',\n filePath: resolve(projectPath, manifestPath),\n message: 'Requested manifest artifact was not found.',\n },\n ],\n }\n : undefined;\n}\n\nasync function scanSourceManifest(\n projectPath: string,\n packageMetadata: PackageMetadata,\n): Promise<{\n source: 'scanner';\n manifest: ManifestLike;\n diagnostics: Diagnostic[];\n scannedFileCount: number;\n parseTimeMs: number;\n}> {\n const scanner = new OxcScanner({\n cwd: projectPath,\n include: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'],\n exclude: SCAN_EXCLUDE,\n });\n const { results, resolved } = await scanner.scanAndResolve();\n const adapter = new ManifestAdapter();\n const manifest = adapter.toManifest(\n resolved.filter((classDef) => classDef.hasSmartDecorator),\n {\n packageName: packageMetadata.name,\n packageVersion: packageMetadata.version,\n typeAliases: results.typeAliases,\n },\n ) as ManifestLike;\n finalizeScannerManifest(manifest, packageMetadata);\n\n return {\n source: 'scanner',\n manifest,\n diagnostics: results.errors.map(scanErrorToDiagnostic),\n scannedFileCount: results.fileCount,\n parseTimeMs: Math.round(results.totalParseTimeMs),\n };\n}\n\nfunction finalizeScannerManifest(\n manifest: ManifestLike,\n packageMetadata: PackageMetadata,\n): void {\n const manifestGen = new ManifestGenerator();\n const fullManifest = manifest as unknown as SmartObjectManifest;\n withSuppressedConsoleLog(() => {\n manifestGen.injectTenantScopedFields(fullManifest);\n manifestGen.mergeInheritedFields(fullManifest);\n manifestGen.generateValidationRules(fullManifest);\n manifestGen.generateSchemas(fullManifest);\n manifestGen.assertTenantScopedSchemaContract(fullManifest);\n manifestGen.generateAgentManifests(\n fullManifest,\n packageMetadata.name,\n packageMetadata.json,\n );\n });\n}\n\nfunction withSuppressedConsoleLog<T>(callback: () => T): T {\n const originalLog = console.log;\n console.log = () => undefined;\n try {\n return callback();\n } finally {\n console.log = originalLog;\n }\n}\n\nfunction formatObject({\n manifestKey,\n object,\n projectPath,\n includeFields,\n includeRelationships,\n includeMethods,\n tenantScope,\n}: {\n manifestKey: string;\n object: ManifestObject;\n projectPath: string;\n includeFields: boolean;\n includeRelationships: boolean;\n includeMethods: boolean;\n tenantScope?: Record<string, unknown>;\n}) {\n const fieldDetails = Object.entries(object.fields ?? {}).map(\n ([name, field]) => ({\n name,\n type: field.type,\n ...(field.required !== undefined ? { required: field.required } : {}),\n ...(field.default !== undefined ? { default: field.default } : {}),\n ...(field.related ? { related: field.related } : {}),\n ...(field.description ? { description: field.description } : {}),\n ...(field._meta ? { meta: field._meta } : {}),\n ...(field.transient !== undefined ? { transient: field.transient } : {}),\n }),\n );\n const relationshipDetails = fieldDetails\n .filter((field) => RELATIONSHIP_TYPES.has(field.type))\n .map((field) => ({\n field: field.name,\n relatedClass: field.related ?? '',\n type: field.type,\n ...(field.meta ? { meta: field.meta } : {}),\n }));\n const methodDetails = Object.entries(object.methods ?? {}).map(\n ([name, method]) => ({\n name: method.name ?? name,\n isAsync: method.async === true,\n isStatic: method.isStatic === true,\n isPublic: method.isPublic !== false,\n parameters: method.parameters ?? [],\n returnType: method.returnType ?? 'unknown',\n ...(method.description ? { description: method.description } : {}),\n }),\n );\n\n const decoratorConfig = object.decoratorConfig ?? {};\n const effectiveTenantScope =\n tenantScope ?? normalizeTenantScopedConfig(decoratorConfig.tenantScoped);\n const schema = object.schema;\n\n return compactObject({\n manifestKey,\n name: object.name,\n className: object.className,\n qualifiedName: object.qualifiedName,\n filePath: sanitizePath(projectPath, object.filePath),\n packageName: object.packageName,\n packageVersion: object.packageVersion,\n importPath: object.importPath,\n modulePath: object.modulePath,\n exportName: object.exportName,\n collectionExportName: object.collectionExportName,\n collection: object.collection,\n extends: object.extends,\n extendsTypeArg: object.extendsTypeArg,\n tableName:\n schema?.tableName ??\n stringFromConfig(decoratorConfig.tableName) ??\n object.collection,\n tableStrategy: stringFromConfig(decoratorConfig.tableStrategy) ?? 'cti',\n conflictColumns: arrayFromConfig(decoratorConfig.conflictColumns),\n tenantScope: effectiveTenantScope,\n decoratorConfig,\n schema: schema\n ? {\n tableName: schema.tableName,\n columns: schema.columns,\n indexes: schema.indexes ?? [],\n version: schema.version,\n }\n : undefined,\n indexes: schema?.indexes ?? [],\n staticProperties: object.staticProperties,\n validationRules: object.validationRules,\n ...(includeFields && {\n fields: fieldDetails\n .map((field) => `${field.name}: ${field.type}`)\n .join(', '),\n fieldDetails,\n }),\n ...(includeRelationships &&\n relationshipDetails.length > 0 && {\n relationships: relationshipDetails\n .map(\n (relationship) =>\n `${relationship.field} -> ${relationship.relatedClass} (${relationship.type})`,\n )\n .join(', '),\n relationshipDetails,\n }),\n ...(includeMethods &&\n methodDetails.length > 0 && {\n methods: methodDetails\n .map((method) => `${method.isAsync ? 'async ' : ''}${method.name}()`)\n .join(', '),\n methodDetails,\n }),\n });\n}\n\nasync function scanTenantScopes(\n projectPath: string,\n): Promise<Map<string, Record<string, unknown>>> {\n const files = await listSourceFiles(projectPath);\n const scopes = new Map<string, Record<string, unknown>>();\n\n await Promise.all(\n files.map(async (filePath) => {\n const content = await readFile(filePath, 'utf-8');\n const classMatches = content.matchAll(/class\\s+([A-Za-z_]\\w*)\\b/g);\n for (const match of classMatches) {\n const className = match[1];\n if (!className || match.index === undefined) continue;\n const prefix = content.slice(\n Math.max(0, match.index - 800),\n match.index,\n );\n const tenantMatches = Array.from(\n prefix.matchAll(/@TenantScoped\\s*\\(([\\s\\S]*?)\\)/g),\n );\n const tenantMatch = tenantMatches.at(-1);\n if (!tenantMatch) continue;\n scopes.set(className, {\n source: 'TenantScoped',\n ...parseTenantScopedOptions(tenantMatch[1]),\n });\n }\n }),\n );\n\n return scopes;\n}\n\nasync function listSourceFiles(projectPath: string): Promise<string[]> {\n const files: string[] = [];\n\n async function visit(dir: string): Promise<void> {\n let entries: Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n if (\n [\n 'node_modules',\n 'dist',\n 'build',\n '.git',\n '.smrt',\n '__tests__',\n ].includes(entry.name) ||\n entry.name.startsWith('.')\n ) {\n continue;\n }\n await visit(fullPath);\n continue;\n }\n\n if (\n entry.isFile() &&\n /\\.(tsx?|jsx?)$/.test(entry.name) &&\n !entry.name.endsWith('.d.ts') &&\n !entry.name.endsWith('.test.ts') &&\n !entry.name.endsWith('.spec.ts')\n ) {\n files.push(fullPath);\n }\n }\n }\n\n await visit(projectPath);\n return files;\n}\n\nfunction parseTenantScopedOptions(raw: string): Record<string, unknown> {\n const mode = raw.match(/mode\\s*:\\s*['\"`](required|optional)['\"`]/)?.[1];\n const field = raw.match(/field\\s*:\\s*['\"`]([A-Za-z_]\\w*)['\"`]/)?.[1];\n const allowSuperAdminBypass = raw.match(\n /allowSuperAdminBypass\\s*:\\s*(true|false)/,\n )?.[1];\n const autoFilter = raw.match(/autoFilter\\s*:\\s*(true|false)/)?.[1];\n const autoPopulate = raw.match(/autoPopulate\\s*:\\s*(true|false)/)?.[1];\n\n return compactObject({\n mode: mode ?? 'required',\n field: field ?? 'tenantId',\n autoFilter: autoFilter === undefined ? undefined : autoFilter === 'true',\n autoPopulate:\n autoPopulate === undefined ? undefined : autoPopulate === 'true',\n allowSuperAdminBypass:\n allowSuperAdminBypass === undefined\n ? undefined\n : allowSuperAdminBypass === 'true',\n });\n}\n\nfunction normalizeTenantScopedConfig(\n tenantScoped: unknown,\n): Record<string, unknown> | undefined {\n if (!tenantScoped) return undefined;\n const options =\n typeof tenantScoped === 'object' && !Array.isArray(tenantScoped)\n ? (tenantScoped as Record<string, unknown>)\n : {};\n return {\n source: 'smrt',\n mode: options.mode ?? 'required',\n field: options.field ?? 'tenantId',\n autoFilter: options.autoFilter ?? true,\n autoPopulate: options.autoPopulate ?? true,\n allowSuperAdminBypass: options.allowSuperAdminBypass ?? false,\n };\n}\n\nasync function readPackageMetadata(\n projectPath: string,\n): Promise<PackageMetadata> {\n const packageJsonPath = join(projectPath, 'package.json');\n if (!(await pathExists(packageJsonPath))) return {};\n\n try {\n const json = JSON.parse(await readFile(packageJsonPath, 'utf-8')) as Record<\n string,\n unknown\n >;\n return {\n name: typeof json.name === 'string' ? json.name : undefined,\n version: typeof json.version === 'string' ? json.version : undefined,\n json,\n };\n } catch {\n return {};\n }\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isManifestLike(value: unknown): value is ManifestLike {\n return (\n !!value &&\n typeof value === 'object' &&\n !!(value as ManifestLike).objects &&\n typeof (value as ManifestLike).objects === 'object'\n );\n}\n\nfunction scanErrorToDiagnostic(error: ScanError): Diagnostic {\n return {\n severity: error.severity,\n message: error.message,\n filePath: error.filePath,\n line: error.line,\n column: error.column,\n };\n}\n\nfunction sanitizePath(projectPath: string, filePath: string): string {\n const absolute = isAbsolute(filePath)\n ? filePath\n : resolve(projectPath, filePath);\n const relativePath = relative(projectPath, absolute);\n if (!relativePath.startsWith('..')) {\n return relativePath || filePath;\n }\n return filePath;\n}\n\nfunction stringFromConfig(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction arrayFromConfig(value: unknown): string[] | undefined {\n return Array.isArray(value)\n ? value.filter((item): item is string => typeof item === 'string')\n : undefined;\n}\n\nfunction compactObject<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n ) as T;\n}\n\nfunction messageFromError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","/**\n * Ecosystem-aware downstream project review.\n * Advisory only: scans manifests and source files, then reports alignment risks.\n */\n\nimport { type Dirent, existsSync } from 'node:fs';\nimport { access, readdir, readFile } from 'node:fs/promises';\nimport { dirname, join, relative, resolve, sep } from 'node:path';\n\ninterface ReviewSmrtProjectArgs {\n directory?: string;\n rootDir?: string;\n includeSourceEvidence?: boolean;\n maxFindings?: number;\n}\n\ntype Severity = 'high' | 'medium' | 'low';\n\ninterface Evidence {\n filePath: string;\n line?: number;\n detail: string;\n}\n\ninterface Finding {\n severity: Severity;\n area:\n | 'dependencies'\n | 'storage'\n | 'api-shell'\n | 'manifest'\n | 'auth-tenancy'\n | 'ui-shell';\n code: string;\n title: string;\n evidence: Evidence[];\n recommendation: string;\n suggestedIssueTitle: string;\n}\n\ninterface PackageInventory {\n name: string;\n path: string;\n private?: boolean;\n scripts: string[];\n declaredHappyVerticalDependencies: string[];\n importedHappyVerticalPackages: string[];\n missingHappyVerticalDependencies: string[];\n hasSvelteKit: boolean;\n hasSmrtSvelte: boolean;\n}\n\ninterface PackageContext {\n directory: string;\n relativePath: string;\n packageJsonPath: string;\n json: Record<string, unknown>;\n dependencies: Set<string>;\n scripts: Record<string, unknown>;\n imports: Map<string, Evidence[]>;\n sourceFiles: SourceFile[];\n}\n\ninterface SourceFile {\n path: string;\n packageDir: string;\n content: string;\n}\n\nconst SOURCE_EXTENSIONS = /\\.(tsx?|jsx?|svelte)$/;\nconst SKIP_DIRS = new Set([\n 'node_modules',\n 'dist',\n 'build',\n '.git',\n '.smrt',\n '.svelte-kit',\n 'coverage',\n]);\nconst DEPENDENCY_SECTIONS = [\n 'dependencies',\n 'devDependencies',\n 'peerDependencies',\n 'optionalDependencies',\n];\nconst SMRT_PACKAGE_PREFIX = '@happyvertical/smrt-';\nconst HAPPYVERTICAL_PACKAGE_PREFIX = '@happyvertical/';\n\nexport async function reviewSmrtProject(\n args: ReviewSmrtProjectArgs,\n): Promise<string> {\n const projectPath = resolve(args.directory ?? args.rootDir ?? process.cwd());\n if (!(await pathExists(projectPath))) {\n return JSON.stringify(\n {\n projectPath,\n packageCount: 0,\n packages: [],\n findings: [],\n summary: { high: 0, medium: 0, low: 0 },\n diagnostics: [\n {\n severity: 'warning',\n message: `Project directory does not exist: ${projectPath}`,\n },\n ],\n },\n null,\n 2,\n );\n }\n\n const packageContexts = await buildPackageContexts(projectPath);\n const sourceFiles = await listSourceFiles(projectPath, packageContexts);\n await attachSourceFiles(sourceFiles, packageContexts, projectPath);\n\n const findings = limitFindings(\n [\n ...findMissingHappyVerticalDependencies(packageContexts),\n ...findCustomManifestGeneration(sourceFiles, projectPath),\n ...findDirectStorageBypasses(sourceFiles, packageContexts, projectPath),\n ...findCustomHttpShells(sourceFiles, packageContexts, projectPath),\n ...findLocalAuthTenancy(sourceFiles, packageContexts, projectPath),\n ...findUiShellDrift(packageContexts, projectPath),\n ...findMissingManifestArtifacts(\n sourceFiles,\n packageContexts,\n projectPath,\n ),\n ],\n args.maxFindings,\n );\n\n const packages = packageContexts\n .map(packageInventory)\n .sort((left, right) => left.path.localeCompare(right.path));\n const summary = summarizeFindings(findings);\n\n return JSON.stringify(\n {\n projectPath,\n packageCount: packages.length,\n packages,\n findings:\n args.includeSourceEvidence === false\n ? findings.map(({ evidence: _evidence, ...finding }) => finding)\n : findings,\n summary,\n referenceChecks: [\n 'Prefer SMRT scanner/runtime manifests over custom manifest builders.',\n 'Prefer SvelteKit plus @happyvertical/smrt-svelte for app shells.',\n 'Prefer @happyvertical/sql and @happyvertical/files/assets/content over direct durable node:fs storage.',\n 'Prefer smrt-users, smrt-tenancy, and profile/audit packages over local static auth seams.',\n ],\n suggestedFollowUpIssues: findings.map((finding) => ({\n title: finding.suggestedIssueTitle,\n severity: finding.severity,\n area: finding.area,\n })),\n },\n null,\n 2,\n );\n}\n\nasync function buildPackageContexts(\n projectPath: string,\n): Promise<PackageContext[]> {\n const packageJsonPaths = await listPackageJsonFiles(projectPath);\n const contexts = await Promise.all(\n packageJsonPaths.map(async (packageJsonPath) => {\n const json = JSON.parse(\n await readFile(packageJsonPath, 'utf-8'),\n ) as Record<string, unknown>;\n const directory = dirname(packageJsonPath);\n return {\n directory,\n relativePath: relative(projectPath, directory) || '.',\n packageJsonPath,\n json,\n dependencies: collectDependencies(json),\n scripts: isRecord(json.scripts)\n ? (json.scripts as Record<string, unknown>)\n : {},\n imports: new Map<string, Evidence[]>(),\n sourceFiles: [],\n };\n }),\n );\n\n if (contexts.length === 0) {\n contexts.push({\n directory: projectPath,\n relativePath: '.',\n packageJsonPath: join(projectPath, 'package.json'),\n json: {},\n dependencies: new Set(),\n scripts: {},\n imports: new Map(),\n sourceFiles: [],\n });\n }\n\n return contexts.sort(\n (left, right) => left.directory.length - right.directory.length,\n );\n}\n\nasync function listPackageJsonFiles(projectPath: string): Promise<string[]> {\n const files: string[] = [];\n await visit(projectPath, async (filePath, entryName) => {\n if (entryName === 'package.json') files.push(filePath);\n });\n return files;\n}\n\nasync function listSourceFiles(\n projectPath: string,\n packages: PackageContext[],\n): Promise<SourceFile[]> {\n const files: SourceFile[] = [];\n await visit(projectPath, async (filePath, entryName) => {\n if (!SOURCE_EXTENSIONS.test(entryName)) return;\n if (\n entryName.endsWith('.d.ts') ||\n entryName.endsWith('.test.ts') ||\n entryName.endsWith('.spec.ts')\n ) {\n return;\n }\n\n const packageDir = findOwningPackage(filePath, packages).directory;\n const content = await readFile(filePath, 'utf-8');\n files.push({ path: filePath, packageDir, content });\n });\n return files;\n}\n\nasync function attachSourceFiles(\n sourceFiles: SourceFile[],\n packages: PackageContext[],\n projectPath: string,\n): Promise<void> {\n for (const sourceFile of sourceFiles) {\n const owner = packages.find(\n (pkg) => pkg.directory === sourceFile.packageDir,\n );\n if (!owner) continue;\n owner.sourceFiles.push(sourceFile);\n for (const importedPackage of extractImports(sourceFile.content)) {\n if (!importedPackage.startsWith(HAPPYVERTICAL_PACKAGE_PREFIX)) continue;\n const evidence = {\n filePath: relative(projectPath, sourceFile.path),\n line: lineNumber(sourceFile.content, importedPackage),\n detail: `Imports ${importedPackage}`,\n };\n const existing = owner.imports.get(importedPackage) ?? [];\n existing.push(evidence);\n owner.imports.set(importedPackage, existing);\n }\n }\n}\n\nfunction findMissingHappyVerticalDependencies(\n packages: PackageContext[],\n): Finding[] {\n return packages.flatMap((pkg) => {\n const ownName =\n typeof pkg.json.name === 'string' ? pkg.json.name : undefined;\n const missing = Array.from(pkg.imports.keys()).filter(\n (importedPackage) =>\n importedPackage !== ownName && !pkg.dependencies.has(importedPackage),\n );\n if (missing.length === 0) return [];\n\n const hasSmrtMissing = missing.some((name) =>\n name.startsWith(SMRT_PACKAGE_PREFIX),\n );\n return [\n {\n severity: hasSmrtMissing ? 'high' : 'medium',\n area: 'dependencies',\n code: 'missing-happyvertical-dependencies',\n title: `${packageLabel(pkg)} imports HappyVertical packages that package.json does not declare`,\n evidence: missing.flatMap((name) => pkg.imports.get(name) ?? []),\n recommendation:\n 'Declare every imported @happyvertical package in the owning package manifest so downstream installs and generated knowledge stay reproducible.',\n suggestedIssueTitle: `Declare missing HappyVertical dependencies in ${packageLabel(pkg)}`,\n },\n ];\n });\n}\n\nfunction findCustomManifestGeneration(\n sourceFiles: SourceFile[],\n projectPath: string,\n): Finding[] {\n return sourceFiles\n .filter(\n (file) =>\n /manifest\\.json/.test(file.content) &&\n /objects\\s*:/.test(file.content) &&\n /\\b(writeFile|writeFileSync)\\b/.test(file.content) &&\n !/@happyvertical\\/smrt-scanner/.test(file.content),\n )\n .map((file) => ({\n severity: 'high',\n area: 'manifest',\n code: 'custom-object-manifest-generation',\n title: 'Custom SMRT object manifest generation detected',\n evidence: [\n {\n filePath: relative(projectPath, file.path),\n line: lineNumber(file.content, 'manifest.json'),\n detail:\n 'Writes a manifest.json object inventory outside the SMRT scanner/runtime path.',\n },\n ],\n recommendation:\n 'Use the SMRT scanner/runtime manifest path so defaults, relationships, schemas, tenant fields, and cross-package references match framework behavior.',\n suggestedIssueTitle:\n 'Replace custom object manifest generation with SMRT scanner/runtime manifest generation',\n }));\n}\n\nfunction findDirectStorageBypasses(\n sourceFiles: SourceFile[],\n packages: PackageContext[],\n projectPath: string,\n): Finding[] {\n return sourceFiles.flatMap((file) => {\n const owner = findOwningPackage(file.path, packages);\n const usesFs =\n /from\\s+['\"](?:node:fs|node:fs\\/promises|fs|fs\\/promises)['\"]|require\\(['\"](?:node:fs|node:fs\\/promises|fs|fs\\/promises)['\"]\\)/.test(\n file.content,\n );\n const writesDurableData =\n /\\b(writeFile|appendFile|mkdir|rm|rename)\\b/.test(file.content) &&\n /(\\.json|data|storage|persist|cache|db)/i.test(file.content);\n const usesDirectSql =\n /from\\s+['\"](?:better-sqlite3|sqlite3|pg|mysql2?|knex|drizzle-orm)['\"]/.test(\n file.content,\n );\n if ((!usesFs || !writesDurableData) && !usesDirectSql) return [];\n\n const hasApprovedStorage =\n owner.dependencies.has('@happyvertical/sql') ||\n owner.dependencies.has('@happyvertical/files') ||\n owner.dependencies.has('@happyvertical/smrt-assets') ||\n owner.dependencies.has('@happyvertical/smrt-content');\n\n if (hasApprovedStorage) return [];\n\n return [\n {\n severity: 'medium',\n area: 'storage',\n code: 'direct-storage-bypass',\n title: `${packageLabel(owner)} appears to bypass HappyVertical storage packages`,\n evidence: [\n {\n filePath: relative(projectPath, file.path),\n line: lineNumber(\n file.content,\n usesDirectSql ? 'sqlite' : 'writeFile',\n ),\n detail: usesDirectSql\n ? 'Imports a direct SQL/storage library without @happyvertical/sql.'\n : 'Uses node:fs-style durable writes without @happyvertical/files/assets/content.',\n },\n ],\n recommendation:\n 'Route durable data through @happyvertical/sql, @happyvertical/files, SMRT assets, or SMRT content unless this is explicitly build-only tooling.',\n suggestedIssueTitle: `Review direct storage usage in ${packageLabel(owner)}`,\n },\n ];\n });\n}\n\nfunction findCustomHttpShells(\n sourceFiles: SourceFile[],\n packages: PackageContext[],\n projectPath: string,\n): Finding[] {\n const evidenceByPackage = new Map<PackageContext, Evidence[]>();\n\n for (const pkg of packages) {\n if (pkg.dependencies.has('@sveltejs/kit')) continue;\n\n const routerDependencies = ['express', 'fastify', 'hono', 'koa'].filter(\n (dep) => pkg.dependencies.has(dep),\n );\n if (routerDependencies.length === 0) continue;\n\n appendEvidence(evidenceByPackage, pkg, {\n filePath: relative(projectPath, pkg.packageJsonPath),\n detail: `Declares custom router package(s): ${routerDependencies.join(', ')}.`,\n });\n }\n\n for (const file of sourceFiles) {\n const owner = findOwningPackage(file.path, packages);\n if (owner.dependencies.has('@sveltejs/kit')) continue;\n\n const usesNodeHttp =\n /from\\s+['\"](?:node:http|http|node:https|https)['\"]|createServer\\s*\\(/.test(\n file.content,\n );\n if (!usesNodeHttp) continue;\n\n appendEvidence(evidenceByPackage, owner, {\n filePath: relative(projectPath, file.path),\n line: lineNumber(file.content, 'createServer'),\n detail:\n 'Custom HTTP routing found without the SvelteKit/SMRT app-shell dependency pattern.',\n });\n }\n\n return Array.from(evidenceByPackage.entries()).map(([owner, evidence]) => ({\n severity: 'medium',\n area: 'api-shell',\n code: 'custom-http-shell',\n title: `${packageLabel(owner)} uses a custom HTTP shell`,\n evidence,\n recommendation:\n 'Compare the app shell against the Anytown/Ergot SvelteKit + SMRT shell pattern before adding custom HTTP infrastructure.',\n suggestedIssueTitle: `Align ${packageLabel(owner)} app shell with SMRT/SvelteKit conventions`,\n }));\n}\n\nfunction appendEvidence(\n evidenceByPackage: Map<PackageContext, Evidence[]>,\n pkg: PackageContext,\n evidence: Evidence,\n): void {\n const existing = evidenceByPackage.get(pkg);\n if (existing) {\n existing.push(evidence);\n return;\n }\n\n evidenceByPackage.set(pkg, [evidence]);\n}\n\nfunction findLocalAuthTenancy(\n sourceFiles: SourceFile[],\n packages: PackageContext[],\n projectPath: string,\n): Finding[] {\n return sourceFiles.flatMap((file) => {\n const owner = findOwningPackage(file.path, packages);\n const pathSignal = /(auth|tenant|audit|session|rbac|user)/i.test(file.path);\n const codeSignal =\n /\\b(tenantId|tenant|role|permission|session|auditLog|apiKey)\\b/.test(\n file.content,\n );\n if (!pathSignal || !codeSignal) return [];\n\n const hasApprovedPackages =\n owner.dependencies.has('@happyvertical/smrt-users') ||\n owner.dependencies.has('@happyvertical/smrt-tenancy') ||\n owner.dependencies.has('@happyvertical/smrt-profiles');\n if (hasApprovedPackages) return [];\n\n return [\n {\n severity: 'medium',\n area: 'auth-tenancy',\n code: 'local-auth-tenancy',\n title: `${packageLabel(owner)} contains local auth/tenancy/audit logic`,\n evidence: [\n {\n filePath: relative(projectPath, file.path),\n line: lineNumber(file.content, 'tenant'),\n detail:\n 'Auth, tenancy, session, role, or audit terminology appears without smrt-users/smrt-tenancy/smrt-profiles dependencies.',\n },\n ],\n recommendation:\n 'Add explicit adapters to smrt-users, smrt-tenancy, and profile/audit models or document why this local implementation is intentionally isolated.',\n suggestedIssueTitle: `Review auth and tenancy adapters in ${packageLabel(owner)}`,\n },\n ];\n });\n}\n\nfunction findUiShellDrift(\n packages: PackageContext[],\n projectPath: string,\n): Finding[] {\n return packages.flatMap((pkg) => {\n const hasUiSource = pkg.sourceFiles.some((file) =>\n file.path.endsWith('.svelte'),\n );\n const likelyUiPackage =\n hasUiSource ||\n /(?:web|ui|app|site|frontend)/i.test(packageLabel(pkg)) ||\n pkg.dependencies.has('svelte') ||\n pkg.dependencies.has('vite');\n if (!likelyUiPackage) return [];\n if (pkg.dependencies.has('@happyvertical/smrt-svelte')) return [];\n\n return [\n {\n severity: 'low',\n area: 'ui-shell',\n code: 'missing-smrt-svelte-shell',\n title: `${packageLabel(pkg)} looks like UI work without @happyvertical/smrt-svelte`,\n evidence: [\n {\n filePath: relative(projectPath, pkg.packageJsonPath),\n detail:\n 'UI-facing package does not declare @happyvertical/smrt-svelte.',\n },\n ],\n recommendation:\n 'Use @happyvertical/smrt-svelte and the SvelteKit shell pattern for downstream app UI unless this package is intentionally framework-agnostic.',\n suggestedIssueTitle: `Check SMRT Svelte shell alignment for ${packageLabel(pkg)}`,\n },\n ];\n });\n}\n\nfunction findMissingManifestArtifacts(\n sourceFiles: SourceFile[],\n packages: PackageContext[],\n projectPath: string,\n): Finding[] {\n return packages.flatMap((pkg) => {\n const hasSmrtSource = pkg.sourceFiles.some((file) =>\n /@smrt\\s*\\(/.test(file.content),\n );\n if (!hasSmrtSource) return [];\n const hasManifest =\n sourceFiles.some(\n (file) =>\n file.packageDir === pkg.directory &&\n /@happyvertical\\/smrt-scanner/.test(file.content),\n ) ||\n pathExistsSyncHint(join(pkg.directory, '.smrt', 'manifest.json')) ||\n pathExistsSyncHint(join(pkg.directory, 'dist', 'manifest.json'));\n if (hasManifest) return [];\n\n return [\n {\n severity: 'low',\n area: 'manifest',\n code: 'missing-generated-manifest-artifact',\n title: `${packageLabel(pkg)} has @smrt objects but no generated manifest artifact was found`,\n evidence: [\n {\n filePath: relative(projectPath, pkg.packageJsonPath),\n detail:\n 'No .smrt/manifest.json or dist/manifest.json was visible during review.',\n },\n ],\n recommendation:\n 'Run the package build/test manifest generation path and verify it uses the SMRT scanner/runtime manifest pipeline.',\n suggestedIssueTitle: `Verify SMRT manifest generation for ${packageLabel(pkg)}`,\n },\n ];\n });\n}\n\nasync function visit(\n dir: string,\n onFile: (filePath: string, entryName: string) => Promise<void> | void,\n): Promise<void> {\n let entries: Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n if (SKIP_DIRS.has(entry.name)) continue;\n await visit(fullPath, onFile);\n continue;\n }\n if (entry.isFile()) await onFile(fullPath, entry.name);\n }\n}\n\nfunction collectDependencies(\n packageJson: Record<string, unknown>,\n): Set<string> {\n const dependencies = new Set<string>();\n for (const sectionName of DEPENDENCY_SECTIONS) {\n const section = packageJson[sectionName];\n if (!isRecord(section)) continue;\n for (const dependencyName of Object.keys(section)) {\n dependencies.add(dependencyName);\n }\n }\n return dependencies;\n}\n\nfunction extractImports(content: string): string[] {\n const imports = new Set<string>();\n const patterns = [\n /(?:import|export)\\s+(?:type\\s+)?(?:[^'\"]+\\s+from\\s+)?['\"]([^'\"]+)['\"]/g,\n /\\bimport\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g,\n /\\brequire\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g,\n ];\n for (const pattern of patterns) {\n for (const match of content.matchAll(pattern)) {\n const imported = normalizePackageImport(match[1]);\n if (imported) imports.add(imported);\n }\n }\n return Array.from(imports);\n}\n\nfunction normalizePackageImport(value: string | undefined): string | undefined {\n if (!value || value.startsWith('.') || value.startsWith('/'))\n return undefined;\n if (value.startsWith('@')) {\n const [scope, name] = value.split('/');\n return scope && name ? `${scope}/${name}` : value;\n }\n return value.split('/')[0];\n}\n\nfunction findOwningPackage(\n filePath: string,\n packages: PackageContext[],\n): PackageContext {\n const normalized = resolve(filePath);\n const matches = packages\n .filter(\n (pkg) =>\n normalized === pkg.directory ||\n normalized.startsWith(`${pkg.directory}${sep}`),\n )\n .sort((left, right) => right.directory.length - left.directory.length);\n return matches[0] ?? packages[0];\n}\n\nfunction packageInventory(pkg: PackageContext): PackageInventory {\n const declaredHappyVerticalDependencies = Array.from(pkg.dependencies)\n .filter((dependency) => dependency.startsWith(HAPPYVERTICAL_PACKAGE_PREFIX))\n .sort();\n const importedHappyVerticalPackages = Array.from(pkg.imports.keys()).sort();\n const ownName = typeof pkg.json.name === 'string' ? pkg.json.name : undefined;\n return {\n name: packageLabel(pkg),\n path: pkg.relativePath,\n private:\n typeof pkg.json.private === 'boolean' ? pkg.json.private : undefined,\n scripts: Object.keys(pkg.scripts).sort(),\n declaredHappyVerticalDependencies,\n importedHappyVerticalPackages,\n missingHappyVerticalDependencies: importedHappyVerticalPackages.filter(\n (name) => name !== ownName && !pkg.dependencies.has(name),\n ),\n hasSvelteKit: pkg.dependencies.has('@sveltejs/kit'),\n hasSmrtSvelte: pkg.dependencies.has('@happyvertical/smrt-svelte'),\n };\n}\n\nfunction summarizeFindings(findings: Finding[]): Record<Severity, number> {\n return findings.reduce(\n (summary, finding) => {\n summary[finding.severity]++;\n return summary;\n },\n { high: 0, medium: 0, low: 0 },\n );\n}\n\nfunction limitFindings(\n findings: Finding[],\n maxFindings: number | undefined,\n): Finding[] {\n const sorted = findings.sort(\n (left, right) =>\n severityRank(left.severity) - severityRank(right.severity) ||\n left.area.localeCompare(right.area) ||\n left.title.localeCompare(right.title),\n );\n return maxFindings && maxFindings > 0 ? sorted.slice(0, maxFindings) : sorted;\n}\n\nfunction severityRank(severity: Severity): number {\n return severity === 'high' ? 0 : severity === 'medium' ? 1 : 2;\n}\n\nfunction packageLabel(pkg: PackageContext): string {\n return typeof pkg.json.name === 'string' ? pkg.json.name : pkg.relativePath;\n}\n\nfunction lineNumber(content: string, needle: string): number | undefined {\n const index = content.indexOf(needle);\n if (index < 0) return undefined;\n return content.slice(0, index).split('\\n').length;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction pathExistsSyncHint(path: string): boolean {\n return existsSync(path);\n}\n","/**\n * SMRT Development MCP Server\n * Provides code generation, project introspection, knowledge context,\n * review/architecture prompt bundles, and portable agent skills.\n */\n\nimport { realpathSync } from 'node:fs';\n\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport {\n ProtocolError,\n ProtocolErrorCode,\n Server,\n} from '@modelcontextprotocol/server';\nimport { serveStdio } from '@modelcontextprotocol/server/stdio';\nimport { getAgentSkill, listAgentSkills } from './agent-skills.js';\nimport { startRuntimeHttpHost } from './http.js';\nimport {\n buildArchitectureContext,\n buildKnowledgeIndex,\n buildPackageSpecialistContext,\n buildReviewContext,\n checkKnowledgeFreshness,\n checkKnowledgeFreshnessFromIndex,\n compactContextResult,\n smrtArchitecture,\n smrtReview,\n} from './knowledge/index.js';\nimport { SERVER_NAME, SERVER_VERSION } from './server-info.js';\nimport { REVIEW_SKILL_NAME, TOOLS } from './tool-catalog.js';\nimport {\n generateSmrtClass,\n introspectProject,\n reviewSmrtProject,\n} from './tools/index.js';\nimport { redactConnectionString } from './tools/runtime/connection.js';\nimport {\n runtimeObject,\n runtimeRegistry,\n runtimeSchemaDiff,\n} from './tools/runtime/observation.js';\nimport {\n runtimeDispatchHealth,\n runtimeJobHealth,\n runtimeMigrationStatus,\n runtimeRecentChanges,\n runtimeRegistryDrift,\n runtimeScheduleHealth,\n} from './tools/runtime/tools.js';\n\nexport { SERVER_VERSION } from './server-info.js';\nexport { TOOLS } from './tool-catalog.js';\n\nconst DEBUG = process.env.DEBUG === 'true';\nconst REVIEW_SKILL_URI = `smrt-dev-mcp://agent-skills/${REVIEW_SKILL_NAME}`;\nconst DOMAIN_CODE_REVIEW_PROMPT = 'domain-code-review';\nconst DOMAIN_ARCHITECTURE_PROMPT = 'domain-architecture';\nconst KNOWLEDGE_PROJECT_URI = 'smrt://knowledge/project';\nconst KNOWLEDGE_PACKAGE_PREFIX = 'smrt://knowledge/package/';\nconst DEPLOY_STATIC_CATALOG_CACHE_HINT = {\n ttlMs: 86_400_000,\n cacheScope: 'private' as const,\n};\n// Knowledge resources are rebuilt from the workspace on every request. There\n// is no transport-visible project-graph invalidation signal, so a nonzero TTL\n// would promise stale data could not be served after an edit.\nconst LIVE_KNOWLEDGE_CACHE_HINT = {\n ttlMs: 0,\n cacheScope: 'private' as const,\n};\nconst WORKBENCH_PROJECT_URI = 'smrt://workbench/project';\nconst WORKBENCH_PACKAGE_PREFIX = 'smrt://workbench/package/';\nconst WORKBENCH_SPECIALIST_SUFFIX = '/specialist';\n\ntype KnowledgeIndexResult = Awaited<ReturnType<typeof buildKnowledgeIndex>>;\ntype KnowledgePackageResult = KnowledgeIndexResult['packages'][number];\ntype PackageSpecialistResult = Awaited<\n ReturnType<typeof buildPackageSpecialistContext>\n>;\ntype PromptArguments = Record<string, string> | undefined;\n\nexport function createServer(): Server {\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] Starting server v${SERVER_VERSION}`);\n }\n\n const server = new Server(\n {\n name: SERVER_NAME,\n version: SERVER_VERSION,\n },\n {\n capabilities: {\n prompts: {},\n resources: {},\n tools: {},\n },\n cacheHints: {\n 'tools/list': DEPLOY_STATIC_CATALOG_CACHE_HINT,\n 'prompts/list': DEPLOY_STATIC_CATALOG_CACHE_HINT,\n 'resources/list': LIVE_KNOWLEDGE_CACHE_HINT,\n 'resources/read': LIVE_KNOWLEDGE_CACHE_HINT,\n },\n },\n );\n\n // List tools handler\n server.setRequestHandler('tools/list', async () => {\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] ListTools request`);\n }\n return { tools: TOOLS };\n });\n\n server.setRequestHandler('prompts/list', async () => {\n return {\n prompts: [\n {\n name: REVIEW_SKILL_NAME,\n title: 'SMRT Code Review',\n description:\n 'Harness-agnostic downstream SMRT review procedure that uses smrt-dev-mcp deterministic context and prompt bundles.',\n },\n {\n name: DOMAIN_CODE_REVIEW_PROMPT,\n title: 'Domain Code Review',\n description:\n 'Model-ready domain-scoped SMRT code review prompt bundle.',\n arguments: [\n {\n name: 'rootDir',\n description: 'Project root directory. Defaults to server cwd.',\n required: false,\n },\n {\n name: 'changedFiles',\n description:\n 'Changed file paths as newline-separated, comma-separated, or JSON array text.',\n required: false,\n },\n {\n name: 'focus',\n description: 'Review focus text.',\n required: false,\n },\n {\n name: 'documentation',\n description: 'Additional documentation or notes.',\n required: false,\n },\n {\n name: 'scope',\n description:\n 'Knowledge scope: project, local, package, sdk, or installed.',\n required: false,\n },\n {\n name: 'package',\n description: 'Package name or short package selector.',\n required: false,\n },\n ],\n },\n {\n name: DOMAIN_ARCHITECTURE_PROMPT,\n title: 'Domain Architecture',\n description:\n 'Model-ready domain-scoped SMRT architecture planning prompt bundle.',\n arguments: [\n {\n name: 'rootDir',\n description: 'Project root directory. Defaults to server cwd.',\n required: false,\n },\n {\n name: 'idea',\n description: 'Architecture idea or product concept.',\n required: false,\n },\n {\n name: 'documentation',\n description: 'Additional documentation or notes.',\n required: false,\n },\n {\n name: 'focus',\n description: 'Planning focus text.',\n required: false,\n },\n {\n name: 'scope',\n description:\n 'Knowledge scope: project, local, package, sdk, or installed.',\n required: false,\n },\n {\n name: 'package',\n description: 'Package name or short package selector.',\n required: false,\n },\n ],\n },\n ],\n };\n });\n\n server.setRequestHandler('prompts/get', async (request) => {\n const { name } = request.params;\n if (name === REVIEW_SKILL_NAME) {\n return {\n description:\n 'Use this procedure when reviewing downstream SMRT projects.',\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: renderAgentSkillMarkdown(REVIEW_SKILL_NAME),\n },\n },\n ],\n };\n }\n\n if (name === DOMAIN_CODE_REVIEW_PROMPT) {\n const context = await buildReviewContext(\n reviewPromptArguments(request.params.arguments),\n );\n return {\n description: 'Review downstream SMRT code with domain knowledge.',\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: context.promptBundle.contextMarkdown,\n },\n },\n ],\n };\n }\n\n if (name === DOMAIN_ARCHITECTURE_PROMPT) {\n const context = await buildArchitectureContext(\n architecturePromptArguments(request.params.arguments),\n );\n return {\n description: 'Plan a downstream SMRT project with domain knowledge.',\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: context.promptBundle.contextMarkdown,\n },\n },\n ],\n };\n }\n\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n `Unknown prompt: ${name}`,\n );\n });\n\n server.setRequestHandler('resources/list', async () => {\n const index = await buildKnowledgeIndex();\n return {\n resources: [\n {\n uri: REVIEW_SKILL_URI,\n name: REVIEW_SKILL_NAME,\n title: 'SMRT Code Review Skill',\n description:\n 'Bundled Markdown skill for downstream SMRT code reviews.',\n mimeType: 'text/markdown',\n },\n {\n uri: KNOWLEDGE_PROJECT_URI,\n name: 'smrt-domain-knowledge-project',\n title: 'SMRT Domain Knowledge Project Index',\n description:\n 'Composed SMRT, downstream domain, and HappyVertical SDK knowledge index.',\n mimeType: 'application/json',\n },\n {\n uri: WORKBENCH_PROJECT_URI,\n name: 'smrt-workbench-project',\n title: 'SMRT Workbench Project',\n description:\n 'Workbench-facing package and knowledge resource index for the current project.',\n mimeType: 'application/json',\n },\n ...index.packages.map((pkg) => ({\n uri: `${KNOWLEDGE_PACKAGE_PREFIX}${encodeURIComponent(pkg.name)}`,\n name: `smrt-domain-knowledge-${pkg.name}`,\n title: `SMRT Domain Knowledge: ${pkg.name}`,\n description:\n 'Package-scoped SMRT domain knowledge, generated surfaces, and authored context.',\n mimeType: 'application/json',\n })),\n ...index.packages\n .filter((pkg) => pkg.kind !== 'sdk')\n .flatMap((pkg) => [\n {\n uri: `${WORKBENCH_PACKAGE_PREFIX}${encodeURIComponent(pkg.name)}`,\n name: `smrt-workbench-${pkg.name}`,\n title: `SMRT Workbench Package: ${pkg.name}`,\n description:\n 'Workbench package resource with docs, manifest, knowledge, scripts, and surface metadata.',\n mimeType: 'application/json',\n },\n {\n uri: `${WORKBENCH_PACKAGE_PREFIX}${encodeURIComponent(pkg.name)}${WORKBENCH_SPECIALIST_SUFFIX}`,\n name: `smrt-workbench-specialist-${pkg.name}`,\n title: `SMRT Package Specialist: ${pkg.name}`,\n description:\n 'Deterministic package specialist prompt bundle and source list.',\n mimeType: 'application/json',\n },\n ]),\n ],\n };\n });\n\n server.setRequestHandler('resources/read', async (request) => {\n const { uri } = request.params;\n if (uri === REVIEW_SKILL_URI) {\n return {\n contents: [\n {\n uri,\n mimeType: 'text/markdown',\n text: renderAgentSkillMarkdown(REVIEW_SKILL_NAME),\n },\n ],\n };\n }\n\n if (uri === KNOWLEDGE_PROJECT_URI) {\n const index = await buildKnowledgeIndex();\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(sanitizeKnowledgeIndex(index), null, 2),\n },\n ],\n };\n }\n\n if (uri === WORKBENCH_PROJECT_URI) {\n const index = await buildKnowledgeIndex();\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(\n {\n project: sanitizeKnowledgeIndex(index),\n workbenchResources: index.packages\n .filter((pkg) => pkg.kind !== 'sdk')\n .map((pkg) => ({\n packageName: pkg.name,\n packageUri: `${WORKBENCH_PACKAGE_PREFIX}${encodeURIComponent(pkg.name)}`,\n specialistUri: `${WORKBENCH_PACKAGE_PREFIX}${encodeURIComponent(pkg.name)}${WORKBENCH_SPECIALIST_SUFFIX}`,\n })),\n },\n null,\n 2,\n ),\n },\n ],\n };\n }\n\n if (\n uri.startsWith(WORKBENCH_PACKAGE_PREFIX) &&\n uri.endsWith(WORKBENCH_SPECIALIST_SUFFIX)\n ) {\n const packageName = decodeURIComponent(\n uri.slice(\n WORKBENCH_PACKAGE_PREFIX.length,\n -WORKBENCH_SPECIALIST_SUFFIX.length,\n ),\n );\n const specialist = await buildPackageSpecialistContext({\n package: packageName,\n });\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(\n sanitizePackageSpecialist(specialist),\n null,\n 2,\n ),\n },\n ],\n };\n }\n\n if (uri.startsWith(WORKBENCH_PACKAGE_PREFIX)) {\n const packageName = decodeURIComponent(\n uri.slice(WORKBENCH_PACKAGE_PREFIX.length),\n );\n const index = await buildKnowledgeIndex();\n const pkg = index.packages.find((item) => item.name === packageName);\n if (!pkg) {\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n `Unknown workbench package: ${packageName}`,\n );\n }\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(\n {\n package: sanitizeKnowledgePackage(pkg),\n specialistUri: `${WORKBENCH_PACKAGE_PREFIX}${encodeURIComponent(pkg.name)}${WORKBENCH_SPECIALIST_SUFFIX}`,\n },\n null,\n 2,\n ),\n },\n ],\n };\n }\n\n if (uri.startsWith(KNOWLEDGE_PACKAGE_PREFIX)) {\n const packageName = decodeURIComponent(\n uri.slice(KNOWLEDGE_PACKAGE_PREFIX.length),\n );\n const index = await buildKnowledgeIndex();\n const pkg = index.packages.find((item) => item.name === packageName);\n if (!pkg) {\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n `Unknown knowledge package: ${packageName}`,\n );\n }\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(sanitizeKnowledgePackage(pkg), null, 2),\n },\n ],\n };\n }\n\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n `Unknown resource: ${uri}`,\n );\n });\n\n // Call tool handler\n server.setRequestHandler('tools/call', async (request) => {\n const { name, arguments: args } = request.params;\n\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] CallTool: ${name}`);\n console.error(\n `[${SERVER_NAME}] Arguments:`,\n JSON.stringify(redactDebugArguments(args), null, 2),\n );\n }\n\n try {\n let result: string;\n\n switch (name) {\n case 'generate-smrt-class':\n result = await generateSmrtClass(\n args as unknown as Parameters<typeof generateSmrtClass>[0],\n );\n break;\n\n case 'introspect-project':\n result = await introspectProject(\n args as unknown as Parameters<typeof introspectProject>[0],\n );\n break;\n\n case 'review-smrt-project':\n result = await reviewSmrtProject(\n args as unknown as Parameters<typeof reviewSmrtProject>[0],\n );\n break;\n\n case 'reflect-knowledge': {\n const index = await buildKnowledgeIndex(\n args as unknown as Parameters<typeof buildKnowledgeIndex>[0],\n );\n const freshness = await checkKnowledgeFreshnessFromIndex(\n index,\n args as unknown as Parameters<\n typeof checkKnowledgeFreshnessFromIndex\n >[1],\n );\n result = JSON.stringify(\n {\n rootDir: index.rootDir,\n packageCount: index.packages.length,\n smrtPackageCount: index.smrtPackages.length,\n sdkPackageCount: index.sdkPackages.length,\n relationshipsV2: index.relationshipsV2,\n coverage: index.coverage,\n diagnostics: index.diagnostics,\n freshness,\n },\n null,\n 2,\n );\n break;\n }\n\n case 'reflect-domain-knowledge': {\n const index = await buildKnowledgeIndex(\n args as unknown as Parameters<typeof buildKnowledgeIndex>[0],\n );\n const freshness = await checkKnowledgeFreshnessFromIndex(\n index,\n args as unknown as Parameters<\n typeof checkKnowledgeFreshnessFromIndex\n >[1],\n );\n result = JSON.stringify(\n {\n rootDir: index.rootDir,\n packageCount: index.packages.length,\n smrtPackageCount: index.smrtPackages.length,\n sdkPackageCount: index.sdkPackages.length,\n domainKnowledgePackageCount: index.packages.filter(\n (pkg) => pkg.hasDomainKnowledge,\n ).length,\n missingDomainKnowledgePackages: index.packages\n .filter(\n (pkg) =>\n pkg.exportKeys.includes('./smrt-knowledge.json') &&\n !pkg.hasDomainKnowledge,\n )\n .map((pkg) => pkg.name),\n relationshipsV2: index.relationshipsV2,\n coverage: index.coverage,\n diagnostics: index.diagnostics,\n freshness,\n },\n null,\n 2,\n );\n break;\n }\n\n case 'check-knowledge-freshness':\n result = JSON.stringify(\n await checkKnowledgeFreshness(\n args as unknown as Parameters<typeof checkKnowledgeFreshness>[0],\n ),\n null,\n 2,\n );\n break;\n\n case 'check-domain-knowledge':\n result = JSON.stringify(\n await checkKnowledgeFreshness(\n args as unknown as Parameters<typeof checkKnowledgeFreshness>[0],\n ),\n null,\n 2,\n );\n break;\n\n case 'build-review-context':\n case 'build-domain-review-context':\n result = JSON.stringify(\n compactContextResult(\n await buildReviewContext(\n args as unknown as Parameters<typeof buildReviewContext>[0],\n ),\n detailArg(args),\n ),\n null,\n 2,\n );\n break;\n\n case 'smrt-review':\n result = JSON.stringify(\n compactContextResult(\n await smrtReview(\n args as unknown as Parameters<typeof smrtReview>[0],\n ),\n detailArg(args),\n ),\n null,\n 2,\n );\n break;\n\n case 'build-package-specialist-context':\n result = JSON.stringify(\n sanitizePackageSpecialist(\n await buildPackageSpecialistContext(\n args as unknown as Parameters<\n typeof buildPackageSpecialistContext\n >[0],\n ),\n ),\n null,\n 2,\n );\n break;\n\n case 'build-architecture-context':\n case 'build-domain-architecture-context':\n result = JSON.stringify(\n compactContextResult(\n await buildArchitectureContext(\n args as unknown as Parameters<\n typeof buildArchitectureContext\n >[0],\n ),\n detailArg(args),\n ),\n null,\n 2,\n );\n break;\n\n case 'smrt-architecture':\n result = JSON.stringify(\n compactContextResult(\n await smrtArchitecture(\n args as unknown as Parameters<typeof smrtArchitecture>[0],\n ),\n detailArg(args),\n ),\n null,\n 2,\n );\n break;\n\n case 'list-agent-skills':\n result = JSON.stringify({ skills: listAgentSkills() }, null, 2);\n break;\n\n case 'get-agent-skill':\n result = JSON.stringify(\n await getAgentSkill(\n args as unknown as Parameters<typeof getAgentSkill>[0],\n ),\n null,\n 2,\n );\n break;\n\n case 'migration-status':\n result = JSON.stringify(\n await runtimeMigrationStatus(\n args as unknown as Parameters<typeof runtimeMigrationStatus>[0],\n ),\n null,\n 2,\n );\n break;\n\n case 'job-health':\n result = JSON.stringify(\n await runtimeJobHealth(\n args as unknown as Parameters<typeof runtimeJobHealth>[0],\n ),\n null,\n 2,\n );\n break;\n\n case 'schedule-health':\n result = JSON.stringify(\n await runtimeScheduleHealth(\n args as unknown as Parameters<typeof runtimeScheduleHealth>[0],\n ),\n null,\n 2,\n );\n break;\n\n case 'dispatch-health':\n result = JSON.stringify(\n await runtimeDispatchHealth(\n args as unknown as Parameters<typeof runtimeDispatchHealth>[0],\n ),\n null,\n 2,\n );\n break;\n\n case 'recent-changes':\n result = JSON.stringify(\n await runtimeRecentChanges(\n args as unknown as Parameters<typeof runtimeRecentChanges>[0],\n ),\n null,\n 2,\n );\n break;\n\n case 'registry-drift':\n result = JSON.stringify(\n await runtimeRegistryDrift(\n args as unknown as Parameters<typeof runtimeRegistryDrift>[0],\n ),\n null,\n 2,\n );\n break;\n\n case 'runtime-registry':\n result = JSON.stringify(\n await runtimeRegistry(\n args as unknown as Parameters<typeof runtimeRegistry>[0],\n ),\n null,\n 2,\n );\n break;\n\n case 'runtime-object':\n result = JSON.stringify(\n await runtimeObject(\n args as unknown as Parameters<typeof runtimeObject>[0],\n ),\n null,\n 2,\n );\n break;\n\n case 'runtime-schema-diff':\n result = JSON.stringify(\n await runtimeSchemaDiff(\n args as unknown as Parameters<typeof runtimeSchemaDiff>[0],\n ),\n null,\n 2,\n );\n break;\n\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n\n return {\n content: [\n {\n type: 'text',\n text: result,\n },\n ],\n structuredContent: toDevToolStructuredContent(result),\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n console.error(`[${SERVER_NAME}] Error:`, error);\n\n return {\n content: [\n {\n type: 'text',\n text: `Error executing tool ${name}: ${errorMessage}`,\n },\n ],\n isError: true,\n structuredContent: {\n ok: false,\n coverage: null,\n diagnostics: [{ severity: 'error', message: errorMessage }],\n data: null,\n },\n };\n }\n });\n\n return server;\n}\n\nasync function main() {\n const handle = serveStdio(() => createServer(), {\n onerror: (error) =>\n console.error(`[${SERVER_NAME}] Protocol error:`, error),\n });\n\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] Server connected via stdio`);\n }\n\n // Graceful shutdown\n process.on('SIGINT', async () => {\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] Shutting down...`);\n }\n await handle.close();\n process.exit(0);\n });\n\n process.on('SIGTERM', async () => {\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] Shutting down...`);\n }\n await handle.close();\n process.exit(0);\n });\n}\n\nfunction isEntrypoint(): boolean {\n const entry = process.argv[1];\n if (!entry) return false;\n try {\n return realpathSync(fileURLToPath(import.meta.url)) === realpathSync(entry);\n } catch {\n return import.meta.url === pathToFileURL(entry).href;\n }\n}\n\nfunction renderAgentSkillMarkdown(name: string): string {\n const skill = getAgentSkill({ name, includeReferences: true });\n const references = skill.referenceFiles.map(\n (file) => `## Reference: ${file.path}\\n\\n${file.content.trim()}`,\n );\n return [skill.skillMarkdown.trim(), ...references].join('\\n\\n');\n}\n\nfunction reviewPromptArguments(args: PromptArguments): Record<string, unknown> {\n return compactRecord({\n rootDir: args?.rootDir,\n changedFiles: parseStringList(args?.changedFiles),\n focus: args?.focus,\n documentation: args?.documentation,\n scope: args?.scope,\n package: args?.package,\n });\n}\n\nfunction architecturePromptArguments(\n args: PromptArguments,\n): Record<string, unknown> {\n return compactRecord({\n rootDir: args?.rootDir,\n idea: args?.idea,\n documentation: args?.documentation,\n focus: args?.focus,\n scope: args?.scope,\n package: args?.package,\n });\n}\n\nfunction parseStringList(value: string | undefined): string[] | undefined {\n if (!value?.trim()) return undefined;\n\n try {\n const parsed = JSON.parse(value);\n if (Array.isArray(parsed)) {\n return parsed.filter((item): item is string => typeof item === 'string');\n }\n } catch {\n // Fall through to delimiter parsing.\n }\n\n return value\n .split(/[\\n,]/)\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction compactRecord(\n value: Record<string, unknown>,\n): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n );\n}\n\nfunction sanitizeKnowledgeIndex(index: KnowledgeIndexResult) {\n const packages = index.packages.map((pkg) => sanitizeKnowledgePackage(pkg));\n return {\n ...index,\n rootDir: '.',\n packages,\n smrtPackages: packages.filter((pkg) => pkg.kind === 'smrt'),\n sdkPackages: packages.filter((pkg) => pkg.kind === 'sdk'),\n // Rebuilt from the sanitized list rather than carried over by the spread.\n // Installed dependencies live outside the project root, so theirs are the\n // absolute host paths this projection exists to strip (#2275).\n installedPackages: packages.filter((pkg) => pkg.isInstalledDependency),\n };\n}\n\nfunction detailArg(args: unknown): string | undefined {\n const detail = (args as Record<string, unknown> | undefined)?.detail;\n return typeof detail === 'string' ? detail : undefined;\n}\n\n/**\n * Debug logging happens before any tool runs its own redaction, so a\n * credential-bearing `dbUrl` argument must be masked here.\n */\nfunction redactDebugArguments(args: unknown): unknown {\n if (!isRecord(args) || typeof args.dbUrl !== 'string') return args;\n return { ...args, dbUrl: redactConnectionString(args.dbUrl) };\n}\n\nfunction isRuntimeEnvelope(value: unknown): value is {\n ok: boolean;\n coverage: unknown;\n diagnostics: unknown[];\n data: unknown;\n} {\n return (\n isRecord(value) &&\n typeof value.ok === 'boolean' &&\n 'coverage' in value &&\n Array.isArray(value.diagnostics) &&\n 'data' in value\n );\n}\n\nfunction toDevToolStructuredContent(result: string) {\n let data: unknown = result;\n try {\n data = JSON.parse(result);\n } catch {\n // `generate-smrt-class` intentionally returns source text, not JSON.\n }\n\n // Runtime diagnostics tools already return the `{ok, coverage, diagnostics,\n // data}` envelope; re-wrapping would expose `data.data.*` in\n // structuredContent while the text response exposes `data.*`.\n if (isRuntimeEnvelope(data)) {\n return data;\n }\n\n const source = isRecord(data) ? data : undefined;\n const coverage = isRecord(source?.coverage) ? source.coverage : null;\n const diagnostics = Array.isArray(source?.diagnostics)\n ? source.diagnostics.filter(isRecord)\n : [];\n return { ok: true, coverage, diagnostics, data };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction sanitizeKnowledgePackage(pkg: KnowledgePackageResult) {\n const { directory: _directory, objects, checkedObjectPaths, ...rest } = pkg;\n return {\n ...rest,\n // Paths outside the workspace root stay absolute in the index; redact them\n // here the same way object file paths are redacted.\n checkedObjectPaths: checkedObjectPaths.map(\n (path) => sanitizePath(path) ?? path,\n ),\n objects: objects.map((object) => ({\n ...object,\n filePath: sanitizePath(object.filePath),\n })),\n };\n}\n\nfunction sanitizePackageSpecialist(specialist: PackageSpecialistResult) {\n return {\n selectedPackage: sanitizeKnowledgePackage(specialist.selectedPackage),\n selectedSdkPackages: specialist.selectedSdkPackages.map((pkg) =>\n sanitizeKnowledgePackage(pkg),\n ),\n promptBundle: {\n ...specialist.promptBundle,\n contextMarkdown: specialist.promptBundle.contextMarkdown.replace(\n /^Baseline root: .+$/m,\n 'Baseline root: .',\n ),\n sourceFiles: sanitizePaths(specialist.promptBundle.sourceFiles),\n },\n sourceFiles: sanitizePaths(specialist.sourceFiles),\n };\n}\n\nfunction sanitizePaths(paths: string[]): string[] {\n return paths\n .map(sanitizePath)\n .filter((path): path is string => typeof path === 'string');\n}\n\nfunction sanitizePath(path: string | undefined): string | undefined {\n if (!path) return path;\n if (path.startsWith('/') || /^[A-Za-z]:[\\\\/]/.test(path)) {\n return '<absolute-path>';\n }\n return path;\n}\n\n/**\n * `smrt-dev-mcp --http [--port N] [--project DIR]` starts the Level 2 runtime\n * dev-plane host (#1831) instead of the stdio server. Loopback-only, bearer\n * protected, positive read-only catalog; see `http.ts`.\n */\nexport function parseHttpCliArgs(argv: readonly string[]): {\n http: boolean;\n port?: number;\n projectRoot?: string;\n} {\n const result: { http: boolean; port?: number; projectRoot?: string } = {\n http: false,\n };\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === '--http') result.http = true;\n else if (arg === '--port') {\n const value = Number.parseInt(argv[index + 1] ?? '', 10);\n if (!Number.isInteger(value) || value < 0 || value > 65535) {\n throw new Error('--port requires an integer between 0 and 65535');\n }\n result.port = value;\n index += 1;\n } else if (arg === '--project') {\n const value = argv[index + 1];\n if (!value) throw new Error('--project requires a directory');\n result.projectRoot = value;\n index += 1;\n }\n }\n return result;\n}\n\nasync function mainHttp(cli: ReturnType<typeof parseHttpCliArgs>) {\n const host = await startRuntimeHttpHost({\n port: cli.port,\n projectRoot: cli.projectRoot,\n });\n // The token is printed exactly once, to stderr, only when this process\n // minted it; a token supplied via SMRT_DEV_MCP_TOKEN is never echoed.\n const minted = !process.env.SMRT_DEV_MCP_TOKEN?.trim();\n console.error(\n `[${SERVER_NAME}] runtime dev-plane listening at ${host.url} (${host.boot.objectCount} booted objects, ${host.boot.manifests.length} manifests)`,\n );\n if (minted) {\n console.error(`[${SERVER_NAME}] bearer token: ${host.token}`);\n }\n const shutdown = async () => {\n await host.close();\n process.exit(0);\n };\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n}\n\nif (isEntrypoint()) {\n const cli = parseHttpCliArgs(process.argv.slice(2));\n (cli.http ? mainHttp(cli) : main()).catch((error) => {\n console.error(`[${SERVER_NAME}] Fatal error:`, error);\n process.exit(1);\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAuBA,IAAM,eAAuC,CAC3C;CACE,MAAM;CACN,aACE;CACF,MAAM;CACN,WAAW;CACX,YAAY,CAAC,qDAAqD;AACpE,CACF;AAEA,SAAgB,kBAAuC;CACrD,OAAO,aAAa,KAAK,EAAE,WAAW,YAAY,GAAG,YAAY,KAAK;AACxE;AAEA,SAAgB,cAAc,SAGT;CACnB,MAAM,QAAQ,aAAa,MAAM,SAAS,KAAK,SAAS,QAAQ,IAAI;CACpE,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,wBAAwB,QAAQ,MAAM;CAGxD,OAAO;EACL,MAAM,MAAM;EACZ,aAAa,MAAM;EACnB,MAAM,MAAM;EACZ,YAAY,MAAM;EAClB,eAAe,gBAAgB,MAAM,SAAS;EAC9C,gBACE,QAAQ,sBAAsB,QAC1B,CAAC,IACD,MAAM,WAAW,KAAK,UAAU;GAC9B;GACA,SAAS,gBAAgB,IAAI;EAC/B,EAAE;CACV;AACF;AAEA,SAAS,gBAAgB,cAA8B;CAErD,OAAO,aAAa,KADA,mBACK,GAAa,YAAY,GAAG,MAAM;AAC7D;AAEA,SAAS,qBAA6B;CAGpC,MAAM,cAAc,QAAQ,QAAQ,cAAc,OAAO,KAAK,GAAG,CAAC,CAAC;CACnE,IAAI,CAAC,WAAW,KAAK,aAAa,cAAc,CAAC,GAC/C,MAAM,IAAI,MACR,oDAAoD,OAAO,KAAK,KAClE;CAEF,OAAO;AACT;;;AC1EA,IAAa,cAAc;AAE3B,SAAS,qBAA6B;CACpC,IAAI;EAEF,MAAM,kBAAkB,KADJ,QAAQ,cAAc,OAAO,KAAK,GAAG,CAC5B,GAAa,MAAM,cAAc;EAC9D,MAAM,cAAc,KAAK,MAAM,aAAa,iBAAiB,OAAO,CAAC;EAGrE,OAAO,OAAO,YAAY,YAAY,WAClC,YAAY,UACZ;CACN,QAAQ;EACN,OAAO;CACT;AACF;AAEA,IAAa,iBAAiB,mBAAmB;;;;;;;;;;;;;;;;;;;ACIjD,IAAa,sBAAsB;;AAGnC,IAAM,8BAA8B,CAClC,uBACA,oBACF;AAiCA,SAAS,aAAa,aAAqB,MAAsB;CAC/D,MAAM,MAAM,SAAS,aAAa,IAAI;CAGtC,IAAI,QAAQ,QAAQ,IAAI,WAAW,KAAK,KAAK,KAAK,WAAW,GAAG,GAC9D,OAAO,SAAS,IAAI;CAEtB,OAAO,IAAI,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG;AAChC;AAEA,SAAS,aAAa,MAAmC;CACvD,IAAI;EACF,MAAM,SAAS,KAAK,MAAM,aAAa,MAAM,MAAM,CAAC;EACpD,OAAO,UAAU,OAAO,WAAW,WAC9B,SACD;CACN,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,iBACP,UACA,qBACQ;CACR,MAAM,sBACJ,OAAO,SAAS,gBAAgB,YAAY,SAAS,cACjD,SAAS,cACR,uBAAuB,KAAA;CAC9B,IAAI,QAAQ;CACZ,KAAK,MAAM,CAAC,MAAM,eAAe,OAAO,QAAQ,SAAS,WAAW,CAAC,CAAC,GAAG;EACvE,IAAI,CAAC,cAAc,OAAO,eAAe,UAAU;EAKnD,MAAM,aAAc,WAAyC;EAC7D,eAAe,qBACb,MACA,YACA,OAAO,eAAe,YAAY,aAC9B,aACA,mBACN;EACA,SAAS;CACX;CACA,OAAO;AACT;AAEA,IAAI,SAA6B;AACjC,IAAI,oBAAmC;;;;;;AAYvC,SAAgB,uBAAsC;CACpD,OAAO;AACT;;;;;AAkBA,eAAsB,YACpB,UAA8B,CAAC,GACT;CACtB,IAAI,QAAQ,OAAO;CACnB,MAAM,cAAc,QAAQ,QAAQ,eAAe,QAAQ,IAAI,CAAC;CAChE,MAAM,cAAgC,CAAC;CACvC,MAAM,YAA8B,CAAC;CAErC,MAAM,sBAAsB,4BAA4B,KAAK,cAC3D,KAAK,aAAa,SAAS,CAC7B,CAAC,CAAC,MAAM,SAAS,WAAW,IAAI,CAAC;CACjC,MAAM,qBAAqB,uBAAuB,WAAW;CAE7D,IAAI,CAAC,qBACH,YAAY,KAAK;EACf,UAAU;EACV,MAAM;EACN,SACE;CACJ,CAAC;MACI;EACL,MAAM,WAAW,aAAa,mBAAmB;EACjD,IAAI,CAAC,UACH,YAAY,KAAK;GACf,UAAU;GACV,MAAM;GACN,SAAS,uBAAuB,aAAa,aAAa,mBAAmB,EAAE;EACjF,CAAC;OAED,UAAU,KAAK;GACb,MAAM;GACN,aACE,OAAO,SAAS,gBAAgB,WAC5B,SAAS,cACT;GACN,MAAM,aAAa,aAAa,mBAAmB;GACnD,aAAa,iBAAiB,UAAU,kBAAkB;EAC5D,CAAC;CAEL;CAEA,IAAI,kBAA4B,CAAC;CACjC,IAAI;EAGF,kBAAkB,qBAAqB;GACrC,SAAS;GACT,SAAS;EACX,CAAC;CACH,SAAS,OAAO;EACd,YAAY,KAAK;GACf,UAAU;GACV,MAAM;GACN,SAAS,4CAA4C,iBAAiB,QAAQ,MAAM,UAAU;EAChG,CAAC;CACH;CACA,KAAK,MAAM,cAAc,gBAAgB,KAAK,GAAG;EAC/C,MAAM,eAAe,oBAAoB,YAAY,WAAW;EAChE,IAAI,CAAC,cAAc;GACjB,YAAY,KAAK;IACf,UAAU;IACV,MAAM;IACN,SAAS,0BAA0B,WAAW;GAChD,CAAC;GACD;EACF;EACA,MAAM,WAAW,aAAa,YAAY;EAC1C,IAAI,CAAC,UAAU;GACb,YAAY,KAAK;IACf,UAAU;IACV,MAAM;IACN,SAAS,gBAAgB,WAAW;GACtC,CAAC;GACD;EACF;EACA,UAAU,KAAK;GACb,MAAM;GACN,aAAa;GACb,MAAM,aAAa,aAAa,YAAY;GAC5C,aAAa,iBAAiB,UAAU,UAAU;EACpD,CAAC;CACH;CAEA,oBAAoB;CACpB,SAAS;EACP,YAAY;EACZ,WAAW,QAAQ,uBAAO,IAAI,KAAK,EAAA,CAAG,YAAY;EAClD,aAAa,sBAAsB,SAAS,WAAW;EACvD;EACA,aAAa,UAAU,QAAQ,KAAK,MAAM,MAAM,EAAE,aAAa,CAAC;EAChE;CACF;CACA,OAAO;AACT;AAEA,SAAS,uBAAuB,aAAoC;CAClE,IAAI;EACF,MAAM,SAAS,KAAK,MAClB,aAAa,KAAK,aAAa,cAAc,GAAG,MAAM,CACxD;EACA,OAAO,OAAO,OAAO,SAAS,YAAY,OAAO,OAAO,OAAO,OAAO;CACxE,QAAQ;EACN,OAAO;CACT;AACF;;;;;;;;;;;;;;;;;;;;;;;AC9NA,IAAM,yBAAyD;CAC7D;CACA;CACA;AACF;AAEA,SAAS,sBAAsB,OAA6C;CAC1E,OAAQ,uBAA6C,SAAS,KAAK;AACrE;;;;;;AAoCA,IAAM,yBAAyB;CAC7B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,SAAS,wBAAwB,KAAqB;CACpD,OAAO,IAAI,YAAY,CAAC,CAAC,QAAQ,SAAS,EAAE;AAC9C;AAEA,IAAM,8BAA8B,IAAI,IACtC,uBAAuB,IAAI,uBAAuB,CACpD;AAEA,IAAM,uBAAuB,EAC3B,UAAU;CAAE,MAAM;CAAU,KAAK;AAAW,EAC9C;;;;;;;;;;;;;AAcA,SAAgB,uBAAuB,OAAuB;CAC5D,IAAI,WAAW;CAEf,IAAI;EACF,MAAM,MAAM,IAAI,IAAI,KAAK;EACzB,IAAI,IAAI,UACN,IAAI,WAAW;EAEjB,KAAK,MAAM,OAAO,CAAC,GAAG,IAAI,aAAa,KAAK,CAAC,GAC3C,IAAI,4BAA4B,IAAI,wBAAwB,GAAG,CAAC,GAC9D,IAAI,aAAa,IAAI,KAAK,KAAK;EAGnC,WAAW,IAAI,SAAS;CAC1B,QAAQ;EACN,WAAW,MAAM,QAKf,oEACA,SACF;CACF;CAKA,WAAW,SAAS,QAClB,oFACA,MACF;CAKA,OAAO,SAAS,QACd,0DACC,OAAO,QAAgB,QACtB,4BAA4B,IAAI,wBAAwB,GAAG,CAAC,IACxD,GAAG,OAAO,OACV,KACR;AACF;;;;;AAMA,SAAgB,iBAAiB,OAAwB;CAGvD,OAAO,uBADL,iBAAiB,QAAQ,MAAM,UAAU,OAAO,SAAS,eAAe,CACrC;AACvC;;;;;;AAOA,SAAgB,sBAAsB,OAAoC;CACxE,MAAM,aAAa,MAAM,KAAK,CAAC,CAAC,YAAY;CAC5C,IAAI,sBAAsB,UAAU,GAClC,OAAO;CAET,MAAM,IAAI,MACR,sCAAsC,WAAW,wCACnD;AACF;;AAGA,SAAgB,kBAAkB,KAAa,MAAuB;CACpE,IAAI,QAAQ,KAAK,KAAK,CAAC,CAAC,SAAS,GAAG,OAAO;CAC3C,IAAI,mBAAmB,KAAK,GAAG,GAAG,OAAO;CACzC,IAAI,YAAY,KAAK,GAAG,GAAG,OAAO;CAClC,OAAO;AACT;;;;;;;;;AAUA,eAAsB,yBACpB,OAA4B,CAAC,GACO;CACpC,MAAM,SAAS,KAAK,OAAO,KAAK;CAChC,IAAI,UAAU,WAAW,YAAY;EACnC,MAAM,eAAe,sBACnB,kBAAkB,QAAQ,KAAK,MAAM,CACvC;EAEA,OAAO;GACL,IAAA,MAFe,oBAAoB;IAAE,MAAM;IAAc,KAAK;GAAO,CAAC;GAGtE,QAAQ;GACR,YAAY,uBAAuB,MAAM;GACzC;EACF;CACF;CAEA,MAAM,SAAS,QAAQ,IAAI,iBAAiB,KAAK;CACjD,IAAI,UAAU,WAAW,YAAY;EACnC,MAAM,eAAe,sBACnB,kBAAkB,QAAQ,KAAK,MAAM,CACvC;EAEA,OAAO;GACL,IAAA,MAFe,oBAAoB;IAAE,MAAM;IAAc,KAAK;GAAO,CAAC;GAGtE,QAAQ;GACR,YAAY,uBAAuB,MAAM;GACzC;EACF;CACF;CAEA,MAAM,SAAS,MAAM,sBAAsB;CAC3C,MAAM,YAAY,QAAQ,UAAU,KAAK,KAAK;CAC9C,IAAI,aAAa,cAAc,YAAY;EACzC,MAAM,eAAe,sBACnB,OAAO,UAAU,QAAQ,kBAAkB,WAAW,KAAK,MAAM,CACnE;EAKA,OAAO;GACL,IAAA,MALe,oBAAoB;IACnC,MAAM;IACN,KAAK;GACP,CAAC;GAGC,QAAQ;GACR,YAAY,uBAAuB,SAAS;GAC5C;EACF;CACF;CAEA,OAAO;EAAE,IAAI;EAAM,QAAQ;EAAQ,YAAY;EAAI,cAAc;CAAK;AACxE;AAMA,eAAe,wBAAqD;CAClE,IAAI;EAMF,MAAM,WAAW;EAKjB,MAAM,WAJS,iBACb,OACA,oBAEgB,CAAA,CAA8B;EAChD,IAAI,YAAY,OAAO,SAAS,QAAQ,UACtC,OAAO,EAAE,SAAS;EAEpB,OAAO,CAAC;CACV,QAAQ;EACN,OAAO,CAAC;CACV;AACF;AAEA,eAAe,oBAAoB,SAGJ;CAC7B,OAAO,YAAY,OAAO;AAC5B;;;;;AAcA,eAAsB,uBAAuB,IAA4B;CACvE,IAAI,CAAC,MAAM,OAAO,OAAO,UAAU;CACnC,MAAM,YAAY;CAClB,MAAM,QACJ,UAAU,SAAS,UAAU,QAAQ,OAAO,UAAU,QAAQ;CAChE,IAAI,OAAO,UAAU,YAAY;CACjC,IAAI;EACF,MAAM,MAAM,KAAK,UAAU,QAAQ,YAAY,UAAU,MAAM;CACjE,QAAQ,CAER;AACF;;;;;;;;;;;;;;;;;;;;;;;ACvQA,IAAa,qBAAqB;AAClC,IAAa,oBAAoB;;;;;;;;;;;;;;;;;;AAuCjC,IAAM,oCAAoB,IAAI,IAA8B;AAE5D,SAAS,mBAAmB,MAAmC;CAC7D,MAAM,SACJ,KAAK,OAAO,KAAK,KAAK,QAAQ,IAAI,iBAAiB,KAAK,KAAK;CAC/D,OAAO,WAAW,QAAQ,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,OAAO,KAAK;AACzD;AAEA,eAAe,mBACb,KACA,WACY;CAEZ,MAAM,OADW,kBAAkB,IAAI,GAAG,KAAK,QAAQ,QAAQ,EAAA,CAC1C,KAAK,WAAW,SAAS;CAG9C,MAAM,OAAO,IAAI,YAAY,KAAA,CAAS;CACtC,kBAAkB,IAAI,KAAK,IAAI;CAC/B,KAAU,WAAW;EACnB,IAAI,kBAAkB,IAAI,GAAG,MAAM,MACjC,kBAAkB,OAAO,GAAG;CAEhC,CAAC;CACD,OAAO;AACT;;;;;;;;;;;;AAaA,eAAsB,sBACpB,MACA,MACA,YAC8B;CAI9B,OAAO,mBAAmB,mBAAmB,IAAI,SAC/C,yBAAyB,MAAM,MAAM,UAAU,CACjD;AACF;AAEA,eAAe,yBACb,MACA,MACA,YAC8B;CAC9B,IAAI;CACJ,IAAI;EACF,WAAW,MAAM,yBAAyB,IAAI;CAChD,SAAS,OAAO;EACd,OAAO;GACL,IAAI;GACJ,UAAU;GACV,aAAa,CACX;IACE,UAAU;IACV,MAAM;IACN,SAAS,iBAAiB,KAAK;GACjC,CACF;GACA,MAAM;IACJ,YAAY;IACZ,WAAW;GACb;EACF;CACF;CAEA,IAAI,CAAC,SAAS,IACZ,OAAO;EACL,IAAI;EACJ,UAAU;EACV,aAAa,CACX;GACE,UAAU;GACV,MAAM;GACN,SAAS,2GAA2G,WAAW;EACjI,CACF;EACA,MAAM;GACJ,YAAY;GACZ,WAAW;EACb;CACF;CAGF,MAAM,EAAE,IAAI,QAAQ,YAAY,iBAAiB;CACjD,IAAI;EACF,MAAM,EAAE,MAAM,gBAAgB,MAAM,KAAK,EAAE;EAC3C,OAAO;GACL,IAAI;GACJ,UAAU;GACV;GACA,MAAM;IACJ,YAAY;IACZ,WAAW;IACX,kBAAkB;IAClB;IACA;IACA,GAAG;GACL;EACF;CACF,SAAS,OAAO;EACd,OAAO;GACL,IAAI;GACJ,UAAU;GACV,aAAa,CACX;IACE,UAAU;IACV,MAAM;IACN,SAAS,iBAAiB,KAAK;GACjC,CACF;GACA,MAAM;IACJ,YAAY;IACZ,WAAW;IACX,kBAAkB;IAClB;IACA;GACF;EACF;CACF,UAAU;EACR,MAAM,uBAAuB,EAAE;CACjC;AACF;;;;;;;AAQA,SAAS,cAAiB,OAAa;CACrC,IAAI,OAAO,UAAU,UACnB,OAAO,uBAAuB,KAAK;CAErC,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,MAAM,KAAK,SAAS,cAAc,IAAI,CAAC;CAEhD,IAAI,UAAU,QAAQ,OAAO,UAAU,UAAU;EAC/C,MAAM,MAA+B,CAAC;EACtC,KAAK,MAAM,CAAC,KAAK,SAAS,OAAO,QAC/B,KACF,GACE,IAAI,OAAO,cAAc,IAAI;EAE/B,OAAO;CACT;CACA,OAAO;AACT;;AAGA,SAAS,gBAAgB,WAGvB;CACA,MAAM,SAAS,cAAc,SAAS;CACtC,IACE,WAAW,QACX,OAAO,WAAW,YAClB,eAAe,UACd,OAAkC,cAAc,OACjD;EACA,MAAM,cAAc;EAMpB,MAAM,EAAE,SAAS,GAAG,SAAS;EAG7B,OAAO;GACL,MAAM;GACN,aAAa,CACX;IACE,UALJ,YAAY,WAAW,YAAY,SAAS;IAMxC,MAAM,wBAAwB,OAAO,YAAY,MAAM,CAAC,CAAC,QAAQ,MAAM,GAAG;IAC1E,SAAS,OAAO,OAAO;GACzB,CACF;EACF;CACF;CACA,OAAO;EAAE,MAAM;EAAmC,aAAa,CAAC;CAAE;AACpE;AAEA,SAAS,YAAY,MAAmD;CACtE,OAAO,KAAK,MAAM,WAAW,gBAAgB,MAAM,CAAC;AACtD;AAOA,eAAsB,uBACpB,OAA4B,CAAC,GACC;CAC9B,MAAM,EAAE,OAAO,GAAG,mBAAmB;CACrC,OAAO,sBACL,iBACC,OAAO,YAAY,oBAAoB,IAAI,EAAE,MAAM,CAAC,CAAC,GACtD,sEACF;AACF;AAOA,eAAsB,iBACpB,OAAsB,CAAC,GACO;CAC9B,MAAM,EAAE,OAAO,GAAG,mBAAmB;CACrC,OAAO,sBACL,iBACC,OAAO,YAAY,cAAc,IAAI,EAAE,MAAM,CAAC,CAAC,GAChD,yEACF;AACF;AAOA,eAAsB,sBACpB,OAA2B,CAAC,GACE;CAC9B,MAAM,EAAE,OAAO,GAAG,mBAAmB;CACrC,OAAO,sBACL,iBACC,OAAO,YAAY,mBAAmB,IAAI,EAAE,MAAM,CAAC,CAAC,GACrD,6EACF;AACF;AAOA,eAAsB,sBACpB,OAA2B,CAAC,GACE;CAC9B,MAAM,EAAE,OAAO,GAAG,mBAAmB;CACrC,OAAO,sBACL,iBACC,OAAO,YAAY,mBAAmB,IAAI,EAAE,MAAM,CAAC,CAAC,GACrD,qFACF;AACF;AAaA,eAAsB,qBACpB,OAA0B,CAAC,GACG;CAC9B,MAAM,EAAE,OAAO,QAAQ,UAAU,OAAO,GAAG,mBAAmB;CAC9D,OAAO,sBACL,iBACC,OACC,YAAY,kBAAkB,IAAI;EAAE;EAAO;EAAQ;EAAU;CAAM,CAAC,CAAC,GACvE,8DACF;AACF;AAEA,eAAsB,qBACpB,OAA4B,CAAC,GACC;CAC9B,OAAO,sBACL,OACC,OAAO,YAAY,kBAAkB,EAAE,CAAC,GACzC,+FACF;AACF;;;;;;;;;;;;;;;;ACxVA,IAAM,2BAA2B;AAOjC,SAAS,gBAAgB,MAAwC;CAC/D,OAAO,KAAK,YACT,QAAQ,MAAM,EAAE,aAAa,MAAM,CAAC,CACpC,KAAK,OAAO;EACX,UAAU,EAAE,aAAa,UAAU,YAAY,EAAE;EACjD,MAAM,QAAQ,EAAE;EAChB,SAAS,EAAE;CACb,EAAE;AACN;AAEA,SAAS,YAAY,MAAmB;CACtC,OAAO;EACL,YAAY,KAAK;EACjB,UAAU,KAAK;EACf,aAAa,KAAK;EAClB,WAAW,KAAK;EAChB,aAAa,KAAK;CACpB;AACF;;AAUA,eAAsB,gBACpB,OAA4B,CAAC,GACC;CAC9B,MAAM,OAAO,MAAM,YAAY,EAAE,aAAa,KAAK,YAAY,CAAC;CAGhE,MAAM,WAAW,iBAAiB;EAChC,aAAa,qBAAqB,KAAK,KAAA;EACvC,SAAS,KAAK;EACd,QAAQ,KAAK,UAAU,QAAQ,KAAK,SAAS,MAAM;CACrD,CAAC;CACD,OAAO;EACL,IAAI;EACJ,UAAU;EACV,aAAa,gBAAgB,IAAI;EACjC,MAAM;GACJ,YAAY,SAAS;GACrB,MAAM,YAAY,IAAI;GACtB;EACF;CACF;AACF;;AAUA,eAAsB,cACpB,MAC8B;CAC9B,MAAM,OAAO,MAAM,YAAY,EAAE,aAAa,KAAK,YAAY,CAAC;CAChE,MAAM,OAAO,OAAO,KAAK,SAAS,WAAW,KAAK,KAAK,KAAK,IAAI;CAChE,MAAM,WAAW,iBAAiB;EAChC,aAAa,qBAAqB,KAAK,KAAA;EACvC,SAAS,OAAO,CAAC,IAAI,IAAI,CAAC;EAC1B,QAAQ;CACV,CAAC;CACD,MAAM,cAAc,gBAAgB,IAAI;CACxC,IAAI,SAAwC,SAAS,QAAQ,MAAM;CACnE,IAAI,SAAS,QAAQ,SAAS,GAAG;EAG/B,SAAS;EACT,YAAY,KAAK;GACf,UAAU;GACV,MAAM;GACN,SAAS,GAAG,KAAK,6DAA6D,SAAS,QACpF,KAAK,cAAc,UAAU,iBAAiB,UAAU,IAAI,CAAC,CAC7D,KAAK,IAAI;EACd,CAAC;CACH,OAAO,IAAI,CAAC,QACV,YAAY,KAAK;EACf,UAAU;EACV,MAAM;EACN,SAAS,OACL,0BAA0B,KAAK,yCAC/B;CACN,CAAC;CAEH,IAAI,MAAqB;CACzB,IAAI,QACF,IAAI;EAGF,MACE,eAAe,aACb,OAAO,iBAAiB,OAAO,MAC/B,KAAK,MACP,KAAK;CACT,SAAS,OAAO;EACd,YAAY,KAAK;GACf,UAAU;GACV,MAAM;GACN,SAAS,8BAA8B,iBAAiB,QAAQ,MAAM,UAAU;EAClF,CAAC;CACH;CAEF,OAAO;EACL,IAAI;EACJ,UAAU;EACV;EACA,MAAM;GACJ,YAAY,SAAS;GACrB,MAAM,YAAY,IAAI;GACtB;GACA;EACF;CACF;AACF;;;;;;AAWA,eAAsB,kBACpB,OAA8B,CAAC,GACD;CAC9B,MAAM,OAAO,MAAM,YAAY,EAAE,aAAa,KAAK,YAAY,CAAC;CAChE,MAAM,WAAW,MAAM,sBACrB,MACA,OAAO,OAAO;EAOZ,MAAM,OAAO,MAAM,IANE,eAAe,IAAI;GACtC,sBAAsB;GACtB,uBAAuB;GACvB,uBAAuB;GACvB,cAAc;EAChB,CACmB,CAAA,CAAS,QAC1B,eAAe,2BAA2B,CAC5C;EACA,MAAM,SAAiC,CAAC;EACxC,KAAK,MAAM,UAAU,KAAK,SAAS;GACjC,MAAM,OAAO,OAAQ,OAA8B,QAAQ,SAAS;GACpE,OAAO,SAAS,OAAO,SAAS,KAAK;EACvC;EACA,OAAO;GACL,MAAM;IACJ,MAAM,YAAY,IAAI;IACtB,YAAY,KAAK;IACjB,aAAa,KAAK,aAAa,KAAK,MAAM,EAAE,SAAS;IACrD,eAAe,KAAK;IACpB,cAAc,KAAK,iBAAiB,CAAC;IACrC,aAAa,KAAK,QAAQ;IAC1B,eAAe;IACf,SAAS,KAAK,QAAQ,MAAM,GAAG,wBAAwB;IACvD,WAAW,KAAK,QAAQ,SAAS;GACnC;GACA,aAAa,CAAC;EAChB;CACF,GACA,kFACF;CACA,SAAS,cAAc,CAAC,GAAG,gBAAgB,IAAI,GAAG,GAAG,SAAS,WAAW;CACzE,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;;ACxJA,IAAa,0BAA0B;CACrC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAIA,IAAM,wBAGF;CACF,qBAAqB,SAAS,gBAAgB,IAAa;CAC3D,mBAAmB,SAAS,cAAc,IAAa;CACvD,wBAAwB,SAAS,kBAAkB,IAAa;CAChE,qBAAqB,SAAS,uBAAuB,IAAa;CAClE,eAAe,SAAS,iBAAiB,IAAa;CACtD,oBAAoB,SAAS,sBAAsB,IAAa;CAChE,oBAAoB,SAAS,sBAAsB,IAAa;CAChE,mBAAmB,SAAS,qBAAqB,IAAa;CAC9D,mBAAmB,SAAS,qBAAqB,IAAa;AAChE;;AAGA,SAAgB,mBAAmB;CACjC,MAAM,QAAQ,IAAI,IAAY,uBAAuB;CACrD,OAAO,MAAM,QAAQ,SAAS,MAAM,IAAI,KAAK,IAAI,CAAC;AACpD;;;;;;AAOA,SAAgB,4BAA4B,aAA6B;CACvE,MAAM,SAAS,IAAI,OACjB;EAAE,MAAM,GAAG,YAAY;EAAW,SAAS;CAAe,GAC1D,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE,EAAE,CAChC;CACA,OAAO,kBAAkB,cAAc,aAAa,EAClD,OAAO,iBAAiB,EAC1B,EAAE;CACF,OAAO,kBAAkB,cAAc,OAAO,YAAY;EACxD,MAAM,OAAO,QAAQ,OAAO;EAC5B,MAAM,UAAW,sBAAkD;EACnE,IAAI,OAAO,YAAY,YACrB,MAAM,IAAI,MAAM,yBAAyB,MAAM;EAEjD,MAAM,EAAE,aAAa,UAAU,GAAG,SAAU,QAAQ,OAAO,aACzD,CAAC;EACH,MAAM,SAAS,MACb,QACA;GAAE,GAAG;GAAM,aAAa;EAAY,CAAC;EAEvC,OAAO;GACL,SAAS,CAAC;IAAE,MAAM;IAAQ,MAFf,KAAK,UAAU,QAAQ,MAAM,CAEd;GAAK,CAAC;GAChC,mBAAmB;EACrB;CACF,CAAC;CACD,OAAO;AACT;AAqBA,IAAM,iCAAiB,IAAI,IAAI;CAAC;CAAa;CAAa;AAAK,CAAC;AAEhE,SAAS,cAAc,QAA4B,OAAwB;CACzE,IAAI,CAAC,QAAQ,WAAW,SAAS,GAAG,OAAO;CAC3C,MAAM,YAAY,OAAO,KAAK,OAAO,MAAM,CAAgB,CAAC;CAC5D,MAAM,WAAW,OAAO,KAAK,KAAK;CAClC,OACE,UAAU,WAAW,SAAS,UAAU,gBAAgB,WAAW,QAAQ;AAE/E;AAEA,SAAS,KAAK,KAAqB,QAAgB,SAAuB;CACxE,IAAI,aAAa;CACjB,IAAI,UAAU,gBAAgB,kBAAkB;CAChD,IAAI,WAAW,KACb,IAAI,UAAU,oBAAoB,uCAAqC;CAEzE,IAAI,IAAI,KAAK,UAAU,EAAE,OAAO,QAAQ,CAAC,CAAC;AAC5C;;AAGA,eAAsB,qBACpB,UAAkC,CAAC,GACT;CAC1B,MAAM,OAAO,QAAQ,QAAQ;CAC7B,IAAI,CAAC,eAAe,IAAI,IAAI,GAC1B,MAAM,IAAI,MACR,wEACF;CAEF,MAAM,OAAO,QAAQ,QAAQ;CAC7B,MAAM,QACJ,QAAQ,SACR,QAAQ,IAAI,oBAAoB,KAAK,KACrC,YAAY,EAAE,CAAC,CAAC,SAAS,WAAW;CACtC,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,uCAAuC;CAEzD,MAAM,cAAc,QAAQ,eAAe,QAAQ,IAAI;CACvD,MAAM,OAAO,MAAM,YAAY,EAAE,YAAY,CAAC;CAE9C,MAAM,MAAM,cACV,uBAAuB,4BAA4B,WAAW,GAAG;EAC/D,QAAQ;EACR,kBAAkB;CACpB,CAAC,CACH;CACA,MAAM,YAAY,wBAAwB;CAC1C,MAAM,cAAc,0BAA0B;CAE9C,MAAM,aAAyB,gBAC5B,KAAsB,QAAwB;EAE7C,IAAI,CAAC,UAAU,KAAK,GAAG,GAAG;EAC1B,IAAI,CAAC,YAAY,KAAK,GAAG,GAAG;EAE5B,IAAI,IADY,IAAI,IAAI,OAAO,KAAK,kBAChC,CAAA,CAAI,aAAa,MAAM;GACzB,KAAK,KAAK,KAAK,WAAW;GAC1B;EACF;EACA,IAAI,CAAC,cAAc,IAAI,QAAQ,eAAe,KAAK,GAAG;GACpD,KAAK,KAAK,KAAK,iCAAiC;GAChD;EACF;EACA,IAAS,KAAK,GAAG;CACnB,CACF;CAEA,MAAM,IAAI,SAAe,SAAS,WAAW;EAC3C,WAAW,KAAK,SAAS,MAAM;EAC/B,WAAW,OAAO,QAAQ,QAAQ,GAAG,YAAY;GAC/C,WAAW,IAAI,SAAS,MAAM;GAC9B,QAAQ;EACV,CAAC;CACH,CAAC;CACD,MAAM,UAAU,WAAW,QAAQ;CAGnC,OAAO;EACL,KAAK,UAFL,QAAQ,WAAW,SAAS,IAAI,QAAQ,QAAQ,KAAK,QAAQ,QAEtC,GAAG,QAAQ,OAAO;EACzC;EACA;EACA,aACE,IAAI,SAAe,SAAS,WAAW;GACrC,WAAW,sBAAsB;GACjC,WAAW,OAAO,UAAW,QAAQ,OAAO,KAAK,IAAI,QAAQ,CAAE;EACjE,CAAC;CACL;AACF;;;AC5IA,IAAM,eAGF;CACF,MAAM;EAAE,QAAQ;EAAU,cAAc;CAAK;CAC7C,SAAS;EAAE,QAAQ;EAAU,cAAc;CAAI;CAC/C,SAAS;EAAE,QAAQ;EAAU,cAAc;CAAM;CACjD,SAAS;EAAE,QAAQ;EAAW,cAAc;CAAQ;CACpD,UAAU;EAAE,QAAQ;EAAQ,cAAc;CAAa;CACvD,MAAM;EAAE,QAAQ;EAAO,cAAc;CAAK;AAC5C;AAEA,eAAsB,kBACpB,MACiB;CAEjB,MAAM,EACJ,WACA,YACA,eACA,WACA,WACA,iBACA,cACA,sBACA,kBACA,kBACA,kBACA,6BAbiB,cAAc,IAc7B;CAEJ,MAAM,8BAAc,IAAI,IAAY,CAAC,WAAW,MAAM,CAAC;CACvD,IAAI,oBAAoB,UAAU,GAAG,YAAY,IAAI,OAAO;CAC5D,KAAK,MAAM,gBAAgB,eACzB,YAAY,IAAI,aAAa,IAAI;CAGnC,MAAM,UAAU,CACd,YAAY,MAAM,KAAK,WAAW,CAAC,CAAC,KAAK,IAAI,EAAE,oCACjD;CAEA,IAAI,cAAc;EAChB,MAAM,iBAAiB,CAAC,cAAc;EACtC,IAAI,sBAAsB,eAAe,KAAK,UAAU;EACxD,QAAQ,KACN,YAAY,eAAe,KAAK,IAAI,EAAE,uCACxC;CACF;CAEA,MAAM,iBAAiB,CACrB,GAAI,eACA,CAAC,iBAAiB,oBAAoB,EAAE,GAAG,aAAa,CAAC,EAAE,EAAE,IAC7D,CAAC,GACL,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF,CAAC,CACH;CAEA,MAAM,eAAe;EACnB,GAAI,wBAAwB,eACxB,CAAC,oBAAoB,YAAY,CAAC,IAClC,CAAC;EACL,GAAG,WAAW,IAAI,cAAc;EAChC,GAAG,cAAc,IAAI,kBAAkB;CACzC,CAAC,CAAC,OAAO,OAAO;CAEhB,MAAM,oBAAoB,2BACtB,KAAK,wBAAwB,WAAW,QAAQ,YAAY,CAAC,MAC7D;CAEJ,OAAO,GAAG,QAAQ,KAAK,IAAI,EAAE;;EAE7B,eAAe,KAAK,IAAI,EAAE;eACb,UAAU,WAAW,UAAU;EAC5C,aAAa,KAAK,MAAM,EAAE;;;;;;;EAO1B;AACF;AAEA,SAAS,cACP,MACiC;CACjC,MAAM,WAAW,KAAK,YAAY;CAClC,MAAM,mBAAmB,oBAAoB,QAAQ;CACrD,MAAM,eACJ,KAAK,iBAAiB,OACjB,iBAAiB,gBAAgB,EAAE,MAAM,WAAoB,IAC9D,KAAK,iBAAiB,QACpB,KAAA,IACC,KAAK,gBAAgB,iBAAiB;CAE/C,OAAO;EACL,WAAW,KAAK;EAChB,YAAY,KAAK;EACjB,WAAW,KAAK,aAAa;EAC7B;EACA,WAAW,KAAK,aAAa,iBAAiB;EAC9C,iBACE,KAAK,mBAAmB,iBAAiB,mBAAmB,CAAC;EAC/D,cAAc,sBAAsB,YAAY;EAChD,sBACE,KAAK,wBACL,iBAAiB,wBACjB,QAAQ,YAAY;EACtB,eAAe,KAAK,iBAAiB,CAAC;EACtC,kBAAkB,KAAK,oBAAoB;EAC3C,kBAAkB,KAAK,oBAAoB;EAC3C,kBAAkB,KAAK,oBAAoB;EAC3C,0BAA0B,KAAK,4BAA4B;CAC7D;AACF;AAEA,SAAS,oBAAoB,UAK3B;CACA,QAAQ,UAAR;EACE,KAAK,oBACH,OAAO;GACL,cAAc,EAAE,MAAM,WAAW;GACjC,sBAAsB;GACtB,iBAAiB,CAAC,aAAa,MAAM;EACvC;EACF,KAAK,yBACH,OAAO;GACL,cAAc,EAAE,MAAM,WAAW;GACjC,sBAAsB;EACxB;EACF,KAAK,2BACH,OAAO;GACL,cAAc,EAAE,MAAM,WAAW;GACjC,sBAAsB;EACxB;EACF,KAAK,kBACH,OAAO,EAAE,iBAAiB,CAAC,MAAM,EAAE;EACrC,KAAK;EACL,KAAK,SACH,OAAO,CAAC;CACZ;AACF;AAEA,SAAS,sBACP,OACoC;CACpC,IAAI,CAAC,OAAO,OAAO,KAAA;CACnB,OAAO;EACL,MAAM,OAAO,UAAU,WAAY,MAAM,QAAQ,aAAc;EAC/D,OAAO,OAAO,UAAU,WAAY,MAAM,SAAS,aAAc;EACjE,YAAY,OAAO,UAAU,WAAW,MAAM,aAAa,KAAA;EAC3D,cAAc,OAAO,UAAU,WAAW,MAAM,eAAe,KAAA;EAC/D,uBACE,OAAO,UAAU,WAAW,MAAM,wBAAwB,KAAA;CAC9D;AACF;AAEA,SAAS,oBAAoB,SAMlB;CACT,MAAM,kBAA2C,CAAC;CAElD,IAAI,QAAQ,WACV,gBAAgB,YAAY,QAAQ;CAGtC,IAAI,QAAQ,gBAAgB,SAAS,GACnC,gBAAgB,kBAAkB,QAAQ;CAG5C,IAAI,QAAQ,kBACV,gBAAgB,MAAM;EACpB,SAAS;GAAC;GAAQ;GAAO;GAAU;EAAQ;EAC3C,SAAS,CAAC,QAAQ;CACpB;CAGF,IAAI,QAAQ,kBACV,gBAAgB,MAAM,EACpB,SAAS,CAAC,QAAQ,KAAK,EACzB;CAGF,IAAI,QAAQ,kBACV,gBAAgB,MAAM;CAGxB,OAAO,OAAO,KAAK,eAAe,CAAC,CAAC,SAAS,IACzC,SAAS,KAAK,UAAU,iBAAiB,MAAM,CAAC,EAAE,KAClD;AACN;AAEA,SAAS,oBAAoB,cAA8C;CACzE,MAAM,WAAW,aAAa,SAAS;CACvC,MAAM,QAAQ,aAAa,SAAS;CACpC,OAAO,WACH,sCAAsC,MAAM,2BAC5C,oBAAoB,MAAM;AAChC;AAEA,SAAS,eAAe,MAAkC;CACxD,MAAM,UAAU,aAAa,KAAK;CAClC,MAAM,WAAW,KAAK,aAAa;CACnC,MAAM,SAAS,WAAW,GAAG,QAAQ,OAAO,WAAW,QAAQ;CAC/D,MAAM,eACJ,KAAK,iBAAiB,KAAA,IAClB,cAAc,KAAK,YAAY,IAC/B,WACE,SACA,QAAQ;CAChB,MAAM,eAAe,gBAAc;EACjC,UAAU,KAAK;EACf,UAAU,KAAK;EACf,aAAa,KAAK;CACpB,CAAC;CAOD,OAAO,GANO,KAAK,cAAc,SAAS,KAAK,YAAY,SAAS,KAElE,OAAO,KAAK,YAAY,CAAC,CAAC,SAAS,IAC/B,YAAY,KAAK,UAAU,YAAY,EAAE,OACzC,GAEsB,IAAI,KAAK,KAAK,IAAI,OAAO,KAAK,aAAa;AACzE;AAEA,SAAS,mBAAmB,cAA8C;CACxE,MAAM,UAAU,gBAAc;EAC5B,UAAU,aAAa;EACvB,UAAU,aAAa;EACvB,aAAa,aAAa;EAC1B,UAAU,aAAa;EACvB,YAAY,aAAa;EACzB,SAAS,aAAa;EACtB,WAAW,aAAa;EACxB,WAAW,aAAa;CAC1B,CAAC;CACD,MAAM,OAAO,CACX,cAAc,aAAa,OAAO,GAClC,GAAI,OAAO,KAAK,OAAO,CAAC,CAAC,SAAS,IAAI,CAAC,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CACrE;CACA,MAAM,YAAY,IAAI,aAAa,KAAK,GAAG,KAAK,KAAK,IAAI,EAAE;CAC3D,MAAM,YACJ,aAAa,SAAS,eAAe,aAAa,SAAS,eACvD,cACA,aAAa,WACX,kBACA;CACR,MAAM,eACJ,aAAa,SAAS,eAAe,aAAa,SAAS,eACvD,OACA,aAAa,WACX,SACA;CAER,OAAO,KAAK,UAAU,MAAM,aAAa,KAAK,IAAI,UAAU,KAAK,aAAa;AAChF;AAEA,SAAS,oBAAoB,YAA2C;CACtE,OAAO,WAAW,MACf,aACC,SAAS,aAAa,KAAA,KACtB,SAAS,aAAa,KAAA,KACtB,SAAS,gBAAgB,KAAA,CAC7B;AACF;AAEA,SAAS,wBACP,WACA,kBACQ;CAIR,OAAO;;cAEK,UAAU;wFALC,mBACnB,uEACA,GAIiG;;AAEvG;AAEA,SAAS,oBAAoB,OAAwC;CACnE,OAAO,KAAK,UAAU,gBAAc,KAAK,GAAG,MAAM,CAAC;AACrD;AAEA,SAAS,cAAc,OAAwB;CAC7C,IAAI,OAAO,UAAU,UAAU,OAAO,KAAK,UAAU,KAAK;CAC1D,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,WAChD,OAAO,OAAO,KAAK;CAErB,IAAI,UAAU,MAAM,OAAO;CAC3B,OAAO,KAAK,UAAU,OAAO,MAAM,CAAC;AACtC;AAEA,SAAS,gBAAiD,OAAa;CACrE,OAAO,OAAO,YACZ,OAAO,QAAQ,KAAK,CAAC,CAAC,QAAQ,GAAG,WAAW,UAAU,KAAA,CAAS,CACjE;AACF;;;AC9QA,IAAM,yBAAyB;CAC7B;CACA;CACA;AACF;AAEA,IAAM,eAAe;CACnB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,IAAM,qCAAqB,IAAI,IAAI;CACjC;CACA;CACA;CACA;AACF,CAAC;;;;;AAMD,IAAM,oBAAoB;AAE1B,IAAM,yBAAyB;CAAC;CAAQ;CAAO;CAAU;CAAU;AAAQ;AAE3E,eAAsB,kBACpB,MACiB;CACjB,MAAM,EACJ,YAAY,QAAQ,IAAI,GACxB,gBAAgB,MAChB,uBAAuB,MACvB,iBAAiB,MACjB,SAAS,WACT,WAAW,sBACT;CACJ,MAAM,cAAc,QAAQ,SAAS;CAGrC,IAAI,CAAC,MADgB,aAAW,WAAW,GAEzC,OAAO,KAAK,UACV;EACE;EACA,gBAAgB;EAChB,aAAa;EACb,SAAS,CAAC;EACV,aAAa,CACX;GACE,UAAU;GACV,SAAS,qCAAqC;EAChD,CACF;CACF,GACA,MACA,CACF;CAGF,MAAM,kBAAkB,MAAM,oBAAoB,WAAW;CAC7D,MAAM,eAAe,MAAM,iBAAiB,WAAW;CACvD,MAAM,iBACH,MAAM,qBAAqB,aAAa,KAAK,YAAY,KACzD,MAAM,mBAAmB,aAAa,eAAe;CAExD,MAAM,UAAU,OAAO,QAAQ,eAAe,SAAS,WAAW,CAAC,CAAC;CACpE,MAAM,UACJ,WAAW,YACP,QAAQ,KAAK,CAAC,aAAa,YACzB,gBAAgB;EACd;EACA;EACA;EACA,aAAa,aAAa,IAAI,OAAO,SAAS;CAChD,CAAC,CACH,IACA,QAAQ,KAAK,CAAC,aAAa,YACzB,aAAa;EACX;EACA;EACA;EACA;EACA;EACA;EACA,aAAa,aAAa,IAAI,OAAO,SAAS;CAChD,CAAC,CACH;CACN,QAAQ,MAAM,MAAM,UAAU,KAAK,UAAU,cAAc,MAAM,SAAS,CAAC;CAE3E,MAAM,EAAE,MAAM,YAAY,kBAAkB,SAAS,QAAQ;CAE7D,MAAM,SAAS;EACb;EACA,gBAAgB,eAAe;EAC/B,cACE,UAAU,iBACN,SAAS,aAAa,eAAe,IAAI,IACzC,KAAA;EACN,aACE,eAAe,SAAS,eAAe,gBAAgB,QAAQ,KAAA;EACjE,gBACE,eAAe,SAAS,kBACxB,gBAAgB,WAChB,KAAA;EACF;EACA,aAAa,QAAQ;EACrB,kBAAkB,eAAe;EACjC,aAAa,eAAe;EAC5B,GAAI,UAAU,IACV,EACE,WAAW;GACT,qBAAqB,KAAK;GAC1B,oBAAoB;GACpB,aAAa;GACb,UACE;EACJ,EACF,IACA,CAAC;EACL,SAAS;EACT,aAAa,eAAe;CAC9B;CAEA,OAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AACvC;;;;;AAMA,SAAS,kBACP,SACA,UACgC;CAChC,MAAM,OAAY,CAAC;CACnB,IAAI,OAAO;CAEX,KAAK,MAAM,UAAU,SAAS;EAC5B,MAAM,OAAO,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC,CAAC,SAAS;EACtD,IAAI,OAAO,OAAO,YAAY,KAAK,SAAS,GAAG;EAC/C,QAAQ;EACR,KAAK,KAAK,MAAM;CAClB;CAEA,OAAO;EAAE;EAAM,SAAS,QAAQ,SAAS,KAAK;CAAO;AACvD;AAEA,SAAS,gBAAgB,EACvB,aACA,QACA,aACA,eAMC;CACD,MAAM,SAAS,OAAO,QAAQ,OAAO,UAAU,CAAC,CAAC;CACjD,MAAM,kBAAkB,OAAO,mBAAmB,CAAC;CAEnD,OAAO,cAAc;EACnB;EACA,WAAW,OAAO;EAClB,eAAe,OAAO;EACtB,UAAU,eAAa,aAAa,OAAO,QAAQ;EACnD,SAAS,OAAO;EAChB,YAAY,OAAO;EACnB,WACE,OAAO,QAAQ,aACf,iBAAiB,gBAAgB,SAAS,KAC1C,OAAO;EACT,aACE,eAAe,4BAA4B,gBAAgB,YAAY;EACzE,YAAY,OAAO;EACnB,eACE,OACG,QAAQ,GAAG,WAAW,mBAAmB,IAAI,MAAM,IAAI,CAAC,CAAC,CACzD,KACE,CAAC,MAAM,WACN,GAAG,KAAK,MAAM,MAAM,WAAW,GAAG,IAAI,MAAM,KAAK,EACrD,CAAC,CACA,KAAK,IAAI,KAAK,KAAA;EACnB,eAAe,wBAAwB,gBAAgB,GAAG;CAC5D,CAAC;AACH;;;;;AAMA,SAAS,wBAAwB,QAA2B;CAC1D,IAAI,WAAW,OAAO,OAAO,CAAC;CAC9B,IAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,MAAM,QAAQ,MAAM,GACvE,OAAO,CAAC,GAAG,sBAAsB;CAGnC,MAAM,SAAS;CACf,MAAM,UAAU,MAAM,QAAQ,OAAO,OAAO,IACxC,OAAO,QAAQ,QAAQ,SAAyB,OAAO,SAAS,QAAQ,IACxE;CACJ,MAAM,UAAU,IAAI,IAClB,MAAM,QAAQ,OAAO,OAAO,IACxB,OAAO,QAAQ,QACZ,SAAyB,OAAO,SAAS,QAC5C,IACA,CAAC,CACP;CAEA,OAAO,QAAQ,QAAQ,cAAc,CAAC,QAAQ,IAAI,SAAS,CAAC;AAC9D;AAEA,eAAe,qBACb,aACA,cAWA;CACA,MAAM,aAAa,eACf,CAAC,QAAQ,aAAa,YAAY,CAAC,IACnC,uBAAuB,KAAK,cAAc,KAAK,aAAa,SAAS,CAAC;CAE1E,MAAM,cAA4B,CAAC;CACnC,KAAK,MAAM,aAAa,YAAY;EAClC,IAAI,CAAE,MAAM,aAAW,SAAS,GAC9B;EAGF,IAAI;GACF,MAAM,SAAS,KAAK,MAAM,MAAM,SAAS,WAAW,OAAO,CAAC;GAC5D,IAAI,eAAe,MAAM,GACvB,OAAO;IACL,QAAQ;IACR,MAAM;IACN,UAAU;IACV;GACF;GAGF,YAAY,KAAK;IACf,UAAU;IACV,UAAU;IACV,SAAS;GACX,CAAC;EACH,SAAS,OAAO;GACd,YAAY,KAAK;IACf,UAAU;IACV,UAAU;IACV,SAAS,sCAAsC,iBAAiB,KAAK;GACvE,CAAC;EACH;CACF;CAEA,OAAO,eACH;EACE,QAAQ;EACR,MAAM,QAAQ,aAAa,YAAY;EACvC,UAAU,EAAE,SAAS,CAAC,EAAE;EACxB,aAAa,CACX,GAAG,aACH;GACE,UAAU;GACV,UAAU,QAAQ,aAAa,YAAY;GAC3C,SAAS;EACX,CACF;CACF,IACA,KAAA;AACN;AAEA,eAAe,mBACb,aACA,iBAOC;CAMD,MAAM,EAAE,SAAS,aAAa,MAAM,IALhB,WAAW;EAC7B,KAAK;EACL,SAAS;GAAC;GAAW;GAAY;GAAW;EAAU;EACtD,SAAS;CACX,CACoC,CAAA,CAAQ,eAAe;CAE3D,MAAM,WAAW,IADG,gBACH,CAAA,CAAQ,WACvB,SAAS,QAAQ,aAAa,SAAS,iBAAiB,GACxD;EACE,aAAa,gBAAgB;EAC7B,gBAAgB,gBAAgB;EAChC,aAAa,QAAQ;CACvB,CACF;CACA,wBAAwB,UAAU,eAAe;CAEjD,OAAO;EACL,QAAQ;EACR;EACA,aAAa,QAAQ,OAAO,IAAI,qBAAqB;EACrD,kBAAkB,QAAQ;EAC1B,aAAa,KAAK,MAAM,QAAQ,gBAAgB;CAClD;AACF;AAEA,SAAS,wBACP,UACA,iBACM;CACN,MAAM,cAAc,IAAI,kBAAkB;CAC1C,MAAM,eAAe;CACrB,+BAA+B;EAC7B,YAAY,yBAAyB,YAAY;EACjD,YAAY,qBAAqB,YAAY;EAC7C,YAAY,wBAAwB,YAAY;EAChD,YAAY,gBAAgB,YAAY;EACxC,YAAY,iCAAiC,YAAY;EACzD,YAAY,uBACV,cACA,gBAAgB,MAChB,gBAAgB,IAClB;CACF,CAAC;AACH;AAEA,SAAS,yBAA4B,UAAsB;CACzD,MAAM,cAAc,QAAQ;CAC5B,QAAQ,YAAY,KAAA;CACpB,IAAI;EACF,OAAO,SAAS;CAClB,UAAU;EACR,QAAQ,MAAM;CAChB;AACF;AAEA,SAAS,aAAa,EACpB,aACA,QACA,aACA,eACA,sBACA,gBACA,eASC;CACD,MAAM,eAAe,OAAO,QAAQ,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,KACtD,CAAC,MAAM,YAAY;EAClB;EACA,MAAM,MAAM;EACZ,GAAI,MAAM,aAAa,KAAA,IAAY,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;EACnE,GAAI,MAAM,YAAY,KAAA,IAAY,EAAE,SAAS,MAAM,QAAQ,IAAI,CAAC;EAChE,GAAI,MAAM,UAAU,EAAE,SAAS,MAAM,QAAQ,IAAI,CAAC;EAClD,GAAI,MAAM,cAAc,EAAE,aAAa,MAAM,YAAY,IAAI,CAAC;EAC9D,GAAI,MAAM,QAAQ,EAAE,MAAM,MAAM,MAAM,IAAI,CAAC;EAC3C,GAAI,MAAM,cAAc,KAAA,IAAY,EAAE,WAAW,MAAM,UAAU,IAAI,CAAC;CACxE,EACF;CACA,MAAM,sBAAsB,aACzB,QAAQ,UAAU,mBAAmB,IAAI,MAAM,IAAI,CAAC,CAAC,CACrD,KAAK,WAAW;EACf,OAAO,MAAM;EACb,cAAc,MAAM,WAAW;EAC/B,MAAM,MAAM;EACZ,GAAI,MAAM,OAAO,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;CAC3C,EAAE;CACJ,MAAM,gBAAgB,OAAO,QAAQ,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,KACxD,CAAC,MAAM,aAAa;EACnB,MAAM,OAAO,QAAQ;EACrB,SAAS,OAAO,UAAU;EAC1B,UAAU,OAAO,aAAa;EAC9B,UAAU,OAAO,aAAa;EAC9B,YAAY,OAAO,cAAc,CAAC;EAClC,YAAY,OAAO,cAAc;EACjC,GAAI,OAAO,cAAc,EAAE,aAAa,OAAO,YAAY,IAAI,CAAC;CAClE,EACF;CAEA,MAAM,kBAAkB,OAAO,mBAAmB,CAAC;CACnD,MAAM,uBACJ,eAAe,4BAA4B,gBAAgB,YAAY;CACzE,MAAM,SAAS,OAAO;CAEtB,OAAO,cAAc;EACnB;EACA,MAAM,OAAO;EACb,WAAW,OAAO;EAClB,eAAe,OAAO;EACtB,UAAU,eAAa,aAAa,OAAO,QAAQ;EACnD,aAAa,OAAO;EACpB,gBAAgB,OAAO;EACvB,YAAY,OAAO;EACnB,YAAY,OAAO;EACnB,YAAY,OAAO;EACnB,sBAAsB,OAAO;EAC7B,YAAY,OAAO;EACnB,SAAS,OAAO;EAChB,gBAAgB,OAAO;EACvB,WACE,QAAQ,aACR,iBAAiB,gBAAgB,SAAS,KAC1C,OAAO;EACT,eAAe,iBAAiB,gBAAgB,aAAa,KAAK;EAClE,iBAAiB,gBAAgB,gBAAgB,eAAe;EAChE,aAAa;EACb;EACA,QAAQ,SACJ;GACE,WAAW,OAAO;GAClB,SAAS,OAAO;GAChB,SAAS,OAAO,WAAW,CAAC;GAC5B,SAAS,OAAO;EAClB,IACA,KAAA;EACJ,SAAS,QAAQ,WAAW,CAAC;EAC7B,kBAAkB,OAAO;EACzB,iBAAiB,OAAO;EACxB,GAAI,iBAAiB;GACnB,QAAQ,aACL,KAAK,UAAU,GAAG,MAAM,KAAK,IAAI,MAAM,MAAM,CAAC,CAC9C,KAAK,IAAI;GACZ;EACF;EACA,GAAI,wBACF,oBAAoB,SAAS,KAAK;GAChC,eAAe,oBACZ,KACE,iBACC,GAAG,aAAa,MAAM,MAAM,aAAa,aAAa,IAAI,aAAa,KAAK,EAChF,CAAC,CACA,KAAK,IAAI;GACZ;EACF;EACF,GAAI,kBACF,cAAc,SAAS,KAAK;GAC1B,SAAS,cACN,KAAK,WAAW,GAAG,OAAO,UAAU,WAAW,KAAK,OAAO,KAAK,GAAG,CAAC,CACpE,KAAK,IAAI;GACZ;EACF;CACJ,CAAC;AACH;AAEA,eAAe,iBACb,aAC+C;CAC/C,MAAM,QAAQ,MAAM,kBAAgB,WAAW;CAC/C,MAAM,yBAAS,IAAI,IAAqC;CAExD,MAAM,QAAQ,IACZ,MAAM,IAAI,OAAO,aAAa;EAC5B,MAAM,UAAU,MAAM,SAAS,UAAU,OAAO;EAChD,MAAM,eAAe,QAAQ,SAAS,2BAA2B;EACjE,KAAK,MAAM,SAAS,cAAc;GAChC,MAAM,YAAY,MAAM;GACxB,IAAI,CAAC,aAAa,MAAM,UAAU,KAAA,GAAW;GAC7C,MAAM,SAAS,QAAQ,MACrB,KAAK,IAAI,GAAG,MAAM,QAAQ,GAAG,GAC7B,MAAM,KACR;GAIA,MAAM,cAHgB,MAAM,KAC1B,OAAO,SAAS,iCAAiC,CAE/B,CAAA,CAAc,GAAG,EAAE;GACvC,IAAI,CAAC,aAAa;GAClB,OAAO,IAAI,WAAW;IACpB,QAAQ;IACR,GAAG,yBAAyB,YAAY,EAAE;GAC5C,CAAC;EACH;CACF,CAAC,CACH;CAEA,OAAO;AACT;AAEA,eAAe,kBAAgB,aAAwC;CACrE,MAAM,QAAkB,CAAC;CAEzB,eAAe,MAAM,KAA4B;EAC/C,IAAI;EACJ,IAAI;GACF,UAAU,MAAM,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;EACtD,QAAQ;GACN;EACF;EAEA,KAAK,MAAM,SAAS,SAAS;GAC3B,MAAM,WAAW,KAAK,KAAK,MAAM,IAAI;GACrC,IAAI,MAAM,YAAY,GAAG;IACvB,IACE;KACE;KACA;KACA;KACA;KACA;KACA;IACF,CAAC,CAAC,SAAS,MAAM,IAAI,KACrB,MAAM,KAAK,WAAW,GAAG,GAEzB;IAEF,MAAM,MAAM,QAAQ;IACpB;GACF;GAEA,IACE,MAAM,OAAO,KACb,iBAAiB,KAAK,MAAM,IAAI,KAChC,CAAC,MAAM,KAAK,SAAS,OAAO,KAC5B,CAAC,MAAM,KAAK,SAAS,UAAU,KAC/B,CAAC,MAAM,KAAK,SAAS,UAAU,GAE/B,MAAM,KAAK,QAAQ;EAEvB;CACF;CAEA,MAAM,MAAM,WAAW;CACvB,OAAO;AACT;AAEA,SAAS,yBAAyB,KAAsC;CACtE,MAAM,OAAO,IAAI,MAAM,0CAA0C,CAAC,GAAG;CACrE,MAAM,QAAQ,IAAI,MAAM,sCAAsC,CAAC,GAAG;CAClE,MAAM,wBAAwB,IAAI,MAChC,0CACF,CAAC,GAAG;CACJ,MAAM,aAAa,IAAI,MAAM,+BAA+B,CAAC,GAAG;CAChE,MAAM,eAAe,IAAI,MAAM,iCAAiC,CAAC,GAAG;CAEpE,OAAO,cAAc;EACnB,MAAM,QAAQ;EACd,OAAO,SAAS;EAChB,YAAY,eAAe,KAAA,IAAY,KAAA,IAAY,eAAe;EAClE,cACE,iBAAiB,KAAA,IAAY,KAAA,IAAY,iBAAiB;EAC5D,uBACE,0BAA0B,KAAA,IACtB,KAAA,IACA,0BAA0B;CAClC,CAAC;AACH;AAEA,SAAS,4BACP,cACqC;CACrC,IAAI,CAAC,cAAc,OAAO,KAAA;CAC1B,MAAM,UACJ,OAAO,iBAAiB,YAAY,CAAC,MAAM,QAAQ,YAAY,IAC1D,eACD,CAAC;CACP,OAAO;EACL,QAAQ;EACR,MAAM,QAAQ,QAAQ;EACtB,OAAO,QAAQ,SAAS;EACxB,YAAY,QAAQ,cAAc;EAClC,cAAc,QAAQ,gBAAgB;EACtC,uBAAuB,QAAQ,yBAAyB;CAC1D;AACF;AAEA,eAAe,oBACb,aAC0B;CAC1B,MAAM,kBAAkB,KAAK,aAAa,cAAc;CACxD,IAAI,CAAE,MAAM,aAAW,eAAe,GAAI,OAAO,CAAC;CAElD,IAAI;EACF,MAAM,OAAO,KAAK,MAAM,MAAM,SAAS,iBAAiB,OAAO,CAAC;EAIhE,OAAO;GACL,MAAM,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO,KAAA;GAClD,SAAS,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU,KAAA;GAC3D;EACF;CACF,QAAQ;EACN,OAAO,CAAC;CACV;AACF;AAEA,eAAe,aAAW,MAAgC;CACxD,IAAI;EACF,MAAM,OAAO,IAAI;EACjB,OAAO;CACT,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,eAAe,OAAuC;CAC7D,OACE,CAAC,CAAC,SACF,OAAO,UAAU,YACjB,CAAC,CAAE,MAAuB,WAC1B,OAAQ,MAAuB,YAAY;AAE/C;AAEA,SAAS,sBAAsB,OAA8B;CAC3D,OAAO;EACL,UAAU,MAAM;EAChB,SAAS,MAAM;EACf,UAAU,MAAM;EAChB,MAAM,MAAM;EACZ,QAAQ,MAAM;CAChB;AACF;AAEA,SAAS,eAAa,aAAqB,UAA0B;CAInE,MAAM,eAAe,SAAS,aAHb,WAAW,QAAQ,IAChC,WACA,QAAQ,aAAa,QAAQ,CACkB;CACnD,IAAI,CAAC,aAAa,WAAW,IAAI,GAC/B,OAAO,gBAAgB;CAEzB,OAAO;AACT;AAEA,SAAS,iBAAiB,OAAoC;CAC5D,OAAO,OAAO,UAAU,WAAW,QAAQ,KAAA;AAC7C;AAEA,SAAS,gBAAgB,OAAsC;CAC7D,OAAO,MAAM,QAAQ,KAAK,IACtB,MAAM,QAAQ,SAAyB,OAAO,SAAS,QAAQ,IAC/D,KAAA;AACN;AAEA,SAAS,cAAiD,OAAa;CACrE,OAAO,OAAO,YACZ,OAAO,QAAQ,KAAK,CAAC,CAAC,QAAQ,GAAG,WAAW,UAAU,KAAA,CAAS,CACjE;AACF;AAEA,SAAS,iBAAiB,OAAwB;CAChD,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC9D;;;;;;;ACltBA,IAAM,oBAAoB;AAC1B,IAAM,4BAAY,IAAI,IAAI;CACxB;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AACD,IAAM,sBAAsB;CAC1B;CACA;CACA;CACA;AACF;AACA,IAAM,sBAAsB;AAC5B,IAAM,+BAA+B;AAErC,eAAsB,kBACpB,MACiB;CACjB,MAAM,cAAc,QAAQ,KAAK,aAAa,KAAK,WAAW,QAAQ,IAAI,CAAC;CAC3E,IAAI,CAAE,MAAM,WAAW,WAAW,GAChC,OAAO,KAAK,UACV;EACE;EACA,cAAc;EACd,UAAU,CAAC;EACX,UAAU,CAAC;EACX,SAAS;GAAE,MAAM;GAAG,QAAQ;GAAG,KAAK;EAAE;EACtC,aAAa,CACX;GACE,UAAU;GACV,SAAS,qCAAqC;EAChD,CACF;CACF,GACA,MACA,CACF;CAGF,MAAM,kBAAkB,MAAM,qBAAqB,WAAW;CAC9D,MAAM,cAAc,MAAM,gBAAgB,aAAa,eAAe;CACtE,MAAM,kBAAkB,aAAa,iBAAiB,WAAW;CAEjE,MAAM,WAAW,cACf;EACE,GAAG,qCAAqC,eAAe;EACvD,GAAG,6BAA6B,aAAa,WAAW;EACxD,GAAG,0BAA0B,aAAa,iBAAiB,WAAW;EACtE,GAAG,qBAAqB,aAAa,iBAAiB,WAAW;EACjE,GAAG,qBAAqB,aAAa,iBAAiB,WAAW;EACjE,GAAG,iBAAiB,iBAAiB,WAAW;EAChD,GAAG,6BACD,aACA,iBACA,WACF;CACF,GACA,KAAK,WACP;CAEA,MAAM,WAAW,gBACd,IAAI,gBAAgB,CAAC,CACrB,MAAM,MAAM,UAAU,KAAK,KAAK,cAAc,MAAM,IAAI,CAAC;CAC5D,MAAM,UAAU,kBAAkB,QAAQ;CAE1C,OAAO,KAAK,UACV;EACE;EACA,cAAc,SAAS;EACvB;EACA,UACE,KAAK,0BAA0B,QAC3B,SAAS,KAAK,EAAE,UAAU,WAAW,GAAG,cAAc,OAAO,IAC7D;EACN;EACA,iBAAiB;GACf;GACA;GACA;GACA;EACF;EACA,yBAAyB,SAAS,KAAK,aAAa;GAClD,OAAO,QAAQ;GACf,UAAU,QAAQ;GAClB,MAAM,QAAQ;EAChB,EAAE;CACJ,GACA,MACA,CACF;AACF;AAEA,eAAe,qBACb,aAC2B;CAC3B,MAAM,mBAAmB,MAAM,qBAAqB,WAAW;CAC/D,MAAM,WAAW,MAAM,QAAQ,IAC7B,iBAAiB,IAAI,OAAO,oBAAoB;EAC9C,MAAM,OAAO,KAAK,MAChB,MAAM,SAAS,iBAAiB,OAAO,CACzC;EACA,MAAM,YAAY,QAAQ,eAAe;EACzC,OAAO;GACL;GACA,cAAc,SAAS,aAAa,SAAS,KAAK;GAClD;GACA;GACA,cAAc,oBAAoB,IAAI;GACtC,SAAS,WAAS,KAAK,OAAO,IACzB,KAAK,UACN,CAAC;GACL,yBAAS,IAAI,IAAwB;GACrC,aAAa,CAAC;EAChB;CACF,CAAC,CACH;CAEA,IAAI,SAAS,WAAW,GACtB,SAAS,KAAK;EACZ,WAAW;EACX,cAAc;EACd,iBAAiB,KAAK,aAAa,cAAc;EACjD,MAAM,CAAC;EACP,8BAAc,IAAI,IAAI;EACtB,SAAS,CAAC;EACV,yBAAS,IAAI,IAAI;EACjB,aAAa,CAAC;CAChB,CAAC;CAGH,OAAO,SAAS,MACb,MAAM,UAAU,KAAK,UAAU,SAAS,MAAM,UAAU,MAC3D;AACF;AAEA,eAAe,qBAAqB,aAAwC;CAC1E,MAAM,QAAkB,CAAC;CACzB,MAAM,MAAM,aAAa,OAAO,UAAU,cAAc;EACtD,IAAI,cAAc,gBAAgB,MAAM,KAAK,QAAQ;CACvD,CAAC;CACD,OAAO;AACT;AAEA,eAAe,gBACb,aACA,UACuB;CACvB,MAAM,QAAsB,CAAC;CAC7B,MAAM,MAAM,aAAa,OAAO,UAAU,cAAc;EACtD,IAAI,CAAC,kBAAkB,KAAK,SAAS,GAAG;EACxC,IACE,UAAU,SAAS,OAAO,KAC1B,UAAU,SAAS,UAAU,KAC7B,UAAU,SAAS,UAAU,GAE7B;EAGF,MAAM,aAAa,kBAAkB,UAAU,QAAQ,CAAC,CAAC;EACzD,MAAM,UAAU,MAAM,SAAS,UAAU,OAAO;EAChD,MAAM,KAAK;GAAE,MAAM;GAAU;GAAY;EAAQ,CAAC;CACpD,CAAC;CACD,OAAO;AACT;AAEA,eAAe,kBACb,aACA,UACA,aACe;CACf,KAAK,MAAM,cAAc,aAAa;EACpC,MAAM,QAAQ,SAAS,MACpB,QAAQ,IAAI,cAAc,WAAW,UACxC;EACA,IAAI,CAAC,OAAO;EACZ,MAAM,YAAY,KAAK,UAAU;EACjC,KAAK,MAAM,mBAAmB,eAAe,WAAW,OAAO,GAAG;GAChE,IAAI,CAAC,gBAAgB,WAAW,4BAA4B,GAAG;GAC/D,MAAM,WAAW;IACf,UAAU,SAAS,aAAa,WAAW,IAAI;IAC/C,MAAM,WAAW,WAAW,SAAS,eAAe;IACpD,QAAQ,WAAW;GACrB;GACA,MAAM,WAAW,MAAM,QAAQ,IAAI,eAAe,KAAK,CAAC;GACxD,SAAS,KAAK,QAAQ;GACtB,MAAM,QAAQ,IAAI,iBAAiB,QAAQ;EAC7C;CACF;AACF;AAEA,SAAS,qCACP,UACW;CACX,OAAO,SAAS,SAAS,QAAQ;EAC/B,MAAM,UACJ,OAAO,IAAI,KAAK,SAAS,WAAW,IAAI,KAAK,OAAO,KAAA;EACtD,MAAM,UAAU,MAAM,KAAK,IAAI,QAAQ,KAAK,CAAC,CAAC,CAAC,QAC5C,oBACC,oBAAoB,WAAW,CAAC,IAAI,aAAa,IAAI,eAAe,CACxE;EACA,IAAI,QAAQ,WAAW,GAAG,OAAO,CAAC;EAKlC,OAAO,CACL;GACE,UALmB,QAAQ,MAAM,SACnC,KAAK,WAAW,mBAAmB,CAIvB,IAAiB,SAAS;GACpC,MAAM;GACN,MAAM;GACN,OAAO,GAAG,aAAa,GAAG,EAAE;GAC5B,UAAU,QAAQ,SAAS,SAAS,IAAI,QAAQ,IAAI,IAAI,KAAK,CAAC,CAAC;GAC/D,gBACE;GACF,qBAAqB,iDAAiD,aAAa,GAAG;EACxF,CACF;CACF,CAAC;AACH;AAEA,SAAS,6BACP,aACA,aACW;CACX,OAAO,YACJ,QACE,SACC,iBAAiB,KAAK,KAAK,OAAO,KAClC,cAAc,KAAK,KAAK,OAAO,KAC/B,gCAAgC,KAAK,KAAK,OAAO,KACjD,CAAC,+BAA+B,KAAK,KAAK,OAAO,CACrD,CAAC,CACA,KAAK,UAAU;EACd,UAAU;EACV,MAAM;EACN,MAAM;EACN,OAAO;EACP,UAAU,CACR;GACE,UAAU,SAAS,aAAa,KAAK,IAAI;GACzC,MAAM,WAAW,KAAK,SAAS,eAAe;GAC9C,QACE;EACJ,CACF;EACA,gBACE;EACF,qBACE;CACJ,EAAE;AACN;AAEA,SAAS,0BACP,aACA,UACA,aACW;CACX,OAAO,YAAY,SAAS,SAAS;EACnC,MAAM,QAAQ,kBAAkB,KAAK,MAAM,QAAQ;EACnD,MAAM,SACJ,gIAAgI,KAC9H,KAAK,OACP;EACF,MAAM,oBACJ,6CAA6C,KAAK,KAAK,OAAO,KAC9D,0CAA0C,KAAK,KAAK,OAAO;EAC7D,MAAM,gBACJ,wEAAwE,KACtE,KAAK,OACP;EACF,KAAK,CAAC,UAAU,CAAC,sBAAsB,CAAC,eAAe,OAAO,CAAC;EAQ/D,IALE,MAAM,aAAa,IAAI,oBAAoB,KAC3C,MAAM,aAAa,IAAI,sBAAsB,KAC7C,MAAM,aAAa,IAAI,4BAA4B,KACnD,MAAM,aAAa,IAAI,6BAA6B,GAE9B,OAAO,CAAC;EAEhC,OAAO,CACL;GACE,UAAU;GACV,MAAM;GACN,MAAM;GACN,OAAO,GAAG,aAAa,KAAK,EAAE;GAC9B,UAAU,CACR;IACE,UAAU,SAAS,aAAa,KAAK,IAAI;IACzC,MAAM,WACJ,KAAK,SACL,gBAAgB,WAAW,WAC7B;IACA,QAAQ,gBACJ,qEACA;GACN,CACF;GACA,gBACE;GACF,qBAAqB,kCAAkC,aAAa,KAAK;EAC3E,CACF;CACF,CAAC;AACH;AAEA,SAAS,qBACP,aACA,UACA,aACW;CACX,MAAM,oCAAoB,IAAI,IAAgC;CAE9D,KAAK,MAAM,OAAO,UAAU;EAC1B,IAAI,IAAI,aAAa,IAAI,eAAe,GAAG;EAE3C,MAAM,qBAAqB;GAAC;GAAW;GAAW;GAAQ;EAAK,CAAC,CAAC,QAC9D,QAAQ,IAAI,aAAa,IAAI,GAAG,CACnC;EACA,IAAI,mBAAmB,WAAW,GAAG;EAErC,eAAe,mBAAmB,KAAK;GACrC,UAAU,SAAS,aAAa,IAAI,eAAe;GACnD,QAAQ,sCAAsC,mBAAmB,KAAK,IAAI,EAAE;EAC9E,CAAC;CACH;CAEA,KAAK,MAAM,QAAQ,aAAa;EAC9B,MAAM,QAAQ,kBAAkB,KAAK,MAAM,QAAQ;EACnD,IAAI,MAAM,aAAa,IAAI,eAAe,GAAG;EAM7C,IAAI,CAHF,uEAAuE,KACrE,KAAK,OAEJ,GAAc;EAEnB,eAAe,mBAAmB,OAAO;GACvC,UAAU,SAAS,aAAa,KAAK,IAAI;GACzC,MAAM,WAAW,KAAK,SAAS,cAAc;GAC7C,QACE;EACJ,CAAC;CACH;CAEA,OAAO,MAAM,KAAK,kBAAkB,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe;EACzE,UAAU;EACV,MAAM;EACN,MAAM;EACN,OAAO,GAAG,aAAa,KAAK,EAAE;EAC9B;EACA,gBACE;EACF,qBAAqB,SAAS,aAAa,KAAK,EAAE;CACpD,EAAE;AACJ;AAEA,SAAS,eACP,mBACA,KACA,UACM;CACN,MAAM,WAAW,kBAAkB,IAAI,GAAG;CAC1C,IAAI,UAAU;EACZ,SAAS,KAAK,QAAQ;EACtB;CACF;CAEA,kBAAkB,IAAI,KAAK,CAAC,QAAQ,CAAC;AACvC;AAEA,SAAS,qBACP,aACA,UACA,aACW;CACX,OAAO,YAAY,SAAS,SAAS;EACnC,MAAM,QAAQ,kBAAkB,KAAK,MAAM,QAAQ;EACnD,MAAM,aAAa,yCAAyC,KAAK,KAAK,IAAI;EAC1E,MAAM,aACJ,gEAAgE,KAC9D,KAAK,OACP;EACF,IAAI,CAAC,cAAc,CAAC,YAAY,OAAO,CAAC;EAMxC,IAHE,MAAM,aAAa,IAAI,2BAA2B,KAClD,MAAM,aAAa,IAAI,6BAA6B,KACpD,MAAM,aAAa,IAAI,8BAA8B,GAC9B,OAAO,CAAC;EAEjC,OAAO,CACL;GACE,UAAU;GACV,MAAM;GACN,MAAM;GACN,OAAO,GAAG,aAAa,KAAK,EAAE;GAC9B,UAAU,CACR;IACE,UAAU,SAAS,aAAa,KAAK,IAAI;IACzC,MAAM,WAAW,KAAK,SAAS,QAAQ;IACvC,QACE;GACJ,CACF;GACA,gBACE;GACF,qBAAqB,uCAAuC,aAAa,KAAK;EAChF,CACF;CACF,CAAC;AACH;AAEA,SAAS,iBACP,UACA,aACW;CACX,OAAO,SAAS,SAAS,QAAQ;EAS/B,IAAI,EARgB,IAAI,YAAY,MAAM,SACxC,KAAK,KAAK,SAAS,SAAS,CAG5B,KACA,gCAAgC,KAAK,aAAa,GAAG,CAAC,KACtD,IAAI,aAAa,IAAI,QAAQ,KAC7B,IAAI,aAAa,IAAI,MAAM,IACP,OAAO,CAAC;EAC9B,IAAI,IAAI,aAAa,IAAI,4BAA4B,GAAG,OAAO,CAAC;EAEhE,OAAO,CACL;GACE,UAAU;GACV,MAAM;GACN,MAAM;GACN,OAAO,GAAG,aAAa,GAAG,EAAE;GAC5B,UAAU,CACR;IACE,UAAU,SAAS,aAAa,IAAI,eAAe;IACnD,QACE;GACJ,CACF;GACA,gBACE;GACF,qBAAqB,yCAAyC,aAAa,GAAG;EAChF,CACF;CACF,CAAC;AACH;AAEA,SAAS,6BACP,aACA,UACA,aACW;CACX,OAAO,SAAS,SAAS,QAAQ;EAI/B,IAAI,CAHkB,IAAI,YAAY,MAAM,SAC1C,aAAa,KAAK,KAAK,OAAO,CAE3B,GAAe,OAAO,CAAC;EAS5B,IAPE,YAAY,MACT,SACC,KAAK,eAAe,IAAI,aACxB,+BAA+B,KAAK,KAAK,OAAO,CACpD,KACA,mBAAmB,KAAK,IAAI,WAAW,SAAS,eAAe,CAAC,KAChE,mBAAmB,KAAK,IAAI,WAAW,QAAQ,eAAe,CAAC,GAChD,OAAO,CAAC;EAEzB,OAAO,CACL;GACE,UAAU;GACV,MAAM;GACN,MAAM;GACN,OAAO,GAAG,aAAa,GAAG,EAAE;GAC5B,UAAU,CACR;IACE,UAAU,SAAS,aAAa,IAAI,eAAe;IACnD,QACE;GACJ,CACF;GACA,gBACE;GACF,qBAAqB,uCAAuC,aAAa,GAAG;EAC9E,CACF;CACF,CAAC;AACH;AAEA,eAAe,MACb,KACA,QACe;CACf,IAAI;CACJ,IAAI;EACF,UAAU,MAAM,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;CACtD,QAAQ;EACN;CACF;CAEA,KAAK,MAAM,SAAS,SAAS;EAC3B,MAAM,WAAW,KAAK,KAAK,MAAM,IAAI;EACrC,IAAI,MAAM,YAAY,GAAG;GACvB,IAAI,UAAU,IAAI,MAAM,IAAI,GAAG;GAC/B,MAAM,MAAM,UAAU,MAAM;GAC5B;EACF;EACA,IAAI,MAAM,OAAO,GAAG,MAAM,OAAO,UAAU,MAAM,IAAI;CACvD;AACF;AAEA,SAAS,oBACP,aACa;CACb,MAAM,+BAAe,IAAI,IAAY;CACrC,KAAK,MAAM,eAAe,qBAAqB;EAC7C,MAAM,UAAU,YAAY;EAC5B,IAAI,CAAC,WAAS,OAAO,GAAG;EACxB,KAAK,MAAM,kBAAkB,OAAO,KAAK,OAAO,GAC9C,aAAa,IAAI,cAAc;CAEnC;CACA,OAAO;AACT;AAEA,SAAS,eAAe,SAA2B;CACjD,MAAM,0BAAU,IAAI,IAAY;CAMhC,KAAK,MAAM,WAAW;EAJpB;EACA;EACA;CAEoB,GACpB,KAAK,MAAM,SAAS,QAAQ,SAAS,OAAO,GAAG;EAC7C,MAAM,WAAW,uBAAuB,MAAM,EAAE;EAChD,IAAI,UAAU,QAAQ,IAAI,QAAQ;CACpC;CAEF,OAAO,MAAM,KAAK,OAAO;AAC3B;AAEA,SAAS,uBAAuB,OAA+C;CAC7E,IAAI,CAAC,SAAS,MAAM,WAAW,GAAG,KAAK,MAAM,WAAW,GAAG,GACzD,OAAO,KAAA;CACT,IAAI,MAAM,WAAW,GAAG,GAAG;EACzB,MAAM,CAAC,OAAO,QAAQ,MAAM,MAAM,GAAG;EACrC,OAAO,SAAS,OAAO,GAAG,MAAM,GAAG,SAAS;CAC9C;CACA,OAAO,MAAM,MAAM,GAAG,CAAC,CAAC;AAC1B;AAEA,SAAS,kBACP,UACA,UACgB;CAChB,MAAM,aAAa,QAAQ,QAAQ;CAQnC,OAPgB,SACb,QACE,QACC,eAAe,IAAI,aACnB,WAAW,WAAW,GAAG,IAAI,YAAY,KAAK,CAClD,CAAC,CACA,MAAM,MAAM,UAAU,MAAM,UAAU,SAAS,KAAK,UAAU,MAC1D,CAAA,CAAQ,MAAM,SAAS;AAChC;AAEA,SAAS,iBAAiB,KAAuC;CAC/D,MAAM,oCAAoC,MAAM,KAAK,IAAI,YAAY,CAAC,CACnE,QAAQ,eAAe,WAAW,WAAW,4BAA4B,CAAC,CAAC,CAC3E,KAAK;CACR,MAAM,gCAAgC,MAAM,KAAK,IAAI,QAAQ,KAAK,CAAC,CAAC,CAAC,KAAK;CAC1E,MAAM,UAAU,OAAO,IAAI,KAAK,SAAS,WAAW,IAAI,KAAK,OAAO,KAAA;CACpE,OAAO;EACL,MAAM,aAAa,GAAG;EACtB,MAAM,IAAI;EACV,SACE,OAAO,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,UAAU,KAAA;EAC7D,SAAS,OAAO,KAAK,IAAI,OAAO,CAAC,CAAC,KAAK;EACvC;EACA;EACA,kCAAkC,8BAA8B,QAC7D,SAAS,SAAS,WAAW,CAAC,IAAI,aAAa,IAAI,IAAI,CAC1D;EACA,cAAc,IAAI,aAAa,IAAI,eAAe;EAClD,eAAe,IAAI,aAAa,IAAI,4BAA4B;CAClE;AACF;AAEA,SAAS,kBAAkB,UAA+C;CACxE,OAAO,SAAS,QACb,SAAS,YAAY;EACpB,QAAQ,QAAQ,SAAS;EACzB,OAAO;CACT,GACA;EAAE,MAAM;EAAG,QAAQ;EAAG,KAAK;CAAE,CAC/B;AACF;AAEA,SAAS,cACP,UACA,aACW;CACX,MAAM,SAAS,SAAS,MACrB,MAAM,UACL,aAAa,KAAK,QAAQ,IAAI,aAAa,MAAM,QAAQ,KACzD,KAAK,KAAK,cAAc,MAAM,IAAI,KAClC,KAAK,MAAM,cAAc,MAAM,KAAK,CACxC;CACA,OAAO,eAAe,cAAc,IAAI,OAAO,MAAM,GAAG,WAAW,IAAI;AACzE;AAEA,SAAS,aAAa,UAA4B;CAChD,OAAO,aAAa,SAAS,IAAI,aAAa,WAAW,IAAI;AAC/D;AAEA,SAAS,aAAa,KAA6B;CACjD,OAAO,OAAO,IAAI,KAAK,SAAS,WAAW,IAAI,KAAK,OAAO,IAAI;AACjE;AAEA,SAAS,WAAW,SAAiB,QAAoC;CACvE,MAAM,QAAQ,QAAQ,QAAQ,MAAM;CACpC,IAAI,QAAQ,GAAG,OAAO,KAAA;CACtB,OAAO,QAAQ,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;AAC7C;AAEA,SAAS,WAAS,OAAkD;CAClE,OAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AACrE;AAEA,eAAe,WAAW,MAAgC;CACxD,IAAI;EACF,MAAM,OAAO,IAAI;EACjB,OAAO;CACT,QAAQ;EACN,OAAO;CACT;AACF;AAEA,SAAS,mBAAmB,MAAuB;CACjD,OAAO,WAAW,IAAI;AACxB;;;;;;;;ACtpBA,IAAM,QAAQ,QAAQ,IAAI,UAAU;AACpC,IAAM,mBAAmB,+BAA+B;AACxD,IAAM,4BAA4B;AAClC,IAAM,6BAA6B;AACnC,IAAM,wBAAwB;AAC9B,IAAM,2BAA2B;AACjC,IAAM,mCAAmC;CACvC,OAAO;CACP,YAAY;AACd;AAIA,IAAM,4BAA4B;CAChC,OAAO;CACP,YAAY;AACd;AACA,IAAM,wBAAwB;AAC9B,IAAM,2BAA2B;AACjC,IAAM,8BAA8B;AASpC,SAAgB,eAAuB;CACrC,IAAI,OACF,QAAQ,MAAM,IAAI,YAAY,qBAAqB,gBAAgB;CAGrE,MAAM,SAAS,IAAI,OACjB;EACE,MAAM;EACN,SAAS;CACX,GACA;EACE,cAAc;GACZ,SAAS,CAAC;GACV,WAAW,CAAC;GACZ,OAAO,CAAC;EACV;EACA,YAAY;GACV,cAAc;GACd,gBAAgB;GAChB,kBAAkB;GAClB,kBAAkB;EACpB;CACF,CACF;CAGA,OAAO,kBAAkB,cAAc,YAAY;EACjD,IAAI,OACF,QAAQ,MAAM,IAAI,YAAY,oBAAoB;EAEpD,OAAO,EAAE,OAAO,MAAM;CACxB,CAAC;CAED,OAAO,kBAAkB,gBAAgB,YAAY;EACnD,OAAO,EACL,SAAS;GACP;IACE,MAAM;IACN,OAAO;IACP,aACE;GACJ;GACA;IACE,MAAM;IACN,OAAO;IACP,aACE;IACF,WAAW;KACT;MACE,MAAM;MACN,aAAa;MACb,UAAU;KACZ;KACA;MACE,MAAM;MACN,aACE;MACF,UAAU;KACZ;KACA;MACE,MAAM;MACN,aAAa;MACb,UAAU;KACZ;KACA;MACE,MAAM;MACN,aAAa;MACb,UAAU;KACZ;KACA;MACE,MAAM;MACN,aACE;MACF,UAAU;KACZ;KACA;MACE,MAAM;MACN,aAAa;MACb,UAAU;KACZ;IACF;GACF;GACA;IACE,MAAM;IACN,OAAO;IACP,aACE;IACF,WAAW;KACT;MACE,MAAM;MACN,aAAa;MACb,UAAU;KACZ;KACA;MACE,MAAM;MACN,aAAa;MACb,UAAU;KACZ;KACA;MACE,MAAM;MACN,aAAa;MACb,UAAU;KACZ;KACA;MACE,MAAM;MACN,aAAa;MACb,UAAU;KACZ;KACA;MACE,MAAM;MACN,aACE;MACF,UAAU;KACZ;KACA;MACE,MAAM;MACN,aAAa;MACb,UAAU;KACZ;IACF;GACF;EACF,EACF;CACF,CAAC;CAED,OAAO,kBAAkB,eAAe,OAAO,YAAY;EACzD,MAAM,EAAE,SAAS,QAAQ;EACzB,IAAI,SAAA,oBACF,OAAO;GACL,aACE;GACF,UAAU,CACR;IACE,MAAM;IACN,SAAS;KACP,MAAM;KACN,MAAM,yBAAyB,iBAAiB;IAClD;GACF,CACF;EACF;EAGF,IAAI,SAAS,2BAIX,OAAO;GACL,aAAa;GACb,UAAU,CACR;IACE,MAAM;IACN,SAAS;KACP,MAAM;KACN,OAAM,MAVQ,mBACpB,sBAAsB,QAAQ,OAAO,SAAS,CAChD,EAAA,CAQsB,aAAa;IAC7B;GACF,CACF;EACF;EAGF,IAAI,SAAS,4BAIX,OAAO;GACL,aAAa;GACb,UAAU,CACR;IACE,MAAM;IACN,SAAS;KACP,MAAM;KACN,OAAM,MAVQ,yBACpB,4BAA4B,QAAQ,OAAO,SAAS,CACtD,EAAA,CAQsB,aAAa;IAC7B;GACF,CACF;EACF;EAGF,MAAM,IAAI,cACR,kBAAkB,eAClB,mBAAmB,MACrB;CACF,CAAC;CAED,OAAO,kBAAkB,kBAAkB,YAAY;EACrD,MAAM,QAAQ,MAAM,oBAAoB;EACxC,OAAO,EACL,WAAW;GACT;IACE,KAAK;IACL,MAAM;IACN,OAAO;IACP,aACE;IACF,UAAU;GACZ;GACA;IACE,KAAK;IACL,MAAM;IACN,OAAO;IACP,aACE;IACF,UAAU;GACZ;GACA;IACE,KAAK;IACL,MAAM;IACN,OAAO;IACP,aACE;IACF,UAAU;GACZ;GACA,GAAG,MAAM,SAAS,KAAK,SAAS;IAC9B,KAAK,GAAG,2BAA2B,mBAAmB,IAAI,IAAI;IAC9D,MAAM,yBAAyB,IAAI;IACnC,OAAO,0BAA0B,IAAI;IACrC,aACE;IACF,UAAU;GACZ,EAAE;GACF,GAAG,MAAM,SACN,QAAQ,QAAQ,IAAI,SAAS,KAAK,CAAC,CACnC,SAAS,QAAQ,CAChB;IACE,KAAK,GAAG,2BAA2B,mBAAmB,IAAI,IAAI;IAC9D,MAAM,kBAAkB,IAAI;IAC5B,OAAO,2BAA2B,IAAI;IACtC,aACE;IACF,UAAU;GACZ,GACA;IACE,KAAK,GAAG,2BAA2B,mBAAmB,IAAI,IAAI,IAAI;IAClE,MAAM,6BAA6B,IAAI;IACvC,OAAO,4BAA4B,IAAI;IACvC,aACE;IACF,UAAU;GACZ,CACF,CAAC;EACL,EACF;CACF,CAAC;CAED,OAAO,kBAAkB,kBAAkB,OAAO,YAAY;EAC5D,MAAM,EAAE,QAAQ,QAAQ;EACxB,IAAI,QAAQ,kBACV,OAAO,EACL,UAAU,CACR;GACE;GACA,UAAU;GACV,MAAM,yBAAyB,iBAAiB;EAClD,CACF,EACF;EAGF,IAAI,QAAQ,uBAAuB;GACjC,MAAM,QAAQ,MAAM,oBAAoB;GACxC,OAAO,EACL,UAAU,CACR;IACE;IACA,UAAU;IACV,MAAM,KAAK,UAAU,uBAAuB,KAAK,GAAG,MAAM,CAAC;GAC7D,CACF,EACF;EACF;EAEA,IAAI,QAAQ,uBAAuB;GACjC,MAAM,QAAQ,MAAM,oBAAoB;GACxC,OAAO,EACL,UAAU,CACR;IACE;IACA,UAAU;IACV,MAAM,KAAK,UACT;KACE,SAAS,uBAAuB,KAAK;KACrC,oBAAoB,MAAM,SACvB,QAAQ,QAAQ,IAAI,SAAS,KAAK,CAAC,CACnC,KAAK,SAAS;MACb,aAAa,IAAI;MACjB,YAAY,GAAG,2BAA2B,mBAAmB,IAAI,IAAI;MACrE,eAAe,GAAG,2BAA2B,mBAAmB,IAAI,IAAI,IAAI;KAC9E,EAAE;IACN,GACA,MACA,CACF;GACF,CACF,EACF;EACF;EAEA,IACE,IAAI,WAAW,wBAAwB,KACvC,IAAI,SAAS,2BAA2B,GACxC;GAOA,MAAM,aAAa,MAAM,8BAA8B,EACrD,SAPkB,mBAClB,IAAI,MACF,IACA,GACF,CAGS,EACX,CAAC;GACD,OAAO,EACL,UAAU,CACR;IACE;IACA,UAAU;IACV,MAAM,KAAK,UACT,0BAA0B,UAAU,GACpC,MACA,CACF;GACF,CACF,EACF;EACF;EAEA,IAAI,IAAI,WAAW,wBAAwB,GAAG;GAC5C,MAAM,cAAc,mBAClB,IAAI,MAAM,EAA+B,CAC3C;GAEA,MAAM,OAAM,MADQ,oBAAoB,EAAA,CACtB,SAAS,MAAM,SAAS,KAAK,SAAS,WAAW;GACnE,IAAI,CAAC,KACH,MAAM,IAAI,cACR,kBAAkB,eAClB,8BAA8B,aAChC;GAEF,OAAO,EACL,UAAU,CACR;IACE;IACA,UAAU;IACV,MAAM,KAAK,UACT;KACE,SAAS,yBAAyB,GAAG;KACrC,eAAe,GAAG,2BAA2B,mBAAmB,IAAI,IAAI,IAAI;IAC9E,GACA,MACA,CACF;GACF,CACF,EACF;EACF;EAEA,IAAI,IAAI,WAAW,wBAAwB,GAAG;GAC5C,MAAM,cAAc,mBAClB,IAAI,MAAM,EAA+B,CAC3C;GAEA,MAAM,OAAM,MADQ,oBAAoB,EAAA,CACtB,SAAS,MAAM,SAAS,KAAK,SAAS,WAAW;GACnE,IAAI,CAAC,KACH,MAAM,IAAI,cACR,kBAAkB,eAClB,8BAA8B,aAChC;GAEF,OAAO,EACL,UAAU,CACR;IACE;IACA,UAAU;IACV,MAAM,KAAK,UAAU,yBAAyB,GAAG,GAAG,MAAM,CAAC;GAC7D,CACF,EACF;EACF;EAEA,MAAM,IAAI,cACR,kBAAkB,eAClB,qBAAqB,KACvB;CACF,CAAC;CAGD,OAAO,kBAAkB,cAAc,OAAO,YAAY;EACxD,MAAM,EAAE,MAAM,WAAW,SAAS,QAAQ;EAE1C,IAAI,OAAO;GACT,QAAQ,MAAM,IAAI,YAAY,cAAc,MAAM;GAClD,QAAQ,MACN,IAAI,YAAY,eAChB,KAAK,UAAU,qBAAqB,IAAI,GAAG,MAAM,CAAC,CACpD;EACF;EAEA,IAAI;GACF,IAAI;GAEJ,QAAQ,MAAR;IACE,KAAK;KACH,SAAS,MAAM,kBACb,IACF;KACA;IAEF,KAAK;KACH,SAAS,MAAM,kBACb,IACF;KACA;IAEF,KAAK;KACH,SAAS,MAAM,kBACb,IACF;KACA;IAEF,KAAK,qBAAqB;KACxB,MAAM,QAAQ,MAAM,oBAClB,IACF;KACA,MAAM,YAAY,MAAM,iCACtB,OACA,IAGF;KACA,SAAS,KAAK,UACZ;MACE,SAAS,MAAM;MACf,cAAc,MAAM,SAAS;MAC7B,kBAAkB,MAAM,aAAa;MACrC,iBAAiB,MAAM,YAAY;MACnC,iBAAiB,MAAM;MACvB,UAAU,MAAM;MAChB,aAAa,MAAM;MACnB;KACF,GACA,MACA,CACF;KACA;IACF;IAEA,KAAK,4BAA4B;KAC/B,MAAM,QAAQ,MAAM,oBAClB,IACF;KACA,MAAM,YAAY,MAAM,iCACtB,OACA,IAGF;KACA,SAAS,KAAK,UACZ;MACE,SAAS,MAAM;MACf,cAAc,MAAM,SAAS;MAC7B,kBAAkB,MAAM,aAAa;MACrC,iBAAiB,MAAM,YAAY;MACnC,6BAA6B,MAAM,SAAS,QACzC,QAAQ,IAAI,kBACf,CAAC,CAAC;MACF,gCAAgC,MAAM,SACnC,QACE,QACC,IAAI,WAAW,SAAS,uBAAuB,KAC/C,CAAC,IAAI,kBACT,CAAC,CACA,KAAK,QAAQ,IAAI,IAAI;MACxB,iBAAiB,MAAM;MACvB,UAAU,MAAM;MAChB,aAAa,MAAM;MACnB;KACF,GACA,MACA,CACF;KACA;IACF;IAEA,KAAK;KACH,SAAS,KAAK,UACZ,MAAM,wBACJ,IACF,GACA,MACA,CACF;KACA;IAEF,KAAK;KACH,SAAS,KAAK,UACZ,MAAM,wBACJ,IACF,GACA,MACA,CACF;KACA;IAEF,KAAK;IACL,KAAK;KACH,SAAS,KAAK,UACZ,qBACE,MAAM,mBACJ,IACF,GACA,UAAU,IAAI,CAChB,GACA,MACA,CACF;KACA;IAEF,KAAK;KACH,SAAS,KAAK,UACZ,qBACE,MAAM,WACJ,IACF,GACA,UAAU,IAAI,CAChB,GACA,MACA,CACF;KACA;IAEF,KAAK;KACH,SAAS,KAAK,UACZ,0BACE,MAAM,8BACJ,IAGF,CACF,GACA,MACA,CACF;KACA;IAEF,KAAK;IACL,KAAK;KACH,SAAS,KAAK,UACZ,qBACE,MAAM,yBACJ,IAGF,GACA,UAAU,IAAI,CAChB,GACA,MACA,CACF;KACA;IAEF,KAAK;KACH,SAAS,KAAK,UACZ,qBACE,MAAM,iBACJ,IACF,GACA,UAAU,IAAI,CAChB,GACA,MACA,CACF;KACA;IAEF,KAAK;KACH,SAAS,KAAK,UAAU,EAAE,QAAQ,gBAAgB,EAAE,GAAG,MAAM,CAAC;KAC9D;IAEF,KAAK;KACH,SAAS,KAAK,UACZ,MAAM,cACJ,IACF,GACA,MACA,CACF;KACA;IAEF,KAAK;KACH,SAAS,KAAK,UACZ,MAAM,uBACJ,IACF,GACA,MACA,CACF;KACA;IAEF,KAAK;KACH,SAAS,KAAK,UACZ,MAAM,iBACJ,IACF,GACA,MACA,CACF;KACA;IAEF,KAAK;KACH,SAAS,KAAK,UACZ,MAAM,sBACJ,IACF,GACA,MACA,CACF;KACA;IAEF,KAAK;KACH,SAAS,KAAK,UACZ,MAAM,sBACJ,IACF,GACA,MACA,CACF;KACA;IAEF,KAAK;KACH,SAAS,KAAK,UACZ,MAAM,qBACJ,IACF,GACA,MACA,CACF;KACA;IAEF,KAAK;KACH,SAAS,KAAK,UACZ,MAAM,qBACJ,IACF,GACA,MACA,CACF;KACA;IAEF,KAAK;KACH,SAAS,KAAK,UACZ,MAAM,gBACJ,IACF,GACA,MACA,CACF;KACA;IAEF,KAAK;KACH,SAAS,KAAK,UACZ,MAAM,cACJ,IACF,GACA,MACA,CACF;KACA;IAEF,KAAK;KACH,SAAS,KAAK,UACZ,MAAM,kBACJ,IACF,GACA,MACA,CACF;KACA;IAEF,SACE,MAAM,IAAI,MAAM,iBAAiB,MAAM;GAC3C;GAEA,OAAO;IACL,SAAS,CACP;KACE,MAAM;KACN,MAAM;IACR,CACF;IACA,mBAAmB,2BAA2B,MAAM;GACtD;EACF,SAAS,OAAO;GACd,MAAM,eACJ,iBAAiB,QAAQ,MAAM,UAAU;GAC3C,QAAQ,MAAM,IAAI,YAAY,WAAW,KAAK;GAE9C,OAAO;IACL,SAAS,CACP;KACE,MAAM;KACN,MAAM,wBAAwB,KAAK,IAAI;IACzC,CACF;IACA,SAAS;IACT,mBAAmB;KACjB,IAAI;KACJ,UAAU;KACV,aAAa,CAAC;MAAE,UAAU;MAAS,SAAS;KAAa,CAAC;KAC1D,MAAM;IACR;GACF;EACF;CACF,CAAC;CAED,OAAO;AACT;AAEA,eAAe,OAAO;CACpB,MAAM,SAAS,iBAAiB,aAAa,GAAG,EAC9C,UAAU,UACR,QAAQ,MAAM,IAAI,YAAY,oBAAoB,KAAK,EAC3D,CAAC;CAED,IAAI,OACF,QAAQ,MAAM,IAAI,YAAY,6BAA6B;CAI7D,QAAQ,GAAG,UAAU,YAAY;EAC/B,IAAI,OACF,QAAQ,MAAM,IAAI,YAAY,mBAAmB;EAEnD,MAAM,OAAO,MAAM;EACnB,QAAQ,KAAK,CAAC;CAChB,CAAC;CAED,QAAQ,GAAG,WAAW,YAAY;EAChC,IAAI,OACF,QAAQ,MAAM,IAAI,YAAY,mBAAmB;EAEnD,MAAM,OAAO,MAAM;EACnB,QAAQ,KAAK,CAAC;CAChB,CAAC;AACH;AAEA,SAAS,eAAwB;CAC/B,MAAM,QAAQ,QAAQ,KAAK;CAC3B,IAAI,CAAC,OAAO,OAAO;CACnB,IAAI;EACF,OAAO,aAAa,cAAc,OAAO,KAAK,GAAG,CAAC,MAAM,aAAa,KAAK;CAC5E,QAAQ;EACN,OAAO,OAAO,KAAK,QAAQ,cAAc,KAAK,CAAC,CAAC;CAClD;AACF;AAEA,SAAS,yBAAyB,MAAsB;CACtD,MAAM,QAAQ,cAAc;EAAE;EAAM,mBAAmB;CAAK,CAAC;CAC7D,MAAM,aAAa,MAAM,eAAe,KACrC,SAAS,iBAAiB,KAAK,KAAK,MAAM,KAAK,QAAQ,KAAK,GAC/D;CACA,OAAO,CAAC,MAAM,cAAc,KAAK,GAAG,GAAG,UAAU,CAAC,CAAC,KAAK,MAAM;AAChE;AAEA,SAAS,sBAAsB,MAAgD;CAC7E,OAAO,cAAc;EACnB,SAAS,MAAM;EACf,cAAc,gBAAgB,MAAM,YAAY;EAChD,OAAO,MAAM;EACb,eAAe,MAAM;EACrB,OAAO,MAAM;EACb,SAAS,MAAM;CACjB,CAAC;AACH;AAEA,SAAS,4BACP,MACyB;CACzB,OAAO,cAAc;EACnB,SAAS,MAAM;EACf,MAAM,MAAM;EACZ,eAAe,MAAM;EACrB,OAAO,MAAM;EACb,OAAO,MAAM;EACb,SAAS,MAAM;CACjB,CAAC;AACH;AAEA,SAAS,gBAAgB,OAAiD;CACxE,IAAI,CAAC,OAAO,KAAK,GAAG,OAAO,KAAA;CAE3B,IAAI;EACF,MAAM,SAAS,KAAK,MAAM,KAAK;EAC/B,IAAI,MAAM,QAAQ,MAAM,GACtB,OAAO,OAAO,QAAQ,SAAyB,OAAO,SAAS,QAAQ;CAE3E,QAAQ,CAER;CAEA,OAAO,MACJ,MAAM,OAAO,CAAC,CACd,KAAK,SAAS,KAAK,KAAK,CAAC,CAAC,CAC1B,OAAO,OAAO;AACnB;AAEA,SAAS,cACP,OACyB;CACzB,OAAO,OAAO,YACZ,OAAO,QAAQ,KAAK,CAAC,CAAC,QAAQ,GAAG,WAAW,UAAU,KAAA,CAAS,CACjE;AACF;AAEA,SAAS,uBAAuB,OAA6B;CAC3D,MAAM,WAAW,MAAM,SAAS,KAAK,QAAQ,yBAAyB,GAAG,CAAC;CAC1E,OAAO;EACL,GAAG;EACH,SAAS;EACT;EACA,cAAc,SAAS,QAAQ,QAAQ,IAAI,SAAS,MAAM;EAC1D,aAAa,SAAS,QAAQ,QAAQ,IAAI,SAAS,KAAK;EAIxD,mBAAmB,SAAS,QAAQ,QAAQ,IAAI,qBAAqB;CACvE;AACF;AAEA,SAAS,UAAU,MAAmC;CACpD,MAAM,SAAU,MAA8C;CAC9D,OAAO,OAAO,WAAW,WAAW,SAAS,KAAA;AAC/C;;;;;AAMA,SAAS,qBAAqB,MAAwB;CACpD,IAAI,CAAC,SAAS,IAAI,KAAK,OAAO,KAAK,UAAU,UAAU,OAAO;CAC9D,OAAO;EAAE,GAAG;EAAM,OAAO,uBAAuB,KAAK,KAAK;CAAE;AAC9D;AAEA,SAAS,kBAAkB,OAKzB;CACA,OACE,SAAS,KAAK,KACd,OAAO,MAAM,OAAO,aACpB,cAAc,SACd,MAAM,QAAQ,MAAM,WAAW,KAC/B,UAAU;AAEd;AAEA,SAAS,2BAA2B,QAAgB;CAClD,IAAI,OAAgB;CACpB,IAAI;EACF,OAAO,KAAK,MAAM,MAAM;CAC1B,QAAQ,CAER;CAKA,IAAI,kBAAkB,IAAI,GACxB,OAAO;CAGT,MAAM,SAAS,SAAS,IAAI,IAAI,OAAO,KAAA;CAKvC,OAAO;EAAE,IAAI;EAAM,UAJF,SAAS,QAAQ,QAAQ,IAAI,OAAO,WAAW;EAInC,aAHT,MAAM,QAAQ,QAAQ,WAAW,IACjD,OAAO,YAAY,OAAO,QAAQ,IAClC,CAAC;EACqC;CAAK;AACjD;AAEA,SAAS,SAAS,OAAkD;CAClE,OAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AACrE;AAEA,SAAS,yBAAyB,KAA6B;CAC7D,MAAM,EAAE,WAAW,YAAY,SAAS,oBAAoB,GAAG,SAAS;CACxE,OAAO;EACL,GAAG;EAGH,oBAAoB,mBAAmB,KACpC,SAAS,aAAa,IAAI,KAAK,IAClC;EACA,SAAS,QAAQ,KAAK,YAAY;GAChC,GAAG;GACH,UAAU,aAAa,OAAO,QAAQ;EACxC,EAAE;CACJ;AACF;AAEA,SAAS,0BAA0B,YAAqC;CACtE,OAAO;EACL,iBAAiB,yBAAyB,WAAW,eAAe;EACpE,qBAAqB,WAAW,oBAAoB,KAAK,QACvD,yBAAyB,GAAG,CAC9B;EACA,cAAc;GACZ,GAAG,WAAW;GACd,iBAAiB,WAAW,aAAa,gBAAgB,QACvD,wBACA,kBACF;GACA,aAAa,cAAc,WAAW,aAAa,WAAW;EAChE;EACA,aAAa,cAAc,WAAW,WAAW;CACnD;AACF;AAEA,SAAS,cAAc,OAA2B;CAChD,OAAO,MACJ,IAAI,YAAY,CAAC,CACjB,QAAQ,SAAyB,OAAO,SAAS,QAAQ;AAC9D;AAEA,SAAS,aAAa,MAA8C;CAClE,IAAI,CAAC,MAAM,OAAO;CAClB,IAAI,KAAK,WAAW,GAAG,KAAK,kBAAkB,KAAK,IAAI,GACrD,OAAO;CAET,OAAO;AACT;;;;;;AAOA,SAAgB,iBAAiB,MAI/B;CACA,MAAM,SAAiE,EACrE,MAAM,MACR;CACA,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;EACnD,MAAM,MAAM,KAAK;EACjB,IAAI,QAAQ,UAAU,OAAO,OAAO;OAC/B,IAAI,QAAQ,UAAU;GACzB,MAAM,QAAQ,OAAO,SAAS,KAAK,QAAQ,MAAM,IAAI,EAAE;GACvD,IAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,QAAQ,OACnD,MAAM,IAAI,MAAM,gDAAgD;GAElE,OAAO,OAAO;GACd,SAAS;EACX,OAAO,IAAI,QAAQ,aAAa;GAC9B,MAAM,QAAQ,KAAK,QAAQ;GAC3B,IAAI,CAAC,OAAO,MAAM,IAAI,MAAM,gCAAgC;GAC5D,OAAO,cAAc;GACrB,SAAS;EACX;CACF;CACA,OAAO;AACT;AAEA,eAAe,SAAS,KAA0C;CAChE,MAAM,OAAO,MAAM,qBAAqB;EACtC,MAAM,IAAI;EACV,aAAa,IAAI;CACnB,CAAC;CAGD,MAAM,SAAS,CAAC,QAAQ,IAAI,oBAAoB,KAAK;CACrD,QAAQ,MACN,IAAI,YAAY,mCAAmC,KAAK,IAAI,IAAI,KAAK,KAAK,YAAY,mBAAmB,KAAK,KAAK,UAAU,OAAO,YACtI;CACA,IAAI,QACF,QAAQ,MAAM,IAAI,YAAY,kBAAkB,KAAK,OAAO;CAE9D,MAAM,WAAW,YAAY;EAC3B,MAAM,KAAK,MAAM;EACjB,QAAQ,KAAK,CAAC;CAChB;CACA,QAAQ,GAAG,UAAU,QAAQ;CAC7B,QAAQ,GAAG,WAAW,QAAQ;AAChC;AAEA,IAAI,aAAa,GAAG;CAClB,MAAM,MAAM,iBAAiB,QAAQ,KAAK,MAAM,CAAC,CAAC;CAClD,CAAC,IAAI,OAAO,SAAS,GAAG,IAAI,KAAK,EAAA,CAAG,OAAO,UAAU;EACnD,QAAQ,MAAM,IAAI,YAAY,iBAAiB,KAAK;EACpD,QAAQ,KAAK,CAAC;CAChB,CAAC;AACH"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/agent-skills.ts","../src/tools/generate-smrt-class.ts","../src/tools/introspect-project.ts","../src/tools/review-smrt-project.ts","../src/index.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport interface AgentSkillSummary {\n name: string;\n description: string;\n path: string;\n references: string[];\n}\n\nexport interface AgentSkillBundle extends AgentSkillSummary {\n skillMarkdown: string;\n referenceFiles: Array<{\n path: string;\n content: string;\n }>;\n}\n\ninterface AgentSkillDefinition extends AgentSkillSummary {\n skillFile: string;\n}\n\nconst AGENT_SKILLS: AgentSkillDefinition[] = [\n {\n name: 'smrt-code-review',\n description:\n 'Harness-agnostic downstream SMRT code review workflow using smrt-dev-mcp deterministic context and prompt bundles.',\n path: 'skills/smrt-code-review/SKILL.md',\n skillFile: 'skills/smrt-code-review/SKILL.md',\n references: ['skills/smrt-code-review/references/review-output.md'],\n },\n];\n\nexport function listAgentSkills(): AgentSkillSummary[] {\n return AGENT_SKILLS.map(({ skillFile: _skillFile, ...skill }) => skill);\n}\n\nexport function getAgentSkill(options: {\n name: string;\n includeReferences?: boolean;\n}): AgentSkillBundle {\n const skill = AGENT_SKILLS.find((item) => item.name === options.name);\n if (!skill) {\n throw new Error(`Unknown agent skill: ${options.name}`);\n }\n\n return {\n name: skill.name,\n description: skill.description,\n path: skill.path,\n references: skill.references,\n skillMarkdown: readPackageFile(skill.skillFile),\n referenceFiles:\n options.includeReferences === false\n ? []\n : skill.references.map((path) => ({\n path,\n content: readPackageFile(path),\n })),\n };\n}\n\nfunction readPackageFile(relativePath: string): string {\n const packageRoot = resolvePackageRoot();\n return readFileSync(join(packageRoot, relativePath), 'utf8');\n}\n\nfunction resolvePackageRoot(): string {\n // Works in both source tests (`src/agent-skills.ts`) and built packages\n // (`dist/agent-skills.js`); guard it so packaging layout drift fails clearly.\n const packageRoot = dirname(dirname(fileURLToPath(import.meta.url)));\n if (!existsSync(join(packageRoot, 'package.json'))) {\n throw new Error(\n `Unable to resolve smrt-dev-mcp package root from ${import.meta.url}`,\n );\n }\n return packageRoot;\n}\n","/**\n * Generate SMRT Class Tool\n * Creates a package-ready SMRT class using current object-package patterns.\n */\n\ntype PropertyType =\n | 'text'\n | 'integer'\n | 'decimal'\n | 'boolean'\n | 'datetime'\n | 'json';\ntype BaseClass = 'SmrtObject' | 'SmrtCollection';\ntype TemplateVariant =\n | 'basic'\n | 'global-catalog'\n | 'optional-catalog'\n | 'tenant-project-object'\n | 'tenant-event-log-object'\n | 'cross-package-reference';\ntype RelationshipType =\n | 'foreignKey'\n | 'crossPackageRef'\n | 'oneToMany'\n | 'manyToMany';\n\ninterface PropertyDefinition {\n name: string;\n type: PropertyType;\n required?: boolean;\n nullable?: boolean;\n description?: string;\n defaultValue?: unknown;\n}\n\ninterface RelationshipDefinition {\n name: string;\n type: RelationshipType;\n related: string;\n required?: boolean;\n nullable?: boolean;\n description?: string;\n validate?: boolean;\n foreignKey?: string;\n through?: string;\n sourceKey?: string;\n targetKey?: string;\n}\n\ninterface TenantScopedDefinition {\n mode?: 'required' | 'optional';\n field?: string;\n autoFilter?: boolean;\n autoPopulate?: boolean;\n allowSuperAdminBypass?: boolean;\n}\n\ninterface GenerateSmrtClassArgs {\n className: string;\n properties: PropertyDefinition[];\n baseClass?: BaseClass;\n template?: TemplateVariant;\n tableName?: string;\n conflictColumns?: string[];\n tenantScoped?: boolean | TenantScopedDefinition;\n includeTenantIdField?: boolean;\n relationships?: RelationshipDefinition[];\n includeApiConfig?: boolean;\n includeMcpConfig?: boolean;\n includeCliConfig?: boolean;\n includeCompanionSnippets?: boolean;\n}\n\ninterface NormalizedGenerateSmrtClassArgs {\n className: string;\n properties: PropertyDefinition[];\n baseClass: BaseClass;\n template: TemplateVariant;\n tableName?: string;\n conflictColumns: string[];\n tenantScoped?: TenantScopedDefinition;\n includeTenantIdField: boolean;\n relationships: RelationshipDefinition[];\n includeApiConfig: boolean;\n includeMcpConfig: boolean;\n includeCliConfig: boolean;\n includeCompanionSnippets: boolean;\n}\n\nconst TYPE_MAPPING: Record<\n PropertyType,\n { tsType: string; defaultValue: string }\n> = {\n text: { tsType: 'string', defaultValue: \"''\" },\n integer: { tsType: 'number', defaultValue: '0' },\n decimal: { tsType: 'number', defaultValue: '0.0' },\n boolean: { tsType: 'boolean', defaultValue: 'false' },\n datetime: { tsType: 'Date', defaultValue: 'new Date()' },\n json: { tsType: 'any', defaultValue: '{}' },\n};\n\nexport async function generateSmrtClass(\n args: GenerateSmrtClassArgs,\n): Promise<string> {\n const normalized = normalizeArgs(args);\n const {\n className,\n properties,\n relationships,\n baseClass,\n tableName,\n conflictColumns,\n tenantScoped,\n includeTenantIdField,\n includeApiConfig,\n includeMcpConfig,\n includeCliConfig,\n includeCompanionSnippets,\n } = normalized;\n\n const coreImports = new Set<string>([baseClass, 'smrt']);\n if (needsFieldDecorator(properties)) coreImports.add('field');\n for (const relationship of relationships) {\n coreImports.add(relationship.type);\n }\n\n const imports = [\n `import { ${Array.from(coreImports).join(', ')} } from '@happyvertical/smrt-core';`,\n ];\n\n if (tenantScoped) {\n const tenancyImports = ['TenantScoped'];\n if (includeTenantIdField) tenancyImports.push('tenantId');\n imports.push(\n `import { ${tenancyImports.join(', ')} } from '@happyvertical/smrt-tenancy';`,\n );\n }\n\n const decoratorLines = [\n ...(tenantScoped\n ? [`@TenantScoped(${renderObjectLiteral({ ...tenantScoped })})`]\n : []),\n renderSmrtDecorator({\n includeApiConfig,\n includeMcpConfig,\n includeCliConfig,\n tableName,\n conflictColumns,\n }),\n ];\n\n const classMembers = [\n ...(includeTenantIdField && tenantScoped\n ? [renderTenantIdField(tenantScoped)]\n : []),\n ...properties.map(renderProperty),\n ...relationships.map(renderRelationship),\n ].filter(Boolean);\n\n const companionSnippets = includeCompanionSnippets\n ? `\\n${renderCompanionSnippets(className, Boolean(tenantScoped))}`\n : '';\n\n return `${imports.join('\\n')}\n\n${decoratorLines.join('\\n')}\nexport class ${className} extends ${baseClass} {\n${classMembers.join('\\n\\n')}\n\n constructor(options: any = {}) {\n super(options);\n Object.assign(this, options);\n }\n}\n${companionSnippets}`;\n}\n\nfunction normalizeArgs(\n args: GenerateSmrtClassArgs,\n): NormalizedGenerateSmrtClassArgs {\n const template = args.template ?? 'basic';\n const templateDefaults = defaultsForTemplate(template);\n const tenantScoped =\n args.tenantScoped === true\n ? (templateDefaults.tenantScoped ?? { mode: 'required' as const })\n : args.tenantScoped === false\n ? undefined\n : (args.tenantScoped ?? templateDefaults.tenantScoped);\n\n return {\n className: args.className,\n properties: args.properties,\n baseClass: args.baseClass ?? 'SmrtObject',\n template,\n tableName: args.tableName ?? templateDefaults.tableName,\n conflictColumns:\n args.conflictColumns ?? templateDefaults.conflictColumns ?? [],\n tenantScoped: normalizeTenantScoped(tenantScoped),\n includeTenantIdField:\n args.includeTenantIdField ??\n templateDefaults.includeTenantIdField ??\n Boolean(tenantScoped),\n relationships: args.relationships ?? [],\n includeApiConfig: args.includeApiConfig ?? true,\n includeMcpConfig: args.includeMcpConfig ?? true,\n includeCliConfig: args.includeCliConfig ?? true,\n includeCompanionSnippets: args.includeCompanionSnippets ?? false,\n };\n}\n\nfunction defaultsForTemplate(template: TemplateVariant): {\n tableName?: string;\n conflictColumns?: string[];\n tenantScoped?: TenantScopedDefinition;\n includeTenantIdField?: boolean;\n} {\n switch (template) {\n case 'optional-catalog':\n return {\n tenantScoped: { mode: 'optional' },\n includeTenantIdField: true,\n conflictColumns: ['tenant_id', 'slug'],\n };\n case 'tenant-project-object':\n return {\n tenantScoped: { mode: 'required' },\n includeTenantIdField: true,\n };\n case 'tenant-event-log-object':\n return {\n tenantScoped: { mode: 'optional' },\n includeTenantIdField: true,\n };\n case 'global-catalog':\n return { conflictColumns: ['slug'] };\n case 'cross-package-reference':\n case 'basic':\n return {};\n }\n}\n\nfunction normalizeTenantScoped(\n value: boolean | TenantScopedDefinition | undefined,\n): TenantScopedDefinition | undefined {\n if (!value) return undefined;\n return {\n mode: typeof value === 'object' ? (value.mode ?? 'required') : 'required',\n field: typeof value === 'object' ? (value.field ?? 'tenantId') : 'tenantId',\n autoFilter: typeof value === 'object' ? value.autoFilter : undefined,\n autoPopulate: typeof value === 'object' ? value.autoPopulate : undefined,\n allowSuperAdminBypass:\n typeof value === 'object' ? value.allowSuperAdminBypass : undefined,\n };\n}\n\nfunction renderSmrtDecorator(options: {\n includeApiConfig: boolean;\n includeMcpConfig: boolean;\n includeCliConfig: boolean;\n tableName?: string;\n conflictColumns: string[];\n}): string {\n const decoratorConfig: Record<string, unknown> = {};\n\n if (options.tableName) {\n decoratorConfig.tableName = options.tableName;\n }\n\n if (options.conflictColumns.length > 0) {\n decoratorConfig.conflictColumns = options.conflictColumns;\n }\n\n if (options.includeApiConfig) {\n decoratorConfig.api = {\n include: ['list', 'get', 'create', 'update'],\n exclude: ['delete'],\n };\n }\n\n if (options.includeMcpConfig) {\n decoratorConfig.mcp = {\n include: ['list', 'get'],\n };\n }\n\n if (options.includeCliConfig) {\n decoratorConfig.cli = true;\n }\n\n return Object.keys(decoratorConfig).length > 0\n ? `@smrt(${JSON.stringify(decoratorConfig, null, 2)})`\n : '@smrt()';\n}\n\nfunction renderTenantIdField(tenantScoped: TenantScopedDefinition): string {\n const nullable = tenantScoped.mode === 'optional';\n const field = tenantScoped.field ?? 'tenantId';\n return nullable\n ? ` @tenantId({ nullable: true })\\n ${field}: string | null = null;`\n : ` @tenantId()\\n ${field}: string = '';`;\n}\n\nfunction renderProperty(prop: PropertyDefinition): string {\n const mapping = TYPE_MAPPING[prop.type];\n const nullable = prop.nullable === true;\n const tsType = nullable ? `${mapping.tsType} | null` : mapping.tsType;\n const defaultValue =\n prop.defaultValue !== undefined\n ? renderLiteral(prop.defaultValue)\n : nullable\n ? 'null'\n : mapping.defaultValue;\n const fieldOptions = compactObject({\n required: prop.required,\n nullable: prop.nullable,\n description: prop.description,\n });\n const jsdoc = prop.description ? ` /** ${prop.description} */\\n` : '';\n const decorator =\n Object.keys(fieldOptions).length > 0\n ? ` @field(${JSON.stringify(fieldOptions)})\\n`\n : '';\n\n return `${jsdoc}${decorator} ${prop.name}: ${tsType} = ${defaultValue};`;\n}\n\nfunction renderRelationship(relationship: RelationshipDefinition): string {\n const options = compactObject({\n required: relationship.required,\n nullable: relationship.nullable,\n description: relationship.description,\n validate: relationship.validate,\n foreignKey: relationship.foreignKey,\n through: relationship.through,\n sourceKey: relationship.sourceKey,\n targetKey: relationship.targetKey,\n });\n const args = [\n renderLiteral(relationship.related),\n ...(Object.keys(options).length > 0 ? [JSON.stringify(options)] : []),\n ];\n const decorator = `@${relationship.type}(${args.join(', ')})`;\n const fieldType =\n relationship.type === 'oneToMany' || relationship.type === 'manyToMany'\n ? 'unknown[]'\n : relationship.nullable\n ? 'string | null'\n : 'string';\n const defaultValue =\n relationship.type === 'oneToMany' || relationship.type === 'manyToMany'\n ? '[]'\n : relationship.nullable\n ? 'null'\n : \"''\";\n\n return ` ${decorator}\\n ${relationship.name}: ${fieldType} = ${defaultValue};`;\n}\n\nfunction needsFieldDecorator(properties: PropertyDefinition[]): boolean {\n return properties.some(\n (property) =>\n property.required !== undefined ||\n property.nullable !== undefined ||\n property.description !== undefined,\n );\n}\n\nfunction renderCompanionSnippets(\n className: string,\n usesTenantScoped: boolean,\n): string {\n const dependencyNote = usesTenantScoped\n ? `\\n * - Ensure package.json declares \"@happyvertical/smrt-tenancy\".`\n : '';\n return `/*\n * Package wiring:\n * - Export ${className} from the package entrypoint used by consumers.\n * - Import this module from any package registration file that eagerly loads objects.${dependencyNote}\n */`;\n}\n\nfunction renderObjectLiteral(value: Record<string, unknown>): string {\n return JSON.stringify(compactObject(value), null, 2);\n}\n\nfunction renderLiteral(value: unknown): string {\n if (typeof value === 'string') return JSON.stringify(value);\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n if (value === null) return 'null';\n return JSON.stringify(value, null, 2);\n}\n\nfunction compactObject<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n ) as T;\n}\n","/**\n * Project Introspection Tool\n * Returns a manifest-equivalent inventory of SMRT objects in a project.\n */\n\nimport type { Dirent } from 'node:fs';\nimport { access, readdir, readFile } from 'node:fs/promises';\nimport { isAbsolute, join, relative, resolve } from 'node:path';\nimport {\n ManifestGenerator,\n type SmartObjectManifest,\n} from '@happyvertical/smrt-core/scanner';\nimport type { ScanError } from '@happyvertical/smrt-scanner';\nimport { ManifestAdapter, OxcScanner } from '@happyvertical/smrt-scanner';\n\n/**\n * `summary` (default) returns one compact record per object; `full` returns the\n * verbose shape. A 42-object project produced 338,462 characters in the only\n * mode that used to exist, which put every call over tool-result budgets and\n * forced callers to write-to-file and `jq` (#2143).\n */\nexport type IntrospectDetail = 'summary' | 'full';\n\n/** Common shape both detail modes emit, so the two branches share a list. */\ntype IntrospectedObject = Record<string, unknown> & { className: string };\n\ninterface IntrospectProjectArgs {\n directory?: string;\n manifestPath?: string;\n includeFields?: boolean;\n includeRelationships?: boolean;\n includeMethods?: boolean;\n detail?: IntrospectDetail;\n /**\n * Overrides the default character budget for the serialized `objects` array.\n *\n * Project metadata and diagnostics are deliberately exempt: a diagnostic is\n * how discovery reports that it found nothing (#2143), so budgeting it away\n * would hide the very failure the caller needs to see. The full response is\n * therefore somewhat larger than this budget.\n */\n maxChars?: number;\n /**\n * Resume after this `className` (objects are sorted alphabetically). Pass\n * the `nextCursor` from a previous truncated response to read the next page\n * instead of raising `maxChars` (#2779).\n */\n cursor?: string;\n /** Maximum objects per page, applied before the character budget. */\n limit?: number;\n}\n\ntype DiagnosticSeverity = 'error' | 'warning' | 'info';\n\ninterface Diagnostic {\n severity: DiagnosticSeverity;\n message: string;\n filePath?: string;\n line?: number;\n column?: number;\n}\n\ninterface ManifestLike {\n version?: string;\n packageName?: string;\n packageVersion?: string;\n objects?: Record<string, ManifestObject>;\n}\n\ninterface ManifestObject {\n name?: string;\n className: string;\n qualifiedName?: string;\n collection?: string;\n filePath: string;\n packageName?: string;\n packageVersion?: string;\n importPath?: string;\n modulePath?: string;\n exportName?: string;\n collectionExportName?: string;\n fields?: Record<string, ManifestField>;\n methods?: Record<string, ManifestMethod>;\n decoratorConfig?: Record<string, unknown>;\n extends?: string;\n extendsTypeArg?: string;\n schema?: ManifestSchema;\n staticProperties?: Record<string, unknown>;\n validationRules?: Record<string, unknown>;\n}\n\ninterface ManifestField {\n type: string;\n required?: boolean;\n default?: unknown;\n related?: string;\n description?: string;\n _meta?: Record<string, unknown>;\n transient?: boolean;\n}\n\ninterface ManifestMethod {\n name?: string;\n async?: boolean;\n parameters?: Array<{\n name: string;\n type?: string;\n optional?: boolean;\n default?: unknown;\n }>;\n returnType?: string;\n description?: string;\n isStatic?: boolean;\n isPublic?: boolean;\n}\n\ninterface ManifestSchema {\n tableName?: string;\n ddl?: string;\n columns?: Record<string, unknown>;\n indexes?: Array<{\n name?: string;\n columns?: string[];\n unique?: boolean;\n where?: string;\n jsonPath?: unknown;\n }>;\n version?: string;\n}\n\ninterface PackageMetadata {\n name?: string;\n version?: string;\n json?: Record<string, unknown>;\n}\n\nconst DEFAULT_MANIFEST_PATHS = [\n '.smrt/manifest.json',\n 'dist/manifest.json',\n 'src/manifest/manifest.json',\n];\n\nconst SCAN_EXCLUDE = [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/.git/**',\n '**/.smrt/**',\n '**/*.d.ts',\n '**/*.test.ts',\n '**/*.spec.ts',\n '**/__tests__/**',\n];\n\nconst RELATIONSHIP_TYPES = new Set([\n 'foreignKey',\n 'crossPackageRef',\n 'oneToMany',\n 'manyToMany',\n]);\n\n/**\n * Response budget in characters. Generous enough that a 42-object summary never\n * truncates, while still capping a runaway payload instead of emitting one.\n */\nconst DEFAULT_MAX_CHARS = 50_000;\n\nconst DEFAULT_MCP_OPERATIONS = ['list', 'get', 'create', 'update', 'delete'];\n\nexport async function introspectProject(\n args: IntrospectProjectArgs,\n): Promise<string> {\n const {\n directory = process.cwd(),\n includeFields = true,\n includeRelationships = true,\n includeMethods = true,\n detail = 'summary',\n maxChars = DEFAULT_MAX_CHARS,\n cursor,\n limit,\n } = args;\n const projectPath = resolve(directory);\n\n const exists = await pathExists(projectPath);\n if (!exists) {\n return JSON.stringify(\n {\n projectPath,\n manifestSource: 'none',\n objectCount: 0,\n objects: [],\n diagnostics: [\n {\n severity: 'warning',\n message: `Project directory does not exist: ${projectPath}`,\n },\n ],\n },\n null,\n 2,\n );\n }\n\n const packageMetadata = await readPackageMetadata(projectPath);\n const tenantScopes = await scanTenantScopes(projectPath);\n const manifestResult =\n (await loadManifestArtifact(projectPath, args.manifestPath)) ??\n (await scanSourceManifest(projectPath, packageMetadata));\n\n const entries = Object.entries(manifestResult.manifest.objects ?? {});\n const objects: IntrospectedObject[] =\n detail === 'summary'\n ? entries.map(([manifestKey, object]) =>\n summarizeObject({\n manifestKey,\n object,\n projectPath,\n tenantScope: tenantScopes.get(object.className),\n }),\n )\n : entries.map(([manifestKey, object]) =>\n formatObject({\n manifestKey,\n object,\n projectPath,\n includeFields,\n includeRelationships,\n includeMethods,\n tenantScope: tenantScopes.get(object.className),\n }),\n );\n objects.sort((left, right) => left.className.localeCompare(right.className));\n // Paging: skip everything up to and including the cursor, then cap by\n // `limit` before the character budget trims further.\n const afterCursor =\n typeof cursor === 'string' && cursor.length > 0\n ? objects.filter((object) => object.className.localeCompare(cursor) > 0)\n : objects;\n const pageLimit =\n typeof limit === 'number' && Number.isFinite(limit) && limit >= 1\n ? Math.floor(limit)\n : undefined;\n const window =\n pageLimit !== undefined ? afterCursor.slice(0, pageLimit) : afterCursor;\n const { kept, omitted: budgetOmitted } = applyObjectBudget(window, maxChars);\n const omitted = afterCursor.length - kept.length;\n const nextCursor =\n omitted > 0 && kept.length > 0\n ? kept[kept.length - 1].className\n : undefined;\n\n const output = {\n projectPath,\n manifestSource: manifestResult.source,\n manifestPath:\n 'path' in manifestResult\n ? relative(projectPath, manifestResult.path)\n : undefined,\n packageName:\n manifestResult.manifest.packageName ?? packageMetadata.name ?? undefined,\n packageVersion:\n manifestResult.manifest.packageVersion ??\n packageMetadata.version ??\n undefined,\n detail,\n objectCount: objects.length,\n scannedFileCount: manifestResult.scannedFileCount,\n parseTimeMs: manifestResult.parseTimeMs,\n ...(cursor ? { cursor } : {}),\n ...(nextCursor ? { nextCursor } : {}),\n ...(omitted > 0\n ? {\n truncated: {\n returnedObjectCount: kept.length,\n omittedObjectCount: omitted,\n budgetChars: maxChars,\n ...(pageLimit !== undefined ? { limit: pageLimit } : {}),\n guidance:\n budgetOmitted > 0\n ? 'The object list hit its character budget; metadata and diagnostics are still complete. Pass `cursor: nextCursor` to read the next page, narrow the scan with `directory`, keep `detail: \"summary\"`, or raise `maxChars` deliberately. Objects are sorted alphabetically.'\n : 'More objects follow this page. Pass `cursor: nextCursor` to continue.',\n },\n }\n : {}),\n objects: kept,\n diagnostics: manifestResult.diagnostics,\n };\n\n return JSON.stringify(output, null, 2);\n}\n\n/**\n * Trims the object list to the character budget, always keeping at least one so\n * a caller sees the shape rather than an empty list.\n */\nfunction applyObjectBudget<T>(\n objects: T[],\n maxChars: number,\n): { kept: T[]; omitted: number } {\n const kept: T[] = [];\n let used = 0;\n\n for (const object of objects) {\n const size = JSON.stringify(object, null, 2).length + 2;\n if (used + size > maxChars && kept.length > 0) break;\n used += size;\n kept.push(object);\n }\n\n return { kept, omitted: objects.length - kept.length };\n}\n\nfunction summarizeObject({\n manifestKey,\n object,\n projectPath,\n tenantScope,\n}: {\n manifestKey: string;\n object: ManifestObject;\n projectPath: string;\n tenantScope?: Record<string, unknown>;\n}) {\n const fields = Object.entries(object.fields ?? {});\n const decoratorConfig = object.decoratorConfig ?? {};\n\n return compactObject({\n manifestKey,\n className: object.className,\n qualifiedName: object.qualifiedName,\n filePath: sanitizePath(projectPath, object.filePath),\n extends: object.extends,\n collection: object.collection,\n tableName:\n object.schema?.tableName ??\n stringFromConfig(decoratorConfig.tableName) ??\n object.collection,\n tenantScope:\n tenantScope ?? normalizeTenantScopedConfig(decoratorConfig.tenantScoped),\n fieldCount: fields.length,\n relationships:\n fields\n .filter(([, field]) => RELATIONSHIP_TYPES.has(field.type))\n .map(\n ([name, field]) =>\n `${name} -> ${field.related ?? ''} (${field.type})`,\n )\n .join(', ') || undefined,\n mcpOperations: mcpOperationsFromConfig(decoratorConfig.mcp),\n });\n}\n\n/**\n * An omitted `mcp` config means full CRUD, not a closed surface — the same rule\n * the knowledge index applies.\n */\nfunction mcpOperationsFromConfig(config: unknown): string[] {\n if (config === false) return [];\n if (typeof config !== 'object' || config === null || Array.isArray(config)) {\n return [...DEFAULT_MCP_OPERATIONS];\n }\n\n const record = config as Record<string, unknown>;\n const include = Array.isArray(record.include)\n ? record.include.filter((item): item is string => typeof item === 'string')\n : DEFAULT_MCP_OPERATIONS;\n const exclude = new Set(\n Array.isArray(record.exclude)\n ? record.exclude.filter(\n (item): item is string => typeof item === 'string',\n )\n : [],\n );\n\n return include.filter((operation) => !exclude.has(operation));\n}\n\nasync function loadManifestArtifact(\n projectPath: string,\n manifestPath: string | undefined,\n): Promise<\n | {\n source: 'manifest';\n path: string;\n manifest: ManifestLike;\n diagnostics: Diagnostic[];\n scannedFileCount?: number;\n parseTimeMs?: number;\n }\n | undefined\n> {\n const candidates = manifestPath\n ? [resolve(projectPath, manifestPath)]\n : DEFAULT_MANIFEST_PATHS.map((candidate) => join(projectPath, candidate));\n\n const diagnostics: Diagnostic[] = [];\n for (const candidate of candidates) {\n if (!(await pathExists(candidate))) {\n continue;\n }\n\n try {\n const parsed = JSON.parse(await readFile(candidate, 'utf-8')) as unknown;\n if (isManifestLike(parsed)) {\n return {\n source: 'manifest',\n path: candidate,\n manifest: parsed,\n diagnostics,\n };\n }\n\n diagnostics.push({\n severity: 'warning',\n filePath: candidate,\n message: 'Manifest artifact is present but does not contain objects.',\n });\n } catch (error) {\n diagnostics.push({\n severity: 'error',\n filePath: candidate,\n message: `Unable to parse manifest artifact: ${messageFromError(error)}`,\n });\n }\n }\n\n return manifestPath\n ? {\n source: 'manifest',\n path: resolve(projectPath, manifestPath),\n manifest: { objects: {} },\n diagnostics: [\n ...diagnostics,\n {\n severity: 'warning',\n filePath: resolve(projectPath, manifestPath),\n message: 'Requested manifest artifact was not found.',\n },\n ],\n }\n : undefined;\n}\n\nasync function scanSourceManifest(\n projectPath: string,\n packageMetadata: PackageMetadata,\n): Promise<{\n source: 'scanner';\n manifest: ManifestLike;\n diagnostics: Diagnostic[];\n scannedFileCount: number;\n parseTimeMs: number;\n}> {\n const scanner = new OxcScanner({\n cwd: projectPath,\n include: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'],\n exclude: SCAN_EXCLUDE,\n });\n const { results, resolved } = await scanner.scanAndResolve();\n const adapter = new ManifestAdapter();\n const manifest = adapter.toManifest(\n resolved.filter((classDef) => classDef.hasSmartDecorator),\n {\n packageName: packageMetadata.name,\n packageVersion: packageMetadata.version,\n typeAliases: results.typeAliases,\n },\n ) as ManifestLike;\n finalizeScannerManifest(manifest, packageMetadata);\n\n return {\n source: 'scanner',\n manifest,\n diagnostics: results.errors.map(scanErrorToDiagnostic),\n scannedFileCount: results.fileCount,\n parseTimeMs: Math.round(results.totalParseTimeMs),\n };\n}\n\nfunction finalizeScannerManifest(\n manifest: ManifestLike,\n packageMetadata: PackageMetadata,\n): void {\n const manifestGen = new ManifestGenerator();\n const fullManifest = manifest as unknown as SmartObjectManifest;\n withSuppressedConsoleLog(() => {\n manifestGen.injectTenantScopedFields(fullManifest);\n manifestGen.mergeInheritedFields(fullManifest);\n manifestGen.generateValidationRules(fullManifest);\n manifestGen.generateSchemas(fullManifest);\n manifestGen.assertTenantScopedSchemaContract(fullManifest);\n manifestGen.generateAgentManifests(\n fullManifest,\n packageMetadata.name,\n packageMetadata.json,\n );\n });\n}\n\nfunction withSuppressedConsoleLog<T>(callback: () => T): T {\n const originalLog = console.log;\n console.log = () => undefined;\n try {\n return callback();\n } finally {\n console.log = originalLog;\n }\n}\n\nfunction formatObject({\n manifestKey,\n object,\n projectPath,\n includeFields,\n includeRelationships,\n includeMethods,\n tenantScope,\n}: {\n manifestKey: string;\n object: ManifestObject;\n projectPath: string;\n includeFields: boolean;\n includeRelationships: boolean;\n includeMethods: boolean;\n tenantScope?: Record<string, unknown>;\n}) {\n const fieldDetails = Object.entries(object.fields ?? {}).map(\n ([name, field]) => ({\n name,\n type: field.type,\n ...(field.required !== undefined ? { required: field.required } : {}),\n ...(field.default !== undefined ? { default: field.default } : {}),\n ...(field.related ? { related: field.related } : {}),\n ...(field.description ? { description: field.description } : {}),\n ...(field._meta ? { meta: field._meta } : {}),\n ...(field.transient !== undefined ? { transient: field.transient } : {}),\n }),\n );\n const relationshipDetails = fieldDetails\n .filter((field) => RELATIONSHIP_TYPES.has(field.type))\n .map((field) => ({\n field: field.name,\n relatedClass: field.related ?? '',\n type: field.type,\n ...(field.meta ? { meta: field.meta } : {}),\n }));\n const methodDetails = Object.entries(object.methods ?? {}).map(\n ([name, method]) => ({\n name: method.name ?? name,\n isAsync: method.async === true,\n isStatic: method.isStatic === true,\n isPublic: method.isPublic !== false,\n parameters: method.parameters ?? [],\n returnType: method.returnType ?? 'unknown',\n ...(method.description ? { description: method.description } : {}),\n }),\n );\n\n const decoratorConfig = object.decoratorConfig ?? {};\n const effectiveTenantScope =\n tenantScope ?? normalizeTenantScopedConfig(decoratorConfig.tenantScoped);\n const schema = object.schema;\n\n return compactObject({\n manifestKey,\n name: object.name,\n className: object.className,\n qualifiedName: object.qualifiedName,\n filePath: sanitizePath(projectPath, object.filePath),\n packageName: object.packageName,\n packageVersion: object.packageVersion,\n importPath: object.importPath,\n modulePath: object.modulePath,\n exportName: object.exportName,\n collectionExportName: object.collectionExportName,\n collection: object.collection,\n extends: object.extends,\n extendsTypeArg: object.extendsTypeArg,\n tableName:\n schema?.tableName ??\n stringFromConfig(decoratorConfig.tableName) ??\n object.collection,\n tableStrategy: stringFromConfig(decoratorConfig.tableStrategy) ?? 'cti',\n conflictColumns: arrayFromConfig(decoratorConfig.conflictColumns),\n tenantScope: effectiveTenantScope,\n decoratorConfig,\n schema: schema\n ? {\n tableName: schema.tableName,\n columns: schema.columns,\n indexes: schema.indexes ?? [],\n version: schema.version,\n }\n : undefined,\n indexes: schema?.indexes ?? [],\n staticProperties: object.staticProperties,\n validationRules: object.validationRules,\n ...(includeFields && {\n fields: fieldDetails\n .map((field) => `${field.name}: ${field.type}`)\n .join(', '),\n fieldDetails,\n }),\n ...(includeRelationships &&\n relationshipDetails.length > 0 && {\n relationships: relationshipDetails\n .map(\n (relationship) =>\n `${relationship.field} -> ${relationship.relatedClass} (${relationship.type})`,\n )\n .join(', '),\n relationshipDetails,\n }),\n ...(includeMethods &&\n methodDetails.length > 0 && {\n methods: methodDetails\n .map((method) => `${method.isAsync ? 'async ' : ''}${method.name}()`)\n .join(', '),\n methodDetails,\n }),\n });\n}\n\nasync function scanTenantScopes(\n projectPath: string,\n): Promise<Map<string, Record<string, unknown>>> {\n const files = await listSourceFiles(projectPath);\n const scopes = new Map<string, Record<string, unknown>>();\n\n await Promise.all(\n files.map(async (filePath) => {\n const content = await readFile(filePath, 'utf-8');\n const classMatches = content.matchAll(/class\\s+([A-Za-z_]\\w*)\\b/g);\n for (const match of classMatches) {\n const className = match[1];\n if (!className || match.index === undefined) continue;\n const prefix = content.slice(\n Math.max(0, match.index - 800),\n match.index,\n );\n const tenantMatches = Array.from(\n prefix.matchAll(/@TenantScoped\\s*\\(([\\s\\S]*?)\\)/g),\n );\n const tenantMatch = tenantMatches.at(-1);\n if (!tenantMatch) continue;\n scopes.set(className, {\n source: 'TenantScoped',\n ...parseTenantScopedOptions(tenantMatch[1]),\n });\n }\n }),\n );\n\n return scopes;\n}\n\nasync function listSourceFiles(projectPath: string): Promise<string[]> {\n const files: string[] = [];\n\n async function visit(dir: string): Promise<void> {\n let entries: Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n if (\n [\n 'node_modules',\n 'dist',\n 'build',\n '.git',\n '.smrt',\n '__tests__',\n ].includes(entry.name) ||\n entry.name.startsWith('.')\n ) {\n continue;\n }\n await visit(fullPath);\n continue;\n }\n\n if (\n entry.isFile() &&\n /\\.(tsx?|jsx?)$/.test(entry.name) &&\n !entry.name.endsWith('.d.ts') &&\n !entry.name.endsWith('.test.ts') &&\n !entry.name.endsWith('.spec.ts')\n ) {\n files.push(fullPath);\n }\n }\n }\n\n await visit(projectPath);\n return files;\n}\n\nfunction parseTenantScopedOptions(raw: string): Record<string, unknown> {\n const mode = raw.match(/mode\\s*:\\s*['\"`](required|optional)['\"`]/)?.[1];\n const field = raw.match(/field\\s*:\\s*['\"`]([A-Za-z_]\\w*)['\"`]/)?.[1];\n const allowSuperAdminBypass = raw.match(\n /allowSuperAdminBypass\\s*:\\s*(true|false)/,\n )?.[1];\n const autoFilter = raw.match(/autoFilter\\s*:\\s*(true|false)/)?.[1];\n const autoPopulate = raw.match(/autoPopulate\\s*:\\s*(true|false)/)?.[1];\n\n return compactObject({\n mode: mode ?? 'required',\n field: field ?? 'tenantId',\n autoFilter: autoFilter === undefined ? undefined : autoFilter === 'true',\n autoPopulate:\n autoPopulate === undefined ? undefined : autoPopulate === 'true',\n allowSuperAdminBypass:\n allowSuperAdminBypass === undefined\n ? undefined\n : allowSuperAdminBypass === 'true',\n });\n}\n\nfunction normalizeTenantScopedConfig(\n tenantScoped: unknown,\n): Record<string, unknown> | undefined {\n if (!tenantScoped) return undefined;\n const options =\n typeof tenantScoped === 'object' && !Array.isArray(tenantScoped)\n ? (tenantScoped as Record<string, unknown>)\n : {};\n return {\n source: 'smrt',\n mode: options.mode ?? 'required',\n field: options.field ?? 'tenantId',\n autoFilter: options.autoFilter ?? true,\n autoPopulate: options.autoPopulate ?? true,\n allowSuperAdminBypass: options.allowSuperAdminBypass ?? false,\n };\n}\n\nasync function readPackageMetadata(\n projectPath: string,\n): Promise<PackageMetadata> {\n const packageJsonPath = join(projectPath, 'package.json');\n if (!(await pathExists(packageJsonPath))) return {};\n\n try {\n const json = JSON.parse(await readFile(packageJsonPath, 'utf-8')) as Record<\n string,\n unknown\n >;\n return {\n name: typeof json.name === 'string' ? json.name : undefined,\n version: typeof json.version === 'string' ? json.version : undefined,\n json,\n };\n } catch {\n return {};\n }\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isManifestLike(value: unknown): value is ManifestLike {\n return (\n !!value &&\n typeof value === 'object' &&\n !!(value as ManifestLike).objects &&\n typeof (value as ManifestLike).objects === 'object'\n );\n}\n\nfunction scanErrorToDiagnostic(error: ScanError): Diagnostic {\n return {\n severity: error.severity,\n message: error.message,\n filePath: error.filePath,\n line: error.line,\n column: error.column,\n };\n}\n\nfunction sanitizePath(projectPath: string, filePath: string): string {\n const absolute = isAbsolute(filePath)\n ? filePath\n : resolve(projectPath, filePath);\n const relativePath = relative(projectPath, absolute);\n if (!relativePath.startsWith('..')) {\n return relativePath || filePath;\n }\n return filePath;\n}\n\nfunction stringFromConfig(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction arrayFromConfig(value: unknown): string[] | undefined {\n return Array.isArray(value)\n ? value.filter((item): item is string => typeof item === 'string')\n : undefined;\n}\n\nfunction compactObject<T extends Record<string, unknown>>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n ) as T;\n}\n\nfunction messageFromError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","/**\n * Ecosystem-aware downstream project review.\n * Advisory only: scans manifests and source files, then reports alignment risks.\n */\n\nimport { type Dirent, existsSync } from 'node:fs';\nimport { access, readdir, readFile } from 'node:fs/promises';\nimport { dirname, join, relative, resolve, sep } from 'node:path';\n\ninterface ReviewSmrtProjectArgs {\n directory?: string;\n rootDir?: string;\n includeSourceEvidence?: boolean;\n maxFindings?: number;\n}\n\ntype Severity = 'high' | 'medium' | 'low';\n\ninterface Evidence {\n filePath: string;\n line?: number;\n detail: string;\n}\n\ninterface Finding {\n severity: Severity;\n area:\n | 'dependencies'\n | 'storage'\n | 'api-shell'\n | 'manifest'\n | 'auth-tenancy'\n | 'ui-shell';\n code: string;\n title: string;\n evidence: Evidence[];\n recommendation: string;\n suggestedIssueTitle: string;\n}\n\ninterface PackageInventory {\n name: string;\n path: string;\n private?: boolean;\n scripts: string[];\n declaredHappyVerticalDependencies: string[];\n importedHappyVerticalPackages: string[];\n missingHappyVerticalDependencies: string[];\n hasSvelteKit: boolean;\n hasSmrtSvelte: boolean;\n}\n\ninterface PackageContext {\n directory: string;\n relativePath: string;\n packageJsonPath: string;\n json: Record<string, unknown>;\n dependencies: Set<string>;\n scripts: Record<string, unknown>;\n imports: Map<string, Evidence[]>;\n sourceFiles: SourceFile[];\n}\n\ninterface SourceFile {\n path: string;\n packageDir: string;\n content: string;\n}\n\nconst SOURCE_EXTENSIONS = /\\.(tsx?|jsx?|svelte)$/;\nconst SKIP_DIRS = new Set([\n 'node_modules',\n 'dist',\n 'build',\n '.git',\n '.smrt',\n '.svelte-kit',\n 'coverage',\n]);\nconst DEPENDENCY_SECTIONS = [\n 'dependencies',\n 'devDependencies',\n 'peerDependencies',\n 'optionalDependencies',\n];\nconst SMRT_PACKAGE_PREFIX = '@happyvertical/smrt-';\nconst HAPPYVERTICAL_PACKAGE_PREFIX = '@happyvertical/';\n\nexport async function reviewSmrtProject(\n args: ReviewSmrtProjectArgs,\n): Promise<string> {\n const projectPath = resolve(args.directory ?? args.rootDir ?? process.cwd());\n if (!(await pathExists(projectPath))) {\n return JSON.stringify(\n {\n projectPath,\n packageCount: 0,\n packages: [],\n findings: [],\n summary: { high: 0, medium: 0, low: 0 },\n diagnostics: [\n {\n severity: 'warning',\n message: `Project directory does not exist: ${projectPath}`,\n },\n ],\n },\n null,\n 2,\n );\n }\n\n const packageContexts = await buildPackageContexts(projectPath);\n const sourceFiles = await listSourceFiles(projectPath, packageContexts);\n await attachSourceFiles(sourceFiles, packageContexts, projectPath);\n\n const findings = limitFindings(\n [\n ...findMissingHappyVerticalDependencies(packageContexts),\n ...findCustomManifestGeneration(sourceFiles, projectPath),\n ...findDirectStorageBypasses(sourceFiles, packageContexts, projectPath),\n ...findCustomHttpShells(sourceFiles, packageContexts, projectPath),\n ...findLocalAuthTenancy(sourceFiles, packageContexts, projectPath),\n ...findUiShellDrift(packageContexts, projectPath),\n ...findMissingManifestArtifacts(\n sourceFiles,\n packageContexts,\n projectPath,\n ),\n ],\n args.maxFindings,\n );\n\n const packages = packageContexts\n .map(packageInventory)\n .sort((left, right) => left.path.localeCompare(right.path));\n const summary = summarizeFindings(findings);\n\n return JSON.stringify(\n {\n projectPath,\n packageCount: packages.length,\n packages,\n findings:\n args.includeSourceEvidence === false\n ? findings.map(({ evidence: _evidence, ...finding }) => finding)\n : findings,\n summary,\n referenceChecks: [\n 'Prefer SMRT scanner/runtime manifests over custom manifest builders.',\n 'Prefer SvelteKit plus @happyvertical/smrt-svelte for app shells.',\n 'Prefer @happyvertical/sql and @happyvertical/files/assets/content over direct durable node:fs storage.',\n 'Prefer smrt-users, smrt-tenancy, and profile/audit packages over local static auth seams.',\n ],\n suggestedFollowUpIssues: findings.map((finding) => ({\n title: finding.suggestedIssueTitle,\n severity: finding.severity,\n area: finding.area,\n })),\n },\n null,\n 2,\n );\n}\n\nasync function buildPackageContexts(\n projectPath: string,\n): Promise<PackageContext[]> {\n const packageJsonPaths = await listPackageJsonFiles(projectPath);\n const contexts = await Promise.all(\n packageJsonPaths.map(async (packageJsonPath) => {\n const json = JSON.parse(\n await readFile(packageJsonPath, 'utf-8'),\n ) as Record<string, unknown>;\n const directory = dirname(packageJsonPath);\n return {\n directory,\n relativePath: relative(projectPath, directory) || '.',\n packageJsonPath,\n json,\n dependencies: collectDependencies(json),\n scripts: isRecord(json.scripts)\n ? (json.scripts as Record<string, unknown>)\n : {},\n imports: new Map<string, Evidence[]>(),\n sourceFiles: [],\n };\n }),\n );\n\n if (contexts.length === 0) {\n contexts.push({\n directory: projectPath,\n relativePath: '.',\n packageJsonPath: join(projectPath, 'package.json'),\n json: {},\n dependencies: new Set(),\n scripts: {},\n imports: new Map(),\n sourceFiles: [],\n });\n }\n\n return contexts.sort(\n (left, right) => left.directory.length - right.directory.length,\n );\n}\n\nasync function listPackageJsonFiles(projectPath: string): Promise<string[]> {\n const files: string[] = [];\n await visit(projectPath, async (filePath, entryName) => {\n if (entryName === 'package.json') files.push(filePath);\n });\n return files;\n}\n\nasync function listSourceFiles(\n projectPath: string,\n packages: PackageContext[],\n): Promise<SourceFile[]> {\n const files: SourceFile[] = [];\n await visit(projectPath, async (filePath, entryName) => {\n if (!SOURCE_EXTENSIONS.test(entryName)) return;\n if (\n entryName.endsWith('.d.ts') ||\n entryName.endsWith('.test.ts') ||\n entryName.endsWith('.spec.ts')\n ) {\n return;\n }\n\n const packageDir = findOwningPackage(filePath, packages).directory;\n const content = await readFile(filePath, 'utf-8');\n files.push({ path: filePath, packageDir, content });\n });\n return files;\n}\n\nasync function attachSourceFiles(\n sourceFiles: SourceFile[],\n packages: PackageContext[],\n projectPath: string,\n): Promise<void> {\n for (const sourceFile of sourceFiles) {\n const owner = packages.find(\n (pkg) => pkg.directory === sourceFile.packageDir,\n );\n if (!owner) continue;\n owner.sourceFiles.push(sourceFile);\n for (const importedPackage of extractImports(sourceFile.content)) {\n if (!importedPackage.startsWith(HAPPYVERTICAL_PACKAGE_PREFIX)) continue;\n const evidence = {\n filePath: relative(projectPath, sourceFile.path),\n line: lineNumber(sourceFile.content, importedPackage),\n detail: `Imports ${importedPackage}`,\n };\n const existing = owner.imports.get(importedPackage) ?? [];\n existing.push(evidence);\n owner.imports.set(importedPackage, existing);\n }\n }\n}\n\nfunction findMissingHappyVerticalDependencies(\n packages: PackageContext[],\n): Finding[] {\n return packages.flatMap((pkg) => {\n const ownName =\n typeof pkg.json.name === 'string' ? pkg.json.name : undefined;\n const missing = Array.from(pkg.imports.keys()).filter(\n (importedPackage) =>\n importedPackage !== ownName && !pkg.dependencies.has(importedPackage),\n );\n if (missing.length === 0) return [];\n\n const hasSmrtMissing = missing.some((name) =>\n name.startsWith(SMRT_PACKAGE_PREFIX),\n );\n return [\n {\n severity: hasSmrtMissing ? 'high' : 'medium',\n area: 'dependencies',\n code: 'missing-happyvertical-dependencies',\n title: `${packageLabel(pkg)} imports HappyVertical packages that package.json does not declare`,\n evidence: missing.flatMap((name) => pkg.imports.get(name) ?? []),\n recommendation:\n 'Declare every imported @happyvertical package in the owning package manifest so downstream installs and generated knowledge stay reproducible.',\n suggestedIssueTitle: `Declare missing HappyVertical dependencies in ${packageLabel(pkg)}`,\n },\n ];\n });\n}\n\nfunction findCustomManifestGeneration(\n sourceFiles: SourceFile[],\n projectPath: string,\n): Finding[] {\n return sourceFiles\n .filter(\n (file) =>\n /manifest\\.json/.test(file.content) &&\n /objects\\s*:/.test(file.content) &&\n /\\b(writeFile|writeFileSync)\\b/.test(file.content) &&\n !/@happyvertical\\/smrt-scanner/.test(file.content),\n )\n .map((file) => ({\n severity: 'high',\n area: 'manifest',\n code: 'custom-object-manifest-generation',\n title: 'Custom SMRT object manifest generation detected',\n evidence: [\n {\n filePath: relative(projectPath, file.path),\n line: lineNumber(file.content, 'manifest.json'),\n detail:\n 'Writes a manifest.json object inventory outside the SMRT scanner/runtime path.',\n },\n ],\n recommendation:\n 'Use the SMRT scanner/runtime manifest path so defaults, relationships, schemas, tenant fields, and cross-package references match framework behavior.',\n suggestedIssueTitle:\n 'Replace custom object manifest generation with SMRT scanner/runtime manifest generation',\n }));\n}\n\nfunction findDirectStorageBypasses(\n sourceFiles: SourceFile[],\n packages: PackageContext[],\n projectPath: string,\n): Finding[] {\n return sourceFiles.flatMap((file) => {\n const owner = findOwningPackage(file.path, packages);\n const usesFs =\n /from\\s+['\"](?:node:fs|node:fs\\/promises|fs|fs\\/promises)['\"]|require\\(['\"](?:node:fs|node:fs\\/promises|fs|fs\\/promises)['\"]\\)/.test(\n file.content,\n );\n const writesDurableData =\n /\\b(writeFile|appendFile|mkdir|rm|rename)\\b/.test(file.content) &&\n /(\\.json|data|storage|persist|cache|db)/i.test(file.content);\n const usesDirectSql =\n /from\\s+['\"](?:better-sqlite3|sqlite3|pg|mysql2?|knex|drizzle-orm)['\"]/.test(\n file.content,\n );\n if ((!usesFs || !writesDurableData) && !usesDirectSql) return [];\n\n const hasApprovedStorage =\n owner.dependencies.has('@happyvertical/sql') ||\n owner.dependencies.has('@happyvertical/files') ||\n owner.dependencies.has('@happyvertical/smrt-assets') ||\n owner.dependencies.has('@happyvertical/smrt-content');\n\n if (hasApprovedStorage) return [];\n\n return [\n {\n severity: 'medium',\n area: 'storage',\n code: 'direct-storage-bypass',\n title: `${packageLabel(owner)} appears to bypass HappyVertical storage packages`,\n evidence: [\n {\n filePath: relative(projectPath, file.path),\n line: lineNumber(\n file.content,\n usesDirectSql ? 'sqlite' : 'writeFile',\n ),\n detail: usesDirectSql\n ? 'Imports a direct SQL/storage library without @happyvertical/sql.'\n : 'Uses node:fs-style durable writes without @happyvertical/files/assets/content.',\n },\n ],\n recommendation:\n 'Route durable data through @happyvertical/sql, @happyvertical/files, SMRT assets, or SMRT content unless this is explicitly build-only tooling.',\n suggestedIssueTitle: `Review direct storage usage in ${packageLabel(owner)}`,\n },\n ];\n });\n}\n\nfunction findCustomHttpShells(\n sourceFiles: SourceFile[],\n packages: PackageContext[],\n projectPath: string,\n): Finding[] {\n const evidenceByPackage = new Map<PackageContext, Evidence[]>();\n\n for (const pkg of packages) {\n if (pkg.dependencies.has('@sveltejs/kit')) continue;\n\n const routerDependencies = ['express', 'fastify', 'hono', 'koa'].filter(\n (dep) => pkg.dependencies.has(dep),\n );\n if (routerDependencies.length === 0) continue;\n\n appendEvidence(evidenceByPackage, pkg, {\n filePath: relative(projectPath, pkg.packageJsonPath),\n detail: `Declares custom router package(s): ${routerDependencies.join(', ')}.`,\n });\n }\n\n for (const file of sourceFiles) {\n const owner = findOwningPackage(file.path, packages);\n if (owner.dependencies.has('@sveltejs/kit')) continue;\n\n const usesNodeHttp =\n /from\\s+['\"](?:node:http|http|node:https|https)['\"]|createServer\\s*\\(/.test(\n file.content,\n );\n if (!usesNodeHttp) continue;\n\n appendEvidence(evidenceByPackage, owner, {\n filePath: relative(projectPath, file.path),\n line: lineNumber(file.content, 'createServer'),\n detail:\n 'Custom HTTP routing found without the SvelteKit/SMRT app-shell dependency pattern.',\n });\n }\n\n return Array.from(evidenceByPackage.entries()).map(([owner, evidence]) => ({\n severity: 'medium',\n area: 'api-shell',\n code: 'custom-http-shell',\n title: `${packageLabel(owner)} uses a custom HTTP shell`,\n evidence,\n recommendation:\n 'Compare the app shell against the Anytown/Ergot SvelteKit + SMRT shell pattern before adding custom HTTP infrastructure.',\n suggestedIssueTitle: `Align ${packageLabel(owner)} app shell with SMRT/SvelteKit conventions`,\n }));\n}\n\nfunction appendEvidence(\n evidenceByPackage: Map<PackageContext, Evidence[]>,\n pkg: PackageContext,\n evidence: Evidence,\n): void {\n const existing = evidenceByPackage.get(pkg);\n if (existing) {\n existing.push(evidence);\n return;\n }\n\n evidenceByPackage.set(pkg, [evidence]);\n}\n\nfunction findLocalAuthTenancy(\n sourceFiles: SourceFile[],\n packages: PackageContext[],\n projectPath: string,\n): Finding[] {\n return sourceFiles.flatMap((file) => {\n const owner = findOwningPackage(file.path, packages);\n const pathSignal = /(auth|tenant|audit|session|rbac|user)/i.test(file.path);\n const codeSignal =\n /\\b(tenantId|tenant|role|permission|session|auditLog|apiKey)\\b/.test(\n file.content,\n );\n if (!pathSignal || !codeSignal) return [];\n\n const hasApprovedPackages =\n owner.dependencies.has('@happyvertical/smrt-users') ||\n owner.dependencies.has('@happyvertical/smrt-tenancy') ||\n owner.dependencies.has('@happyvertical/smrt-profiles');\n if (hasApprovedPackages) return [];\n\n return [\n {\n severity: 'medium',\n area: 'auth-tenancy',\n code: 'local-auth-tenancy',\n title: `${packageLabel(owner)} contains local auth/tenancy/audit logic`,\n evidence: [\n {\n filePath: relative(projectPath, file.path),\n line: lineNumber(file.content, 'tenant'),\n detail:\n 'Auth, tenancy, session, role, or audit terminology appears without smrt-users/smrt-tenancy/smrt-profiles dependencies.',\n },\n ],\n recommendation:\n 'Add explicit adapters to smrt-users, smrt-tenancy, and profile/audit models or document why this local implementation is intentionally isolated.',\n suggestedIssueTitle: `Review auth and tenancy adapters in ${packageLabel(owner)}`,\n },\n ];\n });\n}\n\nfunction findUiShellDrift(\n packages: PackageContext[],\n projectPath: string,\n): Finding[] {\n return packages.flatMap((pkg) => {\n const hasUiSource = pkg.sourceFiles.some((file) =>\n file.path.endsWith('.svelte'),\n );\n const likelyUiPackage =\n hasUiSource ||\n /(?:web|ui|app|site|frontend)/i.test(packageLabel(pkg)) ||\n pkg.dependencies.has('svelte') ||\n pkg.dependencies.has('vite');\n if (!likelyUiPackage) return [];\n if (pkg.dependencies.has('@happyvertical/smrt-svelte')) return [];\n\n return [\n {\n severity: 'low',\n area: 'ui-shell',\n code: 'missing-smrt-svelte-shell',\n title: `${packageLabel(pkg)} looks like UI work without @happyvertical/smrt-svelte`,\n evidence: [\n {\n filePath: relative(projectPath, pkg.packageJsonPath),\n detail:\n 'UI-facing package does not declare @happyvertical/smrt-svelte.',\n },\n ],\n recommendation:\n 'Use @happyvertical/smrt-svelte and the SvelteKit shell pattern for downstream app UI unless this package is intentionally framework-agnostic.',\n suggestedIssueTitle: `Check SMRT Svelte shell alignment for ${packageLabel(pkg)}`,\n },\n ];\n });\n}\n\nfunction findMissingManifestArtifacts(\n sourceFiles: SourceFile[],\n packages: PackageContext[],\n projectPath: string,\n): Finding[] {\n return packages.flatMap((pkg) => {\n const hasSmrtSource = pkg.sourceFiles.some((file) =>\n /@smrt\\s*\\(/.test(file.content),\n );\n if (!hasSmrtSource) return [];\n const hasManifest =\n sourceFiles.some(\n (file) =>\n file.packageDir === pkg.directory &&\n /@happyvertical\\/smrt-scanner/.test(file.content),\n ) ||\n pathExistsSyncHint(join(pkg.directory, '.smrt', 'manifest.json')) ||\n pathExistsSyncHint(join(pkg.directory, 'dist', 'manifest.json'));\n if (hasManifest) return [];\n\n return [\n {\n severity: 'low',\n area: 'manifest',\n code: 'missing-generated-manifest-artifact',\n title: `${packageLabel(pkg)} has @smrt objects but no generated manifest artifact was found`,\n evidence: [\n {\n filePath: relative(projectPath, pkg.packageJsonPath),\n detail:\n 'No .smrt/manifest.json or dist/manifest.json was visible during review.',\n },\n ],\n recommendation:\n 'Run the package build/test manifest generation path and verify it uses the SMRT scanner/runtime manifest pipeline.',\n suggestedIssueTitle: `Verify SMRT manifest generation for ${packageLabel(pkg)}`,\n },\n ];\n });\n}\n\nasync function visit(\n dir: string,\n onFile: (filePath: string, entryName: string) => Promise<void> | void,\n): Promise<void> {\n let entries: Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n if (SKIP_DIRS.has(entry.name)) continue;\n await visit(fullPath, onFile);\n continue;\n }\n if (entry.isFile()) await onFile(fullPath, entry.name);\n }\n}\n\nfunction collectDependencies(\n packageJson: Record<string, unknown>,\n): Set<string> {\n const dependencies = new Set<string>();\n for (const sectionName of DEPENDENCY_SECTIONS) {\n const section = packageJson[sectionName];\n if (!isRecord(section)) continue;\n for (const dependencyName of Object.keys(section)) {\n dependencies.add(dependencyName);\n }\n }\n return dependencies;\n}\n\nfunction extractImports(content: string): string[] {\n const imports = new Set<string>();\n const patterns = [\n /(?:import|export)\\s+(?:type\\s+)?(?:[^'\"]+\\s+from\\s+)?['\"]([^'\"]+)['\"]/g,\n /\\bimport\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g,\n /\\brequire\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g,\n ];\n for (const pattern of patterns) {\n for (const match of content.matchAll(pattern)) {\n const imported = normalizePackageImport(match[1]);\n if (imported) imports.add(imported);\n }\n }\n return Array.from(imports);\n}\n\nfunction normalizePackageImport(value: string | undefined): string | undefined {\n if (!value || value.startsWith('.') || value.startsWith('/'))\n return undefined;\n if (value.startsWith('@')) {\n const [scope, name] = value.split('/');\n return scope && name ? `${scope}/${name}` : value;\n }\n return value.split('/')[0];\n}\n\nfunction findOwningPackage(\n filePath: string,\n packages: PackageContext[],\n): PackageContext {\n const normalized = resolve(filePath);\n const matches = packages\n .filter(\n (pkg) =>\n normalized === pkg.directory ||\n normalized.startsWith(`${pkg.directory}${sep}`),\n )\n .sort((left, right) => right.directory.length - left.directory.length);\n return matches[0] ?? packages[0];\n}\n\nfunction packageInventory(pkg: PackageContext): PackageInventory {\n const declaredHappyVerticalDependencies = Array.from(pkg.dependencies)\n .filter((dependency) => dependency.startsWith(HAPPYVERTICAL_PACKAGE_PREFIX))\n .sort();\n const importedHappyVerticalPackages = Array.from(pkg.imports.keys()).sort();\n const ownName = typeof pkg.json.name === 'string' ? pkg.json.name : undefined;\n return {\n name: packageLabel(pkg),\n path: pkg.relativePath,\n private:\n typeof pkg.json.private === 'boolean' ? pkg.json.private : undefined,\n scripts: Object.keys(pkg.scripts).sort(),\n declaredHappyVerticalDependencies,\n importedHappyVerticalPackages,\n missingHappyVerticalDependencies: importedHappyVerticalPackages.filter(\n (name) => name !== ownName && !pkg.dependencies.has(name),\n ),\n hasSvelteKit: pkg.dependencies.has('@sveltejs/kit'),\n hasSmrtSvelte: pkg.dependencies.has('@happyvertical/smrt-svelte'),\n };\n}\n\nfunction summarizeFindings(findings: Finding[]): Record<Severity, number> {\n return findings.reduce(\n (summary, finding) => {\n summary[finding.severity]++;\n return summary;\n },\n { high: 0, medium: 0, low: 0 },\n );\n}\n\nfunction limitFindings(\n findings: Finding[],\n maxFindings: number | undefined,\n): Finding[] {\n const sorted = findings.sort(\n (left, right) =>\n severityRank(left.severity) - severityRank(right.severity) ||\n left.area.localeCompare(right.area) ||\n left.title.localeCompare(right.title),\n );\n return maxFindings && maxFindings > 0 ? sorted.slice(0, maxFindings) : sorted;\n}\n\nfunction severityRank(severity: Severity): number {\n return severity === 'high' ? 0 : severity === 'medium' ? 1 : 2;\n}\n\nfunction packageLabel(pkg: PackageContext): string {\n return typeof pkg.json.name === 'string' ? pkg.json.name : pkg.relativePath;\n}\n\nfunction lineNumber(content: string, needle: string): number | undefined {\n const index = content.indexOf(needle);\n if (index < 0) return undefined;\n return content.slice(0, index).split('\\n').length;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction pathExistsSyncHint(path: string): boolean {\n return existsSync(path);\n}\n","/**\n * SMRT Development MCP Server\n * Provides code generation, project introspection, knowledge context,\n * review/architecture prompt bundles, and portable agent skills.\n */\n\nimport { realpathSync } from 'node:fs';\n\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport {\n ProtocolError,\n ProtocolErrorCode,\n Server,\n} from '@modelcontextprotocol/server';\nimport { serveStdio } from '@modelcontextprotocol/server/stdio';\nimport { getAgentSkill, listAgentSkills } from './agent-skills.js';\nimport { startRuntimeHttpHost } from './http.js';\nimport {\n buildArchitectureContext,\n buildContext,\n buildKnowledgeIndex,\n buildPackageSpecialistContext,\n buildReviewContext,\n checkKnowledgeFreshness,\n checkKnowledgeFreshnessFromIndex,\n compactContextResult,\n} from './knowledge/index.js';\nimport { SERVER_NAME, SERVER_VERSION } from './server-info.js';\nimport { REVIEW_SKILL_NAME, TOOLS } from './tool-catalog.js';\nimport {\n generateSmrtClass,\n introspectProject,\n reviewSmrtProject,\n} from './tools/index.js';\nimport { redactConnectionString } from './tools/runtime/connection.js';\nimport {\n runtimeObject,\n runtimeRegistry,\n runtimeSchemaDiff,\n} from './tools/runtime/observation.js';\nimport {\n runtimeDispatchHealth,\n runtimeJobHealth,\n runtimeMigrationStatus,\n runtimeRecentChanges,\n runtimeRegistryDrift,\n runtimeScheduleHealth,\n} from './tools/runtime/tools.js';\n\nexport { SERVER_VERSION } from './server-info.js';\nexport { TOOLS } from './tool-catalog.js';\n\nconst DEBUG = process.env.DEBUG === 'true';\nconst REVIEW_SKILL_URI = `smrt-dev-mcp://agent-skills/${REVIEW_SKILL_NAME}`;\nconst DOMAIN_CODE_REVIEW_PROMPT = 'domain-code-review';\nconst DOMAIN_ARCHITECTURE_PROMPT = 'domain-architecture';\nconst KNOWLEDGE_PROJECT_URI = 'smrt://knowledge/project';\nconst KNOWLEDGE_PACKAGE_PREFIX = 'smrt://knowledge/package/';\nconst DEPLOY_STATIC_CATALOG_CACHE_HINT = {\n ttlMs: 86_400_000,\n cacheScope: 'private' as const,\n};\n// Knowledge resources are rebuilt from the workspace on every request. There\n// is no transport-visible project-graph invalidation signal, so a nonzero TTL\n// would promise stale data could not be served after an edit.\nconst LIVE_KNOWLEDGE_CACHE_HINT = {\n ttlMs: 0,\n cacheScope: 'private' as const,\n};\nconst WORKBENCH_PROJECT_URI = 'smrt://workbench/project';\nconst WORKBENCH_PACKAGE_PREFIX = 'smrt://workbench/package/';\nconst WORKBENCH_SPECIALIST_SUFFIX = '/specialist';\n\ntype KnowledgeIndexResult = Awaited<ReturnType<typeof buildKnowledgeIndex>>;\ntype KnowledgePackageResult = KnowledgeIndexResult['packages'][number];\ntype PackageSpecialistResult = Awaited<\n ReturnType<typeof buildPackageSpecialistContext>\n>;\ntype PromptArguments = Record<string, string> | undefined;\n\nexport function createServer(): Server {\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] Starting server v${SERVER_VERSION}`);\n }\n\n const server = new Server(\n {\n name: SERVER_NAME,\n version: SERVER_VERSION,\n },\n {\n capabilities: {\n prompts: {},\n resources: {},\n tools: {},\n },\n cacheHints: {\n 'tools/list': DEPLOY_STATIC_CATALOG_CACHE_HINT,\n 'prompts/list': DEPLOY_STATIC_CATALOG_CACHE_HINT,\n 'resources/list': LIVE_KNOWLEDGE_CACHE_HINT,\n 'resources/read': LIVE_KNOWLEDGE_CACHE_HINT,\n },\n },\n );\n\n // List tools handler\n server.setRequestHandler('tools/list', async () => {\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] ListTools request`);\n }\n return { tools: TOOLS };\n });\n\n server.setRequestHandler('prompts/list', async () => {\n return {\n prompts: [\n {\n name: REVIEW_SKILL_NAME,\n title: 'SMRT Code Review',\n description:\n 'Harness-agnostic downstream SMRT review procedure that uses smrt-dev-mcp deterministic context and prompt bundles.',\n },\n {\n name: DOMAIN_CODE_REVIEW_PROMPT,\n title: 'Domain Code Review',\n description:\n 'Model-ready domain-scoped SMRT code review prompt bundle.',\n arguments: [\n {\n name: 'rootDir',\n description: 'Project root directory. Defaults to server cwd.',\n required: false,\n },\n {\n name: 'changedFiles',\n description:\n 'Changed file paths as newline-separated, comma-separated, or JSON array text.',\n required: false,\n },\n {\n name: 'focus',\n description: 'Review focus text.',\n required: false,\n },\n {\n name: 'documentation',\n description: 'Additional documentation or notes.',\n required: false,\n },\n {\n name: 'scope',\n description:\n 'Knowledge scope: project, local, package, sdk, or installed.',\n required: false,\n },\n {\n name: 'package',\n description: 'Package name or short package selector.',\n required: false,\n },\n ],\n },\n {\n name: DOMAIN_ARCHITECTURE_PROMPT,\n title: 'Domain Architecture',\n description:\n 'Model-ready domain-scoped SMRT architecture planning prompt bundle.',\n arguments: [\n {\n name: 'rootDir',\n description: 'Project root directory. Defaults to server cwd.',\n required: false,\n },\n {\n name: 'idea',\n description: 'Architecture idea or product concept.',\n required: false,\n },\n {\n name: 'documentation',\n description: 'Additional documentation or notes.',\n required: false,\n },\n {\n name: 'focus',\n description: 'Planning focus text.',\n required: false,\n },\n {\n name: 'scope',\n description:\n 'Knowledge scope: project, local, package, sdk, or installed.',\n required: false,\n },\n {\n name: 'package',\n description: 'Package name or short package selector.',\n required: false,\n },\n ],\n },\n ],\n };\n });\n\n server.setRequestHandler('prompts/get', async (request) => {\n const { name } = request.params;\n if (name === REVIEW_SKILL_NAME) {\n return {\n description:\n 'Use this procedure when reviewing downstream SMRT projects.',\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: renderAgentSkillMarkdown(REVIEW_SKILL_NAME),\n },\n },\n ],\n };\n }\n\n if (name === DOMAIN_CODE_REVIEW_PROMPT) {\n const context = await buildReviewContext(\n reviewPromptArguments(request.params.arguments),\n );\n return {\n description: 'Review downstream SMRT code with domain knowledge.',\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: context.promptBundle.contextMarkdown,\n },\n },\n ],\n };\n }\n\n if (name === DOMAIN_ARCHITECTURE_PROMPT) {\n const context = await buildArchitectureContext(\n architecturePromptArguments(request.params.arguments),\n );\n return {\n description: 'Plan a downstream SMRT project with domain knowledge.',\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: context.promptBundle.contextMarkdown,\n },\n },\n ],\n };\n }\n\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n `Unknown prompt: ${name}`,\n );\n });\n\n server.setRequestHandler('resources/list', async () => {\n const index = await buildKnowledgeIndex();\n return {\n resources: [\n {\n uri: REVIEW_SKILL_URI,\n name: REVIEW_SKILL_NAME,\n title: 'SMRT Code Review Skill',\n description:\n 'Bundled Markdown skill for downstream SMRT code reviews.',\n mimeType: 'text/markdown',\n },\n {\n uri: KNOWLEDGE_PROJECT_URI,\n name: 'smrt-domain-knowledge-project',\n title: 'SMRT Domain Knowledge Project Index',\n description:\n 'Composed SMRT, downstream domain, and HappyVertical SDK knowledge index.',\n mimeType: 'application/json',\n },\n {\n uri: WORKBENCH_PROJECT_URI,\n name: 'smrt-workbench-project',\n title: 'SMRT Workbench Project',\n description:\n 'Workbench-facing package and knowledge resource index for the current project.',\n mimeType: 'application/json',\n },\n ...index.packages.map((pkg) => ({\n uri: `${KNOWLEDGE_PACKAGE_PREFIX}${encodeURIComponent(pkg.name)}`,\n name: `smrt-domain-knowledge-${pkg.name}`,\n title: `SMRT Domain Knowledge: ${pkg.name}`,\n description:\n 'Package-scoped SMRT domain knowledge, generated surfaces, and authored context.',\n mimeType: 'application/json',\n })),\n ...index.packages\n .filter((pkg) => pkg.kind !== 'sdk')\n .flatMap((pkg) => [\n {\n uri: `${WORKBENCH_PACKAGE_PREFIX}${encodeURIComponent(pkg.name)}`,\n name: `smrt-workbench-${pkg.name}`,\n title: `SMRT Workbench Package: ${pkg.name}`,\n description:\n 'Workbench package resource with docs, manifest, knowledge, scripts, and surface metadata.',\n mimeType: 'application/json',\n },\n {\n uri: `${WORKBENCH_PACKAGE_PREFIX}${encodeURIComponent(pkg.name)}${WORKBENCH_SPECIALIST_SUFFIX}`,\n name: `smrt-workbench-specialist-${pkg.name}`,\n title: `SMRT Package Specialist: ${pkg.name}`,\n description:\n 'Deterministic package specialist prompt bundle and source list.',\n mimeType: 'application/json',\n },\n ]),\n ],\n };\n });\n\n server.setRequestHandler('resources/read', async (request) => {\n const { uri } = request.params;\n if (uri === REVIEW_SKILL_URI) {\n return {\n contents: [\n {\n uri,\n mimeType: 'text/markdown',\n text: renderAgentSkillMarkdown(REVIEW_SKILL_NAME),\n },\n ],\n };\n }\n\n if (uri === KNOWLEDGE_PROJECT_URI) {\n const index = await buildKnowledgeIndex();\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(sanitizeKnowledgeIndex(index), null, 2),\n },\n ],\n };\n }\n\n if (uri === WORKBENCH_PROJECT_URI) {\n const index = await buildKnowledgeIndex();\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(\n {\n project: sanitizeKnowledgeIndex(index),\n workbenchResources: index.packages\n .filter((pkg) => pkg.kind !== 'sdk')\n .map((pkg) => ({\n packageName: pkg.name,\n packageUri: `${WORKBENCH_PACKAGE_PREFIX}${encodeURIComponent(pkg.name)}`,\n specialistUri: `${WORKBENCH_PACKAGE_PREFIX}${encodeURIComponent(pkg.name)}${WORKBENCH_SPECIALIST_SUFFIX}`,\n })),\n },\n null,\n 2,\n ),\n },\n ],\n };\n }\n\n if (\n uri.startsWith(WORKBENCH_PACKAGE_PREFIX) &&\n uri.endsWith(WORKBENCH_SPECIALIST_SUFFIX)\n ) {\n const packageName = decodeURIComponent(\n uri.slice(\n WORKBENCH_PACKAGE_PREFIX.length,\n -WORKBENCH_SPECIALIST_SUFFIX.length,\n ),\n );\n const specialist = await buildPackageSpecialistContext({\n package: packageName,\n });\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(\n sanitizePackageSpecialist(specialist),\n null,\n 2,\n ),\n },\n ],\n };\n }\n\n if (uri.startsWith(WORKBENCH_PACKAGE_PREFIX)) {\n const packageName = decodeURIComponent(\n uri.slice(WORKBENCH_PACKAGE_PREFIX.length),\n );\n const index = await buildKnowledgeIndex();\n const pkg = index.packages.find((item) => item.name === packageName);\n if (!pkg) {\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n `Unknown workbench package: ${packageName}`,\n );\n }\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(\n {\n package: sanitizeKnowledgePackage(pkg),\n specialistUri: `${WORKBENCH_PACKAGE_PREFIX}${encodeURIComponent(pkg.name)}${WORKBENCH_SPECIALIST_SUFFIX}`,\n },\n null,\n 2,\n ),\n },\n ],\n };\n }\n\n if (uri.startsWith(KNOWLEDGE_PACKAGE_PREFIX)) {\n const packageName = decodeURIComponent(\n uri.slice(KNOWLEDGE_PACKAGE_PREFIX.length),\n );\n const index = await buildKnowledgeIndex();\n const pkg = index.packages.find((item) => item.name === packageName);\n if (!pkg) {\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n `Unknown knowledge package: ${packageName}`,\n );\n }\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(sanitizeKnowledgePackage(pkg), null, 2),\n },\n ],\n };\n }\n\n throw new ProtocolError(\n ProtocolErrorCode.InvalidParams,\n `Unknown resource: ${uri}`,\n );\n });\n\n // Call tool handler\n server.setRequestHandler('tools/call', async (request) => {\n const { name, arguments: args } = request.params;\n\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] CallTool: ${name}`);\n console.error(\n `[${SERVER_NAME}] Arguments:`,\n JSON.stringify(redactDebugArguments(args), null, 2),\n );\n }\n\n try {\n let result: string;\n\n switch (name) {\n case 'generate-smrt-class':\n result = await generateSmrtClass(\n args as unknown as Parameters<typeof generateSmrtClass>[0],\n );\n break;\n\n case 'introspect-project':\n result = await introspectProject(\n args as unknown as Parameters<typeof introspectProject>[0],\n );\n break;\n\n case 'review-smrt-project':\n result = await reviewSmrtProject(\n args as unknown as Parameters<typeof reviewSmrtProject>[0],\n );\n break;\n\n case 'reflect-knowledge': {\n const index = await buildKnowledgeIndex(\n args as unknown as Parameters<typeof buildKnowledgeIndex>[0],\n );\n const freshness = await checkKnowledgeFreshnessFromIndex(\n index,\n args as unknown as Parameters<\n typeof checkKnowledgeFreshnessFromIndex\n >[1],\n );\n result = JSON.stringify(\n {\n rootDir: index.rootDir,\n packageCount: index.packages.length,\n smrtPackageCount: index.smrtPackages.length,\n sdkPackageCount: index.sdkPackages.length,\n relationshipsV2: index.relationshipsV2,\n coverage: index.coverage,\n diagnostics: index.diagnostics,\n freshness,\n },\n null,\n 2,\n );\n break;\n }\n\n case 'reflect-domain-knowledge': {\n const index = await buildKnowledgeIndex(\n args as unknown as Parameters<typeof buildKnowledgeIndex>[0],\n );\n const freshness = await checkKnowledgeFreshnessFromIndex(\n index,\n args as unknown as Parameters<\n typeof checkKnowledgeFreshnessFromIndex\n >[1],\n );\n result = JSON.stringify(\n {\n rootDir: index.rootDir,\n packageCount: index.packages.length,\n smrtPackageCount: index.smrtPackages.length,\n sdkPackageCount: index.sdkPackages.length,\n domainKnowledgePackageCount: index.packages.filter(\n (pkg) => pkg.hasDomainKnowledge,\n ).length,\n missingDomainKnowledgePackages: index.packages\n .filter(\n (pkg) =>\n pkg.exportKeys.includes('./smrt-knowledge.json') &&\n !pkg.hasDomainKnowledge,\n )\n .map((pkg) => pkg.name),\n relationshipsV2: index.relationshipsV2,\n coverage: index.coverage,\n diagnostics: index.diagnostics,\n freshness,\n },\n null,\n 2,\n );\n break;\n }\n\n case 'check-knowledge-freshness':\n result = JSON.stringify(\n await checkKnowledgeFreshness(\n args as unknown as Parameters<typeof checkKnowledgeFreshness>[0],\n ),\n null,\n 2,\n );\n break;\n\n case 'build-context':\n result = JSON.stringify(\n compactContextResult(\n await buildContext(\n args as unknown as Parameters<typeof buildContext>[0],\n ),\n detailArg(args),\n ),\n null,\n 2,\n );\n break;\n\n case 'smrt-review':\n case 'smrt-architecture': {\n // One-release compatibility names for build-context (#2780).\n const task = name === 'smrt-review' ? 'review' : 'architecture';\n const context = compactContextResult(\n await buildContext({\n ...(args as Record<string, unknown>),\n task,\n } as unknown as Parameters<typeof buildContext>[0]),\n detailArg(args),\n ) as Record<string, unknown> & { diagnostics?: unknown[] };\n context.diagnostics = [\n ...(Array.isArray(context.diagnostics) ? context.diagnostics : []),\n {\n severity: 'info',\n code: 'deprecated_tool_name',\n message: `${name} is a compatibility name; call build-context with task: '${task}'. It will be removed in the next minor release.`,\n },\n ];\n result = JSON.stringify(context, null, 2);\n break;\n }\n\n case 'build-package-specialist-context':\n result = JSON.stringify(\n sanitizePackageSpecialist(\n await buildPackageSpecialistContext(\n args as unknown as Parameters<\n typeof buildPackageSpecialistContext\n >[0],\n ),\n ),\n null,\n 2,\n );\n break;\n\n case 'list-agent-skills':\n result = JSON.stringify({ skills: listAgentSkills() }, null, 2);\n break;\n\n case 'get-agent-skill':\n result = JSON.stringify(\n await getAgentSkill(\n args as unknown as Parameters<typeof getAgentSkill>[0],\n ),\n null,\n 2,\n );\n break;\n\n case 'migration-status':\n result = JSON.stringify(\n await runtimeMigrationStatus(\n args as unknown as Parameters<typeof runtimeMigrationStatus>[0],\n ),\n null,\n 2,\n );\n break;\n\n case 'job-health':\n result = JSON.stringify(\n await runtimeJobHealth(\n args as unknown as Parameters<typeof runtimeJobHealth>[0],\n ),\n null,\n 2,\n );\n break;\n\n case 'schedule-health':\n result = JSON.stringify(\n await runtimeScheduleHealth(\n args as unknown as Parameters<typeof runtimeScheduleHealth>[0],\n ),\n null,\n 2,\n );\n break;\n\n case 'dispatch-health':\n result = JSON.stringify(\n await runtimeDispatchHealth(\n args as unknown as Parameters<typeof runtimeDispatchHealth>[0],\n ),\n null,\n 2,\n );\n break;\n\n case 'recent-changes':\n result = JSON.stringify(\n await runtimeRecentChanges(\n args as unknown as Parameters<typeof runtimeRecentChanges>[0],\n ),\n null,\n 2,\n );\n break;\n\n case 'registry-drift':\n result = JSON.stringify(\n await runtimeRegistryDrift(\n args as unknown as Parameters<typeof runtimeRegistryDrift>[0],\n ),\n null,\n 2,\n );\n break;\n\n case 'runtime-registry':\n result = JSON.stringify(\n await runtimeRegistry(\n args as unknown as Parameters<typeof runtimeRegistry>[0],\n ),\n null,\n 2,\n );\n break;\n\n case 'runtime-object':\n result = JSON.stringify(\n await runtimeObject(\n args as unknown as Parameters<typeof runtimeObject>[0],\n ),\n null,\n 2,\n );\n break;\n\n case 'runtime-schema-diff':\n result = JSON.stringify(\n await runtimeSchemaDiff(\n args as unknown as Parameters<typeof runtimeSchemaDiff>[0],\n ),\n null,\n 2,\n );\n break;\n\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n\n return {\n content: [\n {\n type: 'text',\n text: result,\n },\n ],\n structuredContent: toDevToolStructuredContent(result),\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error';\n console.error(`[${SERVER_NAME}] Error:`, error);\n\n return {\n content: [\n {\n type: 'text',\n text: `Error executing tool ${name}: ${errorMessage}`,\n },\n ],\n isError: true,\n structuredContent: {\n ok: false,\n coverage: null,\n diagnostics: [{ severity: 'error', message: errorMessage }],\n data: null,\n },\n };\n }\n });\n\n return server;\n}\n\nasync function main() {\n const handle = serveStdio(() => createServer(), {\n onerror: (error) =>\n console.error(`[${SERVER_NAME}] Protocol error:`, error),\n });\n\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] Server connected via stdio`);\n }\n\n // Graceful shutdown\n process.on('SIGINT', async () => {\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] Shutting down...`);\n }\n await handle.close();\n process.exit(0);\n });\n\n process.on('SIGTERM', async () => {\n if (DEBUG) {\n console.error(`[${SERVER_NAME}] Shutting down...`);\n }\n await handle.close();\n process.exit(0);\n });\n}\n\nfunction isEntrypoint(): boolean {\n const entry = process.argv[1];\n if (!entry) return false;\n try {\n return realpathSync(fileURLToPath(import.meta.url)) === realpathSync(entry);\n } catch {\n return import.meta.url === pathToFileURL(entry).href;\n }\n}\n\nfunction renderAgentSkillMarkdown(name: string): string {\n const skill = getAgentSkill({ name, includeReferences: true });\n const references = skill.referenceFiles.map(\n (file) => `## Reference: ${file.path}\\n\\n${file.content.trim()}`,\n );\n return [skill.skillMarkdown.trim(), ...references].join('\\n\\n');\n}\n\nfunction reviewPromptArguments(args: PromptArguments): Record<string, unknown> {\n return compactRecord({\n rootDir: args?.rootDir,\n changedFiles: parseStringList(args?.changedFiles),\n focus: args?.focus,\n documentation: args?.documentation,\n scope: args?.scope,\n package: args?.package,\n });\n}\n\nfunction architecturePromptArguments(\n args: PromptArguments,\n): Record<string, unknown> {\n return compactRecord({\n rootDir: args?.rootDir,\n idea: args?.idea,\n documentation: args?.documentation,\n focus: args?.focus,\n scope: args?.scope,\n package: args?.package,\n });\n}\n\nfunction parseStringList(value: string | undefined): string[] | undefined {\n if (!value?.trim()) return undefined;\n\n try {\n const parsed = JSON.parse(value);\n if (Array.isArray(parsed)) {\n return parsed.filter((item): item is string => typeof item === 'string');\n }\n } catch {\n // Fall through to delimiter parsing.\n }\n\n return value\n .split(/[\\n,]/)\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction compactRecord(\n value: Record<string, unknown>,\n): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(value).filter(([, entry]) => entry !== undefined),\n );\n}\n\nfunction sanitizeKnowledgeIndex(index: KnowledgeIndexResult) {\n const packages = index.packages.map((pkg) => sanitizeKnowledgePackage(pkg));\n return {\n ...index,\n rootDir: '.',\n packages,\n smrtPackages: packages.filter((pkg) => pkg.kind === 'smrt'),\n sdkPackages: packages.filter((pkg) => pkg.kind === 'sdk'),\n // Rebuilt from the sanitized list rather than carried over by the spread.\n // Installed dependencies live outside the project root, so theirs are the\n // absolute host paths this projection exists to strip (#2275).\n installedPackages: packages.filter((pkg) => pkg.isInstalledDependency),\n };\n}\n\nfunction detailArg(args: unknown): string | undefined {\n const detail = (args as Record<string, unknown> | undefined)?.detail;\n return typeof detail === 'string' ? detail : undefined;\n}\n\n/**\n * Debug logging happens before any tool runs its own redaction, so a\n * credential-bearing `dbUrl` argument must be masked here.\n */\nfunction redactDebugArguments(args: unknown): unknown {\n if (!isRecord(args) || typeof args.dbUrl !== 'string') return args;\n return { ...args, dbUrl: redactConnectionString(args.dbUrl) };\n}\n\nfunction isRuntimeEnvelope(value: unknown): value is {\n ok: boolean;\n coverage: unknown;\n diagnostics: unknown[];\n data: unknown;\n} {\n return (\n isRecord(value) &&\n typeof value.ok === 'boolean' &&\n 'coverage' in value &&\n Array.isArray(value.diagnostics) &&\n 'data' in value\n );\n}\n\nfunction toDevToolStructuredContent(result: string) {\n let data: unknown = result;\n try {\n data = JSON.parse(result);\n } catch {\n // `generate-smrt-class` intentionally returns source text, not JSON.\n }\n\n // Runtime diagnostics tools already return the `{ok, coverage, diagnostics,\n // data}` envelope; re-wrapping would expose `data.data.*` in\n // structuredContent while the text response exposes `data.*`.\n if (isRuntimeEnvelope(data)) {\n return data;\n }\n\n const source = isRecord(data) ? data : undefined;\n const coverage = isRecord(source?.coverage) ? source.coverage : null;\n const diagnostics = Array.isArray(source?.diagnostics)\n ? source.diagnostics.filter(isRecord)\n : [];\n return { ok: true, coverage, diagnostics, data };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction sanitizeKnowledgePackage(pkg: KnowledgePackageResult) {\n const { directory: _directory, objects, checkedObjectPaths, ...rest } = pkg;\n return {\n ...rest,\n // Paths outside the workspace root stay absolute in the index; redact them\n // here the same way object file paths are redacted.\n checkedObjectPaths: checkedObjectPaths.map(\n (path) => sanitizePath(path) ?? path,\n ),\n objects: objects.map((object) => ({\n ...object,\n filePath: sanitizePath(object.filePath),\n })),\n };\n}\n\nfunction sanitizePackageSpecialist(specialist: PackageSpecialistResult) {\n return {\n selectedPackage: sanitizeKnowledgePackage(specialist.selectedPackage),\n selectedSdkPackages: specialist.selectedSdkPackages.map((pkg) =>\n sanitizeKnowledgePackage(pkg),\n ),\n promptBundle: {\n ...specialist.promptBundle,\n contextMarkdown: specialist.promptBundle.contextMarkdown.replace(\n /^Baseline root: .+$/m,\n 'Baseline root: .',\n ),\n sourceFiles: sanitizePaths(specialist.promptBundle.sourceFiles),\n },\n sourceFiles: sanitizePaths(specialist.sourceFiles),\n };\n}\n\nfunction sanitizePaths(paths: string[]): string[] {\n return paths\n .map(sanitizePath)\n .filter((path): path is string => typeof path === 'string');\n}\n\nfunction sanitizePath(path: string | undefined): string | undefined {\n if (!path) return path;\n if (path.startsWith('/') || /^[A-Za-z]:[\\\\/]/.test(path)) {\n return '<absolute-path>';\n }\n return path;\n}\n\n/**\n * `smrt-dev-mcp --http [--port N] [--project DIR]` starts the Level 2 runtime\n * dev-plane host (#1831) instead of the stdio server. Loopback-only, bearer\n * protected, positive read-only catalog; see `http.ts`.\n */\nexport function parseHttpCliArgs(argv: readonly string[]): {\n http: boolean;\n port?: number;\n projectRoot?: string;\n} {\n const result: { http: boolean; port?: number; projectRoot?: string } = {\n http: false,\n };\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (arg === '--http') result.http = true;\n else if (arg === '--port') {\n const value = Number.parseInt(argv[index + 1] ?? '', 10);\n if (!Number.isInteger(value) || value < 0 || value > 65535) {\n throw new Error('--port requires an integer between 0 and 65535');\n }\n result.port = value;\n index += 1;\n } else if (arg === '--project') {\n const value = argv[index + 1];\n if (!value) throw new Error('--project requires a directory');\n result.projectRoot = value;\n index += 1;\n }\n }\n return result;\n}\n\nasync function mainHttp(cli: ReturnType<typeof parseHttpCliArgs>) {\n const host = await startRuntimeHttpHost({\n port: cli.port,\n projectRoot: cli.projectRoot,\n });\n // The token is printed exactly once, to stderr, only when this process\n // minted it; a token supplied via SMRT_DEV_MCP_TOKEN is never echoed.\n const minted = !process.env.SMRT_DEV_MCP_TOKEN?.trim();\n console.error(\n `[${SERVER_NAME}] runtime dev-plane listening at ${host.url} (${host.boot.objectCount} booted objects, ${host.boot.manifests.length} manifests)`,\n );\n if (minted) {\n console.error(`[${SERVER_NAME}] bearer token: ${host.token}`);\n }\n const shutdown = async () => {\n await host.close();\n process.exit(0);\n };\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n}\n\nif (isEntrypoint()) {\n const cli = parseHttpCliArgs(process.argv.slice(2));\n (cli.http ? mainHttp(cli) : main()).catch((error) => {\n console.error(`[${SERVER_NAME}] Fatal error:`, error);\n process.exit(1);\n });\n}\n"],"mappings":"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"}