@rangerchaz/aimem 0.2.0 → 0.2.2

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 (182) hide show
  1. package/README.md +10 -11
  2. package/dist/cli/commands/git.d.ts +0 -0
  3. package/dist/cli/commands/git.d.ts.map +0 -0
  4. package/dist/cli/commands/git.js +0 -0
  5. package/dist/cli/commands/git.js.map +0 -0
  6. package/dist/cli/commands/guardrails.d.ts.map +1 -1
  7. package/dist/cli/commands/guardrails.js +90 -1
  8. package/dist/cli/commands/guardrails.js.map +1 -1
  9. package/dist/cli/commands/import.d.ts +0 -0
  10. package/dist/cli/commands/import.d.ts.map +0 -0
  11. package/dist/cli/commands/import.js +0 -0
  12. package/dist/cli/commands/import.js.map +0 -0
  13. package/dist/cli/commands/init.d.ts +0 -0
  14. package/dist/cli/commands/init.d.ts.map +0 -0
  15. package/dist/cli/commands/init.js +0 -0
  16. package/dist/cli/commands/init.js.map +0 -0
  17. package/dist/cli/commands/mcp-serve.d.ts +0 -0
  18. package/dist/cli/commands/mcp-serve.d.ts.map +0 -0
  19. package/dist/cli/commands/mcp-serve.js +0 -0
  20. package/dist/cli/commands/mcp-serve.js.map +0 -0
  21. package/dist/cli/commands/query.d.ts +0 -0
  22. package/dist/cli/commands/query.d.ts.map +0 -0
  23. package/dist/cli/commands/query.js +0 -0
  24. package/dist/cli/commands/query.js.map +0 -0
  25. package/dist/cli/commands/reindex.js +4 -4
  26. package/dist/cli/commands/setup.d.ts +0 -0
  27. package/dist/cli/commands/setup.d.ts.map +0 -0
  28. package/dist/cli/commands/setup.js +0 -0
  29. package/dist/cli/commands/setup.js.map +0 -0
  30. package/dist/cli/commands/start.d.ts +0 -0
  31. package/dist/cli/commands/start.d.ts.map +0 -0
  32. package/dist/cli/commands/start.js +0 -0
  33. package/dist/cli/commands/start.js.map +0 -0
  34. package/dist/cli/commands/status.d.ts +0 -0
  35. package/dist/cli/commands/status.d.ts.map +0 -0
  36. package/dist/cli/commands/status.js +0 -0
  37. package/dist/cli/commands/status.js.map +0 -0
  38. package/dist/cli/commands/stop.d.ts +0 -0
  39. package/dist/cli/commands/stop.d.ts.map +0 -0
  40. package/dist/cli/commands/stop.js +0 -0
  41. package/dist/cli/commands/stop.js.map +0 -0
  42. package/dist/cli/commands/visualize.d.ts +0 -0
  43. package/dist/cli/commands/visualize.d.ts.map +0 -0
  44. package/dist/cli/commands/visualize.js +0 -0
  45. package/dist/cli/commands/visualize.js.map +0 -0
  46. package/dist/cli/index.d.ts +0 -0
  47. package/dist/cli/index.d.ts.map +0 -0
  48. package/dist/cli/index.js +0 -0
  49. package/dist/cli/index.js.map +0 -0
  50. package/dist/db/index.d.ts +16 -1
  51. package/dist/db/index.d.ts.map +1 -1
  52. package/dist/db/index.js +325 -196
  53. package/dist/db/index.js.map +1 -1
  54. package/dist/db/schema.d.ts +0 -0
  55. package/dist/db/schema.d.ts.map +1 -1
  56. package/dist/db/schema.js +247 -238
  57. package/dist/db/schema.js.map +1 -1
  58. package/dist/extractor/index.d.ts +0 -0
  59. package/dist/extractor/index.d.ts.map +0 -0
  60. package/dist/extractor/index.js +0 -0
  61. package/dist/extractor/index.js.map +0 -0
  62. package/dist/git/extractor.d.ts +0 -0
  63. package/dist/git/extractor.d.ts.map +0 -0
  64. package/dist/git/extractor.js +0 -0
  65. package/dist/git/extractor.js.map +0 -0
  66. package/dist/git/hooks.d.ts +0 -0
  67. package/dist/git/hooks.d.ts.map +0 -0
  68. package/dist/git/hooks.js +0 -0
  69. package/dist/git/hooks.js.map +0 -0
  70. package/dist/git/index.d.ts +0 -0
  71. package/dist/git/index.d.ts.map +0 -0
  72. package/dist/git/index.js +0 -0
  73. package/dist/git/index.js.map +0 -0
  74. package/dist/guardrails/enforcer.d.ts +3 -2
  75. package/dist/guardrails/enforcer.d.ts.map +1 -1
  76. package/dist/guardrails/enforcer.js +30 -3
  77. package/dist/guardrails/enforcer.js.map +1 -1
  78. package/dist/guardrails/index.d.ts +2 -0
  79. package/dist/guardrails/index.d.ts.map +1 -1
  80. package/dist/guardrails/index.js +4 -0
  81. package/dist/guardrails/index.js.map +1 -1
  82. package/dist/guardrails/vindication-checker.d.ts +24 -0
  83. package/dist/guardrails/vindication-checker.d.ts.map +1 -0
  84. package/dist/guardrails/vindication-checker.js +209 -0
  85. package/dist/guardrails/vindication-checker.js.map +1 -0
  86. package/dist/guardrails/vindication-queue.d.ts +63 -0
  87. package/dist/guardrails/vindication-queue.d.ts.map +1 -0
  88. package/dist/guardrails/vindication-queue.js +98 -0
  89. package/dist/guardrails/vindication-queue.js.map +1 -0
  90. package/dist/indexer/index.d.ts +0 -0
  91. package/dist/indexer/index.d.ts.map +0 -0
  92. package/dist/indexer/index.js +0 -0
  93. package/dist/indexer/index.js.map +0 -0
  94. package/dist/indexer/parsers/base.d.ts +0 -0
  95. package/dist/indexer/parsers/base.d.ts.map +0 -0
  96. package/dist/indexer/parsers/base.js +0 -0
  97. package/dist/indexer/parsers/base.js.map +0 -0
  98. package/dist/indexer/parsers/cpp.d.ts +0 -0
  99. package/dist/indexer/parsers/cpp.d.ts.map +0 -0
  100. package/dist/indexer/parsers/cpp.js +0 -0
  101. package/dist/indexer/parsers/cpp.js.map +0 -0
  102. package/dist/indexer/parsers/go.d.ts +0 -0
  103. package/dist/indexer/parsers/go.d.ts.map +0 -0
  104. package/dist/indexer/parsers/go.js +0 -0
  105. package/dist/indexer/parsers/go.js.map +0 -0
  106. package/dist/indexer/parsers/java.d.ts +0 -0
  107. package/dist/indexer/parsers/java.d.ts.map +0 -0
  108. package/dist/indexer/parsers/java.js +0 -0
  109. package/dist/indexer/parsers/java.js.map +0 -0
  110. package/dist/indexer/parsers/javascript.d.ts +0 -0
  111. package/dist/indexer/parsers/javascript.d.ts.map +0 -0
  112. package/dist/indexer/parsers/javascript.js +0 -0
  113. package/dist/indexer/parsers/javascript.js.map +0 -0
  114. package/dist/indexer/parsers/kotlin.d.ts +0 -0
  115. package/dist/indexer/parsers/kotlin.d.ts.map +0 -0
  116. package/dist/indexer/parsers/kotlin.js +0 -0
  117. package/dist/indexer/parsers/kotlin.js.map +0 -0
  118. package/dist/indexer/parsers/php.d.ts +0 -0
  119. package/dist/indexer/parsers/php.d.ts.map +0 -0
  120. package/dist/indexer/parsers/php.js +0 -0
  121. package/dist/indexer/parsers/php.js.map +0 -0
  122. package/dist/indexer/parsers/python.d.ts +0 -0
  123. package/dist/indexer/parsers/python.d.ts.map +0 -0
  124. package/dist/indexer/parsers/python.js +0 -0
  125. package/dist/indexer/parsers/python.js.map +0 -0
  126. package/dist/indexer/parsers/ruby.d.ts +0 -0
  127. package/dist/indexer/parsers/ruby.d.ts.map +0 -0
  128. package/dist/indexer/parsers/ruby.js +0 -0
  129. package/dist/indexer/parsers/ruby.js.map +0 -0
  130. package/dist/indexer/parsers/rust.d.ts +0 -0
  131. package/dist/indexer/parsers/rust.d.ts.map +0 -0
  132. package/dist/indexer/parsers/rust.js +0 -0
  133. package/dist/indexer/parsers/rust.js.map +0 -0
  134. package/dist/indexer/watcher-daemon.d.ts +0 -0
  135. package/dist/indexer/watcher-daemon.d.ts.map +0 -0
  136. package/dist/indexer/watcher-daemon.js +10 -0
  137. package/dist/indexer/watcher-daemon.js.map +1 -1
  138. package/dist/indexer/watcher.d.ts +2 -0
  139. package/dist/indexer/watcher.d.ts.map +1 -1
  140. package/dist/indexer/watcher.js +8 -0
  141. package/dist/indexer/watcher.js.map +1 -1
  142. package/dist/mcp/server.d.ts +0 -0
  143. package/dist/mcp/server.d.ts.map +1 -1
  144. package/dist/mcp/server.js +176 -274
  145. package/dist/mcp/server.js.map +1 -1
  146. package/dist/proxy/interceptor-mockttp.d.ts +0 -0
  147. package/dist/proxy/interceptor-mockttp.d.ts.map +1 -1
  148. package/dist/proxy/interceptor-mockttp.js +4 -2
  149. package/dist/proxy/interceptor-mockttp.js.map +1 -1
  150. package/dist/proxy/proxy-daemon.d.ts +0 -0
  151. package/dist/proxy/proxy-daemon.d.ts.map +0 -0
  152. package/dist/proxy/proxy-daemon.js +0 -0
  153. package/dist/proxy/proxy-daemon.js.map +0 -0
  154. package/dist/query/index.d.ts +0 -0
  155. package/dist/query/index.d.ts.map +0 -0
  156. package/dist/query/index.js +0 -0
  157. package/dist/query/index.js.map +0 -0
  158. package/dist/types/index.d.ts +38 -0
  159. package/dist/types/index.d.ts.map +1 -1
  160. package/dist/types/index.js +0 -0
  161. package/dist/types/index.js.map +0 -0
  162. package/dist/visualize/index.d.ts +0 -0
  163. package/dist/visualize/index.d.ts.map +0 -0
  164. package/dist/visualize/index.js +0 -0
  165. package/dist/visualize/index.js.map +0 -0
  166. package/dist/visualize/server.d.ts +0 -0
  167. package/dist/visualize/server.d.ts.map +0 -0
  168. package/dist/visualize/server.js +0 -0
  169. package/dist/visualize/server.js.map +0 -0
  170. package/dist/visualize/template.d.ts +0 -0
  171. package/dist/visualize/template.d.ts.map +0 -0
  172. package/dist/visualize/template.js +0 -0
  173. package/dist/visualize/template.js.map +0 -0
  174. package/package.json +16 -5
  175. package/dist/cli/commands/hook-session-end.d.ts +0 -7
  176. package/dist/cli/commands/hook-session-end.d.ts.map +0 -1
  177. package/dist/cli/commands/hook-session-end.js +0 -109
  178. package/dist/cli/commands/hook-session-end.js.map +0 -1
  179. package/dist/cli/commands/hook-session-start.d.ts +0 -7
  180. package/dist/cli/commands/hook-session-start.d.ts.map +0 -1
  181. package/dist/cli/commands/hook-session-start.js +0 -116
  182. package/dist/cli/commands/hook-session-start.js.map +0 -1
