@0xmaxma/claude-gateway 1.0.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 (192) hide show
  1. package/README.md +791 -0
  2. package/config.template.json +87 -0
  3. package/dist/agent/context-isolation.d.ts +28 -0
  4. package/dist/agent/context-isolation.d.ts.map +1 -0
  5. package/dist/agent/context-isolation.js +80 -0
  6. package/dist/agent/context-isolation.js.map +1 -0
  7. package/dist/agent/runner.d.ts +211 -0
  8. package/dist/agent/runner.d.ts.map +1 -0
  9. package/dist/agent/runner.js +1802 -0
  10. package/dist/agent/runner.js.map +1 -0
  11. package/dist/agent/workspace-loader.d.ts +31 -0
  12. package/dist/agent/workspace-loader.d.ts.map +1 -0
  13. package/dist/agent/workspace-loader.js +207 -0
  14. package/dist/agent/workspace-loader.js.map +1 -0
  15. package/dist/api/auth.d.ts +25 -0
  16. package/dist/api/auth.d.ts.map +1 -0
  17. package/dist/api/auth.js +77 -0
  18. package/dist/api/auth.js.map +1 -0
  19. package/dist/api/cron-router.d.ts +22 -0
  20. package/dist/api/cron-router.d.ts.map +1 -0
  21. package/dist/api/cron-router.js +197 -0
  22. package/dist/api/cron-router.js.map +1 -0
  23. package/dist/api/gateway-router.d.ts +52 -0
  24. package/dist/api/gateway-router.d.ts.map +1 -0
  25. package/dist/api/gateway-router.js +215 -0
  26. package/dist/api/gateway-router.js.map +1 -0
  27. package/dist/api/router.d.ts +5 -0
  28. package/dist/api/router.d.ts.map +1 -0
  29. package/dist/api/router.js +1098 -0
  30. package/dist/api/router.js.map +1 -0
  31. package/dist/api/skills-router.d.ts +5 -0
  32. package/dist/api/skills-router.d.ts.map +1 -0
  33. package/dist/api/skills-router.js +424 -0
  34. package/dist/api/skills-router.js.map +1 -0
  35. package/dist/api/workspace-router.d.ts +4 -0
  36. package/dist/api/workspace-router.d.ts.map +1 -0
  37. package/dist/api/workspace-router.js +149 -0
  38. package/dist/api/workspace-router.js.map +1 -0
  39. package/dist/config/loader.d.ts +16 -0
  40. package/dist/config/loader.d.ts.map +1 -0
  41. package/dist/config/loader.js +235 -0
  42. package/dist/config/loader.js.map +1 -0
  43. package/dist/config/migrator.d.ts +70 -0
  44. package/dist/config/migrator.d.ts.map +1 -0
  45. package/dist/config/migrator.js +343 -0
  46. package/dist/config/migrator.js.map +1 -0
  47. package/dist/config/watcher.d.ts +30 -0
  48. package/dist/config/watcher.d.ts.map +1 -0
  49. package/dist/config/watcher.js +170 -0
  50. package/dist/config/watcher.js.map +1 -0
  51. package/dist/cron/manager.d.ts +48 -0
  52. package/dist/cron/manager.d.ts.map +1 -0
  53. package/dist/cron/manager.js +580 -0
  54. package/dist/cron/manager.js.map +1 -0
  55. package/dist/cron/scheduler.d.ts +50 -0
  56. package/dist/cron/scheduler.d.ts.map +1 -0
  57. package/dist/cron/scheduler.js +231 -0
  58. package/dist/cron/scheduler.js.map +1 -0
  59. package/dist/discord/receiver.d.ts +17 -0
  60. package/dist/discord/receiver.d.ts.map +1 -0
  61. package/dist/discord/receiver.js +108 -0
  62. package/dist/discord/receiver.js.map +1 -0
  63. package/dist/heartbeat/history.d.ts +24 -0
  64. package/dist/heartbeat/history.d.ts.map +1 -0
  65. package/dist/heartbeat/history.js +50 -0
  66. package/dist/heartbeat/history.js.map +1 -0
  67. package/dist/heartbeat/parser.d.ts +26 -0
  68. package/dist/heartbeat/parser.d.ts.map +1 -0
  69. package/dist/heartbeat/parser.js +283 -0
  70. package/dist/heartbeat/parser.js.map +1 -0
  71. package/dist/history/cleanup.d.ts +21 -0
  72. package/dist/history/cleanup.d.ts.map +1 -0
  73. package/dist/history/cleanup.js +171 -0
  74. package/dist/history/cleanup.js.map +1 -0
  75. package/dist/history/db.d.ts +27 -0
  76. package/dist/history/db.d.ts.map +1 -0
  77. package/dist/history/db.js +323 -0
  78. package/dist/history/db.js.map +1 -0
  79. package/dist/history/media-store.d.ts +27 -0
  80. package/dist/history/media-store.d.ts.map +1 -0
  81. package/dist/history/media-store.js +158 -0
  82. package/dist/history/media-store.js.map +1 -0
  83. package/dist/history/types.d.ts +62 -0
  84. package/dist/history/types.d.ts.map +1 -0
  85. package/dist/history/types.js +3 -0
  86. package/dist/history/types.js.map +1 -0
  87. package/dist/index.d.ts +3 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +483 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/logger.d.ts +3 -0
  92. package/dist/logger.d.ts.map +1 -0
  93. package/dist/logger.js +81 -0
  94. package/dist/logger.js.map +1 -0
  95. package/dist/memory/manager.d.ts +45 -0
  96. package/dist/memory/manager.d.ts.map +1 -0
  97. package/dist/memory/manager.js +178 -0
  98. package/dist/memory/manager.js.map +1 -0
  99. package/dist/session/compactor.d.ts +22 -0
  100. package/dist/session/compactor.d.ts.map +1 -0
  101. package/dist/session/compactor.js +151 -0
  102. package/dist/session/compactor.js.map +1 -0
  103. package/dist/session/process.d.ts +76 -0
  104. package/dist/session/process.d.ts.map +1 -0
  105. package/dist/session/process.js +729 -0
  106. package/dist/session/process.js.map +1 -0
  107. package/dist/session/store.d.ts +102 -0
  108. package/dist/session/store.d.ts.map +1 -0
  109. package/dist/session/store.js +533 -0
  110. package/dist/session/store.js.map +1 -0
  111. package/dist/skills/index.d.ts +9 -0
  112. package/dist/skills/index.d.ts.map +1 -0
  113. package/dist/skills/index.js +15 -0
  114. package/dist/skills/index.js.map +1 -0
  115. package/dist/skills/invoker.d.ts +16 -0
  116. package/dist/skills/invoker.d.ts.map +1 -0
  117. package/dist/skills/invoker.js +36 -0
  118. package/dist/skills/invoker.js.map +1 -0
  119. package/dist/skills/loader.d.ts +23 -0
  120. package/dist/skills/loader.d.ts.map +1 -0
  121. package/dist/skills/loader.js +183 -0
  122. package/dist/skills/loader.js.map +1 -0
  123. package/dist/skills/parser.d.ts +55 -0
  124. package/dist/skills/parser.d.ts.map +1 -0
  125. package/dist/skills/parser.js +178 -0
  126. package/dist/skills/parser.js.map +1 -0
  127. package/dist/skills/sync.d.ts +10 -0
  128. package/dist/skills/sync.d.ts.map +1 -0
  129. package/dist/skills/sync.js +130 -0
  130. package/dist/skills/sync.js.map +1 -0
  131. package/dist/skills/watcher.d.ts +16 -0
  132. package/dist/skills/watcher.d.ts.map +1 -0
  133. package/dist/skills/watcher.js +25 -0
  134. package/dist/skills/watcher.js.map +1 -0
  135. package/dist/telegram/markdown.d.ts +25 -0
  136. package/dist/telegram/markdown.d.ts.map +1 -0
  137. package/dist/telegram/markdown.js +237 -0
  138. package/dist/telegram/markdown.js.map +1 -0
  139. package/dist/telegram/receiver.d.ts +17 -0
  140. package/dist/telegram/receiver.d.ts.map +1 -0
  141. package/dist/telegram/receiver.js +104 -0
  142. package/dist/telegram/receiver.js.map +1 -0
  143. package/dist/types.d.ts +224 -0
  144. package/dist/types.d.ts.map +1 -0
  145. package/dist/types.js +3 -0
  146. package/dist/types.js.map +1 -0
  147. package/dist/ui/web-ui.d.ts +6 -0
  148. package/dist/ui/web-ui.d.ts.map +1 -0
  149. package/dist/ui/web-ui.js +227 -0
  150. package/dist/ui/web-ui.js.map +1 -0
  151. package/dist/watch/factory.d.ts +26 -0
  152. package/dist/watch/factory.d.ts.map +1 -0
  153. package/dist/watch/factory.js +43 -0
  154. package/dist/watch/factory.js.map +1 -0
  155. package/dist/webhook/manager.d.ts +34 -0
  156. package/dist/webhook/manager.d.ts.map +1 -0
  157. package/dist/webhook/manager.js +120 -0
  158. package/dist/webhook/manager.js.map +1 -0
  159. package/mcp/bun.lock +264 -0
  160. package/mcp/channel-manager.ts +115 -0
  161. package/mcp/package.json +15 -0
  162. package/mcp/router.ts +69 -0
  163. package/mcp/server.ts +129 -0
  164. package/mcp/tools/agent/handlers.ts +578 -0
  165. package/mcp/tools/agent/module.ts +163 -0
  166. package/mcp/tools/browser/module.ts +321 -0
  167. package/mcp/tools/browser/skills/open-browser/SKILL.md +89 -0
  168. package/mcp/tools/cron/client.ts +65 -0
  169. package/mcp/tools/cron/module.ts +158 -0
  170. package/mcp/tools/cron/skills/cron/SKILL.md +46 -0
  171. package/mcp/tools/discord/access.ts +197 -0
  172. package/mcp/tools/discord/client.ts +31 -0
  173. package/mcp/tools/discord/commands.ts +48 -0
  174. package/mcp/tools/discord/inbound.ts +53 -0
  175. package/mcp/tools/discord/module.ts +442 -0
  176. package/mcp/tools/discord/outbound.ts +90 -0
  177. package/mcp/tools/discord/receiver-server.ts +58 -0
  178. package/mcp/tools/discord/skills/access/SKILL.md +86 -0
  179. package/mcp/tools/discord/skills/configure/SKILL.md +53 -0
  180. package/mcp/tools/discord/threading.ts +37 -0
  181. package/mcp/tools/discord/types.ts +106 -0
  182. package/mcp/tools/skills/handlers.ts +196 -0
  183. package/mcp/tools/skills/module.ts +163 -0
  184. package/mcp/tools/telegram/module.ts +454 -0
  185. package/mcp/tools/telegram/pure.ts +224 -0
  186. package/mcp/tools/telegram/receiver-server.ts +1656 -0
  187. package/mcp/tools/telegram/skills/access/SKILL.md +169 -0
  188. package/mcp/tools/telegram/skills/configure/SKILL.md +118 -0
  189. package/mcp/tools/telegram/typing.ts +327 -0
  190. package/mcp/types.ts +128 -0
  191. package/package.json +62 -0
  192. package/resource/claude_gateway.svg +112 -0
