ghagga-core 2.0.1 → 2.2.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 (81) hide show
  1. package/README.md +3 -1
  2. package/dist/agents/consensus.d.ts +2 -1
  3. package/dist/agents/consensus.d.ts.map +1 -1
  4. package/dist/agents/consensus.js +4 -2
  5. package/dist/agents/consensus.js.map +1 -1
  6. package/dist/agents/prompts.d.ts +10 -1
  7. package/dist/agents/prompts.d.ts.map +1 -1
  8. package/dist/agents/prompts.js +24 -2
  9. package/dist/agents/prompts.js.map +1 -1
  10. package/dist/agents/simple.d.ts +2 -1
  11. package/dist/agents/simple.d.ts.map +1 -1
  12. package/dist/agents/simple.js +4 -2
  13. package/dist/agents/simple.js.map +1 -1
  14. package/dist/agents/workflow.d.ts +2 -1
  15. package/dist/agents/workflow.d.ts.map +1 -1
  16. package/dist/agents/workflow.js +12 -3
  17. package/dist/agents/workflow.js.map +1 -1
  18. package/dist/format.d.ts +11 -0
  19. package/dist/format.d.ts.map +1 -0
  20. package/dist/format.js +84 -0
  21. package/dist/format.js.map +1 -0
  22. package/dist/index.d.ts +5 -2
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +4 -0
  25. package/dist/index.js.map +1 -1
  26. package/dist/memory/engram-client.d.ts +38 -0
  27. package/dist/memory/engram-client.d.ts.map +1 -0
  28. package/dist/memory/engram-client.js +153 -0
  29. package/dist/memory/engram-client.js.map +1 -0
  30. package/dist/memory/engram-mapping.d.ts +83 -0
  31. package/dist/memory/engram-mapping.d.ts.map +1 -0
  32. package/dist/memory/engram-mapping.js +159 -0
  33. package/dist/memory/engram-mapping.js.map +1 -0
  34. package/dist/memory/engram-types.d.ts +51 -0
  35. package/dist/memory/engram-types.d.ts.map +1 -0
  36. package/dist/memory/engram-types.js +12 -0
  37. package/dist/memory/engram-types.js.map +1 -0
  38. package/dist/memory/engram.d.ts +76 -0
  39. package/dist/memory/engram.d.ts.map +1 -0
  40. package/dist/memory/engram.js +194 -0
  41. package/dist/memory/engram.js.map +1 -0
  42. package/dist/memory/persist.d.ts +5 -5
  43. package/dist/memory/persist.d.ts.map +1 -1
  44. package/dist/memory/persist.js +23 -24
  45. package/dist/memory/persist.js.map +1 -1
  46. package/dist/memory/search.d.ts +6 -5
  47. package/dist/memory/search.d.ts.map +1 -1
  48. package/dist/memory/search.js +7 -8
  49. package/dist/memory/search.js.map +1 -1
  50. package/dist/memory/sqlite.d.ts +49 -0
  51. package/dist/memory/sqlite.d.ts.map +1 -0
  52. package/dist/memory/sqlite.js +349 -0
  53. package/dist/memory/sqlite.js.map +1 -0
  54. package/dist/pipeline.d.ts.map +1 -1
  55. package/dist/pipeline.js +167 -58
  56. package/dist/pipeline.js.map +1 -1
  57. package/dist/providers/index.d.ts +4 -0
  58. package/dist/providers/index.d.ts.map +1 -1
  59. package/dist/providers/index.js +12 -0
  60. package/dist/providers/index.js.map +1 -1
  61. package/dist/tools/cpd.d.ts.map +1 -1
  62. package/dist/tools/cpd.js +20 -9
  63. package/dist/tools/cpd.js.map +1 -1
  64. package/dist/tools/runner.d.ts +5 -2
  65. package/dist/tools/runner.d.ts.map +1 -1
  66. package/dist/tools/runner.js +37 -18
  67. package/dist/tools/runner.js.map +1 -1
  68. package/dist/tools/semgrep.d.ts.map +1 -1
  69. package/dist/tools/semgrep.js +21 -4
  70. package/dist/tools/semgrep.js.map +1 -1
  71. package/dist/tools/trivy.d.ts.map +1 -1
  72. package/dist/tools/trivy.js +6 -2
  73. package/dist/tools/trivy.js.map +1 -1
  74. package/dist/types.d.ts +133 -11
  75. package/dist/types.d.ts.map +1 -1
  76. package/dist/types.js +2 -1
  77. package/dist/types.js.map +1 -1
  78. package/dist/utils/token-budget.d.ts.map +1 -1
  79. package/dist/utils/token-budget.js +5 -0
  80. package/dist/utils/token-budget.js.map +1 -1
  81. package/package.json +4 -3
