@llui/vite-plugin 0.1.0 → 0.3.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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Plugin, ViteDevServer } from 'vite'\n\n// Minimal subset of `http.ServerResponse` we use in the MCP-status\n// handler. Avoids a heavy `node:http` import at the top of the file.\ninterface ServerResponseLike {\n statusCode: number\n setHeader(name: string, value: string): void\n end(body?: string): void\n}\nimport MagicString from 'magic-string'\nimport { existsSync, readFileSync, writeFileSync, watch as fsWatch, type FSWatcher } from 'node:fs'\nimport { readFile } from 'node:fs/promises'\nimport { dirname, relative, resolve } from 'node:path'\nimport { createRequire } from 'node:module'\nimport { spawn, type ChildProcess } from 'node:child_process'\nimport {\n transformLlui,\n transformUseClientSsr,\n hasUseClientDirective,\n type ExternalTypeSources,\n type PreExtractedSchemas,\n} from './transform.js'\nimport {\n findTypeSource,\n readComponentTypeArgNames,\n extractMsgAnnotationsCrossFile,\n extractDiscriminatedUnionSchemaCrossFile,\n type ResolveContext,\n} from './cross-file-resolver.js'\nimport ts from 'typescript'\n\n/**\n * Pre-resolution step run before `transformLlui`. Scans the source for\n * `component<State, Msg, Effect>(...)` calls; for each type argument that\n * is an identifier (the common case), walks imports and re-exports to\n * find the source file declaring that alias. The result is plumbed into\n * `transformLlui` so the schema/annotation extractors operate on the\n * declaring file's source instead of silently returning `null` when the\n * type lives in a separate file.\n *\n * Returns `undefined` (no external sources) when:\n * - No `component<...>()` call is in the file\n * - No type arguments are identifiers we can chase\n * - All type arguments are declared locally (the resolver returns the\n * same source we already have, so external sources are redundant)\n *\n * `resolveModule` comes from Rollup's `this.resolve()`; we wrap it to\n * return the absolute id (or null when unresolved) and read the source\n * via `fs/promises.readFile`.\n */\nasync function preResolveTypeSources(\n source: string,\n filePath: string,\n rollupResolve: (\n spec: string,\n importer: string,\n ) => Promise<{ id: string; external?: boolean | 'absolute' | 'relative' } | null>,\n): Promise<ExternalTypeSources | undefined> {\n // Cheap filter: nothing to resolve unless the file contains a\n // component<...>() call. Avoids parsing every TS file in the project.\n if (!/\\bcomponent\\s*</.test(source)) return undefined\n\n // Find the first component<...>() call and read its type arg names.\n // Multiple component() calls in one file would each technically need\n // their own type-arg lookup; we resolve based on the first call and\n // accept the (rare) edge case where two component() calls in one file\n // use different non-local Msg types. The lint rule catches divergence.\n const sf = ts.createSourceFile(filePath, source, ts.ScriptTarget.Latest, true)\n const args = findFirstComponentTypeArgs(sf)\n if (!args) return undefined\n\n const ctx: ResolveContext = {\n resolveModule: async (spec, importer) => {\n const result = await rollupResolve(spec, importer)\n if (!result || result.external) return null\n // Rollup ids can include query/hash suffixes for virtual modules;\n // strip those so fs.readFile sees a real path. Also skip files\n // outside our control (node_modules) — we don't want to follow\n // imports into third-party packages just to scrape types.\n const idStripped = result.id.split('?')[0]?.split('#')[0]\n if (!idStripped) return null\n if (idStripped.includes('/node_modules/')) return null\n return idStripped\n },\n readSource: async (p) => {\n return await readFile(p, 'utf8')\n },\n }\n\n // Helper to resolve one type-arg name into an external source if it\n // isn't declared locally (or if the resolver chases through imports).\n const resolve = async (\n typeName: string | null,\n ): Promise<{ source: string; typeName: string } | undefined> => {\n if (!typeName) return undefined\n const found = await findTypeSource(typeName, source, filePath, ctx)\n if (!found) return undefined\n // If the alias was declared locally, the existing extractor path\n // already handles it — no need to populate external sources.\n if (found.filePath === filePath) return undefined\n return { source: found.source, typeName: found.localName }\n }\n\n const [state, msg, effect] = await Promise.all([\n resolve(args.state),\n resolve(args.msg),\n resolve(args.effect),\n ])\n\n if (!state && !msg && !effect) return undefined\n return { state, msg, effect }\n}\n\n/**\n * Cross-file + composition-aware schema extraction. The extractors\n * follow imports/re-exports AND walk into TypeReferences inside Msg /\n * Effect unions, so a developer who organises types as\n * `type Msg = ImportedFoo | { type: 'extra' }` gets every variant in\n * `__msgAnnotations` and `__msgSchema`. Without this step the\n * file-local sync extractors would silently emit half-annotations\n * (only the inline TypeLiteral members) — the worst kind of failure\n * mode because the build appears to succeed.\n *\n * Returns `undefined` (no pre-extraction) when there's no\n * `component()` call to resolve types for.\n */\nasync function preExtractCompositional(\n source: string,\n filePath: string,\n rollupResolve: (\n spec: string,\n importer: string,\n ) => Promise<{ id: string; external?: boolean | 'absolute' | 'relative' } | null>,\n): Promise<PreExtractedSchemas | undefined> {\n if (!/\\bcomponent\\s*</.test(source)) return undefined\n const sf = ts.createSourceFile(filePath, source, ts.ScriptTarget.Latest, true)\n const args = findFirstComponentTypeArgs(sf)\n if (!args) return undefined\n // No identifier type args at all → nothing for the resolver to chase.\n if (!args.msg && !args.effect && !args.state) return undefined\n\n const ctx: ResolveContext = {\n resolveModule: async (spec, importer) => {\n const result = await rollupResolve(spec, importer)\n if (!result || result.external) return null\n const idStripped = result.id.split('?')[0]?.split('#')[0]\n if (!idStripped) return null\n if (idStripped.includes('/node_modules/')) return null\n return idStripped\n },\n readSource: async (p) => readFile(p, 'utf8'),\n }\n\n const [msgAnnotations, msgSchema, effectSchema] = await Promise.all([\n args.msg\n ? extractMsgAnnotationsCrossFile(source, args.msg, filePath, ctx)\n : Promise.resolve(null),\n args.msg\n ? extractDiscriminatedUnionSchemaCrossFile(source, args.msg, filePath, ctx)\n : Promise.resolve(null),\n args.effect\n ? extractDiscriminatedUnionSchemaCrossFile(source, args.effect, filePath, ctx)\n : Promise.resolve(null),\n ])\n\n // Only return a populated payload when we actually extracted\n // something useful. Returning `undefined` lets transformLlui fall\n // back to its file-local extractors, which is the right behavior\n // for the (rare) case where every type the resolver sees is\n // unreachable.\n if (msgAnnotations === null && msgSchema === null && effectSchema === null) return undefined\n\n // Note: state schema isn't a discriminated union, so composition\n // doesn't apply. We leave state on the simpler `typeSources` path\n // (already plumbed through preResolveTypeSources) which the\n // file-local `extractStateSchema` consumes.\n const out: PreExtractedSchemas = {}\n if (msgAnnotations !== null) out.msgAnnotations = msgAnnotations\n if (msgSchema !== null) out.msgSchema = msgSchema\n if (effectSchema !== null) out.effectSchema = effectSchema\n return out\n}\n\nfunction findFirstComponentTypeArgs(\n sf: ts.SourceFile,\n): { state: string | null; msg: string | null; effect: string | null } | null {\n let result: ReturnType<typeof readComponentTypeArgNames> | null = null\n const visit = (node: ts.Node): boolean => {\n if (result) return true\n if (\n ts.isCallExpression(node) &&\n ts.isIdentifier(node.expression) &&\n node.expression.text === 'component' &&\n node.typeArguments\n ) {\n result = readComponentTypeArgNames(node)\n return true\n }\n let stopped = false\n ts.forEachChild(node, (child) => {\n if (stopped) return\n if (visit(child)) stopped = true\n })\n return stopped\n }\n ts.forEachChild(sf, (child) => {\n visit(child)\n })\n return result\n}\n\n/**\n * Locate the workspace root so we share the MCP active marker file\n * with @llui/mcp regardless of which subdirectory the dev server runs in.\n * Mirrors `findWorkspaceRoot` from @llui/mcp — duplicated to avoid a\n * vite-plugin → mcp dependency cycle. The contract must stay in sync.\n */\nfunction findWorkspaceRoot(start: string = process.cwd()): string {\n let dir = resolve(start)\n let lastPackageJson: string | null = null\n while (true) {\n if (existsSync(resolve(dir, 'pnpm-workspace.yaml'))) return dir\n if (existsSync(resolve(dir, '.git'))) return dir\n if (existsSync(resolve(dir, 'package.json'))) lastPackageJson = dir\n const parent = dirname(dir)\n if (parent === dir) return lastPackageJson ?? start\n dir = parent\n }\n}\n\nexport interface LluiPluginOptions {\n /**\n * Port for the MCP debug bridge. In dev mode, the runtime relay connects\n * to `ws://127.0.0.1:<port>` so an external `llui-mcp` server can forward\n * tool calls into the running app.\n *\n * When omitted, the plugin checks whether `@llui/mcp` is resolvable from\n * the Vite project root. If yes → defaults to `5200`. If no → stays\n * disabled. This means installing `@llui/mcp` (+ starting its server)\n * Just Works without an explicit config entry. Pass an explicit `false`\n * to opt out even when `@llui/mcp` is installed; pass a number to use\n * a non-default port. When enabled but the MCP server isn't running,\n * the plugin returns 404 from its discovery endpoint and the browser\n * silently skips the connection — no retry noise.\n */\n mcpPort?: number | false\n\n /**\n * Emit `[llui]`-prefixed `console.info` logs for every transformed\n * component file — state-path bit assignments, mask injections, and\n * helper compile/bail counts. Useful when diagnosing why a binding\n * isn't gated the way you expect, or why a call fell back from\n * template-clone to `elSplit`. Off by default.\n */\n verbose?: boolean\n\n /**\n * Enables two things together when set:\n *\n * 1. Emits schemas + binding descriptors in prod builds so the\n * @llui/agent runtime has metadata to advertise over its WS hello\n * frame (see agent spec §7.4).\n * 2. Auto-mounts `@llui/agent/server`'s router at `/agent/*` and its\n * WS upgrade handler at `/agent/ws` on the Vite dev server — so\n * plain `vite dev` has working agent endpoints with no extra\n * server.ts wiring. Requires `@llui/agent` installed; if it isn't,\n * the plugin warns and skips dev mounting (prod emission still\n * works from Plan 3b).\n *\n * Pass `true` for defaults (random signing key per dev session;\n * `identityResolver` returns `'dev-user'`). Pass an object to customize.\n * Default `false` — metadata is dev-only, no agent endpoints.\n */\n agent?: boolean | AgentPluginConfig\n}\n\n/**\n * Reserved for future agent-server config. Empty today — opaque tokens\n * (post-0.0.35) need no signing key, and the dev server hard-codes the\n * identity resolver to `'dev-user'`. The shape is kept so callers can\n * pass `agent: { ... }` and we can grow options without churning the\n * public type.\n */\nexport type AgentPluginConfig = Record<string, never>\n\n/**\n * Does `@llui/mcp` resolve from `root`'s node_modules? Uses\n * `require.resolve` so monorepo workspaces and hoisted installs both\n * work. Catches failures silently — the only consequence is that we\n * leave `mcpPort` disabled, which is the safe default.\n */\nfunction hasMcpPackage(root: string): boolean {\n try {\n const req = createRequire(resolve(root, 'package.json'))\n req.resolve('@llui/mcp/package.json')\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Resolve the path to the llui-mcp CLI entry. Reads `bin.llui-mcp`\n * from @llui/mcp's package.json and joins it against the package\n * directory. Returns null if @llui/mcp isn't resolvable.\n */\nfunction resolveMcpCliPath(root: string): string | null {\n try {\n const req = createRequire(resolve(root, 'package.json'))\n const pkgJsonPath = req.resolve('@llui/mcp/package.json')\n const pkgJson = JSON.parse(readFileSync(pkgJsonPath, 'utf8')) as {\n bin?: string | Record<string, string>\n }\n const binEntry = typeof pkgJson.bin === 'string' ? pkgJson.bin : pkgJson.bin?.['llui-mcp']\n if (!binEntry) return null\n return resolve(dirname(pkgJsonPath), binEntry)\n } catch {\n return null\n }\n}\n\ntype AgentServerInstance = {\n router: (req: Request) => Promise<Response | null>\n wsUpgrade: (\n req: import('http').IncomingMessage,\n socket: import('stream').Duplex,\n head: Buffer,\n ) => void\n}\n\n/**\n * Dynamically load @llui/agent/server relative to the app root and\n * construct an agent server instance. Returns null if @llui/agent isn't\n * installed — the plugin degrades to \"prod schema emission only\" mode.\n */\nasync function loadAgentServer(\n appRoot: string,\n _cfg: AgentPluginConfig,\n): Promise<AgentServerInstance | null> {\n let serverModule: {\n createLluiAgentServer: (opts: {\n identityResolver?: (req: Request) => Promise<string | null>\n }) => AgentServerInstance\n }\n try {\n // Walk up from the app root to find node_modules/@llui/agent. Works\n // for both pnpm workspace and regular npm installs. Direct file-system\n // walk avoids \"exports\" / \"subpath './package.json'\" gymnastics that\n // require.resolve and Node's module resolver disagree on.\n const pkgDir = findPackageDir(appRoot, '@llui/agent')\n if (!pkgDir) throw new Error('not found in any ancestor node_modules')\n const pkg = JSON.parse(readFileSync(resolve(pkgDir, 'package.json'), 'utf8')) as {\n exports?: Record<string, { import?: string } | string>\n }\n const serverExport = pkg.exports?.['./server']\n const rel = typeof serverExport === 'string' ? serverExport : serverExport?.import\n if (!rel) throw new Error('missing ./server export in package.json')\n const modUrl = new URL(`file://${resolve(pkgDir, rel)}`).href\n serverModule = (await import(modUrl)) as typeof serverModule\n } catch (e) {\n console.warn(\n '[llui] agent: true is set but `@llui/agent` could not be loaded: ' +\n (e instanceof Error ? e.message : String(e)),\n )\n return null\n }\n\n // The pre-0.0.35 agent server required an HMAC signingKey for JWT\n // tokens. The opaque-token rewrite removed that option; the dev\n // server here just calls the factory with no auth config — the\n // in-memory token store is the source of truth.\n return serverModule.createLluiAgentServer({\n identityResolver: async () => 'dev-user',\n })\n}\n\n/**\n * Register the agent middleware + WS upgrade on the Vite dev server.\n * Must be called synchronously from configureServer so registration\n * happens BEFORE Vite installs its catch-all SPA fallback.\n */\nfunction registerAgentMiddleware(server: ViteDevServer, agent: AgentServerInstance): void {\n // Connect-style middleware. Vite's middleware chain runs in order, so\n // synchronous registration during configureServer places us ahead of\n // Vite's catch-all fallback.\n //\n // Dual-path: handle the canonical `/agent/*` (every project) AND\n // `/cdn-cgi/agent/*` (defensive — Cloudflare's `@cloudflare/vite-plugin`\n // routes everything except `/cdn-cgi/*` to the worker, which means\n // canonical `/agent/*` paths are shadowed in cloudflare-vite projects).\n // The cdn-cgi prefix is stripped before forwarding so the agent\n // server's router sees its own canonical paths regardless of which\n // public URL the client used. This matches the dual-path strategy\n // used for `/__llui_mcp_status`.\n server.middlewares.use((req, res, next) => {\n const url = req.url ?? '/'\n let stripped: string | null = null\n if (url.startsWith('/agent/') || url === '/agent') stripped = url\n else if (url.startsWith('/cdn-cgi/agent/') || url === '/cdn-cgi/agent') {\n stripped = url.slice('/cdn-cgi'.length)\n }\n if (stripped === null) {\n next()\n return\n }\n // Rewrite the request URL in-place so handleAgentRequest's path\n // matching sees `/agent/*`. Connect middleware can mutate req.url\n // for downstream handlers; we own the request from here.\n req.url = stripped\n void handleAgentRequest(req, res, agent.router).catch((e) => {\n console.error('[llui] agent middleware error:', e)\n next(e)\n })\n })\n\n // WS upgrade: only /agent/ws goes to the agent. Vite's own HMR upgrade\n // uses a different path and runs as a separate listener on the same\n // event, so this filter keeps both coexisting. Same dual-path\n // accommodation as the HTTP middleware — the WS-upgrade path doesn't\n // actually matter to most cloudflare setups (the worker handles WS\n // upgrades natively), but keeping the parity simplifies the mental\n // model for ops.\n server.httpServer?.on('upgrade', (req, socket, head) => {\n const url = new URL(req.url ?? '/', 'http://localhost')\n if (url.pathname === '/agent/ws' || url.pathname === '/cdn-cgi/agent/ws') {\n agent.wsUpgrade(req, socket, head)\n }\n })\n\n console.info(\n '[llui] agent dev endpoints active: POST /agent/mint, WS /agent/ws, LAP /agent/lap/v1/* (also reachable under /cdn-cgi/agent/* for cloudflare-vite parity)',\n )\n}\n\n/**\n * Walk up from `start` looking for `node_modules/<pkgName>`. Returns the\n * absolute path to the package directory, or null if not found.\n */\nfunction findPackageDir(start: string, pkgName: string): string | null {\n let dir = resolve(start)\n while (true) {\n const candidate = resolve(dir, 'node_modules', pkgName)\n if (existsSync(resolve(candidate, 'package.json'))) return candidate\n const parent = dirname(dir)\n if (parent === dir) return null\n dir = parent\n }\n}\n\n/** Convert a Node http req → Web Request, call router, write the response. */\nasync function handleAgentRequest(\n req: import('http').IncomingMessage,\n res: import('http').ServerResponse,\n router: (req: Request) => Promise<Response | null>,\n): Promise<void> {\n const method = req.method ?? 'GET'\n const url = req.url ?? '/'\n const headers: Record<string, string> = {}\n for (const [k, v] of Object.entries(req.headers)) {\n if (v === undefined) continue\n headers[k] = Array.isArray(v) ? v.join(', ') : v\n }\n let body: BodyInit | undefined\n if (!['GET', 'HEAD'].includes(method)) {\n const chunks: Buffer[] = []\n for await (const chunk of req) chunks.push(chunk as Buffer)\n if (chunks.length > 0) body = new Uint8Array(Buffer.concat(chunks))\n }\n const origin = `http://${req.headers.host ?? 'localhost'}`\n const webReq = new Request(`${origin}${url}`, { method, headers, body })\n const webRes = await router(webReq)\n if (!webRes) {\n res.statusCode = 404\n res.end()\n return\n }\n res.statusCode = webRes.status\n webRes.headers.forEach((v, k) => res.setHeader(k, v))\n const buf = Buffer.from(await webRes.arrayBuffer())\n res.end(buf)\n}\n\nexport default function llui(options: LluiPluginOptions = {}): Plugin {\n let devMode = false\n // `mcpPort` + `mcpMode` are resolved lazily in `configResolved` so we\n // can check for @llui/mcp in the consuming project's node_modules.\n // - `options.mcpPort === false` → disabled\n // - explicit number → wire-only (user manages the server)\n // - undefined + @llui/mcp found → spawn (plugin starts llui-mcp --http)\n // - undefined + no @llui/mcp → disabled\n let mcpPort: number | null = null\n let mcpMode: 'disabled' | 'wire' | 'spawn' = 'disabled'\n let mcpCliPath: string | null = null\n let mcpChild: ChildProcess | null = null\n const verbose = options.verbose === true\n const agent = options.agent ?? false\n const agentConfig: AgentPluginConfig = typeof agent === 'object' ? agent : {}\n // Agent server instance — loaded in configResolved (async), registered\n // in configureServer (sync). Null until loaded, or if @llui/agent isn't\n // installed.\n let agentServer: {\n router: (req: Request) => Promise<Response | null>\n wsUpgrade: (\n req: import('http').IncomingMessage,\n socket: import('stream').Duplex,\n head: Buffer,\n ) => void\n } | null = null\n\n // File-based handshake with @llui/mcp. The MCP server writes a marker\n // file when its bridge starts; we watch it and send a Vite HMR custom\n // event so the browser can call __lluiConnect() automatically — without\n // retry spam, regardless of whether MCP or Vite started first.\n const activeFilePath = resolve(findWorkspaceRoot(), 'node_modules/.cache/llui-mcp/active.json')\n let mcpWatcher: FSWatcher | null = null\n let dirWatcher: FSWatcher | null = null\n // Cached once Vite's HTTP server emits `listening`. `stampDevUrl()`\n // uses this to write the URL into the marker file — either immediately\n // (if MCP already started and wrote one) or later when the marker\n // appears via the directory watcher (MCP-starts-after-Vite path).\n let cachedDevUrl: string | null = null\n\n function readMcpMarker(): { port: number; devUrl?: string } | null {\n try {\n if (!existsSync(activeFilePath)) return null\n const data = JSON.parse(readFileSync(activeFilePath, 'utf8')) as {\n port?: number\n devUrl?: string\n }\n if (typeof data.port !== 'number') return null\n return { port: data.port, ...(data.devUrl ? { devUrl: data.devUrl } : {}) }\n } catch {\n return null\n }\n }\n\n /**\n * Idempotently write `cachedDevUrl` into the marker file. No-op if the\n * URL hasn't been captured yet (Vite hasn't emitted `listening`) or if\n * the marker file doesn't exist (MCP hasn't started yet). Covers both\n * orderings — the listening hook calls this after caching, and the\n * directory watcher calls it when the marker appears later.\n */\n function stampDevUrl(): void {\n if (cachedDevUrl === null) return\n if (!existsSync(activeFilePath)) return\n try {\n const marker = JSON.parse(readFileSync(activeFilePath, 'utf8')) as Record<string, unknown>\n if (marker.devUrl === cachedDevUrl) return\n marker.devUrl = cachedDevUrl\n writeFileSync(activeFilePath, JSON.stringify(marker))\n } catch {\n // Best-effort — failure to update the marker should not crash Vite\n }\n }\n\n function notifyMcpReady(server: ViteDevServer): void {\n const marker = readMcpMarker()\n if (marker === null) return\n server.ws.send({ type: 'custom', event: 'llui:mcp-ready', data: marker })\n }\n\n function notifyMcpOffline(server: ViteDevServer): void {\n server.ws.send({ type: 'custom', event: 'llui:mcp-offline', data: {} })\n }\n\n return {\n name: 'llui',\n enforce: 'pre',\n\n async configResolved(config) {\n devMode = config.command === 'serve' || config.mode === 'development'\n // Load @llui/agent here (async) so we can register middleware\n // synchronously in configureServer — which must happen BEFORE Vite\n // installs its catch-all SPA/fallback middleware.\n if (agent && devMode) {\n agentServer = await loadAgentServer(config.root, agentConfig)\n }\n if (options.mcpPort === false) {\n mcpMode = 'disabled'\n mcpPort = null\n } else if (typeof options.mcpPort === 'number') {\n mcpMode = 'wire'\n mcpPort = options.mcpPort\n } else if (hasMcpPackage(config.root)) {\n mcpCliPath = resolveMcpCliPath(config.root)\n if (mcpCliPath) {\n mcpMode = 'spawn'\n mcpPort = 5200\n } else {\n mcpMode = 'wire'\n mcpPort = 5200\n }\n } else {\n mcpMode = 'disabled'\n mcpPort = null\n }\n },\n\n configureServer(server) {\n // Agent dev endpoints — runs regardless of mcp state. Must be before\n // any early-returns below. Registration is synchronous because\n // agentServer was preloaded in configResolved.\n if (agentServer) {\n registerAgentMiddleware(server, agentServer)\n }\n\n if (mcpPort === null) {\n // #3 diagnostic: MCP server is running but the plugin is opted\n // out. Users in this state usually don't realize the mismatch —\n // loud-and-early log saves the \"why isn't my MCP attached\" hunt.\n if (existsSync(activeFilePath)) {\n console.warn(\n `[llui] @llui/mcp server is running (marker at ${activeFilePath}) ` +\n `but the Vite plugin is opted out (mcpPort: false, or @llui/mcp ` +\n `isn't a dep of this project). Add \\`llui({ mcpPort: 5200 })\\` ` +\n `to vite.config to wire them up, or remove the marker file and ` +\n `stop the MCP server if the mismatch was unintended.`,\n )\n }\n return\n }\n\n // Spawn mode: plugin launches llui-mcp as a child process so\n // `pnpm dev` handles the whole stack. Skip spawning when a marker\n // already exists — something (usually a separate llui-mcp process\n // started before Vite) is already listening. The existing wire\n // behavior takes over from there.\n if (mcpMode === 'spawn' && mcpCliPath !== null && !existsSync(activeFilePath)) {\n mcpChild = spawn(process.execPath, [mcpCliPath, '--http', String(mcpPort)], {\n stdio: ['ignore', 'pipe', 'pipe'],\n env: { ...process.env, LLUI_MCP_PORT: String(mcpPort) },\n })\n mcpChild.stdout?.on('data', (buf: Buffer) => {\n process.stdout.write(`[mcp] ${buf.toString()}`)\n })\n mcpChild.stderr?.on('data', (buf: Buffer) => {\n process.stderr.write(`[mcp] ${buf.toString()}`)\n })\n mcpChild.on('exit', (code) => {\n if (code !== 0 && code !== null) {\n console.warn(`[llui] @llui/mcp child exited with code ${code}`)\n }\n mcpChild = null\n })\n const killChild = (): void => {\n if (mcpChild && !mcpChild.killed) mcpChild.kill('SIGTERM')\n }\n server.httpServer?.on('close', killChild)\n process.once('exit', killChild)\n }\n\n // HTTP endpoint: the browser fetches this on load to discover the\n // current MCP port. Avoids the race where HMR events sent before\n // the import.meta.hot listener registers get dropped — and lets\n // the browser connect to the actual port (which may differ from\n // the compile-time default if MCP was started with LLUI_MCP_PORT).\n //\n // Two paths register the same handler:\n // * `/__llui_mcp_status` — canonical, served from any Vite\n // project.\n // * `/cdn-cgi/llui_mcp_status` — fallback for projects that\n // bundle `@cloudflare/vite-plugin`. The cloudflare plugin\n // intercepts every HTTP request in `configureServer` and\n // routes it to the worker, except `/cdn-cgi/*` which it\n // explicitly lets through. Without this fallback, MCP\n // auto-discovery silently fails under workerd.\n const mcpStatusHandler = (_req: unknown, res: ServerResponseLike): void => {\n const marker = readMcpMarker()\n if (marker === null) {\n res.statusCode = 404\n res.end()\n return\n }\n res.statusCode = 200\n res.setHeader('content-type', 'application/json')\n res.end(JSON.stringify({ port: marker.port }))\n }\n server.middlewares.use('/__llui_mcp_status', mcpStatusHandler)\n server.middlewares.use('/cdn-cgi/llui_mcp_status', mcpStatusHandler)\n\n // Watch the marker file for create/delete. fs.watch on the parent\n // directory catches both events; the file itself may not exist\n // when we start watching.\n const dir = dirname(activeFilePath)\n try {\n // Watch the parent directory for the marker file appearing/disappearing\n const watchDir = (): void => {\n if (!existsSync(dir)) return\n dirWatcher = fsWatch(dir, (_event, filename) => {\n if (filename !== 'active.json') return\n if (existsSync(activeFilePath)) {\n // Stamp BEFORE notifying so the `llui:mcp-ready` payload\n // carries the cached devUrl. This is the MCP-after-Vite\n // path: listening already fired and cached the URL; the\n // marker is only now appearing.\n stampDevUrl()\n notifyMcpReady(server)\n } else {\n notifyMcpOffline(server)\n }\n })\n }\n if (existsSync(dir)) {\n watchDir()\n } else {\n // Parent directory doesn't exist yet — poll for it briefly\n const poll = setInterval(() => {\n if (existsSync(dir)) {\n clearInterval(poll)\n watchDir()\n }\n }, 1000)\n // Clean up the poller if vite shuts down before MCP starts\n server.httpServer?.on('close', () => clearInterval(poll))\n }\n } catch {\n // fs.watch can fail on some filesystems — degrade silently\n }\n\n // Re-send the ready event when a new HMR client connects, in case\n // the page loads while MCP is already running.\n server.ws.on('connection', () => {\n if (existsSync(activeFilePath)) notifyMcpReady(server)\n })\n\n server.httpServer?.on('close', () => {\n mcpWatcher?.close()\n dirWatcher?.close()\n mcpWatcher = null\n dirWatcher = null\n })\n\n // Once Vite's HTTP server is listening, cache our dev URL and stamp\n // it into the marker file. Two orderings are possible:\n // (a) MCP started FIRST → marker exists now → stampDevUrl() writes\n // it, and we broadcast llui:mcp-ready so the browser picks up\n // the devUrl without relying on an incidental fs.watch tick\n // (which can miss on NFS/SMB).\n // (b) MCP will start LATER → marker doesn't exist yet → stamp is a\n // no-op. When MCP eventually writes the marker, the directory\n // watcher fires, calls stampDevUrl(), and notifies.\n server.httpServer?.once('listening', () => {\n const address = server.httpServer?.address()\n if (!address || typeof address !== 'object') return\n const host =\n address.address === '::' || address.address === '0.0.0.0' ? 'localhost' : address.address\n cachedDevUrl = `http://${host}:${address.port}`\n stampDevUrl()\n // Broadcast after stamping so the payload carries devUrl. Only\n // fires in case (a) — notifyMcpReady no-ops when the marker is\n // absent.\n notifyMcpReady(server)\n })\n\n // ── Agent dev endpoints ──────────────────────────────────────\n // When `agent: true` (or `agent: {...}`), auto-mount /agent/* on\n // the Vite dev server so `pnpm dev` has working agent endpoints.\n // Users with a custom server.ts (SSR apps) mount createLluiAgentServer\n // themselves — configureServer also fires in middleware mode, but\n // there server.httpServer is null so the upgrade hook is a no-op.\n },\n\n async transform(code, id, options) {\n if (!id.endsWith('.ts') && !id.endsWith('.tsx')) return\n\n // `'use client'` directive — SSR builds replace the module with a\n // stub so top-level imports and side effects never run on the\n // server. Client builds pass through to the normal transform; the\n // directive is effectively a no-op on the client.\n if (options?.ssr && hasUseClientDirective(code)) {\n const result = transformUseClientSsr(code, id)\n if (result) {\n const cwd = process.cwd()\n const rel = relative(cwd, id)\n const display = rel.startsWith('..') ? id : rel\n for (const warning of result.warnings) {\n this.warn(`${display}: ${warning}`)\n }\n return { code: result.output, map: { mappings: '' } }\n }\n }\n\n // Pre-resolve cross-file type sources for any `component<S, M, E>()`\n // call in this file. The extractors look for `type Msg = ...` etc.\n // in a single source string; if the user keeps `Msg` in a sibling\n // file, the local extraction returns null and the plugin emits no\n // annotations. Pre-resolution chases imports and re-exports to\n // find the declaring file, so the schema/annotation extractors run\n // against the right source. See cross-file-resolver.ts.\n //\n // `this.resolve` may be undefined in test harnesses that call the\n // hook directly without going through Rollup; in that case skip\n // pre-resolution and the local extractors handle whatever's in\n // the source string.\n const resolverAvailable = typeof this.resolve === 'function'\n const [typeSources, preExtracted] = resolverAvailable\n ? await Promise.all([\n preResolveTypeSources(code, id, this.resolve.bind(this)),\n // Cross-file + composition-aware extraction. Replaces the\n // file-local sync extractors when active. Without this step\n // a `type Msg = ImportedFoo | { type: 'extra' }`\n // composition would only see the inline `'extra'` variant\n // and silently emit half-annotations.\n preExtractCompositional(code, id, this.resolve.bind(this)),\n ])\n : [undefined, undefined]\n\n const result = transformLlui(\n code,\n id,\n devMode,\n Boolean(agent),\n mcpPort,\n verbose,\n typeSources,\n preExtracted,\n )\n if (!result) return undefined\n\n // Apply per-statement edits via MagicString for accurate source maps.\n // Untouched statements keep their original positions.\n const s = new MagicString(code)\n for (const edit of result.edits) {\n if (edit.start === edit.end) {\n // Insert at position — appendRight for middle, append for end-of-file\n if (edit.start === code.length) s.append(edit.replacement)\n else s.appendRight(edit.start, edit.replacement)\n } else {\n s.overwrite(edit.start, edit.end, edit.replacement)\n }\n }\n\n return {\n code: s.toString(),\n map: s.generateMap({ source: id, includeContent: true, hires: true }),\n }\n },\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Plugin, ViteDevServer } from 'vite'\n\n// Minimal subset of `http.ServerResponse` we use in the MCP-status\n// handler. Avoids a heavy `node:http` import at the top of the file.\ninterface ServerResponseLike {\n statusCode: number\n setHeader(name: string, value: string): void\n end(body?: string): void\n}\nimport MagicString from 'magic-string'\nimport { existsSync, readFileSync, writeFileSync, watch as fsWatch, type FSWatcher } from 'node:fs'\nimport { readFile } from 'node:fs/promises'\nimport { dirname, relative, resolve } from 'node:path'\nimport { createRequire } from 'node:module'\nimport { spawn, type ChildProcess } from 'node:child_process'\nimport {\n transformLlui,\n crossFileAccessorPaths,\n registerIntrospectionFactory,\n registerDevtoolsFactory,\n type ExternalTypeSources,\n type PreExtractedSchemas,\n} from '@llui/compiler'\nimport { transformUseClientSsr, hasUseClientDirective } from '@llui/compiler-ssr'\nimport { introspectionFactory } from '@llui/compiler-introspection'\nimport { devtoolsFactory } from '@llui/compiler-devtools'\n\n// Register opt-in module factories at plugin-import time.\n// @llui/compiler doesn't depend on its sibling packages (would\n// create a workspace cycle), so the host wires them.\nregisterIntrospectionFactory(introspectionFactory)\nregisterDevtoolsFactory(devtoolsFactory)\nimport {\n findTypeSource,\n readComponentTypeArgNames,\n extractMsgAnnotationsCrossFile,\n extractDiscriminatedUnionSchemaCrossFile,\n type ResolveContext,\n} from '@llui/compiler'\nimport ts from 'typescript'\n\n/**\n * Pre-resolution step run before `transformLlui`. Scans the source for\n * `component<State, Msg, Effect>(...)` calls; for each type argument that\n * is an identifier (the common case), walks imports and re-exports to\n * find the source file declaring that alias. The result is plumbed into\n * `transformLlui` so the schema/annotation extractors operate on the\n * declaring file's source instead of silently returning `null` when the\n * type lives in a separate file.\n *\n * Returns `undefined` (no external sources) when:\n * - No `component<...>()` call is in the file\n * - No type arguments are identifiers we can chase\n * - All type arguments are declared locally (the resolver returns the\n * same source we already have, so external sources are redundant)\n *\n * `resolveModule` comes from Rollup's `this.resolve()`; we wrap it to\n * return the absolute id (or null when unresolved) and read the source\n * via `fs/promises.readFile`.\n */\nasync function preResolveTypeSources(\n source: string,\n filePath: string,\n rollupResolve: (\n spec: string,\n importer: string,\n ) => Promise<{ id: string; external?: boolean | 'absolute' | 'relative' } | null>,\n): Promise<ExternalTypeSources | undefined> {\n // Cheap filter: nothing to resolve unless the file contains a\n // component<...>() call. Avoids parsing every TS file in the project.\n if (!/\\bcomponent\\s*</.test(source)) return undefined\n\n // Find the first component<...>() call and read its type arg names.\n // Multiple component() calls in one file would each technically need\n // their own type-arg lookup; we resolve based on the first call and\n // accept the (rare) edge case where two component() calls in one file\n // use different non-local Msg types. The lint rule catches divergence.\n const sf = ts.createSourceFile(filePath, source, ts.ScriptTarget.Latest, true)\n const args = findFirstComponentTypeArgs(sf)\n if (!args) return undefined\n\n const ctx: ResolveContext = {\n resolveModule: async (spec, importer) => {\n const result = await rollupResolve(spec, importer)\n if (!result || result.external) return null\n // Rollup ids can include query/hash suffixes for virtual modules;\n // strip those so fs.readFile sees a real path. Also skip files\n // outside our control (node_modules) — we don't want to follow\n // imports into third-party packages just to scrape types.\n const idStripped = result.id.split('?')[0]?.split('#')[0]\n if (!idStripped) return null\n if (idStripped.includes('/node_modules/')) return null\n return idStripped\n },\n readSource: async (p) => {\n return await readFile(p, 'utf8')\n },\n }\n\n // Helper to resolve one type-arg name into an external source if it\n // isn't declared locally (or if the resolver chases through imports).\n const resolve = async (\n typeName: string | null,\n ): Promise<{ source: string; typeName: string } | undefined> => {\n if (!typeName) return undefined\n const found = await findTypeSource(typeName, source, filePath, ctx)\n if (!found) return undefined\n // If the alias was declared locally, the existing extractor path\n // already handles it — no need to populate external sources.\n if (found.filePath === filePath) return undefined\n return { source: found.source, typeName: found.localName }\n }\n\n const [state, msg, effect] = await Promise.all([\n resolve(args.state),\n resolve(args.msg),\n resolve(args.effect),\n ])\n\n if (!state && !msg && !effect) return undefined\n return { state, msg, effect }\n}\n\n/**\n * Cross-file + composition-aware schema extraction. The extractors\n * follow imports/re-exports AND walk into TypeReferences inside Msg /\n * Effect unions, so a developer who organises types as\n * `type Msg = ImportedFoo | { type: 'extra' }` gets every variant in\n * `__msgAnnotations` and `__msgSchema`. Without this step the\n * file-local sync extractors would silently emit half-annotations\n * (only the inline TypeLiteral members) — the worst kind of failure\n * mode because the build appears to succeed.\n *\n * Returns `undefined` (no pre-extraction) when there's no\n * `component()` call to resolve types for.\n */\nasync function preExtractCompositional(\n source: string,\n filePath: string,\n rollupResolve: (\n spec: string,\n importer: string,\n ) => Promise<{ id: string; external?: boolean | 'absolute' | 'relative' } | null>,\n): Promise<PreExtractedSchemas | undefined> {\n if (!/\\bcomponent\\s*</.test(source)) return undefined\n const sf = ts.createSourceFile(filePath, source, ts.ScriptTarget.Latest, true)\n const args = findFirstComponentTypeArgs(sf)\n if (!args) return undefined\n // No identifier type args at all → nothing for the resolver to chase.\n if (!args.msg && !args.effect && !args.state) return undefined\n\n const ctx: ResolveContext = {\n resolveModule: async (spec, importer) => {\n const result = await rollupResolve(spec, importer)\n if (!result || result.external) return null\n const idStripped = result.id.split('?')[0]?.split('#')[0]\n if (!idStripped) return null\n if (idStripped.includes('/node_modules/')) return null\n return idStripped\n },\n readSource: async (p) => readFile(p, 'utf8'),\n }\n\n const [msgAnnotations, msgSchema, effectSchema] = await Promise.all([\n args.msg\n ? extractMsgAnnotationsCrossFile(source, args.msg, filePath, ctx)\n : Promise.resolve(null),\n args.msg\n ? extractDiscriminatedUnionSchemaCrossFile(source, args.msg, filePath, ctx)\n : Promise.resolve(null),\n args.effect\n ? extractDiscriminatedUnionSchemaCrossFile(source, args.effect, filePath, ctx)\n : Promise.resolve(null),\n ])\n\n // Only return a populated payload when we actually extracted\n // something useful. Returning `undefined` lets transformLlui fall\n // back to its file-local extractors, which is the right behavior\n // for the (rare) case where every type the resolver sees is\n // unreachable.\n if (msgAnnotations === null && msgSchema === null && effectSchema === null) return undefined\n\n // Note: state schema isn't a discriminated union, so composition\n // doesn't apply. We leave state on the simpler `typeSources` path\n // (already plumbed through preResolveTypeSources) which the\n // file-local `extractStateSchema` consumes.\n const out: PreExtractedSchemas = {}\n if (msgAnnotations !== null) out.msgAnnotations = msgAnnotations\n if (msgSchema !== null) out.msgSchema = msgSchema\n if (effectSchema !== null) out.effectSchema = effectSchema\n return out\n}\n\nfunction findFirstComponentTypeArgs(\n sf: ts.SourceFile,\n): { state: string | null; msg: string | null; effect: string | null } | null {\n let result: ReturnType<typeof readComponentTypeArgNames> | null = null\n const visit = (node: ts.Node): boolean => {\n if (result) return true\n if (\n ts.isCallExpression(node) &&\n ts.isIdentifier(node.expression) &&\n node.expression.text === 'component' &&\n node.typeArguments\n ) {\n result = readComponentTypeArgNames(node)\n return true\n }\n let stopped = false\n ts.forEachChild(node, (child) => {\n if (stopped) return\n if (visit(child)) stopped = true\n })\n return stopped\n }\n ts.forEachChild(sf, (child) => {\n visit(child)\n })\n return result\n}\n\n/**\n * Locate the workspace root so we share the MCP active marker file\n * with @llui/mcp regardless of which subdirectory the dev server runs in.\n * Mirrors `findWorkspaceRoot` from @llui/mcp — duplicated to avoid a\n * vite-plugin → mcp dependency cycle. The contract must stay in sync.\n */\nfunction findWorkspaceRoot(start: string = process.cwd()): string {\n let dir = resolve(start)\n let lastPackageJson: string | null = null\n while (true) {\n if (existsSync(resolve(dir, 'pnpm-workspace.yaml'))) return dir\n if (existsSync(resolve(dir, '.git'))) return dir\n if (existsSync(resolve(dir, 'package.json'))) lastPackageJson = dir\n const parent = dirname(dir)\n if (parent === dir) return lastPackageJson ?? start\n dir = parent\n }\n}\n\nexport interface LluiPluginOptions {\n /**\n * Port for the MCP debug bridge. In dev mode, the runtime relay connects\n * to `ws://127.0.0.1:<port>` so an external `llui-mcp` server can forward\n * tool calls into the running app.\n *\n * When omitted, the plugin checks whether `@llui/mcp` is resolvable from\n * the Vite project root. If yes → defaults to `5200`. If no → stays\n * disabled. This means installing `@llui/mcp` (+ starting its server)\n * Just Works without an explicit config entry. Pass an explicit `false`\n * to opt out even when `@llui/mcp` is installed; pass a number to use\n * a non-default port. When enabled but the MCP server isn't running,\n * the plugin returns 404 from its discovery endpoint and the browser\n * silently skips the connection — no retry noise.\n */\n mcpPort?: number | false\n\n /**\n * Emit `[llui]`-prefixed `console.info` logs for every transformed\n * component file — state-path bit assignments, mask injections, and\n * helper compile/bail counts. Useful when diagnosing why a binding\n * isn't gated the way you expect, or why a call fell back from\n * template-clone to `elSplit`. Off by default.\n */\n verbose?: boolean\n\n /**\n * Enables two things together when set:\n *\n * 1. Emits schemas + binding descriptors in prod builds so the\n * @llui/agent runtime has metadata to advertise over its WS hello\n * frame (see agent spec §7.4).\n * 2. Auto-mounts `@llui/agent/server`'s router at `/agent/*` and its\n * WS upgrade handler at `/agent/ws` on the Vite dev server — so\n * plain `vite dev` has working agent endpoints with no extra\n * server.ts wiring. Requires `@llui/agent` installed; if it isn't,\n * the plugin warns and skips dev mounting (prod emission still\n * works from Plan 3b).\n *\n * Pass `true` for defaults (random signing key per dev session;\n * `identityResolver` returns `'dev-user'`). Pass an object to customize.\n * Default `false` — metadata is dev-only, no agent endpoints.\n */\n agent?: boolean | AgentPluginConfig\n\n /**\n * Opt-in cross-file accessor walking (v2c pipeline integration of v2b's\n * cross-file walker). When enabled, the plugin builds a `ts.Program`\n * over the project at `configResolved` and feeds each `transform` call\n * the cross-file paths read through in-repo view-helpers — replacing\n * the v0.x sentinel-`show()` workaround for helpers in sibling files.\n *\n * Prototype-grade caveats:\n * - The Program builds once at startup; it does NOT refresh on file\n * change. HMR-edited files see stale cross-file edges until the\n * next dev-server restart. (v2c's module decomposition lands the\n * proper incremental Program; this is the v2b pipeline-integration\n * deferral.)\n * - The Program covers `.ts` / `.tsx` files reachable from the Vite\n * project root's `tsconfig.json`. Out-of-project imports are not\n * followed; manifest-driven library helpers cover those in\n * `@llui/cli publish-deps` (v2c, deferred).\n * - The walker emits `llui/opaque-view-call` diagnostics for helpers\n * it can't classify; in dev these surface as Vite warnings. Set\n * `crossFile: 'silent'` to suppress the diagnostics while still\n * getting the path merging.\n *\n * Default `false` — preserves pre-v2c per-file behavior. Enable\n * explicitly to opt in to the cross-file resolution.\n */\n crossFile?: boolean | 'silent'\n}\n\n/**\n * Reserved for future agent-server config. Empty today — opaque tokens\n * (post-0.0.35) need no signing key, and the dev server hard-codes the\n * identity resolver to `'dev-user'`. The shape is kept so callers can\n * pass `agent: { ... }` and we can grow options without churning the\n * public type.\n */\nexport type AgentPluginConfig = Record<string, never>\n\n/**\n * Does `@llui/mcp` resolve from `root`'s node_modules? Uses\n * `require.resolve` so monorepo workspaces and hoisted installs both\n * work. Catches failures silently — the only consequence is that we\n * leave `mcpPort` disabled, which is the safe default.\n */\nfunction hasMcpPackage(root: string): boolean {\n try {\n const req = createRequire(resolve(root, 'package.json'))\n req.resolve('@llui/mcp/package.json')\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Resolve the path to the llui-mcp CLI entry. Reads `bin.llui-mcp`\n * from @llui/mcp's package.json and joins it against the package\n * directory. Returns null if @llui/mcp isn't resolvable.\n */\nfunction resolveMcpCliPath(root: string): string | null {\n try {\n const req = createRequire(resolve(root, 'package.json'))\n const pkgJsonPath = req.resolve('@llui/mcp/package.json')\n const pkgJson = JSON.parse(readFileSync(pkgJsonPath, 'utf8')) as {\n bin?: string | Record<string, string>\n }\n const binEntry = typeof pkgJson.bin === 'string' ? pkgJson.bin : pkgJson.bin?.['llui-mcp']\n if (!binEntry) return null\n return resolve(dirname(pkgJsonPath), binEntry)\n } catch {\n return null\n }\n}\n\ntype AgentServerInstance = {\n router: (req: Request) => Promise<Response | null>\n wsUpgrade: (\n req: import('http').IncomingMessage,\n socket: import('stream').Duplex,\n head: Buffer,\n ) => void\n}\n\n/**\n * Dynamically load @llui/agent/server relative to the app root and\n * construct an agent server instance. Returns null if @llui/agent isn't\n * installed — the plugin degrades to \"prod schema emission only\" mode.\n */\nasync function loadAgentServer(\n appRoot: string,\n _cfg: AgentPluginConfig,\n): Promise<AgentServerInstance | null> {\n let serverModule: {\n createLluiAgentServer: (opts: {\n identityResolver?: (req: Request) => Promise<string | null>\n }) => AgentServerInstance\n }\n try {\n // Walk up from the app root to find node_modules/@llui/agent. Works\n // for both pnpm workspace and regular npm installs. Direct file-system\n // walk avoids \"exports\" / \"subpath './package.json'\" gymnastics that\n // require.resolve and Node's module resolver disagree on.\n const pkgDir = findPackageDir(appRoot, '@llui/agent')\n if (!pkgDir) throw new Error('not found in any ancestor node_modules')\n const pkg = JSON.parse(readFileSync(resolve(pkgDir, 'package.json'), 'utf8')) as {\n exports?: Record<string, { import?: string } | string>\n }\n const serverExport = pkg.exports?.['./server']\n const rel = typeof serverExport === 'string' ? serverExport : serverExport?.import\n if (!rel) throw new Error('missing ./server export in package.json')\n const modUrl = new URL(`file://${resolve(pkgDir, rel)}`).href\n serverModule = (await import(modUrl)) as typeof serverModule\n } catch (e) {\n console.warn(\n '[llui] agent: true is set but `@llui/agent` could not be loaded: ' +\n (e instanceof Error ? e.message : String(e)),\n )\n return null\n }\n\n // The pre-0.0.35 agent server required an HMAC signingKey for JWT\n // tokens. The opaque-token rewrite removed that option; the dev\n // server here just calls the factory with no auth config — the\n // in-memory token store is the source of truth.\n return serverModule.createLluiAgentServer({\n identityResolver: async () => 'dev-user',\n })\n}\n\n/**\n * Register the agent middleware + WS upgrade on the Vite dev server.\n * Must be called synchronously from configureServer so registration\n * happens BEFORE Vite installs its catch-all SPA fallback.\n */\nfunction registerAgentMiddleware(server: ViteDevServer, agent: AgentServerInstance): void {\n // Connect-style middleware. Vite's middleware chain runs in order, so\n // synchronous registration during configureServer places us ahead of\n // Vite's catch-all fallback.\n //\n // Dual-path: handle the canonical `/agent/*` (every project) AND\n // `/cdn-cgi/agent/*` (defensive — Cloudflare's `@cloudflare/vite-plugin`\n // routes everything except `/cdn-cgi/*` to the worker, which means\n // canonical `/agent/*` paths are shadowed in cloudflare-vite projects).\n // The cdn-cgi prefix is stripped before forwarding so the agent\n // server's router sees its own canonical paths regardless of which\n // public URL the client used. This matches the dual-path strategy\n // used for `/__llui_mcp_status`.\n server.middlewares.use((req, res, next) => {\n const url = req.url ?? '/'\n let stripped: string | null = null\n if (url.startsWith('/agent/') || url === '/agent') stripped = url\n else if (url.startsWith('/cdn-cgi/agent/') || url === '/cdn-cgi/agent') {\n stripped = url.slice('/cdn-cgi'.length)\n }\n if (stripped === null) {\n next()\n return\n }\n // Rewrite the request URL in-place so handleAgentRequest's path\n // matching sees `/agent/*`. Connect middleware can mutate req.url\n // for downstream handlers; we own the request from here.\n req.url = stripped\n void handleAgentRequest(req, res, agent.router).catch((e) => {\n console.error('[llui] agent middleware error:', e)\n next(e)\n })\n })\n\n // WS upgrade: only /agent/ws goes to the agent. Vite's own HMR upgrade\n // uses a different path and runs as a separate listener on the same\n // event, so this filter keeps both coexisting. Same dual-path\n // accommodation as the HTTP middleware — the WS-upgrade path doesn't\n // actually matter to most cloudflare setups (the worker handles WS\n // upgrades natively), but keeping the parity simplifies the mental\n // model for ops.\n server.httpServer?.on('upgrade', (req, socket, head) => {\n const url = new URL(req.url ?? '/', 'http://localhost')\n if (url.pathname === '/agent/ws' || url.pathname === '/cdn-cgi/agent/ws') {\n agent.wsUpgrade(req, socket, head)\n }\n })\n\n console.info(\n '[llui] agent dev endpoints active: POST /agent/mint, WS /agent/ws, LAP /agent/lap/v1/* (also reachable under /cdn-cgi/agent/* for cloudflare-vite parity)',\n )\n}\n\n/**\n * Walk up from `start` looking for `node_modules/<pkgName>`. Returns the\n * absolute path to the package directory, or null if not found.\n */\nfunction findPackageDir(start: string, pkgName: string): string | null {\n let dir = resolve(start)\n while (true) {\n const candidate = resolve(dir, 'node_modules', pkgName)\n if (existsSync(resolve(candidate, 'package.json'))) return candidate\n const parent = dirname(dir)\n if (parent === dir) return null\n dir = parent\n }\n}\n\n/** Convert a Node http req → Web Request, call router, write the response. */\nasync function handleAgentRequest(\n req: import('http').IncomingMessage,\n res: import('http').ServerResponse,\n router: (req: Request) => Promise<Response | null>,\n): Promise<void> {\n const method = req.method ?? 'GET'\n const url = req.url ?? '/'\n const headers: Record<string, string> = {}\n for (const [k, v] of Object.entries(req.headers)) {\n if (v === undefined) continue\n headers[k] = Array.isArray(v) ? v.join(', ') : v\n }\n let body: BodyInit | undefined\n if (!['GET', 'HEAD'].includes(method)) {\n const chunks: Buffer[] = []\n for await (const chunk of req) chunks.push(chunk as Buffer)\n if (chunks.length > 0) body = new Uint8Array(Buffer.concat(chunks))\n }\n const origin = `http://${req.headers.host ?? 'localhost'}`\n const webReq = new Request(`${origin}${url}`, { method, headers, body })\n const webRes = await router(webReq)\n if (!webRes) {\n res.statusCode = 404\n res.end()\n return\n }\n res.statusCode = webRes.status\n webRes.headers.forEach((v, k) => res.setHeader(k, v))\n const buf = Buffer.from(await webRes.arrayBuffer())\n res.end(buf)\n}\n\n/**\n * Build the cross-file `ts.Program` for v2c pipeline integration. Scans\n * the project root's `tsconfig.json` (or a sensible default) to collect\n * rootNames. Returns null if no tsconfig is reachable — caller falls\n * back to per-file path collection silently.\n *\n * Prototype: builds once, never refreshes. v2c's incremental program is\n * the natural upgrade.\n */\nasync function buildCrossFileProgram(root: string): Promise<import('typescript').Program | null> {\n try {\n const ts = (await import('typescript')).default\n const tsconfigPath = ts.findConfigFile(root, ts.sys.fileExists, 'tsconfig.json')\n if (!tsconfigPath) return null\n const parsed = ts.getParsedCommandLineOfConfigFile(tsconfigPath, undefined, {\n ...ts.sys,\n onUnRecoverableConfigFileDiagnostic: () => {},\n })\n if (!parsed) return null\n const program = ts.createProgram({\n rootNames: parsed.fileNames,\n options: { ...parsed.options, noEmit: true, skipLibCheck: true },\n })\n return program\n } catch {\n return null\n }\n}\n\nexport default function llui(options: LluiPluginOptions = {}): Plugin {\n let devMode = false\n // `mcpPort` + `mcpMode` are resolved lazily in `configResolved` so we\n // can check for @llui/mcp in the consuming project's node_modules.\n // - `options.mcpPort === false` → disabled\n // - explicit number → wire-only (user manages the server)\n // - undefined + @llui/mcp found → spawn (plugin starts llui-mcp --http)\n // - undefined + no @llui/mcp → disabled\n let mcpPort: number | null = null\n let mcpMode: 'disabled' | 'wire' | 'spawn' = 'disabled'\n let mcpCliPath: string | null = null\n let mcpChild: ChildProcess | null = null\n const verbose = options.verbose === true\n const agent = options.agent ?? false\n const crossFileMode: false | true | 'silent' = options.crossFile ?? false\n // The Program is built lazily on first transform when crossFile is\n // enabled; cached afterwards for reuse. ts.Program is immutable —\n // file changes are not reflected without a rebuild (documented above).\n let crossFileProgram: import('typescript').Program | null = null\n let crossFileProgramInit = false\n let crossFileRoot = process.cwd()\n const agentConfig: AgentPluginConfig = typeof agent === 'object' ? agent : {}\n // Agent server instance — loaded in configResolved (async), registered\n // in configureServer (sync). Null until loaded, or if @llui/agent isn't\n // installed.\n let agentServer: {\n router: (req: Request) => Promise<Response | null>\n wsUpgrade: (\n req: import('http').IncomingMessage,\n socket: import('stream').Duplex,\n head: Buffer,\n ) => void\n } | null = null\n\n // File-based handshake with @llui/mcp. The MCP server writes a marker\n // file when its bridge starts; we watch it and send a Vite HMR custom\n // event so the browser can call __lluiConnect() automatically — without\n // retry spam, regardless of whether MCP or Vite started first.\n const activeFilePath = resolve(findWorkspaceRoot(), 'node_modules/.cache/llui-mcp/active.json')\n let mcpWatcher: FSWatcher | null = null\n let dirWatcher: FSWatcher | null = null\n // Cached once Vite's HTTP server emits `listening`. `stampDevUrl()`\n // uses this to write the URL into the marker file — either immediately\n // (if MCP already started and wrote one) or later when the marker\n // appears via the directory watcher (MCP-starts-after-Vite path).\n let cachedDevUrl: string | null = null\n\n function readMcpMarker(): { port: number; devUrl?: string } | null {\n try {\n if (!existsSync(activeFilePath)) return null\n const data = JSON.parse(readFileSync(activeFilePath, 'utf8')) as {\n port?: number\n devUrl?: string\n }\n if (typeof data.port !== 'number') return null\n return { port: data.port, ...(data.devUrl ? { devUrl: data.devUrl } : {}) }\n } catch {\n return null\n }\n }\n\n /**\n * Idempotently write `cachedDevUrl` into the marker file. No-op if the\n * URL hasn't been captured yet (Vite hasn't emitted `listening`) or if\n * the marker file doesn't exist (MCP hasn't started yet). Covers both\n * orderings — the listening hook calls this after caching, and the\n * directory watcher calls it when the marker appears later.\n */\n function stampDevUrl(): void {\n if (cachedDevUrl === null) return\n if (!existsSync(activeFilePath)) return\n try {\n const marker = JSON.parse(readFileSync(activeFilePath, 'utf8')) as Record<string, unknown>\n if (marker.devUrl === cachedDevUrl) return\n marker.devUrl = cachedDevUrl\n writeFileSync(activeFilePath, JSON.stringify(marker))\n } catch {\n // Best-effort — failure to update the marker should not crash Vite\n }\n }\n\n function notifyMcpReady(server: ViteDevServer): void {\n const marker = readMcpMarker()\n if (marker === null) return\n server.ws.send({ type: 'custom', event: 'llui:mcp-ready', data: marker })\n }\n\n function notifyMcpOffline(server: ViteDevServer): void {\n server.ws.send({ type: 'custom', event: 'llui:mcp-offline', data: {} })\n }\n\n return {\n name: 'llui',\n enforce: 'pre',\n\n async configResolved(config) {\n devMode = config.command === 'serve' || config.mode === 'development'\n crossFileRoot = config.root\n // Load @llui/agent here (async) so we can register middleware\n // synchronously in configureServer — which must happen BEFORE Vite\n // installs its catch-all SPA/fallback middleware.\n if (agent && devMode) {\n agentServer = await loadAgentServer(config.root, agentConfig)\n }\n if (options.mcpPort === false) {\n mcpMode = 'disabled'\n mcpPort = null\n } else if (typeof options.mcpPort === 'number') {\n mcpMode = 'wire'\n mcpPort = options.mcpPort\n } else if (hasMcpPackage(config.root)) {\n mcpCliPath = resolveMcpCliPath(config.root)\n if (mcpCliPath) {\n mcpMode = 'spawn'\n mcpPort = 5200\n } else {\n mcpMode = 'wire'\n mcpPort = 5200\n }\n } else {\n mcpMode = 'disabled'\n mcpPort = null\n }\n },\n\n configureServer(server) {\n // Agent dev endpoints — runs regardless of mcp state. Must be before\n // any early-returns below. Registration is synchronous because\n // agentServer was preloaded in configResolved.\n if (agentServer) {\n registerAgentMiddleware(server, agentServer)\n }\n\n if (mcpPort === null) {\n // #3 diagnostic: MCP server is running but the plugin is opted\n // out. Users in this state usually don't realize the mismatch —\n // loud-and-early log saves the \"why isn't my MCP attached\" hunt.\n if (existsSync(activeFilePath)) {\n console.warn(\n `[llui] @llui/mcp server is running (marker at ${activeFilePath}) ` +\n `but the Vite plugin is opted out (mcpPort: false, or @llui/mcp ` +\n `isn't a dep of this project). Add \\`llui({ mcpPort: 5200 })\\` ` +\n `to vite.config to wire them up, or remove the marker file and ` +\n `stop the MCP server if the mismatch was unintended.`,\n )\n }\n return\n }\n\n // Spawn mode: plugin launches llui-mcp as a child process so\n // `pnpm dev` handles the whole stack. Skip spawning when a marker\n // already exists — something (usually a separate llui-mcp process\n // started before Vite) is already listening. The existing wire\n // behavior takes over from there.\n if (mcpMode === 'spawn' && mcpCliPath !== null && !existsSync(activeFilePath)) {\n mcpChild = spawn(process.execPath, [mcpCliPath, '--http', String(mcpPort)], {\n stdio: ['ignore', 'pipe', 'pipe'],\n env: { ...process.env, LLUI_MCP_PORT: String(mcpPort) },\n })\n mcpChild.stdout?.on('data', (buf: Buffer) => {\n process.stdout.write(`[mcp] ${buf.toString()}`)\n })\n mcpChild.stderr?.on('data', (buf: Buffer) => {\n process.stderr.write(`[mcp] ${buf.toString()}`)\n })\n mcpChild.on('exit', (code) => {\n if (code !== 0 && code !== null) {\n console.warn(`[llui] @llui/mcp child exited with code ${code}`)\n }\n mcpChild = null\n })\n const killChild = (): void => {\n if (mcpChild && !mcpChild.killed) mcpChild.kill('SIGTERM')\n }\n server.httpServer?.on('close', killChild)\n process.once('exit', killChild)\n }\n\n // HTTP endpoint: the browser fetches this on load to discover the\n // current MCP port. Avoids the race where HMR events sent before\n // the import.meta.hot listener registers get dropped — and lets\n // the browser connect to the actual port (which may differ from\n // the compile-time default if MCP was started with LLUI_MCP_PORT).\n //\n // Two paths register the same handler:\n // * `/__llui_mcp_status` — canonical, served from any Vite\n // project.\n // * `/cdn-cgi/llui_mcp_status` — fallback for projects that\n // bundle `@cloudflare/vite-plugin`. The cloudflare plugin\n // intercepts every HTTP request in `configureServer` and\n // routes it to the worker, except `/cdn-cgi/*` which it\n // explicitly lets through. Without this fallback, MCP\n // auto-discovery silently fails under workerd.\n const mcpStatusHandler = (_req: unknown, res: ServerResponseLike): void => {\n const marker = readMcpMarker()\n if (marker === null) {\n res.statusCode = 404\n res.end()\n return\n }\n res.statusCode = 200\n res.setHeader('content-type', 'application/json')\n res.end(JSON.stringify({ port: marker.port }))\n }\n server.middlewares.use('/__llui_mcp_status', mcpStatusHandler)\n server.middlewares.use('/cdn-cgi/llui_mcp_status', mcpStatusHandler)\n\n // Watch the marker file for create/delete. fs.watch on the parent\n // directory catches both events; the file itself may not exist\n // when we start watching.\n const dir = dirname(activeFilePath)\n try {\n // Watch the parent directory for the marker file appearing/disappearing\n const watchDir = (): void => {\n if (!existsSync(dir)) return\n dirWatcher = fsWatch(dir, (_event, filename) => {\n if (filename !== 'active.json') return\n if (existsSync(activeFilePath)) {\n // Stamp BEFORE notifying so the `llui:mcp-ready` payload\n // carries the cached devUrl. This is the MCP-after-Vite\n // path: listening already fired and cached the URL; the\n // marker is only now appearing.\n stampDevUrl()\n notifyMcpReady(server)\n } else {\n notifyMcpOffline(server)\n }\n })\n }\n if (existsSync(dir)) {\n watchDir()\n } else {\n // Parent directory doesn't exist yet — poll for it briefly\n const poll = setInterval(() => {\n if (existsSync(dir)) {\n clearInterval(poll)\n watchDir()\n }\n }, 1000)\n // Clean up the poller if vite shuts down before MCP starts\n server.httpServer?.on('close', () => clearInterval(poll))\n }\n } catch {\n // fs.watch can fail on some filesystems — degrade silently\n }\n\n // Re-send the ready event when a new HMR client connects, in case\n // the page loads while MCP is already running.\n server.ws.on('connection', () => {\n if (existsSync(activeFilePath)) notifyMcpReady(server)\n })\n\n server.httpServer?.on('close', () => {\n mcpWatcher?.close()\n dirWatcher?.close()\n mcpWatcher = null\n dirWatcher = null\n })\n\n // Once Vite's HTTP server is listening, cache our dev URL and stamp\n // it into the marker file. Two orderings are possible:\n // (a) MCP started FIRST → marker exists now → stampDevUrl() writes\n // it, and we broadcast llui:mcp-ready so the browser picks up\n // the devUrl without relying on an incidental fs.watch tick\n // (which can miss on NFS/SMB).\n // (b) MCP will start LATER → marker doesn't exist yet → stamp is a\n // no-op. When MCP eventually writes the marker, the directory\n // watcher fires, calls stampDevUrl(), and notifies.\n server.httpServer?.once('listening', () => {\n const address = server.httpServer?.address()\n if (!address || typeof address !== 'object') return\n const host =\n address.address === '::' || address.address === '0.0.0.0' ? 'localhost' : address.address\n cachedDevUrl = `http://${host}:${address.port}`\n stampDevUrl()\n // Broadcast after stamping so the payload carries devUrl. Only\n // fires in case (a) — notifyMcpReady no-ops when the marker is\n // absent.\n notifyMcpReady(server)\n })\n\n // ── Agent dev endpoints ──────────────────────────────────────\n // When `agent: true` (or `agent: {...}`), auto-mount /agent/* on\n // the Vite dev server so `pnpm dev` has working agent endpoints.\n // Users with a custom server.ts (SSR apps) mount createLluiAgentServer\n // themselves — configureServer also fires in middleware mode, but\n // there server.httpServer is null so the upgrade hook is a no-op.\n },\n\n async transform(code, id, options) {\n if (!id.endsWith('.ts') && !id.endsWith('.tsx')) return\n\n // `'use client'` directive — SSR builds replace the module with a\n // stub so top-level imports and side effects never run on the\n // server. Client builds pass through to the normal transform; the\n // directive is effectively a no-op on the client.\n if (options?.ssr && hasUseClientDirective(code)) {\n const result = transformUseClientSsr(code, id)\n if (result) {\n const cwd = process.cwd()\n const rel = relative(cwd, id)\n const display = rel.startsWith('..') ? id : rel\n for (const warning of result.warnings) {\n this.warn(`${display}: ${warning}`)\n }\n return { code: result.output, map: { mappings: '' } }\n }\n }\n\n // Pre-resolve cross-file type sources for any `component<S, M, E>()`\n // call in this file. The extractors look for `type Msg = ...` etc.\n // in a single source string; if the user keeps `Msg` in a sibling\n // file, the local extraction returns null and the plugin emits no\n // annotations. Pre-resolution chases imports and re-exports to\n // find the declaring file, so the schema/annotation extractors run\n // against the right source. See cross-file-resolver.ts.\n //\n // `this.resolve` may be undefined in test harnesses that call the\n // hook directly without going through Rollup; in that case skip\n // pre-resolution and the local extractors handle whatever's in\n // the source string.\n const resolverAvailable = typeof this.resolve === 'function'\n const [typeSources, preExtracted] = resolverAvailable\n ? await Promise.all([\n preResolveTypeSources(code, id, this.resolve.bind(this)),\n // Cross-file + composition-aware extraction. Replaces the\n // file-local sync extractors when active. Without this step\n // a `type Msg = ImportedFoo | { type: 'extra' }`\n // composition would only see the inline `'extra'` variant\n // and silently emit half-annotations.\n preExtractCompositional(code, id, this.resolve.bind(this)),\n ])\n : [undefined, undefined]\n\n // Cross-file path resolution (v2c pipeline integration). When\n // enabled, the plugin reuses a shared `ts.Program` across all\n // transform calls and asks the engine for the union of paths read\n // through in-repo view-helpers. Builds the Program on first call.\n let crossFilePaths: ReadonlySet<string> | undefined\n if (crossFileMode !== false) {\n if (!crossFileProgramInit) {\n crossFileProgramInit = true\n crossFileProgram = await buildCrossFileProgram(crossFileRoot)\n }\n if (crossFileProgram) {\n const sf = crossFileProgram.getSourceFile(id)\n if (sf) {\n try {\n crossFilePaths = crossFileAccessorPaths(crossFileProgram, sf)\n } catch (err) {\n if (crossFileMode !== 'silent') {\n this.warn(\n `[llui] cross-file walker failed on ${id}: ${(err as Error).message}. ` +\n `Falling back to per-file path collection.`,\n )\n }\n }\n }\n }\n }\n\n const result = transformLlui(\n code,\n id,\n devMode,\n Boolean(agent),\n mcpPort,\n verbose,\n typeSources,\n preExtracted,\n crossFilePaths,\n )\n if (!result) return undefined\n\n // Surface compiler diagnostics to Rollup. Severity 'error' fails\n // the transform (and the build); 'warning' / 'info' report\n // non-fatally. Locations are 1-based for Rollup.\n for (const diag of result.diagnostics) {\n const loc = {\n file: diag.location.file,\n line: diag.location.range.start.line + 1,\n column: diag.location.range.start.column,\n }\n const formatted = `[${diag.id}] ${diag.message}`\n if (diag.severity === 'error') {\n this.error({ message: formatted, loc })\n } else if (diag.severity === 'warning') {\n this.warn({ message: formatted, loc })\n } else if (verbose) {\n console.info(`[llui] ${formatted}`)\n }\n }\n\n // Apply per-statement edits via MagicString for accurate source maps.\n // Untouched statements keep their original positions.\n const s = new MagicString(code)\n for (const edit of result.edits) {\n if (edit.start === edit.end) {\n // Insert at position — appendRight for middle, append for end-of-file\n if (edit.start === code.length) s.append(edit.replacement)\n else s.appendRight(edit.start, edit.replacement)\n } else {\n s.overwrite(edit.start, edit.end, edit.replacement)\n }\n }\n\n return {\n code: s.toString(),\n map: s.generateMap({ source: id, includeContent: true, hires: true }),\n }\n },\n\n // Build-time integrity check (v2a §2.4; shared.md §20.12). Every\n // compiled component carries `__lluiCompilerEmitted: 1`; we scan the\n // final bundle for that literal text. Zero occurrences in a production\n // build means the project routed its TS through some other pipeline\n // and the runtime would silently degrade to FULL_MASK — fail closed.\n //\n // Dev mode skips the check: dev users have HMR + warnings to find\n // misconfiguration interactively. SSR builds also skip — the SSR\n // pass may emit a stub module bundle that legitimately contains no\n // components.\n generateBundle(opts, bundle) {\n if (devMode) return\n if (opts.dir === undefined && opts.file === undefined) return\n // The `ssr` flag on the output options is the cleanest signal for\n // SSR builds; rollup adds it when Vite's build.ssr is set.\n if ((opts as { ssr?: boolean }).ssr) return\n let markerCount = 0\n for (const chunk of Object.values(bundle)) {\n if (chunk.type !== 'chunk') continue\n // Count literal occurrences of the marker. `__lluiCompilerEmitted`\n // is unique enough that false positives from user source are\n // implausible.\n let from = 0\n const code = chunk.code\n while (true) {\n const i = code.indexOf('__lluiCompilerEmitted', from)\n if (i < 0) break\n markerCount++\n from = i + '__lluiCompilerEmitted'.length\n }\n }\n if (markerCount === 0) {\n this.error(\n '[llui] integrity check failed: no compiled `component()` calls found in ' +\n 'this bundle. Either the project has no LLui components (remove ' +\n '`@llui/vite-plugin` from vite.config.ts), or the plugin order is wrong ' +\n 'and another transform is consuming TS before `@llui/vite-plugin` runs ' +\n \"(check `enforce: 'pre'`). The check looks for the `__lluiCompilerEmitted` \" +\n 'property the compiler injects into every component. See ' +\n 'docs/proposals/v2-compiler/v2a.md §2.4.',\n )\n }\n },\n }\n}\n"]}
@@ -1,7 +1,5 @@
1
1
  import ts from 'typescript';
