ai-output-assert 0.3.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 (142) hide show
  1. package/README.md +183 -0
  2. package/dist/__tests__/matchers/content.test.d.ts +2 -0
  3. package/dist/__tests__/matchers/content.test.d.ts.map +1 -0
  4. package/dist/__tests__/matchers/content.test.js +66 -0
  5. package/dist/__tests__/matchers/content.test.js.map +1 -0
  6. package/dist/__tests__/matchers/format.test.d.ts +2 -0
  7. package/dist/__tests__/matchers/format.test.d.ts.map +1 -0
  8. package/dist/__tests__/matchers/format.test.js +100 -0
  9. package/dist/__tests__/matchers/format.test.js.map +1 -0
  10. package/dist/__tests__/matchers/quality.test.d.ts +2 -0
  11. package/dist/__tests__/matchers/quality.test.d.ts.map +1 -0
  12. package/dist/__tests__/matchers/quality.test.js +98 -0
  13. package/dist/__tests__/matchers/quality.test.js.map +1 -0
  14. package/dist/__tests__/matchers/safety.test.d.ts +2 -0
  15. package/dist/__tests__/matchers/safety.test.d.ts.map +1 -0
  16. package/dist/__tests__/matchers/safety.test.js +120 -0
  17. package/dist/__tests__/matchers/safety.test.js.map +1 -0
  18. package/dist/__tests__/setup.test.d.ts +2 -0
  19. package/dist/__tests__/setup.test.d.ts.map +1 -0
  20. package/dist/__tests__/setup.test.js +49 -0
  21. package/dist/__tests__/setup.test.js.map +1 -0
  22. package/dist/__tests__/types.test.d.ts +2 -0
  23. package/dist/__tests__/types.test.d.ts.map +1 -0
  24. package/dist/__tests__/types.test.js +50 -0
  25. package/dist/__tests__/types.test.js.map +1 -0
  26. package/dist/__tests__/utils/cosine-similarity.test.d.ts +2 -0
  27. package/dist/__tests__/utils/cosine-similarity.test.d.ts.map +1 -0
  28. package/dist/__tests__/utils/cosine-similarity.test.js +30 -0
  29. package/dist/__tests__/utils/cosine-similarity.test.js.map +1 -0
  30. package/dist/__tests__/utils/embedding-cache.test.d.ts +2 -0
  31. package/dist/__tests__/utils/embedding-cache.test.d.ts.map +1 -0
  32. package/dist/__tests__/utils/embedding-cache.test.js +41 -0
  33. package/dist/__tests__/utils/embedding-cache.test.js.map +1 -0
  34. package/dist/__tests__/utils/json-extract.test.d.ts +2 -0
  35. package/dist/__tests__/utils/json-extract.test.d.ts.map +1 -0
  36. package/dist/__tests__/utils/json-extract.test.js +32 -0
  37. package/dist/__tests__/utils/json-extract.test.js.map +1 -0
  38. package/dist/__tests__/utils/luhn.test.d.ts +2 -0
  39. package/dist/__tests__/utils/luhn.test.d.ts.map +1 -0
  40. package/dist/__tests__/utils/luhn.test.js +25 -0
  41. package/dist/__tests__/utils/luhn.test.js.map +1 -0
  42. package/dist/__tests__/utils/ngrams.test.d.ts +2 -0
  43. package/dist/__tests__/utils/ngrams.test.d.ts.map +1 -0
  44. package/dist/__tests__/utils/ngrams.test.js +28 -0
  45. package/dist/__tests__/utils/ngrams.test.js.map +1 -0
  46. package/dist/__tests__/utils/regex-escape.test.d.ts +2 -0
  47. package/dist/__tests__/utils/regex-escape.test.d.ts.map +1 -0
  48. package/dist/__tests__/utils/regex-escape.test.js +48 -0
  49. package/dist/__tests__/utils/regex-escape.test.js.map +1 -0
  50. package/dist/__tests__/utils/sentences.test.d.ts +2 -0
  51. package/dist/__tests__/utils/sentences.test.d.ts.map +1 -0
  52. package/dist/__tests__/utils/sentences.test.js +39 -0
  53. package/dist/__tests__/utils/sentences.test.js.map +1 -0
  54. package/dist/__tests__/utils/tokenizer.test.d.ts +2 -0
  55. package/dist/__tests__/utils/tokenizer.test.d.ts.map +1 -0
  56. package/dist/__tests__/utils/tokenizer.test.js +25 -0
  57. package/dist/__tests__/utils/tokenizer.test.js.map +1 -0
  58. package/dist/catalogs/hedging-phrases.d.ts +4 -0
  59. package/dist/catalogs/hedging-phrases.d.ts.map +1 -0
  60. package/dist/catalogs/hedging-phrases.js +49 -0
  61. package/dist/catalogs/hedging-phrases.js.map +1 -0
  62. package/dist/catalogs/pii-patterns.d.ts +3 -0
  63. package/dist/catalogs/pii-patterns.d.ts.map +1 -0
  64. package/dist/catalogs/pii-patterns.js +35 -0
  65. package/dist/catalogs/pii-patterns.js.map +1 -0
  66. package/dist/catalogs/toxic-words.d.ts +3 -0
  67. package/dist/catalogs/toxic-words.d.ts.map +1 -0
  68. package/dist/catalogs/toxic-words.js +32 -0
  69. package/dist/catalogs/toxic-words.js.map +1 -0
  70. package/dist/index.d.ts +21 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +76 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/matchers/content.d.ts +6 -0
  75. package/dist/matchers/content.d.ts.map +1 -0
  76. package/dist/matchers/content.js +54 -0
  77. package/dist/matchers/content.js.map +1 -0
  78. package/dist/matchers/format.d.ts +6 -0
  79. package/dist/matchers/format.d.ts.map +1 -0
  80. package/dist/matchers/format.js +121 -0
  81. package/dist/matchers/format.js.map +1 -0
  82. package/dist/matchers/quality.d.ts +9 -0
  83. package/dist/matchers/quality.d.ts.map +1 -0
  84. package/dist/matchers/quality.js +107 -0
  85. package/dist/matchers/quality.js.map +1 -0
  86. package/dist/matchers/safety.d.ts +6 -0
  87. package/dist/matchers/safety.d.ts.map +1 -0
  88. package/dist/matchers/safety.js +87 -0
  89. package/dist/matchers/safety.js.map +1 -0
  90. package/dist/matchers/semantic.d.ts +12 -0
  91. package/dist/matchers/semantic.d.ts.map +1 -0
  92. package/dist/matchers/semantic.js +79 -0
  93. package/dist/matchers/semantic.js.map +1 -0
  94. package/dist/matchers/structural.d.ts +7 -0
  95. package/dist/matchers/structural.d.ts.map +1 -0
  96. package/dist/matchers/structural.js +154 -0
  97. package/dist/matchers/structural.js.map +1 -0
  98. package/dist/matchers/tone.d.ts +9 -0
  99. package/dist/matchers/tone.d.ts.map +1 -0
  100. package/dist/matchers/tone.js +138 -0
  101. package/dist/matchers/tone.js.map +1 -0
  102. package/dist/setup.d.ts +4 -0
  103. package/dist/setup.d.ts.map +1 -0
  104. package/dist/setup.js +92 -0
  105. package/dist/setup.js.map +1 -0
  106. package/dist/types.d.ts +43 -0
  107. package/dist/types.d.ts.map +1 -0
  108. package/dist/types.js +3 -0
  109. package/dist/types.js.map +1 -0
  110. package/dist/utils/cosine-similarity.d.ts +2 -0
  111. package/dist/utils/cosine-similarity.d.ts.map +1 -0
  112. package/dist/utils/cosine-similarity.js +18 -0
  113. package/dist/utils/cosine-similarity.js.map +1 -0
  114. package/dist/utils/embedding-cache.d.ts +3 -0
  115. package/dist/utils/embedding-cache.d.ts.map +1 -0
  116. package/dist/utils/embedding-cache.js +14 -0
  117. package/dist/utils/embedding-cache.js.map +1 -0
  118. package/dist/utils/json-extract.d.ts +2 -0
  119. package/dist/utils/json-extract.d.ts.map +1 -0
  120. package/dist/utils/json-extract.js +8 -0
  121. package/dist/utils/json-extract.js.map +1 -0
  122. package/dist/utils/luhn.d.ts +2 -0
  123. package/dist/utils/luhn.d.ts.map +1 -0
  124. package/dist/utils/luhn.js +22 -0
  125. package/dist/utils/luhn.js.map +1 -0
  126. package/dist/utils/ngrams.d.ts +2 -0
  127. package/dist/utils/ngrams.d.ts.map +1 -0
  128. package/dist/utils/ngrams.js +13 -0
  129. package/dist/utils/ngrams.js.map +1 -0
  130. package/dist/utils/regex-escape.d.ts +2 -0
  131. package/dist/utils/regex-escape.d.ts.map +1 -0
  132. package/dist/utils/regex-escape.js +7 -0
  133. package/dist/utils/regex-escape.js.map +1 -0
  134. package/dist/utils/sentences.d.ts +2 -0
  135. package/dist/utils/sentences.d.ts.map +1 -0
  136. package/dist/utils/sentences.js +36 -0
  137. package/dist/utils/sentences.js.map +1 -0
  138. package/dist/utils/tokenizer.d.ts +2 -0
  139. package/dist/utils/tokenizer.d.ts.map +1 -0
  140. package/dist/utils/tokenizer.js +7 -0
  141. package/dist/utils/tokenizer.js.map +1 -0
  142. package/package.json +36 -0