@@ -0,0 +1,178 @@
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.MemoryManager = void 0;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const p_queue_1 = __importDefault(require("p-queue"));
43
+ const MEMORY_FILE = 'MEMORY.md';
44
+ const DEFAULT_HEADER = '# Memory\n';
45
+ class MemoryManager {
46
+ constructor(workspaceDir) {
47
+ this.memoryPath = path.join(workspaceDir, MEMORY_FILE);
48
+ this.queue = new p_queue_1.default({ concurrency: 1 });
49
+ }
50
+ /**
51
+ * Append a fact under the given section in memory.md.
52
+ * If the section exists, the fact is appended under it.
53
+ * If the section does not exist, it is created at the end of the file.
54
+ */
55
+ async appendFact(section, fact) {
56
+ await this.queue.add(async () => {
57
+ this._ensureFile();
58
+ const content = fs.readFileSync(this.memoryPath, 'utf-8');
59
+ const sectionHeader = `## ${section}`;
60
+ const factLine = `- ${fact}`;
61
+ if (content.includes(sectionHeader)) {
62
+ // Find the section and insert after it (before the next ## or end of file)
63
+ const lines = content.split('\n');
64
+ const sectionIdx = lines.findIndex((l) => l.trim() === sectionHeader);
65
+ // Find where this section ends (next ## header or EOF)
66
+ let insertIdx = lines.length;
67
+ for (let i = sectionIdx + 1; i < lines.length; i++) {
68
+ if (lines[i].startsWith('## ')) {
69
+ // Insert before the blank line(s) preceding the next section
70
+ insertIdx = i;
71
+ // Back up past any trailing blank lines
72
+ while (insertIdx > sectionIdx + 1 && lines[insertIdx - 1].trim() === '') {
73
+ insertIdx--;
74
+ }
75
+ break;
76
+ }
77
+ }
78
+ lines.splice(insertIdx, 0, factLine);
79
+ const newContent = lines.join('\n');
80
+ fs.writeFileSync(this.memoryPath, newContent, 'utf-8');
81
+ }
82
+ else {
83
+ // Append new section at end of file
84
+ const trimmed = content.trimEnd();
85
+ const newContent = `${trimmed}\n\n${sectionHeader}\n${factLine}\n`;
86
+ fs.writeFileSync(this.memoryPath, newContent, 'utf-8');
87
+ }
88
+ });
89
+ }
90
+ /**
91
+ * Append raw markdown to memory.md.
92
+ */
93
+ async appendRaw(markdown) {
94
+ await this.queue.add(async () => {
95
+ this._ensureFile();
96
+ fs.appendFileSync(this.memoryPath, markdown, 'utf-8');
97
+ });
98
+ }
99
+ /**
100
+ * Read the full memory.md content.
101
+ */
102
+ async readMemory() {
103
+ this._ensureFile();
104
+ return fs.readFileSync(this.memoryPath, 'utf-8');
105
+ }
106
+ /**
107
+ * Search memory for a keyword (simple string match, case-insensitive).
108
+ * Returns all matching lines.
109
+ */
110
+ async searchMemory(query) {
111
+ this._ensureFile();
112
+ const content = fs.readFileSync(this.memoryPath, 'utf-8');
113
+ const lowerQuery = query.toLowerCase();
114
+ return content
115
+ .split('\n')
116
+ .filter((line) => line.toLowerCase().includes(lowerQuery));
117
+ }
118
+ /**
119
+ * Get memory stats: file size in bytes, line count, section count.
120
+ */
121
+ async getStats() {
122
+ this._ensureFile();
123
+ const content = fs.readFileSync(this.memoryPath, 'utf-8');
124
+ const stat = fs.statSync(this.memoryPath);
125
+ const lines = content.split('\n');
126
+ const sectionCount = lines.filter((l) => l.startsWith('## ')).length;
127
+ return {
128
+ sizeBytes: stat.size,
129
+ lineCount: lines.length,
130
+ sectionCount,
131
+ };
132
+ }
133
+ /**
134
+ * Trim memory.md to at most maxChars by removing oldest lines
135
+ * (lines from the top of the file, after the first # header line).
136
+ * Returns the number of lines removed.
137
+ */
138
+ async trimToSize(maxChars) {
139
+ return await this.queue.add(async () => {
140
+ this._ensureFile();
141
+ const content = fs.readFileSync(this.memoryPath, 'utf-8');
142
+ if (content.length <= maxChars) {
143
+ return { removed: 0 };
144
+ }
145
+ const lines = content.split('\n');
146
+ // Find the first non-header content line to start trimming from
147
+ // We preserve the # Memory header (first line)
148
+ let firstBodyLine = 1;
149
+ for (let i = 1; i < lines.length; i++) {
150
+ if (lines[i].trim() !== '' && !lines[i].startsWith('#')) {
151
+ firstBodyLine = i;
152
+ break;
153
+ }
154
+ }
155
+ let removed = 0;
156
+ let current = content;
157
+ while (current.length > maxChars && firstBodyLine < lines.length - 1) {
158
+ lines.splice(firstBodyLine, 1);
159
+ removed++;
160
+ current = lines.join('\n');
161
+ }
162
+ fs.writeFileSync(this.memoryPath, current, 'utf-8');
163
+ return { removed };
164
+ });
165
+ }
166
+ /**
167
+ * Ensure memory.md exists with a default header.
168
+ */
169
+ _ensureFile() {
170
+ if (!fs.existsSync(this.memoryPath)) {
171
+ const dir = path.dirname(this.memoryPath);
172
+ fs.mkdirSync(dir, { recursive: true });
173
+ fs.writeFileSync(this.memoryPath, DEFAULT_HEADER, 'utf-8');
174
+ }
175
+ }
176
+ }
177
+ exports.MemoryManager = MemoryManager;
178
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/memory/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { SessionStore } from './store';
2
+ export interface CompactionResult {
3
+ beforeMessages: number;
4
+ afterMessages: number;
5
+ beforeTokens: number;
6
+ afterTokens: number;
7
+ reductionPct: number;
8
+ contextPctBefore: number;
9
+ contextPctAfter: number;
10
+ }
11
+ export declare class NotEnoughMessagesError extends Error {
12
+ constructor(count: number);
13
+ }
14
+ export declare class SessionCompactor {
15
+ private readonly sessionStore;
16
+ constructor(sessionStore: SessionStore);
17
+ compact(agentId: string, chatId: string, sessionId: string, model: string, contextWindow: number, channel?: 'telegram' | 'discord' | 'api'): Promise<CompactionResult>;
18
+ private summarizeWithChunking;
19
+ private splitIntoChunks;
20
+ private callClaudeForSummary;
21
+ }
22
+ //# sourceMappingURL=compactor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compactor.d.ts","sourceRoot":"","sources":["../../src/session/compactor.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,KAAK,EAAE,MAAM;CAI1B;AAqBD,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAAZ,YAAY,EAAE,YAAY;IAEjD,OAAO,CACX,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,UAAU,GAAG,SAAS,GAAG,KAAkB,GACnD,OAAO,CAAC,gBAAgB,CAAC;YA2Cd,qBAAqB;IA0BnC,OAAO,CAAC,eAAe;YAkBT,oBAAoB;CAwBnC"}
@@ -0,0 +1,151 @@
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.SessionCompactor = exports.NotEnoughMessagesError = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const child_process_1 = require("child_process");
40
+ class NotEnoughMessagesError extends Error {
41
+ constructor(count) {
42
+ super(`Not enough messages to compact (${count} messages, minimum 5 required)`);
43
+ this.name = 'NotEnoughMessagesError';
44
+ }
45
+ }
46
+ exports.NotEnoughMessagesError = NotEnoughMessagesError;
47
+ // Max characters per chunk sent to claude CLI (~100K chars ≈ ~25K tokens, well within 200K limit)
48
+ const CHUNK_CHARS = 100000;
49
+ // Number of recent messages to keep verbatim; older messages are summarized
50
+ const KEEP_LAST_MESSAGES = 45;
51
+ // Prompt used to merge multiple chunk summaries into one
52
+ const MERGE_SUMMARIES_PROMPT = 'These are summaries of sequential parts of a conversation. Merge them into a single concise summary preserving key facts, decisions, context, and any open tasks.';
53
+ // Default instruction for summarizing a single conversation or chunk
54
+ const SINGLE_SUMMARY_INSTRUCTION = 'Summarize this conversation concisely, preserving key facts, decisions, context the assistant should remember, and any open questions or unfinished tasks.';
55
+ // System prompt prepended to every claude CLI summarization call
56
+ const COMPACTOR_SYSTEM_PROMPT = 'You are a conversation archiver. Your ONLY task is to produce a concise summary of the conversation transcript below. Do NOT respond to the conversation. Do NOT ask questions. Output ONLY the summary.';
57
+ // Rough token estimate: ~4 chars per token
58
+ function estimateTokens(messages) {
59
+ return Math.round(messages.reduce((acc, m) => acc + m.content.length, 0) / 4);
60
+ }
61
+ class SessionCompactor {
62
+ constructor(sessionStore) {
63
+ this.sessionStore = sessionStore;
64
+ }
65
+ async compact(agentId, chatId, sessionId, model, contextWindow, channel = 'telegram') {
66
+ // Load current history
67
+ const messages = await this.sessionStore.loadTelegramSession(agentId, chatId, sessionId, channel);
68
+ if (messages.length < 5) {
69
+ throw new NotEnoughMessagesError(messages.length);
70
+ }
71
+ const beforeMessages = messages.length;
72
+ const beforeTokens = estimateTokens(messages);
73
+ // Archive original before compaction
74
+ const agentsBaseDir = this.sessionStore.getAgentsBaseDir();
75
+ const sessionDir = path.join(agentsBaseDir, agentId, 'sessions', `${channel}-${chatId}`);
76
+ fs.mkdirSync(sessionDir, { recursive: true });
77
+ const archivePath = path.join(sessionDir, `${sessionId}.pre-compact-${Date.now()}.json`);
78
+ fs.writeFileSync(archivePath, JSON.stringify(messages, null, 2), 'utf-8');
79
+ // Keep last N messages verbatim; summarize only the older portion (or all if < N)
80
+ const tail = messages.slice(-KEEP_LAST_MESSAGES);
81
+ const toSummarize = messages.length > KEEP_LAST_MESSAGES ? messages.slice(0, -KEEP_LAST_MESSAGES) : messages;
82
+ const historyText = toSummarize
83
+ .map(m => `${m.role === 'user' ? 'User' : 'Assistant'}: ${m.content}`)
84
+ .join('\n\n');
85
+ const summaryText = await this.summarizeWithChunking(historyText);
86
+ const compacted = [
87
+ { role: 'system', content: `[Conversation Summary]\n${summaryText}`, ts: Date.now() },
88
+ ...tail,
89
+ ];
90
+ // Save compacted history (original already archived above)
91
+ await this.sessionStore.saveTelegramSession(agentId, chatId, sessionId, compacted, channel);
92
+ const afterMessages = compacted.length;
93
+ const afterTokens = estimateTokens(compacted);
94
+ const reductionPct = beforeTokens > 0 ? Math.max(0, Math.round((1 - afterTokens / beforeTokens) * 100)) : 0;
95
+ const contextPctBefore = Math.round((beforeTokens / contextWindow) * 100);
96
+ const contextPctAfter = Math.round((afterTokens / contextWindow) * 100);
97
+ return { beforeMessages, afterMessages, beforeTokens, afterTokens, reductionPct, contextPctBefore, contextPctAfter };
98
+ }
99
+ async summarizeWithChunking(historyText) {
100
+ // If small enough, summarize directly
101
+ if (historyText.length <= CHUNK_CHARS) {
102
+ return this.callClaudeForSummary(historyText);
103
+ }
104
+ // Split into chunks and summarize each
105
+ const chunks = this.splitIntoChunks(historyText, CHUNK_CHARS);
106
+ const chunkSummaries = [];
107
+ for (let i = 0; i < chunks.length; i++) {
108
+ const summary = await this.callClaudeForSummary(chunks[i], `This is part ${i + 1} of ${chunks.length} of a longer conversation. Summarize this segment concisely.`);
109
+ chunkSummaries.push(`[Part ${i + 1}/${chunks.length}]\n${summary}`);
110
+ }
111
+ // Merge chunk summaries into final summary
112
+ const mergedText = chunkSummaries.join('\n\n');
113
+ return this.callClaudeForSummary(mergedText, MERGE_SUMMARIES_PROMPT);
114
+ }
115
+ splitIntoChunks(text, maxChars) {
116
+ const chunks = [];
117
+ let start = 0;
118
+ while (start < text.length) {
119
+ let end = start + maxChars;
120
+ if (end < text.length) {
121
+ // Break at a newline boundary to avoid splitting mid-message
122
+ const boundary = text.lastIndexOf('\n\n', end);
123
+ if (boundary > start)
124
+ end = boundary;
125
+ }
126
+ chunks.push(text.slice(start, end));
127
+ start = end;
128
+ }
129
+ return chunks;
130
+ }
131
+ async callClaudeForSummary(text, instruction = SINGLE_SUMMARY_INSTRUCTION) {
132
+ // Wrap content in XML tags so claude treats it as data to analyze, not an active conversation
133
+ const prompt = `${COMPACTOR_SYSTEM_PROMPT}\n\n${instruction}\n\n<transcript>\n${text}\n</transcript>\n\nWrite a concise summary of the above transcript now:`;
134
+ const result = (0, child_process_1.spawnSync)('claude', ['--print'], {
135
+ input: prompt,
136
+ encoding: 'utf-8',
137
+ timeout: 300000,
138
+ env: process.env,
139
+ });
140
+ if (result.error) {
141
+ throw new Error(`claude CLI error: ${result.error.message}`);
142
+ }
143
+ if (result.status !== 0) {
144
+ const stderr = result.stderr?.trim() ?? '';
145
+ throw new Error(`claude CLI exited with status ${result.status}: ${stderr}`);
146
+ }
147
+ return result.stdout?.trim() ?? '';
148
+ }
149
+ }
150
+ exports.SessionCompactor = SessionCompactor;
151
+ //# sourceMappingURL=compactor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compactor.js","sourceRoot":"","sources":["../../src/session/compactor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAC7B,iDAA0C;AAc1C,MAAa,sBAAuB,SAAQ,KAAK;IAC/C,YAAY,KAAa;QACvB,KAAK,CAAC,mCAAmC,KAAK,gCAAgC,CAAC,CAAC;QAChF,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AALD,wDAKC;AAED,kGAAkG;AAClG,MAAM,WAAW,GAAG,MAAO,CAAC;AAC5B,4EAA4E;AAC5E,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAC9B,yDAAyD;AACzD,MAAM,sBAAsB,GAC1B,mKAAmK,CAAC;AACtK,qEAAqE;AACrE,MAAM,0BAA0B,GAC9B,4JAA4J,CAAC;AAC/J,iEAAiE;AACjE,MAAM,uBAAuB,GAC3B,0MAA0M,CAAC;AAE7M,2CAA2C;AAC3C,SAAS,cAAc,CAAC,QAAmB;IACzC,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,MAAa,gBAAgB;IAC3B,YAA6B,YAA0B;QAA1B,iBAAY,GAAZ,YAAY,CAAc;IAAG,CAAC;IAE3D,KAAK,CAAC,OAAO,CACX,OAAe,EACf,MAAc,EACd,SAAiB,EACjB,KAAa,EACb,aAAqB,EACrB,UAA0C,UAAU;QAEpD,uBAAuB;QACvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAElG,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,sBAAsB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC;QACvC,MAAM,YAAY,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QAE9C,qCAAqC;QACrC,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE,CAAC;QAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,IAAI,MAAM,EAAE,CAAC,CAAC;QACzF,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,SAAS,gBAAgB,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACzF,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAE1E,kFAAkF;QAClF,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,kBAAkB,CAAC,CAAC;QACjD,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC7G,MAAM,WAAW,GAAG,WAAW;aAC5B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;aACrE,IAAI,CAAC,MAAM,CAAC,CAAC;QAEhB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAC;QAClE,MAAM,SAAS,GAAc;YAC3B,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,2BAA2B,WAAW,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE;YACrF,GAAG,IAAI;SACR,CAAC;QAEF,2DAA2D;QAC3D,MAAM,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAE5F,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,CAAC;QACvC,MAAM,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,YAAY,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,WAAW,GAAG,YAAY,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5G,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC;QAC1E,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC;QAExE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACvH,CAAC;IAEO,KAAK,CAAC,qBAAqB,CAAC,WAAmB;QACrD,sCAAsC;QACtC,IAAI,WAAW,CAAC,MAAM,IAAI,WAAW,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;QAChD,CAAC;QAED,uCAAuC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAC9D,MAAM,cAAc,GAAa,EAAE,CAAC;QAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAC7C,MAAM,CAAC,CAAC,CAAC,EACT,gBAAgB,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,MAAM,8DAA8D,CACxG,CAAC;YACF,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,MAAM,OAAO,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,2CAA2C;QAC3C,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,oBAAoB,CAC9B,UAAU,EACV,sBAAsB,CACvB,CAAC;IACJ,CAAC;IAEO,eAAe,CAAC,IAAY,EAAE,QAAgB;QACpD,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,OAAO,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC3B,IAAI,GAAG,GAAG,KAAK,GAAG,QAAQ,CAAC;YAC3B,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBACtB,6DAA6D;gBAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBAC/C,IAAI,QAAQ,GAAG,KAAK;oBAAE,GAAG,GAAG,QAAQ,CAAC;YACvC,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;YACpC,KAAK,GAAG,GAAG,CAAC;QACd,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAChC,IAAY,EACZ,WAAW,GAAG,0BAA0B;QAExC,8FAA8F;QAC9F,MAAM,MAAM,GAAG,GAAG,uBAAuB,OAAO,WAAW,qBAAqB,IAAI,yEAAyE,CAAC;QAE9J,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,EAAE;YAC9C,KAAK,EAAE,MAAM;YACb,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,MAAO;YAChB,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,iCAAiC,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC,CAAC;QAC/E,CAAC;QAED,OAAO,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACrC,CAAC;CACF;AAzHD,4CAyHC"}
@@ -0,0 +1,76 @@
1
+ import { EventEmitter } from 'events';
2
+ import { AgentConfig, GatewayConfig } from '../types';
3
+ import { SessionStore } from './store';
4
+ export declare class SessionProcess extends EventEmitter {
5
+ readonly sessionId: string;
6
+ readonly chatId: string;
7
+ readonly source: 'telegram' | 'discord' | 'api';
8
+ private readonly sessionChannel;
9
+ lastActivityAt: number;
10
+ spawnContext: {
11
+ loadedAtSpawn: number;
12
+ archivedCount: number;
13
+ messageCountAtSpawn: number;
14
+ } | null;
15
+ private process;
16
+ private stopping;
17
+ private restartCount;
18
+ private restartRequested;
19
+ private _processing;
20
+ private _pendingRestart;
21
+ private restartWatcher;
22
+ private readonly sessionStore;
23
+ private readonly agentConfig;
24
+ private readonly gatewayConfig;
25
+ private readonly logger;
26
+ private readonly configPath;
27
+ private readonly restartSignalPath;
28
+ queryMode: boolean;
29
+ private _queryResolve?;
30
+ private _queryBuffer;
31
+ private _queryTimer?;
32
+ private _querySettled;
33
+ constructor(sessionId: string, source: 'telegram' | 'discord' | 'api', agentConfig: AgentConfig, gatewayConfig: GatewayConfig, sessionStore: SessionStore, chatId?: string);
34
+ /**
35
+ * Read model from config.json on disk so restarts pick up changes made after startup.
36
+ * Falls back to the cached agentConfig.claude.model if config can't be read.
37
+ */
38
+ private readFreshModel;
39
+ start(): Promise<void>;
40
+ /**
41
+ * Watch for a restart signal file written by the agent.
42
+ * When detected, kill the current Claude process — scheduleRestart() will
43
+ * re-spawn it with the latest model from config.json.
44
+ */
45
+ private setupRestartWatcher;
46
+ private buildInitialPrompt;
47
+ /**
48
+ * Read stdio MCP servers from Claude Code's user-scoped config (~/.claude/settings.json).
49
+ * Returns empty object if file doesn't exist, can't be parsed, or has no mcpServers.
50
+ */
51
+ private readUserScopedMcp;
52
+ /**
53
+ * Read stdio MCP servers from Claude Code's project-scoped config (~/.claude.json).
54
+ * Looks up projects[workspace].mcpServers for the agent's workspace path.
55
+ * Returns empty object if not found or on any error.
56
+ */
57
+ private readProjectScopedMcp;
58
+ private writeMcpConfig;
59
+ /** Find the first API key that has access to this agent (agents: '*' or includes agentId). */
60
+ private findApiKeyForAgent;
61
+ private buildArgs;
62
+ private static toStreamJsonTurn;
63
+ private spawnProcess;
64
+ private scheduleRestart;
65
+ sendMessage(text: string): void;
66
+ query(prompt: string, timeoutMs?: number): Promise<string>;
67
+ get isProcessing(): boolean;
68
+ setProcessing(active: boolean): void;
69
+ interrupt(): boolean;
70
+ markPendingRestart(): void;
71
+ touch(): void;
72
+ isIdle(idleMs: number): boolean;
73
+ isRunning(): boolean;
74
+ stop(): Promise<void>;
75
+ }
76
+ //# sourceMappingURL=process.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/session/process.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAKtC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AASvC,qBAAa,cAAe,SAAQ,YAAY;IAC9C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,KAAK,CAAC;IAChD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyB;IACxD,cAAc,SAAc;IAC5B,YAAY,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,mBAAmB,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAQ;IAC1G,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,cAAc,CAAmC;IACzD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;IACzD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,SAAS,UAAS;IAClB,OAAO,CAAC,aAAa,CAAC,CAAyB;IAC/C,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,WAAW,CAAC,CAAgC;IACpD,OAAO,CAAC,aAAa,CAAS;gBAG5B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,KAAK,EACtC,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,YAAY,EAC1B,MAAM,CAAC,EAAE,MAAM;IAoBjB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAYhB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;YAiCb,kBAAkB;IA2ChC;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAUzB;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,cAAc;IAwDtB,8FAA8F;IAC9F,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,SAAS;IA6BjB,OAAO,CAAC,MAAM,CAAC,gBAAgB;YAOjB,YAAY;IA+S1B,OAAO,CAAC,eAAe;IAyBvB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAqB/B,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAqB1D,IAAI,YAAY,IAAI,OAAO,CAA6B;IAExD,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAUpC,SAAS,IAAI,OAAO;IAOpB,kBAAkB,IAAI,IAAI;IAQ1B,KAAK,IAAI,IAAI;IAIb,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAI/B,SAAS,IAAI,OAAO;IAId,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAmB5B"}