@thelapyae/geniclaw 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.
@@ -0,0 +1,311 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * Queue Processor - Handles messages from all channels
5
+ * Processes one message at a time to avoid race conditions
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ const fs_1 = __importDefault(require("fs"));
12
+ const path_1 = __importDefault(require("path"));
13
+ const os_1 = __importDefault(require("os"));
14
+ const generative_ai_1 = require("@google/generative-ai");
15
+ const dotenv_1 = __importDefault(require("dotenv"));
16
+ const config_manager_1 = require("./config-manager");
17
+ const session_manager_1 = require("./session-manager");
18
+ // Load environment variables
19
+ const SCRIPT_DIR = path_1.default.resolve(__dirname, '..');
20
+ const GENICLAW_WORK_DIR = process.env.GENICLAW_WORK_DIR || path_1.default.join(os_1.default.homedir(), '.geniclaw');
21
+ const GENICLAW_ENV_FILE = process.env.GENICLAW_ENV_FILE || path_1.default.join(GENICLAW_WORK_DIR, '.env');
22
+ dotenv_1.default.config({ path: GENICLAW_ENV_FILE });
23
+ const QUEUE_INCOMING = path_1.default.join(GENICLAW_WORK_DIR, 'queue/incoming');
24
+ const QUEUE_OUTGOING = path_1.default.join(GENICLAW_WORK_DIR, 'queue/outgoing');
25
+ const QUEUE_PROCESSING = path_1.default.join(GENICLAW_WORK_DIR, 'queue/processing');
26
+ const LOG_FILE = path_1.default.join(GENICLAW_WORK_DIR, 'logs/queue.log');
27
+ const RESET_FLAG = path_1.default.join(GENICLAW_WORK_DIR, 'reset_flag');
28
+ // Ensure directories exist
29
+ [QUEUE_INCOMING, QUEUE_OUTGOING, QUEUE_PROCESSING, path_1.default.dirname(LOG_FILE)].forEach(dir => {
30
+ if (!fs_1.default.existsSync(dir)) {
31
+ fs_1.default.mkdirSync(dir, { recursive: true });
32
+ }
33
+ });
34
+ // Logger
35
+ function log(level, message) {
36
+ const timestamp = new Date().toISOString();
37
+ const logMessage = `[${timestamp}] [${level}] ${message}\n`;
38
+ console.log(logMessage.trim());
39
+ fs_1.default.appendFileSync(LOG_FILE, logMessage);
40
+ }
41
+ // Initialize Gemini
42
+ let genAI;
43
+ const config = config_manager_1.ConfigManager.load();
44
+ const MODEL_NAME = config.geminiModel || process.env.GEMINI_MODEL || 'gemini-2.5-flash';
45
+ // Default conservative limit, can be increased based on model
46
+ const MAX_HISTORY_TOKENS = 100000;
47
+ async function initGemini() {
48
+ const config = config_manager_1.ConfigManager.load();
49
+ const API_KEY = config.geminiApiKey || process.env.GEMINI_API_KEY;
50
+ if (API_KEY) {
51
+ log('INFO', 'Using Gemini API Key');
52
+ genAI = new generative_ai_1.GoogleGenerativeAI(API_KEY);
53
+ }
54
+ else {
55
+ log('INFO', 'GEMINI_API_KEY not found in config or env.');
56
+ process.exit(1);
57
+ }
58
+ }
59
+ class HistoryManager {
60
+ static getHistoryPath() {
61
+ const sessionPath = session_manager_1.SessionManager.getActiveSessionPath();
62
+ return path_1.default.join(sessionPath, 'history.json');
63
+ }
64
+ static load() {
65
+ const historyFile = this.getHistoryPath();
66
+ if (fs_1.default.existsSync(historyFile)) {
67
+ try {
68
+ return JSON.parse(fs_1.default.readFileSync(historyFile, 'utf8'));
69
+ }
70
+ catch (e) {
71
+ log('ERROR', `Failed to load history: ${e.message}`);
72
+ return [];
73
+ }
74
+ }
75
+ return [];
76
+ }
77
+ static save(history) {
78
+ const historyFile = this.getHistoryPath();
79
+ try {
80
+ fs_1.default.writeFileSync(historyFile, JSON.stringify(history, null, 2));
81
+ }
82
+ catch (e) {
83
+ log('ERROR', `Failed to save history: ${e.message}`);
84
+ }
85
+ }
86
+ static clear() {
87
+ const historyFile = this.getHistoryPath();
88
+ if (fs_1.default.existsSync(historyFile)) {
89
+ fs_1.default.unlinkSync(historyFile);
90
+ }
91
+ }
92
+ }
93
+ // Memory Management
94
+ async function manageMemory(model, history, newContent) {
95
+ try {
96
+ // Calculate tokens
97
+ // We need to approximation or use countTokens if possible.
98
+ // To count tokens correctly, we need to construct the request.
99
+ // We'll approximate for speed or count if API allows.
100
+ // Construct full history for counting
101
+ const fullContent = [
102
+ ...history,
103
+ { role: 'user', parts: [{ text: newContent }] }
104
+ ];
105
+ // Format for countTokens
106
+ const contents = fullContent.map(item => ({
107
+ role: item.role,
108
+ parts: item.parts
109
+ }));
110
+ const { totalTokens } = await model.countTokens({ contents });
111
+ log('INFO', `Token usage: ${totalTokens} / ${MAX_HISTORY_TOKENS}`);
112
+ if (totalTokens > MAX_HISTORY_TOKENS) {
113
+ log('WARN', `Context limit exceeded (${totalTokens}). Pruning history...`);
114
+ // Sliding Window: Remove oldest messages until we fit.
115
+ // Always keep latest message (newContent).
116
+ // Strategy: Remove from index 0 until we fit.
117
+ let prunedHistory = [...history];
118
+ // Safety break
119
+ let attempts = 0;
120
+ while (prunedHistory.length > 0 && attempts < 100) {
121
+ // Remove 2 items (user + model pair) to keep conversation flow, or just 1.
122
+ // Removing 1 might mess up turns if model expects strict user/model alternation?
123
+ // Gemini usually handles it, but pairs are safer.
124
+ prunedHistory.shift();
125
+ const currentContents = [
126
+ ...prunedHistory,
127
+ { role: 'user', parts: [{ text: newContent }] }
128
+ ].map(item => ({ role: item.role, parts: item.parts }));
129
+ const { totalTokens: currentTokens } = await model.countTokens({ contents: currentContents });
130
+ if (currentTokens <= MAX_HISTORY_TOKENS) {
131
+ log('INFO', `Pruned to ${currentTokens} tokens.`);
132
+ return prunedHistory;
133
+ }
134
+ attempts++;
135
+ }
136
+ // If we cant fit even with empty history (just new message), we just return empty history
137
+ return [];
138
+ }
139
+ return history;
140
+ }
141
+ catch (e) {
142
+ log('ERROR', `Token counting failed: ${e.message}`);
143
+ return history;
144
+ }
145
+ }
146
+ // Process a single message
147
+ async function processMessage(messageFile) {
148
+ const processingFile = path_1.default.join(QUEUE_PROCESSING, path_1.default.basename(messageFile));
149
+ try {
150
+ // Move to processing
151
+ fs_1.default.renameSync(messageFile, processingFile);
152
+ // Read message
153
+ const messageData = JSON.parse(fs_1.default.readFileSync(processingFile, 'utf8'));
154
+ const { channel, sender, message, timestamp, messageId, ...otherFields } = messageData;
155
+ log('INFO', `Processing [${channel}] from ${sender}: ${message.substring(0, 50)}...`);
156
+ // Handle Reset Command
157
+ if (message.trim() === '/reset') {
158
+ log('INFO', 'šŸ”„ Resetting conversation history (User request)');
159
+ HistoryManager.clear();
160
+ const responseData = {
161
+ channel,
162
+ sender,
163
+ message: "Conversation history cleared.",
164
+ originalMessage: message,
165
+ timestamp: Date.now(),
166
+ messageId,
167
+ ...otherFields
168
+ };
169
+ const responseFile = path_1.default.join(QUEUE_OUTGOING, `${channel}_${messageId}_${Date.now()}.json`);
170
+ fs_1.default.writeFileSync(responseFile, JSON.stringify(responseData, null, 2));
171
+ fs_1.default.unlinkSync(processingFile);
172
+ return;
173
+ }
174
+ // Handle global reset flag
175
+ const shouldReset = fs_1.default.existsSync(RESET_FLAG);
176
+ if (shouldReset) {
177
+ log('INFO', 'šŸ”„ Resetting conversation history (Flag)');
178
+ HistoryManager.clear();
179
+ fs_1.default.unlinkSync(RESET_FLAG);
180
+ }
181
+ // --- Onboarding & Config ---
182
+ let config = config_manager_1.ConfigManager.load();
183
+ // Prepare System Instruction
184
+ let systemInstruction = "";
185
+ if (config.userName)
186
+ systemInstruction += `User's Name: ${config.userName}\n`;
187
+ if (config.botName)
188
+ systemInstruction += `Your Name: ${config.botName}\n`;
189
+ if (config.botPurpose)
190
+ systemInstruction += `Your Persona/Purpose: ${config.botPurpose}\n`;
191
+ // Get Model
192
+ if (!genAI)
193
+ await initGemini();
194
+ const model = genAI.getGenerativeModel({
195
+ model: MODEL_NAME,
196
+ systemInstruction: systemInstruction ? { role: 'system', parts: [{ text: systemInstruction }] } : undefined,
197
+ safetySettings: [
198
+ { category: generative_ai_1.HarmCategory.HARM_CATEGORY_HARASSMENT, threshold: generative_ai_1.HarmBlockThreshold.BLOCK_NONE },
199
+ { category: generative_ai_1.HarmCategory.HARM_CATEGORY_HATE_SPEECH, threshold: generative_ai_1.HarmBlockThreshold.BLOCK_NONE },
200
+ { category: generative_ai_1.HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT, threshold: generative_ai_1.HarmBlockThreshold.BLOCK_NONE },
201
+ { category: generative_ai_1.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, threshold: generative_ai_1.HarmBlockThreshold.BLOCK_NONE },
202
+ ]
203
+ });
204
+ // Load History
205
+ let history = HistoryManager.load();
206
+ // Check for Stats Command
207
+ if (message.trim() === '/stats') {
208
+ // Calculate current stats
209
+ let sessionName = config.activeSession || 'default';
210
+ let tokenCount = 0;
211
+ try {
212
+ const contents = history.map(item => ({ role: item.role, parts: item.parts }));
213
+ const result = await model.countTokens({ contents });
214
+ tokenCount = result.totalTokens;
215
+ }
216
+ catch (e) { }
217
+ const reply = `šŸ“Š **Session Stats**\nSession: \`${sessionName}\`\nHistory Length: ${history.length} turns\nTokens Used: ~${tokenCount} / ${MAX_HISTORY_TOKENS}`;
218
+ const responseData = {
219
+ channel,
220
+ sender,
221
+ message: reply,
222
+ originalMessage: message,
223
+ timestamp: Date.now(),
224
+ messageId,
225
+ ...otherFields
226
+ };
227
+ const responseFile = path_1.default.join(QUEUE_OUTGOING, `${channel}_${messageId}_${Date.now()}.json`);
228
+ fs_1.default.writeFileSync(responseFile, JSON.stringify(responseData, null, 2));
229
+ fs_1.default.unlinkSync(processingFile);
230
+ return;
231
+ }
232
+ // Memory Management: Prune if necessary
233
+ history = await manageMemory(model, history, message);
234
+ // Generate
235
+ let responseText;
236
+ try {
237
+ const chat = model.startChat({ history: history });
238
+ const result = await chat.sendMessage(message);
239
+ const response = await result.response;
240
+ responseText = response.text();
241
+ // Save History
242
+ history.push({ role: 'user', parts: [{ text: message }] });
243
+ history.push({ role: 'model', parts: [{ text: responseText }] });
244
+ HistoryManager.save(history);
245
+ }
246
+ catch (error) {
247
+ log('ERROR', `Gemini error: ${error.message}`);
248
+ responseText = "Sorry, I encountered an error processing your request with Gemini.";
249
+ }
250
+ // Write Response
251
+ const responseData = {
252
+ channel,
253
+ sender,
254
+ message: responseText.trim(),
255
+ originalMessage: message,
256
+ timestamp: Date.now(),
257
+ messageId,
258
+ ...otherFields
259
+ };
260
+ const responseFile = channel === 'heartbeat'
261
+ ? path_1.default.join(QUEUE_OUTGOING, `${messageId}.json`)
262
+ : path_1.default.join(QUEUE_OUTGOING, `${channel}_${messageId}_${Date.now()}.json`);
263
+ fs_1.default.writeFileSync(responseFile, JSON.stringify(responseData, null, 2));
264
+ log('INFO', `āœ“ Response ready [${channel}] ${sender}`);
265
+ // Cleanup
266
+ fs_1.default.unlinkSync(processingFile);
267
+ }
268
+ catch (error) {
269
+ log('ERROR', `Processing error: ${error.message}`);
270
+ if (fs_1.default.existsSync(processingFile)) {
271
+ try {
272
+ fs_1.default.renameSync(processingFile, messageFile);
273
+ }
274
+ catch (e) {
275
+ log('ERROR', "Failed to move file back");
276
+ }
277
+ }
278
+ }
279
+ }
280
+ // Loop
281
+ async function processQueue() {
282
+ try {
283
+ const files = fs_1.default.readdirSync(QUEUE_INCOMING)
284
+ .filter(f => f.endsWith('.json'))
285
+ .map(f => ({
286
+ name: f,
287
+ path: path_1.default.join(QUEUE_INCOMING, f),
288
+ time: fs_1.default.statSync(path_1.default.join(QUEUE_INCOMING, f)).mtimeMs
289
+ }))
290
+ .sort((a, b) => a.time - b.time);
291
+ if (files.length > 0) {
292
+ for (const file of files) {
293
+ await processMessage(file.path);
294
+ }
295
+ }
296
+ }
297
+ catch (error) {
298
+ log('ERROR', `Queue loop error: ${error.message}`);
299
+ }
300
+ }
301
+ // Start
302
+ initGemini().then(() => {
303
+ log('INFO', `Queue processor started with model: ${MODEL_NAME}`);
304
+ log('INFO', `Watching: ${QUEUE_INCOMING}`);
305
+ const currentSession = config_manager_1.ConfigManager.load().activeSession || 'default';
306
+ log('INFO', `Active Session: ${currentSession}`);
307
+ setInterval(processQueue, 1000);
308
+ });
309
+ process.on('SIGINT', () => process.exit(0));
310
+ process.on('SIGTERM', () => process.exit(0));
311
+ //# sourceMappingURL=queue-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-processor.js","sourceRoot":"","sources":["../src/queue-processor.ts"],"names":[],"mappings":";;AACA;;;GAGG;;;;;AAEH,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AACpB,yDAA6F;AAE7F,oDAA4B;AAC5B,qDAA4D;AAC5D,uDAAmD;AAEnD,6BAA6B;AAC7B,MAAM,UAAU,GAAG,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AACjD,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAChG,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,cAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;AAChG,gBAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;AAE3C,MAAM,cAAc,GAAG,cAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;AACtE,MAAM,cAAc,GAAG,cAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;AACtE,MAAM,gBAAgB,GAAG,cAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;AAC1E,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;AAChE,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;AAE9D,2BAA2B;AAC3B,CAAC,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;IACrF,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,YAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,SAAS;AACT,SAAS,GAAG,CAAC,KAAa,EAAE,OAAe;IACvC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,UAAU,GAAG,IAAI,SAAS,MAAM,KAAK,KAAK,OAAO,IAAI,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/B,YAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AAC5C,CAAC;AAED,oBAAoB;AACpB,IAAI,KAAyB,CAAC;AAC9B,MAAM,MAAM,GAAG,8BAAa,CAAC,IAAI,EAAE,CAAC;AACpC,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,kBAAkB,CAAC;AACxF,8DAA8D;AAC9D,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC,KAAK,UAAU,UAAU;IACrB,MAAM,MAAM,GAAG,8BAAa,CAAC,IAAI,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAElE,IAAI,OAAO,EAAE,CAAC;QACV,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;QACpC,KAAK,GAAG,IAAI,kCAAkB,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;SAAM,CAAC;QACJ,GAAG,CAAC,MAAM,EAAE,4CAA4C,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC;AAQD,MAAM,cAAc;IAChB,MAAM,CAAC,cAAc;QACjB,MAAM,WAAW,GAAG,gCAAc,CAAC,oBAAoB,EAAE,CAAC;QAC1D,OAAO,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,CAAC,IAAI;QACP,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1C,IAAI,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;YAC5D,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,GAAG,CAAC,OAAO,EAAE,2BAA4B,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;gBAChE,OAAO,EAAE,CAAC;YACd,CAAC;QACL,CAAC;QACD,OAAO,EAAE,CAAC;IACd,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,OAAsB;QAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1C,IAAI,CAAC;YACD,YAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,GAAG,CAAC,OAAO,EAAE,2BAA4B,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,CAAC;IACL,CAAC;IAED,MAAM,CAAC,KAAK;QACR,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1C,IAAI,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAC/B,CAAC;IACL,CAAC;CACJ;AAED,oBAAoB;AACpB,KAAK,UAAU,YAAY,CAAC,KAAU,EAAE,OAAsB,EAAE,UAAkB;IAC9E,IAAI,CAAC;QACD,mBAAmB;QACnB,2DAA2D;QAC3D,+DAA+D;QAC/D,sDAAsD;QAEtD,sCAAsC;QACtC,MAAM,WAAW,GAAG;YAChB,GAAG,OAAO;YACV,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE;SAClD,CAAC;QAEF,yBAAyB;QACzB,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;SACpB,CAAC,CAAC,CAAC;QAEJ,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9D,GAAG,CAAC,MAAM,EAAE,gBAAgB,WAAW,MAAM,kBAAkB,EAAE,CAAC,CAAC;QAEnE,IAAI,WAAW,GAAG,kBAAkB,EAAE,CAAC;YACnC,GAAG,CAAC,MAAM,EAAE,2BAA2B,WAAW,uBAAuB,CAAC,CAAC;YAE3E,uDAAuD;YACvD,2CAA2C;YAC3C,8CAA8C;YAC9C,IAAI,aAAa,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;YAEjC,eAAe;YACf,IAAI,QAAQ,GAAG,CAAC,CAAC;YACjB,OAAO,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,GAAG,GAAG,EAAE,CAAC;gBAC/C,2EAA2E;gBAC3E,kFAAkF;gBAClF,kDAAkD;gBAClD,aAAa,CAAC,KAAK,EAAE,CAAC;gBAEtB,MAAM,eAAe,GAAG;oBACpB,GAAG,aAAa;oBAChB,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE;iBAClD,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAExD,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC;gBAC9F,IAAI,aAAa,IAAI,kBAAkB,EAAE,CAAC;oBACtC,GAAG,CAAC,MAAM,EAAE,aAAa,aAAa,UAAU,CAAC,CAAC;oBAClD,OAAO,aAAa,CAAC;gBACzB,CAAC;gBACD,QAAQ,EAAE,CAAC;YAChB,CAAC;YACA,0FAA0F;YAC1F,OAAO,EAAE,CAAC;QACf,CAAC;QAED,OAAO,OAAO,CAAC;IACnB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,GAAG,CAAC,OAAO,EAAE,0BAA2B,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/D,OAAO,OAAO,CAAC;IACnB,CAAC;AACL,CAAC;AAqBD,2BAA2B;AAC3B,KAAK,UAAU,cAAc,CAAC,WAAmB;IAC7C,MAAM,cAAc,GAAG,cAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,cAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;IAE/E,IAAI,CAAC;QACD,qBAAqB;QACrB,YAAE,CAAC,UAAU,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAE3C,eAAe;QACf,MAAM,WAAW,GAAgB,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC;QACrF,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,WAAW,EAAE,GAAG,WAAW,CAAC;QAEvF,GAAG,CAAC,MAAM,EAAE,eAAe,OAAO,UAAU,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;QAEtF,uBAAuB;QACvB,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,QAAQ,EAAE,CAAC;YAC7B,GAAG,CAAC,MAAM,EAAE,kDAAkD,CAAC,CAAC;YAChE,cAAc,CAAC,KAAK,EAAE,CAAC;YACvB,MAAM,YAAY,GAAiB;gBAChC,OAAO;gBACP,MAAM;gBACN,OAAO,EAAE,+BAA+B;gBACxC,eAAe,EAAE,OAAO;gBACxB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,SAAS;gBACT,GAAG,WAAW;aACjB,CAAC;YACF,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,OAAO,IAAI,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC7F,YAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACtE,YAAE,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;YAC9B,OAAO;QACX,CAAC;QAED,2BAA2B;QAC3B,MAAM,WAAW,GAAG,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,WAAW,EAAE,CAAC;YACd,GAAG,CAAC,MAAM,EAAE,0CAA0C,CAAC,CAAC;YACxD,cAAc,CAAC,KAAK,EAAE,CAAC;YACvB,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC9B,CAAC;QAED,8BAA8B;QAC9B,IAAI,MAAM,GAAG,8BAAa,CAAC,IAAI,EAAE,CAAC;QAElC,6BAA6B;QAC7B,IAAI,iBAAiB,GAAG,EAAE,CAAC;QAC3B,IAAI,MAAM,CAAC,QAAQ;YAAE,iBAAiB,IAAI,gBAAgB,MAAM,CAAC,QAAQ,IAAI,CAAC;QAC9E,IAAI,MAAM,CAAC,OAAO;YAAE,iBAAiB,IAAI,cAAc,MAAM,CAAC,OAAO,IAAI,CAAC;QAC1E,IAAI,MAAM,CAAC,UAAU;YAAE,iBAAiB,IAAI,yBAAyB,MAAM,CAAC,UAAU,IAAI,CAAC;QAE3F,YAAY;QACZ,IAAI,CAAC,KAAK;YAAE,MAAM,UAAU,EAAE,CAAC;QAE/B,MAAM,KAAK,GAAG,KAAK,CAAC,kBAAkB,CAAC;YACnC,KAAK,EAAE,UAAU;YACjB,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;YAC3G,cAAc,EAAE;gBACZ,EAAE,QAAQ,EAAE,4BAAY,CAAC,wBAAwB,EAAE,SAAS,EAAE,kCAAkB,CAAC,UAAU,EAAE;gBAC7F,EAAE,QAAQ,EAAE,4BAAY,CAAC,yBAAyB,EAAE,SAAS,EAAE,kCAAkB,CAAC,UAAU,EAAE;gBAC9F,EAAE,QAAQ,EAAE,4BAAY,CAAC,+BAA+B,EAAE,SAAS,EAAE,kCAAkB,CAAC,UAAU,EAAE;gBACpG,EAAE,QAAQ,EAAE,4BAAY,CAAC,+BAA+B,EAAE,SAAS,EAAE,kCAAkB,CAAC,UAAU,EAAE;aACvG;SACJ,CAAC,CAAC;QAEH,eAAe;QACf,IAAI,OAAO,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC;QAEpC,0BAA0B;QAC1B,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,QAAQ,EAAE,CAAC;YAC7B,0BAA0B;YAC1B,IAAI,WAAW,GAAG,MAAM,CAAC,aAAa,IAAI,SAAS,CAAC;YACpD,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,IAAI,CAAC;gBACF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC/E,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACrD,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;YACnC,CAAC;YAAC,OAAM,CAAC,EAAE,CAAC,CAAA,CAAC;YAEb,MAAM,KAAK,GAAG,oCAAoC,WAAW,uBAAuB,OAAO,CAAC,MAAM,yBAAyB,UAAU,MAAM,kBAAkB,EAAE,CAAC;YAEhK,MAAM,YAAY,GAAiB;gBAChC,OAAO;gBACP,MAAM;gBACN,OAAO,EAAE,KAAK;gBACd,eAAe,EAAE,OAAO;gBACxB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,SAAS;gBACT,GAAG,WAAW;aACjB,CAAC;YACF,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,OAAO,IAAI,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC7F,YAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACtE,YAAE,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;YAC9B,OAAO;QACX,CAAC;QAED,wCAAwC;QACxC,OAAO,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAEtD,WAAW;QACX,IAAI,YAAoB,CAAC;QACzB,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;YACnD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACvC,YAAY,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;YAE/B,eAAe;YACf,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;YACjE,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,GAAG,CAAC,OAAO,EAAE,iBAAkB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1D,YAAY,GAAG,oEAAoE,CAAC;QACxF,CAAC;QAED,iBAAiB;QACjB,MAAM,YAAY,GAAiB;YAC/B,OAAO;YACP,MAAM;YACN,OAAO,EAAE,YAAY,CAAC,IAAI,EAAE;YAC5B,eAAe,EAAE,OAAO;YACxB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,SAAS;YACT,GAAG,WAAW;SACjB,CAAC;QAEF,MAAM,YAAY,GAAG,OAAO,KAAK,WAAW;YACxC,CAAC,CAAC,cAAI,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,SAAS,OAAO,CAAC;YAChD,CAAC,CAAC,cAAI,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,OAAO,IAAI,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAE9E,YAAE,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEtE,GAAG,CAAC,MAAM,EAAE,qBAAqB,OAAO,KAAK,MAAM,EAAE,CAAC,CAAC;QAEvD,UAAU;QACV,YAAE,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;IAElC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,GAAG,CAAC,OAAO,EAAE,qBAAsB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9D,IAAI,YAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC;gBACD,YAAE,CAAC,UAAU,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;YAC/C,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,GAAG,CAAC,OAAO,EAAE,0BAA0B,CAAC,CAAC;YAC7C,CAAC;QACL,CAAC;IACL,CAAC;AACL,CAAC;AAQD,OAAO;AACP,KAAK,UAAU,YAAY;IACvB,IAAI,CAAC;QACD,MAAM,KAAK,GAAgB,YAAE,CAAC,WAAW,CAAC,cAAc,CAAC;aACpD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;aAChC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACP,IAAI,EAAE,CAAC;YACP,IAAI,EAAE,cAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;YAClC,IAAI,EAAE,YAAE,CAAC,QAAQ,CAAC,cAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO;SAC1D,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;QAErC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACvB,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpC,CAAC;QACL,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,GAAG,CAAC,OAAO,EAAE,qBAAsB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IAClE,CAAC;AACL,CAAC;AAED,QAAQ;AACR,UAAU,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;IACnB,GAAG,CAAC,MAAM,EAAE,uCAAuC,UAAU,EAAE,CAAC,CAAC;IACjE,GAAG,CAAC,MAAM,EAAE,aAAa,cAAc,EAAE,CAAC,CAAC;IAC3C,MAAM,cAAc,GAAG,8BAAa,CAAC,IAAI,EAAE,CAAC,aAAa,IAAI,SAAS,CAAC;IACvE,GAAG,CAAC,MAAM,EAAE,mBAAmB,cAAc,EAAE,CAAC,CAAC;IACjD,WAAW,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;AACpC,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ export interface Session {
2
+ name: string;
3
+ path: string;
4
+ lastModified: number;
5
+ isActive: boolean;
6
+ }
7
+ export declare class SessionManager {
8
+ static init(): void;
9
+ static listSessions(): Session[];
10
+ static createSession(name: string): boolean;
11
+ static switchSession(name: string): boolean;
12
+ static deleteSession(name: string): boolean;
13
+ static getActiveSessionPath(): string;
14
+ }
15
+ //# sourceMappingURL=session-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../src/session-manager.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,OAAO;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,cAAc;IACvB,MAAM,CAAC,IAAI;IAWX,MAAM,CAAC,YAAY,IAAI,OAAO,EAAE;IAoBhC,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAc3C,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAW3C,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAkB3C,MAAM,CAAC,oBAAoB,IAAI,MAAM;CAMxC"}
@@ -0,0 +1,84 @@
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.SessionManager = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const config_manager_1 = require("./config-manager");
10
+ const SESSIONS_DIR = path_1.default.join(config_manager_1.GENICLAW_WORK_DIR, 'sessions');
11
+ class SessionManager {
12
+ static init() {
13
+ if (!fs_1.default.existsSync(SESSIONS_DIR)) {
14
+ fs_1.default.mkdirSync(SESSIONS_DIR, { recursive: true });
15
+ }
16
+ // Ensure 'default' session exists
17
+ const defaultSession = path_1.default.join(SESSIONS_DIR, 'default');
18
+ if (!fs_1.default.existsSync(defaultSession)) {
19
+ fs_1.default.mkdirSync(defaultSession, { recursive: true });
20
+ }
21
+ }
22
+ static listSessions() {
23
+ this.init();
24
+ const config = config_manager_1.ConfigManager.load();
25
+ const activeSession = config.activeSession || 'default';
26
+ return fs_1.default.readdirSync(SESSIONS_DIR)
27
+ .filter(file => fs_1.default.statSync(path_1.default.join(SESSIONS_DIR, file)).isDirectory())
28
+ .map(name => {
29
+ const sessionPath = path_1.default.join(SESSIONS_DIR, name);
30
+ const stats = fs_1.default.statSync(sessionPath);
31
+ return {
32
+ name,
33
+ path: sessionPath,
34
+ lastModified: stats.mtimeMs,
35
+ isActive: name === activeSession
36
+ };
37
+ })
38
+ .sort((a, b) => b.lastModified - a.lastModified);
39
+ }
40
+ static createSession(name) {
41
+ this.init();
42
+ // Sanitize name (basic)
43
+ const safeName = name.replace(/[^a-zA-Z0-9_-]/g, '_');
44
+ const sessionPath = path_1.default.join(SESSIONS_DIR, safeName);
45
+ if (fs_1.default.existsSync(sessionPath)) {
46
+ return false; // Already exists
47
+ }
48
+ fs_1.default.mkdirSync(sessionPath, { recursive: true });
49
+ return true;
50
+ }
51
+ static switchSession(name) {
52
+ this.init();
53
+ const sessionPath = path_1.default.join(SESSIONS_DIR, name);
54
+ if (!fs_1.default.existsSync(sessionPath)) {
55
+ return false;
56
+ }
57
+ config_manager_1.ConfigManager.update({ activeSession: name });
58
+ return true;
59
+ }
60
+ static deleteSession(name) {
61
+ this.init();
62
+ if (name === 'default')
63
+ return false; // Cannot delete default
64
+ const sessionPath = path_1.default.join(SESSIONS_DIR, name);
65
+ if (fs_1.default.existsSync(sessionPath)) {
66
+ fs_1.default.rmSync(sessionPath, { recursive: true, force: true });
67
+ // If active session was deleted, switch to default
68
+ const config = config_manager_1.ConfigManager.load();
69
+ if (config.activeSession === name) {
70
+ this.switchSession('default');
71
+ }
72
+ return true;
73
+ }
74
+ return false;
75
+ }
76
+ static getActiveSessionPath() {
77
+ this.init();
78
+ const config = config_manager_1.ConfigManager.load();
79
+ const active = config.activeSession || 'default';
80
+ return path_1.default.join(SESSIONS_DIR, active);
81
+ }
82
+ }
83
+ exports.SessionManager = SessionManager;
84
+ //# sourceMappingURL=session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../src/session-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":""}
package/dist/setup.js ADDED
@@ -0,0 +1,67 @@
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
+ const readline_1 = __importDefault(require("readline"));
7
+ const config_manager_1 = require("./config-manager");
8
+ const rl = readline_1.default.createInterface({
9
+ input: process.stdin,
10
+ output: process.stdout
11
+ });
12
+ const question = (query) => {
13
+ return new Promise((resolve) => {
14
+ rl.question(query, resolve);
15
+ });
16
+ };
17
+ async function setup() {
18
+ console.log('\nšŸ¤– \x1b[34mGeniclaw Setup\x1b[0m\n');
19
+ const config = config_manager_1.ConfigManager.load();
20
+ let updated = false;
21
+ // Gemini API Key
22
+ if (!config.geminiApiKey) {
23
+ console.log('\x1b[33mGemini API Key not found.\x1b[0m');
24
+ const key = await question('Enter GEMINI_API_KEY: ');
25
+ if (key.trim()) {
26
+ config.geminiApiKey = key.trim();
27
+ updated = true;
28
+ }
29
+ }
30
+ else {
31
+ console.log('āœ… Gemini API Key found.');
32
+ }
33
+ // Telegram Bot Token
34
+ if (!config.telegramBotToken) {
35
+ console.log('\n\x1b[33mTelegram Bot Token not found.\x1b[0m');
36
+ const token = await question('Enter TELEGRAM_BOT_TOKEN: ');
37
+ if (token.trim()) {
38
+ config.telegramBotToken = token.trim();
39
+ updated = true;
40
+ }
41
+ }
42
+ else {
43
+ console.log('āœ… Telegram Bot Token found.');
44
+ }
45
+ // Allowed User ID
46
+ if (!config.telegramAllowedUserId) {
47
+ console.log('\n\x1b[36mSecurity (Optional)\x1b[0m');
48
+ const userId = await question('Enter Allowed Telegram User ID (leave empty for public): ');
49
+ if (userId.trim()) {
50
+ config.telegramAllowedUserId = userId.trim();
51
+ updated = true;
52
+ }
53
+ }
54
+ else {
55
+ console.log('āœ… Allowed User ID found.');
56
+ }
57
+ if (updated) {
58
+ config_manager_1.ConfigManager.save(config);
59
+ console.log('\n\x1b[32mConfiguration saved to config.json\x1b[0m');
60
+ }
61
+ else {
62
+ console.log('\nConfiguration is up to date.');
63
+ }
64
+ rl.close();
65
+ }
66
+ setup();
67
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":";;;;;AAAA,wDAAgC;AAChC,qDAAiD;AAEjD,MAAM,EAAE,GAAG,kBAAQ,CAAC,eAAe,CAAC;IAChC,KAAK,EAAE,OAAO,CAAC,KAAK;IACpB,MAAM,EAAE,OAAO,CAAC,MAAM;CACzB,CAAC,CAAC;AAEH,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAmB,EAAE;IAChD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3B,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,KAAK,UAAU,KAAK;IAChB,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IAEpD,MAAM,MAAM,GAAG,8BAAa,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,iBAAiB;IACjB,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACxD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,wBAAwB,CAAC,CAAC;QACrD,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YACb,MAAM,CAAC,YAAY,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;YACjC,OAAO,GAAG,IAAI,CAAC;QACnB,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAC3C,CAAC;IAED,qBAAqB;IACrB,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,4BAA4B,CAAC,CAAC;QAC3D,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YACf,MAAM,CAAC,gBAAgB,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YACvC,OAAO,GAAG,IAAI,CAAC;QACnB,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC/C,CAAC;IAED,kBAAkB;IAClB,IAAI,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,2DAA2D,CAAC,CAAC;QAC3F,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAChB,MAAM,CAAC,qBAAqB,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;YAC7C,OAAO,GAAG,IAAI,CAAC;QACnB,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACV,8BAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;IACvE,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAClD,CAAC;IAED,EAAE,CAAC,KAAK,EAAE,CAAC;AACf,CAAC;AAED,KAAK,EAAE,CAAC"}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Telegram Client for Geniclaw Gemini
4
+ * Writes messages to queue and reads responses
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=telegram-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram-client.d.ts","sourceRoot":"","sources":["../src/telegram-client.ts"],"names":[],"mappings":";AACA;;;GAGG"}