@@ -0,0 +1,194 @@
1
+ /**
2
+ * Engram-backed memory storage.
3
+ *
4
+ * Implements the MemoryStorage interface by mapping each method to HTTP
5
+ * calls against Engram's REST API (localhost:7437). Uses native fetch()
6
+ * with no external dependencies.
7
+ *
8
+ * Graceful degradation: the async factory performs a health check. If
9
+ * Engram is unreachable it returns null so the caller can fall back to
10
+ * SQLite. During operation, individual method calls catch HTTP errors
11
+ * and return safe defaults — the review never fails because of Engram.
12
+ */
13
+ import { EngramClient } from './engram-client.js';
14
+ import { toMemoryObservationRow, toMemoryObservationDetail, toEngramSaveData, } from './engram-mapping.js';
15
+ export class EngramMemoryStorage {
16
+ client;
17
+ /**
18
+ * Maps GHAGGA numeric IDs → Engram original IDs (string | number).
19
+ * Populated by searchObservations(), listObservations(), and saveObservation().
20
+ * Used by getObservation() and deleteObservation() to resolve the real Engram ID.
21
+ */
22
+ idMap = new Map();
23
+ nextId = 1;
24
+ constructor(client) {
25
+ this.client = client;
26
+ }
27
+ // ─── Factory ────────────────────────────────────────────────────
28
+ /**
29
+ * Async factory — creates an instance after verifying Engram is reachable.
30
+ *
31
+ * Config resolution order:
32
+ * 1. Explicit `config` parameter
33
+ * 2. Environment variables (GHAGGA_ENGRAM_HOST, GHAGGA_ENGRAM_TIMEOUT)
34
+ * 3. Defaults (http://localhost:7437, 5000ms)
35
+ *
36
+ * Returns null if Engram is not reachable (caller should fall back to SQLite).
37
+ */
38
+ static async create(config) {
39
+ const fullConfig = {
40
+ host: config?.host ?? process.env.GHAGGA_ENGRAM_HOST ?? 'http://localhost:7437',
41
+ timeout: config?.timeout ?? Number(process.env.GHAGGA_ENGRAM_TIMEOUT ?? '5') * 1000,
42
+ };
43
+ const client = new EngramClient(fullConfig);
44
+ const healthy = await client.healthCheck();
45
+ if (!healthy) {
46
+ console.warn('[ghagga:engram] Engram server not reachable at %s — falling back to SQLite', fullConfig.host);
47
+ return null;
48
+ }
49
+ return new EngramMemoryStorage(client);
50
+ }
51
+ // ─── Hot-path methods ───────────────────────────────────────────
52
+ async searchObservations(project, query, options = {}) {
53
+ const { limit = 10, type } = options;
54
+ const results = await this.client.search(query, project, limit);
55
+ let mapped = results.map((obs) => {
56
+ const row = toMemoryObservationRow(obs);
57
+ this.trackId(row.id, obs.id);
58
+ return row;
59
+ });
60
+ // Client-side type filter (Engram may not support it natively)
61
+ if (type) {
62
+ mapped = mapped.filter((r) => r.type === type);
63
+ }
64
+ return mapped;
65
+ }
66
+ async saveObservation(data) {
67
+ const payload = toEngramSaveData(data);
68
+ const result = await this.client.save(payload);
69
+ if (!result) {
70
+ // Graceful degradation: return a synthetic row so the pipeline continues
71
+ console.warn('[ghagga:engram] saveObservation: Engram save failed, returning synthetic row');
72
+ return {
73
+ id: -1,
74
+ type: data.type,
75
+ title: data.title,
76
+ content: data.content,
77
+ filePaths: data.filePaths ?? null,
78
+ severity: data.severity ?? null,
79
+ };
80
+ }
81
+ const row = toMemoryObservationRow(result);
82
+ this.trackId(row.id, result.id);
83
+ return row;
84
+ }
85
+ // ─── Session methods ────────────────────────────────────────────
86
+ async createSession(data) {
87
+ const sessionId = await this.client.createSession(data.project);
88
+ if (sessionId == null) {
89
+ console.warn('[ghagga:engram] createSession failed, returning synthetic id');
90
+ return { id: -1 };
91
+ }
92
+ return { id: sessionId };
93
+ }
94
+ async endSession(sessionId, summary) {
95
+ // Skip if session was never properly created
96
+ if (sessionId === -1)
97
+ return;
98
+ await this.client.endSession(sessionId, summary);
99
+ }
100
+ /** No-op — HTTP connections don't need explicit cleanup. */
101
+ async close() {
102
+ // Nothing to clean up for HTTP-based storage
103
+ }
104
+ // ─── Management methods ─────────────────────────────────────────
105
+ async listObservations(options = {}) {
106
+ const { project, type, limit = 20 } = options;
107
+ // Use search with empty query to list all observations
108
+ const results = await this.client.search('', project, limit);
109
+ let mapped = results.map((obs) => {
110
+ const detail = toMemoryObservationDetail(obs);
111
+ this.trackId(detail.id, obs.id);
112
+ return detail;
113
+ });
114
+ // Client-side type filter
115
+ if (type) {
116
+ mapped = mapped.filter((r) => r.type === type);
117
+ }
118
+ // Client-side offset (Engram may not support it natively)
119
+ if (options.offset && options.offset > 0) {
120
+ mapped = mapped.slice(options.offset);
121
+ }
122
+ return mapped;
123
+ }
124
+ async getObservation(id) {
125
+ const realId = this.idMap.get(id);
126
+ if (realId == null) {
127
+ console.warn('[ghagga:engram] getObservation: ID %d not found in local map. ' +
128
+ 'Run searchObservations or listObservations first.', id);
129
+ return null;
130
+ }
131
+ const obs = await this.client.getObservation(realId);
132
+ if (!obs)
133
+ return null;
134
+ return toMemoryObservationDetail(obs);
135
+ }
136
+ async deleteObservation(id) {
137
+ const realId = this.idMap.get(id);
138
+ if (realId == null) {
139
+ console.warn('[ghagga:engram] deleteObservation: ID %d not found in local map.', id);
140
+ return false;
141
+ }
142
+ const deleted = await this.client.deleteObservation(realId);
143
+ if (deleted) {
144
+ this.idMap.delete(id);
145
+ }
146
+ return deleted;
147
+ }
148
+ async getStats() {
149
+ const stats = await this.client.getStats();
150
+ if (!stats) {
151
+ return {
152
+ totalObservations: 0,
153
+ byType: {},
154
+ byProject: {},
155
+ oldestObservation: null,
156
+ newestObservation: null,
157
+ };
158
+ }
159
+ // Map Engram stats to GHAGGA's MemoryStats shape
160
+ const byProject = {};
161
+ if (stats.projects) {
162
+ for (const p of stats.projects) {
163
+ byProject[p] = 0; // Engram doesn't provide per-project counts in stats
164
+ }
165
+ }
166
+ return {
167
+ totalObservations: stats.total_observations,
168
+ byType: {}, // Engram stats endpoint doesn't break down by type
169
+ byProject,
170
+ oldestObservation: null, // Not provided by Engram stats
171
+ newestObservation: null, // Not provided by Engram stats
172
+ };
173
+ }
174
+ /**
175
+ * Not supported by the Engram HTTP API.
176
+ * Use the `engram` CLI directly for bulk operations.
177
+ */
178
+ async clearObservations(_options) {
179
+ console.warn('[ghagga:engram] clearObservations is not supported with the Engram backend. ' +
180
+ 'Use the "engram" CLI directly for bulk deletion.');
181
+ return 0;
182
+ }
183
+ // ─── Internal helpers ───────────────────────────────────────────
184
+ /**
185
+ * Track the mapping between a GHAGGA numeric ID and the original Engram ID.
186
+ * This allows getObservation() and deleteObservation() to resolve the real ID.
187
+ */
188
+ trackId(numericId, engramId) {
189
+ if (!this.idMap.has(numericId)) {
190
+ this.idMap.set(numericId, engramId);
191
+ }
192
+ }
193
+ }
194
+ //# sourceMappingURL=engram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engram.js","sourceRoot":"","sources":["../../src/memory/engram.ts"],"names":[],"mappings":"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"}
@@ -5,18 +5,18 @@
5
5
  * and saves them as memory observations so future reviews of
