@lokascript/semantic 1.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 (435) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +686 -0
  3. package/dist/browser-ar.ar.global.js +2 -0
  4. package/dist/browser-core.core.global.js +2 -0
  5. package/dist/browser-de.de.global.js +2 -0
  6. package/dist/browser-east-asian.east-asian.global.js +2 -0
  7. package/dist/browser-en-tr.en-tr.global.js +2 -0
  8. package/dist/browser-en.en.global.js +2 -0
  9. package/dist/browser-es-en.es-en.global.js +2 -0
  10. package/dist/browser-es.es.global.js +2 -0
  11. package/dist/browser-fr.fr.global.js +2 -0
  12. package/dist/browser-id.id.global.js +2 -0
  13. package/dist/browser-ja.ja.global.js +2 -0
  14. package/dist/browser-ko.ko.global.js +2 -0
  15. package/dist/browser-lazy.lazy.global.js +2 -0
  16. package/dist/browser-priority.priority.global.js +2 -0
  17. package/dist/browser-pt.pt.global.js +2 -0
  18. package/dist/browser-qu.qu.global.js +2 -0
  19. package/dist/browser-sw.sw.global.js +2 -0
  20. package/dist/browser-tr.tr.global.js +2 -0
  21. package/dist/browser-western.western.global.js +2 -0
  22. package/dist/browser-zh.zh.global.js +2 -0
  23. package/dist/browser.global.js +3 -0
  24. package/dist/browser.global.js.map +1 -0
  25. package/dist/index.cjs +35051 -0
  26. package/dist/index.cjs.map +1 -0
  27. package/dist/index.d.cts +3426 -0
  28. package/dist/index.d.ts +3426 -0
  29. package/dist/index.js +34890 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/languages/ar.d.ts +78 -0
  32. package/dist/languages/ar.js +1622 -0
  33. package/dist/languages/ar.js.map +1 -0
  34. package/dist/languages/de.d.ts +38 -0
  35. package/dist/languages/de.js +1168 -0
  36. package/dist/languages/de.js.map +1 -0
  37. package/dist/languages/en.d.ts +44 -0
  38. package/dist/languages/en.js +3491 -0
  39. package/dist/languages/en.js.map +1 -0
  40. package/dist/languages/es.d.ts +52 -0
  41. package/dist/languages/es.js +1493 -0
  42. package/dist/languages/es.js.map +1 -0
  43. package/dist/languages/fr.d.ts +37 -0
  44. package/dist/languages/fr.js +1159 -0
  45. package/dist/languages/fr.js.map +1 -0
  46. package/dist/languages/id.d.ts +35 -0
  47. package/dist/languages/id.js +1152 -0
  48. package/dist/languages/id.js.map +1 -0
  49. package/dist/languages/ja.d.ts +53 -0
  50. package/dist/languages/ja.js +1430 -0
  51. package/dist/languages/ja.js.map +1 -0
  52. package/dist/languages/ko.d.ts +51 -0
  53. package/dist/languages/ko.js +1729 -0
  54. package/dist/languages/ko.js.map +1 -0
  55. package/dist/languages/pt.d.ts +37 -0
  56. package/dist/languages/pt.js +1127 -0
  57. package/dist/languages/pt.js.map +1 -0
  58. package/dist/languages/qu.d.ts +36 -0
  59. package/dist/languages/qu.js +1143 -0
  60. package/dist/languages/qu.js.map +1 -0
  61. package/dist/languages/sw.d.ts +35 -0
  62. package/dist/languages/sw.js +1147 -0
  63. package/dist/languages/sw.js.map +1 -0
  64. package/dist/languages/tr.d.ts +45 -0
  65. package/dist/languages/tr.js +1529 -0
  66. package/dist/languages/tr.js.map +1 -0
  67. package/dist/languages/zh.d.ts +58 -0
  68. package/dist/languages/zh.js +1257 -0
  69. package/dist/languages/zh.js.map +1 -0
  70. package/dist/types-C4dcj53L.d.ts +600 -0
  71. package/package.json +202 -0
  72. package/src/__test-utils__/index.ts +7 -0
  73. package/src/__test-utils__/test-helpers.ts +8 -0
  74. package/src/__types__/test-helpers.ts +122 -0
  75. package/src/analysis/index.ts +479 -0
  76. package/src/ast-builder/command-mappers.ts +1133 -0
  77. package/src/ast-builder/expression-parser/index.ts +41 -0
  78. package/src/ast-builder/expression-parser/parser.ts +563 -0
  79. package/src/ast-builder/expression-parser/tokenizer.ts +394 -0
  80. package/src/ast-builder/expression-parser/types.ts +208 -0
  81. package/src/ast-builder/index.ts +536 -0
  82. package/src/ast-builder/value-converters.ts +172 -0
  83. package/src/bridge.ts +275 -0
  84. package/src/browser-ar.ts +162 -0
  85. package/src/browser-core.ts +231 -0
  86. package/src/browser-de.ts +162 -0
  87. package/src/browser-east-asian.ts +173 -0
  88. package/src/browser-en-tr.ts +165 -0
  89. package/src/browser-en.ts +157 -0
  90. package/src/browser-es-en.ts +200 -0
  91. package/src/browser-es.ts +170 -0
  92. package/src/browser-fr.ts +162 -0
  93. package/src/browser-id.ts +162 -0
  94. package/src/browser-ja.ts +162 -0
  95. package/src/browser-ko.ts +162 -0
  96. package/src/browser-lazy.ts +189 -0
  97. package/src/browser-priority.ts +214 -0
  98. package/src/browser-pt.ts +162 -0
  99. package/src/browser-qu.ts +162 -0
  100. package/src/browser-sw.ts +162 -0
  101. package/src/browser-tr.ts +162 -0
  102. package/src/browser-western.ts +181 -0
  103. package/src/browser-zh.ts +162 -0
  104. package/src/browser.ts +268 -0
  105. package/src/cache/index.ts +14 -0
  106. package/src/cache/semantic-cache.ts +344 -0
  107. package/src/core-bridge.ts +372 -0
  108. package/src/explicit/converter.ts +258 -0
  109. package/src/explicit/index.ts +18 -0
  110. package/src/explicit/parser.ts +236 -0
  111. package/src/explicit/renderer.ts +424 -0
  112. package/src/generators/command-schemas.ts +1636 -0
  113. package/src/generators/event-handler-generator.ts +109 -0
  114. package/src/generators/index.ts +117 -0
  115. package/src/generators/language-profiles.ts +139 -0
  116. package/src/generators/pattern-generator.ts +537 -0
  117. package/src/generators/profiles/arabic.ts +131 -0
  118. package/src/generators/profiles/bengali.ts +132 -0
  119. package/src/generators/profiles/chinese.ts +124 -0
  120. package/src/generators/profiles/english.ts +113 -0
  121. package/src/generators/profiles/french.ts +125 -0
  122. package/src/generators/profiles/german.ts +126 -0
  123. package/src/generators/profiles/hindi.ts +146 -0
  124. package/src/generators/profiles/index.ts +46 -0
  125. package/src/generators/profiles/indonesian.ts +125 -0
  126. package/src/generators/profiles/italian.ts +139 -0
  127. package/src/generators/profiles/japanese.ts +149 -0
  128. package/src/generators/profiles/korean.ts +127 -0
  129. package/src/generators/profiles/marker-templates.ts +288 -0
  130. package/src/generators/profiles/ms.ts +130 -0
  131. package/src/generators/profiles/polish.ts +249 -0
  132. package/src/generators/profiles/portuguese.ts +115 -0
  133. package/src/generators/profiles/quechua.ts +113 -0
  134. package/src/generators/profiles/russian.ts +260 -0
  135. package/src/generators/profiles/spanish.ts +130 -0
  136. package/src/generators/profiles/swahili.ts +129 -0
  137. package/src/generators/profiles/thai.ts +132 -0
  138. package/src/generators/profiles/tl.ts +128 -0
  139. package/src/generators/profiles/turkish.ts +124 -0
  140. package/src/generators/profiles/types.ts +165 -0
  141. package/src/generators/profiles/ukrainian.ts +270 -0
  142. package/src/generators/profiles/vietnamese.ts +133 -0
  143. package/src/generators/schema-error-codes.ts +160 -0
  144. package/src/generators/schema-validator.ts +391 -0
  145. package/src/index.ts +429 -0
  146. package/src/language-building-schema.ts +3170 -0
  147. package/src/language-loader.ts +394 -0
  148. package/src/languages/_all.ts +65 -0
  149. package/src/languages/ar.ts +15 -0
  150. package/src/languages/bn.ts +16 -0
  151. package/src/languages/de.ts +15 -0
  152. package/src/languages/en.ts +29 -0
  153. package/src/languages/es.ts +15 -0
  154. package/src/languages/fr.ts +15 -0
  155. package/src/languages/hi.ts +26 -0
  156. package/src/languages/id.ts +15 -0
  157. package/src/languages/index.ts +18 -0
  158. package/src/languages/it.ts +15 -0
  159. package/src/languages/ja.ts +15 -0
  160. package/src/languages/ko.ts +15 -0
  161. package/src/languages/ms.ts +16 -0
  162. package/src/languages/pl.ts +18 -0
  163. package/src/languages/pt.ts +15 -0
  164. package/src/languages/qu.ts +15 -0
  165. package/src/languages/ru.ts +26 -0
  166. package/src/languages/sw.ts +15 -0
  167. package/src/languages/th.ts +16 -0
  168. package/src/languages/tl.ts +16 -0
  169. package/src/languages/tr.ts +15 -0
  170. package/src/languages/uk.ts +26 -0
  171. package/src/languages/vi.ts +16 -0
  172. package/src/languages/zh.ts +15 -0
  173. package/src/parser/index.ts +15 -0
  174. package/src/parser/pattern-matcher.ts +1181 -0
  175. package/src/parser/semantic-parser.ts +573 -0
  176. package/src/parser/utils/index.ts +35 -0
  177. package/src/parser/utils/marker-resolution.ts +111 -0
  178. package/src/parser/utils/possessive-keywords.ts +43 -0
  179. package/src/parser/utils/role-positioning.ts +70 -0
  180. package/src/parser/utils/type-validation.ts +134 -0
  181. package/src/patterns/add/ar.ts +71 -0
  182. package/src/patterns/add/bn.ts +70 -0
  183. package/src/patterns/add/hi.ts +69 -0
  184. package/src/patterns/add/index.ts +87 -0
  185. package/src/patterns/add/it.ts +61 -0
  186. package/src/patterns/add/ja.ts +93 -0
  187. package/src/patterns/add/ko.ts +74 -0
  188. package/src/patterns/add/ms.ts +30 -0
  189. package/src/patterns/add/pl.ts +62 -0
  190. package/src/patterns/add/ru.ts +62 -0
  191. package/src/patterns/add/th.ts +49 -0
  192. package/src/patterns/add/tl.ts +30 -0
  193. package/src/patterns/add/tr.ts +71 -0
  194. package/src/patterns/add/uk.ts +62 -0
  195. package/src/patterns/add/vi.ts +61 -0
  196. package/src/patterns/add/zh.ts +71 -0
  197. package/src/patterns/builders.ts +207 -0
  198. package/src/patterns/decrement/bn.ts +70 -0
  199. package/src/patterns/decrement/de.ts +42 -0
  200. package/src/patterns/decrement/hi.ts +68 -0
  201. package/src/patterns/decrement/index.ts +79 -0
  202. package/src/patterns/decrement/it.ts +69 -0
  203. package/src/patterns/decrement/ms.ts +30 -0
  204. package/src/patterns/decrement/pl.ts +58 -0
  205. package/src/patterns/decrement/ru.ts +58 -0
  206. package/src/patterns/decrement/th.ts +49 -0
  207. package/src/patterns/decrement/tl.ts +30 -0
  208. package/src/patterns/decrement/tr.ts +48 -0
  209. package/src/patterns/decrement/uk.ts +58 -0
  210. package/src/patterns/decrement/vi.ts +61 -0
  211. package/src/patterns/decrement/zh.ts +32 -0
  212. package/src/patterns/en.ts +302 -0
  213. package/src/patterns/event-handler/ar.ts +151 -0
  214. package/src/patterns/event-handler/bn.ts +72 -0
  215. package/src/patterns/event-handler/de.ts +117 -0
  216. package/src/patterns/event-handler/en.ts +117 -0
  217. package/src/patterns/event-handler/es.ts +136 -0
  218. package/src/patterns/event-handler/fr.ts +117 -0
  219. package/src/patterns/event-handler/hi.ts +64 -0
  220. package/src/patterns/event-handler/id.ts +117 -0
  221. package/src/patterns/event-handler/index.ts +119 -0
  222. package/src/patterns/event-handler/it.ts +54 -0
  223. package/src/patterns/event-handler/ja.ts +118 -0
  224. package/src/patterns/event-handler/ko.ts +133 -0
  225. package/src/patterns/event-handler/ms.ts +30 -0
  226. package/src/patterns/event-handler/pl.ts +62 -0
  227. package/src/patterns/event-handler/pt.ts +117 -0
  228. package/src/patterns/event-handler/qu.ts +66 -0
  229. package/src/patterns/event-handler/ru.ts +62 -0
  230. package/src/patterns/event-handler/shared.ts +270 -0
  231. package/src/patterns/event-handler/sw.ts +117 -0
  232. package/src/patterns/event-handler/th.ts +53 -0
  233. package/src/patterns/event-handler/tl.ts +30 -0
  234. package/src/patterns/event-handler/tr.ts +170 -0
  235. package/src/patterns/event-handler/uk.ts +62 -0
  236. package/src/patterns/event-handler/vi.ts +61 -0
  237. package/src/patterns/event-handler/zh.ts +150 -0
  238. package/src/patterns/get/ar.ts +49 -0
  239. package/src/patterns/get/bn.ts +47 -0
  240. package/src/patterns/get/de.ts +32 -0
  241. package/src/patterns/get/hi.ts +52 -0
  242. package/src/patterns/get/index.ts +83 -0
  243. package/src/patterns/get/it.ts +56 -0
  244. package/src/patterns/get/ja.ts +53 -0
  245. package/src/patterns/get/ko.ts +53 -0
  246. package/src/patterns/get/ms.ts +30 -0
  247. package/src/patterns/get/pl.ts +57 -0
  248. package/src/patterns/get/ru.ts +57 -0
  249. package/src/patterns/get/th.ts +29 -0
  250. package/src/patterns/get/tl.ts +30 -0
  251. package/src/patterns/get/uk.ts +57 -0
  252. package/src/patterns/get/vi.ts +48 -0
  253. package/src/patterns/grammar-transformed/index.ts +39 -0
  254. package/src/patterns/grammar-transformed/ja.ts +1713 -0
  255. package/src/patterns/grammar-transformed/ko.ts +1311 -0
  256. package/src/patterns/grammar-transformed/tr.ts +1067 -0
  257. package/src/patterns/hide/ar.ts +67 -0
  258. package/src/patterns/hide/bn.ts +47 -0
  259. package/src/patterns/hide/de.ts +36 -0
  260. package/src/patterns/hide/hi.ts +61 -0
  261. package/src/patterns/hide/index.ts +91 -0
  262. package/src/patterns/hide/it.ts +56 -0
  263. package/src/patterns/hide/ja.ts +69 -0
  264. package/src/patterns/hide/ko.ts +69 -0
  265. package/src/patterns/hide/ms.ts +30 -0
  266. package/src/patterns/hide/pl.ts +57 -0
  267. package/src/patterns/hide/ru.ts +57 -0
  268. package/src/patterns/hide/th.ts +29 -0
  269. package/src/patterns/hide/tl.ts +30 -0
  270. package/src/patterns/hide/tr.ts +65 -0
  271. package/src/patterns/hide/uk.ts +57 -0
  272. package/src/patterns/hide/vi.ts +56 -0
  273. package/src/patterns/hide/zh.ts +68 -0
  274. package/src/patterns/increment/bn.ts +70 -0
  275. package/src/patterns/increment/de.ts +36 -0
  276. package/src/patterns/increment/hi.ts +68 -0
  277. package/src/patterns/increment/index.ts +79 -0
  278. package/src/patterns/increment/it.ts +69 -0
  279. package/src/patterns/increment/ms.ts +30 -0
  280. package/src/patterns/increment/pl.ts +58 -0
  281. package/src/patterns/increment/ru.ts +58 -0
  282. package/src/patterns/increment/th.ts +49 -0
  283. package/src/patterns/increment/tl.ts +30 -0
  284. package/src/patterns/increment/tr.ts +52 -0
  285. package/src/patterns/increment/uk.ts +58 -0
  286. package/src/patterns/increment/vi.ts +61 -0
  287. package/src/patterns/increment/zh.ts +32 -0
  288. package/src/patterns/index.ts +84 -0
  289. package/src/patterns/languages/en/control-flow.ts +93 -0
  290. package/src/patterns/languages/en/fetch.ts +62 -0
  291. package/src/patterns/languages/en/index.ts +42 -0
  292. package/src/patterns/languages/en/repeat.ts +67 -0
  293. package/src/patterns/languages/en/set.ts +48 -0
  294. package/src/patterns/languages/en/swap.ts +38 -0
  295. package/src/patterns/languages/en/temporal.ts +57 -0
  296. package/src/patterns/put/ar.ts +74 -0
  297. package/src/patterns/put/bn.ts +53 -0
  298. package/src/patterns/put/en.ts +74 -0
  299. package/src/patterns/put/es.ts +74 -0
  300. package/src/patterns/put/hi.ts +69 -0
  301. package/src/patterns/put/id.ts +96 -0
  302. package/src/patterns/put/index.ts +99 -0
  303. package/src/patterns/put/it.ts +56 -0
  304. package/src/patterns/put/ja.ts +75 -0
  305. package/src/patterns/put/ko.ts +67 -0
  306. package/src/patterns/put/ms.ts +30 -0
  307. package/src/patterns/put/pl.ts +81 -0
  308. package/src/patterns/put/ru.ts +85 -0
  309. package/src/patterns/put/th.ts +32 -0
  310. package/src/patterns/put/tl.ts +30 -0
  311. package/src/patterns/put/tr.ts +67 -0
  312. package/src/patterns/put/uk.ts +85 -0
  313. package/src/patterns/put/vi.ts +72 -0
  314. package/src/patterns/put/zh.ts +62 -0
  315. package/src/patterns/registry.ts +163 -0
  316. package/src/patterns/remove/ar.ts +71 -0
  317. package/src/patterns/remove/bn.ts +68 -0
  318. package/src/patterns/remove/hi.ts +69 -0
  319. package/src/patterns/remove/index.ts +87 -0
  320. package/src/patterns/remove/it.ts +69 -0
  321. package/src/patterns/remove/ja.ts +74 -0
  322. package/src/patterns/remove/ko.ts +78 -0
  323. package/src/patterns/remove/ms.ts +30 -0
  324. package/src/patterns/remove/pl.ts +62 -0
  325. package/src/patterns/remove/ru.ts +62 -0
  326. package/src/patterns/remove/th.ts +49 -0
  327. package/src/patterns/remove/tl.ts +30 -0
  328. package/src/patterns/remove/tr.ts +78 -0
  329. package/src/patterns/remove/uk.ts +62 -0
  330. package/src/patterns/remove/vi.ts +61 -0
  331. package/src/patterns/remove/zh.ts +72 -0
  332. package/src/patterns/set/ar.ts +84 -0
  333. package/src/patterns/set/bn.ts +53 -0
  334. package/src/patterns/set/de.ts +84 -0
  335. package/src/patterns/set/es.ts +92 -0
  336. package/src/patterns/set/fr.ts +88 -0
  337. package/src/patterns/set/hi.ts +56 -0
  338. package/src/patterns/set/id.ts +84 -0
  339. package/src/patterns/set/index.ts +107 -0
  340. package/src/patterns/set/it.ts +56 -0
  341. package/src/patterns/set/ja.ts +86 -0
  342. package/src/patterns/set/ko.ts +85 -0
  343. package/src/patterns/set/ms.ts +30 -0
  344. package/src/patterns/set/pl.ts +57 -0
  345. package/src/patterns/set/pt.ts +84 -0
  346. package/src/patterns/set/ru.ts +57 -0
  347. package/src/patterns/set/th.ts +31 -0
  348. package/src/patterns/set/tl.ts +30 -0
  349. package/src/patterns/set/tr.ts +107 -0
  350. package/src/patterns/set/uk.ts +57 -0
  351. package/src/patterns/set/vi.ts +53 -0
  352. package/src/patterns/set/zh.ts +84 -0
  353. package/src/patterns/show/ar.ts +67 -0
  354. package/src/patterns/show/bn.ts +47 -0
  355. package/src/patterns/show/de.ts +32 -0
  356. package/src/patterns/show/fr.ts +32 -0
  357. package/src/patterns/show/hi.ts +61 -0
  358. package/src/patterns/show/index.ts +95 -0
  359. package/src/patterns/show/it.ts +56 -0
  360. package/src/patterns/show/ja.ts +69 -0
  361. package/src/patterns/show/ko.ts +73 -0
  362. package/src/patterns/show/ms.ts +30 -0
  363. package/src/patterns/show/pl.ts +57 -0
  364. package/src/patterns/show/ru.ts +57 -0
  365. package/src/patterns/show/th.ts +29 -0
  366. package/src/patterns/show/tl.ts +30 -0
  367. package/src/patterns/show/tr.ts +65 -0
  368. package/src/patterns/show/uk.ts +57 -0
  369. package/src/patterns/show/vi.ts +56 -0
  370. package/src/patterns/show/zh.ts +68 -0
  371. package/src/patterns/take/ar.ts +51 -0
  372. package/src/patterns/take/index.ts +31 -0
  373. package/src/patterns/toggle/ar.ts +61 -0
  374. package/src/patterns/toggle/bn.ts +70 -0
  375. package/src/patterns/toggle/en.ts +61 -0
  376. package/src/patterns/toggle/es.ts +61 -0
  377. package/src/patterns/toggle/hi.ts +80 -0
  378. package/src/patterns/toggle/index.ts +95 -0
  379. package/src/patterns/toggle/it.ts +69 -0
  380. package/src/patterns/toggle/ja.ts +156 -0
  381. package/src/patterns/toggle/ko.ts +113 -0
  382. package/src/patterns/toggle/ms.ts +30 -0
  383. package/src/patterns/toggle/pl.ts +62 -0
  384. package/src/patterns/toggle/ru.ts +62 -0
  385. package/src/patterns/toggle/th.ts +50 -0
  386. package/src/patterns/toggle/tl.ts +30 -0
  387. package/src/patterns/toggle/tr.ts +88 -0
  388. package/src/patterns/toggle/uk.ts +62 -0
  389. package/src/patterns/toggle/vi.ts +61 -0
  390. package/src/patterns/toggle/zh.ts +99 -0
  391. package/src/public-api.ts +286 -0
  392. package/src/registry.ts +441 -0
  393. package/src/tokenizers/arabic.ts +723 -0
  394. package/src/tokenizers/base.ts +1300 -0
  395. package/src/tokenizers/bengali.ts +289 -0
  396. package/src/tokenizers/chinese.ts +481 -0
  397. package/src/tokenizers/english.ts +416 -0
  398. package/src/tokenizers/french.ts +326 -0
  399. package/src/tokenizers/german.ts +324 -0
  400. package/src/tokenizers/hindi.ts +319 -0
  401. package/src/tokenizers/index.ts +127 -0
  402. package/src/tokenizers/indonesian.ts +306 -0
  403. package/src/tokenizers/italian.ts +458 -0
  404. package/src/tokenizers/japanese.ts +447 -0
  405. package/src/tokenizers/korean.ts +642 -0
  406. package/src/tokenizers/morphology/arabic-normalizer.ts +242 -0
  407. package/src/tokenizers/morphology/french-normalizer.ts +268 -0
  408. package/src/tokenizers/morphology/german-normalizer.ts +256 -0
  409. package/src/tokenizers/morphology/index.ts +46 -0
  410. package/src/tokenizers/morphology/italian-normalizer.ts +329 -0
  411. package/src/tokenizers/morphology/japanese-normalizer.ts +288 -0
  412. package/src/tokenizers/morphology/korean-normalizer.ts +428 -0
  413. package/src/tokenizers/morphology/polish-normalizer.ts +264 -0
  414. package/src/tokenizers/morphology/portuguese-normalizer.ts +310 -0
  415. package/src/tokenizers/morphology/spanish-normalizer.ts +327 -0
  416. package/src/tokenizers/morphology/turkish-normalizer.ts +412 -0
  417. package/src/tokenizers/morphology/types.ts +211 -0
  418. package/src/tokenizers/ms.ts +198 -0
  419. package/src/tokenizers/polish.ts +354 -0
  420. package/src/tokenizers/portuguese.ts +304 -0
  421. package/src/tokenizers/quechua.ts +339 -0
  422. package/src/tokenizers/russian.ts +375 -0
  423. package/src/tokenizers/spanish.ts +403 -0
  424. package/src/tokenizers/swahili.ts +303 -0
  425. package/src/tokenizers/thai.ts +236 -0
  426. package/src/tokenizers/tl.ts +198 -0
  427. package/src/tokenizers/turkish.ts +411 -0
  428. package/src/tokenizers/ukrainian.ts +369 -0
  429. package/src/tokenizers/vietnamese.ts +410 -0
  430. package/src/types/grammar-types.ts +617 -0
  431. package/src/types/unified-profile.ts +267 -0
  432. package/src/types.ts +709 -0
  433. package/src/utils/confidence-calculator.ts +147 -0
  434. package/src/validators/command-validator.ts +380 -0
  435. package/src/validators/index.ts +15 -0