2
- import { extractMsgSchema, extractEffectSchema } from './msg-schema.js';
3
- import { extractMsgAnnotations } from './msg-annotations.js';
4
- import { extractStateSchema } from './state-schema.js';
2
+ import { extractMsgSchema, extractEffectSchema, extractMsgAnnotations, extractStateSchema } from '@llui/compiler';
5
3
  /**
6
4
  * Transform a source file containing @llui/dom imports.
7
5
  * Returns the transformed source or null if no transformation needed.
@@ -1 +1 @@
1
- {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../src/transform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAA;AAO3B,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EAIpB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,qBAAqB,EAA2B,MAAM,sBAAsB,CAAA;AACrF,OAAO,EAAE,kBAAkB,EAAkB,MAAM,mBAAmB,CAAA;AAiOtE;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,EAAE,MAAM,CAAA;CACpB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5C,GAAG,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;IAC1C,MAAM,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;CAC9C;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAA;IAC/C,cAAc,CAAC,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAA;IACzD,WAAW,CAAC,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAA;IACnD,YAAY,CAAC,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAA;CACtD;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,UAAQ,EACf,iBAAiB,UAAQ,EACzB,OAAO,GAAE,MAAM,GAAG,IAAW,EAC7B,OAAO,UAAQ,EACf,WAAW,CAAC,EAAE,mBAAmB,EACjC,YAAY,CAAC,EAAE,mBAAmB,GACjC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,aAAa,EAAE,CAAA;CAAE,GAAG,IAAI,CAwYnD;AAgiJD,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,wBAAwB,GAAG,IAAI,CAoGjC;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CA4B7D;AAID;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI3D;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,GAAG,MAAM,GAAG,IAAI,CAcrF;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CASzF;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC,GAChE,MAAM,CAYR"}
1
+ {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../src/transform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAA;AAC3B,OAAO,EAKL,gBAAgB,EAChB,mBAAmB,EAInB,qBAAqB,EAErB,kBAAkB,EAMnB,MAAM,gBAAgB,CAAA;AA8NvB;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,WAAW,EAAE,MAAM,CAAA;CACpB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5C,GAAG,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;IAC1C,MAAM,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;CAC9C;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAA;IAC/C,cAAc,CAAC,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAA;IACzD,WAAW,CAAC,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAA;IACnD,YAAY,CAAC,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAA;CACtD;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,UAAQ,EACf,iBAAiB,UAAQ,EACzB,OAAO,GAAE,MAAM,GAAG,IAAW,EAC7B,OAAO,UAAQ,EACf,WAAW,CAAC,EAAE,mBAAmB,EACjC,YAAY,CAAC,EAAE,mBAAmB,GACjC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,aAAa,EAAE,CAAA;CAAE,GAAG,IAAI,CAwYnD;AAo8ID,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,wBAAwB,GAAG,IAAI,CAoGjC;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CA4B7D;AAID;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI3D;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,GAAG,MAAM,GAAG,IAAI,CAcrF;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CASzF;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC,GAChE,MAAM,CAYR"}
package/dist/transform.js CHANGED
@@ -1,12 +1,5 @@
1
1
  import ts from 'typescript';
2
- import { collectDeps } from './collect-deps.js';
3
- import { resolveLocalConstInitializer, resolveAccessorBody, isMemoCallWithArrowArg, } from './accessor-resolver.js';
4
- import { extractMsgSchema, extractEffectSchema, isRichField, } from './msg-schema.js';
5
- import { extractMsgAnnotations } from './msg-annotations.js';
6
- import { extractStateSchema } from './state-schema.js';
7
- import { computeSchemaHash } from './schema-hash.js';
8
- import { tagDispatchHandlers, injectScopeVariantRegistrations } from './binding-descriptors.js';
9
- import { compilerCache } from './compiler-cache.js';
2
+ import { collectDeps, resolveLocalConstInitializer, resolveAccessorBody, isMemoCallWithArrowArg, extractMsgSchema, extractEffectSchema, isRichField, extractMsgAnnotations, extractStateSchema, computeSchemaHash, tagDispatchHandlers, injectScopeVariantRegistrations, compilerCache, } from '@llui/compiler';
10
3
  function createMaskLiteral(f, mask) {
11
4
  if (mask >= 0)
12
5
  return f.createNumericLiteral(mask);
@@ -1097,46 +1090,20 @@ function tryInjectDirty(node, fieldBits, f, fieldBitsHi = new Map()) {
1097
1090
  return null;
1098
1091
  }
1099
1092
  }
1100
- // Build __dirty: (o, n) => (Object.is(o.field, n.field) ? 0 : bit) | ...
1101
- // Compare at top-level field (depth 1) nested path changes within a
1102
- // field must trigger the bit even if the specific sub-path isn't tracked.
1103
- // e.g., route.page tracked but route.data changes must fire.
1093
+ // Top-level field aggregated bit mask. Sub-paths under one field
1094
+ // (`route.page`, `route.data`) collapse into a single entry so
1095
+ // `tryBuildHandlers` and `__maskLegend` can reason per-field. Positions
1096
+ // 0..30 live here; 31..61 in the parallel high-word map below.
1104
1097
  const topLevelBits = new Map();
1105
1098
  for (const [path, bit] of fieldBits) {
1106
1099
  const topField = path.split('.')[0];
1107
1100
  topLevelBits.set(topField, (topLevelBits.get(topField) ?? 0) | bit);
1108
1101
  }
1109
- // Parallel high-word map: top-level fields whose paths fall at bit
1110
- // positions 31..61 contribute here instead of (or in addition to)
1111
- // `topLevelBits`. A field with sub-paths split across both words —
1112
- // e.g., `user.name` at position 30 and `user.email` at position 31 —
1113
- // ends up in both maps under the same top-level key.
1114
1102
  const topLevelBitsHi = new Map();
1115
1103
  for (const [path, bit] of fieldBitsHi) {
1116
1104
  const topField = path.split('.')[0];
1117
1105
  topLevelBitsHi.set(topField, (topLevelBitsHi.get(topField) ?? 0) | bit);
1118
1106
  }
1119
- const comparisons = [];
1120
- for (const [field, bit] of topLevelBits) {
1121
- const oAccess = buildAccess(f, 'o', [field]);
1122
- const nAccess = buildAccess(f, 'n', [field]);
1123
- comparisons.push(f.createParenthesizedExpression(f.createConditionalExpression(f.createCallExpression(f.createPropertyAccessExpression(f.createIdentifier('Object'), 'is'), undefined, [oAccess, nAccess]), f.createToken(ts.SyntaxKind.QuestionToken), f.createNumericLiteral(0), f.createToken(ts.SyntaxKind.ColonToken), createMaskLiteral(f, bit))));
1124
- }
1125
- let dirtyBody = comparisons[0];
1126
- for (let i = 1; i < comparisons.length; i++) {
1127
- dirtyBody = f.createBinaryExpression(dirtyBody, ts.SyntaxKind.BarToken, comparisons[i]);
1128
- }
1129
- // Fallback: if no tracked bit fired but the state reference changed, some
1130
- // untracked field must have changed — return FULL_MASK so bindings whose
1131
- // accessors came from external modules (spread parts) still fire.
1132
- // tracked || (Object.is(o, n) ? 0 : FULL_MASK)
1133
- const fallback = f.createParenthesizedExpression(f.createConditionalExpression(f.createCallExpression(f.createPropertyAccessExpression(f.createIdentifier('Object'), 'is'), undefined, [f.createIdentifier('o'), f.createIdentifier('n')]), f.createToken(ts.SyntaxKind.QuestionToken), f.createNumericLiteral(0), f.createToken(ts.SyntaxKind.ColonToken), createMaskLiteral(f, -1)));
1134
- dirtyBody = f.createBinaryExpression(f.createParenthesizedExpression(dirtyBody), ts.SyntaxKind.BarBarToken, fallback);
1135
- const dirtyFn = f.createArrowFunction(undefined, undefined, [
1136
- f.createParameterDeclaration(undefined, undefined, 'o'),
1137
- f.createParameterDeclaration(undefined, undefined, 'n'),
1138
- ], undefined, f.createToken(ts.SyntaxKind.EqualsGreaterThanToken), dirtyBody);
1139
- const dirtyProp = f.createPropertyAssignment('__dirty', dirtyFn);
1140
1107
  // __maskLegend: maps each top-level state field to the bit(s) that fire when
1141
1108
  // it changes. Lets introspection tools decode runtime dirty masks to field names.
1142
1109
  const legendProps = [];
@@ -1149,8 +1116,7 @@ function tryInjectDirty(node, fieldBits, f, fieldBitsHi = new Map()) {
1149
1116
  const legendProp = f.createPropertyAssignment('__maskLegend', f.createObjectLiteralExpression(legendProps, false));
1150
1117
  // Structural mask — used by both __update and __handlers
1151
1118
  const structuralMask = computeStructuralMask(configArg, fieldBits);
1152
- const phase2Mask = computePhase2Mask(configArg, fieldBits);
1153
- const updateBody = buildUpdateBody(f, structuralMask, phase2Mask);
1119
+ const updateBody = buildUpdateBody(f, structuralMask);
1154
1120
  // `dHi` is the high-word dirty mask, appended as the trailing
1155
1121
  // positional arg so stale 5-param compiled bundles continue to gate
1156
1122
  // correctly: the runtime calls `__update(s, d, b, bl, p, dHi)`,
@@ -1170,21 +1136,14 @@ function tryInjectDirty(node, fieldBits, f, fieldBitsHi = new Map()) {
1170
1136
  // Analyzes the update() switch/case and generates direct handlers
1171
1137
  // that bypass the generic Phase 1/2 pipeline for single-message updates.
1172
1138
  const handlersProp = tryBuildHandlers(configArg, topLevelBits, topLevelBitsHi, structuralMask, f);
1173
- // Both `__update` and `__handlers` carry two-word gates now —
1174
- // `__update`'s Phase 1 block loop uses `(mask & d) | (maskHi & dHi)`
1175
- // with `dHi` as the trailing parameter (defaults to 0 for backward
1176
- // compat with old 5-arg call sites), and `__handlers` passes
1177
- // `caseDirtyHi` to `_handleMsg` which gates blocks against both
1178
- // words. Safe to emit for any prefix count.
1179
- // `__dirty` emission was removed in 2026-05: `__prefixes` is strictly
1180
- // more precise (per-prefix rather than per-top-level-field), supports
1181
- // 62 paths via two-word masks, and the runtime throws if it sees a
1182
- // hand-authored `__dirty`. `legendProp` (`__maskLegend`) is still
1183
- // emitted for the agent layer's introspection — it surfaces the
1184
- // top-level-field-to-bit mapping for `whyDidUpdate` / dispatch
1185
- // tracing without depending on `__dirty` at runtime.
1186
- void dirtyFn;
1187
- void dirtyProp;
1139
+ // Both `__update` and `__handlers` carry two-word gates: `__update`'s
1140
+ // Phase 1 block loop uses `(mask & d) | (maskHi & dHi)`, and
1141
+ // `__handlers` passes `caseDirtyHi` to `_handleMsg` which gates blocks
1142
+ // against both words. `dHi` defaults to 0 so any stale 5-arg call site
1143
+ // still works. `__dirty` is no longer emitted — `__prefixes` (below)
1144
+ // is strictly more precise, and the runtime throws on hand-authored
1145
+ // `__dirty`. `__maskLegend` survives because the agent layer uses it
1146
+ // to decode runtime dirty masks back to top-level field names.
1188
1147
  const extraProps = [legendProp, updateProp];
1189
1148
  if (handlersProp)
1190
1149
  extraProps.push(handlersProp);
@@ -2099,17 +2058,6 @@ function computeStructuralMask(configArg, fieldBits) {
2099
2058
  walk(viewProp.initializer);
2100
2059
  return foundStructural ? mask || 0xffffffff | 0 : 0;
2101
2060
  }
2102
- /**
2103
- * Compute the OR of all component-level binding masks from text() calls
2104
- * and element bindings in the view. Returns 0 if no component-level bindings.
2105
- */
2106
- function computePhase2Mask(_configArg, _fieldBits) {
2107
- // For now, return FULL_MASK — a future pass can analyze all binding sites
2108
- // in the view to compute the precise aggregate. The key optimization is
2109
- // already in Phase 1 gating: when structuralMask doesn't intersect dirty,
2110
- // the entire reconciliation is skipped.
2111
- return 0xffffffff | 0;
2112
- }
2113
2061
  /**
2114
2062
  * Build the __update function body:
2115
2063
  * {
@@ -2142,7 +2090,7 @@ function computePhase2Mask(_configArg, _fieldBits) {
2142
2090
  * }
2143
2091
  * }
2144
2092
  */
2145
- function buildUpdateBody(f, structuralMask, _phase2Mask) {
2093
+ function buildUpdateBody(f, structuralMask) {
2146
2094
  const stmts = [];
2147
2095
  // Phase 1: structural block reconciliation, gated by aggregate mask
2148
2096
  if (structuralMask !== 0) {