6
6
  * the same project can benefit from past context.
7
7
  */
8
- import type { ReviewResult } from '../types.js';
8
+ import type { MemoryStorage, ReviewResult } from '../types.js';
9
9
  /**
10
10
  * Persist notable review findings as memory observations.
11
11
  *
12
12
  * Creates a memory session for the review, extracts significant
13
- * findings, strips private data, and saves them via ghagga-db.
14
- * Gracefully handles database errors without propagating them.
13
+ * findings, strips private data, and saves them via MemoryStorage.
14
+ * Gracefully handles storage errors without propagating them.
15
15
  *
16
- * @param db - Database instance (typed as unknown for loose coupling)
16
+ * @param storage - Memory storage backend (SQLite or PostgreSQL)
17
17
  * @param project - Project identifier (e.g., "owner/repo")
18
18
  * @param prNumber - Pull request number
19
19
  * @param result - The completed review result
20
20
  */
21
- export declare function persistReviewObservations(db: unknown, project: string, prNumber: number, result: ReviewResult): Promise<void>;
21
+ export declare function persistReviewObservations(storage: MemoryStorage, project: string, prNumber: number, result: ReviewResult): Promise<void>;
22
22
  //# sourceMappingURL=persist.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"persist.d.ts","sourceRoot":"","sources":["../../src/memory/persist.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAkC,MAAM,aAAa,CAAC;AAoChF;;;;;;;;;;;GAWG;AACH,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,OAAO,EACX,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,IAAI,CAAC,CA+Df"}
