context-eng 0.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.
Files changed (60) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +272 -0
  3. package/dist/categories.d.ts +27 -0
  4. package/dist/categories.js +71 -0
  5. package/dist/categories.js.map +1 -0
  6. package/dist/cli-entry.d.ts +2 -0
  7. package/dist/cli-entry.js +7 -0
  8. package/dist/cli-entry.js.map +1 -0
  9. package/dist/cli.d.ts +30 -0
  10. package/dist/cli.js +327 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/db.d.ts +40 -0
  13. package/dist/db.js +158 -0
  14. package/dist/db.js.map +1 -0
  15. package/dist/engine.d.ts +149 -0
  16. package/dist/engine.js +589 -0
  17. package/dist/engine.js.map +1 -0
  18. package/dist/harness.d.ts +56 -0
  19. package/dist/harness.js +358 -0
  20. package/dist/harness.js.map +1 -0
  21. package/dist/index.d.ts +4 -0
  22. package/dist/index.js +3 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/inspect-cli.d.ts +2 -0
  25. package/dist/inspect-cli.js +96 -0
  26. package/dist/inspect-cli.js.map +1 -0
  27. package/dist/inspect.d.ts +33 -0
  28. package/dist/inspect.js +149 -0
  29. package/dist/inspect.js.map +1 -0
  30. package/dist/map.d.ts +39 -0
  31. package/dist/map.js +106 -0
  32. package/dist/map.js.map +1 -0
  33. package/dist/mcp.d.ts +5 -0
  34. package/dist/mcp.js +348 -0
  35. package/dist/mcp.js.map +1 -0
  36. package/dist/migrate.d.ts +7 -0
  37. package/dist/migrate.js +107 -0
  38. package/dist/migrate.js.map +1 -0
  39. package/dist/paths.d.ts +29 -0
  40. package/dist/paths.js +69 -0
  41. package/dist/paths.js.map +1 -0
  42. package/dist/search.d.ts +144 -0
  43. package/dist/search.js +449 -0
  44. package/dist/search.js.map +1 -0
  45. package/dist/secrets.d.ts +28 -0
  46. package/dist/secrets.js +135 -0
  47. package/dist/secrets.js.map +1 -0
  48. package/dist/text.d.ts +22 -0
  49. package/dist/text.js +153 -0
  50. package/dist/text.js.map +1 -0
  51. package/dist/tokens.d.ts +6 -0
  52. package/dist/tokens.js +15 -0
  53. package/dist/tokens.js.map +1 -0
  54. package/dist/typesafe.d.ts +40 -0
  55. package/dist/typesafe.js +170 -0
  56. package/dist/typesafe.js.map +1 -0
  57. package/package.json +51 -0
  58. package/system_prompts/AGENTS.md +14 -0
  59. package/system_prompts/CLAUDE.md +14 -0
  60. package/system_prompts/rules.md +157 -0
