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 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge-base.d.ts","sourceRoot":"","sources":["../../../src/plugins/knowledge/knowledge-base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAQ5F,qBAAa,aAAa;IACZ,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,aAAa;IAE1C,IAAI,CAAC,KAAK,EAAE;QACV,QAAQ,EAAE,iBAAiB,CAAC;QAC5B,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,GAAG,cAAc;IAsBlB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,QAAQ,CAAC,EAAE,iBAAiB,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,cAAc,EAAE;IA6BpG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAgBzC,KAAK,IAAI,MAAM;IAgCf,OAAO,CAAC,UAAU;IAsBlB,OAAO,CAAC,aAAa;IAuBrB,OAAO,CAAC,UAAU;IAqBlB,OAAO,CAAC,UAAU;CAoBnB"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.KnowledgeBase = void 0;
|
|
4
|
+
const utils_js_1 = require("../../core/utils.js");
|
|
5
|
+
// Use FTS5 query sanitization
|
|
6
|
+
function sanitizeFTS5(query) {
|
|
7
|
+
return query.replace(/[^\w\s]/g, ' ').trim();
|
|
8
|
+
}
|
|
9
|
+
class KnowledgeBase {
|
|
10
|
+
storage;
|
|
11
|
+
constructor(storage) {
|
|
12
|
+
this.storage = storage;
|
|
13
|
+
}
|
|
14
|
+
save(entry) {
|
|
15
|
+
const knowledge = {
|
|
16
|
+
id: (0, utils_js_1.ulid)(),
|
|
17
|
+
category: entry.category,
|
|
18
|
+
title: entry.title,
|
|
19
|
+
content: entry.content,
|
|
20
|
+
tags: entry.tags || [],
|
|
21
|
+
shareable: entry.shareable !== false,
|
|
22
|
+
relevance_score: 1.0,
|
|
23
|
+
access_count: 0,
|
|
24
|
+
created_at: Date.now(),
|
|
25
|
+
archived: false,
|
|
26
|
+
};
|
|
27
|
+
this.storage.exec('INSERT INTO knowledge (id, category, title, content, tags, shareable, relevance_score, access_count, created_at, archived) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', [knowledge.id, knowledge.category, knowledge.title, knowledge.content, JSON.stringify(knowledge.tags), knowledge.shareable ? 1 : 0, knowledge.relevance_score, knowledge.access_count, knowledge.created_at, knowledge.archived ? 1 : 0]);
|
|
28
|
+
return knowledge;
|
|
29
|
+
}
|
|
30
|
+
search(query, opts = {}) {
|
|
31
|
+
const limit = opts.limit || 10;
|
|
32
|
+
const sanitized = sanitizeFTS5(query);
|
|
33
|
+
if (!sanitized)
|
|
34
|
+
return [];
|
|
35
|
+
// Layer 1: FTS5 full-text search
|
|
36
|
+
let results = this.searchFTS5(sanitized, opts.category, limit);
|
|
37
|
+
// Layer 2: Trigram fallback if FTS5 yields nothing
|
|
38
|
+
if (results.length === 0) {
|
|
39
|
+
results = this.searchTrigram(sanitized, opts.category, limit);
|
|
40
|
+
}
|
|
41
|
+
// Layer 3: Scan fallback for very short or unusual queries
|
|
42
|
+
if (results.length === 0) {
|
|
43
|
+
results = this.searchScan(query, opts.category, limit);
|
|
44
|
+
}
|
|
45
|
+
// Increment access counts for results
|
|
46
|
+
for (const entry of results) {
|
|
47
|
+
this.storage.exec('UPDATE knowledge SET access_count = access_count + 1 WHERE id = ?', [entry.id]);
|
|
48
|
+
}
|
|
49
|
+
return results;
|
|
50
|
+
}
|
|
51
|
+
access(id) {
|
|
52
|
+
const row = this.storage.prepare('SELECT * FROM knowledge WHERE id = ? AND archived = 0').get(id);
|
|
53
|
+
if (!row)
|
|
54
|
+
return null;
|
|
55
|
+
// Increment access count
|
|
56
|
+
this.storage.exec('UPDATE knowledge SET access_count = access_count + 1 WHERE id = ?', [id]);
|
|
57
|
+
return this.rowToEntry(row);
|
|
58
|
+
}
|
|
59
|
+
prune() {
|
|
60
|
+
const NINETY_DAYS_MS = 90 * 24 * 60 * 60 * 1000;
|
|
61
|
+
const cutoff = Date.now() - NINETY_DAYS_MS;
|
|
62
|
+
// Calculate relevance for old entries and archive low-scoring ones
|
|
63
|
+
const oldEntries = this.storage.prepare('SELECT id, created_at, access_count FROM knowledge WHERE archived = 0 AND created_at < ?').all(cutoff);
|
|
64
|
+
let pruned = 0;
|
|
65
|
+
for (const entry of oldEntries) {
|
|
66
|
+
const weeksOld = (Date.now() - entry.created_at) / (7 * 24 * 60 * 60 * 1000);
|
|
67
|
+
const relevance = Math.pow(0.9, weeksOld) * Math.log2(entry.access_count + 1);
|
|
68
|
+
if (relevance < 0.1) {
|
|
69
|
+
this.storage.exec('UPDATE knowledge SET archived = 1, relevance_score = ? WHERE id = ?', [relevance, entry.id]);
|
|
70
|
+
pruned++;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
// Update relevance score
|
|
74
|
+
this.storage.exec('UPDATE knowledge SET relevance_score = ? WHERE id = ?', [relevance, entry.id]);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return pruned;
|
|
78
|
+
}
|
|
79
|
+
searchFTS5(query, category, limit) {
|
|
80
|
+
try {
|
|
81
|
+
let sql = `
|
|
82
|
+
SELECT k.* FROM knowledge_fts
|
|
83
|
+
JOIN knowledge k ON k.rowid = knowledge_fts.rowid
|
|
84
|
+
WHERE knowledge_fts MATCH ? AND k.archived = 0
|
|
85
|
+
`;
|
|
86
|
+
const params = [query];
|
|
87
|
+
if (category) {
|
|
88
|
+
sql += ' AND k.category = ?';
|
|
89
|
+
params.push(category);
|
|
90
|
+
}
|
|
91
|
+
sql += ' ORDER BY bm25(knowledge_fts) ASC LIMIT ?';
|
|
92
|
+
params.push(limit);
|
|
93
|
+
const rows = this.storage.prepare(sql).all(...params);
|
|
94
|
+
return rows.map(r => this.rowToEntry(r));
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return [];
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
searchTrigram(query, category, limit) {
|
|
101
|
+
if (query.length < 3)
|
|
102
|
+
return [];
|
|
103
|
+
try {
|
|
104
|
+
let sql = `
|
|
105
|
+
SELECT k.* FROM knowledge_trigram
|
|
106
|
+
JOIN knowledge k ON k.rowid = knowledge_trigram.rowid
|
|
107
|
+
WHERE knowledge_trigram MATCH ? AND k.archived = 0
|
|
108
|
+
`;
|
|
109
|
+
const params = [query];
|
|
110
|
+
if (category) {
|
|
111
|
+
sql += ' AND k.category = ?';
|
|
112
|
+
params.push(category);
|
|
113
|
+
}
|
|
114
|
+
sql += ' LIMIT ?';
|
|
115
|
+
params.push(limit);
|
|
116
|
+
const rows = this.storage.prepare(sql).all(...params);
|
|
117
|
+
return rows.map(r => this.rowToEntry(r));
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return [];
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
searchScan(query, category, limit) {
|
|
124
|
+
const lowerQuery = query.toLowerCase();
|
|
125
|
+
let sql = 'SELECT * FROM knowledge WHERE archived = 0';
|
|
126
|
+
const params = [];
|
|
127
|
+
if (category) {
|
|
128
|
+
sql += ' AND category = ?';
|
|
129
|
+
params.push(category);
|
|
130
|
+
}
|
|
131
|
+
sql += ' ORDER BY created_at DESC LIMIT 200';
|
|
132
|
+
const rows = this.storage.prepare(sql).all(...params);
|
|
133
|
+
return rows
|
|
134
|
+
.filter(r => {
|
|
135
|
+
const title = r.title.toLowerCase();
|
|
136
|
+
const content = r.content.toLowerCase();
|
|
137
|
+
return title.includes(lowerQuery) || content.includes(lowerQuery);
|
|
138
|
+
})
|
|
139
|
+
.slice(0, limit)
|
|
140
|
+
.map(r => this.rowToEntry(r));
|
|
141
|
+
}
|
|
142
|
+
rowToEntry(row) {
|
|
143
|
+
let tags = [];
|
|
144
|
+
try {
|
|
145
|
+
tags = JSON.parse(row.tags);
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
// invalid tags
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
id: row.id,
|
|
152
|
+
category: row.category,
|
|
153
|
+
title: row.title,
|
|
154
|
+
content: row.content,
|
|
155
|
+
tags,
|
|
156
|
+
shareable: !!row.shareable,
|
|
157
|
+
relevance_score: row.relevance_score,
|
|
158
|
+
access_count: row.access_count,
|
|
159
|
+
created_at: row.created_at,
|
|
160
|
+
archived: !!row.archived,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
exports.KnowledgeBase = KnowledgeBase;
|
|
165
|
+
//# sourceMappingURL=knowledge-base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge-base.js","sourceRoot":"","sources":["../../../src/plugins/knowledge/knowledge-base.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { PlatformAdapter, PluginConfig, HookConfig, MCPServerConfig, ToolNameMap } from '../../core/types.js';
|
|
2
|
+
export declare class ClaudeCodeAdapter implements PlatformAdapter {
|
|
3
|
+
name: string;
|
|
4
|
+
version: string;
|
|
5
|
+
type: "platform";
|
|
6
|
+
platform: string;
|
|
7
|
+
init(_config: PluginConfig): Promise<void>;
|
|
8
|
+
destroy(): Promise<void>;
|
|
9
|
+
detectPlatform(): boolean;
|
|
10
|
+
getHookFormat(): HookConfig;
|
|
11
|
+
getToolNames(): ToolNameMap;
|
|
12
|
+
wrapMCPServer(): MCPServerConfig;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=claude-code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../../src/plugins/platforms/claude-code.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEnH,qBAAa,iBAAkB,YAAW,eAAe;IACvD,IAAI,SAAyB;IAC7B,OAAO,SAAW;IAClB,IAAI,EAAG,UAAU,CAAU;IAC3B,QAAQ,SAAiB;IAEnB,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAE9B,cAAc,IAAI,OAAO;IAWzB,aAAa,IAAI,UAAU;IAQ3B,YAAY,IAAI,WAAW;IAa3B,aAAa,IAAI,eAAe;CAGjC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
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.ClaudeCodeAdapter = void 0;
|
|
7
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
class ClaudeCodeAdapter {
|
|
10
|
+
name = 'claude-code-adapter';
|
|
11
|
+
version = '1.0.0';
|
|
12
|
+
type = 'platform';
|
|
13
|
+
platform = 'claude-code';
|
|
14
|
+
async init(_config) { }
|
|
15
|
+
async destroy() { }
|
|
16
|
+
detectPlatform() {
|
|
17
|
+
// 1. Env var (most reliable)
|
|
18
|
+
if (process.env.CLAUDE_CODE_ENTRYPOINT)
|
|
19
|
+
return true;
|
|
20
|
+
// 2. .claude directory in project
|
|
21
|
+
try {
|
|
22
|
+
return node_fs_1.default.existsSync(node_path_1.default.join(process.cwd(), '.claude'));
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
getHookFormat() {
|
|
29
|
+
return {
|
|
30
|
+
type: 'subprocess',
|
|
31
|
+
hook_script: 'hooks/context-mem-hook.js',
|
|
32
|
+
settings_path: node_path_1.default.join(process.env.HOME || '~', '.claude', 'settings.json'),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
getToolNames() {
|
|
36
|
+
return {
|
|
37
|
+
observe: 'context_mem_observe',
|
|
38
|
+
summarize: 'context_mem_summarize',
|
|
39
|
+
search: 'context_mem_search',
|
|
40
|
+
timeline: 'context_mem_timeline',
|
|
41
|
+
get: 'context_mem_get',
|
|
42
|
+
stats: 'context_mem_stats',
|
|
43
|
+
configure: 'context_mem_configure',
|
|
44
|
+
execute: 'context_mem_execute',
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
wrapMCPServer() {
|
|
48
|
+
return { port: 0, transport: 'stdio' };
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.ClaudeCodeAdapter = ClaudeCodeAdapter;
|
|
52
|
+
//# sourceMappingURL=claude-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/plugins/platforms/claude-code.ts"],"names":[],"mappings":";;;;;;AAAA,sDAAyB;AACzB,0DAA6B;AAG7B,MAAa,iBAAiB;IAC5B,IAAI,GAAG,qBAAqB,CAAC;IAC7B,OAAO,GAAG,OAAO,CAAC;IAClB,IAAI,GAAG,UAAmB,CAAC;IAC3B,QAAQ,GAAG,aAAa,CAAC;IAEzB,KAAK,CAAC,IAAI,CAAC,OAAqB,IAAkB,CAAC;IACnD,KAAK,CAAC,OAAO,KAAmB,CAAC;IAEjC,cAAc;QACZ,6BAA6B;QAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB;YAAE,OAAO,IAAI,CAAC;QACpD,kCAAkC;QAClC,IAAI,CAAC;YACH,OAAO,iBAAE,CAAC,UAAU,CAAC,mBAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;QAC5D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,aAAa;QACX,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,2BAA2B;YACxC,aAAa,EAAE,mBAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,SAAS,EAAE,eAAe,CAAC;SAC9E,CAAC;IACJ,CAAC;IAED,YAAY;QACV,OAAO;YACL,OAAO,EAAE,qBAAqB;YAC9B,SAAS,EAAE,uBAAuB;YAClC,MAAM,EAAE,oBAAoB;YAC5B,QAAQ,EAAE,sBAAsB;YAChC,GAAG,EAAE,iBAAiB;YACtB,KAAK,EAAE,mBAAmB;YAC1B,SAAS,EAAE,uBAAuB;YAClC,OAAO,EAAE,qBAAqB;SAC/B,CAAC;IACJ,CAAC;IAED,aAAa;QACX,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IACzC,CAAC;CACF;AA5CD,8CA4CC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface PrivacyConfig {
|
|
2
|
+
strip_tags: boolean;
|
|
3
|
+
redact_patterns: string[];
|
|
4
|
+
}
|
|
5
|
+
export interface PrivacyResult {
|
|
6
|
+
cleaned: string;
|
|
7
|
+
redactions: number;
|
|
8
|
+
had_private_tags: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare class PrivacyEngine {
|
|
11
|
+
private config;
|
|
12
|
+
private compiledPatterns;
|
|
13
|
+
constructor(config: PrivacyConfig);
|
|
14
|
+
private static compilePattern;
|
|
15
|
+
process(content: string): PrivacyResult;
|
|
16
|
+
updateConfig(config: Partial<PrivacyConfig>): void;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=privacy-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"privacy-engine.d.ts","sourceRoot":"","sources":["../../../src/plugins/privacy/privacy-engine.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,gBAAgB,CAAW;gBAEvB,MAAM,EAAE,aAAa;IAKjC,OAAO,CAAC,MAAM,CAAC,cAAc;IAc7B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa;IA4CvC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI;CAOnD"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PrivacyEngine = void 0;
|
|
4
|
+
class PrivacyEngine {
|
|
5
|
+
config;
|
|
6
|
+
compiledPatterns;
|
|
7
|
+
constructor(config) {
|
|
8
|
+
this.config = config;
|
|
9
|
+
this.compiledPatterns = config.redact_patterns.map(p => PrivacyEngine.compilePattern(p));
|
|
10
|
+
}
|
|
11
|
+
static compilePattern(pattern) {
|
|
12
|
+
// Strip inline (?i) flag (case-insensitive already handled by 'i' in flags)
|
|
13
|
+
const normalized = pattern.replace(/^\(\?i\)/i, '');
|
|
14
|
+
const re = new RegExp(normalized, 'gi');
|
|
15
|
+
// ReDoS safety: test with a short probe to catch catastrophic backtracking
|
|
16
|
+
const probe = 'a'.repeat(25);
|
|
17
|
+
const start = Date.now();
|
|
18
|
+
re.test(probe);
|
|
19
|
+
if (Date.now() - start > 10) {
|
|
20
|
+
throw new Error(`Regex pattern "${pattern}" is too slow (potential ReDoS)`);
|
|
21
|
+
}
|
|
22
|
+
return re;
|
|
23
|
+
}
|
|
24
|
+
process(content) {
|
|
25
|
+
// Fast path: no stripping configured and no patterns
|
|
26
|
+
if (!this.config.strip_tags && this.compiledPatterns.length === 0) {
|
|
27
|
+
return { cleaned: content, redactions: 0, had_private_tags: false };
|
|
28
|
+
}
|
|
29
|
+
// Fast path: no tags present and no patterns to apply
|
|
30
|
+
if (this.compiledPatterns.length === 0 && !/<(?:private|redact)>/i.test(content)) {
|
|
31
|
+
return { cleaned: content, redactions: 0, had_private_tags: false };
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
let cleaned = content;
|
|
35
|
+
let redactions = 0;
|
|
36
|
+
let had_private_tags = false;
|
|
37
|
+
if (this.config.strip_tags) {
|
|
38
|
+
cleaned = cleaned.replace(/<private>[\s\S]*?<\/private>/gi, () => {
|
|
39
|
+
redactions++;
|
|
40
|
+
had_private_tags = true;
|
|
41
|
+
return '';
|
|
42
|
+
});
|
|
43
|
+
cleaned = cleaned.replace(/<redact>[\s\S]*?<\/redact>/gi, () => {
|
|
44
|
+
redactions++;
|
|
45
|
+
return '[REDACTED]';
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
for (const pattern of this.compiledPatterns) {
|
|
49
|
+
// Reset lastIndex for global regex (avoids stale state between calls)
|
|
50
|
+
pattern.lastIndex = 0;
|
|
51
|
+
cleaned = cleaned.replace(pattern, () => {
|
|
52
|
+
redactions++;
|
|
53
|
+
return '[REDACTED]';
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
return { cleaned, redactions, had_private_tags };
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
throw new Error('Privacy engine failed — content not stored');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
updateConfig(config) {
|
|
63
|
+
if (config.strip_tags !== undefined)
|
|
64
|
+
this.config.strip_tags = config.strip_tags;
|
|
65
|
+
if (config.redact_patterns) {
|
|
66
|
+
this.config.redact_patterns = config.redact_patterns;
|
|
67
|
+
this.compiledPatterns = config.redact_patterns.map(p => PrivacyEngine.compilePattern(p));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
exports.PrivacyEngine = PrivacyEngine;
|
|
72
|
+
//# sourceMappingURL=privacy-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"privacy-engine.js","sourceRoot":"","sources":["../../../src/plugins/privacy/privacy-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { RuntimePlugin, PluginConfig, ExecOpts, ExecResult } from '../../core/types.js';
|
|
2
|
+
export declare class JavaScriptRuntime 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=javascript.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"javascript.d.ts","sourceRoot":"","sources":["../../../src/plugins/runtimes/javascript.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAS7F,qBAAa,iBAAkB,YAAW,aAAa;IACrD,IAAI,SAAwB;IAC5B,OAAO,SAAW;IAClB,IAAI,EAAG,SAAS,CAAU;IAC1B,QAAQ,SAAgB;IACxB,UAAU,WAAmB;IAEvB,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAExB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAQ1B,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC;CA4CjE"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.JavaScriptRuntime = void 0;
|
|
37
|
+
const node_child_process_1 = require("node:child_process");
|
|
38
|
+
const node_fs_1 = __importStar(require("node:fs"));
|
|
39
|
+
const node_path_1 = require("node:path");
|
|
40
|
+
const node_os_1 = require("node:os");
|
|
41
|
+
const MAX_OUTPUT = 10000;
|
|
42
|
+
function truncate(s) {
|
|
43
|
+
if (s.length <= MAX_OUTPUT)
|
|
44
|
+
return { text: s, truncated: false };
|
|
45
|
+
return { text: s.slice(0, MAX_OUTPUT), truncated: true };
|
|
46
|
+
}
|
|
47
|
+
class JavaScriptRuntime {
|
|
48
|
+
name = 'javascript-runtime';
|
|
49
|
+
version = '1.0.0';
|
|
50
|
+
type = 'runtime';
|
|
51
|
+
language = 'javascript';
|
|
52
|
+
extensions = ['.js', '.mjs'];
|
|
53
|
+
async init(_config) { }
|
|
54
|
+
async destroy() { }
|
|
55
|
+
async detect() {
|
|
56
|
+
return new Promise(resolve => {
|
|
57
|
+
(0, node_child_process_1.execFile)('node', ['--version'], { timeout: 5000 }, err => {
|
|
58
|
+
resolve(err === null);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
async execute(code, opts) {
|
|
63
|
+
const timeout = opts.timeout ?? 10000;
|
|
64
|
+
const tmpDir = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'ctx-mem-js-'));
|
|
65
|
+
const tmpFile = (0, node_path_1.join)(tmpDir, 'script.js');
|
|
66
|
+
(0, node_fs_1.writeFileSync)(tmpFile, code, 'utf8');
|
|
67
|
+
const start = Date.now();
|
|
68
|
+
return new Promise(resolve => {
|
|
69
|
+
(0, node_child_process_1.execFile)('node', [tmpFile], { timeout, env: { ...process.env, ...(opts.env ?? {}) } }, (err, rawStdout, rawStderr) => {
|
|
70
|
+
const duration_ms = Date.now() - start;
|
|
71
|
+
const stdoutResult = truncate(rawStdout ?? '');
|
|
72
|
+
const stderrResult = truncate(rawStderr ?? '');
|
|
73
|
+
let exit_code = 0;
|
|
74
|
+
if (err) {
|
|
75
|
+
const spawnErr = err;
|
|
76
|
+
if (spawnErr.code === 'ETIMEDOUT') {
|
|
77
|
+
exit_code = 124;
|
|
78
|
+
}
|
|
79
|
+
else if (typeof spawnErr.code === 'number') {
|
|
80
|
+
exit_code = spawnErr.code;
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
exit_code = 1;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
node_fs_1.default.rmSync(tmpDir, { recursive: true, force: true });
|
|
88
|
+
}
|
|
89
|
+
catch { /* best-effort */ }
|
|
90
|
+
resolve({
|
|
91
|
+
stdout: stdoutResult.text,
|
|
92
|
+
stderr: stderrResult.text,
|
|
93
|
+
exit_code,
|
|
94
|
+
duration_ms,
|
|
95
|
+
truncated: stdoutResult.truncated || stderrResult.truncated,
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
exports.JavaScriptRuntime = JavaScriptRuntime;
|
|
102
|
+
//# sourceMappingURL=javascript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"javascript.js","sourceRoot":"","sources":["../../../src/plugins/runtimes/javascript.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { RuntimePlugin, PluginConfig, ExecOpts, ExecResult } from '../../core/types.js';
|
|
2
|
+
export declare class PythonRuntime implements RuntimePlugin {
|
|
3
|
+
name: string;
|
|
4
|
+
version: string;
|
|
5
|
+
type: "runtime";
|
|
6
|
+
language: string;
|
|
7
|
+
extensions: string[];
|
|
8
|
+
private executable;
|
|
9
|
+
init(_config: PluginConfig): Promise<void>;
|
|
10
|
+
destroy(): Promise<void>;
|
|
11
|
+
detect(): Promise<boolean>;
|
|
12
|
+
execute(code: string, opts: ExecOpts): Promise<ExecResult>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=python.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python.d.ts","sourceRoot":"","sources":["../../../src/plugins/runtimes/python.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAmB7F,qBAAa,aAAc,YAAW,aAAa;IACjD,IAAI,SAAoB;IACxB,OAAO,SAAW;IAClB,IAAI,EAAG,SAAS,CAAU;IAC1B,QAAQ,SAAY;IACpB,UAAU,WAAW;IAErB,OAAO,CAAC,UAAU,CAAuB;IAEnC,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAExB,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAS1B,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC;CA4DjE"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.PythonRuntime = void 0;
|
|
37
|
+
const node_child_process_1 = require("node:child_process");
|
|
38
|
+
const node_fs_1 = __importStar(require("node:fs"));
|
|
39
|
+
const node_path_1 = require("node:path");
|
|
40
|
+
const node_os_1 = require("node:os");
|
|
41
|
+
const MAX_OUTPUT = 10000;
|
|
42
|
+
function truncate(s) {
|
|
43
|
+
if (s.length <= MAX_OUTPUT)
|
|
44
|
+
return { text: s, truncated: false };
|
|
45
|
+
return { text: s.slice(0, MAX_OUTPUT), truncated: true };
|
|
46
|
+
}
|
|
47
|
+
async function detectExecutable(candidates) {
|
|
48
|
+
for (const candidate of candidates) {
|
|
49
|
+
const found = await new Promise(resolve => {
|
|
50
|
+
(0, node_child_process_1.execFile)(candidate, ['--version'], { timeout: 5000 }, err => resolve(err === null));
|
|
51
|
+
});
|
|
52
|
+
if (found)
|
|
53
|
+
return candidate;
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
class PythonRuntime {
|
|
58
|
+
name = 'python-runtime';
|
|
59
|
+
version = '1.0.0';
|
|
60
|
+
type = 'runtime';
|
|
61
|
+
language = 'python';
|
|
62
|
+
extensions = ['.py'];
|
|
63
|
+
executable = null;
|
|
64
|
+
async init(_config) { }
|
|
65
|
+
async destroy() { }
|
|
66
|
+
async detect() {
|
|
67
|
+
const exe = await detectExecutable(['python3', 'python']);
|
|
68
|
+
if (exe !== null) {
|
|
69
|
+
this.executable = exe;
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
async execute(code, opts) {
|
|
75
|
+
const timeout = opts.timeout ?? 10000;
|
|
76
|
+
// Lazily resolve executable if detect() was not called first
|
|
77
|
+
if (this.executable === null) {
|
|
78
|
+
this.executable = await detectExecutable(['python3', 'python']);
|
|
79
|
+
}
|
|
80
|
+
if (this.executable === null) {
|
|
81
|
+
return {
|
|
82
|
+
stdout: '',
|
|
83
|
+
stderr: 'python not found',
|
|
84
|
+
exit_code: 127,
|
|
85
|
+
duration_ms: 0,
|
|
86
|
+
truncated: false,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
const tmpDir = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), 'ctx-mem-py-'));
|
|
90
|
+
const tmpFile = (0, node_path_1.join)(tmpDir, 'script.py');
|
|
91
|
+
(0, node_fs_1.writeFileSync)(tmpFile, code, 'utf8');
|
|
92
|
+
const start = Date.now();
|
|
93
|
+
return new Promise(resolve => {
|
|
94
|
+
(0, node_child_process_1.execFile)(this.executable, [tmpFile], { timeout, env: { ...process.env, ...(opts.env ?? {}) } }, (err, rawStdout, rawStderr) => {
|
|
95
|
+
const duration_ms = Date.now() - start;
|
|
96
|
+
const stdoutResult = truncate(rawStdout ?? '');
|
|
97
|
+
const stderrResult = truncate(rawStderr ?? '');
|
|
98
|
+
let exit_code = 0;
|
|
99
|
+
if (err) {
|
|
100
|
+
const spawnErr = err;
|
|
101
|
+
if (spawnErr.code === 'ETIMEDOUT') {
|
|
102
|
+
exit_code = 124;
|
|
103
|
+
}
|
|
104
|
+
else if (typeof spawnErr.code === 'number') {
|
|
105
|
+
exit_code = spawnErr.code;
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
exit_code = 1;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
node_fs_1.default.rmSync(tmpDir, { recursive: true, force: true });
|
|
113
|
+
}
|
|
114
|
+
catch { /* best-effort */ }
|
|
115
|
+
resolve({
|
|
116
|
+
stdout: stdoutResult.text,
|
|
117
|
+
stderr: stderrResult.text,
|
|
118
|
+
exit_code,
|
|
119
|
+
duration_ms,
|
|
120
|
+
truncated: stdoutResult.truncated || stderrResult.truncated,
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
exports.PythonRuntime = PythonRuntime;
|
|
127
|
+
//# sourceMappingURL=python.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python.js","sourceRoot":"","sources":["../../../src/plugins/runtimes/python.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2DAA8C;AAC9C,mDAAyD;AACzD,yCAAiC;AACjC,qCAAiC;AAGjC,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,KAAK,UAAU,gBAAgB,CAAC,UAAoB;IAClD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,MAAM,IAAI,OAAO,CAAU,OAAO,CAAC,EAAE;YACjD,IAAA,6BAAQ,EAAC,SAAS,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;QACH,IAAI,KAAK;YAAE,OAAO,SAAS,CAAC;IAC9B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAa,aAAa;IACxB,IAAI,GAAG,gBAAgB,CAAC;IACxB,OAAO,GAAG,OAAO,CAAC;IAClB,IAAI,GAAG,SAAkB,CAAC;IAC1B,QAAQ,GAAG,QAAQ,CAAC;IACpB,UAAU,GAAG,CAAC,KAAK,CAAC,CAAC;IAEb,UAAU,GAAkB,IAAI,CAAC;IAEzC,KAAK,CAAC,IAAI,CAAC,OAAqB,IAAkB,CAAC;IACnD,KAAK,CAAC,OAAO,KAAmB,CAAC;IAEjC,KAAK,CAAC,MAAM;QACV,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC1D,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,IAAc;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC;QAEtC,6DAA6D;QAC7D,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YAC7B,IAAI,CAAC,UAAU,GAAG,MAAM,gBAAgB,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YAC7B,OAAO;gBACL,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,kBAAkB;gBAC1B,SAAS,EAAE,GAAG;gBACd,WAAW,EAAE,CAAC;gBACd,SAAS,EAAE,KAAK;aACjB,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,IAAA,qBAAW,EAAC,IAAA,gBAAI,EAAC,IAAA,gBAAM,GAAE,EAAE,aAAa,CAAC,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,IAAA,gBAAI,EAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAE1C,IAAA,uBAAa,EAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAErC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEzB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;YAC3B,IAAA,6BAAQ,EACN,IAAI,CAAC,UAAoB,EACzB,CAAC,OAAO,CAAC,EACT,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,IAAI,CAAC;oBAAC,iBAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;gBAExF,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;AAjFD,sCAiFC"}
|