File without changes
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Checks if proposed actions violate any guardrails.
5
5
  */
6
- import type { GuardrailCheckResult } from '../types/index.js';
6
+ import type { GuardrailCheckResult, OverrideContext } from '../types/index.js';
7
7
  /**
8
8
  * Check if an action violates any guardrails.
9
9
  *
@@ -18,8 +18,9 @@ export declare function checkGuardrails(projectId: number, action: string, conte
18
18
  export declare function acceptGuardrail(guardrailId: number, projectId: number): void;
19
19
  /**
20
20
  * Record that a user overrode a triggered guardrail.
21
+ * If vindication context is provided, the override will be tracked for auto-vindication.
21
22
  */
22
- export declare function overrideGuardrail(guardrailId: number, projectId: number, reason: string): number;
23
+ export declare function overrideGuardrail(guardrailId: number, projectId: number, reason: string, context?: OverrideContext): number;
23
24
  /**
24
25
  * Mark an override as vindicated (user regretted it).
25
26
  * This is gold for DIK.
@@ -1 +1 @@
1
- {"version":3,"file":"enforcer.d.ts","sourceRoot":"","sources":["../../src/guardrails/enforcer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,OAAO,KAAK,EAAiC,oBAAoB,EAAqB,MAAM,mBAAmB,CAAC;AAEhH;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GACf,oBAAoB,CAsDtB;AAmED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAM5E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,MAAM,CAMR;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAc5E"}
1
+ {"version":3,"file":"enforcer.d.ts","sourceRoot":"","sources":["../../src/guardrails/enforcer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAeH,OAAO,KAAK,EAAiC,oBAAoB,EAAqB,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEjI;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GACf,oBAAoB,CAsDtB;AAmED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAM5E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,eAAe,GACxB,MAAM,CAsCR;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAc5E"}
@@ -3,9 +3,11 @@
3
3
  *
4
4
  * Checks if proposed actions violate any guardrails.
5
5
  */
