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,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ObserveQueue = void 0;
4
+ const utils_js_1 = require("./utils.js");
5
+ const MAX_QUEUE_SIZE = 500;
6
+ const BATCH_SIZE = 50;
7
+ const DEDUP_WINDOW_MS = 60_000;
8
+ class ObserveQueue {
9
+ queue = [];
10
+ dedupMap = new Map(); // hash → timestamp
11
+ onFlush;
12
+ flushing = false;
13
+ constructor(onFlush) {
14
+ this.onFlush = onFlush;
15
+ }
16
+ async enqueue(item) {
17
+ const hash = (0, utils_js_1.fnv1a64)(item.content);
18
+ const now = Date.now();
19
+ // Dedup check
20
+ const lastSeen = this.dedupMap.get(hash);
21
+ if (lastSeen !== undefined && (now - lastSeen) < DEDUP_WINDOW_MS) {
22
+ return false; // Duplicate
23
+ }
24
+ // Clean old dedup entries
25
+ for (const [key, ts] of this.dedupMap) {
26
+ if (now - ts >= DEDUP_WINDOW_MS)
27
+ this.dedupMap.delete(key);
28
+ }
29
+ this.dedupMap.set(hash, now);
30
+ this.queue.push(item);
31
+ // Evict oldest if over capacity
32
+ if (this.queue.length > MAX_QUEUE_SIZE) {
33
+ this.queue.shift();
34
+ }
35
+ // Auto-flush at batch size
36
+ if (this.queue.length >= BATCH_SIZE) {
37
+ await this.flush();
38
+ }
39
+ return true;
40
+ }
41
+ async flush() {
42
+ if (this.flushing || this.queue.length === 0)
43
+ return;
44
+ this.flushing = true;
45
+ try {
46
+ const items = this.queue.splice(0);
47
+ await this.onFlush(items);
48
+ }
49
+ finally {
50
+ this.flushing = false;
51
+ }
52
+ }
53
+ get size() { return this.queue.length; }
54
+ }
55
+ exports.ObserveQueue = ObserveQueue;
56
+ //# sourceMappingURL=observe-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observe-queue.js","sourceRoot":"","sources":["../../src/core/observe-queue.ts"],"names":[],"mappings":";;;AAAA,yCAAqC;AAUrC,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,eAAe,GAAG,MAAM,CAAC;AAE/B,MAAa,YAAY;IACf,KAAK,GAAgB,EAAE,CAAC;IACxB,QAAQ,GAAwB,IAAI,GAAG,EAAE,CAAC,CAAC,mBAAmB;IAC9D,OAAO,CAAwC;IAC/C,QAAQ,GAAG,KAAK,CAAC;IAEzB,YAAY,OAA8C;QACxD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAe;QAC3B,MAAM,IAAI,GAAG,IAAA,kBAAO,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,cAAc;QACd,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,eAAe,EAAE,CAAC;YACjE,OAAO,KAAK,CAAC,CAAC,YAAY;QAC5B,CAAC;QAED,0BAA0B;QAC1B,KAAK,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtC,IAAI,GAAG,GAAG,EAAE,IAAI,eAAe;gBAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEtB,gCAAgC;QAChC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;YACvC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;QAED,2BAA2B;QAC3B,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;YACpC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACrD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACxB,CAAC;IACH,CAAC;IAED,IAAI,IAAI,KAAa,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;CACjD;AArDD,oCAqDC"}
@@ -0,0 +1,15 @@
1
+ import type { Observation, StoragePlugin, ObservationType } from './types.js';
2
+ import { PluginRegistry } from './plugin-registry.js';
3
+ import { PrivacyEngine } from '../plugins/privacy/privacy-engine.js';
4
+ import type { BudgetManager } from './budget.js';
5
+ export declare class Pipeline {
6
+ private registry;
7
+ private storage;
8
+ private privacy;
9
+ private sessionId;
10
+ private budgetManager?;
11
+ constructor(registry: PluginRegistry, storage: StoragePlugin, privacy: PrivacyEngine, sessionId: string);
12
+ setBudgetManager(budget: BudgetManager): void;
13
+ observe(content: string, type: ObservationType, source: string, filePath?: string): Promise<Observation>;
14
+ }
15
+ //# sourceMappingURL=pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/core/pipeline.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAoB,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAChG,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAGrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,qBAAa,QAAQ;IAIjB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,SAAS;IANnB,OAAO,CAAC,aAAa,CAAC,CAAgB;gBAG5B,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,MAAM;IAG3B,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAIvC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CA4G/G"}
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Pipeline = void 0;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const truncation_js_1 = require("./truncation.js");
6
+ const utils_js_1 = require("./utils.js");
7
+ class Pipeline {
8
+ registry;
9
+ storage;
10
+ privacy;
11
+ sessionId;
12
+ budgetManager;
13
+ constructor(registry, storage, privacy, sessionId) {
14
+ this.registry = registry;
15
+ this.storage = storage;
16
+ this.privacy = privacy;
17
+ this.sessionId = sessionId;
18
+ }
19
+ setBudgetManager(budget) {
20
+ this.budgetManager = budget;
21
+ }
22
+ async observe(content, type, source, filePath) {
23
+ if (!content || !content.trim()) {
24
+ throw new Error('Cannot observe empty content');
25
+ }
26
+ // 0. Budget check
27
+ if (this.budgetManager) {
28
+ const status = this.budgetManager.getStatus(this.sessionId);
29
+ if (status.blocked) {
30
+ throw new Error('Budget limit reached — observation blocked');
31
+ }
32
+ }
33
+ // 1. Privacy (fail-closed)
34
+ const { cleaned, redactions, had_private_tags } = this.privacy.process(content);
35
+ const privacyLevel = had_private_tags ? 'private' : redactions > 0 ? 'redacted' : 'public';
36
+ // 2. SHA256 deduplication
37
+ const contentHash = (0, node_crypto_1.createHash)('sha256').update(cleaned).digest('hex');
38
+ const existing = this.storage.prepare('SELECT id, type, content, summary, metadata, indexed_at, content_hash FROM observations WHERE content_hash = ?').get(contentHash);
39
+ if (existing) {
40
+ let metadata;
41
+ try {
42
+ metadata = JSON.parse(existing.metadata);
43
+ }
44
+ catch {
45
+ metadata = { source, tokens_original: 0, tokens_summarized: 0, privacy_level: privacyLevel };
46
+ }
47
+ return {
48
+ id: existing.id,
49
+ type: existing.type,
50
+ content: existing.content,
51
+ summary: (existing.summary ?? undefined),
52
+ content_hash: existing.content_hash,
53
+ metadata,
54
+ indexed_at: existing.indexed_at,
55
+ };
56
+ }
57
+ // 3. Find summarizer
58
+ const summarizers = this.registry.getAll('summarizer');
59
+ let summary;
60
+ let tokensOriginal = (0, utils_js_1.estimateTokens)(cleaned);
61
+ let tokensSummarized = tokensOriginal;
62
+ for (const s of summarizers) {
63
+ if (s.detect(cleaned)) {
64
+ try {
65
+ const result = await s.summarize(cleaned, {});
66
+ summary = result.summary;
67
+ tokensSummarized = result.tokens_summarized;
68
+ }
69
+ catch {
70
+ // Summarizer failed — store raw
71
+ }
72
+ break;
73
+ }
74
+ }
75
+ // 4. Truncation cascade — if no summarizer matched and content is large
76
+ if (!summary && cleaned.length > truncation_js_1.MAX_PASSTHROUGH) {
77
+ const aggressive = this.budgetManager ? this.budgetManager.getStatus(this.sessionId).throttled : false;
78
+ const result = (0, truncation_js_1.truncate)(cleaned, aggressive);
79
+ summary = result.content;
80
+ tokensSummarized = (0, utils_js_1.estimateTokens)(summary);
81
+ }
82
+ // 5. Build observation
83
+ const obs = {
84
+ id: (0, utils_js_1.ulid)(),
85
+ type,
86
+ content: cleaned,
87
+ summary,
88
+ content_hash: contentHash,
89
+ metadata: {
90
+ source,
91
+ file_path: filePath,
92
+ tokens_original: tokensOriginal,
93
+ tokens_summarized: tokensSummarized,
94
+ privacy_level: privacyLevel,
95
+ session_id: this.sessionId,
96
+ },
97
+ indexed_at: Date.now(),
98
+ };
99
+ // 6. Store
100
+ this.storage.exec(`INSERT INTO observations (id, type, content, summary, metadata, indexed_at, privacy_level, session_id, content_hash)
101
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, [obs.id, obs.type, obs.content, obs.summary || null, JSON.stringify(obs.metadata), obs.indexed_at, privacyLevel, this.sessionId, contentHash]);
102
+ // 7. Track token economics
103
+ const bytesUsed = Buffer.byteLength(obs.content, 'utf8');
104
+ this.storage.exec(`INSERT INTO token_stats (session_id, event_type, tokens_in, tokens_out, timestamp)
105
+ VALUES (?, 'store', ?, ?, ?)`, [this.sessionId, tokensOriginal, tokensSummarized, Date.now()]);
106
+ // 8. Record budget usage
107
+ if (this.budgetManager) {
108
+ this.budgetManager.record(this.sessionId, bytesUsed);
109
+ }
110
+ return obs;
111
+ }
112
+ }
113
+ exports.Pipeline = Pipeline;
114
+ //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/core/pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Plugin, PluginConfig, PluginType } from './types.js';
2
+ export declare class PluginRegistry {
3
+ private plugins;
4
+ private registrationOrder;
5
+ register(plugin: Plugin, config?: PluginConfig): Promise<void>;
6
+ get<T extends Plugin = Plugin>(type: PluginType | string, name?: string): T | undefined;
7
+ getAll(type: PluginType | string): Plugin[];
8
+ unregister(name: string): Promise<void>;
9
+ shutdown(): Promise<void>;
10
+ has(name: string): boolean;
11
+ get size(): number;
12
+ }
13
+ //# sourceMappingURL=plugin-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-registry.d.ts","sourceRoot":"","sources":["../../src/core/plugin-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEnE,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAkC;IACjD,OAAO,CAAC,iBAAiB,CAAgB;IAEnC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAcxE,GAAG,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAYvF,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,MAAM,EAAE;IAIrC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAY/B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PluginRegistry = void 0;
4
+ class PluginRegistry {
5
+ plugins = new Map();
6
+ registrationOrder = [];
7
+ async register(plugin, config = {}) {
8
+ if (this.plugins.has(plugin.name)) {
9
+ throw new Error(`Plugin "${plugin.name}" is already registered`);
10
+ }
11
+ try {
12
+ await plugin.init(config);
13
+ }
14
+ catch (err) {
15
+ console.warn(`Plugin "${plugin.name}" init failed, skipping:`, err.message);
16
+ return;
17
+ }
18
+ this.plugins.set(plugin.name, plugin);
19
+ this.registrationOrder.push(plugin.name);
20
+ }
21
+ get(type, name) {
22
+ if (name) {
23
+ const plugin = this.plugins.get(name);
24
+ if (plugin && plugin.type === type)
25
+ return plugin;
26
+ return undefined;
27
+ }
28
+ for (const plugin of this.plugins.values()) {
29
+ if (plugin.type === type)
30
+ return plugin;
31
+ }
32
+ return undefined;
33
+ }
34
+ getAll(type) {
35
+ return Array.from(this.plugins.values()).filter(p => p.type === type);
36
+ }
37
+ async unregister(name) {
38
+ const plugin = this.plugins.get(name);
39
+ if (!plugin)
40
+ return;
41
+ await plugin.destroy();
42
+ this.plugins.delete(name);
43
+ this.registrationOrder = this.registrationOrder.filter(n => n !== name);
44
+ }
45
+ async shutdown() {
46
+ const reversed = [...this.registrationOrder].reverse();
47
+ for (const name of reversed) {
48
+ const plugin = this.plugins.get(name);
49
+ if (plugin) {
50
+ try {
51
+ await plugin.destroy();
52
+ }
53
+ catch { /* ignore destroy errors on shutdown */ }
54
+ }
55
+ }
56
+ this.plugins.clear();
57
+ this.registrationOrder = [];
58
+ }
59
+ has(name) {
60
+ return this.plugins.has(name);
61
+ }
62
+ get size() {
63
+ return this.plugins.size;
64
+ }
65
+ }
66
+ exports.PluginRegistry = PluginRegistry;
67
+ //# sourceMappingURL=plugin-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-registry.js","sourceRoot":"","sources":["../../src/core/plugin-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { StoragePlugin, TokenEconomics } from './types.js';
2
+ import type { EventTracker } from './events.js';
3
+ export declare class SessionManager {
4
+ private storage;
5
+ private events?;
6
+ constructor(storage: StoragePlugin, events?: EventTracker | undefined);
7
+ saveSnapshot(sessionId: string, stats: TokenEconomics): void;
8
+ restoreSnapshot(sessionId: string): {
9
+ snapshot: Record<string, unknown>;
10
+ condensed: boolean;
11
+ } | null;
12
+ private buildSnapshot;
13
+ }
14
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAKhD,qBAAa,cAAc;IAEvB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,MAAM,CAAC;gBADP,OAAO,EAAE,aAAa,EACtB,MAAM,CAAC,EAAE,YAAY,YAAA;IAG/B,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI;IA4B5D,eAAe,CACb,SAAS,EAAE,MAAM,GAChB;QAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAiCnE,OAAO,CAAC,aAAa;CAwCtB"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SessionManager = void 0;
4
+ const MAX_SNAPSHOT_BYTES = 2048;
5
+ const STALE_THRESHOLD_MS = 24 * 60 * 60 * 1000; // 1 day
6
+ class SessionManager {
7
+ storage;
8
+ events;
9
+ constructor(storage, events) {
10
+ this.storage = storage;
11
+ this.events = events;
12
+ }
13
+ saveSnapshot(sessionId, stats) {
14
+ const snapshot = this.buildSnapshot(sessionId, stats);
15
+ let snapshotStr = JSON.stringify(snapshot);
16
+ // If over budget, progressively trim content until it fits as valid JSON
17
+ if (snapshotStr.length > MAX_SNAPSHOT_BYTES) {
18
+ // Remove events first (lowest value), then errors, then decisions
19
+ delete snapshot.events;
20
+ snapshotStr = JSON.stringify(snapshot);
21
+ }
22
+ if (snapshotStr.length > MAX_SNAPSHOT_BYTES) {
23
+ delete snapshot.errors;
24
+ snapshotStr = JSON.stringify(snapshot);
25
+ }
26
+ if (snapshotStr.length > MAX_SNAPSHOT_BYTES) {
27
+ // Trim decisions to first 2
28
+ if (Array.isArray(snapshot.decisions)) {
29
+ snapshot.decisions = snapshot.decisions.slice(0, 2);
30
+ }
31
+ snapshotStr = JSON.stringify(snapshot);
32
+ }
33
+ this.storage.exec('INSERT OR REPLACE INTO snapshots (session_id, snapshot, created_at) VALUES (?, ?, ?)', [sessionId, snapshotStr, Date.now()]);
34
+ }
35
+ restoreSnapshot(sessionId) {
36
+ const row = this.storage
37
+ .prepare('SELECT session_id, snapshot, created_at FROM snapshots WHERE session_id = ?')
38
+ .get(sessionId);
39
+ if (!row)
40
+ return null;
41
+ const age = Date.now() - row.created_at;
42
+ let data;
43
+ try {
44
+ data = JSON.parse(row.snapshot);
45
+ }
46
+ catch {
47
+ return null; // corrupted snapshot
48
+ }
49
+ if (age > STALE_THRESHOLD_MS) {
50
+ return {
51
+ snapshot: {
52
+ task: data.task,
53
+ decisions: data.decisions,
54
+ stats: data.stats,
55
+ condensed: true,
56
+ original_session: sessionId,
57
+ },
58
+ condensed: true,
59
+ };
60
+ }
61
+ return { snapshot: data, condensed: false };
62
+ }
63
+ buildSnapshot(sessionId, stats) {
64
+ const decisions = this.storage
65
+ .prepare("SELECT summary FROM observations WHERE session_id = ? AND type = 'decision' ORDER BY indexed_at DESC LIMIT 5")
66
+ .all(sessionId);
67
+ const errors = this.storage
68
+ .prepare("SELECT summary FROM observations WHERE session_id = ? AND type = 'error' ORDER BY indexed_at DESC LIMIT 3")
69
+ .all(sessionId);
70
+ let recentEvents = [];
71
+ if (this.events) {
72
+ recentEvents = this.events
73
+ .query(sessionId, { priority: 1, limit: 5 })
74
+ .map((e) => ({
75
+ type: e.event_type,
76
+ data: e.data,
77
+ time: e.timestamp,
78
+ }));
79
+ }
80
+ return {
81
+ session_id: sessionId,
82
+ stats: {
83
+ observations: stats.observations_stored,
84
+ tokens_saved: stats.tokens_saved,
85
+ savings_pct: stats.savings_percentage,
86
+ },
87
+ decisions: decisions.map((d) => d.summary),
88
+ errors: errors.map((e) => e.summary),
89
+ events: recentEvents,
90
+ snapshot_at: Date.now(),
91
+ };
92
+ }
93
+ }
94
+ exports.SessionManager = SessionManager;
95
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/core/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { TruncationResult } from './types.js';
2
+ export declare const MAX_PASSTHROUGH = 2048;
3
+ /**
4
+ * Four-tier truncation cascade:
5
+ * T1: JSON schema extraction
6
+ * T2: Pattern matching (test output, diff, npm)
7
+ * T3: Head/Tail slicing
8
+ * T4: SHA256 hash (binary content)
9
+ */
10
+ export declare function truncate(content: string, aggressive?: boolean): TruncationResult;
11
+ //# sourceMappingURL=truncation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"truncation.d.ts","sourceRoot":"","sources":["../../src/core/truncation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnD,eAAO,MAAM,eAAe,OAAO,CAAC;AAqFpC;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,UAAQ,GAAG,gBAAgB,CAuD9E"}
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MAX_PASSTHROUGH = void 0;
4
+ exports.truncate = truncate;
5
+ const node_crypto_1 = require("node:crypto");
6
+ // Tier thresholds
7
+ exports.MAX_PASSTHROUGH = 2048;
8
+ const HEAD = 500;
9
+ const TAIL = 500;
10
+ const AGGRESSIVE_HEAD = 200;
11
+ const AGGRESSIVE_TAIL = 200;
12
+ // Tier 1: JSON schema extraction
13
+ function tryJsonSchema(content) {
14
+ try {
15
+ const parsed = JSON.parse(content);
16
+ return `[JSON schema] ${describeJson(parsed, 0)}`;
17
+ }
18
+ catch {
19
+ return null;
20
+ }
21
+ }
22
+ function describeJson(val, depth) {
23
+ if (depth > 3)
24
+ return '...';
25
+ if (val === null)
26
+ return 'null';
27
+ if (Array.isArray(val)) {
28
+ if (val.length === 0)
29
+ return 'array[0]';
30
+ return `array[${val.length}] of ${describeJson(val[0], depth + 1)}`;
31
+ }
32
+ if (typeof val === 'object') {
33
+ const keys = Object.keys(val);
34
+ if (keys.length === 0)
35
+ return 'object{}';
36
+ const fields = keys.slice(0, 10).map(k => `${k}: ${describeJson(val[k], depth + 1)}`).join(', ');
37
+ const extra = keys.length > 10 ? `, +${keys.length - 10} more` : '';
38
+ return `{${fields}${extra}}`;
39
+ }
40
+ return typeof val;
41
+ }
42
+ // Tier 2: Pattern matching for known verbose outputs
43
+ const PATTERNS = [
44
+ {
45
+ // Test output
46
+ test: /Tests:\s.*total|PASS|FAIL|test suites?:/i,
47
+ extract: (c) => {
48
+ const lines = c.split('\n');
49
+ const summary = lines.filter(l => /Tests:|Test Suites:|passed|failed|PASS|FAIL|total/i.test(l)).slice(0, 10);
50
+ return `[Test output summary]\n${summary.join('\n')}`;
51
+ },
52
+ },
53
+ {
54
+ // Diff/patch
55
+ test: /^(diff --git|---|\+\+\+|@@)/m,
56
+ extract: (c) => {
57
+ const lines = c.split('\n');
58
+ const fileChanges = lines.filter(l => l.startsWith('diff --git') || l.startsWith('---') || l.startsWith('+++'));
59
+ const stats = lines.filter(l => /^\d+ files? changed/.test(l));
60
+ return `[Diff summary] ${fileChanges.length / 2} files\n${fileChanges.slice(0, 20).join('\n')}\n${stats.join('\n')}`;
61
+ },
62
+ },
63
+ {
64
+ // npm install output
65
+ test: /added \d+ packages?|npm warn|npm ERR!/,
66
+ extract: (c) => {
67
+ const lines = c.split('\n');
68
+ const relevant = lines.filter(l => /added|removed|npm warn|npm ERR!|up to date|packages? in/i.test(l)).slice(0, 10);
69
+ return `[npm output]\n${relevant.join('\n')}`;
70
+ },
71
+ },
72
+ ];
73
+ // Tier 4: Binary content detection
74
+ function isBinary(content) {
75
+ const sampleSize = Math.min(content.length, 512);
76
+ if (sampleSize === 0)
77
+ return false;
78
+ let nonPrintable = 0;
79
+ for (let i = 0; i < sampleSize; i++) {
80
+ const code = content.charCodeAt(i);
81
+ if (code < 32 && code !== 9 && code !== 10 && code !== 13) {
82
+ nonPrintable++;
83
+ }
84
+ }
85
+ return nonPrintable / sampleSize > 0.1;
86
+ }
87
+ /**
88
+ * Four-tier truncation cascade:
89
+ * T1: JSON schema extraction
90
+ * T2: Pattern matching (test output, diff, npm)
91
+ * T3: Head/Tail slicing
92
+ * T4: SHA256 hash (binary content)
93
+ */
94
+ function truncate(content, aggressive = false) {
95
+ const originalLength = content.length;
96
+ // T4 first: binary content → hash immediately
97
+ if (isBinary(content)) {
98
+ const hash = (0, node_crypto_1.createHash)('sha256').update(content).digest('hex');
99
+ const result = `[Binary content] sha256:${hash} (${Buffer.byteLength(content, 'utf8')} bytes)`;
100
+ return { content: result, tier: 4, original_length: originalLength, truncated_length: result.length };
101
+ }
102
+ // T1: JSON schema extraction
103
+ const schema = tryJsonSchema(content);
104
+ if (schema) {
105
+ return { content: schema, tier: 1, original_length: originalLength, truncated_length: schema.length };
106
+ }
107
+ // T2: Pattern matching
108
+ for (const pattern of PATTERNS) {
109
+ if (pattern.test.test(content)) {
110
+ const extracted = pattern.extract(content);
111
+ return { content: extracted, tier: 2, original_length: originalLength, truncated_length: extracted.length };
112
+ }
113
+ }
114
+ // T3: Head/Tail slicing
115
+ const headSize = aggressive ? AGGRESSIVE_HEAD : HEAD;
116
+ const tailSize = aggressive ? AGGRESSIVE_TAIL : TAIL;
117
+ const lines = content.split('\n');
118
+ if (lines.length <= headSize + tailSize) {
119
+ // Char-level truncation — only truncate if content actually exceeds the char budget
120
+ const charBudget = aggressive ? 1600 : 4000;
121
+ if (originalLength <= charBudget) {
122
+ // Content fits in budget — return as-is
123
+ return { content, tier: 3, original_length: originalLength, truncated_length: originalLength };
124
+ }
125
+ const halfBudget = aggressive ? 800 : 2000;
126
+ const head = content.slice(0, halfBudget);
127
+ const tail = content.slice(-halfBudget);
128
+ const omitted = originalLength - head.length - tail.length;
129
+ const result = `${head}\n... (${omitted} chars omitted) ...\n${tail}`;
130
+ return { content: result, tier: 3, original_length: originalLength, truncated_length: result.length };
131
+ }
132
+ const headLines = lines.slice(0, headSize);
133
+ const tailLines = lines.slice(-tailSize);
134
+ const omitted = lines.length - headSize - tailSize;
135
+ const result = [
136
+ `[${lines.length} lines total]`,
137
+ ...headLines,
138
+ `... (${omitted} lines omitted) ...`,
139
+ ...tailLines,
140
+ ].join('\n');
141
+ return { content: result, tier: 3, original_length: originalLength, truncated_length: result.length };
142
+ }
143
+ //# sourceMappingURL=truncation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"truncation.js","sourceRoot":"","sources":["../../src/core/truncation.ts"],"names":[],"mappings":"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"}