@cartisien/engram 0.9.0 → 1.0.1
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.
- package/README.md +234 -151
- package/dist/benchmarks/ab-eval/harness.d.ts +31 -0
- package/dist/benchmarks/ab-eval/harness.d.ts.map +1 -0
- package/dist/benchmarks/ab-eval/harness.js +198 -0
- package/dist/benchmarks/ab-eval/harness.js.map +1 -0
- package/dist/benchmarks/ab-eval/questions.d.ts +14 -0
- package/dist/benchmarks/ab-eval/questions.d.ts.map +1 -0
- package/dist/benchmarks/ab-eval/questions.js +139 -0
- package/dist/benchmarks/ab-eval/questions.js.map +1 -0
- package/dist/benchmarks/ab-eval/report.d.ts +8 -0
- package/dist/benchmarks/ab-eval/report.d.ts.map +1 -0
- package/dist/benchmarks/ab-eval/report.js +53 -0
- package/dist/benchmarks/ab-eval/report.js.map +1 -0
- package/dist/benchmarks/ab-eval/run-smoke.d.ts +6 -0
- package/dist/benchmarks/ab-eval/run-smoke.d.ts.map +1 -0
- package/dist/benchmarks/ab-eval/run-smoke.js +21 -0
- package/dist/benchmarks/ab-eval/run-smoke.js.map +1 -0
- package/dist/compiler/extractor.d.ts +10 -0
- package/dist/compiler/extractor.d.ts.map +1 -0
- package/dist/compiler/extractor.js +110 -0
- package/dist/compiler/extractor.js.map +1 -0
- package/dist/compiler/schemas.d.ts +100 -0
- package/dist/compiler/schemas.d.ts.map +1 -0
- package/dist/compiler/schemas.js +46 -0
- package/dist/compiler/schemas.js.map +1 -0
- package/dist/compiler/validators/atomicity.d.ts +13 -0
- package/dist/compiler/validators/atomicity.d.ts.map +1 -0
- package/dist/compiler/validators/atomicity.js +33 -0
- package/dist/compiler/validators/atomicity.js.map +1 -0
- package/dist/compiler/validators/duplicate.d.ts +13 -0
- package/dist/compiler/validators/duplicate.d.ts.map +1 -0
- package/dist/compiler/validators/duplicate.js +32 -0
- package/dist/compiler/validators/duplicate.js.map +1 -0
- package/dist/compiler/validators/entity-reference.d.ts +13 -0
- package/dist/compiler/validators/entity-reference.d.ts.map +1 -0
- package/dist/compiler/validators/entity-reference.js +35 -0
- package/dist/compiler/validators/entity-reference.js.map +1 -0
- package/dist/compiler/validators/index.d.ts +20 -0
- package/dist/compiler/validators/index.d.ts.map +1 -0
- package/dist/compiler/validators/index.js +58 -0
- package/dist/compiler/validators/index.js.map +1 -0
- package/dist/compiler/validators/inference.d.ts +13 -0
- package/dist/compiler/validators/inference.d.ts.map +1 -0
- package/dist/compiler/validators/inference.js +27 -0
- package/dist/compiler/validators/inference.js.map +1 -0
- package/dist/compiler/validators/pronoun-ban.d.ts +11 -0
- package/dist/compiler/validators/pronoun-ban.d.ts.map +1 -0
- package/dist/compiler/validators/pronoun-ban.js +50 -0
- package/dist/compiler/validators/pronoun-ban.js.map +1 -0
- package/dist/compiler/validators/temporal.d.ts +13 -0
- package/dist/compiler/validators/temporal.d.ts.map +1 -0
- package/dist/compiler/validators/temporal.js +43 -0
- package/dist/compiler/validators/temporal.js.map +1 -0
- package/dist/compiler/validators/vagueness.d.ts +14 -0
- package/dist/compiler/validators/vagueness.d.ts.map +1 -0
- package/dist/compiler/validators/vagueness.js +49 -0
- package/dist/compiler/validators/vagueness.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +173 -34
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Compiler — Phase 1 Schemas
|
|
3
|
+
*
|
|
4
|
+
* Structured types for claim extraction, entity resolution,
|
|
5
|
+
* temporal grounding, and validation.
|
|
6
|
+
*/
|
|
7
|
+
export interface ConversationTurn {
|
|
8
|
+
role: 'user' | 'assistant' | 'system';
|
|
9
|
+
content: string;
|
|
10
|
+
timestamp?: string;
|
|
11
|
+
speaker?: string;
|
|
12
|
+
}
|
|
13
|
+
export type EntityType = 'person' | 'organization' | 'location' | 'event' | 'product' | 'concept' | 'unknown';
|
|
14
|
+
export interface Entity {
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
type: EntityType;
|
|
18
|
+
aliases: string[];
|
|
19
|
+
}
|
|
20
|
+
export type TemporalGranularity = 'exact' | 'day' | 'week' | 'month' | 'quarter' | 'year' | 'vague';
|
|
21
|
+
export type TemporalRelation = 'before' | 'after' | 'during' | 'simultaneous' | 'overlaps';
|
|
22
|
+
export interface TemporalInfo {
|
|
23
|
+
raw_text: string;
|
|
24
|
+
normalized_start?: string;
|
|
25
|
+
normalized_end?: string;
|
|
26
|
+
granularity: TemporalGranularity;
|
|
27
|
+
relation_type?: TemporalRelation;
|
|
28
|
+
relation_to_event?: string;
|
|
29
|
+
}
|
|
30
|
+
export type MemoryType = 'episodic' | 'semantic' | 'procedural' | 'preference';
|
|
31
|
+
export type Explicitness = 'stated' | 'implied' | 'inferred';
|
|
32
|
+
export type Polarity = 'positive' | 'negative' | 'neutral';
|
|
33
|
+
export type ClaimStatus = 'active' | 'superseded' | 'contradicted' | 'cancelled';
|
|
34
|
+
export interface MemoryClaim {
|
|
35
|
+
id: string;
|
|
36
|
+
canonical_text: string;
|
|
37
|
+
subject_entity_id: string;
|
|
38
|
+
subject_text: string;
|
|
39
|
+
predicate: string;
|
|
40
|
+
object_text: string;
|
|
41
|
+
object_entity_id?: string;
|
|
42
|
+
memory_type: MemoryType;
|
|
43
|
+
explicitness: Explicitness;
|
|
44
|
+
polarity: Polarity;
|
|
45
|
+
status: ClaimStatus;
|
|
46
|
+
confidence: number;
|
|
47
|
+
temporal?: TemporalInfo;
|
|
48
|
+
source_turn_index: number;
|
|
49
|
+
linked_claim_ids: string[];
|
|
50
|
+
extraction_confidence: number;
|
|
51
|
+
entity_resolution_confidence: number;
|
|
52
|
+
temporal_resolution_confidence: number;
|
|
53
|
+
support_count: number;
|
|
54
|
+
source_directness: number;
|
|
55
|
+
}
|
|
56
|
+
export type RejectionReason = 'pronoun_subject' | 'pronoun_object' | 'temporal_invalid' | 'duplicate' | 'vague_claim' | 'compound_claim' | 'dangling_entity' | 'low_confidence_inference';
|
|
57
|
+
export interface Rejection {
|
|
58
|
+
claim: MemoryClaim;
|
|
59
|
+
reason: RejectionReason;
|
|
60
|
+
detail: string;
|
|
61
|
+
}
|
|
62
|
+
export interface ValidationResult {
|
|
63
|
+
valid: MemoryClaim[];
|
|
64
|
+
rejections: Rejection[];
|
|
65
|
+
}
|
|
66
|
+
export interface ExtractionResult {
|
|
67
|
+
entities: Entity[];
|
|
68
|
+
claims: MemoryClaim[];
|
|
69
|
+
anchor_conversation_time?: string;
|
|
70
|
+
}
|
|
71
|
+
export interface ExtractorConfig {
|
|
72
|
+
model?: string;
|
|
73
|
+
baseUrl?: string;
|
|
74
|
+
apiKey?: string;
|
|
75
|
+
temperature?: number;
|
|
76
|
+
anchorTime?: string;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* claim_confidence =
|
|
80
|
+
* 0.25 * extraction +
|
|
81
|
+
* 0.25 * entity_resolution +
|
|
82
|
+
* 0.20 * temporal_resolution +
|
|
83
|
+
* 0.15 * explicitness +
|
|
84
|
+
* 0.10 * support +
|
|
85
|
+
* 0.05 * source_directness
|
|
86
|
+
*/
|
|
87
|
+
export declare const CONFIDENCE_WEIGHTS: {
|
|
88
|
+
readonly extraction: 0.25;
|
|
89
|
+
readonly entity_resolution: 0.25;
|
|
90
|
+
readonly temporal_resolution: 0.2;
|
|
91
|
+
readonly explicitness: 0.15;
|
|
92
|
+
readonly support: 0.1;
|
|
93
|
+
readonly source_directness: 0.05;
|
|
94
|
+
};
|
|
95
|
+
export declare const EXPLICITNESS_SCORES: Record<Explicitness, number>;
|
|
96
|
+
/**
|
|
97
|
+
* Compute claim confidence from component scores.
|
|
98
|
+
*/
|
|
99
|
+
export declare function computeClaimConfidence(claim: MemoryClaim): number;
|
|
100
|
+
//# sourceMappingURL=schemas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/compiler/schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Compiler — Phase 1 Schemas
|
|
3
|
+
*
|
|
4
|
+
* Structured types for claim extraction, entity resolution,
|
|
5
|
+
* temporal grounding, and validation.
|
|
6
|
+
*/
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Confidence weights
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
/**
|
|
11
|
+
* claim_confidence =
|
|
12
|
+
* 0.25 * extraction +
|
|
13
|
+
* 0.25 * entity_resolution +
|
|
14
|
+
* 0.20 * temporal_resolution +
|
|
15
|
+
* 0.15 * explicitness +
|
|
16
|
+
* 0.10 * support +
|
|
17
|
+
* 0.05 * source_directness
|
|
18
|
+
*/
|
|
19
|
+
export const CONFIDENCE_WEIGHTS = {
|
|
20
|
+
extraction: 0.25,
|
|
21
|
+
entity_resolution: 0.25,
|
|
22
|
+
temporal_resolution: 0.20,
|
|
23
|
+
explicitness: 0.15,
|
|
24
|
+
support: 0.10,
|
|
25
|
+
source_directness: 0.05,
|
|
26
|
+
};
|
|
27
|
+
export const EXPLICITNESS_SCORES = {
|
|
28
|
+
stated: 1.0,
|
|
29
|
+
implied: 0.7,
|
|
30
|
+
inferred: 0.4,
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Compute claim confidence from component scores.
|
|
34
|
+
*/
|
|
35
|
+
export function computeClaimConfidence(claim) {
|
|
36
|
+
const w = CONFIDENCE_WEIGHTS;
|
|
37
|
+
const explicitnessScore = EXPLICITNESS_SCORES[claim.explicitness];
|
|
38
|
+
const supportScore = Math.min(claim.support_count / 5, 1.0); // cap at 5
|
|
39
|
+
return (w.extraction * claim.extraction_confidence +
|
|
40
|
+
w.entity_resolution * claim.entity_resolution_confidence +
|
|
41
|
+
w.temporal_resolution * claim.temporal_resolution_confidence +
|
|
42
|
+
w.explicitness * explicitnessScore +
|
|
43
|
+
w.support * supportScore +
|
|
44
|
+
w.source_directness * claim.source_directness);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/compiler/schemas.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA2JH,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,UAAU,EAAE,IAAI;IAChB,iBAAiB,EAAE,IAAI;IACvB,mBAAmB,EAAE,IAAI;IACzB,YAAY,EAAE,IAAI;IAClB,OAAO,EAAE,IAAI;IACb,iBAAiB,EAAE,IAAI;CACf,CAAA;AAEV,MAAM,CAAC,MAAM,mBAAmB,GAAiC;IAC/D,MAAM,EAAE,GAAG;IACX,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE,GAAG;CACd,CAAA;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAkB;IACvD,MAAM,CAAC,GAAG,kBAAkB,CAAA;IAC5B,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;IACjE,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,EAAE,GAAG,CAAC,CAAA,CAAC,WAAW;IAEvE,OAAO,CACL,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC,qBAAqB;QAC1C,CAAC,CAAC,iBAAiB,GAAG,KAAK,CAAC,4BAA4B;QACxD,CAAC,CAAC,mBAAmB,GAAG,KAAK,CAAC,8BAA8B;QAC5D,CAAC,CAAC,YAAY,GAAG,iBAAiB;QAClC,CAAC,CAAC,OAAO,GAAG,YAAY;QACxB,CAAC,CAAC,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,CAC9C,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Atomicity Validator
|
|
3
|
+
*
|
|
4
|
+
* Rejects claims whose canonical_text contains multiple predicates
|
|
5
|
+
* joined by compound connectors. These should have been split during
|
|
6
|
+
* extraction but sometimes slip through.
|
|
7
|
+
*/
|
|
8
|
+
import type { MemoryClaim, Rejection } from '../schemas.js';
|
|
9
|
+
export declare function validateAtomicity(claims: MemoryClaim[]): {
|
|
10
|
+
valid: MemoryClaim[];
|
|
11
|
+
rejections: Rejection[];
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=atomicity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atomicity.d.ts","sourceRoot":"","sources":["../../../src/compiler/validators/atomicity.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAS3D,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EAAE,GACpB;IAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,UAAU,EAAE,SAAS,EAAE,CAAA;CAAE,CAmBnD"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Atomicity Validator
|
|
3
|
+
*
|
|
4
|
+
* Rejects claims whose canonical_text contains multiple predicates
|
|
5
|
+
* joined by compound connectors. These should have been split during
|
|
6
|
+
* extraction but sometimes slip through.
|
|
7
|
+
*/
|
|
8
|
+
const COMPOUND_CONNECTORS = [
|
|
9
|
+
' and ',
|
|
10
|
+
' but also ',
|
|
11
|
+
' as well as ',
|
|
12
|
+
' while also ',
|
|
13
|
+
];
|
|
14
|
+
export function validateAtomicity(claims) {
|
|
15
|
+
const valid = [];
|
|
16
|
+
const rejections = [];
|
|
17
|
+
for (const claim of claims) {
|
|
18
|
+
const lower = claim.canonical_text.toLowerCase();
|
|
19
|
+
const found = COMPOUND_CONNECTORS.find((c) => lower.includes(c));
|
|
20
|
+
if (found) {
|
|
21
|
+
rejections.push({
|
|
22
|
+
claim,
|
|
23
|
+
reason: 'compound_claim',
|
|
24
|
+
detail: `canonical_text contains compound connector "${found.trim()}"`,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
valid.push(claim);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return { valid, rejections };
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=atomicity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atomicity.js","sourceRoot":"","sources":["../../../src/compiler/validators/atomicity.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,mBAAmB,GAAG;IAC1B,OAAO;IACP,YAAY;IACZ,cAAc;IACd,cAAc;CACf,CAAA;AAED,MAAM,UAAU,iBAAiB,CAC/B,MAAqB;IAErB,MAAM,KAAK,GAAkB,EAAE,CAAA;IAC/B,MAAM,UAAU,GAAgB,EAAE,CAAA;IAElC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC,WAAW,EAAE,CAAA;QAChD,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;QAChE,IAAI,KAAK,EAAE,CAAC;YACV,UAAU,CAAC,IAAI,CAAC;gBACd,KAAK;gBACL,MAAM,EAAE,gBAAgB;gBACxB,MAAM,EAAE,+CAA+C,KAAK,CAAC,IAAI,EAAE,GAAG;aACvE,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACnB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAA;AAC9B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Duplicate Validator
|
|
3
|
+
*
|
|
4
|
+
* Hashes canonical_text + subject_entity_id + predicate.
|
|
5
|
+
* Rejects if hash exists in provided existingHashes Set.
|
|
6
|
+
*/
|
|
7
|
+
import type { MemoryClaim, Rejection } from '../schemas.js';
|
|
8
|
+
export declare function claimHash(claim: MemoryClaim): string;
|
|
9
|
+
export declare function validateDuplicates(claims: MemoryClaim[], existingHashes?: Set<string>): {
|
|
10
|
+
valid: MemoryClaim[];
|
|
11
|
+
rejections: Rejection[];
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=duplicate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duplicate.d.ts","sourceRoot":"","sources":["../../../src/compiler/validators/duplicate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAE3D,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAGpD;AAED,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,WAAW,EAAE,EACrB,cAAc,GAAE,GAAG,CAAC,MAAM,CAAa,GACtC;IAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,UAAU,EAAE,SAAS,EAAE,CAAA;CAAE,CAoBnD"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Duplicate Validator
|
|
3
|
+
*
|
|
4
|
+
* Hashes canonical_text + subject_entity_id + predicate.
|
|
5
|
+
* Rejects if hash exists in provided existingHashes Set.
|
|
6
|
+
*/
|
|
7
|
+
import { createHash } from 'node:crypto';
|
|
8
|
+
export function claimHash(claim) {
|
|
9
|
+
const input = `${claim.canonical_text}|${claim.subject_entity_id}|${claim.predicate}`;
|
|
10
|
+
return createHash('sha256').update(input).digest('hex');
|
|
11
|
+
}
|
|
12
|
+
export function validateDuplicates(claims, existingHashes = new Set()) {
|
|
13
|
+
const valid = [];
|
|
14
|
+
const rejections = [];
|
|
15
|
+
const seen = new Set(existingHashes);
|
|
16
|
+
for (const claim of claims) {
|
|
17
|
+
const hash = claimHash(claim);
|
|
18
|
+
if (seen.has(hash)) {
|
|
19
|
+
rejections.push({
|
|
20
|
+
claim,
|
|
21
|
+
reason: 'duplicate',
|
|
22
|
+
detail: `Duplicate claim (hash: ${hash.slice(0, 12)}…)`,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
seen.add(hash);
|
|
27
|
+
valid.push(claim);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return { valid, rejections };
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=duplicate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duplicate.js","sourceRoot":"","sources":["../../../src/compiler/validators/duplicate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAGxC,MAAM,UAAU,SAAS,CAAC,KAAkB;IAC1C,MAAM,KAAK,GAAG,GAAG,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,iBAAiB,IAAI,KAAK,CAAC,SAAS,EAAE,CAAA;IACrF,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AACzD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,MAAqB,EACrB,iBAA8B,IAAI,GAAG,EAAE;IAEvC,MAAM,KAAK,GAAkB,EAAE,CAAA;IAC/B,MAAM,UAAU,GAAgB,EAAE,CAAA;IAClC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,cAAc,CAAC,CAAA;IAE5C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAA;QAC7B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACnB,UAAU,CAAC,IAAI,CAAC;gBACd,KAAK;gBACL,MAAM,EAAE,WAAW;gBACnB,MAAM,EAAE,0BAA0B,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI;aACxD,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACd,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACnB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAA;AAC9B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Entity Reference Validator
|
|
3
|
+
*
|
|
4
|
+
* Verifies every subject_entity_id and object_entity_id in each claim
|
|
5
|
+
* exists in the provided entities array. Rejects claims with dangling
|
|
6
|
+
* entity references.
|
|
7
|
+
*/
|
|
8
|
+
import type { Entity, MemoryClaim, Rejection } from '../schemas.js';
|
|
9
|
+
export declare function validateEntityReferences(claims: MemoryClaim[], entities: Entity[]): {
|
|
10
|
+
valid: MemoryClaim[];
|
|
11
|
+
rejections: Rejection[];
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=entity-reference.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-reference.d.ts","sourceRoot":"","sources":["../../../src/compiler/validators/entity-reference.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAEnE,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,WAAW,EAAE,EACrB,QAAQ,EAAE,MAAM,EAAE,GACjB;IAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,UAAU,EAAE,SAAS,EAAE,CAAA;CAAE,CAgCnD"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Entity Reference Validator
|
|
3
|
+
*
|
|
4
|
+
* Verifies every subject_entity_id and object_entity_id in each claim
|
|
5
|
+
* exists in the provided entities array. Rejects claims with dangling
|
|
6
|
+
* entity references.
|
|
7
|
+
*/
|
|
8
|
+
export function validateEntityReferences(claims, entities) {
|
|
9
|
+
const entityIds = new Set(entities.map((e) => e.id));
|
|
10
|
+
const valid = [];
|
|
11
|
+
const rejections = [];
|
|
12
|
+
for (const claim of claims) {
|
|
13
|
+
if (!entityIds.has(claim.subject_entity_id)) {
|
|
14
|
+
rejections.push({
|
|
15
|
+
claim,
|
|
16
|
+
reason: 'dangling_entity',
|
|
17
|
+
detail: `subject_entity_id "${claim.subject_entity_id}" not found in entities`,
|
|
18
|
+
});
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
if (claim.object_entity_id !== undefined &&
|
|
22
|
+
claim.object_entity_id !== null &&
|
|
23
|
+
!entityIds.has(claim.object_entity_id)) {
|
|
24
|
+
rejections.push({
|
|
25
|
+
claim,
|
|
26
|
+
reason: 'dangling_entity',
|
|
27
|
+
detail: `object_entity_id "${claim.object_entity_id}" not found in entities`,
|
|
28
|
+
});
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
valid.push(claim);
|
|
32
|
+
}
|
|
33
|
+
return { valid, rejections };
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=entity-reference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-reference.js","sourceRoot":"","sources":["../../../src/compiler/validators/entity-reference.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,UAAU,wBAAwB,CACtC,MAAqB,EACrB,QAAkB;IAElB,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACpD,MAAM,KAAK,GAAkB,EAAE,CAAA;IAC/B,MAAM,UAAU,GAAgB,EAAE,CAAA;IAElC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC5C,UAAU,CAAC,IAAI,CAAC;gBACd,KAAK;gBACL,MAAM,EAAE,iBAAiB;gBACzB,MAAM,EAAE,sBAAsB,KAAK,CAAC,iBAAiB,yBAAyB;aAC/E,CAAC,CAAA;YACF,SAAQ;QACV,CAAC;QAED,IACE,KAAK,CAAC,gBAAgB,KAAK,SAAS;YACpC,KAAK,CAAC,gBAAgB,KAAK,IAAI;YAC/B,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,EACtC,CAAC;YACD,UAAU,CAAC,IAAI,CAAC;gBACd,KAAK;gBACL,MAAM,EAAE,iBAAiB;gBACzB,MAAM,EAAE,qBAAqB,KAAK,CAAC,gBAAgB,yBAAyB;aAC7E,CAAC,CAAA;YACF,SAAQ;QACV,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACnB,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAA;AAC9B,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validator Pipeline
|
|
3
|
+
*
|
|
4
|
+
* Chains all validators in order:
|
|
5
|
+
* pronoun-ban → temporal → duplicate → vagueness → atomicity → entity-reference → inference
|
|
6
|
+
*/
|
|
7
|
+
import type { ExtractionResult, ValidationResult } from '../schemas.js';
|
|
8
|
+
export { validatePronounBan } from './pronoun-ban.js';
|
|
9
|
+
export { validateTemporal } from './temporal.js';
|
|
10
|
+
export { validateDuplicates, claimHash } from './duplicate.js';
|
|
11
|
+
export { validateVagueness } from './vagueness.js';
|
|
12
|
+
export { validateAtomicity } from './atomicity.js';
|
|
13
|
+
export { validateEntityReferences } from './entity-reference.js';
|
|
14
|
+
export { validateInference } from './inference.js';
|
|
15
|
+
/**
|
|
16
|
+
* Run all validators in sequence. Each validator receives only the claims
|
|
17
|
+
* that passed the previous stage.
|
|
18
|
+
*/
|
|
19
|
+
export declare function runAllValidators(result: ExtractionResult, existingHashes?: Set<string>): Promise<ValidationResult>;
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/compiler/validators/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAGhB,gBAAgB,EACjB,MAAM,eAAe,CAAA;AAStB,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAElD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,gBAAgB,EACxB,cAAc,GAAE,GAAG,CAAC,MAAM,CAAa,GACtC,OAAO,CAAC,gBAAgB,CAAC,CAwC3B"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validator Pipeline
|
|
3
|
+
*
|
|
4
|
+
* Chains all validators in order:
|
|
5
|
+
* pronoun-ban → temporal → duplicate → vagueness → atomicity → entity-reference → inference
|
|
6
|
+
*/
|
|
7
|
+
import { validatePronounBan } from './pronoun-ban.js';
|
|
8
|
+
import { validateTemporal } from './temporal.js';
|
|
9
|
+
import { validateDuplicates } from './duplicate.js';
|
|
10
|
+
import { validateVagueness } from './vagueness.js';
|
|
11
|
+
import { validateAtomicity } from './atomicity.js';
|
|
12
|
+
import { validateEntityReferences } from './entity-reference.js';
|
|
13
|
+
import { validateInference } from './inference.js';
|
|
14
|
+
export { validatePronounBan } from './pronoun-ban.js';
|
|
15
|
+
export { validateTemporal } from './temporal.js';
|
|
16
|
+
export { validateDuplicates, claimHash } from './duplicate.js';
|
|
17
|
+
export { validateVagueness } from './vagueness.js';
|
|
18
|
+
export { validateAtomicity } from './atomicity.js';
|
|
19
|
+
export { validateEntityReferences } from './entity-reference.js';
|
|
20
|
+
export { validateInference } from './inference.js';
|
|
21
|
+
/**
|
|
22
|
+
* Run all validators in sequence. Each validator receives only the claims
|
|
23
|
+
* that passed the previous stage.
|
|
24
|
+
*/
|
|
25
|
+
export async function runAllValidators(result, existingHashes = new Set()) {
|
|
26
|
+
let claims = result.claims;
|
|
27
|
+
const allRejections = [];
|
|
28
|
+
// 1. Pronoun ban
|
|
29
|
+
const pronounResult = validatePronounBan(claims);
|
|
30
|
+
allRejections.push(...pronounResult.rejections);
|
|
31
|
+
claims = pronounResult.valid;
|
|
32
|
+
// 2. Temporal validation
|
|
33
|
+
const temporalResult = validateTemporal(claims);
|
|
34
|
+
allRejections.push(...temporalResult.rejections);
|
|
35
|
+
claims = temporalResult.valid;
|
|
36
|
+
// 3. Duplicate detection
|
|
37
|
+
const dupResult = validateDuplicates(claims, existingHashes);
|
|
38
|
+
allRejections.push(...dupResult.rejections);
|
|
39
|
+
claims = dupResult.valid;
|
|
40
|
+
// 4. Vagueness check
|
|
41
|
+
const vagueResult = validateVagueness(claims);
|
|
42
|
+
allRejections.push(...vagueResult.rejections);
|
|
43
|
+
claims = vagueResult.valid;
|
|
44
|
+
// 5. Atomicity check
|
|
45
|
+
const atomicityResult = validateAtomicity(claims);
|
|
46
|
+
allRejections.push(...atomicityResult.rejections);
|
|
47
|
+
claims = atomicityResult.valid;
|
|
48
|
+
// 6. Entity reference check
|
|
49
|
+
const entityRefResult = validateEntityReferences(claims, result.entities);
|
|
50
|
+
allRejections.push(...entityRefResult.rejections);
|
|
51
|
+
claims = entityRefResult.valid;
|
|
52
|
+
// 7. Inference confidence check
|
|
53
|
+
const inferenceResult = validateInference(claims);
|
|
54
|
+
allRejections.push(...inferenceResult.rejections);
|
|
55
|
+
claims = inferenceResult.valid;
|
|
56
|
+
return { valid: claims, rejections: allRejections };
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/compiler/validators/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAElD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAElD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAwB,EACxB,iBAA8B,IAAI,GAAG,EAAE;IAEvC,IAAI,MAAM,GAAkB,MAAM,CAAC,MAAM,CAAA;IACzC,MAAM,aAAa,GAAgB,EAAE,CAAA;IAErC,iBAAiB;IACjB,MAAM,aAAa,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAA;IAChD,aAAa,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,UAAU,CAAC,CAAA;IAC/C,MAAM,GAAG,aAAa,CAAC,KAAK,CAAA;IAE5B,yBAAyB;IACzB,MAAM,cAAc,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAA;IAC/C,aAAa,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,UAAU,CAAC,CAAA;IAChD,MAAM,GAAG,cAAc,CAAC,KAAK,CAAA;IAE7B,yBAAyB;IACzB,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IAC5D,aAAa,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,CAAA;IAC3C,MAAM,GAAG,SAAS,CAAC,KAAK,CAAA;IAExB,qBAAqB;IACrB,MAAM,WAAW,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAA;IAC7C,aAAa,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,UAAU,CAAC,CAAA;IAC7C,MAAM,GAAG,WAAW,CAAC,KAAK,CAAA;IAE1B,qBAAqB;IACrB,MAAM,eAAe,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAA;IACjD,aAAa,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,UAAU,CAAC,CAAA;IACjD,MAAM,GAAG,eAAe,CAAC,KAAK,CAAA;IAE9B,4BAA4B;IAC5B,MAAM,eAAe,GAAG,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;IACzE,aAAa,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,UAAU,CAAC,CAAA;IACjD,MAAM,GAAG,eAAe,CAAC,KAAK,CAAA;IAE9B,gCAAgC;IAChC,MAAM,eAAe,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAA;IACjD,aAAa,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,UAAU,CAAC,CAAA;IACjD,MAAM,GAAG,eAAe,CAAC,KAAK,CAAA;IAE9B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,CAAA;AACrD,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inference Validator
|
|
3
|
+
*
|
|
4
|
+
* Rejects claims where explicitness === 'inferred' AND
|
|
5
|
+
* extraction_confidence < 0.6. These are low-confidence inferences
|
|
6
|
+
* that are too unreliable to store.
|
|
7
|
+
*/
|
|
8
|
+
import type { MemoryClaim, Rejection } from '../schemas.js';
|
|
9
|
+
export declare function validateInference(claims: MemoryClaim[]): {
|
|
10
|
+
valid: MemoryClaim[];
|
|
11
|
+
rejections: Rejection[];
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=inference.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inference.d.ts","sourceRoot":"","sources":["../../../src/compiler/validators/inference.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAI3D,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EAAE,GACpB;IAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,UAAU,EAAE,SAAS,EAAE,CAAA;CAAE,CAoBnD"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inference Validator
|
|
3
|
+
*
|
|
4
|
+
* Rejects claims where explicitness === 'inferred' AND
|
|
5
|
+
* extraction_confidence < 0.6. These are low-confidence inferences
|
|
6
|
+
* that are too unreliable to store.
|
|
7
|
+
*/
|
|
8
|
+
const MIN_INFERENCE_CONFIDENCE = 0.6;
|
|
9
|
+
export function validateInference(claims) {
|
|
10
|
+
const valid = [];
|
|
11
|
+
const rejections = [];
|
|
12
|
+
for (const claim of claims) {
|
|
13
|
+
if (claim.explicitness === 'inferred' &&
|
|
14
|
+
claim.extraction_confidence < MIN_INFERENCE_CONFIDENCE) {
|
|
15
|
+
rejections.push({
|
|
16
|
+
claim,
|
|
17
|
+
reason: 'low_confidence_inference',
|
|
18
|
+
detail: `Inferred claim with extraction_confidence ${claim.extraction_confidence} < ${MIN_INFERENCE_CONFIDENCE}`,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
valid.push(claim);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return { valid, rejections };
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=inference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inference.js","sourceRoot":"","sources":["../../../src/compiler/validators/inference.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,wBAAwB,GAAG,GAAG,CAAA;AAEpC,MAAM,UAAU,iBAAiB,CAC/B,MAAqB;IAErB,MAAM,KAAK,GAAkB,EAAE,CAAA;IAC/B,MAAM,UAAU,GAAgB,EAAE,CAAA;IAElC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IACE,KAAK,CAAC,YAAY,KAAK,UAAU;YACjC,KAAK,CAAC,qBAAqB,GAAG,wBAAwB,EACtD,CAAC;YACD,UAAU,CAAC,IAAI,CAAC;gBACd,KAAK;gBACL,MAAM,EAAE,0BAA0B;gBAClC,MAAM,EAAE,6CAA6C,KAAK,CAAC,qBAAqB,MAAM,wBAAwB,EAAE;aACjH,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACnB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAA;AAC9B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pronoun Ban Validator
|
|
3
|
+
*
|
|
4
|
+
* Rejects claims whose canonical_text subject or object is a pronoun.
|
|
5
|
+
*/
|
|
6
|
+
import type { MemoryClaim, Rejection } from '../schemas.js';
|
|
7
|
+
export declare function validatePronounBan(claims: MemoryClaim[]): {
|
|
8
|
+
valid: MemoryClaim[];
|
|
9
|
+
rejections: Rejection[];
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=pronoun-ban.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pronoun-ban.d.ts","sourceRoot":"","sources":["../../../src/compiler/validators/pronoun-ban.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAwB3D,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,WAAW,EAAE,GACpB;IAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,UAAU,EAAE,SAAS,EAAE,CAAA;CAAE,CAuBnD"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pronoun Ban Validator
|
|
3
|
+
*
|
|
4
|
+
* Rejects claims whose canonical_text subject or object is a pronoun.
|
|
5
|
+
*/
|
|
6
|
+
const PRONOUNS = new Set([
|
|
7
|
+
// personal
|
|
8
|
+
'i', 'me', 'my', 'mine', 'myself',
|
|
9
|
+
'you', 'your', 'yours', 'yourself', 'yourselves',
|
|
10
|
+
'he', 'him', 'his', 'himself',
|
|
11
|
+
'she', 'her', 'hers', 'herself',
|
|
12
|
+
'it', 'its', 'itself',
|
|
13
|
+
'we', 'us', 'our', 'ours', 'ourselves',
|
|
14
|
+
'they', 'them', 'their', 'theirs', 'themselves',
|
|
15
|
+
// demonstrative
|
|
16
|
+
'this', 'that', 'these', 'those',
|
|
17
|
+
// relative / interrogative
|
|
18
|
+
'who', 'whom', 'whose', 'which',
|
|
19
|
+
// indefinite
|
|
20
|
+
'someone', 'somebody', 'anyone', 'anybody',
|
|
21
|
+
'everyone', 'everybody', 'no one', 'nobody',
|
|
22
|
+
]);
|
|
23
|
+
function isPronoun(text) {
|
|
24
|
+
return PRONOUNS.has(text.trim().toLowerCase());
|
|
25
|
+
}
|
|
26
|
+
export function validatePronounBan(claims) {
|
|
27
|
+
const valid = [];
|
|
28
|
+
const rejections = [];
|
|
29
|
+
for (const claim of claims) {
|
|
30
|
+
if (isPronoun(claim.subject_text)) {
|
|
31
|
+
rejections.push({
|
|
32
|
+
claim,
|
|
33
|
+
reason: 'pronoun_subject',
|
|
34
|
+
detail: `Subject "${claim.subject_text}" is a pronoun`,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
else if (isPronoun(claim.object_text)) {
|
|
38
|
+
rejections.push({
|
|
39
|
+
claim,
|
|
40
|
+
reason: 'pronoun_object',
|
|
41
|
+
detail: `Object "${claim.object_text}" is a pronoun`,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
valid.push(claim);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return { valid, rejections };
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=pronoun-ban.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pronoun-ban.js","sourceRoot":"","sources":["../../../src/compiler/validators/pronoun-ban.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC;IACvB,WAAW;IACX,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ;IACjC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,YAAY;IAChD,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS;IAC7B,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS;IAC/B,IAAI,EAAE,KAAK,EAAE,QAAQ;IACrB,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW;IACtC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY;IAC/C,gBAAgB;IAChB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;IAChC,2BAA2B;IAC3B,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;IAC/B,aAAa;IACb,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS;IAC1C,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ;CAC5C,CAAC,CAAA;AAEF,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;AAChD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,MAAqB;IAErB,MAAM,KAAK,GAAkB,EAAE,CAAA;IAC/B,MAAM,UAAU,GAAgB,EAAE,CAAA;IAElC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;YAClC,UAAU,CAAC,IAAI,CAAC;gBACd,KAAK;gBACL,MAAM,EAAE,iBAAiB;gBACzB,MAAM,EAAE,YAAY,KAAK,CAAC,YAAY,gBAAgB;aACvD,CAAC,CAAA;QACJ,CAAC;aAAM,IAAI,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;YACxC,UAAU,CAAC,IAAI,CAAC;gBACd,KAAK;gBACL,MAAM,EAAE,gBAAgB;gBACxB,MAAM,EAAE,WAAW,KAAK,CAAC,WAAW,gBAAgB;aACrD,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACnB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAA;AAC9B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Temporal Validator
|
|
3
|
+
*
|
|
4
|
+
* Validates TemporalInfo constraints:
|
|
5
|
+
* - normalized_end cannot precede normalized_start
|
|
6
|
+
* - If relation_type is set, relation_to_event must be non-null
|
|
7
|
+
*/
|
|
8
|
+
import type { MemoryClaim, Rejection } from '../schemas.js';
|
|
9
|
+
export declare function validateTemporal(claims: MemoryClaim[]): {
|
|
10
|
+
valid: MemoryClaim[];
|
|
11
|
+
rejections: Rejection[];
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=temporal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temporal.d.ts","sourceRoot":"","sources":["../../../src/compiler/validators/temporal.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAE3D,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,WAAW,EAAE,GACpB;IAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,UAAU,EAAE,SAAS,EAAE,CAAA;CAAE,CAuCnD"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Temporal Validator
|
|
3
|
+
*
|
|
4
|
+
* Validates TemporalInfo constraints:
|
|
5
|
+
* - normalized_end cannot precede normalized_start
|
|
6
|
+
* - If relation_type is set, relation_to_event must be non-null
|
|
7
|
+
*/
|
|
8
|
+
export function validateTemporal(claims) {
|
|
9
|
+
const valid = [];
|
|
10
|
+
const rejections = [];
|
|
11
|
+
for (const claim of claims) {
|
|
12
|
+
const t = claim.temporal;
|
|
13
|
+
if (!t) {
|
|
14
|
+
valid.push(claim);
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
// Check: normalized_end cannot precede normalized_start
|
|
18
|
+
if (t.normalized_start && t.normalized_end) {
|
|
19
|
+
const start = new Date(t.normalized_start);
|
|
20
|
+
const end = new Date(t.normalized_end);
|
|
21
|
+
if (end.getTime() < start.getTime()) {
|
|
22
|
+
rejections.push({
|
|
23
|
+
claim,
|
|
24
|
+
reason: 'temporal_invalid',
|
|
25
|
+
detail: `Temporal end (${t.normalized_end}) precedes start (${t.normalized_start})`,
|
|
26
|
+
});
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// Check: relation_type requires relation_to_event
|
|
31
|
+
if (t.relation_type && !t.relation_to_event) {
|
|
32
|
+
rejections.push({
|
|
33
|
+
claim,
|
|
34
|
+
reason: 'temporal_invalid',
|
|
35
|
+
detail: `Temporal relation_type "${t.relation_type}" set but relation_to_event is missing`,
|
|
36
|
+
});
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
valid.push(claim);
|
|
40
|
+
}
|
|
41
|
+
return { valid, rejections };
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=temporal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temporal.js","sourceRoot":"","sources":["../../../src/compiler/validators/temporal.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,UAAU,gBAAgB,CAC9B,MAAqB;IAErB,MAAM,KAAK,GAAkB,EAAE,CAAA;IAC/B,MAAM,UAAU,GAAgB,EAAE,CAAA;IAElC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAA;QACxB,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACjB,SAAQ;QACV,CAAC;QAED,wDAAwD;QACxD,IAAI,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC;YAC3C,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAA;YAC1C,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAA;YACtC,IAAI,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;gBACpC,UAAU,CAAC,IAAI,CAAC;oBACd,KAAK;oBACL,MAAM,EAAE,kBAAkB;oBAC1B,MAAM,EAAE,iBAAiB,CAAC,CAAC,cAAc,qBAAqB,CAAC,CAAC,gBAAgB,GAAG;iBACpF,CAAC,CAAA;gBACF,SAAQ;YACV,CAAC;QACH,CAAC;QAED,kDAAkD;QAClD,IAAI,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC;YAC5C,UAAU,CAAC,IAAI,CAAC;gBACd,KAAK;gBACL,MAAM,EAAE,kBAAkB;gBAC1B,MAAM,EAAE,2BAA2B,CAAC,CAAC,aAAa,wCAAwC;aAC3F,CAAC,CAAA;YACF,SAAQ;QACV,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACnB,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAA;AAC9B,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vagueness Validator
|
|
3
|
+
*
|
|
4
|
+
* Rejects claims that are too vague:
|
|
5
|
+
* - canonical_text shorter than 10 characters
|
|
6
|
+
* - predicate is empty
|
|
7
|
+
* - object_text is a filler phrase
|
|
8
|
+
*/
|
|
9
|
+
import type { MemoryClaim, Rejection } from '../schemas.js';
|
|
10
|
+
export declare function validateVagueness(claims: MemoryClaim[]): {
|
|
11
|
+
valid: MemoryClaim[];
|
|
12
|
+
rejections: Rejection[];
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=vagueness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vagueness.d.ts","sourceRoot":"","sources":["../../../src/compiler/validators/vagueness.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAU3D,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EAAE,GACpB;IAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,UAAU,EAAE,SAAS,EAAE,CAAA;CAAE,CAqCnD"}
|