1
+ {"version":3,"file":"persist.d.ts","sourceRoot":"","sources":["../../src/memory/persist.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAkC,MAAM,aAAa,CAAC;AAoC/F;;;;;;;;;;;GAWG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,IAAI,CAAC,CA4Df"}
@@ -5,7 +5,6 @@
5
5
  * and saves them as memory observations so future reviews of
6
6
  * the same project can benefit from past context.
7
7
  */
8
- import { saveObservation, createMemorySession, endMemorySession } from 'ghagga-db';
9
8
  import { stripPrivateData } from './privacy.js';
10
9
  // ─── Helpers ────────────────────────────────────────────────────
11
10
  /**
@@ -34,30 +33,31 @@ function findingToObservationType(finding) {
34
33
  * We only save high and critical findings to avoid noise.
35
34
  */
36
35
  function isSignificantFinding(finding) {
37
- return finding.severity === 'critical' || finding.severity === 'high';
36
+ return finding.severity === 'critical' || finding.severity === 'high' || finding.severity === 'medium';
38
37
  }
39
38
  // ─── Main Function ──────────────────────────────────────────────
40
39
  /**
41
40
  * Persist notable review findings as memory observations.
42
41
  *
43
42
  * Creates a memory session for the review, extracts significant
44
- * findings, strips private data, and saves them via ghagga-db.
45
- * Gracefully handles database errors without propagating them.
43
+ * findings, strips private data, and saves them via MemoryStorage.
44
+ * Gracefully handles storage errors without propagating them.
46
45
  *
47
- * @param db - Database instance (typed as unknown for loose coupling)
46
+ * @param storage - Memory storage backend (SQLite or PostgreSQL)
48
47
  * @param project - Project identifier (e.g., "owner/repo")
49
48
  * @param prNumber - Pull request number
50
49
  * @param result - The completed review result
51
50
  */
52
- export async function persistReviewObservations(db, project, prNumber, result) {
51
+ export async function persistReviewObservations(storage, project, prNumber, result) {
53
52
  try {
54
- if (!db)
53
+ if (!storage)
55
54
  return;
56
- const typedDb = db;
57
- // Create a memory session for this review
58
- const session = await createMemorySession(typedDb, { project, prNumber });
59
- // Extract significant findings as observations
55
+ // Extract significant findings first — skip session if nothing to persist
60
56
  const significantFindings = result.findings.filter(isSignificantFinding);
57
+ if (significantFindings.length === 0)
58
+ return;
59
+ // Create a memory session for this review
60
+ const session = await storage.createSession({ project, prNumber });
61
61
  for (const finding of significantFindings) {
62
62
  const sanitizedMessage = stripPrivateData(finding.message);
63
63
  const sanitizedSuggestion = finding.suggestion
@@ -71,29 +71,28 @@ export async function persistReviewObservations(db, project, prNumber, result) {
71
71
  ]
72
72
  .filter(Boolean)
73
73
  .join('\n');
74
- await saveObservation(typedDb, {
74
+ await storage.saveObservation({
75
75
  sessionId: session.id,
76
76
  project,
77
77
  type: findingToObservationType(finding),
78
78
  title: `${finding.category}: ${sanitizedMessage.slice(0, 80)}`,
79
79
  content,
80
80
  filePaths: [finding.file],
81
+ severity: finding.severity,
81
82
  });
82
83
  }
83
84
  // Save a summary observation for the overall review
84
- if (significantFindings.length > 0) {
85
- await saveObservation(typedDb, {
86
- sessionId: session.id,
87
- project,
88
- type: 'decision',
89
- title: `PR #${prNumber} review: ${result.status}`,
90
- content: stripPrivateData(result.summary),
91
- topicKey: `pr-${prNumber}-review`,
92
- filePaths: significantFindings.map((f) => f.file),
93
- });
94
- }
85
+ await storage.saveObservation({
86
+ sessionId: session.id,
87
+ project,
88
+ type: 'decision',
89
+ title: `PR #${prNumber} review: ${result.status}`,
90
+ content: stripPrivateData(result.summary),
91
+ topicKey: `pr-${prNumber}-review`,
92
+ filePaths: significantFindings.map((f) => f.file),
93
+ });
95
94
  // End the session with a summary
96
- await endMemorySession(typedDb, session.id, `Review of PR #${prNumber}: ${result.status} with ${significantFindings.length} significant findings.`);
95
+ await storage.endSession(session.id, `Review of PR #${prNumber}: ${result.status} with ${significantFindings.length} significant findings.`);
97
96
  }
98
97
  catch (error) {
99
98
  // Memory persistence is optional — never let it break the pipeline
@@ -1 +1 @@
1
- {"version":3,"file":"persist.js","sourceRoot":"","sources":["../../src/memory/persist.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"persist.js","sourceRoot":"","sources":["../../src/memory/persist.ts"],"names":[],"mappings":"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"}
@@ -2,19 +2,20 @@
2
2
  * Memory search — retrieves relevant past observations for prompt injection.
3
3
  *
4
4
  * Builds a search query from the file paths in the current diff,
5
- * then uses PostgreSQL full-text search (via ghagga-db) to find
6
- * observations from past reviews of the same project.
5
+ * then uses the MemoryStorage interface to find observations from
6
+ * past reviews of the same project.
7
7
  */
8
+ import type { MemoryStorage } from '../types.js';
8
9
  /**
9
10
  * Search past review observations for context relevant to the current diff.
10
11
  *
11
12
  * Returns a formatted string suitable for injection into agent prompts,
12
- * or null if no relevant observations are found (or if db is unavailable).
13
+ * or null if no relevant observations are found (or if storage is unavailable).
13
14
  *
14
- * @param db - Database instance (from ghagga-db). Typed as unknown for loose coupling.
15
+ * @param storage - Memory storage backend (SQLite or PostgreSQL)
15
16
  * @param project - Project identifier (e.g., "owner/repo")
16
17
  * @param fileList - List of file paths in the current diff
17
18
  * @returns Formatted memory context string, or null
18
19
  */
19
- export declare function searchMemoryForContext(db: unknown, project: string, fileList: string[]): Promise<string | null>;
20
+ export declare function searchMemoryForContext(storage: MemoryStorage, project: string, fileList: string[]): Promise<string | null>;
20
21
  //# sourceMappingURL=search.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/memory/search.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAqDH;;;;;;;;;;GAUG;AACH,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,OAAO,EACX,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiCxB"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/memory/search.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAwCjD;;;;;;;;;;GAUG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgCxB"}
@@ -2,10 +2,9 @@
2
2
  * Memory search — retrieves relevant past observations for prompt injection.
3
3
  *
4
4
  * Builds a search query from the file paths in the current diff,
5
- * then uses PostgreSQL full-text search (via ghagga-db) to find
6
- * observations from past reviews of the same project.
5
+ * then uses the MemoryStorage interface to find observations from
6
+ * past reviews of the same project.
7
7
  */
8
- import { searchObservations } from 'ghagga-db';
9
8
  import { formatMemoryContext } from './context.js';
10
9
  // ─── Helpers ────────────────────────────────────────────────────
11
10
  /**
@@ -42,22 +41,22 @@ function buildSearchQuery(fileList) {
42
41
  * Search past review observations for context relevant to the current diff.
43
42
  *
44
43
  * Returns a formatted string suitable for injection into agent prompts,
45
- * or null if no relevant observations are found (or if db is unavailable).
44
+ * or null if no relevant observations are found (or if storage is unavailable).
46
45
  *
47
- * @param db - Database instance (from ghagga-db). Typed as unknown for loose coupling.
46
+ * @param storage - Memory storage backend (SQLite or PostgreSQL)
48
47
  * @param project - Project identifier (e.g., "owner/repo")
49
48
  * @param fileList - List of file paths in the current diff
50
49
  * @returns Formatted memory context string, or null
51
50
  */
52
- export async function searchMemoryForContext(db, project, fileList) {
51
+ export async function searchMemoryForContext(storage, project, fileList) {
53
52
  try {
54
- if (!db)
53
+ if (!storage)
55
54
  return null;
56
55
  const query = buildSearchQuery(fileList);
57
56
  if (!query)
58
57
  return null;
59
58
  // Search with a reasonable limit — we don't want to flood the prompt
60
- const observations = await searchObservations(db, project, query, { limit: 8 });
59
+ const observations = await storage.searchObservations(project, query, { limit: 3 });
61
60
  if (!observations || observations.length === 0)
62
61
  return null;
63
62
  // Format observations for prompt injection
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/memory/search.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAYnD,mEAAmE;AAEnE;;;;;;;;;GASG;AACH,SAAS,gBAAgB,CAAC,QAAkB;IAC1C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;QAChC,2BAA2B;QAC3B,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAErD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,wCAAwC;YACxC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvF,SAAS;YACX,CAAC;YAED,iDAAiD;YACjD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAC7C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED,mEAAmE;AAEnE;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,EAAW,EACX,OAAe,EACf,QAAkB;IAElB,IAAI,CAAC;QACH,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAErB,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,qEAAqE;QACrE,MAAM,YAAY,GAAG,MAAM,kBAAkB,CAC3C,EAA8C,EAC9C,OAAO,EACP,KAAK,EACL,EAAE,KAAK,EAAE,CAAC,EAAE,CACb,CAAC;QAEF,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAE5D,2CAA2C;QAC3C,OAAO,mBAAmB,CACxB,YAAY,CAAC,GAAG,CAAC,CAAC,GAAgB,EAAE,EAAE,CAAC,CAAC;YACtC,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC,CAAC,CACJ,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,8DAA8D;QAC9D,OAAO,CAAC,IAAI,CACV,uDAAuD,EACvD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/memory/search.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGnD,mEAAmE;AAEnE;;;;;;;;;GASG;AACH,SAAS,gBAAgB,CAAC,QAAkB;IAC1C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;QAChC,2BAA2B;QAC3B,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAErD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,wCAAwC;YACxC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvF,SAAS;YACX,CAAC;YAED,iDAAiD;YACjD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAC7C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED,mEAAmE;AAEnE;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAAsB,EACtB,OAAe,EACf,QAAkB;IAElB,IAAI,CAAC;QACH,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAE1B,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,qEAAqE;QACrE,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,kBAAkB,CACnD,OAAO,EACP,KAAK,EACL,EAAE,KAAK,EAAE,CAAC,EAAE,CACb,CAAC;QAEF,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAE5D,2CAA2C;QAC3C,OAAO,mBAAmB,CACxB,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACzB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC,CAAC,CACJ,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,8DAA8D;QAC9D,OAAO,CAAC,IAAI,CACV,uDAAuD,EACvD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * SQLite-backed memory storage using sql.js (pure WASM).
3
+ *
4
+ * Thread safety: This class is NOT thread-safe. It operates as an in-memory
5
+ * database with manual file persistence via close(). Designed for single-process
6
+ * environments (CLI, GitHub Action).
7
+ */
8
+ import type { MemoryStorage, MemoryObservationRow, MemoryObservationDetail, MemoryStats, ListObservationsOptions } from '../types.js';
9
+ export declare class SqliteMemoryStorage implements MemoryStorage {
10
+ private db;
11
+ private filePath;
12
+ private constructor();
13
+ /**
14
+ * Async factory — handles WASM initialization and file loading.
15
+ * If filePath exists, loads the existing DB. Otherwise, creates a fresh one.
16
+ */
17
+ static create(filePath: string): Promise<SqliteMemoryStorage>;
18
+ searchObservations(project: string, query: string, options?: {
19
+ limit?: number;
20
+ type?: string;
21
+ }): Promise<MemoryObservationRow[]>;
22
+ saveObservation(data: {
23
+ sessionId?: number;
24
+ project: string;
25
+ type: string;
26
+ title: string;
27
+ content: string;
28
+ topicKey?: string;
29
+ filePaths?: string[];
30
+ severity?: string;
31
+ }): Promise<MemoryObservationRow>;
32
+ createSession(data: {
33
+ project: string;
34
+ prNumber?: number;
35
+ }): Promise<{
36
+ id: number;
37
+ }>;
38
+ endSession(sessionId: number, summary: string): Promise<void>;
39
+ private mapToDetail;
40
+ listObservations(options?: ListObservationsOptions): Promise<MemoryObservationDetail[]>;
41
+ getObservation(id: number): Promise<MemoryObservationDetail | null>;
42
+ deleteObservation(id: number): Promise<boolean>;
43
+ getStats(): Promise<MemoryStats>;
44
+ clearObservations(options?: {
45
+ project?: string;
46
+ }): Promise<number>;
47
+ close(): Promise<void>;
48
+ }
49
+ //# sourceMappingURL=sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/memory/sqlite.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AA+DtI,qBAAa,mBAAoB,YAAW,aAAa;IAErD,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,QAAQ;IAFlB,OAAO;IAKP;;;OAGG;WACU,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAuB7D,kBAAkB,CACtB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAO,GAC9C,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAkD5B,eAAe,CAAC,IAAI,EAAE;QAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA0G3B,aAAa,CAAC,IAAI,EAAE;QACxB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAUrB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUnE,OAAO,CAAC,WAAW;IAgBb,gBAAgB,CAAC,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAmC3F,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC;IAmBnE,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK/C,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC;IAmChC,iBAAiB,CAAC,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAStE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAU7B"}