package/dist/setup.js ADDED
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setupAIAssertions = setupAIAssertions;
4
+ exports.getGlobalOptions = getGlobalOptions;
5
+ const format_1 = require("./matchers/format");
6
+ const content_1 = require("./matchers/content");
7
+ const tone_1 = require("./matchers/tone");
8
+ const structural_1 = require("./matchers/structural");
9
+ const safety_1 = require("./matchers/safety");
10
+ const quality_1 = require("./matchers/quality");
11
+ const semantic_1 = require("./matchers/semantic");
12
+ let globalOptions = {};
13
+ function setupAIAssertions(options) {
14
+ globalOptions = { ...globalOptions, ...options };
15
+ const expectFn = typeof globalThis.expect !== 'undefined'
16
+ ? globalThis.expect
17
+ : null;
18
+ if (expectFn && typeof expectFn.extend === 'function') {
19
+ expectFn.extend(buildMatchers(globalOptions));
20
+ }
21
+ }
22
+ function getGlobalOptions() {
23
+ return globalOptions;
24
+ }
25
+ function wrapSync(fn) {
26
+ return function (received, ...args) {
27
+ const result = fn(received, ...args);
28
+ return {
29
+ pass: result.pass,
30
+ message: result.message,
31
+ };
32
+ };
33
+ }
34
+ function wrapAsync(fn) {
35
+ return async function (received, ...args) {
36
+ const result = await fn(received, ...args);
37
+ return {
38
+ pass: result.pass,
39
+ message: result.message,
40
+ };
41
+ };
42
+ }
43
+ function buildMatchers(opts) {
44
+ return {
45
+ // format
46
+ toStartWith: wrapSync((r, prefix) => (0, format_1.toStartWith)(r, prefix)),
47
+ toEndWith: wrapSync((r, suffix) => (0, format_1.toEndWith)(r, suffix)),
48
+ toBeFormattedAs: wrapSync((r, fmt) => (0, format_1.toBeFormattedAs)(r, fmt)),
49
+ toHaveListItems: wrapSync((r, items) => (0, format_1.toHaveListItems)(r, items)),
50
+ // content
51
+ toContainAllOf: wrapSync((r, phrases) => (0, content_1.toContainAllOf)(r, phrases)),
52
+ toContainAnyOf: wrapSync((r, phrases) => (0, content_1.toContainAnyOf)(r, phrases)),
53
+ toNotContain: wrapSync((r, phrase) => (0, content_1.toNotContain)(r, phrase)),
54
+ toMentionEntity: wrapSync((r, entity, aliases) => (0, content_1.toMentionEntity)(r, entity, aliases)),
55
+ // tone
56
+ toHaveSentiment: wrapSync((r, sentiment) => (0, tone_1.toHaveSentiment)(r, sentiment)),
57
+ toHaveTone: wrapSync((r, tone) => (0, tone_1.toHaveTone)(r, tone)),
58
+ toBeConcise: wrapSync((r, maxWords) => (0, tone_1.toBeConcise)(r, maxWords)),
59
+ toNotBeVerbose: wrapSync((r, options) => (0, tone_1.toNotBeVerbose)(r, options)),
60
+ // structural
61
+ toBeValidJSON: wrapSync((r) => (0, structural_1.toBeValidJSON)(r)),
62
+ toMatchSchema: wrapSync((r, schema) => (0, structural_1.toMatchSchema)(r, schema)),
63
+ toHaveJSONFields: wrapSync((r, fields) => (0, structural_1.toHaveJSONFields)(r, fields)),
64
+ toBeValidMarkdown: wrapSync((r) => (0, structural_1.toBeValidMarkdown)(r)),
65
+ toContainCodeBlock: wrapSync((r, lang) => (0, structural_1.toContainCodeBlock)(r, lang)),
66
+ // safety
67
+ toNotContainPII: wrapSync((r, patterns) => (0, safety_1.toNotContainPII)(r, patterns)),
68
+ toNotContainToxicContent: wrapSync((r, words) => (0, safety_1.toNotContainToxicContent)(r, words)),
69
+ toNotLeakSystemPrompt: wrapSync((r, patterns) => (0, safety_1.toNotLeakSystemPrompt)(r, patterns)),
70
+ toNotBeRefusal: wrapSync((r, phrases) => (0, safety_1.toNotBeRefusal)(r, phrases)),
71
+ // quality
72
+ toNotBeTruncated: wrapSync((r) => (0, quality_1.toNotBeTruncated)(r)),
73
+ toNotBeHedged: wrapSync((r, phrases, threshold) => (0, quality_1.toNotBeHedged)(r, phrases, threshold)),
74
+ toBeCompleteJSON: wrapSync((r) => (0, quality_1.toBeCompleteJSON)(r)),
75
+ toNotRepeat: wrapSync((r, options) => (0, quality_1.toNotRepeat)(r, options)),
76
+ // semantic (async)
77
+ toBeSemanticallySimilarTo: wrapAsync((r, expected, options) => (0, semantic_1.toBeSemanticallySimilarTo)(r, expected, {
78
+ ...(opts.embedFn ? { embedFn: opts.embedFn } : {}),
79
+ ...(opts.semanticThreshold ? { threshold: opts.semanticThreshold } : {}),
80
+ ...(options ?? {}),
81
+ })),
82
+ toAnswerQuestion: wrapAsync((r, question, options) => (0, semantic_1.toAnswerQuestion)(r, question, {
83
+ ...(opts.embedFn ? { embedFn: opts.embedFn } : {}),
84
+ ...(options ?? {}),
85
+ })),
86
+ toBeFactuallyConsistentWith: wrapAsync((r, reference, options) => (0, semantic_1.toBeFactuallyConsistentWith)(r, reference, {
87
+ ...(opts.embedFn ? { embedFn: opts.embedFn } : {}),
88
+ ...(options ?? {}),
89
+ })),
90
+ };
91
+ }
92
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":";;AA+BA,8CAaC;AAED,4CAEC;AA/CD,8CAA6F;AAC7F,gDAAmG;AACnG,0CAA2F;AAC3F,sDAM+B;AAC/B,8CAK2B;AAC3B,gDAK4B;AAC5B,kDAI6B;AAE7B,IAAI,aAAa,GAAuB,EAAE,CAAC;AAE3C,SAAgB,iBAAiB,CAAC,OAA4B;IAC5D,aAAa,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IAEjD,MAAM,QAAQ,GACZ,OAAQ,UAAsC,CAAC,MAAM,KAAK,WAAW;QACnE,CAAC,CAAE,UAAsC,CAAC,MAAM;QAChD,CAAC,CAAC,IAAI,CAAC;IAEX,IAAI,QAAQ,IAAI,OAAQ,QAAiC,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAC/E,QAAoE,CAAC,MAAM,CAC1E,aAAa,CAAC,aAAa,CAAC,CAC7B,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAgB,gBAAgB;IAC9B,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,SAAS,QAAQ,CAAC,EAAyC;IACzD,OAAO,UAAoC,QAAgB,EAAE,GAAG,IAAe;QAC7E,MAAM,MAAM,GAAG,EAAE,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,CAAC;QACrC,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,EAAkD;IACnE,OAAO,KAAK,WAAqC,QAAgB,EAAE,GAAG,IAAe;QACnF,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,CAAC;QAC3C,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,IAAwB;IAC7C,OAAO;QACL,SAAS;QACT,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,IAAA,oBAAW,EAAC,CAAW,EAAE,MAAgB,CAAC,CAAC;QAChF,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,IAAA,kBAAS,EAAC,CAAW,EAAE,MAAgB,CAAC,CAAC;QAC5E,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CACnC,IAAA,wBAAe,EAAC,CAAW,EAAE,GAA4C,CAAC,CAC3E;QACD,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,IAAA,wBAAe,EAAC,CAAW,EAAE,KAAiB,CAAC,CAAC;QAExF,UAAU;QACV,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,IAAA,wBAAc,EAAC,CAAW,EAAE,OAAmB,CAAC,CAAC;QAC1F,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,IAAA,wBAAc,EAAC,CAAW,EAAE,OAAmB,CAAC,CAAC;QAC1F,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,IAAA,sBAAY,EAAC,CAAW,EAAE,MAAgB,CAAC,CAAC;QAClF,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAC/C,IAAA,yBAAe,EAAC,CAAW,EAAE,MAAgB,EAAE,OAA+B,CAAC,CAChF;QAED,OAAO;QACP,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,CACzC,IAAA,sBAAe,EAAC,CAAW,EAAE,SAAkD,CAAC,CACjF;QACD,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAC/B,IAAA,iBAAU,EAAC,CAAW,EAAE,IAAwC,CAAC,CAClE;QACD,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,CACpC,IAAA,kBAAW,EAAC,CAAW,EAAE,QAA8B,CAAC,CACzD;QACD,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CACtC,IAAA,qBAAc,EAAC,CAAW,EAAE,OAA+C,CAAC,CAC7E;QAED,aAAa;QACb,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,0BAAa,EAAC,CAAW,CAAC,CAAC;QAC1D,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,IAAA,0BAAa,EAAC,CAAW,EAAE,MAAgB,CAAC,CAAC;QACpF,gBAAgB,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,IAAA,6BAAgB,EAAC,CAAW,EAAE,MAAkB,CAAC,CAAC;QAC5F,iBAAiB,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,8BAAiB,EAAC,CAAW,CAAC,CAAC;QAClE,kBAAkB,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CACvC,IAAA,+BAAkB,EAAC,CAAW,EAAE,IAA0B,CAAC,CAC5D;QAED,SAAS;QACT,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,CACxC,IAAA,wBAAe,EACb,CAAW,EACX,QAAiD,CAClD,CACF;QACD,wBAAwB,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAC9C,IAAA,iCAAwB,EACtB,CAAW,EACX,KAAuD,CACxD,CACF;QACD,qBAAqB,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,CAC9C,IAAA,8BAAqB,EAAC,CAAW,EAAE,QAAgC,CAAC,CACrE;QACD,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CACtC,IAAA,uBAAc,EAAC,CAAW,EAAE,OAA+B,CAAC,CAC7D;QAED,UAAU;QACV,gBAAgB,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,0BAAgB,EAAC,CAAW,CAAC,CAAC;QAChE,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,CAChD,IAAA,uBAAa,EAAC,CAAW,EAAE,OAA+B,EAAE,SAA+B,CAAC,CAC7F;QACD,gBAAgB,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,0BAAgB,EAAC,CAAW,CAAC,CAAC;QAChE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,CACnC,IAAA,qBAAW,EAAC,CAAW,EAAE,OAA4C,CAAC,CACvE;QAED,mBAAmB;QACnB,yBAAyB,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,CAC5D,IAAA,oCAAyB,EACvB,CAAW,EACX,QAAkB,EAClB;YACE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxE,GAAG,CAAC,OAAiB,IAAI,EAAE,CAAC;SAC7B,CACF,CACF;QACD,gBAAgB,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,CACnD,IAAA,2BAAgB,EAAC,CAAW,EAAE,QAAkB,EAAE;YAChD,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,GAAG,CAAC,OAAiB,IAAI,EAAE,CAAC;SAC7B,CAAC,CACH;QACD,2BAA2B,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,CAC/D,IAAA,sCAA2B,EAAC,CAAW,EAAE,SAAmB,EAAE;YAC5D,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,GAAG,CAAC,OAAiB,IAAI,EAAE,CAAC;SAC7B,CAAC,CACH;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,43 @@
1
+ export interface MatcherResult {
2
+ pass: boolean;
3
+ message: () => string;
4
+ details: Record<string, unknown>;
5
+ }
6
+ export type EmbedFn = (text: string) => Promise<number[]>;
7
+ export type Tone = 'formal' | 'casual' | 'technical' | 'friendly';
8
+ export type ToneScores = Record<Tone, number>;
9
+ export type Sentiment = 'positive' | 'negative' | 'neutral';
10
+ export type OutputFormat = 'json' | 'markdown' | 'list' | 'csv' | 'xml' | 'yaml' | 'table';
11
+ export interface PIIPattern {
12
+ type: string;
13
+ pattern: RegExp;
14
+ validate?: (match: string) => boolean;
15
+ label: string;
16
+ }
17
+ export interface ToxicWord {
18
+ word: string;
19
+ severity: 'critical' | 'warning' | 'info';
20
+ }
21
+ export type PIIMatch = {
22
+ type: string;
23
+ value: string;
24
+ position: [number, number];
25
+ };
26
+ export interface AIAssertionOptions {
27
+ embedFn?: EmbedFn;
28
+ semanticThreshold?: number;
29
+ answerThreshold?: number;
30
+ consistencyThreshold?: number;
31
+ conciseMaxTokens?: number;
32
+ verboseMaxSentences?: number;
33
+ hedgingMaxRatio?: number;
34
+ repeatMaxRepetitions?: number;
35
+ systemPromptLeakThreshold?: number;
36
+ sentimentNeutralRange?: [number, number];
37
+ customPIIPatterns?: PIIPattern[];
38
+ customToxicWords?: ToxicWord[];
39
+ customEntityAliases?: Record<string, string[]>;
40
+ customHedgingPhrases?: string[];
41
+ customRefusalPhrases?: string[];
42
+ }
43
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AAE1D,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,CAAC;AAClE,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC9C,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;AAC5D,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3F,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACtC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;CAC3C;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5B,CAAC;AAEF,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,qBAAqB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,iBAAiB,CAAC,EAAE,UAAU,EAAE,CAAC;IACjC,gBAAgB,CAAC,EAAE,SAAS,EAAE,CAAC;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/C,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare function cosineSimilarity(a: number[], b: number[]): number;
2
+ //# sourceMappingURL=cosine-similarity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cosine-similarity.d.ts","sourceRoot":"","sources":["../../src/utils/cosine-similarity.ts"],"names":[],"mappings":"AAAA,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAYjE"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cosineSimilarity = cosineSimilarity;
4
+ function cosineSimilarity(a, b) {
5
+ if (a.length !== b.length) {
6
+ throw new Error(`Dimension mismatch: ${a.length} vs ${b.length}`);
7
+ }
8
+ let dot = 0, normA = 0, normB = 0;
9
+ for (let i = 0; i < a.length; i++) {
10
+ dot += a[i] * b[i];
11
+ normA += a[i] * a[i];
12
+ normB += b[i] * b[i];
13
+ }
14
+ if (normA === 0 || normB === 0)
15
+ return 0;
16
+ return dot / (Math.sqrt(normA) * Math.sqrt(normB));
17
+ }
18
+ //# sourceMappingURL=cosine-similarity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cosine-similarity.js","sourceRoot":"","sources":["../../src/utils/cosine-similarity.ts"],"names":[],"mappings":";;AAAA,4CAYC;AAZD,SAAgB,gBAAgB,CAAC,CAAW,EAAE,CAAW;IACvD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,GAAG,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACrB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACzC,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { EmbedFn } from '../types';
2
+ export declare function createCachedEmbedFn(embedFn: EmbedFn): EmbedFn;
3
+ //# sourceMappingURL=embedding-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-cache.d.ts","sourceRoot":"","sources":["../../src/utils/embedding-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAExC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAQ7D"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createCachedEmbedFn = createCachedEmbedFn;
4
+ function createCachedEmbedFn(embedFn) {
5
+ const cache = new Map();
6
+ return async (text) => {
7
+ if (cache.has(text))
8
+ return cache.get(text);
9
+ const embedding = await embedFn(text);
10
+ cache.set(text, embedding);
11
+ return embedding;
12
+ };
13
+ }
14
+ //# sourceMappingURL=embedding-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-cache.js","sourceRoot":"","sources":["../../src/utils/embedding-cache.ts"],"names":[],"mappings":";;AAEA,kDAQC;AARD,SAAgB,mBAAmB,CAAC,OAAgB;IAClD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC1C,OAAO,KAAK,EAAE,IAAY,EAAE,EAAE;QAC5B,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;QAC7C,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QACtC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC3B,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function extractJSONFromCodeFence(text: string): string | null;
2
+ //# sourceMappingURL=json-extract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-extract.d.ts","sourceRoot":"","sources":["../../src/utils/json-extract.ts"],"names":[],"mappings":"AAAA,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGpE"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractJSONFromCodeFence = extractJSONFromCodeFence;
4
+ function extractJSONFromCodeFence(text) {
5
+ const match = text.match(/```(?:json)?\s*\n([\s\S]*?)\n```/i);
6
+ return match ? match[1].trim() : null;
7
+ }
8
+ //# sourceMappingURL=json-extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-extract.js","sourceRoot":"","sources":["../../src/utils/json-extract.ts"],"names":[],"mappings":";;AAAA,4DAGC;AAHD,SAAgB,wBAAwB,CAAC,IAAY;IACnD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAC9D,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACxC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function luhnCheck(num: string): boolean;
2
+ //# sourceMappingURL=luhn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"luhn.d.ts","sourceRoot":"","sources":["../../src/utils/luhn.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAe9C"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.luhnCheck = luhnCheck;
4
+ function luhnCheck(num) {
5
+ const digits = num.replace(/\D/g, '');
6
+ if (digits.length === 0)
7
+ return false;
8
+ let sum = 0;
9
+ let isEven = false;
10
+ for (let i = digits.length - 1; i >= 0; i--) {
11
+ let d = parseInt(digits[i], 10);
12
+ if (isEven) {
13
+ d *= 2;
14
+ if (d > 9)
15
+ d -= 9;
16
+ }
17
+ sum += d;
18
+ isEven = !isEven;
19
+ }
20
+ return sum % 10 === 0;
21
+ }
22
+ //# sourceMappingURL=luhn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"luhn.js","sourceRoot":"","sources":["../../src/utils/luhn.ts"],"names":[],"mappings":";;AAAA,8BAeC;AAfD,SAAgB,SAAS,CAAC,GAAW;IACnC,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACtC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChC,IAAI,MAAM,EAAE,CAAC;YACX,CAAC,IAAI,CAAC,CAAC;YACP,IAAI,CAAC,GAAG,CAAC;gBAAE,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QACD,GAAG,IAAI,CAAC,CAAC;QACT,MAAM,GAAG,CAAC,MAAM,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;AACxB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function extractNgrams(tokens: string[], n: number): string[];
2
+ //# sourceMappingURL=ngrams.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngrams.d.ts","sourceRoot":"","sources":["../../src/utils/ngrams.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAOnE"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractNgrams = extractNgrams;
4
+ function extractNgrams(tokens, n) {
5
+ if (n <= 0 || tokens.length < n)
6
+ return [];
7
+ const result = [];
8
+ for (let i = 0; i <= tokens.length - n; i++) {
9
+ result.push(tokens.slice(i, i + n).join(' '));
10
+ }
11
+ return result;
12
+ }
13
+ //# sourceMappingURL=ngrams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngrams.js","sourceRoot":"","sources":["../../src/utils/ngrams.ts"],"names":[],"mappings":";;AAAA,sCAOC;AAPD,SAAgB,aAAa,CAAC,MAAgB,EAAE,CAAS;IACvD,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function escapeRegex(str: string): string;
2
+ //# sourceMappingURL=regex-escape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regex-escape.d.ts","sourceRoot":"","sources":["../../src/utils/regex-escape.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.escapeRegex = escapeRegex;
4
+ function escapeRegex(str) {
5
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
6
+ }
7
+ //# sourceMappingURL=regex-escape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regex-escape.js","sourceRoot":"","sources":["../../src/utils/regex-escape.ts"],"names":[],"mappings":";;AAAA,kCAEC;AAFD,SAAgB,WAAW,CAAC,GAAW;IACrC,OAAO,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function splitSentences(text: string): string[];
2
+ //# sourceMappingURL=sentences.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentences.d.ts","sourceRoot":"","sources":["../../src/utils/sentences.ts"],"names":[],"mappings":"AAEA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAgCrD"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.splitSentences = splitSentences;
4
+ const ABBREV_PATTERN = /\b(?:Mr|Mrs|Ms|Dr|Prof|Sr|Jr|Inc|Ltd|Corp|vs|etc|e\.g|i\.e|U\.S|U\.K|Jan|Feb|Mar|Apr|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\.$/i;
5
+ function splitSentences(text) {
6
+ if (!text || text.trim().length === 0)
7
+ return [];
8
+ const result = [];
9
+ // Split on sentence-ending punctuation followed by whitespace + uppercase letter
10
+ // We use a manual approach to skip abbreviations
11
+ const raw = text.split(/(?<=[.!?]['")]*)\s+(?=[A-Z"])/);
12
+ for (const part of raw) {
13
+ const trimmed = part.trim();
14
+ if (trimmed.length === 0)
15
+ continue;
16
+ // Check if the last "sentence" ends with a known abbreviation — if so, it got
17
+ // split incorrectly and we should merge it back with the next part.
18
+ // Because we already split, we instead check each segment itself.
19
+ // If a segment ends with an abbreviation dot (e.g. "Dr."), it should have been
20
+ // attached to the next segment. We handle this by checking if the TRIMMED segment
21
+ // (without trailing whitespace) ends with an abbreviation.
22
+ if (result.length > 0) {
23
+ const prev = result[result.length - 1];
24
+ // If prev ends with a known abbreviation, merge
25
+ if (ABBREV_PATTERN.test(prev)) {
26
+ result[result.length - 1] = prev + ' ' + trimmed;
27
+ continue;
28
+ }
29
+ }
30
+ result.push(trimmed);
31
+ }
32
+ // Final pass: if the last element ends with an abbreviation (no merge needed),
33
+ // it's still a valid sentence — leave it as is.
34
+ return result;
35
+ }
36
+ //# sourceMappingURL=sentences.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentences.js","sourceRoot":"","sources":["../../src/utils/sentences.ts"],"names":[],"mappings":";;AAEA,wCAgCC;AAlCD,MAAM,cAAc,GAAG,uHAAuH,CAAC;AAE/I,SAAgB,cAAc,CAAC,IAAY;IACzC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,iFAAiF;IACjF,iDAAiD;IACjD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAExD,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAEnC,8EAA8E;QAC9E,oEAAoE;QACpE,kEAAkE;QAClE,+EAA+E;QAC/E,kFAAkF;QAClF,2DAA2D;QAC3D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACvC,gDAAgD;YAChD,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9B,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,OAAO,CAAC;gBACjD,SAAS;YACX,CAAC;QACH,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,+EAA+E;IAC/E,gDAAgD;IAChD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function tokenize(text: string): string[];
2
+ //# sourceMappingURL=tokenizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.d.ts","sourceRoot":"","sources":["../../src/utils/tokenizer.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAE/C"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.tokenize = tokenize;
4
+ function tokenize(text) {
5
+ return text.split(/\s+/).filter(Boolean);
6
+ }
7
+ //# sourceMappingURL=tokenizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../src/utils/tokenizer.ts"],"names":[],"mappings":";;AAAA,4BAEC;AAFD,SAAgB,QAAQ,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC3C,CAAC"}
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "ai-output-assert",
3
+ "version": "0.3.0",
4
+ "description": "Rich assertion library for LLM outputs as Jest/Vitest matchers",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "test": "vitest run",
13
+ "lint": "eslint src/",
14
+ "prepublishOnly": "npm run build"
15
+ },
16
+ "keywords": [],
17
+ "author": "",
18
+ "license": "MIT",
19
+ "engines": {
20
+ "node": ">=18"
21
+ },
22
+ "publishConfig": {
23
+ "access": "public"
24
+ },
25
+ "devDependencies": {
26
+ "@types/node": "^25.5.0",
27
+ "@typescript-eslint/eslint-plugin": "^8.57.1",
28
+ "@typescript-eslint/parser": "^8.57.1",
29
+ "eslint": "^10.1.0",
30
+ "typescript": "^5.9.3",
31
+ "vitest": "^4.1.0"
32
+ },
33
+ "dependencies": {
34
+ "ajv": "^8.18.0"
35
+ }
36
+ }