@aihu/language-server 0.1.0 → 0.2.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/README.md +11 -9
- package/dist/bin.js +20685 -250
- package/dist/chunk-DcSSxlwY.js +30 -0
- package/dist/core/index.d.ts +1630 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +30 -2
- package/dist/core/index.js.map +1 -0
- package/dist/index-ROvxbbgq.d.ts +22204 -0
- package/dist/index-ROvxbbgq.d.ts.map +1 -0
- package/dist/server.d.ts +60 -9
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +19650 -172
- package/dist/server.js.map +1 -1
- package/dist/{core-BHishSOT.js → volar-plugin-cOusBZ0l.js} +952 -7
- package/dist/volar-plugin-cOusBZ0l.js.map +1 -0
- package/package.json +9 -4
- package/dist/core-BHishSOT.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"volar-plugin-cOusBZ0l.js","names":["exports"],"sources":["../../../node_modules/.bun/@volar+source-map@2.4.28/node_modules/@volar/source-map/lib/binarySearch.js","../../../node_modules/.bun/@volar+source-map@2.4.28/node_modules/@volar/source-map/lib/translateOffset.js","../../../node_modules/.bun/@volar+source-map@2.4.28/node_modules/@volar/source-map/lib/sourceMap.js","../../../node_modules/.bun/@volar+source-map@2.4.28/node_modules/@volar/source-map/index.js","../../compiler/js/codemods/macro-simplification/migrate.ts","../src/core/code-action.ts","../src/core/completion.ts","../src/core/diagnostics.ts","../src/core/hover.ts","../src/core/state-generator.ts","../src/core/volar-plugin.ts"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.binarySearch = binarySearch;\nfunction binarySearch(values, searchValue) {\n let low = 0;\n let high = values.length - 1;\n let match;\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n const midValue = values[mid];\n if (midValue < searchValue) {\n low = mid + 1;\n }\n else if (midValue > searchValue) {\n high = mid - 1;\n }\n else {\n low = mid;\n high = mid;\n match = mid;\n break;\n }\n }\n const finalLow = Math.max(Math.min(low, high, values.length - 1), 0);\n const finalHigh = Math.min(Math.max(low, high, 0), values.length - 1);\n return { low: finalLow, high: finalHigh, match };\n}\n//# sourceMappingURL=binarySearch.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.translateOffset = translateOffset;\nlet warned = false;\nfunction translateOffset(start, fromOffsets, toOffsets, fromLengths, toLengths = fromLengths, preferEnd = false) {\n const isSorted = fromOffsets.every((value, index) => index === 0 || fromOffsets[index - 1] <= value);\n if (!isSorted) {\n for (let i = 0; i < fromOffsets.length; i++) {\n const fromOffset = fromOffsets[i];\n const fromLength = fromLengths[i];\n if (start >= fromOffset && start <= fromOffset + fromLength) {\n const toLength = toLengths[i];\n const toOffset = toOffsets[i];\n let rangeOffset;\n const relativePos = start - fromOffset;\n if (preferEnd && toLength > fromLength && relativePos === fromLength) {\n rangeOffset = toLength;\n }\n else {\n rangeOffset = Math.min(relativePos, toLength);\n }\n return toOffset + rangeOffset;\n }\n }\n if (!warned) {\n warned = true;\n console.warn('fromOffsets should be sorted in ascending order');\n }\n }\n let low = 0;\n let high = fromOffsets.length - 1;\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n const fromOffset = fromOffsets[mid];\n const fromLength = fromLengths[mid];\n if (start >= fromOffset && start <= fromOffset + fromLength) {\n const toLength = toLengths[mid];\n const toOffset = toOffsets[mid];\n let rangeOffset;\n const relativePos = start - fromOffset;\n if (preferEnd && toLength > fromLength && relativePos === fromLength) {\n rangeOffset = toLength;\n }\n else {\n rangeOffset = Math.min(relativePos, toLength);\n }\n return toOffset + rangeOffset;\n }\n else if (start < fromOffset) {\n high = mid - 1;\n }\n else {\n low = mid + 1;\n }\n }\n}\n//# sourceMappingURL=translateOffset.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SourceMap = void 0;\nconst binarySearch_1 = require(\"./binarySearch\");\nconst translateOffset_1 = require(\"./translateOffset\");\nclass SourceMap {\n constructor(mappings) {\n this.mappings = mappings;\n }\n toSourceRange(generatedStart, generatedEnd, fallbackToAnyMatch, filter) {\n return this.findMatchingStartEnd(generatedStart, generatedEnd, fallbackToAnyMatch, 'generatedOffsets', filter);\n }\n toGeneratedRange(sourceStart, sourceEnd, fallbackToAnyMatch, filter) {\n return this.findMatchingStartEnd(sourceStart, sourceEnd, fallbackToAnyMatch, 'sourceOffsets', filter);\n }\n toSourceLocation(generatedOffset, filter) {\n return this.findMatchingOffsets(generatedOffset, 'generatedOffsets', filter);\n }\n toGeneratedLocation(sourceOffset, filter) {\n return this.findMatchingOffsets(sourceOffset, 'sourceOffsets', filter);\n }\n *findMatchingOffsets(offset, fromRange, filter, preferEnd = false) {\n const memo = this.getMemoBasedOnRange(fromRange);\n if (memo.offsets.length === 0) {\n return;\n }\n const { low: start, high: end } = (0, binarySearch_1.binarySearch)(memo.offsets, offset);\n const skip = new Set();\n const toRange = fromRange === 'sourceOffsets' ? 'generatedOffsets' : 'sourceOffsets';\n for (let i = start; i <= end; i++) {\n for (const mapping of memo.mappings[i]) {\n if (skip.has(mapping)) {\n continue;\n }\n skip.add(mapping);\n if (filter && !filter(mapping.data)) {\n continue;\n }\n const mapped = (0, translateOffset_1.translateOffset)(offset, mapping[fromRange], mapping[toRange], getLengths(mapping, fromRange), getLengths(mapping, toRange), preferEnd);\n if (mapped !== undefined) {\n yield [mapped, mapping];\n }\n }\n }\n }\n *findMatchingStartEnd(start, end, fallbackToAnyMatch, fromRange, filter) {\n const toRange = fromRange === 'sourceOffsets' ? 'generatedOffsets' : 'sourceOffsets';\n const preferEnd = toRange === 'sourceOffsets';\n const mappedStarts = [];\n let hadMatch = false;\n for (const [mappedStart, mapping] of this.findMatchingOffsets(start, fromRange)) {\n if (filter && !filter(mapping.data)) {\n continue;\n }\n mappedStarts.push([mappedStart, mapping]);\n const mappedEnd = (0, translateOffset_1.translateOffset)(end, mapping[fromRange], mapping[toRange], getLengths(mapping, fromRange), getLengths(mapping, toRange), preferEnd);\n if (mappedEnd !== undefined) {\n hadMatch = true;\n yield [mappedStart, mappedEnd, mapping, mapping];\n }\n }\n if (!hadMatch && fallbackToAnyMatch) {\n for (const [mappedStart, mappingStart] of mappedStarts) {\n for (const [mappedEnd, mappingEnd] of this.findMatchingOffsets(end, fromRange, undefined, preferEnd)) {\n if (filter && !filter(mappingEnd.data) || mappedEnd < mappedStart) {\n continue;\n }\n yield [mappedStart, mappedEnd, mappingStart, mappingEnd];\n break;\n }\n }\n }\n }\n getMemoBasedOnRange(fromRange) {\n return fromRange === 'sourceOffsets'\n ? this.sourceCodeOffsetsMemo ??= this.createMemo('sourceOffsets')\n : this.generatedCodeOffsetsMemo ??= this.createMemo('generatedOffsets');\n }\n createMemo(key) {\n const offsetsSet = new Set();\n for (const mapping of this.mappings) {\n for (let i = 0; i < mapping[key].length; i++) {\n offsetsSet.add(mapping[key][i]);\n offsetsSet.add(mapping[key][i] + getLengths(mapping, key)[i]);\n }\n }\n const offsets = [...offsetsSet].sort((a, b) => a - b);\n const mappings = offsets.map(() => new Set());\n for (const mapping of this.mappings) {\n for (let i = 0; i < mapping[key].length; i++) {\n const startIndex = (0, binarySearch_1.binarySearch)(offsets, mapping[key][i]).match;\n const endIndex = (0, binarySearch_1.binarySearch)(offsets, mapping[key][i] + getLengths(mapping, key)[i]).match;\n for (let i = startIndex; i <= endIndex; i++) {\n mappings[i].add(mapping);\n }\n }\n }\n return { offsets, mappings };\n }\n}\nexports.SourceMap = SourceMap;\nfunction getLengths(mapping, key) {\n return key === 'sourceOffsets' ? mapping.lengths : mapping.generatedLengths ?? mapping.lengths;\n}\n//# sourceMappingURL=sourceMap.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./lib/sourceMap\"), exports);\n__exportStar(require(\"./lib/translateOffset\"), exports);\n//# sourceMappingURL=index.js.map","/**\n * macro-simplification codemod (B6.2)\n *\n * Transforms v1 `.aihu` source into v2 collection-form per\n * `docs/superpowers/specs/2026-05-05-spec-macro-vocabulary-v2.md`.\n *\n * Scope (in-spec macros only): `$prop`, `$computed`, `$action`,\n * `$resource`, `$effect`, `$lifecycle.{mount,dispose}` inside `@state`;\n * `$expose`, `$expose.write`, agent-bare `$action`, `$describe` inside\n * `@agent` (folded into matching `@state` collection entries).\n *\n * Out of scope: `@template`, `@style`, `@route`, `$watch`, `$shared`,\n * `$cookie`, `$server`, `$meta`, `$beforeNavigate`, `$afterNavigate`,\n * `$effect.on`, plain TS imports/decls (passed through verbatim).\n */\n\nexport interface MigrateResult {\n readonly rewritten: string\n readonly warnings: readonly string[]\n}\n\ninterface Sidecar {\n describe?: string\n exposeRead?: boolean\n exposeWrite?: boolean\n isAction?: boolean\n}\n\ninterface PropEntry {\n name: string\n rawType: string | undefined\n rawDefault: string | undefined\n describe: string | undefined\n expose: { read: boolean; write: boolean } | undefined\n leading: string\n}\n\ninterface FunctionishEntry {\n name: string\n args: string\n retType: string | undefined\n body: string\n describe: string | undefined\n expose: { read: boolean; write: boolean } | undefined\n leading: string\n}\n\ninterface ValueEntry {\n name: string\n expr: string\n describe: string | undefined\n expose: { read: boolean; write: boolean } | undefined\n leading: string\n}\n\ninterface AnonEffect {\n body: string\n leading: string\n position: number\n}\n\ninterface LifecycleHook {\n kind: 'mount' | 'dispose'\n body: string\n leading: string\n position: number\n}\n\ninterface PlainDecl {\n raw: string\n leading: string\n name: string | undefined\n rawType: string | undefined\n rawDefault: string | undefined\n}\n\ninterface Passthrough {\n raw: string\n leading: string\n position: number\n}\n\nconst INDENT = ' '\n\n// Public entry point\n\nexport function migrate(source: string): MigrateResult {\n const warnings: string[] = []\n\n const stateBlock = findBlock(source, 'state')\n const agentBlock = findBlock(source, 'agent')\n\n // Phase 1 - sidecar from @agent\n const sidecar = new Map<string, Sidecar>()\n const preservedAgentLines: string[] = []\n if (agentBlock) {\n parseAgent(agentBlock.body, sidecar, preservedAgentLines, warnings)\n }\n\n if (!stateBlock) {\n return { rewritten: source, warnings }\n }\n\n // Phase 2 - walk @state, bucket\n const buckets = walkState(stateBlock.body, sidecar, warnings)\n\n // Phase 3 - emit new @state body and (possibly empty) @agent block\n const newStateBody = emitStateBody(buckets)\n const newStateBlock = `@state {\\n${newStateBody}\\n}`\n\n const newAgentBlock =\n preservedAgentLines.length > 0 ? `@agent {\\n${preservedAgentLines.join('\\n')}\\n}` : null\n\n let out = source.slice(0, stateBlock.start) + newStateBlock + source.slice(stateBlock.end)\n\n if (agentBlock) {\n const agentRelocated = findBlock(out, 'agent')\n if (agentRelocated) {\n if (newAgentBlock) {\n out = out.slice(0, agentRelocated.start) + newAgentBlock + out.slice(agentRelocated.end)\n } else {\n const dropStart = expandLeftToLineStart(out, agentRelocated.start)\n const dropEnd = expandRightThroughBlankLines(out, agentRelocated.end)\n out = out.slice(0, dropStart) + out.slice(dropEnd)\n }\n }\n }\n\n // Validate every sidecar name resolves in @state\n const stateNames = new Set<string>([\n ...buckets.props.map((p) => p.name),\n ...buckets.computed.map((c) => c.name),\n ...buckets.action.map((a) => a.name),\n ...buckets.resource.map((r) => r.name),\n ...buckets.effectNamed.map((e) => e.name),\n ...buckets.plain.map((p) => p.name).filter((x): x is string => !!x),\n ])\n for (const [name] of sidecar) {\n if (!stateNames.has(name)) {\n warnings.push(`@agent references '${name}' but no @state declaration found`)\n }\n }\n\n return { rewritten: out, warnings }\n}\n\n// Block location (brace-balanced, string/comment aware)\n\ninterface BlockSpan {\n start: number\n end: number\n bodyStart: number\n bodyEnd: number\n body: string\n}\n\nfunction findBlock(source: string, name: 'state' | 'agent'): BlockSpan | null {\n const re = new RegExp(`(^|\\\\n)([ \\\\t]*)@${name}\\\\s*\\\\{`, 'g')\n const m = re.exec(source)\n if (!m) return null\n const startMatch = m.index + (m[1] === '\\n' ? 1 : 0)\n const openIdx = m.index + m[0].length - 1\n const closeIdx = matchBrace(source, openIdx)\n if (closeIdx < 0) return null\n return {\n start: startMatch,\n end: closeIdx + 1,\n bodyStart: openIdx + 1,\n bodyEnd: closeIdx,\n body: source.slice(openIdx + 1, closeIdx),\n }\n}\n\nfunction matchBrace(s: string, i: number): number {\n if (s[i] !== '{') return -1\n let depth = 0\n let j = i\n while (j < s.length) {\n const c = s[j]\n if (c === '/' && s[j + 1] === '/') {\n const nl = s.indexOf('\\n', j)\n j = nl < 0 ? s.length : nl\n continue\n }\n if (c === '/' && s[j + 1] === '*') {\n const end = s.indexOf('*/', j + 2)\n j = end < 0 ? s.length : end + 2\n continue\n }\n if (c === '\"' || c === \"'\" || c === '`') {\n j = skipString(s, j)\n continue\n }\n if (c === '{') depth++\n else if (c === '}') {\n depth--\n if (depth === 0) return j\n }\n j++\n }\n return -1\n}\n\nfunction skipString(s: string, i: number): number {\n const quote = s[i]!\n let j = i + 1\n while (j < s.length) {\n const c = s[j]\n if (c === '\\\\') {\n j += 2\n continue\n }\n if (quote === '`' && c === '$' && s[j + 1] === '{') {\n const close = matchBrace(s, j + 1)\n j = close < 0 ? s.length : close + 1\n continue\n }\n if (c === quote) return j + 1\n j++\n }\n return s.length\n}\n\nfunction matchParen(s: string, i: number): number {\n if (s[i] !== '(') return -1\n let depth = 0\n let j = i\n while (j < s.length) {\n const c = s[j]\n if (c === '/' && s[j + 1] === '/') {\n const nl = s.indexOf('\\n', j)\n j = nl < 0 ? s.length : nl\n continue\n }\n if (c === '/' && s[j + 1] === '*') {\n const end = s.indexOf('*/', j + 2)\n j = end < 0 ? s.length : end + 2\n continue\n }\n if (c === '\"' || c === \"'\" || c === '`') {\n j = skipString(s, j)\n continue\n }\n if (c === '{') {\n const close = matchBrace(s, j)\n j = close < 0 ? s.length : close + 1\n continue\n }\n if (c === '(') depth++\n else if (c === ')') {\n depth--\n if (depth === 0) return j\n }\n j++\n }\n return -1\n}\n\n// @agent parsing -> sidecar\n\nfunction parseAgent(\n body: string,\n sidecar: Map<string, Sidecar>,\n preservedAgentLines: string[],\n _warnings: string[],\n): void {\n const upsert = (name: string, patch: Partial<Sidecar>) => {\n sidecar.set(name, { ...(sidecar.get(name) ?? {}), ...patch })\n }\n for (const rawLine of body.split('\\n')) {\n const line = rawLine.trim()\n if (line === '' || line.startsWith('//') || line.startsWith('/*') || line.startsWith('*')) {\n continue\n }\n if (line.startsWith('$expose.write ')) {\n const names = parseNameList(line.slice('$expose.write '.length))\n for (const n of names) upsert(n, { exposeRead: true, exposeWrite: true })\n continue\n }\n if (line.startsWith('$expose ')) {\n const names = parseNameList(line.slice('$expose '.length))\n for (const n of names) {\n upsert(n, { exposeRead: true })\n }\n continue\n }\n if (line.startsWith('$action ')) {\n const rest = line.slice('$action '.length).trim()\n const m = /^([A-Za-z_$][\\w$]*)/.exec(rest)\n if (m) upsert(m[1]!, { isAction: true, exposeRead: true, exposeWrite: true })\n continue\n }\n if (line.startsWith('$describe ')) {\n const rest = line.slice('$describe '.length).trim()\n const nameMatch = /^([A-Za-z_$][\\w$]*)\\s+([\"'])([\\s\\S]*)\\2\\s*$/.exec(rest)\n if (nameMatch) {\n upsert(nameMatch[1]!, { describe: nameMatch[3]! })\n }\n continue\n }\n if (line.startsWith('$scope ')) {\n preservedAgentLines.push(` ${line}`)\n continue\n }\n if (line.startsWith('$rate-limit ')) {\n preservedAgentLines.push(` ${line}`)\n }\n }\n}\n\nfunction parseNameList(s: string): string[] {\n return s\n .split(',')\n .map((x) => x.trim())\n .filter((x) => /^[A-Za-z_$][\\w$]*$/.test(x))\n}\n\n// @state walker - produces buckets in source order\n\ninterface Buckets {\n props: PropEntry[]\n computed: ValueEntry[]\n action: FunctionishEntry[]\n resource: ValueEntry[]\n effectNamed: ValueEntry[]\n effectAnon: AnonEffect[]\n lifecycle: LifecycleHook[]\n plain: PlainDecl[]\n passthrough: Passthrough[]\n}\n\nfunction walkState(body: string, sidecar: Map<string, Sidecar>, warnings: string[]): Buckets {\n const buckets: Buckets = {\n props: [],\n computed: [],\n action: [],\n resource: [],\n effectNamed: [],\n effectAnon: [],\n lifecycle: [],\n plain: [],\n passthrough: [],\n }\n\n let i = 0\n while (i < body.length && (body[i] === '\\n' || body[i] === '\\r')) i++\n\n let leadingBuf = ''\n let position = 0\n\n const consumeWS = () => {\n while (i < body.length) {\n const lineEnd = body.indexOf('\\n', i)\n const end = lineEnd < 0 ? body.length : lineEnd\n const line = body.slice(i, end)\n const trimmed = line.trim()\n if (trimmed === '') {\n leadingBuf += `${line}\\n`\n i = end + 1\n continue\n }\n if (trimmed.startsWith('//')) {\n leadingBuf += `${line}\\n`\n i = end + 1\n continue\n }\n if (trimmed.startsWith('/*')) {\n const close = body.indexOf('*/', i)\n if (close < 0) {\n leadingBuf += body.slice(i)\n i = body.length\n return\n }\n const commentEnd = body.indexOf('\\n', close)\n const realEnd = commentEnd < 0 ? body.length : commentEnd + 1\n leadingBuf += body.slice(i, realEnd)\n i = realEnd\n continue\n }\n return\n }\n }\n\n while (i < body.length) {\n consumeWS()\n if (i >= body.length) break\n const lineStart = i\n const lineEnd = body.indexOf('\\n', i)\n const lineEndIdx = lineEnd < 0 ? body.length : lineEnd\n const lineText = body.slice(lineStart, lineEndIdx)\n const trimmed = lineText.trim()\n const leading = leadingBuf\n leadingBuf = ''\n // Position where trimmed content begins (skipping leading whitespace).\n const trimStart = lineStart + (lineText.length - lineText.trimStart().length)\n\n if (trimmed.startsWith('import ')) {\n buckets.passthrough.push({ raw: lineText.trim(), leading, position: position++ })\n i = lineEndIdx + 1\n continue\n }\n\n // v2 collection-form passthrough (idempotency path): if the source already\n // uses `$<macro>: {` collection-form, re-parse the inner entries into the\n // same buckets so emit is byte-identical on re-run.\n {\n const v2 = tryParseV2Collection(body, trimStart, sidecar, buckets, leading, () => position++)\n if (v2 !== null) {\n i = v2\n continue\n }\n }\n\n // v2 anonymous effect form: `$effect: () => { ... }` or `$effect: () => expr`.\n if (/^\\$effect\\s*:\\s*(?:\\(|async\\b)/.test(trimmed)) {\n const handled = tryParseV2AnonEffect(body, trimStart, buckets, leading, position++)\n if (handled !== null) {\n i = handled\n continue\n }\n }\n\n if (trimmed.startsWith('$prop ')) {\n const handled = handleProp(body, trimStart, sidecar, buckets, leading)\n if (handled !== null) {\n i = handled\n continue\n }\n buckets.passthrough.push({ raw: trimmed, leading, position: position++ })\n i = lineEndIdx + 1\n continue\n }\n\n if (trimmed.startsWith('$computed ')) {\n const handled = handleComputed(body, trimStart, sidecar, buckets, leading)\n if (handled !== null) {\n i = handled\n continue\n }\n buckets.passthrough.push({ raw: trimmed, leading, position: position++ })\n i = lineEndIdx + 1\n continue\n }\n\n if (trimmed.startsWith('$resource ')) {\n const handled = handleResource(body, trimStart, sidecar, buckets, leading)\n if (handled !== null) {\n i = handled\n continue\n }\n buckets.passthrough.push({ raw: trimmed, leading, position: position++ })\n i = lineEndIdx + 1\n continue\n }\n\n if (trimmed.startsWith('$action ')) {\n const handled = handleAction(body, trimStart, sidecar, buckets, leading)\n if (handled !== null) {\n i = handled\n continue\n }\n buckets.passthrough.push({ raw: trimmed, leading, position: position++ })\n i = lineEndIdx + 1\n continue\n }\n\n if (trimmed.startsWith('$lifecycle.mount(') || trimmed.startsWith('$lifecycle.dispose(')) {\n const handled = handleLifecycle(body, trimStart, buckets, leading, position++)\n if (handled !== null) {\n i = handled\n continue\n }\n buckets.passthrough.push({ raw: trimmed, leading, position: position++ })\n i = lineEndIdx + 1\n continue\n }\n\n if (trimmed.startsWith('$effect(')) {\n const handled = handleEffectAnon(body, trimStart, buckets, leading, position++, warnings)\n if (handled !== null) {\n i = handled\n continue\n }\n buckets.passthrough.push({ raw: trimmed, leading, position: position++ })\n i = lineEndIdx + 1\n continue\n }\n\n if (trimmed.startsWith('$effect.on(')) {\n const handled = consumePassthroughCall(body, trimStart)\n buckets.passthrough.push({\n raw: body.slice(trimStart, handled).trim(),\n leading,\n position: position++,\n })\n i = handled\n continue\n }\n\n // Any other `$macro(...)` invocation at top level: pass through preserving\n // the multi-line callback body. Covers `$afterNavigate`, `$beforeNavigate`,\n // `$watch`, etc. — out of v2 redesign scope per spec §1.2.\n if (/^\\$[A-Za-z_][\\w.$]*\\s*\\(/.test(trimmed)) {\n const handled = consumePassthroughCall(body, trimStart)\n buckets.passthrough.push({\n raw: body.slice(trimStart, handled).trimEnd(),\n leading,\n position: position++,\n })\n i = handled\n continue\n }\n\n // Bare `$macro <ident>` form (e.g., `$route currentRoute`, `$shared foo`).\n if (/^\\$[A-Za-z_][\\w.$-]*\\s+[A-Za-z_$]/.test(trimmed)) {\n buckets.passthrough.push({ raw: trimmed, leading, position: position++ })\n i = lineEndIdx + 1\n continue\n }\n\n const plain = tryParsePlainDecl(body, trimStart)\n if (plain !== null) {\n const sc = plain.name ? sidecar.get(plain.name) : undefined\n if (sc) {\n buckets.props.push({\n name: plain.name!,\n rawType: plain.rawType,\n rawDefault: plain.rawDefault,\n describe: sc.describe,\n expose: sidecarToExpose(sc),\n leading,\n })\n } else {\n buckets.plain.push({\n raw: plain.raw,\n leading,\n name: plain.name,\n rawType: plain.rawType,\n rawDefault: plain.rawDefault,\n })\n }\n i = plain.endIdx\n continue\n }\n\n buckets.passthrough.push({ raw: trimmed, leading, position: position++ })\n i = lineEndIdx + 1\n }\n\n return buckets\n}\n\nfunction sidecarToExpose(sc: Sidecar): { read: boolean; write: boolean } | undefined {\n if (!sc.exposeRead && !sc.exposeWrite && !sc.isAction) return undefined\n return { read: !!sc.exposeRead, write: !!sc.exposeWrite }\n}\n\n// handlers - each returns the index just past the consumed statement\n\nfunction handleProp(\n body: string,\n start: number,\n sidecar: Map<string, Sidecar>,\n buckets: Buckets,\n leading: string,\n): number | null {\n const after = start + '$prop '.length\n const nameMatch = /^\\s*([A-Za-z_$][\\w$]*)\\s*:/.exec(body.slice(after))\n if (!nameMatch) return null\n const name = nameMatch[1]!\n let cursor = after + nameMatch[0].length\n const typeStart = cursor\n const typeEnd = scanUntilTopLevel(body, cursor, ['=', '\\n', ';'])\n const rawType = body.slice(typeStart, typeEnd).trim()\n cursor = typeEnd\n let rawDefault: string | undefined\n if (body[cursor] === '=') {\n cursor++\n const defStart = cursor\n const defEnd = scanUntilTopLevel(body, cursor, ['\\n', ';'])\n rawDefault = body.slice(defStart, defEnd).trim()\n cursor = defEnd\n }\n if (body[cursor] === ';' || body[cursor] === '\\n') cursor++\n\n const sc = sidecar.get(name)\n buckets.props.push({\n name,\n rawType: flattenWhitespace(rawType),\n rawDefault: rawDefault !== undefined ? flattenWhitespace(rawDefault) : undefined,\n describe: sc?.describe,\n expose: sc ? sidecarToExpose(sc) : undefined,\n leading,\n })\n return cursor\n}\n\nfunction handleComputed(\n body: string,\n start: number,\n sidecar: Map<string, Sidecar>,\n buckets: Buckets,\n leading: string,\n): number | null {\n const after = start + '$computed '.length\n const nameMatch = /^\\s*([A-Za-z_$][\\w$]*)\\s*=/.exec(body.slice(after))\n if (!nameMatch) return null\n const name = nameMatch[1]!\n let cursor = after + nameMatch[0].length\n const exprStart = cursor\n const exprEnd = scanComputedOrResourceExpr(body, cursor)\n const expr = body.slice(exprStart, exprEnd).trim()\n cursor = exprEnd\n\n const sc = sidecar.get(name)\n buckets.computed.push({\n name,\n expr,\n describe: sc?.describe,\n expose: sc ? sidecarToExpose(sc) : undefined,\n leading,\n })\n return cursor\n}\n\nfunction handleResource(\n body: string,\n start: number,\n sidecar: Map<string, Sidecar>,\n buckets: Buckets,\n leading: string,\n): number | null {\n const after = start + '$resource '.length\n const nameMatch = /^\\s*([A-Za-z_$][\\w$]*)\\s*=/.exec(body.slice(after))\n if (!nameMatch) return null\n const name = nameMatch[1]!\n let cursor = after + nameMatch[0].length\n const exprStart = cursor\n const exprEnd = scanComputedOrResourceExpr(body, cursor)\n const expr = body.slice(exprStart, exprEnd).trim()\n cursor = exprEnd\n\n const sc = sidecar.get(name)\n buckets.resource.push({\n name,\n expr,\n describe: sc?.describe,\n expose: sc ? sidecarToExpose(sc) : undefined,\n leading,\n })\n return cursor\n}\n\nfunction handleAction(\n body: string,\n start: number,\n sidecar: Map<string, Sidecar>,\n buckets: Buckets,\n leading: string,\n): number | null {\n const after = start + '$action '.length\n const nameMatch = /^\\s*([A-Za-z_$][\\w$]*)\\s*\\(/.exec(body.slice(after))\n if (!nameMatch) return null\n const name = nameMatch[1]!\n const parenIdx = after + nameMatch[0].length - 1\n const parenClose = matchParen(body, parenIdx)\n if (parenClose < 0) return null\n const args = body.slice(parenIdx + 1, parenClose).trim()\n let cursor = parenClose + 1\n let retType: string | undefined\n const retStart = cursor\n while (cursor < body.length && body[cursor] !== '{') {\n if (body[cursor] === '\\n') break\n cursor++\n }\n const between = body.slice(retStart, cursor).trim()\n if (between.startsWith(':')) {\n retType = between.slice(1).trim()\n }\n if (body[cursor] !== '{') return null\n const braceClose = matchBrace(body, cursor)\n if (braceClose < 0) return null\n const bodySrc = body.slice(cursor + 1, braceClose)\n cursor = braceClose + 1\n\n const sc = sidecar.get(name)\n buckets.action.push({\n name,\n args,\n retType,\n body: bodySrc,\n describe: sc?.describe,\n expose: sc ? sidecarToExpose(sc) : undefined,\n leading,\n })\n return cursor\n}\n\nfunction handleLifecycle(\n body: string,\n start: number,\n buckets: Buckets,\n leading: string,\n position: number,\n): number | null {\n const trimmedStart = body.slice(start).trim()\n const kind = trimmedStart.startsWith('$lifecycle.mount(') ? 'mount' : 'dispose'\n const parenIdx = body.indexOf('(', start)\n if (parenIdx < 0) return null\n const parenClose = matchParen(body, parenIdx)\n if (parenClose < 0) return null\n const cb = body.slice(parenIdx + 1, parenClose).trim()\n const fn = parseArrowOrFunctionExpr(cb)\n buckets.lifecycle.push({\n kind,\n body: fn ? fn.body : cb,\n leading,\n position,\n })\n let cursor = parenClose + 1\n if (body[cursor] === ';' || body[cursor] === '\\n') cursor++\n return cursor\n}\n\nfunction handleEffectAnon(\n body: string,\n start: number,\n buckets: Buckets,\n leading: string,\n position: number,\n _warnings: string[],\n): number | null {\n const parenIdx = body.indexOf('(', start)\n if (parenIdx < 0) return null\n const parenClose = matchParen(body, parenIdx)\n if (parenClose < 0) return null\n const cb = body.slice(parenIdx + 1, parenClose).trim()\n const fn = parseArrowOrFunctionExpr(cb)\n buckets.effectAnon.push({\n body: fn ? fn.body : cb,\n leading,\n position,\n })\n let cursor = parenClose + 1\n if (body[cursor] === ';' || body[cursor] === '\\n') cursor++\n return cursor\n}\n\nfunction consumePassthroughCall(body: string, start: number): number {\n const parenIdx = body.indexOf('(', start)\n if (parenIdx < 0) {\n const nl = body.indexOf('\\n', start)\n return nl < 0 ? body.length : nl + 1\n }\n const close = matchParen(body, parenIdx)\n if (close < 0) {\n const nl = body.indexOf('\\n', start)\n return nl < 0 ? body.length : nl + 1\n }\n let cursor = close + 1\n if (body[cursor] === ';' || body[cursor] === '\\n') cursor++\n return cursor\n}\n\ninterface PlainDeclParse {\n name: string | undefined\n rawType: string | undefined\n rawDefault: string | undefined\n raw: string\n endIdx: number\n}\n\nfunction tryParsePlainDecl(body: string, start: number): PlainDeclParse | null {\n const m = /^([ \\t]*)([A-Za-z_$][\\w$]*)\\s*:/.exec(body.slice(start))\n if (!m) return null\n const name = m[2]!\n let cursor = start + m[0].length\n const typeStart = cursor\n const typeEnd = scanUntilTopLevel(body, cursor, ['=', '\\n', ';'])\n const rawType = body.slice(typeStart, typeEnd).trim()\n cursor = typeEnd\n let rawDefault: string | undefined\n if (body[cursor] === '=') {\n cursor++\n const defStart = cursor\n const defEnd = scanUntilTopLevel(body, cursor, ['\\n', ';'])\n rawDefault = body.slice(defStart, defEnd).trim()\n cursor = defEnd\n }\n if (body[cursor] === ';') cursor++\n if (body[cursor] === '\\n') cursor++\n return {\n name,\n rawType,\n rawDefault,\n raw: body.slice(start, cursor).replace(/\\n+$/, ''),\n endIdx: cursor,\n }\n}\n\ninterface ParsedFn {\n args: string\n body: string\n retType: string | undefined\n isArrow: boolean\n}\n\nfunction parseArrowOrFunctionExpr(s: string): ParsedFn | null {\n s = s.trim()\n if (s.startsWith('(')) {\n const closeIdx = matchParen(s, 0)\n if (closeIdx < 0) return null\n const args = s.slice(1, closeIdx)\n let cur = closeIdx + 1\n while (cur < s.length && /\\s/.test(s[cur]!)) cur++\n let retType: string | undefined\n if (s[cur] === ':') {\n cur++\n const arrowAt = s.indexOf('=>', cur)\n if (arrowAt < 0) return null\n retType = s.slice(cur, arrowAt).trim()\n cur = arrowAt\n }\n if (s.slice(cur, cur + 2) !== '=>') return null\n cur += 2\n while (cur < s.length && /\\s/.test(s[cur]!)) cur++\n if (s[cur] === '{') {\n const close = matchBrace(s, cur)\n if (close < 0) return null\n return {\n args,\n body: s.slice(cur + 1, close),\n retType,\n isArrow: true,\n }\n }\n return { args, body: ` return ${s.slice(cur).trim()} `, retType, isArrow: true }\n }\n const fnMatch = /^function\\s*(?:[A-Za-z_$][\\w$]*)?\\s*\\(/.exec(s)\n if (fnMatch) {\n const parenIdx = fnMatch[0].length - 1\n const parenClose = matchParen(s, parenIdx)\n if (parenClose < 0) return null\n const args = s.slice(parenIdx + 1, parenClose)\n let cur = parenClose + 1\n while (cur < s.length && /\\s/.test(s[cur]!)) cur++\n let retType: string | undefined\n if (s[cur] === ':') {\n cur++\n const braceAt = s.indexOf('{', cur)\n if (braceAt < 0) return null\n retType = s.slice(cur, braceAt).trim()\n cur = braceAt\n }\n if (s[cur] !== '{') return null\n const close = matchBrace(s, cur)\n if (close < 0) return null\n return {\n args,\n body: s.slice(cur + 1, close),\n retType,\n isArrow: false,\n }\n }\n return null\n}\n\nfunction scanUntilTopLevel(s: string, start: number, stops: readonly string[]): number {\n let j = start\n while (j < s.length) {\n const c = s[j]!\n if (c === '/' && s[j + 1] === '/') {\n const nl = s.indexOf('\\n', j)\n if (stops.includes('\\n')) return nl < 0 ? s.length : nl\n j = nl < 0 ? s.length : nl + 1\n continue\n }\n if (c === '/' && s[j + 1] === '*') {\n const end = s.indexOf('*/', j + 2)\n j = end < 0 ? s.length : end + 2\n continue\n }\n if (c === '\"' || c === \"'\" || c === '`') {\n j = skipString(s, j)\n continue\n }\n if (c === '{') {\n const close = matchBrace(s, j)\n j = close < 0 ? s.length : close + 1\n continue\n }\n if (c === '(') {\n const close = matchParen(s, j)\n j = close < 0 ? s.length : close + 1\n continue\n }\n if (c === '<') {\n const close = scanGeneric(s, j)\n if (close > j) {\n j = close\n continue\n }\n }\n if (stops.includes(c)) return j\n j++\n }\n return s.length\n}\n\nfunction scanGeneric(s: string, start: number): number {\n if (s[start] !== '<') return start\n let depth = 0\n let j = start\n while (j < s.length) {\n const c = s[j]!\n if (c === '<') depth++\n else if (c === '>') {\n depth--\n if (depth === 0) return j + 1\n } else if (c === '\\n') {\n return start\n } else if (c === '(' || c === '{') {\n return start\n } else if (c === '=' || c === ';') {\n return start\n }\n j++\n }\n return start\n}\n\nfunction scanComputedOrResourceExpr(body: string, start: number): number {\n const lineStart = body.lastIndexOf('\\n', start - 1) + 1\n const startLineIndent = countIndent(body, lineStart)\n let j = start\n const lineEnd = body.indexOf('\\n', j)\n if (lineEnd < 0) return body.length\n j = lineEnd + 1\n while (j < body.length) {\n const nextLineEnd = body.indexOf('\\n', j)\n const lineEndIdx = nextLineEnd < 0 ? body.length : nextLineEnd\n const line = body.slice(j, lineEndIdx)\n const trimmed = line.trim()\n if (trimmed === '') {\n return j\n }\n const indent = countIndent(body, j)\n if (\n indent > startLineIndent ||\n (indent === startLineIndent &&\n /^[?:&|+\\-*/<>=,.[\\](){}]/.test(trimmed) &&\n !trimmed.startsWith('//'))\n ) {\n j = nextLineEnd < 0 ? body.length : nextLineEnd + 1\n continue\n }\n return j\n }\n return j\n}\n\nfunction countIndent(body: string, lineStart: number): number {\n let n = 0\n while (lineStart + n < body.length) {\n const c = body[lineStart + n]\n if (c === ' ' || c === '\\t') n++\n else break\n }\n return n\n}\n\n// Emit\n\nfunction emitStateBody(buckets: Buckets): string {\n const out: string[] = []\n const imports = buckets.passthrough.filter((p) => p.raw.startsWith('import '))\n const otherPassthrough = buckets.passthrough.filter((p) => !p.raw.startsWith('import '))\n\n for (const imp of imports) {\n if (imp.leading.trim()) out.push(rstrip(imp.leading))\n out.push(`${INDENT}${imp.raw}`)\n }\n if (imports.length > 0) out.push('')\n\n if (buckets.props.length > 0) {\n pushBlock(out, emitProps(buckets.props))\n }\n\n for (const p of buckets.plain) {\n if (p.leading.trim()) out.push(rstrip(p.leading))\n // raw already includes the original leading indent of the outer line.\n // Don't re-indent — but normalize so the outer line is at INDENT (2 spaces).\n out.push(rebaseLeadingIndent(p.raw, INDENT))\n out.push('')\n }\n trimTrailingBlanks(out)\n\n if (buckets.computed.length > 0) {\n pushBlock(out, emitComputed(buckets.computed))\n }\n\n if (buckets.action.length > 0) {\n pushBlock(out, emitAction(buckets.action))\n }\n\n if (buckets.resource.length > 0) {\n pushBlock(out, emitResource(buckets.resource))\n }\n\n if (buckets.effectNamed.length > 0) {\n pushBlock(out, emitEffectNamed(buckets.effectNamed))\n }\n\n if (buckets.lifecycle.length > 0) {\n pushBlock(out, emitLifecycle(buckets.lifecycle))\n }\n\n if (buckets.effectAnon.length > 0) {\n pushBlock(out, emitEffectAnon(buckets.effectAnon))\n }\n\n for (const p of otherPassthrough) {\n if (p.leading.trim()) out.push(rstrip(p.leading))\n if (p.raw.includes('\\n')) {\n out.push(rebaseLeadingIndent(p.raw, INDENT))\n } else {\n out.push(`${INDENT}${p.raw}`)\n }\n out.push('')\n }\n trimTrailingBlanks(out)\n\n return out.join('\\n')\n}\n\nfunction pushBlock(out: string[], block: string): void {\n if (out.length > 0 && out[out.length - 1] !== '') out.push('')\n out.push(block)\n out.push('')\n}\n\nfunction trimTrailingBlanks(out: string[]): void {\n while (out.length > 0 && out[out.length - 1] === '') out.pop()\n}\n\nfunction emitProps(entries: PropEntry[]): string {\n const lines: string[] = []\n const firstLeading = entries[0]?.leading\n const headerLeading = firstLeading?.trim() ? firstLeading : ''\n const inner: string[] = []\n for (const [idx, e] of entries.entries()) {\n if (idx > 0 && e.leading.trim()) {\n inner.push(rstrip(indentBlock(e.leading, `${INDENT}${INDENT}`)))\n }\n inner.push(formatPropEntry(e))\n }\n if (headerLeading) lines.push(rstrip(headerLeading))\n lines.push(`${INDENT}$prop: {`)\n lines.push(...inner)\n lines.push(`${INDENT}}`)\n return lines.join('\\n')\n}\n\nfunction formatPropEntry(e: PropEntry): string {\n const keys: { k: string; v: string }[] = []\n const needsType = shouldKeepType(e.rawType, e.rawDefault)\n if (needsType && e.rawType) keys.push({ k: 'type', v: e.rawType })\n if (e.rawDefault !== undefined) keys.push({ k: 'default', v: e.rawDefault })\n if (e.describe) keys.push({ k: 'describe', v: quoteSingle(e.describe) })\n if (e.expose) keys.push({ k: 'expose', v: formatExpose(e.expose) })\n\n const inline = `${e.name}: { ${keys.map(({ k, v }) => `${k}: ${v}`).join(', ')} }`\n const baseIndent = INDENT.length * 2\n const linePrefix = ' '.repeat(baseIndent)\n if (keys.length <= 3 && baseIndent + inline.length + 1 <= 100) {\n return `${linePrefix}${inline},`\n }\n const lines: string[] = [`${linePrefix}${e.name}: {`]\n const inner = ' '.repeat(baseIndent + INDENT.length)\n for (const { k, v } of keys) {\n lines.push(`${inner}${k}: ${v},`)\n }\n lines.push(`${linePrefix}},`)\n return lines.join('\\n')\n}\n\nfunction shouldKeepType(rawType: string | undefined, rawDefault: string | undefined): boolean {\n if (!rawType) return false\n if (rawDefault === undefined) return true\n const trimmed = rawDefault.trim()\n if (trimmed === 'null' || trimmed === 'undefined') return true\n if (trimmed === '[]') return true\n if (trimmed === '{}') return true\n if (/^['\"`]/.test(trimmed) && rawType.includes('|')) return true\n if (/[<>{}]/.test(rawType)) {\n if (/^[0-9.+-]/.test(trimmed) || trimmed === 'true' || trimmed === 'false') return true\n if (/^['\"`]/.test(trimmed)) return true\n return true\n }\n return false\n}\n\nfunction emitComputed(entries: ValueEntry[]): string {\n return emitValueCollection('$computed', entries)\n}\n\nfunction emitResource(entries: ValueEntry[]): string {\n return emitValueCollection('$resource', entries)\n}\n\nfunction emitEffectNamed(entries: ValueEntry[]): string {\n return emitValueCollection('$effect', entries)\n}\n\nfunction emitValueCollection(macro: string, entries: ValueEntry[]): string {\n const firstLeading = entries[0]?.leading\n const headerLeading = firstLeading?.trim() ? firstLeading : ''\n const inner: string[] = []\n for (const [idx, e] of entries.entries()) {\n if (idx > 0 && e.leading.trim()) {\n inner.push(rstrip(indentBlock(e.leading, `${INDENT}${INDENT}`)))\n }\n inner.push(formatValueEntry(e))\n }\n const lines: string[] = []\n if (headerLeading) lines.push(rstrip(headerLeading))\n lines.push(`${INDENT}${macro}: {`)\n lines.push(...inner)\n lines.push(`${INDENT}}`)\n return lines.join('\\n')\n}\n\nfunction formatValueEntry(e: ValueEntry): string {\n const baseIndent = INDENT.length * 2\n const linePrefix = ' '.repeat(baseIndent)\n if (!e.describe && !e.expose) {\n if (!e.expr.includes('\\n')) {\n const inline = `${linePrefix}${e.name}: () => ${e.expr},`\n if (inline.length <= 100) return inline\n }\n const indented = reindentExpr(e.expr, baseIndent + INDENT.length)\n return `${linePrefix}${e.name}: () => ${indented},`\n }\n const keys: { k: string; v: string }[] = []\n if (e.describe) keys.push({ k: 'describe', v: quoteSingle(e.describe) })\n if (e.expose) keys.push({ k: 'expose', v: formatExpose(e.expose) })\n const valueExpr = e.expr.includes('\\n')\n ? `() => ${reindentExpr(e.expr, baseIndent + INDENT.length * 2)}`\n : `() => ${e.expr}`\n keys.push({ k: 'value', v: valueExpr })\n\n const lines: string[] = [`${linePrefix}${e.name}: {`]\n const inner = ' '.repeat(baseIndent + INDENT.length)\n for (const { k, v } of keys) {\n lines.push(`${inner}${k}: ${v},`)\n }\n lines.push(`${linePrefix}},`)\n return lines.join('\\n')\n}\n\nfunction emitAction(entries: FunctionishEntry[]): string {\n const firstLeading = entries[0]?.leading\n const headerLeading = firstLeading?.trim() ? firstLeading : ''\n const inner: string[] = []\n for (const [idx, e] of entries.entries()) {\n if (idx > 0 && e.leading.trim()) {\n inner.push(rstrip(indentBlock(e.leading, `${INDENT}${INDENT}`)))\n }\n inner.push(formatActionEntry(e))\n }\n const lines: string[] = []\n if (headerLeading) lines.push(rstrip(headerLeading))\n lines.push(`${INDENT}$action: {`)\n lines.push(...inner)\n lines.push(`${INDENT}}`)\n return lines.join('\\n')\n}\n\nfunction formatActionEntry(e: FunctionishEntry): string {\n const ret = e.retType ? `: ${e.retType}` : ''\n const arrow = `(${e.args})${ret} => `\n const baseIndent = INDENT.length * 2\n const linePrefix = ' '.repeat(baseIndent)\n if (e.describe || e.expose) {\n const keys: { k: string; v: string }[] = []\n if (e.describe) keys.push({ k: 'describe', v: quoteSingle(e.describe) })\n if (e.expose) keys.push({ k: 'expose', v: formatExpose(e.expose) })\n const bodyIndented = reindentBlockBody(e.body, baseIndent + INDENT.length * 2)\n keys.push({ k: 'handler', v: `${arrow}{${bodyIndented}}` })\n const lines: string[] = [`${linePrefix}${e.name}: {`]\n const inner = ' '.repeat(baseIndent + INDENT.length)\n for (const { k, v } of keys) {\n lines.push(`${inner}${k}: ${v},`)\n }\n lines.push(`${linePrefix}},`)\n return lines.join('\\n')\n }\n const bodyIndented = reindentBlockBody(e.body, baseIndent + INDENT.length)\n return `${linePrefix}${e.name}: ${arrow}{${bodyIndented}},`\n}\n\nfunction emitLifecycle(hooks: LifecycleHook[]): string {\n const firstLeading = hooks[0]?.leading\n const headerLeading = firstLeading?.trim() ? firstLeading : ''\n const inner: string[] = []\n const baseIndent = INDENT.length * 2\n const linePrefix = ' '.repeat(baseIndent)\n for (const [idx, h] of hooks.entries()) {\n if (idx > 0 && h.leading.trim()) {\n inner.push(rstrip(indentBlock(h.leading, linePrefix)))\n }\n const bodyIndented = reindentBlockBody(h.body, baseIndent + INDENT.length)\n inner.push(`${linePrefix}${h.kind}: () => {${bodyIndented}},`)\n }\n const lines: string[] = []\n if (headerLeading) lines.push(rstrip(headerLeading))\n lines.push(`${INDENT}$lifecycle: {`)\n lines.push(...inner)\n lines.push(`${INDENT}}`)\n return lines.join('\\n')\n}\n\nfunction emitEffectAnon(effects: AnonEffect[]): string {\n const out: string[] = []\n const baseIndent = INDENT.length\n const linePrefix = ' '.repeat(baseIndent)\n for (const [idx, e] of effects.entries()) {\n if (idx > 0) out.push('')\n if (e.leading.trim()) out.push(rstrip(e.leading))\n const bodyIndented = reindentBlockBody(e.body, baseIndent + INDENT.length)\n out.push(`${linePrefix}$effect: () => {${bodyIndented}}`)\n }\n return out.join('\\n')\n}\n\nfunction formatExpose(e: { read: boolean; write: boolean }): string {\n const parts: string[] = []\n if (e.read) parts.push('read: true')\n if (e.write) parts.push('write: true')\n return `{ ${parts.join(', ')} }`\n}\n\nfunction quoteSingle(s: string): string {\n return `'${s.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`\n}\n\n// Whitespace helpers\n\nfunction rstrip(s: string): string {\n return s\n .replace(/[ \\t]+(\\n|$)/g, '$1')\n .replace(/^\\n+/, '')\n .replace(/\\n+$/g, '')\n}\n\nfunction rebaseLeadingIndent(s: string, indent: string): string {\n const lines = s.split('\\n')\n const first = lines[0] ?? ''\n // determine first-line indent\n let n = 0\n while (n < first.length && (first[n] === ' ' || first[n] === '\\t')) n++\n if (n === 0) {\n return [indent + first, ...lines.slice(1)].join('\\n')\n }\n // Strip n chars from each line that has at least n leading WS, prepend indent\n const rebased = lines.map((line) => {\n if (line.length === 0) return line\n let m = 0\n while (m < line.length && m < n && (line[m] === ' ' || line[m] === '\\t')) m++\n return indent + line.slice(m)\n })\n return rebased.join('\\n')\n}\n\nfunction indentBlock(s: string, indent: string): string {\n return s\n .split('\\n')\n .map((line) => (line.length > 0 ? indent + line : line))\n .join('\\n')\n}\n\nfunction flattenWhitespace(s: string): string {\n return s.replace(/\\s+/g, ' ').trim()\n}\n\nfunction reindentBlockBody(bodyText: string, targetInner: number): string {\n const lines = bodyText.split('\\n')\n let firstReal = 0\n while (firstReal < lines.length && lines[firstReal]!.trim() === '') firstReal++\n let lastReal = lines.length - 1\n while (lastReal >= 0 && lines[lastReal]!.trim() === '') lastReal--\n if (firstReal > lastReal) {\n return ''\n }\n let minIndent = Infinity\n for (let k = firstReal; k <= lastReal; k++) {\n const line = lines[k]!\n if (line.trim() === '') continue\n let n = 0\n while (n < line.length && (line[n] === ' ' || line[n] === '\\t')) n++\n if (n < minIndent) minIndent = n\n }\n if (!Number.isFinite(minIndent)) minIndent = 0\n const rebased: string[] = ['']\n const targetSpaces = ' '.repeat(targetInner)\n for (let k = firstReal; k <= lastReal; k++) {\n const line = lines[k]!\n if (line.trim() === '') {\n rebased.push('')\n continue\n }\n rebased.push((targetSpaces + line.slice(minIndent)).replace(/[ \\t]+$/, ''))\n }\n rebased.push(' '.repeat(Math.max(targetInner - INDENT.length, 0)))\n return rebased.join('\\n')\n}\n\nfunction reindentExpr(expr: string, targetInner: number): string {\n const lines = expr.split('\\n')\n if (lines.length === 1) return expr\n const firstLine = lines[0]!\n const rest = lines.slice(1)\n let minIndent = Infinity\n for (const line of rest) {\n if (line.trim() === '') continue\n let n = 0\n while (n < line.length && (line[n] === ' ' || line[n] === '\\t')) n++\n if (n < minIndent) minIndent = n\n }\n if (!Number.isFinite(minIndent)) minIndent = 0\n const targetSpaces = ' '.repeat(targetInner)\n const rebasedRest = rest.map((line) =>\n line.trim() === '' ? '' : targetSpaces + line.slice(minIndent),\n )\n return [firstLine, ...rebasedRest].join('\\n')\n}\n\nfunction expandLeftToLineStart(s: string, idx: number): number {\n let j = idx\n while (j > 0 && s[j - 1] !== '\\n') j--\n if (j > 0 && s[j - 1] === '\\n') {\n let k = j - 1\n while (k > 0 && (s[k - 1] === ' ' || s[k - 1] === '\\t')) k--\n if (k > 0 && s[k - 1] === '\\n') j = k\n }\n return j\n}\n\nfunction expandRightThroughBlankLines(s: string, idx: number): number {\n let j = idx\n while (j < s.length && (s[j] === ' ' || s[j] === '\\t')) j++\n if (s[j] === '\\n') j++\n while (j < s.length) {\n let k = j\n while (k < s.length && (s[k] === ' ' || s[k] === '\\t')) k++\n if (s[k] === '\\n') {\n j = k + 1\n continue\n }\n break\n }\n return j\n}\n\n// v2 collection-form re-parser - idempotency path\n// Recognizes `$<macro>: { <entries> }` for prop/computed/action/resource/\n// effect/lifecycle, splits the inner object literal at top-level commas, and\n// re-buckets each entry. Returns the cursor past the closing `}` (and any\n// trailing `;`/`\\n`), or null if the line is not a v2 collection.\nfunction tryParseV2Collection(\n body: string,\n start: number,\n sidecar: Map<string, Sidecar>,\n buckets: Buckets,\n leading: string,\n nextPosition: () => number,\n): number | null {\n const m = /^\\$(prop|computed|action|resource|effect|lifecycle)\\s*:\\s*\\{/.exec(body.slice(start))\n if (!m) return null\n const macro = m[1]!\n const braceIdx = start + m[0].length - 1\n const closeIdx = matchBrace(body, braceIdx)\n if (closeIdx < 0) return null\n const inner = body.slice(braceIdx + 1, closeIdx)\n const entries = splitTopLevelEntries(inner)\n let outerLeadingConsumed = false\n for (const e of entries) {\n const parsed = parseV2Entry(e.text)\n if (!parsed) continue\n // Outer block's leading (comments above `$<macro>: {`) attaches to the\n // first parseable entry. Subsequent entries take their own piece-leading\n // only when it carries non-whitespace content (e.g., a comment block).\n let entryLeading: string\n if (!outerLeadingConsumed) {\n entryLeading = e.leading.trim() ? e.leading : leading\n outerLeadingConsumed = true\n } else {\n entryLeading = e.leading.trim() ? e.leading : ''\n }\n routeV2Entry(macro, parsed, sidecar, buckets, entryLeading, nextPosition)\n }\n let cursor = closeIdx + 1\n if (body[cursor] === ';') cursor++\n if (body[cursor] === '\\n') cursor++\n return cursor\n}\n\n// v2 anonymous-effect re-parser - `$effect: () => { ... }`.\nfunction tryParseV2AnonEffect(\n body: string,\n start: number,\n buckets: Buckets,\n leading: string,\n position: number,\n): number | null {\n const colonIdx = body.indexOf(':', start)\n if (colonIdx < 0) return null\n let cursor = colonIdx + 1\n while (cursor < body.length && /[ \\t]/.test(body[cursor]!)) cursor++\n // Allow `async` prefix.\n if (body.slice(cursor, cursor + 5) === 'async') cursor += 5\n while (cursor < body.length && /[ \\t]/.test(body[cursor]!)) cursor++\n if (body[cursor] !== '(') return null\n const exprStart = cursor\n // Consume the rest of the line up to the matching brace (or end of expr).\n // Simplest: parse the arrow expression by finding `=>` and then the body.\n const fn = parseArrowOrFunctionExpr(body.slice(exprStart))\n if (!fn) return null\n // Compute end position: scan from exprStart forward consuming the arrow body.\n // parseArrowOrFunctionExpr reports a body but not the end offset; recompute\n // by counting through the same structure here.\n const closeIdx = scanArrowExprEnd(body, exprStart)\n if (closeIdx < 0) return null\n buckets.effectAnon.push({ body: fn.body, leading, position })\n let c = closeIdx\n if (body[c] === ';') c++\n if (body[c] === '\\n') c++\n return c\n}\n\n// Helper: scan past an arrow-function expression starting at `(`, return idx\n// just past the closing brace (or end-of-expr).\nfunction scanArrowExprEnd(s: string, start: number): number {\n if (s[start] !== '(') return -1\n const parenClose = matchParen(s, start)\n if (parenClose < 0) return -1\n let cur = parenClose + 1\n while (cur < s.length && /[ \\t]/.test(s[cur]!)) cur++\n if (s[cur] === ':') {\n cur++\n const arrowAt = s.indexOf('=>', cur)\n if (arrowAt < 0) return -1\n cur = arrowAt\n }\n if (s.slice(cur, cur + 2) !== '=>') return -1\n cur += 2\n while (cur < s.length && /[ \\t\\n]/.test(s[cur]!)) cur++\n if (s[cur] === '{') {\n const close = matchBrace(s, cur)\n if (close < 0) return -1\n return close + 1\n }\n // expression-bodied arrow: read to end of line\n const nl = s.indexOf('\\n', cur)\n return nl < 0 ? s.length : nl\n}\n\n// Split the inner of `{ ... }` at top-level commas. Each piece keeps its\n// original whitespace but is trimmed on the boundaries.\ninterface SplitEntry {\n text: string\n leading: string\n}\nfunction splitTopLevelEntries(inner: string): SplitEntry[] {\n const out: SplitEntry[] = []\n let depthBrace = 0\n let depthParen = 0\n let depthBracket = 0\n let start = 0\n let j = 0\n while (j < inner.length) {\n const c = inner[j]!\n if (c === '/' && inner[j + 1] === '/') {\n const nl = inner.indexOf('\\n', j)\n j = nl < 0 ? inner.length : nl\n continue\n }\n if (c === '/' && inner[j + 1] === '*') {\n const end = inner.indexOf('*/', j + 2)\n j = end < 0 ? inner.length : end + 2\n continue\n }\n if (c === '\"' || c === \"'\" || c === '`') {\n j = skipString(inner, j)\n continue\n }\n if (c === '{') depthBrace++\n else if (c === '}') depthBrace--\n else if (c === '(') depthParen++\n else if (c === ')') depthParen--\n else if (c === '[') depthBracket++\n else if (c === ']') depthBracket--\n else if (c === ',' && depthBrace === 0 && depthParen === 0 && depthBracket === 0) {\n const piece = inner.slice(start, j)\n pushSplitEntry(out, piece)\n start = j + 1\n }\n j++\n }\n if (start < inner.length) {\n const piece = inner.slice(start)\n pushSplitEntry(out, piece)\n }\n return out\n}\n\nfunction pushSplitEntry(out: SplitEntry[], piece: string): void {\n // Separate leading whitespace/comments from the entry body.\n let head = ''\n let i = 0\n while (i < piece.length) {\n const lineEnd = piece.indexOf('\\n', i)\n const end = lineEnd < 0 ? piece.length : lineEnd\n const line = piece.slice(i, end)\n if (line.trim() === '' || line.trim().startsWith('//') || line.trim().startsWith('/*')) {\n head += `${line}\\n`\n i = end + 1\n if (lineEnd < 0) break\n continue\n }\n break\n }\n const text = piece.slice(i).trim()\n if (text === '') return\n out.push({ text, leading: head })\n}\n\ninterface ParsedV2Entry {\n name: string\n // Either a bare RHS (e.g. arrow function or expression) or a wrapped `{...}` body.\n rhs: string\n isWrapped: boolean\n}\n\nfunction parseV2Entry(text: string): ParsedV2Entry | null {\n const m = /^([A-Za-z_$][\\w$]*)\\s*:\\s*/.exec(text)\n if (!m) return null\n const name = m[1]!\n const rest = text.slice(m[0].length).trim()\n if (rest.startsWith('{')) {\n // Could be either a wrapped metadata-bag OR a JS object expression that's\n // itself the value (rare in v2, e.g. a `$prop` `default: {}`). For our\n // collection-form, the wrapped form is `{ describe?, expose?, value? | handler? | type?, default? }`.\n const close = matchBrace(rest, 0)\n if (close < 0) return null\n const body = rest.slice(1, close).trim()\n return { name, rhs: body, isWrapped: true }\n }\n return { name, rhs: rest, isWrapped: false }\n}\n\n// Parse the inside of a wrapped object `{ describe: ..., expose: ..., value: ..., handler: ..., default: ..., type: ... }`.\ninterface WrappedFields {\n describe?: string\n expose?: { read: boolean; write: boolean }\n value?: string\n handler?: string\n default?: string\n type?: string\n on?: string\n}\nfunction parseWrappedFields(body: string): WrappedFields {\n const out: WrappedFields = {}\n const entries = splitTopLevelEntries(body)\n for (const e of entries) {\n const m = /^([A-Za-z_$][\\w$]*)\\s*:\\s*/.exec(e.text)\n if (!m) continue\n const k = m[1]!\n const v = e.text.slice(m[0].length).trim()\n if (k === 'describe') out.describe = unquoteString(v)\n else if (k === 'expose') {\n const parsed = parseExposeLiteral(v)\n if (parsed) out.expose = parsed\n } else if (k === 'value') out.value = v\n else if (k === 'handler') out.handler = v\n else if (k === 'default') out.default = v\n else if (k === 'type') out.type = v\n else if (k === 'on') out.on = v\n }\n return out\n}\n\nfunction unquoteString(s: string): string {\n s = s.trim()\n if ((s.startsWith(\"'\") && s.endsWith(\"'\")) || (s.startsWith('\"') && s.endsWith('\"'))) {\n return s.slice(1, -1).replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, '\\\\')\n }\n return s\n}\n\nfunction parseExposeLiteral(s: string): { read: boolean; write: boolean } | undefined {\n s = s.trim()\n if (!s.startsWith('{')) return undefined\n const close = matchBrace(s, 0)\n if (close < 0) return undefined\n const body = s.slice(1, close)\n const read = /\\bread\\s*:\\s*true\\b/.test(body)\n const write = /\\bwrite\\s*:\\s*true\\b/.test(body)\n return { read, write }\n}\n\nfunction routeV2Entry(\n macro: string,\n entry: ParsedV2Entry,\n _sidecar: Map<string, Sidecar>,\n buckets: Buckets,\n leading: string,\n nextPosition: () => number,\n): void {\n if (macro === 'prop') {\n if (entry.isWrapped) {\n const f = parseWrappedFields(entry.rhs)\n buckets.props.push({\n name: entry.name,\n rawType: f.type,\n rawDefault: f.default,\n describe: f.describe,\n expose: f.expose,\n leading,\n })\n }\n return\n }\n if (macro === 'computed' || macro === 'resource') {\n let expr: string\n let describe: string | undefined\n let expose: { read: boolean; write: boolean } | undefined\n if (entry.isWrapped) {\n const f = parseWrappedFields(entry.rhs)\n expr = stripThunk(f.value ?? '')\n describe = f.describe\n expose = f.expose\n } else {\n expr = stripThunk(entry.rhs)\n }\n const target = macro === 'computed' ? buckets.computed : buckets.resource\n target.push({ name: entry.name, expr, describe, expose, leading })\n return\n }\n if (macro === 'action') {\n let handlerSrc: string\n let describe: string | undefined\n let expose: { read: boolean; write: boolean } | undefined\n if (entry.isWrapped) {\n const f = parseWrappedFields(entry.rhs)\n handlerSrc = f.handler ?? ''\n describe = f.describe\n expose = f.expose\n } else {\n handlerSrc = entry.rhs\n }\n const fn = parseArrowOrFunctionExpr(handlerSrc)\n if (!fn) return\n buckets.action.push({\n name: entry.name,\n args: fn.args,\n retType: fn.retType,\n body: fn.body,\n describe,\n expose,\n leading,\n })\n return\n }\n if (macro === 'effect') {\n let expr: string\n let describe: string | undefined\n let expose: { read: boolean; write: boolean } | undefined\n if (entry.isWrapped) {\n const f = parseWrappedFields(entry.rhs)\n expr = stripThunk(f.value ?? '')\n describe = f.describe\n expose = f.expose\n } else {\n expr = stripThunk(entry.rhs)\n }\n buckets.effectNamed.push({ name: entry.name, expr, describe, expose, leading })\n return\n }\n if (macro === 'lifecycle') {\n if (entry.name !== 'mount' && entry.name !== 'dispose') return\n const src = entry.isWrapped ? entry.rhs : entry.rhs\n const fn = parseArrowOrFunctionExpr(src)\n if (!fn) return\n buckets.lifecycle.push({\n kind: entry.name,\n body: fn.body,\n leading,\n position: nextPosition(),\n })\n return\n }\n}\n\n// Strip a leading `() =>` from a thunk if present, returning the inner expr.\n// For wrapped `value: () => expr`, we want to round-trip the bare arrow form\n// so re-emit produces `name: () => expr` identically.\nfunction stripThunk(s: string): string {\n s = s.trim()\n const m = /^\\(\\s*\\)\\s*(?::\\s*[^=]+)?=>\\s*/.exec(s)\n if (!m) return s\n const rest = s.slice(m[0].length)\n if (rest.startsWith('{')) {\n const close = matchBrace(rest, 0)\n if (close < 0) return rest\n return rest.slice(1, close).trim()\n }\n return rest.trim()\n}\n","/**\n * packages/language-server/src/core/code-action.ts\n *\n * QuickFix code-action backing — bridges compiler diagnostic codes C440-C444\n * (rejected old-spec macro forms) to the macro-simplification codemod\n * (`migrate()`), which rewrites a full document to v2 collection-form syntax.\n *\n * Editor-agnostic: this module computes WHAT the fix is (the rewritten text +\n * any warnings). The connection layer (src/server.ts) turns that into a protocol\n * `WorkspaceEdit`/`CodeAction`. This keeps the codemod bridge a clean seam for a\n * future Volar code-action provider.\n *\n * The migrate() codemod is internal monorepo source under @aihu/compiler (not a\n * public package export); imported via the workspace-relative path the same way\n * the original embedded server did.\n */\nimport { migrate } from '../../../compiler/js/codemods/macro-simplification/migrate.ts'\n\n/** Compiler diagnostic codes whose QuickFix is the v2 macro migration codemod. */\nexport const MIGRATE_CODES = new Set(['C440', 'C441', 'C442', 'C443', 'C444'])\n\nexport interface MigrateFix {\n /** The full-document rewritten source. */\n rewritten: string\n /** Codemod warnings (e.g. @agent referencing unknown @state name). */\n warnings: readonly string[]\n /** Human-readable action title (includes warning count when non-zero). */\n title: string\n}\n\n/**\n * Run the macro-simplification codemod over `source` and return the fix payload.\n * Returns `null` when the codemod throws (malformed source) so callers can fall\n * back to offering no action rather than surfacing a crash.\n */\nexport function buildMigrateFix(source: string): MigrateFix | null {\n let result: ReturnType<typeof migrate>\n try {\n result = migrate(source)\n } catch {\n return null\n }\n const { rewritten, warnings } = result\n let title = 'Migrate to v2 macro syntax (aihu codemod)'\n if (warnings.length > 0) {\n title += ` (${warnings.length} warning(s) - see Output panel)`\n }\n return { rewritten, warnings, title }\n}\n","/**\n * packages/language-server/src/core/completion.ts\n *\n * LSP completion items for aihu v2 macro-kind collection-form snippets.\n * Triggered by '$' inside @state block, '@' at top level.\n *\n * Uses inline numeric constants for CompletionItemKind and InsertTextFormat\n * to avoid importing vscode-languageserver at module load time (enables testing\n * without the vscode-languageserver package installed, and keeps this module\n * editor-agnostic — the clean seam for a future Volar adoption).\n */\n\n// CompletionItemKind.Snippet = 15, InsertTextFormat.Snippet = 2\nconst SNIPPET_KIND = 15\nconst SNIPPET_FORMAT = 2\n\nexport interface LspCompletionItem {\n label: string\n kind: number\n insertTextFormat: number\n detail: string\n sortText: string\n insertText: string\n}\n\n/** v2 macro-kind snippet completions (triggered by '$' in @state block). */\nexport const STATE_MACRO_COMPLETIONS: LspCompletionItem[] = [\n {\n label: '$prop',\n kind: SNIPPET_KIND,\n insertTextFormat: SNIPPET_FORMAT,\n detail: 'v2 collection-form prop declarations',\n sortText: '0_$prop',\n insertText: [\n '$prop: {',\n // biome-ignore lint/suspicious/noTemplateCurlyInString: VS Code snippet format uses ${N:placeholder} syntax\n \" ${1:name}: { default: ${2:undefined}, describe: '${3:description}' },\",\n '}',\n ].join('\\n'),\n },\n {\n label: '$computed',\n kind: SNIPPET_KIND,\n insertTextFormat: SNIPPET_FORMAT,\n detail: 'v2 collection-form computed declarations',\n sortText: '0_$computed',\n // biome-ignore lint/suspicious/noTemplateCurlyInString: VS Code snippet format uses ${N:placeholder} syntax\n insertText: ['$computed: {', ' ${1:name}: () => ${2:expression},', '}'].join('\\n'),\n },\n {\n label: '$action',\n kind: SNIPPET_KIND,\n insertTextFormat: SNIPPET_FORMAT,\n detail: 'v2 collection-form action declarations',\n sortText: '0_$action',\n // biome-ignore lint/suspicious/noTemplateCurlyInString: VS Code snippet format uses ${N:placeholder} syntax\n insertText: ['$action: {', ' ${1:name}: (${2:args}) => { ${3:body} },', '}'].join('\\n'),\n },\n {\n label: '$resource',\n kind: SNIPPET_KIND,\n insertTextFormat: SNIPPET_FORMAT,\n detail: 'v2 collection-form resource declarations',\n sortText: '0_$resource',\n // biome-ignore lint/suspicious/noTemplateCurlyInString: VS Code snippet format uses ${N:placeholder} syntax\n insertText: ['$resource: {', ' ${1:name}: () => ${2:fetchExpr()},', '}'].join('\\n'),\n },\n {\n label: '$effect',\n kind: SNIPPET_KIND,\n insertTextFormat: SNIPPET_FORMAT,\n detail: 'v2 anonymous effect declaration',\n sortText: '0_$effect',\n // biome-ignore lint/suspicious/noTemplateCurlyInString: VS Code snippet format uses ${N:placeholder} syntax\n insertText: ['$effect: () => {', ' ${1:body}', '}'].join('\\n'),\n },\n {\n label: '$lifecycle',\n kind: SNIPPET_KIND,\n insertTextFormat: SNIPPET_FORMAT,\n detail: 'v2 collection-form lifecycle hooks',\n sortText: '0_$lifecycle',\n insertText: [\n '$lifecycle: {',\n // biome-ignore lint/suspicious/noTemplateCurlyInString: VS Code snippet format uses ${N:placeholder} syntax\n ' mount: () => { ${1:initBody} },',\n // biome-ignore lint/suspicious/noTemplateCurlyInString: VS Code snippet format uses ${N:placeholder} syntax\n ' dispose: () => { ${2:cleanupBody} },',\n '}',\n ].join('\\n'),\n },\n {\n label: '$emit',\n kind: SNIPPET_KIND,\n insertTextFormat: SNIPPET_FORMAT,\n detail: 'typed custom event declarations',\n sortText: '0_$emit',\n // biome-ignore lint/suspicious/noTemplateCurlyInString: VS Code snippet format uses ${N:placeholder} syntax\n insertText: ['$emit: {', ' ${1:eventName}: (payload: ${2:PayloadType}) => void', '}'].join(\n '\\n',\n ),\n },\n {\n label: '$on',\n kind: SNIPPET_KIND,\n insertTextFormat: SNIPPET_FORMAT,\n detail: 'event listener attribute (template)',\n sortText: '0_$on',\n // biome-ignore lint/suspicious/noTemplateCurlyInString: VS Code snippet format uses ${N:placeholder} syntax\n insertText: '$on.${1:click}={${2:handler}}',\n },\n {\n label: '$bind',\n kind: SNIPPET_KIND,\n insertTextFormat: SNIPPET_FORMAT,\n detail: 'two-way attribute binding (template)',\n sortText: '0_$bind',\n // biome-ignore lint/suspicious/noTemplateCurlyInString: VS Code snippet format uses ${N:placeholder} syntax\n insertText: '$bind.${1:value}={${2:signal}}',\n },\n]\n\n/** Top-level block completions (triggered by '@' at top level). */\nexport const BLOCK_COMPLETIONS: LspCompletionItem[] = [\n {\n label: '@state',\n kind: SNIPPET_KIND,\n insertTextFormat: SNIPPET_FORMAT,\n detail: 'aihu @state block',\n sortText: '0_@state',\n insertText: '@state',\n },\n {\n label: '@template',\n kind: SNIPPET_KIND,\n insertTextFormat: SNIPPET_FORMAT,\n detail: 'aihu @template block',\n sortText: '0_@template',\n insertText: '@template',\n },\n {\n label: '@style',\n kind: SNIPPET_KIND,\n insertTextFormat: SNIPPET_FORMAT,\n detail: 'aihu @style block',\n sortText: '0_@style',\n insertText: '@style',\n },\n {\n label: '@agent',\n kind: SNIPPET_KIND,\n insertTextFormat: SNIPPET_FORMAT,\n detail: 'aihu @agent block for MCP tool exposure',\n sortText: '0_@agent',\n insertText: '@agent',\n },\n {\n label: '@route',\n kind: SNIPPET_KIND,\n insertTextFormat: SNIPPET_FORMAT,\n detail: 'aihu @route block for file-based routing',\n sortText: '0_@route',\n insertText: '@route',\n },\n]\n","/**\n * packages/language-server/src/core/diagnostics.ts\n *\n * Async wrapper around the aihu-compile Rust binary with --machine-errors support.\n * Invoked by the LSP server on every textDocument/didOpen and textDocument/didChange.\n *\n * NOTE: Uses node:child_process execFile (not exec) with argv arrays — safe from\n * shell injection. The LSP server process runs out-of-process for editor isolation.\n *\n * This module is editor-agnostic: it returns plain `AihuDiagnostic` records with\n * 0-based LSP positions. The transport/connection layer (src/server.ts) maps these\n * onto protocol `Diagnostic` objects. Keeping the parse logic here is the clean\n * seam for a future `@volar/language-core` virtual-code adoption (arch-4 §2.7).\n */\nimport { type ExecFileOptionsWithStringEncoding, execFile } from 'node:child_process'\nimport { dirname, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { promisify } from 'node:util'\n\nconst execFileAsync = promisify(execFile)\n\n// execFile honours an `input` option at runtime (written to the child's stdin)\n// but the typed overloads omit it. Extend the string-encoding options type so\n// the call site stays type-safe while feeding source on stdin.\ntype ExecFileStdinOptions = ExecFileOptionsWithStringEncoding & { input: string }\n\nconst ext = process.platform === 'win32' ? '.exe' : ''\n// Resolve binary relative to this module. In the built package the layout is\n// dist/core/diagnostics.js → ../../../compiler/bin/aihu-compile (sibling package\n// in the workspace / installed node_modules). In source/test runs (vitest\n// resolves this file at src/core/diagnostics.ts) the same relative climb lands\n// on packages/compiler/bin/. The AIHU_COMPILE_BIN env var overrides both.\nconst binPath: string =\n process.env.AIHU_COMPILE_BIN ??\n resolve(dirname(fileURLToPath(import.meta.url)), `../../../compiler/bin/aihu-compile${ext}`)\n\n/**\n * The raw JSON shape emitted by the Rust binary with --machine-errors.\n * range uses 1-based lines (Rust internal) and 0-based cols.\n */\ninterface RawMachineError {\n code: string\n message: string\n hint?: string\n fix?: string\n /** Original text token (string) NOT an LSP Position */\n from: string | null\n /** Replacement text (string) NOT an LSP Position */\n to: string | null\n /** { line, col, end_line, end_col } — 1-based line, 0-based col from Rust */\n range: { line: number; col: number; end_line: number; end_col: number } | null\n}\n\n/** Normalised diagnostic with 0-based LSP positions. */\nexport interface AihuDiagnostic {\n code: string\n message: string\n // `| undefined` is explicit so the raw compiler error's optional hint/fix\n // (which may be undefined) assign cleanly under exactOptionalPropertyTypes.\n hint?: string | undefined\n fix?: string | undefined\n /** Original source text to replace (for code-action text edits). */\n fromText: string | null\n /** Replacement text (for code-action text edits). */\n toText: string | null\n /** 0-based LSP range. null when position is unknown. */\n range: {\n start: { line: number; character: number }\n end: { line: number; character: number }\n } | null\n}\n\nfunction toAihuDiagnostic(raw: RawMachineError): AihuDiagnostic {\n let lspRange: AihuDiagnostic['range'] = null\n if (raw.range && raw.range.line > 0) {\n // Rust uses 1-based lines; convert to 0-based for LSP.\n const startLine = raw.range.line - 1\n const endLine = raw.range.end_line - 1\n lspRange = {\n start: { line: startLine, character: raw.range.col },\n end: { line: endLine, character: raw.range.end_col },\n }\n }\n return {\n code: raw.code,\n message: raw.message,\n hint: raw.hint,\n fix: raw.fix,\n fromText: raw.from ?? null,\n toText: raw.to ?? null,\n range: lspRange,\n }\n}\n\n/**\n * Fallback: parse a plain-text compiler error into a synthetic diagnostic.\n * Used when the binary does not emit JSON (very old binary or stdin parse error).\n * TODO: remove when --machine-errors covers all error paths.\n */\nfunction parsePlainError(stderr: string, _filePath: string): AihuDiagnostic {\n const m = /\\b(\\d+):\\s*(.+)/.exec(stderr)\n const line = m ? Math.max(0, Number.parseInt(m[1]!, 10) - 1) : 0\n const message = m ? m[2]! : stderr.trim() || 'Unknown compiler error'\n return {\n code: 'C000',\n message,\n fromText: null,\n toText: null,\n range: {\n start: { line, character: 0 },\n end: { line, character: 0 },\n },\n }\n}\n\nexport interface CompileResult {\n code: string | null\n diagnostics: AihuDiagnostic[]\n}\n\n/**\n * Parse the Rust binary's `--machine-errors` stderr stream into structured\n * diagnostics. Each JSON line is one error; non-JSON lines are skipped. When no\n * JSON is present at all, falls back to a single synthetic plain-text diagnostic.\n *\n * Pure function — no I/O. Exposed so editors/tests can exercise the mapping\n * without spawning the compiler.\n */\nexport function parseMachineErrors(stderr: string, filePath: string): AihuDiagnostic[] {\n const diagnostics: AihuDiagnostic[] = []\n let jsonParsed = false\n for (const line of stderr.split('\\n')) {\n const trimmed = line.trim()\n if (!trimmed?.startsWith('{')) continue\n try {\n const raw = JSON.parse(trimmed) as RawMachineError\n diagnostics.push(toAihuDiagnostic(raw))\n jsonParsed = true\n } catch {\n // not a JSON line — skip\n }\n }\n if (!jsonParsed) {\n diagnostics.push(parsePlainError(stderr, filePath))\n }\n return diagnostics\n}\n\n/**\n * Compile a .aihu source string via stdin, returning structured diagnostics.\n */\nexport async function compileWithDiagnostics(\n source: string,\n filePath: string,\n): Promise<CompileResult> {\n const stem =\n filePath\n .replace(/\\\\/g, '/')\n .split('/')\n .pop()\n ?.replace(/\\.aihu$/, '') ?? 'component'\n\n try {\n const options: ExecFileStdinOptions = {\n input: source,\n encoding: 'utf8',\n maxBuffer: 8 * 1024 * 1024,\n }\n const { stdout } = await execFileAsync(\n binPath,\n ['--stdin', '--tag', stem, '--path', filePath, '--machine-errors'],\n options,\n )\n return { code: stdout, diagnostics: [] }\n } catch (err: unknown) {\n const stderr: string = (err as { stderr?: string }).stderr ?? ''\n return { code: null, diagnostics: parseMachineErrors(stderr, filePath) }\n }\n}\n","/**\n * packages/language-server/src/core/hover.ts\n *\n * Static hover lookup table for aihu macro keywords.\n * Used by the LSP server textDocument/hover handler.\n *\n * Editor-agnostic: returns Markdown strings + does pure position math. The\n * connection layer wraps the result in a protocol `Hover`. Clean seam for a\n * future Volar virtual-code hover provider.\n */\n\nconst HOVER_TABLE: Record<string, string> = {\n $prop: [\n '**aihu macro: `$prop`**',\n '',\n 'Declares reactive prop signals from parent attributes.',\n '',\n 'Compiles to:',\n '```typescript',\n 'const name = computed(() => ctx.attrs.name)',\n '```',\n '',\n '[v2 spec](docs/superpowers/specs/2026-05-05-spec-macro-vocabulary-v2.md)',\n ].join('\\n'),\n\n $computed: [\n '**aihu macro: `$computed`**',\n '',\n 'Declares a derived signal.',\n '',\n 'Compiles to:',\n '```typescript',\n 'const name = computed(() => expr)',\n '```',\n '',\n '[v2 spec](docs/superpowers/specs/2026-05-05-spec-macro-vocabulary-v2.md)',\n ].join('\\n'),\n\n $action: [\n '**aihu macro: `$action`**',\n '',\n 'Declares a callable action in component scope.',\n '',\n 'Compiles to:',\n '```typescript',\n 'function name(args) { return batch(() => { body }) }',\n '```',\n '',\n '',\n '> **Agent-side context:** `$action` is primarily for agent/MCP handler scope. In `@state` blocks, prefer `$computed` for derived values or direct function declarations. See macro-vocabulary-v2 §5.',\n '[v2 spec](docs/superpowers/specs/2026-05-05-spec-macro-vocabulary-v2.md)',\n ].join('\\n'),\n\n $resource: [\n '**aihu macro: `$resource`**',\n '',\n 'Declares an async data resource signal.',\n '',\n 'Compiles to:',\n '```typescript',\n 'const name = createResource(() => expr)',\n '```',\n '',\n '[v2 spec](docs/superpowers/specs/2026-05-05-spec-macro-vocabulary-v2.md)',\n ].join('\\n'),\n\n $effect: [\n '**aihu macro: `$effect`**',\n '',\n 'Declares a reactive side effect.',\n '',\n 'Compiles to:',\n '```typescript',\n 'effect(() => { body })',\n '```',\n '',\n '[v2 spec](docs/superpowers/specs/2026-05-05-spec-macro-vocabulary-v2.md)',\n ].join('\\n'),\n\n $lifecycle: [\n '**aihu macro: `$lifecycle`**',\n '',\n 'Declares lifecycle hooks (mount, dispose, adopt, attributeChange).',\n '',\n 'Compiles to:',\n '```typescript',\n 'onMount(() => { ... })',\n 'onCleanup(() => { ... })',\n '```',\n '',\n '[v2 spec](docs/superpowers/specs/2026-05-05-spec-macro-vocabulary-v2.md)',\n ].join('\\n'),\n\n $if: [\n '**aihu template directive: `$if` / `{#if}`**',\n '',\n 'Conditional rendering.',\n '',\n 'Compiles to:',\n '```typescript',\n 'branch(condition, () => trueBranch)',\n '```',\n '',\n '[Template spec](docs/superpowers/specs/2026-05-05-spec-macro-vocabulary-v2.md)',\n ].join('\\n'),\n\n $each: [\n '**aihu template directive: `$each` / `{#each}`**',\n '',\n 'List rendering.',\n '',\n 'Compiles to:',\n '```typescript',\n 'branch.each(items, (item) => leaf(...))',\n '```',\n '',\n '[Template spec](docs/superpowers/specs/2026-05-05-spec-macro-vocabulary-v2.md)',\n ].join('\\n'),\n\n $html: [\n '**aihu template directive: `$html` / `{@html}`**',\n '',\n 'Raw HTML injection. Use with trusted content only.',\n '',\n 'Compiles to:',\n '```typescript',\n 'leaf({ nodeValue: htmlContent })',\n '```',\n '',\n '[Template spec](docs/superpowers/specs/2026-05-05-spec-macro-vocabulary-v2.md)',\n ].join('\\n'),\n\n $show: [\n '**aihu template directive: `$show`**',\n '',\n 'Toggles element visibility without removing it from the DOM.',\n '',\n 'Compiles to:',\n '```typescript',\n 'el.style.display = condition ? \"\" : \"none\"',\n '```',\n '',\n '[Template spec](docs/superpowers/specs/2026-05-05-spec-macro-vocabulary-v2.md)',\n ].join('\\n'),\n\n $on: [\n '**aihu template directive: `$on`**',\n '',\n 'Attaches an event listener to a DOM element.',\n '',\n 'Compiles to:',\n '```typescript',\n 'element.addEventListener(\"event\", handler)',\n '```',\n '',\n 'Usage: `$on.click={handler}`',\n '',\n '[Template spec](docs/superpowers/specs/2026-05-05-spec-macro-vocabulary-v2.md)',\n ].join('\\n'),\n\n $bind: [\n '**aihu template directive: `$bind`**',\n '',\n 'Two-way binding between a signal and an element attribute.',\n '',\n 'Compiles to:',\n '```typescript',\n '// two-way binding via signal setter',\n 'el.addEventListener(\"input\", e => setSignal(e.target.value))',\n '```',\n '',\n 'Usage: `$bind.value={signal}`',\n '',\n '[Template spec](docs/superpowers/specs/2026-05-05-spec-macro-vocabulary-v2.md)',\n ].join('\\n'),\n\n $emit: [\n '**aihu macro: `$emit`**',\n '',\n 'Declares and dispatches typed custom events.',\n '',\n 'Compiles to:',\n '```typescript',\n 'this.dispatchEvent(new CustomEvent(name, { detail: payload }))',\n '```',\n '',\n 'Usage: `$emit.name(payload)`',\n '',\n '[Template syntax v2 spec](docs/superpowers/specs/2026-05-06-spec-template-syntax-v2.md)',\n ].join('\\n'),\n\n // ---------------------------------------------------------------------------\n // @state macros (new in round-0 per director-note §3.1)\n // ---------------------------------------------------------------------------\n\n // Source: 2026-05-02-spec-macro-vocabulary.md §2.6 lines 385-431\n $watch: [\n '**aihu macro: `$watch`**',\n '',\n 'Imperative subscription to a value with access to prev and next values.',\n '',\n 'Compiles to:',\n '```typescript',\n 'let _prev = source',\n 'effect(() => { const _next = source; if (_next !== _prev) { callback(_next, _prev); _prev = _next } })',\n '```',\n '',\n 'Does NOT run on mount. Callback runs in an untracked context.',\n '',\n '[v1 spec §2.6](docs/superpowers/specs/2026-05-02-spec-macro-vocabulary.md)',\n ].join('\\n'),\n\n // Source: 2026-05-02-spec-macro-vocabulary.md §2.9 lines 537-575 (@state)\n // plus 2026-05-05-spec-macro-vocabulary-v2.md §4 lines 208-216 (C440 — agent-side $expose removed)\n $expose: [\n '**aihu macro: `$expose`**',\n '',\n 'Marks `@state` declarations as accessible from a parent via template ref',\n '(equivalent to Vue `defineExpose`). By default `@state` entries are private.',\n '',\n 'Compiles to:',\n '```typescript',\n 'defineExpose({ name1, name2, ... })',\n '```',\n '',\n 'Usage: `$expose name1, name2` or `$expose { name1, name2 }`',\n '',\n '**Deprecated in v2 (C440)** when used INSIDE `@agent`. The agent-side',\n '`$expose` (and `$expose.write`) are removed; replace with per-name',\n '`expose: { read: true }` or `expose: { read: true, write: true }` on the',\n 'corresponding `@state` collection entry.',\n '',\n '[v1 spec §2.9](docs/superpowers/specs/2026-05-02-spec-macro-vocabulary.md)',\n '[v2 spec §4 (C440)](docs/superpowers/specs/2026-05-05-spec-macro-vocabulary-v2.md)',\n ].join('\\n'),\n\n // Source: 2026-05-02-spec-macro-vocabulary.md §2.10 lines 577-615\n $shared: [\n '**aihu macro: `$shared`**',\n '',\n 'SSR-safe global state shared across components; survives hydration.',\n '',\n 'Compiles to:',\n '```typescript',\n \"const name = useSharedState(key ?? 'auto-' + componentId + '-' + name, defaultValue)\",\n '```',\n '',\n 'Usage: `$shared name: type = defaultValue` or `$shared(key) name: type = default`',\n '',\n '[v1 spec §2.10](docs/superpowers/specs/2026-05-02-spec-macro-vocabulary.md)',\n ].join('\\n'),\n\n // Source: 2026-05-02-spec-macro-vocabulary.md §2.11 lines 617-653\n $cookie: [\n '**aihu macro: `$cookie`**',\n '',\n 'Reactive binding to a cookie value (SSR-safe).',\n '',\n 'Compiles to:',\n '```typescript',\n \"const name = useCookie<type>('name', { defaultValue, ...options })\",\n '```',\n '',\n 'Usage: `$cookie name: string = \"\"` or `$cookie({ maxAge: 86400 }) sessionId: string = \"\"`',\n '',\n '[v1 spec §2.11](docs/superpowers/specs/2026-05-02-spec-macro-vocabulary.md)',\n ].join('\\n'),\n\n // Source: 2026-05-02-spec-macro-vocabulary.md §2.12 lines 655-701\n $server: [\n '**aihu macro: `$server`**',\n '',\n 'Declares a function that runs only on the server; client calls via RPC.',\n '',\n 'Compiles to:',\n '```typescript',\n '// Server: actual implementation in _aihu-server/actions/{component-id}/{name}.ts',\n \"const name = createServerCall<Args, Return>('component-id/name')\",\n '```',\n '',\n 'Function body is never bundled to the client. Args/return must be serializable.',\n '',\n '[v1 spec §2.12](docs/superpowers/specs/2026-05-02-spec-macro-vocabulary.md)',\n ].join('\\n'),\n\n // Source: 2026-05-02-spec-macro-vocabulary.md §2.13 lines 703-749\n $meta: [\n '**aihu macro: `$meta`**',\n '',\n 'Declares page metadata (title, description, OG tags).',\n '',\n 'Compiles to:',\n '```typescript',\n 'useHead({ title, description, og })',\n '// or dynamic: useHead(() => ({ title: dynamicTitle }))',\n '```',\n '',\n 'Multiple `$meta` blocks merge (later overrides earlier). SSR-emitted into `<head>`.',\n '',\n '[v1 spec §2.13](docs/superpowers/specs/2026-05-02-spec-macro-vocabulary.md)',\n ].join('\\n'),\n\n // ---------------------------------------------------------------------------\n // @template macros (new in round-0 per director-note §3.1)\n // ---------------------------------------------------------------------------\n\n // Source: 2026-05-02-spec-macro-vocabulary.md §3.6 lines 947-976\n $key: [\n '**aihu template directive: `$key`**',\n '',\n 'Stable identity for list reconciliation inside `$each`.',\n '',\n 'Compiles to:',\n '```typescript',\n 'createEachBoundary({ key: (item) => keyExpr, ... })',\n '```',\n '',\n 'Usage: `<li $each=\"users as u\" $key=\"u.id\">{u.name}</li>`',\n '',\n '[v1 spec §3.6](docs/superpowers/specs/2026-05-02-spec-macro-vocabulary.md)',\n ].join('\\n'),\n\n // Source: 2026-05-02-spec-macro-vocabulary.md §3.8 lines 1006-1028\n $raw: [\n '**aihu template directive: `$raw`**',\n '',\n 'Skip compilation of the element subtree. Boolean-only (no value).',\n '',\n 'Interpolations like `{x}`, macros, and bindings inside are NOT processed —',\n 'the subtree renders as static content.',\n '',\n \"Usage: `<pre $raw>{this looks like interpolation but isn't}</pre>`\",\n '',\n '[v1 spec §3.8](docs/superpowers/specs/2026-05-02-spec-macro-vocabulary.md)',\n ].join('\\n'),\n\n // Source: 2026-05-02-spec-macro-vocabulary.md §3.9 lines 1030-1061\n $once: [\n '**aihu template directive: `$once`**',\n '',\n 'Render subtree once at mount; never update. Boolean-only.',\n '',\n 'Compiles to:',\n '```typescript',\n 'createOnceBoundary({ build: () => subtree, parent: parentEl })',\n '```',\n '',\n 'No reactive subscriptions inside. Subtree never re-renders.',\n '',\n '[v1 spec §3.9](docs/superpowers/specs/2026-05-02-spec-macro-vocabulary.md)',\n ].join('\\n'),\n\n // Source: 2026-05-02-spec-macro-vocabulary.md §3.10 lines 1063-1097\n $memo: [\n '**aihu template directive: `$memo`**',\n '',\n 'Memoize an element subtree by explicit dependencies (curly form only).',\n '',\n 'Compiles to:',\n '```typescript',\n 'createMemoBoundary({ deps: () => [dep1, dep2], build: () => subtree })',\n '```',\n '',\n 'Usage: `<ExpensiveChart $memo={[data, settings]} />`',\n '',\n '[v1 spec §3.10](docs/superpowers/specs/2026-05-02-spec-macro-vocabulary.md)',\n ].join('\\n'),\n\n // Source: 2026-05-02-spec-macro-vocabulary.md §3.12 lines 1141-1194\n '<$slot>': [\n '**aihu template element: `<$slot>`**',\n '',\n 'Children passthrough or named slot.',\n '',\n 'Compiles to:',\n '```typescript',\n \"const slotN = useSlot('name', defaultContent)\",\n 'slotN.render({ exposed: { user, index } })',\n '```',\n '',\n 'Usage: `<$slot />`, `<$slot name=\"header\">default</$slot>`,',\n '`<$slot name=\"row\" expose=\"user, index\" />`',\n '',\n '[v1 spec §3.12](docs/superpowers/specs/2026-05-02-spec-macro-vocabulary.md)',\n ].join('\\n'),\n\n // Source: 2026-05-02-spec-macro-vocabulary.md §3.13 lines 1196-1244\n '<$suspense>': [\n '**aihu template element: `<$suspense>`**',\n '',\n 'Loading boundary for async data (`$resource`).',\n '',\n 'Compiles to:',\n '```typescript',\n 'createSuspenseBoundary({ fallback, fallbackProps, build, parent })',\n '```',\n '',\n 'While any tracked resource is loading, renders `fallback`. Once all ready,',\n 'swaps to actual content. Streaming SSR-compatible.',\n '',\n '[v1 spec §3.13](docs/superpowers/specs/2026-05-02-spec-macro-vocabulary.md)',\n ].join('\\n'),\n\n // Source: 2026-05-02-spec-macro-vocabulary.md §3.14 lines 1246-1290\n '<$shield>': [\n '**aihu template element: `<$shield>`**',\n '',\n 'Error boundary.',\n '',\n 'Compiles to:',\n '```typescript',\n 'createShieldBoundary({ fallback, onError, build, parent })',\n '```',\n '',\n 'Catches errors during render, in effects, and unhandled `$resource` errors.',\n 'Slot context: `shield.error`, `shield.retry`.',\n '',\n '[v1 spec §3.14](docs/superpowers/specs/2026-05-02-spec-macro-vocabulary.md)',\n ].join('\\n'),\n\n // Source: 2026-05-02-spec-macro-vocabulary.md §3.15 lines 1292-1349\n '<$guard>': [\n '**aihu template element: `<$guard>`**',\n '',\n 'Access-control boundary (scope, permissions, rate limit).',\n '',\n 'Compiles to:',\n '```typescript',\n 'createGuardBoundary({ scope, permissions, rateLimit, fallback, redirect, onDeny, build })',\n '```',\n '',\n 'Usage: `<$guard scope=\"authenticated\" fallback=\"LoginPrompt\"><Page /></$guard>`',\n 'Slot context: `guard.user`, `guard.reason`, `guard.path`.',\n '',\n '[v1 spec §3.15](docs/superpowers/specs/2026-05-02-spec-macro-vocabulary.md)',\n ].join('\\n'),\n\n // Source: 2026-05-02-spec-macro-vocabulary.md §3.16 lines 1351-1397\n '<$warp>': [\n '**aihu template element: `<$warp>`**',\n '',\n 'Render content into a different DOM location (portal).',\n '',\n 'Compiles to:',\n '```typescript',\n 'createWarpBoundary({ target: () => to, condition: () => $if, build })',\n '```',\n '',\n 'Usage: `<$warp to=\"#modal-root\"><Dialog /></$warp>`',\n '',\n '[v1 spec §3.16](docs/superpowers/specs/2026-05-02-spec-macro-vocabulary.md)',\n ].join('\\n'),\n\n // ---------------------------------------------------------------------------\n // @style macros (new in round-0 per director-note §3.1)\n // ---------------------------------------------------------------------------\n\n // Source: 2026-05-02-spec-macro-vocabulary.md §4.1 lines 1405-1443\n $reactive: [\n '**aihu @style macro: `$reactive`**',\n '',\n 'Bind a CSS property to a reactive expression via a CSS custom property.',\n '',\n 'Compiles to:',\n '```typescript',\n \"effect(() => rootEl.style.setProperty('--reactive-N', String(expr)))\",\n '/* CSS: .aihu-component { property: var(--reactive-N) } */',\n '```',\n '',\n 'Usage: `h1 { color: $reactive(error ? \"red\" : \"black\") }`',\n '',\n '[v1 spec §4.1](docs/superpowers/specs/2026-05-02-spec-macro-vocabulary.md)',\n ].join('\\n'),\n\n // Source: 2026-05-02-spec-macro-vocabulary.md §4.2 lines 1445-1479\n $tokens: [\n '**aihu @style macro: `$tokens`**',\n '',\n 'Import design tokens from project config (`aihu.config.ts` `style.tokens`).',\n '',\n 'Lowering depends on mode:',\n '- `tokens` mode → CSS custom properties (e.g. `--color-primary`)',\n '- `tailwind` mode → mapped to Tailwind class equivalents',\n '- `plain` mode → inlined raw values',\n '',\n 'Usage: `$tokens(spacing, color, typography)`',\n '',\n '[v1 spec §4.2](docs/superpowers/specs/2026-05-02-spec-macro-vocabulary.md)',\n ].join('\\n'),\n\n // Source: 2026-05-02-spec-macro-vocabulary.md §4.3 lines 1481-1516\n $global: [\n '**aihu @style macro: `$global`**',\n '',\n 'Emit unscoped CSS rules (escape from component scoping).',\n '',\n 'Usage:',\n '```',\n '@style {',\n ' $global { body { margin: 0 } * { box-sizing: border-box } }',\n '}',\n '```',\n '',\n '`$reactive` inside `$global` targets `document.documentElement`.',\n '',\n '[v1 spec §4.3](docs/superpowers/specs/2026-05-02-spec-macro-vocabulary.md)',\n ].join('\\n'),\n\n // Source: 2026-05-02-spec-macro-vocabulary.md §4.4 lines 1518-1556\n $media: [\n '**aihu @style macro: `$media`**',\n '',\n 'CSS media-query block.',\n '',\n 'Compiles to:',\n '```css',\n '@media (query) { rules }',\n '```',\n '',\n 'Usage: `$media(min-width: 768px) { h1 { font-size: 2rem } }`',\n '',\n '[v1 spec §4.4](docs/superpowers/specs/2026-05-02-spec-macro-vocabulary.md)',\n ].join('\\n'),\n\n // Source: 2026-05-02-spec-macro-vocabulary.md §4.5 lines 1558-1604\n $when: [\n '**aihu @style macro: `$when`**',\n '',\n 'Apply styles conditionally based on a signal value.',\n '',\n 'Compiles to:',\n '```typescript',\n 'effect(() => { rootEl.dataset.whenN = String(condition) })',\n '/* CSS: .aihu-component[data-when-N=\"true\"] { rules } */',\n '```',\n '',\n 'Usage: `$when(loading) { root { opacity: 0.5 } }`',\n '',\n '[v1 spec §4.5](docs/superpowers/specs/2026-05-02-spec-macro-vocabulary.md)',\n ].join('\\n'),\n\n // ---------------------------------------------------------------------------\n // @agent macros (new in round-0 per director-note §3.1)\n // ---------------------------------------------------------------------------\n\n // Source: 2026-05-02-spec-macro-vocabulary.md §5.4 lines 1730-1766\n // plus 2026-05-05-spec-macro-vocabulary-v2.md §4 lines 199-203 (retained in v2)\n $scope: [\n '**aihu @agent macro: `$scope`**',\n '',\n 'Declares the auth scope required to access this component agent surface.',\n '',\n 'Compiles to scope metadata attached to all MCP resources/tools registered',\n 'for this component. Every agent request is checked against the scope.',\n '',\n 'Usage: `$scope authenticated`',\n '',\n '[v2 spec §4](docs/superpowers/specs/2026-05-05-spec-macro-vocabulary-v2.md)',\n ].join('\\n'),\n\n // Source: 2026-05-02-spec-macro-vocabulary.md §5.5 lines 1768-1807\n // plus 2026-05-05-spec-macro-vocabulary-v2.md §4 lines 199-203 (retained in v2)\n '$rate-limit': [\n '**aihu @agent macro: `$rate-limit`**',\n '',\n 'Override the default rate limit for this component agent surface.',\n '',\n 'Compiles to rate-limit metadata attached to MCP tools. Per-component limit',\n 'composes with scope-level limits (tighter wins). Counted per user per component.',\n '',\n 'Usage: `$rate-limit \"100/min\"`, `$rate-limit \"unlimited\"`',\n '',\n '[v2 spec §4](docs/superpowers/specs/2026-05-05-spec-macro-vocabulary-v2.md)',\n ].join('\\n'),\n\n // Source: 2026-05-02-spec-macro-vocabulary.md §5.6 lines 1809-1840 (v1 form)\n // plus 2026-05-05-spec-macro-vocabulary-v2.md §4 lines 208-216 (C440 — removed in v2)\n $describe: [\n '**aihu @agent macro: `$describe`**',\n '',\n '**Deprecated in v2 (C440)**. Replace with per-name `describe: \"<text>\"`',\n 'on the corresponding `@state` collection entry.',\n '',\n 'v1 form (for migration reference only):',\n '```',\n '$describe name \"description string\"',\n '$describe { name1: \"...\", name2: \"...\" }',\n '```',\n '',\n 'v2 replacement:',\n '```',\n '@state {',\n ' $prop: {',\n \" name: { default: undefined, describe: 'description string' },\",\n ' }',\n '}',\n '```',\n '',\n '[v1 spec §5.6](docs/superpowers/specs/2026-05-02-spec-macro-vocabulary.md)',\n '[v2 spec §4 (C440)](docs/superpowers/specs/2026-05-05-spec-macro-vocabulary-v2.md)',\n ].join('\\n'),\n}\n\nexport function getBlockContext(\n lines: string[],\n lineIndex: number,\n): 'state' | 'template' | 'style' | 'agent' | 'route' | 'unknown' {\n for (let i = lineIndex; i >= 0; i--) {\n const trimmed = lines[i]!.trimStart()\n if (/^@state\\s*\\{/.test(trimmed)) return 'state'\n if (/^@template\\s*\\{/.test(trimmed)) return 'template'\n if (/^@style\\s*\\{/.test(trimmed)) return 'style'\n if (/^@agent\\s*\\{/.test(trimmed)) return 'agent'\n if (/^@route\\s*\\{/.test(trimmed)) return 'route'\n }\n return 'unknown'\n}\n\nexport function getMacroAtPosition(lineText: string, character: number): string | null {\n let m: RegExpExecArray | null\n // Template-element forms: <$slot>, <$suspense>, <$shield>, <$guard>, <$warp>.\n // Returns the bracketed form (e.g. `<$slot>`) so HOVER_TABLE entries keyed\n // with the angle-bracketed form (per director-note §3.3) resolve correctly.\n const elementRe = /<\\$(slot|suspense|shield|guard|warp)\\b/g\n while ((m = elementRe.exec(lineText)) !== null) {\n if (character >= m.index && character <= m.index + m[0].length) {\n return `<$${m[1]!}>`\n }\n }\n // Namespaced/dotted forms. Returns the bare prefix (`$effect`, `$lifecycle`,\n // `$expose`, `$emit`, `$on`, `$bind`) for dotted/colon-suffixed forms; the\n // bare HOVER_TABLE entries cover the family by design (dotted-form folding\n // per director-note §3.8).\n // Word-boundary after the captured prefix prevents accidental matches like\n // `$once` getting absorbed by `$on` or `$effect.on` being absorbed by `$effect`\n // when the bare regex would otherwise be the better resolver.\n const namespacedRe = /\\$(on|bind|effect|lifecycle|expose|emit)(?:[.:][A-Za-z_$][\\w$]*)?\\b/g\n while ((m = namespacedRe.exec(lineText)) !== null) {\n if (character >= m.index && character <= m.index + m[0].length) {\n return `$${m[1]!}`\n }\n }\n // Bare-form macros. `rate-limit` includes a hyphen — the regex captures it\n // as a single token; we still return `$rate-limit` literally.\n const bareRe =\n /\\$(prop|computed|action|resource|effect|lifecycle|emit|if|each|html|show|watch|shared|cookie|server|meta|key|raw|once|memo|reactive|tokens|global|media|when|scope|rate-limit|describe)\\b/g\n while ((m = bareRe.exec(lineText)) !== null) {\n if (character >= m.index && character <= m.index + m[0].length) {\n return `$${m[1]!}`\n }\n }\n const blockRe = /\\{(?:#(if|each)|@(html))\\b/g\n while ((m = blockRe.exec(lineText)) !== null) {\n if (character >= m.index && character <= m.index + m[0].length) {\n const keyword = m[1] ?? m[2]!\n return `$${keyword}`\n }\n }\n return null\n}\n\nexport function getHoverContent(macro: string): string | null {\n return HOVER_TABLE[macro] ?? null\n}\n","/**\n * packages/language-server/src/core/state-generator.ts\n *\n * Virtual TypeScript file generator for the @state block of a .aihu SFC.\n * Parses the @state block using inline regex + brace-depth walking (no AST, no\n * JSON.parse — values may contain non-JSON expressions). Produces a virtual\n * __state__.ts module string plus character-level source-map entries.\n *\n * See: .context/m2/a4/round-1/architect-brief-volar-refactor.md §2\n */\nimport type { IScriptSnapshot } from '@volar/language-core'\nimport type { AihuCodeMapping } from './virtual-source-map.ts'\n\n// ---------------------------------------------------------------------------\n// Public interfaces (§2.1 / §2.2)\n// ---------------------------------------------------------------------------\n\nexport interface GeneratorInput {\n /** Full text of the .aihu source file */\n source: string\n /** IScriptSnapshot from Volar — use snapshot.getText(0, snapshot.getLength()) */\n snapshot: IScriptSnapshot\n}\n\nexport interface GeneratorOutput {\n /** Content of the virtual TypeScript file (e.g. Counter.__state__.ts) */\n virtualCode: string\n /** Source-map entries — character-level, one per mapped identifier */\n mappings: AihuCodeMapping[]\n}\n\n// ---------------------------------------------------------------------------\n// Module header (not mapped — preamble only)\n// ---------------------------------------------------------------------------\n\nconst VIRTUAL_HEADER = [\n \"import type { createResource as _cr } from '@aihu/runtime'\",\n 'export {}',\n 'declare const __aihu_state__: unique symbol',\n '',\n].join('\\n')\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Find the matching closing brace for an opening brace at `openPos` in `text`.\n * Returns the index of the `}` character, or -1 if not found.\n */\nfunction findMatchingBrace(text: string, openPos: number): number {\n let depth = 0\n for (let i = openPos; i < text.length; i++) {\n if (text[i] === '{') depth++\n else if (text[i] === '}') {\n depth--\n if (depth === 0) return i\n }\n }\n return -1\n}\n\n/**\n * Extract the value text for a macro key starting at `colonPos` (position of\n * the `:` after the macro key name) using a brace-depth walk. Returns the raw\n * value string (may be a brace-enclosed object or a simple expression).\n */\nfunction extractMacroValue(text: string, colonPos: number): string {\n // Skip whitespace after ':'\n let start = colonPos + 1\n while (start < text.length && (text[start] === ' ' || text[start] === '\\t')) start++\n if (start >= text.length) return ''\n\n if (text[start] === '{') {\n const close = findMatchingBrace(text, start)\n if (close === -1) return text.slice(start)\n return text.slice(start, close + 1)\n }\n\n // Non-brace value: read to next newline or comma\n const end = text.indexOf('\\n', start)\n return end === -1 ? text.slice(start) : text.slice(start, end)\n}\n\n/**\n * Infer the TypeScript type from a `default:` value in a macro entry object.\n * Handles number, string, boolean literals, null/undefined, and verbatim `type:` key.\n */\nfunction inferType(entryText: string): string {\n // Check for explicit `type:` key first\n const typeMatch = /\\btype\\s*:\\s*(['\"`]?)(\\w[\\w.<>, [\\]|&?]*)\\1/.exec(entryText)\n if (typeMatch) return typeMatch[2]!\n\n // Check for `default:` value\n const defMatch = /\\bdefault\\s*:\\s*([^,}\\n]+)/.exec(entryText)\n if (!defMatch) return 'unknown'\n\n const val = defMatch[1]!.trim()\n if (/^-?\\d+(\\.\\d+)?$/.test(val)) return 'number'\n if (/^(['\"`]).*\\1$/.test(val)) return 'string'\n if (val === 'true' || val === 'false') return 'boolean'\n if (val === 'null' || val === 'undefined') return 'unknown'\n\n // Could be a more complex expression — fall back\n return 'unknown'\n}\n\n/**\n * Extract the default value string from a macro entry for use in the virtual\n * TS initialiser. Numbers stay as-is; strings stay as-is; others → 0 as any.\n */\nfunction inferDefault(entryText: string, type: string): string {\n const defMatch = /\\bdefault\\s*:\\s*([^,}\\n]+)/.exec(entryText)\n if (!defMatch) return '0 as any'\n const val = defMatch[1]!.trim()\n if (type === 'number') return `${val} as any`\n if (type === 'string') return `${val} as any`\n if (type === 'boolean') return `${val} as any`\n return '0 as any'\n}\n\n// CodeInformation flags for mapped identifiers (§3.2)\nconst MAPPED_DATA = {\n verification: false,\n completion: true,\n semantic: true,\n navigation: true,\n structure: true,\n} as const\n\n// ---------------------------------------------------------------------------\n// Macro lowering (§2.4)\n// ---------------------------------------------------------------------------\n\n/**\n * Lower a single macro block into virtual TS lines.\n * Returns an array of { line, sourceNameOffset, generatedNameOffset, nameLen } records.\n */\ninterface LoweredDecl {\n code: string\n /** character offset in source where the identifier appears (for source-map) */\n sourceNameOffset: number\n /** whether this identifier should be mapped */\n mapped: boolean\n nameLen: number\n}\n\nfunction lowerMacro(\n macroKey: string,\n valueText: string,\n macroKeyOffset: number,\n source: string,\n): LoweredDecl[] {\n const results: LoweredDecl[] = []\n\n // Parse the value text — it should be a brace-enclosed object { name: { ... }, ... }\n // We iterate over top-level keys by scanning lines inside the value block\n const inner = valueText.startsWith('{') ? valueText.slice(1, valueText.length - 1) : valueText\n\n // Find each property name (top-level key) in the entry object\n // We scan the inner text at brace-depth 0 for `identifier:` patterns\n let depth = 0\n let i = 0\n while (i < inner.length) {\n const ch = inner[i]\n if (ch === '{') {\n depth++\n i++\n continue\n }\n if (ch === '}') {\n depth--\n i++\n continue\n }\n\n if (depth === 0 && ch !== undefined) {\n // Try to match an identifier key at this position\n const identMatch = /^(\\w[\\w-]*)(\\s*):/.exec(inner.slice(i))\n if (identMatch) {\n const name = identMatch[1]!\n // Find the colon position in the inner text for value extraction\n const colonPos = i + identMatch[0].length - 1 // position of ':'\n\n // Get the value of this named entry\n let entryValue = ''\n const afterColon = inner.slice(colonPos + 1).trimStart()\n if (afterColon.startsWith('{')) {\n const absColonPos = colonPos + 1\n let s = absColonPos\n // Skip whitespace\n while (s < inner.length && (inner[s] === ' ' || inner[s] === '\\t' || inner[s] === '\\n'))\n s++\n if (inner[s] === '{') {\n const close = findMatchingBrace(inner, s)\n entryValue = close === -1 ? inner.slice(s) : inner.slice(s, close + 1)\n i = close !== -1 ? close + 1 : inner.length\n } else {\n const eol = inner.indexOf('\\n', s)\n entryValue = eol === -1 ? inner.slice(s) : inner.slice(s, eol)\n i = eol !== -1 ? eol + 1 : inner.length\n }\n } else {\n const eol = inner.indexOf('\\n', colonPos + 1)\n entryValue = eol === -1 ? inner.slice(colonPos + 1) : inner.slice(colonPos + 1, eol)\n i = eol !== -1 ? eol + 1 : inner.length\n }\n\n // Find the source offset of this name in the original source\n // Search from macroKeyOffset forward for the name identifier\n const searchFrom = macroKeyOffset\n const nameInSource = source.indexOf(name, searchFrom)\n\n const decl = buildDecl(macroKey, name, entryValue, nameInSource)\n if (decl) results.push(decl)\n continue\n }\n }\n i++\n }\n\n return results\n}\n\nfunction buildDecl(\n macroKey: string,\n name: string,\n entryText: string,\n sourceNameOffset: number,\n): LoweredDecl | null {\n switch (macroKey) {\n case '$prop':\n case '$shared':\n case '$cookie': {\n const type = inferType(entryText)\n const def = inferDefault(entryText, type)\n return {\n code: `const ${name}: ${type} = ${def}`,\n sourceNameOffset,\n mapped: true,\n nameLen: name.length,\n }\n }\n case '$computed': {\n // `doubled: count * 2` → `const doubled = count * 2`\n const expr = entryText.trim().replace(/^['\"`]|['\"`]$/g, '')\n return {\n code: `const ${name} = ${expr || 'undefined'}`,\n sourceNameOffset,\n mapped: true,\n nameLen: name.length,\n }\n }\n case '$action': {\n // `inc: () => { count++ }` → `function inc(): void { count++ }`\n const bodyMatch = /=>\\s*(\\{[\\s\\S]*\\}|\\S+)/.exec(entryText)\n const body = bodyMatch ? bodyMatch[1]! : '{}'\n return {\n code: `function ${name}(): void ${body}`,\n sourceNameOffset,\n mapped: true,\n nameLen: name.length,\n }\n }\n case '$resource': {\n return {\n code: `const ${name} = (null as any as ReturnType<typeof _cr>)`,\n sourceNameOffset,\n mapped: true,\n nameLen: name.length,\n }\n }\n case '$effect': {\n // `track: () => { log(count) }` → `/* effect: track */; count`\n // Extract body expression\n const bodyMatch = /=>\\s*(?:\\{([^}]*)\\}|([^,}\\n]+))/.exec(entryText)\n const bodyText = bodyMatch ? (bodyMatch[1] ?? bodyMatch[2] ?? '').trim() : ''\n return {\n code: `/* effect: ${name} */; ${bodyText || 'void 0'}`,\n sourceNameOffset,\n mapped: true,\n nameLen: name.length,\n }\n }\n case '$lifecycle': {\n // Not mapped (§2.4 table)\n return {\n code: `/* lifecycle.${name} */`,\n sourceNameOffset,\n mapped: false,\n nameLen: name.length,\n }\n }\n case '$watch': {\n // `src: count, cb: (n,p) => {}` → `/* watch: src */; count`\n // Extract source expression (value of the `src` key or the entry name's expr)\n const srcMatch = /\\bsrc\\s*:\\s*([^,}\\n]+)/.exec(entryText)\n const srcExpr = srcMatch ? srcMatch[1]!.trim() : name\n return {\n code: `/* watch: ${name} */; ${srcExpr}`,\n sourceNameOffset,\n mapped: true,\n nameLen: name.length,\n }\n }\n case '$expose': {\n // Not mapped (§2.4 table)\n return {\n code: `/* expose: ${name} */`,\n sourceNameOffset,\n mapped: false,\n nameLen: name.length,\n }\n }\n case '$server': {\n // `fetch: async () => {}` → `async function fetch(): Promise<unknown> {}`\n const bodyMatch = /=>\\s*(\\{[\\s\\S]*?\\})/.exec(entryText)\n const body = bodyMatch ? bodyMatch[1]! : '{}'\n return {\n code: `async function ${name}(): Promise<unknown> ${body}`,\n sourceNameOffset,\n mapped: true,\n nameLen: name.length,\n }\n }\n case '$meta': {\n // Not mapped (§2.4 table)\n return {\n code: `/* meta: ${name} */`,\n sourceNameOffset,\n mapped: false,\n nameLen: name.length,\n }\n }\n default:\n return null\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main generator function (§2.3)\n// ---------------------------------------------------------------------------\n\n/**\n * Generate the virtual TypeScript file for the @state block of a .aihu source.\n * Returns `{ virtualCode: '', mappings: [] }` if no @state block is found.\n */\nexport function generateStateVirtualCode(input: GeneratorInput): GeneratorOutput {\n const source = input.source\n\n // Step 1: find the @state { opener\n const openerRe = /^@state\\s*\\{/m\n const openerMatch = openerRe.exec(source)\n if (!openerMatch) {\n return { virtualCode: '', mappings: [] }\n }\n\n // Step 2: find the matching closing brace\n const openBracePos = openerMatch.index + openerMatch[0].length - 1\n const closeBracePos = findMatchingBrace(source, openBracePos)\n if (closeBracePos === -1) {\n return { virtualCode: '', mappings: [] }\n }\n\n // Step 3: extract block body (text between the outer braces, exclusive)\n const blockBody = source.slice(openBracePos + 1, closeBracePos)\n\n // Step 4: scan block body for macro keys matching /^\\s*\\$(\\w[\\w-]*):/\n const macroRe = /^\\s*(\\$(?:\\w[\\w-]*))\\s*:/gm\n const declarations: LoweredDecl[] = []\n\n let macroMatch: RegExpExecArray | null\n while ((macroMatch = macroRe.exec(blockBody)) !== null) {\n const macroKey = macroMatch[1]!\n // Position of this macro key relative to block body start → absolute in source\n const macroKeyOffsetInSource = openBracePos + 1 + macroMatch.index\n\n // Extract the full value text for this macro\n const colonAbsPos = openBracePos + 1 + macroMatch.index + macroMatch[0].length - 1\n const valueText = extractMacroValue(source, colonAbsPos)\n\n const lowered = lowerMacro(macroKey, valueText, macroKeyOffsetInSource, source)\n declarations.push(...lowered)\n }\n\n if (declarations.length === 0) {\n return { virtualCode: '', mappings: [] }\n }\n\n // Step 5: build virtual file content\n let virtualCode = VIRTUAL_HEADER\n const mappings: AihuCodeMapping[] = []\n\n for (const decl of declarations) {\n const generatedOffset = virtualCode.length\n virtualCode += `${decl.code}\\n`\n\n if (decl.mapped && decl.sourceNameOffset >= 0) {\n // Find the identifier in the generated line\n // The identifier starts at `generatedOffset` + position within the generated line\n // For `const NAME:` the name starts at \"const \".length = 6\n // For `function NAME` the name starts at \"function \".length = 9\n // For `async function NAME` the name starts at \"async function \".length = 15\n // For `/* effect: NAME */` the name is NOT the leading identifier — skip for effect/lifecycle etc.\n let generatedNameOffset = generatedOffset\n const codeLine = decl.code\n\n // Use string search for the actual name\n const nameStr = source.slice(decl.sourceNameOffset, decl.sourceNameOffset + decl.nameLen)\n const nameInGenerated = codeLine.indexOf(nameStr)\n if (nameInGenerated >= 0) {\n generatedNameOffset = generatedOffset + nameInGenerated\n }\n\n mappings.push({\n sourceOffsets: [decl.sourceNameOffset],\n generatedOffsets: [generatedNameOffset],\n lengths: [decl.nameLen],\n data: { ...MAPPED_DATA },\n })\n }\n }\n\n return { virtualCode, mappings }\n}\n","/**\n * packages/language-server/src/core/volar-plugin.ts\n *\n * Volar plugin layer for @aihu/language-server.\n *\n * Exports two factories:\n * - createAihuLanguagePlugin() — LanguagePlugin<URI, AihuVirtualCode>\n * - createAihuLanguageServicePlugin() — LanguageServicePlugin (hover provider)\n *\n * See: .context/m2/a4/round-1/architect-brief-volar-refactor.md §4, §5\n */\nimport type {\n CodegenContext,\n IScriptSnapshot,\n LanguagePlugin,\n LanguageServicePlugin,\n VirtualCode,\n} from '@volar/language-server/node'\nimport type { URI } from 'vscode-uri'\nimport { buildMigrateFix, MIGRATE_CODES } from './code-action.ts'\nimport { BLOCK_COMPLETIONS, STATE_MACRO_COMPLETIONS } from './completion.ts'\nimport { compileWithDiagnostics } from './diagnostics.ts'\nimport { getBlockContext, getHoverContent, getMacroAtPosition } from './hover.ts'\nimport { generateStateVirtualCode } from './state-generator.ts'\nimport type { AihuCodeMapping } from './virtual-source-map.ts'\n\n// ---------------------------------------------------------------------------\n// §5.1 AihuVirtualCode\n// ---------------------------------------------------------------------------\n\n/**\n * The virtual __state__.ts file generated from a .aihu source's @state block.\n * Implements VirtualCode from @volar/language-core@2.4.28.\n * No further embedding (leaf virtual code — embeddedCodes omitted).\n */\nexport interface AihuVirtualCode extends VirtualCode {\n /** Always \"__state__\" — Volar uses this to construct the embedded URI */\n id: string\n /** Always \"typescript\" */\n languageId: string\n /** IScriptSnapshot wrapping the generated __state__.ts content string */\n snapshot: IScriptSnapshot\n /** Character-level source-map entries (see architect-brief §3) */\n mappings: AihuCodeMapping[]\n}\n\n// ---------------------------------------------------------------------------\n// §5.2 AihuSource\n// ---------------------------------------------------------------------------\n\n/**\n * Metadata attached to the host .aihu source script.\n * Plain data object, NOT a Volar interface implementation.\n */\nexport interface AihuSource {\n /** The URI of the .aihu file */\n uri: URI\n /** Raw text of the .aihu source */\n text: string\n /** The @state block body text, or null if no @state block found */\n stateBlockText: string | null\n /** Character offset of the @state block's opening brace in `text`, or -1 */\n stateBlockStart: number\n}\n\n// ---------------------------------------------------------------------------\n// §5.3 AihuLanguagePlugin\n// ---------------------------------------------------------------------------\n\n/**\n * Volar LanguagePlugin that handles .aihu files.\n * Implements LanguagePlugin<URI> from @volar/language-core@2.4.28.\n * (Generic parameter K=VirtualCode — AihuVirtualCode satisfies VirtualCode.)\n */\nexport interface AihuLanguagePlugin extends LanguagePlugin<URI> {\n getLanguageId(scriptId: URI): string | undefined\n createVirtualCode(\n scriptId: URI,\n languageId: string,\n snapshot: IScriptSnapshot,\n ctx: CodegenContext<URI>,\n ): AihuVirtualCode | undefined\n updateVirtualCode?(\n scriptId: URI,\n virtualCode: AihuVirtualCode,\n newSnapshot: IScriptSnapshot,\n ctx: CodegenContext<URI>,\n ): AihuVirtualCode | undefined\n}\n\n// ---------------------------------------------------------------------------\n// Snapshot helper\n// ---------------------------------------------------------------------------\n\n/** Wrap a string in a minimal IScriptSnapshot implementation. */\nfunction createSnapshot(text: string): IScriptSnapshot {\n return {\n getText(start: number, end: number): string {\n return text.slice(start, end)\n },\n getLength(): number {\n return text.length\n },\n getChangeRange(): undefined {\n return undefined\n },\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory: AihuLanguagePlugin\n// ---------------------------------------------------------------------------\n\n/**\n * Create the Volar LanguagePlugin for .aihu files.\n * Returns \"aihu\" language ID for .aihu URIs; generates a virtual __state__.ts\n * code block from the @state macro body.\n */\nexport function createAihuLanguagePlugin(): AihuLanguagePlugin {\n return {\n getLanguageId(scriptId: URI): string | undefined {\n const path =\n typeof scriptId === 'string' ? scriptId : (scriptId.fsPath ?? scriptId.path ?? '')\n return path.endsWith('.aihu') ? 'aihu' : undefined\n },\n\n createVirtualCode(\n _scriptId: URI,\n languageId: string,\n snapshot: IScriptSnapshot,\n _ctx: CodegenContext<URI>,\n ): AihuVirtualCode | undefined {\n if (languageId !== 'aihu') return undefined\n\n const source = snapshot.getText(0, snapshot.getLength())\n const output = generateStateVirtualCode({ source, snapshot })\n\n if (!output.virtualCode) return undefined\n\n const virtualSnapshot = createSnapshot(output.virtualCode)\n\n const virtualCode: AihuVirtualCode = {\n id: '__state__',\n languageId: 'typescript',\n snapshot: virtualSnapshot,\n mappings: output.mappings,\n }\n\n return virtualCode\n },\n\n updateVirtualCode(\n scriptId: URI,\n _virtualCode: AihuVirtualCode,\n newSnapshot: IScriptSnapshot,\n ctx: CodegenContext<URI>,\n ): AihuVirtualCode | undefined {\n // M2: full regen on every update. Incremental is M3 scope.\n return this.createVirtualCode(scriptId, 'aihu', newSnapshot, ctx)\n },\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory: AihuLanguageServicePlugin (hover)\n// ---------------------------------------------------------------------------\n\n/**\n * Create the Volar LanguageServicePlugin for aihu.\n * Wraps the existing getMacroAtPosition / getHoverContent from core/hover.ts.\n * Per architect-brief §4.2 — \"direct translation\" of the existing onHover handler.\n */\nexport function createAihuLanguageServicePlugin(): LanguageServicePlugin {\n return {\n capabilities: {\n hoverProvider: true,\n completionProvider: { triggerCharacters: ['$', '@'] },\n diagnosticProvider: { interFileDependencies: false, workspaceDiagnostics: false },\n codeActionProvider: { codeActionKinds: ['quickfix'] },\n },\n create(_context) {\n return {\n provideHover(document, position, _token) {\n // document is TextDocument from vscode-languageserver-textdocument\n // position is vscode.Position = { line: number, character: number }\n const lineText = document.getText({\n start: { line: position.line, character: 0 },\n end: { line: position.line, character: Number.MAX_SAFE_INTEGER },\n })\n\n const macro = getMacroAtPosition(lineText, position.character)\n if (!macro) return null\n\n const content = getHoverContent(macro)\n if (!content) return null\n\n return {\n contents: { kind: 'markdown', value: content },\n }\n },\n\n provideCompletionItems(document, position, _context, _token) {\n const lines = document.getText().split('\\n')\n const ctx = getBlockContext(lines, position.line)\n if (ctx === 'state') {\n return { isIncomplete: false, items: STATE_MACRO_COMPLETIONS as any }\n }\n if (ctx === 'template') {\n return { isIncomplete: false, items: [] }\n }\n // 'unknown' covers top-level AND @style/@agent/@route blocks\n return { isIncomplete: false, items: BLOCK_COMPLETIONS as any }\n },\n\n async provideDiagnostics(document, _token) {\n const filePath = document.uri.replace(/^file:\\/\\//, '')\n const result = await compileWithDiagnostics(document.getText(), filePath)\n return result.diagnostics.map((diag) => ({\n severity: 1 as const,\n range: diag.range ?? {\n start: { line: 0, character: 0 },\n end: { line: 0, character: 0 },\n },\n message: diag.message,\n code: diag.code,\n source: 'aihu',\n }))\n },\n\n provideCodeActions(document, _range, context, _token) {\n const matching = context.diagnostics.filter(\n (d) => typeof d.code === 'string' && MIGRATE_CODES.has(d.code),\n )\n if (matching.length === 0) return []\n const fix = buildMigrateFix(document.getText())\n if (!fix) return []\n return [\n {\n title: fix.title,\n kind: 'quickfix',\n edit: {\n changes: {\n [document.uri]: [\n {\n range: {\n start: { line: 0, character: 0 },\n end: { line: Number.MAX_SAFE_INTEGER, character: 0 },\n },\n newText: fix.rewritten,\n },\n ],\n },\n },\n },\n ]\n },\n }\n },\n }\n}\n"],"x_google_ignoreList":[0,1,2,3],"mappings":"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AG,IAAI;CAEhC,IAAI;EAMF,MAAM,EAAE,WAAW,MAAM,cACvB,SACA;GAAC;GAAW;GAAS;GAAM;GAAU;GAAU;GAAmB,EAClE;GAPA,OAAO;GACP,UAAU;GACV,WAAW,IAAI,OAAO;GAKf,CACR;EACD,OAAO;GAAE,MAAM;GAAQ,aAAa,EAAE;GAAE;UACjC,KAAc;EAErB,OAAO;GAAE,MAAM;GAAM,aAAa,mBADV,IAA4B,UAAU,IACD,SAAS;GAAE;;;;;;;;;;;;;;;ACrK5E,MAAM,cAAsC;CAC1C,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAEZ,WAAW;EACT;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAEZ,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAEZ,WAAW;EACT;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAEZ,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAEZ,YAAY;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAEZ,KAAK;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAEZ,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAEZ,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAEZ,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAEZ,KAAK;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAEZ,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAEZ,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAOZ,QAAQ;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAIZ,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAGZ,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAGZ,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAGZ,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAGZ,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAOZ,MAAM;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAGZ,MAAM;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAGZ,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAGZ,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAGZ,WAAW;EACT;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAGZ,eAAe;EACb;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAGZ,aAAa;EACX;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAGZ,YAAY;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAGZ,WAAW;EACT;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAOZ,WAAW;EACT;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAGZ,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAGZ,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAGZ,QAAQ;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAGZ,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAQZ,QAAQ;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAIZ,eAAe;EACb;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CAIZ,WAAW;EACT;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;CACb;AAED,SAAgB,gBACd,OACA,WACg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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aihu/language-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -31,12 +31,17 @@
|
|
|
31
31
|
"scripts": {
|
|
32
32
|
"build": "rolldown -c",
|
|
33
33
|
"typecheck": "tsc --noEmit",
|
|
34
|
+
"test": "vitest run",
|
|
35
|
+
"bench": "bun tests/latency.bench.ts",
|
|
36
|
+
"bench:gate": "bun tests/latency.bench.ts",
|
|
34
37
|
"prepublishOnly": "bun run build"
|
|
35
38
|
},
|
|
36
39
|
"dependencies": {
|
|
37
|
-
"@aihu/compiler": "0.5.
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
+
"@aihu/compiler": "0.5.2",
|
|
41
|
+
"@volar/language-core": "2.4.28",
|
|
42
|
+
"@volar/language-server": "2.4.28",
|
|
43
|
+
"@volar/source-map": "2.4.28",
|
|
44
|
+
"vscode-uri": "3.1.0"
|
|
40
45
|
},
|
|
41
46
|
"description": "Cross-editor Language Server (aihu-language-server) for .aihu Single File Components — diagnostics, hover, completion, and quick-fix code actions.",
|
|
42
47
|
"repository": {
|