@@ -0,0 +1,270 @@
1
+ /**
2
+ * Ukrainian Language Profile
3
+ *
4
+ * SVO word order, prepositions, space-separated.
5
+ * Ukrainian is a fusional language with rich verb conjugation.
6
+ * Uses infinitive form in software UI (industry standard).
7
+ */
8
+
9
+ import type { LanguageProfile } from './types';
10
+
11
+ export const ukrainianProfile: LanguageProfile = {
12
+ code: 'uk',
13
+ name: 'Ukrainian',
14
+ nativeName: 'Українська',
15
+ direction: 'ltr',
16
+ wordOrder: 'SVO',
17
+ markingStrategy: 'preposition',
18
+ usesSpaces: true,
19
+ defaultVerbForm: 'infinitive',
20
+ verb: {
21
+ position: 'start',
22
+ subjectDrop: true,
23
+ suffixes: ['ти', 'тися', 'ити', 'итися', 'ати', 'атися', 'іти', 'ітися'],
24
+ },
25
+ references: {
26
+ me: 'я',
27
+ it: 'це',
28
+ you: 'ти',
29
+ result: 'результат',
30
+ event: 'подія',
31
+ target: 'ціль',
32
+ body: 'body',
33
+ },
34
+ possessive: {
35
+ marker: '',
36
+ markerPosition: 'after-object',
37
+ usePossessiveAdjectives: true,
38
+ specialForms: {
39
+ me: 'мій',
40
+ it: 'його',
41
+ you: 'твій',
42
+ },
43
+ keywords: {
44
+ // "my" variants (masculine/feminine/neuter/plural)
45
+ мій: 'me',
46
+ моя: 'me',
47
+ моє: 'me',
48
+ мої: 'me',
49
+ // "your" variants
50
+ твій: 'you',
51
+ твоя: 'you',
52
+ твоє: 'you',
53
+ твої: 'you',
54
+ // "its/his/her" forms
55
+ його: 'it', // his/its
56
+ її: 'it', // her/its (feminine)
57
+ },
58
+ },
59
+ roleMarkers: {
60
+ destination: { primary: 'в', alternatives: ['на', 'до'], position: 'before' },
61
+ source: { primary: 'з', alternatives: ['від', 'із'], position: 'before' },
62
+ patient: { primary: '', position: 'before' },
63
+ style: { primary: 'з', alternatives: ['із'], position: 'before' },
64
+ },
65
+ keywords: {
66
+ // Class/Attribute operations (infinitive form)
67
+ toggle: {
68
+ primary: 'перемкнути',
69
+ alternatives: ['перемкни'],
70
+ normalized: 'toggle',
71
+ form: 'infinitive',
72
+ },
73
+ add: { primary: 'додати', alternatives: ['додай'], normalized: 'add', form: 'infinitive' },
74
+ remove: {
75
+ primary: 'видалити',
76
+ alternatives: ['видали', 'прибрати', 'прибери'],
77
+ normalized: 'remove',
78
+ form: 'infinitive',
79
+ },
80
+ // Content operations
81
+ put: {
82
+ primary: 'покласти',
83
+ alternatives: ['поклади', 'помістити', 'помісти', 'вставити', 'встав'],
84
+ normalized: 'put',
85
+ form: 'infinitive',
86
+ },
87
+ append: {
88
+ primary: 'додати_в_кінець',
89
+ alternatives: ['дописати'],
90
+ normalized: 'append',
91
+ form: 'infinitive',
92
+ },
93
+ prepend: { primary: 'додати_на_початок', normalized: 'prepend', form: 'infinitive' },
94
+ take: { primary: 'взяти', alternatives: ['візьми'], normalized: 'take', form: 'infinitive' },
95
+ make: { primary: 'створити', alternatives: ['створи'], normalized: 'make', form: 'infinitive' },
96
+ clone: {
97
+ primary: 'клонувати',
98
+ alternatives: ['клонуй'],
99
+ normalized: 'clone',
100
+ form: 'infinitive',
101
+ },
102
+ swap: {
103
+ primary: 'поміняти',
104
+ alternatives: ['поміняй'],
105
+ normalized: 'swap',
106
+ form: 'infinitive',
107
+ },
108
+ morph: {
109
+ primary: 'трансформувати',
110
+ alternatives: ['трансформуй'],
111
+ normalized: 'morph',
112
+ form: 'infinitive',
113
+ },
114
+ // Variable operations
115
+ set: {
116
+ primary: 'встановити',
117
+ alternatives: ['встанови', 'задати', 'задай'],
118
+ normalized: 'set',
119
+ form: 'infinitive',
120
+ },
121
+ get: { primary: 'отримати', alternatives: ['отримай'], normalized: 'get', form: 'infinitive' },
122
+ increment: {
123
+ primary: 'збільшити',
124
+ alternatives: ['збільш'],
125
+ normalized: 'increment',
126
+ form: 'infinitive',
127
+ },
128
+ decrement: {
129
+ primary: 'зменшити',
130
+ alternatives: ['зменш'],
131
+ normalized: 'decrement',
132
+ form: 'infinitive',
133
+ },
134
+ log: { primary: 'записати', alternatives: ['запиши'], normalized: 'log', form: 'infinitive' },
135
+ // Visibility
136
+ show: { primary: 'показати', alternatives: ['покажи'], normalized: 'show', form: 'infinitive' },
137
+ hide: {
138
+ primary: 'сховати',
139
+ alternatives: ['сховай', 'приховати', 'приховай'],
140
+ normalized: 'hide',
141
+ form: 'infinitive',
142
+ },
143
+ transition: {
144
+ primary: 'анімувати',
145
+ alternatives: ['анімуй'],
146
+ normalized: 'transition',
147
+ form: 'infinitive',
148
+ },
149
+ // Events
150
+ on: { primary: 'при', alternatives: ['коли'], normalized: 'on' },
151
+ trigger: {
152
+ primary: 'викликати',
153
+ alternatives: ['виклич'],
154
+ normalized: 'trigger',
155
+ form: 'infinitive',
156
+ },
157
+ send: {
158
+ primary: 'надіслати',
159
+ alternatives: ['надішли'],
160
+ normalized: 'send',
161
+ form: 'infinitive',
162
+ },
163
+ // DOM focus
164
+ focus: {
165
+ primary: 'сфокусувати',
166
+ alternatives: ['сфокусуй', 'фокус'],
167
+ normalized: 'focus',
168
+ form: 'infinitive',
169
+ },
170
+ blur: {
171
+ primary: 'розфокусувати',
172
+ alternatives: ['розфокусуй'],
173
+ normalized: 'blur',
174
+ form: 'infinitive',
175
+ },
176
+ // Navigation
177
+ go: {
178
+ primary: 'перейти',
179
+ alternatives: ['перейди', 'йти', 'йди'],
180
+ normalized: 'go',
181
+ form: 'infinitive',
182
+ },
183
+ // Async
184
+ wait: {
185
+ primary: 'чекати',
186
+ alternatives: ['чекай', 'зачекай'],
187
+ normalized: 'wait',
188
+ form: 'infinitive',
189
+ },
190
+ fetch: {
191
+ primary: 'завантажити',
192
+ alternatives: ['завантаж'],
193
+ normalized: 'fetch',
194
+ form: 'infinitive',
195
+ },
196
+ settle: { primary: 'стабілізувати', normalized: 'settle', form: 'infinitive' },
197
+ // Control flow
198
+ if: { primary: 'якщо', normalized: 'if' },
199
+ when: { primary: 'коли', normalized: 'when' },
200
+ where: { primary: 'де', normalized: 'where' },
201
+ else: { primary: 'інакше', normalized: 'else' },
202
+ repeat: {
203
+ primary: 'повторити',
204
+ alternatives: ['повтори'],
205
+ normalized: 'repeat',
206
+ form: 'infinitive',
207
+ },
208
+ for: { primary: 'для', alternatives: ['кожний'], normalized: 'for' },
209
+ while: { primary: 'поки', normalized: 'while' },
210
+ continue: {
211
+ primary: 'продовжити',
212
+ alternatives: ['продовжуй'],
213
+ normalized: 'continue',
214
+ form: 'infinitive',
215
+ },
216
+ halt: {
217
+ primary: 'зупинити',
218
+ alternatives: ['зупинись', 'стоп'],
219
+ normalized: 'halt',
220
+ form: 'infinitive',
221
+ },
222
+ throw: { primary: 'кинути', alternatives: ['кинь'], normalized: 'throw', form: 'infinitive' },
223
+ call: {
224
+ primary: 'викликати',
225
+ alternatives: ['виклич'],
226
+ normalized: 'call',
227
+ form: 'infinitive',
228
+ },
229
+ return: {
230
+ primary: 'повернути',
231
+ alternatives: ['поверни'],
232
+ normalized: 'return',
233
+ form: 'infinitive',
234
+ },
235
+ then: { primary: 'потім', alternatives: ['далі', 'тоді'], normalized: 'then' },
236
+ and: { primary: 'і', alternatives: ['та'], normalized: 'and' },
237
+ end: { primary: 'кінець', normalized: 'end' },
238
+ // Advanced
239
+ js: { primary: 'js', normalized: 'js' },
240
+ async: { primary: 'асинхронно', alternatives: ['async'], normalized: 'async' },
241
+ tell: { primary: 'сказати', alternatives: ['скажи'], normalized: 'tell', form: 'infinitive' },
242
+ default: { primary: 'за_замовчуванням', normalized: 'default' },
243
+ init: {
244
+ primary: 'ініціалізувати',
245
+ alternatives: ['ініціалізуй'],
246
+ normalized: 'init',
247
+ form: 'infinitive',
248
+ },
249
+ behavior: { primary: 'поведінка', normalized: 'behavior' },
250
+ install: { primary: 'встановити_пакет', normalized: 'install', form: 'infinitive' },
251
+ measure: {
252
+ primary: 'виміряти',
253
+ alternatives: ['виміряй'],
254
+ normalized: 'measure',
255
+ form: 'infinitive',
256
+ },
257
+ // Modifiers
258
+ into: { primary: 'в', alternatives: ['у'], normalized: 'into' },
259
+ before: { primary: 'до', alternatives: ['перед'], normalized: 'before' },
260
+ after: { primary: 'після', normalized: 'after' },
261
+ // Event modifiers
262
+ until: { primary: 'до', alternatives: ['поки_не'], normalized: 'until' },
263
+ event: { primary: 'подія', normalized: 'event' },
264
+ from: { primary: 'з', alternatives: ['від', 'із'], normalized: 'from' },
265
+ },
266
+ eventHandler: {
267
+ keyword: { primary: 'при', alternatives: ['коли'], normalized: 'on' },
268
+ sourceMarker: { primary: 'на', alternatives: ['в', 'при'], position: 'before' },
269
+ },
270
+ };
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Vietnamese Language Profile
3
+ *
4
+ * SVO word order, prepositions, space-separated.
5
+ * Vietnamese is an isolating (analytic) language with no inflection.
6
+ * Uses Latin script with extensive diacritics for tone marking.
7
+ */
8
+
9
+ import type { LanguageProfile } from './types';
10
+
11
+ export const vietnameseProfile: LanguageProfile = {
12
+ code: 'vi',
13
+ name: 'Vietnamese',
14
+ nativeName: 'Tiếng Việt',
15
+ direction: 'ltr',
16
+ wordOrder: 'SVO',
17
+ markingStrategy: 'preposition',
18
+ usesSpaces: true,
19
+ // Vietnamese uses base/dictionary form for commands
20
+ defaultVerbForm: 'base',
21
+ verb: {
22
+ position: 'start',
23
+ subjectDrop: true,
24
+ },
25
+ references: {
26
+ me: 'tôi', // "I/me"
27
+ it: 'nó', // "it"
28
+ you: 'bạn', // "you"
29
+ result: 'kết quả',
30
+ event: 'sự kiện',
31
+ target: 'mục tiêu',
32
+ body: 'body',
33
+ },
34
+ possessive: {
35
+ marker: 'của', // Vietnamese uses "của" for possession (của tôi = my)
36
+ markerPosition: 'between',
37
+ specialForms: {
38
+ me: 'của tôi', // "my"
39
+ it: 'của nó', // "its"
40
+ you: 'của bạn', // "your"
41
+ },
42
+ keywords: {
43
+ // Multi-word possessive phrases
44
+ // Note: These may require tokenizer support for multi-word recognition
45
+ 'của tôi': 'me', // my
46
+ 'của bạn': 'you', // your (informal)
47
+ 'của anh': 'you', // your (male speaker, formal)
48
+ 'của chị': 'you', // your (female speaker, formal)
49
+ 'của nó': 'it', // its
50
+ },
51
+ },
52
+ roleMarkers: {
53
+ destination: { primary: 'vào', alternatives: ['cho', 'đến'], position: 'before' },
54
+ source: { primary: 'từ', alternatives: ['khỏi'], position: 'before' },
55
+ patient: { primary: '', position: 'before' },
56
+ style: { primary: 'với', position: 'before' },
57
+ },
58
+ keywords: {
59
+ // Class/Attribute operations
60
+ toggle: { primary: 'chuyển đổi', alternatives: ['bật tắt', 'chuyển'], normalized: 'toggle' },
61
+ add: { primary: 'thêm', alternatives: ['bổ sung'], normalized: 'add' },
62
+ remove: { primary: 'xóa', alternatives: ['gỡ bỏ', 'loại bỏ', 'bỏ'], normalized: 'remove' },
63
+ // Content operations
64
+ put: { primary: 'đặt', alternatives: ['để', 'đưa'], normalized: 'put' },
65
+ append: { primary: 'nối', normalized: 'append' },
66
+ prepend: { primary: 'thêm vào đầu', normalized: 'prepend' },
67
+ take: { primary: 'lấy', normalized: 'take' },
68
+ make: { primary: 'tạo', normalized: 'make' },
69
+ clone: { primary: 'sao chép', normalized: 'clone' },
70
+ swap: { primary: 'hoán đổi', normalized: 'swap' },
71
+ morph: { primary: 'biến đổi', normalized: 'morph' },
72
+ // Variable operations
73
+ set: { primary: 'gán', alternatives: ['thiết lập', 'đặt'], normalized: 'set' },
74
+ get: { primary: 'lấy giá trị', alternatives: ['nhận', 'lấy'], normalized: 'get' },
75
+ increment: { primary: 'tăng', alternatives: ['tăng lên'], normalized: 'increment' },
76
+ decrement: { primary: 'giảm', alternatives: ['giảm đi'], normalized: 'decrement' },
77
+ log: { primary: 'in ra', normalized: 'log' },
78
+ // Visibility
79
+ show: { primary: 'hiển thị', alternatives: ['hiện'], normalized: 'show' },
80
+ hide: { primary: 'ẩn', alternatives: ['che', 'giấu'], normalized: 'hide' },
81
+ transition: { primary: 'chuyển tiếp', normalized: 'transition' },
82
+ // Events
83
+ on: { primary: 'khi', alternatives: ['lúc', 'trên'], normalized: 'on' },
84
+ trigger: { primary: 'kích hoạt', normalized: 'trigger' },
85
+ send: { primary: 'gửi', normalized: 'send' },
86
+ // DOM focus
87
+ focus: { primary: 'tập trung', normalized: 'focus' },
88
+ blur: { primary: 'mất tập trung', normalized: 'blur' },
89
+ // Navigation
90
+ go: { primary: 'đi đến', alternatives: ['đi'], normalized: 'go' },
91
+ // Async
92
+ wait: { primary: 'chờ', alternatives: ['đợi'], normalized: 'wait' },
93
+ fetch: { primary: 'tải', normalized: 'fetch' },
94
+ settle: { primary: 'ổn định', normalized: 'settle' },
95
+ // Control flow
96
+ if: { primary: 'nếu', normalized: 'if' },
97
+ when: { primary: 'khi', normalized: 'when' },
98
+ where: { primary: 'ở_đâu', normalized: 'where' },
99
+ else: { primary: 'không thì', alternatives: ['nếu không'], normalized: 'else' },
100
+ repeat: { primary: 'lặp lại', normalized: 'repeat' },
101
+ for: { primary: 'với mỗi', normalized: 'for' },
102
+ while: { primary: 'trong khi', normalized: 'while' },
103
+ continue: { primary: 'tiếp tục', normalized: 'continue' },
104
+ halt: { primary: 'dừng', alternatives: ['dừng lại'], normalized: 'halt' },
105
+ throw: { primary: 'ném', normalized: 'throw' },
106
+ call: { primary: 'gọi', normalized: 'call' },
107
+ return: { primary: 'trả về', normalized: 'return' },
108
+ then: { primary: 'rồi', alternatives: ['sau đó', 'thì'], normalized: 'then' },
109
+ and: { primary: 'và', normalized: 'and' },
110
+ end: { primary: 'kết thúc', normalized: 'end' },
111
+ // Advanced
112
+ js: { primary: 'js', normalized: 'js' },
113
+ async: { primary: 'bất đồng bộ', normalized: 'async' },
114
+ tell: { primary: 'nói với', normalized: 'tell' },
115
+ default: { primary: 'mặc định', normalized: 'default' },
116
+ init: { primary: 'khởi tạo', normalized: 'init' },
117
+ behavior: { primary: 'hành vi', normalized: 'behavior' },
118
+ install: { primary: 'cài đặt', normalized: 'install' },
119
+ measure: { primary: 'đo lường', normalized: 'measure' },
120
+ // Modifiers
121
+ into: { primary: 'vào', alternatives: ['vào trong'], normalized: 'into' },
122
+ before: { primary: 'trước', alternatives: ['trước khi'], normalized: 'before' },
123
+ after: { primary: 'sau', alternatives: ['sau khi'], normalized: 'after' },
124
+ // Event modifiers
125
+ until: { primary: 'cho đến khi', normalized: 'until' },
126
+ event: { primary: 'sự kiện', normalized: 'event' },
127
+ from: { primary: 'từ', alternatives: ['khỏi'], normalized: 'from' },
128
+ },
129
+ eventHandler: {
130
+ keyword: { primary: 'khi', alternatives: ['lúc', 'trên'], normalized: 'on' },
131
+ sourceMarker: { primary: 'trên', alternatives: ['tại'], position: 'before' },
132
+ },
133
+ };
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Schema Error Codes
3
+ *
4
+ * Provides machine-readable error codes for schema validation.
5
+ * These codes enable LLMs and tooling to programmatically identify
6
+ * and respond to specific validation issues.
7
+ */
8
+
9
+ import type { SemanticRole } from '../types';
10
+
11
+ /**
12
+ * Severity levels for schema validation items.
13
+ */
14
+ export type SchemaValidationSeverity = 'error' | 'warning' | 'note';
15
+
16
+ /**
17
+ * A structured validation item with machine-readable code.
18
+ */
19
+ export interface SchemaValidationItem {
20
+ /** Machine-readable error code */
21
+ code: string;
22
+ /** Human-readable message */
23
+ message: string;
24
+ /** Severity level */
25
+ severity: SchemaValidationSeverity;
26
+ /** Affected role, if applicable */
27
+ role?: SemanticRole;
28
+ /** Suggested fix */
29
+ suggestion?: string;
30
+ }
31
+
32
+ /**
33
+ * Schema error codes organized by category.
34
+ */
35
+ export const SchemaErrorCodes = {
36
+ // Type ambiguity issues
37
+ AMBIGUOUS_TYPE_LITERAL_SELECTOR: 'SCHEMA_AMBIGUOUS_TYPE_LITERAL_SELECTOR',
38
+ TOO_MANY_EXPECTED_TYPES: 'SCHEMA_TOO_MANY_EXPECTED_TYPES',
39
+ MULTI_TYPE_PATIENT_EXPECTED: 'SCHEMA_MULTI_TYPE_PATIENT_EXPECTED',
40
+
41
+ // Role issues
42
+ NO_REQUIRED_ROLES: 'SCHEMA_NO_REQUIRED_ROLES',
43
+ NO_REQUIRED_ROLES_EXPECTED: 'SCHEMA_NO_REQUIRED_ROLES_EXPECTED',
44
+
45
+ // Transition command
46
+ TRANSITION_PATIENT_ACCEPTS_SELECTOR: 'SCHEMA_TRANSITION_PATIENT_ACCEPTS_SELECTOR',
47
+ TRANSITION_MISSING_GOAL: 'SCHEMA_TRANSITION_MISSING_GOAL',
48
+
49
+ // Event handler command
50
+ EVENT_HANDLER_MISSING_EVENT: 'SCHEMA_EVENT_HANDLER_MISSING_EVENT',
51
+ EVENT_HANDLER_EVENT_NOT_REQUIRED: 'SCHEMA_EVENT_HANDLER_EVENT_NOT_REQUIRED',
52
+
53
+ // Conditional commands
54
+ CONDITIONAL_MISSING_CONDITION: 'SCHEMA_CONDITIONAL_MISSING_CONDITION',
55
+ CONDITIONAL_CONDITION_NOT_REQUIRED: 'SCHEMA_CONDITIONAL_CONDITION_NOT_REQUIRED',
56
+
57
+ // Loop commands
58
+ FOR_LOOP_MISSING_SOURCE: 'SCHEMA_FOR_LOOP_MISSING_SOURCE',
59
+ WHILE_LOOP_MISSING_CONDITION: 'SCHEMA_WHILE_LOOP_MISSING_CONDITION',
60
+ } as const;
61
+
62
+ export type SchemaErrorCode = (typeof SchemaErrorCodes)[keyof typeof SchemaErrorCodes];
63
+
64
+ /**
65
+ * Message templates for each error code.
66
+ * Use {role}, {command}, {count} placeholders for dynamic values.
67
+ */
68
+ export const SchemaErrorMessages: Record<SchemaErrorCode, string> = {
69
+ // Type ambiguity
70
+ [SchemaErrorCodes.AMBIGUOUS_TYPE_LITERAL_SELECTOR]:
71
+ "Role '{role}' accepts both 'literal' and 'selector'. This may cause ambiguous type inference for values starting with special characters (* . # etc.).",
72
+ [SchemaErrorCodes.TOO_MANY_EXPECTED_TYPES]:
73
+ "Role '{role}' accepts {count} different types. This may make type inference unreliable.",
74
+ [SchemaErrorCodes.MULTI_TYPE_PATIENT_EXPECTED]:
75
+ "Role '{role}' accepts multiple types (expected for {command} command).",
76
+
77
+ // Role issues
78
+ [SchemaErrorCodes.NO_REQUIRED_ROLES]: 'Command has no required roles. Is this intentional?',
79
+ [SchemaErrorCodes.NO_REQUIRED_ROLES_EXPECTED]:
80
+ 'Command has no required roles (expected for {command}).',
81
+
82
+ // Transition
83
+ [SchemaErrorCodes.TRANSITION_PATIENT_ACCEPTS_SELECTOR]:
84
+ "Transition command 'patient' role (CSS property name) should only accept 'literal', not 'selector'. CSS property names like 'background-color' are strings, not CSS selectors.",
85
+ [SchemaErrorCodes.TRANSITION_MISSING_GOAL]:
86
+ "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.",
87
+
88
+ // Event handler
89
+ [SchemaErrorCodes.EVENT_HANDLER_MISSING_EVENT]:
90
+ "Event handler command should have an 'event' role to specify which event to listen for.",
91
+ [SchemaErrorCodes.EVENT_HANDLER_EVENT_NOT_REQUIRED]:
92
+ 'Event role should be required - every event handler needs an event to listen for.',
93
+
94
+ // Conditionals
95
+ [SchemaErrorCodes.CONDITIONAL_MISSING_CONDITION]:
96
+ "Conditional command should have a 'condition' role for the boolean expression.",
97
+ [SchemaErrorCodes.CONDITIONAL_CONDITION_NOT_REQUIRED]:
98
+ 'Condition role should be required - conditionals need a condition to evaluate.',
99
+
100
+ // Loops
101
+ [SchemaErrorCodes.FOR_LOOP_MISSING_SOURCE]:
102
+ "For-loop should have a 'source' role for the collection to iterate over.",
103
+ [SchemaErrorCodes.WHILE_LOOP_MISSING_CONDITION]:
104
+ "While-loop should have a 'condition' role for the loop condition.",
105
+ };
106
+
107
+ /**
108
+ * Suggested fixes for each error code.
109
+ */
110
+ export const SchemaErrorSuggestions: Partial<Record<SchemaErrorCode, string>> = {
111
+ [SchemaErrorCodes.AMBIGUOUS_TYPE_LITERAL_SELECTOR]:
112
+ 'Consider being more specific about which type is expected, or use explicit type markers.',
113
+ [SchemaErrorCodes.TOO_MANY_EXPECTED_TYPES]:
114
+ 'Consider narrowing the accepted types to improve type inference reliability.',
115
+ [SchemaErrorCodes.TRANSITION_PATIENT_ACCEPTS_SELECTOR]:
116
+ "Remove 'selector' from expectedTypes and only accept 'literal'.",
117
+ [SchemaErrorCodes.TRANSITION_MISSING_GOAL]:
118
+ "Add a 'goal' role with expectedTypes ['literal', 'variable'].",
119
+ [SchemaErrorCodes.EVENT_HANDLER_MISSING_EVENT]:
120
+ "Add an 'event' role with expectedTypes ['literal'].",
121
+ [SchemaErrorCodes.EVENT_HANDLER_EVENT_NOT_REQUIRED]: "Set required: true on the 'event' role.",
122
+ [SchemaErrorCodes.CONDITIONAL_MISSING_CONDITION]:
123
+ "Add a 'condition' role with expectedTypes ['expression'].",
124
+ [SchemaErrorCodes.CONDITIONAL_CONDITION_NOT_REQUIRED]:
125
+ "Set required: true on the 'condition' role.",
126
+ [SchemaErrorCodes.FOR_LOOP_MISSING_SOURCE]:
127
+ "Add a 'source' role for the collection to iterate over.",
128
+ [SchemaErrorCodes.WHILE_LOOP_MISSING_CONDITION]:
129
+ "Add a 'condition' role for the loop continuation condition.",
130
+ };
131
+
132
+ /**
133
+ * Interpolate placeholders in a message template.
134
+ */
135
+ function interpolate(template: string, params: Record<string, string | number>): string {
136
+ return template.replace(/\{(\w+)\}/g, (_, key) => String(params[key] ?? `{${key}}`));
137
+ }
138
+
139
+ /**
140
+ * Create a schema validation item with proper interpolation.
141
+ */
142
+ export function createSchemaValidationItem(
143
+ code: SchemaErrorCode,
144
+ severity: SchemaValidationSeverity,
145
+ params: Record<string, string | number> = {},
146
+ role?: SemanticRole
147
+ ): SchemaValidationItem {
148
+ const messageTemplate = SchemaErrorMessages[code];
149
+ const message = interpolate(messageTemplate, params);
150
+ const suggestionTemplate = SchemaErrorSuggestions[code];
151
+ const suggestion = suggestionTemplate ? interpolate(suggestionTemplate, params) : undefined;
152
+
153
+ return {
154
+ code,
155
+ message,
156
+ severity,
157
+ ...(role && { role }),
158
+ ...(suggestion && { suggestion }),
159
+ };
160
+ }