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,13 @@
1
+ import type { RuntimePlugin, PluginConfig, ExecOpts, ExecResult } from '../../core/types.js';
2
+ export declare class ShellRuntime implements RuntimePlugin {
3
+ name: string;
4
+ version: string;
5
+ type: "runtime";
6
+ language: string;
7
+ extensions: string[];
8
+ init(_config: PluginConfig): Promise<void>;
9
+ destroy(): Promise<void>;
10
+ detect(): Promise<boolean>;
11
+ execute(code: string, opts: ExecOpts): Promise<ExecResult>;
12
+ }
13
+ //# sourceMappingURL=shell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../../src/plugins/runtimes/shell.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAS7F,qBAAa,YAAa,YAAW,aAAa;IAChD,IAAI,SAAmB;IACvB,OAAO,SAAW;IAClB,IAAI,EAAG,SAAS,CAAU;IAC1B,QAAQ,SAAW;IACnB,UAAU,WAAoB;IAExB,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAExB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAI1B,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC;CAqCjE"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ShellRuntime = void 0;
4
+ const node_child_process_1 = require("node:child_process");
5
+ const MAX_OUTPUT = 10000;
6
+ function truncate(s) {
7
+ if (s.length <= MAX_OUTPUT)
8
+ return { text: s, truncated: false };
9
+ return { text: s.slice(0, MAX_OUTPUT), truncated: true };
10
+ }
11
+ class ShellRuntime {
12
+ name = 'shell-runtime';
13
+ version = '1.0.0';
14
+ type = 'runtime';
15
+ language = 'shell';
16
+ extensions = ['.sh', '.bash'];
17
+ async init(_config) { }
18
+ async destroy() { }
19
+ async detect() {
20
+ return true;
21
+ }
22
+ async execute(code, opts) {
23
+ const timeout = opts.timeout ?? 10000;
24
+ const start = Date.now();
25
+ return new Promise(resolve => {
26
+ (0, node_child_process_1.execFile)('/bin/sh', ['-c', code], { timeout, env: { ...process.env, ...(opts.env ?? {}) } }, (err, rawStdout, rawStderr) => {
27
+ const duration_ms = Date.now() - start;
28
+ const stdoutResult = truncate(rawStdout ?? '');
29
+ const stderrResult = truncate(rawStderr ?? '');
30
+ let exit_code = 0;
31
+ if (err) {
32
+ const spawnErr = err;
33
+ if (spawnErr.code === 'ETIMEDOUT') {
34
+ exit_code = 124;
35
+ }
36
+ else if (typeof spawnErr.code === 'number') {
37
+ exit_code = spawnErr.code;
38
+ }
39
+ else {
40
+ exit_code = 1;
41
+ }
42
+ }
43
+ resolve({
44
+ stdout: stdoutResult.text,
45
+ stderr: stderrResult.text,
46
+ exit_code,
47
+ duration_ms,
48
+ truncated: stdoutResult.truncated || stderrResult.truncated,
49
+ });
50
+ });
51
+ });
52
+ }
53
+ }
54
+ exports.ShellRuntime = ShellRuntime;
55
+ //# sourceMappingURL=shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../src/plugins/runtimes/shell.ts"],"names":[],"mappings":";;;AAAA,2DAA8C;AAG9C,MAAM,UAAU,GAAG,KAAK,CAAC;AAEzB,SAAS,QAAQ,CAAC,CAAS;IACzB,IAAI,CAAC,CAAC,MAAM,IAAI,UAAU;QAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACjE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC3D,CAAC;AAED,MAAa,YAAY;IACvB,IAAI,GAAG,eAAe,CAAC;IACvB,OAAO,GAAG,OAAO,CAAC;IAClB,IAAI,GAAG,SAAkB,CAAC;IAC1B,QAAQ,GAAG,OAAO,CAAC;IACnB,UAAU,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAE9B,KAAK,CAAC,IAAI,CAAC,OAAqB,IAAkB,CAAC;IACnD,KAAK,CAAC,OAAO,KAAmB,CAAC;IAEjC,KAAK,CAAC,MAAM;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,IAAc;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEzB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;YAC3B,IAAA,6BAAQ,EACN,SAAS,EACT,CAAC,IAAI,EAAE,IAAI,CAAC,EACZ,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,EACzD,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE;gBAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;gBACvC,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;gBAC/C,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;gBAE/C,IAAI,SAAS,GAAG,CAAC,CAAC;gBAClB,IAAI,GAAG,EAAE,CAAC;oBACR,MAAM,QAAQ,GAAG,GAAyC,CAAC;oBAC3D,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;wBAClC,SAAS,GAAG,GAAG,CAAC;oBAClB,CAAC;yBAAM,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBAC7C,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC;oBAC5B,CAAC;yBAAM,CAAC;wBACN,SAAS,GAAG,CAAC,CAAC;oBAChB,CAAC;gBACH,CAAC;gBAED,OAAO,CAAC;oBACN,MAAM,EAAE,YAAY,CAAC,IAAI;oBACzB,MAAM,EAAE,YAAY,CAAC,IAAI;oBACzB,SAAS;oBACT,WAAW;oBACX,SAAS,EAAE,YAAY,CAAC,SAAS,IAAI,YAAY,CAAC,SAAS;iBAC5D,CAAC,CAAC;YACL,CAAC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAnDD,oCAmDC"}
@@ -0,0 +1,16 @@
1
+ import type { SearchPlugin, PluginConfig, SearchResult, SearchOpts } from '../../core/types.js';
2
+ import type { BetterSqlite3Storage } from '../storage/better-sqlite3.js';
3
+ export declare class BM25Search implements SearchPlugin {
4
+ private storage;
5
+ name: string;
6
+ version: string;
7
+ type: "search";
8
+ strategy: "bm25";
9
+ priority: number;
10
+ constructor(storage: BetterSqlite3Storage);
11
+ init(_config: PluginConfig): Promise<void>;
12
+ destroy(): Promise<void>;
13
+ search(query: string, opts: SearchOpts): Promise<SearchResult[]>;
14
+ shouldFallback(results: SearchResult[]): boolean;
15
+ }
16
+ //# sourceMappingURL=bm25.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bm25.d.ts","sourceRoot":"","sources":["../../../src/plugins/search/bm25.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAChG,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAGzE,qBAAa,UAAW,YAAW,YAAY;IAOjC,OAAO,CAAC,OAAO;IAN3B,IAAI,SAAiB;IACrB,OAAO,SAAW;IAClB,IAAI,EAAG,QAAQ,CAAU;IACzB,QAAQ,EAAG,MAAM,CAAU;IAC3B,QAAQ,SAAK;gBAEO,OAAO,EAAE,oBAAoB;IAE3C,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAExB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA8CtE,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO;CAGjD"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BM25Search = void 0;
4
+ const fts5_utils_js_1 = require("./fts5-utils.js");
5
+ class BM25Search {
6
+ storage;
7
+ name = 'bm25-search';
8
+ version = '1.0.0';
9
+ type = 'search';
10
+ strategy = 'bm25';
11
+ priority = 1;
12
+ constructor(storage) {
13
+ this.storage = storage;
14
+ }
15
+ async init(_config) { }
16
+ async destroy() { }
17
+ async search(query, opts) {
18
+ const limit = opts.limit || 5;
19
+ let sql = `
20
+ SELECT o.id, o.type, o.summary, o.content, o.indexed_at,
21
+ bm25(obs_fts) as relevance
22
+ FROM obs_fts
23
+ JOIN observations o ON o.rowid = obs_fts.rowid
24
+ WHERE obs_fts MATCH ?
25
+ `;
26
+ const params = [(0, fts5_utils_js_1.sanitizeFTS5Query)(query)];
27
+ if (opts.type_filter && opts.type_filter.length > 0) {
28
+ sql += ` AND o.type IN (${opts.type_filter.map(() => '?').join(',')})`;
29
+ params.push(...opts.type_filter);
30
+ }
31
+ if (opts.from) {
32
+ sql += ' AND o.indexed_at >= ?';
33
+ params.push(opts.from);
34
+ }
35
+ if (opts.to) {
36
+ sql += ' AND o.indexed_at <= ?';
37
+ params.push(opts.to);
38
+ }
39
+ sql += ' ORDER BY bm25(obs_fts) LIMIT ?';
40
+ params.push(limit);
41
+ try {
42
+ const rows = this.storage.prepare(sql).all(...params);
43
+ return rows.map(row => ({
44
+ id: row.id,
45
+ title: (row.summary || row.content).slice(0, 100),
46
+ snippet: (row.summary || row.content).slice(0, 100),
47
+ relevance_score: Math.abs(row.relevance),
48
+ type: row.type,
49
+ timestamp: row.indexed_at,
50
+ }));
51
+ }
52
+ catch {
53
+ return [];
54
+ }
55
+ }
56
+ shouldFallback(results) {
57
+ return results.length === 0;
58
+ }
59
+ }
60
+ exports.BM25Search = BM25Search;
61
+ //# sourceMappingURL=bm25.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bm25.js","sourceRoot":"","sources":["../../../src/plugins/search/bm25.ts"],"names":[],"mappings":";;;AAEA,mDAAoD;AAEpD,MAAa,UAAU;IAOD;IANpB,IAAI,GAAG,aAAa,CAAC;IACrB,OAAO,GAAG,OAAO,CAAC;IAClB,IAAI,GAAG,QAAiB,CAAC;IACzB,QAAQ,GAAG,MAAe,CAAC;IAC3B,QAAQ,GAAG,CAAC,CAAC;IAEb,YAAoB,OAA6B;QAA7B,YAAO,GAAP,OAAO,CAAsB;IAAG,CAAC;IAErD,KAAK,CAAC,IAAI,CAAC,OAAqB,IAAkB,CAAC;IACnD,KAAK,CAAC,OAAO,KAAmB,CAAC;IAEjC,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,IAAgB;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QAC9B,IAAI,GAAG,GAAG;;;;;;KAMT,CAAC;QACF,MAAM,MAAM,GAAc,CAAC,IAAA,iCAAiB,EAAC,KAAK,CAAC,CAAC,CAAC;QAErD,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,GAAG,IAAI,mBAAmB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YACvE,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,GAAG,IAAI,wBAAwB,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,GAAG,IAAI,wBAAwB,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC;QAED,GAAG,IAAI,iCAAiC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEnB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAGlD,CAAC;YAEH,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACtB,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,KAAK,EAAE,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;gBACjD,OAAO,EAAE,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;gBACnD,eAAe,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC;gBACxC,IAAI,EAAE,GAAG,CAAC,IAA4B;gBACtC,SAAS,EAAE,GAAG,CAAC,UAAU;aAC1B,CAAC,CAAC,CAAC;QACN,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,cAAc,CAAC,OAAuB;QACpC,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC;IAC9B,CAAC;CACF;AA7DD,gCA6DC"}
@@ -0,0 +1,2 @@
1
+ export declare function sanitizeFTS5Query(query: string): string;
2
+ //# sourceMappingURL=fts5-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fts5-utils.d.ts","sourceRoot":"","sources":["../../../src/plugins/search/fts5-utils.ts"],"names":[],"mappings":"AACA,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKvD"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sanitizeFTS5Query = sanitizeFTS5Query;
4
+ // Sanitize query for FTS5 MATCH — wrap terms in double quotes, escape internal quotes
5
+ function sanitizeFTS5Query(query) {
6
+ // Split into terms, wrap each in quotes, escape internal double-quotes
7
+ const terms = query.trim().split(/\s+/).filter(t => t.length > 0);
8
+ if (terms.length === 0)
9
+ return '""';
10
+ return terms.map(t => '"' + t.replace(/"/g, '""') + '"').join(' ');
11
+ }
12
+ //# sourceMappingURL=fts5-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fts5-utils.js","sourceRoot":"","sources":["../../../src/plugins/search/fts5-utils.ts"],"names":[],"mappings":";;AACA,8CAKC;AAND,sFAAsF;AACtF,SAAgB,iBAAiB,CAAC,KAAa;IAC7C,uEAAuE;IACvE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAClE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACrE,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { SearchPlugin, SearchResult, SearchOpts, SearchOrchestrator, SearchIntent } from '../../core/types.js';
2
+ export declare class SearchFusion implements SearchOrchestrator {
3
+ private plugins;
4
+ private classifier;
5
+ constructor(plugins: SearchPlugin[]);
6
+ classify(query: string): SearchIntent;
7
+ execute(query: string, opts: SearchOpts): Promise<SearchResult[]>;
8
+ }
9
+ //# sourceMappingURL=fusion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fusion.d.ts","sourceRoot":"","sources":["../../../src/plugins/search/fusion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGpH,qBAAa,YAAa,YAAW,kBAAkB;IACrD,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,UAAU,CAAmB;gBAEzB,OAAO,EAAE,YAAY,EAAE;IAKnC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY;IAI/B,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CA6BxE"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SearchFusion = void 0;
4
+ const intent_js_1 = require("./intent.js");
5
+ class SearchFusion {
6
+ plugins = [];
7
+ classifier;
8
+ constructor(plugins) {
9
+ this.plugins = [...plugins].sort((a, b) => a.priority - b.priority);
10
+ this.classifier = new intent_js_1.IntentClassifier();
11
+ }
12
+ classify(query) {
13
+ return this.classifier.classify(query);
14
+ }
15
+ async execute(query, opts) {
16
+ const intent = this.classify(query);
17
+ const enrichedOpts = {
18
+ ...opts,
19
+ type_boosts: { ...opts.type_boosts, ...intent.type_boosts },
20
+ };
21
+ let allResults = [];
22
+ const seenIds = new Set();
23
+ for (const plugin of this.plugins) {
24
+ try {
25
+ const results = await plugin.search(query, enrichedOpts);
26
+ for (const r of results) {
27
+ if (!seenIds.has(r.id)) {
28
+ seenIds.add(r.id);
29
+ const boost = enrichedOpts.type_boosts?.[r.type] || 0;
30
+ allResults.push({ ...r, relevance_score: r.relevance_score + boost });
31
+ }
32
+ }
33
+ if (!plugin.shouldFallback(results))
34
+ break;
35
+ }
36
+ catch {
37
+ continue;
38
+ }
39
+ }
40
+ allResults.sort((a, b) => b.relevance_score - a.relevance_score);
41
+ return allResults.slice(0, opts.limit || 5);
42
+ }
43
+ }
44
+ exports.SearchFusion = SearchFusion;
45
+ //# sourceMappingURL=fusion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fusion.js","sourceRoot":"","sources":["../../../src/plugins/search/fusion.ts"],"names":[],"mappings":";;;AACA,2CAA+C;AAE/C,MAAa,YAAY;IACf,OAAO,GAAmB,EAAE,CAAC;IAC7B,UAAU,CAAmB;IAErC,YAAY,OAAuB;QACjC,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QACpE,IAAI,CAAC,UAAU,GAAG,IAAI,4BAAgB,EAAE,CAAC;IAC3C,CAAC;IAED,QAAQ,CAAC,KAAa;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAAa,EAAE,IAAgB;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,YAAY,GAAe;YAC/B,GAAG,IAAI;YACP,WAAW,EAAE,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,WAAW,EAAE;SAC5D,CAAC;QAEF,IAAI,UAAU,GAAmB,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAElC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;gBACzD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;oBACxB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;wBACvB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;wBAClB,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBACtD,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,eAAe,GAAG,KAAK,EAAE,CAAC,CAAC;oBACxE,CAAC;gBACH,CAAC;gBACD,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC;oBAAE,MAAM;YAC7C,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;QAED,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC;QACjE,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IAC9C,CAAC;CACF;AA1CD,oCA0CC"}
@@ -0,0 +1,5 @@
1
+ import type { SearchIntent } from '../../core/types.js';
2
+ export declare class IntentClassifier {
3
+ classify(query: string): SearchIntent;
4
+ }
5
+ //# sourceMappingURL=intent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intent.d.ts","sourceRoot":"","sources":["../../../src/plugins/search/intent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,qBAAqB,CAAC;AAoBzE,qBAAa,gBAAgB;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY;CA4BtC"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IntentClassifier = void 0;
4
+ const STOP_WORDS = new Set([
5
+ 'a', 'an', 'the', 'is', 'was', 'were', 'are', 'been', 'be',
6
+ 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would',
7
+ 'could', 'should', 'may', 'might', 'shall', 'can',
8
+ 'of', 'at', 'by', 'for', 'with', 'about', 'against',
9
+ 'between', 'through', 'during', 'before', 'after',
10
+ 'to', 'from', 'in', 'on', 'up', 'out',
11
+ 'it', 'its', 'this', 'that', 'these', 'those',
12
+ 'i', 'me', 'my', 'we', 'our', 'you', 'your',
13
+ 'not', 'no', 'nor', 'so', 'too', 'very',
14
+ 'and', 'but', 'or', 'if', 'then',
15
+ 'what', 'which', 'who', 'whom',
16
+ ]);
17
+ const CAUSAL_SIGNALS = ['why', 'cause', 'reason', 'because', 'broke', 'failed', 'crash'];
18
+ const TEMPORAL_SIGNALS = ['when', 'last', 'recent', 'today', 'yesterday', 'ago', 'since', 'latest'];
19
+ const LOOKUP_SIGNALS = ['how', 'where', 'find', 'show', 'explain', 'work', 'does'];
20
+ class IntentClassifier {
21
+ classify(query) {
22
+ const words = query.toLowerCase().split(/\s+/).filter(w => w.length > 0);
23
+ const keywords = words.filter(w => !STOP_WORDS.has(w) && !CAUSAL_SIGNALS.includes(w) && !TEMPORAL_SIGNALS.includes(w) && !LOOKUP_SIGNALS.includes(w));
24
+ let intent_type = 'general';
25
+ let type_boosts = {};
26
+ if (words.some(w => CAUSAL_SIGNALS.includes(w))) {
27
+ intent_type = 'causal';
28
+ type_boosts = { error: 2, decision: 1.5, log: 1 };
29
+ }
30
+ else if (words.some(w => TEMPORAL_SIGNALS.includes(w))) {
31
+ intent_type = 'temporal';
32
+ type_boosts = { commit: 2, log: 1.5, context: 1 };
33
+ }
34
+ else if (words.some(w => LOOKUP_SIGNALS.includes(w))) {
35
+ intent_type = 'lookup';
36
+ type_boosts = { code: 2, context: 1.5, decision: 1 };
37
+ }
38
+ // Add remaining meaningful words as keywords too (exclude signal words)
39
+ const allSignals = new Set([...CAUSAL_SIGNALS, ...TEMPORAL_SIGNALS, ...LOOKUP_SIGNALS]);
40
+ for (const w of words) {
41
+ if (!STOP_WORDS.has(w) && !allSignals.has(w) && !keywords.includes(w)) {
42
+ keywords.push(w);
43
+ }
44
+ }
45
+ return { keywords, type_boosts, intent_type };
46
+ }
47
+ }
48
+ exports.IntentClassifier = IntentClassifier;
49
+ //# sourceMappingURL=intent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intent.js","sourceRoot":"","sources":["../../../src/plugins/search/intent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { SearchPlugin, PluginConfig, SearchResult, SearchOpts } from '../../core/types.js';
2
+ import type { BetterSqlite3Storage } from '../storage/better-sqlite3.js';
3
+ export declare class LevenshteinSearch implements SearchPlugin {
4
+ private storage;
5
+ name: string;
6
+ version: string;
7
+ type: "search";
8
+ strategy: "levenshtein";
9
+ priority: number;
10
+ constructor(storage: BetterSqlite3Storage);
11
+ init(_config: PluginConfig): Promise<void>;
12
+ destroy(): Promise<void>;
13
+ search(query: string, opts: SearchOpts): Promise<SearchResult[]>;
14
+ shouldFallback(_results: SearchResult[]): boolean;
15
+ private levenshtein;
16
+ }
17
+ //# sourceMappingURL=levenshtein.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"levenshtein.d.ts","sourceRoot":"","sources":["../../../src/plugins/search/levenshtein.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAChG,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEzE,qBAAa,iBAAkB,YAAW,YAAY;IAOxC,OAAO,CAAC,OAAO;IAN3B,IAAI,SAAwB;IAC5B,OAAO,SAAW;IAClB,IAAI,EAAG,QAAQ,CAAU;IACzB,QAAQ,EAAG,aAAa,CAAU;IAClC,QAAQ,SAAK;gBAEO,OAAO,EAAE,oBAAoB;IAE3C,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAExB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA6DtE,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,OAAO;IAIjD,OAAO,CAAC,WAAW;CA6BpB"}
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LevenshteinSearch = void 0;
4
+ class LevenshteinSearch {
5
+ storage;
6
+ name = 'levenshtein-search';
7
+ version = '1.0.0';
8
+ type = 'search';
9
+ strategy = 'levenshtein';
10
+ priority = 3;
11
+ constructor(storage) {
12
+ this.storage = storage;
13
+ }
14
+ async init(_config) { }
15
+ async destroy() { }
16
+ async search(query, opts) {
17
+ const limit = opts.limit || 5;
18
+ const queryWords = query.toLowerCase().split(/\s+/).filter(w => w.length >= 2);
19
+ if (queryWords.length === 0)
20
+ return [];
21
+ // Operate on 100 most recent observations only
22
+ let sql = 'SELECT id, type, summary, content, indexed_at FROM observations';
23
+ const params = [];
24
+ if (opts.type_filter && opts.type_filter.length > 0) {
25
+ sql += ` WHERE type IN (${opts.type_filter.map(() => '?').join(',')})`;
26
+ params.push(...opts.type_filter);
27
+ }
28
+ sql += ' ORDER BY indexed_at DESC LIMIT 100';
29
+ const rows = this.storage.prepare(sql).all(...params);
30
+ // Score each observation by minimum Levenshtein distance
31
+ const scored = [];
32
+ for (const row of rows) {
33
+ const text = (row.summary || row.content).toLowerCase();
34
+ const words = text.split(/\s+/).filter(w => w.length >= 2);
35
+ let totalScore = 0;
36
+ let matchedWords = 0;
37
+ for (const qWord of queryWords) {
38
+ let bestDist = Infinity;
39
+ for (const tWord of words) {
40
+ const dist = this.levenshtein(qWord, tWord);
41
+ if (dist < bestDist)
42
+ bestDist = dist;
43
+ if (dist === 0)
44
+ break; // exact match, no need to continue
45
+ }
46
+ if (bestDist <= 2) {
47
+ matchedWords++;
48
+ totalScore += 1 / (bestDist + 1); // closer match = higher score
49
+ }
50
+ }
51
+ if (matchedWords > 0) {
52
+ scored.push({ row, score: totalScore / queryWords.length });
53
+ }
54
+ }
55
+ // Sort by score descending, take top N
56
+ scored.sort((a, b) => b.score - a.score);
57
+ return scored.slice(0, limit).map(s => ({
58
+ id: s.row.id,
59
+ title: (s.row.summary || s.row.content).slice(0, 100),
60
+ snippet: (s.row.summary || s.row.content).slice(0, 200),
61
+ relevance_score: s.score,
62
+ type: s.row.type,
63
+ timestamp: s.row.indexed_at,
64
+ }));
65
+ }
66
+ shouldFallback(_results) {
67
+ return false; // Terminal — never falls back
68
+ }
69
+ levenshtein(a, b) {
70
+ if (a === b)
71
+ return 0;
72
+ if (a.length === 0)
73
+ return b.length;
74
+ if (b.length === 0)
75
+ return a.length;
76
+ // Optimization: if length difference > 2, skip
77
+ if (Math.abs(a.length - b.length) > 2)
78
+ return 3;
79
+ const matrix = [];
80
+ for (let i = 0; i <= a.length; i++) {
81
+ matrix[i] = [i];
82
+ }
83
+ for (let j = 0; j <= b.length; j++) {
84
+ matrix[0][j] = j;
85
+ }
86
+ for (let i = 1; i <= a.length; i++) {
87
+ for (let j = 1; j <= b.length; j++) {
88
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
89
+ matrix[i][j] = Math.min(matrix[i - 1][j] + 1, // deletion
90
+ matrix[i][j - 1] + 1, // insertion
91
+ matrix[i - 1][j - 1] + cost // substitution
92
+ );
93
+ }
94
+ }
95
+ return matrix[a.length][b.length];
96
+ }
97
+ }
98
+ exports.LevenshteinSearch = LevenshteinSearch;
99
+ //# sourceMappingURL=levenshtein.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"levenshtein.js","sourceRoot":"","sources":["../../../src/plugins/search/levenshtein.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { SearchPlugin, PluginConfig, SearchResult, SearchOpts } from '../../core/types.js';
2
+ import type { BetterSqlite3Storage } from '../storage/better-sqlite3.js';
3
+ export declare class TrigramSearch implements SearchPlugin {
4
+ private storage;
5
+ name: string;
6
+ version: string;
7
+ type: "search";
8
+ strategy: "trigram";
9
+ priority: number;
10
+ constructor(storage: BetterSqlite3Storage);
11
+ init(_config: PluginConfig): Promise<void>;
12
+ destroy(): Promise<void>;
13
+ search(query: string, opts: SearchOpts): Promise<SearchResult[]>;
14
+ shouldFallback(results: SearchResult[]): boolean;
15
+ }
16
+ //# sourceMappingURL=trigram.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trigram.d.ts","sourceRoot":"","sources":["../../../src/plugins/search/trigram.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAChG,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAGzE,qBAAa,aAAc,YAAW,YAAY;IAOpC,OAAO,CAAC,OAAO;IAN3B,IAAI,SAAoB;IACxB,OAAO,SAAW;IAClB,IAAI,EAAG,QAAQ,CAAU;IACzB,QAAQ,EAAG,SAAS,CAAU;IAC9B,QAAQ,SAAK;gBAEO,OAAO,EAAE,oBAAoB;IAE3C,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAExB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAgDtE,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO;CAGjD"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TrigramSearch = void 0;
4
+ const fts5_utils_js_1 = require("./fts5-utils.js");
5
+ class TrigramSearch {
6
+ storage;
7
+ name = 'trigram-search';
8
+ version = '1.0.0';
9
+ type = 'search';
10
+ strategy = 'trigram';
11
+ priority = 2;
12
+ constructor(storage) {
13
+ this.storage = storage;
14
+ }
15
+ async init(_config) { }
16
+ async destroy() { }
17
+ async search(query, opts) {
18
+ if (query.length < 3)
19
+ return [];
20
+ const limit = opts.limit || 5;
21
+ let sql = `
22
+ SELECT o.id, o.type, o.summary, o.content, o.indexed_at,
23
+ rank as relevance
24
+ FROM obs_trigram
25
+ JOIN observations o ON o.rowid = obs_trigram.rowid
26
+ WHERE obs_trigram MATCH ?
27
+ `;
28
+ const params = [(0, fts5_utils_js_1.sanitizeFTS5Query)(query)];
29
+ if (opts.type_filter && opts.type_filter.length > 0) {
30
+ sql += ` AND o.type IN (${opts.type_filter.map(() => '?').join(',')})`;
31
+ params.push(...opts.type_filter);
32
+ }
33
+ if (opts.from) {
34
+ sql += ' AND o.indexed_at >= ?';
35
+ params.push(opts.from);
36
+ }
37
+ if (opts.to) {
38
+ sql += ' AND o.indexed_at <= ?';
39
+ params.push(opts.to);
40
+ }
41
+ sql += ' ORDER BY rank LIMIT ?';
42
+ params.push(limit);
43
+ try {
44
+ const rows = this.storage.prepare(sql).all(...params);
45
+ return rows.map(row => ({
46
+ id: row.id,
47
+ title: (row.summary || row.content).slice(0, 100),
48
+ snippet: (row.summary || row.content).slice(0, 100),
49
+ relevance_score: Math.abs(row.relevance),
50
+ type: row.type,
51
+ timestamp: row.indexed_at,
52
+ }));
53
+ }
54
+ catch {
55
+ return [];
56
+ }
57
+ }
58
+ shouldFallback(results) {
59
+ return results.length === 0;
60
+ }
61
+ }
62
+ exports.TrigramSearch = TrigramSearch;
63
+ //# sourceMappingURL=trigram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trigram.js","sourceRoot":"","sources":["../../../src/plugins/search/trigram.ts"],"names":[],"mappings":";;;AAEA,mDAAoD;AAEpD,MAAa,aAAa;IAOJ;IANpB,IAAI,GAAG,gBAAgB,CAAC;IACxB,OAAO,GAAG,OAAO,CAAC;IAClB,IAAI,GAAG,QAAiB,CAAC;IACzB,QAAQ,GAAG,SAAkB,CAAC;IAC9B,QAAQ,GAAG,CAAC,CAAC;IAEb,YAAoB,OAA6B;QAA7B,YAAO,GAAP,OAAO,CAAsB;IAAG,CAAC;IAErD,KAAK,CAAC,IAAI,CAAC,OAAqB,IAAkB,CAAC;IACnD,KAAK,CAAC,OAAO,KAAmB,CAAC;IAEjC,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,IAAgB;QAC1C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,EAAE,CAAC;QAEhC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QAC9B,IAAI,GAAG,GAAG;;;;;;KAMT,CAAC;QACF,MAAM,MAAM,GAAc,CAAC,IAAA,iCAAiB,EAAC,KAAK,CAAC,CAAC,CAAC;QAErD,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,GAAG,IAAI,mBAAmB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YACvE,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,GAAG,IAAI,wBAAwB,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,GAAG,IAAI,wBAAwB,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvB,CAAC;QAED,GAAG,IAAI,wBAAwB,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEnB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAGlD,CAAC;YAEH,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACtB,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,KAAK,EAAE,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;gBACjD,OAAO,EAAE,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;gBACnD,eAAe,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC;gBACxC,IAAI,EAAE,GAAG,CAAC,IAA4B;gBACtC,SAAS,EAAE,GAAG,CAAC,UAAU;aAC1B,CAAC,CAAC,CAAC;QACN,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,cAAc,CAAC,OAAuB;QACpC,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC;IAC9B,CAAC;CACF;AA/DD,sCA+DC"}
@@ -0,0 +1,19 @@
1
+ import type { StoragePlugin, PluginConfig, Statement as IStatement } from '../../core/types.js';
2
+ export declare class BetterSqlite3Storage implements StoragePlugin {
3
+ name: string;
4
+ version: string;
5
+ type: "storage";
6
+ private db;
7
+ private stmtCache;
8
+ init(_config: PluginConfig): Promise<void>;
9
+ open(dbPath: string): Promise<void>;
10
+ private runMigrations;
11
+ exec(sql: string, params?: unknown[]): void;
12
+ prepare(sql: string): IStatement;
13
+ close(): Promise<void>;
14
+ destroy(): Promise<void>;
15
+ get supportsJSON(): boolean;
16
+ get supportsFTS5(): boolean;
17
+ private getDb;
18
+ }
19
+ //# sourceMappingURL=better-sqlite3.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"better-sqlite3.d.ts","sourceRoot":"","sources":["../../../src/plugins/storage/better-sqlite3.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGhG,qBAAa,oBAAqB,YAAW,aAAa;IACxD,IAAI,SAA4B;IAChC,OAAO,SAAW;IAClB,IAAI,EAAG,SAAS,CAAU;IAC1B,OAAO,CAAC,EAAE,CAAkC;IAC5C,OAAO,CAAC,SAAS,CAAyC;IAEpD,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAE1C,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBzC,OAAO,CAAC,aAAa;IAerB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI;IAS3C,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU;IAS1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,IAAI,YAAY,IAAI,OAAO,CAAiB;IAC5C,IAAI,YAAY,IAAI,OAAO,CAAiB;IAE5C,OAAO,CAAC,KAAK;CAId"}