@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.
- package/.env.example +53 -0
- package/db/migrations/001_init.sql +117 -0
- package/db/migrations/002_agents.sql +20 -0
- package/db/migrations/003_a2a_results.sql +23 -0
- package/deploy/.env.deploy.example +23 -0
- package/deploy/add_swap_build.py +45 -0
- package/deploy/build_and_deploy.py +110 -0
- package/deploy/build_deploy_a2a.py +190 -0
- package/deploy/build_no_lint.py +52 -0
- package/deploy/build_on_fe.py +86 -0
- package/deploy/build_on_gw.py +98 -0
- package/deploy/build_prod.py +54 -0
- package/deploy/check_bal.py +31 -0
- package/deploy/check_code.py +47 -0
- package/deploy/check_deploy.sh +20 -0
- package/deploy/check_docs.py +16 -0
- package/deploy/check_frontend.py +42 -0
- package/deploy/check_frontend2.py +35 -0
- package/deploy/check_pks.py +34 -0
- package/deploy/check_status.py +32 -0
- package/deploy/check_v2.py +8 -0
- package/deploy/clean_install.py +28 -0
- package/deploy/deploy_a2a.py +58 -0
- package/deploy/deploy_a2a.sh +33 -0
- package/deploy/deploy_a2a_bg.sh +40 -0
- package/deploy/deploy_a2a_v2.py +151 -0
- package/deploy/deploy_a2a_v2.sh +36 -0
- package/deploy/deploy_bin.py +64 -0
- package/deploy/deploy_config.py +34 -0
- package/deploy/deploy_final.py +42 -0
- package/deploy/deploy_frontend.py +108 -0
- package/deploy/deploy_mcp.py +108 -0
- package/deploy/deploy_now.py +49 -0
- package/deploy/deploy_push_all.py +128 -0
- package/deploy/deploy_script.py +64 -0
- package/deploy/deploy_sep_a2a.sh +18 -0
- package/deploy/dev_mode.py +51 -0
- package/deploy/diag.py +12 -0
- package/deploy/diff_test.py +22 -0
- package/deploy/final_check.py +33 -0
- package/deploy/final_deploy.py +50 -0
- package/deploy/final_fix.py +54 -0
- package/deploy/final_push.py +114 -0
- package/deploy/find_frontend.py +38 -0
- package/deploy/fix_a2a.py +43 -0
- package/deploy/fix_and_build.py +77 -0
- package/deploy/fix_and_verify.py +56 -0
- package/deploy/fix_build.py +51 -0
- package/deploy/forge_deploy.py +67 -0
- package/deploy/full_push.py +101 -0
- package/deploy/full_push2.py +106 -0
- package/deploy/go_prod.py +59 -0
- package/deploy/gw_deploy.py +133 -0
- package/deploy/gw_final.py +206 -0
- package/deploy/gw_restart.py +28 -0
- package/deploy/gw_status.py +18 -0
- package/deploy/inline_build.py +99 -0
- package/deploy/one_shot.py +84 -0
- package/deploy/ox_deploy.py +32 -0
- package/deploy/pg_setup.py +36 -0
- package/deploy/prod_deploy.py +126 -0
- package/deploy/prod_final.py +140 -0
- package/deploy/prod_go.py +61 -0
- package/deploy/prod_one_shot.py +139 -0
- package/deploy/prod_setup.sh +62 -0
- package/deploy/prod_v2.py +91 -0
- package/deploy/prod_v3.py +103 -0
- package/deploy/push_docs.py +93 -0
- package/deploy/push_mcp.py +66 -0
- package/deploy/push_mcp_doc.py +28 -0
- package/deploy/push_v063.py +80 -0
- package/deploy/push_v2.py +71 -0
- package/deploy/qcheck.py +13 -0
- package/deploy/qcheck2.py +18 -0
- package/deploy/quick_check.py +8 -0
- package/deploy/rebuild.py +47 -0
- package/deploy/rebuild_frontend.py +44 -0
- package/deploy/restart.py +28 -0
- package/deploy/restore_frontend.py +42 -0
- package/deploy/restore_frontend2.py +41 -0
- package/deploy/restore_gateway.py +34 -0
- package/deploy/restore_quick.py +33 -0
- package/deploy/run_bash.py +19 -0
- package/deploy/run_sep.py +20 -0
- package/deploy/sdk_upgrade.py +50 -0
- package/deploy/server_prepare.py +41 -0
- package/deploy/server_setup.py +41 -0
- package/deploy/ssh_check.py +14 -0
- package/deploy/ssh_push.py +24 -0
- package/deploy/start_deploy.py +35 -0
- package/deploy/start_frontend.py +12 -0
- package/deploy/start_v2.py +29 -0
- package/deploy/stat.py +18 -0
- package/deploy/tail_log.py +11 -0
- package/deploy/update_env.py +32 -0
- package/deploy/upload_and_start.py +107 -0
- package/deploy/verify_a2a.py +13 -0
- package/deploy/verify_mcp.py +37 -0
- package/deploy/verify_sdk.py +21 -0
- package/dist/config.d.ts +26 -0
- package/dist/config.js +41 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +149 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/crypto.d.ts +2 -0
- package/dist/lib/crypto.js +43 -0
- package/dist/lib/crypto.js.map +1 -0
- package/dist/lib/db.d.ts +3 -0
- package/dist/lib/db.js +26 -0
- package/dist/lib/db.js.map +1 -0
- package/dist/lib/ethers-utils.d.ts +60 -0
- package/dist/lib/ethers-utils.js +186 -0
- package/dist/lib/ethers-utils.js.map +1 -0
- package/dist/middleware/adminAuth.d.ts +2 -0
- package/dist/middleware/adminAuth.js +31 -0
- package/dist/middleware/adminAuth.js.map +1 -0
- package/dist/middleware/auth.d.ts +22 -0
- package/dist/middleware/auth.js +192 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/error-handler.d.ts +36 -0
- package/dist/middleware/error-handler.js +100 -0
- package/dist/middleware/error-handler.js.map +1 -0
- package/dist/middleware/rate-limiter.d.ts +5 -0
- package/dist/middleware/rate-limiter.js +107 -0
- package/dist/middleware/rate-limiter.js.map +1 -0
- package/dist/routes/a2a.d.ts +2 -0
- package/dist/routes/a2a.js +84 -0
- package/dist/routes/a2a.js.map +1 -0
- package/dist/routes/admin.d.ts +2 -0
- package/dist/routes/admin.js +180 -0
- package/dist/routes/admin.js.map +1 -0
- package/dist/routes/agents.d.ts +2 -0
- package/dist/routes/agents.js +43 -0
- package/dist/routes/agents.js.map +1 -0
- package/dist/routes/chat.d.ts +2 -0
- package/dist/routes/chat.js +183 -0
- package/dist/routes/chat.js.map +1 -0
- package/dist/routes/history.d.ts +2 -0
- package/dist/routes/history.js +92 -0
- package/dist/routes/history.js.map +1 -0
- package/dist/routes/mcp.d.ts +13 -0
- package/dist/routes/mcp.js +513 -0
- package/dist/routes/mcp.js.map +1 -0
- package/dist/routes/tenant.d.ts +2 -0
- package/dist/routes/tenant.js +154 -0
- package/dist/routes/tenant.js.map +1 -0
- package/dist/services/a2a-worker.d.ts +7 -0
- package/dist/services/a2a-worker.js +406 -0
- package/dist/services/a2a-worker.js.map +1 -0
- package/dist/services/agent-indexer.d.ts +4 -0
- package/dist/services/agent-indexer.js +124 -0
- package/dist/services/agent-indexer.js.map +1 -0
- package/e2e_wallet.js +175 -0
- package/ecosystem.config.js +17 -0
- package/package.json +33 -0
- package/src/config.ts +47 -0
- package/src/index.ts +143 -0
- package/src/lib/crypto.ts +44 -0
- package/src/lib/db.ts +25 -0
- package/src/lib/ethers-utils.ts +229 -0
- package/src/middleware/adminAuth.ts +34 -0
- package/src/middleware/auth.ts +244 -0
- package/src/middleware/error-handler.ts +109 -0
- package/src/middleware/rate-limiter.ts +115 -0
- package/src/routes/a2a.ts +97 -0
- package/src/routes/admin.ts +219 -0
- package/src/routes/agents.ts +52 -0
- package/src/routes/chat.ts +219 -0
- package/src/routes/history.ts +114 -0
- package/src/routes/mcp.ts +567 -0
- package/src/routes/tenant.ts +196 -0
- package/src/services/a2a-worker.ts +486 -0
- package/src/services/agent-indexer.ts +127 -0
- 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,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"}
|
package/dist/lib/db.d.ts
ADDED
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":";AAAA,8EAA8E;AAC9E,mCAAmC;AACnC,8EAA8E;AAC9E,yEAAyE;AACzE,4EAA4E;AAC5E,sCAAsC;AACtC,EAAE;AACF,kBAAkB;AAClB,oEAAoE;AACpE,0EAA0E;AAC1E,kCAAkC;AAClC,+CAA+C;AAC/C,6EAA6E;AAC7E,2EAA2E;AAC3E,oBAAoB;AACpB,8EAA8E;;AAoB9E,gEAaC;AASD,kEAQC;AAWD,kCAiCC;AAQD,gDAeC;AAWD,8DAuCC;AAUD,kCAoCC;AAnND,mCAA+B;AAE/B,MAAM,KAAK,GAAG,eAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAA;AAE/C;;;;;;;;;;;;;GAaG;AACH,SAAgB,0BAA0B,CACxC,QAAgB,EAChB,IAAwB;IAExB,0EAA0E;IAC1E,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAC1B,CAAC,QAAQ,EAAE,uBAAuB,CAAC,EACnC;QACE,QAAQ;QACR,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;KACjE,CACF,CAAA;IACD,OAAO,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AACxC,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,2BAA2B,CACzC,UAAkB,EAClB,OAAe;IAEf,mEAAmE;IACnE,MAAM,IAAI,GAAG,eAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAA;IAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAA;IACrE,OAAO,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AACxC,CAAC;AAED;;;;;;;;GAQG;AACI,KAAK,UAAU,WAAW,CAC/B,QAAyB,EACzB,eAAuB,EACvB,MAAc,EACd,SAAS,GAAG,IAAI;IAEhB,MAAM,QAAQ,GAAG,YAAY,CAAA,CAAC,gCAAgC;IAC9D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC3D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,EAAE,CAAC;YAC/D,IAAI,OAAO,CAAS,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAChC,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,EAAE,SAAS,CAAC,CAClE;SACF,CAAC,CAAA;QACF,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO,IAAI,CAAA;QACrC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAC1B,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,EACpF,GAAG,CACJ,CAAA;QACD,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC3B,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;YACnB,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;YAClB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;YAClB,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;YACpB,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;SAC9B,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,kBAAkB,CAChC,OAAe,EACf,KAAa,EACb,IAAY,EACZ,IAAY,EACZ,OAAe,EACf,QAAgB,EAChB,YAAoB;IAEpB,gFAAgF;IAChF,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAC1B,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,EACxE,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAC,CAC9D,CAAA;IACD,OAAO,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AACxC,CAAC;AAED;;;;;;;;GAQG;AACI,KAAK,UAAU,yBAAyB,CAC7C,QAAyB,EACzB,eAAuB,EACvB,cAAsB,EACtB,SAAS,GAAG,IAAI;IAEhB,2DAA2D;IAC3D,MAAM,QAAQ,GAAG,YAAY,CAAA;IAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAClE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,GAAG,KAAK,EAAE,CAAC;YAC9D,IAAI,OAAO,CAAS,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAChC,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC,EAAE,SAAS,CAAC,CAChF;SACF,CAAC,CAAA;QACF,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO,IAAI,CAAA;QACrC,mGAAmG;QACnG,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAC1B,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EAC3H,GAAG,CACJ,CAAA;QACD,OAAO;YACL,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAClC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;YACtB,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;YAClB,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC7B,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;YAClB,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;YACpB,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC9B,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;YACvB,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAChC,aAAa,EAAE,OAAO,CAAC,EAAE,CAAC;SAC3B,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACI,KAAK,UAAU,WAAW,CAC/B,QAAyB,EACzB,eAAuB,EACvB,MAAc,EACd,SAAS,GAAG,IAAI;IAEhB,qEAAqE;IACrE,MAAM,QAAQ,GAAG,YAAY,CAAA;IAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAC1D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,GAAG,KAAK,EAAE,CAAC;YAC9D,IAAI,OAAO,CAAS,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAChC,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,EAAE,SAAS,CAAC,CAClE;SACF,CAAC,CAAA;QACF,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO,IAAI,CAAA;QACrC,iFAAiF;QACjF,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAC1B,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EAChG,GAAG,CACJ,CAAA;QACD,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC3B,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;YACpB,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YACrB,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;YACtB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;YAClB,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;YACzB,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC7B,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;SAChC,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC"}
|
|
@@ -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;
|