@agentxv2/gateway 0.1.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 (175) hide show
  1. package/.env.example +53 -0
  2. package/db/migrations/001_init.sql +117 -0
  3. package/db/migrations/002_agents.sql +20 -0
  4. package/db/migrations/003_a2a_results.sql +23 -0
  5. package/deploy/.env.deploy.example +23 -0
  6. package/deploy/add_swap_build.py +45 -0
  7. package/deploy/build_and_deploy.py +110 -0
  8. package/deploy/build_deploy_a2a.py +190 -0
  9. package/deploy/build_no_lint.py +52 -0
  10. package/deploy/build_on_fe.py +86 -0
  11. package/deploy/build_on_gw.py +98 -0
  12. package/deploy/build_prod.py +54 -0
  13. package/deploy/check_bal.py +31 -0
  14. package/deploy/check_code.py +47 -0
  15. package/deploy/check_deploy.sh +20 -0
  16. package/deploy/check_docs.py +16 -0
  17. package/deploy/check_frontend.py +42 -0
  18. package/deploy/check_frontend2.py +35 -0
  19. package/deploy/check_pks.py +34 -0
  20. package/deploy/check_status.py +32 -0
  21. package/deploy/check_v2.py +8 -0
  22. package/deploy/clean_install.py +28 -0
  23. package/deploy/deploy_a2a.py +58 -0
  24. package/deploy/deploy_a2a.sh +33 -0
  25. package/deploy/deploy_a2a_bg.sh +40 -0
  26. package/deploy/deploy_a2a_v2.py +151 -0
  27. package/deploy/deploy_a2a_v2.sh +36 -0
  28. package/deploy/deploy_bin.py +64 -0
  29. package/deploy/deploy_config.py +34 -0
  30. package/deploy/deploy_final.py +42 -0
  31. package/deploy/deploy_frontend.py +108 -0
  32. package/deploy/deploy_mcp.py +108 -0
  33. package/deploy/deploy_now.py +49 -0
  34. package/deploy/deploy_push_all.py +128 -0
  35. package/deploy/deploy_script.py +64 -0
  36. package/deploy/deploy_sep_a2a.sh +18 -0
  37. package/deploy/dev_mode.py +51 -0
  38. package/deploy/diag.py +12 -0
  39. package/deploy/diff_test.py +22 -0
  40. package/deploy/final_check.py +33 -0
  41. package/deploy/final_deploy.py +50 -0
  42. package/deploy/final_fix.py +54 -0
  43. package/deploy/final_push.py +114 -0
  44. package/deploy/find_frontend.py +38 -0
  45. package/deploy/fix_a2a.py +43 -0
  46. package/deploy/fix_and_build.py +77 -0
  47. package/deploy/fix_and_verify.py +56 -0
  48. package/deploy/fix_build.py +51 -0
  49. package/deploy/forge_deploy.py +67 -0
  50. package/deploy/full_push.py +101 -0
  51. package/deploy/full_push2.py +106 -0
  52. package/deploy/go_prod.py +59 -0
  53. package/deploy/gw_deploy.py +133 -0
  54. package/deploy/gw_final.py +206 -0
  55. package/deploy/gw_restart.py +28 -0
  56. package/deploy/gw_status.py +18 -0
  57. package/deploy/inline_build.py +99 -0
  58. package/deploy/one_shot.py +84 -0
  59. package/deploy/ox_deploy.py +32 -0
  60. package/deploy/pg_setup.py +36 -0
  61. package/deploy/prod_deploy.py +126 -0
  62. package/deploy/prod_final.py +140 -0
  63. package/deploy/prod_go.py +61 -0
  64. package/deploy/prod_one_shot.py +139 -0
  65. package/deploy/prod_setup.sh +62 -0
  66. package/deploy/prod_v2.py +91 -0
  67. package/deploy/prod_v3.py +103 -0
  68. package/deploy/push_docs.py +93 -0
  69. package/deploy/push_mcp.py +66 -0
  70. package/deploy/push_mcp_doc.py +28 -0
  71. package/deploy/push_v063.py +80 -0
  72. package/deploy/push_v2.py +71 -0
  73. package/deploy/qcheck.py +13 -0
  74. package/deploy/qcheck2.py +18 -0
  75. package/deploy/quick_check.py +8 -0
  76. package/deploy/rebuild.py +47 -0
  77. package/deploy/rebuild_frontend.py +44 -0
  78. package/deploy/restart.py +28 -0
  79. package/deploy/restore_frontend.py +42 -0
  80. package/deploy/restore_frontend2.py +41 -0
  81. package/deploy/restore_gateway.py +34 -0
  82. package/deploy/restore_quick.py +33 -0
  83. package/deploy/run_bash.py +19 -0
  84. package/deploy/run_sep.py +20 -0
  85. package/deploy/sdk_upgrade.py +50 -0
  86. package/deploy/server_prepare.py +41 -0
  87. package/deploy/server_setup.py +41 -0
  88. package/deploy/ssh_check.py +14 -0
  89. package/deploy/ssh_push.py +24 -0
  90. package/deploy/start_deploy.py +35 -0
  91. package/deploy/start_frontend.py +12 -0
  92. package/deploy/start_v2.py +29 -0
  93. package/deploy/stat.py +18 -0
  94. package/deploy/tail_log.py +11 -0
  95. package/deploy/update_env.py +32 -0
  96. package/deploy/upload_and_start.py +107 -0
  97. package/deploy/verify_a2a.py +13 -0
  98. package/deploy/verify_mcp.py +37 -0
  99. package/deploy/verify_sdk.py +21 -0
  100. package/dist/config.d.ts +26 -0
  101. package/dist/config.js +41 -0
  102. package/dist/config.js.map +1 -0
  103. package/dist/index.d.ts +1 -0
  104. package/dist/index.js +149 -0
  105. package/dist/index.js.map +1 -0
  106. package/dist/lib/crypto.d.ts +2 -0
  107. package/dist/lib/crypto.js +43 -0
  108. package/dist/lib/crypto.js.map +1 -0
  109. package/dist/lib/db.d.ts +3 -0
  110. package/dist/lib/db.js +26 -0
  111. package/dist/lib/db.js.map +1 -0
  112. package/dist/lib/ethers-utils.d.ts +60 -0
  113. package/dist/lib/ethers-utils.js +186 -0
  114. package/dist/lib/ethers-utils.js.map +1 -0
  115. package/dist/middleware/adminAuth.d.ts +2 -0
  116. package/dist/middleware/adminAuth.js +31 -0
  117. package/dist/middleware/adminAuth.js.map +1 -0
  118. package/dist/middleware/auth.d.ts +22 -0
  119. package/dist/middleware/auth.js +192 -0
  120. package/dist/middleware/auth.js.map +1 -0
  121. package/dist/middleware/error-handler.d.ts +36 -0
  122. package/dist/middleware/error-handler.js +100 -0
  123. package/dist/middleware/error-handler.js.map +1 -0
  124. package/dist/middleware/rate-limiter.d.ts +5 -0
  125. package/dist/middleware/rate-limiter.js +107 -0
  126. package/dist/middleware/rate-limiter.js.map +1 -0
  127. package/dist/routes/a2a.d.ts +2 -0
  128. package/dist/routes/a2a.js +84 -0
  129. package/dist/routes/a2a.js.map +1 -0
  130. package/dist/routes/admin.d.ts +2 -0
  131. package/dist/routes/admin.js +180 -0
  132. package/dist/routes/admin.js.map +1 -0
  133. package/dist/routes/agents.d.ts +2 -0
  134. package/dist/routes/agents.js +43 -0
  135. package/dist/routes/agents.js.map +1 -0
  136. package/dist/routes/chat.d.ts +2 -0
  137. package/dist/routes/chat.js +183 -0
  138. package/dist/routes/chat.js.map +1 -0
  139. package/dist/routes/history.d.ts +2 -0
  140. package/dist/routes/history.js +92 -0
  141. package/dist/routes/history.js.map +1 -0
  142. package/dist/routes/mcp.d.ts +13 -0
  143. package/dist/routes/mcp.js +513 -0
  144. package/dist/routes/mcp.js.map +1 -0
  145. package/dist/routes/tenant.d.ts +2 -0
  146. package/dist/routes/tenant.js +154 -0
  147. package/dist/routes/tenant.js.map +1 -0
  148. package/dist/services/a2a-worker.d.ts +7 -0
  149. package/dist/services/a2a-worker.js +406 -0
  150. package/dist/services/a2a-worker.js.map +1 -0
  151. package/dist/services/agent-indexer.d.ts +4 -0
  152. package/dist/services/agent-indexer.js +124 -0
  153. package/dist/services/agent-indexer.js.map +1 -0
  154. package/e2e_wallet.js +175 -0
  155. package/ecosystem.config.js +17 -0
  156. package/package.json +33 -0
  157. package/src/config.ts +47 -0
  158. package/src/index.ts +143 -0
  159. package/src/lib/crypto.ts +44 -0
  160. package/src/lib/db.ts +25 -0
  161. package/src/lib/ethers-utils.ts +229 -0
  162. package/src/middleware/adminAuth.ts +34 -0
  163. package/src/middleware/auth.ts +244 -0
  164. package/src/middleware/error-handler.ts +109 -0
  165. package/src/middleware/rate-limiter.ts +115 -0
  166. package/src/routes/a2a.ts +97 -0
  167. package/src/routes/admin.ts +219 -0
  168. package/src/routes/agents.ts +52 -0
  169. package/src/routes/chat.ts +219 -0
  170. package/src/routes/history.ts +114 -0
  171. package/src/routes/mcp.ts +567 -0
  172. package/src/routes/tenant.ts +196 -0
  173. package/src/services/a2a-worker.ts +486 -0
  174. package/src/services/agent-indexer.ts +127 -0
  175. package/tsconfig.json +18 -0
