@lokascript/semantic 1.3.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (964) hide show
  1. package/dist/__test-utils__/index.d.ts +6 -0
  2. package/dist/__test-utils__/index.d.ts.map +1 -0
  3. package/dist/__test-utils__/test-helpers.d.ts +7 -0
  4. package/dist/__test-utils__/test-helpers.d.ts.map +1 -0
  5. package/dist/__types__/test-helpers.d.ts +67 -0
  6. package/dist/__types__/test-helpers.d.ts.map +1 -0
  7. package/dist/analysis/index.d.ts +106 -0
  8. package/dist/analysis/index.d.ts.map +1 -0
  9. package/dist/ast-builder/command-mappers.d.ts +50 -0
  10. package/dist/ast-builder/command-mappers.d.ts.map +1 -0
  11. package/dist/ast-builder/expression-parser/index.d.ts +14 -0
  12. package/dist/ast-builder/expression-parser/index.d.ts.map +1 -0
  13. package/dist/ast-builder/expression-parser/parser.d.ts +50 -0
  14. package/dist/ast-builder/expression-parser/parser.d.ts.map +1 -0
  15. package/dist/ast-builder/expression-parser/tokenizer.d.ts +44 -0
  16. package/dist/ast-builder/expression-parser/tokenizer.d.ts.map +1 -0
  17. package/dist/ast-builder/expression-parser/types.d.ts +111 -0
  18. package/dist/ast-builder/expression-parser/types.d.ts.map +1 -0
  19. package/dist/ast-builder/index.d.ts +183 -0
  20. package/dist/ast-builder/index.d.ts.map +1 -0
  21. package/dist/ast-builder/value-converters.d.ts +51 -0
  22. package/dist/ast-builder/value-converters.d.ts.map +1 -0
  23. package/dist/browser-ar.ar.global.js +2 -2
  24. package/dist/browser-ar.d.ts +47 -0
  25. package/dist/browser-ar.d.ts.map +1 -0
  26. package/dist/browser-bn.bn.global.js +2 -0
  27. package/dist/browser-bn.d.ts +47 -0
  28. package/dist/browser-bn.d.ts.map +1 -0
  29. package/dist/browser-core.core.global.js +2 -2
  30. package/dist/browser-core.d.ts +83 -0
  31. package/dist/browser-core.d.ts.map +1 -0
  32. package/dist/browser-de.d.ts +47 -0
  33. package/dist/browser-de.d.ts.map +1 -0
  34. package/dist/browser-de.de.global.js +2 -2
  35. package/dist/browser-east-asian.d.ts +59 -0
  36. package/dist/browser-east-asian.d.ts.map +1 -0
  37. package/dist/browser-east-asian.east-asian.global.js +2 -2
  38. package/dist/browser-en-tr.d.ts +50 -0
  39. package/dist/browser-en-tr.d.ts.map +1 -0
  40. package/dist/browser-en-tr.en-tr.global.js +2 -2
  41. package/dist/browser-en.d.ts +48 -0
  42. package/dist/browser-en.d.ts.map +1 -0
  43. package/dist/browser-en.en.global.js +2 -2
  44. package/dist/browser-es-en.d.ts +62 -0
  45. package/dist/browser-es-en.d.ts.map +1 -0
  46. package/dist/browser-es-en.es-en.global.js +2 -2
  47. package/dist/browser-es.d.ts +51 -0
  48. package/dist/browser-es.d.ts.map +1 -0
  49. package/dist/browser-es.es.global.js +2 -2
  50. package/dist/browser-fr.d.ts +47 -0
  51. package/dist/browser-fr.d.ts.map +1 -0
  52. package/dist/browser-fr.fr.global.js +2 -2
  53. package/dist/browser-hi.d.ts +47 -0
  54. package/dist/browser-hi.d.ts.map +1 -0
  55. package/dist/browser-hi.hi.global.js +2 -0
  56. package/dist/browser-id.d.ts +47 -0
  57. package/dist/browser-id.d.ts.map +1 -0
  58. package/dist/browser-id.id.global.js +2 -2
  59. package/dist/browser-it.d.ts +47 -0
  60. package/dist/browser-it.d.ts.map +1 -0
  61. package/dist/browser-it.it.global.js +2 -0
  62. package/dist/browser-ja.d.ts +47 -0
  63. package/dist/browser-ja.d.ts.map +1 -0
  64. package/dist/browser-ja.ja.global.js +2 -2
  65. package/dist/browser-ko.d.ts +47 -0
  66. package/dist/browser-ko.d.ts.map +1 -0
  67. package/dist/browser-ko.ko.global.js +2 -2
  68. package/dist/browser-lazy.d.ts +52 -0
  69. package/dist/browser-lazy.d.ts.map +1 -0
  70. package/dist/browser-lazy.lazy.global.js +2 -2
  71. package/dist/browser-ms.d.ts +47 -0
  72. package/dist/browser-ms.d.ts.map +1 -0
  73. package/dist/browser-ms.ms.global.js +2 -0
  74. package/dist/browser-pl.d.ts +47 -0
  75. package/dist/browser-pl.d.ts.map +1 -0
  76. package/dist/browser-pl.pl.global.js +2 -0
  77. package/dist/browser-priority.d.ts +83 -0
  78. package/dist/browser-priority.d.ts.map +1 -0
  79. package/dist/browser-priority.priority.global.js +2 -2
  80. package/dist/browser-pt.d.ts +47 -0
  81. package/dist/browser-pt.d.ts.map +1 -0
  82. package/dist/browser-pt.pt.global.js +2 -2
  83. package/dist/browser-qu.d.ts +47 -0
  84. package/dist/browser-qu.d.ts.map +1 -0
  85. package/dist/browser-qu.qu.global.js +2 -2
  86. package/dist/browser-ru.d.ts +47 -0
  87. package/dist/browser-ru.d.ts.map +1 -0
  88. package/dist/browser-ru.ru.global.js +2 -0
  89. package/dist/browser-sw.d.ts +47 -0
  90. package/dist/browser-sw.d.ts.map +1 -0
  91. package/dist/browser-sw.sw.global.js +2 -2
  92. package/dist/browser-th.d.ts +47 -0
  93. package/dist/browser-th.d.ts.map +1 -0
  94. package/dist/browser-th.th.global.js +2 -0
  95. package/dist/browser-tl.d.ts +47 -0
  96. package/dist/browser-tl.d.ts.map +1 -0
  97. package/dist/browser-tl.tl.global.js +2 -0
  98. package/dist/browser-tr.d.ts +47 -0
  99. package/dist/browser-tr.d.ts.map +1 -0
  100. package/dist/browser-tr.tr.global.js +2 -2
  101. package/dist/browser-uk.d.ts +47 -0
  102. package/dist/browser-uk.d.ts.map +1 -0
  103. package/dist/browser-uk.uk.global.js +2 -0
  104. package/dist/browser-vi.d.ts +47 -0
  105. package/dist/browser-vi.d.ts.map +1 -0
  106. package/dist/browser-vi.vi.global.js +2 -0
  107. package/dist/browser-western.d.ts +67 -0
  108. package/dist/browser-western.d.ts.map +1 -0
  109. package/dist/browser-western.western.global.js +2 -2
  110. package/dist/browser-zh.d.ts +47 -0
  111. package/dist/browser-zh.d.ts.map +1 -0
  112. package/dist/browser-zh.zh.global.js +2 -2
  113. package/dist/browser.d.ts +69 -0
  114. package/dist/browser.d.ts.map +1 -0
  115. package/dist/browser.global.js +2 -2
  116. package/dist/browser.global.js.map +1 -1
  117. package/dist/cache/index.d.ts +7 -0
  118. package/dist/cache/index.d.ts.map +1 -0
  119. package/dist/cache/semantic-cache.d.ts +138 -0
  120. package/dist/cache/semantic-cache.d.ts.map +1 -0
  121. package/dist/core-bridge.d.ts +154 -0
  122. package/dist/core-bridge.d.ts.map +1 -0
  123. package/dist/core.d.ts +24 -1235
  124. package/dist/core.d.ts.map +1 -0
  125. package/dist/core.js +6433 -1731
  126. package/dist/core.js.map +1 -1
  127. package/dist/explicit/converter.d.ts +98 -0
  128. package/dist/explicit/converter.d.ts.map +1 -0
  129. package/dist/explicit/index.d.ts +10 -0
  130. package/dist/explicit/index.d.ts.map +1 -0
  131. package/dist/explicit/parser.d.ts +25 -0
  132. package/dist/explicit/parser.d.ts.map +1 -0
  133. package/dist/explicit/renderer.d.ts +82 -0
  134. package/dist/explicit/renderer.d.ts.map +1 -0
  135. package/dist/generators/command-schemas.d.ts +358 -0
  136. package/dist/generators/command-schemas.d.ts.map +1 -0
  137. package/dist/generators/event-handlers-sov.d.ts +91 -0
  138. package/dist/generators/event-handlers-sov.d.ts.map +1 -0
  139. package/dist/generators/event-handlers-vso.d.ts +69 -0
  140. package/dist/generators/event-handlers-vso.d.ts.map +1 -0
  141. package/dist/generators/index.d.ts +12 -0
  142. package/dist/generators/index.d.ts.map +1 -0
  143. package/dist/generators/language-profiles.d.ts +65 -0
  144. package/dist/generators/language-profiles.d.ts.map +1 -0
  145. package/dist/generators/pattern-generator.d.ts +81 -0
  146. package/dist/generators/pattern-generator.d.ts.map +1 -0
  147. package/dist/generators/profiles/arabic.d.ts +9 -0
  148. package/dist/generators/profiles/arabic.d.ts.map +1 -0
  149. package/dist/generators/profiles/bengali.d.ts +9 -0
  150. package/dist/generators/profiles/bengali.d.ts.map +1 -0
  151. package/dist/generators/profiles/chinese.d.ts +9 -0
  152. package/dist/generators/profiles/chinese.d.ts.map +1 -0
  153. package/dist/generators/profiles/english.d.ts +8 -0
  154. package/dist/generators/profiles/english.d.ts.map +1 -0
  155. package/dist/generators/profiles/french.d.ts +9 -0
  156. package/dist/generators/profiles/french.d.ts.map +1 -0
  157. package/dist/generators/profiles/german.d.ts +9 -0
  158. package/dist/generators/profiles/german.d.ts.map +1 -0
  159. package/dist/generators/profiles/hebrew.d.ts +10 -0
  160. package/dist/generators/profiles/hebrew.d.ts.map +1 -0
  161. package/dist/generators/profiles/hindi.d.ts +9 -0
  162. package/dist/generators/profiles/hindi.d.ts.map +1 -0
  163. package/dist/generators/profiles/index.d.ts +36 -0
  164. package/dist/generators/profiles/index.d.ts.map +1 -0
  165. package/dist/generators/profiles/indonesian.d.ts +9 -0
  166. package/dist/generators/profiles/indonesian.d.ts.map +1 -0
  167. package/dist/generators/profiles/italian.d.ts +10 -0
  168. package/dist/generators/profiles/italian.d.ts.map +1 -0
  169. package/dist/generators/profiles/japanese.d.ts +9 -0
  170. package/dist/generators/profiles/japanese.d.ts.map +1 -0
  171. package/dist/generators/profiles/korean.d.ts +9 -0
  172. package/dist/generators/profiles/korean.d.ts.map +1 -0
  173. package/dist/generators/profiles/marker-templates.d.ts +119 -0
  174. package/dist/generators/profiles/marker-templates.d.ts.map +1 -0
  175. package/dist/generators/profiles/ms.d.ts +8 -0
  176. package/dist/generators/profiles/ms.d.ts.map +1 -0
  177. package/dist/generators/profiles/polish.d.ts +10 -0
  178. package/dist/generators/profiles/polish.d.ts.map +1 -0
  179. package/dist/generators/profiles/portuguese.d.ts +9 -0
  180. package/dist/generators/profiles/portuguese.d.ts.map +1 -0
  181. package/dist/generators/profiles/quechua.d.ts +9 -0
  182. package/dist/generators/profiles/quechua.d.ts.map +1 -0
  183. package/dist/generators/profiles/russian.d.ts +10 -0
  184. package/dist/generators/profiles/russian.d.ts.map +1 -0
  185. package/dist/generators/profiles/spanish.d.ts +9 -0
  186. package/dist/generators/profiles/spanish.d.ts.map +1 -0
  187. package/dist/generators/profiles/spanishMexico.d.ts +19 -0
  188. package/dist/generators/profiles/spanishMexico.d.ts.map +1 -0
  189. package/dist/generators/profiles/swahili.d.ts +9 -0
  190. package/dist/generators/profiles/swahili.d.ts.map +1 -0
  191. package/dist/generators/profiles/thai.d.ts +9 -0
  192. package/dist/generators/profiles/thai.d.ts.map +1 -0
  193. package/dist/generators/profiles/tl.d.ts +8 -0
  194. package/dist/generators/profiles/tl.d.ts.map +1 -0
  195. package/dist/generators/profiles/turkish.d.ts +9 -0
  196. package/dist/generators/profiles/turkish.d.ts.map +1 -0
  197. package/dist/generators/profiles/types.d.ts +170 -0
  198. package/dist/generators/profiles/types.d.ts.map +1 -0
  199. package/dist/generators/profiles/ukrainian.d.ts +10 -0
  200. package/dist/generators/profiles/ukrainian.d.ts.map +1 -0
  201. package/dist/generators/profiles/vietnamese.d.ts +10 -0
  202. package/dist/generators/profiles/vietnamese.d.ts.map +1 -0
  203. package/dist/generators/schema-error-codes.d.ts +60 -0
  204. package/dist/generators/schema-error-codes.d.ts.map +1 -0
  205. package/dist/generators/schema-validator.d.ts +77 -0
  206. package/dist/generators/schema-validator.d.ts.map +1 -0
  207. package/dist/index.cjs +5451 -2522
  208. package/dist/index.cjs.map +1 -1
  209. package/dist/index.d.ts +50 -3436
  210. package/dist/index.d.ts.map +1 -0
  211. package/dist/index.js +5448 -2526
  212. package/dist/index.js.map +1 -1
  213. package/dist/interchange/from-semantic.d.ts +23 -0
  214. package/dist/interchange/from-semantic.d.ts.map +1 -0
  215. package/dist/interchange/index.d.ts +7 -0
  216. package/dist/interchange/index.d.ts.map +1 -0
  217. package/dist/interchange/types.d.ts +132 -0
  218. package/dist/interchange/types.d.ts.map +1 -0
  219. package/dist/language-building-schema.d.ts +163 -0
  220. package/dist/language-building-schema.d.ts.map +1 -0
  221. package/dist/language-loader.d.ts +126 -0
  222. package/dist/language-loader.d.ts.map +1 -0
  223. package/dist/languages/_all.d.ts +66 -0
  224. package/dist/languages/_all.d.ts.map +1 -0
  225. package/dist/languages/ar.d.ts +6 -75
  226. package/dist/languages/ar.d.ts.map +1 -0
  227. package/dist/languages/ar.js +65 -14
  228. package/dist/languages/ar.js.map +1 -1
  229. package/dist/languages/bn.d.ts +7 -30
  230. package/dist/languages/bn.d.ts.map +1 -0
  231. package/dist/languages/bn.js +83 -21
  232. package/dist/languages/bn.js.map +1 -1
  233. package/dist/languages/de.d.ts +6 -35
  234. package/dist/languages/de.d.ts.map +1 -0
  235. package/dist/languages/de.js +260 -22
  236. package/dist/languages/de.js.map +1 -1
  237. package/dist/languages/en.d.ts +13 -40
  238. package/dist/languages/en.d.ts.map +1 -0
  239. package/dist/languages/en.js +788 -241
  240. package/dist/languages/en.js.map +1 -1
  241. package/dist/languages/es-MX.d.ts +18 -17
  242. package/dist/languages/es-MX.d.ts.map +1 -0
  243. package/dist/languages/es-MX.js +66 -13
  244. package/dist/languages/es-MX.js.map +1 -1
  245. package/dist/languages/es.d.ts +6 -10
  246. package/dist/languages/es.d.ts.map +1 -0
  247. package/dist/languages/es.js +60 -13
  248. package/dist/languages/es.js.map +1 -1
  249. package/dist/languages/fr.d.ts +6 -34
  250. package/dist/languages/fr.d.ts.map +1 -0
  251. package/dist/languages/fr.js +309 -22
  252. package/dist/languages/fr.js.map +1 -1
  253. package/dist/languages/he.d.ts +6 -67
  254. package/dist/languages/he.d.ts.map +1 -0
  255. package/dist/languages/he.js +60 -13
  256. package/dist/languages/he.js.map +1 -1
  257. package/dist/languages/hi.d.ts +14 -32
  258. package/dist/languages/hi.d.ts.map +1 -0
  259. package/dist/languages/hi.js +60 -13
  260. package/dist/languages/hi.js.map +1 -1
  261. package/dist/languages/id.d.ts +6 -32
  262. package/dist/languages/id.d.ts.map +1 -0
  263. package/dist/languages/id.js +60 -13
  264. package/dist/languages/id.js.map +1 -1
  265. package/dist/languages/index.d.ts +18 -0
  266. package/dist/languages/index.d.ts.map +1 -0
  267. package/dist/languages/it.d.ts +6 -50
  268. package/dist/languages/it.d.ts.map +1 -0
  269. package/dist/languages/it.js +60 -13
  270. package/dist/languages/it.js.map +1 -1
  271. package/dist/languages/ja.d.ts +6 -50
  272. package/dist/languages/ja.d.ts.map +1 -0
  273. package/dist/languages/ja.js +60 -13
  274. package/dist/languages/ja.js.map +1 -1
  275. package/dist/languages/ko.d.ts +6 -55
  276. package/dist/languages/ko.d.ts.map +1 -0
  277. package/dist/languages/ko.js +64 -13
  278. package/dist/languages/ko.js.map +1 -1
  279. package/dist/languages/ms.d.ts +7 -29
  280. package/dist/languages/ms.d.ts.map +1 -0
  281. package/dist/languages/ms.js +58 -13
  282. package/dist/languages/ms.js.map +1 -1
  283. package/dist/languages/pl.d.ts +8 -33
  284. package/dist/languages/pl.d.ts.map +1 -0
  285. package/dist/languages/pl.js +277 -22
  286. package/dist/languages/pl.js.map +1 -1
  287. package/dist/languages/pt.d.ts +6 -34
  288. package/dist/languages/pt.d.ts.map +1 -0
  289. package/dist/languages/pt.js +344 -22
  290. package/dist/languages/pt.js.map +1 -1
  291. package/dist/languages/qu.d.ts +6 -44
  292. package/dist/languages/qu.d.ts.map +1 -0
  293. package/dist/languages/qu.js +105 -28
  294. package/dist/languages/qu.js.map +1 -1
  295. package/dist/languages/ru.d.ts +14 -33
  296. package/dist/languages/ru.d.ts.map +1 -0
  297. package/dist/languages/ru.js +371 -22
  298. package/dist/languages/ru.js.map +1 -1
  299. package/dist/languages/sw.d.ts +6 -32
  300. package/dist/languages/sw.d.ts.map +1 -0
  301. package/dist/languages/sw.js +69 -17
  302. package/dist/languages/sw.js.map +1 -1
  303. package/dist/languages/th.d.ts +7 -32
  304. package/dist/languages/th.d.ts.map +1 -0
  305. package/dist/languages/th.js +60 -13
  306. package/dist/languages/th.js.map +1 -1
  307. package/dist/languages/tl.d.ts +7 -29
  308. package/dist/languages/tl.d.ts.map +1 -0
  309. package/dist/languages/tl.js +75 -23
  310. package/dist/languages/tl.js.map +1 -1
  311. package/dist/languages/tr.d.ts +6 -50
  312. package/dist/languages/tr.d.ts.map +1 -0
  313. package/dist/languages/tr.js +67 -16
  314. package/dist/languages/tr.js.map +1 -1
  315. package/dist/languages/uk.d.ts +14 -33
  316. package/dist/languages/uk.d.ts.map +1 -0
  317. package/dist/languages/uk.js +357 -22
  318. package/dist/languages/uk.js.map +1 -1
  319. package/dist/languages/vi.d.ts +7 -56
  320. package/dist/languages/vi.d.ts.map +1 -0
  321. package/dist/languages/vi.js +59 -13
  322. package/dist/languages/vi.js.map +1 -1
  323. package/dist/languages/zh.d.ts +6 -55
  324. package/dist/languages/zh.d.ts.map +1 -0
  325. package/dist/languages/zh.js +59 -13
  326. package/dist/languages/zh.js.map +1 -1
  327. package/dist/parser/index.d.ts +8 -0
  328. package/dist/parser/index.d.ts.map +1 -0
  329. package/dist/parser/pattern-matcher.d.ts +188 -0
  330. package/dist/parser/pattern-matcher.d.ts.map +1 -0
  331. package/dist/parser/semantic-parser.d.ts +238 -0
  332. package/dist/parser/semantic-parser.d.ts.map +1 -0
  333. package/dist/parser/utils/index.d.ts +9 -0
  334. package/dist/parser/utils/index.d.ts.map +1 -0
  335. package/dist/parser/utils/marker-resolution.d.ts +57 -0
  336. package/dist/parser/utils/marker-resolution.d.ts.map +1 -0
  337. package/dist/parser/utils/possessive-keywords.d.ts +31 -0
  338. package/dist/parser/utils/possessive-keywords.d.ts.map +1 -0
  339. package/dist/parser/utils/role-positioning.d.ts +42 -0
  340. package/dist/parser/utils/role-positioning.d.ts.map +1 -0
  341. package/dist/parser/utils/type-validation.d.ts +63 -0
  342. package/dist/parser/utils/type-validation.d.ts.map +1 -0
  343. package/dist/patterns/add/ar.d.ts +12 -0
  344. package/dist/patterns/add/ar.d.ts.map +1 -0
  345. package/dist/patterns/add/bn.d.ts +8 -0
  346. package/dist/patterns/add/bn.d.ts.map +1 -0
  347. package/dist/patterns/add/hi.d.ts +8 -0
  348. package/dist/patterns/add/hi.d.ts.map +1 -0
  349. package/dist/patterns/add/index.d.ts +31 -0
  350. package/dist/patterns/add/index.d.ts.map +1 -0
  351. package/dist/patterns/add/it.d.ts +11 -0
  352. package/dist/patterns/add/it.d.ts.map +1 -0
  353. package/dist/patterns/add/ja.d.ts +12 -0
  354. package/dist/patterns/add/ja.d.ts.map +1 -0
  355. package/dist/patterns/add/ko.d.ts +12 -0
  356. package/dist/patterns/add/ko.d.ts.map +1 -0
  357. package/dist/patterns/add/pl.d.ts +12 -0
  358. package/dist/patterns/add/pl.d.ts.map +1 -0
  359. package/dist/patterns/add/qu.d.ts +9 -0
  360. package/dist/patterns/add/qu.d.ts.map +1 -0
  361. package/dist/patterns/add/ru.d.ts +12 -0
  362. package/dist/patterns/add/ru.d.ts.map +1 -0
  363. package/dist/patterns/add/th.d.ts +8 -0
  364. package/dist/patterns/add/th.d.ts.map +1 -0
  365. package/dist/patterns/add/tr.d.ts +12 -0
  366. package/dist/patterns/add/tr.d.ts.map +1 -0
  367. package/dist/patterns/add/uk.d.ts +12 -0
  368. package/dist/patterns/add/uk.d.ts.map +1 -0
  369. package/dist/patterns/add/vi.d.ts +11 -0
  370. package/dist/patterns/add/vi.d.ts.map +1 -0
  371. package/dist/patterns/add/zh.d.ts +12 -0
  372. package/dist/patterns/add/zh.d.ts.map +1 -0
  373. package/dist/patterns/builders.d.ts +52 -0
  374. package/dist/patterns/builders.d.ts.map +1 -0
  375. package/dist/patterns/decrement/bn.d.ts +8 -0
  376. package/dist/patterns/decrement/bn.d.ts.map +1 -0
  377. package/dist/patterns/decrement/de.d.ts +12 -0
  378. package/dist/patterns/decrement/de.d.ts.map +1 -0
  379. package/dist/patterns/decrement/hi.d.ts +8 -0
  380. package/dist/patterns/decrement/hi.d.ts.map +1 -0
  381. package/dist/patterns/decrement/index.d.ts +28 -0
  382. package/dist/patterns/decrement/index.d.ts.map +1 -0
  383. package/dist/patterns/decrement/it.d.ts +11 -0
  384. package/dist/patterns/decrement/it.d.ts.map +1 -0
  385. package/dist/patterns/decrement/pl.d.ts +12 -0
  386. package/dist/patterns/decrement/pl.d.ts.map +1 -0
  387. package/dist/patterns/decrement/ru.d.ts +12 -0
  388. package/dist/patterns/decrement/ru.d.ts.map +1 -0
  389. package/dist/patterns/decrement/th.d.ts +8 -0
  390. package/dist/patterns/decrement/th.d.ts.map +1 -0
  391. package/dist/patterns/decrement/tr.d.ts +12 -0
  392. package/dist/patterns/decrement/tr.d.ts.map +1 -0
  393. package/dist/patterns/decrement/uk.d.ts +12 -0
  394. package/dist/patterns/decrement/uk.d.ts.map +1 -0
  395. package/dist/patterns/decrement/vi.d.ts +11 -0
  396. package/dist/patterns/decrement/vi.d.ts.map +1 -0
  397. package/dist/patterns/decrement/zh.d.ts +12 -0
  398. package/dist/patterns/decrement/zh.d.ts.map +1 -0
  399. package/dist/patterns/en.d.ts +13 -0
  400. package/dist/patterns/en.d.ts.map +1 -0
  401. package/dist/patterns/event-handler/ar.d.ts +12 -0
  402. package/dist/patterns/event-handler/ar.d.ts.map +1 -0
  403. package/dist/patterns/event-handler/bn.d.ts +8 -0
  404. package/dist/patterns/event-handler/bn.d.ts.map +1 -0
  405. package/dist/patterns/event-handler/de.d.ts +11 -0
  406. package/dist/patterns/event-handler/de.d.ts.map +1 -0
  407. package/dist/patterns/event-handler/en.d.ts +11 -0
  408. package/dist/patterns/event-handler/en.d.ts.map +1 -0
  409. package/dist/patterns/event-handler/es.d.ts +11 -0
  410. package/dist/patterns/event-handler/es.d.ts.map +1 -0
  411. package/dist/patterns/event-handler/fr.d.ts +11 -0
  412. package/dist/patterns/event-handler/fr.d.ts.map +1 -0
  413. package/dist/patterns/event-handler/he.d.ts +12 -0
  414. package/dist/patterns/event-handler/he.d.ts.map +1 -0
  415. package/dist/patterns/event-handler/hi.d.ts +9 -0
  416. package/dist/patterns/event-handler/hi.d.ts.map +1 -0
  417. package/dist/patterns/event-handler/id.d.ts +11 -0
  418. package/dist/patterns/event-handler/id.d.ts.map +1 -0
  419. package/dist/patterns/event-handler/index.d.ts +41 -0
  420. package/dist/patterns/event-handler/index.d.ts.map +1 -0
  421. package/dist/patterns/event-handler/it.d.ts +11 -0
  422. package/dist/patterns/event-handler/it.d.ts.map +1 -0
  423. package/dist/patterns/event-handler/ja.d.ts +12 -0
  424. package/dist/patterns/event-handler/ja.d.ts.map +1 -0
  425. package/dist/patterns/event-handler/ko.d.ts +12 -0
  426. package/dist/patterns/event-handler/ko.d.ts.map +1 -0
  427. package/dist/patterns/event-handler/ms.d.ts +14 -0
  428. package/dist/patterns/event-handler/ms.d.ts.map +1 -0
  429. package/dist/patterns/event-handler/pl.d.ts +12 -0
  430. package/dist/patterns/event-handler/pl.d.ts.map +1 -0
  431. package/dist/patterns/event-handler/pt.d.ts +11 -0
  432. package/dist/patterns/event-handler/pt.d.ts.map +1 -0
  433. package/dist/patterns/event-handler/qu.d.ts +11 -0
  434. package/dist/patterns/event-handler/qu.d.ts.map +1 -0
  435. package/dist/patterns/event-handler/ru.d.ts +12 -0
  436. package/dist/patterns/event-handler/ru.d.ts.map +1 -0
  437. package/dist/patterns/event-handler/shared.d.ts +15 -0
  438. package/dist/patterns/event-handler/shared.d.ts.map +1 -0
  439. package/dist/patterns/event-handler/sw.d.ts +11 -0
  440. package/dist/patterns/event-handler/sw.d.ts.map +1 -0
  441. package/dist/patterns/event-handler/th.d.ts +8 -0
  442. package/dist/patterns/event-handler/th.d.ts.map +1 -0
  443. package/dist/patterns/event-handler/tl.d.ts +9 -0
  444. package/dist/patterns/event-handler/tl.d.ts.map +1 -0
  445. package/dist/patterns/event-handler/tr.d.ts +12 -0
  446. package/dist/patterns/event-handler/tr.d.ts.map +1 -0
  447. package/dist/patterns/event-handler/uk.d.ts +12 -0
  448. package/dist/patterns/event-handler/uk.d.ts.map +1 -0
  449. package/dist/patterns/event-handler/vi.d.ts +11 -0
  450. package/dist/patterns/event-handler/vi.d.ts.map +1 -0
  451. package/dist/patterns/event-handler/zh.d.ts +11 -0
  452. package/dist/patterns/event-handler/zh.d.ts.map +1 -0
  453. package/dist/patterns/get/ar.d.ts +12 -0
  454. package/dist/patterns/get/ar.d.ts.map +1 -0
  455. package/dist/patterns/get/bn.d.ts +8 -0
  456. package/dist/patterns/get/bn.d.ts.map +1 -0
  457. package/dist/patterns/get/de.d.ts +12 -0
  458. package/dist/patterns/get/de.d.ts.map +1 -0
  459. package/dist/patterns/get/hi.d.ts +8 -0
  460. package/dist/patterns/get/hi.d.ts.map +1 -0
  461. package/dist/patterns/get/index.d.ts +29 -0
  462. package/dist/patterns/get/index.d.ts.map +1 -0
  463. package/dist/patterns/get/it.d.ts +11 -0
  464. package/dist/patterns/get/it.d.ts.map +1 -0
  465. package/dist/patterns/get/ja.d.ts +12 -0
  466. package/dist/patterns/get/ja.d.ts.map +1 -0
  467. package/dist/patterns/get/ko.d.ts +12 -0
  468. package/dist/patterns/get/ko.d.ts.map +1 -0
  469. package/dist/patterns/get/pl.d.ts +12 -0
  470. package/dist/patterns/get/pl.d.ts.map +1 -0
  471. package/dist/patterns/get/ru.d.ts +12 -0
  472. package/dist/patterns/get/ru.d.ts.map +1 -0
  473. package/dist/patterns/get/th.d.ts +8 -0
  474. package/dist/patterns/get/th.d.ts.map +1 -0
  475. package/dist/patterns/get/uk.d.ts +12 -0
  476. package/dist/patterns/get/uk.d.ts.map +1 -0
  477. package/dist/patterns/get/vi.d.ts +11 -0
  478. package/dist/patterns/get/vi.d.ts.map +1 -0
  479. package/dist/patterns/grammar-transformed/index.d.ts +20 -0
  480. package/dist/patterns/grammar-transformed/index.d.ts.map +1 -0
  481. package/dist/patterns/grammar-transformed/ja.d.ts +12 -0
  482. package/dist/patterns/grammar-transformed/ja.d.ts.map +1 -0
  483. package/dist/patterns/grammar-transformed/ko.d.ts +12 -0
  484. package/dist/patterns/grammar-transformed/ko.d.ts.map +1 -0
  485. package/dist/patterns/grammar-transformed/tr.d.ts +12 -0
  486. package/dist/patterns/grammar-transformed/tr.d.ts.map +1 -0
  487. package/dist/patterns/hide/ar.d.ts +12 -0
  488. package/dist/patterns/hide/ar.d.ts.map +1 -0
  489. package/dist/patterns/hide/bn.d.ts +8 -0
  490. package/dist/patterns/hide/bn.d.ts.map +1 -0
  491. package/dist/patterns/hide/de.d.ts +12 -0
  492. package/dist/patterns/hide/de.d.ts.map +1 -0
  493. package/dist/patterns/hide/hi.d.ts +8 -0
  494. package/dist/patterns/hide/hi.d.ts.map +1 -0
  495. package/dist/patterns/hide/index.d.ts +31 -0
  496. package/dist/patterns/hide/index.d.ts.map +1 -0
  497. package/dist/patterns/hide/it.d.ts +11 -0
  498. package/dist/patterns/hide/it.d.ts.map +1 -0
  499. package/dist/patterns/hide/ja.d.ts +12 -0
  500. package/dist/patterns/hide/ja.d.ts.map +1 -0
  501. package/dist/patterns/hide/ko.d.ts +12 -0
  502. package/dist/patterns/hide/ko.d.ts.map +1 -0
  503. package/dist/patterns/hide/pl.d.ts +12 -0
  504. package/dist/patterns/hide/pl.d.ts.map +1 -0
  505. package/dist/patterns/hide/ru.d.ts +12 -0
  506. package/dist/patterns/hide/ru.d.ts.map +1 -0
  507. package/dist/patterns/hide/th.d.ts +8 -0
  508. package/dist/patterns/hide/th.d.ts.map +1 -0
  509. package/dist/patterns/hide/tr.d.ts +12 -0
  510. package/dist/patterns/hide/tr.d.ts.map +1 -0
  511. package/dist/patterns/hide/uk.d.ts +12 -0
  512. package/dist/patterns/hide/uk.d.ts.map +1 -0
  513. package/dist/patterns/hide/vi.d.ts +11 -0
  514. package/dist/patterns/hide/vi.d.ts.map +1 -0
  515. package/dist/patterns/hide/zh.d.ts +12 -0
  516. package/dist/patterns/hide/zh.d.ts.map +1 -0
  517. package/dist/patterns/increment/bn.d.ts +8 -0
  518. package/dist/patterns/increment/bn.d.ts.map +1 -0
  519. package/dist/patterns/increment/de.d.ts +12 -0
  520. package/dist/patterns/increment/de.d.ts.map +1 -0
  521. package/dist/patterns/increment/hi.d.ts +8 -0
  522. package/dist/patterns/increment/hi.d.ts.map +1 -0
  523. package/dist/patterns/increment/index.d.ts +28 -0
  524. package/dist/patterns/increment/index.d.ts.map +1 -0
  525. package/dist/patterns/increment/it.d.ts +11 -0
  526. package/dist/patterns/increment/it.d.ts.map +1 -0
  527. package/dist/patterns/increment/pl.d.ts +12 -0
  528. package/dist/patterns/increment/pl.d.ts.map +1 -0
  529. package/dist/patterns/increment/ru.d.ts +12 -0
  530. package/dist/patterns/increment/ru.d.ts.map +1 -0
  531. package/dist/patterns/increment/th.d.ts +8 -0
  532. package/dist/patterns/increment/th.d.ts.map +1 -0
  533. package/dist/patterns/increment/tr.d.ts +12 -0
  534. package/dist/patterns/increment/tr.d.ts.map +1 -0
  535. package/dist/patterns/increment/uk.d.ts +12 -0
  536. package/dist/patterns/increment/uk.d.ts.map +1 -0
  537. package/dist/patterns/increment/vi.d.ts +11 -0
  538. package/dist/patterns/increment/vi.d.ts.map +1 -0
  539. package/dist/patterns/increment/zh.d.ts +12 -0
  540. package/dist/patterns/increment/zh.d.ts.map +1 -0
  541. package/dist/patterns/index.d.ts +21 -0
  542. package/dist/patterns/index.d.ts.map +1 -0
  543. package/dist/patterns/languages/en/control-flow.d.ts +40 -0
  544. package/dist/patterns/languages/en/control-flow.d.ts.map +1 -0
  545. package/dist/patterns/languages/en/fetch.d.ts +22 -0
  546. package/dist/patterns/languages/en/fetch.d.ts.map +1 -0
  547. package/dist/patterns/languages/en/index.d.ts +22 -0
  548. package/dist/patterns/languages/en/index.d.ts.map +1 -0
  549. package/dist/patterns/languages/en/repeat.d.ts +22 -0
  550. package/dist/patterns/languages/en/repeat.d.ts.map +1 -0
  551. package/dist/patterns/languages/en/set.d.ts +23 -0
  552. package/dist/patterns/languages/en/set.d.ts.map +1 -0
  553. package/dist/patterns/languages/en/swap.d.ts +19 -0
  554. package/dist/patterns/languages/en/swap.d.ts.map +1 -0
  555. package/dist/patterns/languages/en/temporal.d.ts +24 -0
  556. package/dist/patterns/languages/en/temporal.d.ts.map +1 -0
  557. package/dist/patterns/put/ar.d.ts +12 -0
  558. package/dist/patterns/put/ar.d.ts.map +1 -0
  559. package/dist/patterns/put/bn.d.ts +8 -0
  560. package/dist/patterns/put/bn.d.ts.map +1 -0
  561. package/dist/patterns/put/en.d.ts +11 -0
  562. package/dist/patterns/put/en.d.ts.map +1 -0
  563. package/dist/patterns/put/es.d.ts +11 -0
  564. package/dist/patterns/put/es.d.ts.map +1 -0
  565. package/dist/patterns/put/hi.d.ts +8 -0
  566. package/dist/patterns/put/hi.d.ts.map +1 -0
  567. package/dist/patterns/put/id.d.ts +15 -0
  568. package/dist/patterns/put/id.d.ts.map +1 -0
  569. package/dist/patterns/put/index.d.ts +33 -0
  570. package/dist/patterns/put/index.d.ts.map +1 -0
  571. package/dist/patterns/put/it.d.ts +11 -0
  572. package/dist/patterns/put/it.d.ts.map +1 -0
  573. package/dist/patterns/put/ja.d.ts +12 -0
  574. package/dist/patterns/put/ja.d.ts.map +1 -0
  575. package/dist/patterns/put/ko.d.ts +12 -0
  576. package/dist/patterns/put/ko.d.ts.map +1 -0
  577. package/dist/patterns/put/pl.d.ts +12 -0
  578. package/dist/patterns/put/pl.d.ts.map +1 -0
  579. package/dist/patterns/put/ru.d.ts +12 -0
  580. package/dist/patterns/put/ru.d.ts.map +1 -0
  581. package/dist/patterns/put/th.d.ts +8 -0
  582. package/dist/patterns/put/th.d.ts.map +1 -0
  583. package/dist/patterns/put/tr.d.ts +12 -0
  584. package/dist/patterns/put/tr.d.ts.map +1 -0
  585. package/dist/patterns/put/uk.d.ts +12 -0
  586. package/dist/patterns/put/uk.d.ts.map +1 -0
  587. package/dist/patterns/put/vi.d.ts +11 -0
  588. package/dist/patterns/put/vi.d.ts.map +1 -0
  589. package/dist/patterns/put/zh.d.ts +12 -0
  590. package/dist/patterns/put/zh.d.ts.map +1 -0
  591. package/dist/patterns/registry.d.ts +53 -0
  592. package/dist/patterns/registry.d.ts.map +1 -0
  593. package/dist/patterns/remove/ar.d.ts +12 -0
  594. package/dist/patterns/remove/ar.d.ts.map +1 -0
  595. package/dist/patterns/remove/bn.d.ts +8 -0
  596. package/dist/patterns/remove/bn.d.ts.map +1 -0
  597. package/dist/patterns/remove/hi.d.ts +8 -0
  598. package/dist/patterns/remove/hi.d.ts.map +1 -0
  599. package/dist/patterns/remove/index.d.ts +31 -0
  600. package/dist/patterns/remove/index.d.ts.map +1 -0
  601. package/dist/patterns/remove/it.d.ts +11 -0
  602. package/dist/patterns/remove/it.d.ts.map +1 -0
  603. package/dist/patterns/remove/ja.d.ts +12 -0
  604. package/dist/patterns/remove/ja.d.ts.map +1 -0
  605. package/dist/patterns/remove/ko.d.ts +12 -0
  606. package/dist/patterns/remove/ko.d.ts.map +1 -0
  607. package/dist/patterns/remove/pl.d.ts +12 -0
  608. package/dist/patterns/remove/pl.d.ts.map +1 -0
  609. package/dist/patterns/remove/qu.d.ts +9 -0
  610. package/dist/patterns/remove/qu.d.ts.map +1 -0
  611. package/dist/patterns/remove/ru.d.ts +12 -0
  612. package/dist/patterns/remove/ru.d.ts.map +1 -0
  613. package/dist/patterns/remove/th.d.ts +8 -0
  614. package/dist/patterns/remove/th.d.ts.map +1 -0
  615. package/dist/patterns/remove/tr.d.ts +12 -0
  616. package/dist/patterns/remove/tr.d.ts.map +1 -0
  617. package/dist/patterns/remove/uk.d.ts +12 -0
  618. package/dist/patterns/remove/uk.d.ts.map +1 -0
  619. package/dist/patterns/remove/vi.d.ts +11 -0
  620. package/dist/patterns/remove/vi.d.ts.map +1 -0
  621. package/dist/patterns/remove/zh.d.ts +12 -0
  622. package/dist/patterns/remove/zh.d.ts.map +1 -0
  623. package/dist/patterns/set/ar.d.ts +12 -0
  624. package/dist/patterns/set/ar.d.ts.map +1 -0
  625. package/dist/patterns/set/bn.d.ts +8 -0
  626. package/dist/patterns/set/bn.d.ts.map +1 -0
  627. package/dist/patterns/set/de.d.ts +12 -0
  628. package/dist/patterns/set/de.d.ts.map +1 -0
  629. package/dist/patterns/set/es.d.ts +12 -0
  630. package/dist/patterns/set/es.d.ts.map +1 -0
  631. package/dist/patterns/set/fr.d.ts +12 -0
  632. package/dist/patterns/set/fr.d.ts.map +1 -0
  633. package/dist/patterns/set/hi.d.ts +8 -0
  634. package/dist/patterns/set/hi.d.ts.map +1 -0
  635. package/dist/patterns/set/id.d.ts +12 -0
  636. package/dist/patterns/set/id.d.ts.map +1 -0
  637. package/dist/patterns/set/index.d.ts +35 -0
  638. package/dist/patterns/set/index.d.ts.map +1 -0
  639. package/dist/patterns/set/it.d.ts +11 -0
  640. package/dist/patterns/set/it.d.ts.map +1 -0
  641. package/dist/patterns/set/ja.d.ts +12 -0
  642. package/dist/patterns/set/ja.d.ts.map +1 -0
  643. package/dist/patterns/set/ko.d.ts +12 -0
  644. package/dist/patterns/set/ko.d.ts.map +1 -0
  645. package/dist/patterns/set/pl.d.ts +12 -0
  646. package/dist/patterns/set/pl.d.ts.map +1 -0
  647. package/dist/patterns/set/pt.d.ts +12 -0
  648. package/dist/patterns/set/pt.d.ts.map +1 -0
  649. package/dist/patterns/set/ru.d.ts +12 -0
  650. package/dist/patterns/set/ru.d.ts.map +1 -0
  651. package/dist/patterns/set/th.d.ts +8 -0
  652. package/dist/patterns/set/th.d.ts.map +1 -0
  653. package/dist/patterns/set/tr.d.ts +12 -0
  654. package/dist/patterns/set/tr.d.ts.map +1 -0
  655. package/dist/patterns/set/uk.d.ts +12 -0
  656. package/dist/patterns/set/uk.d.ts.map +1 -0
  657. package/dist/patterns/set/vi.d.ts +11 -0
  658. package/dist/patterns/set/vi.d.ts.map +1 -0
  659. package/dist/patterns/set/zh.d.ts +12 -0
  660. package/dist/patterns/set/zh.d.ts.map +1 -0
  661. package/dist/patterns/show/ar.d.ts +12 -0
  662. package/dist/patterns/show/ar.d.ts.map +1 -0
  663. package/dist/patterns/show/bn.d.ts +8 -0
  664. package/dist/patterns/show/bn.d.ts.map +1 -0
  665. package/dist/patterns/show/de.d.ts +12 -0
  666. package/dist/patterns/show/de.d.ts.map +1 -0
  667. package/dist/patterns/show/fr.d.ts +12 -0
  668. package/dist/patterns/show/fr.d.ts.map +1 -0
  669. package/dist/patterns/show/hi.d.ts +8 -0
  670. package/dist/patterns/show/hi.d.ts.map +1 -0
  671. package/dist/patterns/show/index.d.ts +32 -0
  672. package/dist/patterns/show/index.d.ts.map +1 -0
  673. package/dist/patterns/show/it.d.ts +11 -0
  674. package/dist/patterns/show/it.d.ts.map +1 -0
  675. package/dist/patterns/show/ja.d.ts +12 -0
  676. package/dist/patterns/show/ja.d.ts.map +1 -0
  677. package/dist/patterns/show/ko.d.ts +12 -0
  678. package/dist/patterns/show/ko.d.ts.map +1 -0
  679. package/dist/patterns/show/pl.d.ts +12 -0
  680. package/dist/patterns/show/pl.d.ts.map +1 -0
  681. package/dist/patterns/show/ru.d.ts +12 -0
  682. package/dist/patterns/show/ru.d.ts.map +1 -0
  683. package/dist/patterns/show/th.d.ts +8 -0
  684. package/dist/patterns/show/th.d.ts.map +1 -0
  685. package/dist/patterns/show/tr.d.ts +12 -0
  686. package/dist/patterns/show/tr.d.ts.map +1 -0
  687. package/dist/patterns/show/uk.d.ts +12 -0
  688. package/dist/patterns/show/uk.d.ts.map +1 -0
  689. package/dist/patterns/show/vi.d.ts +11 -0
  690. package/dist/patterns/show/vi.d.ts.map +1 -0
  691. package/dist/patterns/show/zh.d.ts +12 -0
  692. package/dist/patterns/show/zh.d.ts.map +1 -0
  693. package/dist/patterns/take/ar.d.ts +12 -0
  694. package/dist/patterns/take/ar.d.ts.map +1 -0
  695. package/dist/patterns/take/index.d.ts +18 -0
  696. package/dist/patterns/take/index.d.ts.map +1 -0
  697. package/dist/patterns/toggle/ar.d.ts +12 -0
  698. package/dist/patterns/toggle/ar.d.ts.map +1 -0
  699. package/dist/patterns/toggle/bn.d.ts +8 -0
  700. package/dist/patterns/toggle/bn.d.ts.map +1 -0
  701. package/dist/patterns/toggle/en.d.ts +11 -0
  702. package/dist/patterns/toggle/en.d.ts.map +1 -0
  703. package/dist/patterns/toggle/es.d.ts +11 -0
  704. package/dist/patterns/toggle/es.d.ts.map +1 -0
  705. package/dist/patterns/toggle/hi.d.ts +9 -0
  706. package/dist/patterns/toggle/hi.d.ts.map +1 -0
  707. package/dist/patterns/toggle/index.d.ts +33 -0
  708. package/dist/patterns/toggle/index.d.ts.map +1 -0
  709. package/dist/patterns/toggle/it.d.ts +11 -0
  710. package/dist/patterns/toggle/it.d.ts.map +1 -0
  711. package/dist/patterns/toggle/ja.d.ts +12 -0
  712. package/dist/patterns/toggle/ja.d.ts.map +1 -0
  713. package/dist/patterns/toggle/ko.d.ts +12 -0
  714. package/dist/patterns/toggle/ko.d.ts.map +1 -0
  715. package/dist/patterns/toggle/pl.d.ts +12 -0
  716. package/dist/patterns/toggle/pl.d.ts.map +1 -0
  717. package/dist/patterns/toggle/qu.d.ts +9 -0
  718. package/dist/patterns/toggle/qu.d.ts.map +1 -0
  719. package/dist/patterns/toggle/ru.d.ts +12 -0
  720. package/dist/patterns/toggle/ru.d.ts.map +1 -0
  721. package/dist/patterns/toggle/th.d.ts +9 -0
  722. package/dist/patterns/toggle/th.d.ts.map +1 -0
  723. package/dist/patterns/toggle/tr.d.ts +12 -0
  724. package/dist/patterns/toggle/tr.d.ts.map +1 -0
  725. package/dist/patterns/toggle/uk.d.ts +12 -0
  726. package/dist/patterns/toggle/uk.d.ts.map +1 -0
  727. package/dist/patterns/toggle/vi.d.ts +11 -0
  728. package/dist/patterns/toggle/vi.d.ts.map +1 -0
  729. package/dist/patterns/toggle/zh.d.ts +11 -0
  730. package/dist/patterns/toggle/zh.d.ts.map +1 -0
  731. package/dist/public-api.d.ts +190 -0
  732. package/dist/public-api.d.ts.map +1 -0
  733. package/dist/registry.d.ts +225 -0
  734. package/dist/registry.d.ts.map +1 -0
  735. package/dist/tokenizers/arabic.d.ts +67 -0
  736. package/dist/tokenizers/arabic.d.ts.map +1 -0
  737. package/dist/tokenizers/base-tokenizer.d.ts +240 -0
  738. package/dist/tokenizers/base-tokenizer.d.ts.map +1 -0
  739. package/dist/tokenizers/base.d.ts +14 -0
  740. package/dist/tokenizers/base.d.ts.map +1 -0
  741. package/dist/tokenizers/bengali.d.ts +22 -0
  742. package/dist/tokenizers/bengali.d.ts.map +1 -0
  743. package/dist/tokenizers/char-classifiers.d.ts +56 -0
  744. package/dist/tokenizers/char-classifiers.d.ts.map +1 -0
  745. package/dist/tokenizers/chinese.d.ts +47 -0
  746. package/dist/tokenizers/chinese.d.ts.map +1 -0
  747. package/dist/tokenizers/english.d.ts +34 -0
  748. package/dist/tokenizers/english.d.ts.map +1 -0
  749. package/dist/tokenizers/extractors.d.ts +61 -0
  750. package/dist/tokenizers/extractors.d.ts.map +1 -0
  751. package/dist/tokenizers/french.d.ts +26 -0
  752. package/dist/tokenizers/french.d.ts.map +1 -0
  753. package/dist/tokenizers/german.d.ts +27 -0
  754. package/dist/tokenizers/german.d.ts.map +1 -0
  755. package/dist/tokenizers/he.d.ts +58 -0
  756. package/dist/tokenizers/he.d.ts.map +1 -0
  757. package/dist/tokenizers/hindi.d.ts +25 -0
  758. package/dist/tokenizers/hindi.d.ts.map +1 -0
  759. package/dist/tokenizers/index.d.ts +64 -0
  760. package/dist/tokenizers/index.d.ts.map +1 -0
  761. package/dist/tokenizers/indonesian.d.ts +24 -0
  762. package/dist/tokenizers/indonesian.d.ts.map +1 -0
  763. package/dist/tokenizers/italian.d.ts +41 -0
  764. package/dist/tokenizers/italian.d.ts.map +1 -0
  765. package/dist/tokenizers/japanese.d.ts +42 -0
  766. package/dist/tokenizers/japanese.d.ts.map +1 -0
  767. package/dist/tokenizers/korean.d.ts +47 -0
  768. package/dist/tokenizers/korean.d.ts.map +1 -0
  769. package/dist/tokenizers/morphology/arabic-normalizer.d.ts +37 -0
  770. package/dist/tokenizers/morphology/arabic-normalizer.d.ts.map +1 -0
  771. package/dist/tokenizers/morphology/french-normalizer.d.ts +46 -0
  772. package/dist/tokenizers/morphology/french-normalizer.d.ts.map +1 -0
  773. package/dist/tokenizers/morphology/german-normalizer.d.ts +55 -0
  774. package/dist/tokenizers/morphology/german-normalizer.d.ts.map +1 -0
  775. package/dist/tokenizers/morphology/index.d.ts +20 -0
  776. package/dist/tokenizers/morphology/index.d.ts.map +1 -0
  777. package/dist/tokenizers/morphology/italian-normalizer.d.ts +52 -0
  778. package/dist/tokenizers/morphology/italian-normalizer.d.ts.map +1 -0
  779. package/dist/tokenizers/morphology/japanese-normalizer.d.ts +43 -0
  780. package/dist/tokenizers/morphology/japanese-normalizer.d.ts.map +1 -0
  781. package/dist/tokenizers/morphology/korean-normalizer.d.ts +45 -0
  782. package/dist/tokenizers/morphology/korean-normalizer.d.ts.map +1 -0
  783. package/dist/tokenizers/morphology/polish-normalizer.d.ts +61 -0
  784. package/dist/tokenizers/morphology/polish-normalizer.d.ts.map +1 -0
  785. package/dist/tokenizers/morphology/portuguese-normalizer.d.ts +51 -0
  786. package/dist/tokenizers/morphology/portuguese-normalizer.d.ts.map +1 -0
  787. package/dist/tokenizers/morphology/russian-normalizer.d.ts +72 -0
  788. package/dist/tokenizers/morphology/russian-normalizer.d.ts.map +1 -0
  789. package/dist/tokenizers/morphology/spanish-normalizer.d.ts +49 -0
  790. package/dist/tokenizers/morphology/spanish-normalizer.d.ts.map +1 -0
  791. package/dist/tokenizers/morphology/turkish-normalizer.d.ts +52 -0
  792. package/dist/tokenizers/morphology/turkish-normalizer.d.ts.map +1 -0
  793. package/dist/tokenizers/morphology/types.d.ts +110 -0
  794. package/dist/tokenizers/morphology/types.d.ts.map +1 -0
  795. package/dist/tokenizers/morphology/ukrainian-normalizer.d.ts +76 -0
  796. package/dist/tokenizers/morphology/ukrainian-normalizer.d.ts.map +1 -0
  797. package/dist/tokenizers/ms.d.ts +22 -0
  798. package/dist/tokenizers/ms.d.ts.map +1 -0
  799. package/dist/tokenizers/polish.d.ts +25 -0
  800. package/dist/tokenizers/polish.d.ts.map +1 -0
  801. package/dist/tokenizers/portuguese.d.ts +26 -0
  802. package/dist/tokenizers/portuguese.d.ts.map +1 -0
  803. package/dist/tokenizers/quechua.d.ts +36 -0
  804. package/dist/tokenizers/quechua.d.ts.map +1 -0
  805. package/dist/tokenizers/russian.d.ts +25 -0
  806. package/dist/tokenizers/russian.d.ts.map +1 -0
  807. package/dist/{spanish-BedpM-NU.d.ts → tokenizers/spanish.d.ts} +5 -7
  808. package/dist/tokenizers/spanish.d.ts.map +1 -0
  809. package/dist/tokenizers/swahili.d.ts +24 -0
  810. package/dist/tokenizers/swahili.d.ts.map +1 -0
  811. package/dist/tokenizers/thai.d.ts +24 -0
  812. package/dist/tokenizers/thai.d.ts.map +1 -0
  813. package/dist/tokenizers/tl.d.ts +22 -0
  814. package/dist/tokenizers/tl.d.ts.map +1 -0
  815. package/dist/tokenizers/token-utils.d.ts +97 -0
  816. package/dist/tokenizers/token-utils.d.ts.map +1 -0
  817. package/dist/tokenizers/turkish.d.ts +42 -0
  818. package/dist/tokenizers/turkish.d.ts.map +1 -0
  819. package/dist/tokenizers/ukrainian.d.ts +25 -0
  820. package/dist/tokenizers/ukrainian.d.ts.map +1 -0
  821. package/dist/tokenizers/vietnamese.d.ts +47 -0
  822. package/dist/tokenizers/vietnamese.d.ts.map +1 -0
  823. package/dist/types/grammar-types.d.ts +224 -0
  824. package/dist/types/grammar-types.d.ts.map +1 -0
  825. package/dist/types/unified-profile.d.ts +167 -0
  826. package/dist/types/unified-profile.d.ts.map +1 -0
  827. package/dist/types.d.ts +401 -0
  828. package/dist/types.d.ts.map +1 -0
  829. package/dist/utils/confidence-calculator.d.ts +43 -0
  830. package/dist/utils/confidence-calculator.d.ts.map +1 -0
  831. package/dist/validators/command-validator.d.ts +83 -0
  832. package/dist/validators/command-validator.d.ts.map +1 -0
  833. package/dist/validators/index.d.ts +7 -0
  834. package/dist/validators/index.d.ts.map +1 -0
  835. package/package.json +38 -6
  836. package/src/ast-builder/command-mappers.ts +9 -1
  837. package/src/ast-builder/expression-parser/parser.ts +13 -2
  838. package/src/ast-builder/index.ts +20 -6
  839. package/src/browser-bn.ts +162 -0
  840. package/src/browser-east-asian.ts +1 -1
  841. package/src/browser-hi.ts +162 -0
  842. package/src/browser-it.ts +162 -0
  843. package/src/browser-ms.ts +162 -0
  844. package/src/browser-pl.ts +162 -0
  845. package/src/browser-priority.ts +1 -1
  846. package/src/browser-ru.ts +162 -0
  847. package/src/browser-th.ts +162 -0
  848. package/src/browser-tl.ts +162 -0
  849. package/src/browser-uk.ts +162 -0
  850. package/src/browser-vi.ts +162 -0
  851. package/src/browser-western.ts +1 -1
  852. package/src/core-bridge.ts +43 -16
  853. package/src/core.ts +13 -0
  854. package/src/explicit/parser.ts +4 -2
  855. package/src/explicit/renderer.ts +1 -1
  856. package/src/generators/command-schemas.ts +214 -2
  857. package/src/generators/event-handlers-sov.ts +686 -0
  858. package/src/generators/event-handlers-vso.ts +489 -0
  859. package/src/generators/pattern-generator.ts +93 -736
  860. package/src/generators/profiles/arabic.ts +11 -1
  861. package/src/generators/profiles/bengali.ts +6 -0
  862. package/src/generators/profiles/chinese.ts +6 -0
  863. package/src/generators/profiles/english.ts +6 -0
  864. package/src/generators/profiles/french.ts +6 -0
  865. package/src/generators/profiles/german.ts +6 -0
  866. package/src/generators/profiles/hebrew.ts +6 -0
  867. package/src/generators/profiles/hindi.ts +6 -0
  868. package/src/generators/profiles/indonesian.ts +6 -0
  869. package/src/generators/profiles/italian.ts +6 -0
  870. package/src/generators/profiles/japanese.ts +6 -0
  871. package/src/generators/profiles/korean.ts +6 -0
  872. package/src/generators/profiles/ms.ts +6 -0
  873. package/src/generators/profiles/polish.ts +6 -0
  874. package/src/generators/profiles/portuguese.ts +6 -0
  875. package/src/generators/profiles/quechua.ts +35 -13
  876. package/src/generators/profiles/russian.ts +6 -0
  877. package/src/generators/profiles/spanish.ts +6 -0
  878. package/src/generators/profiles/spanishMexico.ts +6 -0
  879. package/src/generators/profiles/swahili.ts +14 -3
  880. package/src/generators/profiles/thai.ts +6 -0
  881. package/src/generators/profiles/tl.ts +22 -9
  882. package/src/generators/profiles/turkish.ts +7 -1
  883. package/src/generators/profiles/ukrainian.ts +6 -0
  884. package/src/generators/profiles/vietnamese.ts +6 -0
  885. package/src/generators/schema-validator.ts +8 -3
  886. package/src/index.ts +54 -0
  887. package/src/interchange/from-semantic.ts +440 -0
  888. package/src/interchange/index.ts +26 -0
  889. package/src/interchange/types.ts +186 -0
  890. package/src/parser/pattern-matcher.ts +65 -15
  891. package/src/parser/semantic-parser.ts +850 -8
  892. package/src/patterns/add/index.ts +1 -9
  893. package/src/patterns/builders.ts +2 -2
  894. package/src/patterns/decrement/index.ts +1 -9
  895. package/src/patterns/event-handler/shared.ts +30 -0
  896. package/src/patterns/event-handler/tl.ts +39 -19
  897. package/src/patterns/get/index.ts +1 -9
  898. package/src/patterns/hide/index.ts +1 -9
  899. package/src/patterns/increment/index.ts +1 -9
  900. package/src/patterns/put/index.ts +1 -9
  901. package/src/patterns/registry.ts +2 -2
  902. package/src/patterns/remove/index.ts +1 -9
  903. package/src/patterns/set/index.ts +1 -9
  904. package/src/patterns/show/index.ts +1 -9
  905. package/src/patterns/toggle/index.ts +1 -9
  906. package/src/tokenizers/arabic.ts +14 -1
  907. package/src/tokenizers/base-tokenizer.ts +644 -0
  908. package/src/tokenizers/base.ts +39 -1297
  909. package/src/tokenizers/bengali.ts +37 -10
  910. package/src/tokenizers/char-classifiers.ts +79 -0
  911. package/src/tokenizers/chinese.ts +7 -0
  912. package/src/tokenizers/english.ts +8 -1
  913. package/src/tokenizers/extractors.ts +452 -0
  914. package/src/tokenizers/french.ts +16 -1
  915. package/src/tokenizers/german.ts +16 -1
  916. package/src/tokenizers/he.ts +14 -1
  917. package/src/tokenizers/hindi.ts +14 -1
  918. package/src/tokenizers/indonesian.ts +14 -1
  919. package/src/tokenizers/italian.ts +14 -1
  920. package/src/tokenizers/japanese.ts +14 -1
  921. package/src/tokenizers/korean.ts +19 -1
  922. package/src/tokenizers/morphology/index.ts +17 -0
  923. package/src/tokenizers/morphology/polish-normalizer.ts +147 -131
  924. package/src/tokenizers/morphology/russian-normalizer.ts +397 -0
  925. package/src/tokenizers/morphology/ukrainian-normalizer.ts +366 -0
  926. package/src/tokenizers/ms.ts +14 -1
  927. package/src/tokenizers/polish.ts +16 -1
  928. package/src/tokenizers/portuguese.ts +16 -1
  929. package/src/tokenizers/quechua.ts +30 -1
  930. package/src/tokenizers/russian.ts +16 -1
  931. package/src/tokenizers/spanish.ts +14 -1
  932. package/src/tokenizers/swahili.ts +14 -1
  933. package/src/tokenizers/thai.ts +14 -1
  934. package/src/tokenizers/tl.ts +14 -1
  935. package/src/tokenizers/token-utils.ts +205 -0
  936. package/src/tokenizers/turkish.ts +21 -2
  937. package/src/tokenizers/ukrainian.ts +16 -1
  938. package/src/tokenizers/vietnamese.ts +7 -0
  939. package/src/types.ts +41 -2
  940. package/src/validators/command-validator.ts +17 -40
  941. package/dist/index.d.cts +0 -3470
  942. package/dist/types-BY3Id07j.d.ts +0 -615
  943. package/src/bridge.ts +0 -275
  944. package/src/generators/event-handler-generator.ts +0 -115
  945. package/src/patterns/add/ms.ts +0 -30
  946. package/src/patterns/add/tl.ts +0 -30
  947. package/src/patterns/decrement/ms.ts +0 -30
  948. package/src/patterns/decrement/tl.ts +0 -30
  949. package/src/patterns/get/ms.ts +0 -30
  950. package/src/patterns/get/tl.ts +0 -30
  951. package/src/patterns/hide/ms.ts +0 -30
  952. package/src/patterns/hide/tl.ts +0 -30
  953. package/src/patterns/increment/ms.ts +0 -30
  954. package/src/patterns/increment/tl.ts +0 -30
  955. package/src/patterns/put/ms.ts +0 -30
  956. package/src/patterns/put/tl.ts +0 -30
  957. package/src/patterns/remove/ms.ts +0 -30
  958. package/src/patterns/remove/tl.ts +0 -30
  959. package/src/patterns/set/ms.ts +0 -30
  960. package/src/patterns/set/tl.ts +0 -30
  961. package/src/patterns/show/ms.ts +0 -30
  962. package/src/patterns/show/tl.ts +0 -30
  963. package/src/patterns/toggle/ms.ts +0 -30
  964. package/src/patterns/toggle/tl.ts +0 -30
package/dist/core.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts","../src/parser/utils/type-validation.ts","../src/parser/utils/possessive-keywords.ts","../src/registry.ts","../src/parser/pattern-matcher.ts","../src/tokenizers/index.ts","../src/cache/semantic-cache.ts","../src/core-bridge.ts","../src/ast-builder/expression-parser/tokenizer.ts","../src/ast-builder/expression-parser/parser.ts","../src/ast-builder/value-converters.ts","../src/ast-builder/command-mappers.ts","../src/ast-builder/index.ts"],"sourcesContent":["/**\n * Semantic-First Multilingual Hyperscript Types\n *\n * This module defines the canonical semantic representation that all languages\n * parse to and render from. The semantic layer is language-neutral - it captures\n * the MEANING of hyperscript commands independent of surface syntax.\n */\n\n// Re-export the SemanticRole type from local grammar-types for consistency\nexport type {\n SemanticRole,\n WordOrder,\n AdpositionType,\n MorphologyType,\n GrammaticalMarker,\n LanguageProfile,\n} from './types/grammar-types';\n\nimport type { SemanticRole } from './types/grammar-types';\n\n// =============================================================================\n// Action Types\n// =============================================================================\n\n/**\n * Canonical action names (English-based internally, but not visible to users)\n * These map to hyperscript commands and are used in the semantic AST.\n */\nexport type ActionType =\n // Class/Attribute operations\n | 'toggle'\n | 'add'\n | 'remove'\n // Content operations\n | 'put'\n | 'append'\n | 'prepend'\n | 'take'\n | 'make'\n | 'clone'\n | 'swap'\n | 'morph'\n // Variable operations\n | 'set'\n | 'get'\n | 'increment'\n | 'decrement'\n | 'log'\n // Visibility\n | 'show'\n | 'hide'\n | 'transition'\n // Events\n | 'on'\n | 'trigger'\n | 'send'\n // DOM focus\n | 'focus'\n | 'blur'\n // Navigation\n | 'go'\n // Async\n | 'wait'\n | 'fetch'\n | 'settle'\n // Animation/Measurement\n | 'measure'\n // Behavior system\n | 'install'\n // Control flow\n | 'if'\n | 'unless'\n | 'else'\n | 'repeat'\n | 'for'\n | 'while'\n | 'continue'\n | 'halt'\n | 'throw'\n | 'call'\n | 'return'\n // Advanced\n | 'js'\n | 'async'\n | 'tell'\n | 'default'\n | 'init'\n | 'behavior'\n // Meta (for compound nodes)\n | 'compound';\n\n// =============================================================================\n// Semantic Values\n// =============================================================================\n\n/**\n * A semantic value represents a typed piece of data in a semantic node.\n * Values are language-neutral - they capture what something IS, not how it's written.\n */\nexport type SemanticValue =\n | LiteralValue\n | SelectorValue\n | ReferenceValue\n | PropertyPathValue\n | ExpressionValue;\n\nexport interface LiteralValue {\n readonly type: 'literal';\n readonly value: string | number | boolean;\n readonly dataType?: 'string' | 'number' | 'boolean' | 'duration';\n}\n\nexport interface SelectorValue {\n readonly type: 'selector';\n readonly value: string; // The CSS selector: #id, .class, [attr], etc.\n readonly selectorKind: 'id' | 'class' | 'attribute' | 'element' | 'complex';\n}\n\nexport interface ReferenceValue {\n readonly type: 'reference';\n readonly value: 'me' | 'you' | 'it' | 'result' | 'event' | 'target' | 'body';\n}\n\nexport interface PropertyPathValue {\n readonly type: 'property-path';\n readonly object: SemanticValue;\n readonly property: string;\n}\n\nexport interface ExpressionValue {\n readonly type: 'expression';\n /** Raw expression string for complex expressions that need further parsing */\n readonly raw: string;\n}\n\n// =============================================================================\n// Semantic Nodes\n// =============================================================================\n\n/**\n * Base interface for all semantic nodes.\n * Semantic nodes capture the MEANING of hyperscript constructs.\n */\nexport interface SemanticNode {\n readonly kind: 'command' | 'event-handler' | 'conditional' | 'compound' | 'loop';\n readonly action: ActionType;\n readonly roles: ReadonlyMap<SemanticRole, SemanticValue>;\n readonly metadata?: SemanticMetadata;\n}\n\n/**\n * Metadata about the source of a semantic node.\n * Useful for debugging, error messages, and round-trip conversion.\n */\nexport interface SemanticMetadata {\n readonly sourceLanguage?: string;\n readonly sourceText?: string;\n readonly sourcePosition?: SourcePosition;\n readonly patternId?: string;\n /**\n * Confidence score for the parse (0-1).\n * Higher values indicate more certain matches.\n * - 1.0: Exact match with all roles captured\n * - 0.8-0.99: High confidence with minor uncertainty (stem matching, optional roles)\n * - 0.6-0.8: Medium confidence (morphological normalization, defaults applied)\n * - <0.6: Low confidence (may need fallback to traditional parser)\n */\n readonly confidence?: number;\n}\n\nexport interface SourcePosition {\n readonly start: number;\n readonly end: number;\n readonly line?: number;\n readonly column?: number;\n}\n\n/**\n * A command semantic node - represents a single hyperscript command.\n */\nexport interface CommandSemanticNode extends SemanticNode {\n readonly kind: 'command';\n}\n\n/**\n * An event handler semantic node - represents \"on [event] [commands]\".\n */\nexport interface EventHandlerSemanticNode extends SemanticNode {\n readonly kind: 'event-handler';\n readonly action: 'on';\n readonly body: SemanticNode[];\n readonly eventModifiers?: EventModifiers;\n /**\n * Event parameter names for destructuring.\n * E.g., for \"on click(clientX, clientY)\", this would be ['clientX', 'clientY']\n */\n readonly parameterNames?: readonly string[];\n}\n\nexport interface EventModifiers {\n readonly once?: boolean;\n readonly debounce?: number;\n readonly throttle?: number;\n readonly queue?: 'first' | 'last' | 'all' | 'none';\n readonly from?: SemanticValue; // Event source filter\n}\n\n/**\n * A conditional semantic node - represents \"if [condition] then [body] else [body]\".\n */\nexport interface ConditionalSemanticNode extends SemanticNode {\n readonly kind: 'conditional';\n readonly action: 'if';\n readonly thenBranch: SemanticNode[];\n readonly elseBranch?: SemanticNode[];\n}\n\n/**\n * A compound semantic node - represents multiple chained statements.\n */\nexport interface CompoundSemanticNode extends SemanticNode {\n readonly kind: 'compound';\n readonly statements: SemanticNode[];\n readonly chainType: 'then' | 'and' | 'async';\n}\n\n/**\n * Loop variant discriminant for different loop types.\n */\nexport type LoopVariant =\n | 'forever' // repeat forever\n | 'times' // repeat 5 times\n | 'for' // for item in collection\n | 'while' // while condition\n | 'until'; // until condition\n\n/**\n * A loop semantic node - represents repeat/for/while loops.\n */\nexport interface LoopSemanticNode extends SemanticNode {\n readonly kind: 'loop';\n readonly action: 'repeat' | 'for' | 'while';\n /** The type of loop (forever, times, for, while, until) */\n readonly loopVariant: LoopVariant;\n /** Commands to execute in each iteration */\n readonly body: SemanticNode[];\n /** Loop variable name for 'for' loops (e.g., 'item' in 'for item in list') */\n readonly loopVariable?: string;\n /** Index variable name if specified (e.g., 'i' in 'for item with index i') */\n readonly indexVariable?: string;\n}\n\n// =============================================================================\n// Language Patterns\n// =============================================================================\n\n/**\n * A pattern defines how a semantic structure appears in a specific language.\n * Patterns enable bidirectional conversion: parse (natural → semantic) and\n * render (semantic → natural).\n */\nexport interface LanguagePattern {\n /** Unique identifier for this pattern */\n readonly id: string;\n\n /** ISO 639-1 language code */\n readonly language: string;\n\n /** Which command this pattern matches */\n readonly command: ActionType;\n\n /** Priority for disambiguation (higher = checked first) */\n readonly priority: number;\n\n /** The pattern template with role placeholders */\n readonly template: PatternTemplate;\n\n /** Rules for extracting semantic roles from matched tokens */\n readonly extraction: ExtractionRules;\n\n /** Optional constraints on when this pattern applies */\n readonly constraints?: PatternConstraints;\n}\n\n/**\n * A pattern template defines the expected token sequence.\n *\n * Template syntax:\n * - Literal tokens: \"toggle\", \"を\", \"على\"\n * - Role placeholders: {patient}, {target}, {destination}\n * - Optional groups: [on {target}]\n * - Alternatives in extraction (not in template string)\n *\n * Example templates:\n * - English: \"toggle {patient} [on {target}]\"\n * - Japanese: \"{target} の {patient} を 切り替え\"\n * - Arabic: \"بدّل {patient} [على {target}]\"\n */\nexport interface PatternTemplate {\n /** Human-readable template string */\n readonly format: string;\n\n /** Parsed token sequence for matching */\n readonly tokens: PatternToken[];\n}\n\nexport type PatternToken = LiteralPatternToken | RolePatternToken | GroupPatternToken;\n\nexport interface LiteralPatternToken {\n readonly type: 'literal';\n readonly value: string;\n /** Alternative spellings/forms that also match */\n readonly alternatives?: string[];\n}\n\nexport interface RolePatternToken {\n readonly type: 'role';\n readonly role: SemanticRole;\n readonly optional?: boolean;\n /** Expected value types (for validation) */\n readonly expectedTypes?: Array<SemanticValue['type']>;\n}\n\nexport interface GroupPatternToken {\n readonly type: 'group';\n readonly tokens: PatternToken[];\n readonly optional?: boolean;\n}\n\n/**\n * Rules for extracting semantic values from matched tokens.\n */\nexport interface ExtractionRules {\n readonly [role: string]: ExtractionRule;\n}\n\nexport interface ExtractionRule {\n /** Position-based extraction (0-indexed from pattern start) */\n readonly position?: number;\n /** Marker-based extraction (find value after this marker) */\n readonly marker?: string;\n /** Alternative markers that also work */\n readonly markerAlternatives?: string[];\n /** Transform the extracted value */\n readonly transform?: (raw: string) => SemanticValue;\n /** Default value if not found (for optional roles) */\n readonly default?: SemanticValue;\n /** Static value extraction (for event handler wrapped commands) */\n readonly value?: string;\n /** Extract value from a pattern role by name */\n readonly fromRole?: string;\n}\n\n/**\n * Additional constraints on pattern applicability.\n */\nexport interface PatternConstraints {\n /** Required roles that must be present */\n readonly requiredRoles?: SemanticRole[];\n /** Roles that must NOT be present */\n readonly forbiddenRoles?: SemanticRole[];\n /** Valid selector types for the patient role */\n readonly validPatientTypes?: Array<SelectorValue['selectorKind']>;\n /** Pattern IDs this conflicts with */\n readonly conflictsWith?: string[];\n}\n\n// =============================================================================\n// Token Stream (for pattern matching)\n// =============================================================================\n\n/**\n * A token from language-specific tokenization.\n */\nexport interface LanguageToken {\n readonly value: string;\n readonly kind: TokenKind;\n readonly position: SourcePosition;\n /** Normalized form from explicit keyword map (e.g., 切り替え → toggle) */\n readonly normalized?: string;\n /** Morphologically normalized stem (e.g., 切り替えた → 切り替え) */\n readonly stem?: string;\n /** Confidence in the morphological stem (0.0-1.0) */\n readonly stemConfidence?: number;\n /** Additional metadata for specific token types (e.g., event modifier data) */\n readonly metadata?: Record<string, unknown>;\n}\n\nexport type TokenKind =\n | 'keyword' // Command or modifier keyword\n | 'selector' // CSS selector (#id, .class, [attr])\n | 'literal' // String or number literal\n | 'particle' // Grammatical particle (を, に, من)\n | 'conjunction' // Grammatical conjunction (Arabic و/ف proclitics)\n | 'event-modifier' // Event modifier (.once, .debounce(300), .throttle(100))\n | 'identifier' // Variable or property name\n | 'operator' // Comparison or logical operator\n | 'punctuation' // Brackets, quotes, etc.\n | 'url'; // URL/path (/path, https://...)\n\n/**\n * A stream of tokens with navigation capabilities.\n */\nexport interface TokenStream {\n readonly tokens: readonly LanguageToken[];\n readonly language: string;\n\n /** Look at token at current position + offset without consuming */\n peek(offset?: number): LanguageToken | null;\n\n /** Consume and return current token, advance position */\n advance(): LanguageToken;\n\n /** Check if we've consumed all tokens */\n isAtEnd(): boolean;\n\n /** Save current position for backtracking */\n mark(): StreamMark;\n\n /** Restore to a saved position */\n reset(mark: StreamMark): void;\n\n /** Get current position */\n position(): number;\n}\n\nexport interface StreamMark {\n readonly position: number;\n}\n\n// =============================================================================\n// Pattern Matching Results\n// =============================================================================\n\n/**\n * Result of successfully matching a pattern.\n */\nexport interface PatternMatchResult {\n readonly pattern: LanguagePattern;\n readonly captured: ReadonlyMap<SemanticRole, SemanticValue>;\n readonly consumedTokens: number;\n readonly confidence: number; // 0-1, how well the pattern matched\n}\n\n/**\n * Error when pattern matching fails.\n */\nexport interface PatternMatchError {\n readonly message: string;\n readonly position: SourcePosition;\n readonly expectedPatterns?: string[];\n readonly partialMatch?: Partial<PatternMatchResult>;\n}\n\n// =============================================================================\n// Tokenizer Interface\n// =============================================================================\n\n/**\n * Language-specific tokenizer interface.\n * Each language implements its own tokenizer to handle:\n * - Word boundaries (spaces for English, particles for Japanese)\n * - Character sets (ASCII, CJK, Arabic, etc.)\n * - Special markers (particles, prefixes, suffixes)\n */\nexport interface LanguageTokenizer {\n readonly language: string;\n readonly direction: 'ltr' | 'rtl';\n\n /** Convert input string to token stream */\n tokenize(input: string): TokenStream;\n\n /** Classify a single token */\n classifyToken(token: string): TokenKind;\n}\n\n// =============================================================================\n// Semantic Parser Interface\n// =============================================================================\n\n/**\n * Main parser interface - converts natural language to semantic nodes.\n */\nexport interface SemanticParser {\n /** Parse input in specified language to semantic node */\n parse(input: string, language: string): SemanticNode;\n\n /** Check if input can be parsed in the specified language */\n canParse(input: string, language: string): boolean;\n\n /** Get all supported languages */\n supportedLanguages(): string[];\n}\n\n// =============================================================================\n// Semantic Renderer Interface\n// =============================================================================\n\n/**\n * Renderer interface - converts semantic nodes to natural language.\n */\nexport interface SemanticRenderer {\n /** Render semantic node in specified language */\n render(node: SemanticNode, language: string): string;\n\n /** Render semantic node in explicit mode */\n renderExplicit(node: SemanticNode): string;\n\n /** Get all supported languages */\n supportedLanguages(): string[];\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Create a selector semantic value from a CSS selector string.\n */\nexport function createSelector(value: string): SelectorValue {\n let selectorKind: SelectorValue['selectorKind'] = 'complex';\n\n if (value.startsWith('#') && !value.includes(' ')) {\n selectorKind = 'id';\n } else if (value.startsWith('.') && !value.includes(' ')) {\n selectorKind = 'class';\n } else if (value.startsWith('[') && value.endsWith(']')) {\n selectorKind = 'attribute';\n } else if (/^[a-z][a-z0-9]*$/i.test(value)) {\n selectorKind = 'element';\n }\n\n return { type: 'selector', value, selectorKind };\n}\n\n/**\n * Create a literal semantic value.\n */\nexport function createLiteral(\n value: string | number | boolean,\n dataType?: LiteralValue['dataType']\n): LiteralValue {\n const result: LiteralValue = { type: 'literal', value };\n if (dataType !== undefined) {\n return { type: 'literal', value, dataType };\n }\n return result;\n}\n\n/**\n * Create a reference semantic value.\n */\nexport function createReference(value: ReferenceValue['value']): ReferenceValue {\n return { type: 'reference', value };\n}\n\n/**\n * Create a property path semantic value.\n */\nexport function createPropertyPath(object: SemanticValue, property: string): PropertyPathValue {\n return { type: 'property-path', object, property };\n}\n\n/**\n * Create a semantic node with the given action and roles.\n */\nexport function createCommandNode(\n action: ActionType,\n roles: Record<string, SemanticValue>,\n metadata?: SemanticMetadata\n): CommandSemanticNode {\n const node: CommandSemanticNode = {\n kind: 'command',\n action,\n roles: new Map(Object.entries(roles) as [SemanticRole, SemanticValue][]),\n };\n if (metadata !== undefined) {\n return { ...node, metadata };\n }\n return node;\n}\n\n/**\n * Create an event handler semantic node.\n */\nexport function createEventHandler(\n event: SemanticValue,\n body: SemanticNode[],\n modifiers?: EventModifiers,\n metadata?: SemanticMetadata,\n parameterNames?: string[]\n): EventHandlerSemanticNode {\n const roles = new Map<SemanticRole, SemanticValue>();\n roles.set('event', event);\n\n const node: EventHandlerSemanticNode = {\n kind: 'event-handler',\n action: 'on',\n roles,\n body,\n };\n\n if (modifiers !== undefined) {\n (node as { eventModifiers?: EventModifiers }).eventModifiers = modifiers;\n }\n if (metadata !== undefined) {\n (node as { metadata?: SemanticMetadata }).metadata = metadata;\n }\n if (parameterNames !== undefined && parameterNames.length > 0) {\n (node as { parameterNames?: readonly string[] }).parameterNames = parameterNames;\n }\n\n return node;\n}\n\n/**\n * Create a compound semantic node (for chained statements).\n */\nexport function createCompoundNode(\n statements: SemanticNode[],\n chainType: 'then' | 'and' | 'async' = 'then',\n metadata?: SemanticMetadata\n): CompoundSemanticNode {\n const node: CompoundSemanticNode = {\n kind: 'compound',\n action: 'compound' as ActionType, // Compound doesn't have a specific action\n roles: new Map(),\n statements,\n chainType,\n };\n if (metadata !== undefined) {\n (node as { metadata?: SemanticMetadata }).metadata = metadata;\n }\n return node;\n}\n\n/**\n * Create a conditional semantic node (if/else).\n */\nexport function createConditionalNode(\n condition: SemanticValue,\n thenBranch: SemanticNode[],\n elseBranch?: SemanticNode[],\n metadata?: SemanticMetadata\n): ConditionalSemanticNode {\n const roles = new Map<SemanticRole, SemanticValue>();\n roles.set('condition' as SemanticRole, condition);\n\n const node: ConditionalSemanticNode = {\n kind: 'conditional',\n action: 'if',\n roles,\n thenBranch,\n };\n if (elseBranch !== undefined) {\n (node as { elseBranch?: SemanticNode[] }).elseBranch = elseBranch;\n }\n if (metadata !== undefined) {\n (node as { metadata?: SemanticMetadata }).metadata = metadata;\n }\n return node;\n}\n\n/**\n * Create a loop semantic node.\n */\nexport function createLoopNode(\n action: 'repeat' | 'for' | 'while',\n loopVariant: LoopVariant,\n roles: Record<string, SemanticValue>,\n body: SemanticNode[],\n options?: {\n loopVariable?: string;\n indexVariable?: string;\n metadata?: SemanticMetadata;\n }\n): LoopSemanticNode {\n const node: LoopSemanticNode = {\n kind: 'loop',\n action,\n loopVariant,\n roles: new Map(Object.entries(roles) as [SemanticRole, SemanticValue][]),\n body,\n };\n\n if (options?.loopVariable) {\n (node as { loopVariable?: string }).loopVariable = options.loopVariable;\n }\n if (options?.indexVariable) {\n (node as { indexVariable?: string }).indexVariable = options.indexVariable;\n }\n if (options?.metadata) {\n (node as { metadata?: SemanticMetadata }).metadata = options.metadata;\n }\n\n return node;\n}\n\n// =============================================================================\n// Semantic Parse Result (for validation)\n// =============================================================================\n\n/**\n * Argument with semantic role attached.\n */\nexport type SemanticArgument = SemanticValue & {\n role?: SemanticRole;\n};\n\n/**\n * Result of semantic parsing (used by command validator).\n */\nexport interface SemanticParseResult {\n /** The action/command type */\n readonly action: ActionType;\n /** Confidence score (0-1) */\n readonly confidence: number;\n /** Source language code */\n readonly language: string;\n /** Parsed arguments with roles */\n readonly arguments: SemanticArgument[];\n}\n","/**\n * Type Validation Utility\n *\n * Shared utilities for validating semantic value types against expected types.\n * Used by pattern-matcher to validate captured role values.\n */\n\nimport type { SemanticValue } from '../../types';\n\n/**\n * Semantic value type strings.\n */\nexport type SemanticValueType = SemanticValue['type'];\n\n/**\n * Check if a value type matches any of the expected types.\n *\n * The 'expression' type is treated as a wildcard that matches any value.\n * The 'property-path' type is compatible with selector, reference, and expression.\n *\n * @param actualType The actual type of the value\n * @param expectedTypes Array of expected types\n * @returns True if the type is compatible\n */\nexport function isTypeCompatible(\n actualType: SemanticValueType | string,\n expectedTypes: (SemanticValueType | string)[]\n): boolean {\n // Empty expected types means any type is valid\n if (!expectedTypes || expectedTypes.length === 0) {\n return true;\n }\n\n // Direct match\n if (expectedTypes.includes(actualType)) {\n return true;\n }\n\n // 'expression' is always compatible (wildcard)\n if (expectedTypes.includes('expression')) {\n return true;\n }\n\n // 'property-path' is compatible with selector, reference, and expression\n if (actualType === 'property-path') {\n return expectedTypes.some(t => ['selector', 'reference', 'expression'].includes(t));\n }\n\n return false;\n}\n\n/**\n * Validate a semantic value against expected types.\n *\n * @param value The semantic value to validate\n * @param expectedTypes Array of expected types (empty means any type is valid)\n * @returns True if the value type is valid\n */\nexport function validateValueType(\n value: SemanticValue,\n expectedTypes?: (SemanticValueType | string)[]\n): boolean {\n if (!expectedTypes || expectedTypes.length === 0) {\n return true;\n }\n\n return isTypeCompatible(value.type, expectedTypes);\n}\n\n/**\n * Check if a value is a CSS selector.\n */\nexport function isCSSSelector(value: string): boolean {\n return value.startsWith('.') || value.startsWith('#') || value.startsWith('<');\n}\n\n/**\n * Check if a value is a class name (starts with .).\n */\nexport function isClassName(value: string): boolean {\n return value.startsWith('.');\n}\n\n/**\n * Check if a value is an ID selector (starts with #).\n */\nexport function isIdSelector(value: string): boolean {\n return value.startsWith('#');\n}\n\n/**\n * Check if a value is a CSS property reference (starts with *).\n */\nexport function isCSSPropertyRef(value: string): boolean {\n return value.startsWith('*');\n}\n\n/**\n * Check if a value is a numeric value.\n */\nexport function isNumericValue(value: string): boolean {\n // Handle duration values (e.g., \"100ms\", \"2s\")\n const durationMatch = value.match(/^(\\d+(?:\\.\\d+)?)(ms|s|m|h)?$/);\n if (durationMatch) {\n return true;\n }\n\n // Plain number\n const num = parseFloat(value);\n return !isNaN(num) && isFinite(num);\n}\n\n/**\n * Check if a value is a property name (identifier-like).\n */\nexport function isPropertyName(value: string): boolean {\n // Property names are identifiers (start with letter or _, contain alphanumeric)\n return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(value);\n}\n\n/**\n * Check if a value is a variable reference (starts with :).\n */\nexport function isVariableRef(value: string): boolean {\n return value.startsWith(':');\n}\n\n/**\n * Check if a value is a built-in reference (me, you, it, etc.).\n */\nexport function isBuiltInReference(value: string): boolean {\n const builtIns = new Set(['me', 'you', 'it', 'result', 'event', 'target', 'body']);\n return builtIns.has(value.toLowerCase());\n}\n","/**\n * Possessive Keywords Utility\n *\n * Provides functions to look up possessive keywords from language profiles.\n * Used by pattern-matcher to recognize possessive expressions like \"my value\".\n */\n\nimport type { LanguageProfile } from '../../generators/profiles/types';\n\n/**\n * Get the reference for a possessive keyword from a language profile.\n *\n * @param profile Language profile\n * @param keyword Possessive keyword (e.g., 'my', 'your', 'its')\n * @returns The reference (e.g., 'me', 'you', 'it') or undefined if not found\n */\nexport function getPossessiveReference(\n profile: LanguageProfile,\n keyword: string\n): string | undefined {\n return profile.possessive?.keywords?.[keyword];\n}\n\n/**\n * Check if a keyword is a possessive keyword in the given profile.\n *\n * @param profile Language profile\n * @param keyword Keyword to check\n * @returns True if the keyword is a possessive keyword\n */\nexport function isPossessiveKeyword(profile: LanguageProfile, keyword: string): boolean {\n return profile.possessive?.keywords?.[keyword] !== undefined;\n}\n\n/**\n * Get all possessive keywords from a language profile.\n *\n * @param profile Language profile\n * @returns Record of possessive keywords to references, or empty object\n */\nexport function getAllPossessiveKeywords(profile: LanguageProfile): Record<string, string> {\n return profile.possessive?.keywords ?? {};\n}\n","/**\n * Language Registry\n *\n * Central registration point for language support in the semantic parser.\n * Languages self-register when their modules are imported, enabling\n * tree-shaking for minimal bundles.\n *\n * @example\n * ```typescript\n * // Import only the languages you need\n * import '@lokascript/semantic/languages/en';\n * import '@lokascript/semantic/languages/es';\n *\n * // Now parse works for registered languages\n * import { parse } from '@lokascript/semantic';\n * parse('toggle .active', 'en'); // Works\n * parse('alternar .activo', 'es'); // Works\n * parse('切り替え .active', 'ja'); // Error: Language not registered\n * ```\n */\n\nimport type { LanguageTokenizer, LanguagePattern, TokenStream } from './types';\n\n// Re-export profile types from generators for convenience\nexport type {\n LanguageProfile,\n WordOrder,\n MarkingStrategy,\n RoleMarker,\n VerbConfig,\n PossessiveConfig,\n KeywordTranslation,\n TokenizationConfig,\n} from './generators/language-profiles';\n\nimport type { LanguageProfile } from './generators/language-profiles';\n\n// =============================================================================\n// External Pattern Source Interface\n// =============================================================================\n\n/**\n * Interface for external pattern sources (e.g., @lokascript/patterns-reference database).\n * External sources can provide additional patterns at runtime.\n */\nexport interface ExternalPatternsSource {\n /** Unique identifier for the source */\n id: string;\n /** Human-readable name */\n name: string;\n /** Get patterns for a specific language */\n getPatternsForLanguage(language: string): Promise<ExternalPatternEntry[]>;\n /** Get patterns for a specific command */\n getPatternsForCommand(command: string, language?: string): Promise<ExternalPatternEntry[]>;\n /** Check if source has patterns for a language */\n hasPatterns(language: string): Promise<boolean>;\n /** Get all supported languages */\n getSupportedLanguages(): Promise<string[]>;\n}\n\n/**\n * Pattern entry from external source.\n */\nexport interface ExternalPatternEntry {\n id: string;\n code: string;\n command: string | null;\n language: string;\n confidence: number;\n verified: boolean;\n title?: string;\n category?: string;\n}\n\n// =============================================================================\n// Registry State\n// =============================================================================\n\nconst tokenizers = new Map<string, LanguageTokenizer>();\nconst profiles = new Map<string, LanguageProfile>();\nconst patternCache = new Map<string, LanguagePattern[]>();\n\n// External pattern sources (e.g., @lokascript/patterns-reference database)\nconst externalSources = new Map<string, ExternalPatternsSource>();\n\n// Pattern generator function - set by patterns module to avoid circular deps\nlet patternGenerator: ((profile: LanguageProfile) => LanguagePattern[]) | null = null;\n\n// =============================================================================\n// Profile Inheritance\n// =============================================================================\n\n/**\n * Deep merge two objects, with variant values overriding base values.\n * Arrays are replaced, not merged.\n */\nfunction deepMerge<T extends object>(base: T, variant: Partial<T>): T {\n const result = { ...base } as T;\n\n for (const key of Object.keys(variant) as (keyof T)[]) {\n const variantValue = variant[key];\n const baseValue = base[key];\n\n if (variantValue === undefined) {\n continue;\n }\n\n // If both are objects (but not arrays), merge recursively\n if (\n typeof variantValue === 'object' &&\n variantValue !== null &&\n !Array.isArray(variantValue) &&\n typeof baseValue === 'object' &&\n baseValue !== null &&\n !Array.isArray(baseValue)\n ) {\n result[key] = deepMerge(\n baseValue as object,\n variantValue as Partial<typeof baseValue>\n ) as T[keyof T];\n } else {\n // Replace value (including arrays)\n result[key] = variantValue as T[keyof T];\n }\n }\n\n return result;\n}\n\n/**\n * Merge a variant profile with its base profile.\n * The variant's fields override the base, with deep merging for nested objects.\n *\n * @example\n * ```typescript\n * const esMX = mergeProfiles(spanishProfile, {\n * code: 'es-MX',\n * name: 'Spanish (Mexico)',\n * keywords: {\n * toggle: { primary: 'alternar', alternatives: ['dale', 'cambiar'] },\n * },\n * });\n * ```\n */\nexport function mergeProfiles(\n base: LanguageProfile,\n variant: Partial<LanguageProfile>\n): LanguageProfile {\n return deepMerge(base, variant);\n}\n\n/**\n * Resolve a profile, applying inheritance if the profile has an `extends` field.\n * Returns the merged profile with base language properties inherited.\n */\nexport function resolveProfile(profile: LanguageProfile): LanguageProfile {\n if (!profile.extends) {\n return profile;\n }\n\n const baseProfile = profiles.get(profile.extends);\n if (!baseProfile) {\n console.warn(\n `[Registry] Profile '${profile.code}' extends '${profile.extends}' but base is not registered. ` +\n `Make sure to import the base language before the variant.`\n );\n return profile;\n }\n\n // Recursively resolve base profile (in case it also extends something)\n const resolvedBase = resolveProfile(baseProfile);\n\n // Merge, with variant overriding base\n return mergeProfiles(resolvedBase, profile);\n}\n\n// =============================================================================\n// Registration Functions\n// =============================================================================\n\n/**\n * Register a language with its tokenizer and profile.\n * Called automatically by language modules when imported.\n * If the profile has an `extends` field, it will inherit from the base profile.\n */\nexport function registerLanguage(\n code: string,\n tokenizer: LanguageTokenizer,\n profile: LanguageProfile\n): void {\n tokenizers.set(code, tokenizer);\n // Store the original profile (inheritance is resolved at query time)\n profiles.set(code, profile);\n // Clear pattern cache for this language if it was previously cached\n patternCache.delete(code);\n}\n\n/**\n * Register only a tokenizer (for backwards compatibility).\n */\nexport function registerTokenizer(tokenizer: LanguageTokenizer): void {\n tokenizers.set(tokenizer.language, tokenizer);\n}\n\n/**\n * Register only a profile (for backwards compatibility).\n */\nexport function registerProfile(profile: LanguageProfile): void {\n profiles.set(profile.code, profile);\n patternCache.delete(profile.code);\n}\n\n/**\n * Set the pattern generator function.\n * Called by patterns module to inject the generator without circular deps.\n */\nexport function setPatternGenerator(\n generator: (profile: LanguageProfile) => LanguagePattern[]\n): void {\n patternGenerator = generator;\n}\n\n// Direct pattern registration map (for tree-shaking)\nconst registeredPatterns = new Map<string, LanguagePattern[]>();\n\n/**\n * Register patterns directly for a language.\n * This enables tree-shaking by allowing each language module to register\n * only its own patterns.\n */\nexport function registerPatterns(code: string, patterns: LanguagePattern[]): void {\n registeredPatterns.set(code, patterns);\n // Clear cached patterns if any\n patternCache.delete(code);\n}\n\n/**\n * Check if patterns are directly registered for a language.\n */\nexport function hasRegisteredPatterns(code: string): boolean {\n return registeredPatterns.has(code);\n}\n\n/**\n * Get directly registered patterns for a language.\n */\nexport function getRegisteredPatterns(code: string): LanguagePattern[] | undefined {\n return registeredPatterns.get(code);\n}\n\n// =============================================================================\n// External Pattern Sources\n// =============================================================================\n\n/**\n * Register an external pattern source.\n * External sources (like @lokascript/patterns-reference) can provide\n * additional patterns at runtime.\n *\n * @example\n * ```typescript\n * import { registerPatternsSource } from '@lokascript/semantic';\n * import { createPatternsProvider } from '@lokascript/patterns-reference';\n *\n * const provider = createPatternsProvider();\n * registerPatternsSource(provider);\n * ```\n */\nexport function registerPatternsSource(source: ExternalPatternsSource): void {\n externalSources.set(source.id, source);\n}\n\n/**\n * Unregister an external pattern source.\n */\nexport function unregisterPatternsSource(sourceId: string): boolean {\n return externalSources.delete(sourceId);\n}\n\n/**\n * Get a registered external pattern source.\n */\nexport function getPatternsSource(sourceId: string): ExternalPatternsSource | undefined {\n return externalSources.get(sourceId);\n}\n\n/**\n * Get all registered external pattern sources.\n */\nexport function getAllPatternsSources(): ExternalPatternsSource[] {\n return Array.from(externalSources.values());\n}\n\n/**\n * Check if any external pattern sources are registered.\n */\nexport function hasExternalSources(): boolean {\n return externalSources.size > 0;\n}\n\n/**\n * Query patterns from all external sources for a language.\n * Returns patterns sorted by confidence.\n */\nexport async function queryExternalPatterns(language: string): Promise<ExternalPatternEntry[]> {\n if (externalSources.size === 0) {\n return [];\n }\n\n const allPatterns: ExternalPatternEntry[] = [];\n\n for (const source of externalSources.values()) {\n try {\n const patterns = await source.getPatternsForLanguage(language);\n allPatterns.push(...patterns);\n } catch (error) {\n console.warn(\n `[Registry] Failed to query patterns from ${source.name}:`,\n error instanceof Error ? error.message : String(error)\n );\n }\n }\n\n // Sort by confidence (highest first)\n return allPatterns.sort((a, b) => b.confidence - a.confidence);\n}\n\n/**\n * Query patterns from all external sources for a command.\n */\nexport async function queryExternalPatternsForCommand(\n command: string,\n language?: string\n): Promise<ExternalPatternEntry[]> {\n if (externalSources.size === 0) {\n return [];\n }\n\n const allPatterns: ExternalPatternEntry[] = [];\n\n for (const source of externalSources.values()) {\n try {\n const patterns = await source.getPatternsForCommand(command, language);\n allPatterns.push(...patterns);\n } catch (error) {\n console.warn(\n `[Registry] Failed to query patterns from ${source.name}:`,\n error instanceof Error ? error.message : String(error)\n );\n }\n }\n\n return allPatterns.sort((a, b) => b.confidence - a.confidence);\n}\n\n// =============================================================================\n// Language Code Utilities\n// =============================================================================\n\n/**\n * Extract the base language code from a BCP 47 tag.\n * Examples: 'es-MX' → 'es', 'pt-BR' → 'pt', 'en' → 'en'\n */\nexport function getBaseLanguageCode(code: string): string {\n return code.split('-')[0];\n}\n\n/**\n * Check if a code is a language variant (has region subtag).\n * Examples: 'es-MX' → true, 'pt' → false\n */\nexport function isLanguageVariant(code: string): boolean {\n return code.includes('-');\n}\n\n// =============================================================================\n// Query Functions\n// =============================================================================\n\n/**\n * Get a tokenizer for the specified language.\n * Supports fallback: if 'es-MX' is not registered, falls back to 'es'.\n * @throws Error if neither the variant nor base language is registered\n */\nexport function getTokenizer(code: string): LanguageTokenizer {\n // Try exact match first\n let tokenizer = tokenizers.get(code);\n\n // Fallback: es-MX → es\n if (!tokenizer && isLanguageVariant(code)) {\n const baseCode = getBaseLanguageCode(code);\n tokenizer = tokenizers.get(baseCode);\n }\n\n if (!tokenizer) {\n const registered = Array.from(tokenizers.keys()).join(', ');\n throw new Error(\n `Language '${code}' is not registered. ` +\n `Registered languages: ${registered || 'none'}. ` +\n `Import the language module first: import '@lokascript/semantic/languages/${code}';`\n );\n }\n return tokenizer;\n}\n\n/**\n * Get a profile for the specified language.\n * Supports fallback: if 'es-MX' is not registered, falls back to 'es'.\n * @throws Error if neither the variant nor base language is registered\n */\nexport function getProfile(code: string): LanguageProfile {\n // Try exact match first\n let profile = profiles.get(code);\n\n // Fallback: es-MX → es\n if (!profile && isLanguageVariant(code)) {\n const baseCode = getBaseLanguageCode(code);\n profile = profiles.get(baseCode);\n }\n\n if (!profile) {\n const registered = Array.from(profiles.keys()).join(', ');\n throw new Error(\n `Language profile '${code}' is not registered. ` +\n `Registered languages: ${registered || 'none'}. ` +\n `Import the language module first: import '@lokascript/semantic/languages/${code}';`\n );\n }\n\n // Resolve inheritance if profile extends another\n return resolveProfile(profile);\n}\n\n/**\n * Try to get a tokenizer, returning undefined if not registered.\n * Supports fallback: if 'es-MX' is not registered, falls back to 'es'.\n */\nexport function tryGetTokenizer(code: string): LanguageTokenizer | undefined {\n let tokenizer = tokenizers.get(code);\n if (!tokenizer && isLanguageVariant(code)) {\n tokenizer = tokenizers.get(getBaseLanguageCode(code));\n }\n return tokenizer;\n}\n\n/**\n * Try to get a profile, returning undefined if not registered.\n * Supports fallback: if 'es-MX' is not registered, falls back to 'es'.\n */\nexport function tryGetProfile(code: string): LanguageProfile | undefined {\n let profile = profiles.get(code);\n if (!profile && isLanguageVariant(code)) {\n profile = profiles.get(getBaseLanguageCode(code));\n }\n // Resolve inheritance if profile extends another\n return profile ? resolveProfile(profile) : undefined;\n}\n\n/**\n * Get all registered language codes.\n */\nexport function getRegisteredLanguages(): string[] {\n return Array.from(tokenizers.keys());\n}\n\n/**\n * Check if a language is registered (exact match or base language fallback).\n */\nexport function isLanguageRegistered(code: string): boolean {\n if (tokenizers.has(code) && profiles.has(code)) {\n return true;\n }\n // Check fallback for variants\n if (isLanguageVariant(code)) {\n const baseCode = getBaseLanguageCode(code);\n return tokenizers.has(baseCode) && profiles.has(baseCode);\n }\n return false;\n}\n\n/**\n * Check if a language is supported (exact match or base language fallback).\n * For backwards compatibility with tokenizers API.\n */\nexport function isLanguageSupported(code: string): boolean {\n if (tokenizers.has(code)) {\n return true;\n }\n // Check fallback for variants\n if (isLanguageVariant(code)) {\n return tokenizers.has(getBaseLanguageCode(code));\n }\n return false;\n}\n\n// =============================================================================\n// Tokenization\n// =============================================================================\n\n/**\n * Tokenize input in the specified language.\n * @throws Error if language is not registered\n */\nexport function tokenize(input: string, language: string): TokenStream {\n const tokenizer = getTokenizer(language);\n return tokenizer.tokenize(input);\n}\n\n// =============================================================================\n// Pattern Access (Lazy Generation)\n// =============================================================================\n\n/**\n * Get patterns for a specific language.\n * First checks for directly registered patterns (for tree-shaking),\n * then falls back to pattern generator.\n * Supports fallback: if 'es-MX' is not registered, falls back to 'es'.\n * @throws Error if language is not registered\n */\nexport function getPatternsForLanguage(code: string): LanguagePattern[] {\n // Check cache first (try exact, then base language)\n let cached = patternCache.get(code);\n if (!cached && isLanguageVariant(code)) {\n cached = patternCache.get(getBaseLanguageCode(code));\n }\n if (cached) {\n return cached;\n }\n\n // Check for directly registered patterns (tree-shakeable path)\n // Try exact match, then base language fallback\n let registered = registeredPatterns.get(code);\n if (!registered && isLanguageVariant(code)) {\n registered = registeredPatterns.get(getBaseLanguageCode(code));\n }\n if (registered) {\n patternCache.set(code, registered);\n return registered;\n }\n\n // Fall back to pattern generator\n if (!patternGenerator) {\n throw new Error(\n `No patterns registered for language '${code}'. ` +\n 'Either import the language module or set a pattern generator.'\n );\n }\n\n // Get profile (throws if not registered) - has built-in fallback\n const profile = getProfile(code);\n const patterns = patternGenerator(profile);\n patternCache.set(code, patterns);\n return patterns;\n}\n\n/**\n * Get patterns for a specific language and command.\n */\nexport function getPatternsForLanguageAndCommand(\n language: string,\n command: string\n): LanguagePattern[] {\n return getPatternsForLanguage(language)\n .filter(p => p.command === command)\n .sort((a, b) => b.priority - a.priority);\n}\n\n/**\n * Clear the pattern cache for a language (useful for testing).\n */\nexport function clearPatternCache(code?: string): void {\n if (code) {\n patternCache.delete(code);\n } else {\n patternCache.clear();\n }\n}\n\n// =============================================================================\n// Backwards Compatibility\n// =============================================================================\n\n/**\n * Get all profiles as a record (for backwards compatibility).\n * Note: Only returns registered profiles.\n */\nexport function getAllProfiles(): Record<string, LanguageProfile> {\n const result: Record<string, LanguageProfile> = {};\n for (const [code, profile] of profiles) {\n result[code] = profile;\n }\n return result;\n}\n\n/**\n * Get all tokenizers as a record (for backwards compatibility).\n * Note: Only returns registered tokenizers.\n */\nexport function getAllTokenizers(): Record<string, LanguageTokenizer> {\n const result: Record<string, LanguageTokenizer> = {};\n for (const [code, tokenizer] of tokenizers) {\n result[code] = tokenizer;\n }\n return result;\n}\n","/**\n * Pattern Matcher\n *\n * Matches tokenized input against language patterns to extract semantic roles.\n * This is the core algorithm for multilingual parsing.\n */\n\nimport type {\n LanguagePattern,\n PatternToken,\n PatternMatchResult,\n SemanticRole,\n SemanticValue,\n TokenStream,\n LanguageToken,\n} from '../types';\nimport { createSelector, createLiteral, createReference, createPropertyPath } from '../types';\nimport { isTypeCompatible } from './utils/type-validation';\nimport { getPossessiveReference } from './utils/possessive-keywords';\nimport type { LanguageProfile } from '../generators/profiles/types';\nimport { tryGetProfile } from '../registry';\n\n// =============================================================================\n// Pattern Matcher\n// =============================================================================\n\nexport class PatternMatcher {\n /** Current language profile for the pattern being matched */\n private currentProfile: LanguageProfile | undefined;\n\n /**\n * Try to match a single pattern against the token stream.\n * Returns the match result or null if no match.\n */\n matchPattern(tokens: TokenStream, pattern: LanguagePattern): PatternMatchResult | null {\n const mark = tokens.mark();\n const captured = new Map<SemanticRole, SemanticValue>();\n\n // Get language profile for possessive keyword lookup\n this.currentProfile = tryGetProfile(pattern.language);\n\n // Reset match counters for this pattern\n this.stemMatchCount = 0;\n this.totalKeywordMatches = 0;\n\n const success = this.matchTokenSequence(tokens, pattern.template.tokens, captured);\n\n if (!success) {\n tokens.reset(mark);\n return null;\n }\n\n // Calculate confidence BEFORE applying defaults\n // This ensures defaulted roles don't artificially inflate confidence\n const confidence = this.calculateConfidence(pattern, captured);\n\n // Apply extraction rules to fill in any missing roles with defaults\n this.applyExtractionRules(pattern, captured);\n\n return {\n pattern,\n captured,\n consumedTokens: tokens.position() - mark.position,\n confidence,\n };\n }\n\n /**\n * Try to match multiple patterns, return the best match.\n */\n matchBest(tokens: TokenStream, patterns: LanguagePattern[]): PatternMatchResult | null {\n const matches: PatternMatchResult[] = [];\n\n for (const pattern of patterns) {\n const mark = tokens.mark();\n const result = this.matchPattern(tokens, pattern);\n\n if (result) {\n matches.push(result);\n }\n\n tokens.reset(mark);\n }\n\n if (matches.length === 0) {\n return null;\n }\n\n // Sort by confidence and priority\n matches.sort((a, b) => {\n // First by priority\n const priorityDiff = b.pattern.priority - a.pattern.priority;\n if (priorityDiff !== 0) return priorityDiff;\n\n // Then by confidence\n return b.confidence - a.confidence;\n });\n\n // Re-consume tokens for the best match\n const best = matches[0];\n this.matchPattern(tokens, best.pattern);\n\n return best;\n }\n\n /**\n * Match a sequence of pattern tokens against the token stream.\n */\n private matchTokenSequence(\n tokens: TokenStream,\n patternTokens: PatternToken[],\n captured: Map<SemanticRole, SemanticValue>\n ): boolean {\n // Skip leading conjunctions for Arabic (proclitics: و, ف, ول, وب, etc.)\n // BUT NOT if the pattern explicitly expects a conjunction (proclitic patterns)\n const firstPatternToken = patternTokens[0];\n const patternExpectsConjunction =\n firstPatternToken?.type === 'literal' &&\n (firstPatternToken.value === 'and' ||\n firstPatternToken.value === 'then' ||\n firstPatternToken.alternatives?.includes('and') ||\n firstPatternToken.alternatives?.includes('then'));\n\n if (this.currentProfile?.code === 'ar' && !patternExpectsConjunction) {\n while (tokens.peek()?.kind === 'conjunction') {\n tokens.advance();\n }\n }\n\n for (const patternToken of patternTokens) {\n const matched = this.matchPatternToken(tokens, patternToken, captured);\n\n if (!matched) {\n // If token is optional, continue\n if (this.isOptional(patternToken)) {\n continue;\n }\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Match a single pattern token against the current position in the stream.\n */\n private matchPatternToken(\n tokens: TokenStream,\n patternToken: PatternToken,\n captured: Map<SemanticRole, SemanticValue>\n ): boolean {\n switch (patternToken.type) {\n case 'literal':\n return this.matchLiteralToken(tokens, patternToken);\n\n case 'role':\n return this.matchRoleToken(tokens, patternToken, captured);\n\n case 'group':\n return this.matchGroupToken(tokens, patternToken, captured);\n\n default:\n return false;\n }\n }\n\n /**\n * Match a literal pattern token (keyword or particle).\n */\n private matchLiteralToken(\n tokens: TokenStream,\n patternToken: PatternToken & { type: 'literal' }\n ): boolean {\n const token = tokens.peek();\n if (!token) return false;\n\n // Check main value\n const matchType = this.getMatchType(token, patternToken.value);\n if (matchType !== 'none') {\n this.totalKeywordMatches++;\n if (matchType === 'stem') {\n this.stemMatchCount++;\n }\n tokens.advance();\n return true;\n }\n\n // Check alternatives\n if (patternToken.alternatives) {\n for (const alt of patternToken.alternatives) {\n const altMatchType = this.getMatchType(token, alt);\n if (altMatchType !== 'none') {\n this.totalKeywordMatches++;\n if (altMatchType === 'stem') {\n this.stemMatchCount++;\n }\n tokens.advance();\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Match a role pattern token (captures a semantic value).\n * Handles multi-token expressions like:\n * - 'my value' (possessive keyword + property)\n * - '#dialog.showModal()' (method call)\n * - \"#element's *opacity\" (possessive selector + property)\n */\n private matchRoleToken(\n tokens: TokenStream,\n patternToken: PatternToken & { type: 'role' },\n captured: Map<SemanticRole, SemanticValue>\n ): boolean {\n // Skip noise words like \"the\" before selectors (English idiom support)\n this.skipNoiseWords(tokens);\n\n const token = tokens.peek();\n if (!token) {\n return patternToken.optional || false;\n }\n\n // Check for possessive expression (e.g., 'my value', 'its innerHTML')\n const possessiveValue = this.tryMatchPossessiveExpression(tokens);\n if (possessiveValue) {\n // Validate expected types if specified\n if (patternToken.expectedTypes && patternToken.expectedTypes.length > 0) {\n if (\n !patternToken.expectedTypes.includes(possessiveValue.type) &&\n !patternToken.expectedTypes.includes('expression')\n ) {\n return patternToken.optional || false;\n }\n }\n captured.set(patternToken.role, possessiveValue);\n return true;\n }\n\n // Check for method call expression (e.g., '#dialog.showModal()')\n const methodCallValue = this.tryMatchMethodCallExpression(tokens);\n if (methodCallValue) {\n if (patternToken.expectedTypes && patternToken.expectedTypes.length > 0) {\n if (\n !patternToken.expectedTypes.includes(methodCallValue.type) &&\n !patternToken.expectedTypes.includes('expression')\n ) {\n return patternToken.optional || false;\n }\n }\n captured.set(patternToken.role, methodCallValue);\n return true;\n }\n\n // Check for possessive selector expression (e.g., \"#element's *opacity\")\n const possessiveSelectorValue = this.tryMatchPossessiveSelectorExpression(tokens);\n if (possessiveSelectorValue) {\n if (patternToken.expectedTypes && patternToken.expectedTypes.length > 0) {\n // property-path is compatible with selector, reference, and expression\n if (!isTypeCompatible(possessiveSelectorValue.type, patternToken.expectedTypes)) {\n return patternToken.optional || false;\n }\n }\n captured.set(patternToken.role, possessiveSelectorValue);\n return true;\n }\n\n // Check for property access expression (e.g., 'userData.name', 'it.data')\n const propertyAccessValue = this.tryMatchPropertyAccessExpression(tokens);\n if (propertyAccessValue) {\n if (patternToken.expectedTypes && patternToken.expectedTypes.length > 0) {\n if (\n !patternToken.expectedTypes.includes(propertyAccessValue.type) &&\n !patternToken.expectedTypes.includes('expression')\n ) {\n return patternToken.optional || false;\n }\n }\n captured.set(patternToken.role, propertyAccessValue);\n return true;\n }\n\n // Check for selector + property expression (e.g., '#output.innerText')\n // This handles cases where the tokenizer produces two selector tokens\n const selectorPropertyValue = this.tryMatchSelectorPropertyExpression(tokens);\n if (selectorPropertyValue) {\n if (patternToken.expectedTypes && patternToken.expectedTypes.length > 0) {\n if (!isTypeCompatible(selectorPropertyValue.type, patternToken.expectedTypes)) {\n return patternToken.optional || false;\n }\n }\n captured.set(patternToken.role, selectorPropertyValue);\n return true;\n }\n\n // Try to extract a semantic value from the token\n const value = this.tokenToSemanticValue(token);\n if (!value) {\n return patternToken.optional || false;\n }\n\n // Validate expected types if specified\n if (patternToken.expectedTypes && patternToken.expectedTypes.length > 0) {\n if (!patternToken.expectedTypes.includes(value.type)) {\n return patternToken.optional || false;\n }\n }\n\n captured.set(patternToken.role, value);\n tokens.advance();\n return true;\n }\n\n /**\n * Try to match a possessive expression like 'my value' or 'its innerHTML'.\n * Returns the PropertyPathValue if matched, or null if not.\n */\n private tryMatchPossessiveExpression(tokens: TokenStream): SemanticValue | null {\n const token = tokens.peek();\n if (!token) return null;\n\n // Use profile-based possessive keyword lookup\n if (!this.currentProfile) return null;\n\n const tokenLower = (token.normalized || token.value).toLowerCase();\n const baseRef = getPossessiveReference(this.currentProfile, tokenLower);\n\n if (!baseRef) return null;\n\n // We have a possessive keyword, look ahead for property name\n const mark = tokens.mark();\n tokens.advance();\n\n const propertyToken = tokens.peek();\n if (!propertyToken) {\n // Just the possessive keyword, no property - revert\n tokens.reset(mark);\n return null;\n }\n\n // Property should be an identifier, keyword (not structural), or selector (for style props)\n // Examples: \"my value\", \"my innerHTML\", \"my *background\", \"my *opacity\"\n if (\n propertyToken.kind === 'identifier' ||\n (propertyToken.kind === 'keyword' && !this.isStructuralKeyword(propertyToken.value)) ||\n (propertyToken.kind === 'selector' && propertyToken.value.startsWith('*'))\n ) {\n tokens.advance();\n\n // Create property-path: my value -> { object: me, property: 'value' }\n return createPropertyPath(createReference(baseRef as any), propertyToken.value);\n }\n\n // Not a valid property, revert\n tokens.reset(mark);\n return null;\n }\n\n /**\n * Check if a keyword is a structural keyword (preposition, control flow, etc.)\n * that shouldn't be consumed as a property name.\n */\n private isStructuralKeyword(value: string): boolean {\n const structural = new Set([\n // Prepositions\n 'into',\n 'in',\n 'to',\n 'from',\n 'at',\n 'by',\n 'with',\n 'without',\n 'before',\n 'after',\n 'of',\n 'as',\n 'on',\n // Control flow\n 'then',\n 'end',\n 'else',\n 'if',\n 'repeat',\n 'while',\n 'for',\n // Commands (shouldn't be property names)\n 'toggle',\n 'add',\n 'remove',\n 'put',\n 'set',\n 'show',\n 'hide',\n 'increment',\n 'decrement',\n 'send',\n 'trigger',\n 'call',\n ]);\n return structural.has(value.toLowerCase());\n }\n\n /**\n * Try to match a method call expression like '#dialog.showModal()'.\n * Pattern: selector + '.' + identifier + '(' + [args] + ')'\n * Returns an expression value if matched, or null if not.\n */\n private tryMatchMethodCallExpression(tokens: TokenStream): SemanticValue | null {\n const token = tokens.peek();\n if (!token || token.kind !== 'selector') return null;\n\n // Look ahead for: . identifier (\n const mark = tokens.mark();\n tokens.advance(); // consume selector\n\n const dotToken = tokens.peek();\n if (!dotToken || dotToken.kind !== 'operator' || dotToken.value !== '.') {\n tokens.reset(mark);\n return null;\n }\n tokens.advance(); // consume .\n\n const methodToken = tokens.peek();\n if (!methodToken || methodToken.kind !== 'identifier') {\n tokens.reset(mark);\n return null;\n }\n tokens.advance(); // consume method name\n\n const openParen = tokens.peek();\n if (!openParen || openParen.kind !== 'punctuation' || openParen.value !== '(') {\n tokens.reset(mark);\n return null;\n }\n tokens.advance(); // consume (\n\n // Consume arguments until we find ) (with depth limit for security)\n const args: string[] = [];\n while (!tokens.isAtEnd() && args.length < PatternMatcher.MAX_METHOD_ARGS) {\n const argToken = tokens.peek();\n if (!argToken) break;\n if (argToken.kind === 'punctuation' && argToken.value === ')') {\n tokens.advance(); // consume )\n break;\n }\n // Skip commas\n if (argToken.kind === 'punctuation' && argToken.value === ',') {\n tokens.advance();\n continue;\n }\n // Collect arg value\n args.push(argToken.value);\n tokens.advance();\n }\n\n // Create expression value: #dialog.showModal()\n const methodCall = `${token.value}.${methodToken.value}(${args.join(', ')})`;\n return {\n type: 'expression',\n raw: methodCall,\n } as SemanticValue;\n }\n\n /**\n * Try to match a property access expression like 'userData.name' or 'it.data'.\n * Pattern: (identifier | keyword) + '.' + identifier [+ '.' + identifier ...]\n * Returns an expression value if matched, or null if not.\n */\n private tryMatchPropertyAccessExpression(tokens: TokenStream): SemanticValue | null {\n const token = tokens.peek();\n if (!token) return null;\n\n // Must start with an identifier or keyword reference\n if (token.kind !== 'identifier' && token.kind !== 'keyword') return null;\n\n // Look ahead for: . identifier\n const mark = tokens.mark();\n tokens.advance(); // consume first token\n\n const dotToken = tokens.peek();\n if (!dotToken || dotToken.kind !== 'operator' || dotToken.value !== '.') {\n tokens.reset(mark);\n return null;\n }\n tokens.advance(); // consume .\n\n const propertyToken = tokens.peek();\n if (!propertyToken || propertyToken.kind !== 'identifier') {\n tokens.reset(mark);\n return null;\n }\n tokens.advance(); // consume property name\n\n // Build the property chain\n let chain = `${token.value}.${propertyToken.value}`;\n let depth = 1; // Already have one property access\n\n // Continue for nested property access (e.g., userData.address.city)\n // With depth limit for security\n while (!tokens.isAtEnd() && depth < PatternMatcher.MAX_PROPERTY_DEPTH) {\n const nextDot = tokens.peek();\n if (!nextDot || nextDot.kind !== 'operator' || nextDot.value !== '.') {\n break;\n }\n tokens.advance(); // consume .\n\n const nextProp = tokens.peek();\n if (!nextProp || nextProp.kind !== 'identifier') {\n // Dot without property - put the dot back and stop\n // Can't easily put a single token back, so we'll include it\n break;\n }\n tokens.advance(); // consume property\n chain += `.${nextProp.value}`;\n depth++;\n }\n\n // Check for method call: chain + '(' + args + ')'\n // e.g., me.insertBefore(draggedItem, dropTarget)\n const openParen = tokens.peek();\n if (openParen && openParen.kind === 'punctuation' && openParen.value === '(') {\n tokens.advance(); // consume (\n\n // Collect arguments (comma-separated values)\n const args: string[] = [];\n let argDepth = 0; // Track nested parentheses\n while (!tokens.isAtEnd() && args.length < PatternMatcher.MAX_METHOD_ARGS) {\n const argToken = tokens.peek();\n if (!argToken) break;\n\n // Handle close paren - respecting nesting\n if (argToken.kind === 'punctuation' && argToken.value === ')') {\n if (argDepth === 0) {\n tokens.advance(); // consume )\n break;\n }\n argDepth--;\n }\n // Track nested open parens\n if (argToken.kind === 'punctuation' && argToken.value === '(') {\n argDepth++;\n }\n // Skip commas between arguments\n if (argToken.kind === 'punctuation' && argToken.value === ',') {\n tokens.advance();\n continue;\n }\n // Collect arg value\n args.push(argToken.value);\n tokens.advance();\n }\n\n // Create expression value with method call: me.insertBefore(a, b)\n const methodCall = `${chain}(${args.join(', ')})`;\n return {\n type: 'expression',\n raw: methodCall,\n } as SemanticValue;\n }\n\n // Create expression value: userData.name\n return {\n type: 'expression',\n raw: chain,\n } as SemanticValue;\n }\n\n /**\n * Try to match a possessive selector expression like \"#element's *opacity\".\n * Pattern: selector + \"'s\" + (selector | identifier)\n * Returns a property-path value if matched, or null if not.\n */\n private tryMatchPossessiveSelectorExpression(tokens: TokenStream): SemanticValue | null {\n const token = tokens.peek();\n if (!token || token.kind !== 'selector') return null;\n\n // Look ahead for: 's (possessive marker)\n const mark = tokens.mark();\n tokens.advance(); // consume selector\n\n const possessiveToken = tokens.peek();\n if (\n !possessiveToken ||\n possessiveToken.kind !== 'punctuation' ||\n possessiveToken.value !== \"'s\"\n ) {\n tokens.reset(mark);\n return null;\n }\n tokens.advance(); // consume 's\n\n const propertyToken = tokens.peek();\n if (!propertyToken) {\n tokens.reset(mark);\n return null;\n }\n\n // Property can be a selector (*opacity) or identifier\n if (propertyToken.kind !== 'selector' && propertyToken.kind !== 'identifier') {\n tokens.reset(mark);\n return null;\n }\n tokens.advance(); // consume property\n\n // Create property-path: #element's *opacity\n return createPropertyPath(createSelector(token.value), propertyToken.value);\n }\n\n /**\n * Try to match a selector + property expression like \"#output.innerText\".\n * This handles cases where the tokenizer produces two selector tokens:\n * - #output (id selector)\n * - .innerText (looks like class selector, but is actually property)\n *\n * Pattern: id-selector + class-selector-that-is-actually-property\n * Returns a property-path value if matched, or null if not.\n */\n private tryMatchSelectorPropertyExpression(tokens: TokenStream): SemanticValue | null {\n const token = tokens.peek();\n if (!token || token.kind !== 'selector') return null;\n\n // Must be an ID selector (starts with #)\n if (!token.value.startsWith('#')) return null;\n\n // Look ahead for: selector that looks like a property (.something)\n const mark = tokens.mark();\n tokens.advance(); // consume first selector\n\n const propertyToken = tokens.peek();\n if (!propertyToken || propertyToken.kind !== 'selector') {\n tokens.reset(mark);\n return null;\n }\n\n // Second token must look like a class selector (starts with .)\n // but we interpret it as a property access\n if (!propertyToken.value.startsWith('.')) {\n tokens.reset(mark);\n return null;\n }\n\n // Verify the next token is not a selector (to avoid consuming too many)\n // This helps distinguish \"#output.innerText\" from \"#box .child\"\n const peek2 = tokens.peek(1);\n if (peek2 && peek2.kind === 'selector') {\n // Could be a compound selector chain - only take first two\n }\n\n tokens.advance(); // consume property selector\n\n // Create property-path: #output.innerText\n // Extract property name without the leading dot\n const propertyName = propertyToken.value.slice(1);\n\n return createPropertyPath(createSelector(token.value), propertyName);\n }\n\n /**\n * Match a group pattern token (optional sequence).\n */\n private matchGroupToken(\n tokens: TokenStream,\n patternToken: PatternToken & { type: 'group' },\n captured: Map<SemanticRole, SemanticValue>\n ): boolean {\n const mark = tokens.mark();\n\n // Track which roles were captured before this group\n const capturedBefore = new Set(captured.keys());\n\n const success = this.matchTokenSequence(tokens, patternToken.tokens, captured);\n\n if (!success) {\n tokens.reset(mark);\n // Clear any roles that were partially captured during the failed group match\n for (const role of captured.keys()) {\n if (!capturedBefore.has(role)) {\n captured.delete(role);\n }\n }\n return patternToken.optional || false;\n }\n\n return true;\n }\n\n /**\n * Get the type of match for a token against a value.\n * Used for confidence calculation.\n */\n private getMatchType(\n token: LanguageToken,\n value: string\n ): 'exact' | 'normalized' | 'stem' | 'case-insensitive' | 'none' {\n // Exact match (highest confidence)\n if (token.value === value) return 'exact';\n\n // Explicit keyword map normalized match (high confidence)\n if (token.normalized === value) return 'normalized';\n\n // Morphologically normalized stem match (medium-high confidence)\n // Only accept if stem confidence is reasonable\n if (token.stem === value && token.stemConfidence !== undefined && token.stemConfidence >= 0.7) {\n return 'stem';\n }\n\n // Case-insensitive match for keywords (medium confidence)\n if (token.kind === 'keyword' && token.value.toLowerCase() === value.toLowerCase()) {\n return 'case-insensitive';\n }\n\n return 'none';\n }\n\n /**\n * Track stem matches for confidence calculation.\n * This is set during matching and read during confidence calculation.\n */\n private stemMatchCount: number = 0;\n private totalKeywordMatches: number = 0;\n\n // ==========================================================================\n // Depth Limits for Expression Parsing (security hardening)\n // ==========================================================================\n\n /** Maximum depth for nested property access (e.g., a.b.c.d...) */\n private static readonly MAX_PROPERTY_DEPTH = 10;\n\n /** Maximum number of arguments in method calls */\n private static readonly MAX_METHOD_ARGS = 20;\n\n /**\n * Convert a language token to a semantic value.\n */\n private tokenToSemanticValue(token: LanguageToken): SemanticValue | null {\n switch (token.kind) {\n case 'selector':\n return createSelector(token.value);\n\n case 'literal':\n return this.parseLiteralValue(token.value);\n\n case 'keyword':\n // Keywords might be references or values\n const lower = (token.normalized || token.value).toLowerCase();\n if (['me', 'you', 'it', 'result', 'event', 'target', 'body'].includes(lower)) {\n return createReference(lower as any);\n }\n return createLiteral(token.normalized || token.value);\n\n case 'identifier':\n // Check if it's a variable reference (:varname)\n if (token.value.startsWith(':')) {\n return createReference(token.value as any);\n }\n // Check if it's a built-in reference\n const identLower = token.value.toLowerCase();\n if (['me', 'you', 'it', 'result', 'event', 'target', 'body'].includes(identLower)) {\n return createReference(identLower as any);\n }\n // Regular identifiers are variable references - use 'expression' type\n // which gets converted to 'identifier' AST nodes by semantic-integration.ts\n return { type: 'expression', raw: token.value } as const;\n\n case 'url':\n // URLs are treated as string literals (paths/URLs for navigation/fetch)\n return createLiteral(token.value, 'string');\n\n default:\n return null;\n }\n }\n\n /**\n * Parse a literal value (string, number, boolean).\n */\n private parseLiteralValue(value: string): SemanticValue {\n // String literal\n if (\n value.startsWith('\"') ||\n value.startsWith(\"'\") ||\n value.startsWith('`') ||\n value.startsWith('「')\n ) {\n const inner = value.slice(1, -1);\n return createLiteral(inner, 'string');\n }\n\n // Boolean\n if (value === 'true') return createLiteral(true, 'boolean');\n if (value === 'false') return createLiteral(false, 'boolean');\n\n // Duration (number with suffix)\n const durationMatch = value.match(/^(\\d+(?:\\.\\d+)?)(ms|s|m|h)?$/);\n if (durationMatch) {\n const num = parseFloat(durationMatch[1]);\n const unit = durationMatch[2];\n if (unit) {\n return createLiteral(value, 'duration');\n }\n return createLiteral(num, 'number');\n }\n\n // Plain number\n const num = parseFloat(value);\n if (!isNaN(num)) {\n return createLiteral(num, 'number');\n }\n\n // Default to string\n return createLiteral(value, 'string');\n }\n\n /**\n * Apply extraction rules to fill in default values for missing roles.\n */\n private applyExtractionRules(\n pattern: LanguagePattern,\n captured: Map<SemanticRole, SemanticValue>\n ): void {\n for (const [role, rule] of Object.entries(pattern.extraction)) {\n if (!captured.has(role as SemanticRole) && rule.default) {\n captured.set(role as SemanticRole, rule.default);\n }\n }\n }\n\n /**\n * Check if a pattern token is optional.\n */\n private isOptional(patternToken: PatternToken): boolean {\n return (patternToken as any).optional === true;\n }\n\n /**\n * Calculate confidence score for a match (0-1).\n *\n * Confidence is reduced for:\n * - Stem matches (morphological normalization has inherent uncertainty)\n * - Missing optional roles (but less penalty if role has a default value)\n *\n * Confidence is increased for:\n * - VSO languages (Arabic) when pattern starts with a verb\n */\n private calculateConfidence(\n pattern: LanguagePattern,\n captured: Map<SemanticRole, SemanticValue>\n ): number {\n let score = 0;\n let maxScore = 0;\n\n // Helper to check if a role has a default value in extraction rules\n const hasDefault = (role: SemanticRole): boolean => {\n return pattern.extraction?.[role]?.default !== undefined;\n };\n\n // Score based on captured roles\n for (const token of pattern.template.tokens) {\n if (token.type === 'role') {\n maxScore += 1;\n if (captured.has(token.role)) {\n score += 1;\n }\n } else if (token.type === 'group') {\n // Group tokens are optional - weight depends on whether they have defaults\n for (const subToken of token.tokens) {\n if (subToken.type === 'role') {\n const roleHasDefault = hasDefault(subToken.role);\n const weight = 0.8; // Optional roles: 80% weight\n maxScore += weight;\n\n if (captured.has(subToken.role)) {\n // Role was explicitly provided by user\n score += weight;\n } else if (roleHasDefault) {\n // Role has a default - give 60% partial credit since command is semantically complete\n // This prevents penalizing common patterns like \"toggle .active\" (default: me)\n score += weight * 0.6;\n }\n // If no default and not captured, score += 0 (true penalty for missing info)\n }\n }\n }\n }\n\n let baseConfidence = maxScore > 0 ? score / maxScore : 1;\n\n // Apply penalty for stem matches\n // Each stem match reduces confidence slightly (e.g., 5% per stem match)\n // This ensures exact matches are preferred over morphological matches\n if (this.stemMatchCount > 0 && this.totalKeywordMatches > 0) {\n const stemPenalty = (this.stemMatchCount / this.totalKeywordMatches) * 0.15;\n baseConfidence = Math.max(0.5, baseConfidence - stemPenalty);\n }\n\n // Apply VSO confidence boost for Arabic verb-first patterns\n const vsoBoost = this.calculateVSOConfidenceBoost(pattern);\n baseConfidence = Math.min(1.0, baseConfidence + vsoBoost);\n\n // Apply preposition disambiguation adjustment for Arabic\n const prepositionAdjustment = this.arabicPrepositionDisambiguation(pattern, captured);\n baseConfidence = Math.max(0.0, Math.min(1.0, baseConfidence + prepositionAdjustment));\n\n return baseConfidence;\n }\n\n /**\n * Calculate confidence boost for VSO (Verb-Subject-Object) language patterns.\n * Arabic naturally uses VSO word order, so patterns that start with a verb\n * should receive a confidence boost.\n *\n * Returns +0.15 confidence boost if:\n * - Language is Arabic ('ar')\n * - Pattern's first token is a verb keyword\n *\n * @param pattern The language pattern being matched\n * @returns Confidence boost (0 or 0.15)\n */\n private calculateVSOConfidenceBoost(pattern: LanguagePattern): number {\n // Only apply to Arabic\n if (pattern.language !== 'ar') {\n return 0;\n }\n\n // Check if first token in pattern is a literal (keyword)\n const firstToken = pattern.template.tokens[0];\n if (!firstToken || firstToken.type !== 'literal') {\n return 0;\n }\n\n // List of Arabic verb keywords (command verbs)\n const ARABIC_VERBS = new Set([\n 'بدل',\n 'غير',\n 'أضف',\n 'أزل',\n 'ضع',\n 'اجعل',\n 'عين',\n 'زد',\n 'انقص',\n 'سجل',\n 'أظهر',\n 'أخف',\n 'شغل',\n 'أرسل',\n 'ركز',\n 'شوش',\n 'توقف',\n 'انسخ',\n 'احذف',\n 'اصنع',\n 'انتظر',\n 'انتقال',\n 'أو',\n ]);\n\n // Check if first token value is a verb\n if (ARABIC_VERBS.has(firstToken.value)) {\n return 0.15;\n }\n\n // Check alternatives\n if (firstToken.alternatives) {\n for (const alt of firstToken.alternatives) {\n if (ARABIC_VERBS.has(alt)) {\n return 0.15;\n }\n }\n }\n\n return 0;\n }\n\n /**\n * Arabic preposition disambiguation for confidence adjustment.\n *\n * Different Arabic prepositions are more or less natural for different semantic roles:\n * - على (on/upon) is preferred for patient/target roles (element selectors)\n * - إلى (to) is preferred for destination roles\n * - من (from) is preferred for source roles\n * - في (in) is preferred for location roles\n *\n * This method analyzes the prepositions used with captured semantic roles and\n * adjusts confidence based on idiomaticity:\n * - +0.10 for highly idiomatic preposition choices\n * - -0.10 for less natural preposition choices\n *\n * @param pattern The language pattern being matched\n * @param captured The captured semantic values\n * @returns Confidence adjustment (-0.10 to +0.10)\n */\n private arabicPrepositionDisambiguation(\n pattern: LanguagePattern,\n captured: Map<SemanticRole, SemanticValue>\n ): number {\n // Only apply to Arabic\n if (pattern.language !== 'ar') {\n return 0;\n }\n\n let adjustment = 0;\n\n // Preferred prepositions for each semantic role\n // Only including roles that commonly use prepositions in Arabic\n const PREFERRED_PREPOSITIONS: Partial<Record<SemanticRole, string[]>> = {\n patient: ['على'], // element selectors prefer على (on/upon)\n destination: ['إلى', 'الى'], // destination prefers إلى (to)\n source: ['من'], // source prefers من (from)\n agent: ['من'], // agent/by prefers من (from/by)\n manner: ['ب'], // manner prefers ب (with/by)\n style: ['ب'], // style prefers ب (with)\n goal: ['إلى', 'الى'], // target state prefers إلى (to)\n method: ['ب'], // method prefers ب (with/by)\n };\n\n // Check each captured role for preposition metadata\n for (const [role, value] of captured.entries()) {\n // Skip if no preferred prepositions defined for this role\n const preferred = PREFERRED_PREPOSITIONS[role];\n if (!preferred || preferred.length === 0) {\n continue;\n }\n\n // Check if the value has preposition metadata (from Arabic tokenizer)\n // This metadata is attached when a preposition particle token is consumed\n const metadata = (value as any).metadata;\n if (metadata && typeof metadata.prepositionValue === 'string') {\n const usedPreposition = metadata.prepositionValue;\n\n // Check if the used preposition is in the preferred list\n if (preferred.includes(usedPreposition)) {\n // Idiomatic choice - boost confidence\n adjustment += 0.1;\n } else {\n // Less natural choice - reduce confidence\n adjustment -= 0.1;\n }\n }\n }\n\n // Cap total adjustment at ±0.10 (even if multiple roles analyzed)\n return Math.max(-0.1, Math.min(0.1, adjustment));\n }\n\n // ===========================================================================\n // English Idiom Support - Noise Word Handling\n // ===========================================================================\n\n /**\n * Noise words that can be skipped in English for more natural syntax.\n * - \"the\" before selectors: \"toggle the .active\" → \"toggle .active\"\n * - \"class\" after class selectors: \"add the .visible class\" → \"add .visible\"\n */\n private static readonly ENGLISH_NOISE_WORDS = new Set(['the', 'a', 'an']);\n\n /**\n * Skip noise words like \"the\" before selectors.\n * This enables more natural English syntax like \"toggle the .active\".\n */\n private skipNoiseWords(tokens: TokenStream): void {\n const token = tokens.peek();\n if (!token) return;\n\n const tokenLower = token.value.toLowerCase();\n\n // Check if current token is a noise word (like \"the\")\n if (PatternMatcher.ENGLISH_NOISE_WORDS.has(tokenLower)) {\n // Look ahead to see if the next token is a selector\n const mark = tokens.mark();\n tokens.advance();\n const nextToken = tokens.peek();\n\n if (nextToken && nextToken.kind === 'selector') {\n // Keep the position after \"the\" - effectively skipping it\n return;\n }\n\n // Not followed by a selector, revert\n tokens.reset(mark);\n }\n\n // Also handle \"class\" after class selectors: \".visible class\" → \".visible\"\n // This is handled when the selector has already been consumed,\n // so we check if current token is \"class\" and skip it\n if (tokenLower === 'class') {\n // Skip \"class\" as it's just noise after a class selector\n tokens.advance();\n }\n }\n\n /**\n * Extract event modifiers from the token stream.\n * Event modifiers are .once, .debounce(N), .throttle(N), .queue(strategy)\n * that can appear after event names.\n *\n * Returns EventModifiers object or undefined if no modifiers found.\n */\n extractEventModifiers(tokens: TokenStream): import('../types').EventModifiers | undefined {\n const modifiers: {\n once?: boolean;\n debounce?: number;\n throttle?: number;\n queue?: 'first' | 'last' | 'all' | 'none';\n from?: SemanticValue;\n } = {};\n\n let foundModifier = false;\n\n // Consume all consecutive event modifier tokens\n while (!tokens.isAtEnd()) {\n const token = tokens.peek();\n if (!token || token.kind !== 'event-modifier') {\n break;\n }\n\n const metadata = token.metadata as\n | { modifierName: string; value?: number | string }\n | undefined;\n if (!metadata) {\n break;\n }\n\n foundModifier = true;\n\n switch (metadata.modifierName) {\n case 'once':\n modifiers.once = true;\n break;\n case 'debounce':\n if (typeof metadata.value === 'number') {\n modifiers.debounce = metadata.value;\n }\n break;\n case 'throttle':\n if (typeof metadata.value === 'number') {\n modifiers.throttle = metadata.value;\n }\n break;\n case 'queue':\n if (\n metadata.value === 'first' ||\n metadata.value === 'last' ||\n metadata.value === 'all' ||\n metadata.value === 'none'\n ) {\n modifiers.queue = metadata.value;\n }\n break;\n }\n\n tokens.advance();\n }\n\n return foundModifier ? modifiers : undefined;\n }\n}\n\n// =============================================================================\n// Convenience Functions\n// =============================================================================\n\n/**\n * Singleton pattern matcher instance.\n */\nexport const patternMatcher = new PatternMatcher();\n\n/**\n * Match tokens against a pattern.\n */\nexport function matchPattern(\n tokens: TokenStream,\n pattern: LanguagePattern\n): PatternMatchResult | null {\n return patternMatcher.matchPattern(tokens, pattern);\n}\n\n/**\n * Match tokens against multiple patterns, return best match.\n */\nexport function matchBest(\n tokens: TokenStream,\n patterns: LanguagePattern[]\n): PatternMatchResult | null {\n return patternMatcher.matchBest(tokens, patterns);\n}\n","/**\n * Tokenizer Registry\n *\n * Provides a unified interface for tokenization.\n * Delegates to the central registry for language lookups.\n *\n * For tree-shaking, import specific tokenizers directly:\n * import { englishTokenizer } from './tokenizers/english';\n *\n * To register languages, import the language modules:\n * import '@lokascript/semantic/languages/en';\n */\n\nimport type { LanguageTokenizer, TokenStream } from '../types';\nimport {\n tryGetTokenizer,\n getRegisteredLanguages,\n isLanguageRegistered,\n tokenize as registryTokenize,\n registerTokenizer as registryRegisterTokenizer,\n} from '../registry';\n\n// =============================================================================\n// Registry Delegation\n// =============================================================================\n\n/**\n * Get a tokenizer for the specified language.\n * Returns undefined if language is not registered.\n */\nexport function getTokenizer(language: string): LanguageTokenizer | undefined {\n return tryGetTokenizer(language);\n}\n\n/**\n * Tokenize input in the specified language.\n * @throws Error if language is not registered\n */\nexport function tokenize(input: string, language: string): TokenStream {\n return registryTokenize(input, language);\n}\n\n/**\n * Get all supported languages.\n * Returns only languages that have been registered.\n */\nexport function getSupportedLanguages(): string[] {\n return getRegisteredLanguages();\n}\n\n/**\n * Check if a language is supported.\n */\nexport function isLanguageSupported(language: string): boolean {\n return isLanguageRegistered(language);\n}\n\n/**\n * Register a custom tokenizer.\n * Note: For full language support, use registerLanguage() from registry instead.\n */\nexport function registerTokenizer(tokenizer: LanguageTokenizer): void {\n registryRegisterTokenizer(tokenizer);\n}\n\n// =============================================================================\n// Re-exports (tree-shakeable - only included if imported)\n// =============================================================================\n\nexport { englishTokenizer } from './english';\nexport { japaneseTokenizer } from './japanese';\nexport { koreanTokenizer } from './korean';\nexport { arabicTokenizer } from './arabic';\nexport { spanishTokenizer } from './spanish';\nexport { turkishTokenizer } from './turkish';\nexport { chineseTokenizer } from './chinese';\nexport { portugueseTokenizer } from './portuguese';\nexport { frenchTokenizer } from './french';\nexport { germanTokenizer } from './german';\nexport { indonesianTokenizer } from './indonesian';\nexport { quechuaTokenizer } from './quechua';\nexport { swahiliTokenizer } from './swahili';\nexport { italianTokenizer } from './italian';\nexport { vietnameseTokenizer } from './vietnamese';\nexport { polishTokenizer } from './polish';\nexport { russianTokenizer } from './russian';\nexport { ukrainianTokenizer } from './ukrainian';\nexport { hebrewTokenizer } from './he';\nexport { hindiTokenizer } from './hindi';\nexport { bengaliTokenizer } from './bengali';\nexport { thaiTokenizer } from './thai';\n\nexport { malayTokenizer } from './ms';\n\nexport { tagalogTokenizer } from './tl';\n\nexport {\n BaseTokenizer,\n TokenStreamImpl,\n createToken,\n createPosition,\n extractCssSelector,\n extractStringLiteral,\n extractNumber,\n isUrlStart,\n extractUrl,\n // Character classification utilities\n isWhitespace,\n isSelectorStart,\n isQuote,\n isDigit,\n isAsciiLetter,\n isAsciiIdentifierChar,\n // Factory functions for custom tokenizers\n createUnicodeRangeClassifier,\n combineClassifiers,\n createLatinCharClassifiers,\n} from './base';\n\n// Types for profile-derived keyword initialization and custom tokenizers\nexport type {\n KeywordEntry,\n TokenizerProfile,\n TimeUnitMapping,\n UnicodeRange,\n LatinCharClassifiers,\n CreateTokenOptions,\n} from './base';\n","/**\n * Semantic Result Cache\n *\n * LRU cache for semantic analysis results to optimize repeated parsing.\n *\n * Design:\n * - Cache key: `${language}:${input}` for simple, fast lookups\n * - LRU eviction when max size reached\n * - Optional TTL (time-to-live) for cache entries\n * - Statistics for monitoring cache effectiveness\n * - Thread-safe for browser environments (single-threaded)\n */\n\nimport type { SemanticAnalysisResult } from '../core-bridge';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Cache configuration options.\n */\nexport interface SemanticCacheConfig {\n /** Maximum number of entries to cache. Default: 1000 */\n maxSize?: number;\n /** Time-to-live in milliseconds. 0 = no expiration. Default: 0 */\n ttlMs?: number;\n /** Enable/disable caching. Default: true */\n enabled?: boolean;\n}\n\n/**\n * Cache entry with metadata.\n */\ninterface CacheEntry {\n /** The cached result */\n result: SemanticAnalysisResult;\n /** Timestamp when entry was created */\n createdAt: number;\n /** Last access timestamp (for LRU) */\n lastAccessed: number;\n}\n\n/**\n * Cache statistics.\n */\nexport interface CacheStats {\n /** Total cache hits */\n hits: number;\n /** Total cache misses */\n misses: number;\n /** Current cache size */\n size: number;\n /** Maximum cache size */\n maxSize: number;\n /** Hit rate (0-1) */\n hitRate: number;\n /** Total evictions due to size limit */\n evictions: number;\n /** Total expirations due to TTL */\n expirations: number;\n /** Whether caching is enabled */\n enabled: boolean;\n}\n\n// =============================================================================\n// LRU Cache Implementation\n// =============================================================================\n\n/**\n * LRU Cache for semantic analysis results.\n *\n * Uses Map's insertion order for LRU eviction - when we access an entry,\n * we delete and re-insert it to move it to the end (most recently used).\n */\nexport class SemanticCache {\n private cache: Map<string, CacheEntry>;\n private config: Required<SemanticCacheConfig>;\n private stats: {\n hits: number;\n misses: number;\n evictions: number;\n expirations: number;\n };\n\n constructor(config: SemanticCacheConfig = {}) {\n this.cache = new Map();\n this.config = {\n maxSize: config.maxSize ?? 1000,\n ttlMs: config.ttlMs ?? 0,\n enabled: config.enabled ?? true,\n };\n this.stats = {\n hits: 0,\n misses: 0,\n evictions: 0,\n expirations: 0,\n };\n }\n\n /**\n * Generate cache key from input and language.\n */\n private makeKey(input: string, language: string): string {\n return `${language}:${input}`;\n }\n\n /**\n * Check if an entry has expired.\n */\n private isExpired(entry: CacheEntry): boolean {\n if (this.config.ttlMs === 0) return false;\n return Date.now() - entry.createdAt > this.config.ttlMs;\n }\n\n /**\n * Evict the least recently used entry.\n */\n private evictLRU(): void {\n // Map preserves insertion order, so first entry is oldest\n const firstKey = this.cache.keys().next().value;\n if (firstKey !== undefined) {\n this.cache.delete(firstKey);\n this.stats.evictions++;\n }\n }\n\n /**\n * Get a cached result.\n *\n * @param input - The input string\n * @param language - The language code\n * @returns The cached result, or undefined if not found/expired\n */\n get(input: string, language: string): SemanticAnalysisResult | undefined {\n if (!this.config.enabled) {\n this.stats.misses++;\n return undefined;\n }\n\n const key = this.makeKey(input, language);\n const entry = this.cache.get(key);\n\n if (!entry) {\n this.stats.misses++;\n return undefined;\n }\n\n // Check expiration\n if (this.isExpired(entry)) {\n this.cache.delete(key);\n this.stats.expirations++;\n this.stats.misses++;\n return undefined;\n }\n\n // Move to end for LRU (delete and re-insert)\n this.cache.delete(key);\n entry.lastAccessed = Date.now();\n this.cache.set(key, entry);\n\n this.stats.hits++;\n return entry.result;\n }\n\n /**\n * Store a result in the cache.\n *\n * @param input - The input string\n * @param language - The language code\n * @param result - The analysis result to cache\n */\n set(input: string, language: string, result: SemanticAnalysisResult): void {\n if (!this.config.enabled) return;\n\n // Don't cache failed results (confidence 0)\n if (result.confidence === 0) return;\n\n const key = this.makeKey(input, language);\n const now = Date.now();\n\n // Evict if at max size\n while (this.cache.size >= this.config.maxSize) {\n this.evictLRU();\n }\n\n this.cache.set(key, {\n result,\n createdAt: now,\n lastAccessed: now,\n });\n }\n\n /**\n * Check if a result is cached (without updating LRU).\n */\n has(input: string, language: string): boolean {\n if (!this.config.enabled) return false;\n\n const key = this.makeKey(input, language);\n const entry = this.cache.get(key);\n\n if (!entry) return false;\n if (this.isExpired(entry)) {\n this.cache.delete(key);\n this.stats.expirations++;\n return false;\n }\n\n return true;\n }\n\n /**\n * Remove a specific entry from the cache.\n */\n delete(input: string, language: string): boolean {\n const key = this.makeKey(input, language);\n return this.cache.delete(key);\n }\n\n /**\n * Clear all cached entries.\n */\n clear(): void {\n this.cache.clear();\n }\n\n /**\n * Reset statistics.\n */\n resetStats(): void {\n this.stats = {\n hits: 0,\n misses: 0,\n evictions: 0,\n expirations: 0,\n };\n }\n\n /**\n * Get cache statistics.\n */\n getStats(): CacheStats {\n const total = this.stats.hits + this.stats.misses;\n return {\n hits: this.stats.hits,\n misses: this.stats.misses,\n size: this.cache.size,\n maxSize: this.config.maxSize,\n hitRate: total > 0 ? this.stats.hits / total : 0,\n evictions: this.stats.evictions,\n expirations: this.stats.expirations,\n enabled: this.config.enabled,\n };\n }\n\n /**\n * Update cache configuration.\n */\n configure(config: Partial<SemanticCacheConfig>): void {\n if (config.maxSize !== undefined) {\n this.config.maxSize = config.maxSize;\n // Evict if now over limit\n while (this.cache.size > this.config.maxSize) {\n this.evictLRU();\n }\n }\n if (config.ttlMs !== undefined) {\n this.config.ttlMs = config.ttlMs;\n }\n if (config.enabled !== undefined) {\n this.config.enabled = config.enabled;\n }\n }\n\n /**\n * Enable caching.\n */\n enable(): void {\n this.config.enabled = true;\n }\n\n /**\n * Disable caching.\n */\n disable(): void {\n this.config.enabled = false;\n }\n\n /**\n * Get current configuration.\n */\n getConfig(): Readonly<Required<SemanticCacheConfig>> {\n return { ...this.config };\n }\n}\n\n// =============================================================================\n// Default Instance\n// =============================================================================\n\n/**\n * Default global cache instance.\n */\nexport const semanticCache = new SemanticCache();\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Create a cache with custom configuration.\n */\nexport function createSemanticCache(config?: SemanticCacheConfig): SemanticCache {\n return new SemanticCache(config);\n}\n\n/**\n * Decorator/wrapper for adding caching to an analyze function.\n *\n * @param analyzeFn - The analyze function to wrap\n * @param cache - The cache instance to use\n * @returns Wrapped function with caching\n */\nexport function withCache<T extends (input: string, language: string) => SemanticAnalysisResult>(\n analyzeFn: T,\n cache: SemanticCache = semanticCache\n): T {\n return ((input: string, language: string): SemanticAnalysisResult => {\n // Check cache first\n const cached = cache.get(input, language);\n if (cached) {\n return cached;\n }\n\n // Run analysis\n const result = analyzeFn(input, language);\n\n // Cache result\n cache.set(input, language, result);\n\n return result;\n }) as T;\n}\n","/**\n * Core Parser Bridge\n *\n * Provides the SemanticAnalyzer interface that integrates semantic parsing\n * into the core hyperscript parser. This bridge enables confidence-driven\n * fallback between semantic and traditional parsing.\n */\n\nimport type {\n SemanticNode,\n SemanticValue,\n ActionType,\n PatternMatchResult,\n SemanticRole,\n} from './types';\nimport { PatternMatcher } from './parser/pattern-matcher';\nimport { getTokenizer } from './tokenizers';\n// Import from registry for tree-shaking (registry uses directly-registered patterns first)\nimport { getPatternsForLanguage, getRegisteredLanguages } from './registry';\nimport { SemanticCache, semanticCache, type SemanticCacheConfig, type CacheStats } from './cache';\n\n// =============================================================================\n// SemanticAnalyzer Interface\n// =============================================================================\n\n/**\n * Result of semantic analysis.\n */\nexport interface SemanticAnalysisResult {\n /** Confidence score (0-1) for this analysis */\n readonly confidence: number;\n /** The parsed command info (if successful) */\n readonly command?: {\n readonly name: ActionType;\n readonly roles: ReadonlyMap<SemanticRole, SemanticValue>;\n };\n /** The full semantic node (if successful) */\n readonly node?: SemanticNode;\n /** Any errors encountered */\n readonly errors?: string[];\n /** Number of tokens consumed */\n readonly tokensConsumed?: number;\n}\n\n/**\n * Interface for semantic analysis that can be integrated into the core parser.\n * This allows the core parser to optionally use semantic parsing with\n * confidence-based fallback to traditional parsing.\n */\nexport interface SemanticAnalyzer {\n /**\n * Analyze input in the specified language.\n *\n * @param input The input string to analyze\n * @param language ISO 639-1 language code\n * @returns Analysis result with confidence score\n */\n analyze(input: string, language: string): SemanticAnalysisResult;\n\n /**\n * Check if semantic parsing is available for a language.\n */\n supportsLanguage(language: string): boolean;\n\n /**\n * Get the list of supported languages.\n */\n supportedLanguages(): string[];\n\n /**\n * Get cache statistics.\n */\n getCacheStats(): CacheStats;\n\n /**\n * Clear the result cache.\n */\n clearCache(): void;\n\n /**\n * Configure the cache.\n */\n configureCache(config: Partial<SemanticCacheConfig>): void;\n}\n\n// =============================================================================\n// SemanticAnalyzer Implementation\n// =============================================================================\n\n/**\n * Options for creating a SemanticAnalyzer.\n */\nexport interface SemanticAnalyzerOptions {\n /** Cache configuration. Pass false to disable caching. */\n cache?: SemanticCacheConfig | false;\n}\n\n/**\n * Implementation of SemanticAnalyzer that wraps the semantic parser.\n * Includes LRU caching for performance optimization on repeated inputs.\n */\nexport class SemanticAnalyzerImpl implements SemanticAnalyzer {\n private readonly patternMatcher: PatternMatcher;\n private readonly languages: Set<string>;\n private readonly cache: SemanticCache;\n\n constructor(options: SemanticAnalyzerOptions = {}) {\n this.patternMatcher = new PatternMatcher();\n // Get all registered languages from the registry (dynamically updated as languages are loaded)\n this.languages = new Set(getRegisteredLanguages());\n\n // Initialize cache\n if (options.cache === false) {\n this.cache = new SemanticCache({ enabled: false });\n } else {\n this.cache = options.cache ? new SemanticCache(options.cache) : semanticCache;\n }\n }\n\n analyze(input: string, language: string): SemanticAnalysisResult {\n // Check language support\n if (!this.supportsLanguage(language)) {\n return {\n confidence: 0,\n errors: [`Language '${language}' is not supported for semantic parsing`],\n };\n }\n\n // Check cache first\n const cached = this.cache.get(input, language);\n if (cached) {\n return cached;\n }\n\n // Perform analysis\n const result = this.analyzeUncached(input, language);\n\n // Cache successful results\n this.cache.set(input, language, result);\n\n return result;\n }\n\n /**\n * Perform analysis without cache lookup.\n */\n private analyzeUncached(input: string, language: string): SemanticAnalysisResult {\n try {\n // Tokenize\n const tokenizer = getTokenizer(language);\n if (!tokenizer) {\n return {\n confidence: 0,\n errors: [`No tokenizer available for language '${language}'`],\n };\n }\n\n const tokenStream = tokenizer.tokenize(input);\n\n // Get patterns for this language\n const patterns = getPatternsForLanguage(language);\n if (patterns.length === 0) {\n return {\n confidence: 0,\n errors: [`No patterns available for language '${language}'`],\n };\n }\n\n // Try to match patterns\n const match = this.patternMatcher.matchBest(tokenStream, patterns);\n\n if (!match) {\n return {\n confidence: 0,\n errors: ['No pattern matched the input'],\n };\n }\n\n // Build semantic node from match\n const node = this.buildSemanticNode(match);\n\n return {\n confidence: match.confidence,\n command: {\n name: match.pattern.command,\n roles: match.captured,\n },\n node,\n tokensConsumed: match.consumedTokens,\n };\n } catch (error) {\n return {\n confidence: 0,\n errors: [error instanceof Error ? error.message : String(error)],\n };\n }\n }\n\n supportsLanguage(language: string): boolean {\n return this.languages.has(language);\n }\n\n supportedLanguages(): string[] {\n return Array.from(this.languages);\n }\n\n getCacheStats(): CacheStats {\n return this.cache.getStats();\n }\n\n clearCache(): void {\n this.cache.clear();\n }\n\n configureCache(config: Partial<SemanticCacheConfig>): void {\n this.cache.configure(config);\n }\n\n private buildSemanticNode(match: PatternMatchResult): SemanticNode {\n return {\n kind: 'command',\n action: match.pattern.command,\n roles: match.captured,\n metadata: {\n patternId: match.pattern.id,\n },\n };\n }\n}\n\n// =============================================================================\n// Factory Function\n// =============================================================================\n\n/**\n * Create a SemanticAnalyzer instance.\n *\n * @param options - Configuration options including cache settings\n * @returns A new SemanticAnalyzer\n *\n * @example\n * // Default: uses shared global cache\n * const analyzer = createSemanticAnalyzer();\n *\n * @example\n * // Custom cache size\n * const analyzer = createSemanticAnalyzer({ cache: { maxSize: 500 } });\n *\n * @example\n * // Disable caching\n * const analyzer = createSemanticAnalyzer({ cache: false });\n */\nexport function createSemanticAnalyzer(options?: SemanticAnalyzerOptions): SemanticAnalyzer {\n return new SemanticAnalyzerImpl(options);\n}\n\n// Re-export cache types for convenience\nexport type { SemanticCacheConfig, CacheStats } from './cache';\n\n// =============================================================================\n// Confidence Thresholds\n// =============================================================================\n\n/**\n * Default confidence threshold for preferring semantic parsing.\n * If confidence is above this, use semantic result; otherwise fallback.\n */\nexport const DEFAULT_CONFIDENCE_THRESHOLD = 0.5;\n\n/**\n * High confidence threshold for very certain matches.\n */\nexport const HIGH_CONFIDENCE_THRESHOLD = 0.8;\n\n// =============================================================================\n// Integration Helpers\n// =============================================================================\n\n/**\n * Determine if semantic analysis should be used based on confidence.\n */\nexport function shouldUseSemanticResult(\n result: SemanticAnalysisResult,\n threshold: number = DEFAULT_CONFIDENCE_THRESHOLD\n): boolean {\n return result.confidence >= threshold && result.command !== undefined;\n}\n\n/**\n * Convert semantic roles to the format expected by core parser commands.\n * This maps semantic roles to the positional/modifier structure used by\n * the core command implementations.\n *\n * Role to preposition mapping:\n * - patient → first positional arg\n * - event → first positional arg\n * - destination → 'into' (put) or 'on' (others)\n * - source → 'from'\n * - quantity → 'by'\n * - duration → 'over' or 'for'\n * - method → 'as'\n * - style → 'with'\n * - condition → 'if'\n */\nexport function rolesToCommandArgs(\n roles: ReadonlyMap<SemanticRole, SemanticValue>,\n command: ActionType\n): {\n args: SemanticValue[];\n modifiers: Record<string, SemanticValue>;\n} {\n const args: SemanticValue[] = [];\n const modifiers: Record<string, SemanticValue> = {};\n\n for (const [role, value] of roles) {\n switch (role) {\n // Primary arguments (positional)\n case 'patient':\n case 'event':\n args.push(value);\n break;\n\n // Destination: context-dependent preposition\n case 'destination':\n if (command === 'put') {\n modifiers['into'] = value;\n } else {\n modifiers['on'] = value;\n }\n break;\n\n // Source: always 'from'\n case 'source':\n modifiers['from'] = value;\n break;\n\n // Quantitative roles\n case 'quantity':\n modifiers['by'] = value;\n break;\n\n case 'duration':\n modifiers['over'] = value;\n break;\n\n // Adverbial roles\n case 'method':\n modifiers['as'] = value;\n break;\n\n case 'style':\n modifiers['with'] = value;\n break;\n\n // Conditional\n case 'condition':\n modifiers['if'] = value;\n break;\n\n // Agent (for future multi-actor systems)\n case 'agent':\n modifiers['agent'] = value;\n break;\n\n default:\n // Unknown roles become modifiers using role name as key\n modifiers[role] = value;\n }\n }\n\n return { args, modifiers };\n}\n","/**\n * Expression Tokenizer\n *\n * Tokenizes expression strings into tokens for parsing.\n * Focused on expression-level constructs, not full hyperscript syntax.\n */\n\n// =============================================================================\n// Token Types\n// =============================================================================\n\nexport enum TokenType {\n // Literals\n NUMBER = 'NUMBER',\n STRING = 'STRING',\n BOOLEAN = 'BOOLEAN',\n TEMPLATE_LITERAL = 'TEMPLATE_LITERAL',\n\n // Selectors\n ID_SELECTOR = 'ID_SELECTOR',\n CLASS_SELECTOR = 'CLASS_SELECTOR',\n ATTRIBUTE_SELECTOR = 'ATTRIBUTE_SELECTOR',\n QUERY_SELECTOR = 'QUERY_SELECTOR',\n\n // References\n CONTEXT_VAR = 'CONTEXT_VAR',\n IDENTIFIER = 'IDENTIFIER',\n\n // Operators\n OPERATOR = 'OPERATOR',\n COMPARISON = 'COMPARISON',\n LOGICAL = 'LOGICAL',\n POSSESSIVE = 'POSSESSIVE',\n\n // Punctuation\n LPAREN = 'LPAREN',\n RPAREN = 'RPAREN',\n LBRACKET = 'LBRACKET',\n RBRACKET = 'RBRACKET',\n LBRACE = 'LBRACE',\n RBRACE = 'RBRACE',\n COMMA = 'COMMA',\n DOT = 'DOT',\n COLON = 'COLON',\n\n // Special\n TIME_EXPRESSION = 'TIME_EXPRESSION',\n EOF = 'EOF',\n ERROR = 'ERROR',\n}\n\nexport interface Token {\n type: TokenType;\n value: string;\n start: number;\n end: number;\n line?: number;\n column?: number;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst CONTEXT_VARS = new Set([\n 'me',\n 'my',\n 'myself',\n 'you',\n 'your',\n 'yourself',\n 'it',\n 'its',\n 'result',\n 'event',\n 'target',\n 'body',\n 'detail',\n 'window',\n 'document',\n]);\n\nconst LOGICAL_OPERATORS = new Set(['and', 'or', 'not', 'no']);\n\nconst BOOLEAN_LITERALS = new Set(['true', 'false', 'null', 'undefined']);\n\nconst TIME_UNITS = new Set([\n 'ms',\n 's',\n 'seconds',\n 'second',\n 'milliseconds',\n 'millisecond',\n 'minutes',\n 'minute',\n 'hours',\n 'hour',\n]);\n\n// =============================================================================\n// Tokenizer\n// =============================================================================\n\nexport function tokenize(input: string): Token[] {\n const tokens: Token[] = [];\n let pos = 0;\n let line = 1;\n let column = 1;\n\n // Track if the previous token allows a selector\n // Selectors are only valid at the start or after operators, opening brackets, etc.\n function previousTokenAllowsSelector(): boolean {\n if (tokens.length === 0) return true;\n const prev = tokens[tokens.length - 1];\n // After these token types, a selector is valid\n return [\n TokenType.OPERATOR,\n TokenType.COMPARISON,\n TokenType.LOGICAL,\n TokenType.LPAREN,\n TokenType.LBRACKET,\n TokenType.LBRACE,\n TokenType.COMMA,\n TokenType.COLON,\n ].includes(prev.type);\n }\n\n function peek(offset = 0): string {\n return input[pos + offset] ?? '';\n }\n\n function advance(): string {\n const char = input[pos];\n pos++;\n if (char === '\\n') {\n line++;\n column = 1;\n } else {\n column++;\n }\n return char;\n }\n\n function skipWhitespace(): void {\n while (pos < input.length && /\\s/.test(input[pos])) {\n advance();\n }\n }\n\n function readWhile(predicate: (char: string) => boolean): string {\n let result = '';\n while (pos < input.length && predicate(input[pos])) {\n result += advance();\n }\n return result;\n }\n\n function readString(quote: string): string {\n let result = quote;\n advance(); // consume opening quote\n while (pos < input.length && input[pos] !== quote) {\n if (input[pos] === '\\\\' && pos + 1 < input.length) {\n result += advance(); // backslash\n result += advance(); // escaped char\n } else {\n result += advance();\n }\n }\n if (pos < input.length) {\n result += advance(); // closing quote\n }\n return result;\n }\n\n function readTemplateLiteral(): string {\n let result = '`';\n advance(); // consume opening backtick\n while (pos < input.length && input[pos] !== '`') {\n if (input[pos] === '\\\\' && pos + 1 < input.length) {\n result += advance();\n result += advance();\n } else {\n result += advance();\n }\n }\n if (pos < input.length) {\n result += advance(); // closing backtick\n }\n return result;\n }\n\n function readQuerySelector(): string {\n let result = '<';\n advance(); // consume <\n while (pos < input.length) {\n result += advance();\n if (result.endsWith('/>')) {\n break;\n }\n }\n return result;\n }\n\n function makeToken(type: TokenType, value: string, start: number): Token {\n return {\n type,\n value,\n start,\n end: pos,\n line,\n column: column - value.length,\n };\n }\n\n while (pos < input.length) {\n skipWhitespace();\n if (pos >= input.length) break;\n\n const start = pos;\n const char = peek();\n\n // Possessive 's (check before string literals)\n if (char === \"'\" && peek(1) === 's' && !/\\w/.test(peek(2))) {\n advance(); // '\n advance(); // s\n tokens.push(makeToken(TokenType.POSSESSIVE, \"'s\", start));\n continue;\n }\n\n // String literals\n if (char === '\"' || char === \"'\") {\n const value = readString(char);\n tokens.push(makeToken(TokenType.STRING, value, start));\n continue;\n }\n\n // Template literals\n if (char === '`') {\n const value = readTemplateLiteral();\n tokens.push(makeToken(TokenType.TEMPLATE_LITERAL, value, start));\n continue;\n }\n\n // Query selectors <tag/>\n if (char === '<' && /[a-zA-Z.#\\[]/.test(peek(1))) {\n const value = readQuerySelector();\n tokens.push(makeToken(TokenType.QUERY_SELECTOR, value, start));\n continue;\n }\n\n // ID selectors #id (only at start or after operators)\n if (char === '#' && previousTokenAllowsSelector()) {\n advance();\n const name = readWhile(c => /[\\w-]/.test(c));\n tokens.push(makeToken(TokenType.ID_SELECTOR, '#' + name, start));\n continue;\n }\n\n // Class selectors .class (only at start or after operators)\n if (char === '.' && /[a-zA-Z_-]/.test(peek(1)) && previousTokenAllowsSelector()) {\n advance();\n const name = readWhile(c => /[\\w-]/.test(c));\n tokens.push(makeToken(TokenType.CLASS_SELECTOR, '.' + name, start));\n continue;\n }\n\n // Attribute selectors [attr] or [attr=\"value\"] (only at start or after operators)\n if (char === '[' && previousTokenAllowsSelector()) {\n // Check if this looks like an attribute selector (starts with @ or identifier)\n const nextChar = peek(1);\n if (nextChar === '@' || /[a-zA-Z]/.test(nextChar)) {\n let value = '';\n value += advance(); // [\n while (pos < input.length && input[pos] !== ']') {\n if (input[pos] === '\"' || input[pos] === \"'\") {\n value += readString(input[pos]);\n } else {\n value += advance();\n }\n }\n if (pos < input.length) {\n value += advance(); // ]\n }\n tokens.push(makeToken(TokenType.ATTRIBUTE_SELECTOR, value, start));\n continue;\n }\n }\n\n // Array brackets [ and ]\n if (char === '[') {\n advance();\n tokens.push(makeToken(TokenType.LBRACKET, '[', start));\n continue;\n }\n if (char === ']') {\n advance();\n tokens.push(makeToken(TokenType.RBRACKET, ']', start));\n continue;\n }\n\n // Numbers (including time expressions like 2s, 500ms)\n if (/\\d/.test(char)) {\n const num = readWhile(c => /[\\d.]/.test(c));\n const unitStart = pos;\n const unit = readWhile(c => /[a-zA-Z]/.test(c));\n\n if (TIME_UNITS.has(unit)) {\n tokens.push(makeToken(TokenType.TIME_EXPRESSION, num + unit, start));\n } else {\n // Put back the unit if it's not a time unit\n pos = unitStart;\n tokens.push(makeToken(TokenType.NUMBER, num, start));\n }\n continue;\n }\n\n // Punctuation\n if (char === '(') {\n advance();\n tokens.push(makeToken(TokenType.LPAREN, '(', start));\n continue;\n }\n if (char === ')') {\n advance();\n tokens.push(makeToken(TokenType.RPAREN, ')', start));\n continue;\n }\n if (char === '{') {\n advance();\n tokens.push(makeToken(TokenType.LBRACE, '{', start));\n continue;\n }\n if (char === '}') {\n advance();\n tokens.push(makeToken(TokenType.RBRACE, '}', start));\n continue;\n }\n if (char === ',') {\n advance();\n tokens.push(makeToken(TokenType.COMMA, ',', start));\n continue;\n }\n if (char === ':') {\n advance();\n tokens.push(makeToken(TokenType.COLON, ':', start));\n continue;\n }\n if (char === '.') {\n advance();\n tokens.push(makeToken(TokenType.DOT, '.', start));\n continue;\n }\n\n // Operators\n if (char === '+' || char === '-' || char === '*' || char === '/' || char === '%') {\n advance();\n tokens.push(makeToken(TokenType.OPERATOR, char, start));\n continue;\n }\n\n // Comparison operators\n if (char === '=' || char === '!' || char === '<' || char === '>') {\n let op = advance();\n if (peek() === '=') {\n op += advance();\n }\n tokens.push(makeToken(TokenType.COMPARISON, op, start));\n continue;\n }\n\n // Identifiers and keywords\n if (/[a-zA-Z_$]/.test(char)) {\n const word = readWhile(c => /[\\w$]/.test(c));\n const lower = word.toLowerCase();\n\n if (CONTEXT_VARS.has(lower)) {\n tokens.push(makeToken(TokenType.CONTEXT_VAR, word, start));\n } else if (LOGICAL_OPERATORS.has(lower)) {\n tokens.push(makeToken(TokenType.LOGICAL, word, start));\n } else if (BOOLEAN_LITERALS.has(lower)) {\n tokens.push(makeToken(TokenType.BOOLEAN, word, start));\n } else {\n tokens.push(makeToken(TokenType.IDENTIFIER, word, start));\n }\n continue;\n }\n\n // Unknown character - skip it\n advance();\n }\n\n tokens.push(makeToken(TokenType.EOF, '', pos));\n return tokens;\n}\n","/**\n * Expression Parser\n *\n * Parses expression tokens into AST nodes.\n * Uses recursive descent parsing with operator precedence.\n */\n\nimport { tokenize, Token, TokenType } from './tokenizer';\nimport type {\n ExpressionNode,\n LiteralNode,\n TemplateLiteralNode,\n SelectorNode,\n ContextReferenceNode,\n IdentifierNode,\n PropertyAccessNode,\n PossessiveExpressionNode,\n BinaryExpressionNode,\n UnaryExpressionNode,\n CallExpressionNode,\n ArrayLiteralNode,\n ObjectLiteralNode,\n TimeExpressionNode,\n ExpressionParseResult,\n ContextType,\n SelectorKind,\n} from './types';\n\n// =============================================================================\n// Parser Class\n// =============================================================================\n\nexport class ExpressionParser {\n private tokens: Token[] = [];\n private current = 0;\n\n parse(input: string): ExpressionParseResult {\n try {\n this.tokens = tokenize(input);\n this.current = 0;\n\n if (this.isAtEnd()) {\n return { success: false, error: 'Empty expression' };\n }\n\n const node = this.parseExpression();\n return { success: true, node, consumed: this.current };\n } catch (e) {\n return {\n success: false,\n error: e instanceof Error ? e.message : 'Parse error',\n };\n }\n }\n\n // =============================================================================\n // Token Navigation\n // =============================================================================\n\n private peek(): Token {\n return this.tokens[this.current] ?? { type: TokenType.EOF, value: '', start: 0, end: 0 };\n }\n\n private previous(): Token {\n return this.tokens[this.current - 1] ?? { type: TokenType.EOF, value: '', start: 0, end: 0 };\n }\n\n private isAtEnd(): boolean {\n return this.peek().type === TokenType.EOF;\n }\n\n private advance(): Token {\n if (!this.isAtEnd()) {\n this.current++;\n }\n return this.previous();\n }\n\n private check(type: TokenType): boolean {\n return this.peek().type === type;\n }\n\n private checkValue(value: string): boolean {\n return this.peek().value.toLowerCase() === value.toLowerCase();\n }\n\n private match(...types: TokenType[]): boolean {\n for (const type of types) {\n if (this.check(type)) {\n this.advance();\n return true;\n }\n }\n return false;\n }\n\n // =============================================================================\n // Expression Parsing (Precedence Climbing)\n // =============================================================================\n\n private parseExpression(): ExpressionNode {\n return this.parseOr();\n }\n\n private parseOr(): ExpressionNode {\n let left = this.parseAnd();\n\n while (this.checkValue('or')) {\n const operator = this.advance().value;\n const right = this.parseAnd();\n left = this.createBinaryExpression(operator, left, right);\n }\n\n return left;\n }\n\n private parseAnd(): ExpressionNode {\n let left = this.parseEquality();\n\n while (this.checkValue('and')) {\n const operator = this.advance().value;\n const right = this.parseEquality();\n left = this.createBinaryExpression(operator, left, right);\n }\n\n return left;\n }\n\n private parseEquality(): ExpressionNode {\n let left = this.parseComparison();\n\n while (\n this.match(TokenType.COMPARISON) ||\n this.checkValue('is') ||\n this.checkValue('matches') ||\n this.checkValue('contains') ||\n this.checkValue('in')\n ) {\n const operator = this.previous().value;\n const right = this.parseComparison();\n left = this.createBinaryExpression(operator, left, right);\n }\n\n return left;\n }\n\n private parseComparison(): ExpressionNode {\n let left = this.parseAddition();\n\n while (this.check(TokenType.COMPARISON)) {\n const operator = this.advance().value;\n const right = this.parseAddition();\n left = this.createBinaryExpression(operator, left, right);\n }\n\n return left;\n }\n\n private parseAddition(): ExpressionNode {\n let left = this.parseMultiplication();\n\n while (this.peek().value === '+' || this.peek().value === '-') {\n const operator = this.advance().value;\n const right = this.parseMultiplication();\n left = this.createBinaryExpression(operator, left, right);\n }\n\n return left;\n }\n\n private parseMultiplication(): ExpressionNode {\n let left = this.parseUnary();\n\n while (this.peek().value === '*' || this.peek().value === '/' || this.peek().value === '%') {\n const operator = this.advance().value;\n const right = this.parseUnary();\n left = this.createBinaryExpression(operator, left, right);\n }\n\n return left;\n }\n\n private parseUnary(): ExpressionNode {\n if (this.checkValue('not') || this.checkValue('no') || this.peek().value === '-') {\n const operator = this.advance().value;\n const operand = this.parseUnary();\n return this.createUnaryExpression(operator, operand);\n }\n\n return this.parsePostfix();\n }\n\n private parsePostfix(): ExpressionNode {\n let expr = this.parsePrimary();\n\n while (true) {\n // Property access with dot: expr.property\n if (this.match(TokenType.DOT)) {\n // Accept IDENTIFIER or CONTEXT_VAR as property name\n if (this.check(TokenType.IDENTIFIER) || this.check(TokenType.CONTEXT_VAR)) {\n const property = this.advance().value;\n expr = this.createPropertyAccess(expr, property);\n } else {\n break;\n }\n }\n // Possessive: expr's property\n else if (this.match(TokenType.POSSESSIVE)) {\n // Accept IDENTIFIER or CONTEXT_VAR as property name\n if (this.check(TokenType.IDENTIFIER) || this.check(TokenType.CONTEXT_VAR)) {\n const property = this.advance().value;\n expr = this.createPossessiveExpression(expr, property);\n } else {\n break;\n }\n }\n // Function call: expr(args)\n else if (this.match(TokenType.LPAREN)) {\n const args = this.parseArguments();\n expr = this.createCallExpression(expr, args);\n }\n // Array access: expr[index]\n else if (this.match(TokenType.LBRACKET)) {\n const index = this.parseExpression();\n if (!this.match(TokenType.RBRACKET)) {\n throw new Error('Expected ] after index');\n }\n expr = this.createPropertyAccess(expr, index);\n } else {\n break;\n }\n }\n\n return expr;\n }\n\n private parsePrimary(): ExpressionNode {\n const token = this.peek();\n\n // Literals\n if (this.match(TokenType.NUMBER)) {\n return this.createLiteral(parseFloat(token.value), 'number', token);\n }\n\n if (this.match(TokenType.STRING)) {\n const value = token.value.slice(1, -1); // Remove quotes\n return this.createLiteral(value, 'string', token);\n }\n\n if (this.match(TokenType.BOOLEAN)) {\n const value =\n token.value === 'true'\n ? true\n : token.value === 'false'\n ? false\n : token.value === 'null'\n ? null\n : undefined;\n return this.createLiteral(value, token.value as any, token);\n }\n\n if (this.match(TokenType.TEMPLATE_LITERAL)) {\n const templateNode: TemplateLiteralNode = {\n type: 'templateLiteral',\n value: token.value,\n start: token.start,\n end: token.end,\n line: token.line,\n column: token.column,\n };\n return templateNode;\n }\n\n if (this.match(TokenType.TIME_EXPRESSION)) {\n return this.parseTimeExpression(token);\n }\n\n // Selectors\n if (this.match(TokenType.ID_SELECTOR)) {\n return this.createSelector(token.value, 'id', token);\n }\n\n if (this.match(TokenType.CLASS_SELECTOR)) {\n return this.createSelector(token.value, 'class', token);\n }\n\n if (this.match(TokenType.ATTRIBUTE_SELECTOR)) {\n return this.createSelector(token.value, 'attribute', token);\n }\n\n if (this.match(TokenType.QUERY_SELECTOR)) {\n // Extract selector from <.../>\n const selector = token.value.slice(1, -2);\n return this.createSelector(selector, 'query', token);\n }\n\n // Context references\n if (this.match(TokenType.CONTEXT_VAR)) {\n return this.createContextReference(token.value as ContextType, token);\n }\n\n // Identifiers\n if (this.match(TokenType.IDENTIFIER)) {\n return this.createIdentifier(token.value, token);\n }\n\n // Parenthesized expression\n if (this.match(TokenType.LPAREN)) {\n const expr = this.parseExpression();\n if (!this.match(TokenType.RPAREN)) {\n throw new Error('Expected ) after expression');\n }\n return expr;\n }\n\n // Array literal\n if (this.match(TokenType.LBRACKET)) {\n return this.parseArrayLiteral();\n }\n\n // Object literal\n if (this.match(TokenType.LBRACE)) {\n return this.parseObjectLiteral();\n }\n\n throw new Error(`Unexpected token: ${token.value}`);\n }\n\n private parseArguments(): ExpressionNode[] {\n const args: ExpressionNode[] = [];\n\n if (!this.check(TokenType.RPAREN)) {\n do {\n args.push(this.parseExpression());\n } while (this.match(TokenType.COMMA));\n }\n\n if (!this.match(TokenType.RPAREN)) {\n throw new Error('Expected ) after arguments');\n }\n\n return args;\n }\n\n private parseArrayLiteral(): ArrayLiteralNode {\n const elements: ExpressionNode[] = [];\n const start = this.previous().start;\n\n if (!this.check(TokenType.RBRACKET)) {\n do {\n elements.push(this.parseExpression());\n } while (this.match(TokenType.COMMA));\n }\n\n if (!this.match(TokenType.RBRACKET)) {\n throw new Error('Expected ] after array elements');\n }\n\n return {\n type: 'arrayLiteral',\n elements,\n start,\n end: this.previous().end,\n };\n }\n\n private parseObjectLiteral(): ObjectLiteralNode {\n const properties: Array<{ key: string; value: ExpressionNode }> = [];\n const start = this.previous().start;\n\n if (!this.check(TokenType.RBRACE)) {\n do {\n let key: string;\n if (this.check(TokenType.STRING)) {\n key = this.advance().value.slice(1, -1);\n } else if (this.check(TokenType.IDENTIFIER)) {\n key = this.advance().value;\n } else {\n throw new Error('Expected property name');\n }\n\n if (!this.match(TokenType.COLON)) {\n throw new Error('Expected : after property name');\n }\n\n const value = this.parseExpression();\n properties.push({ key, value });\n } while (this.match(TokenType.COMMA));\n }\n\n if (!this.match(TokenType.RBRACE)) {\n throw new Error('Expected } after object properties');\n }\n\n return {\n type: 'objectLiteral',\n properties: properties.map(p => ({\n type: 'objectProperty' as const,\n key: p.key,\n value: p.value,\n })),\n start,\n end: this.previous().end,\n };\n }\n\n private parseTimeExpression(token: Token): TimeExpressionNode {\n const match = token.value.match(\n /^(\\d+(?:\\.\\d+)?)(ms|s|seconds?|milliseconds?|minutes?|hours?)$/i\n );\n if (!match) {\n throw new Error(`Invalid time expression: ${token.value}`);\n }\n\n const value = parseFloat(match[1]);\n const unit = match[2].toLowerCase() as TimeExpressionNode['unit'];\n\n return {\n type: 'timeExpression',\n value,\n unit,\n raw: token.value,\n start: token.start,\n end: token.end,\n line: token.line,\n column: token.column,\n };\n }\n\n // =============================================================================\n // Node Factories\n // =============================================================================\n\n private createLiteral(\n value: string | number | boolean | null | undefined,\n dataType: LiteralNode['dataType'],\n token: Token\n ): LiteralNode {\n return {\n type: 'literal',\n value,\n dataType,\n raw: token.value,\n start: token.start,\n end: token.end,\n line: token.line,\n column: token.column,\n };\n }\n\n private createSelector(value: string, kind: SelectorKind, token: Token): SelectorNode {\n return {\n type: 'selector',\n value,\n selector: value,\n selectorType: kind,\n start: token.start,\n end: token.end,\n line: token.line,\n column: token.column,\n };\n }\n\n private createContextReference(contextType: ContextType, token: Token): ContextReferenceNode {\n return {\n type: 'contextReference',\n contextType,\n name: token.value,\n start: token.start,\n end: token.end,\n line: token.line,\n column: token.column,\n };\n }\n\n private createIdentifier(name: string, token: Token): IdentifierNode {\n return {\n type: 'identifier',\n name,\n start: token.start,\n end: token.end,\n line: token.line,\n column: token.column,\n };\n }\n\n private createPropertyAccess(\n object: ExpressionNode,\n property: string | ExpressionNode\n ): PropertyAccessNode {\n return {\n type: 'propertyAccess',\n object,\n property: typeof property === 'string' ? property : ((property as any).name ?? ''),\n start: object.start,\n end: this.previous().end,\n };\n }\n\n private createPossessiveExpression(\n object: ExpressionNode,\n property: string\n ): PossessiveExpressionNode {\n return {\n type: 'possessiveExpression',\n object,\n property,\n start: object.start,\n end: this.previous().end,\n };\n }\n\n private createBinaryExpression(\n operator: string,\n left: ExpressionNode,\n right: ExpressionNode\n ): BinaryExpressionNode {\n return {\n type: 'binaryExpression',\n operator,\n left,\n right,\n start: left.start,\n end: right.end,\n };\n }\n\n private createUnaryExpression(operator: string, operand: ExpressionNode): UnaryExpressionNode {\n return {\n type: 'unaryExpression',\n operator,\n operand,\n prefix: true,\n start: this.previous().start,\n end: operand.end,\n };\n }\n\n private createCallExpression(callee: ExpressionNode, args: ExpressionNode[]): CallExpressionNode {\n return {\n type: 'callExpression',\n callee,\n arguments: args,\n start: callee.start,\n end: this.previous().end,\n };\n }\n}\n\n// =============================================================================\n// Convenience Function\n// =============================================================================\n\n/**\n * Parse an expression string into an AST node.\n *\n * @param input - The expression string to parse\n * @returns The parse result with success status and node or error\n */\nexport function parseExpression(input: string): ExpressionParseResult {\n const parser = new ExpressionParser();\n return parser.parse(input);\n}\n","/**\n * Semantic Value to AST Node Converters\n *\n * Converts SemanticValue types to AST expression nodes.\n * Used by the AST builder to construct expression trees from semantic parsing results.\n */\n\nimport type {\n SemanticValue,\n LiteralValue,\n SelectorValue,\n ReferenceValue,\n PropertyPathValue,\n ExpressionValue,\n} from '../types';\n\nimport {\n parseExpression,\n type ExpressionNode,\n type LiteralNode,\n type SelectorNode,\n type ContextReferenceNode,\n type PropertyAccessNode,\n type IdentifierNode,\n type ContextType,\n type SelectorKind,\n} from './expression-parser';\n\n// =============================================================================\n// Value Converters\n// =============================================================================\n\n/**\n * Convert a SemanticValue to an AST ExpressionNode.\n *\n * @param value - The semantic value to convert\n * @param warnings - Optional array to collect warnings about potentially incorrect type choices\n * @returns The corresponding AST expression node\n */\nexport function convertValue(value: SemanticValue, warnings?: string[]): ExpressionNode {\n switch (value.type) {\n case 'literal':\n return convertLiteral(value);\n case 'selector':\n return convertSelector(value, warnings);\n case 'reference':\n return convertReference(value);\n case 'property-path':\n return convertPropertyPath(value, warnings);\n case 'expression':\n return convertExpression(value);\n default:\n // Exhaustive check\n const _exhaustive: never = value;\n throw new Error(`Unknown semantic value type: ${(_exhaustive as SemanticValue).type}`);\n }\n}\n\n/**\n * Convert a LiteralValue to a LiteralNode.\n */\nexport function convertLiteral(value: LiteralValue): LiteralNode {\n const result: LiteralNode = {\n type: 'literal',\n value: value.value,\n };\n\n // Only add dataType if defined (exactOptionalPropertyTypes)\n if (value.dataType) {\n return { ...result, dataType: value.dataType };\n }\n\n return result;\n}\n\n/**\n * Convert a SelectorValue to a SelectorNode.\n *\n * @param value - The selector value to convert\n * @param warnings - Optional array to collect warnings\n */\nexport function convertSelector(value: SelectorValue, warnings?: string[]): SelectorNode {\n // Warn if selector looks like a CSS property (starts with * followed by a letter/hyphen)\n // This catches cases like \"*background-color\" which should likely be a literal string\n if (warnings && value.value.startsWith('*') && /^[a-zA-Z-]/.test(value.value.slice(1))) {\n warnings.push(\n `Converted '${value.value}' to a CSS selector, but it looks like a CSS property name. ` +\n `CSS properties in commands like 'transition' should be literal strings, not selectors. ` +\n `Consider using expectedTypes: ['literal'] instead of ['literal', 'selector'] in the command schema.`\n );\n }\n\n return {\n type: 'selector',\n value: value.value,\n selector: value.value,\n selectorType: value.selectorKind as SelectorKind,\n };\n}\n\n/**\n * Convert a ReferenceValue to a ContextReferenceNode.\n */\nexport function convertReference(value: ReferenceValue): ContextReferenceNode {\n return {\n type: 'contextReference',\n contextType: value.value as ContextType,\n name: value.value,\n };\n}\n\n/**\n * Convert a PropertyPathValue to a PropertyAccessNode.\n * Recursively converts the object part.\n *\n * @param value - The property path value to convert\n * @param warnings - Optional array to collect warnings\n */\nexport function convertPropertyPath(\n value: PropertyPathValue,\n warnings?: string[]\n): PropertyAccessNode {\n return {\n type: 'propertyAccess',\n object: convertValue(value.object, warnings),\n property: value.property,\n };\n}\n\n/**\n * Convert an ExpressionValue (raw string) by parsing it with the expression parser.\n * This is the fallback for complex expressions that couldn't be fully parsed\n * at the semantic level.\n */\nexport function convertExpression(value: ExpressionValue): ExpressionNode {\n const result = parseExpression(value.raw);\n\n if (!result.success || !result.node) {\n // If parsing fails, return an identifier node with the raw value\n const identifier: IdentifierNode = {\n type: 'identifier',\n name: value.raw,\n };\n return identifier;\n }\n\n return result.node;\n}\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\nexport function isLiteralValue(value: SemanticValue): value is LiteralValue {\n return value.type === 'literal';\n}\n\nexport function isSelectorValue(value: SemanticValue): value is SelectorValue {\n return value.type === 'selector';\n}\n\nexport function isReferenceValue(value: SemanticValue): value is ReferenceValue {\n return value.type === 'reference';\n}\n\nexport function isPropertyPathValue(value: SemanticValue): value is PropertyPathValue {\n return value.type === 'property-path';\n}\n\nexport function isExpressionValue(value: SemanticValue): value is ExpressionValue {\n return value.type === 'expression';\n}\n","/**\n * Command-specific AST Mappers\n *\n * Each command can have a custom mapper that knows how to convert\n * its semantic roles to the appropriate AST structure.\n */\n\nimport type { CommandSemanticNode, ActionType, SemanticValue, SemanticRole } from '../types';\nimport { convertValue } from './value-converters';\nimport type { ASTBuilder, CommandNode } from './index';\nimport type { ExpressionNode } from './expression-parser';\n\n// =============================================================================\n// Command Mapper Interface\n// =============================================================================\n\n/**\n * Result from command mapping, including the AST and any warnings.\n */\nexport interface CommandMapperResult {\n ast: CommandNode;\n warnings: string[];\n}\n\n/**\n * Interface for command-specific AST mappers.\n */\nexport interface CommandMapper {\n /**\n * The action type this mapper handles.\n */\n readonly action: ActionType;\n\n /**\n * Convert a CommandSemanticNode to a CommandNode.\n *\n * @param node - The semantic command node\n * @param builder - The AST builder (for recursive building if needed)\n * @returns The AST command node with any warnings, or just the AST node for backward compatibility\n */\n toAST(node: CommandSemanticNode, builder: ASTBuilder): CommandMapperResult | CommandNode;\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Get a semantic value from a node's roles, returning undefined if not present.\n */\nfunction getRole(node: CommandSemanticNode, role: SemanticRole): SemanticValue | undefined {\n return node.roles.get(role);\n}\n\n/**\n * Convert a semantic value to an AST expression, or return undefined.\n *\n * @param node - The semantic node containing roles\n * @param role - The semantic role to extract\n * @param warnings - Optional array to collect warnings\n */\nfunction convertRoleValue(\n node: CommandSemanticNode,\n role: SemanticRole,\n warnings?: string[]\n): ExpressionNode | undefined {\n const value = getRole(node, role);\n return value ? convertValue(value, warnings) : undefined;\n}\n\n/**\n * Create a basic command node with standard structure.\n * Handles exactOptionalPropertyTypes by not including undefined properties.\n */\nfunction createCommandNode(\n name: string,\n args: ExpressionNode[] = [],\n modifiers?: Record<string, ExpressionNode>,\n options: { isBlocking?: boolean; implicitTarget?: ExpressionNode } = {}\n): CommandNode {\n const result: CommandNode = {\n type: 'command',\n name,\n args,\n };\n\n // Only add optional properties if they have values (exactOptionalPropertyTypes)\n if (modifiers && Object.keys(modifiers).length > 0) {\n (result as { modifiers: Record<string, ExpressionNode> }).modifiers = modifiers;\n }\n\n if (options.isBlocking) {\n (result as { isBlocking: boolean }).isBlocking = options.isBlocking;\n }\n\n if (options.implicitTarget) {\n (result as { implicitTarget: ExpressionNode }).implicitTarget = options.implicitTarget;\n }\n\n return result;\n}\n\n// =============================================================================\n// Command Mappers\n// =============================================================================\n\n/**\n * Toggle command mapper.\n *\n * Semantic: toggle patient:.active destination:#button\n * AST: { name: 'toggle', args: ['.active'], modifiers: { on: '#button' } }\n */\nconst toggleMapper: CommandMapper = {\n action: 'toggle',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient');\n const destination = convertRoleValue(node, 'destination');\n const duration = convertRoleValue(node, 'duration');\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (destination) modifiers['on'] = destination;\n if (duration) modifiers['for'] = duration;\n\n return createCommandNode('toggle', args, modifiers);\n },\n};\n\n/**\n * Add command mapper.\n *\n * Semantic: add patient:.active destination:#button\n * AST: { name: 'add', args: ['.active'], modifiers: { to: '#button' } }\n */\nconst addMapper: CommandMapper = {\n action: 'add',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient');\n const destination = convertRoleValue(node, 'destination');\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (destination) modifiers['to'] = destination;\n\n return createCommandNode('add', args, modifiers);\n },\n};\n\n/**\n * Remove command mapper.\n *\n * Semantic: remove patient:.active source:#button\n * AST: { name: 'remove', args: ['.active'], modifiers: { from: '#button' } }\n */\nconst removeMapper: CommandMapper = {\n action: 'remove',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient');\n const source = convertRoleValue(node, 'source');\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (source) modifiers['from'] = source;\n\n return createCommandNode('remove', args, modifiers);\n },\n};\n\n/**\n * Set command mapper.\n *\n * Semantic: set destination:#element's value patient:\"hello\"\n * AST: { name: 'set', args: [#element's value], modifiers: { to: \"hello\" } }\n *\n * Note: The destination typically includes the property path (e.g., #element's value)\n * and patient is the value being set.\n */\nconst setMapper: CommandMapper = {\n action: 'set',\n toAST(node, _builder) {\n const destination = convertRoleValue(node, 'destination');\n const patient = convertRoleValue(node, 'patient');\n\n const args: ExpressionNode[] = [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n // The destination is typically the property path to set\n if (destination) {\n args.push(destination);\n }\n\n // The patient is the value being set\n if (patient) modifiers['to'] = patient;\n\n return createCommandNode('set', args, modifiers);\n },\n};\n\n/**\n * Show command mapper.\n */\nconst showMapper: CommandMapper = {\n action: 'show',\n toAST(node, _builder) {\n const destination = convertRoleValue(node, 'destination');\n const patient = convertRoleValue(node, 'patient');\n const duration = convertRoleValue(node, 'duration');\n\n const args: ExpressionNode[] = [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n // Target can be in destination or patient\n const target = destination ?? patient;\n if (target) args.push(target);\n if (duration) modifiers['with'] = duration;\n\n return createCommandNode('show', args, modifiers);\n },\n};\n\n/**\n * Hide command mapper.\n */\nconst hideMapper: CommandMapper = {\n action: 'hide',\n toAST(node, _builder) {\n const destination = convertRoleValue(node, 'destination');\n const patient = convertRoleValue(node, 'patient');\n const duration = convertRoleValue(node, 'duration');\n\n const args: ExpressionNode[] = [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n const target = destination ?? patient;\n if (target) args.push(target);\n if (duration) modifiers['with'] = duration;\n\n return createCommandNode('hide', args, modifiers);\n },\n};\n\n/**\n * Increment command mapper.\n *\n * Semantic: increment patient:#count quantity:5\n * AST: { name: 'increment', args: [#count], modifiers: { by: 5 } }\n */\nconst incrementMapper: CommandMapper = {\n action: 'increment',\n toAST(node, _builder) {\n const destination = convertRoleValue(node, 'destination');\n const patient = convertRoleValue(node, 'patient');\n const quantity = convertRoleValue(node, 'quantity'); // Amount\n\n const args: ExpressionNode[] = [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n const target = destination ?? patient;\n if (target) args.push(target);\n if (quantity) modifiers['by'] = quantity;\n\n return createCommandNode('increment', args, modifiers);\n },\n};\n\n/**\n * Decrement command mapper.\n *\n * Semantic: decrement patient:#count quantity:5\n * AST: { name: 'decrement', args: [#count], modifiers: { by: 5 } }\n */\nconst decrementMapper: CommandMapper = {\n action: 'decrement',\n toAST(node, _builder) {\n const destination = convertRoleValue(node, 'destination');\n const patient = convertRoleValue(node, 'patient');\n const quantity = convertRoleValue(node, 'quantity');\n\n const args: ExpressionNode[] = [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n const target = destination ?? patient;\n if (target) args.push(target);\n if (quantity) modifiers['by'] = quantity;\n\n return createCommandNode('decrement', args, modifiers);\n },\n};\n\n/**\n * Wait command mapper.\n */\nconst waitMapper: CommandMapper = {\n action: 'wait',\n toAST(node, _builder) {\n const duration = convertRoleValue(node, 'duration');\n\n const args: ExpressionNode[] = duration ? [duration] : [];\n\n return createCommandNode('wait', args, undefined, { isBlocking: true });\n },\n};\n\n/**\n * Log command mapper.\n *\n * Semantic: log patient:\"hello\"\n * AST: { name: 'log', args: [\"hello\"] }\n */\nconst logMapper: CommandMapper = {\n action: 'log',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient');\n\n const args: ExpressionNode[] = [];\n if (patient) args.push(patient);\n\n return createCommandNode('log', args);\n },\n};\n\n/**\n * Put command mapper.\n *\n * Semantic: put patient:\"hello\" destination:#output method:into\n * AST: { name: 'put', args: [\"hello\"], modifiers: { into: #output } }\n */\nconst putMapper: CommandMapper = {\n action: 'put',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient');\n const destination = convertRoleValue(node, 'destination');\n const method = getRole(node, 'method'); // before, after, into, etc.\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (destination) {\n // Determine the preposition based on method or default to 'into'\n const prep = method?.type === 'literal' ? String(method.value) : 'into';\n modifiers[prep] = destination;\n }\n\n return createCommandNode('put', args, modifiers);\n },\n};\n\n/**\n * Fetch command mapper.\n *\n * Semantic: fetch source:\"/api/data\" responseType:json method:GET\n * AST: { name: 'fetch', args: [\"/api/data\"], modifiers: { as: json, with: GET } }\n */\nconst fetchMapper: CommandMapper = {\n action: 'fetch',\n toAST(node, _builder) {\n const source = convertRoleValue(node, 'source'); // URL\n const method = convertRoleValue(node, 'method'); // GET, POST, etc.\n const responseType = convertRoleValue(node, 'responseType'); // json, text, etc.\n const patient = convertRoleValue(node, 'patient'); // Body\n\n const args: ExpressionNode[] = source ? [source] : [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (method) modifiers['with'] = method;\n if (responseType) modifiers['as'] = responseType;\n if (patient) modifiers['body'] = patient;\n\n return createCommandNode('fetch', args, modifiers, { isBlocking: true });\n },\n};\n\n/**\n * Append command mapper.\n *\n * Semantic: append patient:\"text\" destination:#output\n * AST: { name: 'append', args: [\"text\"], modifiers: { to: #output } }\n */\nconst appendMapper: CommandMapper = {\n action: 'append',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient');\n const destination = convertRoleValue(node, 'destination');\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (destination) modifiers['to'] = destination;\n\n return createCommandNode('append', args, modifiers);\n },\n};\n\n/**\n * Prepend command mapper.\n *\n * Semantic: prepend patient:\"text\" destination:#output\n * AST: { name: 'prepend', args: [\"text\"], modifiers: { to: #output } }\n */\nconst prependMapper: CommandMapper = {\n action: 'prepend',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient');\n const destination = convertRoleValue(node, 'destination');\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (destination) modifiers['to'] = destination;\n\n return createCommandNode('prepend', args, modifiers);\n },\n};\n\n/**\n * Trigger command mapper.\n *\n * Semantic: trigger event:click destination:#button\n * AST: { name: 'trigger', args: [click], modifiers: { on: #button } }\n */\nconst triggerMapper: CommandMapper = {\n action: 'trigger',\n toAST(node, _builder) {\n const event = convertRoleValue(node, 'event');\n const destination = convertRoleValue(node, 'destination');\n\n const args: ExpressionNode[] = event ? [event] : [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (destination) modifiers['on'] = destination;\n\n return createCommandNode('trigger', args, modifiers);\n },\n};\n\n/**\n * Send command mapper.\n *\n * Semantic: send event:customEvent destination:#target patient:{detail}\n * AST: { name: 'send', args: [customEvent], modifiers: { to: #target, detail: ... } }\n */\nconst sendMapper: CommandMapper = {\n action: 'send',\n toAST(node, _builder) {\n const event = convertRoleValue(node, 'event');\n const destination = convertRoleValue(node, 'destination');\n const patient = convertRoleValue(node, 'patient');\n\n const args: ExpressionNode[] = event ? [event] : [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (destination) modifiers['to'] = destination;\n if (patient) modifiers['detail'] = patient;\n\n return createCommandNode('send', args, modifiers);\n },\n};\n\n/**\n * Go command mapper (navigation).\n *\n * Semantic: go source:/page destination:url\n * AST: { name: 'go', args: [/page], modifiers: { to: url } }\n */\nconst goMapper: CommandMapper = {\n action: 'go',\n toAST(node, _builder) {\n const source = convertRoleValue(node, 'source');\n const destination = convertRoleValue(node, 'destination');\n\n const args: ExpressionNode[] = [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n // Source is the URL/location to navigate to\n if (source) args.push(source);\n if (destination) modifiers['to'] = destination;\n\n return createCommandNode('go', args, modifiers);\n },\n};\n\n/**\n * Transition command mapper.\n *\n * Semantic: transition patient:*background-color goal:'red' duration:500ms destination:#element\n * AST: { name: 'transition', args: [*background-color], modifiers: { to: 'red', over: 500ms, on: #element } }\n */\nconst transitionMapper: CommandMapper = {\n action: 'transition',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient');\n const goal = convertRoleValue(node, 'goal');\n const duration = convertRoleValue(node, 'duration');\n const destination = convertRoleValue(node, 'destination');\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (goal) modifiers['to'] = goal;\n if (duration) modifiers['over'] = duration;\n if (destination) modifiers['on'] = destination;\n\n return createCommandNode('transition', args, modifiers);\n },\n};\n\n/**\n * Focus command mapper.\n *\n * Semantic: focus destination:#input\n * AST: { name: 'focus', args: [], modifiers: { on: #input } }\n */\nconst focusMapper: CommandMapper = {\n action: 'focus',\n toAST(node, _builder) {\n const destination = convertRoleValue(node, 'destination');\n const patient = convertRoleValue(node, 'patient');\n\n const args: ExpressionNode[] = [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n // Target can be in destination or patient\n const target = destination ?? patient;\n if (target) args.push(target);\n\n return createCommandNode('focus', args, modifiers);\n },\n};\n\n/**\n * Blur command mapper.\n *\n * Semantic: blur destination:#input\n * AST: { name: 'blur', args: [#input] }\n */\nconst blurMapper: CommandMapper = {\n action: 'blur',\n toAST(node, _builder) {\n const destination = convertRoleValue(node, 'destination');\n const patient = convertRoleValue(node, 'patient');\n\n const args: ExpressionNode[] = [];\n const target = destination ?? patient;\n if (target) args.push(target);\n\n return createCommandNode('blur', args);\n },\n};\n\n/**\n * Get command mapper.\n *\n * Semantic: get source:myValue\n * AST: { name: 'get', args: [myValue] }\n */\nconst getMapper: CommandMapper = {\n action: 'get',\n toAST(node, _builder) {\n const source = convertRoleValue(node, 'source');\n const patient = convertRoleValue(node, 'patient');\n\n const args: ExpressionNode[] = [];\n const value = source ?? patient;\n if (value) args.push(value);\n\n return createCommandNode('get', args);\n },\n};\n\n/**\n * Take command mapper.\n *\n * Semantic: take patient:.active source:#parent\n * AST: { name: 'take', args: [.active], modifiers: { from: #parent } }\n */\nconst takeMapper: CommandMapper = {\n action: 'take',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient');\n const source = convertRoleValue(node, 'source');\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (source) modifiers['from'] = source;\n\n return createCommandNode('take', args, modifiers);\n },\n};\n\n/**\n * Call command mapper.\n *\n * Semantic: call patient:functionName\n * AST: { name: 'call', args: [functionName] }\n */\nconst callMapper: CommandMapper = {\n action: 'call',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient');\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n\n return createCommandNode('call', args);\n },\n};\n\n/**\n * Return command mapper.\n *\n * Semantic: return patient:value\n * AST: { name: 'return', args: [value] }\n */\nconst returnMapper: CommandMapper = {\n action: 'return',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient');\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n\n return createCommandNode('return', args);\n },\n};\n\n/**\n * Halt command mapper.\n *\n * Semantic: halt\n * AST: { name: 'halt', args: [] }\n */\nconst haltMapper: CommandMapper = {\n action: 'halt',\n toAST(_node, _builder) {\n return createCommandNode('halt', []);\n },\n};\n\n/**\n * Throw command mapper.\n *\n * Semantic: throw patient:\"error message\"\n * AST: { name: 'throw', args: [\"error message\"] }\n */\nconst throwMapper: CommandMapper = {\n action: 'throw',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient');\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n\n return createCommandNode('throw', args);\n },\n};\n\n/**\n * Settle command mapper.\n *\n * Semantic: settle destination:#element\n * AST: { name: 'settle', args: [#element] }\n */\nconst settleMapper: CommandMapper = {\n action: 'settle',\n toAST(node, _builder) {\n const destination = convertRoleValue(node, 'destination');\n const patient = convertRoleValue(node, 'patient');\n\n const args: ExpressionNode[] = [];\n const target = destination ?? patient;\n if (target) args.push(target);\n\n return createCommandNode('settle', args, undefined, { isBlocking: true });\n },\n};\n\n// =============================================================================\n// Tier 3: Advanced Commands\n// =============================================================================\n\n/**\n * Swap command mapper.\n *\n * Semantic: swap patient:innerHTML destination:#element source:\"<p>new</p>\"\n * AST: { name: 'swap', args: [innerHTML, \"<p>new</p>\"], modifiers: { on: #element } }\n */\nconst swapMapper: CommandMapper = {\n action: 'swap',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient'); // What to swap (e.g., innerHTML)\n const source = convertRoleValue(node, 'source'); // New content\n const destination = convertRoleValue(node, 'destination'); // Target element\n const style = convertRoleValue(node, 'style'); // Swap strategy (innerHTML, outerHTML, etc.)\n\n const args: ExpressionNode[] = [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (patient) args.push(patient);\n if (source) args.push(source);\n if (destination) modifiers['on'] = destination;\n if (style) modifiers['with'] = style;\n\n return createCommandNode('swap', args, modifiers);\n },\n};\n\n/**\n * Morph command mapper.\n *\n * Semantic: morph destination:#element source:\"<div>new</div>\"\n * AST: { name: 'morph', args: [\"<div>new</div>\"], modifiers: { on: #element } }\n */\nconst morphMapper: CommandMapper = {\n action: 'morph',\n toAST(node, _builder) {\n const source = convertRoleValue(node, 'source'); // New HTML\n const destination = convertRoleValue(node, 'destination'); // Target element\n const patient = convertRoleValue(node, 'patient');\n\n const args: ExpressionNode[] = [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n const content = source ?? patient;\n if (content) args.push(content);\n if (destination) modifiers['on'] = destination;\n\n return createCommandNode('morph', args, modifiers);\n },\n};\n\n/**\n * Clone command mapper.\n *\n * Semantic: clone source:#template destination:#container\n * AST: { name: 'clone', args: [#template], modifiers: { into: #container } }\n */\nconst cloneMapper: CommandMapper = {\n action: 'clone',\n toAST(node, _builder) {\n const source = convertRoleValue(node, 'source'); // Element to clone\n const destination = convertRoleValue(node, 'destination'); // Where to put clone\n const patient = convertRoleValue(node, 'patient');\n\n const args: ExpressionNode[] = [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n const target = source ?? patient;\n if (target) args.push(target);\n if (destination) modifiers['into'] = destination;\n\n return createCommandNode('clone', args, modifiers);\n },\n};\n\n/**\n * Make command mapper.\n *\n * Semantic: make patient:Date\n * AST: { name: 'make', args: [Date] }\n */\nconst makeMapper: CommandMapper = {\n action: 'make',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient'); // Constructor/type\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n\n return createCommandNode('make', args);\n },\n};\n\n/**\n * Measure command mapper.\n *\n * Semantic: measure destination:#element patient:width\n * AST: { name: 'measure', args: [width], modifiers: { of: #element } }\n */\nconst measureMapper: CommandMapper = {\n action: 'measure',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient'); // What to measure\n const destination = convertRoleValue(node, 'destination'); // Element\n const source = convertRoleValue(node, 'source');\n\n const args: ExpressionNode[] = [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (patient) args.push(patient);\n const element = destination ?? source;\n if (element) modifiers['of'] = element;\n\n return createCommandNode('measure', args, modifiers);\n },\n};\n\n/**\n * Tell command mapper.\n *\n * Semantic: tell destination:#element\n * AST: { name: 'tell', args: [#element] }\n */\nconst tellMapper: CommandMapper = {\n action: 'tell',\n toAST(node, _builder) {\n const destination = convertRoleValue(node, 'destination');\n const patient = convertRoleValue(node, 'patient');\n\n const args: ExpressionNode[] = [];\n const target = destination ?? patient;\n if (target) args.push(target);\n\n return createCommandNode('tell', args);\n },\n};\n\n/**\n * JS command mapper (inline JavaScript).\n *\n * Semantic: js patient:\"console.log('hello')\"\n * AST: { name: 'js', args: [\"console.log('hello')\"] }\n */\nconst jsMapper: CommandMapper = {\n action: 'js',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient'); // JS code\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n\n return createCommandNode('js', args);\n },\n};\n\n/**\n * Async command mapper.\n *\n * Semantic: async\n * AST: { name: 'async', args: [] }\n */\nconst asyncMapper: CommandMapper = {\n action: 'async',\n toAST(_node, _builder) {\n return createCommandNode('async', []);\n },\n};\n\n/**\n * If command mapper.\n *\n * Semantic: if condition:x > 5\n * AST: { name: 'if', args: [], modifiers: { condition: x > 5 } }\n */\nconst ifMapper: CommandMapper = {\n action: 'if',\n toAST(node, _builder) {\n const condition = convertRoleValue(node, 'condition');\n\n const args: ExpressionNode[] = condition ? [condition] : [];\n\n return createCommandNode('if', args);\n },\n};\n\n/**\n * Unless command mapper.\n *\n * Semantic: unless condition:x < 5\n * AST: { name: 'unless', args: [x < 5] }\n */\nconst unlessMapper: CommandMapper = {\n action: 'unless',\n toAST(node, _builder) {\n const condition = convertRoleValue(node, 'condition');\n\n const args: ExpressionNode[] = condition ? [condition] : [];\n\n return createCommandNode('unless', args);\n },\n};\n\n/**\n * Repeat command mapper.\n *\n * Semantic: repeat quantity:5\n * AST: { name: 'repeat', args: [5] }\n */\nconst repeatMapper: CommandMapper = {\n action: 'repeat',\n toAST(node, _builder) {\n const quantity = convertRoleValue(node, 'quantity');\n const patient = convertRoleValue(node, 'patient');\n\n const args: ExpressionNode[] = [];\n const count = quantity ?? patient;\n if (count) args.push(count);\n\n return createCommandNode('repeat', args);\n },\n};\n\n/**\n * For command mapper.\n *\n * Semantic: for patient:item source:items\n * AST: { name: 'for', args: [item], modifiers: { in: items } }\n */\nconst forMapper: CommandMapper = {\n action: 'for',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient'); // Loop variable\n const source = convertRoleValue(node, 'source'); // Collection\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (source) modifiers['in'] = source;\n\n return createCommandNode('for', args, modifiers);\n },\n};\n\n/**\n * While command mapper.\n *\n * Semantic: while condition:x < 10\n * AST: { name: 'while', args: [x < 10] }\n */\nconst whileMapper: CommandMapper = {\n action: 'while',\n toAST(node, _builder) {\n const condition = convertRoleValue(node, 'condition');\n\n const args: ExpressionNode[] = condition ? [condition] : [];\n\n return createCommandNode('while', args);\n },\n};\n\n/**\n * Continue command mapper.\n *\n * Semantic: continue\n * AST: { name: 'continue', args: [] }\n */\nconst continueMapper: CommandMapper = {\n action: 'continue',\n toAST(_node, _builder) {\n return createCommandNode('continue', []);\n },\n};\n\n/**\n * Default command mapper.\n *\n * Semantic: default patient:myVar source:0\n * AST: { name: 'default', args: [myVar], modifiers: { to: 0 } }\n */\nconst defaultMapper: CommandMapper = {\n action: 'default',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient'); // Variable\n const source = convertRoleValue(node, 'source'); // Default value\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (source) modifiers['to'] = source;\n\n return createCommandNode('default', args, modifiers);\n },\n};\n\n/**\n * Init command mapper.\n *\n * Semantic: init\n * AST: { name: 'init', args: [] }\n */\nconst initMapper: CommandMapper = {\n action: 'init',\n toAST(_node, _builder) {\n return createCommandNode('init', []);\n },\n};\n\n/**\n * Behavior command mapper.\n *\n * Semantic: behavior patient:MyBehavior\n * AST: { name: 'behavior', args: [MyBehavior] }\n */\nconst behaviorMapper: CommandMapper = {\n action: 'behavior',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient'); // Behavior name\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n\n return createCommandNode('behavior', args);\n },\n};\n\n/**\n * Install command mapper.\n *\n * Semantic: install patient:MyBehavior destination:#element\n * AST: { name: 'install', args: [MyBehavior], modifiers: { on: #element } }\n */\nconst installMapper: CommandMapper = {\n action: 'install',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient'); // Behavior to install\n const destination = convertRoleValue(node, 'destination'); // Target element\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (destination) modifiers['on'] = destination;\n\n return createCommandNode('install', args, modifiers);\n },\n};\n\n/**\n * On command mapper (event handler declaration).\n *\n * Semantic: on event:click\n * AST: { name: 'on', args: [click] }\n */\nconst onMapper: CommandMapper = {\n action: 'on',\n toAST(node, _builder) {\n const event = convertRoleValue(node, 'event');\n const source = convertRoleValue(node, 'source'); // 'from' clause\n\n const args: ExpressionNode[] = event ? [event] : [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (source) modifiers['from'] = source;\n\n return createCommandNode('on', args, modifiers);\n },\n};\n\n// =============================================================================\n// Mapper Registry\n// =============================================================================\n\nconst mappers: Map<ActionType, CommandMapper> = new Map([\n // Tier 1: Core commands\n ['toggle', toggleMapper],\n ['add', addMapper],\n ['remove', removeMapper],\n ['set', setMapper],\n ['show', showMapper],\n ['hide', hideMapper],\n ['increment', incrementMapper],\n ['decrement', decrementMapper],\n ['wait', waitMapper],\n ['log', logMapper],\n ['put', putMapper],\n ['fetch', fetchMapper],\n // Tier 2: Content manipulation\n ['append', appendMapper],\n ['prepend', prependMapper],\n ['get', getMapper],\n ['take', takeMapper],\n // Tier 2: Events\n ['trigger', triggerMapper],\n ['send', sendMapper],\n ['on', onMapper],\n // Tier 2: Navigation & DOM\n ['go', goMapper],\n ['transition', transitionMapper],\n ['focus', focusMapper],\n ['blur', blurMapper],\n // Tier 2: Control flow\n ['call', callMapper],\n ['return', returnMapper],\n ['halt', haltMapper],\n ['throw', throwMapper],\n ['settle', settleMapper],\n // Tier 3: Advanced DOM\n ['swap', swapMapper],\n ['morph', morphMapper],\n ['clone', cloneMapper],\n ['measure', measureMapper],\n // Tier 3: Object/Types\n ['make', makeMapper],\n ['tell', tellMapper],\n ['default', defaultMapper],\n // Tier 3: JavaScript integration\n ['js', jsMapper],\n ['async', asyncMapper],\n // Tier 3: Conditionals\n ['if', ifMapper],\n ['unless', unlessMapper],\n // Tier 3: Loops\n ['repeat', repeatMapper],\n ['for', forMapper],\n ['while', whileMapper],\n ['continue', continueMapper],\n // Tier 3: Behaviors\n ['init', initMapper],\n ['behavior', behaviorMapper],\n ['install', installMapper],\n]);\n\n/**\n * Get the command mapper for an action type.\n *\n * @param action - The action type\n * @returns The mapper, or undefined if no specific mapper exists\n */\nexport function getCommandMapper(action: ActionType): CommandMapper | undefined {\n return mappers.get(action);\n}\n\n/**\n * Register a custom command mapper.\n *\n * @param mapper - The command mapper to register\n */\nexport function registerCommandMapper(mapper: CommandMapper): void {\n mappers.set(mapper.action, mapper);\n}\n\n/**\n * Get all registered command mappers.\n */\nexport function getRegisteredMappers(): Map<ActionType, CommandMapper> {\n return new Map(mappers);\n}\n","/**\n * Semantic to AST Builder\n *\n * Converts SemanticNodes directly to AST nodes, bypassing the English text\n * generation and re-parsing step.\n *\n * Flow:\n * Japanese → Semantic Parser → SemanticNode → AST Builder → AST\n *\n * Instead of:\n * Japanese → Semantic Parser → SemanticNode → English Text → Parser → AST\n */\n\nimport type {\n SemanticNode,\n CommandSemanticNode,\n EventHandlerSemanticNode,\n ConditionalSemanticNode,\n CompoundSemanticNode,\n LoopSemanticNode,\n SemanticRole,\n} from '../types';\n\nimport { convertValue } from './value-converters';\nimport { getCommandMapper, type CommandMapperResult } from './command-mappers';\nimport type { ExpressionNode } from './expression-parser';\n\n// =============================================================================\n// AST Types (compatible with @lokascript/core)\n// =============================================================================\n\n/**\n * Base AST node interface\n */\nexport interface ASTNode {\n readonly type: string;\n readonly start?: number;\n readonly end?: number;\n readonly line?: number;\n readonly column?: number;\n [key: string]: unknown;\n}\n\n/**\n * Command AST node\n */\nexport interface CommandNode extends ASTNode {\n readonly type: 'command';\n readonly name: string;\n readonly args: ExpressionNode[];\n readonly modifiers?: Record<string, ExpressionNode>;\n readonly isBlocking?: boolean;\n readonly implicitTarget?: ExpressionNode;\n}\n\n/**\n * Event handler AST node (compatible with @lokascript/core)\n */\nexport interface EventHandlerNode extends ASTNode {\n readonly type: 'eventHandler';\n /** Primary event name */\n readonly event: string;\n /** All event names when using \"on event1 or event2\" syntax */\n readonly events?: string[];\n /** CSS selector for event delegation (\"from\" keyword) */\n readonly selector?: string;\n /** Target for \"from\" clause (as string or expression) */\n readonly target?: string;\n /** Optional event condition (\"[condition]\" syntax) */\n readonly condition?: ASTNode;\n /** Attribute name for mutation events (\"of @attribute\" syntax) */\n readonly attributeName?: string;\n /** Target element to watch for changes (\"in <target>\" syntax) */\n readonly watchTarget?: ExpressionNode;\n /** Event parameter names to destructure (e.g., ['clientX', 'clientY']) */\n readonly args?: string[];\n /** Event parameters (alias for args) */\n readonly params?: string[];\n /** Handler commands */\n readonly commands: ASTNode[];\n}\n\n/**\n * Conditional AST node (if/else)\n *\n * Note: For runtime compatibility, buildConditional() now produces a CommandNode\n * with condition and branches as args, matching what IfCommand expects.\n * This interface is retained for reference but not used as output.\n */\nexport interface ConditionalNode extends ASTNode {\n readonly type: 'if';\n readonly condition: ExpressionNode;\n readonly thenBranch: ASTNode[];\n readonly elseBranch?: ASTNode[];\n}\n\n/**\n * Command sequence node (runtime-compatible format for chained commands)\n */\nexport interface CommandSequenceNode extends ASTNode {\n readonly type: 'CommandSequence';\n /** Commands in the sequence */\n readonly commands: ASTNode[];\n}\n\n/**\n * Block node (for grouping commands)\n */\nexport interface BlockNode extends ASTNode {\n readonly type: 'block';\n readonly commands: ASTNode[];\n}\n\n// =============================================================================\n// AST Builder\n// =============================================================================\n\nexport interface ASTBuilderOptions {\n /**\n * Fallback function to parse complex expressions that can't be handled\n * directly by the AST builder. Uses the expression-parser by default.\n */\n parseExpression?: (input: string) => ExpressionNode | null;\n}\n\n/**\n * Builds AST nodes directly from SemanticNodes.\n */\nexport class ASTBuilder {\n /**\n * Warnings collected during AST building (e.g., type inference issues).\n */\n public warnings: string[] = [];\n\n constructor(_options: ASTBuilderOptions = {}) {\n // Options reserved for future use (e.g., custom expression parser)\n }\n\n /**\n * Build an AST from a SemanticNode.\n *\n * @param node - The semantic node to convert\n * @returns The corresponding AST node\n */\n build(node: SemanticNode): ASTNode {\n switch (node.kind) {\n case 'command':\n return this.buildCommand(node as CommandSemanticNode);\n case 'event-handler':\n return this.buildEventHandler(node as EventHandlerSemanticNode);\n case 'conditional':\n return this.buildConditional(node as ConditionalSemanticNode);\n case 'compound':\n return this.buildCompound(node as CompoundSemanticNode);\n case 'loop':\n return this.buildLoop(node as LoopSemanticNode);\n default:\n throw new Error(`Unknown semantic node kind: ${(node as SemanticNode).kind}`);\n }\n }\n\n /**\n * Build a CommandNode from a CommandSemanticNode.\n */\n private buildCommand(node: CommandSemanticNode): CommandNode {\n const mapper = getCommandMapper(node.action);\n\n if (mapper) {\n // Use command-specific mapper\n const result = mapper.toAST(node, this);\n\n // Handle both new CommandMapperResult format and legacy CommandNode format\n if ('ast' in result && 'warnings' in result) {\n // New format with warnings\n const mapperResult = result as CommandMapperResult;\n this.warnings.push(...mapperResult.warnings);\n return mapperResult.ast;\n } else {\n // Legacy format (just CommandNode)\n return result as CommandNode;\n }\n }\n\n // Fallback: generic command mapping\n return this.buildGenericCommand(node);\n }\n\n /**\n * Generic command builder when no specific mapper is available.\n * Maps roles to args in a predictable order.\n */\n private buildGenericCommand(node: CommandSemanticNode): CommandNode {\n const args: ExpressionNode[] = [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n // Standard role-to-position mapping\n // Note: Using only valid SemanticRoles from the type definition\n const argRoles: SemanticRole[] = ['patient', 'source', 'quantity'];\n const modifierRoles: SemanticRole[] = ['destination', 'duration', 'method', 'style'];\n\n // Convert argument roles\n for (const role of argRoles) {\n const value = node.roles.get(role);\n if (value) {\n args.push(convertValue(value));\n }\n }\n\n // Convert modifier roles\n for (const role of modifierRoles) {\n const value = node.roles.get(role);\n if (value) {\n // Map semantic roles to hyperscript modifier keywords\n const modifierKey = this.roleToModifierKey(role);\n modifiers[modifierKey] = convertValue(value);\n }\n }\n\n const result: CommandNode = {\n type: 'command',\n name: node.action,\n args,\n };\n\n // Only add modifiers if there are any (avoid exactOptionalPropertyTypes issue)\n if (Object.keys(modifiers).length > 0) {\n return { ...result, modifiers };\n }\n\n return result;\n }\n\n /**\n * Map semantic roles to hyperscript modifier keywords.\n */\n private roleToModifierKey(role: SemanticRole): string {\n const mapping: Partial<Record<SemanticRole, string>> = {\n destination: 'on',\n duration: 'for',\n source: 'from',\n condition: 'if',\n method: 'via',\n style: 'with',\n };\n return mapping[role] ?? role;\n }\n\n /**\n * Build an EventHandlerNode from an EventHandlerSemanticNode.\n */\n private buildEventHandler(node: EventHandlerSemanticNode): EventHandlerNode {\n // Extract event name(s)\n const eventValue = node.roles.get('event');\n let event: string;\n let events: string[] | undefined;\n\n if (eventValue?.type === 'literal') {\n const eventStr = String(eventValue.value);\n // Handle \"click or keydown\" syntax\n if (eventStr.includes('|') || eventStr.includes(' or ')) {\n events = eventStr.split(/\\s+or\\s+|\\|/).map(e => e.trim());\n event = events[0];\n } else {\n event = eventStr;\n }\n } else if (eventValue?.type === 'reference') {\n event = eventValue.value;\n } else {\n event = 'click'; // Default event\n }\n\n // Build body commands recursively\n const commands = node.body.map(child => this.build(child));\n\n // Get selector/target from 'source' role if present\n const fromValue = node.roles.get('source');\n let selector: string | undefined;\n let target: string | undefined;\n\n if (fromValue?.type === 'selector') {\n selector = fromValue.value;\n target = fromValue.value;\n } else if (fromValue?.type === 'reference') {\n target = fromValue.value;\n } else if (fromValue?.type === 'literal') {\n target = String(fromValue.value);\n }\n\n // Get condition from 'condition' role if present\n const conditionValue = node.roles.get('condition');\n const condition = conditionValue ? convertValue(conditionValue) : undefined;\n\n // Get destination (watchTarget) if present\n const destinationValue = node.roles.get('destination');\n const watchTarget = destinationValue ? convertValue(destinationValue) : undefined;\n\n // Extract event modifiers\n const modifiers = node.eventModifiers;\n\n // Handle queue modifier (debounce, throttle, etc. are runtime concerns)\n let finalSelector = selector;\n if (modifiers?.from) {\n const fromMod = modifiers.from;\n if (fromMod.type === 'selector' && !selector) {\n finalSelector = fromMod.value;\n }\n }\n\n // Extract event parameter names for destructuring (e.g., on click(clientX, clientY))\n const args = node.parameterNames ? [...node.parameterNames] : undefined;\n\n // Build result with spread for optional properties (exactOptionalPropertyTypes compliant)\n return {\n type: 'eventHandler' as const,\n event,\n commands,\n ...(events && events.length > 1 ? { events } : {}),\n ...(finalSelector ? { selector: finalSelector } : {}),\n ...(target ? { target } : {}),\n ...(condition ? { condition: condition as ASTNode } : {}),\n ...(watchTarget ? { watchTarget } : {}),\n ...(args && args.length > 0 ? { args, params: args } : {}),\n };\n }\n\n /**\n * Build a CommandNode from a ConditionalSemanticNode.\n *\n * Produces a command node with:\n * - args[0]: condition expression\n * - args[1]: then block (wrapped in { type: 'block', commands: [...] })\n * - args[2]: else block (optional, same format)\n *\n * This format matches what IfCommand.parseInput() expects.\n */\n private buildConditional(node: ConditionalSemanticNode): CommandNode {\n const conditionValue = node.roles.get('condition');\n if (!conditionValue) {\n throw new Error('Conditional node missing condition');\n }\n\n const condition = convertValue(conditionValue);\n const thenBranch = node.thenBranch.map(child => this.build(child));\n const elseBranch = node.elseBranch?.map(child => this.build(child));\n\n // Build args array matching IfCommand expected format\n const args: ExpressionNode[] = [\n condition,\n // args[1]: then block wrapped as block node\n {\n type: 'block',\n commands: thenBranch,\n } as unknown as ExpressionNode,\n ];\n\n // args[2]: else block (if present)\n if (elseBranch && elseBranch.length > 0) {\n args.push({\n type: 'block',\n commands: elseBranch,\n } as unknown as ExpressionNode);\n }\n\n return {\n type: 'command',\n name: 'if',\n args,\n };\n }\n\n /**\n * Build AST nodes from a CompoundSemanticNode.\n *\n * Converts to CommandSequence for runtime compatibility.\n * The runtime recognizes 'CommandSequence' type and executes commands in order.\n */\n private buildCompound(node: CompoundSemanticNode): ASTNode {\n // Build all statements recursively\n const statements = node.statements.map(child => this.build(child));\n\n // Single statement: unwrap and return directly\n if (statements.length === 1) {\n return statements[0];\n }\n\n // Empty: return a no-op block\n if (statements.length === 0) {\n return {\n type: 'block',\n commands: [],\n };\n }\n\n // Convert to CommandSequence for runtime compatibility\n // Runtime handles 'CommandSequence' type in executeCommandSequence()\n const result: CommandSequenceNode = {\n type: 'CommandSequence',\n commands: statements,\n };\n\n return result;\n }\n\n /**\n * Build a CommandNode from a LoopSemanticNode.\n *\n * Produces a 'repeat' command with:\n * - args[0]: loop type identifier (forever, times, for, while, until)\n * - args[1]: count/condition/variable depending on loop type\n * - args[2]: collection (for 'for' loops)\n * - args[last]: body block\n *\n * This format matches what the repeat command parser produces.\n */\n private buildLoop(node: LoopSemanticNode): CommandNode {\n // Build body commands recursively\n const bodyCommands = node.body.map(child => this.build(child));\n\n const args: ExpressionNode[] = [\n // args[0]: loop type identifier\n {\n type: 'identifier',\n name: node.loopVariant,\n } as unknown as ExpressionNode,\n ];\n\n // Add loop-specific arguments based on variant\n switch (node.loopVariant) {\n case 'times': {\n // args[1]: count expression\n const quantity = node.roles.get('quantity');\n if (quantity) {\n args.push(convertValue(quantity));\n }\n break;\n }\n case 'for': {\n // args[1]: loop variable name\n if (node.loopVariable) {\n args.push({\n type: 'string',\n value: node.loopVariable,\n } as unknown as ExpressionNode);\n }\n // args[2]: collection/source\n const source = node.roles.get('source');\n if (source) {\n args.push(convertValue(source));\n }\n break;\n }\n case 'while':\n case 'until': {\n // args[1]: condition expression\n const condition = node.roles.get('condition');\n if (condition) {\n args.push(convertValue(condition));\n }\n break;\n }\n case 'forever':\n // No additional args needed for forever loops\n break;\n }\n\n // args[last]: body block\n args.push({\n type: 'block',\n commands: bodyCommands,\n } as unknown as ExpressionNode);\n\n return {\n type: 'command',\n name: 'repeat',\n args,\n };\n }\n\n /**\n * Build a BlockNode from an array of semantic nodes.\n * Useful for grouping commands in if/else branches.\n */\n buildBlock(nodes: SemanticNode[]): BlockNode {\n const commands = nodes.map(child => this.build(child));\n return {\n type: 'block',\n commands,\n };\n }\n}\n\n// =============================================================================\n// Convenience Function\n// =============================================================================\n\n/**\n * Result from building an AST, including any warnings.\n */\nexport interface BuildASTResult {\n ast: ASTNode;\n warnings: string[];\n}\n\n/**\n * Build an AST from a SemanticNode using default options.\n *\n * @param node - The semantic node to convert\n * @returns The corresponding AST node and any warnings\n */\nexport function buildAST(node: SemanticNode): BuildASTResult {\n const builder = new ASTBuilder();\n const ast = builder.build(node);\n return {\n ast,\n warnings: builder.warnings,\n };\n}\n\n// Re-exports from value-converters\nexport {\n convertValue,\n convertLiteral,\n convertSelector,\n convertReference,\n convertPropertyPath,\n convertExpression,\n} from './value-converters';\n\n// Re-exports from command-mappers\nexport {\n getCommandMapper,\n registerCommandMapper,\n getRegisteredMappers,\n type CommandMapper,\n type CommandMapperResult,\n} from './command-mappers';\n"],"mappings":"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","names":["num","getTokenizer","getTokenizer","tokenize","tokenize","createCommandNode"]}
1
+ {"version":3,"sources":["../src/generators/schema-error-codes.ts","../src/generators/schema-validator.ts","../src/types.ts","../src/parser/utils/type-validation.ts","../src/parser/utils/possessive-keywords.ts","../src/registry.ts","../src/parser/pattern-matcher.ts","../src/tokenizers/token-utils.ts","../src/tokenizers/index.ts","../src/patterns/event-handler/shared.ts","../src/explicit/renderer.ts","../src/explicit/parser.ts","../src/parser/semantic-parser.ts","../src/cache/semantic-cache.ts","../src/core-bridge.ts","../src/ast-builder/expression-parser/tokenizer.ts","../src/ast-builder/expression-parser/parser.ts","../src/ast-builder/value-converters.ts","../src/ast-builder/command-mappers.ts","../src/ast-builder/index.ts","../src/explicit/converter.ts","../src/generators/command-schemas.ts","../src/parser/utils/role-positioning.ts","../src/parser/utils/marker-resolution.ts","../src/generators/event-handlers-sov.ts","../src/generators/event-handlers-vso.ts","../src/generators/pattern-generator.ts"],"sourcesContent":["/**\n * Schema Error Codes\n *\n * Provides machine-readable error codes for schema validation.\n * These codes enable LLMs and tooling to programmatically identify\n * and respond to specific validation issues.\n */\n\nimport type { SemanticRole } from '../types';\n\n/**\n * Severity levels for schema validation items.\n */\nexport type SchemaValidationSeverity = 'error' | 'warning' | 'note';\n\n/**\n * A structured validation item with machine-readable code.\n */\nexport interface SchemaValidationItem {\n /** Machine-readable error code */\n code: string;\n /** Human-readable message */\n message: string;\n /** Severity level */\n severity: SchemaValidationSeverity;\n /** Affected role, if applicable */\n role?: SemanticRole;\n /** Suggested fix */\n suggestion?: string;\n}\n\n/**\n * Schema error codes organized by category.\n */\nexport const SchemaErrorCodes = {\n // Type ambiguity issues\n AMBIGUOUS_TYPE_LITERAL_SELECTOR: 'SCHEMA_AMBIGUOUS_TYPE_LITERAL_SELECTOR',\n TOO_MANY_EXPECTED_TYPES: 'SCHEMA_TOO_MANY_EXPECTED_TYPES',\n MULTI_TYPE_PATIENT_EXPECTED: 'SCHEMA_MULTI_TYPE_PATIENT_EXPECTED',\n\n // Role issues\n NO_REQUIRED_ROLES: 'SCHEMA_NO_REQUIRED_ROLES',\n NO_REQUIRED_ROLES_EXPECTED: 'SCHEMA_NO_REQUIRED_ROLES_EXPECTED',\n\n // Transition command\n TRANSITION_PATIENT_ACCEPTS_SELECTOR: 'SCHEMA_TRANSITION_PATIENT_ACCEPTS_SELECTOR',\n TRANSITION_MISSING_GOAL: 'SCHEMA_TRANSITION_MISSING_GOAL',\n\n // Event handler command\n EVENT_HANDLER_MISSING_EVENT: 'SCHEMA_EVENT_HANDLER_MISSING_EVENT',\n EVENT_HANDLER_EVENT_NOT_REQUIRED: 'SCHEMA_EVENT_HANDLER_EVENT_NOT_REQUIRED',\n\n // Conditional commands\n CONDITIONAL_MISSING_CONDITION: 'SCHEMA_CONDITIONAL_MISSING_CONDITION',\n CONDITIONAL_CONDITION_NOT_REQUIRED: 'SCHEMA_CONDITIONAL_CONDITION_NOT_REQUIRED',\n\n // Loop commands\n FOR_LOOP_MISSING_SOURCE: 'SCHEMA_FOR_LOOP_MISSING_SOURCE',\n WHILE_LOOP_MISSING_CONDITION: 'SCHEMA_WHILE_LOOP_MISSING_CONDITION',\n} as const;\n\nexport type SchemaErrorCode = (typeof SchemaErrorCodes)[keyof typeof SchemaErrorCodes];\n\n/**\n * Message templates for each error code.\n * Use {role}, {command}, {count} placeholders for dynamic values.\n */\nexport const SchemaErrorMessages: Record<SchemaErrorCode, string> = {\n // Type ambiguity\n [SchemaErrorCodes.AMBIGUOUS_TYPE_LITERAL_SELECTOR]:\n \"Role '{role}' accepts both 'literal' and 'selector'. This may cause ambiguous type inference for values starting with special characters (* . # etc.).\",\n [SchemaErrorCodes.TOO_MANY_EXPECTED_TYPES]:\n \"Role '{role}' accepts {count} different types. This may make type inference unreliable.\",\n [SchemaErrorCodes.MULTI_TYPE_PATIENT_EXPECTED]:\n \"Role '{role}' accepts multiple types (expected for {command} command).\",\n\n // Role issues\n [SchemaErrorCodes.NO_REQUIRED_ROLES]: 'Command has no required roles. Is this intentional?',\n [SchemaErrorCodes.NO_REQUIRED_ROLES_EXPECTED]:\n 'Command has no required roles (expected for {command}).',\n\n // Transition\n [SchemaErrorCodes.TRANSITION_PATIENT_ACCEPTS_SELECTOR]:\n \"Transition command 'patient' role (CSS property name) should only accept 'literal', not 'selector'. CSS property names like 'background-color' are strings, not CSS selectors.\",\n [SchemaErrorCodes.TRANSITION_MISSING_GOAL]:\n \"Transition command requires a 'goal' role for the target value (to <value>). Without it, there's no way to specify what value to transition to.\",\n\n // Event handler\n [SchemaErrorCodes.EVENT_HANDLER_MISSING_EVENT]:\n \"Event handler command should have an 'event' role to specify which event to listen for.\",\n [SchemaErrorCodes.EVENT_HANDLER_EVENT_NOT_REQUIRED]:\n 'Event role should be required - every event handler needs an event to listen for.',\n\n // Conditionals\n [SchemaErrorCodes.CONDITIONAL_MISSING_CONDITION]:\n \"Conditional command should have a 'condition' role for the boolean expression.\",\n [SchemaErrorCodes.CONDITIONAL_CONDITION_NOT_REQUIRED]:\n 'Condition role should be required - conditionals need a condition to evaluate.',\n\n // Loops\n [SchemaErrorCodes.FOR_LOOP_MISSING_SOURCE]:\n \"For-loop should have a 'source' role for the collection to iterate over.\",\n [SchemaErrorCodes.WHILE_LOOP_MISSING_CONDITION]:\n \"While-loop should have a 'condition' role for the loop condition.\",\n};\n\n/**\n * Suggested fixes for each error code.\n */\nexport const SchemaErrorSuggestions: Partial<Record<SchemaErrorCode, string>> = {\n [SchemaErrorCodes.AMBIGUOUS_TYPE_LITERAL_SELECTOR]:\n 'Consider being more specific about which type is expected, or use explicit type markers.',\n [SchemaErrorCodes.TOO_MANY_EXPECTED_TYPES]:\n 'Consider narrowing the accepted types to improve type inference reliability.',\n [SchemaErrorCodes.TRANSITION_PATIENT_ACCEPTS_SELECTOR]:\n \"Remove 'selector' from expectedTypes and only accept 'literal'.\",\n [SchemaErrorCodes.TRANSITION_MISSING_GOAL]:\n \"Add a 'goal' role with expectedTypes ['literal', 'variable'].\",\n [SchemaErrorCodes.EVENT_HANDLER_MISSING_EVENT]:\n \"Add an 'event' role with expectedTypes ['literal'].\",\n [SchemaErrorCodes.EVENT_HANDLER_EVENT_NOT_REQUIRED]: \"Set required: true on the 'event' role.\",\n [SchemaErrorCodes.CONDITIONAL_MISSING_CONDITION]:\n \"Add a 'condition' role with expectedTypes ['expression'].\",\n [SchemaErrorCodes.CONDITIONAL_CONDITION_NOT_REQUIRED]:\n \"Set required: true on the 'condition' role.\",\n [SchemaErrorCodes.FOR_LOOP_MISSING_SOURCE]:\n \"Add a 'source' role for the collection to iterate over.\",\n [SchemaErrorCodes.WHILE_LOOP_MISSING_CONDITION]:\n \"Add a 'condition' role for the loop continuation condition.\",\n};\n\n/**\n * Interpolate placeholders in a message template.\n */\nfunction interpolate(template: string, params: Record<string, string | number>): string {\n return template.replace(/\\{(\\w+)\\}/g, (_, key) => String(params[key] ?? `{${key}}`));\n}\n\n/**\n * Create a schema validation item with proper interpolation.\n */\nexport function createSchemaValidationItem(\n code: SchemaErrorCode,\n severity: SchemaValidationSeverity,\n params: Record<string, string | number> = {},\n role?: SemanticRole\n): SchemaValidationItem {\n const messageTemplate = SchemaErrorMessages[code];\n const message = interpolate(messageTemplate, params);\n const suggestionTemplate = SchemaErrorSuggestions[code];\n const suggestion = suggestionTemplate ? interpolate(suggestionTemplate, params) : undefined;\n\n return {\n code,\n message,\n severity,\n ...(role && { role }),\n ...(suggestion && { suggestion }),\n };\n}\n","/**\n * Schema Validation\n *\n * Validates command schemas to catch design issues early:\n * - Ambiguous type combinations (e.g., both 'literal' and 'selector')\n * - Missing required roles for specific commands\n * - Schema inconsistencies\n *\n * This runs at build time in development to catch schema errors before they cause\n * runtime issues.\n */\n\nimport type { CommandSchema } from './command-schemas';\nimport type { ActionType } from '../types';\nimport {\n type SchemaValidationItem,\n type SchemaValidationSeverity,\n SchemaErrorCodes,\n createSchemaValidationItem,\n} from './schema-error-codes';\n\n// Re-export for convenience\nexport type { SchemaValidationItem, SchemaValidationSeverity };\nexport { SchemaErrorCodes };\n\n/**\n * Result from validating a single command schema.\n *\n * The `items` array contains all validation results with machine-readable codes.\n * For backward compatibility, `notes`, `warnings`, and `errors` getters are provided.\n */\nexport interface SchemaValidation {\n action: ActionType;\n /** All validation items with structured codes and severity */\n items: SchemaValidationItem[];\n}\n\n/**\n * Extended validation result with backward-compatible getters.\n */\nexport interface SchemaValidationResult extends SchemaValidation {\n /** @deprecated Since v1.3.0. Will be removed in v2.0.0. Use items.filter(i => i.severity === 'note') */\n readonly notes: string[];\n /** @deprecated Since v1.3.0. Will be removed in v2.0.0. Use items.filter(i => i.severity === 'warning') */\n readonly warnings: string[];\n /** @deprecated Since v1.3.0. Will be removed in v2.0.0. Use items.filter(i => i.severity === 'error') */\n readonly errors: string[];\n}\n\n/**\n * Create a SchemaValidationResult with backward-compatible getters.\n */\nfunction createValidationResult(\n action: ActionType,\n items: SchemaValidationItem[]\n): SchemaValidationResult {\n return {\n action,\n items,\n get notes() {\n return items.filter(i => i.severity === 'note').map(i => i.message);\n },\n get warnings() {\n return items.filter(i => i.severity === 'warning').map(i => i.message);\n },\n get errors() {\n return items.filter(i => i.severity === 'error').map(i => i.message);\n },\n };\n}\n\n// Commands where multi-type patient roles are intentional (not ambiguous)\nconst MULTI_TYPE_PATIENT_COMMANDS = new Set([\n 'put',\n 'append',\n 'prepend',\n 'log',\n 'throw',\n 'make',\n 'measure',\n 'return',\n 'swap',\n 'morph', // DOM manipulation commands that accept various content types\n 'beep', // Debug command — accepts any expression type\n 'copy', // Clipboard — accepts text literals, selectors, or references\n]);\n\n// Commands that intentionally have no required roles\nconst NO_REQUIRED_ROLES_COMMANDS = new Set([\n 'compound',\n 'else',\n 'halt',\n 'continue',\n 'async',\n 'init',\n 'settle',\n 'focus',\n 'blur',\n 'return',\n 'js',\n 'measure', // Commands with optional-only roles\n 'break', // Zero-arg control flow (exit loop)\n 'exit', // Zero-arg control flow (exit handler)\n 'beep', // Debug command — all roles optional\n]);\n\n/**\n * Validate a single command schema for potential issues.\n *\n * @param schema - The command schema to validate\n * @returns Validation result with structured items and backward-compatible getters\n */\nexport function validateCommandSchema(schema: CommandSchema): SchemaValidationResult {\n const items: SchemaValidationItem[] = [];\n\n // Check for ambiguous type combinations in roles\n for (const role of schema.roles) {\n // Check if a role accepts both 'literal' and 'selector'\n if (role.expectedTypes.includes('literal') && role.expectedTypes.includes('selector')) {\n if (role.role === 'patient' && MULTI_TYPE_PATIENT_COMMANDS.has(schema.action)) {\n // Known pattern - add as note, not warning\n items.push(\n createSchemaValidationItem(\n SchemaErrorCodes.MULTI_TYPE_PATIENT_EXPECTED,\n 'note',\n { role: role.role, command: schema.action },\n role.role\n )\n );\n } else {\n items.push(\n createSchemaValidationItem(\n SchemaErrorCodes.AMBIGUOUS_TYPE_LITERAL_SELECTOR,\n 'warning',\n { role: role.role },\n role.role\n )\n );\n }\n }\n\n // Warn if a role has too many expected types (> 3)\n if (role.expectedTypes.length > 3 && !MULTI_TYPE_PATIENT_COMMANDS.has(schema.action)) {\n items.push(\n createSchemaValidationItem(\n SchemaErrorCodes.TOO_MANY_EXPECTED_TYPES,\n 'warning',\n { role: role.role, count: role.expectedTypes.length },\n role.role\n )\n );\n }\n }\n\n // Command-specific validation rules\n switch (schema.action) {\n case 'transition':\n validateTransitionSchema(schema, items);\n break;\n\n case 'on':\n validateEventHandlerSchema(schema, items);\n break;\n\n case 'if':\n case 'unless':\n validateConditionalSchema(schema, items);\n break;\n\n case 'repeat':\n case 'for':\n case 'while':\n validateLoopSchema(schema, items);\n break;\n }\n\n // Check for schemas with no required roles\n const requiredRoles = schema.roles.filter(r => r.required);\n if (requiredRoles.length === 0) {\n if (NO_REQUIRED_ROLES_COMMANDS.has(schema.action)) {\n // Known pattern - add as note\n items.push(\n createSchemaValidationItem(SchemaErrorCodes.NO_REQUIRED_ROLES_EXPECTED, 'note', {\n command: schema.action,\n })\n );\n } else {\n items.push(createSchemaValidationItem(SchemaErrorCodes.NO_REQUIRED_ROLES, 'warning', {}));\n }\n }\n\n return createValidationResult(schema.action, items);\n}\n\n/**\n * Validate the transition command schema.\n */\nfunction validateTransitionSchema(schema: CommandSchema, items: SchemaValidationItem[]): void {\n const patientRole = schema.roles.find(r => r.role === 'patient');\n const goalRole = schema.roles.find(r => r.role === 'goal');\n\n // Check that patient (property name) only accepts literals\n if (patientRole && patientRole.expectedTypes.includes('selector')) {\n items.push(\n createSchemaValidationItem(\n SchemaErrorCodes.TRANSITION_PATIENT_ACCEPTS_SELECTOR,\n 'warning',\n {},\n 'patient'\n )\n );\n }\n\n // Check that transition has a goal role for the target value\n if (patientRole && !goalRole) {\n items.push(createSchemaValidationItem(SchemaErrorCodes.TRANSITION_MISSING_GOAL, 'error', {}));\n }\n}\n\n/**\n * Validate event handler schemas (on command).\n */\nfunction validateEventHandlerSchema(schema: CommandSchema, items: SchemaValidationItem[]): void {\n const eventRole = schema.roles.find(r => r.role === 'event');\n\n if (!eventRole) {\n items.push(\n createSchemaValidationItem(SchemaErrorCodes.EVENT_HANDLER_MISSING_EVENT, 'warning', {})\n );\n }\n\n if (eventRole && !eventRole.required) {\n items.push(\n createSchemaValidationItem(SchemaErrorCodes.EVENT_HANDLER_EVENT_NOT_REQUIRED, 'warning', {})\n );\n }\n}\n\n/**\n * Validate conditional schemas (if/unless).\n */\nfunction validateConditionalSchema(schema: CommandSchema, items: SchemaValidationItem[]): void {\n const conditionRole = schema.roles.find(r => r.role === 'condition');\n\n if (!conditionRole) {\n items.push(\n createSchemaValidationItem(SchemaErrorCodes.CONDITIONAL_MISSING_CONDITION, 'warning', {})\n );\n }\n\n if (conditionRole && !conditionRole.required) {\n items.push(\n createSchemaValidationItem(SchemaErrorCodes.CONDITIONAL_CONDITION_NOT_REQUIRED, 'warning', {})\n );\n }\n}\n\n/**\n * Validate loop schemas (repeat, for, while).\n */\nfunction validateLoopSchema(schema: CommandSchema, items: SchemaValidationItem[]): void {\n // Different loop types have different requirements\n if (schema.action === 'for') {\n const sourceRole = schema.roles.find(r => r.role === 'source');\n if (!sourceRole) {\n items.push(\n createSchemaValidationItem(SchemaErrorCodes.FOR_LOOP_MISSING_SOURCE, 'warning', {})\n );\n }\n } else if (schema.action === 'while') {\n const conditionRole = schema.roles.find(r => r.role === 'condition');\n if (!conditionRole) {\n items.push(\n createSchemaValidationItem(SchemaErrorCodes.WHILE_LOOP_MISSING_CONDITION, 'warning', {})\n );\n }\n }\n}\n\n/**\n * Validate all command schemas in the registry.\n *\n * @param schemas - Map of action names to command schemas\n * @param options - Validation options\n * @returns Map of action names to validation results (only includes schemas with issues)\n */\nexport function validateAllSchemas(\n schemas: Record<string, CommandSchema>,\n options: { includeNotes?: boolean } = {}\n): Map<string, SchemaValidationResult> {\n const results = new Map<string, SchemaValidationResult>();\n const { includeNotes = false } = options;\n\n for (const [action, schema] of Object.entries(schemas)) {\n const validation = validateCommandSchema(schema);\n\n // Include in results if there are warnings/errors (or notes if requested)\n const hasWarningsOrErrors = validation.items.some(\n i => i.severity === 'warning' || i.severity === 'error'\n );\n const hasNotes = includeNotes && validation.items.some(i => i.severity === 'note');\n\n if (hasWarningsOrErrors || hasNotes) {\n results.set(action, validation);\n }\n }\n\n return results;\n}\n\n/**\n * Format validation results for console output.\n *\n * @param validations - Map of validation results\n * @param options - Formatting options\n * @returns Formatted string for console output\n */\nexport function formatValidationResults(\n validations: Map<string, SchemaValidationResult>,\n options: { showNotes?: boolean; showCodes?: boolean } = {}\n): string {\n const lines: string[] = [];\n const { showNotes = false, showCodes = true } = options;\n\n for (const [action, result] of validations) {\n const errors = result.items.filter(i => i.severity === 'error');\n const warnings = result.items.filter(i => i.severity === 'warning');\n const notes = result.items.filter(i => i.severity === 'note');\n\n if (errors.length > 0) {\n lines.push(` ❌ ${action}:`);\n for (const item of errors) {\n const codeStr = showCodes ? ` [${item.code}]` : '';\n lines.push(` ERROR${codeStr}: ${item.message}`);\n if (item.suggestion) {\n lines.push(` 💡 Suggestion: ${item.suggestion}`);\n }\n }\n }\n\n if (warnings.length > 0) {\n lines.push(` ⚠️ ${action}:`);\n for (const item of warnings) {\n const codeStr = showCodes ? ` [${item.code}]` : '';\n lines.push(` ${codeStr ? `${item.code}: ` : ''}${item.message}`);\n if (item.suggestion) {\n lines.push(` 💡 ${item.suggestion}`);\n }\n }\n }\n\n if (showNotes && notes.length > 0) {\n lines.push(` ℹ️ ${action}:`);\n for (const item of notes) {\n const codeStr = showCodes ? ` [${item.code}]` : '';\n lines.push(` ${codeStr ? `${item.code}: ` : ''}${item.message}`);\n }\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Get validation statistics.\n */\nexport function getValidationStats(validations: Map<string, SchemaValidationResult>): {\n totalCommands: number;\n errors: number;\n warnings: number;\n notes: number;\n byCode: Record<string, number>;\n} {\n let errors = 0;\n let warnings = 0;\n let notes = 0;\n const byCode: Record<string, number> = {};\n\n for (const result of validations.values()) {\n for (const item of result.items) {\n if (item.severity === 'error') errors++;\n else if (item.severity === 'warning') warnings++;\n else if (item.severity === 'note') notes++;\n\n byCode[item.code] = (byCode[item.code] || 0) + 1;\n }\n }\n\n return {\n totalCommands: validations.size,\n errors,\n warnings,\n notes,\n byCode,\n };\n}\n","/**\n * Semantic-First Multilingual Hyperscript Types\n *\n * This module defines the canonical semantic representation that all languages\n * parse to and render from. The semantic layer is language-neutral - it captures\n * the MEANING of hyperscript commands independent of surface syntax.\n */\n\n// Re-export the SemanticRole type from local grammar-types for consistency\nexport type {\n SemanticRole,\n WordOrder,\n AdpositionType,\n MorphologyType,\n GrammaticalMarker,\n LanguageProfile,\n} from './types/grammar-types';\n\nimport type { SemanticRole } from './types/grammar-types';\n\n// =============================================================================\n// Action Types\n// =============================================================================\n\n/**\n * Canonical action names (English-based internally, but not visible to users)\n * These map to hyperscript commands and are used in the semantic AST.\n */\nexport type ActionType =\n // Class/Attribute operations\n | 'toggle'\n | 'add'\n | 'remove'\n // Content operations\n | 'put'\n | 'append'\n | 'prepend'\n | 'take'\n | 'make'\n | 'clone'\n | 'swap'\n | 'morph'\n // Variable operations\n | 'set'\n | 'get'\n | 'increment'\n | 'decrement'\n | 'log'\n | 'copy'\n | 'pick'\n | 'beep'\n // Visibility\n | 'show'\n | 'hide'\n | 'transition'\n // Events\n | 'on'\n | 'trigger'\n | 'send'\n // DOM focus\n | 'focus'\n | 'blur'\n // Navigation\n | 'go'\n // Async\n | 'wait'\n | 'fetch'\n | 'settle'\n // Animation/Measurement\n | 'measure'\n // Behavior system\n | 'install'\n // Control flow\n | 'if'\n | 'unless'\n | 'else'\n | 'repeat'\n | 'for'\n | 'while'\n | 'continue'\n | 'break'\n | 'exit'\n | 'halt'\n | 'throw'\n | 'call'\n | 'return'\n // Templates\n | 'render'\n // Advanced\n | 'js'\n | 'async'\n | 'tell'\n | 'default'\n | 'init'\n | 'behavior'\n // Meta (for compound nodes)\n | 'compound';\n\n// =============================================================================\n// Semantic Values\n// =============================================================================\n\n/**\n * A semantic value represents a typed piece of data in a semantic node.\n * Values are language-neutral - they capture what something IS, not how it's written.\n */\nexport type SemanticValue =\n | LiteralValue\n | SelectorValue\n | ReferenceValue\n | PropertyPathValue\n | ExpressionValue;\n\n/**\n * Expected value types for role tokens.\n * Shared between RoleSpec (command-schemas) and RolePatternToken.\n */\nexport type ExpectedType = SemanticValue['type'];\n\nexport interface LiteralValue {\n readonly type: 'literal';\n readonly value: string | number | boolean;\n readonly dataType?: 'string' | 'number' | 'boolean' | 'duration';\n}\n\nexport interface SelectorValue {\n readonly type: 'selector';\n readonly value: string; // The CSS selector: #id, .class, [attr], etc.\n readonly selectorKind: 'id' | 'class' | 'attribute' | 'element' | 'complex';\n}\n\nexport interface ReferenceValue {\n readonly type: 'reference';\n readonly value: 'me' | 'you' | 'it' | 'result' | 'event' | 'target' | 'body';\n}\n\nexport interface PropertyPathValue {\n readonly type: 'property-path';\n readonly object: SemanticValue;\n readonly property: string;\n}\n\nexport interface ExpressionValue {\n readonly type: 'expression';\n /** Raw expression string for complex expressions that need further parsing */\n readonly raw: string;\n}\n\n// =============================================================================\n// Semantic Nodes\n// =============================================================================\n\n/**\n * Base interface for all semantic nodes.\n * Semantic nodes capture the MEANING of hyperscript constructs.\n */\nexport interface SemanticNode {\n readonly kind: 'command' | 'event-handler' | 'conditional' | 'compound' | 'loop';\n readonly action: ActionType;\n readonly roles: ReadonlyMap<SemanticRole, SemanticValue>;\n readonly metadata?: SemanticMetadata;\n}\n\n/**\n * Metadata about the source of a semantic node.\n * Useful for debugging, error messages, and round-trip conversion.\n */\nexport interface SemanticMetadata {\n readonly sourceLanguage?: string;\n readonly sourceText?: string;\n readonly sourcePosition?: SourcePosition;\n readonly patternId?: string;\n /**\n * Confidence score for the parse (0-1).\n * Higher values indicate more certain matches.\n * - 1.0: Exact match with all roles captured\n * - 0.8-0.99: High confidence with minor uncertainty (stem matching, optional roles)\n * - 0.6-0.8: Medium confidence (morphological normalization, defaults applied)\n * - <0.6: Low confidence (may need fallback to traditional parser)\n */\n readonly confidence?: number;\n}\n\nexport interface SourcePosition {\n readonly start: number;\n readonly end: number;\n readonly line?: number;\n readonly column?: number;\n}\n\n/**\n * A command semantic node - represents a single hyperscript command.\n */\nexport interface CommandSemanticNode extends SemanticNode {\n readonly kind: 'command';\n}\n\n/**\n * An event handler semantic node - represents \"on [event] [commands]\".\n */\nexport interface EventHandlerSemanticNode extends SemanticNode {\n readonly kind: 'event-handler';\n readonly action: 'on';\n readonly body: SemanticNode[];\n readonly eventModifiers?: EventModifiers;\n /**\n * Additional events for multi-event handlers (e.g., \"on click or keydown\").\n * The primary event is in the 'event' role; these are the additional \"or\" events.\n */\n readonly additionalEvents?: readonly SemanticValue[];\n /**\n * Event parameter names for destructuring.\n * E.g., for \"on click(clientX, clientY)\", this would be ['clientX', 'clientY']\n */\n readonly parameterNames?: readonly string[];\n}\n\nexport interface EventModifiers {\n readonly once?: boolean;\n readonly debounce?: number;\n readonly throttle?: number;\n readonly queue?: 'first' | 'last' | 'all' | 'none';\n readonly from?: SemanticValue; // Event source filter\n}\n\n/**\n * A conditional semantic node - represents \"if [condition] then [body] else [body]\".\n */\nexport interface ConditionalSemanticNode extends SemanticNode {\n readonly kind: 'conditional';\n readonly action: 'if';\n readonly thenBranch: SemanticNode[];\n readonly elseBranch?: SemanticNode[];\n}\n\n/**\n * A compound semantic node - represents multiple chained statements.\n */\nexport interface CompoundSemanticNode extends SemanticNode {\n readonly kind: 'compound';\n readonly statements: SemanticNode[];\n readonly chainType: 'then' | 'and' | 'async';\n}\n\n/**\n * Loop variant discriminant for different loop types.\n */\nexport type LoopVariant =\n | 'forever' // repeat forever\n | 'times' // repeat 5 times\n | 'for' // for item in collection\n | 'while' // while condition\n | 'until'; // until condition\n\n/**\n * A loop semantic node - represents repeat/for/while loops.\n */\nexport interface LoopSemanticNode extends SemanticNode {\n readonly kind: 'loop';\n readonly action: 'repeat' | 'for' | 'while';\n /** The type of loop (forever, times, for, while, until) */\n readonly loopVariant: LoopVariant;\n /** Commands to execute in each iteration */\n readonly body: SemanticNode[];\n /** Loop variable name for 'for' loops (e.g., 'item' in 'for item in list') */\n readonly loopVariable?: string;\n /** Index variable name if specified (e.g., 'i' in 'for item with index i') */\n readonly indexVariable?: string;\n}\n\n// =============================================================================\n// Language Patterns\n// =============================================================================\n\n/**\n * A pattern defines how a semantic structure appears in a specific language.\n * Patterns enable bidirectional conversion: parse (natural → semantic) and\n * render (semantic → natural).\n */\nexport interface LanguagePattern {\n /** Unique identifier for this pattern */\n readonly id: string;\n\n /** ISO 639-1 language code */\n readonly language: string;\n\n /** Which command this pattern matches */\n readonly command: ActionType;\n\n /** Priority for disambiguation (higher = checked first) */\n readonly priority: number;\n\n /** The pattern template with role placeholders */\n readonly template: PatternTemplate;\n\n /** Rules for extracting semantic roles from matched tokens */\n readonly extraction: ExtractionRules;\n\n /** Optional constraints on when this pattern applies */\n readonly constraints?: PatternConstraints;\n}\n\n/**\n * A pattern template defines the expected token sequence.\n *\n * Template syntax:\n * - Literal tokens: \"toggle\", \"を\", \"على\"\n * - Role placeholders: {patient}, {target}, {destination}\n * - Optional groups: [on {target}]\n * - Alternatives in extraction (not in template string)\n *\n * Example templates:\n * - English: \"toggle {patient} [on {target}]\"\n * - Japanese: \"{target} の {patient} を 切り替え\"\n * - Arabic: \"بدّل {patient} [على {target}]\"\n */\nexport interface PatternTemplate {\n /** Human-readable template string */\n readonly format: string;\n\n /** Parsed token sequence for matching */\n readonly tokens: PatternToken[];\n}\n\nexport type PatternToken = LiteralPatternToken | RolePatternToken | GroupPatternToken;\n\nexport interface LiteralPatternToken {\n readonly type: 'literal';\n readonly value: string;\n /** Alternative spellings/forms that also match */\n readonly alternatives?: string[];\n}\n\nexport interface RolePatternToken {\n readonly type: 'role';\n readonly role: SemanticRole;\n readonly optional?: boolean;\n /** Expected value types (for validation) */\n readonly expectedTypes?: Array<ExpectedType>;\n}\n\nexport interface GroupPatternToken {\n readonly type: 'group';\n readonly tokens: PatternToken[];\n readonly optional?: boolean;\n}\n\n/**\n * Rules for extracting semantic values from matched tokens.\n */\nexport interface ExtractionRules {\n readonly [role: string]: ExtractionRule;\n}\n\nexport interface ExtractionRule {\n /** Position-based extraction (0-indexed from pattern start) */\n readonly position?: number;\n /** Marker-based extraction (find value after this marker) */\n readonly marker?: string;\n /** Alternative markers that also work */\n readonly markerAlternatives?: string[];\n /** Transform the extracted value */\n readonly transform?: (raw: string) => SemanticValue;\n /** Default value if not found (for optional roles) */\n readonly default?: SemanticValue;\n /** Static value extraction (for event handler wrapped commands) */\n readonly value?: string;\n /** Extract value from a pattern role by name */\n readonly fromRole?: string;\n}\n\n/**\n * Additional constraints on pattern applicability.\n */\nexport interface PatternConstraints {\n /** Required roles that must be present */\n readonly requiredRoles?: SemanticRole[];\n /** Roles that must NOT be present */\n readonly forbiddenRoles?: SemanticRole[];\n /** Valid selector types for the patient role */\n readonly validPatientTypes?: Array<SelectorValue['selectorKind']>;\n /** Pattern IDs this conflicts with */\n readonly conflictsWith?: string[];\n}\n\n// =============================================================================\n// Token Stream (for pattern matching)\n// =============================================================================\n\n/**\n * A token from language-specific tokenization.\n */\nexport interface LanguageToken {\n readonly value: string;\n readonly kind: TokenKind;\n readonly position: SourcePosition;\n /** Normalized form from explicit keyword map (e.g., 切り替え → toggle) */\n readonly normalized?: string;\n /** Morphologically normalized stem (e.g., 切り替えた → 切り替え) */\n readonly stem?: string;\n /** Confidence in the morphological stem (0.0-1.0) */\n readonly stemConfidence?: number;\n /** Additional metadata for specific token types (e.g., event modifier data) */\n readonly metadata?: Record<string, unknown>;\n}\n\nexport type TokenKind =\n | 'keyword' // Command or modifier keyword\n | 'selector' // CSS selector (#id, .class, [attr])\n | 'literal' // String or number literal\n | 'particle' // Grammatical particle (を, に, من)\n | 'conjunction' // Grammatical conjunction (Arabic و/ف proclitics)\n | 'event-modifier' // Event modifier (.once, .debounce(300), .throttle(100))\n | 'identifier' // Variable or property name\n | 'operator' // Comparison or logical operator\n | 'punctuation' // Brackets, quotes, etc.\n | 'url'; // URL/path (/path, https://...)\n\n/**\n * A stream of tokens with navigation capabilities.\n */\nexport interface TokenStream {\n readonly tokens: readonly LanguageToken[];\n readonly language: string;\n\n /** Look at token at current position + offset without consuming */\n peek(offset?: number): LanguageToken | null;\n\n /** Consume and return current token, advance position */\n advance(): LanguageToken;\n\n /** Check if we've consumed all tokens */\n isAtEnd(): boolean;\n\n /** Save current position for backtracking */\n mark(): StreamMark;\n\n /** Restore to a saved position */\n reset(mark: StreamMark): void;\n\n /** Get current position */\n position(): number;\n}\n\nexport interface StreamMark {\n readonly position: number;\n}\n\n// =============================================================================\n// Pattern Matching Results\n// =============================================================================\n\n/**\n * Result of successfully matching a pattern.\n */\nexport interface PatternMatchResult {\n readonly pattern: LanguagePattern;\n readonly captured: ReadonlyMap<SemanticRole, SemanticValue>;\n readonly consumedTokens: number;\n readonly confidence: number; // 0-1, how well the pattern matched\n}\n\n/**\n * Error when pattern matching fails.\n */\nexport interface PatternMatchError {\n readonly message: string;\n readonly position: SourcePosition;\n readonly expectedPatterns?: string[];\n readonly partialMatch?: Partial<PatternMatchResult>;\n}\n\n// =============================================================================\n// Tokenizer Interface\n// =============================================================================\n\n/**\n * Language-specific tokenizer interface.\n * Each language implements its own tokenizer to handle:\n * - Word boundaries (spaces for English, particles for Japanese)\n * - Character sets (ASCII, CJK, Arabic, etc.)\n * - Special markers (particles, prefixes, suffixes)\n */\nexport interface LanguageTokenizer {\n readonly language: string;\n readonly direction: 'ltr' | 'rtl';\n\n /** Convert input string to token stream */\n tokenize(input: string): TokenStream;\n\n /** Classify a single token */\n classifyToken(token: string): TokenKind;\n}\n\n// =============================================================================\n// Semantic Parser Interface\n// =============================================================================\n\n/**\n * Main parser interface - converts natural language to semantic nodes.\n */\nexport interface SemanticParser {\n /** Parse input in specified language to semantic node */\n parse(input: string, language: string): SemanticNode;\n\n /** Check if input can be parsed in the specified language */\n canParse(input: string, language: string): boolean;\n\n /** Get all supported languages */\n supportedLanguages(): string[];\n}\n\n// =============================================================================\n// Semantic Renderer Interface\n// =============================================================================\n\n/**\n * Renderer interface - converts semantic nodes to natural language.\n */\nexport interface SemanticRenderer {\n /** Render semantic node in specified language */\n render(node: SemanticNode, language: string): string;\n\n /** Render semantic node in explicit mode */\n renderExplicit(node: SemanticNode): string;\n\n /** Get all supported languages */\n supportedLanguages(): string[];\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Create a selector semantic value from a CSS selector string.\n */\nexport function createSelector(value: string): SelectorValue {\n let selectorKind: SelectorValue['selectorKind'] = 'complex';\n\n if (value.startsWith('#') && !value.includes(' ')) {\n selectorKind = 'id';\n } else if (value.startsWith('.') && !value.includes(' ')) {\n selectorKind = 'class';\n } else if (value.startsWith('[') && value.endsWith(']')) {\n selectorKind = 'attribute';\n } else if (/^[a-z][a-z0-9]*$/i.test(value)) {\n selectorKind = 'element';\n }\n\n return { type: 'selector', value, selectorKind };\n}\n\n/**\n * Create a literal semantic value.\n */\nexport function createLiteral(\n value: string | number | boolean,\n dataType?: LiteralValue['dataType']\n): LiteralValue {\n const result: LiteralValue = { type: 'literal', value };\n if (dataType !== undefined) {\n return { type: 'literal', value, dataType };\n }\n return result;\n}\n\n/**\n * Check if a string is a valid reference keyword.\n */\nconst VALID_REFERENCES: ReadonlySet<string> = new Set<ReferenceValue['value']>([\n 'me',\n 'you',\n 'it',\n 'result',\n 'event',\n 'target',\n 'body',\n]);\n\nexport function isValidReference(value: string): value is ReferenceValue['value'] {\n return VALID_REFERENCES.has(value);\n}\n\n/**\n * Create a reference semantic value.\n */\nexport function createReference(value: ReferenceValue['value']): ReferenceValue {\n return { type: 'reference', value };\n}\n\n/**\n * Create a property path semantic value.\n */\nexport function createPropertyPath(object: SemanticValue, property: string): PropertyPathValue {\n return { type: 'property-path', object, property };\n}\n\n/**\n * Create a semantic node with the given action and roles.\n */\nexport function createCommandNode(\n action: ActionType,\n roles: Record<string, SemanticValue>,\n metadata?: SemanticMetadata\n): CommandSemanticNode {\n const node: CommandSemanticNode = {\n kind: 'command',\n action,\n roles: new Map(Object.entries(roles) as [SemanticRole, SemanticValue][]),\n };\n if (metadata !== undefined) {\n return { ...node, metadata };\n }\n return node;\n}\n\n/**\n * Create an event handler semantic node.\n */\nexport function createEventHandler(\n event: SemanticValue,\n body: SemanticNode[],\n modifiers?: EventModifiers,\n metadata?: SemanticMetadata,\n parameterNames?: string[],\n additionalEvents?: SemanticValue[]\n): EventHandlerSemanticNode {\n const roles = new Map<SemanticRole, SemanticValue>();\n roles.set('event', event);\n\n const node: EventHandlerSemanticNode = {\n kind: 'event-handler',\n action: 'on',\n roles,\n body,\n };\n\n if (modifiers !== undefined) {\n (node as { eventModifiers?: EventModifiers }).eventModifiers = modifiers;\n }\n if (metadata !== undefined) {\n (node as { metadata?: SemanticMetadata }).metadata = metadata;\n }\n if (parameterNames !== undefined && parameterNames.length > 0) {\n (node as { parameterNames?: readonly string[] }).parameterNames = parameterNames;\n }\n if (additionalEvents !== undefined && additionalEvents.length > 0) {\n (node as { additionalEvents?: readonly SemanticValue[] }).additionalEvents = additionalEvents;\n }\n\n return node;\n}\n\n/**\n * Create a compound semantic node (for chained statements).\n */\nexport function createCompoundNode(\n statements: SemanticNode[],\n chainType: 'then' | 'and' | 'async' = 'then',\n metadata?: SemanticMetadata\n): CompoundSemanticNode {\n const node: CompoundSemanticNode = {\n kind: 'compound',\n action: 'compound' as ActionType, // Compound doesn't have a specific action\n roles: new Map(),\n statements,\n chainType,\n };\n if (metadata !== undefined) {\n (node as { metadata?: SemanticMetadata }).metadata = metadata;\n }\n return node;\n}\n\n/**\n * Create a conditional semantic node (if/else).\n */\nexport function createConditionalNode(\n condition: SemanticValue,\n thenBranch: SemanticNode[],\n elseBranch?: SemanticNode[],\n metadata?: SemanticMetadata\n): ConditionalSemanticNode {\n const roles = new Map<SemanticRole, SemanticValue>();\n roles.set('condition' as SemanticRole, condition);\n\n const node: ConditionalSemanticNode = {\n kind: 'conditional',\n action: 'if',\n roles,\n thenBranch,\n };\n if (elseBranch !== undefined) {\n (node as { elseBranch?: SemanticNode[] }).elseBranch = elseBranch;\n }\n if (metadata !== undefined) {\n (node as { metadata?: SemanticMetadata }).metadata = metadata;\n }\n return node;\n}\n\n/**\n * Create a loop semantic node.\n */\nexport function createLoopNode(\n action: 'repeat' | 'for' | 'while',\n loopVariant: LoopVariant,\n roles: Record<string, SemanticValue>,\n body: SemanticNode[],\n options?: {\n loopVariable?: string;\n indexVariable?: string;\n metadata?: SemanticMetadata;\n }\n): LoopSemanticNode {\n const node: LoopSemanticNode = {\n kind: 'loop',\n action,\n loopVariant,\n roles: new Map(Object.entries(roles) as [SemanticRole, SemanticValue][]),\n body,\n };\n\n if (options?.loopVariable) {\n (node as { loopVariable?: string }).loopVariable = options.loopVariable;\n }\n if (options?.indexVariable) {\n (node as { indexVariable?: string }).indexVariable = options.indexVariable;\n }\n if (options?.metadata) {\n (node as { metadata?: SemanticMetadata }).metadata = options.metadata;\n }\n\n return node;\n}\n\n// =============================================================================\n// Semantic Parse Result (for validation)\n// =============================================================================\n\n/**\n * Argument with semantic role attached.\n */\nexport type SemanticArgument = SemanticValue & {\n role?: SemanticRole;\n};\n\n/**\n * Result of semantic parsing (used by command validator).\n */\nexport interface SemanticParseResult {\n /** The action/command type */\n readonly action: ActionType;\n /** Confidence score (0-1) */\n readonly confidence: number;\n /** Source language code */\n readonly language: string;\n /** Parsed arguments with roles */\n readonly arguments: SemanticArgument[];\n}\n","/**\n * Type Validation Utility\n *\n * Shared utilities for validating semantic value types against expected types.\n * Used by pattern-matcher to validate captured role values.\n */\n\nimport type { SemanticValue } from '../../types';\n\n/**\n * Semantic value type strings.\n */\nexport type SemanticValueType = SemanticValue['type'];\n\n/**\n * Check if a value type matches any of the expected types.\n *\n * The 'expression' type is treated as a wildcard that matches any value.\n * The 'property-path' type is compatible with selector, reference, and expression.\n *\n * @param actualType The actual type of the value\n * @param expectedTypes Array of expected types\n * @returns True if the type is compatible\n */\nexport function isTypeCompatible(\n actualType: SemanticValueType | string,\n expectedTypes: (SemanticValueType | string)[]\n): boolean {\n // Empty expected types means any type is valid\n if (!expectedTypes || expectedTypes.length === 0) {\n return true;\n }\n\n // Direct match\n if (expectedTypes.includes(actualType)) {\n return true;\n }\n\n // 'expression' is always compatible (wildcard)\n if (expectedTypes.includes('expression')) {\n return true;\n }\n\n // 'property-path' is compatible with selector, reference, and expression\n if (actualType === 'property-path') {\n return expectedTypes.some(t => ['selector', 'reference', 'expression'].includes(t));\n }\n\n return false;\n}\n\n/**\n * Validate a semantic value against expected types.\n *\n * @param value The semantic value to validate\n * @param expectedTypes Array of expected types (empty means any type is valid)\n * @returns True if the value type is valid\n */\nexport function validateValueType(\n value: SemanticValue,\n expectedTypes?: (SemanticValueType | string)[]\n): boolean {\n if (!expectedTypes || expectedTypes.length === 0) {\n return true;\n }\n\n return isTypeCompatible(value.type, expectedTypes);\n}\n\n/**\n * Check if a value is a CSS selector.\n */\nexport function isCSSSelector(value: string): boolean {\n return value.startsWith('.') || value.startsWith('#') || value.startsWith('<');\n}\n\n/**\n * Check if a value is a class name (starts with .).\n */\nexport function isClassName(value: string): boolean {\n return value.startsWith('.');\n}\n\n/**\n * Check if a value is an ID selector (starts with #).\n */\nexport function isIdSelector(value: string): boolean {\n return value.startsWith('#');\n}\n\n/**\n * Check if a value is a CSS property reference (starts with *).\n */\nexport function isCSSPropertyRef(value: string): boolean {\n return value.startsWith('*');\n}\n\n/**\n * Check if a value is a numeric value.\n */\nexport function isNumericValue(value: string): boolean {\n // Handle duration values (e.g., \"100ms\", \"2s\")\n const durationMatch = value.match(/^(\\d+(?:\\.\\d+)?)(ms|s|m|h)?$/);\n if (durationMatch) {\n return true;\n }\n\n // Plain number\n const num = parseFloat(value);\n return !isNaN(num) && isFinite(num);\n}\n\n/**\n * Check if a value is a property name (identifier-like).\n */\nexport function isPropertyName(value: string): boolean {\n // Property names are identifiers (start with letter or _, contain alphanumeric)\n return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(value);\n}\n\n/**\n * Check if a value is a variable reference (starts with :).\n */\nexport function isVariableRef(value: string): boolean {\n return value.startsWith(':');\n}\n\n/**\n * Check if a value is a built-in reference (me, you, it, etc.).\n */\nexport function isBuiltInReference(value: string): boolean {\n const builtIns = new Set(['me', 'you', 'it', 'result', 'event', 'target', 'body']);\n return builtIns.has(value.toLowerCase());\n}\n","/**\n * Possessive Keywords Utility\n *\n * Provides functions to look up possessive keywords from language profiles.\n * Used by pattern-matcher to recognize possessive expressions like \"my value\".\n */\n\nimport type { LanguageProfile } from '../../generators/profiles/types';\n\n/**\n * Get the reference for a possessive keyword from a language profile.\n *\n * @param profile Language profile\n * @param keyword Possessive keyword (e.g., 'my', 'your', 'its')\n * @returns The reference (e.g., 'me', 'you', 'it') or undefined if not found\n */\nexport function getPossessiveReference(\n profile: LanguageProfile,\n keyword: string\n): string | undefined {\n return profile.possessive?.keywords?.[keyword];\n}\n\n/**\n * Check if a keyword is a possessive keyword in the given profile.\n *\n * @param profile Language profile\n * @param keyword Keyword to check\n * @returns True if the keyword is a possessive keyword\n */\nexport function isPossessiveKeyword(profile: LanguageProfile, keyword: string): boolean {\n return profile.possessive?.keywords?.[keyword] !== undefined;\n}\n\n/**\n * Get all possessive keywords from a language profile.\n *\n * @param profile Language profile\n * @returns Record of possessive keywords to references, or empty object\n */\nexport function getAllPossessiveKeywords(profile: LanguageProfile): Record<string, string> {\n return profile.possessive?.keywords ?? {};\n}\n","/**\n * Language Registry\n *\n * Central registration point for language support in the semantic parser.\n * Languages self-register when their modules are imported, enabling\n * tree-shaking for minimal bundles.\n *\n * @example\n * ```typescript\n * // Import only the languages you need\n * import '@lokascript/semantic/languages/en';\n * import '@lokascript/semantic/languages/es';\n *\n * // Now parse works for registered languages\n * import { parse } from '@lokascript/semantic';\n * parse('toggle .active', 'en'); // Works\n * parse('alternar .activo', 'es'); // Works\n * parse('切り替え .active', 'ja'); // Error: Language not registered\n * ```\n */\n\nimport type { LanguageTokenizer, LanguagePattern, TokenStream } from './types';\n\n// Re-export profile types from generators for convenience\nexport type {\n LanguageProfile,\n WordOrder,\n MarkingStrategy,\n RoleMarker,\n VerbConfig,\n PossessiveConfig,\n KeywordTranslation,\n TokenizationConfig,\n} from './generators/language-profiles';\n\nimport type { LanguageProfile } from './generators/language-profiles';\n\n// =============================================================================\n// External Pattern Source Interface\n// =============================================================================\n\n/**\n * Interface for external pattern sources (e.g., @lokascript/patterns-reference database).\n * External sources can provide additional patterns at runtime.\n */\nexport interface ExternalPatternsSource {\n /** Unique identifier for the source */\n id: string;\n /** Human-readable name */\n name: string;\n /** Get patterns for a specific language */\n getPatternsForLanguage(language: string): Promise<ExternalPatternEntry[]>;\n /** Get patterns for a specific command */\n getPatternsForCommand(command: string, language?: string): Promise<ExternalPatternEntry[]>;\n /** Check if source has patterns for a language */\n hasPatterns(language: string): Promise<boolean>;\n /** Get all supported languages */\n getSupportedLanguages(): Promise<string[]>;\n}\n\n/**\n * Pattern entry from external source.\n */\nexport interface ExternalPatternEntry {\n id: string;\n code: string;\n command: string | null;\n language: string;\n confidence: number;\n verified: boolean;\n title?: string;\n category?: string;\n}\n\n// =============================================================================\n// Registry State\n// =============================================================================\n\nconst tokenizers = new Map<string, LanguageTokenizer>();\nconst profiles = new Map<string, LanguageProfile>();\nconst patternCache = new Map<string, LanguagePattern[]>();\n\n// External pattern sources (e.g., @lokascript/patterns-reference database)\nconst externalSources = new Map<string, ExternalPatternsSource>();\n\n// Pattern generator function - set by patterns module to avoid circular deps\nlet patternGenerator: ((profile: LanguageProfile) => LanguagePattern[]) | null = null;\n\n// =============================================================================\n// Profile Inheritance\n// =============================================================================\n\n/**\n * Deep merge two objects, with variant values overriding base values.\n * Arrays are replaced, not merged.\n */\nfunction deepMerge<T extends object>(base: T, variant: Partial<T>): T {\n const result = { ...base } as T;\n\n for (const key of Object.keys(variant) as (keyof T)[]) {\n const variantValue = variant[key];\n const baseValue = base[key];\n\n if (variantValue === undefined) {\n continue;\n }\n\n // If both are objects (but not arrays), merge recursively\n if (\n typeof variantValue === 'object' &&\n variantValue !== null &&\n !Array.isArray(variantValue) &&\n typeof baseValue === 'object' &&\n baseValue !== null &&\n !Array.isArray(baseValue)\n ) {\n result[key] = deepMerge(\n baseValue as object,\n variantValue as Partial<typeof baseValue>\n ) as T[keyof T];\n } else {\n // Replace value (including arrays)\n result[key] = variantValue as T[keyof T];\n }\n }\n\n return result;\n}\n\n/**\n * Merge a variant profile with its base profile.\n * The variant's fields override the base, with deep merging for nested objects.\n *\n * @example\n * ```typescript\n * const esMX = mergeProfiles(spanishProfile, {\n * code: 'es-MX',\n * name: 'Spanish (Mexico)',\n * keywords: {\n * toggle: { primary: 'alternar', alternatives: ['dale', 'cambiar'] },\n * },\n * });\n * ```\n */\nexport function mergeProfiles(\n base: LanguageProfile,\n variant: Partial<LanguageProfile>\n): LanguageProfile {\n return deepMerge(base, variant);\n}\n\n/**\n * Resolve a profile, applying inheritance if the profile has an `extends` field.\n * Returns the merged profile with base language properties inherited.\n */\nexport function resolveProfile(profile: LanguageProfile): LanguageProfile {\n if (!profile.extends) {\n return profile;\n }\n\n const baseProfile = profiles.get(profile.extends);\n if (!baseProfile) {\n console.warn(\n `[Registry] Profile '${profile.code}' extends '${profile.extends}' but base is not registered. ` +\n `Make sure to import the base language before the variant.`\n );\n return profile;\n }\n\n // Recursively resolve base profile (in case it also extends something)\n const resolvedBase = resolveProfile(baseProfile);\n\n // Merge, with variant overriding base\n return mergeProfiles(resolvedBase, profile);\n}\n\n// =============================================================================\n// Registration Functions\n// =============================================================================\n\n/**\n * Register a language with its tokenizer and profile.\n * Called automatically by language modules when imported.\n * If the profile has an `extends` field, it will inherit from the base profile.\n */\nexport function registerLanguage(\n code: string,\n tokenizer: LanguageTokenizer,\n profile: LanguageProfile\n): void {\n tokenizers.set(code, tokenizer);\n // Store the original profile (inheritance is resolved at query time)\n profiles.set(code, profile);\n // Clear pattern cache for this language if it was previously cached\n patternCache.delete(code);\n}\n\n/**\n * Register only a tokenizer (for backwards compatibility).\n */\nexport function registerTokenizer(tokenizer: LanguageTokenizer): void {\n tokenizers.set(tokenizer.language, tokenizer);\n}\n\n/**\n * Register only a profile (for backwards compatibility).\n */\nexport function registerProfile(profile: LanguageProfile): void {\n profiles.set(profile.code, profile);\n patternCache.delete(profile.code);\n}\n\n/**\n * Set the pattern generator function.\n * Called by patterns module to inject the generator without circular deps.\n */\nexport function setPatternGenerator(\n generator: (profile: LanguageProfile) => LanguagePattern[]\n): void {\n patternGenerator = generator;\n}\n\n// Direct pattern registration map (for tree-shaking)\nconst registeredPatterns = new Map<string, LanguagePattern[]>();\n\n/**\n * Register patterns directly for a language.\n * This enables tree-shaking by allowing each language module to register\n * only its own patterns.\n */\nexport function registerPatterns(code: string, patterns: LanguagePattern[]): void {\n registeredPatterns.set(code, patterns);\n // Clear cached patterns if any\n patternCache.delete(code);\n}\n\n/**\n * Check if patterns are directly registered for a language.\n */\nexport function hasRegisteredPatterns(code: string): boolean {\n return registeredPatterns.has(code);\n}\n\n/**\n * Get directly registered patterns for a language.\n */\nexport function getRegisteredPatterns(code: string): LanguagePattern[] | undefined {\n return registeredPatterns.get(code);\n}\n\n// =============================================================================\n// External Pattern Sources\n// =============================================================================\n\n/**\n * Register an external pattern source.\n * External sources (like @lokascript/patterns-reference) can provide\n * additional patterns at runtime.\n *\n * @example\n * ```typescript\n * import { registerPatternsSource } from '@lokascript/semantic';\n * import { createPatternsProvider } from '@lokascript/patterns-reference';\n *\n * const provider = createPatternsProvider();\n * registerPatternsSource(provider);\n * ```\n */\nexport function registerPatternsSource(source: ExternalPatternsSource): void {\n externalSources.set(source.id, source);\n}\n\n/**\n * Unregister an external pattern source.\n */\nexport function unregisterPatternsSource(sourceId: string): boolean {\n return externalSources.delete(sourceId);\n}\n\n/**\n * Get a registered external pattern source.\n */\nexport function getPatternsSource(sourceId: string): ExternalPatternsSource | undefined {\n return externalSources.get(sourceId);\n}\n\n/**\n * Get all registered external pattern sources.\n */\nexport function getAllPatternsSources(): ExternalPatternsSource[] {\n return Array.from(externalSources.values());\n}\n\n/**\n * Check if any external pattern sources are registered.\n */\nexport function hasExternalSources(): boolean {\n return externalSources.size > 0;\n}\n\n/**\n * Query patterns from all external sources for a language.\n * Returns patterns sorted by confidence.\n */\nexport async function queryExternalPatterns(language: string): Promise<ExternalPatternEntry[]> {\n if (externalSources.size === 0) {\n return [];\n }\n\n const allPatterns: ExternalPatternEntry[] = [];\n\n for (const source of externalSources.values()) {\n try {\n const patterns = await source.getPatternsForLanguage(language);\n allPatterns.push(...patterns);\n } catch (error) {\n console.warn(\n `[Registry] Failed to query patterns from ${source.name}:`,\n error instanceof Error ? error.message : String(error)\n );\n }\n }\n\n // Sort by confidence (highest first)\n return allPatterns.sort((a, b) => b.confidence - a.confidence);\n}\n\n/**\n * Query patterns from all external sources for a command.\n */\nexport async function queryExternalPatternsForCommand(\n command: string,\n language?: string\n): Promise<ExternalPatternEntry[]> {\n if (externalSources.size === 0) {\n return [];\n }\n\n const allPatterns: ExternalPatternEntry[] = [];\n\n for (const source of externalSources.values()) {\n try {\n const patterns = await source.getPatternsForCommand(command, language);\n allPatterns.push(...patterns);\n } catch (error) {\n console.warn(\n `[Registry] Failed to query patterns from ${source.name}:`,\n error instanceof Error ? error.message : String(error)\n );\n }\n }\n\n return allPatterns.sort((a, b) => b.confidence - a.confidence);\n}\n\n// =============================================================================\n// Language Code Utilities\n// =============================================================================\n\n/**\n * Extract the base language code from a BCP 47 tag.\n * Examples: 'es-MX' → 'es', 'pt-BR' → 'pt', 'en' → 'en'\n */\nexport function getBaseLanguageCode(code: string): string {\n return code.split('-')[0];\n}\n\n/**\n * Check if a code is a language variant (has region subtag).\n * Examples: 'es-MX' → true, 'pt' → false\n */\nexport function isLanguageVariant(code: string): boolean {\n return code.includes('-');\n}\n\n// =============================================================================\n// Query Functions\n// =============================================================================\n\n/**\n * Get a tokenizer for the specified language.\n * Supports fallback: if 'es-MX' is not registered, falls back to 'es'.\n * @throws Error if neither the variant nor base language is registered\n */\nexport function getTokenizer(code: string): LanguageTokenizer {\n // Try exact match first\n let tokenizer = tokenizers.get(code);\n\n // Fallback: es-MX → es\n if (!tokenizer && isLanguageVariant(code)) {\n const baseCode = getBaseLanguageCode(code);\n tokenizer = tokenizers.get(baseCode);\n }\n\n if (!tokenizer) {\n const registered = Array.from(tokenizers.keys()).join(', ');\n throw new Error(\n `Language '${code}' is not registered. ` +\n `Registered languages: ${registered || 'none'}. ` +\n `Import the language module first: import '@lokascript/semantic/languages/${code}';`\n );\n }\n return tokenizer;\n}\n\n/**\n * Get a profile for the specified language.\n * Supports fallback: if 'es-MX' is not registered, falls back to 'es'.\n * @throws Error if neither the variant nor base language is registered\n */\nexport function getProfile(code: string): LanguageProfile {\n // Try exact match first\n let profile = profiles.get(code);\n\n // Fallback: es-MX → es\n if (!profile && isLanguageVariant(code)) {\n const baseCode = getBaseLanguageCode(code);\n profile = profiles.get(baseCode);\n }\n\n if (!profile) {\n const registered = Array.from(profiles.keys()).join(', ');\n throw new Error(\n `Language profile '${code}' is not registered. ` +\n `Registered languages: ${registered || 'none'}. ` +\n `Import the language module first: import '@lokascript/semantic/languages/${code}';`\n );\n }\n\n // Resolve inheritance if profile extends another\n return resolveProfile(profile);\n}\n\n/**\n * Try to get a tokenizer, returning undefined if not registered.\n * Supports fallback: if 'es-MX' is not registered, falls back to 'es'.\n */\nexport function tryGetTokenizer(code: string): LanguageTokenizer | undefined {\n let tokenizer = tokenizers.get(code);\n if (!tokenizer && isLanguageVariant(code)) {\n tokenizer = tokenizers.get(getBaseLanguageCode(code));\n }\n return tokenizer;\n}\n\n/**\n * Try to get a profile, returning undefined if not registered.\n * Supports fallback: if 'es-MX' is not registered, falls back to 'es'.\n */\nexport function tryGetProfile(code: string): LanguageProfile | undefined {\n let profile = profiles.get(code);\n if (!profile && isLanguageVariant(code)) {\n profile = profiles.get(getBaseLanguageCode(code));\n }\n // Resolve inheritance if profile extends another\n return profile ? resolveProfile(profile) : undefined;\n}\n\n/**\n * Get all registered language codes.\n */\nexport function getRegisteredLanguages(): string[] {\n return Array.from(tokenizers.keys());\n}\n\n/**\n * Check if a language is registered (exact match or base language fallback).\n */\nexport function isLanguageRegistered(code: string): boolean {\n if (tokenizers.has(code) && profiles.has(code)) {\n return true;\n }\n // Check fallback for variants\n if (isLanguageVariant(code)) {\n const baseCode = getBaseLanguageCode(code);\n return tokenizers.has(baseCode) && profiles.has(baseCode);\n }\n return false;\n}\n\n/**\n * Check if a language is supported (exact match or base language fallback).\n * For backwards compatibility with tokenizers API.\n */\nexport function isLanguageSupported(code: string): boolean {\n if (tokenizers.has(code)) {\n return true;\n }\n // Check fallback for variants\n if (isLanguageVariant(code)) {\n return tokenizers.has(getBaseLanguageCode(code));\n }\n return false;\n}\n\n// =============================================================================\n// Tokenization\n// =============================================================================\n\n/**\n * Tokenize input in the specified language.\n * @throws Error if language is not registered\n */\nexport function tokenize(input: string, language: string): TokenStream {\n const tokenizer = getTokenizer(language);\n return tokenizer.tokenize(input);\n}\n\n// =============================================================================\n// Pattern Access (Lazy Generation)\n// =============================================================================\n\n/**\n * Get patterns for a specific language.\n * First checks for directly registered patterns (for tree-shaking),\n * then falls back to pattern generator.\n * Supports fallback: if 'es-MX' is not registered, falls back to 'es'.\n * @throws Error if language is not registered\n */\nexport function getPatternsForLanguage(code: string): LanguagePattern[] {\n // Check cache first (try exact, then base language)\n let cached = patternCache.get(code);\n if (!cached && isLanguageVariant(code)) {\n cached = patternCache.get(getBaseLanguageCode(code));\n }\n if (cached) {\n return cached;\n }\n\n // Check for directly registered patterns (tree-shakeable path)\n // Try exact match, then base language fallback\n let registered = registeredPatterns.get(code);\n if (!registered && isLanguageVariant(code)) {\n registered = registeredPatterns.get(getBaseLanguageCode(code));\n }\n if (registered) {\n patternCache.set(code, registered);\n return registered;\n }\n\n // Fall back to pattern generator\n if (!patternGenerator) {\n throw new Error(\n `No patterns registered for language '${code}'. ` +\n 'Either import the language module or set a pattern generator.'\n );\n }\n\n // Get profile (throws if not registered) - has built-in fallback\n const profile = getProfile(code);\n const patterns = patternGenerator(profile);\n patternCache.set(code, patterns);\n return patterns;\n}\n\n/**\n * Get patterns for a specific language and command.\n */\nexport function getPatternsForLanguageAndCommand(\n language: string,\n command: string\n): LanguagePattern[] {\n return getPatternsForLanguage(language)\n .filter(p => p.command === command)\n .sort((a, b) => b.priority - a.priority);\n}\n\n/**\n * Clear the pattern cache for a language (useful for testing).\n */\nexport function clearPatternCache(code?: string): void {\n if (code) {\n patternCache.delete(code);\n } else {\n patternCache.clear();\n }\n}\n\n// =============================================================================\n// Backwards Compatibility\n// =============================================================================\n\n/**\n * Get all profiles as a record (for backwards compatibility).\n * Note: Only returns registered profiles.\n */\nexport function getAllProfiles(): Record<string, LanguageProfile> {\n const result: Record<string, LanguageProfile> = {};\n for (const [code, profile] of profiles) {\n result[code] = profile;\n }\n return result;\n}\n\n/**\n * Get all tokenizers as a record (for backwards compatibility).\n * Note: Only returns registered tokenizers.\n */\nexport function getAllTokenizers(): Record<string, LanguageTokenizer> {\n const result: Record<string, LanguageTokenizer> = {};\n for (const [code, tokenizer] of tokenizers) {\n result[code] = tokenizer;\n }\n return result;\n}\n","/**\n * Pattern Matcher\n *\n * Matches tokenized input against language patterns to extract semantic roles.\n * This is the core algorithm for multilingual parsing.\n */\n\nimport type {\n LanguagePattern,\n PatternToken,\n PatternMatchResult,\n ReferenceValue,\n SemanticRole,\n SemanticValue,\n TokenStream,\n LanguageToken,\n} from '../types';\nimport {\n createSelector,\n createLiteral,\n createReference,\n createPropertyPath,\n isValidReference,\n} from '../types';\nimport { isTypeCompatible } from './utils/type-validation';\nimport { getPossessiveReference } from './utils/possessive-keywords';\nimport type { LanguageProfile } from '../generators/profiles/types';\nimport { tryGetProfile } from '../registry';\n\n// =============================================================================\n// Pattern Matcher\n// =============================================================================\n\nexport class PatternMatcher {\n /** Current language profile for the pattern being matched */\n private currentProfile: LanguageProfile | undefined;\n\n /**\n * Try to match a single pattern against the token stream.\n * Returns the match result or null if no match.\n */\n matchPattern(tokens: TokenStream, pattern: LanguagePattern): PatternMatchResult | null {\n const mark = tokens.mark();\n const captured = new Map<SemanticRole, SemanticValue>();\n\n // Get language profile for possessive keyword lookup\n this.currentProfile = tryGetProfile(pattern.language);\n\n // Reset match counters for this pattern\n this.stemMatchCount = 0;\n this.totalKeywordMatches = 0;\n\n const success = this.matchTokenSequence(tokens, pattern.template.tokens, captured);\n\n if (!success) {\n tokens.reset(mark);\n return null;\n }\n\n // Calculate confidence BEFORE applying defaults\n // This ensures defaulted roles don't artificially inflate confidence\n const confidence = this.calculateConfidence(pattern, captured);\n\n // Apply extraction rules to fill in any missing roles with defaults\n this.applyExtractionRules(pattern, captured);\n\n return {\n pattern,\n captured,\n consumedTokens: tokens.position() - mark.position,\n confidence,\n };\n }\n\n /**\n * Try to match multiple patterns, return the best match.\n */\n matchBest(tokens: TokenStream, patterns: LanguagePattern[]): PatternMatchResult | null {\n const matches: PatternMatchResult[] = [];\n\n for (const pattern of patterns) {\n const mark = tokens.mark();\n const result = this.matchPattern(tokens, pattern);\n\n if (result) {\n matches.push(result);\n }\n\n tokens.reset(mark);\n }\n\n if (matches.length === 0) {\n return null;\n }\n\n // Sort by confidence and priority\n matches.sort((a, b) => {\n // First by priority\n const priorityDiff = b.pattern.priority - a.pattern.priority;\n if (priorityDiff !== 0) return priorityDiff;\n\n // Then by confidence\n return b.confidence - a.confidence;\n });\n\n // Re-consume tokens for the best match\n const best = matches[0];\n this.matchPattern(tokens, best.pattern);\n\n return best;\n }\n\n /**\n * Match a sequence of pattern tokens against the token stream.\n */\n private matchTokenSequence(\n tokens: TokenStream,\n patternTokens: PatternToken[],\n captured: Map<SemanticRole, SemanticValue>\n ): boolean {\n // Skip leading conjunctions for Arabic (proclitics: و, ف, ول, وب, etc.)\n // BUT NOT if the pattern explicitly expects a conjunction (proclitic patterns)\n const firstPatternToken = patternTokens[0];\n const patternExpectsConjunction =\n firstPatternToken?.type === 'literal' &&\n (firstPatternToken.value === 'and' ||\n firstPatternToken.value === 'then' ||\n firstPatternToken.alternatives?.includes('and') ||\n firstPatternToken.alternatives?.includes('then'));\n\n if (this.currentProfile?.code === 'ar' && !patternExpectsConjunction) {\n while (tokens.peek()?.kind === 'conjunction') {\n tokens.advance();\n }\n }\n\n for (const patternToken of patternTokens) {\n const matched = this.matchPatternToken(tokens, patternToken, captured);\n\n if (!matched) {\n // If token is optional, continue\n if (this.isOptional(patternToken)) {\n continue;\n }\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Match a single pattern token against the current position in the stream.\n */\n private matchPatternToken(\n tokens: TokenStream,\n patternToken: PatternToken,\n captured: Map<SemanticRole, SemanticValue>\n ): boolean {\n switch (patternToken.type) {\n case 'literal':\n return this.matchLiteralToken(tokens, patternToken);\n\n case 'role':\n return this.matchRoleToken(tokens, patternToken, captured);\n\n case 'group':\n return this.matchGroupToken(tokens, patternToken, captured);\n\n default:\n return false;\n }\n }\n\n /**\n * Match a literal pattern token (keyword or particle).\n */\n private matchLiteralToken(\n tokens: TokenStream,\n patternToken: PatternToken & { type: 'literal' }\n ): boolean {\n const token = tokens.peek();\n if (!token) return false;\n\n // Check main value\n const matchType = this.getMatchType(token, patternToken.value);\n if (matchType !== 'none') {\n this.totalKeywordMatches++;\n if (matchType === 'stem') {\n this.stemMatchCount++;\n }\n tokens.advance();\n return true;\n }\n\n // Check alternatives\n if (patternToken.alternatives) {\n for (const alt of patternToken.alternatives) {\n const altMatchType = this.getMatchType(token, alt);\n if (altMatchType !== 'none') {\n this.totalKeywordMatches++;\n if (altMatchType === 'stem') {\n this.stemMatchCount++;\n }\n tokens.advance();\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Match a role pattern token (captures a semantic value).\n * Handles multi-token expressions like:\n * - 'my value' (possessive keyword + property)\n * - '#dialog.showModal()' (method call)\n * - \"#element's *opacity\" (possessive selector + property)\n */\n private matchRoleToken(\n tokens: TokenStream,\n patternToken: PatternToken & { type: 'role' },\n captured: Map<SemanticRole, SemanticValue>\n ): boolean {\n // Skip noise words like \"the\" before selectors (English idiom support)\n this.skipNoiseWords(tokens);\n\n const token = tokens.peek();\n if (!token) {\n return patternToken.optional || false;\n }\n\n // Check for possessive expression (e.g., 'my value', 'its innerHTML')\n const possessiveValue = this.tryMatchPossessiveExpression(tokens);\n if (possessiveValue) {\n // Validate expected types if specified\n if (patternToken.expectedTypes && patternToken.expectedTypes.length > 0) {\n if (\n !patternToken.expectedTypes.includes(possessiveValue.type) &&\n !patternToken.expectedTypes.includes('expression')\n ) {\n return patternToken.optional || false;\n }\n }\n captured.set(patternToken.role, possessiveValue);\n return true;\n }\n\n // Check for method call expression (e.g., '#dialog.showModal()')\n const methodCallValue = this.tryMatchMethodCallExpression(tokens);\n if (methodCallValue) {\n if (patternToken.expectedTypes && patternToken.expectedTypes.length > 0) {\n if (\n !patternToken.expectedTypes.includes(methodCallValue.type) &&\n !patternToken.expectedTypes.includes('expression')\n ) {\n return patternToken.optional || false;\n }\n }\n captured.set(patternToken.role, methodCallValue);\n return true;\n }\n\n // Check for possessive selector expression (e.g., \"#element's *opacity\")\n const possessiveSelectorValue = this.tryMatchPossessiveSelectorExpression(tokens);\n if (possessiveSelectorValue) {\n if (patternToken.expectedTypes && patternToken.expectedTypes.length > 0) {\n // property-path is compatible with selector, reference, and expression\n if (!isTypeCompatible(possessiveSelectorValue.type, patternToken.expectedTypes)) {\n return patternToken.optional || false;\n }\n }\n captured.set(patternToken.role, possessiveSelectorValue);\n return true;\n }\n\n // Check for property access expression (e.g., 'userData.name', 'it.data')\n const propertyAccessValue = this.tryMatchPropertyAccessExpression(tokens);\n if (propertyAccessValue) {\n if (patternToken.expectedTypes && patternToken.expectedTypes.length > 0) {\n if (\n !patternToken.expectedTypes.includes(propertyAccessValue.type) &&\n !patternToken.expectedTypes.includes('expression')\n ) {\n return patternToken.optional || false;\n }\n }\n captured.set(patternToken.role, propertyAccessValue);\n return true;\n }\n\n // Check for selector + property expression (e.g., '#output.innerText')\n // This handles cases where the tokenizer produces two selector tokens\n const selectorPropertyValue = this.tryMatchSelectorPropertyExpression(tokens);\n if (selectorPropertyValue) {\n if (patternToken.expectedTypes && patternToken.expectedTypes.length > 0) {\n if (!isTypeCompatible(selectorPropertyValue.type, patternToken.expectedTypes)) {\n return patternToken.optional || false;\n }\n }\n captured.set(patternToken.role, selectorPropertyValue);\n return true;\n }\n\n // Try to extract a semantic value from the token\n const value = this.tokenToSemanticValue(token);\n if (!value) {\n return patternToken.optional || false;\n }\n\n // Validate expected types if specified\n if (patternToken.expectedTypes && patternToken.expectedTypes.length > 0) {\n if (!patternToken.expectedTypes.includes(value.type)) {\n return patternToken.optional || false;\n }\n }\n\n captured.set(patternToken.role, value);\n tokens.advance();\n return true;\n }\n\n /**\n * Try to match a possessive expression like 'my value' or 'its innerHTML'.\n * Returns the PropertyPathValue if matched, or null if not.\n */\n private tryMatchPossessiveExpression(tokens: TokenStream): SemanticValue | null {\n const token = tokens.peek();\n if (!token) return null;\n\n // Use profile-based possessive keyword lookup\n if (!this.currentProfile) return null;\n\n const tokenLower = (token.normalized || token.value).toLowerCase();\n const baseRef = getPossessiveReference(this.currentProfile, tokenLower);\n\n if (!baseRef) return null;\n\n // We have a possessive keyword, look ahead for property name\n const mark = tokens.mark();\n tokens.advance();\n\n const propertyToken = tokens.peek();\n if (!propertyToken) {\n // Just the possessive keyword, no property - revert\n tokens.reset(mark);\n return null;\n }\n\n // Property should be an identifier, keyword (not structural), or selector (for style/dot/attr)\n // Examples: \"my value\", \"my innerHTML\", \"my *background\", \"my *opacity\", \"my @data-count\"\n // Also handles dot-property access: \"my.textContent\" tokenized as \"my\" + \".textContent\"\n if (\n propertyToken.kind === 'identifier' ||\n (propertyToken.kind === 'keyword' && !this.isStructuralKeyword(propertyToken.value)) ||\n (propertyToken.kind === 'selector' && propertyToken.value.startsWith('*')) ||\n (propertyToken.kind === 'selector' && propertyToken.value.startsWith('@')) ||\n (propertyToken.kind === 'selector' &&\n propertyToken.value.startsWith('.') &&\n /^\\.[a-zA-Z_]\\w*/.test(propertyToken.value))\n ) {\n tokens.advance();\n\n // For dot-property selectors (.textContent), strip the leading dot\n let propertyName = propertyToken.value;\n if (\n propertyToken.kind === 'selector' &&\n propertyName.startsWith('.') &&\n /^\\.[a-zA-Z_]\\w*/.test(propertyName)\n ) {\n propertyName = propertyName.substring(1);\n }\n\n // Consume chained dot-property access (.parentElement.style.display)\n let chainedProps = propertyName;\n while (\n tokens.peek()?.kind === 'selector' &&\n tokens.peek()!.value.startsWith('.') &&\n /^\\.[a-zA-Z_]\\w*/.test(tokens.peek()!.value)\n ) {\n chainedProps += tokens.peek()!.value; // keep the dots for chaining\n tokens.advance();\n }\n\n // Check for method call — next token is '(' in the value (e.g., .getAttribute(\"data-id\"))\n const nextPeek = tokens.peek();\n if (nextPeek?.kind === 'literal' && nextPeek.value.startsWith('(')) {\n // Consume method args\n chainedProps += nextPeek.value;\n tokens.advance();\n }\n\n // Create property-path: my value -> { object: me, property: 'value' }\n // baseRef from getPossessiveReference is always a valid reference ('me', 'you', 'it', etc.)\n return createPropertyPath(createReference(baseRef as ReferenceValue['value']), chainedProps);\n }\n\n // Not a valid property, revert\n tokens.reset(mark);\n return null;\n }\n\n /**\n * Check if a keyword is a structural keyword (preposition, control flow, etc.)\n * that shouldn't be consumed as a property name.\n */\n private isStructuralKeyword(value: string): boolean {\n const structural = new Set([\n // Prepositions\n 'into',\n 'in',\n 'to',\n 'from',\n 'at',\n 'by',\n 'with',\n 'without',\n 'before',\n 'after',\n 'of',\n 'as',\n 'on',\n // Control flow\n 'then',\n 'end',\n 'else',\n 'if',\n 'repeat',\n 'while',\n 'for',\n // Commands (shouldn't be property names)\n 'toggle',\n 'add',\n 'remove',\n 'put',\n 'set',\n 'show',\n 'hide',\n 'increment',\n 'decrement',\n 'send',\n 'trigger',\n 'call',\n ]);\n return structural.has(value.toLowerCase());\n }\n\n /**\n * Try to match a method call expression like '#dialog.showModal()'.\n * Pattern: selector + '.' + identifier + '(' + [args] + ')'\n * Returns an expression value if matched, or null if not.\n */\n private tryMatchMethodCallExpression(tokens: TokenStream): SemanticValue | null {\n const token = tokens.peek();\n if (!token || token.kind !== 'selector') return null;\n\n // Look ahead for: . identifier (\n const mark = tokens.mark();\n tokens.advance(); // consume selector\n\n const dotToken = tokens.peek();\n if (!dotToken || dotToken.kind !== 'operator' || dotToken.value !== '.') {\n tokens.reset(mark);\n return null;\n }\n tokens.advance(); // consume .\n\n const methodToken = tokens.peek();\n if (!methodToken || methodToken.kind !== 'identifier') {\n tokens.reset(mark);\n return null;\n }\n tokens.advance(); // consume method name\n\n const openParen = tokens.peek();\n if (!openParen || openParen.kind !== 'punctuation' || openParen.value !== '(') {\n tokens.reset(mark);\n return null;\n }\n tokens.advance(); // consume (\n\n // Consume arguments until we find ) (with depth limit for security)\n const args: string[] = [];\n while (!tokens.isAtEnd() && args.length < PatternMatcher.MAX_METHOD_ARGS) {\n const argToken = tokens.peek();\n if (!argToken) break;\n if (argToken.kind === 'punctuation' && argToken.value === ')') {\n tokens.advance(); // consume )\n break;\n }\n // Skip commas\n if (argToken.kind === 'punctuation' && argToken.value === ',') {\n tokens.advance();\n continue;\n }\n // Collect arg value\n args.push(argToken.value);\n tokens.advance();\n }\n\n // Create expression value: #dialog.showModal()\n const methodCall = `${token.value}.${methodToken.value}(${args.join(', ')})`;\n return {\n type: 'expression',\n raw: methodCall,\n } as SemanticValue;\n }\n\n /**\n * Try to match a property access expression like 'userData.name' or 'it.data'.\n * Pattern: (identifier | keyword) + '.' + identifier [+ '.' + identifier ...]\n * Returns an expression value if matched, or null if not.\n */\n private tryMatchPropertyAccessExpression(tokens: TokenStream): SemanticValue | null {\n const token = tokens.peek();\n if (!token) return null;\n\n // Must start with an identifier or keyword reference\n if (token.kind !== 'identifier' && token.kind !== 'keyword') return null;\n\n // Look ahead for: . identifier\n const mark = tokens.mark();\n tokens.advance(); // consume first token\n\n const dotToken = tokens.peek();\n if (!dotToken || dotToken.kind !== 'operator' || dotToken.value !== '.') {\n tokens.reset(mark);\n return null;\n }\n tokens.advance(); // consume .\n\n const propertyToken = tokens.peek();\n if (!propertyToken || propertyToken.kind !== 'identifier') {\n tokens.reset(mark);\n return null;\n }\n tokens.advance(); // consume property name\n\n // Build the property chain\n let chain = `${token.value}.${propertyToken.value}`;\n let depth = 1; // Already have one property access\n\n // Continue for nested property access (e.g., userData.address.city)\n // With depth limit for security\n while (!tokens.isAtEnd() && depth < PatternMatcher.MAX_PROPERTY_DEPTH) {\n const nextDot = tokens.peek();\n if (!nextDot || nextDot.kind !== 'operator' || nextDot.value !== '.') {\n break;\n }\n tokens.advance(); // consume .\n\n const nextProp = tokens.peek();\n if (!nextProp || nextProp.kind !== 'identifier') {\n // Dot without property - put the dot back and stop\n // Can't easily put a single token back, so we'll include it\n break;\n }\n tokens.advance(); // consume property\n chain += `.${nextProp.value}`;\n depth++;\n }\n\n // Check for method call: chain + '(' + args + ')'\n // e.g., me.insertBefore(draggedItem, dropTarget)\n const openParen = tokens.peek();\n if (openParen && openParen.kind === 'punctuation' && openParen.value === '(') {\n tokens.advance(); // consume (\n\n // Collect arguments (comma-separated values)\n const args: string[] = [];\n let argDepth = 0; // Track nested parentheses\n while (!tokens.isAtEnd() && args.length < PatternMatcher.MAX_METHOD_ARGS) {\n const argToken = tokens.peek();\n if (!argToken) break;\n\n // Handle close paren - respecting nesting\n if (argToken.kind === 'punctuation' && argToken.value === ')') {\n if (argDepth === 0) {\n tokens.advance(); // consume )\n break;\n }\n argDepth--;\n }\n // Track nested open parens\n if (argToken.kind === 'punctuation' && argToken.value === '(') {\n argDepth++;\n }\n // Skip commas between arguments\n if (argToken.kind === 'punctuation' && argToken.value === ',') {\n tokens.advance();\n continue;\n }\n // Collect arg value\n args.push(argToken.value);\n tokens.advance();\n }\n\n // Create expression value with method call: me.insertBefore(a, b)\n const methodCall = `${chain}(${args.join(', ')})`;\n return {\n type: 'expression',\n raw: methodCall,\n } as SemanticValue;\n }\n\n // Create expression value: userData.name\n return {\n type: 'expression',\n raw: chain,\n } as SemanticValue;\n }\n\n /**\n * Try to match a possessive selector expression like \"#element's *opacity\".\n * Pattern: selector + \"'s\" + (selector | identifier)\n * Returns a property-path value if matched, or null if not.\n */\n private tryMatchPossessiveSelectorExpression(tokens: TokenStream): SemanticValue | null {\n const token = tokens.peek();\n if (!token || token.kind !== 'selector') return null;\n\n // Look ahead for: 's (possessive marker)\n const mark = tokens.mark();\n tokens.advance(); // consume selector\n\n const possessiveToken = tokens.peek();\n if (\n !possessiveToken ||\n possessiveToken.kind !== 'punctuation' ||\n possessiveToken.value !== \"'s\"\n ) {\n tokens.reset(mark);\n return null;\n }\n tokens.advance(); // consume 's\n\n const propertyToken = tokens.peek();\n if (!propertyToken) {\n tokens.reset(mark);\n return null;\n }\n\n // Property can be a selector (*opacity) or identifier\n if (propertyToken.kind !== 'selector' && propertyToken.kind !== 'identifier') {\n tokens.reset(mark);\n return null;\n }\n tokens.advance(); // consume property\n\n // Create property-path: #element's *opacity\n return createPropertyPath(createSelector(token.value), propertyToken.value);\n }\n\n /**\n * Try to match a selector + property expression like \"#output.innerText\".\n * This handles cases where the tokenizer produces two selector tokens:\n * - #output (id selector)\n * - .innerText (looks like class selector, but is actually property)\n *\n * Pattern: id-selector + class-selector-that-is-actually-property\n * Returns a property-path value if matched, or null if not.\n */\n private tryMatchSelectorPropertyExpression(tokens: TokenStream): SemanticValue | null {\n const token = tokens.peek();\n if (!token || token.kind !== 'selector') return null;\n\n // Must be an ID selector (starts with #)\n if (!token.value.startsWith('#')) return null;\n\n // Look ahead for: selector that looks like a property (.something)\n const mark = tokens.mark();\n tokens.advance(); // consume first selector\n\n const propertyToken = tokens.peek();\n if (!propertyToken || propertyToken.kind !== 'selector') {\n tokens.reset(mark);\n return null;\n }\n\n // Second token must look like a class selector (starts with .)\n // but we interpret it as a property access\n if (!propertyToken.value.startsWith('.')) {\n tokens.reset(mark);\n return null;\n }\n\n // Verify the next token is not a selector (to avoid consuming too many)\n // This helps distinguish \"#output.innerText\" from \"#box .child\"\n const peek2 = tokens.peek(1);\n if (peek2 && peek2.kind === 'selector') {\n // Could be a compound selector chain - only take first two\n }\n\n tokens.advance(); // consume property selector\n\n // Create property-path: #output.innerText\n // Extract property name without the leading dot\n const propertyName = propertyToken.value.slice(1);\n\n return createPropertyPath(createSelector(token.value), propertyName);\n }\n\n /**\n * Match a group pattern token (optional sequence).\n */\n private matchGroupToken(\n tokens: TokenStream,\n patternToken: PatternToken & { type: 'group' },\n captured: Map<SemanticRole, SemanticValue>\n ): boolean {\n const mark = tokens.mark();\n\n // Track which roles were captured before this group\n const capturedBefore = new Set(captured.keys());\n\n const success = this.matchTokenSequence(tokens, patternToken.tokens, captured);\n\n if (!success) {\n tokens.reset(mark);\n // Clear any roles that were partially captured during the failed group match\n for (const role of captured.keys()) {\n if (!capturedBefore.has(role)) {\n captured.delete(role);\n }\n }\n return patternToken.optional || false;\n }\n\n return true;\n }\n\n /**\n * Get the type of match for a token against a value.\n * Used for confidence calculation.\n */\n private getMatchType(\n token: LanguageToken,\n value: string\n ): 'exact' | 'normalized' | 'stem' | 'case-insensitive' | 'none' {\n // Exact match (highest confidence)\n if (token.value === value) return 'exact';\n\n // Explicit keyword map normalized match (high confidence)\n if (token.normalized === value) return 'normalized';\n\n // Morphologically normalized stem match (medium-high confidence)\n // Only accept if stem confidence is reasonable\n if (token.stem === value && token.stemConfidence !== undefined && token.stemConfidence >= 0.7) {\n return 'stem';\n }\n\n // Case-insensitive match for keywords (medium confidence)\n if (token.kind === 'keyword' && token.value.toLowerCase() === value.toLowerCase()) {\n return 'case-insensitive';\n }\n\n return 'none';\n }\n\n /**\n * Track stem matches for confidence calculation.\n * This is set during matching and read during confidence calculation.\n */\n private stemMatchCount: number = 0;\n private totalKeywordMatches: number = 0;\n\n // ==========================================================================\n // Depth Limits for Expression Parsing (security hardening)\n // ==========================================================================\n\n /** Maximum depth for nested property access (e.g., a.b.c.d...) */\n private static readonly MAX_PROPERTY_DEPTH = 10;\n\n /** Maximum number of arguments in method calls */\n private static readonly MAX_METHOD_ARGS = 20;\n\n /**\n * Convert a language token to a semantic value.\n */\n private tokenToSemanticValue(token: LanguageToken): SemanticValue | null {\n switch (token.kind) {\n case 'selector':\n return createSelector(token.value);\n\n case 'literal':\n return this.parseLiteralValue(token.value);\n\n case 'keyword':\n // Keywords might be references or values\n const lower = (token.normalized || token.value).toLowerCase();\n if (isValidReference(lower)) {\n return createReference(lower);\n }\n return createLiteral(token.normalized || token.value);\n\n case 'identifier':\n // Check if it's a variable reference (:varname)\n // Note: :varname doesn't match the ReferenceValue union but is used as a\n // reference token downstream — this cast preserves existing behavior\n if (token.value.startsWith(':')) {\n return createReference(token.value as ReferenceValue['value']);\n }\n // Check if it's a built-in reference\n const identLower = token.value.toLowerCase();\n if (isValidReference(identLower)) {\n return createReference(identLower);\n }\n // Regular identifiers are variable references - use 'expression' type\n // which gets converted to 'identifier' AST nodes by semantic-integration.ts\n return { type: 'expression', raw: token.value } as const;\n\n case 'url':\n // URLs are treated as string literals (paths/URLs for navigation/fetch)\n return createLiteral(token.value, 'string');\n\n default:\n return null;\n }\n }\n\n /**\n * Parse a literal value (string, number, boolean).\n */\n private parseLiteralValue(value: string): SemanticValue {\n // String literal\n if (\n value.startsWith('\"') ||\n value.startsWith(\"'\") ||\n value.startsWith('`') ||\n value.startsWith('「')\n ) {\n const inner = value.slice(1, -1);\n return createLiteral(inner, 'string');\n }\n\n // Boolean\n if (value === 'true') return createLiteral(true, 'boolean');\n if (value === 'false') return createLiteral(false, 'boolean');\n\n // Duration (number with suffix)\n const durationMatch = value.match(/^(\\d+(?:\\.\\d+)?)(ms|s|m|h)?$/);\n if (durationMatch) {\n const num = parseFloat(durationMatch[1]);\n const unit = durationMatch[2];\n if (unit) {\n return createLiteral(value, 'duration');\n }\n return createLiteral(num, 'number');\n }\n\n // Plain number\n const num = parseFloat(value);\n if (!isNaN(num)) {\n return createLiteral(num, 'number');\n }\n\n // Default to string\n return createLiteral(value, 'string');\n }\n\n /**\n * Apply extraction rules to fill in static values and defaults for missing roles.\n */\n private applyExtractionRules(\n pattern: LanguagePattern,\n captured: Map<SemanticRole, SemanticValue>\n ): void {\n for (const [role, rule] of Object.entries(pattern.extraction)) {\n if (!captured.has(role as SemanticRole)) {\n if (rule.value !== undefined) {\n // Static value extraction (e.g., action: { value: \"toggle\" })\n captured.set(role as SemanticRole, { type: 'literal', value: rule.value });\n } else if (rule.default) {\n captured.set(role as SemanticRole, rule.default);\n }\n }\n }\n }\n\n /**\n * Check if a pattern token is optional.\n */\n private isOptional(patternToken: PatternToken): boolean {\n return patternToken.type !== 'literal' && patternToken.optional === true;\n }\n\n /**\n * Calculate confidence score for a match (0-1).\n *\n * Confidence is reduced for:\n * - Stem matches (morphological normalization has inherent uncertainty)\n * - Missing optional roles (but less penalty if role has a default value)\n *\n * Confidence is increased for:\n * - VSO languages (Arabic) when pattern starts with a verb\n */\n private calculateConfidence(\n pattern: LanguagePattern,\n captured: Map<SemanticRole, SemanticValue>\n ): number {\n let score = 0;\n let maxScore = 0;\n\n // Helper to check if a role has a default value in extraction rules\n const hasDefault = (role: SemanticRole): boolean => {\n return pattern.extraction?.[role]?.default !== undefined;\n };\n\n // Score based on captured roles\n for (const token of pattern.template.tokens) {\n if (token.type === 'role') {\n maxScore += 1;\n if (captured.has(token.role)) {\n score += 1;\n }\n } else if (token.type === 'group') {\n // Group tokens are optional - weight depends on whether they have defaults\n for (const subToken of token.tokens) {\n if (subToken.type === 'role') {\n const roleHasDefault = hasDefault(subToken.role);\n const weight = 0.8; // Optional roles: 80% weight\n maxScore += weight;\n\n if (captured.has(subToken.role)) {\n // Role was explicitly provided by user\n score += weight;\n } else if (roleHasDefault) {\n // Role has a default - give 60% partial credit since command is semantically complete\n // This prevents penalizing common patterns like \"toggle .active\" (default: me)\n score += weight * 0.6;\n }\n // If no default and not captured, score += 0 (true penalty for missing info)\n }\n }\n }\n }\n\n let baseConfidence = maxScore > 0 ? score / maxScore : 1;\n\n // Apply penalty for stem matches\n // Each stem match reduces confidence slightly (e.g., 5% per stem match)\n // This ensures exact matches are preferred over morphological matches\n if (this.stemMatchCount > 0 && this.totalKeywordMatches > 0) {\n const stemPenalty = (this.stemMatchCount / this.totalKeywordMatches) * 0.15;\n baseConfidence = Math.max(0.5, baseConfidence - stemPenalty);\n }\n\n // Apply VSO confidence boost for Arabic verb-first patterns\n const vsoBoost = this.calculateVSOConfidenceBoost(pattern);\n baseConfidence = Math.min(1.0, baseConfidence + vsoBoost);\n\n // Apply preposition disambiguation adjustment for Arabic\n const prepositionAdjustment = this.arabicPrepositionDisambiguation(pattern, captured);\n baseConfidence = Math.max(0.0, Math.min(1.0, baseConfidence + prepositionAdjustment));\n\n return baseConfidence;\n }\n\n /**\n * Calculate confidence boost for VSO (Verb-Subject-Object) language patterns.\n * Arabic naturally uses VSO word order, so patterns that start with a verb\n * should receive a confidence boost.\n *\n * Returns +0.15 confidence boost if:\n * - Language is Arabic ('ar')\n * - Pattern's first token is a verb keyword\n *\n * @param pattern The language pattern being matched\n * @returns Confidence boost (0 or 0.15)\n */\n private calculateVSOConfidenceBoost(pattern: LanguagePattern): number {\n // Only apply to Arabic\n if (pattern.language !== 'ar') {\n return 0;\n }\n\n // Check if first token in pattern is a literal (keyword)\n const firstToken = pattern.template.tokens[0];\n if (!firstToken || firstToken.type !== 'literal') {\n return 0;\n }\n\n // List of Arabic verb keywords (command verbs)\n const ARABIC_VERBS = new Set([\n 'بدل',\n 'غير',\n 'أضف',\n 'أزل',\n 'ضع',\n 'اجعل',\n 'عين',\n 'زد',\n 'انقص',\n 'سجل',\n 'أظهر',\n 'أخف',\n 'شغل',\n 'أرسل',\n 'ركز',\n 'شوش',\n 'توقف',\n 'انسخ',\n 'احذف',\n 'اصنع',\n 'انتظر',\n 'انتقال',\n 'أو',\n ]);\n\n // Check if first token value is a verb\n if (ARABIC_VERBS.has(firstToken.value)) {\n return 0.15;\n }\n\n // Check alternatives\n if (firstToken.alternatives) {\n for (const alt of firstToken.alternatives) {\n if (ARABIC_VERBS.has(alt)) {\n return 0.15;\n }\n }\n }\n\n return 0;\n }\n\n /**\n * Arabic preposition disambiguation for confidence adjustment.\n *\n * Different Arabic prepositions are more or less natural for different semantic roles:\n * - على (on/upon) is preferred for patient/target roles (element selectors)\n * - إلى (to) is preferred for destination roles\n * - من (from) is preferred for source roles\n * - في (in) is preferred for location roles\n *\n * This method analyzes the prepositions used with captured semantic roles and\n * adjusts confidence based on idiomaticity:\n * - +0.10 for highly idiomatic preposition choices\n * - -0.10 for less natural preposition choices\n *\n * @param pattern The language pattern being matched\n * @param captured The captured semantic values\n * @returns Confidence adjustment (-0.10 to +0.10)\n */\n private arabicPrepositionDisambiguation(\n pattern: LanguagePattern,\n captured: Map<SemanticRole, SemanticValue>\n ): number {\n // Only apply to Arabic\n if (pattern.language !== 'ar') {\n return 0;\n }\n\n let adjustment = 0;\n\n // Preferred prepositions for each semantic role\n // Only including roles that commonly use prepositions in Arabic\n const PREFERRED_PREPOSITIONS: Partial<Record<SemanticRole, string[]>> = {\n patient: ['على'], // element selectors prefer على (on/upon)\n destination: ['إلى', 'الى'], // destination prefers إلى (to)\n source: ['من'], // source prefers من (from)\n agent: ['من'], // agent/by prefers من (from/by)\n manner: ['ب'], // manner prefers ب (with/by)\n style: ['ب'], // style prefers ب (with)\n goal: ['إلى', 'الى'], // target state prefers إلى (to)\n method: ['ب'], // method prefers ب (with/by)\n };\n\n // Check each captured role for preposition metadata\n for (const [role, value] of captured.entries()) {\n // Skip if no preferred prepositions defined for this role\n const preferred = PREFERRED_PREPOSITIONS[role];\n if (!preferred || preferred.length === 0) {\n continue;\n }\n\n // Check if the value has preposition metadata (from Arabic tokenizer)\n // This metadata is attached when a preposition particle token is consumed\n const metadata =\n 'metadata' in value ? (value as { metadata: Record<string, unknown> }).metadata : undefined;\n if (metadata && typeof metadata.prepositionValue === 'string') {\n const usedPreposition = metadata.prepositionValue;\n\n // Check if the used preposition is in the preferred list\n if (preferred.includes(usedPreposition)) {\n // Idiomatic choice - boost confidence\n adjustment += 0.1;\n } else {\n // Less natural choice - reduce confidence\n adjustment -= 0.1;\n }\n }\n }\n\n // Cap total adjustment at ±0.10 (even if multiple roles analyzed)\n return Math.max(-0.1, Math.min(0.1, adjustment));\n }\n\n // ===========================================================================\n // English Idiom Support - Noise Word Handling\n // ===========================================================================\n\n /**\n * Noise words that can be skipped in English for more natural syntax.\n * - \"the\" before selectors: \"toggle the .active\" → \"toggle .active\"\n * - \"class\" after class selectors: \"add the .visible class\" → \"add .visible\"\n */\n private static readonly ENGLISH_NOISE_WORDS = new Set(['the', 'a', 'an']);\n\n /**\n * Skip noise words like \"the\" before selectors.\n * This enables more natural English syntax like \"toggle the .active\".\n */\n private skipNoiseWords(tokens: TokenStream): void {\n const token = tokens.peek();\n if (!token) return;\n\n const tokenLower = token.value.toLowerCase();\n\n // Check if current token is a noise word (like \"the\")\n if (PatternMatcher.ENGLISH_NOISE_WORDS.has(tokenLower)) {\n // Look ahead to see if the next token is a selector\n const mark = tokens.mark();\n tokens.advance();\n const nextToken = tokens.peek();\n\n if (nextToken && nextToken.kind === 'selector') {\n // Keep the position after \"the\" - effectively skipping it\n return;\n }\n\n // Not followed by a selector, revert\n tokens.reset(mark);\n }\n\n // Also handle \"class\" after class selectors: \".visible class\" → \".visible\"\n // This is handled when the selector has already been consumed,\n // so we check if current token is \"class\" and skip it\n if (tokenLower === 'class') {\n // Skip \"class\" as it's just noise after a class selector\n tokens.advance();\n }\n }\n\n /**\n * Extract event modifiers from the token stream.\n * Event modifiers are .once, .debounce(N), .throttle(N), .queue(strategy)\n * that can appear after event names.\n *\n * Returns EventModifiers object or undefined if no modifiers found.\n */\n extractEventModifiers(tokens: TokenStream): import('../types').EventModifiers | undefined {\n const modifiers: {\n once?: boolean;\n debounce?: number;\n throttle?: number;\n queue?: 'first' | 'last' | 'all' | 'none';\n from?: SemanticValue;\n } = {};\n\n let foundModifier = false;\n\n // Consume all consecutive event modifier tokens\n while (!tokens.isAtEnd()) {\n const token = tokens.peek();\n if (!token || token.kind !== 'event-modifier') {\n break;\n }\n\n const metadata = token.metadata as\n | { modifierName: string; value?: number | string }\n | undefined;\n if (!metadata) {\n break;\n }\n\n foundModifier = true;\n\n switch (metadata.modifierName) {\n case 'once':\n modifiers.once = true;\n break;\n case 'debounce':\n if (typeof metadata.value === 'number') {\n modifiers.debounce = metadata.value;\n }\n break;\n case 'throttle':\n if (typeof metadata.value === 'number') {\n modifiers.throttle = metadata.value;\n }\n break;\n case 'queue':\n if (\n metadata.value === 'first' ||\n metadata.value === 'last' ||\n metadata.value === 'all' ||\n metadata.value === 'none'\n ) {\n modifiers.queue = metadata.value;\n }\n break;\n }\n\n tokens.advance();\n }\n\n return foundModifier ? modifiers : undefined;\n }\n}\n\n// =============================================================================\n// Convenience Functions\n// =============================================================================\n\n/**\n * Singleton pattern matcher instance.\n */\nexport const patternMatcher = new PatternMatcher();\n\n/**\n * Match tokens against a pattern.\n */\nexport function matchPattern(\n tokens: TokenStream,\n pattern: LanguagePattern\n): PatternMatchResult | null {\n return patternMatcher.matchPattern(tokens, pattern);\n}\n\n/**\n * Match tokens against multiple patterns, return best match.\n */\nexport function matchBest(\n tokens: TokenStream,\n patterns: LanguagePattern[]\n): PatternMatchResult | null {\n return patternMatcher.matchBest(tokens, patterns);\n}\n","/**\n * Token Utilities\n *\n * Core token creation, stream implementation, and character classification.\n * These are the foundational building blocks used by all tokenizers.\n */\n\nimport type { LanguageToken, TokenKind, TokenStream, StreamMark, SourcePosition } from '../types';\n\n// =============================================================================\n// Time Unit Configuration\n// =============================================================================\n\n/**\n * Configuration for a native language time unit pattern.\n * Used by tryNumberWithTimeUnits() to match language-specific time units.\n */\nexport interface TimeUnitMapping {\n /** The pattern to match (e.g., 'segundos', 'ミリ秒') */\n readonly pattern: string;\n /** The standard suffix to use (ms, s, m, h) */\n readonly suffix: string;\n /** Length of the pattern (for optimization) */\n readonly length: number;\n /** Whether to check for word boundary after the pattern */\n readonly checkBoundary?: boolean;\n /** Character that cannot follow the pattern (e.g., 's' for 'm' to avoid 'ms') */\n readonly notFollowedBy?: string;\n /** Whether to do case-insensitive matching */\n readonly caseInsensitive?: boolean;\n}\n\n// =============================================================================\n// Token Stream Implementation\n// =============================================================================\n\n/**\n * Concrete implementation of TokenStream.\n */\nexport class TokenStreamImpl implements TokenStream {\n readonly tokens: readonly LanguageToken[];\n readonly language: string;\n private pos: number = 0;\n\n constructor(tokens: LanguageToken[], language: string) {\n this.tokens = tokens;\n this.language = language;\n }\n\n peek(offset: number = 0): LanguageToken | null {\n const index = this.pos + offset;\n if (index < 0 || index >= this.tokens.length) {\n return null;\n }\n return this.tokens[index];\n }\n\n advance(): LanguageToken {\n if (this.isAtEnd()) {\n throw new Error('Unexpected end of token stream');\n }\n return this.tokens[this.pos++];\n }\n\n isAtEnd(): boolean {\n return this.pos >= this.tokens.length;\n }\n\n mark(): StreamMark {\n return { position: this.pos };\n }\n\n reset(mark: StreamMark): void {\n this.pos = mark.position;\n }\n\n position(): number {\n return this.pos;\n }\n\n /**\n * Get remaining tokens as an array.\n */\n remaining(): LanguageToken[] {\n return this.tokens.slice(this.pos);\n }\n\n /**\n * Consume tokens while predicate is true.\n */\n takeWhile(predicate: (token: LanguageToken) => boolean): LanguageToken[] {\n const result: LanguageToken[] = [];\n while (!this.isAtEnd() && predicate(this.peek()!)) {\n result.push(this.advance());\n }\n return result;\n }\n\n /**\n * Skip tokens while predicate is true.\n */\n skipWhile(predicate: (token: LanguageToken) => boolean): void {\n while (!this.isAtEnd() && predicate(this.peek()!)) {\n this.advance();\n }\n }\n}\n\n// =============================================================================\n// Shared Tokenization Utilities\n// =============================================================================\n\n/**\n * Create a source position from start and end offsets.\n */\nexport function createPosition(start: number, end: number): SourcePosition {\n return { start, end };\n}\n\n/**\n * Options for creating a token with optional morphological data.\n */\nexport interface CreateTokenOptions {\n /** Explicitly normalized form from keyword map */\n normalized?: string;\n /** Morphologically normalized stem */\n stem?: string;\n /** Confidence in the stem (0.0-1.0) */\n stemConfidence?: number;\n}\n\n/**\n * Create a language token.\n */\nexport function createToken(\n value: string,\n kind: TokenKind,\n position: SourcePosition,\n normalizedOrOptions?: string | CreateTokenOptions\n): LanguageToken {\n // Handle legacy string argument for backward compatibility\n if (typeof normalizedOrOptions === 'string') {\n return { value, kind, position, normalized: normalizedOrOptions };\n }\n\n // Handle options object\n if (normalizedOrOptions) {\n const { normalized, stem, stemConfidence } = normalizedOrOptions;\n return {\n value,\n kind,\n position,\n ...(normalized !== undefined && { normalized }),\n ...(stem !== undefined && { stem }),\n ...(stemConfidence !== undefined && { stemConfidence }),\n };\n }\n\n return { value, kind, position };\n}\n\n/**\n * Check if a character is whitespace.\n */\nexport function isWhitespace(char: string): boolean {\n return /\\s/.test(char);\n}\n\n/**\n * Check if a string starts with a CSS selector prefix.\n * Includes JSX-style element selectors: <form />, <div>\n */\nexport function isSelectorStart(char: string): boolean {\n return (\n char === '#' || char === '.' || char === '[' || char === '@' || char === '*' || char === '<'\n );\n}\n\n/**\n * Check if a character is a quote (string delimiter).\n */\nexport function isQuote(char: string): boolean {\n return char === '\"' || char === \"'\" || char === '`' || char === '「' || char === '」';\n}\n\n/**\n * Check if a character is a digit.\n */\nexport function isDigit(char: string): boolean {\n return /\\d/.test(char);\n}\n\n/**\n * Check if a character is an ASCII letter.\n */\nexport function isAsciiLetter(char: string): boolean {\n return /[a-zA-Z]/.test(char);\n}\n\n/**\n * Check if a character is part of an ASCII identifier.\n */\nexport function isAsciiIdentifierChar(char: string): boolean {\n return /[a-zA-Z0-9_-]/.test(char);\n}\n","/**\n * Tokenizer Registry\n *\n * Provides a unified interface for tokenization.\n * Delegates to the central registry for language lookups.\n *\n * For tree-shaking, import specific tokenizers directly:\n * import { englishTokenizer } from './tokenizers/english';\n *\n * To register languages, import the language modules:\n * import '@lokascript/semantic/languages/en';\n */\n\nimport type { LanguageTokenizer, TokenStream } from '../types';\nimport {\n tryGetTokenizer,\n getRegisteredLanguages,\n isLanguageRegistered,\n tokenize as registryTokenize,\n registerTokenizer as registryRegisterTokenizer,\n} from '../registry';\n\n// =============================================================================\n// Registry Delegation\n// =============================================================================\n\n/**\n * Get a tokenizer for the specified language.\n * Returns undefined if language is not registered.\n */\nexport function getTokenizer(language: string): LanguageTokenizer | undefined {\n return tryGetTokenizer(language);\n}\n\n/**\n * Tokenize input in the specified language.\n * @throws Error if language is not registered\n */\nexport function tokenize(input: string, language: string): TokenStream {\n return registryTokenize(input, language);\n}\n\n/**\n * Get all supported languages.\n * Returns only languages that have been registered.\n */\nexport function getSupportedLanguages(): string[] {\n return getRegisteredLanguages();\n}\n\n/**\n * Check if a language is supported.\n */\nexport function isLanguageSupported(language: string): boolean {\n return isLanguageRegistered(language);\n}\n\n/**\n * Register a custom tokenizer.\n * Note: For full language support, use registerLanguage() from registry instead.\n */\nexport function registerTokenizer(tokenizer: LanguageTokenizer): void {\n registryRegisterTokenizer(tokenizer);\n}\n\n// =============================================================================\n// Re-exports (tree-shakeable - only included if imported)\n// =============================================================================\n\nexport { englishTokenizer } from './english';\nexport { japaneseTokenizer } from './japanese';\nexport { koreanTokenizer } from './korean';\nexport { arabicTokenizer } from './arabic';\nexport { spanishTokenizer } from './spanish';\nexport { turkishTokenizer } from './turkish';\nexport { chineseTokenizer } from './chinese';\nexport { portugueseTokenizer } from './portuguese';\nexport { frenchTokenizer } from './french';\nexport { germanTokenizer } from './german';\nexport { indonesianTokenizer } from './indonesian';\nexport { quechuaTokenizer } from './quechua';\nexport { swahiliTokenizer } from './swahili';\nexport { italianTokenizer } from './italian';\nexport { vietnameseTokenizer } from './vietnamese';\nexport { polishTokenizer } from './polish';\nexport { russianTokenizer } from './russian';\nexport { ukrainianTokenizer } from './ukrainian';\nexport { hebrewTokenizer } from './he';\nexport { hindiTokenizer } from './hindi';\nexport { bengaliTokenizer } from './bengali';\nexport { thaiTokenizer } from './thai';\n\nexport { malayTokenizer } from './ms';\n\nexport { tagalogTokenizer } from './tl';\n\nexport {\n BaseTokenizer,\n TokenStreamImpl,\n createToken,\n createPosition,\n extractCssSelector,\n extractStringLiteral,\n extractNumber,\n isUrlStart,\n extractUrl,\n // Character classification utilities\n isWhitespace,\n isSelectorStart,\n isQuote,\n isDigit,\n isAsciiLetter,\n isAsciiIdentifierChar,\n // Factory functions for custom tokenizers\n createUnicodeRangeClassifier,\n combineClassifiers,\n createLatinCharClassifiers,\n} from './base';\n\n// Types for profile-derived keyword initialization and custom tokenizers\nexport type {\n KeywordEntry,\n TokenizerProfile,\n TimeUnitMapping,\n UnicodeRange,\n LatinCharClassifiers,\n CreateTokenOptions,\n} from './base';\n","/**\n * Shared Event Handler Utilities\n *\n * Event name translations and normalization used across all languages.\n */\n\n/**\n * Common event names translated across languages.\n * Used by tokenizers to normalize event names to English.\n */\nexport const eventNameTranslations: Record<string, Record<string, string>> = {\n // Korean event names → English\n ko: {\n 클릭: 'click',\n 입력: 'input',\n 변경: 'change',\n 제출: 'submit',\n 키다운: 'keydown',\n 키업: 'keyup',\n 마우스오버: 'mouseover',\n 마우스아웃: 'mouseout',\n 마우스다운: 'mousedown',\n 마우스업: 'mouseup',\n 포커스: 'focus',\n 블러: 'blur',\n 로드: 'load',\n 리사이즈: 'resize',\n 스크롤: 'scroll',\n },\n // Japanese event names → English\n ja: {\n クリック: 'click',\n 入力: 'input',\n 変更: 'change',\n 送信: 'submit',\n キーダウン: 'keydown',\n キーアップ: 'keyup',\n キープレス: 'keypress',\n マウスオーバー: 'mouseover',\n マウスアウト: 'mouseout',\n マウス押下: 'mousedown',\n マウス解放: 'mouseup',\n フォーカス: 'focus',\n ブラー: 'blur',\n ロード: 'load',\n 読み込み: 'load',\n サイズ変更: 'resize',\n スクロール: 'scroll',\n },\n // Arabic event names → English\n ar: {\n النقر: 'click',\n نقر: 'click',\n الإدخال: 'input',\n إدخال: 'input',\n التغيير: 'change',\n تغيير: 'change',\n الإرسال: 'submit',\n إرسال: 'submit',\n 'ضغط المفتاح': 'keydown',\n 'رفع المفتاح': 'keyup',\n 'تمرير الماوس': 'mouseover',\n التركيز: 'focus',\n تحميل: 'load',\n تمرير: 'scroll',\n },\n // Spanish event names → English\n es: {\n clic: 'click',\n click: 'click',\n entrada: 'input',\n cambio: 'change',\n envío: 'submit',\n enviar: 'submit',\n 'tecla abajo': 'keydown',\n 'tecla arriba': 'keyup',\n 'ratón encima': 'mouseover',\n 'ratón fuera': 'mouseout',\n enfoque: 'focus',\n desenfoque: 'blur',\n carga: 'load',\n desplazamiento: 'scroll',\n },\n // Turkish event names → English\n tr: {\n tıklama: 'click',\n tıkla: 'click',\n tık: 'click',\n giriş: 'input',\n girdi: 'input',\n değişiklik: 'change',\n değişim: 'change',\n gönderme: 'submit',\n gönder: 'submit',\n tuşbasma: 'keydown',\n tuşbırakma: 'keyup',\n fare_bas: 'mousedown',\n fare_bırak: 'mouseup',\n fareiçinde: 'mouseover',\n faredışında: 'mouseout',\n odaklanma: 'focus',\n odak: 'focus',\n bulanıklık: 'blur',\n yükleme: 'load',\n yükle: 'load',\n boyut_değiştir: 'resize',\n kaydırma: 'scroll',\n },\n // Portuguese event names → English\n pt: {\n clique: 'click',\n clicar: 'click',\n click: 'click',\n entrada: 'input',\n inserir: 'input',\n mudança: 'change',\n mudanca: 'change',\n alterar: 'change',\n envio: 'submit',\n enviar: 'submit',\n 'tecla baixo': 'keydown',\n 'tecla cima': 'keyup',\n 'pressionar tecla': 'keydown',\n 'soltar tecla': 'keyup',\n 'mouse sobre': 'mouseover',\n 'mouse fora': 'mouseout',\n foco: 'focus',\n focar: 'focus',\n desfoque: 'blur',\n desfocar: 'blur',\n carregar: 'load',\n carregamento: 'load',\n rolagem: 'scroll',\n rolar: 'scroll',\n },\n // Chinese event names → English\n zh: {\n 点击: 'click',\n 单击: 'click',\n 双击: 'dblclick',\n 输入: 'input',\n 改变: 'change',\n 变化: 'change',\n 变更: 'change',\n 提交: 'submit',\n 发送: 'submit',\n 按键: 'keydown',\n 键入: 'keydown',\n 松键: 'keyup',\n 鼠标进入: 'mouseover',\n 鼠标移入: 'mouseover',\n 鼠标离开: 'mouseout',\n 鼠标移出: 'mouseout',\n 焦点: 'focus',\n 聚焦: 'focus',\n 失焦: 'blur',\n 模糊: 'blur',\n 加载: 'load',\n 载入: 'load',\n 滚动: 'scroll',\n },\n // French event names → English\n fr: {\n clic: 'click',\n cliquer: 'click',\n click: 'click',\n saisie: 'input',\n entrée: 'input',\n changement: 'change',\n changer: 'change',\n soumettre: 'submit',\n soumission: 'submit',\n envoi: 'submit',\n 'touche bas': 'keydown',\n 'touche haut': 'keyup',\n 'souris dessus': 'mouseover',\n 'souris dehors': 'mouseout',\n focus: 'focus',\n focaliser: 'focus',\n défocus: 'blur',\n défocaliser: 'blur',\n chargement: 'load',\n charger: 'load',\n défilement: 'scroll',\n défiler: 'scroll',\n },\n // German event names → English\n de: {\n klick: 'click',\n klicken: 'click',\n click: 'click',\n eingabe: 'input',\n eingeben: 'input',\n änderung: 'change',\n ändern: 'change',\n absenden: 'submit',\n einreichen: 'submit',\n 'taste runter': 'keydown',\n 'taste hoch': 'keyup',\n 'maus über': 'mouseover',\n 'maus raus': 'mouseout',\n fokus: 'focus',\n fokussieren: 'focus',\n defokussieren: 'blur',\n unschärfe: 'blur',\n laden: 'load',\n ladung: 'load',\n scrollen: 'scroll',\n blättern: 'scroll',\n },\n // Indonesian event names → English\n id: {\n klik: 'click',\n click: 'click',\n masukan: 'input',\n input: 'input',\n ubah: 'change',\n perubahan: 'change',\n kirim: 'submit',\n 'tekan tombol': 'keydown',\n 'lepas tombol': 'keyup',\n 'mouse masuk': 'mouseover',\n 'mouse keluar': 'mouseout',\n fokus: 'focus',\n blur: 'blur',\n muat: 'load',\n memuat: 'load',\n gulir: 'scroll',\n menggulir: 'scroll',\n },\n // Bengali event names → English\n bn: {\n ক্লিক: 'click',\n ইনপুট: 'input',\n জমা: 'submit',\n লোড: 'load',\n স্ক্রোল: 'scroll',\n রিসাইজ: 'resize',\n ঝাপসা: 'blur',\n ফোকাস: 'focus',\n পরিবর্তন: 'change',\n },\n // Quechua event names → English (loanwords with native adaptations)\n qu: {\n click: 'click',\n \"ñit'iy\": 'click',\n ñitiy: 'click',\n yaykuchiy: 'input',\n yaykuy: 'input',\n tikray: 'change',\n \"t'ikray\": 'change',\n apachiy: 'submit',\n kachay: 'submit',\n 'llave uray': 'keydown',\n 'llave hawa': 'keyup',\n \"q'away\": 'focus',\n qhaway: 'focus',\n paqariy: 'blur',\n \"mana q'away\": 'blur',\n cargay: 'load',\n apakuy: 'load',\n apamuy: 'load',\n kunray: 'scroll',\n muyuy: 'scroll',\n hatun_kay: 'resize',\n },\n // Swahili event names → English\n sw: {\n bofya: 'click',\n click: 'click',\n kubofya: 'click',\n ingiza: 'input',\n kubadilisha: 'change',\n mabadiliko: 'change',\n tuma: 'submit',\n kutuma: 'submit',\n 'bonyeza chini': 'keydown',\n 'bonyeza juu': 'keyup',\n 'panya juu': 'mouseover',\n 'panya nje': 'mouseout',\n lenga: 'focus',\n kulenga: 'focus',\n blur: 'blur',\n pakia: 'load',\n kupakia: 'load',\n sogeza: 'scroll',\n kusogeza: 'scroll',\n },\n};\n\n/**\n * Normalize an event name to English.\n */\nexport function normalizeEventName(event: string, language: string): string {\n const translations = eventNameTranslations[language];\n if (translations && translations[event]) {\n return translations[event];\n }\n return event.toLowerCase();\n}\n","/**\n * Explicit Mode Renderer\n *\n * Renders semantic nodes to explicit [command role:value] syntax.\n * Also renders to natural language syntax for any supported language.\n */\n\nimport type {\n SemanticNode,\n EventHandlerSemanticNode,\n CompoundSemanticNode,\n SemanticValue,\n SemanticRenderer as ISemanticRenderer,\n LanguagePattern,\n ReferenceValue,\n PropertyPathValue,\n} from '../types';\n// Import from registry for tree-shaking (registry uses directly-registered patterns first)\nimport { getPatternsForLanguageAndCommand, tryGetProfile } from '../registry';\nimport { getSupportedLanguages as getTokenizerLanguages } from '../tokenizers';\n\n// =============================================================================\n// Semantic Renderer Implementation\n// =============================================================================\n\nexport class SemanticRendererImpl implements ISemanticRenderer {\n /**\n * Render a semantic node in the specified language.\n */\n render(node: SemanticNode, language: string): string {\n // Handle compound nodes specially (e.g., \"cmd1 then cmd2\")\n if (node.kind === 'compound') {\n return this.renderCompound(node as CompoundSemanticNode, language);\n }\n\n const patterns = getPatternsForLanguageAndCommand(language, node.action);\n\n if (patterns.length === 0) {\n // Fall back to explicit syntax if no patterns\n return this.renderExplicit(node);\n }\n\n // Find the best pattern for rendering (prefer patterns that match our roles)\n const bestPattern = this.findBestPattern(node, patterns);\n\n if (!bestPattern) {\n return this.renderExplicit(node);\n }\n\n return this.renderWithPattern(node, bestPattern);\n }\n\n /**\n * Render a compound node (multiple statements chained with then/and).\n */\n private renderCompound(node: CompoundSemanticNode, language: string): string {\n const renderedStatements = node.statements.map(stmt => this.render(stmt, language));\n const chainWord = this.getChainWord(node.chainType, language);\n return renderedStatements.join(` ${chainWord} `);\n }\n\n /**\n * Get the translated chain word for the given language.\n */\n private getChainWord(chainType: 'then' | 'and' | 'async', language: string): string {\n const profile = tryGetProfile(language);\n if (!profile?.keywords) {\n // Fall back to English\n return chainType;\n }\n\n // Map chain types to keyword lookup\n const keyword = profile.keywords[chainType];\n return keyword?.primary ?? chainType;\n }\n\n /**\n * Render a semantic node in explicit mode.\n */\n renderExplicit(node: SemanticNode): string {\n // Handle compound nodes\n if (node.kind === 'compound') {\n const compoundNode = node as CompoundSemanticNode;\n const renderedStatements = compoundNode.statements.map(stmt => this.renderExplicit(stmt));\n return renderedStatements.join(` ${compoundNode.chainType} `);\n }\n\n const parts: string[] = [node.action];\n\n // Add roles\n for (const [role, value] of node.roles) {\n parts.push(`${role}:${this.valueToString(value)}`);\n }\n\n // Handle event handler body\n if (node.kind === 'event-handler') {\n const eventNode = node as EventHandlerSemanticNode;\n if (eventNode.body && eventNode.body.length > 0) {\n const bodyParts = eventNode.body.map(n => this.renderExplicit(n));\n parts.push(`body:${bodyParts.join(' ')}`);\n }\n }\n\n return `[${parts.join(' ')}]`;\n }\n\n /**\n * Get all supported languages.\n */\n supportedLanguages(): string[] {\n return getTokenizerLanguages();\n }\n\n /**\n * Find the best pattern for rendering a semantic node.\n *\n * For rendering, we prefer \"standard\" patterns (e.g., \"on click\") over\n * native idiom patterns (e.g., \"when clicked\") because standard patterns\n * are more recognizable and closer to the original hyperscript syntax.\n */\n private findBestPattern(node: SemanticNode, patterns: LanguagePattern[]): LanguagePattern | null {\n // Score patterns by how well they match our roles\n const scored = patterns.map(pattern => {\n let score = pattern.priority;\n\n // Check each role token in the pattern\n for (const token of pattern.template.tokens) {\n if (token.type === 'role') {\n if (node.roles.has(token.role)) {\n // Bonus for patterns that use roles we have\n score += 10;\n } else if (!token.optional) {\n // Heavy penalty for patterns that require roles we DON'T have\n // This prevents selecting \"source\" patterns when there's no source\n score -= 50;\n }\n }\n }\n\n // For English rendering, prefer \"standard\" patterns over \"native idiom\" patterns\n // This ensures \"on click\" is preferred over \"when clicked\" for English output\n // Only apply this boost for English - other languages should use their native idioms\n if (pattern.language === 'en') {\n if (pattern.id.includes('standard') || pattern.id.includes('en-source')) {\n score += 20; // Boost standard patterns for English rendering\n }\n // Penalize English \"when\", \"if\", \"upon\" variants (good for parsing, not output)\n if (\n pattern.id.includes('-when') ||\n pattern.id.includes('-if') ||\n pattern.id.includes('-upon')\n ) {\n score -= 15;\n }\n }\n\n return { pattern, score };\n });\n\n scored.sort((a, b) => b.score - a.score);\n\n return scored.length > 0 ? scored[0].pattern : null;\n }\n\n /**\n * Render a semantic node using a specific pattern.\n */\n private renderWithPattern(node: SemanticNode, pattern: LanguagePattern): string {\n const parts: string[] = [];\n const language = pattern.language;\n\n for (const token of pattern.template.tokens) {\n const rendered = this.renderPatternToken(token, node, language);\n if (rendered !== null) {\n parts.push(rendered);\n }\n }\n\n // Handle event handler body (render separately after pattern)\n if (node.kind === 'event-handler') {\n const eventNode = node as EventHandlerSemanticNode;\n if (eventNode.body && eventNode.body.length > 0) {\n const bodyParts = eventNode.body.map(n => this.render(n, language));\n parts.push(bodyParts.join(' '));\n }\n }\n\n return parts.join(' ');\n }\n\n /**\n * Render a single pattern token.\n */\n private renderPatternToken(token: any, node: SemanticNode, language: string): string | null {\n switch (token.type) {\n case 'literal':\n return token.value;\n\n case 'role': {\n const value = node.roles.get(token.role);\n if (!value) {\n if (token.optional) return null;\n // Use default if available\n return null;\n }\n return this.valueToNaturalString(value, language);\n }\n\n case 'group': {\n // Check if we have all required roles in the group\n const hasRequired = token.tokens\n .filter((t: any) => t.type === 'role' && !t.optional)\n .every((t: any) => node.roles.has(t.role));\n\n if (!hasRequired && token.optional) {\n return null;\n }\n\n // For optional groups with destination role, skip if destination is \"me\" (the default)\n // This avoids rendering \"on me\" / \"en yo\" when it's implicit\n if (token.optional) {\n const destToken = token.tokens.find(\n (t: any) => t.type === 'role' && t.role === 'destination'\n );\n if (destToken) {\n const destValue = node.roles.get('destination');\n if (destValue?.type === 'reference' && destValue.value === 'me') {\n return null; // Skip rendering default \"me\" destination\n }\n }\n }\n\n const groupParts: string[] = [];\n for (const subToken of token.tokens) {\n const rendered = this.renderPatternToken(subToken, node, language);\n if (rendered !== null) {\n groupParts.push(rendered);\n }\n }\n\n return groupParts.length > 0 ? groupParts.join(' ') : null;\n }\n\n default:\n return null;\n }\n }\n\n /**\n * Convert a semantic value to a string for explicit syntax.\n */\n private valueToString(value: SemanticValue): string {\n switch (value.type) {\n case 'literal':\n if (typeof value.value === 'string') {\n // Check if it needs quoting\n if (value.dataType === 'string' || /\\s/.test(value.value)) {\n return `\"${value.value}\"`;\n }\n return value.value;\n }\n return String(value.value);\n\n case 'selector':\n return value.value;\n\n case 'reference':\n return value.value;\n\n case 'property-path':\n return `${this.valueToString(value.object)}'s ${value.property}`;\n\n case 'expression':\n return value.raw;\n }\n }\n\n /**\n * Convert a semantic value to natural language string.\n * Uses language-specific possessive rendering when language is provided.\n */\n private valueToNaturalString(value: SemanticValue, language: string = 'en'): string {\n switch (value.type) {\n case 'literal':\n if (typeof value.value === 'string' && value.dataType === 'string') {\n return `\"${value.value}\"`;\n }\n return String(value.value);\n\n case 'selector':\n return value.value;\n\n case 'reference':\n return this.renderReference(value, language);\n\n case 'property-path':\n return this.renderPropertyPath(value, language);\n\n case 'expression':\n return value.raw;\n }\n }\n\n /**\n * Render a reference value in the target language.\n */\n private renderReference(value: ReferenceValue, language: string): string {\n const profile = tryGetProfile(language);\n if (!profile?.references) {\n return value.value; // Fall back to English reference\n }\n return profile.references[value.value] ?? value.value;\n }\n\n /**\n * Render a property-path value (possessive expression) in the target language.\n *\n * Examples by language:\n * - English: \"my value\", \"its opacity\", \"#el's value\"\n * - Japanese: \"自分の value\", \"それの opacity\"\n * - Korean: \"내 value\", \"그것의 opacity\"\n * - Spanish: \"mi value\", \"su opacity\"\n * - Chinese: \"我的 value\", \"它的 opacity\"\n */\n private renderPropertyPath(value: PropertyPathValue, language: string): string {\n const profile = tryGetProfile(language);\n const property = value.property;\n\n // Get the object reference\n const objectRef = value.object.type === 'reference' ? value.object.value : null;\n\n // Check for special possessive forms (e.g., me → my, it → its)\n if (profile?.possessive?.specialForms && objectRef) {\n const specialForm = profile.possessive.specialForms[objectRef];\n if (specialForm) {\n const { markerPosition, usePossessiveAdjectives } = profile.possessive;\n\n // Handle different word orders based on marker position\n if (usePossessiveAdjectives && markerPosition === 'after-object') {\n // Languages like Arabic, Indonesian: \"value لي\", \"value saya\"\n // Possessive pronoun comes after the property\n return `${property} ${specialForm}`;\n }\n // Languages like Spanish, German, French, Korean: \"mi value\", \"mein value\", \"내 value\"\n // Possessive pronoun comes before the property\n return `${specialForm} ${property}`;\n }\n }\n\n // Get the rendered object string\n const objectStr = this.valueToNaturalString(value.object, language);\n\n // Use language-specific possessive construction\n if (profile?.possessive) {\n const { marker, markerPosition, usePossessiveAdjectives } = profile.possessive;\n\n // Languages that use possessive adjectives without explicit object reference\n if (usePossessiveAdjectives && objectRef) {\n // Fall back to generic construction if no special form\n // e.g., Indonesian: \"value saya\" (property + possessor)\n if (markerPosition === 'after-object') {\n return `${property} ${objectStr}`;\n }\n }\n\n // Particle/marker-based languages\n if (marker) {\n switch (markerPosition) {\n case 'between':\n // Japanese: \"自分の value\", Chinese: \"我的 value\", Korean: \"나의 value\"\n return profile.usesSpaces\n ? `${objectStr}${marker} ${property}`\n : `${objectStr}${marker}${property}`;\n\n case 'after-object':\n // Quechua: \"ñuqapa value\"\n return `${objectStr}${marker} ${property}`;\n\n case 'before-property':\n // Spanish (with de): \"value de yo\" (rarely used, usually special forms)\n return `${objectStr} ${marker} ${property}`;\n }\n }\n }\n\n // Default: English-style possessive \"'s\"\n // Handle special English cases\n if (language === 'en' || !profile?.possessive) {\n if (objectStr === 'me') {\n return `my ${property}`;\n }\n if (objectStr === 'it') {\n return `its ${property}`;\n }\n return `${objectStr}'s ${property}`;\n }\n\n // Generic fallback\n return `${objectStr} ${property}`;\n }\n}\n\n// =============================================================================\n// Convenience Functions\n// =============================================================================\n\n/**\n * Singleton renderer instance.\n */\nexport const semanticRenderer = new SemanticRendererImpl();\n\n/**\n * Render a semantic node in the specified language.\n */\nexport function render(node: SemanticNode, language: string): string {\n return semanticRenderer.render(node, language);\n}\n\n/**\n * Render a semantic node in explicit mode.\n */\nexport function renderExplicit(node: SemanticNode): string {\n return semanticRenderer.renderExplicit(node);\n}\n","/**\n * Explicit Mode Parser\n *\n * Parses the explicit [command role:value ...] syntax.\n * This syntax is universal across all languages and makes\n * semantic roles visible for learning and debugging.\n *\n * Syntax:\n * [command role1:value1 role2:value2 ...]\n *\n * Examples:\n * [toggle class:.active target:#button]\n * [put content:\"hello\" destination:#output]\n * [on event:click body:[toggle class:.active]]\n */\n\nimport type { SemanticNode, SemanticValue, SemanticRole, ActionType } from '../types';\nimport {\n createCommandNode,\n createEventHandler,\n createSelector,\n createLiteral,\n createReference,\n isValidReference,\n} from '../types';\n\n// =============================================================================\n// Explicit Syntax Parser\n// =============================================================================\n\n/**\n * Parse explicit syntax into a semantic node.\n */\nexport function parseExplicit(input: string): SemanticNode {\n const trimmed = input.trim();\n\n if (!trimmed.startsWith('[') || !trimmed.endsWith(']')) {\n throw new Error('Explicit syntax must be wrapped in brackets: [command role:value ...]');\n }\n\n const content = trimmed.slice(1, -1).trim();\n if (!content) {\n throw new Error('Empty explicit statement');\n }\n\n const tokens = tokenizeExplicit(content);\n if (tokens.length === 0) {\n throw new Error('No command specified in explicit statement');\n }\n\n const command = tokens[0].toLowerCase() as ActionType;\n const roles = new Map<SemanticRole, SemanticValue>();\n\n // Parse role:value pairs\n for (let i = 1; i < tokens.length; i++) {\n const token = tokens[i];\n const colonIndex = token.indexOf(':');\n\n if (colonIndex === -1) {\n throw new Error(`Invalid role format: \"${token}\". Expected role:value`);\n }\n\n const role = token.slice(0, colonIndex) as SemanticRole;\n const valueStr = token.slice(colonIndex + 1);\n\n // Handle nested explicit syntax for body\n if (role === ('body' as SemanticRole) && valueStr.startsWith('[')) {\n // Find matching bracket\n const nestedEnd = findMatchingBracket(token, colonIndex + 1);\n const nestedSyntax = token.slice(colonIndex + 1, nestedEnd + 1);\n roles.set(role, { type: 'expression', raw: nestedSyntax });\n continue;\n }\n\n const value = parseExplicitValue(valueStr);\n roles.set(role, value);\n }\n\n // Build appropriate node type\n if (command === 'on') {\n const eventValue = roles.get('event');\n if (!eventValue) {\n throw new Error('Event handler requires event role: [on event:click ...]');\n }\n\n // Parse body if present\n const bodyValue = roles.get('body' as SemanticRole);\n const body: SemanticNode[] = [];\n if (bodyValue && bodyValue.type === 'expression') {\n body.push(parseExplicit(bodyValue.raw));\n }\n\n roles.delete('body' as SemanticRole);\n\n return createEventHandler(eventValue, body, undefined, {\n sourceLanguage: 'explicit',\n });\n }\n\n // Regular command\n const rolesObj: Record<string, SemanticValue> = {};\n for (const [role, value] of roles) {\n rolesObj[role] = value;\n }\n\n return createCommandNode(command, rolesObj, {\n sourceLanguage: 'explicit',\n });\n}\n\n/**\n * Tokenize explicit syntax content (space-separated, respecting quotes and brackets).\n */\nfunction tokenizeExplicit(content: string): string[] {\n const tokens: string[] = [];\n let current = '';\n let inString = false;\n let stringChar = '';\n let bracketDepth = 0;\n\n for (let i = 0; i < content.length; i++) {\n const char = content[i];\n\n if (inString) {\n current += char;\n if (char === stringChar && content[i - 1] !== '\\\\') {\n inString = false;\n }\n continue;\n }\n\n if (char === '\"' || char === \"'\") {\n inString = true;\n stringChar = char;\n current += char;\n continue;\n }\n\n if (char === '[') {\n bracketDepth++;\n current += char;\n continue;\n }\n\n if (char === ']') {\n bracketDepth--;\n current += char;\n continue;\n }\n\n if (char === ' ' && bracketDepth === 0) {\n if (current) {\n tokens.push(current);\n current = '';\n }\n continue;\n }\n\n current += char;\n }\n\n if (current) {\n tokens.push(current);\n }\n\n return tokens;\n}\n\n/**\n * Parse a value string into a SemanticValue.\n */\nfunction parseExplicitValue(valueStr: string): SemanticValue {\n // CSS selector\n if (\n valueStr.startsWith('#') ||\n valueStr.startsWith('.') ||\n valueStr.startsWith('[') ||\n valueStr.startsWith('@') ||\n valueStr.startsWith('*')\n ) {\n return createSelector(valueStr);\n }\n\n // String literal\n if (valueStr.startsWith('\"') || valueStr.startsWith(\"'\")) {\n const inner = valueStr.slice(1, -1);\n return createLiteral(inner, 'string');\n }\n\n // Boolean\n if (valueStr === 'true') return createLiteral(true, 'boolean');\n if (valueStr === 'false') return createLiteral(false, 'boolean');\n\n // Reference\n const lowerRef = valueStr.toLowerCase();\n if (isValidReference(lowerRef)) {\n return createReference(lowerRef);\n }\n\n // Number (possibly with duration suffix)\n const numMatch = valueStr.match(/^(-?\\d+(?:\\.\\d+)?)(ms|s|m|h)?$/);\n if (numMatch) {\n const num = parseFloat(numMatch[1]);\n const suffix = numMatch[2];\n if (suffix) {\n return createLiteral(valueStr, 'duration');\n }\n return createLiteral(num, 'number');\n }\n\n // Default to string\n return createLiteral(valueStr, 'string');\n}\n\n/**\n * Find the matching closing bracket.\n */\nfunction findMatchingBracket(str: string, start: number): number {\n let depth = 0;\n\n for (let i = start; i < str.length; i++) {\n if (str[i] === '[') depth++;\n else if (str[i] === ']') {\n depth--;\n if (depth === 0) return i;\n }\n }\n\n return str.length - 1;\n}\n\n/**\n * Check if input is explicit syntax.\n */\nexport function isExplicitSyntax(input: string): boolean {\n const trimmed = input.trim();\n return trimmed.startsWith('[') && trimmed.endsWith(']');\n}\n","/**\n * Semantic Parser\n *\n * The main parser that converts natural language hyperscript to semantic nodes.\n * Combines tokenization and pattern matching.\n */\n\nimport type {\n SemanticNode,\n CommandSemanticNode,\n EventHandlerSemanticNode,\n SemanticParser as ISemanticParser,\n SemanticValue,\n ActionType,\n LanguagePattern,\n LanguageToken,\n} from '../types';\nimport {\n createCommandNode,\n createEventHandler,\n createCompoundNode,\n createSelector,\n createLiteral,\n createReference,\n} from '../types';\nimport {\n tokenize as tokenizeInternal,\n getSupportedLanguages as getTokenizerLanguages,\n TokenStreamImpl,\n} from '../tokenizers';\n// Import from registry for tree-shaking (registry uses directly-registered patterns first)\nimport { getPatternsForLanguage, tryGetProfile } from '../registry';\nimport { patternMatcher } from './pattern-matcher';\nimport { eventNameTranslations } from '../patterns/event-handler/shared';\nimport { render as renderExplicitFn } from '../explicit/renderer';\nimport { parseExplicit as parseExplicitFn } from '../explicit/parser';\n\n// =============================================================================\n// Semantic Parser Implementation\n// =============================================================================\n\nexport class SemanticParserImpl implements ISemanticParser {\n /**\n * Parse input in the specified language to a semantic node.\n */\n parse(input: string, language: string): SemanticNode {\n // Extract standalone event modifiers (once, debounced, throttled) from input\n const { modifiers, remainingInput } = this.extractStandaloneModifiers(input, language);\n const parseInput = remainingInput || input;\n\n // Tokenize the input\n const tokens = tokenizeInternal(parseInput, language);\n\n // Get patterns for this language\n const patterns = getPatternsForLanguage(language);\n\n if (patterns.length === 0) {\n throw new Error(`No patterns available for language: ${language}`);\n }\n\n // Sort patterns by priority (descending)\n const sortedPatterns = [...patterns].sort((a, b) => b.priority - a.priority);\n\n // Try to match event handler patterns first (they wrap commands)\n const eventPatterns = sortedPatterns.filter(p => p.command === 'on');\n const eventMatch = patternMatcher.matchBest(tokens, eventPatterns);\n\n if (eventMatch) {\n const handler = this.buildEventHandler(eventMatch, tokens, language);\n return modifiers ? this.applyModifiers(handler, modifiers) : handler;\n }\n\n // Try command patterns\n const commandPatterns = sortedPatterns.filter(p => p.command !== 'on');\n const commandMatch = patternMatcher.matchBest(tokens, commandPatterns);\n\n if (commandMatch) {\n return this.buildCommand(commandMatch, language);\n }\n\n // Try SOV event trigger extraction: detect embedded event keywords\n // (e.g., \"クリック で\" in JA, \"클릭 에\" in KO, \"tıklama de\" in TR)\n // and extract them to parse the remaining tokens as command body\n const sovResult = this.trySOVEventExtraction(parseInput, language, sortedPatterns);\n if (sovResult) {\n return modifiers\n ? this.applyModifiers(sovResult as EventHandlerSemanticNode, modifiers)\n : sovResult;\n }\n\n // Fallback: try parsing as multi-command compound (no event wrapper).\n // This handles patterns like \"put X into Y then set Z to W\" that have\n // then-keywords but no event trigger (e.g., custom events not in KNOWN_EVENTS).\n const compoundResult = this.tryCompoundCommandParsing(tokens, commandPatterns, language);\n if (compoundResult) {\n return compoundResult;\n }\n\n throw new Error(`Could not parse input in ${language}: ${parseInput}`);\n }\n\n /**\n * Check if input can be parsed in the specified language.\n */\n canParse(input: string, language: string): boolean {\n try {\n this.parse(input, language);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Get all supported languages.\n */\n supportedLanguages(): string[] {\n return getTokenizerLanguages();\n }\n\n /**\n * Build a command semantic node from a pattern match.\n */\n private buildCommand(\n match: ReturnType<typeof patternMatcher.matchPattern>,\n language: string\n ): CommandSemanticNode {\n if (!match) {\n throw new Error('No match to build command from');\n }\n\n const roles: Record<string, SemanticValue> = {};\n for (const [role, value] of match.captured) {\n roles[role] = value;\n }\n\n return createCommandNode(match.pattern.command, roles, {\n sourceLanguage: language,\n patternId: match.pattern.id,\n confidence: match.confidence,\n });\n }\n\n /**\n * Build an event handler semantic node from a pattern match.\n */\n private buildEventHandler(\n match: ReturnType<typeof patternMatcher.matchPattern>,\n tokens: ReturnType<typeof tokenizeInternal>,\n language: string\n ): EventHandlerSemanticNode {\n if (!match) {\n throw new Error('No match to build event handler from');\n }\n\n // Extract the event name\n const eventValue = match.captured.get('event');\n if (!eventValue) {\n throw new Error('Event handler pattern matched but no event captured');\n }\n\n // Extract event modifiers (.once, .debounce(), .throttle(), etc.)\n const eventModifiers = patternMatcher.extractEventModifiers(tokens);\n\n // Extract \"or\" conjunction events (e.g., \"click or keydown\")\n // Combines into event value string for AST builder compatibility\n const additionalEvents = this.extractOrConjunctionEvents(tokens, language);\n let resolvedEventValue = eventValue;\n if (additionalEvents.length > 0 && eventValue.type === 'literal') {\n const allEvents = [\n String(eventValue.value),\n ...additionalEvents.map(e => String('value' in e ? e.value : '')),\n ];\n resolvedEventValue = { type: 'literal', value: allEvents.join(' or ') };\n }\n\n let body: SemanticNode[];\n\n // Check if pattern captured an action (grammar-transformed patterns)\n // These patterns combine event + action in a single match\n const actionValue = match.captured.get('action');\n if (actionValue && actionValue.type === 'literal') {\n // Create a command node directly from captured roles\n const actionName = actionValue.value as string;\n const roles: Record<string, SemanticValue> = {};\n\n // Copy relevant roles (excluding event, action, and continues which are structural)\n for (const [role, value] of match.captured) {\n if (role !== 'event' && role !== 'action' && role !== 'continues') {\n roles[role] = value;\n }\n }\n\n const commandNode = createCommandNode(actionName as ActionType, roles, {\n sourceLanguage: language,\n patternId: match.pattern.id,\n confidence: match.confidence,\n });\n\n // Check if pattern has continuation marker (then-chains)\n const continuesValue = match.captured.get('continues');\n if (continuesValue && continuesValue.type === 'literal' && continuesValue.value === 'then') {\n // Parse remaining tokens as additional commands\n const commandPatterns = getPatternsForLanguage(language)\n .filter(p => p.command !== 'on')\n .sort((a, b) => b.priority - a.priority);\n\n // Include grammar-transformed continuation patterns (these have specific command types)\n // Continuation patterns have command !== 'on' and id includes 'continuation'\n const grammarContinuationPatterns = getPatternsForLanguage(language)\n .filter(p => p.id.startsWith('grammar-') && p.id.includes('-continuation'))\n .sort((a, b) => b.priority - a.priority);\n\n const remainingCommands = this.parseBodyWithGrammarPatterns(\n tokens,\n commandPatterns,\n grammarContinuationPatterns,\n language\n );\n\n if (remainingCommands.length > 0) {\n // Combine first command with remaining commands\n body = [commandNode, ...remainingCommands];\n } else {\n body = [commandNode];\n }\n } else {\n body = [commandNode];\n }\n } else {\n // Traditional parsing: parse remaining tokens as body commands\n const commandPatterns = getPatternsForLanguage(language)\n .filter(p => p.command !== 'on')\n .sort((a, b) => b.priority - a.priority);\n\n // Use parseBodyWithClauses() to properly handle multi-clause then-chains\n body = this.parseBodyWithClauses(tokens, commandPatterns, language);\n }\n\n return createEventHandler(resolvedEventValue, body, eventModifiers, {\n sourceLanguage: language,\n patternId: match.pattern.id,\n confidence: match.confidence,\n });\n }\n\n /**\n * Parse body with proper clause separation.\n * Splits the token stream at conjunction boundaries (then/それから/ثم/etc.)\n * and parses each clause independently.\n *\n * This handles multi-clause patterns like:\n * - \"toggle .active then remove .hidden\"\n * - \".active を 切り替え それから .hidden を 削除\"\n * - \"بدل .active ثم احذف .hidden\"\n *\n * @param tokens Token stream to parse\n * @param commandPatterns Command patterns for the language\n * @param language Language code\n * @returns Array of semantic nodes (one per clause)\n */\n private parseBodyWithClauses(\n tokens: ReturnType<typeof tokenizeInternal>,\n commandPatterns: LanguagePattern[],\n language: string\n ): SemanticNode[] {\n const clauses: SemanticNode[] = [];\n const currentClauseTokens: LanguageToken[] = [];\n\n while (!tokens.isAtEnd()) {\n const current = tokens.peek();\n if (!current) break;\n\n // Check if this is a conjunction token (clause boundary)\n const isConjunction =\n current.kind === 'conjunction' ||\n (current.kind === 'keyword' && this.isThenKeyword(current.value, language));\n\n // Check if this is an 'end' keyword (terminates block)\n const isEnd = current.kind === 'keyword' && this.isEndKeyword(current.value, language);\n\n if (isConjunction) {\n // We've reached a clause boundary - parse accumulated tokens\n if (currentClauseTokens.length > 0) {\n const clauseNodes = this.parseClause(currentClauseTokens, commandPatterns, language);\n clauses.push(...clauseNodes);\n currentClauseTokens.length = 0; // Clear for next clause\n }\n tokens.advance(); // Consume conjunction token\n continue;\n }\n\n if (isEnd) {\n // End of block - parse final clause if any\n if (currentClauseTokens.length > 0) {\n const clauseNodes = this.parseClause(currentClauseTokens, commandPatterns, language);\n clauses.push(...clauseNodes);\n }\n tokens.advance(); // Consume 'end' token\n break;\n }\n\n // Accumulate token for current clause\n currentClauseTokens.push(current);\n tokens.advance();\n }\n\n // Parse any remaining tokens as final clause\n if (currentClauseTokens.length > 0) {\n const clauseNodes = this.parseClause(currentClauseTokens, commandPatterns, language);\n clauses.push(...clauseNodes);\n }\n\n // If we have multiple clauses, wrap in CompoundSemanticNode\n if (clauses.length > 1) {\n return [createCompoundNode(clauses, 'then', { sourceLanguage: language })];\n }\n\n return clauses;\n }\n\n /**\n * Parse a single clause (sequence of tokens between conjunctions).\n * Returns array of semantic nodes parsed from the clause.\n */\n private parseClause(\n clauseTokens: LanguageToken[],\n commandPatterns: LanguagePattern[],\n language: string\n ): SemanticNode[] {\n if (clauseTokens.length === 0) {\n return [];\n }\n\n // Create a TokenStream from the clause tokens\n const clauseStream = new TokenStreamImpl(clauseTokens, language);\n const commands: SemanticNode[] = [];\n\n while (!clauseStream.isAtEnd()) {\n // Try to match as a command\n const commandMatch = patternMatcher.matchBest(clauseStream, commandPatterns);\n if (commandMatch) {\n commands.push(this.buildCommand(commandMatch, language));\n } else {\n // Skip unrecognized token\n clauseStream.advance();\n }\n }\n\n // If pattern matching produced nothing, try verb-anchored SOV parsing.\n // The grammar transformer often puts the verb BETWEEN roles for two-role commands:\n // e.g., \"destination を verb patient に\" instead of \"destination を patient に verb\"\n // Pattern matching fails because it expects strict SOV order (verb at end).\n if (commands.length === 0) {\n const sovCommands = this.parseSOVClauseByVerbAnchoring(clauseTokens, language);\n if (sovCommands.length > 0) {\n return sovCommands;\n }\n }\n\n return commands;\n }\n\n // ==========================================================================\n // SOV Verb-Anchored Clause Parsing\n // ==========================================================================\n\n /**\n * Build a lookup from native verb keywords to action names for a language profile.\n */\n private static buildVerbLookup(profile: {\n keywords: Record<string, { primary: string; alternatives?: string[]; normalized?: string }>;\n }): Map<string, string> {\n const lookup = new Map<string, string>();\n for (const [action, kw] of Object.entries(profile.keywords)) {\n // Skip non-command keywords (on, if, else, etc.)\n if (\n ['on', 'if', 'else', 'when', 'where', 'while', 'for', 'end', 'then', 'and'].includes(action)\n ) {\n continue;\n }\n lookup.set(kw.primary.toLowerCase(), action);\n if (kw.alternatives) {\n for (const alt of kw.alternatives) {\n lookup.set(alt.toLowerCase(), action);\n }\n }\n }\n return lookup;\n }\n\n /**\n * Build a lookup from role marker strings to role names.\n */\n private static buildMarkerToRoleLookup(profile: {\n roleMarkers: Record<string, { primary: string; alternatives?: string[] }>;\n }): Map<string, string> {\n const lookup = new Map<string, string>();\n for (const [role, marker] of Object.entries(profile.roleMarkers)) {\n if (!marker) continue;\n lookup.set(marker.primary, role);\n if (marker.alternatives) {\n for (const alt of marker.alternatives) {\n // Avoid overwriting more specific roles with generic ones\n if (!lookup.has(alt)) {\n lookup.set(alt, role);\n }\n }\n }\n }\n return lookup;\n }\n\n /**\n * Parse an SOV clause by finding command verbs and extracting roles from surrounding tokens.\n *\n * The grammar transformer often produces \"verb-in-middle\" order for two-role commands:\n * \"[role1] [marker1] [verb] [role2] [marker2]\"\n *\n * This method:\n * 1. Scans for recognized command verbs in the token stream\n * 2. For each verb, extracts pre-verb and post-verb tokens as roles\n * 3. Uses marker tokens to determine which semantic role each value belongs to\n */\n private parseSOVClauseByVerbAnchoring(\n clauseTokens: LanguageToken[],\n language: string\n ): SemanticNode[] {\n const profile = tryGetProfile(language);\n if (!profile || profile.wordOrder !== 'SOV') return [];\n\n const verbLookup = SemanticParserImpl.buildVerbLookup(profile);\n const markerToRole = SemanticParserImpl.buildMarkerToRoleLookup(profile);\n const commands: SemanticNode[] = [];\n\n let pos = 0;\n\n while (pos < clauseTokens.length) {\n // Find the next verb token\n let verbIdx = -1;\n let verbAction = '';\n\n for (let i = pos; i < clauseTokens.length; i++) {\n const token = clauseTokens[i];\n const byValue = verbLookup.get(token.value.toLowerCase());\n const byNormalized = token.normalized\n ? verbLookup.get(token.normalized.toLowerCase())\n : undefined;\n const action = byValue || byNormalized;\n\n if (action) {\n verbIdx = i;\n verbAction = action;\n break;\n }\n }\n\n if (verbIdx === -1) break; // No more verbs found\n\n // Tokens before verb = pre-verb arguments\n const preVerbTokens = clauseTokens.slice(pos, verbIdx);\n\n // Find end of this command: next verb, then-keyword, or end of tokens\n let endIdx = clauseTokens.length;\n for (let i = verbIdx + 1; i < clauseTokens.length; i++) {\n const t = clauseTokens[i];\n // Stop at then-keywords\n if (t.kind === 'conjunction' || this.isThenKeyword(t.value, language)) {\n endIdx = i;\n break;\n }\n // Stop at the next verb (start of new command) — but only if preceded by a marker\n // This prevents stopping at \"value\" tokens that happen to match a verb name\n if (i > verbIdx + 1) {\n const nextAction =\n verbLookup.get(t.value.toLowerCase()) ||\n (t.normalized ? verbLookup.get(t.normalized.toLowerCase()) : undefined);\n if (nextAction) {\n endIdx = i;\n break;\n }\n }\n }\n\n // Tokens after verb = post-verb arguments\n const postVerbTokens = clauseTokens.slice(verbIdx + 1, endIdx);\n\n // Extract roles from pre-verb and post-verb tokens using markers\n const roles = this.extractRolesFromMarkedTokens(\n preVerbTokens,\n postVerbTokens,\n markerToRole,\n verbAction,\n language\n );\n\n commands.push(\n createCommandNode(verbAction as ActionType, roles, {\n sourceLanguage: language,\n confidence: 0.7,\n })\n );\n\n pos = endIdx;\n // Skip conjunction/then-keyword if present\n if (pos < clauseTokens.length) {\n const t = clauseTokens[pos];\n if (t.kind === 'conjunction' || this.isThenKeyword(t.value, language)) {\n pos++;\n }\n }\n }\n\n return commands;\n }\n\n /**\n * Extract semantic roles from pre-verb and post-verb token groups using marker analysis.\n *\n * Recognizes patterns like:\n * pre-verb: [expr] [を] → patient (obj marker)\n * post-verb: [expr] [に] → destination (to marker)\n * pre-verb: [expr] [から] → source (from marker)\n */\n private extractRolesFromMarkedTokens(\n preVerbTokens: LanguageToken[],\n postVerbTokens: LanguageToken[],\n markerToRole: Map<string, string>,\n action: string,\n _language: string\n ): Record<string, SemanticValue> {\n const roles: Record<string, SemanticValue> = {};\n\n // Process a group of tokens: collect value tokens until a marker is found\n const processGroup = (tokens: LanguageToken[]) => {\n let valueTokens: LanguageToken[] = [];\n\n for (const token of tokens) {\n const role = markerToRole.get(token.value);\n if (role && token.kind === 'particle' && valueTokens.length > 0) {\n // This is a marker — assign the preceding value tokens to this role\n const value = this.tokensToSemanticValue(valueTokens);\n if (value) {\n // Map the role name, avoiding overwrites of existing roles\n const roleKey = this.mapRoleForCommand(role, action, roles);\n if (roleKey) {\n roles[roleKey] = value;\n }\n }\n valueTokens = [];\n } else {\n valueTokens.push(token);\n }\n }\n\n // Remaining tokens without a following marker\n if (valueTokens.length > 0) {\n const value = this.tokensToSemanticValue(valueTokens);\n if (value) {\n // Unmarked trailing tokens: assign based on what's missing\n if (!roles.patient) {\n roles.patient = value;\n } else if (!roles.destination) {\n roles.destination = value;\n }\n }\n }\n };\n\n processGroup(preVerbTokens);\n processGroup(postVerbTokens);\n\n return roles;\n }\n\n /**\n * Map a marker-derived role name to the appropriate semantic role for a command,\n * handling cases where marker roles overlap (e.g., both patient and destination\n * use similar particles in some languages).\n */\n private mapRoleForCommand(\n markerRole: string,\n _action: string,\n existingRoles: Record<string, SemanticValue>\n ): string | null {\n // Direct mapping — if the role isn't taken yet, use it\n if (!existingRoles[markerRole]) {\n return markerRole;\n }\n\n // If the marker role is already taken, try to assign to a related role\n // For \"set\" and \"put\": patient marker (を/i) is the destination, dest marker (に/e) is the patient value\n if (markerRole === 'patient' && !existingRoles.destination) {\n return 'destination';\n }\n if (markerRole === 'destination' && !existingRoles.patient) {\n return 'patient';\n }\n if (markerRole === 'source' && !existingRoles.source) {\n return 'source';\n }\n\n return null; // Can't assign\n }\n\n /**\n * Convert a sequence of tokens into a single SemanticValue.\n */\n private tokensToSemanticValue(tokens: LanguageToken[]): SemanticValue | null {\n if (tokens.length === 0) return null;\n\n // Filter out noise tokens (whitespace, etc.)\n const meaningful = tokens.filter(t => (t.kind as string) !== 'whitespace');\n if (meaningful.length === 0) return null;\n\n // Single token — use its type directly\n if (meaningful.length === 1) {\n return this.tokenToSemanticValue(meaningful[0]);\n }\n\n // Multiple tokens — concatenate values and infer type from the first token\n const combined = meaningful.map(t => t.value).join('');\n const first = meaningful[0];\n\n if (\n first.kind === 'selector' ||\n first.value.startsWith('#') ||\n first.value.startsWith('.') ||\n first.value.startsWith('@') ||\n first.value.startsWith('*')\n ) {\n return createSelector(combined);\n }\n if (first.kind === 'literal' || first.value.startsWith('\"') || first.value.startsWith(\"'\")) {\n return createLiteral(combined);\n }\n if ((first.kind as string) === 'reference') {\n return createReference(combined as 'me' | 'it' | 'you' | 'result');\n }\n\n return createLiteral(combined);\n }\n\n /**\n * Convert a single token to a SemanticValue.\n */\n private tokenToSemanticValue(token: LanguageToken): SemanticValue {\n const val = token.value;\n\n // Selectors: #id, .class, @attr, *cssProperty\n if (\n token.kind === 'selector' ||\n val.startsWith('#') ||\n val.startsWith('.') ||\n val.startsWith('@') ||\n val.startsWith('*')\n ) {\n return createSelector(val);\n }\n\n // String literals\n if (val.startsWith('\"') || val.startsWith(\"'\")) {\n return createLiteral(val);\n }\n\n // Numbers\n if (/^-?\\d+(\\.\\d+)?$/.test(val)) {\n return createLiteral(parseFloat(val));\n }\n\n // Booleans (including translated forms)\n if (val === 'true' || val === '真' || val === '참' || val === 'doğru') {\n return createLiteral(true);\n }\n if (val === 'false' || val === '偽' || val === '거짓' || val === 'yanlış') {\n return createLiteral(false);\n }\n\n // References: me, it, you (check normalized form)\n const ref = token.normalized?.toLowerCase();\n if (ref === 'me' || ref === 'it' || ref === 'you' || ref === 'result' || ref === 'body') {\n return createReference(ref as 'me' | 'it' | 'you' | 'result');\n }\n if ((token.kind as string) === 'reference') {\n return createReference((token.normalized as 'me' | 'it' | 'you') || 'me');\n }\n\n // Default to literal\n return createLiteral(val);\n }\n\n /**\n * Parse body commands with support for grammar-transformed patterns.\n * Used after a grammar-transformed pattern with continuation marker.\n */\n private parseBodyWithGrammarPatterns(\n tokens: ReturnType<typeof tokenizeInternal>,\n commandPatterns: LanguagePattern[],\n grammarPatterns: LanguagePattern[],\n language: string\n ): SemanticNode[] {\n const commands: SemanticNode[] = [];\n\n while (!tokens.isAtEnd()) {\n const current = tokens.peek();\n\n // Check for 'then' keyword - skip it and continue parsing\n if (current && this.isThenKeyword(current.value, language)) {\n tokens.advance();\n continue;\n }\n\n // Check for 'end' keyword - terminates block\n if (current && this.isEndKeyword(current.value, language)) {\n tokens.advance();\n break;\n }\n\n let matched = false;\n\n // Try grammar-transformed continuation patterns first\n // These patterns have command set to the actual command type (e.g., 'remove', 'toggle')\n if (grammarPatterns.length > 0) {\n const grammarMatch = patternMatcher.matchBest(tokens, grammarPatterns);\n if (grammarMatch) {\n // Use the pattern's command field as the action\n const actionName = grammarMatch.pattern.command;\n const roles: Record<string, SemanticValue> = {};\n\n // Copy relevant roles (excluding structural roles)\n for (const [role, value] of grammarMatch.captured) {\n if (role !== 'event' && role !== 'action' && role !== 'continues') {\n roles[role] = value;\n }\n }\n\n const commandNode = createCommandNode(actionName as ActionType, roles, {\n sourceLanguage: language,\n patternId: grammarMatch.pattern.id,\n });\n commands.push(commandNode);\n matched = true;\n\n // Check if this pattern also has continuation\n const continuesValue = grammarMatch.captured.get('continues');\n if (\n continuesValue &&\n continuesValue.type === 'literal' &&\n continuesValue.value === 'then'\n ) {\n // Continue parsing for more commands\n continue;\n }\n }\n }\n\n // Try regular command patterns\n if (!matched) {\n const commandMatch = patternMatcher.matchBest(tokens, commandPatterns);\n if (commandMatch) {\n commands.push(this.buildCommand(commandMatch, language));\n matched = true;\n }\n }\n\n // Skip unrecognized token\n if (!matched) {\n tokens.advance();\n }\n }\n\n return commands;\n }\n\n // ==========================================================================\n // Multi-Command Compound Fallback\n // ==========================================================================\n\n /**\n * Try parsing input as a multi-command compound (no event wrapper).\n * Handles standalone command sequences separated by then-keywords.\n * Used as a last resort when no event trigger is detected.\n */\n private tryCompoundCommandParsing(\n tokens: ReturnType<typeof tokenizeInternal>,\n commandPatterns: LanguagePattern[],\n language: string\n ): SemanticNode | null {\n // Only try if the input contains then-keywords (otherwise single-command already tried)\n const allTokens = tokens.tokens;\n const hasThenKeyword = allTokens.some(\n t =>\n t.kind === 'conjunction' || (t.kind === 'keyword' && this.isThenKeyword(t.value, language))\n );\n if (!hasThenKeyword) return null;\n\n // Reset token stream and parse using clause-based parsing\n const freshStream = new TokenStreamImpl(allTokens as LanguageToken[], language);\n const body = this.parseBodyWithClauses(freshStream, commandPatterns, language);\n\n if (body.length === 0) return null;\n\n // Return the compound node (or single command if only one clause parsed)\n if (body.length === 1) {\n return body[0];\n }\n return createCompoundNode(body, 'then', {\n sourceLanguage: language,\n confidence: 0.65,\n });\n }\n\n // ==========================================================================\n // SOV Event Trigger Extraction\n // ==========================================================================\n\n /**\n * Known event names for detection (common DOM events).\n */\n private static readonly KNOWN_EVENTS = new Set([\n 'click',\n 'dblclick',\n 'input',\n 'change',\n 'submit',\n 'keydown',\n 'keyup',\n 'keypress',\n 'mouseover',\n 'mouseout',\n 'mousedown',\n 'mouseup',\n 'focus',\n 'blur',\n 'load',\n 'scroll',\n 'resize',\n 'contextmenu',\n ]);\n\n /**\n * SOV event marker particles per language (postpositions that mark the event role).\n * Korean has no event marker particle -- the event keyword stands alone.\n */\n private static readonly SOV_EVENT_MARKERS: Record<string, Set<string>> = {\n ja: new Set(['で']),\n ko: new Set(), // Korean doesn't use event marker particles\n tr: new Set(['de', 'da', 'te', 'ta']),\n bn: new Set(['এ']),\n qu: new Set(['pi']),\n };\n\n /**\n * SOV source markers (\"from\" equivalents) and window tokens per language.\n * Used to strip \"from window/elsewhere\" event modifiers.\n */\n private static readonly SOV_SOURCE_MARKERS: Record<\n string,\n { markers: Set<string>; windowTokens: Set<string> }\n > = {\n ja: {\n markers: new Set(['から']),\n windowTokens: new Set(['ウィンドウ', 'ドキュメント', 'window', 'document']),\n },\n ko: {\n markers: new Set(['에서']),\n windowTokens: new Set(['창', '윈도우', '문서', 'window', 'document']),\n },\n tr: {\n markers: new Set(['den', 'dan', 'ten', 'tan']),\n windowTokens: new Set(['pencere', 'belge', 'window', 'document']),\n },\n bn: {\n markers: new Set(['থেকে', 'মধ্যে']),\n windowTokens: new Set(['উইন্ডো', 'ডকুমেন্ট', 'window', 'document']),\n },\n qu: {\n markers: new Set(['manta']),\n windowTokens: new Set(['k_iri', 'ventana', 'window', 'document']),\n },\n };\n\n /**\n * Try to extract an embedded event trigger from SOV grammar-transformed text.\n *\n * SOV languages embed the event trigger within the sentence:\n * JA: \".active を クリック で 切り替え\" (patient event-marker action)\n * KO: \".active 를 클릭 에 토글\" (patient event-marker action)\n * TR: \".active i tıklama de değiştir\" (patient event-marker action)\n *\n * This method detects the [event_keyword] [event_particle] pair,\n * removes those tokens, and parses the remaining tokens as command body.\n */\n private trySOVEventExtraction(\n input: string,\n language: string,\n patterns: LanguagePattern[]\n ): SemanticNode | null {\n const eventMarkers = SemanticParserImpl.SOV_EVENT_MARKERS[language];\n if (!eventMarkers) return null;\n\n const tokens = tokenizeInternal(input, language);\n const allTokens = tokens.tokens;\n\n // Build a set of native event names for this language (from eventNameTranslations)\n const langEvents = eventNameTranslations[language];\n const nativeEventNames = new Set<string>();\n if (langEvents) {\n for (const native of Object.keys(langEvents)) {\n nativeEventNames.add(native.toLowerCase());\n }\n }\n\n // Source markers for \"from window/elsewhere\" stripping per language\n const sourceMarkers = SemanticParserImpl.SOV_SOURCE_MARKERS[language];\n\n // Scan for event keyword + optional event marker particle pattern\n let eventIndex = -1;\n let eventName = '';\n let keyFilter = '';\n let tokensToRemove = 1; // How many tokens to strip (1 = event only, 2 = event + marker)\n\n for (let i = 0; i < allTokens.length; i++) {\n const token = allTokens[i];\n const tokenValue = token.value.toLowerCase();\n\n // Strip bracket key-filter from event token value for matching\n // e.g., \"keydown[key==\\\"Escape\\\"]\" → \"keydown\" (with filter extracted)\n let bareEventValue = tokenValue;\n let tokenKeyFilter = '';\n const bracketIdx = tokenValue.indexOf('[');\n if (bracketIdx > 0) {\n bareEventValue = tokenValue.slice(0, bracketIdx);\n tokenKeyFilter = token.value.slice(bracketIdx);\n }\n\n // Check if this token is a known event name (by normalized value, native text, or bare value)\n const normalizedLower = token.normalized?.toLowerCase();\n const isEventByNormalized =\n normalizedLower && SemanticParserImpl.KNOWN_EVENTS.has(normalizedLower);\n const isEventByNative =\n nativeEventNames.has(tokenValue) || nativeEventNames.has(bareEventValue);\n const isEventByBare = SemanticParserImpl.KNOWN_EVENTS.has(bareEventValue);\n\n if (isEventByNormalized || isEventByNative || isEventByBare) {\n // Resolve the English event name\n let resolvedName: string;\n if (isEventByNormalized) {\n resolvedName = normalizedLower!;\n } else if (isEventByNative) {\n resolvedName = langEvents?.[tokenValue] ?? langEvents?.[bareEventValue] ?? bareEventValue;\n } else {\n resolvedName = bareEventValue;\n }\n\n if (eventMarkers.size > 0) {\n // Languages with event markers (JA, TR): require marker after event keyword\n // The marker may be at i+1 (direct) or i+2 (if there's a bracket key-filter selector between)\n let markerOffset = 1;\n const nextToken = allTokens[i + 1];\n // Skip over bracket selector token (e.g., [key==\"Escape\"]) between event and marker\n if (nextToken && nextToken.kind === 'selector' && nextToken.value.startsWith('[')) {\n markerOffset = 2;\n }\n const markerToken = allTokens[i + markerOffset];\n if (\n markerToken &&\n (markerToken.kind === 'particle' || markerToken.kind === 'keyword') &&\n eventMarkers.has(markerToken.value)\n ) {\n eventIndex = i;\n eventName = resolvedName;\n keyFilter = tokenKeyFilter || (markerOffset === 2 ? allTokens[i + 1].value : '');\n tokensToRemove = markerOffset + 1; // Remove event keyword + optional filter + marker\n break;\n }\n } else {\n // Languages without event markers (KO): event keyword stands alone\n eventIndex = i;\n eventName = resolvedName;\n keyFilter = tokenKeyFilter;\n tokensToRemove = 1; // Remove event keyword only\n break;\n }\n }\n }\n\n if (eventIndex === -1) return null;\n\n // Build the list of indices to remove: event keyword + marker\n const removeIndices = new Set<number>();\n for (let i = eventIndex; i < eventIndex + tokensToRemove; i++) {\n removeIndices.add(i);\n }\n\n // Strip \"from window/elsewhere\" source modifiers near the event\n // Pattern: [source-marker] appears after event marker (JA: から, KO: 에서, TR: den/dan/ten/tan)\n // Or the source element (window/ウィンドウ/창/pencere) may appear before the event\n if (sourceMarkers) {\n const afterEventEnd = eventIndex + tokensToRemove;\n\n // Check for source marker right after event+marker (e.g., \"keydown で から\")\n if (afterEventEnd < allTokens.length) {\n const afterToken = allTokens[afterEventEnd];\n if (\n (afterToken.kind === 'particle' || afterToken.kind === 'keyword') &&\n sourceMarkers.markers.has(afterToken.value)\n ) {\n removeIndices.add(afterEventEnd);\n }\n }\n\n // Check for source element (window token) before the event\n // It could be immediately before, or earlier in the stream\n for (let i = 0; i < eventIndex; i++) {\n const t = allTokens[i];\n const tLower = t.value.toLowerCase();\n const tNorm = t.normalized?.toLowerCase();\n if (\n sourceMarkers.windowTokens.has(tLower) ||\n (tNorm && sourceMarkers.windowTokens.has(tNorm))\n ) {\n removeIndices.add(i);\n break;\n }\n }\n }\n\n // Remove marked tokens from the array\n const bodyTokens = allTokens.filter((_, idx) => !removeIndices.has(idx));\n\n if (bodyTokens.length === 0) return null;\n\n // Parse body tokens as command(s)\n const commandPatterns = patterns.filter(p => p.command !== 'on');\n const bodyStream = new TokenStreamImpl(bodyTokens, language);\n\n // Use clause-based parsing to handle then-chains\n const body = this.parseBodyWithClauses(bodyStream, commandPatterns, language);\n\n if (body.length === 0) return null;\n\n // Build event metadata including key filter and source info\n const metadata: Record<string, unknown> = {\n sourceLanguage: language,\n confidence: 0.75,\n };\n if (keyFilter) {\n metadata.keyFilter = keyFilter;\n }\n\n return createEventHandler({ type: 'literal', value: eventName }, body, undefined, metadata);\n }\n\n /**\n * Check if a token is a 'then' keyword in the given language.\n */\n private isThenKeyword(value: string, language: string): boolean {\n const thenKeywords: Record<string, Set<string>> = {\n en: new Set(['then']),\n ja: new Set(['それから', '次に', 'そして']),\n ar: new Set(['ثم', 'بعدها', 'ثمّ']),\n es: new Set(['entonces', 'luego', 'después']),\n ko: new Set(['그다음', '그리고', '그런후', '그러면']),\n zh: new Set(['然后', '接着', '之后']),\n tr: new Set(['sonra', 'ardından', 'daha sonra']),\n pt: new Set(['então', 'depois', 'logo']),\n fr: new Set(['puis', 'ensuite', 'alors']),\n de: new Set(['dann', 'danach', 'anschließend']),\n id: new Set(['lalu', 'kemudian', 'setelah itu']),\n tl: new Set(['pagkatapos', 'tapos']),\n bn: new Set(['তারপর', 'পরে']),\n qu: new Set(['chaymantataq', 'hinaspa', 'chaymanta', 'chayqa']),\n sw: new Set(['kisha', 'halafu', 'baadaye']),\n };\n const keywords = thenKeywords[language] || thenKeywords.en;\n return keywords.has(value.toLowerCase());\n }\n\n /**\n * Check if a token is an 'end' keyword in the given language.\n */\n private isEndKeyword(value: string, language: string): boolean {\n const endKeywords: Record<string, Set<string>> = {\n en: new Set(['end']),\n ja: new Set(['終わり', '終了', 'おわり']),\n ar: new Set(['نهاية', 'انتهى', 'آخر']),\n es: new Set(['fin', 'final', 'terminar']),\n ko: new Set(['끝', '종료', '마침']),\n zh: new Set(['结束', '终止', '完']),\n tr: new Set(['son', 'bitiş', 'bitti']),\n pt: new Set(['fim', 'final', 'término']),\n fr: new Set(['fin', 'terminer', 'finir']),\n de: new Set(['ende', 'beenden', 'fertig']),\n id: new Set(['selesai', 'akhir', 'tamat']),\n tl: new Set(['wakas', 'tapos']),\n bn: new Set(['সমাপ্ত']),\n qu: new Set(['tukukuy', 'tukuy', 'puchukay']),\n sw: new Set(['mwisho', 'maliza', 'tamati']),\n };\n const keywords = endKeywords[language] || endKeywords.en;\n return keywords.has(value.toLowerCase());\n }\n\n /**\n * Standalone event modifier keywords (loanwords used across languages).\n * Pattern: `[modifier] [preposition?] [duration?] [rest...]`\n */\n private static readonly STANDALONE_MODIFIERS: Record<string, 'once' | 'debounce' | 'throttle'> = {\n once: 'once',\n debounced: 'debounce',\n debounce: 'debounce',\n throttled: 'throttle',\n throttle: 'throttle',\n };\n\n /**\n * \"Or\" conjunction keywords across languages for multiple events.\n * Maps lowercase keyword → true. Used to detect \"click or keydown\" patterns.\n */\n private static readonly OR_KEYWORDS = new Set([\n 'or', // EN\n 'أو', // AR\n 'o', // ES, TL\n 'ou', // PT, FR\n 'oder', // DE\n 'atau', // ID\n 'atau', // MS (same as ID)\n '或', // ZH\n 'または', // JA\n '또는', // KO\n 'veya', // TR\n 'অথবা', // BN\n 'utaq', // QU\n 'au', // SW\n 'або', // UK\n 'или', // RU\n 'hoặc', // VI\n 'lub', // PL\n 'או', // HE\n 'หรือ', // TH\n 'o', // IT\n ]);\n\n /**\n * Extract standalone event modifiers from the beginning of input.\n * Returns the modifiers (if any) and the remaining input string.\n */\n private extractStandaloneModifiers(\n input: string,\n _language: string\n ): {\n modifiers: { once?: boolean; debounce?: number; throttle?: number } | null;\n remainingInput: string | null;\n } {\n const tokens = tokenizeInternal(input, _language);\n const allTokens = tokens.tokens;\n\n if (allTokens.length === 0) return { modifiers: null, remainingInput: null };\n\n const firstToken = allTokens[0];\n const firstLower = firstToken.value.toLowerCase();\n const modType = SemanticParserImpl.STANDALONE_MODIFIERS[firstLower];\n\n if (!modType) return { modifiers: null, remainingInput: null };\n\n const modifiers: { once?: boolean; debounce?: number; throttle?: number } = {};\n let tokensToSkip = 1; // At least the modifier keyword\n\n if (modType === 'once') {\n modifiers.once = true;\n } else {\n // debounce/throttle: look for optional preposition + duration\n let nextIdx = 1;\n\n // Skip preposition tokens (sa, عند, at, etc.)\n if (nextIdx < allTokens.length) {\n const nextToken = allTokens[nextIdx];\n // Skip keyword/particle tokens that are prepositions (not selectors, literals, etc.)\n if (nextToken.kind === 'keyword' || nextToken.kind === 'particle') {\n nextIdx++;\n tokensToSkip++;\n }\n }\n\n // Look for duration (number with unit like \"100ms\", \"300ms\")\n if (nextIdx < allTokens.length) {\n const durToken = allTokens[nextIdx];\n if (durToken.kind === 'literal') {\n const match = durToken.value.match(/^(\\d+)(ms|s|m)?$/);\n if (match) {\n let ms = parseInt(match[1], 10);\n const unit = match[2] || 'ms';\n if (unit === 's') ms *= 1000;\n else if (unit === 'm') ms *= 60000;\n modifiers[modType] = ms;\n tokensToSkip = nextIdx + 1;\n }\n }\n }\n\n // If no duration found, use default\n if (!modifiers[modType]) {\n modifiers[modType] = modType === 'debounce' ? 300 : 100;\n }\n }\n\n // Reconstruct remaining input from the tokens after the modifier\n const remainingTokens = allTokens.slice(tokensToSkip);\n if (remainingTokens.length === 0) return { modifiers: null, remainingInput: null };\n\n // Use position data to extract the remaining input string\n const startPos = remainingTokens[0].position.start;\n const remainingInput = input.slice(startPos);\n\n return { modifiers, remainingInput };\n }\n\n /**\n * Apply standalone modifiers to an event handler node.\n */\n private applyModifiers(\n node: EventHandlerSemanticNode,\n modifiers: { once?: boolean; debounce?: number; throttle?: number }\n ): EventHandlerSemanticNode {\n return {\n ...node,\n eventModifiers: {\n ...node.eventModifiers,\n ...modifiers,\n },\n };\n }\n\n /**\n * Extract \"or\" conjunction events from the token stream.\n * If the next tokens follow the pattern \"or EVENT [or EVENT ...]\",\n * consume them and return the additional event values.\n *\n * The token stream is advanced past any consumed \"or EVENT\" tokens.\n */\n private extractOrConjunctionEvents(\n tokens: Pick<ReturnType<typeof tokenizeInternal>, 'peek' | 'advance' | 'mark' | 'reset'>,\n _language: string\n ): SemanticValue[] {\n const additionalEvents: SemanticValue[] = [];\n\n while (true) {\n const mark = tokens.mark();\n const orToken = tokens.peek();\n if (!orToken) break;\n\n const orLower = (orToken.normalized || orToken.value).toLowerCase();\n if (!SemanticParserImpl.OR_KEYWORDS.has(orLower)) {\n tokens.reset(mark);\n break;\n }\n\n // Consume the \"or\" token\n tokens.advance();\n\n // Next token should be the event name\n const eventToken = tokens.peek();\n if (!eventToken) {\n // \"or\" at end of input — revert\n tokens.reset(mark);\n break;\n }\n\n // Normalize event name using shared translations\n const eventLower = (eventToken.normalized || eventToken.value).toLowerCase();\n\n // Accept it as an event (could be native or English event name)\n tokens.advance();\n additionalEvents.push({ type: 'literal', value: eventLower });\n }\n\n return additionalEvents;\n }\n}\n\n// =============================================================================\n// Convenience Functions\n// =============================================================================\n\n/**\n * Singleton parser instance.\n */\nexport const semanticParser = new SemanticParserImpl();\n\n/**\n * Parse input in the specified language.\n */\nexport function parse(input: string, language: string): SemanticNode {\n return semanticParser.parse(input, language);\n}\n\n/**\n * Check if input can be parsed.\n */\nexport function canParse(input: string, language: string): boolean {\n return semanticParser.canParse(input, language);\n}\n\n/**\n * Parse and return command type if parseable.\n */\nexport function getCommandType(input: string, language: string): ActionType | null {\n try {\n const node = semanticParser.parse(input, language);\n return node.action;\n } catch {\n return null;\n }\n}\n\n// =============================================================================\n// Additional Public API Functions\n// =============================================================================\n\n/**\n * Tokenize input for a specific language.\n */\nexport function tokenize(input: string, language: string) {\n return tokenizeInternal(input, language);\n}\n\n/**\n * Get list of supported languages.\n */\nexport function getSupportedLanguages(): string[] {\n return getTokenizerLanguages();\n}\n\n/**\n * Translate hyperscript between languages.\n */\nexport function translate(input: string, sourceLang: string, targetLang: string): string {\n const node = parse(input, sourceLang);\n return render(node, targetLang);\n}\n\n/**\n * Get translations for all supported languages.\n */\nexport function getAllTranslations(input: string, sourceLang: string): Record<string, string> {\n const node = parse(input, sourceLang);\n const result: Record<string, string> = {};\n for (const lang of getSupportedLanguages()) {\n try {\n result[lang] = render(node, lang);\n } catch {\n // Skip languages that can't render this command\n }\n }\n return result;\n}\n\n/**\n * Create a semantic analyzer for parsing with confidence scores.\n */\nexport function createSemanticAnalyzer() {\n return {\n analyze(input: string, language: string) {\n try {\n const node = parse(input, language);\n return { node, confidence: 1.0, success: true };\n } catch (error) {\n return { node: null, confidence: 0, success: false, error };\n }\n },\n };\n}\n\n/**\n * Render a SemanticNode to hyperscript in a specific language.\n */\nexport function render(node: SemanticNode, language: string): string {\n return renderExplicitFn(node, language);\n}\n\n/**\n * Render a SemanticNode in explicit syntax format.\n */\nexport function renderExplicit(node: SemanticNode): string {\n return renderExplicitFn(node, 'explicit');\n}\n\n/**\n * Parse explicit syntax format.\n */\nexport function parseExplicit(input: string): SemanticNode {\n return parseExplicitFn(input);\n}\n\n/**\n * Convert natural language to explicit syntax.\n */\nexport function toExplicit(input: string, language: string): string {\n const node = parse(input, language);\n return renderExplicit(node);\n}\n\n/**\n * Convert explicit syntax to natural language.\n */\nexport function fromExplicit(input: string, targetLang: string): string {\n const node = parseExplicit(input);\n return render(node, targetLang);\n}\n\n/**\n * Round-trip conversion for testing.\n */\nexport function roundTrip(input: string, language: string): string {\n const explicit = toExplicit(input, language);\n return fromExplicit(explicit, language);\n}\n","/**\n * Semantic Result Cache\n *\n * LRU cache for semantic analysis results to optimize repeated parsing.\n *\n * Design:\n * - Cache key: `${language}:${input}` for simple, fast lookups\n * - LRU eviction when max size reached\n * - Optional TTL (time-to-live) for cache entries\n * - Statistics for monitoring cache effectiveness\n * - Thread-safe for browser environments (single-threaded)\n */\n\nimport type { SemanticAnalysisResult } from '../core-bridge';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Cache configuration options.\n */\nexport interface SemanticCacheConfig {\n /** Maximum number of entries to cache. Default: 1000 */\n maxSize?: number;\n /** Time-to-live in milliseconds. 0 = no expiration. Default: 0 */\n ttlMs?: number;\n /** Enable/disable caching. Default: true */\n enabled?: boolean;\n}\n\n/**\n * Cache entry with metadata.\n */\ninterface CacheEntry {\n /** The cached result */\n result: SemanticAnalysisResult;\n /** Timestamp when entry was created */\n createdAt: number;\n /** Last access timestamp (for LRU) */\n lastAccessed: number;\n}\n\n/**\n * Cache statistics.\n */\nexport interface CacheStats {\n /** Total cache hits */\n hits: number;\n /** Total cache misses */\n misses: number;\n /** Current cache size */\n size: number;\n /** Maximum cache size */\n maxSize: number;\n /** Hit rate (0-1) */\n hitRate: number;\n /** Total evictions due to size limit */\n evictions: number;\n /** Total expirations due to TTL */\n expirations: number;\n /** Whether caching is enabled */\n enabled: boolean;\n}\n\n// =============================================================================\n// LRU Cache Implementation\n// =============================================================================\n\n/**\n * LRU Cache for semantic analysis results.\n *\n * Uses Map's insertion order for LRU eviction - when we access an entry,\n * we delete and re-insert it to move it to the end (most recently used).\n */\nexport class SemanticCache {\n private cache: Map<string, CacheEntry>;\n private config: Required<SemanticCacheConfig>;\n private stats: {\n hits: number;\n misses: number;\n evictions: number;\n expirations: number;\n };\n\n constructor(config: SemanticCacheConfig = {}) {\n this.cache = new Map();\n this.config = {\n maxSize: config.maxSize ?? 1000,\n ttlMs: config.ttlMs ?? 0,\n enabled: config.enabled ?? true,\n };\n this.stats = {\n hits: 0,\n misses: 0,\n evictions: 0,\n expirations: 0,\n };\n }\n\n /**\n * Generate cache key from input and language.\n */\n private makeKey(input: string, language: string): string {\n return `${language}:${input}`;\n }\n\n /**\n * Check if an entry has expired.\n */\n private isExpired(entry: CacheEntry): boolean {\n if (this.config.ttlMs === 0) return false;\n return Date.now() - entry.createdAt > this.config.ttlMs;\n }\n\n /**\n * Evict the least recently used entry.\n */\n private evictLRU(): void {\n // Map preserves insertion order, so first entry is oldest\n const firstKey = this.cache.keys().next().value;\n if (firstKey !== undefined) {\n this.cache.delete(firstKey);\n this.stats.evictions++;\n }\n }\n\n /**\n * Get a cached result.\n *\n * @param input - The input string\n * @param language - The language code\n * @returns The cached result, or undefined if not found/expired\n */\n get(input: string, language: string): SemanticAnalysisResult | undefined {\n if (!this.config.enabled) {\n this.stats.misses++;\n return undefined;\n }\n\n const key = this.makeKey(input, language);\n const entry = this.cache.get(key);\n\n if (!entry) {\n this.stats.misses++;\n return undefined;\n }\n\n // Check expiration\n if (this.isExpired(entry)) {\n this.cache.delete(key);\n this.stats.expirations++;\n this.stats.misses++;\n return undefined;\n }\n\n // Move to end for LRU (delete and re-insert)\n this.cache.delete(key);\n entry.lastAccessed = Date.now();\n this.cache.set(key, entry);\n\n this.stats.hits++;\n return entry.result;\n }\n\n /**\n * Store a result in the cache.\n *\n * @param input - The input string\n * @param language - The language code\n * @param result - The analysis result to cache\n */\n set(input: string, language: string, result: SemanticAnalysisResult): void {\n if (!this.config.enabled) return;\n\n // Don't cache failed results (confidence 0)\n if (result.confidence === 0) return;\n\n const key = this.makeKey(input, language);\n const now = Date.now();\n\n // Evict if at max size\n while (this.cache.size >= this.config.maxSize) {\n this.evictLRU();\n }\n\n this.cache.set(key, {\n result,\n createdAt: now,\n lastAccessed: now,\n });\n }\n\n /**\n * Check if a result is cached (without updating LRU).\n */\n has(input: string, language: string): boolean {\n if (!this.config.enabled) return false;\n\n const key = this.makeKey(input, language);\n const entry = this.cache.get(key);\n\n if (!entry) return false;\n if (this.isExpired(entry)) {\n this.cache.delete(key);\n this.stats.expirations++;\n return false;\n }\n\n return true;\n }\n\n /**\n * Remove a specific entry from the cache.\n */\n delete(input: string, language: string): boolean {\n const key = this.makeKey(input, language);\n return this.cache.delete(key);\n }\n\n /**\n * Clear all cached entries.\n */\n clear(): void {\n this.cache.clear();\n }\n\n /**\n * Reset statistics.\n */\n resetStats(): void {\n this.stats = {\n hits: 0,\n misses: 0,\n evictions: 0,\n expirations: 0,\n };\n }\n\n /**\n * Get cache statistics.\n */\n getStats(): CacheStats {\n const total = this.stats.hits + this.stats.misses;\n return {\n hits: this.stats.hits,\n misses: this.stats.misses,\n size: this.cache.size,\n maxSize: this.config.maxSize,\n hitRate: total > 0 ? this.stats.hits / total : 0,\n evictions: this.stats.evictions,\n expirations: this.stats.expirations,\n enabled: this.config.enabled,\n };\n }\n\n /**\n * Update cache configuration.\n */\n configure(config: Partial<SemanticCacheConfig>): void {\n if (config.maxSize !== undefined) {\n this.config.maxSize = config.maxSize;\n // Evict if now over limit\n while (this.cache.size > this.config.maxSize) {\n this.evictLRU();\n }\n }\n if (config.ttlMs !== undefined) {\n this.config.ttlMs = config.ttlMs;\n }\n if (config.enabled !== undefined) {\n this.config.enabled = config.enabled;\n }\n }\n\n /**\n * Enable caching.\n */\n enable(): void {\n this.config.enabled = true;\n }\n\n /**\n * Disable caching.\n */\n disable(): void {\n this.config.enabled = false;\n }\n\n /**\n * Get current configuration.\n */\n getConfig(): Readonly<Required<SemanticCacheConfig>> {\n return { ...this.config };\n }\n}\n\n// =============================================================================\n// Default Instance\n// =============================================================================\n\n/**\n * Default global cache instance.\n */\nexport const semanticCache = new SemanticCache();\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Create a cache with custom configuration.\n */\nexport function createSemanticCache(config?: SemanticCacheConfig): SemanticCache {\n return new SemanticCache(config);\n}\n\n/**\n * Decorator/wrapper for adding caching to an analyze function.\n *\n * @param analyzeFn - The analyze function to wrap\n * @param cache - The cache instance to use\n * @returns Wrapped function with caching\n */\nexport function withCache<T extends (input: string, language: string) => SemanticAnalysisResult>(\n analyzeFn: T,\n cache: SemanticCache = semanticCache\n): T {\n return ((input: string, language: string): SemanticAnalysisResult => {\n // Check cache first\n const cached = cache.get(input, language);\n if (cached) {\n return cached;\n }\n\n // Run analysis\n const result = analyzeFn(input, language);\n\n // Cache result\n cache.set(input, language, result);\n\n return result;\n }) as T;\n}\n","/**\n * Core Parser Bridge\n *\n * Provides the SemanticAnalyzer interface that integrates semantic parsing\n * into the core hyperscript parser. This bridge enables confidence-driven\n * fallback between semantic and traditional parsing.\n */\n\nimport type {\n SemanticNode,\n SemanticValue,\n ActionType,\n PatternMatchResult,\n SemanticRole,\n} from './types';\nimport { PatternMatcher } from './parser/pattern-matcher';\nimport { parse as fullParse } from './parser/semantic-parser';\nimport { getTokenizer } from './tokenizers';\n// Import from registry for tree-shaking (registry uses directly-registered patterns first)\nimport { getPatternsForLanguage, getRegisteredLanguages } from './registry';\nimport { SemanticCache, semanticCache, type SemanticCacheConfig, type CacheStats } from './cache';\n\n// =============================================================================\n// SemanticAnalyzer Interface\n// =============================================================================\n\n/**\n * Result of semantic analysis.\n */\nexport interface SemanticAnalysisResult {\n /** Confidence score (0-1) for this analysis */\n readonly confidence: number;\n /** The parsed command info (if successful) */\n readonly command?: {\n readonly name: ActionType;\n readonly roles: ReadonlyMap<SemanticRole, SemanticValue>;\n };\n /** The full semantic node (if successful) */\n readonly node?: SemanticNode;\n /** Any errors encountered */\n readonly errors?: string[];\n /** Number of tokens consumed */\n readonly tokensConsumed?: number;\n}\n\n/**\n * Interface for semantic analysis that can be integrated into the core parser.\n * This allows the core parser to optionally use semantic parsing with\n * confidence-based fallback to traditional parsing.\n */\nexport interface SemanticAnalyzer {\n /**\n * Analyze input in the specified language.\n *\n * @deprecated Since v1.4.0. Will be removed in v2.0.0.\n * Prefer `parseSemantic()` from `@lokascript/semantic` for new code.\n * This method is retained for backward compatibility but now uses the full\n * parser internally to preserve event handler bodies.\n *\n * @param input The input string to analyze\n * @param language ISO 639-1 language code\n * @returns Analysis result with confidence score\n */\n analyze(input: string, language: string): SemanticAnalysisResult;\n\n /**\n * Check if semantic parsing is available for a language.\n */\n supportsLanguage(language: string): boolean;\n\n /**\n * Get the list of supported languages.\n */\n supportedLanguages(): string[];\n\n /**\n * Get cache statistics.\n */\n getCacheStats(): CacheStats;\n\n /**\n * Clear the result cache.\n */\n clearCache(): void;\n\n /**\n * Configure the cache.\n */\n configureCache(config: Partial<SemanticCacheConfig>): void;\n}\n\n// =============================================================================\n// SemanticAnalyzer Implementation\n// =============================================================================\n\n/**\n * Options for creating a SemanticAnalyzer.\n */\nexport interface SemanticAnalyzerOptions {\n /** Cache configuration. Pass false to disable caching. */\n cache?: SemanticCacheConfig | false;\n}\n\n/**\n * Implementation of SemanticAnalyzer that wraps the semantic parser.\n * Includes LRU caching for performance optimization on repeated inputs.\n */\nexport class SemanticAnalyzerImpl implements SemanticAnalyzer {\n private readonly patternMatcher: PatternMatcher;\n private readonly languages: Set<string>;\n private readonly cache: SemanticCache;\n\n constructor(options: SemanticAnalyzerOptions = {}) {\n this.patternMatcher = new PatternMatcher();\n // Get all registered languages from the registry (dynamically updated as languages are loaded)\n this.languages = new Set(getRegisteredLanguages());\n\n // Initialize cache\n if (options.cache === false) {\n this.cache = new SemanticCache({ enabled: false });\n } else {\n this.cache = options.cache ? new SemanticCache(options.cache) : semanticCache;\n }\n }\n\n analyze(input: string, language: string): SemanticAnalysisResult {\n // Check language support\n if (!this.supportsLanguage(language)) {\n return {\n confidence: 0,\n errors: [`Language '${language}' is not supported for semantic parsing`],\n };\n }\n\n // Check cache first\n const cached = this.cache.get(input, language);\n if (cached) {\n return cached;\n }\n\n // Perform analysis\n const result = this.analyzeUncached(input, language);\n\n // Cache successful results\n this.cache.set(input, language, result);\n\n return result;\n }\n\n /**\n * Perform analysis without cache lookup.\n *\n * Uses full parser first to preserve complete AST structure (event handler\n * bodies, compound statements, conditionals). Falls back to pattern matching\n * only when the full parser fails, which provides fast simple-command detection\n * but loses structural information like event handler bodies.\n */\n private analyzeUncached(input: string, language: string): SemanticAnalysisResult {\n try {\n // Try full parser first — this preserves event handler bodies,\n // compound statements, and other structural information that\n // pattern-only matching loses.\n try {\n const node = fullParse(input, language);\n const result: SemanticAnalysisResult = {\n confidence: node.metadata?.confidence ?? 0.8,\n node,\n };\n if (node.kind === 'command') {\n return { ...result, command: { name: node.action, roles: node.roles } };\n }\n return result;\n } catch {\n // Full parser failed — fall through to pattern matching\n }\n\n // Fallback: pattern matching for simple commands.\n // This path is faster but only produces {kind: 'command'} nodes\n // without structural information like event handler bodies.\n const tokenizer = getTokenizer(language);\n if (!tokenizer) {\n return {\n confidence: 0,\n errors: [`No tokenizer available for language '${language}'`],\n };\n }\n\n const tokenStream = tokenizer.tokenize(input);\n\n const patterns = getPatternsForLanguage(language);\n if (patterns.length === 0) {\n return {\n confidence: 0,\n errors: [`No patterns available for language '${language}'`],\n };\n }\n\n const match = this.patternMatcher.matchBest(tokenStream, patterns);\n\n if (match) {\n const node = this.buildSemanticNode(match);\n\n return {\n confidence: match.confidence,\n command: {\n name: match.pattern.command,\n roles: match.captured,\n },\n node,\n tokensConsumed: match.consumedTokens,\n };\n }\n\n return {\n confidence: 0,\n errors: ['No pattern matched the input'],\n };\n } catch (error) {\n return {\n confidence: 0,\n errors: [error instanceof Error ? error.message : String(error)],\n };\n }\n }\n\n supportsLanguage(language: string): boolean {\n return this.languages.has(language);\n }\n\n supportedLanguages(): string[] {\n return Array.from(this.languages);\n }\n\n getCacheStats(): CacheStats {\n return this.cache.getStats();\n }\n\n clearCache(): void {\n this.cache.clear();\n }\n\n configureCache(config: Partial<SemanticCacheConfig>): void {\n this.cache.configure(config);\n }\n\n private buildSemanticNode(match: PatternMatchResult): SemanticNode {\n return {\n kind: 'command',\n action: match.pattern.command,\n roles: match.captured,\n metadata: {\n patternId: match.pattern.id,\n },\n };\n }\n}\n\n// =============================================================================\n// Factory Function\n// =============================================================================\n\n/**\n * Create a SemanticAnalyzer instance.\n *\n * @param options - Configuration options including cache settings\n * @returns A new SemanticAnalyzer\n *\n * @example\n * // Default: uses shared global cache\n * const analyzer = createSemanticAnalyzer();\n *\n * @example\n * // Custom cache size\n * const analyzer = createSemanticAnalyzer({ cache: { maxSize: 500 } });\n *\n * @example\n * // Disable caching\n * const analyzer = createSemanticAnalyzer({ cache: false });\n */\nexport function createSemanticAnalyzer(options?: SemanticAnalyzerOptions): SemanticAnalyzer {\n return new SemanticAnalyzerImpl(options);\n}\n\n// Re-export cache types for convenience\nexport type { SemanticCacheConfig, CacheStats } from './cache';\n\n// =============================================================================\n// Confidence Thresholds\n// =============================================================================\n\n/**\n * Default confidence threshold for preferring semantic parsing.\n * If confidence is above this, use semantic result; otherwise fallback.\n */\nexport const DEFAULT_CONFIDENCE_THRESHOLD = 0.5;\n\n/**\n * High confidence threshold for very certain matches.\n */\nexport const HIGH_CONFIDENCE_THRESHOLD = 0.8;\n\n// =============================================================================\n// Integration Helpers\n// =============================================================================\n\n/**\n * Determine if semantic analysis should be used based on confidence.\n */\nexport function shouldUseSemanticResult(\n result: SemanticAnalysisResult,\n threshold: number = DEFAULT_CONFIDENCE_THRESHOLD\n): boolean {\n return result.confidence >= threshold && result.command !== undefined;\n}\n\n/**\n * Convert semantic roles to the format expected by core parser commands.\n * This maps semantic roles to the positional/modifier structure used by\n * the core command implementations.\n *\n * Role to preposition mapping:\n * - patient → first positional arg\n * - event → first positional arg\n * - destination → 'into' (put) or 'on' (others)\n * - source → 'from'\n * - quantity → 'by'\n * - duration → 'over' or 'for'\n * - method → 'as'\n * - style → 'with'\n * - condition → 'if'\n */\nexport function rolesToCommandArgs(\n roles: ReadonlyMap<SemanticRole, SemanticValue>,\n command: ActionType\n): {\n args: SemanticValue[];\n modifiers: Record<string, SemanticValue>;\n} {\n const args: SemanticValue[] = [];\n const modifiers: Record<string, SemanticValue> = {};\n\n for (const [role, value] of roles) {\n switch (role) {\n // Primary arguments (positional)\n case 'patient':\n case 'event':\n args.push(value);\n break;\n\n // Destination: context-dependent preposition\n case 'destination':\n if (command === 'put') {\n modifiers['into'] = value;\n } else {\n modifiers['on'] = value;\n }\n break;\n\n // Source: always 'from'\n case 'source':\n modifiers['from'] = value;\n break;\n\n // Quantitative roles\n case 'quantity':\n modifiers['by'] = value;\n break;\n\n case 'duration':\n modifiers['over'] = value;\n break;\n\n // Adverbial roles\n case 'method':\n modifiers['as'] = value;\n break;\n\n case 'style':\n modifiers['with'] = value;\n break;\n\n // Conditional\n case 'condition':\n modifiers['if'] = value;\n break;\n\n // Agent (for future multi-actor systems)\n case 'agent':\n modifiers['agent'] = value;\n break;\n\n default:\n // Unknown roles become modifiers using role name as key\n modifiers[role] = value;\n }\n }\n\n return { args, modifiers };\n}\n","/**\n * Expression Tokenizer\n *\n * Tokenizes expression strings into tokens for parsing.\n * Focused on expression-level constructs, not full hyperscript syntax.\n */\n\n// =============================================================================\n// Token Types\n// =============================================================================\n\nexport enum TokenType {\n // Literals\n NUMBER = 'NUMBER',\n STRING = 'STRING',\n BOOLEAN = 'BOOLEAN',\n TEMPLATE_LITERAL = 'TEMPLATE_LITERAL',\n\n // Selectors\n ID_SELECTOR = 'ID_SELECTOR',\n CLASS_SELECTOR = 'CLASS_SELECTOR',\n ATTRIBUTE_SELECTOR = 'ATTRIBUTE_SELECTOR',\n QUERY_SELECTOR = 'QUERY_SELECTOR',\n\n // References\n CONTEXT_VAR = 'CONTEXT_VAR',\n IDENTIFIER = 'IDENTIFIER',\n\n // Operators\n OPERATOR = 'OPERATOR',\n COMPARISON = 'COMPARISON',\n LOGICAL = 'LOGICAL',\n POSSESSIVE = 'POSSESSIVE',\n\n // Punctuation\n LPAREN = 'LPAREN',\n RPAREN = 'RPAREN',\n LBRACKET = 'LBRACKET',\n RBRACKET = 'RBRACKET',\n LBRACE = 'LBRACE',\n RBRACE = 'RBRACE',\n COMMA = 'COMMA',\n DOT = 'DOT',\n COLON = 'COLON',\n\n // Special\n TIME_EXPRESSION = 'TIME_EXPRESSION',\n EOF = 'EOF',\n ERROR = 'ERROR',\n}\n\nexport interface Token {\n type: TokenType;\n value: string;\n start: number;\n end: number;\n line?: number;\n column?: number;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst CONTEXT_VARS = new Set([\n 'me',\n 'my',\n 'myself',\n 'you',\n 'your',\n 'yourself',\n 'it',\n 'its',\n 'result',\n 'event',\n 'target',\n 'body',\n 'detail',\n 'window',\n 'document',\n]);\n\nconst LOGICAL_OPERATORS = new Set(['and', 'or', 'not', 'no']);\n\nconst BOOLEAN_LITERALS = new Set(['true', 'false', 'null', 'undefined']);\n\nconst TIME_UNITS = new Set([\n 'ms',\n 's',\n 'seconds',\n 'second',\n 'milliseconds',\n 'millisecond',\n 'minutes',\n 'minute',\n 'hours',\n 'hour',\n]);\n\n// =============================================================================\n// Tokenizer\n// =============================================================================\n\nexport function tokenize(input: string): Token[] {\n const tokens: Token[] = [];\n let pos = 0;\n let line = 1;\n let column = 1;\n\n // Track if the previous token allows a selector\n // Selectors are only valid at the start or after operators, opening brackets, etc.\n function previousTokenAllowsSelector(): boolean {\n if (tokens.length === 0) return true;\n const prev = tokens[tokens.length - 1];\n // After these token types, a selector is valid\n return [\n TokenType.OPERATOR,\n TokenType.COMPARISON,\n TokenType.LOGICAL,\n TokenType.LPAREN,\n TokenType.LBRACKET,\n TokenType.LBRACE,\n TokenType.COMMA,\n TokenType.COLON,\n ].includes(prev.type);\n }\n\n function peek(offset = 0): string {\n return input[pos + offset] ?? '';\n }\n\n function advance(): string {\n const char = input[pos];\n pos++;\n if (char === '\\n') {\n line++;\n column = 1;\n } else {\n column++;\n }\n return char;\n }\n\n function skipWhitespace(): void {\n while (pos < input.length && /\\s/.test(input[pos])) {\n advance();\n }\n }\n\n function readWhile(predicate: (char: string) => boolean): string {\n let result = '';\n while (pos < input.length && predicate(input[pos])) {\n result += advance();\n }\n return result;\n }\n\n function readString(quote: string): string {\n let result = quote;\n advance(); // consume opening quote\n while (pos < input.length && input[pos] !== quote) {\n if (input[pos] === '\\\\' && pos + 1 < input.length) {\n result += advance(); // backslash\n result += advance(); // escaped char\n } else {\n result += advance();\n }\n }\n if (pos < input.length) {\n result += advance(); // closing quote\n }\n return result;\n }\n\n function readTemplateLiteral(): string {\n let result = '`';\n advance(); // consume opening backtick\n while (pos < input.length && input[pos] !== '`') {\n if (input[pos] === '\\\\' && pos + 1 < input.length) {\n result += advance();\n result += advance();\n } else {\n result += advance();\n }\n }\n if (pos < input.length) {\n result += advance(); // closing backtick\n }\n return result;\n }\n\n function readQuerySelector(): string {\n let result = '<';\n advance(); // consume <\n while (pos < input.length) {\n result += advance();\n if (result.endsWith('/>')) {\n break;\n }\n }\n return result;\n }\n\n function makeToken(type: TokenType, value: string, start: number): Token {\n return {\n type,\n value,\n start,\n end: pos,\n line,\n column: column - value.length,\n };\n }\n\n while (pos < input.length) {\n skipWhitespace();\n if (pos >= input.length) break;\n\n const start = pos;\n const char = peek();\n\n // Possessive 's (check before string literals)\n if (char === \"'\" && peek(1) === 's' && !/\\w/.test(peek(2))) {\n advance(); // '\n advance(); // s\n tokens.push(makeToken(TokenType.POSSESSIVE, \"'s\", start));\n continue;\n }\n\n // String literals\n if (char === '\"' || char === \"'\") {\n const value = readString(char);\n tokens.push(makeToken(TokenType.STRING, value, start));\n continue;\n }\n\n // Template literals\n if (char === '`') {\n const value = readTemplateLiteral();\n tokens.push(makeToken(TokenType.TEMPLATE_LITERAL, value, start));\n continue;\n }\n\n // Query selectors <tag/>\n if (char === '<' && /[a-zA-Z.#\\[]/.test(peek(1))) {\n const value = readQuerySelector();\n tokens.push(makeToken(TokenType.QUERY_SELECTOR, value, start));\n continue;\n }\n\n // ID selectors #id (only at start or after operators)\n if (char === '#' && previousTokenAllowsSelector()) {\n advance();\n const name = readWhile(c => /[\\w-]/.test(c));\n tokens.push(makeToken(TokenType.ID_SELECTOR, '#' + name, start));\n continue;\n }\n\n // Class selectors .class (only at start or after operators)\n if (char === '.' && /[a-zA-Z_-]/.test(peek(1)) && previousTokenAllowsSelector()) {\n advance();\n const name = readWhile(c => /[\\w-]/.test(c));\n tokens.push(makeToken(TokenType.CLASS_SELECTOR, '.' + name, start));\n continue;\n }\n\n // Attribute selectors [attr] or [attr=\"value\"] (only at start or after operators)\n if (char === '[' && previousTokenAllowsSelector()) {\n // Check if this looks like an attribute selector (starts with @ or identifier)\n const nextChar = peek(1);\n if (nextChar === '@' || /[a-zA-Z]/.test(nextChar)) {\n let value = '';\n value += advance(); // [\n while (pos < input.length && input[pos] !== ']') {\n if (input[pos] === '\"' || input[pos] === \"'\") {\n value += readString(input[pos]);\n } else {\n value += advance();\n }\n }\n if (pos < input.length) {\n value += advance(); // ]\n }\n tokens.push(makeToken(TokenType.ATTRIBUTE_SELECTOR, value, start));\n continue;\n }\n }\n\n // Array brackets [ and ]\n if (char === '[') {\n advance();\n tokens.push(makeToken(TokenType.LBRACKET, '[', start));\n continue;\n }\n if (char === ']') {\n advance();\n tokens.push(makeToken(TokenType.RBRACKET, ']', start));\n continue;\n }\n\n // Numbers (including time expressions like 2s, 500ms)\n if (/\\d/.test(char)) {\n const num = readWhile(c => /[\\d.]/.test(c));\n const unitStart = pos;\n const unit = readWhile(c => /[a-zA-Z]/.test(c));\n\n if (TIME_UNITS.has(unit)) {\n tokens.push(makeToken(TokenType.TIME_EXPRESSION, num + unit, start));\n } else {\n // Put back the unit if it's not a time unit\n pos = unitStart;\n tokens.push(makeToken(TokenType.NUMBER, num, start));\n }\n continue;\n }\n\n // Punctuation\n if (char === '(') {\n advance();\n tokens.push(makeToken(TokenType.LPAREN, '(', start));\n continue;\n }\n if (char === ')') {\n advance();\n tokens.push(makeToken(TokenType.RPAREN, ')', start));\n continue;\n }\n if (char === '{') {\n advance();\n tokens.push(makeToken(TokenType.LBRACE, '{', start));\n continue;\n }\n if (char === '}') {\n advance();\n tokens.push(makeToken(TokenType.RBRACE, '}', start));\n continue;\n }\n if (char === ',') {\n advance();\n tokens.push(makeToken(TokenType.COMMA, ',', start));\n continue;\n }\n if (char === ':') {\n advance();\n tokens.push(makeToken(TokenType.COLON, ':', start));\n continue;\n }\n if (char === '.') {\n advance();\n tokens.push(makeToken(TokenType.DOT, '.', start));\n continue;\n }\n\n // Operators\n if (char === '+' || char === '-' || char === '*' || char === '/' || char === '%') {\n advance();\n tokens.push(makeToken(TokenType.OPERATOR, char, start));\n continue;\n }\n\n // Comparison operators\n if (char === '=' || char === '!' || char === '<' || char === '>') {\n let op = advance();\n if (peek() === '=') {\n op += advance();\n }\n tokens.push(makeToken(TokenType.COMPARISON, op, start));\n continue;\n }\n\n // Identifiers and keywords\n if (/[a-zA-Z_$]/.test(char)) {\n const word = readWhile(c => /[\\w$]/.test(c));\n const lower = word.toLowerCase();\n\n if (CONTEXT_VARS.has(lower)) {\n tokens.push(makeToken(TokenType.CONTEXT_VAR, word, start));\n } else if (LOGICAL_OPERATORS.has(lower)) {\n tokens.push(makeToken(TokenType.LOGICAL, word, start));\n } else if (BOOLEAN_LITERALS.has(lower)) {\n tokens.push(makeToken(TokenType.BOOLEAN, word, start));\n } else {\n tokens.push(makeToken(TokenType.IDENTIFIER, word, start));\n }\n continue;\n }\n\n // Unknown character - skip it\n advance();\n }\n\n tokens.push(makeToken(TokenType.EOF, '', pos));\n return tokens;\n}\n","/**\n * Expression Parser\n *\n * Parses expression tokens into AST nodes.\n * Uses recursive descent parsing with operator precedence.\n */\n\nimport { tokenize, Token, TokenType } from './tokenizer';\nimport type {\n ExpressionNode,\n LiteralNode,\n TemplateLiteralNode,\n SelectorNode,\n ContextReferenceNode,\n IdentifierNode,\n PropertyAccessNode,\n PossessiveExpressionNode,\n BinaryExpressionNode,\n UnaryExpressionNode,\n CallExpressionNode,\n ArrayLiteralNode,\n ObjectLiteralNode,\n TimeExpressionNode,\n ExpressionParseResult,\n ContextType,\n SelectorKind,\n} from './types';\n\n// =============================================================================\n// Parser Class\n// =============================================================================\n\nexport class ExpressionParser {\n private tokens: Token[] = [];\n private current = 0;\n\n parse(input: string): ExpressionParseResult {\n try {\n this.tokens = tokenize(input);\n this.current = 0;\n\n if (this.isAtEnd()) {\n return { success: false, error: 'Empty expression' };\n }\n\n const node = this.parseExpression();\n return { success: true, node, consumed: this.current };\n } catch (e) {\n return {\n success: false,\n error: e instanceof Error ? e.message : 'Parse error',\n };\n }\n }\n\n // =============================================================================\n // Token Navigation\n // =============================================================================\n\n private peek(): Token {\n return this.tokens[this.current] ?? { type: TokenType.EOF, value: '', start: 0, end: 0 };\n }\n\n private previous(): Token {\n return this.tokens[this.current - 1] ?? { type: TokenType.EOF, value: '', start: 0, end: 0 };\n }\n\n private isAtEnd(): boolean {\n return this.peek().type === TokenType.EOF;\n }\n\n private advance(): Token {\n if (!this.isAtEnd()) {\n this.current++;\n }\n return this.previous();\n }\n\n private check(type: TokenType): boolean {\n return this.peek().type === type;\n }\n\n private checkValue(value: string): boolean {\n return this.peek().value.toLowerCase() === value.toLowerCase();\n }\n\n private match(...types: TokenType[]): boolean {\n for (const type of types) {\n if (this.check(type)) {\n this.advance();\n return true;\n }\n }\n return false;\n }\n\n // =============================================================================\n // Expression Parsing (Precedence Climbing)\n // =============================================================================\n\n private parseExpression(): ExpressionNode {\n return this.parseOr();\n }\n\n private parseOr(): ExpressionNode {\n let left = this.parseAnd();\n\n while (this.checkValue('or')) {\n const operator = this.advance().value;\n const right = this.parseAnd();\n left = this.createBinaryExpression(operator, left, right);\n }\n\n return left;\n }\n\n private parseAnd(): ExpressionNode {\n let left = this.parseEquality();\n\n while (this.checkValue('and')) {\n const operator = this.advance().value;\n const right = this.parseEquality();\n left = this.createBinaryExpression(operator, left, right);\n }\n\n return left;\n }\n\n private parseEquality(): ExpressionNode {\n let left = this.parseComparison();\n\n while (\n this.match(TokenType.COMPARISON) ||\n this.checkValue('is') ||\n this.checkValue('matches') ||\n this.checkValue('contains') ||\n this.checkValue('in')\n ) {\n const operator = this.previous().value;\n const right = this.parseComparison();\n left = this.createBinaryExpression(operator, left, right);\n }\n\n return left;\n }\n\n private parseComparison(): ExpressionNode {\n let left = this.parseAddition();\n\n while (this.check(TokenType.COMPARISON)) {\n const operator = this.advance().value;\n const right = this.parseAddition();\n left = this.createBinaryExpression(operator, left, right);\n }\n\n return left;\n }\n\n private parseAddition(): ExpressionNode {\n let left = this.parseMultiplication();\n\n while (this.peek().value === '+' || this.peek().value === '-') {\n const operator = this.advance().value;\n const right = this.parseMultiplication();\n left = this.createBinaryExpression(operator, left, right);\n }\n\n return left;\n }\n\n private parseMultiplication(): ExpressionNode {\n let left = this.parseUnary();\n\n while (this.peek().value === '*' || this.peek().value === '/' || this.peek().value === '%') {\n const operator = this.advance().value;\n const right = this.parseUnary();\n left = this.createBinaryExpression(operator, left, right);\n }\n\n return left;\n }\n\n private parseUnary(): ExpressionNode {\n if (this.checkValue('not') || this.checkValue('no') || this.peek().value === '-') {\n const operator = this.advance().value;\n const operand = this.parseUnary();\n return this.createUnaryExpression(operator, operand);\n }\n\n return this.parsePostfix();\n }\n\n private parsePostfix(): ExpressionNode {\n let expr = this.parsePrimary();\n\n while (true) {\n // Property access with dot: expr.property\n if (this.match(TokenType.DOT)) {\n // Accept IDENTIFIER or CONTEXT_VAR as property name\n if (this.check(TokenType.IDENTIFIER) || this.check(TokenType.CONTEXT_VAR)) {\n const property = this.advance().value;\n expr = this.createPropertyAccess(expr, property);\n } else {\n break;\n }\n }\n // Possessive: expr's property\n else if (this.match(TokenType.POSSESSIVE)) {\n // Accept IDENTIFIER or CONTEXT_VAR as property name\n if (this.check(TokenType.IDENTIFIER) || this.check(TokenType.CONTEXT_VAR)) {\n const property = this.advance().value;\n expr = this.createPossessiveExpression(expr, property);\n } else {\n break;\n }\n }\n // Function call: expr(args)\n else if (this.match(TokenType.LPAREN)) {\n const args = this.parseArguments();\n expr = this.createCallExpression(expr, args);\n }\n // Array access: expr[index]\n else if (this.match(TokenType.LBRACKET)) {\n const index = this.parseExpression();\n if (!this.match(TokenType.RBRACKET)) {\n throw new Error('Expected ] after index');\n }\n expr = this.createPropertyAccess(expr, index);\n } else {\n break;\n }\n }\n\n return expr;\n }\n\n private parsePrimary(): ExpressionNode {\n const token = this.peek();\n\n // Literals\n if (this.match(TokenType.NUMBER)) {\n return this.createLiteral(parseFloat(token.value), 'number', token);\n }\n\n if (this.match(TokenType.STRING)) {\n const value = token.value.slice(1, -1); // Remove quotes\n return this.createLiteral(value, 'string', token);\n }\n\n if (this.match(TokenType.BOOLEAN)) {\n const value =\n token.value === 'true'\n ? true\n : token.value === 'false'\n ? false\n : token.value === 'null'\n ? null\n : undefined;\n const dataTypeMap: Record<string, LiteralNode['dataType']> = {\n true: 'boolean',\n false: 'boolean',\n null: 'null',\n undefined: 'undefined',\n };\n return this.createLiteral(value, dataTypeMap[token.value] ?? 'string', token);\n }\n\n if (this.match(TokenType.TEMPLATE_LITERAL)) {\n const templateNode: TemplateLiteralNode = {\n type: 'templateLiteral',\n value: token.value,\n start: token.start,\n end: token.end,\n line: token.line,\n column: token.column,\n };\n return templateNode;\n }\n\n if (this.match(TokenType.TIME_EXPRESSION)) {\n return this.parseTimeExpression(token);\n }\n\n // Selectors\n if (this.match(TokenType.ID_SELECTOR)) {\n return this.createSelector(token.value, 'id', token);\n }\n\n if (this.match(TokenType.CLASS_SELECTOR)) {\n return this.createSelector(token.value, 'class', token);\n }\n\n if (this.match(TokenType.ATTRIBUTE_SELECTOR)) {\n return this.createSelector(token.value, 'attribute', token);\n }\n\n if (this.match(TokenType.QUERY_SELECTOR)) {\n // Extract selector from <.../>\n const selector = token.value.slice(1, -2);\n return this.createSelector(selector, 'query', token);\n }\n\n // Context references\n if (this.match(TokenType.CONTEXT_VAR)) {\n return this.createContextReference(token.value as ContextType, token);\n }\n\n // Identifiers\n if (this.match(TokenType.IDENTIFIER)) {\n return this.createIdentifier(token.value, token);\n }\n\n // Parenthesized expression\n if (this.match(TokenType.LPAREN)) {\n const expr = this.parseExpression();\n if (!this.match(TokenType.RPAREN)) {\n throw new Error('Expected ) after expression');\n }\n return expr;\n }\n\n // Array literal\n if (this.match(TokenType.LBRACKET)) {\n return this.parseArrayLiteral();\n }\n\n // Object literal\n if (this.match(TokenType.LBRACE)) {\n return this.parseObjectLiteral();\n }\n\n throw new Error(`Unexpected token: ${token.value}`);\n }\n\n private parseArguments(): ExpressionNode[] {\n const args: ExpressionNode[] = [];\n\n if (!this.check(TokenType.RPAREN)) {\n do {\n args.push(this.parseExpression());\n } while (this.match(TokenType.COMMA));\n }\n\n if (!this.match(TokenType.RPAREN)) {\n throw new Error('Expected ) after arguments');\n }\n\n return args;\n }\n\n private parseArrayLiteral(): ArrayLiteralNode {\n const elements: ExpressionNode[] = [];\n const start = this.previous().start;\n\n if (!this.check(TokenType.RBRACKET)) {\n do {\n elements.push(this.parseExpression());\n } while (this.match(TokenType.COMMA));\n }\n\n if (!this.match(TokenType.RBRACKET)) {\n throw new Error('Expected ] after array elements');\n }\n\n return {\n type: 'arrayLiteral',\n elements,\n start,\n end: this.previous().end,\n };\n }\n\n private parseObjectLiteral(): ObjectLiteralNode {\n const properties: Array<{ key: string; value: ExpressionNode }> = [];\n const start = this.previous().start;\n\n if (!this.check(TokenType.RBRACE)) {\n do {\n let key: string;\n if (this.check(TokenType.STRING)) {\n key = this.advance().value.slice(1, -1);\n } else if (this.check(TokenType.IDENTIFIER)) {\n key = this.advance().value;\n } else {\n throw new Error('Expected property name');\n }\n\n if (!this.match(TokenType.COLON)) {\n throw new Error('Expected : after property name');\n }\n\n const value = this.parseExpression();\n properties.push({ key, value });\n } while (this.match(TokenType.COMMA));\n }\n\n if (!this.match(TokenType.RBRACE)) {\n throw new Error('Expected } after object properties');\n }\n\n return {\n type: 'objectLiteral',\n properties: properties.map(p => ({\n type: 'objectProperty' as const,\n key: p.key,\n value: p.value,\n })),\n start,\n end: this.previous().end,\n };\n }\n\n private parseTimeExpression(token: Token): TimeExpressionNode {\n const match = token.value.match(\n /^(\\d+(?:\\.\\d+)?)(ms|s|seconds?|milliseconds?|minutes?|hours?)$/i\n );\n if (!match) {\n throw new Error(`Invalid time expression: ${token.value}`);\n }\n\n const value = parseFloat(match[1]);\n const unit = match[2].toLowerCase() as TimeExpressionNode['unit'];\n\n return {\n type: 'timeExpression',\n value,\n unit,\n raw: token.value,\n start: token.start,\n end: token.end,\n line: token.line,\n column: token.column,\n };\n }\n\n // =============================================================================\n // Node Factories\n // =============================================================================\n\n private createLiteral(\n value: string | number | boolean | null | undefined,\n dataType: LiteralNode['dataType'],\n token: Token\n ): LiteralNode {\n return {\n type: 'literal',\n value,\n dataType,\n raw: token.value,\n start: token.start,\n end: token.end,\n line: token.line,\n column: token.column,\n };\n }\n\n private createSelector(value: string, kind: SelectorKind, token: Token): SelectorNode {\n return {\n type: 'selector',\n value,\n selector: value,\n selectorType: kind,\n start: token.start,\n end: token.end,\n line: token.line,\n column: token.column,\n };\n }\n\n private createContextReference(contextType: ContextType, token: Token): ContextReferenceNode {\n return {\n type: 'contextReference',\n contextType,\n name: token.value,\n start: token.start,\n end: token.end,\n line: token.line,\n column: token.column,\n };\n }\n\n private createIdentifier(name: string, token: Token): IdentifierNode {\n return {\n type: 'identifier',\n name,\n start: token.start,\n end: token.end,\n line: token.line,\n column: token.column,\n };\n }\n\n private createPropertyAccess(\n object: ExpressionNode,\n property: string | ExpressionNode\n ): PropertyAccessNode {\n return {\n type: 'propertyAccess',\n object,\n property:\n typeof property === 'string'\n ? property\n : property.type === 'identifier'\n ? (property as IdentifierNode).name\n : '',\n start: object.start,\n end: this.previous().end,\n };\n }\n\n private createPossessiveExpression(\n object: ExpressionNode,\n property: string\n ): PossessiveExpressionNode {\n return {\n type: 'possessiveExpression',\n object,\n property,\n start: object.start,\n end: this.previous().end,\n };\n }\n\n private createBinaryExpression(\n operator: string,\n left: ExpressionNode,\n right: ExpressionNode\n ): BinaryExpressionNode {\n return {\n type: 'binaryExpression',\n operator,\n left,\n right,\n start: left.start,\n end: right.end,\n };\n }\n\n private createUnaryExpression(operator: string, operand: ExpressionNode): UnaryExpressionNode {\n return {\n type: 'unaryExpression',\n operator,\n operand,\n prefix: true,\n start: this.previous().start,\n end: operand.end,\n };\n }\n\n private createCallExpression(callee: ExpressionNode, args: ExpressionNode[]): CallExpressionNode {\n return {\n type: 'callExpression',\n callee,\n arguments: args,\n start: callee.start,\n end: this.previous().end,\n };\n }\n}\n\n// =============================================================================\n// Convenience Function\n// =============================================================================\n\n/**\n * Parse an expression string into an AST node.\n *\n * @param input - The expression string to parse\n * @returns The parse result with success status and node or error\n */\nexport function parseExpression(input: string): ExpressionParseResult {\n const parser = new ExpressionParser();\n return parser.parse(input);\n}\n","/**\n * Semantic Value to AST Node Converters\n *\n * Converts SemanticValue types to AST expression nodes.\n * Used by the AST builder to construct expression trees from semantic parsing results.\n */\n\nimport type {\n SemanticValue,\n LiteralValue,\n SelectorValue,\n ReferenceValue,\n PropertyPathValue,\n ExpressionValue,\n} from '../types';\n\nimport {\n parseExpression,\n type ExpressionNode,\n type LiteralNode,\n type SelectorNode,\n type ContextReferenceNode,\n type PropertyAccessNode,\n type IdentifierNode,\n type ContextType,\n type SelectorKind,\n} from './expression-parser';\n\n// =============================================================================\n// Value Converters\n// =============================================================================\n\n/**\n * Convert a SemanticValue to an AST ExpressionNode.\n *\n * @param value - The semantic value to convert\n * @param warnings - Optional array to collect warnings about potentially incorrect type choices\n * @returns The corresponding AST expression node\n */\nexport function convertValue(value: SemanticValue, warnings?: string[]): ExpressionNode {\n switch (value.type) {\n case 'literal':\n return convertLiteral(value);\n case 'selector':\n return convertSelector(value, warnings);\n case 'reference':\n return convertReference(value);\n case 'property-path':\n return convertPropertyPath(value, warnings);\n case 'expression':\n return convertExpression(value);\n default:\n // Exhaustive check\n const _exhaustive: never = value;\n throw new Error(`Unknown semantic value type: ${(_exhaustive as SemanticValue).type}`);\n }\n}\n\n/**\n * Convert a LiteralValue to a LiteralNode.\n */\nexport function convertLiteral(value: LiteralValue): LiteralNode {\n const result: LiteralNode = {\n type: 'literal',\n value: value.value,\n };\n\n // Only add dataType if defined (exactOptionalPropertyTypes)\n if (value.dataType) {\n return { ...result, dataType: value.dataType };\n }\n\n return result;\n}\n\n/**\n * Convert a SelectorValue to a SelectorNode.\n *\n * @param value - The selector value to convert\n * @param warnings - Optional array to collect warnings\n */\nexport function convertSelector(value: SelectorValue, warnings?: string[]): SelectorNode {\n // Warn if selector looks like a CSS property (starts with * followed by a letter/hyphen)\n // This catches cases like \"*background-color\" which should likely be a literal string\n if (warnings && value.value.startsWith('*') && /^[a-zA-Z-]/.test(value.value.slice(1))) {\n warnings.push(\n `Converted '${value.value}' to a CSS selector, but it looks like a CSS property name. ` +\n `CSS properties in commands like 'transition' should be literal strings, not selectors. ` +\n `Consider using expectedTypes: ['literal'] instead of ['literal', 'selector'] in the command schema.`\n );\n }\n\n return {\n type: 'selector',\n value: value.value,\n selector: value.value,\n selectorType: value.selectorKind as SelectorKind,\n };\n}\n\n/**\n * Convert a ReferenceValue to a ContextReferenceNode.\n */\nexport function convertReference(value: ReferenceValue): ContextReferenceNode {\n return {\n type: 'contextReference',\n contextType: value.value as ContextType,\n name: value.value,\n };\n}\n\n/**\n * Convert a PropertyPathValue to a PropertyAccessNode.\n * Recursively converts the object part.\n *\n * @param value - The property path value to convert\n * @param warnings - Optional array to collect warnings\n */\nexport function convertPropertyPath(\n value: PropertyPathValue,\n warnings?: string[]\n): PropertyAccessNode {\n return {\n type: 'propertyAccess',\n object: convertValue(value.object, warnings),\n property: value.property,\n };\n}\n\n/**\n * Convert an ExpressionValue (raw string) by parsing it with the expression parser.\n * This is the fallback for complex expressions that couldn't be fully parsed\n * at the semantic level.\n */\nexport function convertExpression(value: ExpressionValue): ExpressionNode {\n const result = parseExpression(value.raw);\n\n if (!result.success || !result.node) {\n // If parsing fails, return an identifier node with the raw value\n const identifier: IdentifierNode = {\n type: 'identifier',\n name: value.raw,\n };\n return identifier;\n }\n\n return result.node;\n}\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\nexport function isLiteralValue(value: SemanticValue): value is LiteralValue {\n return value.type === 'literal';\n}\n\nexport function isSelectorValue(value: SemanticValue): value is SelectorValue {\n return value.type === 'selector';\n}\n\nexport function isReferenceValue(value: SemanticValue): value is ReferenceValue {\n return value.type === 'reference';\n}\n\nexport function isPropertyPathValue(value: SemanticValue): value is PropertyPathValue {\n return value.type === 'property-path';\n}\n\nexport function isExpressionValue(value: SemanticValue): value is ExpressionValue {\n return value.type === 'expression';\n}\n","/**\n * Command-specific AST Mappers\n *\n * Each command can have a custom mapper that knows how to convert\n * its semantic roles to the appropriate AST structure.\n */\n\nimport type { CommandSemanticNode, ActionType, SemanticValue, SemanticRole } from '../types';\nimport { convertValue } from './value-converters';\nimport type { ASTBuilder, CommandNode } from './index';\nimport type { ExpressionNode } from './expression-parser';\n\n// =============================================================================\n// Command Mapper Interface\n// =============================================================================\n\n/**\n * Result from command mapping, including the AST and any warnings.\n */\nexport interface CommandMapperResult {\n ast: CommandNode;\n warnings: string[];\n}\n\n/**\n * Interface for command-specific AST mappers.\n */\nexport interface CommandMapper {\n /**\n * The action type this mapper handles.\n */\n readonly action: ActionType;\n\n /**\n * Convert a CommandSemanticNode to a CommandNode.\n *\n * @param node - The semantic command node\n * @param builder - The AST builder (for recursive building if needed)\n * @returns The AST command node with any warnings, or just the AST node for backward compatibility\n */\n toAST(node: CommandSemanticNode, builder: ASTBuilder): CommandMapperResult | CommandNode;\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Get a semantic value from a node's roles, returning undefined if not present.\n */\nfunction getRole(node: CommandSemanticNode, role: SemanticRole): SemanticValue | undefined {\n return node.roles.get(role);\n}\n\n/**\n * Convert a semantic value to an AST expression, or return undefined.\n *\n * @param node - The semantic node containing roles\n * @param role - The semantic role to extract\n * @param warnings - Optional array to collect warnings\n */\nfunction convertRoleValue(\n node: CommandSemanticNode,\n role: SemanticRole,\n warnings?: string[]\n): ExpressionNode | undefined {\n const value = getRole(node, role);\n return value ? convertValue(value, warnings) : undefined;\n}\n\n/**\n * Create a basic command node with standard structure.\n * Handles exactOptionalPropertyTypes by not including undefined properties.\n */\nfunction createCommandNode(\n name: string,\n args: ExpressionNode[] = [],\n modifiers?: Record<string, ExpressionNode>,\n options: {\n isBlocking?: boolean;\n implicitTarget?: ExpressionNode;\n semanticRoles?: Record<string, ExpressionNode>;\n } = {}\n): CommandNode {\n const result: CommandNode = {\n type: 'command',\n name,\n args,\n };\n\n // Only add optional properties if they have values (exactOptionalPropertyTypes)\n if (modifiers && Object.keys(modifiers).length > 0) {\n (result as { modifiers: Record<string, ExpressionNode> }).modifiers = modifiers;\n }\n\n if (options.isBlocking) {\n (result as { isBlocking: boolean }).isBlocking = options.isBlocking;\n }\n\n if (options.implicitTarget) {\n (result as { implicitTarget: ExpressionNode }).implicitTarget = options.implicitTarget;\n }\n\n if (options.semanticRoles && Object.keys(options.semanticRoles).length > 0) {\n (result as unknown as Record<string, unknown>)['semanticRoles'] = options.semanticRoles;\n }\n\n return result;\n}\n\n// =============================================================================\n// Command Mappers\n// =============================================================================\n\n/**\n * Toggle command mapper.\n *\n * Semantic: toggle patient:.active destination:#button\n * AST: { name: 'toggle', args: ['.active'], modifiers: { on: '#button' } }\n */\nconst toggleMapper: CommandMapper = {\n action: 'toggle',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient');\n const destination = convertRoleValue(node, 'destination');\n const duration = convertRoleValue(node, 'duration');\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (destination) modifiers['on'] = destination;\n if (duration) modifiers['for'] = duration;\n\n return createCommandNode('toggle', args, modifiers);\n },\n};\n\n/**\n * Add command mapper.\n *\n * Semantic: add patient:.active destination:#button\n * AST: { name: 'add', args: ['.active'], modifiers: { to: '#button' } }\n */\nconst addMapper: CommandMapper = {\n action: 'add',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient');\n const destination = convertRoleValue(node, 'destination');\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (destination) modifiers['to'] = destination;\n\n return createCommandNode('add', args, modifiers);\n },\n};\n\n/**\n * Remove command mapper.\n *\n * Semantic: remove patient:.active source:#button\n * AST: { name: 'remove', args: ['.active'], modifiers: { from: '#button' } }\n */\nconst removeMapper: CommandMapper = {\n action: 'remove',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient');\n const source = convertRoleValue(node, 'source');\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (source) modifiers['from'] = source;\n\n return createCommandNode('remove', args, modifiers);\n },\n};\n\n/**\n * Set command mapper.\n *\n * Semantic: set destination:#element's value patient:\"hello\"\n * AST: { name: 'set', args: [#element's value], modifiers: { to: \"hello\" } }\n *\n * Note: The destination typically includes the property path (e.g., #element's value)\n * and patient is the value being set.\n */\nconst setMapper: CommandMapper = {\n action: 'set',\n toAST(node, _builder) {\n const destination = convertRoleValue(node, 'destination');\n const patient = convertRoleValue(node, 'patient');\n\n const args: ExpressionNode[] = [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n // The destination is typically the property path to set\n if (destination) {\n args.push(destination);\n }\n\n // The patient is the value being set\n if (patient) modifiers['to'] = patient;\n\n return createCommandNode('set', args, modifiers);\n },\n};\n\n/**\n * Show command mapper.\n */\nconst showMapper: CommandMapper = {\n action: 'show',\n toAST(node, _builder) {\n const destination = convertRoleValue(node, 'destination');\n const patient = convertRoleValue(node, 'patient');\n const duration = convertRoleValue(node, 'duration');\n\n const args: ExpressionNode[] = [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n // Target can be in destination or patient\n const target = destination ?? patient;\n if (target) args.push(target);\n if (duration) modifiers['with'] = duration;\n\n return createCommandNode('show', args, modifiers);\n },\n};\n\n/**\n * Hide command mapper.\n */\nconst hideMapper: CommandMapper = {\n action: 'hide',\n toAST(node, _builder) {\n const destination = convertRoleValue(node, 'destination');\n const patient = convertRoleValue(node, 'patient');\n const duration = convertRoleValue(node, 'duration');\n\n const args: ExpressionNode[] = [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n const target = destination ?? patient;\n if (target) args.push(target);\n if (duration) modifiers['with'] = duration;\n\n return createCommandNode('hide', args, modifiers);\n },\n};\n\n/**\n * Increment command mapper.\n *\n * Semantic: increment patient:#count quantity:5\n * AST: { name: 'increment', args: [#count], modifiers: { by: 5 } }\n */\nconst incrementMapper: CommandMapper = {\n action: 'increment',\n toAST(node, _builder) {\n const destination = convertRoleValue(node, 'destination');\n const patient = convertRoleValue(node, 'patient');\n const quantity = convertRoleValue(node, 'quantity'); // Amount\n\n const args: ExpressionNode[] = [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n const target = destination ?? patient;\n if (target) args.push(target);\n if (quantity) modifiers['by'] = quantity;\n\n return createCommandNode('increment', args, modifiers);\n },\n};\n\n/**\n * Decrement command mapper.\n *\n * Semantic: decrement patient:#count quantity:5\n * AST: { name: 'decrement', args: [#count], modifiers: { by: 5 } }\n */\nconst decrementMapper: CommandMapper = {\n action: 'decrement',\n toAST(node, _builder) {\n const destination = convertRoleValue(node, 'destination');\n const patient = convertRoleValue(node, 'patient');\n const quantity = convertRoleValue(node, 'quantity');\n\n const args: ExpressionNode[] = [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n const target = destination ?? patient;\n if (target) args.push(target);\n if (quantity) modifiers['by'] = quantity;\n\n return createCommandNode('decrement', args, modifiers);\n },\n};\n\n/**\n * Wait command mapper.\n */\nconst waitMapper: CommandMapper = {\n action: 'wait',\n toAST(node, _builder) {\n const duration = convertRoleValue(node, 'duration');\n\n const args: ExpressionNode[] = duration ? [duration] : [];\n\n return createCommandNode('wait', args, undefined, { isBlocking: true });\n },\n};\n\n/**\n * Log command mapper.\n *\n * Semantic: log patient:\"hello\"\n * AST: { name: 'log', args: [\"hello\"] }\n */\nconst logMapper: CommandMapper = {\n action: 'log',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient');\n\n const args: ExpressionNode[] = [];\n if (patient) args.push(patient);\n\n return createCommandNode('log', args);\n },\n};\n\n/**\n * Put command mapper.\n *\n * Semantic: put patient:\"hello\" destination:#output method:into\n * AST: { name: 'put', args: [\"hello\"], modifiers: { into: #output } }\n */\nconst putMapper: CommandMapper = {\n action: 'put',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient');\n const destination = convertRoleValue(node, 'destination');\n const method = getRole(node, 'method'); // before, after, into, etc.\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (destination) {\n // Determine the preposition based on method or default to 'into'\n const prep = method?.type === 'literal' ? String(method.value) : 'into';\n modifiers[prep] = destination;\n }\n\n return createCommandNode('put', args, modifiers);\n },\n};\n\n/**\n * Fetch command mapper.\n *\n * Semantic: fetch source:\"/api/data\" responseType:json method:GET\n * AST: { name: 'fetch', args: [\"/api/data\"], modifiers: { as: json, with: GET } }\n */\nconst fetchMapper: CommandMapper = {\n action: 'fetch',\n toAST(node, _builder) {\n const source = convertRoleValue(node, 'source'); // URL\n const method = convertRoleValue(node, 'method'); // GET, POST, etc.\n const responseType = convertRoleValue(node, 'responseType'); // json, text, etc.\n const patient = convertRoleValue(node, 'patient'); // Body\n\n const args: ExpressionNode[] = source ? [source] : [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (method) modifiers['with'] = method;\n if (responseType) modifiers['as'] = responseType;\n if (patient) modifiers['body'] = patient;\n\n return createCommandNode('fetch', args, modifiers, { isBlocking: true });\n },\n};\n\n/**\n * Append command mapper.\n *\n * Semantic: append patient:\"text\" destination:#output\n * AST: { name: 'append', args: [\"text\"], modifiers: { to: #output } }\n */\nconst appendMapper: CommandMapper = {\n action: 'append',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient');\n const destination = convertRoleValue(node, 'destination');\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (destination) modifiers['to'] = destination;\n\n return createCommandNode('append', args, modifiers);\n },\n};\n\n/**\n * Prepend command mapper.\n *\n * Semantic: prepend patient:\"text\" destination:#output\n * AST: { name: 'prepend', args: [\"text\"], modifiers: { to: #output } }\n */\nconst prependMapper: CommandMapper = {\n action: 'prepend',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient');\n const destination = convertRoleValue(node, 'destination');\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (destination) modifiers['to'] = destination;\n\n return createCommandNode('prepend', args, modifiers);\n },\n};\n\n/**\n * Trigger command mapper.\n *\n * Semantic: trigger event:click destination:#button\n * AST: { name: 'trigger', args: [click], modifiers: { on: #button } }\n */\nconst triggerMapper: CommandMapper = {\n action: 'trigger',\n toAST(node, _builder) {\n const event = convertRoleValue(node, 'event');\n const destination = convertRoleValue(node, 'destination');\n\n const args: ExpressionNode[] = event ? [event] : [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (destination) modifiers['on'] = destination;\n\n return createCommandNode('trigger', args, modifiers);\n },\n};\n\n/**\n * Send command mapper.\n *\n * Semantic: send event:customEvent destination:#target patient:{detail}\n * AST: { name: 'send', args: [customEvent], modifiers: { to: #target, detail: ... } }\n */\nconst sendMapper: CommandMapper = {\n action: 'send',\n toAST(node, _builder) {\n const event = convertRoleValue(node, 'event');\n const destination = convertRoleValue(node, 'destination');\n const patient = convertRoleValue(node, 'patient');\n\n const args: ExpressionNode[] = event ? [event] : [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (destination) modifiers['to'] = destination;\n if (patient) modifiers['detail'] = patient;\n\n return createCommandNode('send', args, modifiers);\n },\n};\n\n/**\n * Go command mapper (navigation).\n *\n * Semantic: go source:/page destination:url\n * AST: { name: 'go', args: [/page], modifiers: { to: url } }\n */\nconst goMapper: CommandMapper = {\n action: 'go',\n toAST(node, _builder) {\n const source = convertRoleValue(node, 'source');\n const destination = convertRoleValue(node, 'destination');\n\n const args: ExpressionNode[] = [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n // Source is the URL/location to navigate to\n if (source) args.push(source);\n if (destination) modifiers['to'] = destination;\n\n return createCommandNode('go', args, modifiers);\n },\n};\n\n/**\n * Transition command mapper.\n *\n * Semantic: transition patient:*background-color goal:'red' duration:500ms destination:#element\n * AST: { name: 'transition', args: [*background-color], modifiers: { to: 'red', over: 500ms, on: #element } }\n */\nconst transitionMapper: CommandMapper = {\n action: 'transition',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient');\n const goal = convertRoleValue(node, 'goal');\n const duration = convertRoleValue(node, 'duration');\n const destination = convertRoleValue(node, 'destination');\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (goal) modifiers['to'] = goal;\n if (duration) modifiers['over'] = duration;\n if (destination) modifiers['on'] = destination;\n\n return createCommandNode('transition', args, modifiers);\n },\n};\n\n/**\n * Focus command mapper.\n *\n * Semantic: focus destination:#input\n * AST: { name: 'focus', args: [], modifiers: { on: #input } }\n */\nconst focusMapper: CommandMapper = {\n action: 'focus',\n toAST(node, _builder) {\n const destination = convertRoleValue(node, 'destination');\n const patient = convertRoleValue(node, 'patient');\n\n const args: ExpressionNode[] = [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n // Target can be in destination or patient\n const target = destination ?? patient;\n if (target) args.push(target);\n\n return createCommandNode('focus', args, modifiers);\n },\n};\n\n/**\n * Blur command mapper.\n *\n * Semantic: blur destination:#input\n * AST: { name: 'blur', args: [#input] }\n */\nconst blurMapper: CommandMapper = {\n action: 'blur',\n toAST(node, _builder) {\n const destination = convertRoleValue(node, 'destination');\n const patient = convertRoleValue(node, 'patient');\n\n const args: ExpressionNode[] = [];\n const target = destination ?? patient;\n if (target) args.push(target);\n\n return createCommandNode('blur', args);\n },\n};\n\n/**\n * Get command mapper.\n *\n * Semantic: get source:myValue\n * AST: { name: 'get', args: [myValue] }\n */\nconst getMapper: CommandMapper = {\n action: 'get',\n toAST(node, _builder) {\n const source = convertRoleValue(node, 'source');\n const patient = convertRoleValue(node, 'patient');\n\n const args: ExpressionNode[] = [];\n const value = source ?? patient;\n if (value) args.push(value);\n\n return createCommandNode('get', args);\n },\n};\n\n/**\n * Take command mapper.\n *\n * Semantic: take patient:.active source:#parent\n * AST: { name: 'take', args: [.active], modifiers: { from: #parent } }\n */\nconst takeMapper: CommandMapper = {\n action: 'take',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient');\n const source = convertRoleValue(node, 'source');\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (source) modifiers['from'] = source;\n\n return createCommandNode('take', args, modifiers);\n },\n};\n\n/**\n * Call command mapper.\n *\n * Semantic: call patient:functionName\n * AST: { name: 'call', args: [functionName] }\n */\nconst callMapper: CommandMapper = {\n action: 'call',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient');\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n\n return createCommandNode('call', args);\n },\n};\n\n/**\n * Return command mapper.\n *\n * Semantic: return patient:value\n * AST: { name: 'return', args: [value] }\n */\nconst returnMapper: CommandMapper = {\n action: 'return',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient');\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n\n return createCommandNode('return', args);\n },\n};\n\n/**\n * Halt command mapper.\n *\n * Semantic: halt\n * AST: { name: 'halt', args: [] }\n */\nconst haltMapper: CommandMapper = {\n action: 'halt',\n toAST(_node, _builder) {\n return createCommandNode('halt', []);\n },\n};\n\n/**\n * Throw command mapper.\n *\n * Semantic: throw patient:\"error message\"\n * AST: { name: 'throw', args: [\"error message\"] }\n */\nconst throwMapper: CommandMapper = {\n action: 'throw',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient');\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n\n return createCommandNode('throw', args);\n },\n};\n\n/**\n * Settle command mapper.\n *\n * Semantic: settle destination:#element\n * AST: { name: 'settle', args: [#element] }\n */\nconst settleMapper: CommandMapper = {\n action: 'settle',\n toAST(node, _builder) {\n const destination = convertRoleValue(node, 'destination');\n const patient = convertRoleValue(node, 'patient');\n\n const args: ExpressionNode[] = [];\n const target = destination ?? patient;\n if (target) args.push(target);\n\n return createCommandNode('settle', args, undefined, { isBlocking: true });\n },\n};\n\n// =============================================================================\n// Tier 3: Advanced Commands\n// =============================================================================\n\n/**\n * Swap command mapper.\n *\n * Semantic: swap patient:innerHTML destination:#element source:\"<p>new</p>\"\n * AST: { name: 'swap', args: [innerHTML, \"<p>new</p>\"], modifiers: { on: #element } }\n */\nconst swapMapper: CommandMapper = {\n action: 'swap',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient'); // What to swap (e.g., innerHTML)\n const source = convertRoleValue(node, 'source'); // New content\n const destination = convertRoleValue(node, 'destination'); // Target element\n const style = convertRoleValue(node, 'style'); // Swap strategy (innerHTML, outerHTML, etc.)\n\n const args: ExpressionNode[] = [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (patient) args.push(patient);\n if (source) args.push(source);\n if (destination) modifiers['on'] = destination;\n if (style) modifiers['with'] = style;\n\n return createCommandNode('swap', args, modifiers);\n },\n};\n\n/**\n * Morph command mapper.\n *\n * Semantic: morph destination:#element source:\"<div>new</div>\"\n * AST: { name: 'morph', args: [\"<div>new</div>\"], modifiers: { on: #element } }\n */\nconst morphMapper: CommandMapper = {\n action: 'morph',\n toAST(node, _builder) {\n const source = convertRoleValue(node, 'source'); // New HTML\n const destination = convertRoleValue(node, 'destination'); // Target element\n const patient = convertRoleValue(node, 'patient');\n\n const args: ExpressionNode[] = [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n const content = source ?? patient;\n if (content) args.push(content);\n if (destination) modifiers['on'] = destination;\n\n return createCommandNode('morph', args, modifiers);\n },\n};\n\n/**\n * Clone command mapper.\n *\n * Semantic: clone source:#template destination:#container\n * AST: { name: 'clone', args: [#template], modifiers: { into: #container } }\n */\nconst cloneMapper: CommandMapper = {\n action: 'clone',\n toAST(node, _builder) {\n const source = convertRoleValue(node, 'source'); // Element to clone\n const destination = convertRoleValue(node, 'destination'); // Where to put clone\n const patient = convertRoleValue(node, 'patient');\n\n const args: ExpressionNode[] = [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n const target = source ?? patient;\n if (target) args.push(target);\n if (destination) modifiers['into'] = destination;\n\n return createCommandNode('clone', args, modifiers);\n },\n};\n\n/**\n * Make command mapper.\n *\n * Semantic: make patient:Date\n * AST: { name: 'make', args: [Date] }\n */\nconst makeMapper: CommandMapper = {\n action: 'make',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient'); // Constructor/type\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n\n return createCommandNode('make', args);\n },\n};\n\n/**\n * Measure command mapper.\n *\n * Semantic: measure destination:#element patient:width\n * AST: { name: 'measure', args: [width], modifiers: { of: #element } }\n */\nconst measureMapper: CommandMapper = {\n action: 'measure',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient'); // What to measure\n const destination = convertRoleValue(node, 'destination'); // Element\n const source = convertRoleValue(node, 'source');\n\n const args: ExpressionNode[] = [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (patient) args.push(patient);\n const element = destination ?? source;\n if (element) modifiers['of'] = element;\n\n return createCommandNode('measure', args, modifiers);\n },\n};\n\n/**\n * Tell command mapper.\n *\n * Semantic: tell destination:#element\n * AST: { name: 'tell', args: [#element] }\n */\nconst tellMapper: CommandMapper = {\n action: 'tell',\n toAST(node, _builder) {\n const destination = convertRoleValue(node, 'destination');\n const patient = convertRoleValue(node, 'patient');\n\n const args: ExpressionNode[] = [];\n const target = destination ?? patient;\n if (target) args.push(target);\n\n return createCommandNode('tell', args);\n },\n};\n\n/**\n * JS command mapper (inline JavaScript).\n *\n * Semantic: js patient:\"console.log('hello')\"\n * AST: { name: 'js', args: [\"console.log('hello')\"] }\n */\nconst jsMapper: CommandMapper = {\n action: 'js',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient'); // JS code\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n\n return createCommandNode('js', args);\n },\n};\n\n/**\n * Async command mapper.\n *\n * Semantic: async\n * AST: { name: 'async', args: [] }\n */\nconst asyncMapper: CommandMapper = {\n action: 'async',\n toAST(_node, _builder) {\n return createCommandNode('async', []);\n },\n};\n\n/**\n * If command mapper.\n *\n * Semantic: if condition:x > 5\n * AST: { name: 'if', args: [], modifiers: { condition: x > 5 } }\n */\nconst ifMapper: CommandMapper = {\n action: 'if',\n toAST(node, _builder) {\n const condition = convertRoleValue(node, 'condition');\n\n const args: ExpressionNode[] = condition ? [condition] : [];\n\n return createCommandNode('if', args);\n },\n};\n\n/**\n * Unless command mapper.\n *\n * Semantic: unless condition:x < 5\n * AST: { name: 'unless', args: [x < 5] }\n */\nconst unlessMapper: CommandMapper = {\n action: 'unless',\n toAST(node, _builder) {\n const condition = convertRoleValue(node, 'condition');\n\n const args: ExpressionNode[] = condition ? [condition] : [];\n\n return createCommandNode('unless', args);\n },\n};\n\n/**\n * Repeat command mapper.\n *\n * Semantic: repeat quantity:5\n * AST: { name: 'repeat', args: [5] }\n */\nconst repeatMapper: CommandMapper = {\n action: 'repeat',\n toAST(node, _builder) {\n const quantity = convertRoleValue(node, 'quantity');\n const patient = convertRoleValue(node, 'patient');\n\n const args: ExpressionNode[] = [];\n const count = quantity ?? patient;\n if (count) args.push(count);\n\n return createCommandNode('repeat', args);\n },\n};\n\n/**\n * For command mapper.\n *\n * Semantic: for patient:item source:items\n * AST: { name: 'for', args: [item], modifiers: { in: items } }\n */\nconst forMapper: CommandMapper = {\n action: 'for',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient'); // Loop variable\n const source = convertRoleValue(node, 'source'); // Collection\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (source) modifiers['in'] = source;\n\n return createCommandNode('for', args, modifiers);\n },\n};\n\n/**\n * While command mapper.\n *\n * Semantic: while condition:x < 10\n * AST: { name: 'while', args: [x < 10] }\n */\nconst whileMapper: CommandMapper = {\n action: 'while',\n toAST(node, _builder) {\n const condition = convertRoleValue(node, 'condition');\n\n const args: ExpressionNode[] = condition ? [condition] : [];\n\n return createCommandNode('while', args);\n },\n};\n\n/**\n * Continue command mapper.\n *\n * Semantic: continue\n * AST: { name: 'continue', args: [] }\n */\nconst continueMapper: CommandMapper = {\n action: 'continue',\n toAST(_node, _builder) {\n return createCommandNode('continue', []);\n },\n};\n\n/**\n * Default command mapper.\n *\n * Semantic: default patient:myVar source:0\n * AST: { name: 'default', args: [myVar], modifiers: { to: 0 } }\n */\nconst defaultMapper: CommandMapper = {\n action: 'default',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient'); // Variable\n const source = convertRoleValue(node, 'source'); // Default value\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (source) modifiers['to'] = source;\n\n return createCommandNode('default', args, modifiers);\n },\n};\n\n/**\n * Init command mapper.\n *\n * Semantic: init\n * AST: { name: 'init', args: [] }\n */\nconst initMapper: CommandMapper = {\n action: 'init',\n toAST(_node, _builder) {\n return createCommandNode('init', []);\n },\n};\n\n/**\n * Behavior command mapper.\n *\n * Semantic: behavior patient:MyBehavior\n * AST: { name: 'behavior', args: [MyBehavior] }\n */\nconst behaviorMapper: CommandMapper = {\n action: 'behavior',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient'); // Behavior name\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n\n return createCommandNode('behavior', args);\n },\n};\n\n/**\n * Install command mapper.\n *\n * Semantic: install patient:MyBehavior destination:#element\n * AST: { name: 'install', args: [MyBehavior], modifiers: { on: #element } }\n */\nconst installMapper: CommandMapper = {\n action: 'install',\n toAST(node, _builder) {\n const patient = convertRoleValue(node, 'patient'); // Behavior to install\n const destination = convertRoleValue(node, 'destination'); // Target element\n\n const args: ExpressionNode[] = patient ? [patient] : [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (destination) modifiers['on'] = destination;\n\n return createCommandNode('install', args, modifiers);\n },\n};\n\n/**\n * On command mapper (event handler declaration).\n *\n * Semantic: on event:click\n * AST: { name: 'on', args: [click] }\n */\nconst onMapper: CommandMapper = {\n action: 'on',\n toAST(node, _builder) {\n const event = convertRoleValue(node, 'event');\n const source = convertRoleValue(node, 'source'); // 'from' clause\n\n const args: ExpressionNode[] = event ? [event] : [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n if (source) modifiers['from'] = source;\n\n return createCommandNode('on', args, modifiers);\n },\n};\n\n// =============================================================================\n// Mapper Registry\n// =============================================================================\n\nconst mappers: Map<ActionType, CommandMapper> = new Map([\n // Tier 1: Core commands\n ['toggle', toggleMapper],\n ['add', addMapper],\n ['remove', removeMapper],\n ['set', setMapper],\n ['show', showMapper],\n ['hide', hideMapper],\n ['increment', incrementMapper],\n ['decrement', decrementMapper],\n ['wait', waitMapper],\n ['log', logMapper],\n ['put', putMapper],\n ['fetch', fetchMapper],\n // Tier 2: Content manipulation\n ['append', appendMapper],\n ['prepend', prependMapper],\n ['get', getMapper],\n ['take', takeMapper],\n // Tier 2: Events\n ['trigger', triggerMapper],\n ['send', sendMapper],\n ['on', onMapper],\n // Tier 2: Navigation & DOM\n ['go', goMapper],\n ['transition', transitionMapper],\n ['focus', focusMapper],\n ['blur', blurMapper],\n // Tier 2: Control flow\n ['call', callMapper],\n ['return', returnMapper],\n ['halt', haltMapper],\n ['throw', throwMapper],\n ['settle', settleMapper],\n // Tier 3: Advanced DOM\n ['swap', swapMapper],\n ['morph', morphMapper],\n ['clone', cloneMapper],\n ['measure', measureMapper],\n // Tier 3: Object/Types\n ['make', makeMapper],\n ['tell', tellMapper],\n ['default', defaultMapper],\n // Tier 3: JavaScript integration\n ['js', jsMapper],\n ['async', asyncMapper],\n // Tier 3: Conditionals\n ['if', ifMapper],\n ['unless', unlessMapper],\n // Tier 3: Loops\n ['repeat', repeatMapper],\n ['for', forMapper],\n ['while', whileMapper],\n ['continue', continueMapper],\n // Tier 3: Behaviors\n ['init', initMapper],\n ['behavior', behaviorMapper],\n ['install', installMapper],\n]);\n\n/**\n * Get the command mapper for an action type.\n *\n * @param action - The action type\n * @returns The mapper, or undefined if no specific mapper exists\n */\nexport function getCommandMapper(action: ActionType): CommandMapper | undefined {\n return mappers.get(action);\n}\n\n/**\n * Register a custom command mapper.\n *\n * @param mapper - The command mapper to register\n */\nexport function registerCommandMapper(mapper: CommandMapper): void {\n mappers.set(mapper.action, mapper);\n}\n\n/**\n * Get all registered command mappers.\n */\nexport function getRegisteredMappers(): Map<ActionType, CommandMapper> {\n return new Map(mappers);\n}\n","/**\n * Semantic to AST Builder\n *\n * Converts SemanticNodes directly to AST nodes, bypassing the English text\n * generation and re-parsing step.\n *\n * Flow:\n * Japanese → Semantic Parser → SemanticNode → AST Builder → AST\n *\n * Instead of:\n * Japanese → Semantic Parser → SemanticNode → English Text → Parser → AST\n */\n\nimport type {\n SemanticNode,\n CommandSemanticNode,\n EventHandlerSemanticNode,\n ConditionalSemanticNode,\n CompoundSemanticNode,\n LoopSemanticNode,\n SemanticRole,\n} from '../types';\n\nimport { convertValue } from './value-converters';\nimport { getCommandMapper, type CommandMapperResult } from './command-mappers';\nimport type { ExpressionNode } from './expression-parser';\n\n// =============================================================================\n// AST Types (compatible with @hyperfixi/core)\n// =============================================================================\n\n/**\n * Base AST node interface\n */\nexport interface ASTNode {\n readonly type: string;\n readonly start?: number;\n readonly end?: number;\n readonly line?: number;\n readonly column?: number;\n [key: string]: unknown;\n}\n\n/**\n * Command AST node\n */\nexport interface CommandNode extends ASTNode {\n readonly type: 'command';\n readonly name: string;\n readonly args: ExpressionNode[];\n readonly modifiers?: Record<string, ExpressionNode>;\n readonly isBlocking?: boolean;\n readonly implicitTarget?: ExpressionNode;\n}\n\n/**\n * Event handler AST node (compatible with @hyperfixi/core)\n */\nexport interface EventHandlerNode extends ASTNode {\n readonly type: 'eventHandler';\n /** Primary event name */\n readonly event: string;\n /** All event names when using \"on event1 or event2\" syntax */\n readonly events?: string[];\n /** CSS selector for event delegation (\"from\" keyword) */\n readonly selector?: string;\n /** Target for \"from\" clause (as string or expression) */\n readonly target?: string;\n /** Optional event condition (\"[condition]\" syntax) */\n readonly condition?: ASTNode;\n /** Attribute name for mutation events (\"of @attribute\" syntax) */\n readonly attributeName?: string;\n /** Target element to watch for changes (\"in <target>\" syntax) */\n readonly watchTarget?: ExpressionNode;\n /** Event parameter names to destructure (e.g., ['clientX', 'clientY']) */\n readonly args?: string[];\n /** Event parameters (alias for args) */\n readonly params?: string[];\n /** Handler commands */\n readonly commands: ASTNode[];\n}\n\n/**\n * Conditional AST node (if/else)\n *\n * Note: For runtime compatibility, buildConditional() now produces a CommandNode\n * with condition and branches as args, matching what IfCommand expects.\n * This interface is retained for reference but not used as output.\n */\nexport interface ConditionalNode extends ASTNode {\n readonly type: 'if';\n readonly condition: ExpressionNode;\n readonly thenBranch: ASTNode[];\n readonly elseBranch?: ASTNode[];\n}\n\n/**\n * Command sequence node (runtime-compatible format for chained commands)\n */\nexport interface CommandSequenceNode extends ASTNode {\n readonly type: 'CommandSequence';\n /** Commands in the sequence */\n readonly commands: ASTNode[];\n}\n\n/**\n * Block node (for grouping commands)\n */\nexport interface BlockNode extends ASTNode {\n readonly type: 'block';\n readonly commands: ASTNode[];\n}\n\n// =============================================================================\n// AST Builder\n// =============================================================================\n\nexport interface ASTBuilderOptions {\n /**\n * Fallback function to parse complex expressions that can't be handled\n * directly by the AST builder. Uses the expression-parser by default.\n */\n parseExpression?: (input: string) => ExpressionNode | null;\n}\n\n/**\n * Builds AST nodes directly from SemanticNodes.\n */\nexport class ASTBuilder {\n /**\n * Warnings collected during AST building (e.g., type inference issues).\n */\n public warnings: string[] = [];\n\n constructor(_options: ASTBuilderOptions = {}) {\n // Options reserved for future use (e.g., custom expression parser)\n }\n\n /**\n * Build an AST from a SemanticNode.\n *\n * @param node - The semantic node to convert\n * @returns The corresponding AST node\n */\n build(node: SemanticNode): ASTNode {\n switch (node.kind) {\n case 'command':\n return this.buildCommand(node as CommandSemanticNode);\n case 'event-handler':\n return this.buildEventHandler(node as EventHandlerSemanticNode);\n case 'conditional':\n return this.buildConditional(node as ConditionalSemanticNode);\n case 'compound':\n return this.buildCompound(node as CompoundSemanticNode);\n case 'loop':\n return this.buildLoop(node as LoopSemanticNode);\n default:\n throw new Error(`Unknown semantic node kind: ${(node as SemanticNode).kind}`);\n }\n }\n\n /**\n * Build a CommandNode from a CommandSemanticNode.\n */\n private buildCommand(node: CommandSemanticNode): CommandNode {\n const mapper = getCommandMapper(node.action);\n let cmd: CommandNode;\n\n if (mapper) {\n // Use command-specific mapper\n const result = mapper.toAST(node, this);\n\n // Handle both new CommandMapperResult format and legacy CommandNode format\n if ('ast' in result && 'warnings' in result) {\n // New format with warnings\n const mapperResult = result as CommandMapperResult;\n this.warnings.push(...mapperResult.warnings);\n cmd = mapperResult.ast;\n } else {\n // Legacy format (just CommandNode)\n cmd = result as CommandNode;\n }\n } else {\n // Fallback: generic command mapping\n cmd = this.buildGenericCommand(node);\n }\n\n // Attach semantic roles for downstream consumers (interchange format, AOT compiler)\n if (node.roles && node.roles.size > 0) {\n const roles: Record<string, ReturnType<typeof convertValue>> = {};\n for (const [role, value] of node.roles) {\n roles[role] = convertValue(value);\n }\n if (Object.keys(roles).length > 0) {\n (cmd as unknown as Record<string, unknown>)['semanticRoles'] = roles;\n }\n }\n\n return cmd;\n }\n\n /**\n * Generic command builder when no specific mapper is available.\n * Maps roles to args in a predictable order.\n */\n private buildGenericCommand(node: CommandSemanticNode): CommandNode {\n const args: ExpressionNode[] = [];\n const modifiers: Record<string, ExpressionNode> = {};\n\n // Standard role-to-position mapping\n // Note: Using only valid SemanticRoles from the type definition\n const argRoles: SemanticRole[] = ['patient', 'source', 'quantity'];\n const modifierRoles: SemanticRole[] = ['destination', 'duration', 'method', 'style'];\n\n // Convert argument roles\n for (const role of argRoles) {\n const value = node.roles.get(role);\n if (value) {\n args.push(convertValue(value));\n }\n }\n\n // Convert modifier roles\n for (const role of modifierRoles) {\n const value = node.roles.get(role);\n if (value) {\n // Map semantic roles to hyperscript modifier keywords\n const modifierKey = this.roleToModifierKey(role);\n modifiers[modifierKey] = convertValue(value);\n }\n }\n\n const result: CommandNode = {\n type: 'command',\n name: node.action,\n args,\n };\n\n // Only add modifiers if there are any (avoid exactOptionalPropertyTypes issue)\n if (Object.keys(modifiers).length > 0) {\n return { ...result, modifiers };\n }\n\n return result;\n }\n\n /**\n * Map semantic roles to hyperscript modifier keywords.\n */\n private roleToModifierKey(role: SemanticRole): string {\n const mapping: Partial<Record<SemanticRole, string>> = {\n destination: 'on',\n duration: 'for',\n source: 'from',\n condition: 'if',\n method: 'via',\n style: 'with',\n };\n return mapping[role] ?? role;\n }\n\n /**\n * Build an EventHandlerNode from an EventHandlerSemanticNode.\n */\n private buildEventHandler(node: EventHandlerSemanticNode): EventHandlerNode {\n // Extract event name(s)\n const eventValue = node.roles.get('event');\n let event: string;\n let events: string[] | undefined;\n\n if (eventValue?.type === 'literal') {\n const eventStr = String(eventValue.value);\n // Handle \"click or keydown\" syntax\n if (eventStr.includes('|') || eventStr.includes(' or ')) {\n events = eventStr.split(/\\s+or\\s+|\\|/).map(e => e.trim());\n event = events[0];\n } else {\n event = eventStr;\n }\n } else if (eventValue?.type === 'reference') {\n event = eventValue.value;\n } else {\n event = 'click'; // Default event\n }\n\n // Build body commands recursively\n const commands = node.body.map(child => this.build(child));\n\n // Get selector/target from 'source' role if present\n const fromValue = node.roles.get('source');\n let selector: string | undefined;\n let target: string | undefined;\n\n if (fromValue?.type === 'selector') {\n selector = fromValue.value;\n target = fromValue.value;\n } else if (fromValue?.type === 'reference') {\n target = fromValue.value;\n } else if (fromValue?.type === 'literal') {\n target = String(fromValue.value);\n }\n\n // Get condition from 'condition' role if present\n const conditionValue = node.roles.get('condition');\n const condition = conditionValue ? convertValue(conditionValue) : undefined;\n\n // Get destination (watchTarget) if present\n const destinationValue = node.roles.get('destination');\n const watchTarget = destinationValue ? convertValue(destinationValue) : undefined;\n\n // Extract event modifiers\n const modifiers = node.eventModifiers;\n\n // Handle queue modifier (debounce, throttle, etc. are runtime concerns)\n let finalSelector = selector;\n if (modifiers?.from) {\n const fromMod = modifiers.from;\n if (fromMod.type === 'selector' && !selector) {\n finalSelector = fromMod.value;\n }\n }\n\n // Extract event parameter names for destructuring (e.g., on click(clientX, clientY))\n const args = node.parameterNames ? [...node.parameterNames] : undefined;\n\n // Build result with spread for optional properties (exactOptionalPropertyTypes compliant)\n return {\n type: 'eventHandler' as const,\n event,\n commands,\n ...(events && events.length > 1 ? { events } : {}),\n ...(finalSelector ? { selector: finalSelector } : {}),\n ...(target ? { target } : {}),\n ...(condition ? { condition: condition as ASTNode } : {}),\n ...(watchTarget ? { watchTarget } : {}),\n ...(args && args.length > 0 ? { args, params: args } : {}),\n };\n }\n\n /**\n * Build a CommandNode from a ConditionalSemanticNode.\n *\n * Produces a command node with:\n * - args[0]: condition expression\n * - args[1]: then block (wrapped in { type: 'block', commands: [...] })\n * - args[2]: else block (optional, same format)\n *\n * This format matches what IfCommand.parseInput() expects.\n */\n private buildConditional(node: ConditionalSemanticNode): CommandNode {\n const conditionValue = node.roles.get('condition');\n if (!conditionValue) {\n throw new Error('Conditional node missing condition');\n }\n\n const condition = convertValue(conditionValue);\n const thenBranch = node.thenBranch.map(child => this.build(child));\n const elseBranch = node.elseBranch?.map(child => this.build(child));\n\n // Build args array matching IfCommand expected format\n const args: ExpressionNode[] = [\n condition,\n // args[1]: then block wrapped as block node\n {\n type: 'block',\n commands: thenBranch,\n } as unknown as ExpressionNode,\n ];\n\n // args[2]: else block (if present)\n if (elseBranch && elseBranch.length > 0) {\n args.push({\n type: 'block',\n commands: elseBranch,\n } as unknown as ExpressionNode);\n }\n\n return {\n type: 'command',\n name: 'if',\n args,\n };\n }\n\n /**\n * Build AST nodes from a CompoundSemanticNode.\n *\n * Converts to CommandSequence for runtime compatibility.\n * The runtime recognizes 'CommandSequence' type and executes commands in order.\n */\n private buildCompound(node: CompoundSemanticNode): ASTNode {\n // Build all statements recursively\n const statements = node.statements.map(child => this.build(child));\n\n // Single statement: unwrap and return directly\n if (statements.length === 1) {\n return statements[0];\n }\n\n // Empty: return a no-op block\n if (statements.length === 0) {\n return {\n type: 'block',\n commands: [],\n };\n }\n\n // Convert to CommandSequence for runtime compatibility\n // Runtime handles 'CommandSequence' type in executeCommandSequence()\n const result: CommandSequenceNode = {\n type: 'CommandSequence',\n commands: statements,\n };\n\n return result;\n }\n\n /**\n * Build a CommandNode from a LoopSemanticNode.\n *\n * Produces a 'repeat' command with:\n * - args[0]: loop type identifier (forever, times, for, while, until)\n * - args[1]: count/condition/variable depending on loop type\n * - args[2]: collection (for 'for' loops)\n * - args[last]: body block\n *\n * This format matches what the repeat command parser produces.\n */\n private buildLoop(node: LoopSemanticNode): CommandNode {\n // Build body commands recursively\n const bodyCommands = node.body.map(child => this.build(child));\n\n const args: ExpressionNode[] = [\n // args[0]: loop type identifier\n {\n type: 'identifier',\n name: node.loopVariant,\n } as unknown as ExpressionNode,\n ];\n\n // Add loop-specific arguments based on variant\n switch (node.loopVariant) {\n case 'times': {\n // args[1]: count expression\n const quantity = node.roles.get('quantity');\n if (quantity) {\n args.push(convertValue(quantity));\n }\n break;\n }\n case 'for': {\n // args[1]: loop variable name\n if (node.loopVariable) {\n args.push({\n type: 'string',\n value: node.loopVariable,\n } as unknown as ExpressionNode);\n }\n // args[2]: collection/source\n const source = node.roles.get('source');\n if (source) {\n args.push(convertValue(source));\n }\n break;\n }\n case 'while':\n case 'until': {\n // args[1]: condition expression\n const condition = node.roles.get('condition');\n if (condition) {\n args.push(convertValue(condition));\n }\n break;\n }\n case 'forever':\n // No additional args needed for forever loops\n break;\n }\n\n // args[last]: body block\n args.push({\n type: 'block',\n commands: bodyCommands,\n } as unknown as ExpressionNode);\n\n return {\n type: 'command',\n name: 'repeat',\n args,\n };\n }\n\n /**\n * Build a BlockNode from an array of semantic nodes.\n * Useful for grouping commands in if/else branches.\n */\n buildBlock(nodes: SemanticNode[]): BlockNode {\n const commands = nodes.map(child => this.build(child));\n return {\n type: 'block',\n commands,\n };\n }\n}\n\n// =============================================================================\n// Convenience Function\n// =============================================================================\n\n/**\n * Result from building an AST, including any warnings.\n */\nexport interface BuildASTResult {\n ast: ASTNode;\n warnings: string[];\n}\n\n/**\n * Build an AST from a SemanticNode using default options.\n *\n * @param node - The semantic node to convert\n * @returns The corresponding AST node and any warnings\n */\nexport function buildAST(node: SemanticNode): BuildASTResult {\n const builder = new ASTBuilder();\n const ast = builder.build(node);\n return {\n ast,\n warnings: builder.warnings,\n };\n}\n\n// Re-exports from value-converters\nexport {\n convertValue,\n convertLiteral,\n convertSelector,\n convertReference,\n convertPropertyPath,\n convertExpression,\n} from './value-converters';\n\n// Re-exports from command-mappers\nexport {\n getCommandMapper,\n registerCommandMapper,\n getRegisteredMappers,\n type CommandMapper,\n type CommandMapperResult,\n} from './command-mappers';\n","/**\n * Bidirectional Converter\n *\n * Converts between natural language syntax and explicit syntax,\n * and between different natural languages.\n */\n\nimport type { SemanticNode } from '../types';\nimport { parse } from '../parser';\nimport { render, renderExplicit } from './renderer';\nimport { parseExplicit, isExplicitSyntax } from './parser';\n\n// =============================================================================\n// Bidirectional Conversion\n// =============================================================================\n\n/**\n * Convert natural language hyperscript to explicit syntax.\n *\n * @param input Natural language hyperscript\n * @param sourceLanguage Source language code\n * @returns Explicit syntax string\n *\n * @example\n * toExplicit('toggle .active on #button', 'en')\n * // → '[toggle patient:.active destination:#button]'\n *\n * toExplicit('#button の .active を 切り替え', 'ja')\n * // → '[toggle patient:.active destination:#button]'\n */\nexport function toExplicit(input: string, sourceLanguage: string): string {\n // If already explicit, return as-is\n if (isExplicitSyntax(input)) {\n return input;\n }\n\n const node = parse(input, sourceLanguage);\n return renderExplicit(node);\n}\n\n/**\n * Convert explicit syntax to natural language.\n *\n * @param explicit Explicit syntax string\n * @param targetLanguage Target language code\n * @returns Natural language hyperscript\n *\n * @example\n * fromExplicit('[toggle patient:.active destination:#button]', 'en')\n * // → 'toggle .active on #button'\n *\n * fromExplicit('[toggle patient:.active destination:#button]', 'ja')\n * // → '#button の .active を 切り替え'\n */\nexport function fromExplicit(explicit: string, targetLanguage: string): string {\n const node = parseExplicit(explicit);\n return render(node, targetLanguage);\n}\n\n/**\n * Translate hyperscript from one language to another.\n *\n * @param input Natural language hyperscript\n * @param sourceLanguage Source language code\n * @param targetLanguage Target language code\n * @returns Translated hyperscript\n *\n * @example\n * translate('toggle .active on #button', 'en', 'ja')\n * // → '#button の .active を 切り替え'\n *\n * translate('#button の .active を 切り替え', 'ja', 'ar')\n * // → 'بدّل .active على #button'\n */\nexport function translate(input: string, sourceLanguage: string, targetLanguage: string): string {\n // Handle explicit syntax\n if (isExplicitSyntax(input)) {\n return fromExplicit(input, targetLanguage);\n }\n\n // Parse source language\n const node = parse(input, sourceLanguage);\n\n // Render in target language\n return render(node, targetLanguage);\n}\n\n/**\n * Parse input (either explicit or natural language) to semantic node.\n *\n * @param input Hyperscript input (explicit or natural)\n * @param language Language code (required for natural, ignored for explicit)\n * @returns Semantic node\n */\nexport function parseAny(input: string, language: string): SemanticNode {\n if (isExplicitSyntax(input)) {\n return parseExplicit(input);\n }\n return parse(input, language);\n}\n\n/**\n * Round-trip validation: parse and re-render to verify consistency.\n *\n * When called with 2 arguments, returns an object with validation info.\n * When called with 3 arguments, returns the rendered string directly.\n *\n * @param input Original input\n * @param sourceLanguage Source language code\n * @param targetLanguage Target language code (optional, if provided returns string only)\n * @returns Object with original, semantic, re-rendered, and match status (or just string if targetLanguage provided)\n */\nexport function roundTrip(\n input: string,\n sourceLanguage: string,\n targetLanguage?: string\n):\n | string\n | {\n original: string;\n semantic: SemanticNode;\n rendered: string;\n matches: boolean;\n } {\n const semantic = parseAny(input, sourceLanguage);\n const outputLanguage = targetLanguage ?? sourceLanguage;\n const rendered = isExplicitSyntax(input)\n ? renderExplicit(semantic)\n : render(semantic, outputLanguage);\n\n // If target language is explicitly provided, return just the rendered string\n if (targetLanguage !== undefined) {\n return rendered;\n }\n\n // Normalize for comparison (trim whitespace, lowercase)\n const normalizedOriginal = input.trim().toLowerCase();\n const normalizedRendered = rendered.trim().toLowerCase();\n\n return {\n original: input,\n semantic,\n rendered,\n matches: normalizedOriginal === normalizedRendered,\n };\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Get all translations of a hyperscript statement.\n *\n * @param input Hyperscript input\n * @param sourceLanguage Source language (or 'explicit')\n * @param targetLanguages List of target language codes (defaults to all 13 supported languages)\n * @returns Object mapping language codes to translations\n */\nexport function getAllTranslations(\n input: string,\n sourceLanguage: string,\n targetLanguages: string[] = [\n 'en',\n 'ja',\n 'ar',\n 'es',\n 'ko',\n 'zh',\n 'tr',\n 'pt',\n 'fr',\n 'de',\n 'id',\n 'qu',\n 'sw',\n ]\n): Record<string, string> {\n const result: Record<string, string> = {};\n\n // Parse once\n const node = parseAny(input, sourceLanguage);\n\n // Render for each target language\n for (const lang of targetLanguages) {\n result[lang] = render(node, lang);\n }\n\n // Also include explicit\n result['explicit'] = renderExplicit(node);\n\n return result;\n}\n\n/**\n * Validate that a translation is semantically equivalent.\n *\n * @param original Original hyperscript\n * @param translated Translated hyperscript\n * @param originalLang Original language\n * @param translatedLang Translated language\n * @returns true if semantically equivalent\n */\nexport function validateTranslation(\n original: string,\n translated: string,\n originalLang: string,\n translatedLang: string\n): boolean {\n try {\n const originalNode = parseAny(original, originalLang);\n const translatedNode = parseAny(translated, translatedLang);\n\n // Compare semantic content\n if (originalNode.action !== translatedNode.action) {\n return false;\n }\n\n // Compare roles\n for (const [role, value] of originalNode.roles) {\n const translatedValue = translatedNode.roles.get(role);\n if (!translatedValue) {\n return false;\n }\n\n // Deep compare values\n if (!semanticValuesEqual(value, translatedValue)) {\n return false;\n }\n }\n\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if two semantic values are equal.\n */\nfunction semanticValuesEqual(a: any, b: any): boolean {\n if (a.type !== b.type) return false;\n\n switch (a.type) {\n case 'literal':\n return a.value === b.value;\n case 'selector':\n return a.value === b.value;\n case 'reference':\n return a.value === b.value;\n case 'property-path':\n return semanticValuesEqual(a.object, b.object) && a.property === b.property;\n case 'expression':\n return a.raw === b.raw;\n default:\n return false;\n }\n}\n","/**\n * Command Schemas\n *\n * Defines the semantic structure of each hyperscript command.\n * Used by the pattern generator to create language-specific patterns.\n */\n\nimport type { SemanticRole, ActionType, SemanticValue, ExpectedType } from '../types';\n\n// =============================================================================\n// Command Schema Types\n// =============================================================================\n\n/**\n * A role specification in a command schema.\n */\nexport interface RoleSpec {\n /** The semantic role */\n readonly role: SemanticRole;\n /** Description of what this role represents */\n readonly description: string;\n /** Whether this role is required */\n readonly required: boolean;\n /** Expected value types */\n readonly expectedTypes: Array<ExpectedType>;\n /** Default value if not provided */\n readonly default?: SemanticValue;\n /** Position hint for SVO languages (higher = earlier) */\n readonly svoPosition?: number;\n /** Position hint for SOV languages (higher = earlier) */\n readonly sovPosition?: number;\n /**\n * Override the default role marker for this command.\n * Maps language code to the marker to use (e.g., { en: 'to', es: 'a' }).\n * If not specified, uses the language profile's default roleMarker.\n */\n readonly markerOverride?: Record<string, string>;\n /**\n * Override the rendering preposition for this role, separate from the parsing marker.\n * Used when the parsing grammar differs from the rendered output\n * (e.g., \"go to /home\" parses with 'to' but renders as \"go /home\").\n * Maps language code to the rendering preposition.\n */\n readonly renderOverride?: Record<string, string>;\n}\n\n/**\n * A precondition that must be met before command execution.\n * Used for runtime error documentation.\n */\nexport interface CommandPrecondition {\n /** Human-readable condition description */\n readonly condition: string;\n /** Error code thrown when precondition fails */\n readonly errorCode: string;\n /** Error message template */\n readonly message: string;\n}\n\n/**\n * A command schema defines the semantic structure of a command.\n */\nexport interface CommandSchema {\n /** The action type (command name) */\n readonly action: ActionType;\n /** Human-readable description */\n readonly description: string;\n /** Roles this command accepts */\n readonly roles: RoleSpec[];\n /** The primary role (what the command acts on) */\n readonly primaryRole: SemanticRole;\n /** Category for grouping */\n readonly category: CommandCategory;\n /** Whether this command typically has a body (like event handlers) */\n readonly hasBody?: boolean;\n /** Notes about special handling */\n readonly notes?: string;\n\n // Runtime error documentation (optional for backward compatibility)\n\n /** Possible runtime error codes this command can throw */\n readonly errorCodes?: readonly string[];\n /** Preconditions that must be met before execution */\n readonly preconditions?: readonly CommandPrecondition[];\n /** Recovery hints mapping error code to suggestion */\n readonly recoveryHints?: Readonly<Record<string, string>>;\n}\n\n/**\n * Command categories for organization.\n */\nexport type CommandCategory =\n | 'dom-class' // Class/attribute manipulation\n | 'dom-content' // Content manipulation\n | 'dom-visibility' // Show/hide\n | 'variable' // Variable operations\n | 'event' // Event handling\n | 'async' // Async operations\n | 'navigation' // URL/navigation\n | 'control-flow'; // Control flow\n\n// =============================================================================\n// Command Schema Definitions\n// =============================================================================\n\n/**\n * Toggle command: adds class/attribute if absent, removes if present.\n *\n * Patterns:\n * - EN: toggle .active on #button\n * - JA: #button の .active を 切り替え\n * - AR: بدّل .active على #button\n */\nexport const toggleSchema: CommandSchema = {\n action: 'toggle',\n description: 'Toggle a class or attribute on/off',\n category: 'dom-class',\n primaryRole: 'patient',\n roles: [\n {\n role: 'patient',\n description: 'The class or attribute to toggle',\n required: true,\n expectedTypes: ['selector'],\n svoPosition: 1,\n sovPosition: 2,\n },\n {\n role: 'destination',\n description: 'The target element (defaults to me)',\n required: false,\n expectedTypes: ['selector', 'reference'],\n default: { type: 'reference', value: 'me' },\n svoPosition: 2,\n sovPosition: 1,\n },\n ],\n // Runtime error documentation\n errorCodes: ['MISSING_ARGUMENT', 'NO_VALID_CLASS_NAMES', 'INVALID_CSS_PROPERTY'],\n preconditions: [\n {\n condition: 'Command has at least one argument',\n errorCode: 'MISSING_ARGUMENT',\n message: 'toggle command requires an argument',\n },\n {\n condition: 'Class names are valid CSS identifiers',\n errorCode: 'NO_VALID_CLASS_NAMES',\n message: 'toggle command: no valid class names found',\n },\n ],\n recoveryHints: {\n MISSING_ARGUMENT: 'Add a class selector (.classname) or attribute to toggle',\n NO_VALID_CLASS_NAMES: 'Ensure class names start with a dot (.) and are valid CSS identifiers',\n INVALID_CSS_PROPERTY: 'Check CSS property name syntax (use kebab-case)',\n },\n};\n\n/**\n * Add command: adds a class or attribute.\n */\nexport const addSchema: CommandSchema = {\n action: 'add',\n description: 'Add a class or attribute to an element',\n category: 'dom-class',\n primaryRole: 'patient',\n roles: [\n {\n role: 'patient',\n description: 'The class or attribute to add',\n required: true,\n expectedTypes: ['selector'],\n svoPosition: 1,\n sovPosition: 2,\n },\n {\n role: 'destination',\n description: 'The target element (defaults to me)',\n required: false,\n expectedTypes: ['selector', 'reference'],\n default: { type: 'reference', value: 'me' },\n svoPosition: 2,\n sovPosition: 1,\n markerOverride: { en: 'to' }, // \"add .class to #element\"\n },\n ],\n // Runtime error documentation\n errorCodes: ['MISSING_ARGUMENT', 'NO_VALID_CLASS_NAMES', 'PROPERTY_REQUIRES_VALUE'],\n preconditions: [\n {\n condition: 'Command has at least one argument',\n errorCode: 'MISSING_ARGUMENT',\n message: 'add command requires an argument',\n },\n ],\n recoveryHints: {\n MISSING_ARGUMENT: 'Add a class selector (.classname) or attribute to add',\n NO_VALID_CLASS_NAMES: 'Ensure class names start with a dot (.) and are valid CSS identifiers',\n PROPERTY_REQUIRES_VALUE: 'When adding a property (*prop), provide a value argument',\n },\n};\n\n/**\n * Remove command: removes a class or attribute.\n */\nexport const removeSchema: CommandSchema = {\n action: 'remove',\n description: 'Remove a class or attribute from an element',\n category: 'dom-class',\n primaryRole: 'patient',\n roles: [\n {\n role: 'patient',\n description: 'The class or attribute to remove',\n required: true,\n expectedTypes: ['selector'],\n svoPosition: 1,\n sovPosition: 2,\n },\n {\n role: 'source',\n description: 'The element to remove from (defaults to me)',\n required: false,\n expectedTypes: ['selector', 'reference'],\n default: { type: 'reference', value: 'me' },\n svoPosition: 2,\n sovPosition: 1,\n },\n ],\n // Runtime error documentation\n errorCodes: ['MISSING_ARGUMENT', 'NO_VALID_CLASS_NAMES'],\n preconditions: [\n {\n condition: 'Command has at least one argument',\n errorCode: 'MISSING_ARGUMENT',\n message: 'remove command requires an argument',\n },\n ],\n recoveryHints: {\n MISSING_ARGUMENT: 'Add a class selector (.classname) or attribute to remove',\n NO_VALID_CLASS_NAMES: 'Ensure class names start with a dot (.) and are valid CSS identifiers',\n },\n};\n\n/**\n * Put command: puts content into a target.\n *\n * Patterns:\n * - EN: put \"hello\" into #output\n * - JA: #output に \"hello\" を 置く\n * - AR: ضع \"hello\" في #output\n */\nexport const putSchema: CommandSchema = {\n action: 'put',\n description: 'Put content into a target element or variable',\n category: 'dom-content',\n primaryRole: 'patient',\n roles: [\n {\n role: 'patient',\n description: 'The content to put',\n required: true,\n expectedTypes: ['literal', 'selector', 'reference', 'expression'],\n svoPosition: 1,\n sovPosition: 1, // SOV: patient comes first (を marker)\n },\n {\n role: 'destination',\n description: 'Where to put the content',\n required: true,\n expectedTypes: ['selector', 'reference'],\n svoPosition: 2,\n sovPosition: 2, // SOV: destination comes second (に/에/a marker)\n markerOverride: { en: 'into' }, // \"put 'hello' into #output\"\n },\n ],\n // Runtime error documentation\n errorCodes: [\n 'MISSING_ARGUMENTS',\n 'MISSING_CONTENT',\n 'MISSING_POSITION',\n 'INVALID_POSITION',\n 'NO_TARGET',\n 'NO_ELEMENTS',\n ],\n preconditions: [\n {\n condition: 'Command has content and position arguments',\n errorCode: 'MISSING_ARGUMENTS',\n message: 'put requires arguments',\n },\n {\n condition: 'Content to put is specified',\n errorCode: 'MISSING_CONTENT',\n message: 'put requires content',\n },\n {\n condition: 'Position keyword is specified (into, before, after, etc.)',\n errorCode: 'MISSING_POSITION',\n message: 'put requires position keyword',\n },\n ],\n recoveryHints: {\n MISSING_ARGUMENTS: 'Use syntax: put <content> into/before/after <target>',\n MISSING_CONTENT: 'Add content to put (string, element, or expression)',\n MISSING_POSITION: 'Add position keyword: into, before, after, at start of, at end of',\n INVALID_POSITION: 'Valid positions: into, before, after, at start of, at end of',\n NO_TARGET: 'Ensure target element exists or use \"me\" reference',\n NO_ELEMENTS: 'Check that the selector matches existing elements',\n },\n};\n\n/**\n * Set command: sets a property or variable.\n *\n * Patterns:\n * - EN: set :count to 10\n * - ES: establecer :count a 10\n * - JA: :count を 10 に 設定\n * - KO: :x 에 5 을 설정 (uses default markers)\n * - TR: :x e 5 i ayarla (uses default markers)\n *\n * Note: Only override markers for SVO languages where patient has no default marker.\n * SOV languages (Korean, Japanese, Turkish) already have correct object markers.\n */\nexport const setSchema: CommandSchema = {\n action: 'set',\n description: 'Set a property or variable to a value',\n category: 'variable',\n primaryRole: 'destination',\n roles: [\n {\n role: 'destination',\n description: 'The property or variable to set',\n required: true,\n expectedTypes: ['selector', 'reference', 'expression'],\n svoPosition: 1,\n sovPosition: 1,\n // Override destination marker for English (remove 'on', use no marker)\n // SOV languages swap markers: variable gets patient marker (を/를/i)\n // Arabic (VSO): no marker before variable\n markerOverride: {\n en: '', // No marker before destination in English: \"set :x to 5\"\n ja: 'を', // \"x を 10 に 設定\" - variable gets object marker\n ko: '를', // \"x 를 10 으로 설정\" - variable gets object marker\n tr: 'i', // \"x i 10 e ayarla\" - variable gets accusative marker\n ar: '', // \"عيّن x إلى 10\" - no marker before variable\n sw: '', // \"seti x kwenye 10\" - no marker before variable\n tl: '', // \"itakda x sa 10\" - no marker before variable\n bn: 'কে', // \"x কে 10 তে সেট\" - patient marker on variable\n qu: 'ta', // \"x ta 10 man churay\" - patient marker on variable\n },\n },\n {\n role: 'patient',\n description: 'The value to set',\n required: true,\n expectedTypes: ['literal', 'expression', 'reference'],\n svoPosition: 2,\n sovPosition: 2,\n // Override patient marker for SVO languages with their native prepositions\n // SOV languages swap markers: value gets destination marker (に/으로/e)\n // Arabic (VSO): إلى preposition before value\n markerOverride: {\n en: 'to', // \"set :x to 5\"\n es: 'a', // \"establecer x a 10\"\n pt: 'para', // \"definir x para 10\"\n fr: 'à', // \"définir x à 10\"\n de: 'auf', // \"setze x auf 10\"\n id: 'ke', // \"atur x ke 10\"\n ja: 'に', // \"x を 10 に 設定\" - value gets destination marker\n ko: '으로', // \"x 를 10 으로 설정\" - value gets manner/instrument marker\n tr: 'e', // \"x i 10 e ayarla\" - value gets dative marker\n ar: 'إلى', // \"عيّن x إلى 10\" - value gets preposition \"to\"\n sw: 'kwenye', // \"seti x kwenye 10\" - destination prep before value\n tl: 'sa', // \"itakda x sa 10\" - destination prep before value\n bn: 'তে', // \"x কে 10 তে সেট\" - destination marker on value\n qu: 'man', // \"x ta 10 man churay\" - destination marker on value\n },\n },\n ],\n // Runtime error documentation\n errorCodes: ['MISSING_TARGET', 'INVALID_TARGET', 'MISSING_VALUE', 'INVALID_SYNTAX'],\n preconditions: [\n {\n condition: 'Command has a target variable or property',\n errorCode: 'MISSING_TARGET',\n message: 'set command requires a target',\n },\n {\n condition: 'Target is a valid variable or property reference',\n errorCode: 'INVALID_TARGET',\n message: 'set command target must be a string or object literal',\n },\n {\n condition: 'Value is specified with \"to\" keyword',\n errorCode: 'MISSING_VALUE',\n message: 'set command requires a value (use \"to\" keyword)',\n },\n ],\n recoveryHints: {\n MISSING_TARGET: 'Add a target: set :variable to value OR set element.property to value',\n INVALID_TARGET:\n 'Use local variable (:name), element property (el.prop), or \"the X of Y\" syntax',\n MISSING_VALUE: 'Add \"to <value>\" to specify what to set',\n INVALID_SYNTAX: 'Use syntax: set <target> to <value>',\n },\n};\n\n/**\n * Show command: makes an element visible.\n */\nexport const showSchema: CommandSchema = {\n action: 'show',\n description: 'Make an element visible',\n category: 'dom-visibility',\n primaryRole: 'patient',\n roles: [\n {\n role: 'patient',\n description: 'The element to show',\n required: true, // Changed from false - patient is primary role\n expectedTypes: ['selector', 'reference'],\n default: { type: 'reference', value: 'me' },\n svoPosition: 1,\n sovPosition: 1,\n },\n {\n role: 'style',\n description: 'Animation style (fade, slide, etc.)',\n required: false,\n expectedTypes: ['literal'],\n svoPosition: 2,\n sovPosition: 2,\n },\n ],\n};\n\n/**\n * Hide command: makes an element invisible.\n */\nexport const hideSchema: CommandSchema = {\n action: 'hide',\n description: 'Make an element invisible',\n category: 'dom-visibility',\n primaryRole: 'patient',\n roles: [\n {\n role: 'patient',\n description: 'The element to hide',\n required: true, // Changed from false - patient is primary role\n expectedTypes: ['selector', 'reference'],\n default: { type: 'reference', value: 'me' },\n svoPosition: 1,\n sovPosition: 1,\n },\n {\n role: 'style',\n description: 'Animation style (fade, slide, etc.)',\n required: false,\n expectedTypes: ['literal'],\n svoPosition: 2,\n sovPosition: 2,\n },\n ],\n};\n\n/**\n * On command: event handler.\n */\nexport const onSchema: CommandSchema = {\n action: 'on',\n description: 'Handle an event',\n category: 'event',\n primaryRole: 'event',\n hasBody: true,\n roles: [\n {\n role: 'event',\n description: 'The event to handle',\n required: true,\n expectedTypes: ['literal'],\n svoPosition: 1,\n sovPosition: 2,\n },\n {\n role: 'source',\n description: 'The element to listen on (defaults to me)',\n required: false,\n expectedTypes: ['selector', 'reference'],\n default: { type: 'reference', value: 'me' },\n svoPosition: 2,\n sovPosition: 1,\n },\n ],\n};\n\n/**\n * Trigger command: dispatches an event.\n * Supports namespaced events like \"draggable:start\".\n */\nexport const triggerSchema: CommandSchema = {\n action: 'trigger',\n description: 'Trigger/dispatch an event',\n category: 'event',\n primaryRole: 'event',\n roles: [\n {\n role: 'event',\n description: 'The event to trigger (supports namespaced events like draggable:start)',\n required: true,\n expectedTypes: ['literal', 'expression'], // expression for custom/namespaced event names\n svoPosition: 1,\n sovPosition: 2,\n },\n {\n role: 'destination',\n description: 'The target element (defaults to me)',\n required: false,\n expectedTypes: ['selector', 'reference'],\n default: { type: 'reference', value: 'me' },\n svoPosition: 2,\n sovPosition: 1,\n },\n ],\n};\n\n/**\n * Wait command: pauses execution.\n */\nexport const waitSchema: CommandSchema = {\n action: 'wait',\n description: 'Wait for a duration or event',\n category: 'async',\n primaryRole: 'patient',\n roles: [\n {\n role: 'patient',\n description: 'Duration or event to wait for',\n required: true,\n expectedTypes: ['literal', 'expression'],\n svoPosition: 1,\n sovPosition: 1,\n },\n ],\n};\n\n/**\n * Fetch command: makes HTTP request.\n */\nexport const fetchSchema: CommandSchema = {\n action: 'fetch',\n description: 'Fetch data from a URL',\n category: 'async',\n primaryRole: 'source',\n roles: [\n {\n role: 'source',\n description: 'The URL to fetch from',\n required: true,\n expectedTypes: ['literal', 'expression'],\n svoPosition: 1,\n sovPosition: 1,\n // No markerOverride — uses profile default 'from' for parsing.\n renderOverride: { en: '' }, // \"fetch /api\" (rendering — no preposition)\n },\n {\n role: 'responseType',\n description: 'Response format (json, text, html, blob, etc.)',\n required: false,\n expectedTypes: ['literal', 'expression'], // json/text/html are identifiers → expression type\n svoPosition: 2,\n sovPosition: 2,\n },\n {\n role: 'method',\n description: 'HTTP method (GET, POST, etc.)',\n required: false,\n expectedTypes: ['literal'],\n svoPosition: 3,\n sovPosition: 3,\n },\n {\n role: 'destination',\n description: 'Where to store the result',\n required: false,\n expectedTypes: ['selector', 'reference'],\n svoPosition: 4,\n sovPosition: 4,\n },\n ],\n};\n\n/**\n * Increment command: increases a numeric value.\n */\nexport const incrementSchema: CommandSchema = {\n action: 'increment',\n description: 'Increment a numeric value',\n category: 'variable',\n primaryRole: 'patient',\n roles: [\n {\n role: 'patient',\n description: 'The value to increment',\n required: true,\n expectedTypes: ['selector', 'reference', 'expression'],\n svoPosition: 1,\n sovPosition: 1,\n },\n {\n role: 'quantity',\n description: 'Amount to increment by (defaults to 1)',\n required: false,\n expectedTypes: ['literal'],\n default: { type: 'literal', value: 1, dataType: 'number' },\n svoPosition: 2,\n sovPosition: 2,\n markerOverride: { en: 'by' }, // \"increment :count by 5\"\n },\n ],\n};\n\n/**\n * Decrement command: decreases a numeric value.\n */\nexport const decrementSchema: CommandSchema = {\n action: 'decrement',\n description: 'Decrement a numeric value',\n category: 'variable',\n primaryRole: 'patient',\n roles: [\n {\n role: 'patient',\n description: 'The value to decrement',\n required: true,\n expectedTypes: ['selector', 'reference', 'expression'],\n svoPosition: 1,\n sovPosition: 1,\n },\n {\n role: 'quantity',\n description: 'Amount to decrement by (defaults to 1)',\n required: false,\n expectedTypes: ['literal'],\n default: { type: 'literal', value: 1, dataType: 'number' },\n svoPosition: 2,\n sovPosition: 2,\n markerOverride: { en: 'by' }, // \"decrement :count by 5\"\n },\n ],\n};\n\n/**\n * Append command: appends content to an element.\n */\nexport const appendSchema: CommandSchema = {\n action: 'append',\n description: 'Append content to an element',\n category: 'dom-content',\n primaryRole: 'patient',\n roles: [\n {\n role: 'patient',\n description: 'The content to append',\n required: true,\n expectedTypes: ['literal', 'selector', 'expression'],\n svoPosition: 1,\n sovPosition: 2,\n },\n {\n role: 'destination',\n description: 'The element to append to',\n required: true,\n expectedTypes: ['selector', 'reference'],\n svoPosition: 2,\n sovPosition: 1,\n markerOverride: { en: 'to' }, // \"append <content> to #element\"\n },\n ],\n};\n\n/**\n * Prepend command: prepends content to an element.\n */\nexport const prependSchema: CommandSchema = {\n action: 'prepend',\n description: 'Prepend content to an element',\n category: 'dom-content',\n primaryRole: 'patient',\n roles: [\n {\n role: 'patient',\n description: 'The content to prepend',\n required: true,\n expectedTypes: ['literal', 'selector', 'expression'],\n svoPosition: 1,\n sovPosition: 2,\n },\n {\n role: 'destination',\n description: 'The element to prepend to',\n required: true,\n expectedTypes: ['selector', 'reference'],\n svoPosition: 2,\n sovPosition: 1,\n markerOverride: { en: 'to' }, // \"prepend <content> to #element\"\n },\n ],\n};\n\n// =============================================================================\n// Batch 1 - Simple Commands\n// =============================================================================\n\n/**\n * Log command: logs a value to console.\n */\nexport const logSchema: CommandSchema = {\n action: 'log',\n description: 'Log a value to the console',\n category: 'variable',\n primaryRole: 'patient',\n roles: [\n {\n role: 'patient',\n description: 'The value to log',\n required: true,\n expectedTypes: ['literal', 'selector', 'reference', 'expression'],\n svoPosition: 1,\n sovPosition: 1,\n },\n ],\n};\n\n/**\n * Get command: retrieves a value.\n */\nexport const getCommandSchema: CommandSchema = {\n action: 'get',\n description: 'Get a value from a source',\n category: 'variable',\n primaryRole: 'source',\n roles: [\n {\n role: 'source',\n description: 'The source to get from',\n required: true,\n expectedTypes: ['selector', 'reference', 'expression'],\n svoPosition: 1,\n sovPosition: 2,\n // Marker overrides for GET pattern\n // SOV languages use object markers, SVO languages have no marker\n markerOverride: {\n en: '',\n es: '',\n pt: '',\n fr: '',\n de: '',\n ja: 'を', // Japanese object marker: #element を 取得\n zh: '',\n ko: '를', // Korean object marker: #element 를 가져오기\n ar: 'على', // Arabic preposition: احصل على #element\n tr: 'i', // Turkish accusative: #element i al\n id: '',\n sw: '', // Swahili SVO: pata #element (no marker)\n tl: '', // Tagalog VSO: kunin #element (no marker)\n bn: 'কে', // Bengali SOV: #element কে পান (patient marker)\n qu: 'ta', // Quechua SOV: #element ta taripay (patient marker)\n },\n },\n {\n role: 'destination',\n description: 'Where to store the result (optional)',\n required: false,\n expectedTypes: ['reference'],\n svoPosition: 2,\n sovPosition: 1,\n },\n ],\n};\n\n/**\n * Take command: takes/removes content from a source.\n */\nexport const takeSchema: CommandSchema = {\n action: 'take',\n description: 'Take content from a source element',\n category: 'dom-content',\n primaryRole: 'patient',\n roles: [\n {\n role: 'patient',\n description: 'The class or element to take',\n required: true,\n expectedTypes: ['selector'],\n svoPosition: 1,\n sovPosition: 2,\n },\n {\n role: 'source',\n description: 'The element to take from (defaults to me)',\n required: false,\n expectedTypes: ['selector', 'reference'],\n default: { type: 'reference', value: 'me' },\n svoPosition: 2,\n sovPosition: 1,\n },\n ],\n};\n\n/**\n * Make command: creates a new element.\n */\nexport const makeSchema: CommandSchema = {\n action: 'make',\n description: 'Create a new element',\n category: 'dom-content',\n primaryRole: 'patient',\n roles: [\n {\n role: 'patient',\n description: 'The element type or selector to create',\n required: true,\n expectedTypes: ['literal', 'selector'],\n svoPosition: 1,\n sovPosition: 1,\n },\n ],\n};\n\n/**\n * Halt command: stops execution or event propagation.\n * Supports: halt, halt the event, halt default, halt the bubbling\n */\nexport const haltSchema: CommandSchema = {\n action: 'halt',\n description: 'Halt/stop execution or event propagation',\n category: 'control-flow',\n primaryRole: 'patient',\n roles: [\n {\n role: 'patient',\n description: 'What to halt (event, default, bubbling, etc.)',\n required: false, // Plain \"halt\" is valid\n expectedTypes: ['literal', 'reference', 'expression'],\n svoPosition: 1,\n sovPosition: 1,\n },\n ],\n};\n\n/**\n * Settle command: waits for animations to complete.\n */\nexport const settleSchema: CommandSchema = {\n action: 'settle',\n description: 'Wait for animations/transitions to settle',\n category: 'async',\n primaryRole: 'patient',\n roles: [\n {\n role: 'patient',\n description: 'The element to settle (defaults to me)',\n required: false,\n expectedTypes: ['selector', 'reference'],\n default: { type: 'reference', value: 'me' },\n svoPosition: 1,\n sovPosition: 1,\n },\n ],\n};\n\n/**\n * Throw command: throws an error/exception.\n */\nexport const throwSchema: CommandSchema = {\n action: 'throw',\n description: 'Throw an error',\n category: 'control-flow',\n primaryRole: 'patient',\n roles: [\n {\n role: 'patient',\n description: 'The error message or object to throw',\n required: true,\n expectedTypes: ['literal', 'expression'],\n svoPosition: 1,\n sovPosition: 1,\n },\n ],\n};\n\n/**\n * Send command: sends/dispatches an event.\n */\nexport const sendSchema: CommandSchema = {\n action: 'send',\n description: 'Send an event to an element',\n category: 'event',\n primaryRole: 'event',\n roles: [\n {\n role: 'event',\n description: 'The event to send',\n required: true,\n expectedTypes: ['literal', 'expression'], // identifiers tokenize as expression\n svoPosition: 1,\n sovPosition: 2,\n },\n {\n role: 'destination',\n description: 'The target element (defaults to me)',\n required: false,\n expectedTypes: ['selector', 'reference'],\n default: { type: 'reference', value: 'me' },\n svoPosition: 2,\n sovPosition: 1,\n // send uses \"to\" not \"on\" for destination: send foo to #target\n markerOverride: {\n en: 'to',\n ja: 'に',\n ar: 'إلى',\n es: 'a',\n ko: '에게',\n zh: '到',\n tr: '-e',\n pt: 'para',\n fr: 'à',\n de: 'an',\n id: 'ke',\n qu: '-man',\n sw: 'kwa',\n },\n },\n ],\n};\n\n// =============================================================================\n// Batch 2 - Control Flow Commands\n// =============================================================================\n\n/**\n * If command: conditional execution.\n */\nexport const ifSchema: CommandSchema = {\n action: 'if',\n description: 'Conditional execution',\n category: 'control-flow',\n primaryRole: 'condition',\n hasBody: true,\n roles: [\n {\n role: 'condition',\n description: 'The condition to evaluate',\n required: true,\n expectedTypes: ['expression'],\n svoPosition: 1,\n sovPosition: 1,\n },\n ],\n};\n\n/**\n * Unless command: negated conditional execution.\n * Executes body when condition is false.\n */\nexport const unlessSchema: CommandSchema = {\n action: 'unless',\n description: 'Negated conditional execution (executes when condition is false)',\n category: 'control-flow',\n primaryRole: 'condition',\n hasBody: true,\n roles: [\n {\n role: 'condition',\n description: 'The condition to evaluate (body executes when false)',\n required: true,\n expectedTypes: ['expression'],\n svoPosition: 1,\n sovPosition: 1,\n },\n ],\n};\n\n/**\n * Else command: alternative branch.\n */\nexport const elseSchema: CommandSchema = {\n action: 'else',\n description: 'Else branch of conditional',\n category: 'control-flow',\n primaryRole: 'patient',\n hasBody: true,\n roles: [], // No roles - follows an if\n};\n\n/**\n * Repeat command: loop execution.\n */\nexport const repeatSchema: CommandSchema = {\n action: 'repeat',\n description: 'Repeat a block of commands',\n category: 'control-flow',\n primaryRole: 'loopType',\n hasBody: true,\n roles: [\n {\n role: 'loopType',\n description: 'Loop variant: forever, times, for, while, until, until-event',\n required: true,\n expectedTypes: ['literal'],\n svoPosition: 0,\n sovPosition: 0,\n },\n {\n role: 'quantity',\n description: 'Number of times to repeat',\n required: false,\n expectedTypes: ['literal', 'expression'],\n svoPosition: 1,\n sovPosition: 1,\n },\n {\n role: 'event',\n description: 'Event to wait for (terminates loop)',\n required: false,\n expectedTypes: ['literal', 'expression'],\n svoPosition: 2,\n sovPosition: 2,\n },\n {\n role: 'source',\n description: 'Element to listen for event on',\n required: false,\n expectedTypes: ['selector', 'reference'],\n svoPosition: 3,\n sovPosition: 3,\n },\n ],\n notes:\n 'Can also use \"repeat forever\", \"repeat until condition\", or \"repeat until event X from Y\"',\n};\n\n/**\n * For command: iteration over collection.\n */\nexport const forSchema: CommandSchema = {\n action: 'for',\n description: 'Iterate over a collection',\n category: 'control-flow',\n primaryRole: 'patient',\n hasBody: true,\n roles: [\n {\n role: 'patient',\n description: 'The iteration variable',\n required: true,\n expectedTypes: ['reference'],\n svoPosition: 1,\n sovPosition: 2,\n },\n {\n role: 'source',\n description: 'The collection to iterate over',\n required: true,\n expectedTypes: ['selector', 'reference', 'expression'],\n svoPosition: 2,\n sovPosition: 1,\n markerOverride: { en: 'in' }, // \"for item in .items\"\n },\n ],\n};\n\n/**\n * While command: conditional loop.\n */\nexport const whileSchema: CommandSchema = {\n action: 'while',\n description: 'Loop while condition is true',\n category: 'control-flow',\n primaryRole: 'condition',\n hasBody: true,\n roles: [\n {\n role: 'condition',\n description: 'The condition to check',\n required: true,\n expectedTypes: ['expression'],\n svoPosition: 1,\n sovPosition: 1,\n },\n ],\n};\n\n/**\n * Continue command: skip to next iteration.\n */\nexport const continueSchema: CommandSchema = {\n action: 'continue',\n description: 'Continue to next loop iteration',\n category: 'control-flow',\n primaryRole: 'patient',\n roles: [], // No roles\n};\n\n// =============================================================================\n// Batch 3 - DOM & Navigation Commands\n// =============================================================================\n\n/**\n * Go command: navigates to a URL.\n */\nexport const goSchema: CommandSchema = {\n action: 'go',\n description: 'Navigate to a URL',\n category: 'navigation',\n primaryRole: 'destination',\n roles: [\n {\n role: 'destination',\n description: 'The URL to navigate to',\n required: true,\n expectedTypes: ['literal', 'expression'],\n svoPosition: 1,\n sovPosition: 1,\n markerOverride: { en: 'to' }, // \"go to /page\" (parsing)\n renderOverride: { en: '' }, // \"go /page\" (rendering — no preposition)\n },\n ],\n};\n\n/**\n * Transition command: animates element changes.\n */\nexport const transitionSchema: CommandSchema = {\n action: 'transition',\n description: 'Transition an element with animation',\n category: 'dom-visibility',\n primaryRole: 'patient',\n roles: [\n {\n role: 'patient',\n description: 'The property to transition (opacity, *background-color, etc.)',\n required: true,\n expectedTypes: ['literal'], // Only literal - CSS properties are strings, not selectors\n svoPosition: 1,\n sovPosition: 2,\n // No marker before the CSS property name (SVO/VSO languages)\n // SOV languages (bn, qu) use their default patient marker from profile\n markerOverride: { en: '', ar: '', tl: '', sw: '' },\n },\n {\n role: 'goal',\n description: 'The target value to transition to',\n required: true,\n expectedTypes: ['literal', 'expression'],\n svoPosition: 2,\n sovPosition: 3,\n // \"to\" preposition before goal value (same as set's patient marker)\n markerOverride: {\n en: 'to',\n ar: 'إلى',\n tl: 'sa',\n sw: 'kwenye',\n bn: 'তে',\n qu: 'man',\n es: 'a',\n pt: 'para',\n fr: 'à',\n de: 'auf',\n ja: 'に',\n ko: '으로',\n tr: 'e',\n id: 'ke',\n },\n },\n {\n role: 'destination',\n description: 'The target element (defaults to me)',\n required: false,\n expectedTypes: ['selector', 'reference'],\n default: { type: 'reference', value: 'me' },\n svoPosition: 3,\n sovPosition: 1,\n },\n {\n role: 'duration',\n description: 'Transition duration (over 500ms, for 2 seconds)',\n required: false,\n expectedTypes: ['literal'],\n svoPosition: 4,\n sovPosition: 4,\n markerOverride: { en: 'over' }, // \"transition opacity to 1 over 500ms\"\n },\n {\n role: 'style',\n description: 'Easing function (ease-in, linear, etc.)',\n required: false,\n expectedTypes: ['literal'],\n svoPosition: 5,\n sovPosition: 5,\n },\n ],\n};\n\n/**\n * Clone command: clones an element.\n */\nexport const cloneSchema: CommandSchema = {\n action: 'clone',\n description: 'Clone an element',\n category: 'dom-content',\n primaryRole: 'patient',\n roles: [\n {\n role: 'patient',\n description: 'The element to clone',\n required: true,\n expectedTypes: ['selector', 'reference'],\n svoPosition: 1,\n sovPosition: 2,\n },\n {\n role: 'destination',\n description: 'Where to put the clone',\n required: false,\n expectedTypes: ['selector', 'reference'],\n svoPosition: 2,\n sovPosition: 1,\n markerOverride: { en: 'into' }, // \"clone #element into #container\"\n },\n ],\n};\n\n/**\n * Focus command: focuses an element.\n */\nexport const focusSchema: CommandSchema = {\n action: 'focus',\n description: 'Focus an element',\n category: 'dom-content',\n primaryRole: 'patient',\n roles: [\n {\n role: 'patient',\n description: 'The element to focus (defaults to me)',\n required: false,\n expectedTypes: ['selector', 'reference'],\n default: { type: 'reference', value: 'me' },\n svoPosition: 1,\n sovPosition: 1,\n },\n ],\n};\n\n/**\n * Blur command: removes focus from an element.\n */\nexport const blurSchema: CommandSchema = {\n action: 'blur',\n description: 'Remove focus from an element',\n category: 'dom-content',\n primaryRole: 'patient',\n roles: [\n {\n role: 'patient',\n description: 'The element to blur (defaults to me)',\n required: false,\n expectedTypes: ['selector', 'reference'],\n default: { type: 'reference', value: 'me' },\n svoPosition: 1,\n sovPosition: 1,\n },\n ],\n};\n\n// =============================================================================\n// Batch 4 - Advanced Commands\n// =============================================================================\n\n/**\n * Call command: calls a function.\n */\nexport const callSchema: CommandSchema = {\n action: 'call',\n description: 'Call a function',\n category: 'control-flow',\n primaryRole: 'patient',\n roles: [\n {\n role: 'patient',\n description: 'The function to call',\n required: true,\n expectedTypes: ['expression', 'reference'],\n svoPosition: 1,\n sovPosition: 1,\n },\n ],\n};\n\n/**\n * Return command: returns a value.\n */\nexport const returnSchema: CommandSchema = {\n action: 'return',\n description: 'Return a value from a function',\n category: 'control-flow',\n primaryRole: 'patient',\n roles: [\n {\n role: 'patient',\n description: 'The value to return',\n required: false,\n expectedTypes: ['literal', 'expression', 'reference'],\n svoPosition: 1,\n sovPosition: 1,\n },\n ],\n};\n\n/**\n * JS command: executes raw JavaScript.\n */\nexport const jsSchema: CommandSchema = {\n action: 'js',\n description: 'Execute raw JavaScript code',\n category: 'control-flow',\n primaryRole: 'patient',\n hasBody: true,\n roles: [\n {\n role: 'patient',\n description: 'The JavaScript code to execute',\n required: false,\n expectedTypes: ['expression'],\n svoPosition: 1,\n sovPosition: 1,\n },\n ],\n};\n\n/**\n * Async command: runs commands asynchronously.\n */\nexport const asyncSchema: CommandSchema = {\n action: 'async',\n description: 'Execute commands asynchronously',\n category: 'async',\n primaryRole: 'patient',\n hasBody: true,\n roles: [],\n};\n\n/**\n * Tell command: sends commands to another element.\n */\nexport const tellSchema: CommandSchema = {\n action: 'tell',\n description: 'Execute commands in context of another element',\n category: 'control-flow',\n primaryRole: 'destination',\n hasBody: true,\n roles: [\n {\n role: 'destination',\n description: 'The element to tell',\n required: true,\n expectedTypes: ['selector', 'reference'],\n svoPosition: 1,\n sovPosition: 1,\n markerOverride: { en: '' }, // \"tell #element ...\" (no preposition)\n },\n ],\n};\n\n/**\n * Default command: sets default values.\n */\nexport const defaultSchema: CommandSchema = {\n action: 'default',\n description: 'Set a default value for a variable',\n category: 'variable',\n primaryRole: 'destination',\n roles: [\n {\n role: 'destination',\n description: 'The variable to set default for',\n required: true,\n expectedTypes: ['reference'],\n svoPosition: 1,\n sovPosition: 1,\n // Same overrides as SET: no marker before variable in VSO/SVO\n markerOverride: {\n en: '',\n ar: '',\n tl: '',\n sw: '',\n bn: 'কে',\n qu: 'ta',\n },\n },\n {\n role: 'patient',\n description: 'The default value',\n required: true,\n expectedTypes: ['literal', 'expression'],\n svoPosition: 2,\n sovPosition: 2,\n // Same overrides as SET: value gets destination preposition\n markerOverride: {\n en: 'to',\n ar: 'إلى',\n tl: 'sa',\n sw: 'kwenye',\n bn: 'তে',\n qu: 'man',\n },\n },\n ],\n};\n\n/**\n * Init command: initialization block.\n */\nexport const initSchema: CommandSchema = {\n action: 'init',\n description: 'Initialization block that runs once',\n category: 'control-flow',\n primaryRole: 'patient',\n hasBody: true,\n roles: [],\n};\n\n/**\n * Behavior command: defines reusable behavior.\n * Patterns:\n * - EN: behavior Draggable\n * - EN: behavior Draggable(dragHandle)\n */\nexport const behaviorSchema: CommandSchema = {\n action: 'behavior',\n description: 'Define a reusable behavior',\n category: 'control-flow',\n primaryRole: 'patient',\n hasBody: true,\n roles: [\n {\n role: 'patient',\n description: 'The behavior name (PascalCase identifier)',\n required: true,\n expectedTypes: ['literal', 'reference', 'expression'], // expression for PascalCase identifiers\n svoPosition: 1,\n sovPosition: 1,\n },\n ],\n};\n\n/**\n * Install command: installs a behavior on an element.\n * Patterns:\n * - EN: install Draggable\n * - EN: install Draggable(dragHandle: .titlebar)\n * - EN: install Draggable on #element\n */\nexport const installSchema: CommandSchema = {\n action: 'install',\n description: 'Install a behavior on an element',\n category: 'control-flow',\n primaryRole: 'patient',\n roles: [\n {\n role: 'patient',\n description: 'The behavior name to install',\n required: true,\n expectedTypes: ['literal', 'reference', 'expression'],\n svoPosition: 1,\n sovPosition: 2,\n },\n {\n role: 'destination',\n description: 'Element to install on (defaults to me)',\n required: false,\n expectedTypes: ['selector', 'reference'],\n default: { type: 'reference', value: 'me' },\n svoPosition: 2,\n sovPosition: 1,\n },\n ],\n};\n\n/**\n * Measure command: measures element dimensions or position.\n * Patterns:\n * - EN: measure x\n * - EN: measure width\n * - EN: measure width of #element\n */\nexport const measureSchema: CommandSchema = {\n action: 'measure',\n description: 'Measure element dimensions (x, y, width, height, etc.)',\n category: 'dom-content',\n primaryRole: 'patient',\n roles: [\n {\n role: 'patient',\n description: 'Property to measure (x, y, width, height, top, left, etc.)',\n required: false, // Plain \"measure\" is valid, defaults to bounds\n expectedTypes: ['literal', 'expression'],\n svoPosition: 1,\n sovPosition: 1,\n },\n {\n role: 'source',\n description: 'Element to measure (defaults to me)',\n required: false,\n expectedTypes: ['selector', 'reference'],\n default: { type: 'reference', value: 'me' },\n svoPosition: 2,\n sovPosition: 2,\n markerOverride: { en: 'of' }, // \"measure width of #element\"\n },\n ],\n};\n\n// =============================================================================\n// Batch 5 - DOM Content Manipulation\n// =============================================================================\n\n/**\n * Swap command: swaps DOM content using various strategies.\n *\n * Patterns:\n * - EN: swap innerHTML of #target\n * - EN: swap delete #target\n * - EN: swap beforebegin #target with <html>\n */\nexport const swapSchema: CommandSchema = {\n action: 'swap',\n description: 'Swap DOM content using various strategies (innerHTML, outerHTML, delete, etc.)',\n category: 'dom-content',\n primaryRole: 'destination',\n roles: [\n {\n role: 'method',\n description: 'The swap strategy (innerHTML, outerHTML, beforebegin, afterend, delete)',\n required: false,\n expectedTypes: ['literal'],\n svoPosition: 1,\n sovPosition: 3,\n markerOverride: { en: '' }, // \"swap innerHTML ...\" (no preposition)\n },\n {\n role: 'destination',\n description: 'The element to swap content in/for',\n required: true,\n expectedTypes: ['selector', 'reference'],\n svoPosition: 2,\n sovPosition: 1,\n markerOverride: { en: 'of' }, // \"swap innerHTML of #target\"\n },\n {\n role: 'patient',\n description: 'The content to swap in (optional for delete)',\n required: false,\n expectedTypes: ['literal', 'expression', 'selector'],\n svoPosition: 3,\n sovPosition: 2,\n markerOverride: { en: 'with' }, // \"swap innerHTML of #target with <html>\"\n },\n ],\n};\n\n/**\n * Morph command: morphs one element into another using DOM diffing.\n *\n * Patterns:\n * - EN: morph #target to <html>\n * - EN: morph me into #template\n */\nexport const morphSchema: CommandSchema = {\n action: 'morph',\n description: 'Morph an element into another using DOM diffing',\n category: 'dom-content',\n primaryRole: 'destination',\n roles: [\n {\n role: 'destination',\n description: 'The element to morph',\n required: true,\n expectedTypes: ['selector', 'reference'],\n svoPosition: 1,\n sovPosition: 1,\n markerOverride: { en: '' }, // \"morph #target ...\" (no preposition)\n },\n {\n role: 'patient',\n description: 'The target content/element to morph into',\n required: true,\n expectedTypes: ['literal', 'expression', 'selector'],\n svoPosition: 2,\n sovPosition: 2,\n markerOverride: { en: 'to' }, // \"morph #target to <html>\"\n },\n ],\n};\n\n// =============================================================================\n// Batch 6 - Missing Commands (beep, break, copy, exit, pick, render)\n// =============================================================================\n\n/**\n * Beep command: debug output with type information.\n * Syntax: beep! / beep! <expression>\n */\nexport const beepSchema: CommandSchema = {\n action: 'beep',\n description: 'Debug output for expressions with type information',\n category: 'variable',\n primaryRole: 'patient',\n roles: [\n {\n role: 'patient',\n description: 'The expression(s) to debug',\n required: false,\n expectedTypes: ['literal', 'selector', 'reference', 'expression'],\n svoPosition: 1,\n sovPosition: 1,\n },\n ],\n};\n\n/**\n * Break command: exits from the current loop.\n * Syntax: break\n */\nexport const breakSchema: CommandSchema = {\n action: 'break',\n description: 'Exit from the current loop',\n category: 'control-flow',\n primaryRole: 'patient',\n roles: [],\n};\n\n/**\n * Copy command: copies text or element content to clipboard.\n * Syntax: copy <source>\n */\nexport const copySchema: CommandSchema = {\n action: 'copy',\n description: 'Copy text or element content to the clipboard',\n category: 'dom-content',\n primaryRole: 'patient',\n roles: [\n {\n role: 'patient',\n description: 'The text or element to copy',\n required: true,\n expectedTypes: ['literal', 'selector', 'reference', 'expression'],\n svoPosition: 1,\n sovPosition: 1,\n },\n ],\n};\n\n/**\n * Exit command: exits early from an event handler.\n * Syntax: exit\n */\nexport const exitSchema: CommandSchema = {\n action: 'exit',\n description: 'Exit from the current event handler',\n category: 'control-flow',\n primaryRole: 'patient',\n roles: [],\n};\n\n/**\n * Pick command: selects a random element from a collection.\n * Syntax: pick <item1>, <item2>, ... / pick from <array>\n */\nexport const pickSchema: CommandSchema = {\n action: 'pick',\n description: 'Select a random element from a collection',\n category: 'variable',\n primaryRole: 'patient',\n roles: [\n {\n role: 'patient',\n description: 'The items to pick from',\n required: true,\n expectedTypes: ['literal', 'expression', 'reference'],\n svoPosition: 1,\n sovPosition: 1,\n },\n {\n role: 'source',\n description: 'The array to pick from (with \"from\" keyword)',\n required: false,\n expectedTypes: ['reference', 'expression'],\n svoPosition: 2,\n sovPosition: 2,\n },\n ],\n};\n\n/**\n * Render command: renders a template with variables.\n * Syntax: render <template> / render <template> with <variables>\n */\nexport const renderSchema: CommandSchema = {\n action: 'render',\n description: 'Render a template with optional variables',\n category: 'dom-content',\n primaryRole: 'patient',\n roles: [\n {\n role: 'patient',\n description: 'The template to render',\n required: true,\n expectedTypes: ['selector', 'reference', 'expression'],\n svoPosition: 1,\n sovPosition: 2,\n },\n {\n role: 'style',\n description: 'Variables to pass to the template (with keyword)',\n required: false,\n expectedTypes: ['expression', 'reference'],\n svoPosition: 2,\n sovPosition: 1,\n },\n ],\n};\n\n// =============================================================================\n// Schema Registry\n// =============================================================================\n\n/**\n * All available command schemas.\n */\nexport const commandSchemas: Record<ActionType, CommandSchema> = {\n // Original schemas\n toggle: toggleSchema,\n add: addSchema,\n remove: removeSchema,\n put: putSchema,\n set: setSchema,\n show: showSchema,\n hide: hideSchema,\n on: onSchema,\n trigger: triggerSchema,\n wait: waitSchema,\n fetch: fetchSchema,\n increment: incrementSchema,\n decrement: decrementSchema,\n append: appendSchema,\n prepend: prependSchema,\n // Batch 1 - Simple Commands\n log: logSchema,\n get: getCommandSchema,\n take: takeSchema,\n make: makeSchema,\n halt: haltSchema,\n settle: settleSchema,\n throw: throwSchema,\n send: sendSchema,\n // Batch 2 - Control Flow\n if: ifSchema,\n unless: unlessSchema,\n else: elseSchema,\n repeat: repeatSchema,\n for: forSchema,\n while: whileSchema,\n continue: continueSchema,\n // Batch 3 - DOM & Navigation\n go: goSchema,\n transition: transitionSchema,\n clone: cloneSchema,\n focus: focusSchema,\n blur: blurSchema,\n // Batch 4 - Advanced\n call: callSchema,\n return: returnSchema,\n js: jsSchema,\n async: asyncSchema,\n tell: tellSchema,\n default: defaultSchema,\n init: initSchema,\n behavior: behaviorSchema,\n install: installSchema,\n measure: measureSchema,\n // Batch 5 - DOM Content Manipulation\n swap: swapSchema,\n morph: morphSchema,\n // Batch 6 - Missing Commands\n beep: beepSchema,\n break: breakSchema,\n copy: copySchema,\n exit: exitSchema,\n pick: pickSchema,\n render: renderSchema,\n // Meta commands (for compound structures)\n compound: {\n action: 'compound',\n description: 'A compound node representing chained statements',\n primaryRole: 'patient', // Compound nodes don't have a traditional primary role\n category: 'control-flow',\n hasBody: true,\n roles: [],\n },\n};\n\n/**\n * Get a command schema by action type.\n */\nexport function getSchema(action: ActionType): CommandSchema | undefined {\n return commandSchemas[action];\n}\n\n/**\n * Get all schemas for a category.\n */\nexport function getSchemasByCategory(category: CommandCategory): CommandSchema[] {\n return Object.values(commandSchemas).filter(s => s.category === category);\n}\n\n/**\n * Get all fully-defined schemas (with roles).\n */\nexport function getDefinedSchemas(): CommandSchema[] {\n return Object.values(commandSchemas).filter(s => s.roles.length > 0);\n}\n\n// =============================================================================\n// Schema Validation (Development Only)\n// =============================================================================\n\n// Run schema validation at module load time in development builds\n// This is tree-shaken out in production builds\nif (typeof process !== 'undefined' && process.env.NODE_ENV !== 'production') {\n // Dynamic import to avoid bundling in production\n import('./schema-validator')\n .then(({ validateAllSchemas, formatValidationResults }) => {\n const validations = validateAllSchemas(commandSchemas);\n\n if (validations.size > 0) {\n console.warn('[SCHEMA VALIDATION] Found issues in command schemas:');\n console.warn(formatValidationResults(validations));\n console.warn('\\nThese warnings help identify potential schema design issues.');\n console.warn('Fix them to improve type inference and avoid runtime bugs.');\n }\n })\n .catch(err => {\n // Silently ignore if schema validator is not available\n console.debug('Schema validation skipped:', err);\n });\n}\n","/**\n * Role Positioning Utility\n *\n * Shared utilities for sorting and positioning semantic roles based on word order.\n * Used by pattern-generator and pattern-matcher to ensure consistent behavior.\n */\n\nimport type { SemanticRole } from '../../types';\nimport type { WordOrder } from '../../generators/profiles/types';\n\n/**\n * Priority order for semantic roles used in pattern matching.\n * Lower number = higher priority (comes first in pattern).\n * Only includes roles commonly used in patterns.\n */\nexport const ROLE_PRIORITY: Partial<Record<SemanticRole, number>> = {\n patient: 1,\n destination: 2,\n source: 3,\n style: 4,\n manner: 5,\n goal: 6,\n};\n\n/**\n * Get the priority of a semantic role.\n * Returns 99 for unknown/unlisted roles.\n */\nexport function getRolePriority(role: SemanticRole): number {\n return ROLE_PRIORITY[role] ?? 99;\n}\n\n/**\n * Sort semantic roles by their priority.\n * Patient comes first, then destination, source, etc.\n */\nexport function sortRolesByPriority(roles: SemanticRole[]): SemanticRole[] {\n return [...roles].sort((a, b) => getRolePriority(a) - getRolePriority(b));\n}\n\n// Re-export for convenience\nexport type { WordOrder };\n\n/**\n * Minimum interface for roles that can be sorted by position.\n */\nexport interface RoleWithPosition {\n role: SemanticRole;\n sovPosition?: number;\n svoPosition?: number;\n}\n\n/**\n * Sort roles by their position for a given word order.\n *\n * @param roles Array of role specs with position info\n * @param wordOrder The word order to use (SVO, SOV, VSO)\n * @returns Sorted array of roles\n */\nexport function sortRolesByWordOrder<T extends RoleWithPosition>(\n roles: readonly T[],\n wordOrder: WordOrder\n): T[] {\n const sortKey = wordOrder === 'SOV' ? 'sovPosition' : 'svoPosition';\n return [...roles].sort((a, b) => {\n const aPos = a[sortKey] ?? 99;\n const bPos = b[sortKey] ?? 99;\n return aPos - bPos;\n });\n}\n","/**\n * Marker Resolution Utility\n *\n * Shared utilities for resolving role markers from language profiles.\n * Used by pattern-generator to build tokens and extraction rules.\n */\n\nimport type { SemanticRole } from '../../types';\nimport type { LanguageProfile, RoleMarker } from '../../generators/language-profiles';\n\n/**\n * Minimum interface for role specs that can have marker resolution.\n * Compatible with the RoleSpec type from command-schemas.\n */\nexport interface RoleSpecWithMarker {\n role: SemanticRole;\n markerOverride?: Record<string, string | undefined>;\n}\n\n/**\n * Resolved marker information for a role.\n */\nexport interface ResolvedMarker {\n /** Primary marker string (may be empty string for no marker) */\n primary: string;\n /** Alternative markers */\n alternatives?: string[];\n /** Position relative to role value */\n position: 'before' | 'after';\n /** Whether this is an override marker */\n isOverride: boolean;\n}\n\n/**\n * Resolve the marker for a role in a specific language.\n *\n * Checks for command-specific marker overrides first,\n * then falls back to the default marker from the language profile.\n *\n * @param roleSpec Role specification with optional override\n * @param profile Language profile with role markers\n * @returns Resolved marker info, or null if no marker\n */\nexport function resolveMarkerForRole(\n roleSpec: RoleSpecWithMarker,\n profile: LanguageProfile\n): ResolvedMarker | null {\n // Check for command-specific marker override first\n const overrideMarker = roleSpec.markerOverride?.[profile.code];\n const defaultMarker = profile.roleMarkers[roleSpec.role];\n\n if (overrideMarker !== undefined) {\n // Use override marker (can be empty string to suppress default marker)\n return {\n primary: overrideMarker,\n position: defaultMarker?.position ?? 'before',\n isOverride: true,\n };\n }\n\n if (defaultMarker && defaultMarker.primary) {\n const result: ResolvedMarker = {\n primary: defaultMarker.primary,\n position: defaultMarker.position,\n isOverride: false,\n };\n if (defaultMarker.alternatives) {\n result.alternatives = defaultMarker.alternatives;\n }\n return result;\n }\n\n return null;\n}\n\n/**\n * Get all markers (primary + alternatives) for a role.\n *\n * @param roleSpec Role specification\n * @param profile Language profile\n * @returns Array of marker strings, or empty array if no markers\n */\nexport function getAllMarkersForRole(\n roleSpec: RoleSpecWithMarker,\n profile: LanguageProfile\n): string[] {\n const resolved = resolveMarkerForRole(roleSpec, profile);\n if (!resolved || !resolved.primary) {\n return [];\n }\n\n const markers = [resolved.primary];\n if (resolved.alternatives) {\n markers.push(...resolved.alternatives);\n }\n return markers;\n}\n\n/**\n * Get the default role marker from a language profile.\n *\n * @param profile Language profile\n * @param role Semantic role\n * @returns Role marker or undefined\n */\nexport function getDefaultRoleMarker(\n profile: LanguageProfile,\n role: SemanticRole\n): RoleMarker | undefined {\n return profile.roleMarkers[role];\n}\n","/**\n * SOV Event Handler Pattern Generators\n *\n * Generates event handler patterns for Subject-Object-Verb languages:\n * Japanese, Korean, Turkish, Bengali, Quechua, Hindi.\n *\n * Extracted from pattern-generator.ts for maintainability.\n */\n\nimport type { LanguagePattern, PatternToken } from '../types';\nimport type { LanguageProfile, KeywordTranslation, RoleMarker } from './language-profiles';\nimport type { CommandSchema } from './command-schemas';\nimport type { GeneratorConfig } from './pattern-generator';\n\n/**\n * Generate SOV event handler pattern (Japanese, Korean, Turkish).\n */\nexport function generateSOVEventHandlerPattern(\n commandSchema: CommandSchema,\n profile: LanguageProfile,\n keyword: KeywordTranslation,\n eventMarker: RoleMarker,\n config: GeneratorConfig\n): LanguagePattern {\n const tokens: PatternToken[] = [];\n\n // Event role\n tokens.push({ type: 'role', role: 'event', optional: false });\n\n // Event marker (after event in SOV)\n // Handle multi-word markers like Korean \"할 때\" by splitting into separate tokens\n if (eventMarker.position === 'after') {\n const markerWords = eventMarker.primary.split(/\\s+/);\n if (markerWords.length > 1) {\n // Multi-word marker: create a token for each word\n for (const word of markerWords) {\n tokens.push({ type: 'literal', value: word });\n }\n } else {\n // Single-word marker: include alternatives\n const markerToken: PatternToken = eventMarker.alternatives\n ? { type: 'literal', value: eventMarker.primary, alternatives: eventMarker.alternatives }\n : { type: 'literal', value: eventMarker.primary };\n tokens.push(markerToken);\n }\n }\n\n // Optional destination with its marker\n const destMarker = profile.roleMarkers.destination;\n if (destMarker) {\n tokens.push({\n type: 'group',\n optional: true,\n tokens: [\n { type: 'role', role: 'destination', optional: true },\n destMarker.alternatives\n ? { type: 'literal', value: destMarker.primary, alternatives: destMarker.alternatives }\n : { type: 'literal', value: destMarker.primary },\n ],\n });\n }\n\n // Patient role\n tokens.push({ type: 'role', role: 'patient', optional: false });\n\n // Patient marker (postposition/particle after patient)\n const patientMarker = profile.roleMarkers.patient;\n if (patientMarker) {\n const patMarkerToken: PatternToken = patientMarker.alternatives\n ? { type: 'literal', value: patientMarker.primary, alternatives: patientMarker.alternatives }\n : { type: 'literal', value: patientMarker.primary };\n tokens.push(patMarkerToken);\n }\n\n // Command verb at end (SOV)\n const verbToken: PatternToken = keyword.alternatives\n ? { type: 'literal', value: keyword.primary, alternatives: keyword.alternatives }\n : { type: 'literal', value: keyword.primary };\n tokens.push(verbToken);\n\n return {\n id: `${commandSchema.action}-event-${profile.code}-sov`,\n language: profile.code,\n command: 'on', // This is an event handler pattern\n priority: (config.basePriority ?? 100) + 50, // Higher priority than simple commands\n template: {\n format: `{event} ${eventMarker.primary} {destination?} {patient} ${patientMarker?.primary || ''} ${keyword.primary}`,\n tokens,\n },\n extraction: {\n action: { value: commandSchema.action }, // Extract the wrapped command\n event: { fromRole: 'event' },\n patient: { fromRole: 'patient' },\n destination: { fromRole: 'destination', default: { type: 'reference', value: 'me' } },\n },\n };\n}\n\n/**\n * Generate patient-first SOV event handler pattern (simple, no destination).\n *\n * Alternative SOV ordering where the patient precedes the event:\n * - Bengali: .active কে ক্লিক এ টগল (patient কে event এ verb)\n * - Quechua: .active ta ñitiy pi tikray (patient ta event pi verb)\n *\n * No optional destination group to avoid greedy match issues when\n * destination and event markers collide (e.g., Bengali তে/এ).\n */\nexport function generateSOVPatientFirstEventHandlerPattern(\n commandSchema: CommandSchema,\n profile: LanguageProfile,\n keyword: KeywordTranslation,\n eventMarker: RoleMarker,\n config: GeneratorConfig\n): LanguagePattern {\n const tokens: PatternToken[] = [];\n\n // Patient role first\n tokens.push({ type: 'role', role: 'patient', optional: false });\n\n // Patient marker (postposition after patient)\n const patientMarker = profile.roleMarkers.patient;\n if (patientMarker) {\n const patMarkerToken: PatternToken = patientMarker.alternatives\n ? { type: 'literal', value: patientMarker.primary, alternatives: patientMarker.alternatives }\n : { type: 'literal', value: patientMarker.primary };\n tokens.push(patMarkerToken);\n }\n\n // Event role\n tokens.push({ type: 'role', role: 'event', optional: false });\n\n // Event marker (after event in SOV)\n if (eventMarker.position === 'after') {\n const markerWords = eventMarker.primary.split(/\\s+/);\n if (markerWords.length > 1) {\n for (const word of markerWords) {\n tokens.push({ type: 'literal', value: word });\n }\n } else {\n const markerToken: PatternToken = eventMarker.alternatives\n ? { type: 'literal', value: eventMarker.primary, alternatives: eventMarker.alternatives }\n : { type: 'literal', value: eventMarker.primary };\n tokens.push(markerToken);\n }\n }\n\n // Command verb at end (SOV)\n const verbToken: PatternToken = keyword.alternatives\n ? { type: 'literal', value: keyword.primary, alternatives: keyword.alternatives }\n : { type: 'literal', value: keyword.primary };\n tokens.push(verbToken);\n\n return {\n id: `${commandSchema.action}-event-${profile.code}-sov-patient-first`,\n language: profile.code,\n command: 'on',\n priority: (config.basePriority ?? 100) + 45,\n template: {\n format: `{patient} ${patientMarker?.primary || ''} {event} ${eventMarker.primary} ${keyword.primary}`,\n tokens,\n },\n extraction: {\n action: { value: commandSchema.action },\n event: { fromRole: 'event' },\n patient: { fromRole: 'patient' },\n destination: { fromRole: 'destination', default: { type: 'reference', value: 'me' } },\n },\n };\n}\n\n/**\n * Generate patient-first SOV event handler pattern with required destination.\n *\n * For patterns like:\n * - Quechua: .highlight ta noqa man ñitiy pi yapay (patient ta dest man event pi verb)\n *\n * Destination is REQUIRED (not optional) to avoid greedy match ambiguity.\n * Only generated when destination and event markers are different.\n */\nexport function generateSOVPatientFirstWithDestEventHandlerPattern(\n commandSchema: CommandSchema,\n profile: LanguageProfile,\n keyword: KeywordTranslation,\n eventMarker: RoleMarker,\n config: GeneratorConfig\n): LanguagePattern {\n const tokens: PatternToken[] = [];\n\n // Patient role first\n tokens.push({ type: 'role', role: 'patient', optional: false });\n\n // Patient marker\n const patientMarker = profile.roleMarkers.patient;\n if (patientMarker) {\n const patMarkerToken: PatternToken = patientMarker.alternatives\n ? { type: 'literal', value: patientMarker.primary, alternatives: patientMarker.alternatives }\n : { type: 'literal', value: patientMarker.primary };\n tokens.push(patMarkerToken);\n }\n\n // Required destination with its marker\n const destMarker = profile.roleMarkers.destination;\n if (destMarker) {\n tokens.push({ type: 'role', role: 'destination', optional: false });\n tokens.push(\n destMarker.alternatives\n ? { type: 'literal', value: destMarker.primary, alternatives: destMarker.alternatives }\n : { type: 'literal', value: destMarker.primary }\n );\n }\n\n // Event role\n tokens.push({ type: 'role', role: 'event', optional: false });\n\n // Event marker (after event in SOV)\n if (eventMarker.position === 'after') {\n const markerWords = eventMarker.primary.split(/\\s+/);\n if (markerWords.length > 1) {\n for (const word of markerWords) {\n tokens.push({ type: 'literal', value: word });\n }\n } else {\n const markerToken: PatternToken = eventMarker.alternatives\n ? { type: 'literal', value: eventMarker.primary, alternatives: eventMarker.alternatives }\n : { type: 'literal', value: eventMarker.primary };\n tokens.push(markerToken);\n }\n }\n\n // Command verb at end (SOV)\n const verbToken: PatternToken = keyword.alternatives\n ? { type: 'literal', value: keyword.primary, alternatives: keyword.alternatives }\n : { type: 'literal', value: keyword.primary };\n tokens.push(verbToken);\n\n return {\n id: `${commandSchema.action}-event-${profile.code}-sov-patient-first-dest`,\n language: profile.code,\n command: 'on',\n priority: (config.basePriority ?? 100) + 40, // Lower than simple patient-first\n template: {\n format: `{patient} ${patientMarker?.primary || ''} {destination} ${destMarker?.primary || ''} {event} ${eventMarker.primary} ${keyword.primary}`,\n tokens,\n },\n extraction: {\n action: { value: commandSchema.action },\n event: { fromRole: 'event' },\n patient: { fromRole: 'patient' },\n destination: { fromRole: 'destination' },\n },\n };\n}\n\n/**\n * Generate SOV compact event handler pattern for languages with no-space forms.\n *\n * This handles Korean compact forms where the event marker is attached directly\n * to the event word without a space:\n * - 클릭할때 .active를토글 (click+when toggle .active)\n *\n * The pattern uses a single token for the no-space marker alternatives.\n */\nexport function generateSOVCompactEventHandlerPattern(\n commandSchema: CommandSchema,\n profile: LanguageProfile,\n keyword: KeywordTranslation,\n eventMarker: RoleMarker,\n config: GeneratorConfig\n): LanguagePattern {\n const tokens: PatternToken[] = [];\n\n // Event role\n tokens.push({ type: 'role', role: 'event', optional: false });\n\n // Event marker as single token (using no-space alternatives)\n // Filter alternatives to only include no-space versions\n const noSpaceAlternatives =\n eventMarker.alternatives?.filter(alt => !alt.includes(' ') && alt.length > 1) || [];\n\n if (noSpaceAlternatives.length > 0) {\n tokens.push({\n type: 'literal',\n value: noSpaceAlternatives[0],\n alternatives: noSpaceAlternatives.slice(1),\n });\n }\n\n // Optional destination with its marker\n const destMarker = profile.roleMarkers.destination;\n if (destMarker) {\n tokens.push({\n type: 'group',\n optional: true,\n tokens: [\n { type: 'role', role: 'destination', optional: true },\n destMarker.alternatives\n ? { type: 'literal', value: destMarker.primary, alternatives: destMarker.alternatives }\n : { type: 'literal', value: destMarker.primary },\n ],\n });\n }\n\n // Patient role\n tokens.push({ type: 'role', role: 'patient', optional: false });\n\n // Patient marker (postposition/particle after patient)\n const patientMarker = profile.roleMarkers.patient;\n if (patientMarker) {\n const patMarkerToken: PatternToken = patientMarker.alternatives\n ? { type: 'literal', value: patientMarker.primary, alternatives: patientMarker.alternatives }\n : { type: 'literal', value: patientMarker.primary };\n tokens.push(patMarkerToken);\n }\n\n // Command verb at end (SOV)\n const verbToken: PatternToken = keyword.alternatives\n ? { type: 'literal', value: keyword.primary, alternatives: keyword.alternatives }\n : { type: 'literal', value: keyword.primary };\n tokens.push(verbToken);\n\n return {\n id: `${commandSchema.action}-event-${profile.code}-sov-compact`,\n language: profile.code,\n command: 'on', // This is an event handler pattern\n priority: (config.basePriority ?? 100) + 52, // Slightly higher priority for compact forms\n template: {\n format: `{event}${noSpaceAlternatives[0] || ''} {patient} ${keyword.primary}`,\n tokens,\n },\n extraction: {\n action: { value: commandSchema.action }, // Extract the wrapped command\n event: { fromRole: 'event' },\n patient: { fromRole: 'patient' },\n destination: { fromRole: 'destination', default: { type: 'reference', value: 'me' } },\n },\n };\n}\n\n/**\n * Generate SOV simple event handler pattern (patient optional, defaults to 'me').\n *\n * Supports patterns like:\n * - Japanese: クリック で 増加 (click on increment)\n * - Korean: 클릭 할 때 증가 (click when increment)\n * - Turkish: tıklama da artır (click on increment)\n *\n * The patient is not explicitly specified - it defaults to 'me' (current element).\n */\nexport function generateSOVSimpleEventHandlerPattern(\n commandSchema: CommandSchema,\n profile: LanguageProfile,\n keyword: KeywordTranslation,\n eventMarker: RoleMarker,\n config: GeneratorConfig\n): LanguagePattern {\n const tokens: PatternToken[] = [];\n\n // Event role\n tokens.push({ type: 'role', role: 'event', optional: false });\n\n // Event marker (after event in SOV)\n if (eventMarker.position === 'after') {\n const markerWords = eventMarker.primary.split(/\\s+/);\n if (markerWords.length > 1) {\n // Multi-word marker: create a token for each word\n for (const word of markerWords) {\n tokens.push({ type: 'literal', value: word });\n }\n } else {\n const markerToken: PatternToken = eventMarker.alternatives\n ? { type: 'literal', value: eventMarker.primary, alternatives: eventMarker.alternatives }\n : { type: 'literal', value: eventMarker.primary };\n tokens.push(markerToken);\n }\n }\n\n // Command verb at end (SOV) - no patient required\n const verbToken: PatternToken = keyword.alternatives\n ? { type: 'literal', value: keyword.primary, alternatives: keyword.alternatives }\n : { type: 'literal', value: keyword.primary };\n tokens.push(verbToken);\n\n return {\n id: `${commandSchema.action}-event-${profile.code}-sov-simple`,\n language: profile.code,\n command: 'on',\n priority: (config.basePriority ?? 100) + 48, // Lower than full pattern (50) but higher than base\n template: {\n format: `{event} ${eventMarker.primary} ${keyword.primary}`,\n tokens,\n },\n extraction: {\n action: { value: commandSchema.action },\n event: { fromRole: 'event' },\n patient: { default: { type: 'reference', value: 'me' } }, // Default to 'me'\n },\n };\n}\n\n/**\n * Generate SOV temporal event handler pattern.\n *\n * Supports patterns with temporal markers like:\n * - Japanese: クリック 時 .active を 切り替え (click time toggle .active)\n * - Japanese: クリック の 時 .active を 切り替え (click's time toggle .active)\n *\n * Uses profile.eventHandler.temporalMarkers for language-specific temporal words.\n */\nexport function generateSOVTemporalEventHandlerPattern(\n commandSchema: CommandSchema,\n profile: LanguageProfile,\n keyword: KeywordTranslation,\n config: GeneratorConfig\n): LanguagePattern | null {\n const temporalMarkers = profile.eventHandler?.temporalMarkers;\n if (!temporalMarkers || temporalMarkers.length === 0) return null;\n\n const tokens: PatternToken[] = [];\n\n // Event role\n tokens.push({ type: 'role', role: 'event', optional: false });\n\n // Optional possessive marker (の in Japanese)\n if (profile.possessive?.marker) {\n tokens.push({\n type: 'group',\n optional: true,\n tokens: [{ type: 'literal', value: profile.possessive.marker }],\n });\n }\n\n // Temporal marker (時, とき in Japanese)\n tokens.push({\n type: 'literal',\n value: temporalMarkers[0],\n alternatives: temporalMarkers.slice(1),\n });\n\n // Patient role\n tokens.push({ type: 'role', role: 'patient', optional: false });\n\n // Patient marker\n const patientMarker = profile.roleMarkers.patient;\n if (patientMarker?.primary) {\n const patMarkerToken: PatternToken = patientMarker.alternatives\n ? { type: 'literal', value: patientMarker.primary, alternatives: patientMarker.alternatives }\n : { type: 'literal', value: patientMarker.primary };\n tokens.push(patMarkerToken);\n }\n\n // Command verb at end\n const verbToken: PatternToken = keyword.alternatives\n ? { type: 'literal', value: keyword.primary, alternatives: keyword.alternatives }\n : { type: 'literal', value: keyword.primary };\n tokens.push(verbToken);\n\n return {\n id: `${commandSchema.action}-event-${profile.code}-sov-temporal`,\n language: profile.code,\n command: 'on',\n priority: (config.basePriority ?? 100) + 49, // Between simple and full pattern\n template: {\n format: `{event} ${temporalMarkers[0]} {patient} ${keyword.primary}`,\n tokens,\n },\n extraction: {\n action: { value: commandSchema.action },\n event: { fromRole: 'event' },\n patient: { fromRole: 'patient' },\n },\n };\n}\n/**\n * Generate SOV two-role event handler pattern (for put/set commands).\n *\n * Patterns:\n * - Japanese put: 入力 で \"test\" を #output に 入れる\n * [event] [eventMarker] [patient] [patientMarker] [destination] [destMarker] [verb]\n * - Korean set: 변경 할 때 x 를 10 으로 설정\n * [event] [eventMarker] [role1] [role1Marker] [role2] [role2Marker] [verb]\n * - Turkish put: giriş de \"test\" i #output a koy\n * [event] [eventMarker] [patient] [patientMarker] [destination] [destMarker] [verb]\n */\nexport function generateSOVTwoRoleEventHandlerPattern(\n commandSchema: CommandSchema,\n profile: LanguageProfile,\n keyword: KeywordTranslation,\n eventMarker: RoleMarker,\n config: GeneratorConfig\n): LanguagePattern {\n const tokens: PatternToken[] = [];\n\n // Event role\n tokens.push({ type: 'role', role: 'event', optional: false });\n\n // Event marker (after event in SOV)\n // Handle multi-word markers like Korean \"할 때\" by splitting into separate tokens\n if (eventMarker.position === 'after') {\n const markerWords = eventMarker.primary.split(/\\s+/);\n if (markerWords.length > 1) {\n // Multi-word marker: create a token for each word\n for (const word of markerWords) {\n tokens.push({ type: 'literal', value: word });\n }\n } else {\n // Single-word marker: include alternatives\n const markerToken: PatternToken = eventMarker.alternatives\n ? { type: 'literal', value: eventMarker.primary, alternatives: eventMarker.alternatives }\n : { type: 'literal', value: eventMarker.primary };\n tokens.push(markerToken);\n }\n }\n\n // Get the two required roles from the schema\n const requiredRoles = commandSchema.roles.filter(r => r.required);\n\n // Sort by SOV position (lower number = earlier in sentence)\n const sortedRoles = [...requiredRoles].sort((a, b) => {\n const aPos = a.sovPosition ?? 999;\n const bPos = b.sovPosition ?? 999;\n return aPos - bPos;\n });\n\n // Add each role with its marker\n for (const roleSpec of sortedRoles) {\n // Add the role\n tokens.push({ type: 'role', role: roleSpec.role, optional: false });\n\n // Get marker for this role - check for override first\n let marker: string | undefined;\n let markerAlternatives: string[] | undefined;\n\n if (roleSpec.markerOverride && roleSpec.markerOverride[profile.code] !== undefined) {\n // Use the override marker\n marker = roleSpec.markerOverride[profile.code];\n } else {\n // Use default role marker from profile\n const roleMarker = profile.roleMarkers[roleSpec.role];\n if (roleMarker) {\n marker = roleMarker.primary;\n markerAlternatives = roleMarker.alternatives;\n }\n }\n\n // Add the marker token\n if (marker) {\n const markerToken: PatternToken = markerAlternatives\n ? { type: 'literal', value: marker, alternatives: markerAlternatives }\n : { type: 'literal', value: marker };\n tokens.push(markerToken);\n }\n }\n\n // Command verb at end (SOV)\n const verbToken: PatternToken = keyword.alternatives\n ? { type: 'literal', value: keyword.primary, alternatives: keyword.alternatives }\n : { type: 'literal', value: keyword.primary };\n tokens.push(verbToken);\n\n // Build format string\n const roleNames = sortedRoles.map(r => `{${r.role}}`).join(' ');\n\n return {\n id: `${commandSchema.action}-event-${profile.code}-sov-2role`,\n language: profile.code,\n command: 'on', // This is an event handler pattern\n priority: (config.basePriority ?? 100) + 55, // Higher priority than single-role patterns\n template: {\n format: `{event} ${eventMarker.primary} ${roleNames} ${keyword.primary}`,\n tokens,\n },\n extraction: {\n action: { value: commandSchema.action }, // Extract the wrapped command\n event: { fromRole: 'event' },\n ...Object.fromEntries(sortedRoles.map(r => [r.role, { fromRole: r.role }])),\n },\n };\n}\n\n/**\n * Generate destination-first SOV two-role event handler pattern.\n *\n * For languages where the roles precede the event in SOV order:\n * - Bengali: @disabled কে ক্লিক এ সেট সত্য তে\n * [destination] [destMarker] [event] [eventMarker] [verb] [patient] [patientMarker]\n * - Bengali: \"Hello\" কে ক্লিক এ রাখুন #output তে\n * [patient] [patientMarker] [event] [eventMarker] [verb] [destination] [destMarker]\n */\nexport function generateSOVTwoRoleDestFirstEventHandlerPattern(\n commandSchema: CommandSchema,\n profile: LanguageProfile,\n keyword: KeywordTranslation,\n eventMarker: RoleMarker,\n config: GeneratorConfig\n): LanguagePattern {\n const tokens: PatternToken[] = [];\n\n // Get the two required roles from the schema\n const requiredRoles = commandSchema.roles.filter(r => r.required);\n const sortedRoles = [...requiredRoles].sort((a, b) => {\n const aPos = a.sovPosition ?? 999;\n const bPos = b.sovPosition ?? 999;\n return aPos - bPos;\n });\n\n // First role before event\n const firstRole = sortedRoles[0];\n tokens.push({ type: 'role', role: firstRole.role, optional: false });\n\n // First role marker\n let firstMarker: string | undefined;\n if (firstRole.markerOverride && firstRole.markerOverride[profile.code] !== undefined) {\n firstMarker = firstRole.markerOverride[profile.code];\n } else {\n const roleMarker = profile.roleMarkers[firstRole.role];\n if (roleMarker) firstMarker = roleMarker.primary;\n }\n if (firstMarker) {\n tokens.push({ type: 'literal', value: firstMarker });\n }\n\n // Event role\n tokens.push({ type: 'role', role: 'event', optional: false });\n\n // Event marker\n if (eventMarker.position === 'after') {\n const markerWords = eventMarker.primary.split(/\\s+/);\n if (markerWords.length > 1) {\n for (const word of markerWords) {\n tokens.push({ type: 'literal', value: word });\n }\n } else {\n const markerToken: PatternToken = eventMarker.alternatives\n ? { type: 'literal', value: eventMarker.primary, alternatives: eventMarker.alternatives }\n : { type: 'literal', value: eventMarker.primary };\n tokens.push(markerToken);\n }\n }\n\n // Command verb (between event and second role in this variant)\n const verbToken: PatternToken = keyword.alternatives\n ? { type: 'literal', value: keyword.primary, alternatives: keyword.alternatives }\n : { type: 'literal', value: keyword.primary };\n tokens.push(verbToken);\n\n // Second role after verb\n const secondRole = sortedRoles[1];\n tokens.push({ type: 'role', role: secondRole.role, optional: false });\n\n // Second role marker\n let secondMarker: string | undefined;\n let secondMarkerAlts: string[] | undefined;\n if (secondRole.markerOverride && secondRole.markerOverride[profile.code] !== undefined) {\n secondMarker = secondRole.markerOverride[profile.code];\n } else {\n const roleMarker = profile.roleMarkers[secondRole.role];\n if (roleMarker) {\n secondMarker = roleMarker.primary;\n secondMarkerAlts = roleMarker.alternatives;\n }\n }\n if (secondMarker) {\n const markerToken: PatternToken = secondMarkerAlts\n ? { type: 'literal', value: secondMarker, alternatives: secondMarkerAlts }\n : { type: 'literal', value: secondMarker };\n tokens.push(markerToken);\n }\n\n return {\n id: `${commandSchema.action}-event-${profile.code}-sov-2role-dest-first`,\n language: profile.code,\n command: 'on',\n priority: (config.basePriority ?? 100) + 48, // Slightly lower than event-first two-role\n template: {\n format: `{${firstRole.role}} {event} ${eventMarker.primary} ${keyword.primary} {${secondRole.role}}`,\n tokens,\n },\n extraction: {\n action: { value: commandSchema.action },\n event: { fromRole: 'event' },\n [firstRole.role]: { fromRole: firstRole.role },\n [secondRole.role]: { fromRole: secondRole.role },\n },\n };\n}\n","/**\n * VSO Event Handler Pattern Generators\n *\n * Generates event handler patterns for Verb-Subject-Object languages:\n * Arabic, Tagalog. Also reused by SVO languages as fallback.\n *\n * Extracted from pattern-generator.ts for maintainability.\n */\n\nimport type { LanguagePattern, PatternToken } from '../types';\nimport type { LanguageProfile, KeywordTranslation, RoleMarker } from './language-profiles';\nimport type { CommandSchema } from './command-schemas';\nimport type { GeneratorConfig } from './pattern-generator';\n\n/**\n * Generate VSO event handler pattern (Arabic).\n */\nexport function generateVSOEventHandlerPattern(\n commandSchema: CommandSchema,\n profile: LanguageProfile,\n keyword: KeywordTranslation,\n eventMarker: RoleMarker,\n config: GeneratorConfig\n): LanguagePattern {\n const tokens: PatternToken[] = [];\n\n // Event marker (before event in VSO)\n if (eventMarker.position === 'before') {\n const markerToken: PatternToken = eventMarker.alternatives\n ? { type: 'literal', value: eventMarker.primary, alternatives: eventMarker.alternatives }\n : { type: 'literal', value: eventMarker.primary };\n tokens.push(markerToken);\n }\n\n // Event role\n tokens.push({ type: 'role', role: 'event', optional: false });\n\n // Command verb (verb comes early in VSO)\n const verbToken: PatternToken = keyword.alternatives\n ? { type: 'literal', value: keyword.primary, alternatives: keyword.alternatives }\n : { type: 'literal', value: keyword.primary };\n tokens.push(verbToken);\n\n // Patient role\n tokens.push({ type: 'role', role: 'patient', optional: false });\n\n // Optional destination with preposition\n const destMarker = profile.roleMarkers.destination;\n if (destMarker) {\n tokens.push({\n type: 'group',\n optional: true,\n tokens: [\n destMarker.alternatives\n ? { type: 'literal', value: destMarker.primary, alternatives: destMarker.alternatives }\n : { type: 'literal', value: destMarker.primary },\n { type: 'role', role: 'destination', optional: true },\n ],\n });\n }\n\n return {\n id: `${commandSchema.action}-event-${profile.code}-vso`,\n language: profile.code,\n command: 'on', // This is an event handler pattern\n priority: (config.basePriority ?? 100) + 50, // Higher priority than simple commands\n template: {\n format: `${eventMarker.primary} {event} ${keyword.primary} {patient} ${destMarker?.primary || ''} {destination?}`,\n tokens,\n },\n extraction: {\n action: { value: commandSchema.action }, // Extract the wrapped command\n event: { fromRole: 'event' },\n patient: { fromRole: 'patient' },\n destination: { fromRole: 'destination', default: { type: 'reference', value: 'me' } },\n },\n };\n}\n\n/**\n * Generate VSO verb-first event handler pattern.\n *\n * For languages (like Tagalog) where the command comes before the event handler:\n * - Tagalog: alisin ako kapag click (remove me on click)\n * [verb] [patient] [eventMarker] [event]\n * - Tagalog: palitan .active kapag click (toggle .active on click)\n * [verb] [patient] [eventMarker] [event]\n */\nexport function generateVSOVerbFirstEventHandlerPattern(\n commandSchema: CommandSchema,\n profile: LanguageProfile,\n keyword: KeywordTranslation,\n eventMarker: RoleMarker,\n config: GeneratorConfig\n): LanguagePattern {\n const tokens: PatternToken[] = [];\n\n // Command verb first (VSO)\n const verbToken: PatternToken = keyword.alternatives\n ? { type: 'literal', value: keyword.primary, alternatives: keyword.alternatives }\n : { type: 'literal', value: keyword.primary };\n tokens.push(verbToken);\n\n // Patient role\n tokens.push({ type: 'role', role: 'patient', optional: false });\n\n // Optional destination with preposition\n const destMarker = profile.roleMarkers.destination;\n if (destMarker) {\n tokens.push({\n type: 'group',\n optional: true,\n tokens: [\n destMarker.alternatives\n ? { type: 'literal', value: destMarker.primary, alternatives: destMarker.alternatives }\n : { type: 'literal', value: destMarker.primary },\n { type: 'role', role: 'destination', optional: true },\n ],\n });\n }\n\n // Event marker at end\n if (eventMarker.position === 'before') {\n const markerToken: PatternToken = eventMarker.alternatives\n ? { type: 'literal', value: eventMarker.primary, alternatives: eventMarker.alternatives }\n : { type: 'literal', value: eventMarker.primary };\n tokens.push(markerToken);\n }\n\n // Event role at end\n tokens.push({ type: 'role', role: 'event', optional: false });\n\n return {\n id: `${commandSchema.action}-event-${profile.code}-vso-verb-first`,\n language: profile.code,\n command: 'on',\n priority: (config.basePriority ?? 100) + 45, // Slightly lower than event-first variant\n template: {\n format: `${keyword.primary} {patient} ${destMarker?.primary || ''} {destination?} ${eventMarker.primary} {event}`,\n tokens,\n },\n extraction: {\n action: { value: commandSchema.action },\n event: { fromRole: 'event' },\n patient: { fromRole: 'patient' },\n destination: { fromRole: 'destination', default: { type: 'reference', value: 'me' } },\n },\n };\n}\n\n/**\n * Generate VSO verb-first two-role event handler pattern.\n *\n * For two-role commands (put/set) in VSO languages with event handler at end:\n * - Tagalog set: itakda aking *background sa \"red\" kapag click\n * [verb] [role1] [role1Marker] [role2] [eventMarker] [event]\n */\nexport function generateVSOVerbFirstTwoRoleEventHandlerPattern(\n commandSchema: CommandSchema,\n profile: LanguageProfile,\n keyword: KeywordTranslation,\n eventMarker: RoleMarker,\n config: GeneratorConfig\n): LanguagePattern {\n const tokens: PatternToken[] = [];\n\n // Command verb first\n const verbToken: PatternToken = keyword.alternatives\n ? { type: 'literal', value: keyword.primary, alternatives: keyword.alternatives }\n : { type: 'literal', value: keyword.primary };\n tokens.push(verbToken);\n\n // Get the two required roles from the schema\n const requiredRoles = commandSchema.roles.filter(r => r.required);\n const sortedRoles = [...requiredRoles].sort((a, b) => {\n const aPos = a.svoPosition ?? 999;\n const bPos = b.svoPosition ?? 999;\n return aPos - bPos;\n });\n\n // Add each role with its marker (preposition before role for VSO)\n for (const roleSpec of sortedRoles) {\n let marker: string | undefined;\n let markerAlternatives: string[] | undefined;\n\n // Check for override — use !== undefined to allow empty string overrides\n if (roleSpec.markerOverride && roleSpec.markerOverride[profile.code] !== undefined) {\n marker = roleSpec.markerOverride[profile.code];\n } else {\n const roleMarker = profile.roleMarkers[roleSpec.role];\n if (roleMarker) {\n marker = roleMarker.primary;\n markerAlternatives = roleMarker.alternatives;\n }\n }\n\n // VSO languages use prepositions — marker comes BEFORE the role\n if (marker) {\n const markerToken: PatternToken = markerAlternatives\n ? { type: 'literal', value: marker, alternatives: markerAlternatives }\n : { type: 'literal', value: marker };\n tokens.push(markerToken);\n }\n\n tokens.push({ type: 'role', role: roleSpec.role, optional: false });\n }\n\n // Event marker at end\n if (eventMarker.position === 'before') {\n const markerToken: PatternToken = eventMarker.alternatives\n ? { type: 'literal', value: eventMarker.primary, alternatives: eventMarker.alternatives }\n : { type: 'literal', value: eventMarker.primary };\n tokens.push(markerToken);\n }\n\n // Event role at end\n tokens.push({ type: 'role', role: 'event', optional: false });\n\n const roleNames = sortedRoles.map(r => `{${r.role}}`).join(' ');\n\n return {\n id: `${commandSchema.action}-event-${profile.code}-vso-verb-first-2role`,\n language: profile.code,\n command: 'on',\n priority: (config.basePriority ?? 100) + 48,\n template: {\n format: `${keyword.primary} ${roleNames} ${eventMarker.primary} {event}`,\n tokens,\n },\n extraction: {\n action: { value: commandSchema.action },\n event: { fromRole: 'event' },\n ...Object.fromEntries(sortedRoles.map(r => [r.role, { fromRole: r.role }])),\n },\n };\n}\n/**\n * Generate VSO two-role event handler pattern (for put/set commands).\n *\n * Patterns:\n * - Arabic put: عند الإدخال ضع \"test\" في #output\n * [eventMarker] [event] [verb] [patient] [destPrep] [destination]\n * - Arabic set: عند التغيير عيّن x إلى 10\n * [eventMarker] [event] [verb] [destination] [patientPrep] [patient]\n */\nexport function generateVSOTwoRoleEventHandlerPattern(\n commandSchema: CommandSchema,\n profile: LanguageProfile,\n keyword: KeywordTranslation,\n eventMarker: RoleMarker,\n config: GeneratorConfig\n): LanguagePattern {\n const tokens: PatternToken[] = [];\n\n // Event marker (before event in VSO)\n if (eventMarker.position === 'before') {\n const markerToken: PatternToken = eventMarker.alternatives\n ? { type: 'literal', value: eventMarker.primary, alternatives: eventMarker.alternatives }\n : { type: 'literal', value: eventMarker.primary };\n tokens.push(markerToken);\n }\n\n // Event role\n tokens.push({ type: 'role', role: 'event', optional: false });\n\n // Command verb (verb comes early in VSO)\n const verbToken: PatternToken = keyword.alternatives\n ? { type: 'literal', value: keyword.primary, alternatives: keyword.alternatives }\n : { type: 'literal', value: keyword.primary };\n tokens.push(verbToken);\n\n // Get the two required roles from the schema\n const requiredRoles = commandSchema.roles.filter(r => r.required);\n\n // Sort by SVO position for VSO (role order is similar)\n const sortedRoles = [...requiredRoles].sort((a, b) => {\n const aPos = a.svoPosition ?? 999;\n const bPos = b.svoPosition ?? 999;\n return aPos - bPos;\n });\n\n // Add each role with its preposition/marker\n for (const roleSpec of sortedRoles) {\n // Get marker for this role - check for override first\n let marker: string | undefined;\n let markerAlternatives: string[] | undefined;\n\n if (roleSpec.markerOverride && roleSpec.markerOverride[profile.code] !== undefined) {\n // Use the override marker\n marker = roleSpec.markerOverride[profile.code];\n } else {\n // Use default role marker from profile\n const roleMarker = profile.roleMarkers[roleSpec.role];\n if (roleMarker) {\n marker = roleMarker.primary;\n markerAlternatives = roleMarker.alternatives;\n }\n }\n\n // In VSO, prepositions come BEFORE the noun (prepositional languages)\n if (marker) {\n const markerToken: PatternToken = markerAlternatives\n ? { type: 'literal', value: marker, alternatives: markerAlternatives }\n : { type: 'literal', value: marker };\n tokens.push(markerToken);\n }\n\n // Add the role\n tokens.push({ type: 'role', role: roleSpec.role, optional: false });\n }\n\n // Build format string\n const roleNames = sortedRoles.map(r => `{${r.role}}`).join(' ');\n\n return {\n id: `${commandSchema.action}-event-${profile.code}-vso-2role`,\n language: profile.code,\n command: 'on', // This is an event handler pattern\n priority: (config.basePriority ?? 100) + 55, // Higher priority than single-role patterns\n template: {\n format: `${eventMarker.primary} {event} ${keyword.primary} ${roleNames}`,\n tokens,\n },\n extraction: {\n action: { value: commandSchema.action }, // Extract the wrapped command\n event: { fromRole: 'event' },\n ...Object.fromEntries(sortedRoles.map(r => [r.role, { fromRole: r.role }])),\n },\n };\n}\n\n/**\n * Generate VSO negated event handler pattern.\n *\n * Patterns:\n * - Arabic: عند عدم التركيز أخف #tooltip\n * [eventMarker] [negation] [event] [verb] [patient]\n *\n * Used for events expressed as negation + opposite action:\n * - عدم التركيز = \"not focusing\" = blur\n */\nexport function generateVSONegatedEventHandlerPattern(\n commandSchema: CommandSchema,\n profile: LanguageProfile,\n keyword: KeywordTranslation,\n eventMarker: RoleMarker,\n config: GeneratorConfig\n): LanguagePattern {\n const tokens: PatternToken[] = [];\n const negationMarker = profile.eventHandler?.negationMarker;\n\n // Event marker (before event in VSO)\n if (eventMarker.position === 'before') {\n const markerToken: PatternToken = eventMarker.alternatives\n ? { type: 'literal', value: eventMarker.primary, alternatives: eventMarker.alternatives }\n : { type: 'literal', value: eventMarker.primary };\n tokens.push(markerToken);\n }\n\n // Negation marker (e.g., عدم = \"not/lack of\")\n if (negationMarker) {\n const negToken: PatternToken = negationMarker.alternatives\n ? {\n type: 'literal',\n value: negationMarker.primary,\n alternatives: negationMarker.alternatives,\n }\n : { type: 'literal', value: negationMarker.primary };\n tokens.push(negToken);\n }\n\n // Event role (the action being negated, e.g., التركيز = \"the focusing\")\n tokens.push({ type: 'role', role: 'event', optional: false });\n\n // Command verb (verb comes early in VSO)\n const verbToken: PatternToken = keyword.alternatives\n ? { type: 'literal', value: keyword.primary, alternatives: keyword.alternatives }\n : { type: 'literal', value: keyword.primary };\n tokens.push(verbToken);\n\n // Patient role\n tokens.push({ type: 'role', role: 'patient', optional: false });\n\n // Optional destination with preposition\n const destMarker = profile.roleMarkers.destination;\n if (destMarker) {\n tokens.push({\n type: 'group',\n optional: true,\n tokens: [\n destMarker.alternatives\n ? { type: 'literal', value: destMarker.primary, alternatives: destMarker.alternatives }\n : { type: 'literal', value: destMarker.primary },\n { type: 'role', role: 'destination', optional: true },\n ],\n });\n }\n\n return {\n id: `${commandSchema.action}-event-${profile.code}-vso-negated`,\n language: profile.code,\n command: 'on', // This is an event handler pattern\n priority: (config.basePriority ?? 100) + 48, // Slightly lower priority than standard patterns\n template: {\n format: `${eventMarker.primary} ${negationMarker?.primary || ''} {event} ${keyword.primary} {patient} ${destMarker?.primary || ''} {destination?}`,\n tokens,\n },\n extraction: {\n action: { value: commandSchema.action }, // Extract the wrapped command\n event: { fromRole: 'event' },\n patient: { fromRole: 'patient' },\n destination: { fromRole: 'destination', default: { type: 'reference', value: 'me' } },\n },\n };\n}\n\n/**\n * Generate VSO proclitic event handler pattern (for Arabic chained events).\n *\n * Patterns:\n * - Arabic: والنقر بدّل .active\n * [proclitic] [event] [verb] [patient]\n * - Arabic: فالتحويم أضف .highlight\n * [proclitic] [event] [verb] [patient]\n *\n * These patterns have a conjunction proclitic (و = and, ف = then) attached to\n * the event, without the عند event marker. Used for chained/consequent events.\n */\nexport function generateVSOProcliticEventHandlerPattern(\n commandSchema: CommandSchema,\n profile: LanguageProfile,\n keyword: KeywordTranslation,\n config: GeneratorConfig\n): LanguagePattern {\n const tokens: PatternToken[] = [];\n\n // Required conjunction token (و = and, ف = then)\n // The conjunction must be present for this pattern - it distinguishes chained events from regular commands\n // Use normalized values since proclitics are tokenized as conjunction tokens\n tokens.push({\n type: 'literal',\n value: 'and', // Matches normalized 'and' (Arabic: و)\n alternatives: ['then'], // Also matches normalized 'then' (Arabic: ف)\n });\n\n // Event role (the event name, e.g., النقر = the click)\n tokens.push({ type: 'role', role: 'event', optional: false });\n\n // Command verb (verb comes early in VSO)\n const verbToken: PatternToken = keyword.alternatives\n ? { type: 'literal', value: keyword.primary, alternatives: keyword.alternatives }\n : { type: 'literal', value: keyword.primary };\n tokens.push(verbToken);\n\n // Patient role\n tokens.push({ type: 'role', role: 'patient', optional: false });\n\n // Optional destination with preposition\n const destMarker = profile.roleMarkers.destination;\n if (destMarker) {\n tokens.push({\n type: 'group',\n optional: true,\n tokens: [\n destMarker.alternatives\n ? { type: 'literal', value: destMarker.primary, alternatives: destMarker.alternatives }\n : { type: 'literal', value: destMarker.primary },\n { type: 'role', role: 'destination', optional: true },\n ],\n });\n }\n\n return {\n id: `${commandSchema.action}-event-${profile.code}-vso-proclitic`,\n language: profile.code,\n command: 'on', // This is an event handler pattern\n priority: (config.basePriority ?? 100) + 45, // Lower priority than standard patterns\n template: {\n format: `[proclitic?] {event} ${keyword.primary} {patient} ${destMarker?.primary || ''} {destination?}`,\n tokens,\n },\n extraction: {\n action: { value: commandSchema.action }, // Extract the wrapped command\n event: { fromRole: 'event' },\n patient: { fromRole: 'patient' },\n destination: { fromRole: 'destination', default: { type: 'reference', value: 'me' } },\n },\n };\n}\n","/**\n * Pattern Generator\n *\n * Generates LanguagePattern objects from CommandSchema + LanguageProfile.\n * This solves the pattern explosion problem by deriving patterns from\n * high-level definitions rather than hand-writing each one.\n */\n\nimport type { LanguagePattern, PatternToken, ExtractionRule } from '../types';\nimport type { LanguageProfile } from './language-profiles';\nimport type { CommandSchema, RoleSpec } from './command-schemas';\nimport { getDefinedSchemas } from './command-schemas';\n\n// Import shared utilities\nimport { sortRolesByWordOrder } from '../parser/utils/role-positioning';\nimport { resolveMarkerForRole } from '../parser/utils/marker-resolution';\n\n// Import word-order-specific event handler generators\nimport {\n generateSOVEventHandlerPattern,\n generateSOVPatientFirstEventHandlerPattern,\n generateSOVPatientFirstWithDestEventHandlerPattern,\n generateSOVCompactEventHandlerPattern,\n generateSOVSimpleEventHandlerPattern,\n generateSOVTemporalEventHandlerPattern,\n generateSOVTwoRoleEventHandlerPattern,\n generateSOVTwoRoleDestFirstEventHandlerPattern,\n} from './event-handlers-sov';\nimport {\n generateVSOEventHandlerPattern,\n generateVSOVerbFirstEventHandlerPattern,\n generateVSOVerbFirstTwoRoleEventHandlerPattern,\n generateVSOTwoRoleEventHandlerPattern,\n generateVSONegatedEventHandlerPattern,\n generateVSOProcliticEventHandlerPattern,\n} from './event-handlers-vso';\n\n// Note: languageProfiles is no longer imported here.\n// Pattern generation for specific languages uses the registry instead.\n\n// Import registry functions - this is safe because:\n// 1. Registry doesn't import pattern-generator\n// 2. The circular path is: pattern-generator -> registry -> pattern-generator\n// But registry only uses setPatternGenerator which is exported, not module-level code\nimport {\n getRegisteredLanguages as registryGetLanguages,\n tryGetProfile as registryTryGetProfile,\n} from '../registry';\n\nfunction getAllRegisteredProfiles(): LanguageProfile[] {\n const languages = registryGetLanguages();\n return languages\n .map((lang: string) => registryTryGetProfile(lang))\n .filter((p): p is LanguageProfile => p !== undefined);\n}\n\n// =============================================================================\n// Pattern Generator\n// =============================================================================\n\n/**\n * Configuration for pattern generation.\n */\nexport interface GeneratorConfig {\n /** Base priority for generated patterns (higher = checked first) */\n basePriority?: number;\n /** Whether to generate simple patterns (without optional roles) */\n generateSimpleVariants?: boolean;\n /** Whether to generate alternative keyword patterns */\n generateAlternatives?: boolean;\n}\n\nconst defaultConfig: GeneratorConfig = {\n basePriority: 100,\n generateSimpleVariants: true,\n generateAlternatives: true,\n};\n\n/**\n * Generate a pattern for a command in a specific language.\n */\nexport function generatePattern(\n schema: CommandSchema,\n profile: LanguageProfile,\n config: GeneratorConfig = defaultConfig\n): LanguagePattern {\n const id = `${schema.action}-${profile.code}-generated`;\n const priority = config.basePriority ?? 100;\n\n // Get keyword translation\n const keyword = profile.keywords[schema.action];\n if (!keyword) {\n throw new Error(`No keyword translation for '${schema.action}' in ${profile.code}`);\n }\n\n // Build tokens based on word order\n const tokens = buildTokens(schema, profile, keyword);\n\n // Build extraction rules with defaults for optional roles\n // This ensures defaults are applied even when optional groups don't match\n const extraction = buildExtractionRulesWithDefaults(schema, profile);\n\n // Build template format string (for documentation)\n const format = buildFormatString(schema, profile, keyword);\n\n return {\n id,\n language: profile.code,\n command: schema.action,\n priority,\n template: {\n format,\n tokens,\n },\n extraction,\n };\n}\n\n/**\n * Generate a simple variant pattern (without optional roles).\n */\nexport function generateSimplePattern(\n schema: CommandSchema,\n profile: LanguageProfile,\n config: GeneratorConfig = defaultConfig\n): LanguagePattern | null {\n // Only generate simple variant if there are optional roles\n const optionalRoles = schema.roles.filter(r => !r.required);\n if (optionalRoles.length === 0) {\n return null;\n }\n\n const requiredRoles = schema.roles.filter(r => r.required);\n const simpleSchema: CommandSchema = {\n ...schema,\n roles: requiredRoles,\n };\n\n const pattern = generatePattern(simpleSchema, profile, config);\n\n // Adjust for simple variant\n return {\n ...pattern,\n id: `${schema.action}-${profile.code}-simple`,\n priority: (config.basePriority ?? 100) - 5, // Lower priority than full pattern (was -10)\n extraction: buildExtractionRulesWithDefaults(schema, profile),\n };\n}\n\n/**\n * Generate all pattern variants for a command in a language.\n */\nexport function generatePatternVariants(\n schema: CommandSchema,\n profile: LanguageProfile,\n config: GeneratorConfig = defaultConfig\n): LanguagePattern[] {\n const patterns: LanguagePattern[] = [];\n\n // Main pattern\n patterns.push(generatePattern(schema, profile, config));\n\n // Simple variant (without optional roles)\n if (config.generateSimpleVariants) {\n const simple = generateSimplePattern(schema, profile, config);\n if (simple) {\n patterns.push(simple);\n }\n }\n\n return patterns;\n}\n\n/**\n * Generate patterns for all commands in a specific language.\n */\nexport function generatePatternsForLanguage(\n profile: LanguageProfile,\n config: GeneratorConfig = defaultConfig\n): LanguagePattern[] {\n const patterns: LanguagePattern[] = [];\n const schemas = getDefinedSchemas();\n\n for (const schema of schemas) {\n // Skip if no keyword translation exists\n if (!profile.keywords[schema.action]) {\n continue;\n }\n\n // Generate simple command patterns\n const variants = generatePatternVariants(schema, profile, config);\n patterns.push(...variants);\n\n // Generate event handler patterns (on [event] [command] [patient])\n // Only generate for languages with eventHandler configuration\n if (profile.eventHandler?.eventMarker) {\n const eventHandlerPatterns = generateEventHandlerPatterns(schema, profile, config);\n patterns.push(...eventHandlerPatterns);\n }\n }\n\n return patterns;\n}\n\n/**\n * Generate patterns for a command across specified profiles.\n *\n * @param schema Command schema to generate patterns for\n * @param profiles Array of language profiles to generate patterns for (defaults to all registered)\n * @param config Generator configuration\n */\nexport function generatePatternsForCommand(\n schema: CommandSchema,\n profiles?: LanguageProfile[],\n config: GeneratorConfig = defaultConfig\n): LanguagePattern[] {\n const patterns: LanguagePattern[] = [];\n\n // If no profiles provided, use all registered profiles\n const profilesToUse = profiles ?? getAllRegisteredProfiles();\n\n for (const profile of profilesToUse) {\n // Skip if no keyword translation exists\n if (!profile.keywords[schema.action]) {\n continue;\n }\n\n const variants = generatePatternVariants(schema, profile, config);\n patterns.push(...variants);\n }\n\n return patterns;\n}\n\n/**\n * Generate all patterns for all commands across specified profiles.\n *\n * @param profiles Array of language profiles to generate patterns for (defaults to all registered)\n * @param config Generator configuration\n */\nexport function generateAllPatterns(\n profiles?: LanguageProfile[],\n config: GeneratorConfig = defaultConfig\n): LanguagePattern[] {\n const patterns: LanguagePattern[] = [];\n\n // If no profiles provided, use all registered profiles\n const profilesToUse = profiles ?? getAllRegisteredProfiles();\n\n for (const profile of profilesToUse) {\n const langPatterns = generatePatternsForLanguage(profile, config);\n patterns.push(...langPatterns);\n }\n\n return patterns;\n}\n\n/**\n * Generate event handler patterns for a command in a specific language.\n *\n * Creates patterns that wrap commands with event handlers (e.g., \"on click toggle .active\").\n * Automatically handles SOV, SVO, and VSO word orders based on language profile.\n *\n * @param commandSchema - The command to wrap (toggle, add, remove, etc.)\n * @param profile - Language profile with eventHandler configuration\n * @param config - Generator configuration\n * @returns Array of event handler patterns (empty if profile lacks eventHandler config)\n */\nexport function generateEventHandlerPatterns(\n commandSchema: CommandSchema,\n profile: LanguageProfile,\n config: GeneratorConfig = defaultConfig\n): LanguagePattern[] {\n // Only generate if profile has eventHandler configuration\n if (!profile.eventHandler || !profile.eventHandler.eventMarker) {\n return [];\n }\n\n const patterns: LanguagePattern[] = [];\n const eventMarker = profile.eventHandler.eventMarker;\n const keyword = profile.keywords[commandSchema.action];\n\n if (!keyword) {\n return []; // No translation for this command\n }\n\n // Check if this is a two-role command (like put, set)\n const requiredRoles = commandSchema.roles.filter(r => r.required);\n const hasTwoRequiredRoles = requiredRoles.length === 2;\n\n // Generate pattern based on word order\n if (profile.wordOrder === 'SOV') {\n if (hasTwoRequiredRoles) {\n // Two-role SOV pattern for put/set commands (event-first)\n // Japanese put: 入力 で \"test\" を #output に 入れる\n // Korean set: 변경 할 때 x 를 10 으로 설정\n patterns.push(\n generateSOVTwoRoleEventHandlerPattern(commandSchema, profile, keyword, eventMarker, config)\n );\n\n // Two-role SOV pattern (destination-first variant)\n // Bengali set: @disabled কে ক্লিক এ সেট সত্য তে\n // Quechua set: x ta ñitiy pi 10 man churay\n patterns.push(\n generateSOVTwoRoleDestFirstEventHandlerPattern(\n commandSchema,\n profile,\n keyword,\n eventMarker,\n config\n )\n );\n } else {\n // SOV: [event] [eventMarker] [destination? destMarker?] [patient] [patientMarker] [verb]\n // Japanese: クリック で #button の .active を 切り替え\n // Korean: 클릭 할 때 #button 의 .active 를 토글\n // Turkish: tıklama da #button ın .active i değiştir\n patterns.push(\n generateSOVEventHandlerPattern(commandSchema, profile, keyword, eventMarker, config)\n );\n\n // Patient-first SOV variants: patient before event (common in Bengali, Quechua)\n // Bengali: .active কে ক্লিক এ টগল (patient + event + verb)\n // Quechua: .highlight ta noqa man ñitiy pi yapay (patient + dest + event + verb)\n // Both orders are valid in SOV languages depending on topic/focus.\n\n // Variant 1: Simple (no destination) — higher priority\n patterns.push(\n generateSOVPatientFirstEventHandlerPattern(\n commandSchema,\n profile,\n keyword,\n eventMarker,\n config\n )\n );\n\n // Variant 2: With destination (required, not optional) — lower priority\n // Only add if destination marker differs from event marker to avoid collision\n const destMarkerCheck = profile.roleMarkers.destination;\n if (destMarkerCheck && destMarkerCheck.primary !== eventMarker.primary) {\n patterns.push(\n generateSOVPatientFirstWithDestEventHandlerPattern(\n commandSchema,\n profile,\n keyword,\n eventMarker,\n config\n )\n );\n }\n\n // For multi-word event markers with no-space alternatives (Korean compact forms),\n // also generate a pattern that accepts the compact form\n // Example: 클릭할때 .active를토글 (할때 as single token)\n const markerWords = eventMarker.primary.split(/\\s+/);\n const hasNoSpaceAlternative = eventMarker.alternatives?.some(\n alt => !alt.includes(' ') && alt.length > 1\n );\n if (markerWords.length > 1 && hasNoSpaceAlternative) {\n patterns.push(\n generateSOVCompactEventHandlerPattern(\n commandSchema,\n profile,\n keyword,\n eventMarker,\n config\n )\n );\n }\n\n // Add simple pattern (no patient required, defaults to 'me')\n // Supports: クリック で 増加 (click on increment)\n patterns.push(\n generateSOVSimpleEventHandlerPattern(commandSchema, profile, keyword, eventMarker, config)\n );\n\n // Add temporal pattern if temporalMarkers defined\n // Supports: クリック の 時 .active を 切り替え (click's time toggle .active)\n const temporalPattern = generateSOVTemporalEventHandlerPattern(\n commandSchema,\n profile,\n keyword,\n config\n );\n if (temporalPattern) {\n patterns.push(temporalPattern);\n }\n }\n } else if (profile.wordOrder === 'VSO') {\n if (hasTwoRequiredRoles) {\n // Two-role VSO pattern for put/set commands (event-first)\n // Arabic put: عند الإدخال ضع \"test\" في #output\n patterns.push(\n generateVSOTwoRoleEventHandlerPattern(commandSchema, profile, keyword, eventMarker, config)\n );\n\n // Two-role VSO verb-first variant (event handler at end)\n // Tagalog: itakda aking *background sa \"red\" kapag click\n patterns.push(\n generateVSOVerbFirstTwoRoleEventHandlerPattern(\n commandSchema,\n profile,\n keyword,\n eventMarker,\n config\n )\n );\n } else {\n // VSO: [eventMarker] [event] [verb] [patient] [على destination?]\n // Arabic: عند النقر بدّل .active على #button\n patterns.push(\n generateVSOEventHandlerPattern(commandSchema, profile, keyword, eventMarker, config)\n );\n\n // VSO verb-first variant: [verb] [patient] [eventMarker] [event]\n // Tagalog: alisin ako kapag click (remove me on click)\n // Tagalog: palitan .active kapag click (toggle .active on click)\n patterns.push(\n generateVSOVerbFirstEventHandlerPattern(\n commandSchema,\n profile,\n keyword,\n eventMarker,\n config\n )\n );\n\n // Add negated event pattern variant for languages with negation markers\n // Pattern: [eventMarker] [negation] [event] [verb] [patient]\n // Example: عند عدم التركيز أخف #tooltip = \"on blur hide #tooltip\"\n if (profile.eventHandler?.negationMarker) {\n patterns.push(\n generateVSONegatedEventHandlerPattern(\n commandSchema,\n profile,\n keyword,\n eventMarker,\n config\n )\n );\n }\n\n // Add proclitic-prefixed pattern variant for Arabic\n // Pattern: [proclitic]? [event] [verb] [patient]\n // Example: والنقر بدّل .active (and click toggle .active)\n if (profile.tokenization?.prefixes) {\n patterns.push(\n generateVSOProcliticEventHandlerPattern(commandSchema, profile, keyword, config)\n );\n }\n }\n } else {\n // SVO: Use VSO pattern structure for event handlers\n if (hasTwoRequiredRoles) {\n patterns.push(\n generateVSOTwoRoleEventHandlerPattern(commandSchema, profile, keyword, eventMarker, config)\n );\n } else {\n patterns.push(\n generateVSOEventHandlerPattern(commandSchema, profile, keyword, eventMarker, config)\n );\n }\n }\n\n return patterns;\n}\n\n// =============================================================================\n// Token Building\n// =============================================================================\n\n/**\n * Build pattern tokens based on word order.\n */\nfunction buildTokens(\n schema: CommandSchema,\n profile: LanguageProfile,\n keyword: { primary: string; alternatives?: string[] }\n): PatternToken[] {\n const tokens: PatternToken[] = [];\n\n // Get verb token\n const verbToken: PatternToken = keyword.alternatives\n ? { type: 'literal', value: keyword.primary, alternatives: keyword.alternatives }\n : { type: 'literal', value: keyword.primary };\n\n // Get role tokens sorted by position\n const roleTokens = buildRoleTokens(schema, profile);\n\n // Arrange based on word order\n switch (profile.wordOrder) {\n case 'SVO':\n // Verb first, then roles in order\n tokens.push(verbToken);\n tokens.push(...roleTokens);\n break;\n\n case 'SOV':\n // Roles first (reversed for SOV), then verb\n tokens.push(...roleTokens);\n tokens.push(verbToken);\n break;\n\n case 'VSO':\n // Verb first, then subject, then object\n tokens.push(verbToken);\n tokens.push(...roleTokens);\n break;\n\n default:\n // Default to SVO\n tokens.push(verbToken);\n tokens.push(...roleTokens);\n }\n\n return tokens;\n}\n\n/**\n * Build tokens for roles.\n */\nfunction buildRoleTokens(schema: CommandSchema, profile: LanguageProfile): PatternToken[] {\n const tokens: PatternToken[] = [];\n\n // Sort roles by position using shared utility\n const sortedRoles = sortRolesByWordOrder(schema.roles, profile.wordOrder);\n\n for (const roleSpec of sortedRoles) {\n const roleToken = buildRoleToken(roleSpec, profile);\n\n if (!roleSpec.required) {\n // Wrap optional roles in a group\n tokens.push({\n type: 'group',\n optional: true,\n tokens: roleToken,\n });\n } else {\n tokens.push(...roleToken);\n }\n }\n\n return tokens;\n}\n\n/**\n * Build token(s) for a single role.\n */\nfunction buildRoleToken(roleSpec: RoleSpec, profile: LanguageProfile): PatternToken[] {\n const tokens: PatternToken[] = [];\n\n // Check for command-specific marker override first\n const overrideMarker = roleSpec.markerOverride?.[profile.code];\n const defaultMarker = profile.roleMarkers[roleSpec.role];\n\n // Role value token\n const roleValueToken: PatternToken = {\n type: 'role',\n role: roleSpec.role,\n optional: !roleSpec.required,\n expectedTypes: roleSpec.expectedTypes,\n };\n\n // Use override marker if available, otherwise use default\n if (overrideMarker !== undefined) {\n // Command-specific marker override\n const position = defaultMarker?.position ?? 'before';\n if (position === 'before') {\n if (overrideMarker) {\n tokens.push({ type: 'literal', value: overrideMarker });\n }\n tokens.push(roleValueToken);\n } else {\n tokens.push(roleValueToken);\n if (overrideMarker) {\n tokens.push({ type: 'literal', value: overrideMarker });\n }\n }\n } else if (defaultMarker) {\n if (defaultMarker.position === 'before') {\n // Preposition: \"on #button\"\n if (defaultMarker.primary) {\n const markerToken: PatternToken = defaultMarker.alternatives\n ? {\n type: 'literal',\n value: defaultMarker.primary,\n alternatives: defaultMarker.alternatives,\n }\n : { type: 'literal', value: defaultMarker.primary };\n tokens.push(markerToken);\n }\n tokens.push(roleValueToken);\n } else {\n // Postposition/particle: \"#button に\"\n tokens.push(roleValueToken);\n const markerToken: PatternToken = defaultMarker.alternatives\n ? {\n type: 'literal',\n value: defaultMarker.primary,\n alternatives: defaultMarker.alternatives,\n }\n : { type: 'literal', value: defaultMarker.primary };\n tokens.push(markerToken);\n }\n } else {\n // No marker, just the role value\n tokens.push(roleValueToken);\n }\n\n return tokens;\n}\n\n// =============================================================================\n// Extraction Rules Building\n// =============================================================================\n\n/**\n * Build extraction rules for a pattern.\n */\nfunction buildExtractionRules(\n schema: CommandSchema,\n profile: LanguageProfile\n): Record<string, ExtractionRule> {\n const rules: Record<string, ExtractionRule> = {};\n\n for (const roleSpec of schema.roles) {\n // Check for command-specific marker override first\n const overrideMarker = roleSpec.markerOverride?.[profile.code];\n const defaultMarker = profile.roleMarkers[roleSpec.role];\n\n if (overrideMarker !== undefined) {\n // Use the override marker\n rules[roleSpec.role] = overrideMarker ? { marker: overrideMarker } : {};\n } else if (defaultMarker && defaultMarker.primary) {\n rules[roleSpec.role] = defaultMarker.alternatives\n ? { marker: defaultMarker.primary, markerAlternatives: defaultMarker.alternatives }\n : { marker: defaultMarker.primary };\n } else {\n rules[roleSpec.role] = {};\n }\n }\n\n return rules;\n}\n\n/**\n * Build extraction rules with defaults for optional roles.\n */\nfunction buildExtractionRulesWithDefaults(\n schema: CommandSchema,\n profile: LanguageProfile\n): Record<string, ExtractionRule> {\n const baseRules = buildExtractionRules(schema, profile);\n const rules: Record<string, ExtractionRule> = {};\n\n // Copy base rules and add defaults for optional roles\n for (const roleSpec of schema.roles) {\n const baseRule = baseRules[roleSpec.role] || {};\n\n if (!roleSpec.required && roleSpec.default) {\n rules[roleSpec.role] = { ...baseRule, default: roleSpec.default };\n } else {\n rules[roleSpec.role] = baseRule;\n }\n }\n\n return rules;\n}\n\n// =============================================================================\n// Format String Building\n// =============================================================================\n\n/**\n * Build a human-readable format string for documentation.\n */\nfunction buildFormatString(\n schema: CommandSchema,\n profile: LanguageProfile,\n keyword: { primary: string }\n): string {\n const parts: string[] = [];\n\n // Sort roles by position using shared utility\n const sortedRoles = sortRolesByWordOrder(schema.roles, profile.wordOrder);\n\n // Build role parts\n const roleParts = sortedRoles.map(roleSpec => {\n // Use shared marker resolution utility\n const resolved = resolveMarkerForRole(roleSpec, profile);\n let part = '';\n\n if (resolved && resolved.primary) {\n // Has a marker\n if (resolved.position === 'before') {\n part = `${resolved.primary} {${roleSpec.role}}`;\n } else {\n part = `{${roleSpec.role}} ${resolved.primary}`;\n }\n } else {\n // No marker\n part = `{${roleSpec.role}}`;\n }\n\n return roleSpec.required ? part : `[${part}]`;\n });\n\n // Arrange based on word order\n switch (profile.wordOrder) {\n case 'SVO':\n case 'VSO':\n parts.push(keyword.primary, ...roleParts);\n break;\n case 'SOV':\n parts.push(...roleParts, keyword.primary);\n break;\n default:\n parts.push(keyword.primary, ...roleParts);\n }\n\n return parts.join(' ');\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Get a summary of what patterns can be generated.\n * Note: This requires the registry to have languages registered.\n */\nexport function getGeneratorSummary(): {\n languages: string[];\n commands: string[];\n totalPatterns: number;\n} {\n const languages = registryGetLanguages();\n const commands = getDefinedSchemas().map(s => s.action);\n\n // Estimate total patterns (2 variants per command per language)\n let totalPatterns = 0;\n for (const lang of languages) {\n const profile = registryTryGetProfile(lang);\n if (profile) {\n for (const schema of getDefinedSchemas()) {\n if (profile.keywords[schema.action]) {\n totalPatterns += 2; // Full + simple variant\n }\n }\n }\n }\n\n return { languages, commands, totalPatterns };\n}\n\n/**\n * Validate that all required keywords exist for a language.\n */\nexport function validateLanguageKeywords(\n profile: LanguageProfile,\n schemas: CommandSchema[] = getDefinedSchemas()\n): { missing: string[]; available: string[] } {\n const missing: string[] = [];\n const available: string[] = [];\n\n for (const schema of schemas) {\n if (profile.keywords[schema.action]) {\n available.push(schema.action);\n } else {\n missing.push(schema.action);\n }\n }\n\n return { missing, available };\n}\n"],"mappings":"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","names":["num","getTokenizer","tokenize","tokenize","getTokenizer","tokenize","tokenize","createCommandNode","validateAllSchemas","formatValidationResults"]}