6
- import { getProjectGuardrails, getOrCreateProjectDik, getGuardrailHistory, insertGuardrailEvent, incrementDikCounter, getGuardrailEvent, } from '../db/index.js';
6
+ import { readFileSync, existsSync } from 'fs';
7
+ import { getProjectGuardrails, getOrCreateProjectDik, getGuardrailHistory, insertGuardrailEvent, insertGuardrailEventWithContext, incrementDikCounter, getGuardrailEvent, } from '../db/index.js';
7
8
  import { calculateDik } from './calculator.js';
8
9
  import { generateCombinedResponse } from './responder.js';
10
+ import { computeContentHash, readCodeAtLines } from './vindication-checker.js';
9
11
  /**
10
12
  * Check if an action violates any guardrails.
11
13
  *
@@ -127,11 +129,36 @@ export function acceptGuardrail(guardrailId, projectId) {
127
129
  }
128
130
  /**
129
131
  * Record that a user overrode a triggered guardrail.
132
+ * If vindication context is provided, the override will be tracked for auto-vindication.
130
133
  */
131
- export function overrideGuardrail(guardrailId, projectId, reason) {
134
+ export function overrideGuardrail(guardrailId, projectId, reason, context) {
132
135
  const dikData = getOrCreateProjectDik(projectId);
133
136
  const dikLevel = calculateDik(dikData);
134
- const event = insertGuardrailEvent(guardrailId, 'overridden', reason, null, dikLevel);
137
+ // If we have context with a file path, capture code for vindication tracking
138
+ let vindicationContext;
139
+ if (context?.filePath && context?.suggestion) {
140
+ vindicationContext = { ...context };
141
+ // Read current code at the specified lines (if provided)
142
+ if (context.lineStart && context.lineEnd) {
143
+ const code = readCodeAtLines(context.filePath, context.lineStart, context.lineEnd);
144
+ if (code) {
145
+ vindicationContext.codeContext = code;
146
+ vindicationContext.contentHash = computeContentHash(code);
147
+ }
148
+ }
149
+ else if (existsSync(context.filePath)) {
150
+ // Read entire file if no line range specified
151
+ try {
152
+ const code = readFileSync(context.filePath, 'utf-8');
153
+ vindicationContext.codeContext = code.slice(0, 5000); // Limit size
154
+ vindicationContext.contentHash = computeContentHash(code);
155
+ }
156
+ catch {
157
+ // Ignore read errors
158
+ }
159
+ }
160
+ }
161
+ const event = insertGuardrailEventWithContext(guardrailId, 'overridden', reason, null, dikLevel, vindicationContext);
135
162
  return event.id;
136
163
  }
137
164
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"enforcer.js","sourceRoot":"","sources":["../../src/guardrails/enforcer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"enforcer.js","sourceRoot":"","sources":["../../src/guardrails/enforcer.ts"],"names":[],"mappings":"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"}
@@ -9,4 +9,6 @@ export { analyzeProject, saveProposedRules, } from './analyzer.js';
9
9
  export { checkGuardrails, acceptGuardrail, overrideGuardrail, vindicateOverride, } from './enforcer.js';
10
10
  export { generateResponse, generateCombinedResponse, formatSeverityPrefix, } from './responder.js';
11
11
  export { importLinterRules, type LinterConfig, type ImportedRule, } from './linter-import.js';
12
+ export { getAllPending, getPendingForFiles, queueCheck, getQueuedChecks, getQueuedChecksLimited, dequeueCheck, clearQueue, recordResult, markChecked, expireOld, hasQueuedChecks, getQueuedCount, } from './vindication-queue.js';
13
+ export { checkForVindication, checkFileForVindications, computeContentHash, readCodeAtLines, } from './vindication-checker.js';
12
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/guardrails/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,YAAY,EACZ,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,uBAAuB,EACvB,KAAK,YAAY,GAClB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,cAAc,EACd,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,iBAAiB,EACjB,KAAK,YAAY,EACjB,KAAK,YAAY,GAClB,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/guardrails/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,YAAY,EACZ,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,uBAAuB,EACvB,KAAK,YAAY,GAClB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,cAAc,EACd,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,iBAAiB,EACjB,KAAK,YAAY,EACjB,KAAK,YAAY,GAClB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,UAAU,EACV,eAAe,EACf,sBAAsB,EACtB,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,WAAW,EACX,SAAS,EACT,eAAe,EACf,cAAc,GACf,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,GAChB,MAAM,0BAA0B,CAAC"}
@@ -14,4 +14,8 @@ export { checkGuardrails, acceptGuardrail, overrideGuardrail, vindicateOverride,
14
14
  export { generateResponse, generateCombinedResponse, formatSeverityPrefix, } from './responder.js';
15
15
  // Linter import exports
16
16
  export { importLinterRules, } from './linter-import.js';
17
+ // Vindication queue exports
18
+ export { getAllPending, getPendingForFiles, queueCheck, getQueuedChecks, getQueuedChecksLimited, dequeueCheck, clearQueue, recordResult, markChecked, expireOld, hasQueuedChecks, getQueuedCount, } from './vindication-queue.js';
19
+ // Vindication checker exports
20
+ export { checkForVindication, checkFileForVindications, computeContentHash, readCodeAtLines, } from './vindication-checker.js';
17
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/guardrails/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qBAAqB;AACrB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,uBAAuB,GAExB,MAAM,iBAAiB,CAAC;AAEzB,mBAAmB;AACnB,OAAO,EACL,cAAc,EACd,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAEvB,mBAAmB;AACnB,OAAO,EACL,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAEvB,oBAAoB;AACpB,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAExB,wBAAwB;AACxB,OAAO,EACL,iBAAiB,GAGlB,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/guardrails/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qBAAqB;AACrB,OAAO,EACL,YAAY,EACZ,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,uBAAuB,GAExB,MAAM,iBAAiB,CAAC;AAEzB,mBAAmB;AACnB,OAAO,EACL,cAAc,EACd,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAEvB,mBAAmB;AACnB,OAAO,EACL,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAEvB,oBAAoB;AACpB,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAExB,wBAAwB;AACxB,OAAO,EACL,iBAAiB,GAGlB,MAAM,oBAAoB,CAAC;AAE5B,4BAA4B;AAC5B,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,UAAU,EACV,eAAe,EACf,sBAAsB,EACtB,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,WAAW,EACX,SAAS,EACT,eAAe,EACf,cAAc,GACf,MAAM,wBAAwB,CAAC;AAEhC,8BAA8B;AAC9B,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,GAChB,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Vindication Checker
3
+ *
4
+ * Heuristic-based detection of when user's code converges
5
+ * toward an AI suggestion they previously overrode.
6
+ */
7
+ import type { VindicationCandidate, VindicationResult, VindicationCheckResult } from '../types/index.js';
8
+ /**
9
+ * Check a single candidate for vindication using heuristics
10
+ */
11
+ export declare function checkForVindication(candidate: VindicationCandidate, newCode: string): VindicationResult;
12
+ /**
13
+ * Check all pending vindications for a specific file
14
+ */
15
+ export declare function checkFileForVindications(projectId: number, filePath: string): VindicationCheckResult[];
16
+ /**
17
+ * Compute content hash for a code snippet
18
+ */
19
+ export declare function computeContentHash(content: string): string;
20
+ /**
21
+ * Read code from file at specified line range
22
+ */
23
+ export declare function readCodeAtLines(filePath: string, lineStart: number, lineEnd: number): string | null;
24
+ //# sourceMappingURL=vindication-checker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vindication-checker.d.ts","sourceRoot":"","sources":["../../src/guardrails/vindication-checker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAEzG;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,oBAAoB,EAC/B,OAAO,EAAE,MAAM,GACd,iBAAiB,CA8DnB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,sBAAsB,EAAE,CA2C1B;AAoGD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,IAAI,CAcf"}
@@ -0,0 +1,209 @@
1
+ /**
2
+ * Vindication Checker
3
+ *
4
+ * Heuristic-based detection of when user's code converges
5
+ * toward an AI suggestion they previously overrode.
6
+ */
7
+ import { readFileSync, existsSync } from 'fs';
8
+ import { createHash } from 'crypto';
9
+ import { getPendingVindicationsForFile, markVindicationChecked, } from '../db/index.js';
10
+ import { vindicateOverride } from './enforcer.js';
11
+ /**
12
+ * Check a single candidate for vindication using heuristics
13
+ */
14
+ export function checkForVindication(candidate, newCode) {
15
+ // Calculate new hash
16
+ const newHash = createHash('md5').update(newCode).digest('hex');
17
+ // If hash is the same, no change - not vindicated
18
+ if (newHash === candidate.contentHash) {
19
+ return {
20
+ eventId: candidate.eventId,
21
+ vindicated: false,
22
+ confidence: 0,
23
+ reason: 'Code has not changed',
24
+ };
25
+ }
26
+ // Extract keywords from suggestion
27
+ const suggestionKeywords = extractKeywords(candidate.suggestion);
28
+ // Count how many suggestion keywords appear in new code
29
+ const newCodeLower = newCode.toLowerCase();
30
+ let matchedKeywords = 0;
31
+ const matchedWords = [];
32
+ for (const keyword of suggestionKeywords) {
33
+ if (newCodeLower.includes(keyword.toLowerCase())) {
34
+ matchedKeywords++;
35
+ matchedWords.push(keyword);
36
+ }
37
+ }
38
+ // Calculate confidence based on keyword match ratio
39
+ const keywordConfidence = suggestionKeywords.length > 0
40
+ ? matchedKeywords / suggestionKeywords.length
41
+ : 0;
42
+ // Check for pattern reversal (user undid what they did)
43
+ const patternConfidence = checkPatternReversal(candidate.originalCode, newCode, candidate.suggestion);
44
+ // Combined confidence
45
+ const confidence = Math.max(keywordConfidence, patternConfidence);
46
+ // Determine if vindicated
47
+ const vindicated = confidence >= 0.7;
48
+ let reason;
49
+ if (vindicated) {
50
+ reason = `Code now includes: ${matchedWords.slice(0, 3).join(', ')}`;
51
+ }
52
+ else if (confidence >= 0.4) {
53
+ reason = `Partial match (${Math.round(confidence * 100)}%): ${matchedWords.slice(0, 2).join(', ')}`;
54
+ }
55
+ else {
56
+ reason = 'Code changed but does not match suggestion';
57
+ }
58
+ return {
59
+ eventId: candidate.eventId,
60
+ vindicated,
61
+ confidence,
62
+ reason,
63
+ };
64
+ }
65
+ /**
66
+ * Check all pending vindications for a specific file
67
+ */
68
+ export function checkFileForVindications(projectId, filePath) {
69
+ const candidates = getPendingVindicationsForFile(projectId, filePath);
70
+ const results = [];
71
+ if (candidates.length === 0) {
72
+ return results;
73
+ }
74
+ // Read current file content
75
+ if (!existsSync(filePath)) {
76
+ return results;
77
+ }
78
+ const fileContent = readFileSync(filePath, 'utf-8');
79
+ const lines = fileContent.split('\n');
80
+ for (const candidate of candidates) {
81
+ // Extract relevant lines
82
+ const startLine = Math.max(0, (candidate.lineStart || 1) - 1);
83
+ const endLine = Math.min(lines.length, candidate.lineEnd || lines.length);
84
+ const relevantCode = lines.slice(startLine, endLine).join('\n');
85
+ const result = checkForVindication(candidate, relevantCode);
86
+ if (result.vindicated) {
87
+ // Auto-vindicate!
88
+ const newDikLevel = vindicateOverride(candidate.eventId, projectId);
89
+ results.push({
90
+ candidate,
91
+ result,
92
+ newDikLevel,
93
+ });
94
+ }
95
+ else {
96
+ // Mark as checked but not vindicated
97
+ markVindicationChecked(candidate.eventId);
98
+ results.push({
99
+ candidate,
100
+ result,
101
+ });
102
+ }
103
+ }
104
+ return results;
105
+ }
106
+ /**
107
+ * Extract meaningful keywords from suggestion text
108
+ */
109
+ function extractKeywords(suggestion) {
110
+ const keywords = [];
111
+ // Extract quoted strings
112
+ const quotedMatches = suggestion.match(/"[^"]+"|'[^']+'/g) || [];
113
+ for (const match of quotedMatches) {
114
+ keywords.push(match.slice(1, -1));
115
+ }
116
+ // Extract code snippets (backticks)
117
+ const codeMatches = suggestion.match(/`[^`]+`/g) || [];
118
+ for (const match of codeMatches) {
119
+ keywords.push(match.slice(1, -1));
120
+ }
121
+ // Extract identifiers (camelCase, PascalCase, snake_case)
122
+ const identifierPattern = /\b([a-z][a-zA-Z0-9]*|[A-Z][a-zA-Z0-9]*|[a-z]+_[a-z_]+)\b/g;
123
+ const identifierMatches = suggestion.match(identifierPattern) || [];
124
+ // Filter out common words
125
+ const commonWords = new Set([
126
+ 'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
127
+ 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',
128
+ 'should', 'may', 'might', 'must', 'can', 'this', 'that', 'these',
129
+ 'those', 'it', 'its', 'to', 'of', 'in', 'for', 'on', 'with', 'as',
130
+ 'at', 'by', 'from', 'or', 'and', 'but', 'if', 'then', 'else', 'when',
131
+ 'use', 'using', 'used', 'instead', 'rather', 'than', 'not', 'should',
132
+ 'you', 'we', 'they', 'your', 'our', 'their', 'my', 'i', 'me',
133
+ ]);
134
+ for (const match of identifierMatches) {
135
+ if (match.length >= 3 && !commonWords.has(match.toLowerCase())) {
136
+ keywords.push(match);
137
+ }
138
+ }
139
+ // Deduplicate
140
+ return [...new Set(keywords)];
141
+ }
142
+ /**
143
+ * Check if the code change represents a pattern reversal
144
+ */
145
+ function checkPatternReversal(originalCode, newCode, suggestion) {
146
+ const suggestionLower = suggestion.toLowerCase();
147
+ const originalLower = originalCode.toLowerCase();
148
+ const newLower = newCode.toLowerCase();
149
+ // Pattern: "Use X instead of Y"
150
+ const useInsteadMatch = suggestionLower.match(/use\s+(\w+)\s+instead\s+of\s+(\w+)/);
151
+ if (useInsteadMatch) {
152
+ const [, preferred, deprecated] = useInsteadMatch;
153
+ const hadDeprecated = originalLower.includes(deprecated);
154
+ const hasPreferred = newLower.includes(preferred);
155
+ const removedDeprecated = !newLower.includes(deprecated);
156
+ if (hadDeprecated && hasPreferred && removedDeprecated) {
157
+ return 0.9; // Strong indicator
158
+ }
159
+ if (hasPreferred) {
160
+ return 0.6; // Moderate indicator
161
+ }
162
+ }
163
+ // Pattern: "Add X" or "Include X"
164
+ const addMatch = suggestionLower.match(/(?:add|include|implement)\s+(\w+)/);
165
+ if (addMatch) {
166
+ const [, feature] = addMatch;
167
+ const hadFeature = originalLower.includes(feature);
168
+ const hasFeature = newLower.includes(feature);
169
+ if (!hadFeature && hasFeature) {
170
+ return 0.8; // Strong indicator - added what was suggested
171
+ }
172
+ }
173
+ // Pattern: "Remove X" or "Delete X"
174
+ const removeMatch = suggestionLower.match(/(?:remove|delete|drop)\s+(\w+)/);
175
+ if (removeMatch) {
176
+ const [, feature] = removeMatch;
177
+ const hadFeature = originalLower.includes(feature);
178
+ const hasFeature = newLower.includes(feature);
179
+ if (hadFeature && !hasFeature) {
180
+ return 0.8; // Strong indicator - removed what was suggested
181
+ }
182
+ }
183
+ return 0;
184
+ }
185
+ /**
186
+ * Compute content hash for a code snippet
187
+ */
188
+ export function computeContentHash(content) {
189
+ return createHash('md5').update(content).digest('hex');
190
+ }
191
+ /**
192
+ * Read code from file at specified line range
193
+ */
194
+ export function readCodeAtLines(filePath, lineStart, lineEnd) {
195
+ if (!existsSync(filePath)) {
196
+ return null;
197
+ }
198
+ try {
199
+ const content = readFileSync(filePath, 'utf-8');
200
+ const lines = content.split('\n');
201
+ const start = Math.max(0, lineStart - 1);
202
+ const end = Math.min(lines.length, lineEnd);
203
+ return lines.slice(start, end).join('\n');
204
+ }
205
+ catch {
206
+ return null;
207
+ }
208
+ }
209
+ //# sourceMappingURL=vindication-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vindication-checker.js","sourceRoot":"","sources":["../../src/guardrails/vindication-checker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Vindication Queue
3
+ *
4
+ * Manages pending vindication checks for overridden guardrails.
5
+ * When a file changes, we check if any pending vindications exist
6
+ * for that file and queue them for evaluation.
7
+ */
8
+ import type { VindicationCandidate, VindicationResult } from '../types/index.js';
9
+ interface QueuedCheck {
10
+ candidate: VindicationCandidate;
11
+ newCode: string;
12
+ queuedAt: Date;
13
+ }
14
+ /**
15
+ * Get all pending vindication candidates for a project
16
+ */
17
+ export declare function getAllPending(projectId: number): VindicationCandidate[];
18
+ /**
19
+ * Get pending vindication candidates for specific files
20
+ */
21
+ export declare function getPendingForFiles(projectId: number, files: string[]): VindicationCandidate[];
22
+ /**
23
+ * Queue a vindication check for processing
24
+ */
25
+ export declare function queueCheck(candidate: VindicationCandidate, newCode: string): void;
26
+ /**
27
+ * Get all queued checks waiting to be processed
28
+ */
29
+ export declare function getQueuedChecks(): QueuedCheck[];
30
+ /**
31
+ * Get queued checks limited to a max count (for injection)
32
+ */
33
+ export declare function getQueuedChecksLimited(maxChecks?: number): QueuedCheck[];
34
+ /**
35
+ * Clear a specific check from the queue
36
+ */
37
+ export declare function dequeueCheck(eventId: number): void;
38
+ /**
39
+ * Clear all queued checks
40
+ */
41
+ export declare function clearQueue(): void;
42
+ /**
43
+ * Record a vindication result
44
+ */
45
+ export declare function recordResult(eventId: number, result: VindicationResult): void;
46
+ /**
47
+ * Mark a check as completed (not vindicated)
48
+ */
49
+ export declare function markChecked(eventId: number): void;
50
+ /**
51
+ * Expire old pending vindications
52
+ */
53
+ export declare function expireOld(projectId: number, maxAgeDays?: number): number;
54
+ /**
55
+ * Check if there are any queued checks waiting
56
+ */
57
+ export declare function hasQueuedChecks(): boolean;
58
+ /**
59
+ * Get the count of queued checks
60
+ */
61
+ export declare function getQueuedCount(): number;
62
+ export {};
63
+ //# sourceMappingURL=vindication-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vindication-queue.d.ts","sourceRoot":"","sources":["../../src/guardrails/vindication-queue.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGjF,UAAU,WAAW;IACnB,SAAS,EAAE,oBAAoB,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,IAAI,CAAC;CAChB;AAID;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,oBAAoB,EAAE,CAEvE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,oBAAoB,EAAE,CAM7F;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAMjF;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,WAAW,EAAE,CAE/C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,GAAE,MAAU,GAAG,WAAW,EAAE,CAG3E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAO7E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAGjD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,GAAE,MAAW,GAAG,MAAM,CAE5E;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Vindication Queue
3
+ *
4
+ * Manages pending vindication checks for overridden guardrails.
5
+ * When a file changes, we check if any pending vindications exist
6
+ * for that file and queue them for evaluation.
7
+ */
8
+ import { getPendingVindications, getPendingVindicationsForFile, markVindicationChecked, markVindicated, expireOldVindications, } from '../db/index.js';
9
+ const pendingChecks = new Map();
10
+ /**
11
+ * Get all pending vindication candidates for a project
12
+ */
13
+ export function getAllPending(projectId) {
14
+ return getPendingVindications(projectId);
15
+ }
16
+ /**
17
+ * Get pending vindication candidates for specific files
18
+ */
19
+ export function getPendingForFiles(projectId, files) {
20
+ const candidates = [];
21
+ for (const file of files) {
22
+ candidates.push(...getPendingVindicationsForFile(projectId, file));
23
+ }
24
+ return candidates;
25
+ }
26
+ /**
27
+ * Queue a vindication check for processing
28
+ */
29
+ export function queueCheck(candidate, newCode) {
30
+ pendingChecks.set(candidate.eventId, {
31
+ candidate,
32
+ newCode,
33
+ queuedAt: new Date(),
34
+ });
35
+ }
36
+ /**
37
+ * Get all queued checks waiting to be processed
38
+ */
39
+ export function getQueuedChecks() {
40
+ return Array.from(pendingChecks.values());
41
+ }
42
+ /**
43
+ * Get queued checks limited to a max count (for injection)
44
+ */
45
+ export function getQueuedChecksLimited(maxChecks = 3) {
46
+ const checks = Array.from(pendingChecks.values());
47
+ return checks.slice(0, maxChecks);
48
+ }
49
+ /**
50
+ * Clear a specific check from the queue
51
+ */
52
+ export function dequeueCheck(eventId) {
53
+ pendingChecks.delete(eventId);
54
+ }
55
+ /**
56
+ * Clear all queued checks
57
+ */
58
+ export function clearQueue() {
59
+ pendingChecks.clear();
60
+ }
61
+ /**
62
+ * Record a vindication result
63
+ */
64
+ export function recordResult(eventId, result) {
65
+ if (result.vindicated && result.confidence >= 0.7) {
66
+ markVindicated(eventId);
67
+ }
68
+ else {
69
+ markVindicationChecked(eventId);
70
+ }
71
+ dequeueCheck(eventId);
72
+ }
73
+ /**
74
+ * Mark a check as completed (not vindicated)
75
+ */
76
+ export function markChecked(eventId) {
77
+ markVindicationChecked(eventId);
78
+ dequeueCheck(eventId);
79
+ }
80
+ /**
81
+ * Expire old pending vindications
82
+ */
83
+ export function expireOld(projectId, maxAgeDays = 30) {
84
+ return expireOldVindications(projectId, maxAgeDays);
85
+ }
86
+ /**
87
+ * Check if there are any queued checks waiting
88
+ */
89
+ export function hasQueuedChecks() {
90
+ return pendingChecks.size > 0;
91
+ }
92
+ /**
93
+ * Get the count of queued checks
94
+ */
95
+ export function getQueuedCount() {
96
+ return pendingChecks.size;
97
+ }
98
+ //# sourceMappingURL=vindication-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vindication-queue.js","sourceRoot":"","sources":["../../src/guardrails/vindication-queue.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,sBAAsB,EACtB,6BAA6B,EAC7B,sBAAsB,EACtB,cAAc,EACd,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AAUxB,MAAM,aAAa,GAA6B,IAAI,GAAG,EAAE,CAAC;AAE1D;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,SAAiB;IAC7C,OAAO,sBAAsB,CAAC,SAAS,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAiB,EAAE,KAAe;IACnE,MAAM,UAAU,GAA2B,EAAE,CAAC;IAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,UAAU,CAAC,IAAI,CAAC,GAAG,6BAA6B,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,SAA+B,EAAE,OAAe;IACzE,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE;QACnC,SAAS;QACT,OAAO;QACP,QAAQ,EAAE,IAAI,IAAI,EAAE;KACrB,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,YAAoB,CAAC;IAC1D,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;IAClD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,aAAa,CAAC,KAAK,EAAE,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,MAAyB;IACrE,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,IAAI,GAAG,EAAE,CAAC;QAClD,cAAc,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;SAAM,CAAC;QACN,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IACD,YAAY,CAAC,OAAO,CAAC,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAChC,YAAY,CAAC,OAAO,CAAC,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,SAAiB,EAAE,aAAqB,EAAE;IAClE,OAAO,qBAAqB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,aAAa,CAAC,IAAI,GAAG,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,aAAa,CAAC,IAAI,CAAC;AAC5B,CAAC"}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes