@lucern/graph-primitives 0.1.0-alpha.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.
- package/README.md +29 -0
- package/dist/beliefDecay-Q_26RTc-.d.ts +72 -0
- package/dist/beliefDecay.d.ts +2 -0
- package/dist/beliefDecay.js +1628 -0
- package/dist/beliefDecay.js.map +1 -0
- package/dist/beliefEvidenceLinks-42FlR48t.d.ts +77 -0
- package/dist/beliefEvidenceLinks.d.ts +1 -0
- package/dist/beliefEvidenceLinks.js +1978 -0
- package/dist/beliefEvidenceLinks.js.map +1 -0
- package/dist/beliefLifecycle-C-AehZgF.d.ts +43 -0
- package/dist/beliefLifecycle.d.ts +1 -0
- package/dist/beliefLifecycle.js +98 -0
- package/dist/beliefLifecycle.js.map +1 -0
- package/dist/confidencePropagationDispatch.d.ts +46 -0
- package/dist/confidencePropagationDispatch.js +744 -0
- package/dist/confidencePropagationDispatch.js.map +1 -0
- package/dist/contradictions-Hdwl7zid.d.ts +71 -0
- package/dist/contradictions.d.ts +1 -0
- package/dist/contradictions.js +1557 -0
- package/dist/contradictions.js.map +1 -0
- package/dist/convex.d.ts +23 -0
- package/dist/convex.js +17 -0
- package/dist/convex.js.map +1 -0
- package/dist/edgeValidation-CeI0wc0r.d.ts +35 -0
- package/dist/edgeValidation.d.ts +2 -0
- package/dist/edgeValidation.js +307 -0
- package/dist/edgeValidation.js.map +1 -0
- package/dist/edges/contains.d.ts +6 -0
- package/dist/edges/contains.js +14 -0
- package/dist/edges/contains.js.map +1 -0
- package/dist/edges/contradicts.d.ts +6 -0
- package/dist/edges/contradicts.js +183 -0
- package/dist/edges/contradicts.js.map +1 -0
- package/dist/edges/dependsOn.d.ts +6 -0
- package/dist/edges/dependsOn.js +240 -0
- package/dist/edges/dependsOn.js.map +1 -0
- package/dist/edges/derivedFrom.d.ts +6 -0
- package/dist/edges/derivedFrom.js +14 -0
- package/dist/edges/derivedFrom.js.map +1 -0
- package/dist/edges/elaborates.d.ts +6 -0
- package/dist/edges/elaborates.js +100 -0
- package/dist/edges/elaborates.js.map +1 -0
- package/dist/edges/index.d.ts +3 -0
- package/dist/edges/index.js +556 -0
- package/dist/edges/index.js.map +1 -0
- package/dist/edges/informs.d.ts +6 -0
- package/dist/edges/informs.js +112 -0
- package/dist/edges/informs.js.map +1 -0
- package/dist/edges/propagationTypes.d.ts +39 -0
- package/dist/edges/propagationTypes.js +17 -0
- package/dist/edges/propagationTypes.js.map +1 -0
- package/dist/edges/refutes.d.ts +6 -0
- package/dist/edges/refutes.js +108 -0
- package/dist/edges/refutes.js.map +1 -0
- package/dist/edges/supports.d.ts +6 -0
- package/dist/edges/supports.js +193 -0
- package/dist/edges/supports.js.map +1 -0
- package/dist/edges/tests.d.ts +6 -0
- package/dist/edges/tests.js +14 -0
- package/dist/edges/tests.js.map +1 -0
- package/dist/edges/utils.d.ts +12 -0
- package/dist/edges/utils.js +188 -0
- package/dist/edges/utils.js.map +1 -0
- package/dist/embeddingTrigger.d.ts +24 -0
- package/dist/embeddingTrigger.js +24 -0
- package/dist/embeddingTrigger.js.map +1 -0
- package/dist/entityBridge-DMaKooYn.d.ts +59 -0
- package/dist/entityBridge.d.ts +1 -0
- package/dist/entityBridge.js +663 -0
- package/dist/entityBridge.js.map +1 -0
- package/dist/entityLifecycle-BkhRJ-XI.d.ts +69 -0
- package/dist/entityLifecycle.d.ts +1 -0
- package/dist/entityLifecycle.js +2083 -0
- package/dist/entityLifecycle.js.map +1 -0
- package/dist/entityValidation-KLZ_Xl2D.d.ts +50 -0
- package/dist/entityValidation.d.ts +3 -0
- package/dist/entityValidation.js +71 -0
- package/dist/entityValidation.js.map +1 -0
- package/dist/epistemicAnswers-DSP1slZ9.d.ts +67 -0
- package/dist/epistemicAnswers.d.ts +1 -0
- package/dist/epistemicAnswers.js +1650 -0
- package/dist/epistemicAnswers.js.map +1 -0
- package/dist/epistemicBeliefs-DtFVTp-k.d.ts +377 -0
- package/dist/epistemicBeliefs.d.ts +5 -0
- package/dist/epistemicBeliefs.js +6386 -0
- package/dist/epistemicBeliefs.js.map +1 -0
- package/dist/epistemicContractHelpers.d.ts +1 -0
- package/dist/epistemicContractHelpers.js +320 -0
- package/dist/epistemicContractHelpers.js.map +1 -0
- package/dist/epistemicContracts.d.ts +77 -0
- package/dist/epistemicContracts.js +8436 -0
- package/dist/epistemicContracts.js.map +1 -0
- package/dist/epistemicEdges-DcA8ErUG.d.ts +191 -0
- package/dist/epistemicEdges.d.ts +2 -0
- package/dist/epistemicEdges.js +2749 -0
- package/dist/epistemicEdges.js.map +1 -0
- package/dist/epistemicEvidence-Bo638XDP.d.ts +128 -0
- package/dist/epistemicEvidence.d.ts +3 -0
- package/dist/epistemicEvidence.js +3282 -0
- package/dist/epistemicEvidence.js.map +1 -0
- package/dist/epistemicHelpers-Bd9xbaib.d.ts +329 -0
- package/dist/epistemicHelpers.d.ts +4 -0
- package/dist/epistemicHelpers.js +999 -0
- package/dist/epistemicHelpers.js.map +1 -0
- package/dist/epistemicLinking-CyeLOIzN.d.ts +35 -0
- package/dist/epistemicLinking.d.ts +1 -0
- package/dist/epistemicLinking.js +1391 -0
- package/dist/epistemicLinking.js.map +1 -0
- package/dist/epistemicNodes-BpD6Koud.d.ts +167 -0
- package/dist/epistemicNodes.d.ts +2 -0
- package/dist/epistemicNodes.js +2942 -0
- package/dist/epistemicNodes.js.map +1 -0
- package/dist/epistemicQuestions-CmEeY6zQ.d.ts +214 -0
- package/dist/epistemicQuestions.d.ts +3 -0
- package/dist/epistemicQuestions.js +4993 -0
- package/dist/epistemicQuestions.js.map +1 -0
- package/dist/epistemicSources-ZazxHOK1.d.ts +25 -0
- package/dist/epistemicSources.d.ts +1 -0
- package/dist/epistemicSources.js +2025 -0
- package/dist/epistemicSources.js.map +1 -0
- package/dist/evaluators/index.d.ts +9 -0
- package/dist/evaluators/index.js +8440 -0
- package/dist/evaluators/index.js.map +1 -0
- package/dist/evaluators/lintCheckerEvaluator.d.ts +11 -0
- package/dist/evaluators/lintCheckerEvaluator.js +155 -0
- package/dist/evaluators/lintCheckerEvaluator.js.map +1 -0
- package/dist/evaluators/sentryCheckerEvaluator.d.ts +11 -0
- package/dist/evaluators/sentryCheckerEvaluator.js +126 -0
- package/dist/evaluators/sentryCheckerEvaluator.js.map +1 -0
- package/dist/evaluators/shared.d.ts +27 -0
- package/dist/evaluators/shared.js +92 -0
- package/dist/evaluators/shared.js.map +1 -0
- package/dist/evaluators/testRunnerEvaluator.d.ts +17 -0
- package/dist/evaluators/testRunnerEvaluator.js +232 -0
- package/dist/evaluators/testRunnerEvaluator.js.map +1 -0
- package/dist/evaluators/tscCheckerEvaluator.d.ts +11 -0
- package/dist/evaluators/tscCheckerEvaluator.js +189 -0
- package/dist/evaluators/tscCheckerEvaluator.js.map +1 -0
- package/dist/globalId-DKh9d_uD.d.ts +20 -0
- package/dist/globalId.d.ts +1 -0
- package/dist/globalId.js +15 -0
- package/dist/globalId.js.map +1 -0
- package/dist/graphTypes-CpgIuCdo.d.ts +52 -0
- package/dist/graphTypes.d.ts +1 -0
- package/dist/graphTypes.js +120 -0
- package/dist/graphTypes.js.map +1 -0
- package/dist/helpers-BYHIk5vU.d.ts +27 -0
- package/dist/helpers.d.ts +4 -0
- package/dist/helpers.js +313 -0
- package/dist/helpers.js.map +1 -0
- package/dist/index-Dct1T70K.d.ts +25 -0
- package/dist/index-Dq-7R-gi.d.ts +31 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.js +22294 -0
- package/dist/index.js.map +1 -0
- package/dist/invariantEnforcement.d.ts +52 -0
- package/dist/invariantEnforcement.js +231 -0
- package/dist/invariantEnforcement.js.map +1 -0
- package/dist/logicalRoleInference-CJxqWi3u.d.ts +16 -0
- package/dist/logicalRoleInference.d.ts +3 -0
- package/dist/logicalRoleInference.js +64 -0
- package/dist/logicalRoleInference.js.map +1 -0
- package/dist/matcherFeedbackUtils.d.ts +33 -0
- package/dist/matcherFeedbackUtils.js +95 -0
- package/dist/matcherFeedbackUtils.js.map +1 -0
- package/dist/ontology-matching-Buhu23ss.d.ts +48 -0
- package/dist/ontology-matching.d.ts +2 -0
- package/dist/ontology-matching.js +346 -0
- package/dist/ontology-matching.js.map +1 -0
- package/dist/ontologyApproval-Ba0Jjk1k.d.ts +26 -0
- package/dist/ontologyApproval.d.ts +1 -0
- package/dist/ontologyApproval.js +78 -0
- package/dist/ontologyApproval.js.map +1 -0
- package/dist/ontologyDefinitions.d.ts +72 -0
- package/dist/ontologyDefinitions.js +635 -0
- package/dist/ontologyDefinitions.js.map +1 -0
- package/dist/ontologyHelpers.d.ts +79 -0
- package/dist/ontologyHelpers.js +81 -0
- package/dist/ontologyHelpers.js.map +1 -0
- package/dist/ontologyRegistry-B67rPJ16.d.ts +31 -0
- package/dist/ontologyRegistry.d.ts +1 -0
- package/dist/ontologyRegistry.js +296 -0
- package/dist/ontologyRegistry.js.map +1 -0
- package/dist/projectionReconciliation-CxrXYGaB.d.ts +20 -0
- package/dist/projectionReconciliation.d.ts +1 -0
- package/dist/projectionReconciliation.js +261 -0
- package/dist/projectionReconciliation.js.map +1 -0
- package/dist/projectionStaleness-CAdpIsaW.d.ts +51 -0
- package/dist/projectionStaleness.d.ts +1 -0
- package/dist/projectionStaleness.js +57 -0
- package/dist/projectionStaleness.js.map +1 -0
- package/dist/questionEvidenceLinks-BdQD0TkM.d.ts +34 -0
- package/dist/questionEvidenceLinks.d.ts +1 -0
- package/dist/questionEvidenceLinks.js +1690 -0
- package/dist/questionEvidenceLinks.js.map +1 -0
- package/dist/resolverTypes-CC8Ea2E2.d.ts +20 -0
- package/dist/resolverTypes.d.ts +4 -0
- package/dist/resolverTypes.js +3 -0
- package/dist/resolverTypes.js.map +1 -0
- package/dist/resolvers-Br1a6eLV.d.ts +14 -0
- package/dist/resolvers.d.ts +5 -0
- package/dist/resolvers.js +308 -0
- package/dist/resolvers.js.map +1 -0
- package/dist/scopeResolverCompat.d.ts +26 -0
- package/dist/scopeResolverCompat.js +242 -0
- package/dist/scopeResolverCompat.js.map +1 -0
- package/dist/text-matching-CMn2WnVD.d.ts +40 -0
- package/dist/text-matching.d.ts +2 -0
- package/dist/text-matching.js +246 -0
- package/dist/text-matching.js.map +1 -0
- package/dist/topicOntologyResolver.d.ts +80 -0
- package/dist/topicOntologyResolver.js +67 -0
- package/dist/topicOntologyResolver.js.map +1 -0
- package/dist/topicProjectOverlay.d.ts +92 -0
- package/dist/topicProjectOverlay.js +249 -0
- package/dist/topicProjectOverlay.js.map +1 -0
- package/dist/topicScope-By_zp4tt.d.ts +34 -0
- package/dist/topicScope.d.ts +3 -0
- package/dist/topicScope.js +206 -0
- package/dist/topicScope.js.map +1 -0
- package/dist/workspaceIsolation.d.ts +44 -0
- package/dist/workspaceIsolation.js +950 -0
- package/dist/workspaceIsolation.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
// src/evaluators/shared.ts
|
|
2
|
+
function asArray(value) {
|
|
3
|
+
return Array.isArray(value) ? value : [];
|
|
4
|
+
}
|
|
5
|
+
function asNumber(value) {
|
|
6
|
+
return typeof value === "number" && Number.isFinite(value) ? value : null;
|
|
7
|
+
}
|
|
8
|
+
function asRecord(value) {
|
|
9
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
10
|
+
}
|
|
11
|
+
function asString(value) {
|
|
12
|
+
return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
|
|
13
|
+
}
|
|
14
|
+
function deriveDirectionalResult(direction, conditionSatisfied) {
|
|
15
|
+
if (direction === "falsifies") {
|
|
16
|
+
return conditionSatisfied ? "disconfirmed" : "confirmed";
|
|
17
|
+
}
|
|
18
|
+
return conditionSatisfied ? "confirmed" : "disconfirmed";
|
|
19
|
+
}
|
|
20
|
+
function extractTextCandidates(value) {
|
|
21
|
+
const record = asRecord(value);
|
|
22
|
+
if (!record) {
|
|
23
|
+
const candidate = asString(value);
|
|
24
|
+
return candidate ? [candidate] : [];
|
|
25
|
+
}
|
|
26
|
+
const candidates = [
|
|
27
|
+
record.stdout,
|
|
28
|
+
record.stderr,
|
|
29
|
+
record.output,
|
|
30
|
+
record.text,
|
|
31
|
+
record.message,
|
|
32
|
+
record.raw
|
|
33
|
+
].map(asString).filter((candidate) => Boolean(candidate));
|
|
34
|
+
for (const nestedKey of ["report", "result", "data", "payload"]) {
|
|
35
|
+
const nested = record[nestedKey];
|
|
36
|
+
if (nested !== value) {
|
|
37
|
+
candidates.push(...extractTextCandidates(nested));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return Array.from(new Set(candidates));
|
|
41
|
+
}
|
|
42
|
+
function normalizeFilePath(value) {
|
|
43
|
+
return value.replace(/\\/g, "/").replace(/^\.\//, "");
|
|
44
|
+
}
|
|
45
|
+
function normalizeToolResultEnvelope(value) {
|
|
46
|
+
const record = asRecord(value);
|
|
47
|
+
if (!record) {
|
|
48
|
+
return {
|
|
49
|
+
output: asString(value) ?? void 0
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
const exitCode = asNumber(record.exitCode) ?? asNumber(record.code) ?? asNumber(record.status) ?? null;
|
|
53
|
+
return {
|
|
54
|
+
command: asString(record.command) ?? void 0,
|
|
55
|
+
data: record.data ?? record.payload,
|
|
56
|
+
exitCode,
|
|
57
|
+
output: asString(record.output) ?? void 0,
|
|
58
|
+
report: record.report ?? record.json ?? record.result ?? record.payload ?? void 0,
|
|
59
|
+
stderr: asString(record.stderr) ?? void 0,
|
|
60
|
+
stdout: asString(record.stdout) ?? void 0
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function parseJsonCandidate(value) {
|
|
64
|
+
if (value === null || value === void 0) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
if (typeof value !== "string") {
|
|
68
|
+
return value;
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
return JSON.parse(value);
|
|
72
|
+
} catch {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function patternMatchesPath(filePath, pattern) {
|
|
77
|
+
const normalizedPath = normalizeFilePath(filePath);
|
|
78
|
+
const normalizedPattern = normalizeFilePath(pattern);
|
|
79
|
+
const escaped = normalizedPattern.replace(/[.+^${}()|[\]\\]/g, "\\$&");
|
|
80
|
+
const regexPattern = escaped.replace(/\\\*\\\*/g, ".*").replace(/\\\*/g, "[^/]*").replace(/\\\?/g, "[^/]");
|
|
81
|
+
return new RegExp(`^${regexPattern}$`).test(normalizedPath);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// src/evaluators/testRunnerEvaluator.ts
|
|
85
|
+
function parseConfig(condition) {
|
|
86
|
+
const record = asRecord(condition.evaluatorConfig);
|
|
87
|
+
if (!record) {
|
|
88
|
+
throw new Error(
|
|
89
|
+
'test_runner requires evaluatorConfig with { testPattern, runner: "vitest" }.'
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
const testPattern = asString(record.testPattern);
|
|
93
|
+
if (!testPattern) {
|
|
94
|
+
throw new Error("test_runner requires a non-empty testPattern.");
|
|
95
|
+
}
|
|
96
|
+
const runner = asString(record.runner);
|
|
97
|
+
if (runner !== "vitest") {
|
|
98
|
+
throw new Error(`Unsupported test runner: ${String(record.runner)}`);
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
runner,
|
|
102
|
+
testPattern
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function collectFailedTests(value) {
|
|
106
|
+
const record = asRecord(value);
|
|
107
|
+
if (!record) {
|
|
108
|
+
return [];
|
|
109
|
+
}
|
|
110
|
+
const fullName = asString(record.fullName);
|
|
111
|
+
const title = asString(record.title);
|
|
112
|
+
const label = fullName ?? title ?? "unnamed test";
|
|
113
|
+
const status = asString(record.status);
|
|
114
|
+
const state = asString(asRecord(record.result)?.state);
|
|
115
|
+
const isFailed = status === "failed" || status === "fail" || state === "failed" || state === "fail";
|
|
116
|
+
const failures = isFailed ? [label] : [];
|
|
117
|
+
for (const nestedKey of ["assertionResults", "tests", "tasks"]) {
|
|
118
|
+
for (const nested of asArray(record[nestedKey])) {
|
|
119
|
+
failures.push(...collectFailedTests(nested));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return failures;
|
|
123
|
+
}
|
|
124
|
+
function collectPassedTests(value) {
|
|
125
|
+
const record = asRecord(value);
|
|
126
|
+
if (!record) {
|
|
127
|
+
return [];
|
|
128
|
+
}
|
|
129
|
+
const fullName = asString(record.fullName);
|
|
130
|
+
const title = asString(record.title);
|
|
131
|
+
const label = fullName ?? title ?? "unnamed test";
|
|
132
|
+
const status = asString(record.status);
|
|
133
|
+
const state = asString(asRecord(record.result)?.state);
|
|
134
|
+
const isPassed = status === "passed" || state === "passed";
|
|
135
|
+
const passed = isPassed ? [label] : [];
|
|
136
|
+
for (const nestedKey of ["assertionResults", "tests", "tasks"]) {
|
|
137
|
+
for (const nested of asArray(record[nestedKey])) {
|
|
138
|
+
passed.push(...collectPassedTests(nested));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return passed;
|
|
142
|
+
}
|
|
143
|
+
function parseSuite(value) {
|
|
144
|
+
const record = asRecord(value);
|
|
145
|
+
if (!record) {
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
const filePath = asString(record.name) ?? asString(record.file) ?? asString(record.filePath) ?? asString(record.filepath);
|
|
149
|
+
if (!filePath) {
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
failedTests: Array.from(new Set(collectFailedTests(record))),
|
|
154
|
+
filePath: normalizeFilePath(filePath),
|
|
155
|
+
passedTests: Array.from(new Set(collectPassedTests(record)))
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
function parseVitestSuites(resultData) {
|
|
159
|
+
const envelope = normalizeToolResultEnvelope(resultData);
|
|
160
|
+
const candidates = [
|
|
161
|
+
envelope.report,
|
|
162
|
+
envelope.data,
|
|
163
|
+
envelope.stdout,
|
|
164
|
+
envelope.output,
|
|
165
|
+
...extractTextCandidates(resultData)
|
|
166
|
+
];
|
|
167
|
+
for (const candidate of candidates) {
|
|
168
|
+
const parsed = parseJsonCandidate(candidate);
|
|
169
|
+
const report = asRecord(parsed);
|
|
170
|
+
if (!report) {
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
const suites = asArray(report.testResults).map(parseSuite).filter((suite) => Boolean(suite));
|
|
174
|
+
if (suites.length > 0) {
|
|
175
|
+
return suites;
|
|
176
|
+
}
|
|
177
|
+
const fileSuites = asArray(report.files).map(parseSuite).filter((suite) => Boolean(suite));
|
|
178
|
+
if (fileSuites.length > 0) {
|
|
179
|
+
return fileSuites;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return [];
|
|
183
|
+
}
|
|
184
|
+
function getMatchedSuites(contract, resultData) {
|
|
185
|
+
const config = parseConfig(contract.condition);
|
|
186
|
+
return parseVitestSuites(resultData).filter(
|
|
187
|
+
(suite) => patternMatchesPath(suite.filePath, config.testPattern)
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
var testRunnerEvaluator = {
|
|
191
|
+
name: "test_runner",
|
|
192
|
+
matches({ contract, resultData }) {
|
|
193
|
+
return getMatchedSuites(contract, resultData).length > 0;
|
|
194
|
+
},
|
|
195
|
+
evaluate(args) {
|
|
196
|
+
const config = parseConfig(args.contract.condition);
|
|
197
|
+
const matchedSuites = getMatchedSuites(args.contract, args.resultData);
|
|
198
|
+
if (!args.resultData) {
|
|
199
|
+
return {
|
|
200
|
+
result: "error",
|
|
201
|
+
rationale: "test_runner requires Vitest JSON resultData."
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
if (matchedSuites.length === 0) {
|
|
205
|
+
return {
|
|
206
|
+
result: "inconclusive",
|
|
207
|
+
rationale: `No Vitest suites matched ${config.testPattern}.`
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
const failedTests = matchedSuites.flatMap((suite) => suite.failedTests);
|
|
211
|
+
const passedTests = matchedSuites.flatMap((suite) => suite.passedTests);
|
|
212
|
+
const conditionSatisfied = failedTests.length === 0;
|
|
213
|
+
return {
|
|
214
|
+
result: deriveDirectionalResult(
|
|
215
|
+
args.contract.direction,
|
|
216
|
+
conditionSatisfied
|
|
217
|
+
),
|
|
218
|
+
rationale: conditionSatisfied ? `Vitest matched ${matchedSuites.length} suite(s) for ${config.testPattern}; all ${passedTests.length} test assertions passed.` : `Vitest matched ${matchedSuites.length} suite(s) for ${config.testPattern}; failing tests: ${failedTests.join(", ")}.`,
|
|
219
|
+
data: {
|
|
220
|
+
runner: config.runner,
|
|
221
|
+
testPattern: config.testPattern,
|
|
222
|
+
matchedFiles: matchedSuites.map((suite) => suite.filePath),
|
|
223
|
+
failedTests,
|
|
224
|
+
passedTestCount: passedTests.length
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
export { testRunnerEvaluator };
|
|
231
|
+
//# sourceMappingURL=testRunnerEvaluator.js.map
|
|
232
|
+
//# sourceMappingURL=testRunnerEvaluator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/evaluators/shared.ts","../../src/evaluators/testRunnerEvaluator.ts"],"names":[],"mappings":"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","file":"testRunnerEvaluator.js","sourcesContent":["/** Shared evaluator helpers and result-normalization utilities. */\n\nimport type {\n EpistemicContractDirection,\n EpistemicContractEvaluationResult,\n} from \"../epistemicContractHelpers\";\n\nexport type ToolResultEnvelope = {\n command?: string;\n data?: unknown;\n exitCode?: number | null;\n output?: string;\n report?: unknown;\n stderr?: string;\n stdout?: string;\n};\n\ntype AnyRecord = Record<string, unknown>;\n\nexport function asArray(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n}\n\nexport function asNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\nexport function asRecord(value: unknown): AnyRecord | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as AnyRecord)\n : null;\n}\n\nexport function asString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim().length > 0\n ? value.trim()\n : null;\n}\n\nexport function deriveDirectionalResult(\n direction: EpistemicContractDirection,\n conditionSatisfied: boolean\n): EpistemicContractEvaluationResult {\n if (direction === \"falsifies\") {\n return conditionSatisfied ? \"disconfirmed\" : \"confirmed\";\n }\n return conditionSatisfied ? \"confirmed\" : \"disconfirmed\";\n}\n\nexport function extractTextCandidates(value: unknown): string[] {\n const record = asRecord(value);\n if (!record) {\n const candidate = asString(value);\n return candidate ? [candidate] : [];\n }\n\n const candidates = [\n record.stdout,\n record.stderr,\n record.output,\n record.text,\n record.message,\n record.raw,\n ]\n .map(asString)\n .filter((candidate): candidate is string => Boolean(candidate));\n\n for (const nestedKey of [\"report\", \"result\", \"data\", \"payload\"]) {\n const nested = record[nestedKey];\n if (nested !== value) {\n candidates.push(...extractTextCandidates(nested));\n }\n }\n\n return Array.from(new Set(candidates));\n}\n\nexport function normalizeFilePath(value: string): string {\n return value.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\");\n}\n\nexport function normalizeToolResultEnvelope(value: unknown): ToolResultEnvelope {\n const record = asRecord(value);\n if (!record) {\n return {\n output: asString(value) ?? undefined,\n };\n }\n\n const exitCode =\n asNumber(record.exitCode) ??\n asNumber(record.code) ??\n asNumber(record.status) ??\n null;\n\n return {\n command: asString(record.command) ?? undefined,\n data: record.data ?? record.payload,\n exitCode,\n output: asString(record.output) ?? undefined,\n report:\n record.report ??\n record.json ??\n record.result ??\n record.payload ??\n undefined,\n stderr: asString(record.stderr) ?? undefined,\n stdout: asString(record.stdout) ?? undefined,\n };\n}\n\nexport function parseJsonCandidate<T = unknown>(value: unknown): T | null {\n if (value === null || value === undefined) {\n return null;\n }\n\n if (typeof value !== \"string\") {\n return value as T;\n }\n\n try {\n return JSON.parse(value) as T;\n } catch {\n return null;\n }\n}\n\nexport function patternMatchesPath(\n filePath: string,\n pattern: string\n): boolean {\n const normalizedPath = normalizeFilePath(filePath);\n const normalizedPattern = normalizeFilePath(pattern);\n const escaped = normalizedPattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const regexPattern = escaped\n .replace(/\\\\\\*\\\\\\*/g, \".*\")\n .replace(/\\\\\\*/g, \"[^/]*\")\n .replace(/\\\\\\?/g, \"[^/]\");\n return new RegExp(`^${regexPattern}$`).test(normalizedPath);\n}\n\nexport function somePatternMatches(\n filePath: string | null | undefined,\n patterns: string[]\n): boolean {\n if (!filePath) {\n return false;\n }\n return patterns.some((pattern) => patternMatchesPath(filePath, pattern));\n}\n","/** Test-runner engineering evaluator for epistemic contracts. */\n\nimport type {\n EpistemicContractCondition,\n EpistemicContractRecord,\n} from \"../epistemicContractHelpers\";\nimport type {\n EpistemicEvaluator,\n EpistemicEvaluatorContext,\n EpistemicEvaluatorResult,\n} from \"../epistemicContracts\";\nimport {\n asArray,\n asRecord,\n asString,\n deriveDirectionalResult,\n extractTextCandidates,\n normalizeFilePath,\n normalizeToolResultEnvelope,\n parseJsonCandidate,\n patternMatchesPath,\n} from \"./shared\";\n\ntype AnyContract = Pick<EpistemicContractRecord, \"condition\">;\n\ntype ParsedSuite = {\n failedTests: string[];\n filePath: string;\n passedTests: string[];\n};\n\ntype TestRunnerConfig = {\n runner: \"vitest\";\n testPattern: string;\n};\n\nfunction parseConfig(condition: EpistemicContractCondition): TestRunnerConfig {\n const record = asRecord(condition.evaluatorConfig);\n if (!record) {\n throw new Error(\n \"test_runner requires evaluatorConfig with { testPattern, runner: \\\"vitest\\\" }.\"\n );\n }\n\n const testPattern = asString(record.testPattern);\n if (!testPattern) {\n throw new Error(\"test_runner requires a non-empty testPattern.\");\n }\n\n const runner = asString(record.runner);\n if (runner !== \"vitest\") {\n throw new Error(`Unsupported test runner: ${String(record.runner)}`);\n }\n\n return {\n runner,\n testPattern,\n };\n}\n\nfunction collectFailedTests(value: unknown): string[] {\n const record = asRecord(value);\n if (!record) {\n return [];\n }\n\n const fullName = asString(record.fullName);\n const title = asString(record.title);\n const label = fullName ?? title ?? \"unnamed test\";\n const status = asString(record.status);\n const state = asString(asRecord(record.result)?.state);\n const isFailed =\n status === \"failed\" ||\n status === \"fail\" ||\n state === \"failed\" ||\n state === \"fail\";\n\n const failures = isFailed ? [label] : [];\n for (const nestedKey of [\"assertionResults\", \"tests\", \"tasks\"]) {\n for (const nested of asArray(record[nestedKey])) {\n failures.push(...collectFailedTests(nested));\n }\n }\n\n return failures;\n}\n\nfunction collectPassedTests(value: unknown): string[] {\n const record = asRecord(value);\n if (!record) {\n return [];\n }\n\n const fullName = asString(record.fullName);\n const title = asString(record.title);\n const label = fullName ?? title ?? \"unnamed test\";\n const status = asString(record.status);\n const state = asString(asRecord(record.result)?.state);\n const isPassed = status === \"passed\" || state === \"passed\";\n\n const passed = isPassed ? [label] : [];\n for (const nestedKey of [\"assertionResults\", \"tests\", \"tasks\"]) {\n for (const nested of asArray(record[nestedKey])) {\n passed.push(...collectPassedTests(nested));\n }\n }\n\n return passed;\n}\n\nfunction parseSuite(value: unknown): ParsedSuite | null {\n const record = asRecord(value);\n if (!record) {\n return null;\n }\n\n const filePath =\n asString(record.name) ??\n asString(record.file) ??\n asString(record.filePath) ??\n asString(record.filepath);\n if (!filePath) {\n return null;\n }\n\n return {\n failedTests: Array.from(new Set(collectFailedTests(record))),\n filePath: normalizeFilePath(filePath),\n passedTests: Array.from(new Set(collectPassedTests(record))),\n };\n}\n\nfunction parseVitestSuites(resultData: unknown): ParsedSuite[] {\n const envelope = normalizeToolResultEnvelope(resultData);\n const candidates = [\n envelope.report,\n envelope.data,\n envelope.stdout,\n envelope.output,\n ...extractTextCandidates(resultData),\n ];\n\n for (const candidate of candidates) {\n const parsed = parseJsonCandidate(candidate);\n const report = asRecord(parsed);\n if (!report) {\n continue;\n }\n\n const suites = asArray(report.testResults)\n .map(parseSuite)\n .filter((suite): suite is ParsedSuite => Boolean(suite));\n if (suites.length > 0) {\n return suites;\n }\n\n const fileSuites = asArray(report.files)\n .map(parseSuite)\n .filter((suite): suite is ParsedSuite => Boolean(suite));\n if (fileSuites.length > 0) {\n return fileSuites;\n }\n }\n\n return [];\n}\n\nfunction getMatchedSuites(\n contract: AnyContract,\n resultData: unknown\n): ParsedSuite[] {\n const config = parseConfig(contract.condition);\n return parseVitestSuites(resultData).filter((suite) =>\n patternMatchesPath(suite.filePath, config.testPattern)\n );\n}\n\nexport type EngineeringEpistemicEvaluator = EpistemicEvaluator & {\n matches(args: { contract: AnyContract; resultData: unknown }): boolean;\n};\n\nexport const testRunnerEvaluator: EngineeringEpistemicEvaluator = {\n name: \"test_runner\",\n matches({ contract, resultData }) {\n return getMatchedSuites(contract, resultData).length > 0;\n },\n evaluate(args: EpistemicEvaluatorContext): EpistemicEvaluatorResult {\n const config = parseConfig(args.contract.condition);\n const matchedSuites = getMatchedSuites(args.contract, args.resultData);\n if (!args.resultData) {\n return {\n result: \"error\",\n rationale: \"test_runner requires Vitest JSON resultData.\",\n };\n }\n if (matchedSuites.length === 0) {\n return {\n result: \"inconclusive\",\n rationale: `No Vitest suites matched ${config.testPattern}.`,\n };\n }\n\n const failedTests = matchedSuites.flatMap((suite) => suite.failedTests);\n const passedTests = matchedSuites.flatMap((suite) => suite.passedTests);\n const conditionSatisfied = failedTests.length === 0;\n\n return {\n result: deriveDirectionalResult(\n args.contract.direction,\n conditionSatisfied\n ),\n rationale: conditionSatisfied\n ? `Vitest matched ${matchedSuites.length} suite(s) for ${config.testPattern}; all ${passedTests.length} test assertions passed.`\n : `Vitest matched ${matchedSuites.length} suite(s) for ${config.testPattern}; failing tests: ${failedTests.join(\", \")}.`,\n data: {\n runner: config.runner,\n testPattern: config.testPattern,\n matchedFiles: matchedSuites.map((suite) => suite.filePath),\n failedTests,\n passedTestCount: passedTests.length,\n },\n };\n },\n};\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { EngineeringEpistemicEvaluator } from './testRunnerEvaluator.js';
|
|
2
|
+
import '@lucern/confidence';
|
|
3
|
+
import '../epistemicContracts.js';
|
|
4
|
+
import '../convex.js';
|
|
5
|
+
import 'convex/values';
|
|
6
|
+
|
|
7
|
+
/** Typecheck-based engineering evaluator for epistemic contracts. */
|
|
8
|
+
|
|
9
|
+
declare const tscCheckerEvaluator: EngineeringEpistemicEvaluator;
|
|
10
|
+
|
|
11
|
+
export { tscCheckerEvaluator };
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
// src/evaluators/shared.ts
|
|
2
|
+
function asArray(value) {
|
|
3
|
+
return Array.isArray(value) ? value : [];
|
|
4
|
+
}
|
|
5
|
+
function asNumber(value) {
|
|
6
|
+
return typeof value === "number" && Number.isFinite(value) ? value : null;
|
|
7
|
+
}
|
|
8
|
+
function asRecord(value) {
|
|
9
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
10
|
+
}
|
|
11
|
+
function asString(value) {
|
|
12
|
+
return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
|
|
13
|
+
}
|
|
14
|
+
function deriveDirectionalResult(direction, conditionSatisfied) {
|
|
15
|
+
if (direction === "falsifies") {
|
|
16
|
+
return conditionSatisfied ? "disconfirmed" : "confirmed";
|
|
17
|
+
}
|
|
18
|
+
return conditionSatisfied ? "confirmed" : "disconfirmed";
|
|
19
|
+
}
|
|
20
|
+
function extractTextCandidates(value) {
|
|
21
|
+
const record = asRecord(value);
|
|
22
|
+
if (!record) {
|
|
23
|
+
const candidate = asString(value);
|
|
24
|
+
return candidate ? [candidate] : [];
|
|
25
|
+
}
|
|
26
|
+
const candidates = [
|
|
27
|
+
record.stdout,
|
|
28
|
+
record.stderr,
|
|
29
|
+
record.output,
|
|
30
|
+
record.text,
|
|
31
|
+
record.message,
|
|
32
|
+
record.raw
|
|
33
|
+
].map(asString).filter((candidate) => Boolean(candidate));
|
|
34
|
+
for (const nestedKey of ["report", "result", "data", "payload"]) {
|
|
35
|
+
const nested = record[nestedKey];
|
|
36
|
+
if (nested !== value) {
|
|
37
|
+
candidates.push(...extractTextCandidates(nested));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return Array.from(new Set(candidates));
|
|
41
|
+
}
|
|
42
|
+
function normalizeFilePath(value) {
|
|
43
|
+
return value.replace(/\\/g, "/").replace(/^\.\//, "");
|
|
44
|
+
}
|
|
45
|
+
function normalizeToolResultEnvelope(value) {
|
|
46
|
+
const record = asRecord(value);
|
|
47
|
+
if (!record) {
|
|
48
|
+
return {
|
|
49
|
+
output: asString(value) ?? void 0
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
const exitCode = asNumber(record.exitCode) ?? asNumber(record.code) ?? asNumber(record.status) ?? null;
|
|
53
|
+
return {
|
|
54
|
+
command: asString(record.command) ?? void 0,
|
|
55
|
+
data: record.data ?? record.payload,
|
|
56
|
+
exitCode,
|
|
57
|
+
output: asString(record.output) ?? void 0,
|
|
58
|
+
report: record.report ?? record.json ?? record.result ?? record.payload ?? void 0,
|
|
59
|
+
stderr: asString(record.stderr) ?? void 0,
|
|
60
|
+
stdout: asString(record.stdout) ?? void 0
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function patternMatchesPath(filePath, pattern) {
|
|
64
|
+
const normalizedPath = normalizeFilePath(filePath);
|
|
65
|
+
const normalizedPattern = normalizeFilePath(pattern);
|
|
66
|
+
const escaped = normalizedPattern.replace(/[.+^${}()|[\]\\]/g, "\\$&");
|
|
67
|
+
const regexPattern = escaped.replace(/\\\*\\\*/g, ".*").replace(/\\\*/g, "[^/]*").replace(/\\\?/g, "[^/]");
|
|
68
|
+
return new RegExp(`^${regexPattern}$`).test(normalizedPath);
|
|
69
|
+
}
|
|
70
|
+
function somePatternMatches(filePath, patterns) {
|
|
71
|
+
if (!filePath) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
return patterns.some((pattern) => patternMatchesPath(filePath, pattern));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// src/evaluators/tscCheckerEvaluator.ts
|
|
78
|
+
function parseConfig(condition) {
|
|
79
|
+
const record = asRecord(condition.evaluatorConfig);
|
|
80
|
+
if (!record) {
|
|
81
|
+
throw new Error(
|
|
82
|
+
"tsc_checker requires evaluatorConfig with { filePatterns: string[] }."
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
const filePatterns = asArray(record.filePatterns).map(asString).filter((pattern) => Boolean(pattern));
|
|
86
|
+
if (filePatterns.length === 0) {
|
|
87
|
+
throw new Error("tsc_checker requires at least one file pattern.");
|
|
88
|
+
}
|
|
89
|
+
return { filePatterns };
|
|
90
|
+
}
|
|
91
|
+
function parseStructuredDiagnostics(resultData) {
|
|
92
|
+
const envelope = normalizeToolResultEnvelope(resultData);
|
|
93
|
+
const record = asRecord(envelope.report) ?? asRecord(envelope.data) ?? asRecord(resultData);
|
|
94
|
+
if (!record) {
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
return asArray(record.diagnostics).flatMap((entry) => {
|
|
98
|
+
const diagnostic = asRecord(entry);
|
|
99
|
+
if (!diagnostic) {
|
|
100
|
+
return [];
|
|
101
|
+
}
|
|
102
|
+
const filePath = asString(diagnostic.filePath) ?? asString(diagnostic.file) ?? asString(asRecord(diagnostic.location)?.filePath) ?? asString(asRecord(asRecord(diagnostic.location)?.path)?.file);
|
|
103
|
+
const message = asString(diagnostic.message) ?? "TypeScript error";
|
|
104
|
+
return [
|
|
105
|
+
{
|
|
106
|
+
code: asString(diagnostic.code) ?? void 0,
|
|
107
|
+
filePath: filePath ? normalizeFilePath(filePath) : null,
|
|
108
|
+
message
|
|
109
|
+
}
|
|
110
|
+
];
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
function parseTextDiagnostics(resultData) {
|
|
114
|
+
const diagnostics = [];
|
|
115
|
+
const patterns = [
|
|
116
|
+
/^(.+?)\((\d+),(\d+)\): error TS(\d+): (.+)$/gm,
|
|
117
|
+
/^(.+?):(\d+):(\d+) - error TS(\d+): (.+)$/gm
|
|
118
|
+
];
|
|
119
|
+
for (const text of extractTextCandidates(resultData)) {
|
|
120
|
+
for (const pattern of patterns) {
|
|
121
|
+
for (const match of text.matchAll(pattern)) {
|
|
122
|
+
diagnostics.push({
|
|
123
|
+
code: match[4],
|
|
124
|
+
filePath: normalizeFilePath(match[1] ?? ""),
|
|
125
|
+
message: match[5] ?? "TypeScript error"
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return diagnostics;
|
|
131
|
+
}
|
|
132
|
+
function parseDiagnostics(resultData) {
|
|
133
|
+
const structured = parseStructuredDiagnostics(resultData);
|
|
134
|
+
return structured.length > 0 ? structured : parseTextDiagnostics(resultData);
|
|
135
|
+
}
|
|
136
|
+
function getMatchedDiagnostics(contract, resultData) {
|
|
137
|
+
const config = parseConfig(contract.condition);
|
|
138
|
+
return parseDiagnostics(resultData).filter(
|
|
139
|
+
(diagnostic) => somePatternMatches(diagnostic.filePath, config.filePatterns)
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
var tscCheckerEvaluator = {
|
|
143
|
+
name: "tsc_checker",
|
|
144
|
+
matches({ contract, resultData }) {
|
|
145
|
+
const envelope = normalizeToolResultEnvelope(resultData);
|
|
146
|
+
const exitCode = asNumber(envelope.exitCode);
|
|
147
|
+
if (exitCode === 0) {
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
return getMatchedDiagnostics(contract, resultData).length > 0;
|
|
151
|
+
},
|
|
152
|
+
evaluate(args) {
|
|
153
|
+
const config = parseConfig(args.contract.condition);
|
|
154
|
+
if (!args.resultData) {
|
|
155
|
+
return {
|
|
156
|
+
result: "error",
|
|
157
|
+
rationale: "tsc_checker requires TypeScript diagnostic resultData."
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
const envelope = normalizeToolResultEnvelope(args.resultData);
|
|
161
|
+
const exitCode = asNumber(envelope.exitCode);
|
|
162
|
+
const matchedDiagnostics = getMatchedDiagnostics(args.contract, args.resultData);
|
|
163
|
+
if (matchedDiagnostics.length === 0 && exitCode !== 0 && exitCode !== null) {
|
|
164
|
+
return {
|
|
165
|
+
result: "inconclusive",
|
|
166
|
+
rationale: "TypeScript reported errors, but none matched the configured file patterns."
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
const conditionSatisfied = exitCode === 0 || exitCode !== null && matchedDiagnostics.length === 0;
|
|
170
|
+
return {
|
|
171
|
+
result: deriveDirectionalResult(
|
|
172
|
+
args.contract.direction,
|
|
173
|
+
conditionSatisfied
|
|
174
|
+
),
|
|
175
|
+
rationale: conditionSatisfied ? `TypeScript reported no matching diagnostics for ${config.filePatterns.join(", ")}.` : `TypeScript found ${matchedDiagnostics.length} matching diagnostic(s): ${matchedDiagnostics.map(
|
|
176
|
+
(diagnostic) => diagnostic.filePath ? `${diagnostic.filePath}${diagnostic.code ? ` (TS${diagnostic.code})` : ""}` : diagnostic.message
|
|
177
|
+
).join(", ")}.`,
|
|
178
|
+
data: {
|
|
179
|
+
exitCode,
|
|
180
|
+
filePatterns: config.filePatterns,
|
|
181
|
+
matchedDiagnostics
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
export { tscCheckerEvaluator };
|
|
188
|
+
//# sourceMappingURL=tscCheckerEvaluator.js.map
|
|
189
|
+
//# sourceMappingURL=tscCheckerEvaluator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/evaluators/shared.ts","../../src/evaluators/tscCheckerEvaluator.ts"],"names":[],"mappings":"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","file":"tscCheckerEvaluator.js","sourcesContent":["/** Shared evaluator helpers and result-normalization utilities. */\n\nimport type {\n EpistemicContractDirection,\n EpistemicContractEvaluationResult,\n} from \"../epistemicContractHelpers\";\n\nexport type ToolResultEnvelope = {\n command?: string;\n data?: unknown;\n exitCode?: number | null;\n output?: string;\n report?: unknown;\n stderr?: string;\n stdout?: string;\n};\n\ntype AnyRecord = Record<string, unknown>;\n\nexport function asArray(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n}\n\nexport function asNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\nexport function asRecord(value: unknown): AnyRecord | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as AnyRecord)\n : null;\n}\n\nexport function asString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim().length > 0\n ? value.trim()\n : null;\n}\n\nexport function deriveDirectionalResult(\n direction: EpistemicContractDirection,\n conditionSatisfied: boolean\n): EpistemicContractEvaluationResult {\n if (direction === \"falsifies\") {\n return conditionSatisfied ? \"disconfirmed\" : \"confirmed\";\n }\n return conditionSatisfied ? \"confirmed\" : \"disconfirmed\";\n}\n\nexport function extractTextCandidates(value: unknown): string[] {\n const record = asRecord(value);\n if (!record) {\n const candidate = asString(value);\n return candidate ? [candidate] : [];\n }\n\n const candidates = [\n record.stdout,\n record.stderr,\n record.output,\n record.text,\n record.message,\n record.raw,\n ]\n .map(asString)\n .filter((candidate): candidate is string => Boolean(candidate));\n\n for (const nestedKey of [\"report\", \"result\", \"data\", \"payload\"]) {\n const nested = record[nestedKey];\n if (nested !== value) {\n candidates.push(...extractTextCandidates(nested));\n }\n }\n\n return Array.from(new Set(candidates));\n}\n\nexport function normalizeFilePath(value: string): string {\n return value.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\");\n}\n\nexport function normalizeToolResultEnvelope(value: unknown): ToolResultEnvelope {\n const record = asRecord(value);\n if (!record) {\n return {\n output: asString(value) ?? undefined,\n };\n }\n\n const exitCode =\n asNumber(record.exitCode) ??\n asNumber(record.code) ??\n asNumber(record.status) ??\n null;\n\n return {\n command: asString(record.command) ?? undefined,\n data: record.data ?? record.payload,\n exitCode,\n output: asString(record.output) ?? undefined,\n report:\n record.report ??\n record.json ??\n record.result ??\n record.payload ??\n undefined,\n stderr: asString(record.stderr) ?? undefined,\n stdout: asString(record.stdout) ?? undefined,\n };\n}\n\nexport function parseJsonCandidate<T = unknown>(value: unknown): T | null {\n if (value === null || value === undefined) {\n return null;\n }\n\n if (typeof value !== \"string\") {\n return value as T;\n }\n\n try {\n return JSON.parse(value) as T;\n } catch {\n return null;\n }\n}\n\nexport function patternMatchesPath(\n filePath: string,\n pattern: string\n): boolean {\n const normalizedPath = normalizeFilePath(filePath);\n const normalizedPattern = normalizeFilePath(pattern);\n const escaped = normalizedPattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const regexPattern = escaped\n .replace(/\\\\\\*\\\\\\*/g, \".*\")\n .replace(/\\\\\\*/g, \"[^/]*\")\n .replace(/\\\\\\?/g, \"[^/]\");\n return new RegExp(`^${regexPattern}$`).test(normalizedPath);\n}\n\nexport function somePatternMatches(\n filePath: string | null | undefined,\n patterns: string[]\n): boolean {\n if (!filePath) {\n return false;\n }\n return patterns.some((pattern) => patternMatchesPath(filePath, pattern));\n}\n","/** Typecheck-based engineering evaluator for epistemic contracts. */\n\nimport type {\n EpistemicContractCondition,\n EpistemicContractRecord,\n} from \"../epistemicContractHelpers\";\nimport type {\n EpistemicEvaluatorContext,\n EpistemicEvaluatorResult,\n} from \"../epistemicContracts\";\nimport {\n asArray,\n asNumber,\n asRecord,\n asString,\n deriveDirectionalResult,\n extractTextCandidates,\n normalizeFilePath,\n normalizeToolResultEnvelope,\n somePatternMatches,\n} from \"./shared\";\nimport type { EngineeringEpistemicEvaluator } from \"./testRunnerEvaluator\";\n\ntype AnyContract = Pick<EpistemicContractRecord, \"condition\">;\n\ntype ParsedDiagnostic = {\n code?: string;\n filePath: string | null;\n message: string;\n};\n\ntype TscCheckerConfig = {\n filePatterns: string[];\n};\n\nfunction parseConfig(condition: EpistemicContractCondition): TscCheckerConfig {\n const record = asRecord(condition.evaluatorConfig);\n if (!record) {\n throw new Error(\n \"tsc_checker requires evaluatorConfig with { filePatterns: string[] }.\"\n );\n }\n\n const filePatterns = asArray(record.filePatterns)\n .map(asString)\n .filter((pattern): pattern is string => Boolean(pattern));\n if (filePatterns.length === 0) {\n throw new Error(\"tsc_checker requires at least one file pattern.\");\n }\n\n return { filePatterns };\n}\n\nfunction parseStructuredDiagnostics(resultData: unknown): ParsedDiagnostic[] {\n const envelope = normalizeToolResultEnvelope(resultData);\n const record =\n asRecord(envelope.report) ?? asRecord(envelope.data) ?? asRecord(resultData);\n if (!record) {\n return [];\n }\n\n return asArray(record.diagnostics).flatMap((entry): ParsedDiagnostic[] => {\n const diagnostic = asRecord(entry);\n if (!diagnostic) {\n return [];\n }\n const filePath =\n asString(diagnostic.filePath) ??\n asString(diagnostic.file) ??\n asString(asRecord(diagnostic.location)?.filePath) ??\n asString(asRecord(asRecord(diagnostic.location)?.path)?.file);\n const message = asString(diagnostic.message) ?? \"TypeScript error\";\n return [\n {\n code: asString(diagnostic.code) ?? undefined,\n filePath: filePath ? normalizeFilePath(filePath) : null,\n message,\n },\n ];\n });\n}\n\nfunction parseTextDiagnostics(resultData: unknown): ParsedDiagnostic[] {\n const diagnostics: ParsedDiagnostic[] = [];\n const patterns = [\n /^(.+?)\\((\\d+),(\\d+)\\): error TS(\\d+): (.+)$/gm,\n /^(.+?):(\\d+):(\\d+) - error TS(\\d+): (.+)$/gm,\n ];\n\n for (const text of extractTextCandidates(resultData)) {\n for (const pattern of patterns) {\n for (const match of text.matchAll(pattern)) {\n diagnostics.push({\n code: match[4],\n filePath: normalizeFilePath(match[1] ?? \"\"),\n message: match[5] ?? \"TypeScript error\",\n });\n }\n }\n }\n\n return diagnostics;\n}\n\nfunction parseDiagnostics(resultData: unknown): ParsedDiagnostic[] {\n const structured = parseStructuredDiagnostics(resultData);\n return structured.length > 0 ? structured : parseTextDiagnostics(resultData);\n}\n\nfunction getMatchedDiagnostics(\n contract: AnyContract,\n resultData: unknown\n): ParsedDiagnostic[] {\n const config = parseConfig(contract.condition);\n return parseDiagnostics(resultData).filter((diagnostic) =>\n somePatternMatches(diagnostic.filePath, config.filePatterns)\n );\n}\n\nexport const tscCheckerEvaluator: EngineeringEpistemicEvaluator = {\n name: \"tsc_checker\",\n matches({ contract, resultData }) {\n const envelope = normalizeToolResultEnvelope(resultData);\n const exitCode = asNumber(envelope.exitCode);\n if (exitCode === 0) {\n return true;\n }\n return getMatchedDiagnostics(contract, resultData).length > 0;\n },\n evaluate(args: EpistemicEvaluatorContext): EpistemicEvaluatorResult {\n const config = parseConfig(args.contract.condition);\n if (!args.resultData) {\n return {\n result: \"error\",\n rationale: \"tsc_checker requires TypeScript diagnostic resultData.\",\n };\n }\n\n const envelope = normalizeToolResultEnvelope(args.resultData);\n const exitCode = asNumber(envelope.exitCode);\n const matchedDiagnostics = getMatchedDiagnostics(args.contract, args.resultData);\n\n if (matchedDiagnostics.length === 0 && exitCode !== 0 && exitCode !== null) {\n return {\n result: \"inconclusive\",\n rationale:\n \"TypeScript reported errors, but none matched the configured file patterns.\",\n };\n }\n\n const conditionSatisfied =\n exitCode === 0 || (exitCode !== null && matchedDiagnostics.length === 0);\n\n return {\n result: deriveDirectionalResult(\n args.contract.direction,\n conditionSatisfied\n ),\n rationale: conditionSatisfied\n ? `TypeScript reported no matching diagnostics for ${config.filePatterns.join(\", \")}.`\n : `TypeScript found ${matchedDiagnostics.length} matching diagnostic(s): ${matchedDiagnostics\n .map((diagnostic) =>\n diagnostic.filePath\n ? `${diagnostic.filePath}${diagnostic.code ? ` (TS${diagnostic.code})` : \"\"}`\n : diagnostic.message\n )\n .join(\", \")}.`,\n data: {\n exitCode,\n filePatterns: config.filePatterns,\n matchedDiagnostics,\n },\n };\n },\n};\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared UUID v4 generator for global IDs.
|
|
3
|
+
*
|
|
4
|
+
* Uses crypto.getRandomValues() for collision-safe generation.
|
|
5
|
+
* Replaces the Math.random()-based UUID pattern that was duplicated
|
|
6
|
+
* across 7+ files.
|
|
7
|
+
*
|
|
8
|
+
* @module convex/lib/globalId
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Generate a UUID v4 global ID using crypto-safe random bytes.
|
|
12
|
+
*/
|
|
13
|
+
declare function generateGlobalId(): string;
|
|
14
|
+
|
|
15
|
+
declare const globalId_generateGlobalId: typeof generateGlobalId;
|
|
16
|
+
declare namespace globalId {
|
|
17
|
+
export { globalId_generateGlobalId as generateGlobalId };
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export { generateGlobalId as a, globalId as g };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { a as generateGlobalId } from './globalId-DKh9d_uD.js';
|
package/dist/globalId.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// src/globalId.ts
|
|
2
|
+
function generateGlobalId() {
|
|
3
|
+
const bytes = new Uint8Array(16);
|
|
4
|
+
crypto.getRandomValues(bytes);
|
|
5
|
+
bytes[6] = bytes[6] & 15 | 64;
|
|
6
|
+
bytes[8] = bytes[8] & 63 | 128;
|
|
7
|
+
const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join(
|
|
8
|
+
""
|
|
9
|
+
);
|
|
10
|
+
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export { generateGlobalId };
|
|
14
|
+
//# sourceMappingURL=globalId.js.map
|
|
15
|
+
//# sourceMappingURL=globalId.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/globalId.ts"],"names":[],"mappings":";AAaO,SAAS,gBAAA,GAA2B;AACzC,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,EAAE,CAAA;AAC/B,EAAA,MAAA,CAAO,gBAAgB,KAAK,CAAA;AAE5B,EAAA,KAAA,CAAM,CAAC,CAAA,GAAK,KAAA,CAAM,CAAC,IAAI,EAAA,GAAQ,EAAA;AAC/B,EAAA,KAAA,CAAM,CAAC,CAAA,GAAK,KAAA,CAAM,CAAC,IAAI,EAAA,GAAQ,GAAA;AAC/B,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,IAAA;AAAA,IACpE;AAAA,GACF;AACA,EAAA,OAAO,CAAA,EAAG,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,EAAE,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,EAAE,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,KAAA,CAAM,EAAE,CAAC,CAAA,CAAA;AAC1G","file":"globalId.js","sourcesContent":["/**\n * Shared UUID v4 generator for global IDs.\n *\n * Uses crypto.getRandomValues() for collision-safe generation.\n * Replaces the Math.random()-based UUID pattern that was duplicated\n * across 7+ files.\n *\n * @module convex/lib/globalId\n */\n\n/**\n * Generate a UUID v4 global ID using crypto-safe random bytes.\n */\nexport function generateGlobalId(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n // Set version (4) and variant (RFC 4122)\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\n \"\"\n );\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n"]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Graph Type Registry for Convex
|
|
3
|
+
*
|
|
4
|
+
* This file mirrors the canonical type registry at lib/ontology/types.ts
|
|
5
|
+
* but is compatible with Convex's bundling requirements.
|
|
6
|
+
*
|
|
7
|
+
* IMPORTANT: Keep this file in sync with lib/ontology/types.ts
|
|
8
|
+
* The frontend uses lib/ontology/types.ts, Convex uses this file.
|
|
9
|
+
*
|
|
10
|
+
* @see /docs/architecture/UNIFIED_GRAPH_ARCHITECTURE.md
|
|
11
|
+
*/
|
|
12
|
+
type EpistemicLayer = "L4" | "L3" | "L2" | "L1" | "ontological" | "organizational";
|
|
13
|
+
declare const NODE_TYPE_TO_LABEL: Record<string, string>;
|
|
14
|
+
/**
|
|
15
|
+
* Epistemic Kernel v2: 6 canonical edge types + ontological edges.
|
|
16
|
+
*
|
|
17
|
+
* Weight and metadata carry nuance that previously required 67 separate type strings.
|
|
18
|
+
* See: docs/architecture/epistemic-kernel-v2.md
|
|
19
|
+
*/
|
|
20
|
+
declare const EDGE_TYPE_TO_REL: Record<string, string>;
|
|
21
|
+
/**
|
|
22
|
+
* Get the epistemic layer for a node type
|
|
23
|
+
*/
|
|
24
|
+
declare function getNodeLayer(nodeType: string): EpistemicLayer;
|
|
25
|
+
/**
|
|
26
|
+
* Get the Neo4j label for a node type
|
|
27
|
+
*/
|
|
28
|
+
declare function getNeo4jLabel(nodeType: string): string;
|
|
29
|
+
/**
|
|
30
|
+
* Get the Neo4j relationship type for an edge type
|
|
31
|
+
*/
|
|
32
|
+
declare function getNeo4jRelType(edgeType: string): string;
|
|
33
|
+
/**
|
|
34
|
+
* Check if an edge type is deprecated.
|
|
35
|
+
*
|
|
36
|
+
* Kernel v2: only the 6 canonical epistemic types, L4 decision types,
|
|
37
|
+
* and ontological types are active. All legacy types (67 old types) are deprecated.
|
|
38
|
+
*/
|
|
39
|
+
declare function isDeprecatedEdgeType(edgeType: string): boolean;
|
|
40
|
+
|
|
41
|
+
declare const graphTypes_EDGE_TYPE_TO_REL: typeof EDGE_TYPE_TO_REL;
|
|
42
|
+
type graphTypes_EpistemicLayer = EpistemicLayer;
|
|
43
|
+
declare const graphTypes_NODE_TYPE_TO_LABEL: typeof NODE_TYPE_TO_LABEL;
|
|
44
|
+
declare const graphTypes_getNeo4jLabel: typeof getNeo4jLabel;
|
|
45
|
+
declare const graphTypes_getNeo4jRelType: typeof getNeo4jRelType;
|
|
46
|
+
declare const graphTypes_getNodeLayer: typeof getNodeLayer;
|
|
47
|
+
declare const graphTypes_isDeprecatedEdgeType: typeof isDeprecatedEdgeType;
|
|
48
|
+
declare namespace graphTypes {
|
|
49
|
+
export { graphTypes_EDGE_TYPE_TO_REL as EDGE_TYPE_TO_REL, type graphTypes_EpistemicLayer as EpistemicLayer, graphTypes_NODE_TYPE_TO_LABEL as NODE_TYPE_TO_LABEL, graphTypes_getNeo4jLabel as getNeo4jLabel, graphTypes_getNeo4jRelType as getNeo4jRelType, graphTypes_getNodeLayer as getNodeLayer, graphTypes_isDeprecatedEdgeType as isDeprecatedEdgeType };
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export { type EpistemicLayer as E, NODE_TYPE_TO_LABEL as N, getNeo4jLabel as a, getNeo4jRelType as b, getNodeLayer as c, EDGE_TYPE_TO_REL as d, graphTypes as g, isDeprecatedEdgeType as i };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { d as EDGE_TYPE_TO_REL, E as EpistemicLayer, N as NODE_TYPE_TO_LABEL, a as getNeo4jLabel, b as getNeo4jRelType, c as getNodeLayer, i as isDeprecatedEdgeType } from './graphTypes-CpgIuCdo.js';
|