marlarky 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 (274) hide show
  1. package/README.md +489 -0
  2. package/dist/adapters/faker-js-adapter.d.ts +44 -0
  3. package/dist/adapters/faker-js-adapter.d.ts.map +1 -0
  4. package/dist/adapters/faker-js-adapter.js +46 -0
  5. package/dist/adapters/faker-js-adapter.js.map +1 -0
  6. package/dist/adapters/index.d.ts +3 -0
  7. package/dist/adapters/index.d.ts.map +1 -0
  8. package/dist/adapters/index.js +3 -0
  9. package/dist/adapters/index.js.map +1 -0
  10. package/dist/adapters/simple-faker-adapter.d.ts +22 -0
  11. package/dist/adapters/simple-faker-adapter.d.ts.map +1 -0
  12. package/dist/adapters/simple-faker-adapter.js +54 -0
  13. package/dist/adapters/simple-faker-adapter.js.map +1 -0
  14. package/dist/cli.d.ts +7 -0
  15. package/dist/cli.d.ts.map +1 -0
  16. package/dist/cli.js +588 -0
  17. package/dist/cli.js.map +1 -0
  18. package/dist/defaults/index.d.ts +2 -0
  19. package/dist/defaults/index.d.ts.map +1 -0
  20. package/dist/defaults/index.js +2 -0
  21. package/dist/defaults/index.js.map +1 -0
  22. package/dist/defaults/word-lists.d.ts +22 -0
  23. package/dist/defaults/word-lists.d.ts.map +1 -0
  24. package/dist/defaults/word-lists.js +124 -0
  25. package/dist/defaults/word-lists.js.map +1 -0
  26. package/dist/generator/index.d.ts +2 -0
  27. package/dist/generator/index.d.ts.map +1 -0
  28. package/dist/generator/index.js +2 -0
  29. package/dist/generator/index.js.map +1 -0
  30. package/dist/generator/text-generator.d.ts +93 -0
  31. package/dist/generator/text-generator.d.ts.map +1 -0
  32. package/dist/generator/text-generator.js +411 -0
  33. package/dist/generator/text-generator.js.map +1 -0
  34. package/dist/generator/text-generator.test.d.ts +2 -0
  35. package/dist/generator/text-generator.test.d.ts.map +1 -0
  36. package/dist/generator/text-generator.test.js +151 -0
  37. package/dist/generator/text-generator.test.js.map +1 -0
  38. package/dist/grammar/index.d.ts +5 -0
  39. package/dist/grammar/index.d.ts.map +1 -0
  40. package/dist/grammar/index.js +3 -0
  41. package/dist/grammar/index.js.map +1 -0
  42. package/dist/grammar/phrase-builders.d.ts +72 -0
  43. package/dist/grammar/phrase-builders.d.ts.map +1 -0
  44. package/dist/grammar/phrase-builders.js +241 -0
  45. package/dist/grammar/phrase-builders.js.map +1 -0
  46. package/dist/grammar/sentence-templates.d.ts +67 -0
  47. package/dist/grammar/sentence-templates.d.ts.map +1 -0
  48. package/dist/grammar/sentence-templates.js +272 -0
  49. package/dist/grammar/sentence-templates.js.map +1 -0
  50. package/dist/index.d.ts +17 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +40 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/interfaces/faker-adapter.d.ts +25 -0
  55. package/dist/interfaces/faker-adapter.d.ts.map +1 -0
  56. package/dist/interfaces/faker-adapter.js +2 -0
  57. package/dist/interfaces/faker-adapter.js.map +1 -0
  58. package/dist/interfaces/index.d.ts +4 -0
  59. package/dist/interfaces/index.d.ts.map +1 -0
  60. package/dist/interfaces/index.js +2 -0
  61. package/dist/interfaces/index.js.map +1 -0
  62. package/dist/interfaces/lexicon-store.d.ts +39 -0
  63. package/dist/interfaces/lexicon-store.d.ts.map +1 -0
  64. package/dist/interfaces/lexicon-store.js +2 -0
  65. package/dist/interfaces/lexicon-store.js.map +1 -0
  66. package/dist/interfaces/rng.d.ts +25 -0
  67. package/dist/interfaces/rng.d.ts.map +1 -0
  68. package/dist/interfaces/rng.js +2 -0
  69. package/dist/interfaces/rng.js.map +1 -0
  70. package/dist/lexicon/index.d.ts +4 -0
  71. package/dist/lexicon/index.d.ts.map +1 -0
  72. package/dist/lexicon/index.js +4 -0
  73. package/dist/lexicon/index.js.map +1 -0
  74. package/dist/lexicon/loader.d.ts +24 -0
  75. package/dist/lexicon/loader.d.ts.map +1 -0
  76. package/dist/lexicon/loader.js +47 -0
  77. package/dist/lexicon/loader.js.map +1 -0
  78. package/dist/lexicon/store.d.ts +39 -0
  79. package/dist/lexicon/store.d.ts.map +1 -0
  80. package/dist/lexicon/store.js +291 -0
  81. package/dist/lexicon/store.js.map +1 -0
  82. package/dist/lexicon/validator.d.ts +10 -0
  83. package/dist/lexicon/validator.d.ts.map +1 -0
  84. package/dist/lexicon/validator.js +273 -0
  85. package/dist/lexicon/validator.js.map +1 -0
  86. package/dist/morphology/articles.d.ts +17 -0
  87. package/dist/morphology/articles.d.ts.map +1 -0
  88. package/dist/morphology/articles.js +66 -0
  89. package/dist/morphology/articles.js.map +1 -0
  90. package/dist/morphology/articles.test.d.ts +2 -0
  91. package/dist/morphology/articles.test.d.ts.map +1 -0
  92. package/dist/morphology/articles.test.js +56 -0
  93. package/dist/morphology/articles.test.js.map +1 -0
  94. package/dist/morphology/conjugate.d.ts +46 -0
  95. package/dist/morphology/conjugate.d.ts.map +1 -0
  96. package/dist/morphology/conjugate.js +337 -0
  97. package/dist/morphology/conjugate.js.map +1 -0
  98. package/dist/morphology/conjugate.test.d.ts +2 -0
  99. package/dist/morphology/conjugate.test.d.ts.map +1 -0
  100. package/dist/morphology/conjugate.test.js +168 -0
  101. package/dist/morphology/conjugate.test.js.map +1 -0
  102. package/dist/morphology/index.d.ts +6 -0
  103. package/dist/morphology/index.d.ts.map +1 -0
  104. package/dist/morphology/index.js +9 -0
  105. package/dist/morphology/index.js.map +1 -0
  106. package/dist/morphology/normalize.d.ts +52 -0
  107. package/dist/morphology/normalize.d.ts.map +1 -0
  108. package/dist/morphology/normalize.js +127 -0
  109. package/dist/morphology/normalize.js.map +1 -0
  110. package/dist/morphology/pluralize.d.ts +17 -0
  111. package/dist/morphology/pluralize.d.ts.map +1 -0
  112. package/dist/morphology/pluralize.js +186 -0
  113. package/dist/morphology/pluralize.js.map +1 -0
  114. package/dist/morphology/pluralize.test.d.ts +2 -0
  115. package/dist/morphology/pluralize.test.d.ts.map +1 -0
  116. package/dist/morphology/pluralize.test.js +86 -0
  117. package/dist/morphology/pluralize.test.js.map +1 -0
  118. package/dist/providers/index.d.ts +2 -0
  119. package/dist/providers/index.d.ts.map +1 -0
  120. package/dist/providers/index.js +2 -0
  121. package/dist/providers/index.js.map +1 -0
  122. package/dist/providers/word-provider.d.ts +125 -0
  123. package/dist/providers/word-provider.d.ts.map +1 -0
  124. package/dist/providers/word-provider.js +266 -0
  125. package/dist/providers/word-provider.js.map +1 -0
  126. package/dist/rng/index.d.ts +2 -0
  127. package/dist/rng/index.d.ts.map +1 -0
  128. package/dist/rng/index.js +2 -0
  129. package/dist/rng/index.js.map +1 -0
  130. package/dist/rng/seedable-rng.d.ts +19 -0
  131. package/dist/rng/seedable-rng.d.ts.map +1 -0
  132. package/dist/rng/seedable-rng.js +77 -0
  133. package/dist/rng/seedable-rng.js.map +1 -0
  134. package/dist/rng/seedable-rng.test.d.ts +2 -0
  135. package/dist/rng/seedable-rng.test.d.ts.map +1 -0
  136. package/dist/rng/seedable-rng.test.js +165 -0
  137. package/dist/rng/seedable-rng.test.js.map +1 -0
  138. package/dist/rules/index.d.ts +3 -0
  139. package/dist/rules/index.d.ts.map +1 -0
  140. package/dist/rules/index.js +2 -0
  141. package/dist/rules/index.js.map +1 -0
  142. package/dist/rules/rule-engine.d.ts +78 -0
  143. package/dist/rules/rule-engine.d.ts.map +1 -0
  144. package/dist/rules/rule-engine.js +271 -0
  145. package/dist/rules/rule-engine.js.map +1 -0
  146. package/dist/transforms/config-merge.d.ts +19 -0
  147. package/dist/transforms/config-merge.d.ts.map +1 -0
  148. package/dist/transforms/config-merge.js +88 -0
  149. package/dist/transforms/config-merge.js.map +1 -0
  150. package/dist/transforms/config-merge.test.d.ts +2 -0
  151. package/dist/transforms/config-merge.test.d.ts.map +1 -0
  152. package/dist/transforms/config-merge.test.js +91 -0
  153. package/dist/transforms/config-merge.test.js.map +1 -0
  154. package/dist/transforms/default-registry.d.ts +10 -0
  155. package/dist/transforms/default-registry.d.ts.map +1 -0
  156. package/dist/transforms/default-registry.js +17 -0
  157. package/dist/transforms/default-registry.js.map +1 -0
  158. package/dist/transforms/index.d.ts +15 -0
  159. package/dist/transforms/index.d.ts.map +1 -0
  160. package/dist/transforms/index.js +20 -0
  161. package/dist/transforms/index.js.map +1 -0
  162. package/dist/transforms/pipeline.d.ts +28 -0
  163. package/dist/transforms/pipeline.d.ts.map +1 -0
  164. package/dist/transforms/pipeline.js +176 -0
  165. package/dist/transforms/pipeline.js.map +1 -0
  166. package/dist/transforms/pipeline.test.d.ts +2 -0
  167. package/dist/transforms/pipeline.test.d.ts.map +1 -0
  168. package/dist/transforms/pipeline.test.js +175 -0
  169. package/dist/transforms/pipeline.test.js.map +1 -0
  170. package/dist/transforms/protection.d.ts +16 -0
  171. package/dist/transforms/protection.d.ts.map +1 -0
  172. package/dist/transforms/protection.js +97 -0
  173. package/dist/transforms/protection.js.map +1 -0
  174. package/dist/transforms/protection.test.d.ts +2 -0
  175. package/dist/transforms/protection.test.d.ts.map +1 -0
  176. package/dist/transforms/protection.test.js +79 -0
  177. package/dist/transforms/protection.test.js.map +1 -0
  178. package/dist/transforms/registry.d.ts +25 -0
  179. package/dist/transforms/registry.d.ts.map +1 -0
  180. package/dist/transforms/registry.js +32 -0
  181. package/dist/transforms/registry.js.map +1 -0
  182. package/dist/transforms/registry.test.d.ts +2 -0
  183. package/dist/transforms/registry.test.d.ts.map +1 -0
  184. package/dist/transforms/registry.test.js +64 -0
  185. package/dist/transforms/registry.test.js.map +1 -0
  186. package/dist/transforms/tokenizer.d.ts +26 -0
  187. package/dist/transforms/tokenizer.d.ts.map +1 -0
  188. package/dist/transforms/tokenizer.js +137 -0
  189. package/dist/transforms/tokenizer.js.map +1 -0
  190. package/dist/transforms/tokenizer.test.d.ts +2 -0
  191. package/dist/transforms/tokenizer.test.d.ts.map +1 -0
  192. package/dist/transforms/tokenizer.test.js +85 -0
  193. package/dist/transforms/tokenizer.test.js.map +1 -0
  194. package/dist/transforms/transforms/biz-jargon.d.ts +7 -0
  195. package/dist/transforms/transforms/biz-jargon.d.ts.map +1 -0
  196. package/dist/transforms/transforms/biz-jargon.js +117 -0
  197. package/dist/transforms/transforms/biz-jargon.js.map +1 -0
  198. package/dist/transforms/transforms/emoji.d.ts +7 -0
  199. package/dist/transforms/transforms/emoji.d.ts.map +1 -0
  200. package/dist/transforms/transforms/emoji.js +127 -0
  201. package/dist/transforms/transforms/emoji.js.map +1 -0
  202. package/dist/transforms/transforms/index.d.ts +17 -0
  203. package/dist/transforms/transforms/index.d.ts.map +1 -0
  204. package/dist/transforms/transforms/index.js +37 -0
  205. package/dist/transforms/transforms/index.js.map +1 -0
  206. package/dist/transforms/transforms/leet.d.ts +7 -0
  207. package/dist/transforms/transforms/leet.d.ts.map +1 -0
  208. package/dist/transforms/transforms/leet.js +109 -0
  209. package/dist/transforms/transforms/leet.js.map +1 -0
  210. package/dist/transforms/transforms/mock-case.d.ts +7 -0
  211. package/dist/transforms/transforms/mock-case.d.ts.map +1 -0
  212. package/dist/transforms/transforms/mock-case.js +116 -0
  213. package/dist/transforms/transforms/mock-case.js.map +1 -0
  214. package/dist/transforms/transforms/pig-latin.d.ts +7 -0
  215. package/dist/transforms/transforms/pig-latin.d.ts.map +1 -0
  216. package/dist/transforms/transforms/pig-latin.js +132 -0
  217. package/dist/transforms/transforms/pig-latin.js.map +1 -0
  218. package/dist/transforms/transforms/pig-latin.test.d.ts +2 -0
  219. package/dist/transforms/transforms/pig-latin.test.d.ts.map +1 -0
  220. package/dist/transforms/transforms/pig-latin.test.js +77 -0
  221. package/dist/transforms/transforms/pig-latin.test.js.map +1 -0
  222. package/dist/transforms/transforms/pirate.d.ts +7 -0
  223. package/dist/transforms/transforms/pirate.d.ts.map +1 -0
  224. package/dist/transforms/transforms/pirate.js +150 -0
  225. package/dist/transforms/transforms/pirate.js.map +1 -0
  226. package/dist/transforms/transforms/redact.d.ts +7 -0
  227. package/dist/transforms/transforms/redact.d.ts.map +1 -0
  228. package/dist/transforms/transforms/redact.js +109 -0
  229. package/dist/transforms/transforms/redact.js.map +1 -0
  230. package/dist/transforms/transforms/reverse-words.d.ts +7 -0
  231. package/dist/transforms/transforms/reverse-words.d.ts.map +1 -0
  232. package/dist/transforms/transforms/reverse-words.js +88 -0
  233. package/dist/transforms/transforms/reverse-words.js.map +1 -0
  234. package/dist/transforms/transforms/transforms.test.d.ts +11 -0
  235. package/dist/transforms/transforms/transforms.test.d.ts.map +1 -0
  236. package/dist/transforms/transforms/transforms.test.js +489 -0
  237. package/dist/transforms/transforms/transforms.test.js.map +1 -0
  238. package/dist/transforms/transforms/ubbi-dubbi.d.ts +7 -0
  239. package/dist/transforms/transforms/ubbi-dubbi.d.ts.map +1 -0
  240. package/dist/transforms/transforms/ubbi-dubbi.js +120 -0
  241. package/dist/transforms/transforms/ubbi-dubbi.js.map +1 -0
  242. package/dist/transforms/transforms/uwu.d.ts +7 -0
  243. package/dist/transforms/transforms/uwu.d.ts.map +1 -0
  244. package/dist/transforms/transforms/uwu.js +106 -0
  245. package/dist/transforms/transforms/uwu.js.map +1 -0
  246. package/dist/transforms/types.d.ts +159 -0
  247. package/dist/transforms/types.d.ts.map +1 -0
  248. package/dist/transforms/types.js +22 -0
  249. package/dist/transforms/types.js.map +1 -0
  250. package/dist/types/api.d.ts +158 -0
  251. package/dist/types/api.d.ts.map +1 -0
  252. package/dist/types/api.js +6 -0
  253. package/dist/types/api.js.map +1 -0
  254. package/dist/types/config.d.ts +86 -0
  255. package/dist/types/config.d.ts.map +1 -0
  256. package/dist/types/config.js +66 -0
  257. package/dist/types/config.js.map +1 -0
  258. package/dist/types/context.d.ts +74 -0
  259. package/dist/types/context.d.ts.map +1 -0
  260. package/dist/types/context.js +83 -0
  261. package/dist/types/context.js.map +1 -0
  262. package/dist/types/index.d.ts +7 -0
  263. package/dist/types/index.d.ts.map +1 -0
  264. package/dist/types/index.js +3 -0
  265. package/dist/types/index.js.map +1 -0
  266. package/dist/types/lexicon.d.ts +247 -0
  267. package/dist/types/lexicon.d.ts.map +1 -0
  268. package/dist/types/lexicon.js +6 -0
  269. package/dist/types/lexicon.js.map +1 -0
  270. package/examples/basic-usage.ts +48 -0
  271. package/examples/corporate-lexicon.ts +71 -0
  272. package/examples/lexicons/corporate-min.json +200 -0
  273. package/examples/with-tracing.ts +85 -0
  274. package/package.json +70 -0
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Lexicon Store Implementation
3
+ * Provides access to lexicon data and sampling utilities
4
+ */
5
+ import type { ILexiconStore } from '../interfaces/lexicon-store.js';
6
+ import type { IRng } from '../interfaces/rng.js';
7
+ import type { GenerationContext } from '../types/context.js';
8
+ import type { Lexicon, TermSet, Pattern, LexicalItem, TermQuery, PatternQuery, ChoiceEvent, RelationResult, Archetype, DistributionEntry, POS } from '../types/lexicon.js';
9
+ export declare class LexiconStore implements ILexiconStore {
10
+ private lexicon;
11
+ private rng;
12
+ constructor(rng: IRng, lexicon?: Lexicon);
13
+ setLexicon(lexicon: Lexicon): void;
14
+ isLoaded(): boolean;
15
+ getMeta(): {
16
+ id: string;
17
+ version?: string;
18
+ language: string;
19
+ } | undefined;
20
+ getTermSet(id: string): TermSet | undefined;
21
+ getTermSetIds(): string[];
22
+ sampleTerm(termQuery: TermQuery, ctx: GenerationContext): LexicalItem | undefined;
23
+ private findMatchingTermSets;
24
+ getPattern(id: string): Pattern | undefined;
25
+ getPatternIds(): string[];
26
+ samplePattern(patternQuery: PatternQuery, ctx: GenerationContext): Pattern | undefined;
27
+ applyCorrelations(ctx: GenerationContext, chosen: ChoiceEvent): void;
28
+ private matchesCorrelationCondition;
29
+ evaluateRelations(entityOrTerm: string, relationType?: string): RelationResult[];
30
+ getArchetype(name: string): Archetype | undefined;
31
+ getArchetypeNames(): string[];
32
+ getDistribution(id: string): DistributionEntry[] | undefined;
33
+ /** Get all term sets matching a POS */
34
+ getTermSetsByPOS(pos: POS): Array<{
35
+ id: string;
36
+ set: TermSet;
37
+ }>;
38
+ }
39
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/lexicon/store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EACV,OAAO,EACP,OAAO,EACP,OAAO,EACP,WAAW,EACX,SAAS,EACT,YAAY,EACZ,WAAW,EACX,cAAc,EACd,SAAS,EACT,iBAAiB,EACjB,GAAG,EACJ,MAAM,qBAAqB,CAAC;AAE7B,qBAAa,YAAa,YAAW,aAAa;IAChD,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,GAAG,CAAO;gBAEN,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,OAAO;IAOxC,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIlC,QAAQ,IAAI,OAAO;IAInB,OAAO,IAAI;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;IASzE,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAI3C,aAAa,IAAI,MAAM,EAAE;IAKzB,UAAU,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,iBAAiB,GAAG,WAAW,GAAG,SAAS;IAwEjF,OAAO,CAAC,oBAAoB;IA4C5B,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAI3C,aAAa,IAAI,MAAM,EAAE;IAKzB,aAAa,CAAC,YAAY,EAAE,YAAY,EAAE,GAAG,EAAE,iBAAiB,GAAG,OAAO,GAAG,SAAS;IAgDtF,iBAAiB,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI;IAiCpE,OAAO,CAAC,2BAA2B;IA0BnC,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE;IAkChF,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAIjD,iBAAiB,IAAI,MAAM,EAAE;IAK7B,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,EAAE,GAAG,SAAS;IAI5D,uCAAuC;IACvC,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,OAAO,CAAA;KAAE,CAAC;CAWhE"}
@@ -0,0 +1,291 @@
1
+ /**
2
+ * Lexicon Store Implementation
3
+ * Provides access to lexicon data and sampling utilities
4
+ */
5
+ export class LexiconStore {
6
+ lexicon = null;
7
+ rng;
8
+ constructor(rng, lexicon) {
9
+ this.rng = rng;
10
+ if (lexicon) {
11
+ this.lexicon = lexicon;
12
+ }
13
+ }
14
+ setLexicon(lexicon) {
15
+ this.lexicon = lexicon;
16
+ }
17
+ isLoaded() {
18
+ return this.lexicon !== null;
19
+ }
20
+ getMeta() {
21
+ if (!this.lexicon)
22
+ return undefined;
23
+ return {
24
+ id: this.lexicon.id,
25
+ version: this.lexicon.version,
26
+ language: this.lexicon.language,
27
+ };
28
+ }
29
+ getTermSet(id) {
30
+ return this.lexicon?.termSets?.[id];
31
+ }
32
+ getTermSetIds() {
33
+ if (!this.lexicon?.termSets)
34
+ return [];
35
+ return Object.keys(this.lexicon.termSets);
36
+ }
37
+ sampleTerm(termQuery, ctx) {
38
+ if (!this.lexicon?.termSets)
39
+ return undefined;
40
+ // Find matching term sets
41
+ const candidateSets = this.findMatchingTermSets(termQuery, ctx);
42
+ if (candidateSets.length === 0)
43
+ return undefined;
44
+ // Weight the term sets based on distributions and biases
45
+ const weightedSets = candidateSets.map(({ id, set }) => {
46
+ let weight = 1;
47
+ // Apply distribution weights from archetype
48
+ const archetype = this.getArchetype(ctx.archetype);
49
+ if (archetype?.distributions?.termSetBias) {
50
+ const dist = this.getDistribution(archetype.distributions.termSetBias);
51
+ const entry = dist?.find(e => e.key === id);
52
+ if (entry) {
53
+ weight *= entry.weight;
54
+ }
55
+ }
56
+ // Apply context biases
57
+ const bias = ctx.biases.get(id) ?? 0;
58
+ weight += bias;
59
+ return { item: { id, set }, weight: Math.max(0, weight) };
60
+ });
61
+ // Sample a term set
62
+ const validWeightedSets = weightedSets.filter(w => w.weight > 0);
63
+ if (validWeightedSets.length === 0)
64
+ return undefined;
65
+ const { id: termSetId, set } = this.rng.weightedPick(validWeightedSets);
66
+ // Filter terms by features and exclusions
67
+ let terms = set.terms.filter(t => {
68
+ // Check features match
69
+ if (termQuery.features) {
70
+ for (const [key, value] of Object.entries(termQuery.features)) {
71
+ if (t.features?.[key] !== value) {
72
+ return false;
73
+ }
74
+ }
75
+ }
76
+ // Check exclusions
77
+ if (termQuery.exclude?.includes(t.value)) {
78
+ return false;
79
+ }
80
+ return true;
81
+ });
82
+ if (terms.length === 0)
83
+ return undefined;
84
+ // Weight and sample a term
85
+ const weightedTerms = terms.map(t => ({
86
+ item: t,
87
+ weight: t.weight ?? 1,
88
+ }));
89
+ const term = this.rng.weightedPick(weightedTerms);
90
+ return {
91
+ value: term.value,
92
+ pos: termQuery.pos,
93
+ termSetId,
94
+ features: term.features,
95
+ tags: term.tags ?? set.tags,
96
+ };
97
+ }
98
+ findMatchingTermSets(termQuery, ctx) {
99
+ if (!this.lexicon?.termSets)
100
+ return [];
101
+ const results = [];
102
+ // If explicit IDs provided, use only those
103
+ if (termQuery.termSetIds && termQuery.termSetIds.length > 0) {
104
+ for (const id of termQuery.termSetIds) {
105
+ const set = this.lexicon.termSets[id];
106
+ if (set && set.pos === termQuery.pos) {
107
+ results.push({ id, set });
108
+ }
109
+ }
110
+ return results;
111
+ }
112
+ // Otherwise find by POS and tags
113
+ for (const [id, set] of Object.entries(this.lexicon.termSets)) {
114
+ // Must match POS
115
+ if (set.pos !== termQuery.pos)
116
+ continue;
117
+ // Check tags
118
+ if (termQuery.tags && termQuery.tags.length > 0) {
119
+ const setTags = new Set(set.tags ?? []);
120
+ const hasMatchingTag = termQuery.tags.some(t => setTags.has(t));
121
+ if (!hasMatchingTag)
122
+ continue;
123
+ }
124
+ // Check context active tags
125
+ if (ctx.activeTags.size > 0 && set.tags) {
126
+ const setTags = new Set(set.tags);
127
+ const hasActiveTag = [...ctx.activeTags].some(t => setTags.has(t));
128
+ // Boost sets that match active tags (but don't exclude non-matching)
129
+ if (!hasActiveTag && termQuery.tags && termQuery.tags.length > 0) {
130
+ continue; // Only exclude if specific tags were requested
131
+ }
132
+ }
133
+ results.push({ id, set });
134
+ }
135
+ return results;
136
+ }
137
+ getPattern(id) {
138
+ return this.lexicon?.patterns?.[id];
139
+ }
140
+ getPatternIds() {
141
+ if (!this.lexicon?.patterns)
142
+ return [];
143
+ return Object.keys(this.lexicon.patterns);
144
+ }
145
+ samplePattern(patternQuery, ctx) {
146
+ if (!this.lexicon?.patterns)
147
+ return undefined;
148
+ // Find matching patterns
149
+ const candidates = [];
150
+ // If explicit IDs provided
151
+ if (patternQuery.patternIds && patternQuery.patternIds.length > 0) {
152
+ for (const id of patternQuery.patternIds) {
153
+ const pattern = this.lexicon.patterns[id];
154
+ if (pattern && pattern.type === patternQuery.type) {
155
+ candidates.push({ id, pattern });
156
+ }
157
+ }
158
+ }
159
+ else {
160
+ // Find by type and tags
161
+ for (const [id, pattern] of Object.entries(this.lexicon.patterns)) {
162
+ if (pattern.type !== patternQuery.type)
163
+ continue;
164
+ if (patternQuery.tags && patternQuery.tags.length > 0) {
165
+ const patternTags = new Set(pattern.tags ?? []);
166
+ const hasTag = patternQuery.tags.some(t => patternTags.has(t));
167
+ if (!hasTag)
168
+ continue;
169
+ }
170
+ candidates.push({ id, pattern });
171
+ }
172
+ }
173
+ if (candidates.length === 0)
174
+ return undefined;
175
+ // Weight patterns
176
+ const weighted = candidates.map(({ id, pattern }) => {
177
+ let weight = pattern.weight ?? 1;
178
+ // Apply context biases
179
+ const bias = ctx.biases.get(`pattern:${id}`) ?? 0;
180
+ weight += bias;
181
+ return { item: pattern, weight: Math.max(0, weight) };
182
+ });
183
+ const validWeighted = weighted.filter(w => w.weight > 0);
184
+ if (validWeighted.length === 0)
185
+ return undefined;
186
+ return this.rng.weightedPick(validWeighted);
187
+ }
188
+ applyCorrelations(ctx, chosen) {
189
+ if (!this.lexicon?.correlations)
190
+ return;
191
+ for (const correlation of this.lexicon.correlations) {
192
+ // Check if condition matches
193
+ if (!this.matchesCorrelationCondition(correlation.when, chosen)) {
194
+ continue;
195
+ }
196
+ // Apply boosts
197
+ for (const boost of correlation.thenBoost) {
198
+ const scope = correlation.scope;
199
+ const prefix = `${scope}:`;
200
+ if (boost.termSet) {
201
+ const key = prefix + boost.termSet;
202
+ const current = ctx.biases.get(key) ?? 0;
203
+ ctx.biases.set(key, current + boost.weightDelta);
204
+ // Also set without prefix for simpler lookup
205
+ const currentSimple = ctx.biases.get(boost.termSet) ?? 0;
206
+ ctx.biases.set(boost.termSet, currentSimple + boost.weightDelta);
207
+ }
208
+ if (boost.pattern) {
209
+ const key = prefix + `pattern:${boost.pattern}`;
210
+ const current = ctx.biases.get(key) ?? 0;
211
+ ctx.biases.set(key, current + boost.weightDelta);
212
+ }
213
+ }
214
+ }
215
+ }
216
+ matchesCorrelationCondition(condition, chosen) {
217
+ if (condition.chosenTermSet && chosen.termSetId === condition.chosenTermSet) {
218
+ return true;
219
+ }
220
+ if (condition.chosenTag && chosen.type === 'term') {
221
+ const item = chosen.item;
222
+ if (item.tags?.includes(condition.chosenTag)) {
223
+ return true;
224
+ }
225
+ }
226
+ if (condition.chosenValue && chosen.type === 'term') {
227
+ const item = chosen.item;
228
+ if (item.value === condition.chosenValue) {
229
+ return true;
230
+ }
231
+ }
232
+ if (condition.usedPattern && chosen.patternId === condition.usedPattern) {
233
+ return true;
234
+ }
235
+ return false;
236
+ }
237
+ evaluateRelations(entityOrTerm, relationType) {
238
+ if (!this.lexicon?.relations)
239
+ return [];
240
+ const results = [];
241
+ for (const relation of this.lexicon.relations) {
242
+ // Check outgoing relations
243
+ if (relation.from === entityOrTerm) {
244
+ if (!relationType || relation.type === relationType) {
245
+ results.push({
246
+ term: relation.to,
247
+ relationType: relation.type,
248
+ weight: relation.weight ?? 1,
249
+ direction: 'outgoing',
250
+ });
251
+ }
252
+ }
253
+ // Check incoming relations
254
+ if (relation.to === entityOrTerm) {
255
+ if (!relationType || relation.type === relationType) {
256
+ results.push({
257
+ term: relation.from,
258
+ relationType: relation.type,
259
+ weight: relation.weight ?? 1,
260
+ direction: 'incoming',
261
+ });
262
+ }
263
+ }
264
+ }
265
+ return results;
266
+ }
267
+ getArchetype(name) {
268
+ return this.lexicon?.archetypes?.[name];
269
+ }
270
+ getArchetypeNames() {
271
+ if (!this.lexicon?.archetypes)
272
+ return [];
273
+ return Object.keys(this.lexicon.archetypes);
274
+ }
275
+ getDistribution(id) {
276
+ return this.lexicon?.distributions?.[id];
277
+ }
278
+ /** Get all term sets matching a POS */
279
+ getTermSetsByPOS(pos) {
280
+ if (!this.lexicon?.termSets)
281
+ return [];
282
+ const results = [];
283
+ for (const [id, set] of Object.entries(this.lexicon.termSets)) {
284
+ if (set.pos === pos) {
285
+ results.push({ id, set });
286
+ }
287
+ }
288
+ return results;
289
+ }
290
+ }
291
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/lexicon/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Lexicon Validator
3
+ * Validates lexicon JSON structure and returns structured errors
4
+ */
5
+ import type { LexiconValidationResult } from '../types/api.js';
6
+ /**
7
+ * Validate a lexicon object
8
+ */
9
+ export declare function validateLexicon(lexicon: unknown): LexiconValidationResult;
10
+ //# sourceMappingURL=validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/lexicon/validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,uBAAuB,EAA0B,MAAM,iBAAiB,CAAC;AAQvF;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,uBAAuB,CAsEzE"}
@@ -0,0 +1,273 @@
1
+ /**
2
+ * Lexicon Validator
3
+ * Validates lexicon JSON structure and returns structured errors
4
+ */
5
+ const VALID_POS = ['noun', 'verb', 'adj', 'adv', 'prep', 'conj', 'intj', 'det'];
6
+ const VALID_SCOPES = ['token', 'phrase', 'clause', 'sentence', 'paragraph', 'text'];
7
+ const VALID_CONSTRAINT_TYPES = ['noRepeat', 'maxCount', 'minCount', 'required', 'forbidden', 'custom'];
8
+ const VALID_INVARIANT_TYPES = ['capitalization', 'punctuation', 'whitespace', 'agreement', 'custom'];
9
+ const VALID_PATTERN_TYPES = ['sentence', 'nounPhrase', 'verbPhrase', 'prepPhrase', 'adjPhrase', 'advPhrase', 'clause'];
10
+ /**
11
+ * Validate a lexicon object
12
+ */
13
+ export function validateLexicon(lexicon) {
14
+ const errors = [];
15
+ const warnings = [];
16
+ if (!lexicon || typeof lexicon !== 'object') {
17
+ errors.push({ path: '', message: 'Lexicon must be an object', severity: 'error' });
18
+ return { valid: false, errors, warnings };
19
+ }
20
+ const lex = lexicon;
21
+ // Required fields
22
+ if (typeof lex.id !== 'string' || lex.id.trim() === '') {
23
+ errors.push({ path: 'id', message: 'Lexicon must have a non-empty string "id"', severity: 'error' });
24
+ }
25
+ if (typeof lex.language !== 'string' || lex.language.trim() === '') {
26
+ errors.push({ path: 'language', message: 'Lexicon must have a non-empty string "language"', severity: 'error' });
27
+ }
28
+ // Optional version
29
+ if (lex.version !== undefined && typeof lex.version !== 'string') {
30
+ warnings.push({ path: 'version', message: 'Version should be a string', severity: 'warning' });
31
+ }
32
+ // Validate termSets
33
+ if (lex.termSets !== undefined) {
34
+ validateTermSets(lex.termSets, errors, warnings);
35
+ }
36
+ // Validate patterns
37
+ if (lex.patterns !== undefined) {
38
+ validatePatterns(lex.patterns, errors, warnings);
39
+ }
40
+ // Validate distributions
41
+ if (lex.distributions !== undefined) {
42
+ validateDistributions(lex.distributions, errors, warnings);
43
+ }
44
+ // Validate correlations
45
+ if (lex.correlations !== undefined) {
46
+ validateCorrelations(lex.correlations, errors, warnings);
47
+ }
48
+ // Validate constraints
49
+ if (lex.constraints !== undefined) {
50
+ validateConstraints(lex.constraints, errors, warnings);
51
+ }
52
+ // Validate invariants
53
+ if (lex.invariants !== undefined) {
54
+ validateInvariants(lex.invariants, errors, warnings);
55
+ }
56
+ // Validate archetypes
57
+ if (lex.archetypes !== undefined) {
58
+ validateArchetypes(lex.archetypes, errors, warnings);
59
+ }
60
+ // Validate relations
61
+ if (lex.relations !== undefined) {
62
+ validateRelations(lex.relations, errors, warnings);
63
+ }
64
+ return {
65
+ valid: errors.length === 0,
66
+ errors,
67
+ warnings,
68
+ };
69
+ }
70
+ function validateTermSets(termSets, errors, warnings) {
71
+ if (typeof termSets !== 'object' || termSets === null) {
72
+ errors.push({ path: 'termSets', message: 'termSets must be an object', severity: 'error' });
73
+ return;
74
+ }
75
+ for (const [id, termSet] of Object.entries(termSets)) {
76
+ const path = `termSets.${id}`;
77
+ if (typeof termSet !== 'object' || termSet === null) {
78
+ errors.push({ path, message: 'Term set must be an object', severity: 'error' });
79
+ continue;
80
+ }
81
+ const ts = termSet;
82
+ if (!VALID_POS.includes(ts.pos)) {
83
+ errors.push({ path: `${path}.pos`, message: `Invalid POS: ${ts.pos}. Must be one of: ${VALID_POS.join(', ')}`, severity: 'error' });
84
+ }
85
+ if (ts.tags !== undefined && !Array.isArray(ts.tags)) {
86
+ warnings.push({ path: `${path}.tags`, message: 'tags should be an array', severity: 'warning' });
87
+ }
88
+ if (!Array.isArray(ts.terms)) {
89
+ errors.push({ path: `${path}.terms`, message: 'terms must be an array', severity: 'error' });
90
+ }
91
+ else {
92
+ ts.terms.forEach((term, index) => {
93
+ validateTerm(term, `${path}.terms[${index}]`, errors, warnings);
94
+ });
95
+ }
96
+ }
97
+ }
98
+ function validateTerm(term, path, errors, warnings) {
99
+ if (typeof term !== 'object' || term === null) {
100
+ errors.push({ path, message: 'Term must be an object', severity: 'error' });
101
+ return;
102
+ }
103
+ const t = term;
104
+ if (typeof t.value !== 'string' || t.value.trim() === '') {
105
+ errors.push({ path: `${path}.value`, message: 'Term must have a non-empty string "value"', severity: 'error' });
106
+ }
107
+ if (t.weight !== undefined && (typeof t.weight !== 'number' || t.weight < 0)) {
108
+ warnings.push({ path: `${path}.weight`, message: 'weight should be a non-negative number', severity: 'warning' });
109
+ }
110
+ if (t.tags !== undefined && !Array.isArray(t.tags)) {
111
+ warnings.push({ path: `${path}.tags`, message: 'tags should be an array', severity: 'warning' });
112
+ }
113
+ }
114
+ function validatePatterns(patterns, errors, _warnings) {
115
+ if (typeof patterns !== 'object' || patterns === null) {
116
+ errors.push({ path: 'patterns', message: 'patterns must be an object', severity: 'error' });
117
+ return;
118
+ }
119
+ for (const [id, pattern] of Object.entries(patterns)) {
120
+ const path = `patterns.${id}`;
121
+ if (typeof pattern !== 'object' || pattern === null) {
122
+ errors.push({ path, message: 'Pattern must be an object', severity: 'error' });
123
+ continue;
124
+ }
125
+ const p = pattern;
126
+ if (!VALID_PATTERN_TYPES.includes(p.type)) {
127
+ errors.push({ path: `${path}.type`, message: `Invalid pattern type: ${p.type}`, severity: 'error' });
128
+ }
129
+ if (!Array.isArray(p.slots)) {
130
+ errors.push({ path: `${path}.slots`, message: 'slots must be an array', severity: 'error' });
131
+ }
132
+ }
133
+ }
134
+ function validateDistributions(distributions, errors, warnings) {
135
+ if (typeof distributions !== 'object' || distributions === null) {
136
+ errors.push({ path: 'distributions', message: 'distributions must be an object', severity: 'error' });
137
+ return;
138
+ }
139
+ for (const [id, dist] of Object.entries(distributions)) {
140
+ const path = `distributions.${id}`;
141
+ if (!Array.isArray(dist)) {
142
+ errors.push({ path, message: 'Distribution must be an array', severity: 'error' });
143
+ continue;
144
+ }
145
+ dist.forEach((entry, index) => {
146
+ if (typeof entry !== 'object' || entry === null) {
147
+ errors.push({ path: `${path}[${index}]`, message: 'Distribution entry must be an object', severity: 'error' });
148
+ return;
149
+ }
150
+ const e = entry;
151
+ if (typeof e.key !== 'string') {
152
+ errors.push({ path: `${path}[${index}].key`, message: 'key must be a string', severity: 'error' });
153
+ }
154
+ if (typeof e.weight !== 'number' || e.weight < 0) {
155
+ warnings.push({ path: `${path}[${index}].weight`, message: 'weight should be a non-negative number', severity: 'warning' });
156
+ }
157
+ });
158
+ }
159
+ }
160
+ function validateCorrelations(correlations, errors, warnings) {
161
+ if (!Array.isArray(correlations)) {
162
+ errors.push({ path: 'correlations', message: 'correlations must be an array', severity: 'error' });
163
+ return;
164
+ }
165
+ correlations.forEach((corr, index) => {
166
+ const path = `correlations[${index}]`;
167
+ if (typeof corr !== 'object' || corr === null) {
168
+ errors.push({ path, message: 'Correlation must be an object', severity: 'error' });
169
+ return;
170
+ }
171
+ const c = corr;
172
+ if (typeof c.when !== 'object' || c.when === null) {
173
+ errors.push({ path: `${path}.when`, message: 'when must be an object', severity: 'error' });
174
+ }
175
+ if (!Array.isArray(c.thenBoost)) {
176
+ errors.push({ path: `${path}.thenBoost`, message: 'thenBoost must be an array', severity: 'error' });
177
+ }
178
+ if (!VALID_SCOPES.includes(c.scope)) {
179
+ warnings.push({ path: `${path}.scope`, message: `Invalid scope: ${c.scope}`, severity: 'warning' });
180
+ }
181
+ });
182
+ }
183
+ function validateConstraints(constraints, errors, _warnings) {
184
+ if (!Array.isArray(constraints)) {
185
+ errors.push({ path: 'constraints', message: 'constraints must be an array', severity: 'error' });
186
+ return;
187
+ }
188
+ constraints.forEach((constraint, index) => {
189
+ const path = `constraints[${index}]`;
190
+ if (typeof constraint !== 'object' || constraint === null) {
191
+ errors.push({ path, message: 'Constraint must be an object', severity: 'error' });
192
+ return;
193
+ }
194
+ const c = constraint;
195
+ if (typeof c.id !== 'string') {
196
+ errors.push({ path: `${path}.id`, message: 'id must be a string', severity: 'error' });
197
+ }
198
+ if (c.level !== 'hard' && c.level !== 'soft') {
199
+ errors.push({ path: `${path}.level`, message: 'level must be "hard" or "soft"', severity: 'error' });
200
+ }
201
+ if (!VALID_SCOPES.includes(c.scope)) {
202
+ errors.push({ path: `${path}.scope`, message: `Invalid scope: ${c.scope}`, severity: 'error' });
203
+ }
204
+ if (!VALID_CONSTRAINT_TYPES.includes(c.type)) {
205
+ errors.push({ path: `${path}.type`, message: `Invalid constraint type: ${c.type}`, severity: 'error' });
206
+ }
207
+ if (typeof c.target !== 'string') {
208
+ errors.push({ path: `${path}.target`, message: 'target must be a string', severity: 'error' });
209
+ }
210
+ });
211
+ }
212
+ function validateInvariants(invariants, errors, _warnings) {
213
+ if (!Array.isArray(invariants)) {
214
+ errors.push({ path: 'invariants', message: 'invariants must be an array', severity: 'error' });
215
+ return;
216
+ }
217
+ invariants.forEach((invariant, index) => {
218
+ const path = `invariants[${index}]`;
219
+ if (typeof invariant !== 'object' || invariant === null) {
220
+ errors.push({ path, message: 'Invariant must be an object', severity: 'error' });
221
+ return;
222
+ }
223
+ const inv = invariant;
224
+ if (typeof inv.id !== 'string') {
225
+ errors.push({ path: `${path}.id`, message: 'id must be a string', severity: 'error' });
226
+ }
227
+ if (!VALID_INVARIANT_TYPES.includes(inv.type)) {
228
+ errors.push({ path: `${path}.type`, message: `Invalid invariant type: ${inv.type}`, severity: 'error' });
229
+ }
230
+ if (!VALID_SCOPES.includes(inv.scope)) {
231
+ errors.push({ path: `${path}.scope`, message: `Invalid scope: ${inv.scope}`, severity: 'error' });
232
+ }
233
+ });
234
+ }
235
+ function validateArchetypes(archetypes, errors, _warnings) {
236
+ if (typeof archetypes !== 'object' || archetypes === null) {
237
+ errors.push({ path: 'archetypes', message: 'archetypes must be an object', severity: 'error' });
238
+ return;
239
+ }
240
+ for (const [id, archetype] of Object.entries(archetypes)) {
241
+ const path = `archetypes.${id}`;
242
+ if (typeof archetype !== 'object' || archetype === null) {
243
+ errors.push({ path, message: 'Archetype must be an object', severity: 'error' });
244
+ }
245
+ }
246
+ }
247
+ function validateRelations(relations, errors, warnings) {
248
+ if (!Array.isArray(relations)) {
249
+ errors.push({ path: 'relations', message: 'relations must be an array', severity: 'error' });
250
+ return;
251
+ }
252
+ relations.forEach((relation, index) => {
253
+ const path = `relations[${index}]`;
254
+ if (typeof relation !== 'object' || relation === null) {
255
+ errors.push({ path, message: 'Relation must be an object', severity: 'error' });
256
+ return;
257
+ }
258
+ const r = relation;
259
+ if (typeof r.from !== 'string') {
260
+ errors.push({ path: `${path}.from`, message: 'from must be a string', severity: 'error' });
261
+ }
262
+ if (typeof r.type !== 'string') {
263
+ errors.push({ path: `${path}.type`, message: 'type must be a string', severity: 'error' });
264
+ }
265
+ if (typeof r.to !== 'string') {
266
+ errors.push({ path: `${path}.to`, message: 'to must be a string', severity: 'error' });
267
+ }
268
+ if (r.weight !== undefined && (typeof r.weight !== 'number' || r.weight < 0)) {
269
+ warnings.push({ path: `${path}.weight`, message: 'weight should be a non-negative number', severity: 'warning' });
270
+ }
271
+ });
272
+ }
273
+ //# sourceMappingURL=validator.js.map