lucifer-gate 0.1.0-alpha.1

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 (53) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +174 -0
  3. package/dist/server/cli.js +220 -0
  4. package/dist/server/cli.js.map +1 -0
  5. package/dist/server/create_app.js +95 -0
  6. package/dist/server/create_app.js.map +1 -0
  7. package/dist/server/domains/command-gateway/api/register_execute_routes.js +338 -0
  8. package/dist/server/domains/command-gateway/api/register_execute_routes.js.map +1 -0
  9. package/dist/server/domains/command-gateway/config/gateway_config.js +46 -0
  10. package/dist/server/domains/command-gateway/config/gateway_config.js.map +1 -0
  11. package/dist/server/domains/command-gateway/repository/api_key_store.js +44 -0
  12. package/dist/server/domains/command-gateway/repository/api_key_store.js.map +1 -0
  13. package/dist/server/domains/command-gateway/repository/approval_store.js +83 -0
  14. package/dist/server/domains/command-gateway/repository/approval_store.js.map +1 -0
  15. package/dist/server/domains/command-gateway/repository/audit_log.js +24 -0
  16. package/dist/server/domains/command-gateway/repository/audit_log.js.map +1 -0
  17. package/dist/server/domains/command-gateway/repository/command_rules_store.js +42 -0
  18. package/dist/server/domains/command-gateway/repository/command_rules_store.js.map +1 -0
  19. package/dist/server/domains/command-gateway/repository/database.js +59 -0
  20. package/dist/server/domains/command-gateway/repository/database.js.map +1 -0
  21. package/dist/server/domains/command-gateway/repository/pending_request_store.js +61 -0
  22. package/dist/server/domains/command-gateway/repository/pending_request_store.js.map +1 -0
  23. package/dist/server/domains/command-gateway/service/analyze_command_risk.js +44 -0
  24. package/dist/server/domains/command-gateway/service/analyze_command_risk.js.map +1 -0
  25. package/dist/server/domains/command-gateway/service/authenticate_request.js +71 -0
  26. package/dist/server/domains/command-gateway/service/authenticate_request.js.map +1 -0
  27. package/dist/server/domains/command-gateway/service/auto_approve_channel.js +24 -0
  28. package/dist/server/domains/command-gateway/service/auto_approve_channel.js.map +1 -0
  29. package/dist/server/domains/command-gateway/service/execute_command.js +139 -0
  30. package/dist/server/domains/command-gateway/service/execute_command.js.map +1 -0
  31. package/dist/server/domains/command-gateway/service/request_telegram_approval.js +126 -0
  32. package/dist/server/domains/command-gateway/service/request_telegram_approval.js.map +1 -0
  33. package/dist/server/domains/command-gateway/types/command_types.js +2 -0
  34. package/dist/server/domains/command-gateway/types/command_types.js.map +1 -0
  35. package/dist/server/domains/command-gateway/types/store_interfaces.js +2 -0
  36. package/dist/server/domains/command-gateway/types/store_interfaces.js.map +1 -0
  37. package/dist/server/domains/platform-api/api/register_health_routes.js +6 -0
  38. package/dist/server/domains/platform-api/api/register_health_routes.js.map +1 -0
  39. package/dist/server/domains/platform-api/config/server_config.js +17 -0
  40. package/dist/server/domains/platform-api/config/server_config.js.map +1 -0
  41. package/dist/server/domains/platform-api/repository/runtime_metadata_repository.js +7 -0
  42. package/dist/server/domains/platform-api/repository/runtime_metadata_repository.js.map +1 -0
  43. package/dist/server/domains/platform-api/service/create_health_report.js +10 -0
  44. package/dist/server/domains/platform-api/service/create_health_report.js.map +1 -0
  45. package/dist/server/domains/platform-api/types/health_report.js +2 -0
  46. package/dist/server/domains/platform-api/types/health_report.js.map +1 -0
  47. package/dist/server/index.js +18 -0
  48. package/dist/server/index.js.map +1 -0
  49. package/dist/server/lib/json_config_loader.js +31 -0
  50. package/dist/server/lib/json_config_loader.js.map +1 -0
  51. package/dist/server/lib/logger.js +12 -0
  52. package/dist/server/lib/logger.js.map +1 -0
  53. package/package.json +78 -0
