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,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 @@
|
|
|
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"}
|