lucifer-gate 0.4.0 → 0.4.2-alpha.3.0fe78b9

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 (24) hide show
  1. package/README.md +65 -18
  2. package/dist/server/cli.js +83 -9
  3. package/dist/server/cli.js.map +1 -1
  4. package/dist/server/create_app.js +17 -18
  5. package/dist/server/create_app.js.map +1 -1
  6. package/dist/server/domains/command-gateway/api/register_approval_routes.js +13 -7
  7. package/dist/server/domains/command-gateway/api/register_approval_routes.js.map +1 -1
  8. package/dist/server/domains/command-gateway/config/gateway_config.js +9 -0
  9. package/dist/server/domains/command-gateway/config/gateway_config.js.map +1 -1
  10. package/dist/server/domains/command-gateway/repository/api_key_store.js +6 -0
  11. package/dist/server/domains/command-gateway/repository/api_key_store.js.map +1 -1
  12. package/dist/server/domains/command-gateway/service/request_telegram_approval.js +30 -7
  13. package/dist/server/domains/command-gateway/service/request_telegram_approval.js.map +1 -1
  14. package/dist/server/domains/command-gateway/service/telegram_pairing.js +135 -0
  15. package/dist/server/domains/command-gateway/service/telegram_pairing.js.map +1 -0
  16. package/dist/server/domains/platform-api/config/server_config.js +0 -2
  17. package/dist/server/domains/platform-api/config/server_config.js.map +1 -1
  18. package/dist/server/lib/json_config_writer.js +28 -0
  19. package/dist/server/lib/json_config_writer.js.map +1 -0
  20. package/dist/server/lib/logger.js +29 -4
  21. package/dist/server/lib/logger.js.map +1 -1
  22. package/dist/server/test/telegram-e2e-setup.js +146 -0
  23. package/dist/server/test/telegram-e2e-setup.js.map +1 -0
  24. package/package.json +5 -20
package/README.md CHANGED
@@ -35,7 +35,7 @@ curl -X POST http://localhost:3001/api/v1/execute \
35
35
 
36
36
  Generated by `--init`, hand-editable:
37
37
 
38
- **config/lucifer.json** - Server settings (port, timeouts, limits)
38
+ **config/lucifer.json** - Server settings (port, timeouts, limits, log file path)
39
39
 
40
40
  **config/api-keys.json** - API key definitions (hashed, with optional IP allowlists)
41
41
 
@@ -56,15 +56,29 @@ Rules matched top-to-bottom, first match wins.
56
56
  ## Production setup (with Telegram)
57
57
 
