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.
- package/.context-mem.json.example +22 -0
- package/LICENSE +21 -0
- package/README.md +213 -0
- package/dist/cli/commands/dashboard.d.ts +2 -0
- package/dist/cli/commands/dashboard.d.ts.map +1 -0
- package/dist/cli/commands/dashboard.js +55 -0
- package/dist/cli/commands/dashboard.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +2 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +49 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +43 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +2 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +47 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/status.d.ts +2 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +29 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +39 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/budget.d.ts +11 -0
- package/dist/core/budget.d.ts.map +1 -0
- package/dist/core/budget.js +60 -0
- package/dist/core/budget.js.map +1 -0
- package/dist/core/config.d.ts +4 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +41 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/events.d.ts +19 -0
- package/dist/core/events.d.ts.map +1 -0
- package/dist/core/events.js +101 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/kernel.d.ts +46 -0
- package/dist/core/kernel.d.ts.map +1 -0
- package/dist/core/kernel.js +228 -0
- package/dist/core/kernel.js.map +1 -0
- package/dist/core/lifecycle.d.ts +19 -0
- package/dist/core/lifecycle.d.ts.map +1 -0
- package/dist/core/lifecycle.js +35 -0
- package/dist/core/lifecycle.js.map +1 -0
- package/dist/core/observe-queue.d.ts +18 -0
- package/dist/core/observe-queue.d.ts.map +1 -0
- package/dist/core/observe-queue.js +56 -0
- package/dist/core/observe-queue.js.map +1 -0
- package/dist/core/pipeline.d.ts +15 -0
- package/dist/core/pipeline.d.ts.map +1 -0
- package/dist/core/pipeline.js +114 -0
- package/dist/core/pipeline.js.map +1 -0
- package/dist/core/plugin-registry.d.ts +13 -0
- package/dist/core/plugin-registry.d.ts.map +1 -0
- package/dist/core/plugin-registry.js +67 -0
- package/dist/core/plugin-registry.js.map +1 -0
- package/dist/core/session.d.ts +14 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +95 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/truncation.d.ts +11 -0
- package/dist/core/truncation.d.ts.map +1 -0
- package/dist/core/truncation.js +143 -0
- package/dist/core/truncation.js.map +1 -0
- package/dist/core/types.d.ts +230 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +50 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/utils.d.ts +4 -0
- package/dist/core/utils.d.ts.map +1 -0
- package/dist/core/utils.js +57 -0
- package/dist/core/utils.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server/server.d.ts +5 -0
- package/dist/mcp-server/server.d.ts.map +1 -0
- package/dist/mcp-server/server.js +101 -0
- package/dist/mcp-server/server.js.map +1 -0
- package/dist/mcp-server/tools.d.ts +201 -0
- package/dist/mcp-server/tools.d.ts.map +1 -0
- package/dist/mcp-server/tools.js +618 -0
- package/dist/mcp-server/tools.js.map +1 -0
- package/dist/plugins/knowledge/knowledge-base.d.ts +23 -0
- package/dist/plugins/knowledge/knowledge-base.d.ts.map +1 -0
- package/dist/plugins/knowledge/knowledge-base.js +165 -0
- package/dist/plugins/knowledge/knowledge-base.js.map +1 -0
- package/dist/plugins/platforms/claude-code.d.ts +14 -0
- package/dist/plugins/platforms/claude-code.d.ts.map +1 -0
- package/dist/plugins/platforms/claude-code.js +52 -0
- package/dist/plugins/platforms/claude-code.js.map +1 -0
- package/dist/plugins/privacy/privacy-engine.d.ts +18 -0
- package/dist/plugins/privacy/privacy-engine.d.ts.map +1 -0
- package/dist/plugins/privacy/privacy-engine.js +72 -0
- package/dist/plugins/privacy/privacy-engine.js.map +1 -0
- package/dist/plugins/runtimes/javascript.d.ts +13 -0
- package/dist/plugins/runtimes/javascript.d.ts.map +1 -0
- package/dist/plugins/runtimes/javascript.js +102 -0
- package/dist/plugins/runtimes/javascript.js.map +1 -0
- package/dist/plugins/runtimes/python.d.ts +14 -0
- package/dist/plugins/runtimes/python.d.ts.map +1 -0
- package/dist/plugins/runtimes/python.js +127 -0
- package/dist/plugins/runtimes/python.js.map +1 -0
- package/dist/plugins/runtimes/shell.d.ts +13 -0
- package/dist/plugins/runtimes/shell.d.ts.map +1 -0
- package/dist/plugins/runtimes/shell.js +55 -0
- package/dist/plugins/runtimes/shell.js.map +1 -0
- package/dist/plugins/search/bm25.d.ts +16 -0
- package/dist/plugins/search/bm25.d.ts.map +1 -0
- package/dist/plugins/search/bm25.js +61 -0
- package/dist/plugins/search/bm25.js.map +1 -0
- package/dist/plugins/search/fts5-utils.d.ts +2 -0
- package/dist/plugins/search/fts5-utils.d.ts.map +1 -0
- package/dist/plugins/search/fts5-utils.js +12 -0
- package/dist/plugins/search/fts5-utils.js.map +1 -0
- package/dist/plugins/search/fusion.d.ts +9 -0
- package/dist/plugins/search/fusion.d.ts.map +1 -0
- package/dist/plugins/search/fusion.js +45 -0
- package/dist/plugins/search/fusion.js.map +1 -0
- package/dist/plugins/search/intent.d.ts +5 -0
- package/dist/plugins/search/intent.d.ts.map +1 -0
- package/dist/plugins/search/intent.js +49 -0
- package/dist/plugins/search/intent.js.map +1 -0
- package/dist/plugins/search/levenshtein.d.ts +17 -0
- package/dist/plugins/search/levenshtein.d.ts.map +1 -0
- package/dist/plugins/search/levenshtein.js +99 -0
- package/dist/plugins/search/levenshtein.js.map +1 -0
- package/dist/plugins/search/trigram.d.ts +16 -0
- package/dist/plugins/search/trigram.d.ts.map +1 -0
- package/dist/plugins/search/trigram.js +63 -0
- package/dist/plugins/search/trigram.js.map +1 -0
- package/dist/plugins/storage/better-sqlite3.d.ts +19 -0
- package/dist/plugins/storage/better-sqlite3.d.ts.map +1 -0
- package/dist/plugins/storage/better-sqlite3.js +82 -0
- package/dist/plugins/storage/better-sqlite3.js.map +1 -0
- package/dist/plugins/storage/content-store.d.ts +20 -0
- package/dist/plugins/storage/content-store.d.ts.map +1 -0
- package/dist/plugins/storage/content-store.js +187 -0
- package/dist/plugins/storage/content-store.js.map +1 -0
- package/dist/plugins/storage/migrations.d.ts +8 -0
- package/dist/plugins/storage/migrations.d.ts.map +1 -0
- package/dist/plugins/storage/migrations.js +252 -0
- package/dist/plugins/storage/migrations.js.map +1 -0
- package/dist/plugins/summarizers/binary-summarizer.d.ts +12 -0
- package/dist/plugins/summarizers/binary-summarizer.d.ts.map +1 -0
- package/dist/plugins/summarizers/binary-summarizer.js +43 -0
- package/dist/plugins/summarizers/binary-summarizer.js.map +1 -0
- package/dist/plugins/summarizers/build-output-summarizer.d.ts +12 -0
- package/dist/plugins/summarizers/build-output-summarizer.d.ts.map +1 -0
- package/dist/plugins/summarizers/build-output-summarizer.js +68 -0
- package/dist/plugins/summarizers/build-output-summarizer.js.map +1 -0
- package/dist/plugins/summarizers/code-summarizer.d.ts +12 -0
- package/dist/plugins/summarizers/code-summarizer.d.ts.map +1 -0
- package/dist/plugins/summarizers/code-summarizer.js +179 -0
- package/dist/plugins/summarizers/code-summarizer.js.map +1 -0
- package/dist/plugins/summarizers/csv-summarizer.d.ts +12 -0
- package/dist/plugins/summarizers/csv-summarizer.d.ts.map +1 -0
- package/dist/plugins/summarizers/csv-summarizer.js +60 -0
- package/dist/plugins/summarizers/csv-summarizer.js.map +1 -0
- package/dist/plugins/summarizers/error-summarizer.d.ts +15 -0
- package/dist/plugins/summarizers/error-summarizer.d.ts.map +1 -0
- package/dist/plugins/summarizers/error-summarizer.js +111 -0
- package/dist/plugins/summarizers/error-summarizer.js.map +1 -0
- package/dist/plugins/summarizers/git-log-summarizer.d.ts +12 -0
- package/dist/plugins/summarizers/git-log-summarizer.d.ts.map +1 -0
- package/dist/plugins/summarizers/git-log-summarizer.js +76 -0
- package/dist/plugins/summarizers/git-log-summarizer.js.map +1 -0
- package/dist/plugins/summarizers/html-summarizer.d.ts +12 -0
- package/dist/plugins/summarizers/html-summarizer.d.ts.map +1 -0
- package/dist/plugins/summarizers/html-summarizer.js +69 -0
- package/dist/plugins/summarizers/html-summarizer.js.map +1 -0
- package/dist/plugins/summarizers/json-summarizer.d.ts +12 -0
- package/dist/plugins/summarizers/json-summarizer.d.ts.map +1 -0
- package/dist/plugins/summarizers/json-summarizer.js +132 -0
- package/dist/plugins/summarizers/json-summarizer.js.map +1 -0
- package/dist/plugins/summarizers/log-summarizer.d.ts +12 -0
- package/dist/plugins/summarizers/log-summarizer.d.ts.map +1 -0
- package/dist/plugins/summarizers/log-summarizer.js +173 -0
- package/dist/plugins/summarizers/log-summarizer.js.map +1 -0
- package/dist/plugins/summarizers/markdown-summarizer.d.ts +12 -0
- package/dist/plugins/summarizers/markdown-summarizer.d.ts.map +1 -0
- package/dist/plugins/summarizers/markdown-summarizer.js +75 -0
- package/dist/plugins/summarizers/markdown-summarizer.js.map +1 -0
- package/dist/plugins/summarizers/network-summarizer.d.ts +12 -0
- package/dist/plugins/summarizers/network-summarizer.d.ts.map +1 -0
- package/dist/plugins/summarizers/network-summarizer.js +74 -0
- package/dist/plugins/summarizers/network-summarizer.js.map +1 -0
- package/dist/plugins/summarizers/shell-summarizer.d.ts +12 -0
- package/dist/plugins/summarizers/shell-summarizer.d.ts.map +1 -0
- package/dist/plugins/summarizers/shell-summarizer.js +50 -0
- package/dist/plugins/summarizers/shell-summarizer.js.map +1 -0
- package/dist/plugins/summarizers/test-output-summarizer.d.ts +12 -0
- package/dist/plugins/summarizers/test-output-summarizer.d.ts.map +1 -0
- package/dist/plugins/summarizers/test-output-summarizer.js +77 -0
- package/dist/plugins/summarizers/test-output-summarizer.js.map +1 -0
- package/dist/plugins/summarizers/typescript-error-summarizer.d.ts +12 -0
- package/dist/plugins/summarizers/typescript-error-summarizer.d.ts.map +1 -0
- package/dist/plugins/summarizers/typescript-error-summarizer.js +67 -0
- package/dist/plugins/summarizers/typescript-error-summarizer.js.map +1 -0
- package/hooks/context-mem-hook.js +77 -0
- package/hooks/dashboard-autostart.js +92 -0
- package/hooks/dashboard-stop.js +32 -0
- package/hooks/hooks.json +40 -0
- 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 @@
|
|
|
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 @@
|
|
|
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"}
|