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,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BudgetManager = void 0;
4
+ class BudgetManager {
5
+ storage;
6
+ constructor(storage) {
7
+ this.storage = storage;
8
+ }
9
+ configure(config) {
10
+ const current = this.getConfig();
11
+ const updated = { ...current, ...config };
12
+ this.storage.exec('INSERT OR REPLACE INTO budget_settings (id, session_limit, overflow_strategy, agent_limits) VALUES (?, ?, ?, ?)', [
13
+ 1,
14
+ updated.session_limit,
15
+ updated.overflow_strategy,
16
+ updated.agent_limits ? JSON.stringify(updated.agent_limits) : null,
17
+ ]);
18
+ }
19
+ check(sessionId) {
20
+ const config = this.getConfig();
21
+ const row = this.storage
22
+ .prepare('SELECT COALESCE(SUM(tokens_in), 0) AS used FROM token_stats WHERE session_id = ?')
23
+ .get(sessionId);
24
+ const used = row?.used ?? 0;
25
+ const percentage = config.session_limit > 0 ? (used / config.session_limit) * 100 : 0;
26
+ return {
27
+ used,
28
+ limit: config.session_limit,
29
+ percentage,
30
+ strategy: config.overflow_strategy,
31
+ throttled: percentage >= 80,
32
+ blocked: percentage >= 100,
33
+ };
34
+ }
35
+ record(_sessionId, _bytes) {
36
+ // Budget tracking is handled via token_stats table.
37
+ // This method exists as a hook for additional budget-specific metrics.
38
+ }
39
+ getStatus(sessionId) {
40
+ return this.check(sessionId);
41
+ }
42
+ getConfig() {
43
+ const row = this.storage
44
+ .prepare('SELECT session_limit, overflow_strategy, agent_limits FROM budget_settings WHERE id = 1')
45
+ .get();
46
+ if (!row) {
47
+ return {
48
+ session_limit: 128_000,
49
+ overflow_strategy: 'warn',
50
+ };
51
+ }
52
+ return {
53
+ session_limit: row.session_limit,
54
+ overflow_strategy: row.overflow_strategy,
55
+ agent_limits: row.agent_limits ? JSON.parse(row.agent_limits) : undefined,
56
+ };
57
+ }
58
+ }
59
+ exports.BudgetManager = BudgetManager;
60
+ //# sourceMappingURL=budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.js","sourceRoot":"","sources":["../../src/core/budget.ts"],"names":[],"mappings":";;;AAEA,MAAa,aAAa;IACJ;IAApB,YAAoB,OAAsB;QAAtB,YAAO,GAAP,OAAO,CAAe;IAAG,CAAC;IAE9C,SAAS,CAAC,MAA6B;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QACjC,MAAM,OAAO,GAAiB,EAAE,GAAG,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC;QAExD,IAAI,CAAC,OAAO,CAAC,IAAI,CACf,iHAAiH,EACjH;YACE,CAAC;YACD,OAAO,CAAC,aAAa;YACrB,OAAO,CAAC,iBAAiB;YACzB,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI;SACnE,CACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,SAAiB;QACrB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAEhC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO;aACrB,OAAO,CAAC,kFAAkF,CAAC;aAC3F,GAAG,CAAC,SAAS,CAAiC,CAAC;QAElD,MAAM,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,CAAC,CAAC;QAC5B,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAEtF,OAAO;YACL,IAAI;YACJ,KAAK,EAAE,MAAM,CAAC,aAAa;YAC3B,UAAU;YACV,QAAQ,EAAE,MAAM,CAAC,iBAAiB;YAClC,SAAS,EAAE,UAAU,IAAI,EAAE;YAC3B,OAAO,EAAE,UAAU,IAAI,GAAG;SAC3B,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,UAAkB,EAAE,MAAc;QACvC,oDAAoD;QACpD,uEAAuE;IACzE,CAAC;IAED,SAAS,CAAC,SAAiB;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAED,SAAS;QACP,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO;aACrB,OAAO,CAAC,yFAAyF,CAAC;aAClG,GAAG,EAA6G,CAAC;QAEpH,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO;gBACL,aAAa,EAAE,OAAO;gBACtB,iBAAiB,EAAE,MAAM;aAC1B,CAAC;QACJ,CAAC;QAED,OAAO;YACL,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;YACxC,YAAY,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAA4B,CAAC,CAAC,CAAC,SAAS;SACtG,CAAC;IACJ,CAAC;CACF;AAjED,sCAiEC"}
@@ -0,0 +1,4 @@
1
+ import { type ContextMemConfig } from './types.js';
2
+ export declare function mergeConfig(partial: Record<string, unknown>): ContextMemConfig;
3
+ export declare function loadConfig(projectDir: string): ContextMemConfig;
4
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnE,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,gBAAgB,CAG9E;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAS/D"}
@@ -0,0 +1,41 @@
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.mergeConfig = mergeConfig;
7
+ exports.loadConfig = loadConfig;
8
+ const node_fs_1 = __importDefault(require("node:fs"));
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const types_js_1 = require("./types.js");
11
+ function mergeConfig(partial) {
12
+ const base = structuredClone(types_js_1.DEFAULT_CONFIG);
13
+ return deepMerge(base, partial);
14
+ }
15
+ function loadConfig(projectDir) {
16
+ const configPath = node_path_1.default.join(projectDir, '.context-mem.json');
17
+ try {
18
+ const raw = node_fs_1.default.readFileSync(configPath, 'utf8');
19
+ const parsed = JSON.parse(raw);
20
+ return mergeConfig(parsed);
21
+ }
22
+ catch {
23
+ return structuredClone(types_js_1.DEFAULT_CONFIG);
24
+ }
25
+ }
26
+ function deepMerge(target, source) {
27
+ for (const key of Object.keys(source)) {
28
+ if (key === '__proto__' || key === 'constructor' || key === 'prototype')
29
+ continue;
30
+ const tVal = target[key];
31
+ const sVal = source[key];
32
+ if (sVal && typeof sVal === 'object' && !Array.isArray(sVal) && tVal && typeof tVal === 'object' && !Array.isArray(tVal)) {
33
+ target[key] = deepMerge(tVal, sVal);
34
+ }
35
+ else {
36
+ target[key] = sVal;
37
+ }
38
+ }
39
+ return target;
40
+ }
41
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":";;;;;AAIA,kCAGC;AAED,gCASC;AAlBD,sDAAyB;AACzB,0DAA6B;AAC7B,yCAAmE;AAEnE,SAAgB,WAAW,CAAC,OAAgC;IAC1D,MAAM,IAAI,GAAG,eAAe,CAAC,yBAAc,CAAuC,CAAC;IACnF,OAAO,SAAS,CAAC,IAAI,EAAE,OAAO,CAAgC,CAAC;AACjE,CAAC;AAED,SAAgB,UAAU,CAAC,UAAkB;IAC3C,MAAM,UAAU,GAAG,mBAAI,CAAC,IAAI,CAAC,UAAU,EAAE,mBAAmB,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,iBAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,eAAe,CAAC,yBAAc,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,MAA+B,EAAE,MAA+B;IACjF,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,aAAa,IAAI,GAAG,KAAK,WAAW;YAAE,SAAS;QAClF,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACzH,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,IAA+B,EAAE,IAA+B,CAAC,CAAC;QAC5F,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { StoragePlugin, ContextEvent, EventPriority } from './types.js';
2
+ export declare class EventTracker {
3
+ private storage;
4
+ constructor(storage: StoragePlugin);
5
+ emit(sessionId: string, eventType: string, data?: Record<string, unknown>, agent?: string): ContextEvent;
6
+ query(sessionId: string, opts?: {
7
+ event_type?: string;
8
+ priority?: EventPriority;
9
+ limit?: number;
10
+ from?: number;
11
+ to?: number;
12
+ }): ContextEvent[];
13
+ detectErrorFix(sessionId: string): Array<{
14
+ error_event: string;
15
+ fix_event: string;
16
+ file: string;
17
+ }>;
18
+ }
19
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/core/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAe7E,qBAAa,YAAY;IACX,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,aAAa;IAE1C,IAAI,CACF,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAClC,KAAK,CAAC,EAAE,MAAM,GACb,YAAY;IA8Bf,KAAK,CACH,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE;QACJ,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,aAAa,CAAC;QACzB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,EAAE,CAAC,EAAE,MAAM,CAAC;KACR,GACL,YAAY,EAAE;IAsCjB,cAAc,CACZ,SAAS,EAAE,MAAM,GAChB,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAuBnE"}
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EventTracker = void 0;
4
+ const utils_js_1 = require("./utils.js");
5
+ const EVENT_PRIORITIES = {
6
+ task_start: 1,
7
+ task_complete: 1,
8
+ error: 1,
9
+ file_modify: 2,
10
+ decision: 2,
11
+ dependency_change: 3,
12
+ knowledge_save: 3,
13
+ file_read: 4,
14
+ search: 4,
15
+ };
16
+ class EventTracker {
17
+ storage;
18
+ constructor(storage) {
19
+ this.storage = storage;
20
+ }
21
+ emit(sessionId, eventType, data = {}, agent) {
22
+ const priority = EVENT_PRIORITIES[eventType] || 4;
23
+ const event = {
24
+ id: (0, utils_js_1.ulid)(),
25
+ session_id: sessionId,
26
+ event_type: eventType,
27
+ priority,
28
+ agent,
29
+ data,
30
+ context_bytes: Buffer.byteLength(JSON.stringify(data), 'utf8'),
31
+ timestamp: Date.now(),
32
+ };
33
+ this.storage.exec('INSERT INTO events (id, session_id, event_type, priority, agent, data, context_bytes, timestamp) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', [
34
+ event.id,
35
+ event.session_id,
36
+ event.event_type,
37
+ event.priority,
38
+ event.agent || null,
39
+ JSON.stringify(event.data),
40
+ event.context_bytes,
41
+ event.timestamp,
42
+ ]);
43
+ return event;
44
+ }
45
+ query(sessionId, opts = {}) {
46
+ let sql = 'SELECT * FROM events WHERE session_id = ?';
47
+ const params = [sessionId];
48
+ if (opts.event_type) {
49
+ sql += ' AND event_type = ?';
50
+ params.push(opts.event_type);
51
+ }
52
+ if (opts.priority) {
53
+ sql += ' AND priority <= ?';
54
+ params.push(opts.priority);
55
+ }
56
+ if (opts.from !== undefined) {
57
+ sql += ' AND timestamp >= ?';
58
+ params.push(opts.from);
59
+ }
60
+ if (opts.to !== undefined) {
61
+ sql += ' AND timestamp <= ?';
62
+ params.push(opts.to);
63
+ }
64
+ sql += ' ORDER BY timestamp DESC, rowid DESC LIMIT ?';
65
+ params.push(opts.limit || 50);
66
+ const rows = this.storage.prepare(sql).all(...params);
67
+ return rows.map((r) => ({
68
+ id: r.id,
69
+ session_id: r.session_id,
70
+ event_type: r.event_type,
71
+ priority: r.priority,
72
+ agent: r.agent,
73
+ data: JSON.parse(r.data),
74
+ context_bytes: r.context_bytes,
75
+ timestamp: r.timestamp,
76
+ }));
77
+ }
78
+ detectErrorFix(sessionId) {
79
+ const events = this.query(sessionId, { limit: 100 });
80
+ const fixes = [];
81
+ // Walk events in chronological order (reverse since query returns DESC)
82
+ const chronological = [...events].reverse();
83
+ let lastError = null;
84
+ for (const evt of chronological) {
85
+ if (evt.event_type === 'error') {
86
+ lastError = evt;
87
+ }
88
+ else if (evt.event_type === 'file_modify' && lastError) {
89
+ fixes.push({
90
+ error_event: lastError.id,
91
+ fix_event: evt.id,
92
+ file: evt.data.file || 'unknown',
93
+ });
94
+ lastError = null;
95
+ }
96
+ }
97
+ return fixes;
98
+ }
99
+ }
100
+ exports.EventTracker = EventTracker;
101
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/core/events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { PluginRegistry } from './plugin-registry.js';
2
+ import { Pipeline } from './pipeline.js';
3
+ import { SearchFusion } from '../plugins/search/fusion.js';
4
+ import { BetterSqlite3Storage } from '../plugins/storage/better-sqlite3.js';
5
+ import { BudgetManager } from './budget.js';
6
+ import { EventTracker } from './events.js';
7
+ import { SessionManager } from './session.js';
8
+ import { ContentStore } from '../plugins/storage/content-store.js';
9
+ import { KnowledgeBase } from '../plugins/knowledge/knowledge-base.js';
10
+ import type { SessionContext, ContextMemConfig, SearchResult, Observation, TokenEconomics, SearchOpts } from './types.js';
11
+ export declare class Kernel {
12
+ readonly registry: PluginRegistry;
13
+ readonly session: SessionContext;
14
+ pipeline: Pipeline;
15
+ private config;
16
+ private projectDir;
17
+ private searchFusion;
18
+ private storage;
19
+ budgetManager: BudgetManager;
20
+ eventTracker: EventTracker;
21
+ sessionManager: SessionManager;
22
+ contentStore: ContentStore;
23
+ knowledgeBase: KnowledgeBase;
24
+ constructor(projectDir: string);
25
+ start(): Promise<void>;
26
+ private ensureStarted;
27
+ /** Safe accessors for ToolKernel adapter */
28
+ getConfig(): ContextMemConfig;
29
+ getStorage(): BetterSqlite3Storage;
30
+ getSearchFusion(): SearchFusion;
31
+ getBudgetManager(): BudgetManager;
32
+ getEventTracker(): EventTracker;
33
+ getSessionManager(): SessionManager;
34
+ getContentStore(): ContentStore;
35
+ getKnowledgeBase(): KnowledgeBase;
36
+ observe(content: string, type: Observation['type'], source: string, filePath?: string): Promise<Observation>;
37
+ search(query: string, opts?: SearchOpts): Promise<SearchResult[]>;
38
+ get(id: string): Promise<Observation | null>;
39
+ stats(): Promise<TokenEconomics>;
40
+ stop(): Promise<void>;
41
+ restoreSession(sessionId: string): Promise<{
42
+ snapshot: Record<string, unknown>;
43
+ condensed: boolean;
44
+ } | null>;
45
+ }
46
+ //# sourceMappingURL=kernel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kernel.d.ts","sourceRoot":"","sources":["../../src/core/kernel.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAsB5E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAEvE,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,UAAU,EACX,MAAM,YAAY,CAAC;AAEpB,qBAAa,MAAM;IACjB,QAAQ,CAAC,QAAQ,iBAAwB;IACzC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,EAAG,QAAQ,CAAC;IACpB,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,OAAO,CAAwB;IACvC,aAAa,EAAG,aAAa,CAAC;IAC9B,YAAY,EAAG,YAAY,CAAC;IAC5B,cAAc,EAAG,cAAc,CAAC;IAChC,YAAY,EAAG,YAAY,CAAC;IAC5B,aAAa,EAAG,aAAa,CAAC;gBAElB,UAAU,EAAE,MAAM;IAUxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA8D5B,OAAO,CAAC,aAAa;IAIrB,4CAA4C;IAC5C,SAAS,IAAI,gBAAgB;IAC7B,UAAU,IAAI,oBAAoB;IAClC,eAAe,IAAI,YAAY;IAC/B,gBAAgB,IAAI,aAAa;IACjC,eAAe,IAAI,YAAY;IAC/B,iBAAiB,IAAI,cAAc;IACnC,eAAe,IAAI,YAAY;IAC/B,gBAAgB,IAAI,aAAa;IAE3B,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAY5G,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAmBjE,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IA4B5C,KAAK,IAAI,OAAO,CAAC,cAAc,CAAC;IA8BhC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBrB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;CAInH"}
@@ -0,0 +1,228 @@
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.Kernel = void 0;
7
+ const node_path_1 = __importDefault(require("node:path"));
8
+ const plugin_registry_js_1 = require("./plugin-registry.js");
9
+ const pipeline_js_1 = require("./pipeline.js");
10
+ const config_js_1 = require("./config.js");
11
+ const utils_js_1 = require("./utils.js");
12
+ const fusion_js_1 = require("../plugins/search/fusion.js");
13
+ const better_sqlite3_js_1 = require("../plugins/storage/better-sqlite3.js");
14
+ const privacy_engine_js_1 = require("../plugins/privacy/privacy-engine.js");
15
+ // Summarizers — registered in priority order
16
+ const typescript_error_summarizer_js_1 = require("../plugins/summarizers/typescript-error-summarizer.js");
17
+ const test_output_summarizer_js_1 = require("../plugins/summarizers/test-output-summarizer.js");
18
+ const build_output_summarizer_js_1 = require("../plugins/summarizers/build-output-summarizer.js");
19
+ const git_log_summarizer_js_1 = require("../plugins/summarizers/git-log-summarizer.js");
20
+ const network_summarizer_js_1 = require("../plugins/summarizers/network-summarizer.js");
21
+ const error_summarizer_js_1 = require("../plugins/summarizers/error-summarizer.js");
22
+ const json_summarizer_js_1 = require("../plugins/summarizers/json-summarizer.js");
23
+ const csv_summarizer_js_1 = require("../plugins/summarizers/csv-summarizer.js");
24
+ const markdown_summarizer_js_1 = require("../plugins/summarizers/markdown-summarizer.js");
25
+ const html_summarizer_js_1 = require("../plugins/summarizers/html-summarizer.js");
26
+ const code_summarizer_js_1 = require("../plugins/summarizers/code-summarizer.js");
27
+ const log_summarizer_js_1 = require("../plugins/summarizers/log-summarizer.js");
28
+ const shell_summarizer_js_1 = require("../plugins/summarizers/shell-summarizer.js");
29
+ const binary_summarizer_js_1 = require("../plugins/summarizers/binary-summarizer.js");
30
+ // Search
31
+ const bm25_js_1 = require("../plugins/search/bm25.js");
32
+ const trigram_js_1 = require("../plugins/search/trigram.js");
33
+ const levenshtein_js_1 = require("../plugins/search/levenshtein.js");
34
+ // Core modules
35
+ const budget_js_1 = require("./budget.js");
36
+ const events_js_1 = require("./events.js");
37
+ const session_js_1 = require("./session.js");
38
+ const content_store_js_1 = require("../plugins/storage/content-store.js");
39
+ const knowledge_base_js_1 = require("../plugins/knowledge/knowledge-base.js");
40
+ const lifecycle_js_1 = require("./lifecycle.js");
41
+ class Kernel {
42
+ registry = new plugin_registry_js_1.PluginRegistry();
43
+ session;
44
+ pipeline;
45
+ config;
46
+ projectDir;
47
+ searchFusion;
48
+ storage;
49
+ budgetManager;
50
+ eventTracker;
51
+ sessionManager;
52
+ contentStore;
53
+ knowledgeBase;
54
+ constructor(projectDir) {
55
+ this.projectDir = projectDir;
56
+ this.config = (0, config_js_1.loadConfig)(projectDir);
57
+ this.session = {
58
+ session_id: (0, utils_js_1.ulid)(),
59
+ platform: 'unknown',
60
+ started_at: Date.now(),
61
+ };
62
+ }
63
+ async start() {
64
+ // Resolve db_path relative to projectDir if not absolute
65
+ const dbPath = node_path_1.default.isAbsolute(this.config.db_path)
66
+ ? this.config.db_path
67
+ : node_path_1.default.join(this.projectDir, this.config.db_path);
68
+ // 1. Storage
69
+ this.storage = new better_sqlite3_js_1.BetterSqlite3Storage();
70
+ await this.storage.open(dbPath);
71
+ await this.registry.register(this.storage);
72
+ // 2. Privacy
73
+ const privacy = new privacy_engine_js_1.PrivacyEngine(this.config.privacy);
74
+ // 3. Core modules
75
+ this.budgetManager = new budget_js_1.BudgetManager(this.storage);
76
+ this.eventTracker = new events_js_1.EventTracker(this.storage);
77
+ this.sessionManager = new session_js_1.SessionManager(this.storage, this.eventTracker);
78
+ this.contentStore = new content_store_js_1.ContentStore(this.storage);
79
+ this.knowledgeBase = new knowledge_base_js_1.KnowledgeBase(this.storage);
80
+ // 4. Pipeline (with budget integration)
81
+ this.pipeline = new pipeline_js_1.Pipeline(this.registry, this.storage, privacy, this.session.session_id);
82
+ this.pipeline.setBudgetManager(this.budgetManager);
83
+ // 5. Summarizers — registered in priority order (most specific first)
84
+ const summarizers = [
85
+ new typescript_error_summarizer_js_1.TypescriptErrorSummarizer(), // Before generic Error
86
+ new test_output_summarizer_js_1.TestOutputSummarizer(), // Before Shell
87
+ new build_output_summarizer_js_1.BuildOutputSummarizer(), // Before Shell
88
+ new git_log_summarizer_js_1.GitLogSummarizer(),
89
+ new network_summarizer_js_1.NetworkSummarizer(),
90
+ new error_summarizer_js_1.ErrorSummarizer(),
91
+ new json_summarizer_js_1.JsonSummarizer(),
92
+ new csv_summarizer_js_1.CsvSummarizer(),
93
+ new markdown_summarizer_js_1.MarkdownSummarizer(),
94
+ new html_summarizer_js_1.HtmlSummarizer(),
95
+ new code_summarizer_js_1.CodeSummarizer(),
96
+ new log_summarizer_js_1.LogSummarizer(),
97
+ new shell_summarizer_js_1.ShellSummarizer(),
98
+ new binary_summarizer_js_1.BinarySummarizer(), // Always last (catches binary)
99
+ ];
100
+ for (const s of summarizers) {
101
+ await this.registry.register(s);
102
+ }
103
+ // 6. Search plugins (with Levenshtein fallback)
104
+ const bm25 = new bm25_js_1.BM25Search(this.storage);
105
+ const trigram = new trigram_js_1.TrigramSearch(this.storage);
106
+ const levenshtein = new levenshtein_js_1.LevenshteinSearch(this.storage);
107
+ await this.registry.register(bm25);
108
+ await this.registry.register(trigram);
109
+ await this.registry.register(levenshtein);
110
+ this.searchFusion = new fusion_js_1.SearchFusion([bm25, trigram, levenshtein]);
111
+ // 7. Lifecycle cleanup (on_startup)
112
+ if (this.config.lifecycle.cleanup_schedule === 'on_startup') {
113
+ const lifecycle = new lifecycle_js_1.LifecycleManager(this.storage, this.config.lifecycle);
114
+ await lifecycle.cleanup();
115
+ }
116
+ }
117
+ ensureStarted() {
118
+ if (!this.storage)
119
+ throw new Error('Kernel not started. Call start() first.');
120
+ }
121
+ /** Safe accessors for ToolKernel adapter */
122
+ getConfig() { this.ensureStarted(); return this.config; }
123
+ getStorage() { this.ensureStarted(); return this.storage; }
124
+ getSearchFusion() { this.ensureStarted(); return this.searchFusion; }
125
+ getBudgetManager() { this.ensureStarted(); return this.budgetManager; }
126
+ getEventTracker() { this.ensureStarted(); return this.eventTracker; }
127
+ getSessionManager() { this.ensureStarted(); return this.sessionManager; }
128
+ getContentStore() { this.ensureStarted(); return this.contentStore; }
129
+ getKnowledgeBase() { this.ensureStarted(); return this.knowledgeBase; }
130
+ async observe(content, type, source, filePath) {
131
+ const obs = await this.pipeline.observe(content, type, source, filePath);
132
+ // Auto-emit event
133
+ this.eventTracker.emit(this.session.session_id, type === 'error' ? 'error' : 'file_read', {
134
+ observation_id: obs.id,
135
+ type,
136
+ source,
137
+ file_path: filePath,
138
+ });
139
+ return obs;
140
+ }
141
+ async search(query, opts) {
142
+ this.ensureStarted();
143
+ const results = await this.searchFusion.execute(query, opts || {});
144
+ // Track discovery token economics
145
+ const discoveryTokens = results.reduce((sum, r) => sum + (0, utils_js_1.estimateTokens)(r.snippet), 0);
146
+ if (this.storage && results.length > 0) {
147
+ this.storage.exec('INSERT INTO token_stats (session_id, event_type, tokens_in, tokens_out, timestamp) VALUES (?, ?, ?, ?, ?)', [this.session.session_id, 'discovery', 0, discoveryTokens, Date.now()]);
148
+ }
149
+ // Auto-emit search event
150
+ this.eventTracker.emit(this.session.session_id, 'search', {
151
+ query,
152
+ results_count: results.length,
153
+ });
154
+ return results;
155
+ }
156
+ async get(id) {
157
+ this.ensureStarted();
158
+ const row = this.storage.prepare('SELECT * FROM observations WHERE id = ?').get(id);
159
+ if (!row)
160
+ return null;
161
+ // Track read token economics
162
+ this.storage.exec('INSERT INTO token_stats (session_id, event_type, tokens_in, tokens_out, timestamp) VALUES (?, ?, ?, ?, ?)', [this.session.session_id, 'read', 0, (0, utils_js_1.estimateTokens)(row.content), Date.now()]);
163
+ let metadata = {};
164
+ try {
165
+ metadata = JSON.parse(row.metadata);
166
+ }
167
+ catch {
168
+ // malformed metadata — leave empty
169
+ }
170
+ return {
171
+ id: row.id,
172
+ type: row.type,
173
+ content: row.content,
174
+ summary: (row.summary ?? undefined),
175
+ metadata: metadata,
176
+ indexed_at: row.indexed_at,
177
+ };
178
+ }
179
+ async stats() {
180
+ this.ensureStarted();
181
+ const sid = this.session.session_id;
182
+ const q = (sql) => {
183
+ const row = this.storage.prepare(sql).get(sid);
184
+ return row?.v ?? 0;
185
+ };
186
+ const storedV = q("SELECT COUNT(*) as v FROM token_stats WHERE session_id = ? AND event_type = 'store'");
187
+ const contentBytesV = q("SELECT COALESCE(SUM(tokens_in),0) as v FROM token_stats WHERE session_id = ? AND event_type = 'store'");
188
+ const summaryBytesV = q("SELECT COALESCE(SUM(tokens_out),0) as v FROM token_stats WHERE session_id = ? AND event_type = 'store'");
189
+ const searchesV = q("SELECT COUNT(*) as v FROM token_stats WHERE session_id = ? AND event_type = 'discovery'");
190
+ const discoveryV = q("SELECT COALESCE(SUM(tokens_out),0) as v FROM token_stats WHERE session_id = ? AND event_type = 'discovery'");
191
+ const readsV = q("SELECT COALESCE(SUM(tokens_out),0) as v FROM token_stats WHERE session_id = ? AND event_type = 'read'");
192
+ const saved = contentBytesV - (discoveryV + readsV);
193
+ return {
194
+ session_id: sid,
195
+ observations_stored: storedV,
196
+ total_content_bytes: contentBytesV,
197
+ total_summary_bytes: summaryBytesV,
198
+ searches_performed: searchesV,
199
+ discovery_tokens: discoveryV,
200
+ read_tokens: readsV,
201
+ tokens_saved: Math.max(0, saved),
202
+ savings_percentage: contentBytesV > 0 ? Math.round((saved / contentBytesV) * 100) : 0,
203
+ };
204
+ }
205
+ async stop() {
206
+ // Save session snapshot before shutdown
207
+ if (this.storage && this.sessionManager) {
208
+ try {
209
+ const tokenStats = await this.stats();
210
+ this.sessionManager.saveSnapshot(this.session.session_id, tokenStats);
211
+ }
212
+ catch {
213
+ // Snapshot save failed — non-critical
214
+ }
215
+ }
216
+ // Session-scoped private cleanup
217
+ if (this.storage) {
218
+ this.storage.exec(`DELETE FROM observations WHERE privacy_level = 'private' AND session_id = ?`, [this.session.session_id]);
219
+ }
220
+ await this.registry.shutdown();
221
+ }
222
+ async restoreSession(sessionId) {
223
+ this.ensureStarted();
224
+ return this.sessionManager.restoreSnapshot(sessionId);
225
+ }
226
+ }
227
+ exports.Kernel = Kernel;
228
+ //# sourceMappingURL=kernel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kernel.js","sourceRoot":"","sources":["../../src/core/kernel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { StoragePlugin, ObservationType } from './types.js';
2
+ export interface LifecycleConfig {
3
+ ttl_days: number;
4
+ max_db_size_mb: number;
5
+ max_observations: number;
6
+ preserve_types: ObservationType[];
7
+ }
8
+ export declare class LifecycleManager {
9
+ private storage;
10
+ private config;
11
+ constructor(storage: StoragePlugin, config: LifecycleConfig);
12
+ cleanup(): Promise<{
13
+ deleted: number;
14
+ }>;
15
+ cleanupSession(sessionId: string): Promise<{
16
+ deleted: number;
17
+ }>;
18
+ }
19
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/core/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEjE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,eAAe,EAAE,CAAC;CACnC;AAED,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,MAAM;gBADN,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,eAAe;IAG3B,OAAO,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IA0BvC,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAMtE"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LifecycleManager = void 0;
4
+ class LifecycleManager {
5
+ storage;
6
+ config;
7
+ constructor(storage, config) {
8
+ this.storage = storage;
9
+ this.config = config;
10
+ }
11
+ async cleanup() {
12
+ let deleted = 0;
13
+ // 1. TTL — delete old observations (skip preserved types)
14
+ const cutoff = Date.now() - (this.config.ttl_days * 24 * 60 * 60 * 1000);
15
+ const preservePlaceholders = this.config.preserve_types.map(() => '?').join(',');
16
+ const ttlResult = this.storage.prepare(`DELETE FROM observations WHERE indexed_at < ? AND type NOT IN (${preservePlaceholders})`).run(cutoff, ...this.config.preserve_types);
17
+ deleted += ttlResult.changes;
18
+ // 2. Count cap — delete oldest if over max_observations (skip preserved types)
19
+ const countRow = this.storage.prepare('SELECT COUNT(*) as cnt FROM observations').get();
20
+ if (countRow.cnt > this.config.max_observations) {
21
+ const excess = countRow.cnt - this.config.max_observations;
22
+ const capResult = this.storage.prepare(`DELETE FROM observations WHERE id IN (
23
+ SELECT id FROM observations WHERE type NOT IN (${preservePlaceholders}) ORDER BY indexed_at ASC LIMIT ?
24
+ )`).run(...this.config.preserve_types, excess);
25
+ deleted += capResult.changes;
26
+ }
27
+ return { deleted };
28
+ }
29
+ async cleanupSession(sessionId) {
30
+ const result = this.storage.prepare(`DELETE FROM observations WHERE privacy_level = 'private' AND session_id = ?`).run(sessionId);
31
+ return { deleted: result.changes };
32
+ }
33
+ }
34
+ exports.LifecycleManager = LifecycleManager;
35
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/core/lifecycle.ts"],"names":[],"mappings":";;;AASA,MAAa,gBAAgB;IAEjB;IACA;IAFV,YACU,OAAsB,EACtB,MAAuB;QADvB,YAAO,GAAP,OAAO,CAAe;QACtB,WAAM,GAAN,MAAM,CAAiB;IAC9B,CAAC;IAEJ,KAAK,CAAC,OAAO;QACX,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,0DAA0D;QAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QACzE,MAAM,oBAAoB,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjF,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CACpC,kEAAkE,oBAAoB,GAAG,CAC1F,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC7C,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC;QAE7B,+EAA+E;QAC/E,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC,GAAG,EAAqB,CAAC;QAC3G,IAAI,QAAQ,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAChD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;YAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CACpC;2DACmD,oBAAoB;UACrE,CACH,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;YAC7C,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC;QAC/B,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,SAAiB;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CACjC,6EAA6E,CAC9E,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACjB,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IACrC,CAAC;CACF;AAtCD,4CAsCC"}
@@ -0,0 +1,18 @@
1
+ import type { ObservationType } from './types.js';
2
+ export interface QueueItem {
3
+ content: string;
4
+ type: ObservationType;
5
+ source: string;
6
+ filePath?: string;
7
+ }
8
+ export declare class ObserveQueue {
9
+ private queue;
10
+ private dedupMap;
11
+ private onFlush;
12
+ private flushing;
13
+ constructor(onFlush: (items: QueueItem[]) => Promise<void>);
14
+ enqueue(item: QueueItem): Promise<boolean>;
15
+ flush(): Promise<void>;
16
+ get size(): number;
17
+ }
18
+ //# sourceMappingURL=observe-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observe-queue.d.ts","sourceRoot":"","sources":["../../src/core/observe-queue.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,eAAe,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAMD,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,OAAO,CAAwC;IACvD,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC;IAIpD,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IA+B1C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAW5B,IAAI,IAAI,IAAI,MAAM,CAA8B;CACjD"}