@balpal4495/quorum 3.0.3 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/commands/compass.js +4 -4
- package/bin/shared/llm.js +2 -2
- package/dist/advisor/ask.d.ts +13 -0
- package/dist/advisor/ask.d.ts.map +1 -0
- package/dist/advisor/ask.js +67 -0
- package/dist/advisor/ask.js.map +1 -0
- package/dist/advisor/index.d.ts +3 -0
- package/dist/advisor/index.d.ts.map +1 -0
- package/dist/advisor/index.js +2 -0
- package/dist/advisor/index.js.map +1 -0
- package/dist/advisor/prompt.d.ts +5 -0
- package/dist/advisor/prompt.d.ts.map +1 -0
- package/{modules/advisor/prompt.ts → dist/advisor/prompt.js} +22 -26
- package/dist/advisor/prompt.js.map +1 -0
- package/dist/advisor/types.d.ts +23 -0
- package/dist/advisor/types.d.ts.map +1 -0
- package/dist/advisor/types.js +2 -0
- package/dist/advisor/types.js.map +1 -0
- package/dist/compass/behavior.d.ts +4 -0
- package/dist/compass/behavior.d.ts.map +1 -0
- package/dist/compass/behavior.js +138 -0
- package/dist/compass/behavior.js.map +1 -0
- package/dist/compass/create.d.ts +3 -0
- package/dist/compass/create.d.ts.map +1 -0
- package/dist/compass/create.js +289 -0
- package/dist/compass/create.js.map +1 -0
- package/dist/compass/evidence/collect.d.ts +11 -0
- package/dist/compass/evidence/collect.d.ts.map +1 -0
- package/dist/compass/evidence/collect.js +86 -0
- package/dist/compass/evidence/collect.js.map +1 -0
- package/dist/compass/index.d.ts +8 -0
- package/dist/compass/index.d.ts.map +1 -0
- package/dist/compass/index.js +8 -0
- package/dist/compass/index.js.map +1 -0
- package/dist/compass/prompts/index.d.ts +28 -0
- package/dist/compass/prompts/index.d.ts.map +1 -0
- package/{modules/compass/prompts/index.ts → dist/compass/prompts/index.js} +13 -38
- package/dist/compass/prompts/index.js.map +1 -0
- package/dist/compass/prompts/system.d.ts +2 -0
- package/dist/compass/prompts/system.d.ts.map +1 -0
- package/{modules/compass/prompts/system.ts → dist/compass/prompts/system.js} +2 -1
- package/dist/compass/prompts/system.js.map +1 -0
- package/dist/compass/propose.d.ts +15 -0
- package/dist/compass/propose.d.ts.map +1 -0
- package/dist/compass/propose.js +128 -0
- package/dist/compass/propose.js.map +1 -0
- package/dist/compass/schemas.d.ts +1271 -0
- package/dist/compass/schemas.d.ts.map +1 -0
- package/dist/compass/schemas.js +113 -0
- package/dist/compass/schemas.js.map +1 -0
- package/dist/compass/score.d.ts +25 -0
- package/dist/compass/score.d.ts.map +1 -0
- package/dist/compass/score.js +89 -0
- package/dist/compass/score.js.map +1 -0
- package/dist/compass/sources/index.d.ts +9 -0
- package/dist/compass/sources/index.d.ts.map +1 -0
- package/dist/compass/sources/index.js +408 -0
- package/dist/compass/sources/index.js.map +1 -0
- package/dist/compass/types.d.ts +334 -0
- package/dist/compass/types.d.ts.map +1 -0
- package/dist/compass/types.js +2 -0
- package/dist/compass/types.js.map +1 -0
- package/dist/council/advisors.d.ts +15 -0
- package/dist/council/advisors.d.ts.map +1 -0
- package/dist/council/advisors.js +46 -0
- package/dist/council/advisors.js.map +1 -0
- package/dist/council/chairman.d.ts +13 -0
- package/dist/council/chairman.d.ts.map +1 -0
- package/dist/council/chairman.js +145 -0
- package/dist/council/chairman.js.map +1 -0
- package/dist/council/deliberate.d.ts +22 -0
- package/dist/council/deliberate.d.ts.map +1 -0
- package/dist/council/deliberate.js +99 -0
- package/dist/council/deliberate.js.map +1 -0
- package/dist/council/frame.d.ts +8 -0
- package/dist/council/frame.d.ts.map +1 -0
- package/dist/council/frame.js +40 -0
- package/dist/council/frame.js.map +1 -0
- package/dist/council/index.d.ts +6 -0
- package/dist/council/index.d.ts.map +1 -0
- package/dist/council/index.js +4 -0
- package/dist/council/index.js.map +1 -0
- package/dist/council/personas.d.ts +18 -0
- package/dist/council/personas.d.ts.map +1 -0
- package/dist/council/personas.js +44 -0
- package/dist/council/personas.js.map +1 -0
- package/dist/council/reviewers.d.ts +13 -0
- package/dist/council/reviewers.d.ts.map +1 -0
- package/dist/council/reviewers.js +59 -0
- package/dist/council/reviewers.js.map +1 -0
- package/dist/council/risk.d.ts +16 -0
- package/dist/council/risk.d.ts.map +1 -0
- package/dist/council/risk.js +74 -0
- package/dist/council/risk.js.map +1 -0
- package/dist/council/types.d.ts +95 -0
- package/dist/council/types.d.ts.map +1 -0
- package/dist/council/types.js +2 -0
- package/dist/council/types.js.map +1 -0
- package/dist/jury/evaluate.d.ts +13 -0
- package/dist/jury/evaluate.d.ts.map +1 -0
- package/{modules/jury/evaluate.ts → dist/jury/evaluate.js} +60 -84
- package/dist/jury/evaluate.js.map +1 -0
- package/dist/jury/index.d.ts +6 -0
- package/dist/jury/index.d.ts.map +1 -0
- package/dist/jury/index.js +4 -0
- package/dist/jury/index.js.map +1 -0
- package/dist/jury/preflight.d.ts +26 -0
- package/dist/jury/preflight.d.ts.map +1 -0
- package/dist/jury/preflight.js +71 -0
- package/dist/jury/preflight.js.map +1 -0
- package/dist/jury/schema.d.ts +57 -0
- package/dist/jury/schema.d.ts.map +1 -0
- package/dist/jury/schema.js +21 -0
- package/dist/jury/schema.js.map +1 -0
- package/dist/jury/types.d.ts +47 -0
- package/dist/jury/types.d.ts.map +1 -0
- package/dist/jury/types.js +2 -0
- package/dist/jury/types.js.map +1 -0
- package/dist/oracle/adapters/lance-db.d.ts +15 -0
- package/dist/oracle/adapters/lance-db.d.ts.map +1 -0
- package/dist/oracle/adapters/lance-db.js +68 -0
- package/dist/oracle/adapters/lance-db.js.map +1 -0
- package/dist/oracle/adapters/xenova-embedder.d.ts +21 -0
- package/dist/oracle/adapters/xenova-embedder.d.ts.map +1 -0
- package/dist/oracle/adapters/xenova-embedder.js +36 -0
- package/dist/oracle/adapters/xenova-embedder.js.map +1 -0
- package/dist/oracle/bm25.d.ts +20 -0
- package/dist/oracle/bm25.d.ts.map +1 -0
- package/dist/oracle/bm25.js +82 -0
- package/dist/oracle/bm25.js.map +1 -0
- package/dist/oracle/index.d.ts +21 -0
- package/dist/oracle/index.d.ts.map +1 -0
- package/dist/oracle/index.js +25 -0
- package/dist/oracle/index.js.map +1 -0
- package/dist/oracle/log.d.ts +6 -0
- package/dist/oracle/log.d.ts.map +1 -0
- package/dist/oracle/log.js +12 -0
- package/dist/oracle/log.js.map +1 -0
- package/dist/oracle/propose.d.ts +25 -0
- package/dist/oracle/propose.d.ts.map +1 -0
- package/dist/oracle/propose.js +133 -0
- package/dist/oracle/propose.js.map +1 -0
- package/dist/oracle/query.d.ts +17 -0
- package/dist/oracle/query.d.ts.map +1 -0
- package/dist/oracle/query.js +106 -0
- package/dist/oracle/query.js.map +1 -0
- package/dist/oracle/summary.d.ts +11 -0
- package/dist/oracle/summary.d.ts.map +1 -0
- package/dist/oracle/summary.js +102 -0
- package/dist/oracle/summary.js.map +1 -0
- package/dist/oracle/types.d.ts +31 -0
- package/dist/oracle/types.d.ts.map +1 -0
- package/dist/oracle/types.js +2 -0
- package/dist/oracle/types.js.map +1 -0
- package/dist/sentinel/assert.d.ts +28 -0
- package/dist/sentinel/assert.d.ts.map +1 -0
- package/dist/sentinel/assert.js +63 -0
- package/dist/sentinel/assert.js.map +1 -0
- package/dist/sentinel/coverage.d.ts +14 -0
- package/dist/sentinel/coverage.d.ts.map +1 -0
- package/dist/sentinel/coverage.js +96 -0
- package/dist/sentinel/coverage.js.map +1 -0
- package/dist/sentinel/drift.d.ts +12 -0
- package/dist/sentinel/drift.d.ts.map +1 -0
- package/dist/sentinel/drift.js +149 -0
- package/dist/sentinel/drift.js.map +1 -0
- package/dist/sentinel/index.d.ts +7 -0
- package/dist/sentinel/index.d.ts.map +1 -0
- package/dist/sentinel/index.js +5 -0
- package/dist/sentinel/index.js.map +1 -0
- package/dist/sentinel/review.d.ts +15 -0
- package/dist/sentinel/review.d.ts.map +1 -0
- package/dist/sentinel/review.js +177 -0
- package/dist/sentinel/review.js.map +1 -0
- package/dist/setup.d.ts +103 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +87 -0
- package/dist/setup.js.map +1 -0
- package/dist/shared/types.d.ts +173 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +16 -0
- package/dist/shared/types.js.map +1 -0
- package/package.json +13 -8
- package/.github/copilot-instructions.md +0 -117
- package/CLAUDE.md +0 -146
- package/GEMINI.md +0 -73
- package/SETUP.md +0 -264
- package/evals/__tests__/eval.test.ts +0 -31
- package/evals/cases/auth_hs256_rejected.json +0 -46
- package/evals/cases/auth_rs256_valid.json +0 -30
- package/evals/cases/cache_missing_lock.json +0 -31
- package/evals/cases/db_naive_not_null.json +0 -32
- package/evals/cases/logging_pii_leak.json +0 -32
- package/evals/cases/migration_with_rollback.json +0 -43
- package/evals/cases/no_evidence_novel_design.json +0 -16
- package/evals/cases/payment_no_idempotency.json +0 -33
- package/evals/cases/redis_session_rejected.json +0 -32
- package/evals/cases/safe_refactor.json +0 -17
- package/evals/runner.ts +0 -226
- package/modules/AGENTS.md +0 -78
- package/modules/CLAUDE.md +0 -93
- package/modules/README.md +0 -504
- package/modules/advisor/ask.ts +0 -87
- package/modules/advisor/index.ts +0 -2
- package/modules/advisor/types.ts +0 -26
- package/modules/compass/behavior.ts +0 -161
- package/modules/compass/create.ts +0 -365
- package/modules/compass/evidence/collect.ts +0 -109
- package/modules/compass/index.ts +0 -7
- package/modules/compass/propose.ts +0 -152
- package/modules/compass/schemas.ts +0 -121
- package/modules/compass/score.ts +0 -77
- package/modules/compass/sources/index.ts +0 -413
- package/modules/compass/types.ts +0 -431
- package/modules/council/advisors.ts +0 -71
- package/modules/council/chairman.ts +0 -183
- package/modules/council/deliberate.ts +0 -141
- package/modules/council/frame.ts +0 -54
- package/modules/council/index.ts +0 -9
- package/modules/council/personas.ts +0 -57
- package/modules/council/reviewers.ts +0 -82
- package/modules/council/risk.ts +0 -89
- package/modules/council/types.ts +0 -107
- package/modules/jury/index.ts +0 -5
- package/modules/jury/preflight.ts +0 -101
- package/modules/jury/schema.ts +0 -24
- package/modules/jury/types.ts +0 -50
- package/modules/oracle/adapters/lance-db.ts +0 -81
- package/modules/oracle/adapters/xenova-embedder.ts +0 -43
- package/modules/oracle/bm25.ts +0 -92
- package/modules/oracle/index.ts +0 -36
- package/modules/oracle/log.ts +0 -15
- package/modules/oracle/propose.ts +0 -164
- package/modules/oracle/query.ts +0 -146
- package/modules/oracle/summary.ts +0 -116
- package/modules/oracle/types.ts +0 -32
- package/modules/sentinel/assert.ts +0 -95
- package/modules/sentinel/coverage.ts +0 -106
- package/modules/sentinel/drift.ts +0 -163
- package/modules/sentinel/index.ts +0 -6
- package/modules/sentinel/review.ts +0 -208
- package/modules/setup.ts +0 -202
- package/modules/shared/types.ts +0 -193
|
@@ -1,29 +1,22 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
return "No Oracle entries found. There is no prior evidence for this codebase on this topic."
|
|
12
|
-
}
|
|
13
|
-
return evidence
|
|
14
|
-
.map(e =>
|
|
15
|
-
[
|
|
1
|
+
import { entryText } from "../shared/types.js";
|
|
2
|
+
import { JuryOutputSchema } from "./schema.js";
|
|
3
|
+
import { runPreflight, formatPreflight } from "./preflight.js";
|
|
4
|
+
const CONFIDENCE_THRESHOLD = 0.6;
|
|
5
|
+
function formatEvidence(evidence) {
|
|
6
|
+
if (evidence.length === 0) {
|
|
7
|
+
return "No Oracle entries found. There is no prior evidence for this codebase on this topic.";
|
|
8
|
+
}
|
|
9
|
+
return evidence
|
|
10
|
+
.map(e => [
|
|
16
11
|
`[${e.id}] status=${e.status} confidence=${e.confidence.toFixed(2)} score=${e.score.toFixed(3)}`,
|
|
17
12
|
`Insight: ${entryText(e)}`,
|
|
18
13
|
`Areas: ${e.affected_areas.join(", ")}${e.scope ? " | " + e.scope.join(", ") : ""}`,
|
|
19
14
|
e.outcome ? `Outcome: ${e.outcome}` : null,
|
|
20
|
-
|
|
15
|
+
]
|
|
21
16
|
.filter(Boolean)
|
|
22
|
-
.join("\n")
|
|
23
|
-
|
|
24
|
-
.join("\n\n")
|
|
17
|
+
.join("\n"))
|
|
18
|
+
.join("\n\n");
|
|
25
19
|
}
|
|
26
|
-
|
|
27
20
|
const SYSTEM_PROMPT = `You are the Jury — an evidence-based evaluator for agentic development workflows.
|
|
28
21
|
|
|
29
22
|
Your job is to evaluate a proposed design against Oracle evidence and produce a calibrated confidence score.
|
|
@@ -60,8 +53,7 @@ Return ONLY valid JSON that matches this schema exactly — no markdown fences,
|
|
|
60
53
|
"blocking_gaps": [<string — gaps that are hard blockers only>],
|
|
61
54
|
"council_brief": "challenge" | "pressure-test",
|
|
62
55
|
"recommendation": "proceed" | "investigate-more" | "redesign"
|
|
63
|
-
}
|
|
64
|
-
|
|
56
|
+
}`;
|
|
65
57
|
/**
|
|
66
58
|
* Evaluate a proposed design against Oracle evidence.
|
|
67
59
|
*
|
|
@@ -72,66 +64,50 @@ Return ONLY valid JSON that matches this schema exactly — no markdown fences,
|
|
|
72
64
|
* Throws if the LLM returns non-JSON or a response that fails schema validation.
|
|
73
65
|
* Never silently defaults to a passing score.
|
|
74
66
|
*/
|
|
75
|
-
export async function evaluate(
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
)
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
throw new Error(
|
|
121
|
-
`Jury: LLM output failed schema validation. Issues: ${JSON.stringify(result.error.issues)}`,
|
|
122
|
-
)
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
const output = result.data
|
|
126
|
-
|
|
127
|
-
// Recompute confidence as the exact average of breakdown dimensions
|
|
128
|
-
// This makes confidence deterministic and calibrated regardless of what the LLM returned
|
|
129
|
-
const { evidence_support, feasibility, risk, completeness } = output.confidence_breakdown
|
|
130
|
-
output.confidence = Math.round(((evidence_support + feasibility + risk + completeness) / 4) * 100) / 100
|
|
131
|
-
|
|
132
|
-
// Enforce council_brief from recomputed confidence — do not trust the LLM to compute this correctly
|
|
133
|
-
output.council_brief =
|
|
134
|
-
output.confidence < CONFIDENCE_THRESHOLD ? "challenge" : "pressure-test"
|
|
135
|
-
|
|
136
|
-
return output
|
|
67
|
+
export async function evaluate(input, deps) {
|
|
68
|
+
const { llm, model } = deps;
|
|
69
|
+
const evidenceText = formatEvidence(input.evidence);
|
|
70
|
+
const preflight = runPreflight(input.outcome, input.design, input.evidence);
|
|
71
|
+
const preflightText = formatPreflight(preflight);
|
|
72
|
+
const userPrompt = [
|
|
73
|
+
"## Outcome",
|
|
74
|
+
input.outcome,
|
|
75
|
+
"",
|
|
76
|
+
"## Proposed Design",
|
|
77
|
+
input.design,
|
|
78
|
+
"",
|
|
79
|
+
preflightText,
|
|
80
|
+
"",
|
|
81
|
+
"## Oracle Evidence",
|
|
82
|
+
evidenceText,
|
|
83
|
+
].join("\n");
|
|
84
|
+
const raw = await llm([
|
|
85
|
+
{ role: "system", content: SYSTEM_PROMPT },
|
|
86
|
+
{ role: "user", content: userPrompt },
|
|
87
|
+
], model);
|
|
88
|
+
let parsed;
|
|
89
|
+
try {
|
|
90
|
+
const cleaned = raw
|
|
91
|
+
.replace(/^```(?:json)?\s*/m, "")
|
|
92
|
+
.replace(/\s*```$/m, "")
|
|
93
|
+
.trim();
|
|
94
|
+
parsed = JSON.parse(cleaned);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
throw new Error(`Jury: LLM returned non-JSON response. Raw (first 300 chars): ${raw.slice(0, 300)}`);
|
|
98
|
+
}
|
|
99
|
+
const result = JuryOutputSchema.safeParse(parsed);
|
|
100
|
+
if (!result.success) {
|
|
101
|
+
throw new Error(`Jury: LLM output failed schema validation. Issues: ${JSON.stringify(result.error.issues)}`);
|
|
102
|
+
}
|
|
103
|
+
const output = result.data;
|
|
104
|
+
// Recompute confidence as the exact average of breakdown dimensions
|
|
105
|
+
// This makes confidence deterministic and calibrated regardless of what the LLM returned
|
|
106
|
+
const { evidence_support, feasibility, risk, completeness } = output.confidence_breakdown;
|
|
107
|
+
output.confidence = Math.round(((evidence_support + feasibility + risk + completeness) / 4) * 100) / 100;
|
|
108
|
+
// Enforce council_brief from recomputed confidence — do not trust the LLM to compute this correctly
|
|
109
|
+
output.council_brief =
|
|
110
|
+
output.confidence < CONFIDENCE_THRESHOLD ? "challenge" : "pressure-test";
|
|
111
|
+
return output;
|
|
137
112
|
}
|
|
113
|
+
//# sourceMappingURL=evaluate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../modules/jury/evaluate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { evaluate } from "./evaluate.js";
|
|
2
|
+
export type { JuryInput, JuryOutput, JuryDeps, ConfidenceBreakdown } from "./types.js";
|
|
3
|
+
export { JuryOutputSchema } from "./schema.js";
|
|
4
|
+
export { runPreflight, formatPreflight } from "./preflight.js";
|
|
5
|
+
export type { PreflightResult } from "./preflight.js";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../modules/jury/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AACtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAC9D,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../modules/jury/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { OracleResult } from "../shared/types.js";
|
|
2
|
+
export interface PreflightResult {
|
|
3
|
+
touches_sensitive_area: boolean;
|
|
4
|
+
/** Which sensitive area categories were detected. */
|
|
5
|
+
sensitive_areas: string[];
|
|
6
|
+
/** Whether the design mentions a rollback or recovery strategy. */
|
|
7
|
+
rollback_mentioned: boolean;
|
|
8
|
+
/** Whether the design mentions testing. */
|
|
9
|
+
test_strategy_mentioned: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* IDs of refuted Chronicle entries that semantically overlap with the design text.
|
|
12
|
+
* These are potential conflicts — Jury should surface them.
|
|
13
|
+
*/
|
|
14
|
+
chronicle_conflicts: string[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Static preflight analysis — no LLM required.
|
|
18
|
+
*
|
|
19
|
+
* Runs deterministic checks on the outcome + design text and the evidence pack
|
|
20
|
+
* before any LLM call. Results are injected into the Jury prompt so the LLM
|
|
21
|
+
* reasons over concrete signals rather than discovering them itself.
|
|
22
|
+
*/
|
|
23
|
+
export declare function runPreflight(outcome: string, design: string, evidence: OracleResult[]): PreflightResult;
|
|
24
|
+
/** Format preflight result for injection into the Jury prompt. */
|
|
25
|
+
export declare function formatPreflight(preflight: PreflightResult): string;
|
|
26
|
+
//# sourceMappingURL=preflight.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../modules/jury/preflight.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAkBtD,MAAM,WAAW,eAAe;IAC9B,sBAAsB,EAAE,OAAO,CAAA;IAC/B,qDAAqD;IACrD,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,mEAAmE;IACnE,kBAAkB,EAAE,OAAO,CAAA;IAC3B,2CAA2C;IAC3C,uBAAuB,EAAE,OAAO,CAAA;IAChC;;;OAGG;IACH,mBAAmB,EAAE,MAAM,EAAE,CAAA;CAC9B;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,YAAY,EAAE,GACvB,eAAe,CAiCjB;AAED,kEAAkE;AAClE,wBAAgB,eAAe,CAAC,SAAS,EAAE,eAAe,GAAG,MAAM,CAoBlE"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { entryText } from "../shared/types.js";
|
|
2
|
+
/** Areas that warrant elevated scrutiny. */
|
|
3
|
+
const SENSITIVE_PATTERNS = {
|
|
4
|
+
auth: /\b(auth(?:entication|orization)?|jwt|token|session|password|oauth|login|logout|credential|bearer)\b/i,
|
|
5
|
+
database: /\b(migrat(?:ion|e)|alter\s+table|schema\s+change|postgres|mysql|sqlite|prisma|drizzle|knex|sequelize)\b/i,
|
|
6
|
+
crypto: /\b(encrypt|decrypt|cipher|hash(?:ing)?|hmac|sign(?:ing)?|verify|private\s+key|certificate|tls|ssl)\b/i,
|
|
7
|
+
payments: /\b(payment|stripe|charge|billing|invoice|subscription|price|checkout|refund)\b/i,
|
|
8
|
+
permissions: /\b(permission|role(?:s)?|acl|access\s+control|rbac|authorization|entitlement)\b/i,
|
|
9
|
+
pii: /\b(pii|personal\s+data|gdpr|ccpa|email(?:\s+address)?|phone(?:\s+number)?|postal\s+address|ssn|passport)\b/i,
|
|
10
|
+
data_deletion: /\b(delete(?:\s+all)?|drop\s+table|truncate|purge|wipe|destroy.*data|hard\s+delete)\b/i,
|
|
11
|
+
secrets: /\b(api\s+key|secret(?:s)?|env(?:ironment)?\s+var(?:iable)?|\.env|private\s+key|credentials?)\b/i,
|
|
12
|
+
};
|
|
13
|
+
const ROLLBACK_PATTERNS = /\b(rollback|roll\s+back|revert|undo|restore|recovery|fallback|backward[- ]compat)\b/i;
|
|
14
|
+
const TEST_PATTERNS = /\b(test(?:ing|s)?|spec(?:ification)?|unit\s+test|integration\s+test|coverage|vitest|jest|mocha)\b/i;
|
|
15
|
+
/**
|
|
16
|
+
* Static preflight analysis — no LLM required.
|
|
17
|
+
*
|
|
18
|
+
* Runs deterministic checks on the outcome + design text and the evidence pack
|
|
19
|
+
* before any LLM call. Results are injected into the Jury prompt so the LLM
|
|
20
|
+
* reasons over concrete signals rather than discovering them itself.
|
|
21
|
+
*/
|
|
22
|
+
export function runPreflight(outcome, design, evidence) {
|
|
23
|
+
const text = `${outcome} ${design}`;
|
|
24
|
+
const sensitive_areas = Object.entries(SENSITIVE_PATTERNS)
|
|
25
|
+
.filter(([, pattern]) => pattern.test(text))
|
|
26
|
+
.map(([area]) => area);
|
|
27
|
+
// Refuted entries whose primary text shares at least one significant word with the design
|
|
28
|
+
const designWords = new Set(text
|
|
29
|
+
.toLowerCase()
|
|
30
|
+
.split(/\W+/)
|
|
31
|
+
.filter(w => w.length > 4));
|
|
32
|
+
const chronicle_conflicts = evidence
|
|
33
|
+
.filter(e => {
|
|
34
|
+
if (e.status !== "refuted")
|
|
35
|
+
return false;
|
|
36
|
+
const entryWords = entryText(e)
|
|
37
|
+
.toLowerCase()
|
|
38
|
+
.split(/\W+/)
|
|
39
|
+
.filter(w => w.length > 4);
|
|
40
|
+
return entryWords.some(w => designWords.has(w));
|
|
41
|
+
})
|
|
42
|
+
.map(e => e.id);
|
|
43
|
+
return {
|
|
44
|
+
touches_sensitive_area: sensitive_areas.length > 0,
|
|
45
|
+
sensitive_areas,
|
|
46
|
+
rollback_mentioned: ROLLBACK_PATTERNS.test(text),
|
|
47
|
+
test_strategy_mentioned: TEST_PATTERNS.test(text),
|
|
48
|
+
chronicle_conflicts,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/** Format preflight result for injection into the Jury prompt. */
|
|
52
|
+
export function formatPreflight(preflight) {
|
|
53
|
+
const lines = ["## Deterministic Preflight (machine-checked, not LLM-inferred)"];
|
|
54
|
+
if (preflight.touches_sensitive_area) {
|
|
55
|
+
lines.push(`⚠ Sensitive areas detected: ${preflight.sensitive_areas.join(", ")}`);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
lines.push("✓ No sensitive areas detected");
|
|
59
|
+
}
|
|
60
|
+
lines.push(preflight.rollback_mentioned ? "✓ Rollback strategy mentioned" : "✗ No rollback strategy mentioned");
|
|
61
|
+
lines.push(preflight.test_strategy_mentioned ? "✓ Test strategy mentioned" : "✗ No test strategy mentioned");
|
|
62
|
+
if (preflight.chronicle_conflicts.length > 0) {
|
|
63
|
+
lines.push(`⚠ Refuted Chronicle entries potentially conflicting: ${preflight.chronicle_conflicts.join(", ")}`);
|
|
64
|
+
lines.push(" These entries were previously tried and failed — verify the design addresses the documented failure reason.");
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
lines.push("✓ No conflicting refuted Chronicle entries");
|
|
68
|
+
}
|
|
69
|
+
return lines.join("\n");
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=preflight.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../modules/jury/preflight.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Zod schema for the Jury's structured LLM output.
|
|
4
|
+
* evaluate() validates all LLM responses against this before returning.
|
|
5
|
+
*/
|
|
6
|
+
export declare const JuryOutputSchema: z.ZodObject<{
|
|
7
|
+
confidence: z.ZodNumber;
|
|
8
|
+
confidence_breakdown: z.ZodObject<{
|
|
9
|
+
evidence_support: z.ZodNumber;
|
|
10
|
+
feasibility: z.ZodNumber;
|
|
11
|
+
risk: z.ZodNumber;
|
|
12
|
+
completeness: z.ZodNumber;
|
|
13
|
+
}, "strip", z.ZodTypeAny, {
|
|
14
|
+
evidence_support: number;
|
|
15
|
+
feasibility: number;
|
|
16
|
+
risk: number;
|
|
17
|
+
completeness: number;
|
|
18
|
+
}, {
|
|
19
|
+
evidence_support: number;
|
|
20
|
+
feasibility: number;
|
|
21
|
+
risk: number;
|
|
22
|
+
completeness: number;
|
|
23
|
+
}>;
|
|
24
|
+
assessment: z.ZodString;
|
|
25
|
+
gaps: z.ZodArray<z.ZodString, "many">;
|
|
26
|
+
blocking_gaps: z.ZodArray<z.ZodString, "many">;
|
|
27
|
+
council_brief: z.ZodEnum<["challenge", "pressure-test"]>;
|
|
28
|
+
recommendation: z.ZodEnum<["proceed", "investigate-more", "redesign"]>;
|
|
29
|
+
}, "strip", z.ZodTypeAny, {
|
|
30
|
+
confidence: number;
|
|
31
|
+
confidence_breakdown: {
|
|
32
|
+
evidence_support: number;
|
|
33
|
+
feasibility: number;
|
|
34
|
+
risk: number;
|
|
35
|
+
completeness: number;
|
|
36
|
+
};
|
|
37
|
+
assessment: string;
|
|
38
|
+
gaps: string[];
|
|
39
|
+
blocking_gaps: string[];
|
|
40
|
+
council_brief: "challenge" | "pressure-test";
|
|
41
|
+
recommendation: "proceed" | "investigate-more" | "redesign";
|
|
42
|
+
}, {
|
|
43
|
+
confidence: number;
|
|
44
|
+
confidence_breakdown: {
|
|
45
|
+
evidence_support: number;
|
|
46
|
+
feasibility: number;
|
|
47
|
+
risk: number;
|
|
48
|
+
completeness: number;
|
|
49
|
+
};
|
|
50
|
+
assessment: string;
|
|
51
|
+
gaps: string[];
|
|
52
|
+
blocking_gaps: string[];
|
|
53
|
+
council_brief: "challenge" | "pressure-test";
|
|
54
|
+
recommendation: "proceed" | "investigate-more" | "redesign";
|
|
55
|
+
}>;
|
|
56
|
+
export type JuryOutputParsed = z.infer<typeof JuryOutputSchema>;
|
|
57
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../modules/jury/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AASvB;;;GAGG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQ3B,CAAA;AAEF,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const ConfidenceBreakdownSchema = z.object({
|
|
3
|
+
evidence_support: z.number().min(0).max(1),
|
|
4
|
+
feasibility: z.number().min(0).max(1),
|
|
5
|
+
risk: z.number().min(0).max(1),
|
|
6
|
+
completeness: z.number().min(0).max(1),
|
|
7
|
+
});
|
|
8
|
+
/**
|
|
9
|
+
* Zod schema for the Jury's structured LLM output.
|
|
10
|
+
* evaluate() validates all LLM responses against this before returning.
|
|
11
|
+
*/
|
|
12
|
+
export const JuryOutputSchema = z.object({
|
|
13
|
+
confidence: z.number().min(0).max(1),
|
|
14
|
+
confidence_breakdown: ConfidenceBreakdownSchema,
|
|
15
|
+
assessment: z.string().min(1),
|
|
16
|
+
gaps: z.array(z.string()),
|
|
17
|
+
blocking_gaps: z.array(z.string()),
|
|
18
|
+
council_brief: z.enum(["challenge", "pressure-test"]),
|
|
19
|
+
recommendation: z.enum(["proceed", "investigate-more", "redesign"]),
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../modules/jury/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;CACvC,CAAC,CAAA;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,oBAAoB,EAAE,yBAAyB;IAC/C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACzB,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IACrD,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,kBAAkB,EAAE,UAAU,CAAC,CAAC;CACpE,CAAC,CAAA"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { OracleResult, LLMProvider } from "../shared/types.js";
|
|
2
|
+
export interface JuryInput {
|
|
3
|
+
/** What needs to be achieved. */
|
|
4
|
+
outcome: string;
|
|
5
|
+
/** Proposed approach from the Designer. */
|
|
6
|
+
design: string;
|
|
7
|
+
/** Evidence retrieved from Oracle. */
|
|
8
|
+
evidence: OracleResult[];
|
|
9
|
+
}
|
|
10
|
+
/** Per-dimension breakdown of the 0–1 confidence score. */
|
|
11
|
+
export interface ConfidenceBreakdown {
|
|
12
|
+
/** Do validated Oracle entries confirm this approach works here? */
|
|
13
|
+
evidence_support: number;
|
|
14
|
+
/** Do Oracle entries suggest this is achievable in this codebase? */
|
|
15
|
+
feasibility: number;
|
|
16
|
+
/** How well does the design address known failure modes? (1 = fully addressed) */
|
|
17
|
+
risk: number;
|
|
18
|
+
/** Does the design cover the full outcome, or only part of it? */
|
|
19
|
+
completeness: number;
|
|
20
|
+
}
|
|
21
|
+
export interface JuryOutput {
|
|
22
|
+
/** 0–1 confidence score. Average of the four breakdown dimensions. */
|
|
23
|
+
confidence: number;
|
|
24
|
+
/** Per-dimension breakdown of the confidence score. */
|
|
25
|
+
confidence_breakdown: ConfidenceBreakdown;
|
|
26
|
+
/** What the evidence supports or contradicts. */
|
|
27
|
+
assessment: string;
|
|
28
|
+
/** Evidence missing from Oracle that would improve confidence. */
|
|
29
|
+
gaps: string[];
|
|
30
|
+
/**
|
|
31
|
+
* Gaps that are hard blockers — must be resolved before Council should proceed.
|
|
32
|
+
* Subset of gaps where the missing information is critical (auth, rollback, data safety).
|
|
33
|
+
*/
|
|
34
|
+
blocking_gaps: string[];
|
|
35
|
+
/**
|
|
36
|
+
* Council brief derived from confidence:
|
|
37
|
+
* < 0.6 → "challenge" (find what is wrong — broader scope)
|
|
38
|
+
* ≥ 0.6 → "pressure-test" (assume correct, try to break it)
|
|
39
|
+
*/
|
|
40
|
+
council_brief: "challenge" | "pressure-test";
|
|
41
|
+
recommendation: "proceed" | "investigate-more" | "redesign";
|
|
42
|
+
}
|
|
43
|
+
export interface JuryDeps {
|
|
44
|
+
llm: LLMProvider;
|
|
45
|
+
model?: string;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../modules/jury/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAEnE,MAAM,WAAW,SAAS;IACxB,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,2CAA2C;IAC3C,MAAM,EAAE,MAAM,CAAA;IACd,sCAAsC;IACtC,QAAQ,EAAE,YAAY,EAAE,CAAA;CACzB;AAED,2DAA2D;AAC3D,MAAM,WAAW,mBAAmB;IAClC,oEAAoE;IACpE,gBAAgB,EAAE,MAAM,CAAA;IACxB,qEAAqE;IACrE,WAAW,EAAE,MAAM,CAAA;IACnB,kFAAkF;IAClF,IAAI,EAAE,MAAM,CAAA;IACZ,kEAAkE;IAClE,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAA;IAClB,uDAAuD;IACvD,oBAAoB,EAAE,mBAAmB,CAAA;IACzC,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAA;IAClB,kEAAkE;IAClE,IAAI,EAAE,MAAM,EAAE,CAAA;IACd;;;OAGG;IACH,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB;;;;OAIG;IACH,aAAa,EAAE,WAAW,GAAG,eAAe,CAAA;IAC5C,cAAc,EAAE,SAAS,GAAG,kBAAkB,GAAG,UAAU,CAAA;CAC5D;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,WAAW,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../modules/jury/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LanceDB vector store adapter.
|
|
3
|
+
*
|
|
4
|
+
* Required package: npm install vectordb
|
|
5
|
+
*
|
|
6
|
+
* Chronicle entries are stored in .chronicle/entries/ (LanceDB table directory).
|
|
7
|
+
* Vectors are indexed with cosine metric — no need to pre-normalise embeddings.
|
|
8
|
+
*
|
|
9
|
+
* Note: this adapter targets the `vectordb` package (LanceDB v0.x).
|
|
10
|
+
* If your project uses `@lancedb/lancedb` (v0.4+), the connect/createTable API
|
|
11
|
+
* is nearly identical but table.query() replaces table.search() for non-vector queries.
|
|
12
|
+
*/
|
|
13
|
+
import type { VectorStore } from "../types.js";
|
|
14
|
+
export declare function createLanceDBStore(chronicleDir: string): Promise<VectorStore>;
|
|
15
|
+
//# sourceMappingURL=lance-db.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lance-db.d.ts","sourceRoot":"","sources":["../../../modules/oracle/adapters/lance-db.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAe9C,wBAAsB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA+CnF"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LanceDB vector store adapter.
|
|
3
|
+
*
|
|
4
|
+
* Required package: npm install vectordb
|
|
5
|
+
*
|
|
6
|
+
* Chronicle entries are stored in .chronicle/entries/ (LanceDB table directory).
|
|
7
|
+
* Vectors are indexed with cosine metric — no need to pre-normalise embeddings.
|
|
8
|
+
*
|
|
9
|
+
* Note: this adapter targets the `vectordb` package (LanceDB v0.x).
|
|
10
|
+
* If your project uses `@lancedb/lancedb` (v0.4+), the connect/createTable API
|
|
11
|
+
* is nearly identical but table.query() replaces table.search() for non-vector queries.
|
|
12
|
+
*/
|
|
13
|
+
import path from "path";
|
|
14
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
15
|
+
const lancedb = require("vectordb");
|
|
16
|
+
export async function createLanceDBStore(chronicleDir) {
|
|
17
|
+
const tableDir = path.join(chronicleDir, "entries");
|
|
18
|
+
const db = await lancedb.connect(tableDir);
|
|
19
|
+
let table = null;
|
|
20
|
+
async function getOrCreateTable(firstRow) {
|
|
21
|
+
if (table)
|
|
22
|
+
return table;
|
|
23
|
+
const names = await db.tableNames();
|
|
24
|
+
if (names.includes("entries")) {
|
|
25
|
+
table = await db.openTable("entries");
|
|
26
|
+
}
|
|
27
|
+
else if (firstRow) {
|
|
28
|
+
table = await db.createTable("entries", [firstRow], { metric: "cosine" });
|
|
29
|
+
}
|
|
30
|
+
return table;
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
async upsert(id, vector, metadata) {
|
|
34
|
+
const row = { id, vector, payload: JSON.stringify(metadata) };
|
|
35
|
+
const t = await getOrCreateTable(row);
|
|
36
|
+
if (t !== table) {
|
|
37
|
+
// table was just created with this row — already inserted
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
// LanceDB does not have native upsert — delete existing then insert
|
|
41
|
+
await t.delete(`id = '${sanitiseId(id)}'`);
|
|
42
|
+
await t.add([row]);
|
|
43
|
+
},
|
|
44
|
+
async search(vector, limit) {
|
|
45
|
+
const t = await getOrCreateTable();
|
|
46
|
+
if (!t)
|
|
47
|
+
return [];
|
|
48
|
+
const rows = await t.search(vector).limit(limit).execute();
|
|
49
|
+
return rows.map(row => ({
|
|
50
|
+
entry: JSON.parse(row.payload),
|
|
51
|
+
// Convert L2 distance (cosine metric stores 1 - cosine_sim as distance)
|
|
52
|
+
score: row._distance !== undefined ? 1 - row._distance : 0,
|
|
53
|
+
}));
|
|
54
|
+
},
|
|
55
|
+
async getAll() {
|
|
56
|
+
const t = await getOrCreateTable();
|
|
57
|
+
if (!t)
|
|
58
|
+
return [];
|
|
59
|
+
const rows = await t.query().execute();
|
|
60
|
+
return rows.map(row => JSON.parse(row.payload));
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/** Prevent SQL injection in the delete filter. LanceDB uses SQL-like WHERE clauses. */
|
|
65
|
+
function sanitiseId(id) {
|
|
66
|
+
return id.replace(/'/g, "''");
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=lance-db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lance-db.js","sourceRoot":"","sources":["../../../modules/oracle/adapters/lance-db.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local ONNX embedder using @xenova/transformers (all-MiniLM-L6-v2).
|
|
3
|
+
*
|
|
4
|
+
* Required package: npm install @xenova/transformers
|
|
5
|
+
*
|
|
6
|
+
* Runs entirely locally — no API key, no network dependency after first use.
|
|
7
|
+
* First call downloads and caches the model (~25 MB).
|
|
8
|
+
* Produces 384-dimensional unit vectors (mean pooling + L2 normalisation).
|
|
9
|
+
*
|
|
10
|
+
* For production use, pre-warm the embedder on startup:
|
|
11
|
+
* import { warmEmbedder } from "./adapters/xenova-embedder.js"
|
|
12
|
+
* await warmEmbedder()
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Embed text using all-MiniLM-L6-v2.
|
|
16
|
+
* Returns a 384-dimensional unit vector.
|
|
17
|
+
*/
|
|
18
|
+
export declare function xenovaEmbed(text: string): Promise<number[]>;
|
|
19
|
+
/** Pre-warm the model so the first real query is not slow. */
|
|
20
|
+
export declare function warmEmbedder(): Promise<void>;
|
|
21
|
+
//# sourceMappingURL=xenova-embedder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xenova-embedder.d.ts","sourceRoot":"","sources":["../../../modules/oracle/adapters/xenova-embedder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAiBH;;;GAGG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAIjE;AAED,8DAA8D;AAC9D,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAElD"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local ONNX embedder using @xenova/transformers (all-MiniLM-L6-v2).
|
|
3
|
+
*
|
|
4
|
+
* Required package: npm install @xenova/transformers
|
|
5
|
+
*
|
|
6
|
+
* Runs entirely locally — no API key, no network dependency after first use.
|
|
7
|
+
* First call downloads and caches the model (~25 MB).
|
|
8
|
+
* Produces 384-dimensional unit vectors (mean pooling + L2 normalisation).
|
|
9
|
+
*
|
|
10
|
+
* For production use, pre-warm the embedder on startup:
|
|
11
|
+
* import { warmEmbedder } from "./adapters/xenova-embedder.js"
|
|
12
|
+
* await warmEmbedder()
|
|
13
|
+
*/
|
|
14
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
15
|
+
const { pipeline } = require("@xenova/transformers");
|
|
16
|
+
let embedderPipeline = null;
|
|
17
|
+
async function getPipeline() {
|
|
18
|
+
if (!embedderPipeline) {
|
|
19
|
+
embedderPipeline = await pipeline("feature-extraction", "Xenova/all-MiniLM-L6-v2");
|
|
20
|
+
}
|
|
21
|
+
return embedderPipeline;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Embed text using all-MiniLM-L6-v2.
|
|
25
|
+
* Returns a 384-dimensional unit vector.
|
|
26
|
+
*/
|
|
27
|
+
export async function xenovaEmbed(text) {
|
|
28
|
+
const embedder = await getPipeline();
|
|
29
|
+
const output = await embedder(text, { pooling: "mean", normalize: true });
|
|
30
|
+
return Array.from(output.data);
|
|
31
|
+
}
|
|
32
|
+
/** Pre-warm the model so the first real query is not slow. */
|
|
33
|
+
export async function warmEmbedder() {
|
|
34
|
+
await getPipeline();
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=xenova-embedder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xenova-embedder.js","sourceRoot":"","sources":["../../../modules/oracle/adapters/xenova-embedder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,iEAAiE;AACjE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAA;AAEpD,IAAI,gBAAgB,GAAQ,IAAI,CAAA;AAEhC,KAAK,UAAU,WAAW;IACxB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,gBAAgB,GAAG,MAAM,QAAQ,CAC/B,oBAAoB,EACpB,yBAAyB,CAC1B,CAAA;IACH,CAAC;IACD,OAAO,gBAAgB,CAAA;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY;IAC5C,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAA;IACpC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACzE,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAa,CAAA;AAC5C,CAAC;AAED,8DAA8D;AAC9D,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,WAAW,EAAE,CAAA;AACrB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight BM25 implementation for Pass 2 re-ranking.
|
|
3
|
+
*
|
|
4
|
+
* k1 = 1.5 (term frequency saturation)
|
|
5
|
+
* b = 0.75 (length normalization)
|
|
6
|
+
*
|
|
7
|
+
* Formula: score(q, d) = Σ IDF(qi) * f(qi, d) * (k1 + 1) / (f(qi, d) + k1 * (1 − b + b * |d| / avgdl))
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Score each document string against the query using BM25.
|
|
11
|
+
* Returns a score array parallel to `documents`.
|
|
12
|
+
*/
|
|
13
|
+
export declare function bm25Score(query: string, documents: string[]): number[];
|
|
14
|
+
/**
|
|
15
|
+
* Extract domain terms from Chronicle key insights for Pass 2 query enrichment.
|
|
16
|
+
* Bridges the vocabulary gap between natural language queries and technical identifiers.
|
|
17
|
+
* Strips stop words, returns the most frequent distinctive tokens.
|
|
18
|
+
*/
|
|
19
|
+
export declare function extractDomainTerms(insights: string[]): string[];
|
|
20
|
+
//# sourceMappingURL=bm25.d.ts.map
|