context-mem 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/.context-mem.json.example +22 -0
  2. package/LICENSE +21 -0
  3. package/README.md +213 -0
  4. package/dist/cli/commands/dashboard.d.ts +2 -0
  5. package/dist/cli/commands/dashboard.d.ts.map +1 -0
  6. package/dist/cli/commands/dashboard.js +55 -0
  7. package/dist/cli/commands/dashboard.js.map +1 -0
  8. package/dist/cli/commands/doctor.d.ts +2 -0
  9. package/dist/cli/commands/doctor.d.ts.map +1 -0
  10. package/dist/cli/commands/doctor.js +49 -0
  11. package/dist/cli/commands/doctor.js.map +1 -0
  12. package/dist/cli/commands/init.d.ts +2 -0
  13. package/dist/cli/commands/init.d.ts.map +1 -0
  14. package/dist/cli/commands/init.js +43 -0
  15. package/dist/cli/commands/init.js.map +1 -0
  16. package/dist/cli/commands/serve.d.ts +2 -0
  17. package/dist/cli/commands/serve.d.ts.map +1 -0
  18. package/dist/cli/commands/serve.js +47 -0
  19. package/dist/cli/commands/serve.js.map +1 -0
  20. package/dist/cli/commands/status.d.ts +2 -0
  21. package/dist/cli/commands/status.d.ts.map +1 -0
  22. package/dist/cli/commands/status.js +29 -0
  23. package/dist/cli/commands/status.js.map +1 -0
  24. package/dist/cli/index.d.ts +3 -0
  25. package/dist/cli/index.d.ts.map +1 -0
  26. package/dist/cli/index.js +39 -0
  27. package/dist/cli/index.js.map +1 -0
  28. package/dist/core/budget.d.ts +11 -0
  29. package/dist/core/budget.d.ts.map +1 -0
  30. package/dist/core/budget.js +60 -0
  31. package/dist/core/budget.js.map +1 -0
  32. package/dist/core/config.d.ts +4 -0
  33. package/dist/core/config.d.ts.map +1 -0
  34. package/dist/core/config.js +41 -0
  35. package/dist/core/config.js.map +1 -0
  36. package/dist/core/events.d.ts +19 -0
  37. package/dist/core/events.d.ts.map +1 -0
  38. package/dist/core/events.js +101 -0
  39. package/dist/core/events.js.map +1 -0
  40. package/dist/core/kernel.d.ts +46 -0
  41. package/dist/core/kernel.d.ts.map +1 -0
  42. package/dist/core/kernel.js +228 -0
  43. package/dist/core/kernel.js.map +1 -0
  44. package/dist/core/lifecycle.d.ts +19 -0
  45. package/dist/core/lifecycle.d.ts.map +1 -0
  46. package/dist/core/lifecycle.js +35 -0
  47. package/dist/core/lifecycle.js.map +1 -0
  48. package/dist/core/observe-queue.d.ts +18 -0
  49. package/dist/core/observe-queue.d.ts.map +1 -0
  50. package/dist/core/observe-queue.js +56 -0
  51. package/dist/core/observe-queue.js.map +1 -0
  52. package/dist/core/pipeline.d.ts +15 -0
  53. package/dist/core/pipeline.d.ts.map +1 -0
  54. package/dist/core/pipeline.js +114 -0
  55. package/dist/core/pipeline.js.map +1 -0
  56. package/dist/core/plugin-registry.d.ts +13 -0
  57. package/dist/core/plugin-registry.d.ts.map +1 -0
  58. package/dist/core/plugin-registry.js +67 -0
  59. package/dist/core/plugin-registry.js.map +1 -0
  60. package/dist/core/session.d.ts +14 -0
  61. package/dist/core/session.d.ts.map +1 -0
  62. package/dist/core/session.js +95 -0
  63. package/dist/core/session.js.map +1 -0
  64. package/dist/core/truncation.d.ts +11 -0
  65. package/dist/core/truncation.d.ts.map +1 -0
  66. package/dist/core/truncation.js +143 -0
  67. package/dist/core/truncation.js.map +1 -0
  68. package/dist/core/types.d.ts +230 -0
  69. package/dist/core/types.d.ts.map +1 -0
  70. package/dist/core/types.js +50 -0
  71. package/dist/core/types.js.map +1 -0
  72. package/dist/core/utils.d.ts +4 -0
  73. package/dist/core/utils.d.ts.map +1 -0
  74. package/dist/core/utils.js +57 -0
  75. package/dist/core/utils.js.map +1 -0
  76. package/dist/index.d.ts +12 -0
  77. package/dist/index.d.ts.map +1 -0
  78. package/dist/index.js +27 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/mcp-server/server.d.ts +5 -0
  81. package/dist/mcp-server/server.d.ts.map +1 -0
  82. package/dist/mcp-server/server.js +101 -0
  83. package/dist/mcp-server/server.js.map +1 -0
  84. package/dist/mcp-server/tools.d.ts +201 -0
  85. package/dist/mcp-server/tools.d.ts.map +1 -0
  86. package/dist/mcp-server/tools.js +618 -0
  87. package/dist/mcp-server/tools.js.map +1 -0
  88. package/dist/plugins/knowledge/knowledge-base.d.ts +23 -0
  89. package/dist/plugins/knowledge/knowledge-base.d.ts.map +1 -0
  90. package/dist/plugins/knowledge/knowledge-base.js +165 -0
  91. package/dist/plugins/knowledge/knowledge-base.js.map +1 -0
  92. package/dist/plugins/platforms/claude-code.d.ts +14 -0
  93. package/dist/plugins/platforms/claude-code.d.ts.map +1 -0
  94. package/dist/plugins/platforms/claude-code.js +52 -0
  95. package/dist/plugins/platforms/claude-code.js.map +1 -0
  96. package/dist/plugins/privacy/privacy-engine.d.ts +18 -0
  97. package/dist/plugins/privacy/privacy-engine.d.ts.map +1 -0
  98. package/dist/plugins/privacy/privacy-engine.js +72 -0
  99. package/dist/plugins/privacy/privacy-engine.js.map +1 -0
  100. package/dist/plugins/runtimes/javascript.d.ts +13 -0
  101. package/dist/plugins/runtimes/javascript.d.ts.map +1 -0
  102. package/dist/plugins/runtimes/javascript.js +102 -0
  103. package/dist/plugins/runtimes/javascript.js.map +1 -0
  104. package/dist/plugins/runtimes/python.d.ts +14 -0
  105. package/dist/plugins/runtimes/python.d.ts.map +1 -0
  106. package/dist/plugins/runtimes/python.js +127 -0
  107. package/dist/plugins/runtimes/python.js.map +1 -0
  108. package/dist/plugins/runtimes/shell.d.ts +13 -0
  109. package/dist/plugins/runtimes/shell.d.ts.map +1 -0
  110. package/dist/plugins/runtimes/shell.js +55 -0
  111. package/dist/plugins/runtimes/shell.js.map +1 -0
  112. package/dist/plugins/search/bm25.d.ts +16 -0
  113. package/dist/plugins/search/bm25.d.ts.map +1 -0
  114. package/dist/plugins/search/bm25.js +61 -0
  115. package/dist/plugins/search/bm25.js.map +1 -0
  116. package/dist/plugins/search/fts5-utils.d.ts +2 -0
  117. package/dist/plugins/search/fts5-utils.d.ts.map +1 -0
  118. package/dist/plugins/search/fts5-utils.js +12 -0
  119. package/dist/plugins/search/fts5-utils.js.map +1 -0
  120. package/dist/plugins/search/fusion.d.ts +9 -0
  121. package/dist/plugins/search/fusion.d.ts.map +1 -0
  122. package/dist/plugins/search/fusion.js +45 -0
  123. package/dist/plugins/search/fusion.js.map +1 -0
  124. package/dist/plugins/search/intent.d.ts +5 -0
  125. package/dist/plugins/search/intent.d.ts.map +1 -0
  126. package/dist/plugins/search/intent.js +49 -0
  127. package/dist/plugins/search/intent.js.map +1 -0
  128. package/dist/plugins/search/levenshtein.d.ts +17 -0
  129. package/dist/plugins/search/levenshtein.d.ts.map +1 -0
  130. package/dist/plugins/search/levenshtein.js +99 -0
  131. package/dist/plugins/search/levenshtein.js.map +1 -0
  132. package/dist/plugins/search/trigram.d.ts +16 -0
  133. package/dist/plugins/search/trigram.d.ts.map +1 -0
  134. package/dist/plugins/search/trigram.js +63 -0
  135. package/dist/plugins/search/trigram.js.map +1 -0
  136. package/dist/plugins/storage/better-sqlite3.d.ts +19 -0
  137. package/dist/plugins/storage/better-sqlite3.d.ts.map +1 -0
  138. package/dist/plugins/storage/better-sqlite3.js +82 -0
  139. package/dist/plugins/storage/better-sqlite3.js.map +1 -0
  140. package/dist/plugins/storage/content-store.d.ts +20 -0
  141. package/dist/plugins/storage/content-store.d.ts.map +1 -0
  142. package/dist/plugins/storage/content-store.js +187 -0
  143. package/dist/plugins/storage/content-store.js.map +1 -0
  144. package/dist/plugins/storage/migrations.d.ts +8 -0
  145. package/dist/plugins/storage/migrations.d.ts.map +1 -0
  146. package/dist/plugins/storage/migrations.js +252 -0
  147. package/dist/plugins/storage/migrations.js.map +1 -0
  148. package/dist/plugins/summarizers/binary-summarizer.d.ts +12 -0
  149. package/dist/plugins/summarizers/binary-summarizer.d.ts.map +1 -0
  150. package/dist/plugins/summarizers/binary-summarizer.js +43 -0
  151. package/dist/plugins/summarizers/binary-summarizer.js.map +1 -0
  152. package/dist/plugins/summarizers/build-output-summarizer.d.ts +12 -0
  153. package/dist/plugins/summarizers/build-output-summarizer.d.ts.map +1 -0
  154. package/dist/plugins/summarizers/build-output-summarizer.js +68 -0
  155. package/dist/plugins/summarizers/build-output-summarizer.js.map +1 -0
  156. package/dist/plugins/summarizers/code-summarizer.d.ts +12 -0
  157. package/dist/plugins/summarizers/code-summarizer.d.ts.map +1 -0
  158. package/dist/plugins/summarizers/code-summarizer.js +179 -0
  159. package/dist/plugins/summarizers/code-summarizer.js.map +1 -0
  160. package/dist/plugins/summarizers/csv-summarizer.d.ts +12 -0
  161. package/dist/plugins/summarizers/csv-summarizer.d.ts.map +1 -0
  162. package/dist/plugins/summarizers/csv-summarizer.js +60 -0
  163. package/dist/plugins/summarizers/csv-summarizer.js.map +1 -0
  164. package/dist/plugins/summarizers/error-summarizer.d.ts +15 -0
  165. package/dist/plugins/summarizers/error-summarizer.d.ts.map +1 -0
  166. package/dist/plugins/summarizers/error-summarizer.js +111 -0
  167. package/dist/plugins/summarizers/error-summarizer.js.map +1 -0
  168. package/dist/plugins/summarizers/git-log-summarizer.d.ts +12 -0
  169. package/dist/plugins/summarizers/git-log-summarizer.d.ts.map +1 -0
  170. package/dist/plugins/summarizers/git-log-summarizer.js +76 -0
  171. package/dist/plugins/summarizers/git-log-summarizer.js.map +1 -0
  172. package/dist/plugins/summarizers/html-summarizer.d.ts +12 -0
  173. package/dist/plugins/summarizers/html-summarizer.d.ts.map +1 -0
  174. package/dist/plugins/summarizers/html-summarizer.js +69 -0
  175. package/dist/plugins/summarizers/html-summarizer.js.map +1 -0
  176. package/dist/plugins/summarizers/json-summarizer.d.ts +12 -0
  177. package/dist/plugins/summarizers/json-summarizer.d.ts.map +1 -0
  178. package/dist/plugins/summarizers/json-summarizer.js +132 -0
  179. package/dist/plugins/summarizers/json-summarizer.js.map +1 -0
  180. package/dist/plugins/summarizers/log-summarizer.d.ts +12 -0
  181. package/dist/plugins/summarizers/log-summarizer.d.ts.map +1 -0
  182. package/dist/plugins/summarizers/log-summarizer.js +173 -0
  183. package/dist/plugins/summarizers/log-summarizer.js.map +1 -0
  184. package/dist/plugins/summarizers/markdown-summarizer.d.ts +12 -0
  185. package/dist/plugins/summarizers/markdown-summarizer.d.ts.map +1 -0
  186. package/dist/plugins/summarizers/markdown-summarizer.js +75 -0
  187. package/dist/plugins/summarizers/markdown-summarizer.js.map +1 -0
  188. package/dist/plugins/summarizers/network-summarizer.d.ts +12 -0
  189. package/dist/plugins/summarizers/network-summarizer.d.ts.map +1 -0
  190. package/dist/plugins/summarizers/network-summarizer.js +74 -0
  191. package/dist/plugins/summarizers/network-summarizer.js.map +1 -0
  192. package/dist/plugins/summarizers/shell-summarizer.d.ts +12 -0
  193. package/dist/plugins/summarizers/shell-summarizer.d.ts.map +1 -0
  194. package/dist/plugins/summarizers/shell-summarizer.js +50 -0
  195. package/dist/plugins/summarizers/shell-summarizer.js.map +1 -0
  196. package/dist/plugins/summarizers/test-output-summarizer.d.ts +12 -0
  197. package/dist/plugins/summarizers/test-output-summarizer.d.ts.map +1 -0
  198. package/dist/plugins/summarizers/test-output-summarizer.js +77 -0
  199. package/dist/plugins/summarizers/test-output-summarizer.js.map +1 -0
  200. package/dist/plugins/summarizers/typescript-error-summarizer.d.ts +12 -0
  201. package/dist/plugins/summarizers/typescript-error-summarizer.d.ts.map +1 -0
  202. package/dist/plugins/summarizers/typescript-error-summarizer.js +67 -0
  203. package/dist/plugins/summarizers/typescript-error-summarizer.js.map +1 -0
  204. package/hooks/context-mem-hook.js +77 -0
  205. package/hooks/dashboard-autostart.js +92 -0
  206. package/hooks/dashboard-stop.js +32 -0
  207. package/hooks/hooks.json +40 -0
  208. package/package.json +32 -0
@@ -0,0 +1 @@
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":"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"}