@@ -0,0 +1,149 @@
1
+ import { applyRelevanceGate, MAX_JEV_EVALUATE_COUNT, RELEVANCE_THRESHOLD, TypeSafeError, TypeSafeRelevanceEvaluator, } from "./typesafe.js";
2
+ export async function runSearchInspection(engine, input, options = {}) {
3
+ const inspection = inspectionReport(input, engine.prepareSearchDebug(input));
4
+ if (!options.evaluateJev)
5
+ return withJevStatus(inspection, "not_requested");
6
+ const evaluator = options.evaluator ?? new TypeSafeRelevanceEvaluator();
7
+ if (evaluator.available?.() === false) {
8
+ return {
9
+ ...withJevStatus(inspection, "unavailable"),
10
+ local_fallback: engine.search(input),
11
+ };
12
+ }
13
+ let evaluatedScores = [];
14
+ const scoreById = new Map();
15
+ const recordingEvaluator = {
16
+ evaluate: async (query, candidates) => {
17
+ evaluatedScores = await evaluator.evaluate(query, candidates);
18
+ scoreById.clear();
19
+ for (const [index, hit] of candidates.entries()) {
20
+ const score = evaluatedScores[index];
21
+ if (score !== undefined)
22
+ scoreById.set(hit.id, score);
23
+ }
24
+ return evaluatedScores;
25
+ },
26
+ };
27
+ try {
28
+ const relevance = await applyRelevanceGate(inspection.result, recordingEvaluator);
29
+ const keptIds = new Set(relevance.hits.map((hit) => hit.id));
30
+ const decisions = inspection.candidates.map((candidate) => {
31
+ const score = scoreById.get(candidate.hit.id);
32
+ if (score === undefined) {
33
+ return { position: candidate.position, id: candidate.hit.id, decision: "not_evaluated" };
34
+ }
35
+ const rounded = round(score);
36
+ const decision = score <= RELEVANCE_THRESHOLD
37
+ ? "rejected"
38
+ : keptIds.has(candidate.hit.id)
39
+ ? "kept"
40
+ : "budgeted_out";
41
+ return { position: candidate.position, id: candidate.hit.id, score: rounded, decision };
42
+ });
43
+ return {
44
+ ...inspection,
45
+ relevance,
46
+ jev: {
47
+ status: "evaluated",
48
+ evaluated_count: evaluatedScores.length,
49
+ decisions,
50
+ kept_ids: relevance.hits.map((hit) => hit.id),
51
+ },
52
+ };
53
+ }
54
+ catch (error) {
55
+ if (!(error instanceof TypeSafeError))
56
+ throw error;
57
+ return {
58
+ ...withJevStatus(inspection, "failed", error instanceof Error ? error.message : String(error)),
59
+ local_fallback: engine.search(input),
60
+ };
61
+ }
62
+ }
63
+ export function renderSearchInspection(report) {
64
+ const lines = [
65
+ "SEARCH INSPECTION",
66
+ `query: ${report.input.query}`,
67
+ `retrieval: ${report.result.retrieval.mode}`,
68
+ `eligible: ${report.result.eligible_count}`,
69
+ `eligible tokens: ${report.result.retrieval.eligible_tokens}`,
70
+ `candidates: ${report.result.retrieval.candidate_count}`,
71
+ `channels: ${report.result.retrieval.channels.join("+") || "none"}`,
72
+ ];
73
+ if (report.corrected_query)
74
+ lines.push(`corrected query: ${report.corrected_query}`);
75
+ lines.push("", `ELIGIBLE MEMORIES (${report.eligible.length})`);
76
+ for (const [index, hit] of report.eligible.entries()) {
77
+ lines.push(`[${index + 1}] ${hit.id} · ${hit.scope}/${hit.category} · importance ${hit.importance}`, `state: ${hit.staging ? "staging" : "promoted"} · tokens ${hit.tokens}`, `content: ${hit.content}`, "");
78
+ }
79
+ lines.push(`CANDIDATE CONTEXT SENT TO JEV (${Math.min(report.candidates.length, MAX_JEV_EVALUATE_COUNT)})`);
80
+ for (const candidate of report.candidates) {
81
+ const sent = candidate.position <= MAX_JEV_EVALUATE_COUNT;
82
+ lines.push(`[${candidate.position}] ${candidate.hit.id} · ${sent ? "sent" : "past Jev cap"} · ${candidate.channels.join("+")}`, `why candidate: ${candidateReasons(candidate).join("; ")}`, `context: ${candidate.hit.content}`, "");
83
+ }
84
+ lines.push(`JEV: ${report.jev.status} · evaluated ${report.jev.evaluated_count}`);
85
+ if (report.jev.error)
86
+ lines.push(`error: ${report.jev.error}`);
87
+ if (report.relevance) {
88
+ lines.push(`production rejected: ${report.relevance.rejected_count}`);
89
+ lines.push(`production tokens: ${report.relevance.total_tokens}`);
90
+ if (report.relevance.message)
91
+ lines.push(`production message: ${report.relevance.message}`);
92
+ }
93
+ for (const decision of report.jev.decisions) {
94
+ const score = decision.score === undefined ? "n/a" : decision.score.toFixed(3);
95
+ lines.push(`[${decision.position}] ${decision.id} · ${decision.decision} · score ${score}`);
96
+ }
97
+ if (report.jev.kept_ids.length > 0)
98
+ lines.push(`kept IDs: ${report.jev.kept_ids.join(", ")}`);
99
+ if (report.local_fallback) {
100
+ lines.push(`local fallback IDs: ${report.local_fallback.hits.map((hit) => hit.id).join(", ") || "none"}`);
101
+ }
102
+ return `${lines.join("\n").trimEnd()}\n`;
103
+ }
104
+ function withJevStatus(inspection, status, error) {
105
+ return {
106
+ ...inspection,
107
+ jev: {
108
+ status,
109
+ evaluated_count: 0,
110
+ decisions: inspection.candidates.map((candidate) => ({
111
+ position: candidate.position,
112
+ id: candidate.hit.id,
113
+ decision: "not_evaluated",
114
+ })),
115
+ kept_ids: [],
116
+ ...(error !== undefined ? { error } : {}),
117
+ },
118
+ };
119
+ }
120
+ function inspectionReport(input, snapshot) {
121
+ return {
122
+ input,
123
+ result: snapshot.result,
124
+ eligible: snapshot.eligible,
125
+ candidates: snapshot.candidates.map((candidate, index) => ({ ...candidate, position: index + 1 })),
126
+ ...(snapshot.correctedQuery !== undefined ? { corrected_query: snapshot.correctedQuery } : {}),
127
+ };
128
+ }
129
+ function candidateReasons(candidate) {
130
+ const reasons = [];
131
+ if (candidate.channels.includes("all"))
132
+ reasons.push("small mode sends every eligible memory to Jev");
133
+ if (candidate.channels.includes("fts"))
134
+ reasons.push("FTS5 matched the lexical query");
135
+ if (candidate.matchedLabels.length > 0) {
136
+ reasons.push(`exact hint labels matched: ${candidate.matchedLabels.join(", ")}`);
137
+ }
138
+ if (candidate.channels.includes("typo"))
139
+ reasons.push("matched the one-pass corrected typo query");
140
+ if (candidate.channels.includes("fill"))
141
+ reasons.push("filled an unused large-mode Jev slot by priority");
142
+ if (candidate.categoryHintBoosted)
143
+ reasons.push(`category hint boosted ${candidate.hit.category} before Jev`);
144
+ return reasons;
145
+ }
146
+ function round(value) {
147
+ return Math.round(value * 1000) / 1000;
148
+ }
149
+ //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../src/inspect.ts"],"names":[],"mappings":"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"}
package/dist/map.d.ts ADDED
@@ -0,0 +1,39 @@
1
+ import { type Category, type Scope } from "./categories.js";
2
+ import type { Db } from "./db.js";
3
+ export interface CategoryDbSource {
4
+ category: string;
5
+ db: Db;
6
+ }
7
+ export interface MapCollection {
8
+ name: string;
9
+ category: Category;
10
+ count: number;
11
+ staging_count: number;
12
+ keywords: string[];
13
+ lines: string[];
14
+ lines_ids: string[];
15
+ }
16
+ export interface MapStaging {
17
+ count: number;
18
+ keywords: string[];
19
+ lines: string[];
20
+ lines_ids: string[];
21
+ lines_categories: string[];
22
+ searched: false;
23
+ }
24
+ export interface MapIndex {
25
+ scope: Scope;
26
+ projectKey?: string;
27
+ projectPath?: string;
28
+ generatedAt: string;
29
+ collections: MapCollection[];
30
+ staging: MapStaging;
31
+ counts: Record<string, number>;
32
+ top_keywords: string[];
33
+ }
34
+ export declare function buildIndex(sources: readonly CategoryDbSource[], scope: Scope, meta?: {
35
+ projectKey?: string;
36
+ projectPath?: string;
37
+ }): MapIndex;
38
+ export declare function renderMarkdown(index: MapIndex): string;
39
+ export declare function writeMapFiles(index: MapIndex, mdFile: string, jsonFile: string): void;
package/dist/map.js ADDED
@@ -0,0 +1,106 @@
1
+ import { mkdirSync, renameSync, writeFileSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { STAGING } from "./categories.js";
4
+ import { keywords, parseLabels } from "./text.js";
5
+ const KEYWORDS_PER_COLLECTION = 8;
6
+ const TOP_KEYWORDS = 12;
7
+ const LINES_PER_COLLECTION = 12;
8
+ function topKeywords(rows, limit) {
9
+ const freq = new Map();
10
+ for (const row of rows) {
11
+ for (const value of [row.subject, row.topics, row.tags, row.links]) {
12
+ for (const label of parseLabels(value))
13
+ freq.set(label, (freq.get(label) ?? 0) + 3);
14
+ }
15
+ for (const word of keywords(row.content))
16
+ freq.set(word, (freq.get(word) ?? 0) + 1);
17
+ }
18
+ return [...freq.entries()]
19
+ .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))
20
+ .slice(0, limit)
21
+ .map(([word]) => word);
22
+ }
23
+ export function buildIndex(sources, scope, meta = {}) {
24
+ const rowsByCategory = new Map();
25
+ for (const source of sources) {
26
+ const rows = source.db
27
+ .prepare(`SELECT id, category, content, subject, topics, tags, links,
28
+ CASE WHEN chat_id = ? THEN 1 ELSE 0 END AS staged, created_at
29
+ FROM memories WHERE active = 1 ORDER BY created_at DESC`)
30
+ .all(STAGING);
31
+ rowsByCategory.set(source.category, rows);
32
+ }
33
+ const allRows = [...rowsByCategory.values()].flat();
34
+ const promoted = allRows.filter((row) => row.staged === 0);
35
+ const staged = allRows.filter((row) => row.staged === 1);
36
+ const collections = [];
37
+ const counts = {};
38
+ for (const source of [...sources].sort((a, b) => a.category.localeCompare(b.category))) {
39
+ const rows = rowsByCategory.get(source.category) ?? [];
40
+ const visible = rows.filter((row) => row.staged === 0);
41
+ const lineRows = visible.slice(0, LINES_PER_COLLECTION);
42
+ const stagingCount = rows.length - visible.length;
43
+ counts[source.category] = visible.length;
44
+ collections.push({
45
+ name: source.category,
46
+ category: source.category,
47
+ count: visible.length,
48
+ staging_count: stagingCount,
49
+ keywords: topKeywords(visible, KEYWORDS_PER_COLLECTION),
50
+ lines: lineRows.map((row) => row.content),
51
+ lines_ids: lineRows.map((row) => row.id),
52
+ });
53
+ }
54
+ counts[STAGING] = staged.length;
55
+ const stagingLineRows = [...staged]
56
+ .sort((left, right) => right.created_at - left.created_at || left.id.localeCompare(right.id))
57
+ .slice(0, LINES_PER_COLLECTION);
58
+ const index = {
59
+ scope,
60
+ generatedAt: new Date().toISOString(),
61
+ collections,
62
+ staging: {
63
+ count: staged.length,
64
+ keywords: topKeywords(staged, KEYWORDS_PER_COLLECTION),
65
+ lines: stagingLineRows.map((row) => row.content),
66
+ lines_ids: stagingLineRows.map((row) => row.id),
67
+ lines_categories: stagingLineRows.map((row) => row.category),
68
+ searched: false,
69
+ },
70
+ counts,
71
+ top_keywords: topKeywords(promoted, TOP_KEYWORDS),
72
+ };
73
+ if (meta.projectKey)
74
+ index.projectKey = meta.projectKey;
75
+ if (meta.projectPath)
76
+ index.projectPath = meta.projectPath;
77
+ return index;
78
+ }
79
+ export function renderMarkdown(index) {
80
+ const lines = [`- ${index.scope}`];
81
+ if (index.collections.length === 0)
82
+ lines.push(" - (empty)");
83
+ for (const collection of index.collections) {
84
+ const staged = collection.staging_count > 0 ? `, ${collection.staging_count} staging` : "";
85
+ lines.push(` - ${collection.name} (${collection.count}${staged})`);
86
+ for (const line of collection.lines)
87
+ lines.push(` - ${line}`);
88
+ }
89
+ if (index.staging.count > 0) {
90
+ lines.push(` - staging (${index.staging.count}) — not searched`);
91
+ for (const line of index.staging.lines)
92
+ lines.push(` - ${line}`);
93
+ }
94
+ return lines.join("\n") + "\n";
95
+ }
96
+ function writeAtomic(file, data) {
97
+ mkdirSync(path.dirname(file), { recursive: true });
98
+ const tmp = `${file}.${process.pid}.tmp`;
99
+ writeFileSync(tmp, data, "utf8");
100
+ renameSync(tmp, file);
101
+ }
102
+ export function writeMapFiles(index, mdFile, jsonFile) {
103
+ writeAtomic(mdFile, renderMarkdown(index));
104
+ writeAtomic(jsonFile, JSON.stringify(index, null, 2) + "\n");
105
+ }
106
+ //# sourceMappingURL=map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map.js","sourceRoot":"","sources":["../src/map.ts"],"names":[],"mappings":"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"}
package/dist/mcp.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { type Engine } from "./engine.js";
3
+ import { type RelevanceEvaluator } from "./typesafe.js";
4
+ export declare function createServer(engine: Engine, relevanceEvaluator?: RelevanceEvaluator): McpServer;
5
+ export declare function runStdio(engine: Engine, relevanceEvaluator?: RelevanceEvaluator): Promise<void>;