58
58
  1. Create a Telegram bot via [@BotFather](https://t.me/BotFather) and get the token
59
- 2. Send any message to your bot, then get your chat ID from `https://api.telegram.org/bot<TOKEN>/getUpdates`
60
- 3. Run:
59
+ 2. Send any message to your bot from the chat you want to use for approvals
60
+ 3. Run the pairing command:
61
61
 
62
62
  ```bash
63
- LUCIFER_TELEGRAM_TOKEN=your_bot_token \
64
- LUCIFER_TELEGRAM_CHAT_ID=your_chat_id \
65
- npx lucifer-gate --config ./config/lucifer.json
63
+ LUCIFER_TELEGRAM_TOKEN=your_bot_token npx lucifer-gate pair --config ./config/lucifer.json
66
64
  ```
67
65
 
66
+ The pairing wizard will:
67
+ - Validate your bot token
68
+ - List all chats that have messaged the bot (most recent first)
69
+ - Let you pick which chat to use for approvals
70
+ - Send a 6-digit verification code to that chat
71
+ - Ask you to enter the code to prove you can read the chat
72
+ - Save the chat ID to `config/lucifer.json`
73
+
74
+ 4. Start the server (no `LUCIFER_TELEGRAM_CHAT_ID` env var needed — it's in the config):
75
+
76
+ ```bash
77
+ LUCIFER_TELEGRAM_TOKEN=your_bot_token npx lucifer-gate --config ./config/lucifer.json
78
+ ```
79
+
80
+ > **Manual alternative:** You can still set `LUCIFER_TELEGRAM_CHAT_ID` as an environment variable instead of using `pair`. The env var takes precedence over the config file value.
81
+
68
82
  When a `telegram_approve` command arrives, you'll see an inline keyboard in Telegram:
69
83
 
70
84
  ```
@@ -121,11 +135,12 @@ Codes: `MISSING_API_KEY`, `INVALID_API_KEY`, `IP_NOT_ALLOWED`, `RATE_LIMITED`, `
121
135
  ## CLI
122
136
 
123
137
  ```
124
- lucifer-gate --init [dir] Generate starter config + API key
125
- lucifer-gate --config <path> Start server with config
126
- lucifer-gate --auto-approve Dev mode (no Telegram)
127
- lucifer-gate log [--limit N] Query audit log
128
- lucifer-gate stats Show approval statistics
138
+ lucifer-gate --init [dir] Generate starter config + API key
139
+ lucifer-gate pair [--config <path>] Pair a Telegram chat for approvals
140
+ lucifer-gate --config <path> Start server with config
141
+ lucifer-gate --auto-approve Dev mode (no Telegram)
142
+ lucifer-gate log [--limit N] Query audit log
143
+ lucifer-gate stats Show approval statistics
129
144
  ```
130
145
 
131
146
  ## Docker
@@ -140,14 +155,46 @@ docker run -p 3001:3001 \
140
155
  lucifer-gate
141
156
  ```
142
157
 
158
+ ## Logging
159
+
160
+ Lucifer logs to **both console and file** by default.
161
+
162
+ **Console output** is human-readable (colorized, formatted) when `pino-pretty` is available, and falls back to structured JSON otherwise. `pino-pretty` is included when you clone the repo and run `npm install`, but is not bundled with the published npm package — so `npx lucifer-gate` uses JSON console output. This is expected and fully functional.
163
+
164
+ **File output** is always structured JSON (one object per line), written to `data/lucifer.log` by default. Each line is a complete JSON object, making it easy to search, filter, and feed into log aggregators.
165
+
166
+ File logging is enabled via `config/lucifer.json`:
167
+
168
+ ```json
169
+ {
170
+ "logFile": "lucifer.log",
171
+ ...
172
+ }
173
+ ```
174
+
175
+ The `logFile` path is relative to `dataDir` (default: `data/lucifer.log`). Remove the key to disable file logging. The `--init` command generates the config with file logging enabled.
176
+
177
+ **Log levels** (controlled via `LOG_LEVEL` env var):
178
+ - `debug` — verbose output (default in development)
179
+ - `info` — normal operations (default in production, when `NODE_ENV=production`)
180
+ - `warn` — potential issues
181
+ - `error` — failures only
182
+
183
+ Example:
184
+ ```bash
185
+ LOG_LEVEL=info LUCIFER_TELEGRAM_TOKEN=your_token npx lucifer-gate --config ./config/lucifer.json
186
+ ```
187
+
143
188
  ## Environment variables
144
189
 
145
190
  | Variable | Required | Description |
146
191
  |---|---|---|
147
192
  | `LUCIFER_TELEGRAM_TOKEN` | Yes (prod) | Telegram bot token from @BotFather |
148
- | `LUCIFER_TELEGRAM_CHAT_ID` | Yes (prod) | Telegram chat ID for approvals |
193
+ | `LUCIFER_TELEGRAM_CHAT_ID` | No | Telegram chat ID (use `pair` command instead, or set manually) |
149
194
  | `LUCIFER_ADMIN_SECRET` | No | Bearer token for admin endpoints |
150
195
  | `PORT` | No | Server port (default: 3001) |
196
+ | `LOG_LEVEL` | No | Log level: `debug`, `info`, `warn`, `error` (default: `debug` / `info` in production) |
197
+ | `NODE_ENV` | No | Set to `production` for production defaults (info log level, no pretty-printing) |
151
198
 
152
199
  ## Architecture
153
200
 
@@ -157,18 +204,18 @@ server/src/domains/
157
204
  types/ CommandRequest, Approval, types
158
205
  config/ Gateway configuration
159
206
  repository/ SQLite stores, JSON config readers
160
- service/ Auth, rules, risk analysis, execution
161
- api/ Express routes
162
- platform-api/ Health check (existing)
207
+ service/ Auth, rules, risk analysis, execution, approvals
208
+ api/ Execute routes + web approval UI routes
209
+ platform-api/ Health endpoint + server runtime wiring
163
210
  ```
164
211
 
165
- Dependency flow: Types -> Config -> Repository -> Service -> API
212
+ Dependency flow: Types -> Config -> Repository -> Service -> Runtime -> UI/API
166
213
 
167
214
  ## Stack
168
215
 
169
216
  - Express 5 + TypeScript
170
217
  - SQLite (better-sqlite3) for approvals + audit
171
218
  - Telegraf for Telegram bot
172
- - Pino for structured logging
219
+ - Optional server-delivered web approval UI with SSE updates
220
+ - Pino for structured logging (pino-pretty for human-readable console output in dev)
173
221
  - Vitest for testing
174
- - React 19 + Vite 8 (admin UI planned for v1.1)
@@ -1,11 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import { writeFileSync, existsSync, mkdirSync } from 'node:fs';
3
3
  import { resolve, join } from 'node:path';
4
+ import { createInterface } from 'node:readline/promises';
4
5
  import { createApp } from './create_app.js';
5
- import { generateApiKey } from './domains/command-gateway/repository/api_key_store.js';
6
+ import { generateApiKey, generateAdminSecret } from './domains/command-gateway/repository/api_key_store.js';
6
7
  import { getDatabase } from './domains/command-gateway/repository/database.js';
7
8
  import { createAuditLog } from './domains/command-gateway/repository/audit_log.js';
8
9
  import { createApprovalStore } from './domains/command-gateway/repository/approval_store.js';
10
+ import { runTelegramPairing } from './domains/command-gateway/service/telegram_pairing.js';
11
+ import { getTelegramToken } from './domains/command-gateway/config/gateway_config.js';
12
+ import { updateJsonConfig } from './lib/json_config_writer.js';
9
13
  import { logger } from './lib/logger.js';
10
14
  const args = process.argv.slice(2);
11
15
  function printHelp() {
@@ -13,10 +17,11 @@ function printHelp() {
13
17
  lucifer-gate - AI Agent Command Firewall
14
18
 
15
19
  Usage:
16
- lucifer-gate [options] Start the server
17
- lucifer-gate --init [dir] Generate starter config files
18
- lucifer-gate log [--limit N] Query audit log
19
- lucifer-gate stats Show approval statistics
20
+ lucifer-gate [options] Start the server
21
+ lucifer-gate --init [dir] Generate starter config files
22
+ lucifer-gate pair [--config <path>] Pair a Telegram chat for approvals
23
+ lucifer-gate log [--limit N] Query audit log
24
+ lucifer-gate stats Show approval statistics
20
25
 
21
26
  Server options:
22
27
  --config <path> Path to lucifer.json (default: ./config/lucifer.json)
@@ -27,9 +32,9 @@ Server options:
27
32
 
28
33
  Environment variables:
29
34
  LUCIFER_TELEGRAM_TOKEN Telegram bot token (required for production)
30
- LUCIFER_TELEGRAM_CHAT_ID Telegram chat ID for approvals
31
- LUCIFER_ADMIN_SECRET Admin API bearer token (optional)
35
+ LUCIFER_TELEGRAM_CHAT_ID Telegram chat ID for approvals (or use 'pair' command)
32
36
  PORT Server port (default: 3001)
37
+ LOG_LEVEL Log level: debug, info, warn, error (default: debug / info in production)
33
38
  `);
34
39
  }
35
40
  function initConfig(targetDir) {
@@ -46,8 +51,11 @@ function initConfig(targetDir) {
46
51
  return;
47
52
  }
48
53
  const { key, salt, keyHash } = generateApiKey();
54
+ const { secret: adminSecret, salt: adminSalt, secretHash: adminHash } = generateAdminSecret();
49
55
  writeFileSync(luciferJsonPath, JSON.stringify({
50
56
  port: 3001,
57
+ adminSecretHash: adminHash,
58
+ adminSecretSalt: adminSalt,
51
59
  approvalTimeoutSeconds: 300,
52
60
  executionTimeoutSeconds: 120,
53
61
  maxConcurrentExecutions: 5,
@@ -55,6 +63,7 @@ function initConfig(targetDir) {
55
63
  rateLimitPerMinute: 10,
56
64
  onApprovalTimeout: 'deny',
57
65
  dataDir: '../data',
66
+ logFile: 'lucifer.log',
58
67
  }, null, 2) + '\n');
59
68
  writeFileSync(apiKeysPath, JSON.stringify({
60
69
  keys: [{
@@ -87,12 +96,18 @@ function initConfig(targetDir) {
87
96
  console.log('Your API key (save this, it cannot be recovered):');
88
97
  console.log(` ${key}`);
89
98
  console.log('');
99
+ console.log('Your admin secret for the web approval UI (save this, it cannot be recovered):');
100
+ console.log(` ${adminSecret}`);
101
+ console.log('');
90
102
  console.log('Quick start:');
91
103
  console.log(' # Dev mode (no Telegram needed):');
92
104
  console.log(` LUCIFER_TELEGRAM_TOKEN=skip lucifer-gate --config ${luciferJsonPath} --auto-approve`);
93
105
  console.log('');
94
- console.log(' # Production (set your Telegram bot token):');
95
- console.log(` LUCIFER_TELEGRAM_TOKEN=your_token LUCIFER_TELEGRAM_CHAT_ID=your_chat_id lucifer-gate --config ${luciferJsonPath}`);
106
+ console.log(' # Production pair your Telegram chat first:');
107
+ console.log(` LUCIFER_TELEGRAM_TOKEN=your_token lucifer-gate pair --config ${luciferJsonPath}`);
108
+ console.log('');
109
+ console.log(' # Then start the server:');
110
+ console.log(` LUCIFER_TELEGRAM_TOKEN=your_token lucifer-gate --config ${luciferJsonPath}`);
96
111
  }
97
112
  async function runLog(limit) {
98
113
  const dataDir = getArgValue('--data-dir') ?? './data';
@@ -165,6 +180,61 @@ async function runStats() {
165
180
  }
166
181
  }
167
182
  }
183
+ function createReadlinePairingIO() {
184
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
185
+ return {
186
+ print(msg) {
187
+ console.log(msg);
188
+ },
189
+ async choose(prompt, options) {
190
+ console.log(`\n${prompt}`);
191
+ for (let i = 0; i < options.length; i++) {
192
+ console.log(` ${i + 1}. ${options[i]}`);
193
+ }
194
+ while (true) {
195
+ const answer = await rl.question(`\nEnter number (1-${options.length}): `);
196
+ const num = Number.parseInt(answer.trim(), 10);
197
+ if (num >= 1 && num <= options.length)
198
+ return num - 1;
199
+ console.log(`Please enter a number between 1 and ${options.length}.`);
200
+ }
201
+ },
202
+ async confirm(prompt) {
203
+ const answer = await rl.question(`${prompt} [y/N] `);
204
+ return /^y(es)?$/i.test(answer.trim());
205
+ },
206
+ async prompt(msg) {
207
+ return rl.question(`${msg} `);
208
+ },
209
+ close() {
210
+ rl.close();
211
+ },
212
+ };
213
+ }
214
+ async function runPair() {
215
+ const configPath = resolve(getArgValue('--config') ?? './config/lucifer.json');
216
+ let token;
217
+ try {
218
+ token = getTelegramToken();
219
+ }
220
+ catch {
221
+ console.error('LUCIFER_TELEGRAM_TOKEN environment variable is required for pairing.\n' +
222
+ 'Create a bot via @BotFather on Telegram and set the token:\n\n' +
223
+ ' LUCIFER_TELEGRAM_TOKEN=your_token lucifer-gate pair');
224
+ process.exit(1);
225
+ }
226
+ const io = createReadlinePairingIO();
227
+ try {
228
+ const result = await runTelegramPairing(token, io);
229
+ updateJsonConfig(configPath, { telegramChatId: result.chatId });
230
+ console.log(`\nChat ID ${result.chatId} saved to ${configPath}`);
231
+ console.log('You can now start Lucifer without LUCIFER_TELEGRAM_CHAT_ID:');
232
+ console.log(`\n LUCIFER_TELEGRAM_TOKEN=your_token lucifer-gate --config ${configPath}`);
233
+ }
234
+ finally {
235
+ io.close();
236
+ }
237
+ }
168
238
  function getArgValue(flag) {
169
239
  const idx = args.indexOf(flag);
170
240
  if (idx === -1 || idx >= args.length - 1)
@@ -181,6 +251,10 @@ async function main() {
181
251
  initConfig(dir);
182
252
  return;
183
253
  }
254
+ if (args[0] === 'pair') {
255
+ await runPair();
256
+ return;
257
+ }
184
258
  if (args[0] === 'log') {
185
259
  const limitStr = getArgValue('--limit');
186
260
  await runLog(limitStr ? parseInt(limitStr, 10) : 50);
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../server/src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../server/src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,uDAAuD,CAAC;AAC5G,OAAO,EAAE,WAAW,EAAE,MAAM,kDAAkD,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,mDAAmD,CAAC;AACnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,wDAAwD,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,MAAM,uDAAuD,CAAC;AAC3F,OAAO,EAAE,gBAAgB,EAAE,MAAM,oDAAoD,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAGzC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEnC,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;CAsBb,CAAC,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,SAAiB;IACnC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC3C,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAExC,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IACrD,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;IAE/D,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,0BAA0B,eAAe,EAAE,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAChD,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,mBAAmB,EAAE,CAAC;IAE9F,aAAa,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC;QAC5C,IAAI,EAAE,IAAI;QACV,eAAe,EAAE,SAAS;QAC1B,eAAe,EAAE,SAAS;QAC1B,sBAAsB,EAAE,GAAG;QAC3B,uBAAuB,EAAE,GAAG;QAC5B,uBAAuB,EAAE,CAAC;QAC1B,cAAc,EAAE,QAAQ;QACxB,kBAAkB,EAAE,EAAE;QACtB,iBAAiB,EAAE,MAAM;QACzB,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,aAAa;KACvB,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAEpB,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC;QACxC,IAAI,EAAE,CAAC;gBACL,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;gBACvB,IAAI,EAAE,SAAS;gBACf,OAAO;gBACP,IAAI;gBACJ,UAAU,EAAE,EAAE;gBACd,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,MAAM,EAAE,IAAI;aACb,CAAC;KACH,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAEpB,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC;QAC7C,KAAK,EAAE;YACL,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE;YAC7C,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,gBAAgB,EAAE;YAClD,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,kBAAkB,EAAE;YAClD,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,kBAAkB,EAAE;YAClD,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE;YAChD,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,kBAAkB,EAAE;YACjD,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE;SACzC;QACD,aAAa,EAAE,aAAa;KAC7B,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAEpB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,KAAK,eAAe,EAAE,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,KAAK,WAAW,EAAE,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,KAAK,gBAAgB,EAAE,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACxB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,gFAAgF,CAAC,CAAC;IAC9F,OAAO,CAAC,GAAG,CAAC,KAAK,WAAW,EAAE,CAAC,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,uDAAuD,eAAe,iBAAiB,CAAC,CAAC;IACrG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,kEAAkE,eAAe,EAAE,CAAC,CAAC;IACjG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,6DAA6D,eAAe,EAAE,CAAC,CAAC;AAC9F,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,KAAa;IACjC,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,CAAC,IAAI,QAAQ,CAAC;IACtD,MAAM,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEtC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;IACxC,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAChE,MAAM,KAAK,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1D,IAAI,KAAK,CAAC,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,KAAK,CAAC,UAAU;YAAE,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;QAC5D,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAClG,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,IAAI,CAAC,CAAC;QACrG,IAAI,KAAK,CAAC,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAChC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ;IACrB,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,CAAC,IAAI,QAAQ,CAAC;IACtD,MAAM,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC;IACpC,MAAM,aAAa,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAE9C,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;IAEjE,MAAM,eAAe,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC;IAE/F,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,uBAAuB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,uBAAuB,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,uBAAuB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,uBAAuB,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,uBAAuB,eAAe,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,uBAAuB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAErD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAW,CAAC,CAAC;QACvF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;YAChF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,eAAe;IACf,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YACd,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACzD,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC/B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB;IAC9B,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAE7E,OAAO;QACL,KAAK,CAAC,GAAW;YACf,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,MAAc,EAAE,OAAiB;YAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;YAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3C,CAAC;YAED,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC;gBAC3E,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC/C,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM;oBAAE,OAAO,GAAG,GAAG,CAAC,CAAC;gBACtD,OAAO,CAAC,GAAG,CAAC,uCAAuC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,MAAc;YAC1B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,MAAM,SAAS,CAAC,CAAC;YACrD,OAAO,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,GAAW;YACtB,OAAO,EAAE,CAAC,QAAQ,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;QAChC,CAAC;QAED,KAAK;YACH,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,OAAO;IACpB,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,uBAAuB,CAAC,CAAC;IAE/E,IAAI,KAAa,CAAC;IAClB,IAAI,CAAC;QACH,KAAK,GAAG,gBAAgB,EAAE,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CACX,wEAAwE;YACxE,gEAAgE;YAChE,uDAAuD,CACxD,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,GAAG,uBAAuB,EAAE,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACnD,gBAAgB,CAAC,UAAU,EAAE,EAAE,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,MAAM,aAAa,UAAU,EAAE,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,+DAA+D,UAAU,EAAE,CAAC,CAAC;IAC3F,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3D,OAAO,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;AACvB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,SAAS,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;QAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;QAC3B,UAAU,CAAC,GAAG,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,OAAO,EAAE,CAAC;QAChB,OAAO;IACT,CAAC;IAED,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;QACtB,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IAED,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;QACxB,MAAM,QAAQ,EAAE,CAAC;QACjB,OAAO;IACT,CAAC;IAED,cAAc;IACd,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAEpD,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC;QAC7C,UAAU;QACV,WAAW;KACZ,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,mBAAmB,CAAC,CAAC;QACrE,MAAM,KAAK,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC7B,MAAM,IAAI,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACjC,CAAC;AAED,IAAI,CAAC;IACH,MAAM,IAAI,EAAE,CAAC;AACf,CAAC;AAAC,OAAO,GAAG,EAAE,CAAC;IACb,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -5,7 +5,7 @@ import { getServerConfig } from './domains/platform-api/config/server_config.js'
5
5
  import { registerHealthRoutes } from './domains/platform-api/api/register_health_routes.js';
6
6
  import { createRuntimeMetadataRepository } from './domains/platform-api/repository/runtime_metadata_repository.js';
7
7
  import { createHealthReportService } from './domains/platform-api/service/create_health_report.js';
8
- import { loadGatewayConfig, getAdminSecret } from './domains/command-gateway/config/gateway_config.js';
8
+ import { loadGatewayConfig } from './domains/command-gateway/config/gateway_config.js';
9
9
  import { getDatabase, closeDatabase } from './domains/command-gateway/repository/database.js';
10
10
  import { createApprovalStore } from './domains/command-gateway/repository/approval_store.js';
11
11
  import { createAuditLog } from './domains/command-gateway/repository/audit_log.js';
@@ -18,9 +18,9 @@ import { createAutoApproveChannel } from './domains/command-gateway/service/auto
18
18
  import { createWebApprovalChannel } from './domains/command-gateway/service/web_approval_channel.js';
19
19
  import { createMultiApprovalChannel } from './domains/command-gateway/service/multi_approval_channel.js';
20
20
  import { registerApprovalRoutes } from './domains/command-gateway/api/register_approval_routes.js';
21
- import { createChildLogger } from './lib/logger.js';
21
+ import { createChildLogger, addLogFile } from './lib/logger.js';
22
22
  const log = createChildLogger('app');
23
- function initApprovalChannel(deps, autoApprove) {
23
+ function initApprovalChannel(deps, autoApprove, telegramApiRoot) {
24
24
  if (autoApprove) {
25
25
  return createAutoApproveChannel();
26
26
  }
@@ -29,18 +29,20 @@ function initApprovalChannel(deps, autoApprove) {
29
29
  const telegramToken = process.env.LUCIFER_TELEGRAM_TOKEN;
30
30
  const chatId = gatewayConfig.telegramChatId ?? process.env.LUCIFER_TELEGRAM_CHAT_ID;
31
31
  if (telegramToken && chatId) {
32
- channels.push(createTelegramApprovalChannel(telegramToken, chatId, pendingStore, approvalStore, auditLog));
32
+ const telegramOptions = telegramApiRoot ? { apiRoot: telegramApiRoot } : undefined;
33
+ channels.push(createTelegramApprovalChannel(telegramToken, chatId, pendingStore, approvalStore, auditLog, telegramOptions));
33
34
  }
34
- const adminSecret = getAdminSecret();
35
- if (adminSecret) {
35
+ const adminSecretHash = gatewayConfig.adminSecretHash;
36
+ const adminSecretSalt = gatewayConfig.adminSecretSalt;
37
+ if (adminSecretHash && adminSecretSalt) {
36
38
  const webChannel = createWebApprovalChannel();
37
39
  channels.push(webChannel);
38
- registerApprovalRoutes({ router: app, adminSecret, webChannel, approvalStore, auditLog });
40
+ registerApprovalRoutes({ router: app, adminSecretHash, adminSecretSalt, webChannel, approvalStore, auditLog });
39
41
  log.info('Web approval UI enabled at /admin/approvals');
40
42
  }
41
43
  if (channels.length === 0) {
42
44
  throw new Error('No approval channels configured. Set LUCIFER_TELEGRAM_TOKEN + LUCIFER_TELEGRAM_CHAT_ID for Telegram, ' +
43
- 'or LUCIFER_ADMIN_SECRET for web UI, or use --auto-approve for development.');
45
+ 'or run --init to generate admin secret for web UI, or use --auto-approve for development.');
44
46
  }
45
47
  return channels.length === 1 ? channels[0] : createMultiApprovalChannel(channels);
46
48
  }
@@ -49,9 +51,6 @@ export function createApp(options = {}) {
49
51
  const metadataRepository = createRuntimeMetadataRepository();
50
52
  const getHealthReport = createHealthReportService(serverConfig, metadataRepository);
51
53
  const app = express();
52
- const indexPath = path.join(serverConfig.clientDistPath, 'index.html');
53
- const hasBuiltClient = fs.existsSync(indexPath);
54
- const indexMarkup = hasBuiltClient ? fs.readFileSync(indexPath, 'utf8') : null;
55
54
  app.disable('x-powered-by');
56
55
  app.use(express.json());
57
56
  registerHealthRoutes(app, getHealthReport);
@@ -63,6 +62,12 @@ export function createApp(options = {}) {
63
62
  // Resolve dataDir relative to config directory
64
63
  const resolvedDataDir = path.resolve(configDir, gatewayConfig.dataDir);
65
64
  gatewayConfig.dataDir = resolvedDataDir;
65
+ // Enable file logging (logFile is relative to dataDir)
66
+ if (gatewayConfig.logFile) {
67
+ const logPath = path.resolve(resolvedDataDir, gatewayConfig.logFile);
68
+ addLogFile(logPath);
69
+ log.info({ logFile: logPath }, 'File logging enabled');
70
+ }
66
71
  let approvalChannel;
67
72
  let cleanupInterval;
68
73
  // Only initialize gateway if config files exist
@@ -73,7 +78,7 @@ export function createApp(options = {}) {
73
78
  const apiKeyStore = createApiKeyStore(apiKeysPath);
74
79
  const commandRulesStore = createCommandRulesStore(commandRulesPath);
75
80
  const pendingStore = createPendingRequestStore();
76
- approvalChannel = initApprovalChannel({ app, pendingStore, approvalStore, auditLog, gatewayConfig }, options.autoApprove ?? false);
81
+ approvalChannel = initApprovalChannel({ app, pendingStore, approvalStore, auditLog, gatewayConfig }, options.autoApprove ?? false, options.telegramApiRoot);
77
82
  registerExecuteRoutes({
78
83
  router: app, config: gatewayConfig, apiKeyStore, commandRulesStore,
79
84
  approvalStore, pendingStore, auditLog, approvalChannel,
@@ -92,12 +97,6 @@ export function createApp(options = {}) {
92
97
  if (process.env.NODE_ENV === 'production') {
93
98
  log.warn('Ensure HTTPS is configured for production. API keys are transmitted in headers.');
94
99
  }
95
- if (hasBuiltClient && indexMarkup !== null) {
96
- app.use(express.static(serverConfig.clientDistPath));
97
- app.get(/^(?!\/api\/).*/, (_request, response) => {
98
- response.type('html').send(indexMarkup);
99
- });
100
- }
101
100
  async function start() {
102
101
  if (approvalChannel) {
103
102
  await approvalChannel.start();
@@ -1 +1 @@
1
- {"version":3,"file":"create_app.js","sourceRoot":"","sources":["../../server/src/create_app.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create_app.js","sourceRoot":"","sources":["../../server/src/create_app.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import fs from 'node:fs';
2
2
  import path from 'node:path';
3
- import { randomUUID } from 'node:crypto';
3
+ import { randomUUID, timingSafeEqual, scryptSync } from 'node:crypto';
4
4
  import { fileURLToPath } from 'node:url';
5
5
  import rateLimit from 'express-rate-limit';
6
6
  import { createChildLogger } from '../../../lib/logger.js';
@@ -20,7 +20,13 @@ setInterval(() => {
20
20
  }
21
21
  }
22
22
  }, 5_000);
23
- function checkAdminAuth(adminSecret, req, res) {
23
+ function verifyAdminSecret(rawSecret, hash, salt) {
24
+ const computed = scryptSync(rawSecret, salt, 64).toString('hex');
25
+ if (computed.length !== hash.length)
26
+ return false;
27
+ return timingSafeEqual(Buffer.from(computed), Buffer.from(hash));
28
+ }
29
+ function checkAdminAuth(adminSecretHash, adminSecretSalt, req, res) {
24
30
  const ip = req.headers['x-forwarded-for']?.split(',')[0]?.trim() ?? req.socket.remoteAddress ?? 'unknown';
25
31
  // Check lockout
26
32
  const limit = authRateLimits.get(ip);
@@ -36,7 +42,7 @@ function checkAdminAuth(adminSecret, req, res) {
36
42
  }
37
43
  const authHeader = req.headers.authorization;
38
44
  const token = authHeader?.startsWith('Bearer ') ? authHeader.slice(7) : undefined;
39
- if (!token || token !== adminSecret) {
45
+ if (!token || !verifyAdminSecret(token, adminSecretHash, adminSecretSalt)) {
40
46
  // Track failure
41
47
  const current = authRateLimits.get(ip) ?? { failures: 0, lockedUntil: 0 };
42
48
  current.failures++;
@@ -81,7 +87,7 @@ function isValidationError(result) {
81
87
  return 'code' in result;
82
88
  }
83
89
  export function registerApprovalRoutes(deps) {
84
- const { router, adminSecret, webChannel, approvalStore, auditLog } = deps;
90
+ const { router, adminSecretHash, adminSecretSalt, webChannel, approvalStore, auditLog } = deps;
85
91
  // Rate limiter middleware for admin API routes
86
92
  const adminRateLimiter = rateLimit({
87
93
  windowMs: 60_000,
@@ -106,13 +112,13 @@ export function registerApprovalRoutes(deps) {
106
112
  });
107
113
  // List pending requests
108
114
  router.get('/api/v1/admin/approvals/pending', adminRateLimiter, (req, res) => {
109
- if (!checkAdminAuth(adminSecret, req, res))
115
+ if (!checkAdminAuth(adminSecretHash, adminSecretSalt, req, res))
110
116
  return;
111
117
  res.json({ pending: webChannel.getPendingRequests() });
112
118
  });
113
119
  // Exchange bearer token for one-time SSE ticket
114
120
  router.post('/api/v1/admin/approvals/stream-ticket', adminRateLimiter, (req, res) => {
115
- if (!checkAdminAuth(adminSecret, req, res))
121
+ if (!checkAdminAuth(adminSecretHash, adminSecretSalt, req, res))
116
122
  return;
117
123
  const token = randomUUID();
118
124
  sseTickets.set(token, { token, createdAt: Date.now() });
@@ -154,7 +160,7 @@ export function registerApprovalRoutes(deps) {
154
160
  });
155
161
  // Approve or deny a request
156
162
  router.post('/api/v1/admin/approvals/:requestId/decide', adminRateLimiter, (req, res) => {
157
- if (!checkAdminAuth(adminSecret, req, res))
163
+ if (!checkAdminAuth(adminSecretHash, adminSecretSalt, req, res))
158
164
  return;
159
165
  const requestId = Array.isArray(req.params.requestId) ? req.params.requestId[0] : req.params.requestId;
160
166
  const validated = validateDecideInput(req.body);
@@ -1 +1 @@
1
- {"version":3,"file":"register_approval_routes.js","sourceRoot":"","sources":["../../../../../server/src/domains/command-gateway/api/register_approval_routes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"register_approval_routes.js","sourceRoot":"","sources":["../../../../../server/src/domains/command-gateway/api/register_approval_routes.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,14 @@ function isLuciferConfig(data) {
23
23
  return false;
24
24
  if (!checkOptionalType(d, 'dataDir', 'string'))
25
25
  return false;
26
+ if (!checkOptionalType(d, 'telegramChatId', 'string'))
27
+ return false;
28
+ if (!checkOptionalType(d, 'adminSecretHash', 'string'))
29
+ return false;
30
+ if (!checkOptionalType(d, 'adminSecretSalt', 'string'))
31
+ return false;
32
+ if (!checkOptionalType(d, 'logFile', 'string'))
33
+ return false;
26
34
  return true;
27
35
  }
28
36
  const defaults = {
@@ -57,6 +65,7 @@ export function getTelegramToken() {
57
65
  }
58
66
  return token;
59
67
  }
68
+ /** @deprecated Admin secret is now stored as a hash in lucifer.json. Use config.adminSecretHash instead. */
60
69
  export function getAdminSecret() {
61
70
  return process.env.LUCIFER_ADMIN_SECRET;
62
71
  }
@@ -1 +1 @@
1
- {"version":3,"file":"gateway_config.js","sourceRoot":"","sources":["../../../../../server/src/domains/command-gateway/config/gateway_config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gateway_config.js","sourceRoot":"","sources":["../../../../../server/src/domains/command-gateway/config/gateway_config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEpE,SAAS,iBAAiB,CAAC,CAA0B,EAAE,GAAW,EAAE,YAAoB;IACtF,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,YAAY,CAAC;AAChE,CAAC;AAED,SAAS,eAAe,CAAC,IAAa;IACpC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC5D,MAAM,CAAC,GAAG,IAA+B,CAAC;IAC1C,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1D,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,wBAAwB,EAAE,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5E,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,yBAAyB,EAAE,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7E,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,yBAAyB,EAAE,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7E,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,gBAAgB,EAAE,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IACpE,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,oBAAoB,EAAE,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IACxE,IAAI,CAAC,CAAC,iBAAiB,KAAK,SAAS,IAAI,CAAC,CAAC,iBAAiB,KAAK,MAAM,IAAI,CAAC,CAAC,iBAAiB,KAAK,sBAAsB;QAAE,OAAO,KAAK,CAAC;IACxI,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7D,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,gBAAgB,EAAE,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IACpE,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,iBAAiB,EAAE,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IACrE,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,iBAAiB,EAAE,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IACrE,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,QAAQ,GAAkB;IAC9B,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI;IACtC,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB;IACpD,sBAAsB,EAAE,GAAG;IAC3B,uBAAuB,EAAE,GAAG;IAC5B,uBAAuB,EAAE,CAAC;IAC1B,cAAc,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;IAChC,kBAAkB,EAAE,EAAE;IACtB,iBAAiB,EAAE,MAAM;IACzB,OAAO,EAAE,QAAQ;CAClB,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,UAAmB;IACnD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,cAAc,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IAE7D,OAAO;QACL,GAAG,QAAQ;QACX,GAAG,MAAM;QACT,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI;QAClC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO;KAC5C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC;IACjD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,2DAA2D;YAC3D,4DAA4D,CAC7D,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,4GAA4G;AAC5G,MAAM,UAAU,cAAc;IAC5B,OAAO,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;AAC1C,CAAC"}
@@ -37,6 +37,12 @@ export function generateApiKey() {
37
37
  const keyHash = hashApiKey(key, salt);
38
38
  return { key, salt, keyHash };
39
39
  }
40
+ export function generateAdminSecret() {
41
+ const secret = 'luc_admin_' + randomBytes(24).toString('hex');
42
+ const salt = randomBytes(16).toString('hex');
43
+ const secretHash = hashApiKey(secret, salt);
44
+ return { secret, salt, secretHash };
45
+ }
40
46
  export function createApiKeyStore(configPath) {
41
47
  let config;
42
48
  function load() {
@@ -1 +1 @@
1
- {"version":3,"file":"api_key_store.js","sourceRoot":"","sources":["../../../../../server/src/domains/command-gateway/repository/api_key_store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api_key_store.js","sourceRoot":"","sources":["../../../../../server/src/domains/command-gateway/repository/api_key_store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEvE,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,MAAM,GAAG,GAAG,iBAAiB,CAAC,eAAe,CAAC,CAAC;AAE/C,SAAS,eAAe,CAAC,GAAY;IACnC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC1D,MAAM,CAAC,GAAG,GAA8B,CAAC;IACzC,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAChD,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAClD,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAChD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,IAAa;IACpC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC5D,MAAM,CAAC,GAAG,IAA+B,CAAC;IAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACzC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,IAAY;IAClD,OAAO,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,GAAG,GAAG,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACtC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,MAAM,MAAM,GAAG,YAAY,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AACtC,CAAC;AAOD,MAAM,UAAU,iBAAiB,CAAC,UAAkB;IAClD,IAAI,MAAqB,CAAC;IAE1B,SAAS,IAAI;QACX,MAAM,GAAG,cAAc,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QACrD,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,EAAE,CAAC;IAEP,OAAO;QACL,SAAS,CAAC,MAAc;YACtB,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBACpC,IAAI,CAAC,SAAS,CAAC,MAAM;oBAAE,SAAS;gBAChC,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;gBAChD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,OAAO,CAAC,MAAM,IAAI,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;oBACnH,OAAO,SAAS,CAAC;gBACnB,CAAC;YACH,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM;YACJ,IAAI,EAAE,CAAC;QACT,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,8 +1,21 @@
1
1
  import { Telegraf, Markup } from 'telegraf';
2
2
  import { createChildLogger } from '../../../lib/logger.js';
3
3
  const log = createChildLogger('telegram');
4
- export function createTelegramApprovalChannel(token, chatId, pendingStore, approvalStore, auditLog) {
5
- const bot = new Telegraf(token);
4
+ export function createTelegramApprovalChannel(token, chatId, pendingStore, approvalStore, auditLog, options) {
5
+ const telegrafOptions = options?.apiRoot
6
+ ? { telegram: { apiRoot: options.apiRoot } }
7
+ : {};
8
+ const bot = new Telegraf(token, telegrafOptions);
9
+ /** Notify the user that a request has expired; errors are swallowed. */
10
+ async function dismissExpiredRequest(ctx, requestId) {
11
+ try {
12
+ await ctx.answerCbQuery('Request expired or already decided');
13
+ await ctx.editMessageReplyMarkup(undefined);
14
+ }
15
+ catch (err) {
16
+ log.warn({ requestId, err }, 'Failed to update Telegram message for expired request');
17
+ }
18
+ }
6
19
  bot.on('callback_query', async (ctx) => {
7
20
  const data = 'data' in ctx.callbackQuery ? ctx.callbackQuery.data : undefined;
8
21
  if (!data)
@@ -21,8 +34,7 @@ export function createTelegramApprovalChannel(token, chatId, pendingStore, appro
21
34
  const [action, requestId, matchType, duration] = parts;
22
35
  const pending = pendingStore.get(requestId);
23
36
  if (!pending) {
24
- await ctx.answerCbQuery('Request expired or already decided');
25
- await ctx.editMessageReplyMarkup(undefined);
37
+ await dismissExpiredRequest(ctx, requestId);
26
38
  return;
27
39
  }
28
40
  const decision = action === 'approve' ? 'approved' : 'denied';
@@ -45,8 +57,13 @@ export function createTelegramApprovalChannel(token, chatId, pendingStore, appro
45
57
  pendingStore.resolve(requestId, decision);
46
58
  const emoji = decision === 'approved' ? '\u2705' : '\u274c';
47
59
  const label = decision === 'approved' ? `Approved (${matchType} ${duration}h)` : 'Denied';
48
- await ctx.answerCbQuery(label);
49
- await ctx.editMessageText(`${emoji} ${label}\n\n${pending.command}`);
60
+ try {
61
+ await ctx.answerCbQuery(label);
62
+ await ctx.editMessageText(`${emoji} ${label}\n\n${pending.command}`);
63
+ }
64
+ catch (err) {
65
+ log.warn({ requestId, err }, 'Failed to update Telegram message after decision');
66
+ }
50
67
  });
51
68
  // Track per-request decision metadata from callbacks
52
69
  const decisionMeta = new Map();
@@ -113,7 +130,13 @@ export function createTelegramApprovalChannel(token, chatId, pendingStore, appro
113
130
  return approvalPromise;
114
131
  },
115
132
  async start() {
116
- await bot.launch();
133
+ // bot.launch() resolves only when polling stops (i.e. on shutdown).
134
+ // Start it as a background task so start() can return promptly.
135
+ bot.launch().catch(err => {
136
+ log.debug({ err }, 'Bot launch promise settled');
137
+ });
138
+ // Verify the bot token is valid and we can reach the API
139
+ await bot.telegram.getMe();
117
140
  log.info('Telegram bot started');
118
141
  // Startup health check
119
142
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"request_telegram_approval.js","sourceRoot":"","sources":["../../../../../server/src/domains/command-gateway/service/request_telegram_approval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAK5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,MAAM,GAAG,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;AAE1C,MAAM,UAAU,6BAA6B,CAC3C,KAAa,EACb,MAAc,EACd,YAAiC,EACjC,aAA4B,EAC5B,QAAkB;IAElB,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEhC,GAAG,CAAC,EAAE,CAAC,gBAAgB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,MAAM,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9E,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,qDAAqD;QACrD,MAAM,cAAc,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC;QACvE,IAAI,cAAc,KAAK,MAAM,EAAE,CAAC;YAC9B,GAAG,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,iCAAiC,CAAC,CAAC;YACxF,MAAM,GAAG,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;YACxC,OAAO;QACT,CAAC;QAED,6DAA6D;QAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC/B,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC;QAEvD,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,GAAG,CAAC,aAAa,CAAC,oCAAoC,CAAC,CAAC;YAC9D,MAAM,GAAG,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAqB,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;QAEhF,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;YAC5B,MAAM,eAAe,GAAG,SAAS,KAAK,QAAQ;gBAC5C,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBACpD,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;YAEpB,aAAa,CAAC,WAAW,CACvB,eAAe,EACf,SAA8B,EAC9B,QAAQ,EACR,YAAY,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,CACxC,CAAC;QACJ,CAAC;QAED,4EAA4E;QAC5E,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,SAA8B,EAAE,QAAQ,EAAE,CAAC,CAAC;QAErF,QAAQ,CAAC,MAAM,CAAC;YACd,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,IAAI,EAAE,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ;YACrD,SAAS;YACT,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,QAAQ,EAAE,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;YACxD,UAAU,EAAE,YAAY,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE;SACpD,CAAC,CAAC;QAEH,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAE1C,MAAM,KAAK,GAAG,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC5D,MAAM,KAAK,GAAG,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,aAAa,SAAS,IAAI,QAAQ,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC1F,MAAM,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,GAAG,CAAC,eAAe,CACvB,GAAG,KAAK,IAAI,KAAK,OAAO,OAAO,CAAC,OAAO,EAAE,CAC1C,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,qDAAqD;IACrD,MAAM,YAAY,GAAG,IAAI,GAAG,EAA8D,CAAC;IAE3F,OAAO;QACL,KAAK,CAAC,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,YAAY;YACpE,iFAAiF;YACjF,MAAM,eAAe,GAAG,IAAI,OAAO,CAAiF,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACtI,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;oBACxD,OAAO;gBACT,CAAC;gBAED,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;gBACxC,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;gBAEtC,OAAO,CAAC,OAAO,GAAG,CAAC,QAA0B,EAAE,EAAE;oBAC/C,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,OAA4B,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;oBACvG,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;oBAC/B,eAAe,CAAC,QAAQ,CAAC,CAAC;oBAC1B,OAAO,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC5E,CAAC,CAAC;gBAEF,OAAO,CAAC,MAAM,GAAG,CAAC,MAAa,EAAE,EAAE;oBACjC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;oBAC/B,cAAc,CAAC,MAAM,CAAC,CAAC;oBACvB,MAAM,CAAC,MAAM,CAAC,CAAC;gBACjB,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,IAAI,IAAI,GAAG,mCAAmC,CAAC;YAC/C,IAAI,IAAI,WAAW,UAAU,OAAO,EAAE,KAAK,CAAC;YAC5C,IAAI,IAAI,SAAS,SAAS,QAAQ,CAAC;YACnC,IAAI,IAAI,WAAW,OAAO,UAAU,CAAC;YAErC,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrC,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,wBAAwB,CAAC;gBAClG,IAAI,IAAI,OAAO,IAAI,KAAK,CAAC;gBACzB,IAAI,IAAI,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9D,CAAC;YAED,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC;gBACrC;oBACE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,SAAS,UAAU,CAAC;oBAClE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,SAAS,UAAU,CAAC;oBAClE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,WAAW,SAAS,kBAAkB,CAAC;iBAC/E;gBACD;oBACE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,MAAM,EAAE,WAAW,SAAS,WAAW,CAAC;oBACzE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,MAAM,EAAE,WAAW,SAAS,WAAW,CAAC;iBAC1E;gBACD;oBACE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,QAAQ,SAAS,UAAU,CAAC;iBACnE;aACF,CAAC,CAAC;YAEH,MAAM,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE;gBAC3C,UAAU,EAAE,UAAU;gBACtB,GAAG,QAAQ;aACZ,CAAC,CAAC;YAEH,QAAQ,CAAC,MAAM,CAAC;gBACd,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBAC5B,IAAI,EAAE,eAAe;gBACrB,SAAS;gBACT,OAAO;gBACP,UAAU;gBACV,EAAE;aACH,CAAC,CAAC;YAEH,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,gCAAgC,CAAC,CAAC;YAE3E,OAAO,eAAe,CAAC;QACzB,CAAC;QAED,KAAK,CAAC,KAAK;YACT,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;YACnB,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YAEjC,uBAAuB;YACvB,IAAI,CAAC;gBACH,MAAM,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,qDAAqD,CAAC,CAAC;gBAC9F,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,8BAA8B,CAAC,CAAC;YACvD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,iEAAiE,CAAC,CAAC;YAChG,CAAC;QACH,CAAC;QAED,KAAK,CAAC,IAAI;YACR,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACrB,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACnC,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"request_telegram_approval.js","sourceRoot":"","sources":["../../../../../server/src/domains/command-gateway/service/request_telegram_approval.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAK5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,MAAM,GAAG,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;AAM1C,MAAM,UAAU,6BAA6B,CAC3C,KAAa,EACb,MAAc,EACd,YAAiC,EACjC,aAA4B,EAC5B,QAAkB,EAClB,OAAgC;IAEhC,MAAM,eAAe,GAAG,OAAO,EAAE,OAAO;QACtC,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE;QAC5C,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;IAEjD,wEAAwE;IACxE,KAAK,UAAU,qBAAqB,CAAC,GAAmH,EAAE,SAAiB;QACzK,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,aAAa,CAAC,oCAAoC,CAAC,CAAC;YAC9D,MAAM,GAAG,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,uDAAuD,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IAED,GAAG,CAAC,EAAE,CAAC,gBAAgB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,MAAM,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9E,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,qDAAqD;QACrD,MAAM,cAAc,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC;QACvE,IAAI,cAAc,KAAK,MAAM,EAAE,CAAC;YAC9B,GAAG,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,iCAAiC,CAAC,CAAC;YACxF,MAAM,GAAG,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;YACxC,OAAO;QACT,CAAC;QAED,6DAA6D;QAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC/B,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC;QAEvD,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,qBAAqB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAqB,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;QAEhF,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;YAC5B,MAAM,eAAe,GAAG,SAAS,KAAK,QAAQ;gBAC5C,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBACpD,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;YAEpB,aAAa,CAAC,WAAW,CACvB,eAAe,EACf,SAA8B,EAC9B,QAAQ,EACR,YAAY,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,CACxC,CAAC;QACJ,CAAC;QAED,4EAA4E;QAC5E,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,SAA8B,EAAE,QAAQ,EAAE,CAAC,CAAC;QAErF,QAAQ,CAAC,MAAM,CAAC;YACd,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,IAAI,EAAE,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ;YACrD,SAAS;YACT,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,QAAQ,EAAE,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;YACxD,UAAU,EAAE,YAAY,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE;SACpD,CAAC,CAAC;QAEH,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAE1C,MAAM,KAAK,GAAG,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC5D,MAAM,KAAK,GAAG,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,aAAa,SAAS,IAAI,QAAQ,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC1F,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC/B,MAAM,GAAG,CAAC,eAAe,CACvB,GAAG,KAAK,IAAI,KAAK,OAAO,OAAO,CAAC,OAAO,EAAE,CAC1C,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,kDAAkD,CAAC,CAAC;QACnF,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,qDAAqD;IACrD,MAAM,YAAY,GAAG,IAAI,GAAG,EAA8D,CAAC;IAE3F,OAAO;QACL,KAAK,CAAC,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,YAAY;YACpE,iFAAiF;YACjF,MAAM,eAAe,GAAG,IAAI,OAAO,CAAiF,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACtI,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,MAAM,CAAC,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;oBACxD,OAAO;gBACT,CAAC;gBAED,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;gBACxC,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;gBAEtC,OAAO,CAAC,OAAO,GAAG,CAAC,QAA0B,EAAE,EAAE;oBAC/C,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,OAA4B,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;oBACvG,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;oBAC/B,eAAe,CAAC,QAAQ,CAAC,CAAC;oBAC1B,OAAO,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC5E,CAAC,CAAC;gBAEF,OAAO,CAAC,MAAM,GAAG,CAAC,MAAa,EAAE,EAAE;oBACjC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;oBAC/B,cAAc,CAAC,MAAM,CAAC,CAAC;oBACvB,MAAM,CAAC,MAAM,CAAC,CAAC;gBACjB,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,IAAI,IAAI,GAAG,mCAAmC,CAAC;YAC/C,IAAI,IAAI,WAAW,UAAU,OAAO,EAAE,KAAK,CAAC;YAC5C,IAAI,IAAI,SAAS,SAAS,QAAQ,CAAC;YACnC,IAAI,IAAI,WAAW,OAAO,UAAU,CAAC;YAErC,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrC,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,wBAAwB,CAAC;gBAClG,IAAI,IAAI,OAAO,IAAI,KAAK,CAAC;gBACzB,IAAI,IAAI,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9D,CAAC;YAED,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC;gBACrC;oBACE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,SAAS,UAAU,CAAC;oBAClE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,SAAS,UAAU,CAAC;oBAClE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,WAAW,SAAS,kBAAkB,CAAC;iBAC/E;gBACD;oBACE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,MAAM,EAAE,WAAW,SAAS,WAAW,CAAC;oBACzE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,MAAM,EAAE,WAAW,SAAS,WAAW,CAAC;iBAC1E;gBACD;oBACE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,QAAQ,SAAS,UAAU,CAAC;iBACnE;aACF,CAAC,CAAC;YAEH,MAAM,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE;gBAC3C,UAAU,EAAE,UAAU;gBACtB,GAAG,QAAQ;aACZ,CAAC,CAAC;YAEH,QAAQ,CAAC,MAAM,CAAC;gBACd,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBAC5B,IAAI,EAAE,eAAe;gBACrB,SAAS;gBACT,OAAO;gBACP,UAAU;gBACV,EAAE;aACH,CAAC,CAAC;YAEH,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,gCAAgC,CAAC,CAAC;YAE3E,OAAO,eAAe,CAAC;QACzB,CAAC;QAED,KAAK,CAAC,KAAK;YACT,oEAAoE;YACpE,gEAAgE;YAChE,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;gBACvB,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,4BAA4B,CAAC,CAAC;YACnD,CAAC,CAAC,CAAC;YAEH,yDAAyD;YACzD,MAAM,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YAC3B,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YAEjC,uBAAuB;YACvB,IAAI,CAAC;gBACH,MAAM,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,qDAAqD,CAAC,CAAC;gBAC9F,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,8BAA8B,CAAC,CAAC;YACvD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,iEAAiE,CAAC,CAAC;YAChG,CAAC;QACH,CAAC;QAED,KAAK,CAAC,IAAI;YACR,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACrB,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACnC,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,135 @@
1
+ import { Telegram } from 'telegraf';
2
+ import { randomInt } from 'node:crypto';
3
+ // ── Helpers ─────────────────────────────────────────────────────────
4
+ function wrapError(context, err) {
5
+ const detail = err instanceof Error ? err.message : String(err);
6
+ return new Error(`${context}: ${detail}`);
7
+ }
8
+ async function validateBotToken(telegram, io) {
9
+ io.print('Connecting to Telegram...');
10
+ try {
11
+ const botInfo = await telegram.getMe();
12
+ io.print(`Connected to bot: @${botInfo.username} (${botInfo.first_name})`);
13
+ return botInfo;
14
+ }
15
+ catch (err) {
16
+ throw wrapError('Invalid Telegram bot token. Could not connect', err);
17
+ }
18
+ }
19
+ async function fetchUpdates(telegram) {
20
+ try {
21
+ await telegram.deleteWebhook();
22
+ }
23
+ catch {
24
+ // Ignore — the bot may not have a webhook set
25
+ }
26
+ try {
27
+ return await telegram.getUpdates(0, 100, 0, undefined);
28
+ }
29
+ catch (err) {
30
+ throw wrapError('Failed to fetch updates from Telegram', err);
31
+ }
32
+ }
33
+ function extractMessageFromUpdate(update) {
34
+ if ('message' in update)
35
+ return update.message;
36
+ if ('channel_post' in update)
37
+ return update.channel_post;
38
+ return undefined;
39
+ }
40
+ function resolveChatTitle(chat) {
41
+ if (chat.type === 'private') {
42
+ const parts = [];
43
+ if ('first_name' in chat && chat.first_name)
44
+ parts.push(chat.first_name);
45
+ if ('last_name' in chat && chat.last_name)
46
+ parts.push(chat.last_name);
47
+ return parts.join(' ') || chat.id.toString();
48
+ }
49
+ if ('title' in chat && chat.title)
50
+ return chat.title;
51
+ return chat.id.toString();
52
+ }
53
+ function deduplicateChats(updates) {
54
+ const chatMap = new Map();
55
+ for (const update of updates) {
56
+ const message = extractMessageFromUpdate(update);
57
+ if (!message?.chat)
58
+ continue;
59
+ const chat = message.chat;
60
+ const chatId = chat.id.toString();
61
+ const date = message.date ?? 0;
62
+ const existing = chatMap.get(chatId);
63
+ if (!existing || date > existing.lastMessageDate) {
64
+ chatMap.set(chatId, {
65
+ chatId,
66
+ title: resolveChatTitle(chat),
67
+ type: chat.type,
68
+ lastMessageDate: date,
69
+ });
70
+ }
71
+ }
72
+ return [...chatMap.values()].sort((a, b) => b.lastMessageDate - a.lastMessageDate);
73
+ }
74
+ async function sendVerificationCode(telegram, chatId, code) {
75
+ try {
76
+ await telegram.sendMessage(chatId, `\u{1F511} *Lucifer Pairing Code*\n\nYour pairing code is: \`${code}\`\n\nEnter this code in your terminal to complete pairing.`, { parse_mode: 'Markdown' });
77
+ }
78
+ catch (err) {
79
+ throw wrapError(`Failed to send pairing code to chat ${chatId}`, err);
80
+ }
81
+ }
82
+ async function verifyCode(io, code, maxAttempts) {
83
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
84
+ const entered = (await io.prompt('Enter the 6-digit code:')).trim();
85
+ if (entered === code)
86
+ return;
87
+ const remaining = maxAttempts - attempt;
88
+ if (remaining > 0) {
89
+ io.print(`Incorrect code. ${remaining} attempt${remaining > 1 ? 's' : ''} remaining.`);
90
+ }
91
+ }
92
+ throw new Error('Pairing failed: incorrect code entered 3 times.');
93
+ }
94
+ // ── Main flow ───────────────────────────────────────────────────────
95
+ /**
96
+ * Run the interactive Telegram pairing flow:
97
+ * 1. Validate bot token via getMe
98
+ * 2. Fetch recent updates and extract unique chats
99
+ * 3. Let the user pick a chat
100
+ * 4. Send a 6-digit verification code to the chosen chat
101
+ * 5. Prompt the user to enter the code (up to 3 attempts)
102
+ */
103
+ export async function runTelegramPairing(token, io) {
104
+ const telegram = new Telegram(token);
105
+ // 1. Validate the bot token
106
+ const botInfo = await validateBotToken(telegram, io);
107
+ // 2. Fetch recent updates and extract unique chats
108
+ io.print('Fetching recent chats...');
109
+ const updates = await fetchUpdates(telegram);
110
+ const chats = deduplicateChats(updates);
111
+ if (chats.length === 0) {
112
+ throw new Error(`No chats found. Please send a message to @${botInfo.username} on Telegram first, then re-run this command.`);
113
+ }
114
+ // 3. Let the user pick a chat
115
+ const options = chats.map((c) => {
116
+ const date = new Date(c.lastMessageDate * 1000).toLocaleString();
117
+ return `${c.title} (${c.type}, ID: ${c.chatId}) — last message: ${date}`;
118
+ });
119
+ const index = await io.choose('Select a chat for approvals:', options);
120
+ const chosen = chats[index];
121
+ io.print(`\nSelected: ${chosen.title} (${chosen.chatId})`);
122
+ const confirmed = await io.confirm('Use this chat for Telegram approvals?');
123
+ if (!confirmed) {
124
+ throw new Error('Pairing cancelled.');
125
+ }
126
+ // 4. Generate and send a 6-digit verification code
127
+ const code = randomInt(100000, 999999).toString();
128
+ await sendVerificationCode(telegram, chosen.chatId, code);
129
+ io.print('\nA 6-digit pairing code has been sent to your Telegram chat.');
130
+ // 5. Verify the code
131
+ await verifyCode(io, code, 3);
132
+ io.print('Pairing verified successfully!');
133
+ return { chatId: chosen.chatId, chatTitle: chosen.title };
134
+ }
135
+ //# sourceMappingURL=telegram_pairing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram_pairing.js","sourceRoot":"","sources":["../../../../../server/src/domains/command-gateway/service/telegram_pairing.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,3 @@
1
- import path from 'node:path';
2
1
  function parsePort(value) {
3
2
  const parsedPort = Number.parseInt(value ?? '3001', 10);
4
3
  if (Number.isInteger(parsedPort) && parsedPort >= 1 && parsedPort <= 65535) {
@@ -9,7 +8,6 @@ function parsePort(value) {
9
8
  export function getServerConfig() {
10
9
  return {
11
10
  appName: 'lucifer',
12
- clientDistPath: path.resolve(process.cwd(), 'dist/client'),
13
11
  environment: process.env.NODE_ENV ?? 'development',
14
12
  port: parsePort(process.env.PORT),
15
13
  };
@@ -1 +1 @@
1
- {"version":3,"file":"server_config.js","sourceRoot":"","sources":["../../../../../server/src/domains/platform-api/config/server_config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAS5B,SAAS,SAAS,CAAC,KAAyB;IAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,IAAI,MAAM,EAAE,EAAE,CAAC,CAAA;IAEvD,IAAI,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,UAAU,IAAI,CAAC,IAAI,UAAU,IAAI,KAAK,EAAE,CAAC;QAC3E,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO;QACL,OAAO,EAAE,SAAS;QAClB,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,CAAC;QAC1D,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa;QAClD,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;KAClC,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"server_config.js","sourceRoot":"","sources":["../../../../../server/src/domains/platform-api/config/server_config.ts"],"names":[],"mappings":"AAMA,SAAS,SAAS,CAAC,KAAyB;IAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,IAAI,MAAM,EAAE,EAAE,CAAC,CAAA;IAEvD,IAAI,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,UAAU,IAAI,CAAC,IAAI,UAAU,IAAI,KAAK,EAAE,CAAC;QAC3E,OAAO,UAAU,CAAA;IACnB,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO;QACL,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa;QAClD,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;KAClC,CAAA;AACH,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { readFileSync, writeFileSync } from 'node:fs';
2
+ /**
3
+ * Read-modify-write a JSON config file, merging the given updates
4
+ * into the existing object. Only top-level keys are merged (shallow).
5
+ */
6
+ export function updateJsonConfig(filePath, updates) {
7
+ let raw;
8
+ try {
9
+ raw = readFileSync(filePath, 'utf-8');
10
+ }
11
+ catch (err) {
12
+ const code = err.code;
13
+ if (code === 'ENOENT') {
14
+ throw new Error(`Config file not found: ${filePath}. Run \`lucifer-gate --init\` first.`);
15
+ }
16
+ throw new Error(`Cannot read config file: ${filePath} (${code})`);
17
+ }
18
+ let parsed;
19
+ try {
20
+ parsed = JSON.parse(raw);
21
+ }
22
+ catch {
23
+ throw new Error(`Invalid JSON in config file: ${filePath}`);
24
+ }
25
+ const merged = { ...parsed, ...updates };
26
+ writeFileSync(filePath, JSON.stringify(merged, null, 2) + '\n');
27
+ }
28
+ //# sourceMappingURL=json_config_writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json_config_writer.js","sourceRoot":"","sources":["../../../server/src/lib/json_config_writer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEtD;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,OAAgC;IACjF,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,GAAI,GAA6B,CAAC,IAAI,CAAC;QACjD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,sCAAsC,CAAC,CAAC;QAC5F,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,KAAK,IAAI,GAAG,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,MAA+B,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC;IACzC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAClE,CAAC"}
@@ -1,11 +1,36 @@
1
1
  import pino from 'pino';
2
2
  const isProduction = process.env.NODE_ENV === 'production';
3
+ // Resolve console stream: use pino-pretty for human-readable output in dev,
4
+ // fall back to plain JSON when pino-pretty is unavailable (e.g. npx installs).
5
+ let consoleStream = process.stdout;
6
+ if (!isProduction) {
7
+ try {
8
+ const mod = await import('pino-pretty');
9
+ const build = typeof mod.default === 'function' ? mod.default : mod.build;
10
+ consoleStream = build({ colorize: true });
11
+ }
12
+ catch {
13
+ // pino-pretty is a devDependency — unavailable when installed via npx or in production.
14
+ // Falls back to structured JSON on console, which is still fully functional.
15
+ }
16
+ }
17
+ const streams = pino.multistream([
18
+ { level: 'trace', stream: consoleStream },
19
+ ]);
3
20
  export const logger = pino({
4
21
  level: process.env.LOG_LEVEL ?? (isProduction ? 'info' : 'debug'),
5
- transport: isProduction
6
- ? undefined
7
- : { target: 'pino-pretty', options: { colorize: true } },
8
- });
22
+ }, streams);
23
+ /**
24
+ * Add a log file destination. Logs are written as structured JSON (one object
25
+ * per line), independent of the console format. Safe to call after startup —
26
+ * new entries are appended; the file is created if it does not exist.
27
+ */
28
+ export function addLogFile(filePath) {
29
+ streams.add({
30
+ level: 'trace',
31
+ stream: pino.destination({ dest: filePath, mkdir: true, sync: false }),
32
+ });
33
+ }
9
34
  export function createChildLogger(name) {
10
35
  return logger.child({ module: name });
11
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../server/src/lib/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;AAE3D,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IACjE,SAAS,EAAE,YAAY;QACrB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;CAC3D,CAAC,CAAC;AAEH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AACxC,CAAC"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../server/src/lib/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;AAE3D,4EAA4E;AAC5E,+EAA+E;AAC/E,IAAI,aAAa,GAA2B,OAAO,CAAC,MAAM,CAAC;AAE3D,IAAI,CAAC,YAAY,EAAE,CAAC;IAClB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAE,GAAuF,CAAC,KAAK,CAAC;QAC/J,aAAa,GAAG,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAsC,CAAC;IACjF,CAAC;IAAC,MAAM,CAAC;QACP,wFAAwF;QACxF,6EAA6E;IAC/E,CAAC;AACH,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC;IAC/B,EAAE,KAAK,EAAE,OAAgB,EAAE,MAAM,EAAE,aAAa,EAAE;CACnD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;CAClE,EAAE,OAAO,CAAC,CAAC;AAEZ;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,OAAO,CAAC,GAAG,CAAC;QACV,KAAK,EAAE,OAAgB;QACvB,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;KACvE,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,146 @@
1
+ import { writeFileSync, mkdirSync, rmSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { createApp } from '../create_app.js';
4
+ import { hashApiKey } from '../domains/command-gateway/repository/api_key_store.js';
5
+ // telegram-test-api is CJS with `exports.default = TelegramServer`
6
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
7
+ const TelegramServerModule = require('telegram-test-api');
8
+ const TelegramServer = TelegramServerModule.default ?? TelegramServerModule;
9
+ export const TEST_BOT_TOKEN = 'e2e-test-bot-token-12345';
10
+ export const TEST_CHAT_ID = '67890';
11
+ const TEST_CHAT_ID_NUM = Number(TEST_CHAT_ID);
12
+ /* eslint-enable @typescript-eslint/no-explicit-any */
13
+ /**
14
+ * Wait for the bot to send a message to the Telegram test server.
15
+ */
16
+ export async function waitForBotMessage(ctx, timeoutMs = 5000) {
17
+ const start = Date.now();
18
+ while (Date.now() - start < timeoutMs) {
19
+ const unread = ctx.telegramServer.storage.botMessages.filter((m) => !m.isRead && m.botToken === TEST_BOT_TOKEN);
20
+ if (unread.length > 0)
21
+ return;
22
+ await new Promise(r => setTimeout(r, 100));
23
+ }
24
+ throw new Error(`No bot message received within ${timeoutMs}ms`);
25
+ }
26
+ /**
27
+ * Get the latest unread bot messages from the Telegram test server.
28
+ */
29
+ export function getBotMessages(ctx) {
30
+ return ctx.telegramClient.getUpdates();
31
+ }
32
+ /**
33
+ * Simulate pressing an inline keyboard button by sending a callback query
34
+ * with the given data string. Pass messageId from the bot message to allow
35
+ * Telegraf to edit the message after the decision.
36
+ */
37
+ export async function pressInlineButton(ctx, callbackData, messageId) {
38
+ const cbQuery = ctx.telegramClient.makeCallbackQuery(callbackData, {
39
+ message: {
40
+ message_id: messageId ?? 1,
41
+ chat: { id: Number(TEST_CHAT_ID) },
42
+ },
43
+ });
44
+ await ctx.telegramClient.sendCallback(cbQuery);
45
+ }
46
+ /**
47
+ * Poll until a condition is met or timeout.
48
+ */
49
+ export async function waitForCondition(fn, timeoutMs) {
50
+ const start = Date.now();
51
+ while (Date.now() - start < timeoutMs) {
52
+ try {
53
+ if (await fn())
54
+ return;
55
+ }
56
+ catch { /* not yet */ }
57
+ await new Promise(r => setTimeout(r, 100));
58
+ }
59
+ throw new Error(`Condition not met within ${timeoutMs}ms`);
60
+ }
61
+ /**
62
+ * Creates a full E2E test context with a real Telegram test server,
63
+ * the lucifer-gate Express app wired to it, and a simulated Telegram client.
64
+ */
65
+ export function createTelegramE2EContext(label, port, options) {
66
+ const testDir = join(process.cwd(), `.test-e2e-${label}`);
67
+ const configDir = join(testDir, 'config');
68
+ const dataDir = join(testDir, 'data');
69
+ const testKey = `luc_${label}e2ekey`;
70
+ const testSalt = `${label}e2esalt1234567`;
71
+ const testHash = hashApiKey(testKey, testSalt);
72
+ mkdirSync(configDir, { recursive: true });
73
+ mkdirSync(dataDir, { recursive: true });
74
+ const configPath = join(configDir, 'lucifer.json');
75
+ writeFileSync(configPath, JSON.stringify({
76
+ port: 0,
77
+ telegramChatId: TEST_CHAT_ID,
78
+ approvalTimeoutSeconds: 30,
79
+ executionTimeoutSeconds: 10,
80
+ maxConcurrentExecutions: 3,
81
+ maxOutputBytes: 65536,
82
+ rateLimitPerMinute: 1000,
83
+ onApprovalTimeout: 'deny',
84
+ dataDir: '../data',
85
+ }));
86
+ writeFileSync(join(configDir, 'api-keys.json'), JSON.stringify({
87
+ keys: [{
88
+ id: `${label}-e2e`,
89
+ name: label,
90
+ keyHash: testHash,
91
+ salt: testSalt,
92
+ allowedIps: [],
93
+ createdAt: new Date().toISOString(),
94
+ active: true,
95
+ }],
96
+ }));
97
+ const rules = [
98
+ { prefix: 'echo ', action: 'always_approve' },
99
+ { prefix: 'rm ', action: 'always_deny' },
100
+ { prefix: 'git ', action: 'telegram_approve' },
101
+ { prefix: 'ls ', action: 'telegram_approve' },
102
+ ...(options?.extraRules ?? []),
103
+ ];
104
+ writeFileSync(join(configDir, 'command-rules.json'), JSON.stringify({
105
+ rules,
106
+ defaultAction: 'always_deny',
107
+ }));
108
+ // Create Telegram test server
109
+ const telegramServer = new TelegramServer({ port, host: '127.0.0.1' });
110
+ // Create client that simulates the Telegram user (chatId must match config)
111
+ const telegramClient = telegramServer.getClient(TEST_BOT_TOKEN, {
112
+ chatId: TEST_CHAT_ID_NUM,
113
+ userId: 999,
114
+ firstName: 'E2ETestUser',
115
+ userName: 'e2e_tester',
116
+ });
117
+ // Set required env var
118
+ const originalToken = process.env.LUCIFER_TELEGRAM_TOKEN;
119
+ process.env.LUCIFER_TELEGRAM_TOKEN = TEST_BOT_TOKEN;
120
+ const result = createApp({
121
+ configPath,
122
+ telegramApiRoot: `http://127.0.0.1:${port}`,
123
+ });
124
+ return {
125
+ app: result.app,
126
+ start: async () => {
127
+ await telegramServer.start();
128
+ await result.start();
129
+ // Wait for the startup health-check message from the bot
130
+ await waitForBotMessage({ telegramServer, telegramClient, testKey, app: result.app, start: result.start, stop: result.stop, testDir });
131
+ // Drain the startup message so it doesn't interfere with tests
132
+ await telegramClient.getUpdates();
133
+ },
134
+ stop: async () => {
135
+ await result.stop();
136
+ await telegramServer.stop();
137
+ process.env.LUCIFER_TELEGRAM_TOKEN = originalToken;
138
+ rmSync(testDir, { recursive: true, force: true });
139
+ },
140
+ testKey,
141
+ telegramServer,
142
+ telegramClient,
143
+ testDir,
144
+ };
145
+ }
146
+ //# sourceMappingURL=telegram-e2e-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram-e2e-setup.js","sourceRoot":"","sources":["../../../server/src/test/telegram-e2e-setup.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lucifer-gate",
3
- "version": "0.4.0",
3
+ "version": "0.4.2-alpha.3.0fe78b9",
4
4
  "description": "AI agent command firewall with Telegram-based human approval",
5
5
  "type": "module",
6
6
  "bin": {
@@ -29,51 +29,36 @@
29
29
  },
30
30
  "scripts": {
31
31
  "clean": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
32
- "dev": "concurrently -k -n web,api \"npm run dev:web\" \"npm run dev:server\"",
33
- "dev:web": "vite",
34
- "dev:server": "tsx watch server/src/index.ts",
35
- "build": "npm run clean && npm run check:structure && npm run build:web && npm run build:server",
36
- "build:web": "vite build",
32
+ "dev": "tsx watch server/src/index.ts",
37
33
  "build:server": "tsc -p tsconfig.server.json",
34
+ "build": "npm run clean && npm run check:structure && npm run build:server",
38
35
  "start": "node dist/server/index.js",
39
36
  "lint": "eslint .",
40
37
  "test": "vitest run",
41
38
  "test:watch": "vitest",
42
- "check:structure": "node scripts/check-dependencies.mjs",
43
- "preview": "vite preview"
39
+ "check:structure": "node scripts/check-dependencies.mjs"
44
40
  },
45
41
  "dependencies": {
46
42
  "better-sqlite3": "^12.8.0",
47
43
  "express": "^5.2.1",
48
44
  "express-rate-limit": "^8.3.2",
49
45
  "pino": "^10.3.1",
50
- "react": "^19.2.4",
51
- "react-dom": "^19.2.4",
52
46
  "telegraf": "^4.16.3"
53
47
  },
54
48
  "devDependencies": {
55
49
  "@eslint/js": "^9.39.4",
56
- "@testing-library/jest-dom": "^6.9.1",
57
- "@testing-library/react": "^16.3.2",
58
50
  "@types/better-sqlite3": "^7.6.13",
59
51
  "@types/express": "^5.0.6",
60
52
  "@types/node": "^24.12.2",
61
- "@types/react": "^19.2.14",
62
- "@types/react-dom": "^19.2.3",
63
53
  "@types/supertest": "^7.2.0",
64
- "@vitejs/plugin-react": "^6.0.1",
65
- "concurrently": "^9.2.1",
66
54
  "eslint": "^9.39.4",
67
- "eslint-plugin-react-hooks": "^7.0.1",
68
- "eslint-plugin-react-refresh": "^0.5.2",
69
55
  "globals": "^17.4.0",
70
- "jsdom": "^29.0.1",
71
56
  "pino-pretty": "^13.1.3",
72
57
  "supertest": "^7.2.2",
58
+ "telegram-test-api": "^4.2.1",
73
59
  "tsx": "^4.21.0",
74
60
  "typescript": "~6.0.2",
75
61
  "typescript-eslint": "^8.58.0",
76
- "vite": "^8.0.4",
77
62
  "vitest": "^4.1.2"
78
63
  }
79
64
  }