context-gatekeeper 0.3.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 (305) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +774 -0
  3. package/README.zh.md +765 -0
  4. package/bin/context-gatekeeper-cli.js +60 -0
  5. package/dist/api/gdpr.d.ts +104 -0
  6. package/dist/api/gdpr.d.ts.map +1 -0
  7. package/dist/api/gdpr.js +229 -0
  8. package/dist/api/gdpr.js.map +1 -0
  9. package/dist/api/health-check.d.ts +13 -0
  10. package/dist/api/health-check.d.ts.map +1 -0
  11. package/dist/api/health-check.js +2 -0
  12. package/dist/api/health-check.js.map +1 -0
  13. package/dist/api/index.d.ts +7 -0
  14. package/dist/api/index.d.ts.map +1 -0
  15. package/dist/api/index.js +8 -0
  16. package/dist/api/index.js.map +1 -0
  17. package/dist/api/observability.d.ts +39 -0
  18. package/dist/api/observability.d.ts.map +1 -0
  19. package/dist/api/observability.js +132 -0
  20. package/dist/api/observability.js.map +1 -0
  21. package/dist/api/session-manager.d.ts +41 -0
  22. package/dist/api/session-manager.d.ts.map +1 -0
  23. package/dist/api/session-manager.js +129 -0
  24. package/dist/api/session-manager.js.map +1 -0
  25. package/dist/index.d.ts +2 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +7 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/mcp/server.d.ts +8 -0
  30. package/dist/mcp/server.d.ts.map +1 -0
  31. package/dist/mcp/server.js +613 -0
  32. package/dist/mcp/server.js.map +1 -0
  33. package/dist/mcp/tools/configure-llm.d.ts +26 -0
  34. package/dist/mcp/tools/configure-llm.d.ts.map +1 -0
  35. package/dist/mcp/tools/configure-llm.js +32 -0
  36. package/dist/mcp/tools/configure-llm.js.map +1 -0
  37. package/dist/mcp/tools/context-compress.d.ts +15 -0
  38. package/dist/mcp/tools/context-compress.d.ts.map +1 -0
  39. package/dist/mcp/tools/context-compress.js +15 -0
  40. package/dist/mcp/tools/context-compress.js.map +1 -0
  41. package/dist/mcp/tools/dual-mode-execute.d.ts +78 -0
  42. package/dist/mcp/tools/dual-mode-execute.d.ts.map +1 -0
  43. package/dist/mcp/tools/dual-mode-execute.js +299 -0
  44. package/dist/mcp/tools/dual-mode-execute.js.map +1 -0
  45. package/dist/mcp/tools/index.d.ts +19 -0
  46. package/dist/mcp/tools/index.d.ts.map +1 -0
  47. package/dist/mcp/tools/index.js +20 -0
  48. package/dist/mcp/tools/index.js.map +1 -0
  49. package/dist/mcp/tools/intelligent-recall.d.ts +67 -0
  50. package/dist/mcp/tools/intelligent-recall.d.ts.map +1 -0
  51. package/dist/mcp/tools/intelligent-recall.js +208 -0
  52. package/dist/mcp/tools/intelligent-recall.js.map +1 -0
  53. package/dist/mcp/tools/memory-anchor.d.ts +13 -0
  54. package/dist/mcp/tools/memory-anchor.d.ts.map +1 -0
  55. package/dist/mcp/tools/memory-anchor.js +16 -0
  56. package/dist/mcp/tools/memory-anchor.js.map +1 -0
  57. package/dist/mcp/tools/memory-delete-batch.d.ts +16 -0
  58. package/dist/mcp/tools/memory-delete-batch.d.ts.map +1 -0
  59. package/dist/mcp/tools/memory-delete-batch.js +26 -0
  60. package/dist/mcp/tools/memory-delete-batch.js.map +1 -0
  61. package/dist/mcp/tools/memory-extract.d.ts +68 -0
  62. package/dist/mcp/tools/memory-extract.d.ts.map +1 -0
  63. package/dist/mcp/tools/memory-extract.js +280 -0
  64. package/dist/mcp/tools/memory-extract.js.map +1 -0
  65. package/dist/mcp/tools/memory-recall.d.ts +42 -0
  66. package/dist/mcp/tools/memory-recall.d.ts.map +1 -0
  67. package/dist/mcp/tools/memory-recall.js +37 -0
  68. package/dist/mcp/tools/memory-recall.js.map +1 -0
  69. package/dist/mcp/tools/memory-report-usage.d.ts +17 -0
  70. package/dist/mcp/tools/memory-report-usage.d.ts.map +1 -0
  71. package/dist/mcp/tools/memory-report-usage.js +15 -0
  72. package/dist/mcp/tools/memory-report-usage.js.map +1 -0
  73. package/dist/mcp/tools/memory-search.d.ts +43 -0
  74. package/dist/mcp/tools/memory-search.d.ts.map +1 -0
  75. package/dist/mcp/tools/memory-search.js +38 -0
  76. package/dist/mcp/tools/memory-search.js.map +1 -0
  77. package/dist/mcp/tools/memory-session.d.ts +118 -0
  78. package/dist/mcp/tools/memory-session.d.ts.map +1 -0
  79. package/dist/mcp/tools/memory-session.js +113 -0
  80. package/dist/mcp/tools/memory-session.js.map +1 -0
  81. package/dist/mcp/tools/memory-stats.d.ts +10 -0
  82. package/dist/mcp/tools/memory-stats.d.ts.map +1 -0
  83. package/dist/mcp/tools/memory-stats.js +35 -0
  84. package/dist/mcp/tools/memory-stats.js.map +1 -0
  85. package/dist/mcp/tools/memory-store-batch.d.ts +49 -0
  86. package/dist/mcp/tools/memory-store-batch.d.ts.map +1 -0
  87. package/dist/mcp/tools/memory-store-batch.js +48 -0
  88. package/dist/mcp/tools/memory-store-batch.js.map +1 -0
  89. package/dist/mcp/tools/memory-store.d.ts +37 -0
  90. package/dist/mcp/tools/memory-store.d.ts.map +1 -0
  91. package/dist/mcp/tools/memory-store.js +34 -0
  92. package/dist/mcp/tools/memory-store.js.map +1 -0
  93. package/dist/mcp/tools/project-create.d.ts +16 -0
  94. package/dist/mcp/tools/project-create.d.ts.map +1 -0
  95. package/dist/mcp/tools/project-create.js +14 -0
  96. package/dist/mcp/tools/project-create.js.map +1 -0
  97. package/dist/models/types.d.ts +88 -0
  98. package/dist/models/types.d.ts.map +1 -0
  99. package/dist/models/types.js +19 -0
  100. package/dist/models/types.js.map +1 -0
  101. package/dist/schema/compression.d.ts +7 -0
  102. package/dist/schema/compression.d.ts.map +1 -0
  103. package/dist/schema/compression.js +66 -0
  104. package/dist/schema/compression.js.map +1 -0
  105. package/dist/schema/fulltext-search.d.ts +10 -0
  106. package/dist/schema/fulltext-search.d.ts.map +1 -0
  107. package/dist/schema/fulltext-search.js +73 -0
  108. package/dist/schema/fulltext-search.js.map +1 -0
  109. package/dist/schema/index.d.ts +9 -0
  110. package/dist/schema/index.d.ts.map +1 -0
  111. package/dist/schema/index.js +9 -0
  112. package/dist/schema/index.js.map +1 -0
  113. package/dist/schema/knowledge-graph.d.ts +108 -0
  114. package/dist/schema/knowledge-graph.d.ts.map +1 -0
  115. package/dist/schema/knowledge-graph.js +372 -0
  116. package/dist/schema/knowledge-graph.js.map +1 -0
  117. package/dist/schema/memory-session.d.ts +62 -0
  118. package/dist/schema/memory-session.d.ts.map +1 -0
  119. package/dist/schema/memory-session.js +258 -0
  120. package/dist/schema/memory-session.js.map +1 -0
  121. package/dist/schema/memory.d.ts +84 -0
  122. package/dist/schema/memory.d.ts.map +1 -0
  123. package/dist/schema/memory.js +622 -0
  124. package/dist/schema/memory.js.map +1 -0
  125. package/dist/schema/project.d.ts +8 -0
  126. package/dist/schema/project.d.ts.map +1 -0
  127. package/dist/schema/project.js +68 -0
  128. package/dist/schema/project.js.map +1 -0
  129. package/dist/schema/schema-init.d.ts +2 -0
  130. package/dist/schema/schema-init.d.ts.map +1 -0
  131. package/dist/schema/schema-init.js +199 -0
  132. package/dist/schema/schema-init.js.map +1 -0
  133. package/dist/schema/vector-index.d.ts +28 -0
  134. package/dist/schema/vector-index.d.ts.map +1 -0
  135. package/dist/schema/vector-index.js +179 -0
  136. package/dist/schema/vector-index.js.map +1 -0
  137. package/dist/scripts/agents/base.d.ts +89 -0
  138. package/dist/scripts/agents/base.d.ts.map +1 -0
  139. package/dist/scripts/agents/base.js +148 -0
  140. package/dist/scripts/agents/base.js.map +1 -0
  141. package/dist/scripts/agents/base.ts +193 -0
  142. package/dist/scripts/agents/claude-code.d.ts +21 -0
  143. package/dist/scripts/agents/claude-code.d.ts.map +1 -0
  144. package/dist/scripts/agents/claude-code.js +33 -0
  145. package/dist/scripts/agents/claude-code.js.map +1 -0
  146. package/dist/scripts/agents/claude-code.ts +36 -0
  147. package/dist/scripts/agents/claude-desktop.d.ts +25 -0
  148. package/dist/scripts/agents/claude-desktop.d.ts.map +1 -0
  149. package/dist/scripts/agents/claude-desktop.js +36 -0
  150. package/dist/scripts/agents/claude-desktop.js.map +1 -0
  151. package/dist/scripts/agents/claude-desktop.ts +39 -0
  152. package/dist/scripts/agents/cline.d.ts +22 -0
  153. package/dist/scripts/agents/cline.d.ts.map +1 -0
  154. package/dist/scripts/agents/cline.js +35 -0
  155. package/dist/scripts/agents/cline.js.map +1 -0
  156. package/dist/scripts/agents/cline.ts +38 -0
  157. package/dist/scripts/agents/continue.d.ts +20 -0
  158. package/dist/scripts/agents/continue.d.ts.map +1 -0
  159. package/dist/scripts/agents/continue.js +35 -0
  160. package/dist/scripts/agents/continue.js.map +1 -0
  161. package/dist/scripts/agents/continue.ts +38 -0
  162. package/dist/scripts/agents/cursor.d.ts +27 -0
  163. package/dist/scripts/agents/cursor.d.ts.map +1 -0
  164. package/dist/scripts/agents/cursor.js +38 -0
  165. package/dist/scripts/agents/cursor.js.map +1 -0
  166. package/dist/scripts/agents/cursor.ts +41 -0
  167. package/dist/scripts/cli/config-gen.d.ts +59 -0
  168. package/dist/scripts/cli/config-gen.d.ts.map +1 -0
  169. package/dist/scripts/cli/config-gen.js +156 -0
  170. package/dist/scripts/cli/config-gen.js.map +1 -0
  171. package/dist/scripts/cli/config-gen.ts +164 -0
  172. package/dist/scripts/cli/detect.d.ts +42 -0
  173. package/dist/scripts/cli/detect.d.ts.map +1 -0
  174. package/dist/scripts/cli/detect.js +131 -0
  175. package/dist/scripts/cli/detect.js.map +1 -0
  176. package/dist/scripts/cli/detect.ts +162 -0
  177. package/dist/scripts/cli/install.d.ts +31 -0
  178. package/dist/scripts/cli/install.d.ts.map +1 -0
  179. package/dist/scripts/cli/install.js +125 -0
  180. package/dist/scripts/cli/install.js.map +1 -0
  181. package/dist/scripts/cli/install.ts +157 -0
  182. package/dist/scripts/cli/status.d.ts +8 -0
  183. package/dist/scripts/cli/status.d.ts.map +1 -0
  184. package/dist/scripts/cli/status.js +39 -0
  185. package/dist/scripts/cli/status.js.map +1 -0
  186. package/dist/scripts/cli/status.ts +48 -0
  187. package/dist/scripts/cli/uninstall.d.ts +22 -0
  188. package/dist/scripts/cli/uninstall.d.ts.map +1 -0
  189. package/dist/scripts/cli/uninstall.js +141 -0
  190. package/dist/scripts/cli/uninstall.js.map +1 -0
  191. package/dist/scripts/cli/uninstall.ts +157 -0
  192. package/dist/scripts/cli.d.ts +23 -0
  193. package/dist/scripts/cli.d.ts.map +1 -0
  194. package/dist/scripts/cli.js +166 -0
  195. package/dist/scripts/cli.js.map +1 -0
  196. package/dist/scripts/cli.ts +173 -0
  197. package/dist/services/classifier/index.d.ts +36 -0
  198. package/dist/services/classifier/index.d.ts.map +1 -0
  199. package/dist/services/classifier/index.js +104 -0
  200. package/dist/services/classifier/index.js.map +1 -0
  201. package/dist/services/classifier/llm.d.ts +37 -0
  202. package/dist/services/classifier/llm.d.ts.map +1 -0
  203. package/dist/services/classifier/llm.js +119 -0
  204. package/dist/services/classifier/llm.js.map +1 -0
  205. package/dist/services/classifier/rules.d.ts +22 -0
  206. package/dist/services/classifier/rules.d.ts.map +1 -0
  207. package/dist/services/classifier/rules.js +98 -0
  208. package/dist/services/classifier/rules.js.map +1 -0
  209. package/dist/services/compressor/index.d.ts +3 -0
  210. package/dist/services/compressor/index.d.ts.map +1 -0
  211. package/dist/services/compressor/index.js +3 -0
  212. package/dist/services/compressor/index.js.map +1 -0
  213. package/dist/services/compressor/threshold.d.ts +35 -0
  214. package/dist/services/compressor/threshold.d.ts.map +1 -0
  215. package/dist/services/compressor/threshold.js +60 -0
  216. package/dist/services/compressor/threshold.js.map +1 -0
  217. package/dist/services/compressor/trigger.d.ts +24 -0
  218. package/dist/services/compressor/trigger.d.ts.map +1 -0
  219. package/dist/services/compressor/trigger.js +91 -0
  220. package/dist/services/compressor/trigger.js.map +1 -0
  221. package/dist/services/constraint-extractor.d.ts +25 -0
  222. package/dist/services/constraint-extractor.d.ts.map +1 -0
  223. package/dist/services/constraint-extractor.js +97 -0
  224. package/dist/services/constraint-extractor.js.map +1 -0
  225. package/dist/services/database-health.d.ts +22 -0
  226. package/dist/services/database-health.d.ts.map +1 -0
  227. package/dist/services/database-health.js +122 -0
  228. package/dist/services/database-health.js.map +1 -0
  229. package/dist/services/embedding-fixed.d.ts +9 -0
  230. package/dist/services/embedding-fixed.d.ts.map +1 -0
  231. package/dist/services/embedding-fixed.js +70 -0
  232. package/dist/services/embedding-fixed.js.map +1 -0
  233. package/dist/services/embedding-provider.d.ts +79 -0
  234. package/dist/services/embedding-provider.d.ts.map +1 -0
  235. package/dist/services/embedding-provider.js +229 -0
  236. package/dist/services/embedding-provider.js.map +1 -0
  237. package/dist/services/embedding.d.ts +17 -0
  238. package/dist/services/embedding.d.ts.map +1 -0
  239. package/dist/services/embedding.js +99 -0
  240. package/dist/services/embedding.js.map +1 -0
  241. package/dist/services/hnsw-index.d.ts +76 -0
  242. package/dist/services/hnsw-index.d.ts.map +1 -0
  243. package/dist/services/hnsw-index.js +301 -0
  244. package/dist/services/hnsw-index.js.map +1 -0
  245. package/dist/services/llm.d.ts +39 -0
  246. package/dist/services/llm.d.ts.map +1 -0
  247. package/dist/services/llm.js +207 -0
  248. package/dist/services/llm.js.map +1 -0
  249. package/dist/services/memory-tiers.d.ts +75 -0
  250. package/dist/services/memory-tiers.d.ts.map +1 -0
  251. package/dist/services/memory-tiers.js +275 -0
  252. package/dist/services/memory-tiers.js.map +1 -0
  253. package/dist/services/memory.d.ts +33 -0
  254. package/dist/services/memory.d.ts.map +1 -0
  255. package/dist/services/memory.js +209 -0
  256. package/dist/services/memory.js.map +1 -0
  257. package/dist/services/multi-agent-sharing.d.ts +83 -0
  258. package/dist/services/multi-agent-sharing.d.ts.map +1 -0
  259. package/dist/services/multi-agent-sharing.js +278 -0
  260. package/dist/services/multi-agent-sharing.js.map +1 -0
  261. package/dist/services/reranker.d.ts +88 -0
  262. package/dist/services/reranker.d.ts.map +1 -0
  263. package/dist/services/reranker.js +234 -0
  264. package/dist/services/reranker.js.map +1 -0
  265. package/dist/services/triple-extractor.d.ts +35 -0
  266. package/dist/services/triple-extractor.d.ts.map +1 -0
  267. package/dist/services/triple-extractor.js +293 -0
  268. package/dist/services/triple-extractor.js.map +1 -0
  269. package/dist/services/vector-provider.d.ts +40 -0
  270. package/dist/services/vector-provider.d.ts.map +1 -0
  271. package/dist/services/vector-provider.js +225 -0
  272. package/dist/services/vector-provider.js.map +1 -0
  273. package/dist/utils/after-chain-executor.d.ts +26 -0
  274. package/dist/utils/after-chain-executor.d.ts.map +1 -0
  275. package/dist/utils/after-chain-executor.js +135 -0
  276. package/dist/utils/after-chain-executor.js.map +1 -0
  277. package/dist/utils/after-chain.d.ts +94 -0
  278. package/dist/utils/after-chain.d.ts.map +1 -0
  279. package/dist/utils/after-chain.js +155 -0
  280. package/dist/utils/after-chain.js.map +1 -0
  281. package/dist/utils/db.d.ts +29 -0
  282. package/dist/utils/db.d.ts.map +1 -0
  283. package/dist/utils/db.js +201 -0
  284. package/dist/utils/db.js.map +1 -0
  285. package/dist/utils/encryption.d.ts +87 -0
  286. package/dist/utils/encryption.d.ts.map +1 -0
  287. package/dist/utils/encryption.js +175 -0
  288. package/dist/utils/encryption.js.map +1 -0
  289. package/dist/utils/errors.d.ts +35 -0
  290. package/dist/utils/errors.d.ts.map +1 -0
  291. package/dist/utils/errors.js +56 -0
  292. package/dist/utils/errors.js.map +1 -0
  293. package/dist/utils/logger.d.ts +27 -0
  294. package/dist/utils/logger.d.ts.map +1 -0
  295. package/dist/utils/logger.js +177 -0
  296. package/dist/utils/logger.js.map +1 -0
  297. package/dist/utils/priority.d.ts +26 -0
  298. package/dist/utils/priority.d.ts.map +1 -0
  299. package/dist/utils/priority.js +43 -0
  300. package/dist/utils/priority.js.map +1 -0
  301. package/dist/utils/watchdog.d.ts +57 -0
  302. package/dist/utils/watchdog.d.ts.map +1 -0
  303. package/dist/utils/watchdog.js +164 -0
  304. package/dist/utils/watchdog.js.map +1 -0
  305. package/package.json +78 -0