@@ -0,0 +1,10 @@
1
+ export function createHealthReportService(config, metadataRepository) {
2
+ return () => ({
3
+ environment: config.environment,
4
+ name: config.appName,
5
+ nodeVersion: metadataRepository.getNodeVersion(),
6
+ status: 'ok',
7
+ timestamp: metadataRepository.getCurrentTimestamp(),
8
+ });
9
+ }
10
+ //# sourceMappingURL=create_health_report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create_health_report.js","sourceRoot":"","sources":["../../../../../server/src/domains/platform-api/service/create_health_report.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,yBAAyB,CACvC,MAAoB,EACpB,kBAA6C;IAE7C,OAAO,GAAG,EAAE,CAAC,CAAC;QACZ,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,IAAI,EAAE,MAAM,CAAC,OAAO;QACpB,WAAW,EAAE,kBAAkB,CAAC,cAAc,EAAE;QAChD,MAAM,EAAE,IAAI;QACZ,SAAS,EAAE,kBAAkB,CAAC,mBAAmB,EAAE;KACpD,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=health_report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health_report.js","sourceRoot":"","sources":["../../../../../server/src/domains/platform-api/types/health_report.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ import { createApp } from './create_app.js';
2
+ import { logger } from './lib/logger.js';
3
+ const { app, config, start, stop } = createApp();
4
+ app.listen(config.port, async () => {
5
+ logger.info({ port: config.port }, 'Lucifer listening');
6
+ await start();
7
+ });
8
+ process.on('SIGTERM', async () => {
9
+ logger.info('SIGTERM received, shutting down');
10
+ await stop();
11
+ process.exit(0);
12
+ });
13
+ process.on('SIGINT', async () => {
14
+ logger.info('SIGINT received, shutting down');
15
+ await stop();
16
+ process.exit(0);
17
+ });
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAExC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,SAAS,EAAE,CAAA;AAEhD,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE;IACjC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,mBAAmB,CAAC,CAAA;IACvD,MAAM,KAAK,EAAE,CAAA;AACf,CAAC,CAAC,CAAA;AAEF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;IAC/B,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAA;IAC9C,MAAM,IAAI,EAAE,CAAA;IACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA;AAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;IAC9B,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAA;IAC7C,MAAM,IAAI,EAAE,CAAA;IACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
@@ -0,0 +1,31 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { createChildLogger } from './logger.js';
3
+ const log = createChildLogger('config-loader');
4
+ export function loadJsonConfig(filePath, validate) {
5
+ let raw;
6
+ try {
7
+ raw = readFileSync(filePath, 'utf-8');
8
+ }
9
+ catch (err) {
10
+ const backupPath = filePath + '.bak';
11
+ log.warn({ filePath, backupPath, err }, 'Failed to read config, trying backup');
12
+ try {
13
+ raw = readFileSync(backupPath, 'utf-8');
14
+ }
15
+ catch {
16
+ throw new Error(`Cannot read config file: ${filePath} (backup also missing)`);
17
+ }
18
+ }
19
+ let parsed;
20
+ try {
21
+ parsed = JSON.parse(raw);
22
+ }
23
+ catch {
24
+ throw new Error(`Invalid JSON in config file: ${filePath}`);
25
+ }
26
+ if (!validate(parsed)) {
27
+ throw new Error(`Config file failed validation: ${filePath}`);
28
+ }
29
+ return parsed;
30
+ }
31
+ //# sourceMappingURL=json_config_loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json_config_loader.js","sourceRoot":"","sources":["../../../server/src/lib/json_config_loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,GAAG,GAAG,iBAAiB,CAAC,eAAe,CAAC,CAAC;AAE/C,MAAM,UAAU,cAAc,CAAI,QAAgB,EAAE,QAAsC;IACxF,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,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;QACrC,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,EAAE,sCAAsC,CAAC,CAAC;QAChF,IAAI,CAAC;YACH,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,wBAAwB,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,kCAAkC,QAAQ,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import pino from 'pino';
2
+ const isProduction = process.env.NODE_ENV === 'production';
3
+ export const logger = pino({
4
+ level: process.env.LOG_LEVEL ?? (isProduction ? 'info' : 'debug'),
5
+ transport: isProduction
6
+ ? undefined
7
+ : { target: 'pino-pretty', options: { colorize: true } },
8
+ });
9
+ export function createChildLogger(name) {
10
+ return logger.child({ module: name });
11
+ }
12
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +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"}
package/package.json ADDED
@@ -0,0 +1,78 @@
1
+ {
2
+ "name": "lucifer-gate",
3
+ "version": "0.1.0-alpha.1",
4
+ "description": "AI agent command firewall with Telegram-based human approval",
5
+ "type": "module",
6
+ "bin": {
7
+ "lucifer-gate": "dist/server/cli.js"
8
+ },
9
+ "files": [
10
+ "dist/server/",
11
+ "README.md",
12
+ "LICENSE"
13
+ ],
14
+ "keywords": [
15
+ "ai-agent",
16
+ "firewall",
17
+ "telegram",
18
+ "command-proxy",
19
+ "human-in-the-loop",
20
+ "approval"
21
+ ],
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "https://github.com/alkampfergit/lucifer.git"
25
+ },
26
+ "license": "MIT",
27
+ "engines": {
28
+ "node": ">=22"
29
+ },
30
+ "scripts": {
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",
37
+ "build:server": "tsc -p tsconfig.server.json",
38
+ "start": "node dist/server/index.js",
39
+ "lint": "eslint .",
40
+ "test": "vitest run",
41
+ "test:watch": "vitest",
42
+ "check:structure": "node scripts/check-dependencies.mjs",
43
+ "preview": "vite preview"
44
+ },
45
+ "dependencies": {
46
+ "better-sqlite3": "^12.8.0",
47
+ "express": "^5.2.1",
48
+ "pino": "^10.3.1",
49
+ "react": "^19.2.4",
50
+ "react-dom": "^19.2.4",
51
+ "telegraf": "^4.16.3"
52
+ },
53
+ "devDependencies": {
54
+ "@eslint/js": "^9.39.4",
55
+ "@testing-library/jest-dom": "^6.9.1",
56
+ "@testing-library/react": "^16.3.2",
57
+ "@types/better-sqlite3": "^7.6.13",
58
+ "@types/express": "^5.0.6",
59
+ "@types/node": "^24.12.2",
60
+ "@types/react": "^19.2.14",
61
+ "@types/react-dom": "^19.2.3",
62
+ "@types/supertest": "^7.2.0",
63
+ "@vitejs/plugin-react": "^6.0.1",
64
+ "concurrently": "^9.2.1",
65
+ "eslint": "^9.39.4",
66
+ "eslint-plugin-react-hooks": "^7.0.1",
67
+ "eslint-plugin-react-refresh": "^0.5.2",
68
+ "globals": "^17.4.0",
69
+ "jsdom": "^29.0.1",
70
+ "pino-pretty": "^13.1.3",
71
+ "supertest": "^7.2.2",
72
+ "tsx": "^4.21.0",
73
+ "typescript": "~6.0.2",
74
+ "typescript-eslint": "^8.58.0",
75
+ "vite": "^8.0.4",
76
+ "vitest": "^4.1.2"
77
+ }
78
+ }