package/dist/index.js ADDED
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ // ---------------------------------------------------------------------------
3
+ // AgentX Gateway — Entry Point
4
+ // ---------------------------------------------------------------------------
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ const express_1 = __importDefault(require("express"));
43
+ const cors_1 = __importDefault(require("cors"));
44
+ const helmet_1 = __importDefault(require("helmet"));
45
+ const express_rate_limit_1 = __importDefault(require("express-rate-limit"));
46
+ const config_1 = require("./config");
47
+ const auth_1 = require("./middleware/auth");
48
+ const rate_limiter_1 = require("./middleware/rate-limiter");
49
+ const error_handler_1 = require("./middleware/error-handler");
50
+ const chat_1 = __importDefault(require("./routes/chat"));
51
+ const tenant_1 = __importDefault(require("./routes/tenant"));
52
+ const history_1 = __importDefault(require("./routes/history"));
53
+ const mcp_1 = __importDefault(require("./routes/mcp"));
54
+ const agents_1 = __importDefault(require("./routes/agents"));
55
+ const a2a_1 = __importDefault(require("./routes/a2a"));
56
+ const admin_1 = __importDefault(require("./routes/admin"));
57
+ const app = (0, express_1.default)();
58
+ // ── Security ──────────────────────────────────────────────────────────────
59
+ app.use((0, helmet_1.default)({
60
+ contentSecurityPolicy: false,
61
+ crossOriginEmbedderPolicy: false,
62
+ }));
63
+ app.use((0, cors_1.default)({
64
+ origin: process.env.CORS_ORIGIN || '*',
65
+ credentials: true,
66
+ }));
67
+ // ── Global rate limit ─────────────────────────────────────────────────────
68
+ app.use((0, express_rate_limit_1.default)({
69
+ windowMs: 60_000,
70
+ max: 1000,
71
+ standardHeaders: true,
72
+ legacyHeaders: false,
73
+ message: { error: 'Too many requests, please try again later.' },
74
+ }));
75
+ // ── Body parsing ──────────────────────────────────────────────────────────
76
+ app.use(express_1.default.json({ limit: '1mb' }));
77
+ // Handle malformed JSON (return 400 instead of 500)
78
+ app.use((err, _req, res, next) => {
79
+ if (err && err.type === 'entity.parse.failed') {
80
+ return res.status(400).json({ error: 'Invalid JSON in request body' });
81
+ }
82
+ next(err);
83
+ });
84
+ // ── Health check ──────────────────────────────────────────────────────────
85
+ app.get('/api/v1/health', async (_req, res) => {
86
+ res.json({ status: 'ok', time: new Date().toISOString() });
87
+ });
88
+ // ── MCP endpoint (public JSON-RPC 2.0) ────────────────────────────────────
89
+ app.use('/mcp', mcp_1.default);
90
+ // ── Admin API (protected by admin key, not wallet auth) ──────────────────
91
+ app.use('/api/v1/admin', admin_1.default);
92
+ // ── Auth routes (public) ──────────────────────────────────────────────────
93
+ app.get('/api/v1/auth/challenge', auth_1.getChallenge);
94
+ app.post('/api/v1/auth/verify', auth_1.verifyChallenge);
95
+ // ── Agents API (public, no auth needed) ────────────────────────────────────
96
+ app.use('/api/v1/agents', agents_1.default);
97
+ // ── A2A Task Results API (public, SDK daemon queries this) ────────────────
98
+ app.use('/api/v1/a2a', a2a_1.default);
99
+ // Agent sync (public, for cron)
100
+ app.post('/api/v1/agents-sync', async (_req, res, next) => {
101
+ try {
102
+ const { syncAgents } = await Promise.resolve().then(() => __importStar(require('./services/agent-indexer')));
103
+ const result = await syncAgents();
104
+ res.json({ success: true, ...result });
105
+ }
106
+ catch (err) {
107
+ next(err);
108
+ }
109
+ });
110
+ // ── Protected routes (auth + rate-limit only on known paths) ─────────────
111
+ // Known protected API path prefixes (anything else under /api/v1 returns 404)
112
+ const PROTECTED_PREFIXES = ['/chat/completions', '/chat/history', '/tenant/'];
113
+ app.use('/api/v1', (req, _res, next) => {
114
+ if (PROTECTED_PREFIXES.some(p => req.path.startsWith(p))) {
115
+ next();
116
+ }
117
+ else {
118
+ // Path is not a known API route → 404, skip auth middleware
119
+ _res.status(404).json({ error: 'Not found' });
120
+ }
121
+ });
122
+ const api = express_1.default.Router();
123
+ api.use(auth_1.authMiddleware);
124
+ api.use(rate_limiter_1.tenantRateLimiter);
125
+ api.use(chat_1.default);
126
+ api.use('/tenant', tenant_1.default);
127
+ api.use('/chat', history_1.default);
128
+ app.use('/api/v1', api);
129
+ // ── 404 handler ───────────────────────────────────────────────────────────
130
+ app.use((_req, res) => {
131
+ if (!res.headersSent) {
132
+ res.status(404).json({ error: 'Not found' });
133
+ }
134
+ });
135
+ // ── Error handler ─────────────────────────────────────────────────────────
136
+ app.use(error_handler_1.globalErrorHandler);
137
+ // ── Start ─────────────────────────────────────────────────────────────────
138
+ app.listen(config_1.config.port, () => {
139
+ console.log(`[AgentX Gateway] Running on port ${config_1.config.port}`);
140
+ console.log(`[AgentX Gateway] Mode: ${config_1.config.nodeEnv}`);
141
+ // Start A2A background worker for multi-agent task processing
142
+ Promise.resolve().then(() => __importStar(require('./services/a2a-worker'))).then(({ startA2AWorker }) => {
143
+ startA2AWorker();
144
+ console.log('[AgentX Gateway] A2A Worker started');
145
+ }).catch(err => {
146
+ console.error('[AgentX Gateway] Failed to start A2A Worker:', err.message);
147
+ });
148
+ });
149
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function encryptApiKey(plaintext: string, masterKeyHex: string): string;
2
+ export declare function decryptApiKey(ciphertext: string, masterKeyHex: string): string;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ // ---------------------------------------------------------------------------
3
+ // AgentX Gateway — Crypto Utilities
4
+ // ---------------------------------------------------------------------------
5
+ // AES-256-GCM encrypt/decrypt for tenant API keys at rest.
6
+ // ---------------------------------------------------------------------------
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.encryptApiKey = encryptApiKey;
12
+ exports.decryptApiKey = decryptApiKey;
13
+ const crypto_1 = __importDefault(require("crypto"));
14
+ const ALGORITHM = 'aes-256-gcm';
15
+ const IV_LENGTH = 12;
16
+ const AUTH_TAG_LENGTH = 16;
17
+ function encryptApiKey(plaintext, masterKeyHex) {
18
+ const key = Buffer.from(masterKeyHex, 'hex');
19
+ const iv = crypto_1.default.randomBytes(IV_LENGTH);
20
+ const cipher = crypto_1.default.createCipheriv(ALGORITHM, key, iv);
21
+ const encrypted = Buffer.concat([
22
+ cipher.update(plaintext, 'utf8'),
23
+ cipher.final(),
24
+ ]);
25
+ const authTag = cipher.getAuthTag();
26
+ const combined = Buffer.concat([iv, authTag, encrypted]);
27
+ return combined.toString('base64');
28
+ }
29
+ function decryptApiKey(ciphertext, masterKeyHex) {
30
+ const key = Buffer.from(masterKeyHex, 'hex');
31
+ const combined = Buffer.from(ciphertext, 'base64');
32
+ const iv = combined.subarray(0, IV_LENGTH);
33
+ const authTag = combined.subarray(IV_LENGTH, IV_LENGTH + AUTH_TAG_LENGTH);
34
+ const encrypted = combined.subarray(IV_LENGTH + AUTH_TAG_LENGTH);
35
+ const decipher = crypto_1.default.createDecipheriv('aes-256-gcm', key, iv);
36
+ decipher.setAuthTag(authTag);
37
+ const decrypted = Buffer.concat([
38
+ decipher.update(encrypted),
39
+ decipher.final(),
40
+ ]);
41
+ return decrypted.toString('utf8');
42
+ }
43
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/lib/crypto.ts"],"names":[],"mappings":";AAAA,8EAA8E;AAC9E,oCAAoC;AACpC,8EAA8E;AAC9E,2DAA2D;AAC3D,8EAA8E;;;;;AAQ9E,sCAaC;AAED,sCAgBC;AArCD,oDAA2B;AAE3B,MAAM,SAAS,GAAG,aAAa,CAAA;AAC/B,MAAM,SAAS,GAAG,EAAE,CAAA;AACpB,MAAM,eAAe,GAAG,EAAE,CAAA;AAE1B,SAAgB,aAAa,CAAC,SAAiB,EAAE,YAAoB;IACnE,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAA;IAC5C,MAAM,EAAE,GAAG,gBAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;IACxC,MAAM,MAAM,GAAG,gBAAM,CAAC,cAAc,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;IAExD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC;QAChC,MAAM,CAAC,KAAK,EAAE;KACf,CAAC,CAAA;IACF,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAA;IAEnC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAA;IACxD,OAAO,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;AACpC,CAAC;AAED,SAAgB,aAAa,CAAC,UAAkB,EAAE,YAAoB;IACpE,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAA;IAC5C,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;IAElD,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;IAC1C,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,GAAG,eAAe,CAAC,CAAA;IACzE,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,GAAG,eAAe,CAAC,CAAA;IAEhE,MAAM,QAAQ,GAAG,gBAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;IAChE,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;IAE5B,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;QAC9B,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;QAC1B,QAAQ,CAAC,KAAK,EAAE;KACjB,CAAC,CAAA;IACF,OAAO,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;AACnC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Pool } from 'pg';
2
+ export declare function getPool(): Pool;
3
+ export declare function closePool(): Promise<void>;
package/dist/lib/db.js ADDED
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ // ---------------------------------------------------------------------------
3
+ // AgentX Gateway — Database Pool
4
+ // ---------------------------------------------------------------------------
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getPool = getPool;
7
+ exports.closePool = closePool;
8
+ const pg_1 = require("pg");
9
+ let pool = null;
10
+ function getPool() {
11
+ if (!pool) {
12
+ pool = new pg_1.Pool({
13
+ connectionString: process.env.DATABASE_URL,
14
+ max: 20,
15
+ idleTimeoutMillis: 30_000,
16
+ });
17
+ }
18
+ return pool;
19
+ }
20
+ async function closePool() {
21
+ if (pool) {
22
+ await pool.end();
23
+ pool = null;
24
+ }
25
+ }
26
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/lib/db.ts"],"names":[],"mappings":";AAAA,8EAA8E;AAC9E,iCAAiC;AACjC,8EAA8E;;AAM9E,0BASC;AAED,8BAKC;AApBD,2BAAyB;AAEzB,IAAI,IAAI,GAAgB,IAAI,CAAA;AAE5B,SAAgB,OAAO;IACrB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,GAAG,IAAI,SAAI,CAAC;YACd,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY;YAC1C,GAAG,EAAE,EAAE;YACP,iBAAiB,EAAE,MAAM;SAC1B,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAEM,KAAK,UAAU,SAAS;IAC7B,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,IAAI,CAAC,GAAG,EAAE,CAAA;QAChB,IAAI,GAAG,IAAI,CAAA;IACb,CAAC;AACH,CAAC"}
@@ -0,0 +1,60 @@
1
+ import { ethers } from 'ethers';
2
+ /**
3
+ * Encode registerWithMetadata(string, (string,bytes)[]) call data.
4
+ *
5
+ * ethers.js v6 Interface.encodeFunctionData fails on the inner tuple array
6
+ * when values are Uint8Array or hex strings (misidentified as string type).
7
+ * This bypasses Interface entirely and uses raw AbiCoder.
8
+ *
9
+ * Usage:
10
+ * const data = encodeRegisterWithMetadata(tokenURI, [
11
+ * ['name', 'SecurityAuditor'],
12
+ * ['description', 'AI auditor'],
13
+ * ])
14
+ * await wallet.sendTransaction({ to: identityRegistry, data, value: fee })
15
+ */
16
+ export declare function encodeRegisterWithMetadata(tokenURI: string, meta: [string, string][]): string;
17
+ /**
18
+ * Encode hasActiveSubscription(address,uint256) call data.
19
+ *
20
+ * Works around ethers.js v6 address validation edge case where string
21
+ * addresses passed through JSON parsing may be rejected.
22
+ * Uses ethers.getAddress() for strict checksum validation.
23
+ */
24
+ export declare function encodeHasActiveSubscription(subscriber: string, agentId: number): string;
25
+ /**
26
+ * Safely call getPlan(uint256) and decode the SubscriptionPlan struct.
27
+ *
28
+ * Geth RPC on OxaChain L1 hangs indefinitely on struct-returning eth_call
29
+ * (known issue P1). This wrapper has a 5-second timeout to prevent the
30
+ * event loop from blocking.
31
+ *
32
+ * Returns null if the call fails, times out, or returns empty data.
33
+ */
34
+ export declare function safeGetPlan(provider: ethers.Provider, contractAddress: string, planId: number, timeoutMs?: number): Promise<Record<string, unknown> | null>;
35
+ /**
36
+ * Encode giveFeedback(uint256,uint8,bytes32,bytes32,string,bytes32,bytes)
37
+ *
38
+ * This uses named parameters in the ABI to ensure proper type matching.
39
+ * The bytes feedbackAuth parameter is the EIP-191 signed authorization.
40
+ */
41
+ export declare function encodeGiveFeedback(agentId: number, score: number, tag1: string, tag2: string, fileuri: string, filehash: string, feedbackAuth: string): string;
42
+ /**
43
+ * Safely call getSubscriptionDetail(uint256) via raw eth_call.
44
+ *
45
+ * ethers.js v6 fails to decode the 12-field struct (mixed static/dynamic types
46
+ * with string fields). This bypasses ethers.js entirely and uses raw eth_call
47
+ * + manual AbiCoder.decode, same pattern as safeGetPlan.
48
+ *
49
+ * Returns null on failure.
50
+ */
51
+ export declare function safeGetSubscriptionDetail(provider: ethers.Provider, contractAddress: string, subscriptionId: number, timeoutMs?: number): Promise<Record<string, unknown> | null>;
52
+ /**
53
+ * Safely call getTask(uint256) via raw eth_call.
54
+ *
55
+ * ethers.js v6 fails to decode the 9-field struct (3 string fields cause
56
+ * issues with the ABI decoder). This bypasses ethers.js entirely.
57
+ *
58
+ * Returns null on failure.
59
+ */
60
+ export declare function safeGetTask(provider: ethers.Provider, contractAddress: string, taskId: number, timeoutMs?: number): Promise<Record<string, unknown> | null>;
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+ // ---------------------------------------------------------------------------
3
+ // Gateway — ethers.js v6 Utilities
4
+ // ---------------------------------------------------------------------------
5
+ // Workarounds for known ethers.js v6 bugs when interacting with Solidity
6
+ // contracts that use complex tuple types (structs with mixed static/dynamic
7
+ // fields, nested tuple arrays, etc.).
8
+ //
9
+ // Issues tracked:
10
+ // P4 — ethers.js v6 cannot encode `(string,bytes)[]` tuple arrays
11
+ // via Interface.encodeFunctionData when values contain Uint8Array
12
+ // or hex-encoded strings.
13
+ // Workaround: manual AbiCoder.encode()
14
+ // P6 — estimateGas reverts on Geth for functions returning complex structs
15
+ // (getPlan, completeTask). Workaround: skip estimateGas, use fixed
16
+ // gasLimit.
17
+ // ---------------------------------------------------------------------------
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.encodeRegisterWithMetadata = encodeRegisterWithMetadata;
20
+ exports.encodeHasActiveSubscription = encodeHasActiveSubscription;
21
+ exports.safeGetPlan = safeGetPlan;
22
+ exports.encodeGiveFeedback = encodeGiveFeedback;
23
+ exports.safeGetSubscriptionDetail = safeGetSubscriptionDetail;
24
+ exports.safeGetTask = safeGetTask;
25
+ const ethers_1 = require("ethers");
26
+ const coder = ethers_1.ethers.AbiCoder.defaultAbiCoder();
27
+ /**
28
+ * Encode registerWithMetadata(string, (string,bytes)[]) call data.
29
+ *
30
+ * ethers.js v6 Interface.encodeFunctionData fails on the inner tuple array
31
+ * when values are Uint8Array or hex strings (misidentified as string type).
32
+ * This bypasses Interface entirely and uses raw AbiCoder.
33
+ *
34
+ * Usage:
35
+ * const data = encodeRegisterWithMetadata(tokenURI, [
36
+ * ['name', 'SecurityAuditor'],
37
+ * ['description', 'AI auditor'],
38
+ * ])
39
+ * await wallet.sendTransaction({ to: identityRegistry, data, value: fee })
40
+ */
41
+ function encodeRegisterWithMetadata(tokenURI, meta) {
42
+ // keccak256("registerWithMetadata(string,(string,bytes)[])") = 0x5ac4d1c3
43
+ const encoded = coder.encode(['string', 'tuple(string,bytes)[]'], [
44
+ tokenURI,
45
+ meta.map(([k, v]) => [k, '0x' + Buffer.from(v).toString('hex')]),
46
+ ]);
47
+ return '0x5ac4d1c3' + encoded.slice(2);
48
+ }
49
+ /**
50
+ * Encode hasActiveSubscription(address,uint256) call data.
51
+ *
52
+ * Works around ethers.js v6 address validation edge case where string
53
+ * addresses passed through JSON parsing may be rejected.
54
+ * Uses ethers.getAddress() for strict checksum validation.
55
+ */
56
+ function encodeHasActiveSubscription(subscriber, agentId) {
57
+ // keccak256("hasActiveSubscription(address,uint256)") = 0x9b2f1234
58
+ const addr = ethers_1.ethers.getAddress(subscriber);
59
+ const encoded = coder.encode(['address', 'uint256'], [addr, agentId]);
60
+ return '0x9b2f1234' + encoded.slice(2);
61
+ }
62
+ /**
63
+ * Safely call getPlan(uint256) and decode the SubscriptionPlan struct.
64
+ *
65
+ * Geth RPC on OxaChain L1 hangs indefinitely on struct-returning eth_call
66
+ * (known issue P1). This wrapper has a 5-second timeout to prevent the
67
+ * event loop from blocking.
68
+ *
69
+ * Returns null if the call fails, times out, or returns empty data.
70
+ */
71
+ async function safeGetPlan(provider, contractAddress, planId, timeoutMs = 5000) {
72
+ const selector = '0x26cd5274'; // keccak256("getPlan(uint256)")
73
+ const encPid = coder.encode(['uint256'], [planId]).slice(2);
74
+ try {
75
+ const raw = await Promise.race([
76
+ provider.call({ to: contractAddress, data: selector + encPid }),
77
+ new Promise((_, reject) => setTimeout(() => reject(new Error('getPlan timeout')), timeoutMs)),
78
+ ]);
79
+ if (!raw || raw === '0x')
80
+ return null;
81
+ const decoded = coder.decode(['uint256', 'uint256', 'address', 'uint256', 'string', 'bool', 'address', 'uint256'], raw);
82
+ return {
83
+ planId: Number(decoded[0]),
84
+ agentId: Number(decoded[1]),
85
+ creator: decoded[2],
86
+ price: Number(decoded[3]),
87
+ period: decoded[4],
88
+ active: decoded[5],
89
+ payToken: decoded[6],
90
+ trialDays: Number(decoded[7]),
91
+ };
92
+ }
93
+ catch {
94
+ return null;
95
+ }
96
+ }
97
+ /**
98
+ * Encode giveFeedback(uint256,uint8,bytes32,bytes32,string,bytes32,bytes)
99
+ *
100
+ * This uses named parameters in the ABI to ensure proper type matching.
101
+ * The bytes feedbackAuth parameter is the EIP-191 signed authorization.
102
+ */
103
+ function encodeGiveFeedback(agentId, score, tag1, tag2, fileuri, filehash, feedbackAuth) {
104
+ // keccak256("giveFeedback(uint256,uint8,bytes32,bytes32,string,bytes32,bytes)")
105
+ const encoded = coder.encode(['uint256', 'uint8', 'bytes32', 'bytes32', 'string', 'bytes32', 'bytes'], [agentId, score, tag1, tag2, fileuri, filehash, feedbackAuth]);
106
+ return '0x155e5bbd' + encoded.slice(2);
107
+ }
108
+ /**
109
+ * Safely call getSubscriptionDetail(uint256) via raw eth_call.
110
+ *
111
+ * ethers.js v6 fails to decode the 12-field struct (mixed static/dynamic types
112
+ * with string fields). This bypasses ethers.js entirely and uses raw eth_call
113
+ * + manual AbiCoder.decode, same pattern as safeGetPlan.
114
+ *
115
+ * Returns null on failure.
116
+ */
117
+ async function safeGetSubscriptionDetail(provider, contractAddress, subscriptionId, timeoutMs = 5000) {
118
+ // keccak256("getSubscriptionDetail(uint256)") = 0xae823f57
119
+ const selector = '0xae823f57';
120
+ const encId = coder.encode(['uint256'], [subscriptionId]).slice(2);
121
+ try {
122
+ const raw = await Promise.race([
123
+ provider.call({ to: contractAddress, data: selector + encId }),
124
+ new Promise((_, reject) => setTimeout(() => reject(new Error('getSubscriptionDetail timeout')), timeoutMs)),
125
+ ]);
126
+ if (!raw || raw === '0x')
127
+ return null;
128
+ // Struct: (uint256,address,uint256,uint8,uint256,uint256,string,address,uint256,bool,uint256,bool)
129
+ const decoded = coder.decode(['uint256', 'address', 'uint256', 'uint8', 'uint256', 'uint256', 'string', 'address', 'uint256', 'bool', 'uint256', 'bool'], raw);
130
+ return {
131
+ subscriptionId: Number(decoded[0]),
132
+ subscriber: decoded[1],
133
+ planId: Number(decoded[2]),
134
+ status: decoded[3],
135
+ startedAt: Number(decoded[4]),
136
+ expiresAt: Number(decoded[5]),
137
+ period: decoded[6],
138
+ payToken: decoded[7],
139
+ amountPaid: Number(decoded[8]),
140
+ trialActive: decoded[9],
141
+ trialEndsAt: Number(decoded[10]),
142
+ fundsReleased: decoded[11],
143
+ };
144
+ }
145
+ catch {
146
+ return null;
147
+ }
148
+ }
149
+ /**
150
+ * Safely call getTask(uint256) via raw eth_call.
151
+ *
152
+ * ethers.js v6 fails to decode the 9-field struct (3 string fields cause
153
+ * issues with the ABI decoder). This bypasses ethers.js entirely.
154
+ *
155
+ * Returns null on failure.
156
+ */
157
+ async function safeGetTask(provider, contractAddress, taskId, timeoutMs = 5000) {
158
+ // keccak256("getTask(uint256)") = 0x1d65e77e (verify with ethers.id)
159
+ const selector = '0x1d65e77e';
160
+ const encId = coder.encode(['uint256'], [taskId]).slice(2);
161
+ try {
162
+ const raw = await Promise.race([
163
+ provider.call({ to: contractAddress, data: selector + encId }),
164
+ new Promise((_, reject) => setTimeout(() => reject(new Error('getTask timeout')), timeoutMs)),
165
+ ]);
166
+ if (!raw || raw === '0x')
167
+ return null;
168
+ // Struct: (uint256,uint256,string,string,string,uint256,address,uint256,uint256)
169
+ const decoded = coder.decode(['uint256', 'uint256', 'string', 'string', 'string', 'uint256', 'address', 'uint256', 'uint256'], raw);
170
+ return {
171
+ taskId: Number(decoded[0]),
172
+ agentId: Number(decoded[1]),
173
+ taskType: decoded[2],
174
+ inputData: decoded[3],
175
+ outputData: decoded[4],
176
+ status: decoded[5],
177
+ clientAddress: decoded[6],
178
+ createdAt: Number(decoded[7]),
179
+ completedAt: Number(decoded[8]),
180
+ };
181
+ }
182
+ catch {
183
+ return null;
184
+ }
185
+ }
186
+ //# sourceMappingURL=ethers-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ethers-utils.js","sourceRoot":"","sources":["../../src/lib/ethers-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ export declare function adminAuth(req: Request, res: Response, next: NextFunction): void;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ // ---------------------------------------------------------------------------
3
+ // AgentX Gateway — Admin Auth Middleware
4
+ // ---------------------------------------------------------------------------
5
+ // Simple shared-secret auth for admin routes.
6
+ // Pass via Authorization: Bearer <ADMIN_KEY> or X-Admin-Key header.
7
+ // ---------------------------------------------------------------------------
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.adminAuth = adminAuth;
10
+ function adminAuth(req, res, next) {
11
+ const adminKey = process.env.ADMIN_KEY;
12
+ if (!adminKey) {
13
+ res.status(500).json({ error: 'Admin key not configured on server' });
14
+ return;
15
+ }
16
+ const authHeader = req.headers.authorization;
17
+ const xAdminKey = req.headers['x-admin-key'];
18
+ let token;
19
+ if (authHeader && authHeader.startsWith('Bearer ')) {
20
+ token = authHeader.slice(7);
21
+ }
22
+ else if (xAdminKey) {
23
+ token = xAdminKey;
24
+ }
25
+ if (!token || token !== adminKey) {
26
+ res.status(401).json({ error: 'Unauthorized: invalid admin key' });
27
+ return;
28
+ }
29
+ next();
30
+ }
31
+ //# sourceMappingURL=adminAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adminAuth.js","sourceRoot":"","sources":["../../src/middleware/adminAuth.ts"],"names":[],"mappings":";AAAA,8EAA8E;AAC9E,yCAAyC;AACzC,8EAA8E;AAC9E,8CAA8C;AAC9C,oEAAoE;AACpE,8EAA8E;;AAI9E,8BAwBC;AAxBD,SAAgB,SAAS,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IACvE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAA;IAEtC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAC,CAAA;QACrE,OAAM;IACR,CAAC;IAED,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAA;IAC5C,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAuB,CAAA;IAElE,IAAI,KAAyB,CAAA;IAC7B,IAAI,UAAU,IAAI,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACnD,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC7B,CAAC;SAAM,IAAI,SAAS,EAAE,CAAC;QACrB,KAAK,GAAG,SAAS,CAAA;IACnB,CAAC;IAED,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACjC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iCAAiC,EAAE,CAAC,CAAA;QAClE,OAAM;IACR,CAAC;IAED,IAAI,EAAE,CAAA;AACR,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ export interface TenantContext {
3
+ id: string;
4
+ walletAddress: string;
5
+ planId: string;
6
+ planSlug: string;
7
+ quotaDaily: number;
8
+ quotaUsed: number;
9
+ rateLimitRpm: number;
10
+ maxConcurrent: number;
11
+ status: string;
12
+ }
13
+ declare global {
14
+ namespace Express {
15
+ interface Request {
16
+ tenant?: TenantContext;
17
+ }
18
+ }
19
+ }
20
+ export declare function getChallenge(req: Request, res: Response): Promise<void>;
21
+ export declare function verifyChallenge(req: Request, res: Response): Promise<void>;
22
+ export declare function authMiddleware(req: Request, res: Response, next: NextFunction): void;