@@ -0,0 +1,173 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * context-gatekeeper install helper CLI.
4
+ *
5
+ * Subcommands:
6
+ * install [agent ...] - merge the MCP entry into one or more agents' configs
7
+ * uninstall [agent ...] - remove the MCP entry from one or more agents' configs
8
+ * status - print a table of detected agents and install state
9
+ * help - print usage
10
+ *
11
+ * Examples:
12
+ * npx context-gatekeeper install --all
13
+ * npx context-gatekeeper install cursor claude-code
14
+ * npx context-gatekeeper uninstall --all
15
+ * npx context-gatekeeper status
16
+ *
17
+ * Exit codes:
18
+ * 0 - success
19
+ * 1 - one or more operations failed (or were skipped, for uninstall)
20
+ * 2 - invalid usage
21
+ */
22
+
23
+ import { installAgents, InstallResult } from './cli/install.ts';
24
+ import { uninstallAgents, UninstallResult } from './cli/uninstall.ts';
25
+ import { printStatus } from './cli/status.ts';
26
+ import { detectAll, isValidAgent, AgentName, SUPPORTED_AGENTS } from './cli/detect.ts';
27
+
28
+ const HELP = `context-gatekeeper installer
29
+
30
+ Usage:
31
+ context-gatekeeper install [agent ...] [--all] [--local]
32
+ context-gatekeeper uninstall [agent ...] [--all] [--local]
33
+ context-gatekeeper status [--local]
34
+ context-gatekeeper help
35
+
36
+ Agents:
37
+ ${SUPPORTED_AGENTS.join(', ')}
38
+
39
+ Options:
40
+ --all target every supported agent (default for uninstall when none given)
41
+ --local write to project-local config (./.cursor/mcp.json, etc.) instead of global
42
+ (Claude Desktop is always global-only)
43
+
44
+ Examples:
45
+ context-gatekeeper install --all
46
+ context-gatekeeper install cursor claude-code
47
+ context-gatekeeper uninstall cursor
48
+ context-gatekeeper status
49
+ `;
50
+
51
+ interface ParsedArgs {
52
+ command: string;
53
+ positional: string[];
54
+ flags: Set<string>;
55
+ flagValues: Map<string, string>;
56
+ }
57
+
58
+ function parseArgs(argv: string[]): ParsedArgs {
59
+ const [command = 'help', ...rest] = argv;
60
+ const positional: string[] = [];
61
+ const flags = new Set<string>();
62
+ const flagValues = new Map<string, string>();
63
+ for (let i = 0; i < rest.length; i++) {
64
+ const a = rest[i];
65
+ if (a.startsWith('--')) {
66
+ const eq = a.indexOf('=');
67
+ if (eq >= 0) {
68
+ const name = a.slice(2, eq);
69
+ const value = a.slice(eq + 1);
70
+ flags.add(name);
71
+ flagValues.set(name, value);
72
+ } else {
73
+ const name = a.slice(2);
74
+ const next = rest[i + 1];
75
+ if (next !== undefined && !next.startsWith('--') && TAKES_VALUE.has(name)) {
76
+ flags.add(name);
77
+ flagValues.set(name, next);
78
+ i++;
79
+ } else {
80
+ flags.add(name);
81
+ }
82
+ }
83
+ } else {
84
+ positional.push(a);
85
+ }
86
+ }
87
+ return { command, positional, flags, flagValues };
88
+ }
89
+
90
+ const TAKES_VALUE = new Set(['cwd']);
91
+
92
+ function resolveAgents(positional: string[], allFlag: boolean): AgentName[] {
93
+ if (allFlag) return [...SUPPORTED_AGENTS];
94
+ if (positional.length === 0) return [];
95
+ const invalid = positional.filter((a) => !isValidAgent(a));
96
+ if (invalid.length > 0) {
97
+ console.error(`Unknown agent(s): ${invalid.join(', ')}`);
98
+ console.error(`Available: ${SUPPORTED_AGENTS.join(', ')}`);
99
+ process.exit(2);
100
+ }
101
+ return positional as AgentName[];
102
+ }
103
+
104
+ function reportInstall(results: InstallResult[]): number {
105
+ let failed = 0;
106
+ for (const r of results) {
107
+ const tag = r.status === 'error' ? 'ERROR' : r.status.toUpperCase().padEnd(9);
108
+ console.log(`[${tag}] ${r.agent.padEnd(15)} ${r.configPath}`);
109
+ if (r.message) console.log(` ${r.message}`);
110
+ if (r.status === 'error') failed++;
111
+ }
112
+ return failed === 0 ? 0 : 1;
113
+ }
114
+
115
+ function reportUninstall(results: UninstallResult[]): number {
116
+ let failed = 0;
117
+ for (const r of results) {
118
+ const tag = r.status === 'error' ? 'ERROR' : r.status.toUpperCase().padEnd(9);
119
+ console.log(`[${tag}] ${r.agent.padEnd(15)} ${r.configPath}`);
120
+ if (r.message) console.log(` ${r.message}`);
121
+ if (r.status === 'error') failed++;
122
+ }
123
+ return failed === 0 ? 0 : 1;
124
+ }
125
+
126
+ function main(argv: string[]): number {
127
+ const { command, positional, flags, flagValues } = parseArgs(argv);
128
+ const scope = flags.has('local') ? 'project' : 'global';
129
+ const allFlag = flags.has('all');
130
+ const cwd = flagValues.get('cwd');
131
+ const opts = cwd ? { scope, cwd } : { scope };
132
+
133
+ switch (command) {
134
+ case 'help':
135
+ case '--help':
136
+ case '-h': {
137
+ console.log(HELP);
138
+ return 0;
139
+ }
140
+ case 'install': {
141
+ const agents = resolveAgents(positional, allFlag);
142
+ if (agents.length === 0) {
143
+ console.error('No agents specified. Use --all or pass agent names.');
144
+ console.error(`Available: ${SUPPORTED_AGENTS.join(', ')}`);
145
+ return 2;
146
+ }
147
+ const results = installAgents(agents, opts);
148
+ return reportInstall(results);
149
+ }
150
+ case 'uninstall': {
151
+ const agents = resolveAgents(positional, allFlag);
152
+ if (agents.length === 0) {
153
+ console.error('No agents specified. Use --all or pass agent names.');
154
+ console.error(`Available: ${SUPPORTED_AGENTS.join(', ')}`);
155
+ return 2;
156
+ }
157
+ const results = uninstallAgents(agents, opts);
158
+ return reportUninstall(results);
159
+ }
160
+ case 'status': {
161
+ printStatus(detectAll(opts));
162
+ return 0;
163
+ }
164
+ default: {
165
+ console.error(`Unknown command: ${command}`);
166
+ console.log(HELP);
167
+ return 2;
168
+ }
169
+ }
170
+ }
171
+
172
+ const exitCode = main(process.argv.slice(2));
173
+ process.exit(exitCode);
@@ -0,0 +1,36 @@
1
+ import { Memory } from '../../models/types.js';
2
+ import { LLMConfig } from './llm.js';
3
+ export interface ClassificationResult {
4
+ memory: Memory;
5
+ relevance: number;
6
+ matchedBy: 'rule' | 'llm' | 'both';
7
+ }
8
+ /**
9
+ * Hybrid Classifier - combines rule-based and LLM-based classification
10
+ */
11
+ export declare class HybridClassifier {
12
+ private memoryService;
13
+ private llmClassifier;
14
+ constructor(llmConfig?: LLMConfig);
15
+ /**
16
+ * Configure LLM settings
17
+ */
18
+ configureLLM(config: Partial<LLMConfig>): void;
19
+ /**
20
+ * Classify and rank memories for a given user input
21
+ *
22
+ * Process:
23
+ * 1. Rule-based quick filter (anchored + constraint)
24
+ * 2. LLM-based precise classification
25
+ * 3. Merge and deduplicate results
26
+ * 4. Sort by relevance
27
+ */
28
+ classify(userInput: string, projectTags?: string[], limit?: number): Promise<ClassificationResult[]>;
29
+ /**
30
+ * Quick classify using only rules (no LLM)
31
+ * Useful when LLM is unavailable
32
+ */
33
+ classifyWithRules(userInput: string, projectTags?: string[], limit?: number): ClassificationResult[];
34
+ }
35
+ export declare function getHybridClassifier(llmConfig?: LLMConfig): HybridClassifier;
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/classifier/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAG/C,OAAO,EAAmC,SAAS,EAAE,MAAM,UAAU,CAAC;AAEtE,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;CACpC;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,aAAa,CAAgB;gBAEzB,SAAS,CAAC,EAAE,SAAS;IAIjC;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI;IAI9C;;;;;;;;OAQG;IACG,QAAQ,CACZ,SAAS,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,EAAE,EACtB,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,oBAAoB,EAAE,CAAC;IA2DlC;;;OAGG;IACH,iBAAiB,CACf,SAAS,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,EAAE,EACtB,KAAK,GAAE,MAAW,GACjB,oBAAoB,EAAE;CAa1B;AAKD,wBAAgB,mBAAmB,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,gBAAgB,CAK3E"}
@@ -0,0 +1,104 @@
1
+ import { getMemoryService } from '../memory.js';
2
+ import { extractKeywords, extractFileTypes, quickFilterHighPriority } from './rules.js';
3
+ import { getLLMClassifier } from './llm.js';
4
+ /**
5
+ * Hybrid Classifier - combines rule-based and LLM-based classification
6
+ */
7
+ export class HybridClassifier {
8
+ memoryService = getMemoryService();
9
+ llmClassifier;
10
+ constructor(llmConfig) {
11
+ this.llmClassifier = getLLMClassifier(llmConfig);
12
+ }
13
+ /**
14
+ * Configure LLM settings
15
+ */
16
+ configureLLM(config) {
17
+ this.llmClassifier.configure(config);
18
+ }
19
+ /**
20
+ * Classify and rank memories for a given user input
21
+ *
22
+ * Process:
23
+ * 1. Rule-based quick filter (anchored + constraint)
24
+ * 2. LLM-based precise classification
25
+ * 3. Merge and deduplicate results
26
+ * 4. Sort by relevance
27
+ */
28
+ async classify(userInput, projectTags, limit = 10) {
29
+ // Extract features for rule matching
30
+ const keywords = extractKeywords(userInput);
31
+ const fileTypes = extractFileTypes(userInput);
32
+ // Step 1: Rule-based quick filter
33
+ const allMemories = this.memoryService.listAllMemories(projectTags);
34
+ const ruleMatches = quickFilterHighPriority(allMemories, keywords, fileTypes);
35
+ // Step 2: LLM-based precise classification
36
+ let llmResults = [];
37
+ try {
38
+ llmResults = await this.llmClassifier.classify(userInput, allMemories);
39
+ }
40
+ catch {
41
+ // LLM failed, continue with rules only
42
+ }
43
+ // Step 3: Merge results
44
+ const resultsMap = new Map();
45
+ // Add rule matches
46
+ for (const memory of ruleMatches) {
47
+ resultsMap.set(memory.id, {
48
+ memory,
49
+ relevance: 0.8, // Rule matches get high base relevance
50
+ matchedBy: 'rule'
51
+ });
52
+ }
53
+ // Add LLM matches (boost if already matched by rules)
54
+ for (const { memoryId, relevance } of llmResults) {
55
+ const existing = resultsMap.get(memoryId);
56
+ if (existing) {
57
+ existing.relevance = Math.min(1.0, existing.relevance + relevance * 0.2);
58
+ existing.matchedBy = 'both';
59
+ }
60
+ else {
61
+ const memory = this.memoryService.getMemory(memoryId);
62
+ if (memory) {
63
+ resultsMap.set(memoryId, {
64
+ memory,
65
+ relevance,
66
+ matchedBy: 'llm'
67
+ });
68
+ }
69
+ }
70
+ }
71
+ // Step 4: Sort by relevance
72
+ const results = Array.from(resultsMap.values());
73
+ results.sort((a, b) => b.relevance - a.relevance);
74
+ // Update access counts for returned memories
75
+ for (const result of results) {
76
+ this.memoryService.getMemory(result.memory.id); // Triggers access count increment
77
+ }
78
+ return results.slice(0, limit);
79
+ }
80
+ /**
81
+ * Quick classify using only rules (no LLM)
82
+ * Useful when LLM is unavailable
83
+ */
84
+ classifyWithRules(userInput, projectTags, limit = 10) {
85
+ const keywords = extractKeywords(userInput);
86
+ const fileTypes = extractFileTypes(userInput);
87
+ const allMemories = this.memoryService.listAllMemories(projectTags);
88
+ const ruleMatches = quickFilterHighPriority(allMemories, keywords, fileTypes);
89
+ return ruleMatches.slice(0, limit).map(memory => ({
90
+ memory,
91
+ relevance: 0.8,
92
+ matchedBy: 'rule'
93
+ }));
94
+ }
95
+ }
96
+ // Singleton instance
97
+ let hybridClassifierInstance = null;
98
+ export function getHybridClassifier(llmConfig) {
99
+ if (!hybridClassifierInstance) {
100
+ hybridClassifierInstance = new HybridClassifier(llmConfig);
101
+ }
102
+ return hybridClassifierInstance;
103
+ }
104
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/classifier/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { Memory } from '../../models/types.js';
2
+ export interface LLMConfig {
3
+ apiKey?: string;
4
+ baseUrl?: string;
5
+ model?: string;
6
+ }
7
+ export interface ClassifierResult {
8
+ memoryId: string;
9
+ relevance: number;
10
+ }
11
+ /**
12
+ * Default LLM classifier using the agent's own model
13
+ * This can be overridden by user configuration
14
+ */
15
+ export declare class LLMClassifier {
16
+ private config;
17
+ constructor(config?: LLMConfig);
18
+ /**
19
+ * Configure the LLM settings
20
+ */
21
+ configure(config: Partial<LLMConfig>): void;
22
+ /**
23
+ * Classify memories using LLM
24
+ * Returns memory IDs with relevance scores
25
+ */
26
+ classify(userInput: string, memories: Memory[]): Promise<ClassifierResult[]>;
27
+ /**
28
+ * Call the LLM API
29
+ */
30
+ private callLLM;
31
+ /**
32
+ * Parse LLM response to extract memory IDs
33
+ */
34
+ private parseLLMResponse;
35
+ }
36
+ export declare function getLLMClassifier(config?: LLMConfig): LLMClassifier;
37
+ //# sourceMappingURL=llm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../../src/services/classifier/llm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAI/C,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AA2BD;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAY;gBAEd,MAAM,GAAE,SAAc;IAOlC;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI;IAI3C;;;OAGG;IACG,QAAQ,CACZ,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAoB9B;;OAEG;YACW,OAAO;IAgCrB;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAYzB;AAKD,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,aAAa,CAOlE"}
@@ -0,0 +1,119 @@
1
+ import { LLMError } from '../../utils/errors.js';
2
+ import { logger } from '../../utils/logger.js';
3
+ /**
4
+ * Build the prompt for LLM-based memory classification
5
+ */
6
+ function buildClassificationPrompt(userInput, memories) {
7
+ const memoryList = memories
8
+ .map(m => `- [${m.id}] (${m.priority}${m.anchored ? ', anchored' : ''}): ${m.content}`)
9
+ .join('\n');
10
+ return `Given the following user input and available memories, identify which memories are relevant to inject into the context.
11
+
12
+ User Input:
13
+ ${userInput}
14
+
15
+ Available Memories:
16
+ ${memoryList}
17
+
18
+ Respond with a JSON array of memory IDs that should be injected, ordered by relevance (most relevant first).
19
+ Format: ["memory-id-1", "memory-id-2", ...]
20
+ If no memories are relevant, respond with an empty array: []
21
+ Only respond with the JSON array, nothing else.`;
22
+ }
23
+ /**
24
+ * Default LLM classifier using the agent's own model
25
+ * This can be overridden by user configuration
26
+ */
27
+ export class LLMClassifier {
28
+ config;
29
+ constructor(config = {}) {
30
+ this.config = {
31
+ model: 'gpt-4o',
32
+ ...config
33
+ };
34
+ }
35
+ /**
36
+ * Configure the LLM settings
37
+ */
38
+ configure(config) {
39
+ this.config = { ...this.config, ...config };
40
+ }
41
+ /**
42
+ * Classify memories using LLM
43
+ * Returns memory IDs with relevance scores
44
+ */
45
+ async classify(userInput, memories) {
46
+ if (memories.length === 0) {
47
+ return [];
48
+ }
49
+ const prompt = buildClassificationPrompt(userInput, memories);
50
+ try {
51
+ const response = await this.callLLM(prompt);
52
+ const memoryIds = this.parseLLMResponse(response);
53
+ // Calculate relevance scores (uniform initially, could be refined)
54
+ return memoryIds.map(id => ({ memoryId: id, relevance: 1.0 }));
55
+ }
56
+ catch (error) {
57
+ // Don't throw - let the fallback handle it
58
+ logger.error('LLM classification failed', { error: error instanceof Error ? error.message : String(error) });
59
+ return [];
60
+ }
61
+ }
62
+ /**
63
+ * Call the LLM API
64
+ */
65
+ async callLLM(prompt) {
66
+ const { apiKey, baseUrl, model } = this.config;
67
+ // If no API key is configured, we can't make the call
68
+ if (!apiKey) {
69
+ throw new LLMError('No LLM API key configured');
70
+ }
71
+ const url = baseUrl || 'https://api.openai.com/v1/chat/completions';
72
+ const response = await fetch(url, {
73
+ method: 'POST',
74
+ headers: {
75
+ 'Content-Type': 'application/json',
76
+ 'Authorization': `Bearer ${apiKey}`
77
+ },
78
+ body: JSON.stringify({
79
+ model: model || 'gpt-4o',
80
+ messages: [{ role: 'user', content: prompt }],
81
+ max_tokens: 500,
82
+ temperature: 0.1
83
+ })
84
+ });
85
+ if (!response.ok) {
86
+ throw new LLMError(`LLM API error: ${response.status} ${response.statusText}`);
87
+ }
88
+ const data = await response.json();
89
+ return data.choices[0]?.message?.content || '[]';
90
+ }
91
+ /**
92
+ * Parse LLM response to extract memory IDs
93
+ */
94
+ parseLLMResponse(response) {
95
+ try {
96
+ // Try to extract JSON from the response
97
+ const jsonMatch = response.match(/\[[\s\S]*\]/);
98
+ if (jsonMatch) {
99
+ return JSON.parse(jsonMatch[0]);
100
+ }
101
+ return [];
102
+ }
103
+ catch {
104
+ return [];
105
+ }
106
+ }
107
+ }
108
+ // Singleton instance
109
+ let llmClassifierInstance = null;
110
+ export function getLLMClassifier(config) {
111
+ if (!llmClassifierInstance) {
112
+ llmClassifierInstance = new LLMClassifier(config);
113
+ }
114
+ else if (config) {
115
+ llmClassifierInstance.configure(config);
116
+ }
117
+ return llmClassifierInstance;
118
+ }
119
+ //# sourceMappingURL=llm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.js","sourceRoot":"","sources":["../../../src/services/classifier/llm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { Memory } from '../../models/types.js';
2
+ /**
3
+ * Extract keywords from user input for rule-based matching
4
+ */
5
+ export declare function extractKeywords(input: string): string[];
6
+ /**
7
+ * Extract file types mentioned in input
8
+ */
9
+ export declare function extractFileTypes(input: string): string[];
10
+ /**
11
+ * Check if a memory matches the input based on rules
12
+ */
13
+ export declare function memoryMatchesRules(memory: Memory, keywords: string[], fileTypes: string[]): {
14
+ matches: boolean;
15
+ relevance: number;
16
+ };
17
+ /**
18
+ * Quick filter for high-priority memories
19
+ * Returns memories that should be directly included
20
+ */
21
+ export declare function quickFilterHighPriority(memories: Memory[], keywords: string[], fileTypes: string[]): Memory[];
22
+ //# sourceMappingURL=rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../../src/services/classifier/rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAiBvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAgBxD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAAE,EAClB,SAAS,EAAE,MAAM,EAAE,GAClB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAmCzC;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAAE,EAClB,QAAQ,EAAE,MAAM,EAAE,EAClB,SAAS,EAAE,MAAM,EAAE,GAClB,MAAM,EAAE,CA2BV"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Extract keywords from user input for rule-based matching
3
+ */
4
+ export function extractKeywords(input) {
5
+ // Simple word extraction (could be enhanced with NLP)
6
+ const words = input.toLowerCase()
7
+ .replace(/[^\w\s]/g, ' ')
8
+ .split(/\s+/)
9
+ .filter(word => word.length > 2);
10
+ // Remove common stop words
11
+ const stopWords = new Set([
12
+ 'the', 'and', 'for', 'are', 'but', 'not', 'you', 'all', 'can',
13
+ 'had', 'her', 'was', 'one', 'our', 'out', 'has', 'have', 'been',
14
+ 'would', 'could', 'this', 'that', 'with', 'they', 'from', 'what',
15
+ 'when', 'where', 'which', 'their', 'there', 'these', 'those',
16
+ 'over' // common preposition
17
+ ]);
18
+ return [...new Set(words.filter(word => !stopWords.has(word)))];
19
+ }
20
+ /**
21
+ * Extract file types mentioned in input
22
+ */
23
+ export function extractFileTypes(input) {
24
+ const fileTypePatterns = [
25
+ /\b(\w+)\.(ts|js|tsx|jsx|py|rs|go|java|cpp|c|h|hpp|rs)\b/gi,
26
+ /\b(config|test|spec|index|main|app)\b/gi
27
+ ];
28
+ const types = [];
29
+ for (const pattern of fileTypePatterns) {
30
+ const matches = input.match(pattern);
31
+ if (matches) {
32
+ types.push(...matches.map(m => m.toLowerCase()));
33
+ }
34
+ }
35
+ return [...new Set(types)];
36
+ }
37
+ /**
38
+ * Check if a memory matches the input based on rules
39
+ */
40
+ export function memoryMatchesRules(memory, keywords, fileTypes) {
41
+ const contentLower = memory.content.toLowerCase();
42
+ const memoryTags = memory.projectTags.map(t => t.toLowerCase());
43
+ let matchCount = 0;
44
+ let totalWeight = 0;
45
+ // Check keyword matches
46
+ for (const keyword of keywords) {
47
+ if (contentLower.includes(keyword)) {
48
+ matchCount += 2; // Keywords are more important
49
+ totalWeight += 2;
50
+ }
51
+ }
52
+ // Check file type matches
53
+ for (const fileType of fileTypes) {
54
+ if (contentLower.includes(fileType)) {
55
+ matchCount += 1;
56
+ totalWeight += 1;
57
+ }
58
+ }
59
+ // Check project tag matches
60
+ for (const tag of memoryTags) {
61
+ if (keywords.some(k => tag.includes(k) || k.includes(tag))) {
62
+ matchCount += 1;
63
+ totalWeight += 1;
64
+ }
65
+ }
66
+ const matches = matchCount > 0;
67
+ const relevance = totalWeight > 0 ? matchCount / totalWeight : 0;
68
+ return { matches, relevance };
69
+ }
70
+ /**
71
+ * Quick filter for high-priority memories
72
+ * Returns memories that should be directly included
73
+ */
74
+ export function quickFilterHighPriority(memories, keywords, fileTypes) {
75
+ const anchoredMemories = memories.filter(m => m.anchored);
76
+ const constraintMemories = memories.filter(m => m.priority === 'constraint');
77
+ // Anchored memories are always included
78
+ const anchoredResults = anchoredMemories.map(m => ({
79
+ memory: m,
80
+ relevance: 1.0
81
+ }));
82
+ // Check constraint memories against rules
83
+ const constraintResults = [];
84
+ for (const memory of constraintMemories) {
85
+ const { matches, relevance } = memoryMatchesRules(memory, keywords, fileTypes);
86
+ if (matches) {
87
+ constraintResults.push({ memory, relevance });
88
+ }
89
+ }
90
+ // Sort constraint results by relevance
91
+ constraintResults.sort((a, b) => b.relevance - a.relevance);
92
+ // Combine and return
93
+ return [
94
+ ...anchoredResults.map(r => r.memory),
95
+ ...constraintResults.slice(0, 5).map(r => r.memory) // Limit to top 5 constraints
96
+ ];
97
+ }
98
+ //# sourceMappingURL=rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../../src/services/classifier/rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { ThresholdDetector, getThresholdDetector, DEFAULT_THRESHOLD_LOW, DEFAULT_THRESHOLD_HIGH } from './threshold.js';
2
+ export { ContextCompressor, getContextCompressor } from './trigger.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/compressor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxH,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { ThresholdDetector, getThresholdDetector, DEFAULT_THRESHOLD_LOW, DEFAULT_THRESHOLD_HIGH } from './threshold.js';
2
+ export { ContextCompressor, getContextCompressor } from './trigger.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/compressor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxH,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC"}