context-mem 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 (208) hide show
  1. package/.context-mem.json.example +22 -0
  2. package/LICENSE +21 -0
  3. package/README.md +213 -0
  4. package/dist/cli/commands/dashboard.d.ts +2 -0
  5. package/dist/cli/commands/dashboard.d.ts.map +1 -0
  6. package/dist/cli/commands/dashboard.js +55 -0
  7. package/dist/cli/commands/dashboard.js.map +1 -0
  8. package/dist/cli/commands/doctor.d.ts +2 -0
  9. package/dist/cli/commands/doctor.d.ts.map +1 -0
  10. package/dist/cli/commands/doctor.js +49 -0
  11. package/dist/cli/commands/doctor.js.map +1 -0
  12. package/dist/cli/commands/init.d.ts +2 -0
  13. package/dist/cli/commands/init.d.ts.map +1 -0
  14. package/dist/cli/commands/init.js +43 -0
  15. package/dist/cli/commands/init.js.map +1 -0
  16. package/dist/cli/commands/serve.d.ts +2 -0
  17. package/dist/cli/commands/serve.d.ts.map +1 -0
  18. package/dist/cli/commands/serve.js +47 -0
  19. package/dist/cli/commands/serve.js.map +1 -0
  20. package/dist/cli/commands/status.d.ts +2 -0
  21. package/dist/cli/commands/status.d.ts.map +1 -0
  22. package/dist/cli/commands/status.js +29 -0
  23. package/dist/cli/commands/status.js.map +1 -0
  24. package/dist/cli/index.d.ts +3 -0
  25. package/dist/cli/index.d.ts.map +1 -0
  26. package/dist/cli/index.js +39 -0
  27. package/dist/cli/index.js.map +1 -0
  28. package/dist/core/budget.d.ts +11 -0
  29. package/dist/core/budget.d.ts.map +1 -0
  30. package/dist/core/budget.js +60 -0
  31. package/dist/core/budget.js.map +1 -0
  32. package/dist/core/config.d.ts +4 -0
  33. package/dist/core/config.d.ts.map +1 -0
  34. package/dist/core/config.js +41 -0
  35. package/dist/core/config.js.map +1 -0
  36. package/dist/core/events.d.ts +19 -0
  37. package/dist/core/events.d.ts.map +1 -0
  38. package/dist/core/events.js +101 -0
  39. package/dist/core/events.js.map +1 -0
  40. package/dist/core/kernel.d.ts +46 -0
  41. package/dist/core/kernel.d.ts.map +1 -0
  42. package/dist/core/kernel.js +228 -0
  43. package/dist/core/kernel.js.map +1 -0
  44. package/dist/core/lifecycle.d.ts +19 -0
  45. package/dist/core/lifecycle.d.ts.map +1 -0
  46. package/dist/core/lifecycle.js +35 -0
  47. package/dist/core/lifecycle.js.map +1 -0
  48. package/dist/core/observe-queue.d.ts +18 -0
  49. package/dist/core/observe-queue.d.ts.map +1 -0
  50. package/dist/core/observe-queue.js +56 -0
  51. package/dist/core/observe-queue.js.map +1 -0
  52. package/dist/core/pipeline.d.ts +15 -0
  53. package/dist/core/pipeline.d.ts.map +1 -0
  54. package/dist/core/pipeline.js +114 -0
  55. package/dist/core/pipeline.js.map +1 -0
  56. package/dist/core/plugin-registry.d.ts +13 -0
  57. package/dist/core/plugin-registry.d.ts.map +1 -0
  58. package/dist/core/plugin-registry.js +67 -0
  59. package/dist/core/plugin-registry.js.map +1 -0
  60. package/dist/core/session.d.ts +14 -0
  61. package/dist/core/session.d.ts.map +1 -0
  62. package/dist/core/session.js +95 -0
  63. package/dist/core/session.js.map +1 -0
  64. package/dist/core/truncation.d.ts +11 -0
  65. package/dist/core/truncation.d.ts.map +1 -0
  66. package/dist/core/truncation.js +143 -0
  67. package/dist/core/truncation.js.map +1 -0
  68. package/dist/core/types.d.ts +230 -0
  69. package/dist/core/types.d.ts.map +1 -0
  70. package/dist/core/types.js +50 -0
  71. package/dist/core/types.js.map +1 -0
  72. package/dist/core/utils.d.ts +4 -0
  73. package/dist/core/utils.d.ts.map +1 -0
  74. package/dist/core/utils.js +57 -0
  75. package/dist/core/utils.js.map +1 -0
  76. package/dist/index.d.ts +12 -0
  77. package/dist/index.d.ts.map +1 -0
  78. package/dist/index.js +27 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/mcp-server/server.d.ts +5 -0
  81. package/dist/mcp-server/server.d.ts.map +1 -0
  82. package/dist/mcp-server/server.js +101 -0
  83. package/dist/mcp-server/server.js.map +1 -0
  84. package/dist/mcp-server/tools.d.ts +201 -0
  85. package/dist/mcp-server/tools.d.ts.map +1 -0
  86. package/dist/mcp-server/tools.js +618 -0
  87. package/dist/mcp-server/tools.js.map +1 -0
  88. package/dist/plugins/knowledge/knowledge-base.d.ts +23 -0
  89. package/dist/plugins/knowledge/knowledge-base.d.ts.map +1 -0
  90. package/dist/plugins/knowledge/knowledge-base.js +165 -0
  91. package/dist/plugins/knowledge/knowledge-base.js.map +1 -0
  92. package/dist/plugins/platforms/claude-code.d.ts +14 -0
  93. package/dist/plugins/platforms/claude-code.d.ts.map +1 -0
  94. package/dist/plugins/platforms/claude-code.js +52 -0
  95. package/dist/plugins/platforms/claude-code.js.map +1 -0
  96. package/dist/plugins/privacy/privacy-engine.d.ts +18 -0
  97. package/dist/plugins/privacy/privacy-engine.d.ts.map +1 -0
  98. package/dist/plugins/privacy/privacy-engine.js +72 -0
  99. package/dist/plugins/privacy/privacy-engine.js.map +1 -0
  100. package/dist/plugins/runtimes/javascript.d.ts +13 -0
  101. package/dist/plugins/runtimes/javascript.d.ts.map +1 -0
  102. package/dist/plugins/runtimes/javascript.js +102 -0
  103. package/dist/plugins/runtimes/javascript.js.map +1 -0
  104. package/dist/plugins/runtimes/python.d.ts +14 -0
  105. package/dist/plugins/runtimes/python.d.ts.map +1 -0
  106. package/dist/plugins/runtimes/python.js +127 -0
  107. package/dist/plugins/runtimes/python.js.map +1 -0
  108. package/dist/plugins/runtimes/shell.d.ts +13 -0
  109. package/dist/plugins/runtimes/shell.d.ts.map +1 -0
  110. package/dist/plugins/runtimes/shell.js +55 -0
  111. package/dist/plugins/runtimes/shell.js.map +1 -0
  112. package/dist/plugins/search/bm25.d.ts +16 -0
  113. package/dist/plugins/search/bm25.d.ts.map +1 -0
  114. package/dist/plugins/search/bm25.js +61 -0
  115. package/dist/plugins/search/bm25.js.map +1 -0
  116. package/dist/plugins/search/fts5-utils.d.ts +2 -0
  117. package/dist/plugins/search/fts5-utils.d.ts.map +1 -0
  118. package/dist/plugins/search/fts5-utils.js +12 -0
  119. package/dist/plugins/search/fts5-utils.js.map +1 -0
  120. package/dist/plugins/search/fusion.d.ts +9 -0
  121. package/dist/plugins/search/fusion.d.ts.map +1 -0
  122. package/dist/plugins/search/fusion.js +45 -0
  123. package/dist/plugins/search/fusion.js.map +1 -0
  124. package/dist/plugins/search/intent.d.ts +5 -0
  125. package/dist/plugins/search/intent.d.ts.map +1 -0
  126. package/dist/plugins/search/intent.js +49 -0
  127. package/dist/plugins/search/intent.js.map +1 -0
  128. package/dist/plugins/search/levenshtein.d.ts +17 -0
  129. package/dist/plugins/search/levenshtein.d.ts.map +1 -0
  130. package/dist/plugins/search/levenshtein.js +99 -0
  131. package/dist/plugins/search/levenshtein.js.map +1 -0
  132. package/dist/plugins/search/trigram.d.ts +16 -0
  133. package/dist/plugins/search/trigram.d.ts.map +1 -0
  134. package/dist/plugins/search/trigram.js +63 -0
  135. package/dist/plugins/search/trigram.js.map +1 -0
  136. package/dist/plugins/storage/better-sqlite3.d.ts +19 -0
  137. package/dist/plugins/storage/better-sqlite3.d.ts.map +1 -0
  138. package/dist/plugins/storage/better-sqlite3.js +82 -0
  139. package/dist/plugins/storage/better-sqlite3.js.map +1 -0
  140. package/dist/plugins/storage/content-store.d.ts +20 -0
  141. package/dist/plugins/storage/content-store.d.ts.map +1 -0
  142. package/dist/plugins/storage/content-store.js +187 -0
  143. package/dist/plugins/storage/content-store.js.map +1 -0
  144. package/dist/plugins/storage/migrations.d.ts +8 -0
  145. package/dist/plugins/storage/migrations.d.ts.map +1 -0
  146. package/dist/plugins/storage/migrations.js +252 -0
  147. package/dist/plugins/storage/migrations.js.map +1 -0
  148. package/dist/plugins/summarizers/binary-summarizer.d.ts +12 -0
  149. package/dist/plugins/summarizers/binary-summarizer.d.ts.map +1 -0
  150. package/dist/plugins/summarizers/binary-summarizer.js +43 -0
  151. package/dist/plugins/summarizers/binary-summarizer.js.map +1 -0
  152. package/dist/plugins/summarizers/build-output-summarizer.d.ts +12 -0
  153. package/dist/plugins/summarizers/build-output-summarizer.d.ts.map +1 -0
  154. package/dist/plugins/summarizers/build-output-summarizer.js +68 -0
  155. package/dist/plugins/summarizers/build-output-summarizer.js.map +1 -0
  156. package/dist/plugins/summarizers/code-summarizer.d.ts +12 -0
  157. package/dist/plugins/summarizers/code-summarizer.d.ts.map +1 -0
  158. package/dist/plugins/summarizers/code-summarizer.js +179 -0
  159. package/dist/plugins/summarizers/code-summarizer.js.map +1 -0
  160. package/dist/plugins/summarizers/csv-summarizer.d.ts +12 -0
  161. package/dist/plugins/summarizers/csv-summarizer.d.ts.map +1 -0
  162. package/dist/plugins/summarizers/csv-summarizer.js +60 -0
  163. package/dist/plugins/summarizers/csv-summarizer.js.map +1 -0
  164. package/dist/plugins/summarizers/error-summarizer.d.ts +15 -0
  165. package/dist/plugins/summarizers/error-summarizer.d.ts.map +1 -0
  166. package/dist/plugins/summarizers/error-summarizer.js +111 -0
  167. package/dist/plugins/summarizers/error-summarizer.js.map +1 -0
  168. package/dist/plugins/summarizers/git-log-summarizer.d.ts +12 -0
  169. package/dist/plugins/summarizers/git-log-summarizer.d.ts.map +1 -0
  170. package/dist/plugins/summarizers/git-log-summarizer.js +76 -0
  171. package/dist/plugins/summarizers/git-log-summarizer.js.map +1 -0
  172. package/dist/plugins/summarizers/html-summarizer.d.ts +12 -0
  173. package/dist/plugins/summarizers/html-summarizer.d.ts.map +1 -0
  174. package/dist/plugins/summarizers/html-summarizer.js +69 -0
  175. package/dist/plugins/summarizers/html-summarizer.js.map +1 -0
  176. package/dist/plugins/summarizers/json-summarizer.d.ts +12 -0
  177. package/dist/plugins/summarizers/json-summarizer.d.ts.map +1 -0
  178. package/dist/plugins/summarizers/json-summarizer.js +132 -0
  179. package/dist/plugins/summarizers/json-summarizer.js.map +1 -0
  180. package/dist/plugins/summarizers/log-summarizer.d.ts +12 -0
  181. package/dist/plugins/summarizers/log-summarizer.d.ts.map +1 -0
  182. package/dist/plugins/summarizers/log-summarizer.js +173 -0
  183. package/dist/plugins/summarizers/log-summarizer.js.map +1 -0
  184. package/dist/plugins/summarizers/markdown-summarizer.d.ts +12 -0
  185. package/dist/plugins/summarizers/markdown-summarizer.d.ts.map +1 -0
  186. package/dist/plugins/summarizers/markdown-summarizer.js +75 -0
  187. package/dist/plugins/summarizers/markdown-summarizer.js.map +1 -0
  188. package/dist/plugins/summarizers/network-summarizer.d.ts +12 -0
  189. package/dist/plugins/summarizers/network-summarizer.d.ts.map +1 -0
  190. package/dist/plugins/summarizers/network-summarizer.js +74 -0
  191. package/dist/plugins/summarizers/network-summarizer.js.map +1 -0
  192. package/dist/plugins/summarizers/shell-summarizer.d.ts +12 -0
  193. package/dist/plugins/summarizers/shell-summarizer.d.ts.map +1 -0
  194. package/dist/plugins/summarizers/shell-summarizer.js +50 -0
  195. package/dist/plugins/summarizers/shell-summarizer.js.map +1 -0
  196. package/dist/plugins/summarizers/test-output-summarizer.d.ts +12 -0
  197. package/dist/plugins/summarizers/test-output-summarizer.d.ts.map +1 -0
  198. package/dist/plugins/summarizers/test-output-summarizer.js +77 -0
  199. package/dist/plugins/summarizers/test-output-summarizer.js.map +1 -0
  200. package/dist/plugins/summarizers/typescript-error-summarizer.d.ts +12 -0
  201. package/dist/plugins/summarizers/typescript-error-summarizer.d.ts.map +1 -0
  202. package/dist/plugins/summarizers/typescript-error-summarizer.js +67 -0
  203. package/dist/plugins/summarizers/typescript-error-summarizer.js.map +1 -0
  204. package/hooks/context-mem-hook.js +77 -0
  205. package/hooks/dashboard-autostart.js +92 -0
  206. package/hooks/dashboard-stop.js +32 -0
  207. package/hooks/hooks.json +40 -0
  208. package/package.json +32 -0
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.BetterSqlite3Storage = void 0;
7
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
8
+ const node_fs_1 = __importDefault(require("node:fs"));
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const migrations_js_1 = require("./migrations.js");
11
+ class BetterSqlite3Storage {
12
+ name = 'better-sqlite3-storage';
13
+ version = '1.0.0';
14
+ type = 'storage';
15
+ db = null;
16
+ stmtCache = new Map();
17
+ async init(_config) { }
18
+ async open(dbPath) {
19
+ const dir = node_path_1.default.dirname(dbPath);
20
+ if (!node_fs_1.default.existsSync(dir)) {
21
+ node_fs_1.default.mkdirSync(dir, { recursive: true });
22
+ }
23
+ this.db = new better_sqlite3_1.default(dbPath);
24
+ this.db.pragma('journal_mode = WAL');
25
+ this.db.pragma('busy_timeout = 5000');
26
+ this.db.pragma('wal_autocheckpoint = 1000');
27
+ this.db.pragma('foreign_keys = ON');
28
+ this.db.pragma('cache_size = -8000'); // 8MB cache (negative = KB)
29
+ this.db.pragma('mmap_size = 67108864'); // 64MB mmap
30
+ this.db.pragma('synchronous = NORMAL'); // WAL mode safe with NORMAL
31
+ this.runMigrations();
32
+ }
33
+ runMigrations() {
34
+ const db = this.getDb();
35
+ const currentVersion = db.pragma('user_version', { simple: true }) || 0;
36
+ if (currentVersion < migrations_js_1.LATEST_SCHEMA_VERSION) {
37
+ const toRun = migrations_js_1.migrations.filter(m => m.version > currentVersion);
38
+ for (const migration of toRun) {
39
+ db.transaction(() => {
40
+ db.exec(migration.up);
41
+ db.pragma(`user_version = ${migration.version}`);
42
+ })();
43
+ }
44
+ }
45
+ }
46
+ exec(sql, params) {
47
+ const db = this.getDb();
48
+ if (params && params.length > 0) {
49
+ db.prepare(sql).run(...params);
50
+ }
51
+ else {
52
+ db.exec(sql);
53
+ }
54
+ }
55
+ prepare(sql) {
56
+ let stmt = this.stmtCache.get(sql);
57
+ if (!stmt) {
58
+ stmt = this.getDb().prepare(sql);
59
+ this.stmtCache.set(sql, stmt);
60
+ }
61
+ return stmt;
62
+ }
63
+ async close() {
64
+ this.stmtCache.clear();
65
+ if (this.db) {
66
+ this.db.close();
67
+ this.db = null;
68
+ }
69
+ }
70
+ async destroy() {
71
+ await this.close();
72
+ }
73
+ get supportsJSON() { return true; }
74
+ get supportsFTS5() { return true; }
75
+ getDb() {
76
+ if (!this.db)
77
+ throw new Error('Database not opened');
78
+ return this.db;
79
+ }
80
+ }
81
+ exports.BetterSqlite3Storage = BetterSqlite3Storage;
82
+ //# sourceMappingURL=better-sqlite3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"better-sqlite3.js","sourceRoot":"","sources":["../../../src/plugins/storage/better-sqlite3.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { StoragePlugin } from '../../core/types.js';
2
+ interface ContentSearchResult {
3
+ heading: string | null;
4
+ content: string;
5
+ has_code: boolean;
6
+ source: string;
7
+ relevance: number;
8
+ }
9
+ export declare class ContentStore {
10
+ private storage;
11
+ constructor(storage: StoragePlugin);
12
+ index(content: string, source: string): number;
13
+ search(query: string, opts?: {
14
+ limit?: number;
15
+ source?: string;
16
+ }): ContentSearchResult[];
17
+ private chunk;
18
+ }
19
+ export {};
20
+ //# sourceMappingURL=content-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-store.d.ts","sourceRoot":"","sources":["../../../src/plugins/storage/content-store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAezD,UAAU,mBAAmB;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAkCD,qBAAa,YAAY;IACX,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,aAAa;IAE1C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAiC9C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,mBAAmB,EAAE;IAsE5F,OAAO,CAAC,KAAK;CAgEd"}
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ContentStore = void 0;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const MAX_SEARCH_RESPONSE = 1536; // 1.5KB max per search response
6
+ const SNIPPET_THRESHOLD = 350; // Extract snippet if chunk > this size
7
+ const SNIPPET_CONTEXT = 120; // Chars of context around match
8
+ function extractSnippet(content, query) {
9
+ if (content.length <= SNIPPET_THRESHOLD)
10
+ return content;
11
+ // Find the best match position using query words
12
+ const words = query.toLowerCase().split(/\s+/).filter(w => w.length > 2);
13
+ const lower = content.toLowerCase();
14
+ let bestPos = -1;
15
+ let bestScore = 0;
16
+ for (let i = 0; i < lower.length; i++) {
17
+ let score = 0;
18
+ for (const word of words) {
19
+ const idx = lower.indexOf(word, Math.max(0, i - SNIPPET_CONTEXT));
20
+ if (idx >= 0 && idx < i + SNIPPET_CONTEXT)
21
+ score++;
22
+ }
23
+ if (score > bestScore) {
24
+ bestScore = score;
25
+ bestPos = i;
26
+ }
27
+ // Skip ahead for efficiency
28
+ if (score > 0)
29
+ i += 50;
30
+ }
31
+ if (bestPos < 0)
32
+ bestPos = 0;
33
+ const start = Math.max(0, bestPos - SNIPPET_CONTEXT);
34
+ const end = Math.min(content.length, bestPos + SNIPPET_CONTEXT);
35
+ const prefix = start > 0 ? '...' : '';
36
+ const suffix = end < content.length ? '...' : '';
37
+ return `${prefix}${content.slice(start, end)}${suffix}`;
38
+ }
39
+ class ContentStore {
40
+ storage;
41
+ constructor(storage) {
42
+ this.storage = storage;
43
+ }
44
+ index(content, source) {
45
+ const sourceHash = (0, node_crypto_1.createHash)('sha256').update(source).digest('hex');
46
+ // Check if already indexed
47
+ const existing = this.storage.prepare('SELECT id FROM content_sources WHERE source_hash = ?').get(sourceHash);
48
+ if (existing)
49
+ return existing.id;
50
+ // Insert source
51
+ this.storage.exec('INSERT INTO content_sources (source_hash, source, indexed_at) VALUES (?, ?, ?)', [sourceHash, source, Date.now()]);
52
+ const sourceRow = this.storage.prepare('SELECT id FROM content_sources WHERE source_hash = ?').get(sourceHash);
53
+ const sourceId = sourceRow.id;
54
+ // Chunk and index
55
+ const chunks = this.chunk(content);
56
+ for (let i = 0; i < chunks.length; i++) {
57
+ const chunk = chunks[i];
58
+ this.storage.exec('INSERT INTO content_chunks (source_id, chunk_index, heading, content, has_code) VALUES (?, ?, ?, ?, ?)', [sourceId, i, chunk.heading, chunk.content, chunk.has_code ? 1 : 0]);
59
+ }
60
+ return sourceId;
61
+ }
62
+ search(query, opts = {}) {
63
+ const limit = opts.limit || 5;
64
+ // FTS5 search
65
+ // Need to sanitize the query for FTS5 - remove special characters
66
+ const sanitized = query.replace(/[^\w\s]/g, ' ').trim();
67
+ if (!sanitized)
68
+ return [];
69
+ let sql = `
70
+ SELECT cc.heading, cc.content, cc.has_code, cs.source,
71
+ bm25(content_chunks_fts) as relevance
72
+ FROM content_chunks_fts
73
+ JOIN content_chunks cc ON cc.id = content_chunks_fts.rowid
74
+ JOIN content_sources cs ON cs.id = cc.source_id
75
+ WHERE content_chunks_fts MATCH ?
76
+ `;
77
+ const params = [sanitized];
78
+ if (opts.source) {
79
+ sql += ' AND cs.source = ?';
80
+ params.push(opts.source);
81
+ }
82
+ sql += ' ORDER BY bm25(content_chunks_fts) ASC LIMIT ?';
83
+ params.push(limit);
84
+ try {
85
+ const rows = this.storage.prepare(sql).all(...params);
86
+ // Apply 2KB budget - code chunks never truncated, large text chunks get snippets
87
+ let totalBytes = 0;
88
+ const results = [];
89
+ for (const row of rows) {
90
+ // For non-code chunks over threshold, extract relevant snippet
91
+ const displayContent = row.has_code
92
+ ? row.content
93
+ : extractSnippet(row.content, sanitized);
94
+ const bytes = Buffer.byteLength(displayContent, 'utf8');
95
+ if (totalBytes + bytes > MAX_SEARCH_RESPONSE && !row.has_code) {
96
+ // Truncate to fit remaining budget
97
+ const remaining = MAX_SEARCH_RESPONSE - totalBytes;
98
+ if (remaining > 100) {
99
+ results.push({
100
+ heading: row.heading,
101
+ content: displayContent.slice(0, remaining) + '...',
102
+ has_code: false,
103
+ source: row.source,
104
+ relevance: Math.abs(row.relevance),
105
+ });
106
+ }
107
+ break;
108
+ }
109
+ totalBytes += bytes;
110
+ results.push({
111
+ heading: row.heading,
112
+ content: displayContent,
113
+ has_code: !!row.has_code,
114
+ source: row.source,
115
+ relevance: Math.abs(row.relevance),
116
+ });
117
+ }
118
+ return results;
119
+ }
120
+ catch {
121
+ return [];
122
+ }
123
+ }
124
+ chunk(content) {
125
+ // Try JSON first — single chunk (before any transformations)
126
+ try {
127
+ JSON.parse(content);
128
+ return [{ heading: null, content, has_code: false }];
129
+ }
130
+ catch {
131
+ // Not JSON, continue
132
+ }
133
+ // Protect code blocks with placeholders
134
+ const codeBlocks = [];
135
+ const PLACEHOLDER_PREFIX = '___CODE_BLOCK_';
136
+ const PLACEHOLDER_SUFFIX = '___';
137
+ const protected_content = content.replace(/```[\s\S]*?```/g, (match) => {
138
+ const idx = codeBlocks.length;
139
+ codeBlocks.push(match);
140
+ return `${PLACEHOLDER_PREFIX}${idx}${PLACEHOLDER_SUFFIX}`;
141
+ });
142
+ // Check for Markdown headings
143
+ const headingPattern = /^(#{1,6})\s+(.+)$/gm;
144
+ const headings = [...protected_content.matchAll(headingPattern)];
145
+ let chunks;
146
+ if (headings.length >= 2) {
147
+ // Split by headings
148
+ chunks = [];
149
+ for (let i = 0; i < headings.length; i++) {
150
+ const start = headings[i].index;
151
+ const end = i + 1 < headings.length ? headings[i + 1].index : protected_content.length;
152
+ const sectionContent = protected_content.slice(start, end).trim();
153
+ chunks.push({
154
+ heading: headings[i][2],
155
+ content: sectionContent,
156
+ has_code: sectionContent.includes(PLACEHOLDER_PREFIX),
157
+ });
158
+ }
159
+ // Include preamble if exists
160
+ if (headings[0].index > 0) {
161
+ const preamble = protected_content.slice(0, headings[0].index).trim();
162
+ if (preamble) {
163
+ chunks.unshift({ heading: null, content: preamble, has_code: preamble.includes(PLACEHOLDER_PREFIX) });
164
+ }
165
+ }
166
+ }
167
+ else {
168
+ // Split by paragraphs (double newline)
169
+ const paragraphs = protected_content.split(/\n\n+/).filter(p => p.trim());
170
+ chunks = paragraphs.map(p => ({
171
+ heading: null,
172
+ content: p.trim(),
173
+ has_code: p.includes(PLACEHOLDER_PREFIX),
174
+ }));
175
+ }
176
+ // Restore code blocks using simple string regex (no null bytes)
177
+ const restorePattern = new RegExp(`${PLACEHOLDER_PREFIX}(\\d+)${PLACEHOLDER_SUFFIX}`, 'g');
178
+ return chunks.map(chunk => ({
179
+ ...chunk,
180
+ content: chunk.content.replace(restorePattern, (_, idx) => {
181
+ return codeBlocks[parseInt(idx)] || '';
182
+ }),
183
+ }));
184
+ }
185
+ }
186
+ exports.ContentStore = ContentStore;
187
+ //# sourceMappingURL=content-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-store.js","sourceRoot":"","sources":["../../../src/plugins/storage/content-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface Migration {
2
+ version: number;
3
+ description: string;
4
+ up: string;
5
+ }
6
+ export declare const LATEST_SCHEMA_VERSION = 3;
7
+ export declare const migrations: Migration[];
8
+ //# sourceMappingURL=migrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../../src/plugins/storage/migrations.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,eAAO,MAAM,qBAAqB,IAAI,CAAC;AAEvC,eAAO,MAAM,UAAU,EAAE,SAAS,EAsPjC,CAAC"}
@@ -0,0 +1,252 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.migrations = exports.LATEST_SCHEMA_VERSION = void 0;
4
+ exports.LATEST_SCHEMA_VERSION = 3;
5
+ exports.migrations = [
6
+ {
7
+ version: 1,
8
+ description: 'Initial schema with observations, FTS5, trigram, token_stats',
9
+ up: `
10
+ CREATE TABLE IF NOT EXISTS observations (
11
+ id TEXT PRIMARY KEY,
12
+ type TEXT NOT NULL,
13
+ content TEXT NOT NULL,
14
+ summary TEXT,
15
+ metadata TEXT NOT NULL DEFAULT '{}',
16
+ embeddings BLOB,
17
+ indexed_at INTEGER NOT NULL,
18
+ privacy_level TEXT DEFAULT 'public',
19
+ session_id TEXT
20
+ );
21
+
22
+ CREATE INDEX IF NOT EXISTS idx_obs_type ON observations(type);
23
+ CREATE INDEX IF NOT EXISTS idx_obs_indexed_at ON observations(indexed_at);
24
+ CREATE INDEX IF NOT EXISTS idx_obs_session ON observations(session_id);
25
+ CREATE INDEX IF NOT EXISTS idx_obs_privacy ON observations(privacy_level);
26
+
27
+ CREATE VIRTUAL TABLE IF NOT EXISTS obs_fts USING fts5(
28
+ summary, content,
29
+ content=observations,
30
+ content_rowid=rowid,
31
+ tokenize='porter unicode61'
32
+ );
33
+
34
+ CREATE VIRTUAL TABLE IF NOT EXISTS obs_trigram USING fts5(
35
+ summary,
36
+ content=observations,
37
+ content_rowid=rowid,
38
+ tokenize='trigram'
39
+ );
40
+
41
+ CREATE TRIGGER IF NOT EXISTS obs_ai AFTER INSERT ON observations BEGIN
42
+ INSERT INTO obs_fts(rowid, summary, content) VALUES (NEW.rowid, NEW.summary, NEW.content);
43
+ INSERT INTO obs_trigram(rowid, summary) VALUES (NEW.rowid, NEW.summary);
44
+ END;
45
+
46
+ CREATE TRIGGER IF NOT EXISTS obs_ad AFTER DELETE ON observations BEGIN
47
+ INSERT INTO obs_fts(obs_fts, rowid, summary, content) VALUES ('delete', OLD.rowid, OLD.summary, OLD.content);
48
+ INSERT INTO obs_trigram(obs_trigram, rowid, summary) VALUES ('delete', OLD.rowid, OLD.summary);
49
+ END;
50
+
51
+ CREATE TRIGGER IF NOT EXISTS obs_au AFTER UPDATE ON observations BEGIN
52
+ INSERT INTO obs_fts(obs_fts, rowid, summary, content) VALUES ('delete', OLD.rowid, OLD.summary, OLD.content);
53
+ INSERT INTO obs_fts(rowid, summary, content) VALUES (NEW.rowid, NEW.summary, NEW.content);
54
+ INSERT INTO obs_trigram(obs_trigram, rowid, summary) VALUES ('delete', OLD.rowid, OLD.summary);
55
+ INSERT INTO obs_trigram(rowid, summary) VALUES (NEW.rowid, NEW.summary);
56
+ END;
57
+
58
+ CREATE TABLE IF NOT EXISTS token_stats (
59
+ session_id TEXT NOT NULL,
60
+ event_type TEXT NOT NULL,
61
+ tokens_in INTEGER DEFAULT 0,
62
+ tokens_out INTEGER DEFAULT 0,
63
+ timestamp INTEGER NOT NULL
64
+ );
65
+
66
+ CREATE INDEX IF NOT EXISTS idx_ts_session ON token_stats(session_id);
67
+ CREATE INDEX IF NOT EXISTS idx_ts_event ON token_stats(event_type);
68
+
69
+ CREATE TABLE IF NOT EXISTS schema_version (
70
+ version INTEGER PRIMARY KEY,
71
+ applied_at INTEGER NOT NULL,
72
+ description TEXT
73
+ );
74
+
75
+ INSERT INTO schema_version (version, applied_at, description)
76
+ VALUES (1, unixepoch(), 'Initial schema');
77
+ `,
78
+ },
79
+ {
80
+ version: 2,
81
+ description: 'Optimize trigram index — index only summary column',
82
+ up: `
83
+ DROP TABLE IF EXISTS obs_trigram;
84
+
85
+ CREATE VIRTUAL TABLE IF NOT EXISTS obs_trigram USING fts5(
86
+ summary,
87
+ content=observations,
88
+ content_rowid=rowid,
89
+ tokenize='trigram'
90
+ );
91
+
92
+ DROP TRIGGER IF EXISTS obs_ai;
93
+ DROP TRIGGER IF EXISTS obs_ad;
94
+ DROP TRIGGER IF EXISTS obs_au;
95
+
96
+ CREATE TRIGGER IF NOT EXISTS obs_ai AFTER INSERT ON observations BEGIN
97
+ INSERT INTO obs_fts(rowid, summary, content) VALUES (NEW.rowid, NEW.summary, NEW.content);
98
+ INSERT INTO obs_trigram(rowid, summary) VALUES (NEW.rowid, NEW.summary);
99
+ END;
100
+
101
+ CREATE TRIGGER IF NOT EXISTS obs_ad AFTER DELETE ON observations BEGIN
102
+ INSERT INTO obs_fts(obs_fts, rowid, summary, content) VALUES ('delete', OLD.rowid, OLD.summary, OLD.content);
103
+ INSERT INTO obs_trigram(obs_trigram, rowid, summary) VALUES ('delete', OLD.rowid, OLD.summary);
104
+ END;
105
+
106
+ CREATE TRIGGER IF NOT EXISTS obs_au AFTER UPDATE ON observations BEGIN
107
+ INSERT INTO obs_fts(obs_fts, rowid, summary, content) VALUES ('delete', OLD.rowid, OLD.summary, OLD.content);
108
+ INSERT INTO obs_fts(rowid, summary, content) VALUES (NEW.rowid, NEW.summary, NEW.content);
109
+ INSERT INTO obs_trigram(obs_trigram, rowid, summary) VALUES ('delete', OLD.rowid, OLD.summary);
110
+ INSERT INTO obs_trigram(rowid, summary) VALUES (NEW.rowid, NEW.summary);
111
+ END;
112
+
113
+ -- Rebuild trigram index with existing data
114
+ INSERT INTO obs_trigram(obs_trigram) VALUES('rebuild');
115
+
116
+ INSERT INTO schema_version (version, applied_at, description)
117
+ VALUES (2, unixepoch(), 'Optimize trigram index — index only summary column');
118
+ `,
119
+ },
120
+ {
121
+ version: 3,
122
+ description: 'Add content_hash dedup, content store, knowledge base, budget, snapshots, events',
123
+ up: `
124
+ -- SHA256 deduplication column
125
+ ALTER TABLE observations ADD COLUMN content_hash TEXT;
126
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_obs_content_hash ON observations(content_hash);
127
+
128
+ -- Content store: sources
129
+ CREATE TABLE IF NOT EXISTS content_sources (
130
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
131
+ source_hash TEXT UNIQUE NOT NULL,
132
+ source TEXT NOT NULL,
133
+ indexed_at INTEGER NOT NULL
134
+ );
135
+
136
+ -- Content store: chunks
137
+ CREATE TABLE IF NOT EXISTS content_chunks (
138
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
139
+ source_id INTEGER NOT NULL REFERENCES content_sources(id) ON DELETE CASCADE,
140
+ chunk_index INTEGER NOT NULL,
141
+ heading TEXT,
142
+ content TEXT NOT NULL,
143
+ has_code INTEGER NOT NULL DEFAULT 0
144
+ );
145
+
146
+ -- Content chunks FTS5
147
+ CREATE VIRTUAL TABLE IF NOT EXISTS content_chunks_fts USING fts5(
148
+ heading, content,
149
+ content=content_chunks,
150
+ content_rowid=id,
151
+ tokenize='porter unicode61'
152
+ );
153
+
154
+ CREATE TRIGGER IF NOT EXISTS chunks_ai AFTER INSERT ON content_chunks BEGIN
155
+ INSERT INTO content_chunks_fts(rowid, heading, content) VALUES (NEW.id, NEW.heading, NEW.content);
156
+ END;
157
+
158
+ CREATE TRIGGER IF NOT EXISTS chunks_ad AFTER DELETE ON content_chunks BEGIN
159
+ INSERT INTO content_chunks_fts(content_chunks_fts, rowid, heading, content) VALUES ('delete', OLD.id, OLD.heading, OLD.content);
160
+ END;
161
+
162
+ CREATE TRIGGER IF NOT EXISTS chunks_au AFTER UPDATE ON content_chunks BEGIN
163
+ INSERT INTO content_chunks_fts(content_chunks_fts, rowid, heading, content) VALUES ('delete', OLD.id, OLD.heading, OLD.content);
164
+ INSERT INTO content_chunks_fts(rowid, heading, content) VALUES (NEW.id, NEW.heading, NEW.content);
165
+ END;
166
+
167
+ -- Knowledge base
168
+ CREATE TABLE IF NOT EXISTS knowledge (
169
+ id TEXT PRIMARY KEY,
170
+ category TEXT NOT NULL,
171
+ title TEXT NOT NULL,
172
+ content TEXT NOT NULL,
173
+ tags TEXT NOT NULL DEFAULT '[]',
174
+ shareable INTEGER NOT NULL DEFAULT 1,
175
+ relevance_score REAL NOT NULL DEFAULT 1.0,
176
+ access_count INTEGER NOT NULL DEFAULT 0,
177
+ created_at INTEGER NOT NULL,
178
+ archived INTEGER NOT NULL DEFAULT 0
179
+ );
180
+
181
+ CREATE VIRTUAL TABLE IF NOT EXISTS knowledge_fts USING fts5(
182
+ title, content, tags,
183
+ content=knowledge,
184
+ content_rowid=rowid,
185
+ tokenize='porter unicode61'
186
+ );
187
+
188
+ CREATE VIRTUAL TABLE IF NOT EXISTS knowledge_trigram USING fts5(
189
+ title, content,
190
+ content=knowledge,
191
+ content_rowid=rowid,
192
+ tokenize='trigram'
193
+ );
194
+
195
+ CREATE TRIGGER IF NOT EXISTS knowledge_ai AFTER INSERT ON knowledge BEGIN
196
+ INSERT INTO knowledge_fts(rowid, title, content, tags) VALUES (NEW.rowid, NEW.title, NEW.content, NEW.tags);
197
+ INSERT INTO knowledge_trigram(rowid, title, content) VALUES (NEW.rowid, NEW.title, NEW.content);
198
+ END;
199
+
200
+ CREATE TRIGGER IF NOT EXISTS knowledge_ad AFTER DELETE ON knowledge BEGIN
201
+ INSERT INTO knowledge_fts(knowledge_fts, rowid, title, content, tags) VALUES ('delete', OLD.rowid, OLD.title, OLD.content, OLD.tags);
202
+ INSERT INTO knowledge_trigram(knowledge_trigram, rowid, title, content) VALUES ('delete', OLD.rowid, OLD.title, OLD.content);
203
+ END;
204
+
205
+ CREATE TRIGGER IF NOT EXISTS knowledge_au AFTER UPDATE ON knowledge BEGIN
206
+ INSERT INTO knowledge_fts(knowledge_fts, rowid, title, content, tags) VALUES ('delete', OLD.rowid, OLD.title, OLD.content, OLD.tags);
207
+ INSERT INTO knowledge_fts(rowid, title, content, tags) VALUES (NEW.rowid, NEW.title, NEW.content, NEW.tags);
208
+ INSERT INTO knowledge_trigram(knowledge_trigram, rowid, title, content) VALUES ('delete', OLD.rowid, OLD.title, OLD.content);
209
+ INSERT INTO knowledge_trigram(rowid, title, content) VALUES (NEW.rowid, NEW.title, NEW.content);
210
+ END;
211
+
212
+ -- Budget settings
213
+ CREATE TABLE IF NOT EXISTS budget_settings (
214
+ id INTEGER PRIMARY KEY CHECK (id = 1),
215
+ session_limit INTEGER NOT NULL DEFAULT 100000,
216
+ overflow_strategy TEXT NOT NULL DEFAULT 'warn',
217
+ agent_limits TEXT NOT NULL DEFAULT '{}'
218
+ );
219
+
220
+ INSERT OR IGNORE INTO budget_settings (id, session_limit, overflow_strategy, agent_limits)
221
+ VALUES (1, 10000000, 'warn', '{}');
222
+
223
+ -- Session snapshots
224
+ CREATE TABLE IF NOT EXISTS snapshots (
225
+ session_id TEXT PRIMARY KEY,
226
+ snapshot TEXT NOT NULL,
227
+ created_at INTEGER NOT NULL
228
+ );
229
+
230
+ -- Event tracking
231
+ CREATE TABLE IF NOT EXISTS events (
232
+ id TEXT PRIMARY KEY,
233
+ session_id TEXT NOT NULL,
234
+ event_type TEXT NOT NULL,
235
+ priority INTEGER NOT NULL DEFAULT 4,
236
+ agent TEXT,
237
+ data TEXT NOT NULL DEFAULT '{}',
238
+ context_bytes INTEGER NOT NULL DEFAULT 0,
239
+ timestamp INTEGER NOT NULL
240
+ );
241
+
242
+ CREATE INDEX IF NOT EXISTS idx_events_session ON events(session_id);
243
+ CREATE INDEX IF NOT EXISTS idx_events_type ON events(event_type);
244
+ CREATE INDEX IF NOT EXISTS idx_events_priority ON events(priority);
245
+ CREATE INDEX IF NOT EXISTS idx_events_timestamp ON events(timestamp);
246
+
247
+ INSERT INTO schema_version (version, applied_at, description)
248
+ VALUES (3, unixepoch(), 'Add content_hash dedup, content store, knowledge base, budget, snapshots, events');
249
+ `,
250
+ },
251
+ ];
252
+ //# sourceMappingURL=migrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../../src/plugins/storage/migrations.ts"],"names":[],"mappings":";;;AAMa,QAAA,qBAAqB,GAAG,CAAC,CAAC;AAE1B,QAAA,UAAU,GAAgB;IACrC;QACE,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,8DAA8D;QAC3E,EAAE,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAoEH;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,oDAAoD;QACjE,EAAE,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAoCH;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,kFAAkF;QAC/F,EAAE,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA8HH;KACF;CACF,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { SummarizerPlugin, PluginConfig, SummaryResult, SummarizeOpts } from '../../core/types.js';
2
+ export declare class BinarySummarizer implements SummarizerPlugin {
3
+ name: string;
4
+ version: string;
5
+ type: "summarizer";
6
+ contentTypes: string[];
7
+ init(_config: PluginConfig): Promise<void>;
8
+ destroy(): Promise<void>;
9
+ detect(content: string): boolean;
10
+ summarize(content: string, _opts: SummarizeOpts): Promise<SummaryResult>;
11
+ }
12
+ //# sourceMappingURL=binary-summarizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary-summarizer.d.ts","sourceRoot":"","sources":["../../../src/plugins/summarizers/binary-summarizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAOxG,qBAAa,gBAAiB,YAAW,gBAAgB;IACvD,IAAI,SAAuB;IAC3B,OAAO,SAAW;IAClB,IAAI,EAAG,YAAY,CAAU;IAC7B,YAAY,WAAc;IAEpB,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAE9B,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAa1B,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;CAiB/E"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BinarySummarizer = void 0;
4
+ const utils_js_1 = require("../../core/utils.js");
5
+ const node_crypto_1 = require("node:crypto");
6
+ const CHECK_BYTES = 512;
7
+ const NON_PRINTABLE_THRESHOLD = 0.1;
8
+ class BinarySummarizer {
9
+ name = 'binary-summarizer';
10
+ version = '1.0.0';
11
+ type = 'summarizer';
12
+ contentTypes = ['binary'];
13
+ async init(_config) { }
14
+ async destroy() { }
15
+ detect(content) {
16
+ const sample = content.slice(0, CHECK_BYTES);
17
+ let nonPrintable = 0;
18
+ for (let i = 0; i < sample.length; i++) {
19
+ const code = sample.charCodeAt(i);
20
+ // Non-printable: not tab (9), not newline (10), not carriage return (13), not in printable ASCII range (32-126)
21
+ if (code !== 9 && code !== 10 && code !== 13 && (code < 32 || code > 126)) {
22
+ nonPrintable++;
23
+ }
24
+ }
25
+ return sample.length > 0 && (nonPrintable / sample.length) > NON_PRINTABLE_THRESHOLD;
26
+ }
27
+ async summarize(content, _opts) {
28
+ const tokensOriginal = (0, utils_js_1.estimateTokens)(content);
29
+ const hash = (0, node_crypto_1.createHash)('sha256').update(content).digest('hex');
30
+ const byteCount = Buffer.byteLength(content, 'utf-8');
31
+ const summary = `[binary content] sha256:${hash} size:${byteCount} bytes`;
32
+ const tokensSummarized = (0, utils_js_1.estimateTokens)(summary);
33
+ return {
34
+ summary,
35
+ tokens_original: tokensOriginal,
36
+ tokens_summarized: tokensSummarized,
37
+ savings_pct: tokensOriginal > 0 ? Math.round((1 - tokensSummarized / tokensOriginal) * 100) : 0,
38
+ content_type: 'binary',
39
+ };
40
+ }
41
+ }
42
+ exports.BinarySummarizer = BinarySummarizer;
43
+ //# sourceMappingURL=binary-summarizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary-summarizer.js","sourceRoot":"","sources":["../../../src/plugins/summarizers/binary-summarizer.ts"],"names":[],"mappings":";;;AACA,kDAAqD;AACrD,6CAAyC;AAEzC,MAAM,WAAW,GAAG,GAAG,CAAC;AACxB,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC,MAAa,gBAAgB;IAC3B,IAAI,GAAG,mBAAmB,CAAC;IAC3B,OAAO,GAAG,OAAO,CAAC;IAClB,IAAI,GAAG,YAAqB,CAAC;IAC7B,YAAY,GAAG,CAAC,QAAQ,CAAC,CAAC;IAE1B,KAAK,CAAC,IAAI,CAAC,OAAqB,IAAkB,CAAC;IACnD,KAAK,CAAC,OAAO,KAAmB,CAAC;IAEjC,MAAM,CAAC,OAAe;QACpB,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAC7C,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAClC,gHAAgH;YAChH,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,EAAE,IAAI,CAAC,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;gBAC1E,YAAY,EAAE,CAAC;YACjB,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,uBAAuB,CAAC;IACvF,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAe,EAAE,KAAoB;QACnD,MAAM,cAAc,GAAG,IAAA,yBAAc,EAAC,OAAO,CAAC,CAAC;QAE/C,MAAM,IAAI,GAAG,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAChE,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEtD,MAAM,OAAO,GAAG,2BAA2B,IAAI,SAAS,SAAS,QAAQ,CAAC;QAC1E,MAAM,gBAAgB,GAAG,IAAA,yBAAc,EAAC,OAAO,CAAC,CAAC;QAEjD,OAAO;YACL,OAAO;YACP,eAAe,EAAE,cAAc;YAC/B,iBAAiB,EAAE,gBAAgB;YACnC,WAAW,EAAE,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,gBAAgB,GAAG,cAAc,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/F,YAAY,EAAE,QAAQ;SACvB,CAAC;IACJ,CAAC;CACF;AAvCD,4CAuCC"}
@@ -0,0 +1,12 @@
1
+ import type { SummarizerPlugin, PluginConfig, SummaryResult, SummarizeOpts } from '../../core/types.js';
2
+ export declare class BuildOutputSummarizer implements SummarizerPlugin {
3
+ name: string;
4
+ version: string;
5
+ type: "summarizer";
6
+ contentTypes: string[];
7
+ init(_config: PluginConfig): Promise<void>;
8
+ destroy(): Promise<void>;
9
+ detect(content: string): boolean;
10
+ summarize(content: string, _opts: SummarizeOpts): Promise<SummaryResult>;
11
+ }
12
+ //# sourceMappingURL=build-output-summarizer.d.ts.map