@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,537 @@
1
+ /**
2
+ * Pattern Generator
3
+ *
4
+ * Generates LanguagePattern objects from CommandSchema + LanguageProfile.
5
+ * This solves the pattern explosion problem by deriving patterns from
6
+ * high-level definitions rather than hand-writing each one.
7
+ */
8
+
9
+ import type { LanguagePattern, PatternToken, ExtractionRule } from '../types';
10
+ import type { LanguageProfile } from './language-profiles';
11
+ import type { CommandSchema, RoleSpec } from './command-schemas';
12
+ import { getDefinedSchemas } from './command-schemas';
13
+
14
+ // Import shared utilities
15
+ import { sortRolesByWordOrder } from '../parser/utils/role-positioning';
16
+ import { resolveMarkerForRole } from '../parser/utils/marker-resolution';
17
+
18
+ // Note: languageProfiles is no longer imported here.
19
+ // Pattern generation for specific languages uses the registry instead.
20
+
21
+ // Import registry functions - this is safe because:
22
+ // 1. Registry doesn't import pattern-generator
23
+ // 2. The circular path is: pattern-generator -> registry -> pattern-generator
24
+ // But registry only uses setPatternGenerator which is exported, not module-level code
25
+ import {
26
+ getRegisteredLanguages as registryGetLanguages,
27
+ tryGetProfile as registryTryGetProfile,
28
+ } from '../registry';
29
+
30
+ function getAllRegisteredProfiles(): LanguageProfile[] {
31
+ const languages = registryGetLanguages();
32
+ return languages
33
+ .map((lang: string) => registryTryGetProfile(lang))
34
+ .filter((p): p is LanguageProfile => p !== undefined);
35
+ }
36
+
37
+ // =============================================================================
38
+ // Pattern Generator
39
+ // =============================================================================
40
+
41
+ /**
42
+ * Configuration for pattern generation.
43
+ */
44
+ export interface GeneratorConfig {
45
+ /** Base priority for generated patterns (higher = checked first) */
46
+ basePriority?: number;
47
+ /** Whether to generate simple patterns (without optional roles) */
48
+ generateSimpleVariants?: boolean;
49
+ /** Whether to generate alternative keyword patterns */
50
+ generateAlternatives?: boolean;
51
+ }
52
+
53
+ const defaultConfig: GeneratorConfig = {
54
+ basePriority: 100,
55
+ generateSimpleVariants: true,
56
+ generateAlternatives: true,
57
+ };
58
+
59
+ /**
60
+ * Generate a pattern for a command in a specific language.
61
+ */
62
+ export function generatePattern(
63
+ schema: CommandSchema,
64
+ profile: LanguageProfile,
65
+ config: GeneratorConfig = defaultConfig
66
+ ): LanguagePattern {
67
+ const id = `${schema.action}-${profile.code}-generated`;
68
+ const priority = config.basePriority ?? 100;
69
+
70
+ // Get keyword translation
71
+ const keyword = profile.keywords[schema.action];
72
+ if (!keyword) {
73
+ throw new Error(`No keyword translation for '${schema.action}' in ${profile.code}`);
74
+ }
75
+
76
+ // Build tokens based on word order
77
+ const tokens = buildTokens(schema, profile, keyword);
78
+
79
+ // Build extraction rules with defaults for optional roles
80
+ // This ensures defaults are applied even when optional groups don't match
81
+ const extraction = buildExtractionRulesWithDefaults(schema, profile);
82
+
83
+ // Build template format string (for documentation)
84
+ const format = buildFormatString(schema, profile, keyword);
85
+
86
+ return {
87
+ id,
88
+ language: profile.code,
89
+ command: schema.action,
90
+ priority,
91
+ template: {
92
+ format,
93
+ tokens,
94
+ },
95
+ extraction,
96
+ };
97
+ }
98
+
99
+ /**
100
+ * Generate a simple variant pattern (without optional roles).
101
+ */
102
+ export function generateSimplePattern(
103
+ schema: CommandSchema,
104
+ profile: LanguageProfile,
105
+ config: GeneratorConfig = defaultConfig
106
+ ): LanguagePattern | null {
107
+ // Only generate simple variant if there are optional roles
108
+ const optionalRoles = schema.roles.filter(r => !r.required);
109
+ if (optionalRoles.length === 0) {
110
+ return null;
111
+ }
112
+
113
+ const requiredRoles = schema.roles.filter(r => r.required);
114
+ const simpleSchema: CommandSchema = {
115
+ ...schema,
116
+ roles: requiredRoles,
117
+ };
118
+
119
+ const pattern = generatePattern(simpleSchema, profile, config);
120
+
121
+ // Adjust for simple variant
122
+ return {
123
+ ...pattern,
124
+ id: `${schema.action}-${profile.code}-simple`,
125
+ priority: (config.basePriority ?? 100) - 5, // Lower priority than full pattern (was -10)
126
+ extraction: buildExtractionRulesWithDefaults(schema, profile),
127
+ };
128
+ }
129
+
130
+ /**
131
+ * Generate all pattern variants for a command in a language.
132
+ */
133
+ export function generatePatternVariants(
134
+ schema: CommandSchema,
135
+ profile: LanguageProfile,
136
+ config: GeneratorConfig = defaultConfig
137
+ ): LanguagePattern[] {
138
+ const patterns: LanguagePattern[] = [];
139
+
140
+ // Main pattern
141
+ patterns.push(generatePattern(schema, profile, config));
142
+
143
+ // Simple variant (without optional roles)
144
+ if (config.generateSimpleVariants) {
145
+ const simple = generateSimplePattern(schema, profile, config);
146
+ if (simple) {
147
+ patterns.push(simple);
148
+ }
149
+ }
150
+
151
+ return patterns;
152
+ }
153
+
154
+ /**
155
+ * Generate patterns for all commands in a specific language.
156
+ */
157
+ export function generatePatternsForLanguage(
158
+ profile: LanguageProfile,
159
+ config: GeneratorConfig = defaultConfig
160
+ ): LanguagePattern[] {
161
+ const patterns: LanguagePattern[] = [];
162
+ const schemas = getDefinedSchemas();
163
+
164
+ for (const schema of schemas) {
165
+ // Skip if no keyword translation exists
166
+ if (!profile.keywords[schema.action]) {
167
+ continue;
168
+ }
169
+
170
+ const variants = generatePatternVariants(schema, profile, config);
171
+ patterns.push(...variants);
172
+ }
173
+
174
+ return patterns;
175
+ }
176
+
177
+ /**
178
+ * Generate patterns for a command across specified profiles.
179
+ *
180
+ * @param schema Command schema to generate patterns for
181
+ * @param profiles Array of language profiles to generate patterns for (defaults to all registered)
182
+ * @param config Generator configuration
183
+ */
184
+ export function generatePatternsForCommand(
185
+ schema: CommandSchema,
186
+ profiles?: LanguageProfile[],
187
+ config: GeneratorConfig = defaultConfig
188
+ ): LanguagePattern[] {
189
+ const patterns: LanguagePattern[] = [];
190
+
191
+ // If no profiles provided, use all registered profiles
192
+ const profilesToUse = profiles ?? getAllRegisteredProfiles();
193
+
194
+ for (const profile of profilesToUse) {
195
+ // Skip if no keyword translation exists
196
+ if (!profile.keywords[schema.action]) {
197
+ continue;
198
+ }
199
+
200
+ const variants = generatePatternVariants(schema, profile, config);
201
+ patterns.push(...variants);
202
+ }
203
+
204
+ return patterns;
205
+ }
206
+
207
+ /**
208
+ * Generate all patterns for all commands across specified profiles.
209
+ *
210
+ * @param profiles Array of language profiles to generate patterns for (defaults to all registered)
211
+ * @param config Generator configuration
212
+ */
213
+ export function generateAllPatterns(
214
+ profiles?: LanguageProfile[],
215
+ config: GeneratorConfig = defaultConfig
216
+ ): LanguagePattern[] {
217
+ const patterns: LanguagePattern[] = [];
218
+
219
+ // If no profiles provided, use all registered profiles
220
+ const profilesToUse = profiles ?? getAllRegisteredProfiles();
221
+
222
+ for (const profile of profilesToUse) {
223
+ const langPatterns = generatePatternsForLanguage(profile, config);
224
+ patterns.push(...langPatterns);
225
+ }
226
+
227
+ return patterns;
228
+ }
229
+
230
+ // =============================================================================
231
+ // Token Building
232
+ // =============================================================================
233
+
234
+ /**
235
+ * Build pattern tokens based on word order.
236
+ */
237
+ function buildTokens(
238
+ schema: CommandSchema,
239
+ profile: LanguageProfile,
240
+ keyword: { primary: string; alternatives?: string[] }
241
+ ): PatternToken[] {
242
+ const tokens: PatternToken[] = [];
243
+
244
+ // Get verb token
245
+ const verbToken: PatternToken = keyword.alternatives
246
+ ? { type: 'literal', value: keyword.primary, alternatives: keyword.alternatives }
247
+ : { type: 'literal', value: keyword.primary };
248
+
249
+ // Get role tokens sorted by position
250
+ const roleTokens = buildRoleTokens(schema, profile);
251
+
252
+ // Arrange based on word order
253
+ switch (profile.wordOrder) {
254
+ case 'SVO':
255
+ // Verb first, then roles in order
256
+ tokens.push(verbToken);
257
+ tokens.push(...roleTokens);
258
+ break;
259
+
260
+ case 'SOV':
261
+ // Roles first (reversed for SOV), then verb
262
+ tokens.push(...roleTokens);
263
+ tokens.push(verbToken);
264
+ break;
265
+
266
+ case 'VSO':
267
+ // Verb first, then subject, then object
268
+ tokens.push(verbToken);
269
+ tokens.push(...roleTokens);
270
+ break;
271
+
272
+ default:
273
+ // Default to SVO
274
+ tokens.push(verbToken);
275
+ tokens.push(...roleTokens);
276
+ }
277
+
278
+ return tokens;
279
+ }
280
+
281
+ /**
282
+ * Build tokens for roles.
283
+ */
284
+ function buildRoleTokens(schema: CommandSchema, profile: LanguageProfile): PatternToken[] {
285
+ const tokens: PatternToken[] = [];
286
+
287
+ // Sort roles by position using shared utility
288
+ const sortedRoles = sortRolesByWordOrder(schema.roles, profile.wordOrder);
289
+
290
+ for (const roleSpec of sortedRoles) {
291
+ const roleToken = buildRoleToken(roleSpec, profile);
292
+
293
+ if (!roleSpec.required) {
294
+ // Wrap optional roles in a group
295
+ tokens.push({
296
+ type: 'group',
297
+ optional: true,
298
+ tokens: roleToken,
299
+ });
300
+ } else {
301
+ tokens.push(...roleToken);
302
+ }
303
+ }
304
+
305
+ return tokens;
306
+ }
307
+
308
+ /**
309
+ * Build token(s) for a single role.
310
+ */
311
+ function buildRoleToken(roleSpec: RoleSpec, profile: LanguageProfile): PatternToken[] {
312
+ const tokens: PatternToken[] = [];
313
+
314
+ // Check for command-specific marker override first
315
+ const overrideMarker = roleSpec.markerOverride?.[profile.code];
316
+ const defaultMarker = profile.roleMarkers[roleSpec.role];
317
+
318
+ // Role value token
319
+ const roleValueToken: PatternToken = {
320
+ type: 'role',
321
+ role: roleSpec.role,
322
+ optional: !roleSpec.required,
323
+ expectedTypes: roleSpec.expectedTypes as any,
324
+ };
325
+
326
+ // Use override marker if available, otherwise use default
327
+ if (overrideMarker !== undefined) {
328
+ // Command-specific marker override
329
+ const position = defaultMarker?.position ?? 'before';
330
+ if (position === 'before') {
331
+ if (overrideMarker) {
332
+ tokens.push({ type: 'literal', value: overrideMarker });
333
+ }
334
+ tokens.push(roleValueToken);
335
+ } else {
336
+ tokens.push(roleValueToken);
337
+ if (overrideMarker) {
338
+ tokens.push({ type: 'literal', value: overrideMarker });
339
+ }
340
+ }
341
+ } else if (defaultMarker) {
342
+ if (defaultMarker.position === 'before') {
343
+ // Preposition: "on #button"
344
+ if (defaultMarker.primary) {
345
+ const markerToken: PatternToken = defaultMarker.alternatives
346
+ ? {
347
+ type: 'literal',
348
+ value: defaultMarker.primary,
349
+ alternatives: defaultMarker.alternatives,
350
+ }
351
+ : { type: 'literal', value: defaultMarker.primary };
352
+ tokens.push(markerToken);
353
+ }
354
+ tokens.push(roleValueToken);
355
+ } else {
356
+ // Postposition/particle: "#button に"
357
+ tokens.push(roleValueToken);
358
+ const markerToken: PatternToken = defaultMarker.alternatives
359
+ ? {
360
+ type: 'literal',
361
+ value: defaultMarker.primary,
362
+ alternatives: defaultMarker.alternatives,
363
+ }
364
+ : { type: 'literal', value: defaultMarker.primary };
365
+ tokens.push(markerToken);
366
+ }
367
+ } else {
368
+ // No marker, just the role value
369
+ tokens.push(roleValueToken);
370
+ }
371
+
372
+ return tokens;
373
+ }
374
+
375
+ // =============================================================================
376
+ // Extraction Rules Building
377
+ // =============================================================================
378
+
379
+ /**
380
+ * Build extraction rules for a pattern.
381
+ */
382
+ function buildExtractionRules(
383
+ schema: CommandSchema,
384
+ profile: LanguageProfile
385
+ ): Record<string, ExtractionRule> {
386
+ const rules: Record<string, ExtractionRule> = {};
387
+
388
+ for (const roleSpec of schema.roles) {
389
+ // Check for command-specific marker override first
390
+ const overrideMarker = roleSpec.markerOverride?.[profile.code];
391
+ const defaultMarker = profile.roleMarkers[roleSpec.role];
392
+
393
+ if (overrideMarker !== undefined) {
394
+ // Use the override marker
395
+ rules[roleSpec.role] = overrideMarker ? { marker: overrideMarker } : {};
396
+ } else if (defaultMarker && defaultMarker.primary) {
397
+ rules[roleSpec.role] = defaultMarker.alternatives
398
+ ? { marker: defaultMarker.primary, markerAlternatives: defaultMarker.alternatives }
399
+ : { marker: defaultMarker.primary };
400
+ } else {
401
+ rules[roleSpec.role] = {};
402
+ }
403
+ }
404
+
405
+ return rules;
406
+ }
407
+
408
+ /**
409
+ * Build extraction rules with defaults for optional roles.
410
+ */
411
+ function buildExtractionRulesWithDefaults(
412
+ schema: CommandSchema,
413
+ profile: LanguageProfile
414
+ ): Record<string, ExtractionRule> {
415
+ const baseRules = buildExtractionRules(schema, profile);
416
+ const rules: Record<string, ExtractionRule> = {};
417
+
418
+ // Copy base rules and add defaults for optional roles
419
+ for (const roleSpec of schema.roles) {
420
+ const baseRule = baseRules[roleSpec.role] || {};
421
+
422
+ if (!roleSpec.required && roleSpec.default) {
423
+ rules[roleSpec.role] = { ...baseRule, default: roleSpec.default };
424
+ } else {
425
+ rules[roleSpec.role] = baseRule;
426
+ }
427
+ }
428
+
429
+ return rules;
430
+ }
431
+
432
+ // =============================================================================
433
+ // Format String Building
434
+ // =============================================================================
435
+
436
+ /**
437
+ * Build a human-readable format string for documentation.
438
+ */
439
+ function buildFormatString(
440
+ schema: CommandSchema,
441
+ profile: LanguageProfile,
442
+ keyword: { primary: string }
443
+ ): string {
444
+ const parts: string[] = [];
445
+
446
+ // Sort roles by position using shared utility
447
+ const sortedRoles = sortRolesByWordOrder(schema.roles, profile.wordOrder);
448
+
449
+ // Build role parts
450
+ const roleParts = sortedRoles.map(roleSpec => {
451
+ // Use shared marker resolution utility
452
+ const resolved = resolveMarkerForRole(roleSpec, profile);
453
+ let part = '';
454
+
455
+ if (resolved && resolved.primary) {
456
+ // Has a marker
457
+ if (resolved.position === 'before') {
458
+ part = `${resolved.primary} {${roleSpec.role}}`;
459
+ } else {
460
+ part = `{${roleSpec.role}} ${resolved.primary}`;
461
+ }
462
+ } else {
463
+ // No marker
464
+ part = `{${roleSpec.role}}`;
465
+ }
466
+
467
+ return roleSpec.required ? part : `[${part}]`;
468
+ });
469
+
470
+ // Arrange based on word order
471
+ switch (profile.wordOrder) {
472
+ case 'SVO':
473
+ case 'VSO':
474
+ parts.push(keyword.primary, ...roleParts);
475
+ break;
476
+ case 'SOV':
477
+ parts.push(...roleParts, keyword.primary);
478
+ break;
479
+ default:
480
+ parts.push(keyword.primary, ...roleParts);
481
+ }
482
+
483
+ return parts.join(' ');
484
+ }
485
+
486
+ // =============================================================================
487
+ // Utility Functions
488
+ // =============================================================================
489
+
490
+ /**
491
+ * Get a summary of what patterns can be generated.
492
+ * Note: This requires the registry to have languages registered.
493
+ */
494
+ export function getGeneratorSummary(): {
495
+ languages: string[];
496
+ commands: string[];
497
+ totalPatterns: number;
498
+ } {
499
+ const languages = registryGetLanguages();
500
+ const commands = getDefinedSchemas().map(s => s.action);
501
+
502
+ // Estimate total patterns (2 variants per command per language)
503
+ let totalPatterns = 0;
504
+ for (const lang of languages) {
505
+ const profile = registryTryGetProfile(lang);
506
+ if (profile) {
507
+ for (const schema of getDefinedSchemas()) {
508
+ if (profile.keywords[schema.action]) {
509
+ totalPatterns += 2; // Full + simple variant
510
+ }
511
+ }
512
+ }
513
+ }
514
+
515
+ return { languages, commands, totalPatterns };
516
+ }
517
+
518
+ /**
519
+ * Validate that all required keywords exist for a language.
520
+ */
521
+ export function validateLanguageKeywords(
522
+ profile: LanguageProfile,
523
+ schemas: CommandSchema[] = getDefinedSchemas()
524
+ ): { missing: string[]; available: string[] } {
525
+ const missing: string[] = [];
526
+ const available: string[] = [];
527
+
528
+ for (const schema of schemas) {
529
+ if (profile.keywords[schema.action]) {
530
+ available.push(schema.action);
531
+ } else {
532
+ missing.push(schema.action);
533
+ }
534
+ }
535
+
536
+ return { missing, available };
537
+ }
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Arabic Language Profile
3
+ *
4
+ * VSO word order, prepositions, RTL (right-to-left), space-separated.
5
+ * Features root-based morphology and rich verb conjugation.
6
+ */
7
+
8
+ import type { LanguageProfile } from './types';
9
+
10
+ export const arabicProfile: LanguageProfile = {
11
+ code: 'ar',
12
+ name: 'Arabic',
13
+ nativeName: 'العربية',
14
+ direction: 'rtl',
15
+ wordOrder: 'VSO',
16
+ markingStrategy: 'preposition',
17
+ usesSpaces: true,
18
+ verb: {
19
+ position: 'start',
20
+ subjectDrop: true,
21
+ },
22
+ references: {
23
+ me: 'أنا', // "I/me" - first person
24
+ it: 'هو', // "it" (masculine)
25
+ you: 'أنت', // "you"
26
+ result: 'النتيجة',
27
+ event: 'الحدث',
28
+ target: 'الهدف',
29
+ body: 'الجسم',
30
+ },
31
+ possessive: {
32
+ marker: '', // No explicit marker - uses possessive pronouns
33
+ markerPosition: 'after-object',
34
+ usePossessiveAdjectives: true,
35
+ specialForms: {
36
+ // Arabic: "value لي" (value for-me) - possessive pronoun follows property
37
+ me: 'لي', // "for me" / "mine"
38
+ it: 'له', // "for it" / "its"
39
+ you: 'لك', // "for you" / "yours"
40
+ },
41
+ keywords: {
42
+ // "my" / "mine"
43
+ لي: 'me',
44
+ // "your" / "yours"
45
+ لك: 'you',
46
+ // "its/his/her"
47
+ له: 'it', // his/its (masculine)
48
+ لها: 'it', // her/its (feminine)
49
+ },
50
+ },
51
+ roleMarkers: {
52
+ destination: { primary: 'على', alternatives: ['في', 'إلى', 'ب'], position: 'before' },
53
+ source: { primary: 'من', position: 'before' },
54
+ patient: { primary: '', position: 'before' },
55
+ style: { primary: 'بـ', alternatives: ['باستخدام'], position: 'before' },
56
+ },
57
+ keywords: {
58
+ // Class/Attribute operations
59
+ toggle: { primary: 'بدّل', alternatives: ['بدل', 'غيّر', 'غير'], normalized: 'toggle' },
60
+ add: { primary: 'أضف', alternatives: ['اضف', 'زِد'], normalized: 'add' },
61
+ remove: { primary: 'احذف', alternatives: ['أزل', 'امسح'], normalized: 'remove' },
62
+ // Content operations
63
+ put: { primary: 'ضع', alternatives: ['اجعل'], normalized: 'put' },
64
+ append: { primary: 'ألحق', normalized: 'append' },
65
+ prepend: { primary: 'سبق', normalized: 'prepend' },
66
+ take: { primary: 'خذ', alternatives: ['احصل'], normalized: 'take' },
67
+ make: { primary: 'اصنع', alternatives: ['أنشئ'], normalized: 'make' },
68
+ clone: { primary: 'استنسخ', alternatives: ['انسخ'], normalized: 'clone' },
69
+ swap: { primary: 'استبدل', alternatives: ['تبادل'], normalized: 'swap' },
70
+ morph: { primary: 'حوّل', alternatives: ['غيّر'], normalized: 'morph' },
71
+ // Variable operations
72
+ set: { primary: 'اضبط', alternatives: ['عيّن', 'حدد'], normalized: 'set' },
73
+ get: { primary: 'احصل', alternatives: ['خذ'], normalized: 'get' },
74
+ increment: { primary: 'زِد', alternatives: ['زد', 'ارفع'], normalized: 'increment' },
75
+ decrement: { primary: 'أنقص', alternatives: ['انقص', 'قلل'], normalized: 'decrement' },
76
+ log: { primary: 'سجل', normalized: 'log' },
77
+ // Visibility
78
+ show: { primary: 'اظهر', alternatives: ['أظهر', 'اعرض'], normalized: 'show' },
79
+ hide: { primary: 'اخف', alternatives: ['أخفِ', 'اخفي'], normalized: 'hide' },
80
+ transition: { primary: 'انتقال', alternatives: ['انتقل'], normalized: 'transition' },
81
+ // Events
82
+ on: { primary: 'على', alternatives: ['عند', 'لدى', 'حين'], normalized: 'on' },
83
+ trigger: { primary: 'تشغيل', alternatives: ['أطلق', 'فعّل'], normalized: 'trigger' },
84
+ send: { primary: 'أرسل', normalized: 'send' },
85
+ // DOM focus
86
+ focus: { primary: 'تركيز', alternatives: ['ركز'], normalized: 'focus' },
87
+ blur: { primary: 'ضبابية', alternatives: ['شوش'], normalized: 'blur' },
88
+ // Navigation
89
+ go: { primary: 'اذهب', alternatives: ['انتقل'], normalized: 'go' },
90
+ // Async
91
+ wait: { primary: 'انتظر', normalized: 'wait' },
92
+ fetch: { primary: 'احضر', alternatives: ['جلب'], normalized: 'fetch' },
93
+ settle: { primary: 'استقر', normalized: 'settle' },
94
+ // Control flow
95
+ if: { primary: 'إذا', normalized: 'if' },
96
+ when: { primary: 'عندما', normalized: 'when' },
97
+ where: { primary: 'أين', normalized: 'where' },
98
+ else: { primary: 'وإلا', alternatives: ['خلاف ذلك'], normalized: 'else' },
99
+ repeat: { primary: 'كرر', normalized: 'repeat' },
100
+ for: { primary: 'لكل', normalized: 'for' },
101
+ while: { primary: 'بينما', normalized: 'while' },
102
+ continue: { primary: 'واصل', normalized: 'continue' },
103
+ halt: { primary: 'أوقف', alternatives: ['توقف'], normalized: 'halt' },
104
+ throw: { primary: 'ارم', alternatives: ['ارمِ'], normalized: 'throw' },
105
+ call: { primary: 'استدع', alternatives: ['نادِ'], normalized: 'call' },
106
+ return: { primary: 'ارجع', alternatives: ['عُد'], normalized: 'return' },
107
+ then: { primary: 'ثم', alternatives: ['بعدها', 'ثمّ'], normalized: 'then' },
108
+ and: { primary: 'وأيضاً', alternatives: ['أيضاً'], normalized: 'and' },
109
+ end: { primary: 'نهاية', alternatives: ['انتهى', 'آخر'], normalized: 'end' },
110
+ // Advanced
111
+ js: { primary: 'جافاسكربت', alternatives: ['js'], normalized: 'js' },
112
+ async: { primary: 'متزامن', normalized: 'async' },
113
+ tell: { primary: 'أخبر', normalized: 'tell' },
114
+ default: { primary: 'افتراضي', normalized: 'default' },
115
+ init: { primary: 'تهيئة', alternatives: ['بدء'], normalized: 'init' },
116
+ behavior: { primary: 'سلوك', normalized: 'behavior' },
117
+ install: { primary: 'تثبيت', alternatives: ['ثبّت'], normalized: 'install' },
118
+ measure: { primary: 'قياس', alternatives: ['قِس'], normalized: 'measure' },
119
+ // Modifiers
120
+ into: { primary: 'في', alternatives: ['إلى'], normalized: 'into' },
121
+ before: { primary: 'قبل', normalized: 'before' },
122
+ after: { primary: 'بعد', normalized: 'after' },
123
+ // Event modifiers (for repeat until event)
124
+ until: { primary: 'حتى', normalized: 'until' },
125
+ event: { primary: 'حدث', normalized: 'event' },
126
+ from: { primary: 'من', normalized: 'from' },
127
+ },
128
+ tokenization: {
129
+ prefixes: ['ال', 'و', 'ف', 'ب', 'ك', 'ل'],
130
+ },
131
+ };