@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/.env.example
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# AgentX Gateway — Environment Configuration Template
|
|
3
|
+
# =============================================================================
|
|
4
|
+
# Copy to .env and fill in actual values before starting the service.
|
|
5
|
+
# =============================================================================
|
|
6
|
+
|
|
7
|
+
# --- Server ----------------------------------------------------------------
|
|
8
|
+
PORT=3090
|
|
9
|
+
NODE_ENV=production
|
|
10
|
+
|
|
11
|
+
# CORS (comma-separated origins)
|
|
12
|
+
CORS_ORIGIN=http://localhost:3100
|
|
13
|
+
|
|
14
|
+
# Admin API key (used by X-Admin-Key / Bearer header in admin routes)
|
|
15
|
+
ADMIN_KEY=change-me-to-a-random-admin-key
|
|
16
|
+
|
|
17
|
+
# --- Database --------------------------------------------------------------
|
|
18
|
+
DATABASE_URL=postgresql://agentx:agentx@localhost:5432/agentx_gateway
|
|
19
|
+
|
|
20
|
+
# --- Redis (rate limiting & sessions) --------------------------------------
|
|
21
|
+
REDIS_URL=redis://localhost:6379
|
|
22
|
+
|
|
23
|
+
# --- JWT (generate: openssl rand -hex 32) ----------------------------------
|
|
24
|
+
JWT_SECRET=change-me-to-a-random-secret
|
|
25
|
+
|
|
26
|
+
# --- Master encryption key for tenant API keys at rest (hex, 32 bytes) -----
|
|
27
|
+
MASTER_ENCRYPTION_KEY=change-me-to-a-random-32-byte-hex-key
|
|
28
|
+
|
|
29
|
+
# --- Session TTL (seconds) -------------------------------------------------
|
|
30
|
+
SESSION_TTL_SEC=86400
|
|
31
|
+
|
|
32
|
+
# --- Blockchain: Sepolia ---------------------------------------------------
|
|
33
|
+
RPC_URL=https://ethereum-sepolia-rpc.publicnode.com
|
|
34
|
+
CHAIN_ID=11155111
|
|
35
|
+
IDENTITY_REGISTRY=0xe94ad380d3F8d08a7590eda0C84f354a93F96e5F
|
|
36
|
+
SUBSCRIPTION_MANAGER=0xC15fE80b9d800abb72121F353a6ae6d6E9077E63
|
|
37
|
+
A2A_PROTOCOL=0x309C7447d89f3087A9924BB686d88df020F7e9cB
|
|
38
|
+
REPUTATION_REGISTRY=0xeb6B410ea71b8d9dA0c96f6A91d35027CE143DC9
|
|
39
|
+
CONFIGURATION_REGISTRY=0x68DcE00e4C9077c94BC68016cD14B09557faEA6c
|
|
40
|
+
MULTI_ENDPOINT=0xEB5e866f186d4B73F97aa0d70B86f2C6e2e21Cb7
|
|
41
|
+
|
|
42
|
+
# --- Blockchain: OxaChain L1 -----------------------------------------------
|
|
43
|
+
RPC_URL_OXACHAIN=https://rpc-oxa.0xainet.top
|
|
44
|
+
CHAIN_ID_OXACHAIN=19505
|
|
45
|
+
IDENTITY_REGISTRY_OXACHAIN=0xbf5F9db266c8c97E3334466C88597Eb758AfE212
|
|
46
|
+
SUBSCRIPTION_MANAGER_OXACHAIN=0x019AC9d945467478Dd371CDbD70cb2f325800E6B
|
|
47
|
+
A2A_PROTOCOL_OXACHAIN=0x7F42a7dC4A0F3C107664C3750bE1B5B6fa6BEb86
|
|
48
|
+
REPUTATION_REGISTRY_OXACHAIN=0x6a18C2664E1b42063860d864b6448b824d7B843F
|
|
49
|
+
CONFIGURATION_REGISTRY_OXACHAIN=0x07280674ccc2898Fd038A9e3C22005CA83ffD2F8
|
|
50
|
+
MULTI_ENDPOINT_OXACHAIN=0xB361d04F49000013FC131D3C59C41c8486C64f8c
|
|
51
|
+
|
|
52
|
+
# --- A2A Worker wallet (private key for creating sub-tasks on-chain) -------
|
|
53
|
+
A2A_WORKER_PRIVATE_KEY=change-me-to-a-worker-wallet-private-key
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
-- ============================================================
|
|
2
|
+
-- AgentX Gateway — Multi-Tenant SaaS Initial Schema
|
|
3
|
+
-- ============================================================
|
|
4
|
+
|
|
5
|
+
-- 1. Plans (platform subscription tiers)
|
|
6
|
+
CREATE TABLE IF NOT EXISTS plans (
|
|
7
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
8
|
+
name TEXT NOT NULL,
|
|
9
|
+
slug TEXT NOT NULL UNIQUE,
|
|
10
|
+
price_monthly NUMERIC NOT NULL DEFAULT 0,
|
|
11
|
+
currency TEXT NOT NULL DEFAULT 'USD',
|
|
12
|
+
quota_daily BIGINT NOT NULL DEFAULT 0,
|
|
13
|
+
quota_monthly BIGINT NOT NULL DEFAULT 0,
|
|
14
|
+
platform_models JSONB NOT NULL DEFAULT '[]',
|
|
15
|
+
byok_enabled BOOLEAN NOT NULL DEFAULT false,
|
|
16
|
+
rate_limit_rpm INT NOT NULL DEFAULT 10,
|
|
17
|
+
max_concurrent INT NOT NULL DEFAULT 1,
|
|
18
|
+
features JSONB NOT NULL DEFAULT '{}',
|
|
19
|
+
is_active BOOLEAN NOT NULL DEFAULT true
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
-- Seed default plans
|
|
23
|
+
INSERT INTO plans (name, slug, price_monthly, quota_daily, quota_monthly, byok_enabled, rate_limit_rpm, max_concurrent, platform_models, features)
|
|
24
|
+
VALUES
|
|
25
|
+
('Free', 'free', 0, 0, 0, true, 5, 1, '[]', '{}'),
|
|
26
|
+
('Pro', 'pro', 29, 500000, 15000000, true, 30, 3,
|
|
27
|
+
'[{"provider":"openai","model":"gpt-4o-mini"},{"provider":"deepseek","model":"deepseek-chat"}]',
|
|
28
|
+
'{"chat_history_cloud":true}'),
|
|
29
|
+
('Enterprise', 'enterprise', 299, 5000000, 150000000, true, 100, 10,
|
|
30
|
+
'[{"provider":"openai","model":"gpt-4o"},{"provider":"openai","model":"gpt-4o-mini"},{"provider":"deepseek","model":"deepseek-chat"},{"provider":"anthropic","model":"claude-3-5-sonnet-20240620"}]',
|
|
31
|
+
'{"chat_history_cloud":true,"custom_models":true}')
|
|
32
|
+
ON CONFLICT (slug) DO NOTHING;
|
|
33
|
+
|
|
34
|
+
-- 2. Tenants
|
|
35
|
+
CREATE TABLE IF NOT EXISTS tenants (
|
|
36
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
37
|
+
wallet_address TEXT NOT NULL UNIQUE,
|
|
38
|
+
name TEXT,
|
|
39
|
+
plan_id UUID REFERENCES plans(id),
|
|
40
|
+
quota_daily BIGINT NOT NULL DEFAULT 0,
|
|
41
|
+
quota_used BIGINT NOT NULL DEFAULT 0,
|
|
42
|
+
quota_reset_at TIMESTAMPTZ,
|
|
43
|
+
rate_limit_rpm INT NOT NULL DEFAULT 5,
|
|
44
|
+
max_concurrent INT NOT NULL DEFAULT 1,
|
|
45
|
+
status TEXT NOT NULL DEFAULT 'active',
|
|
46
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
47
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
CREATE INDEX IF NOT EXISTS idx_tenants_wallet ON tenants(wallet_address);
|
|
51
|
+
CREATE INDEX IF NOT EXISTS idx_tenants_status ON tenants(status);
|
|
52
|
+
|
|
53
|
+
-- 3. Platform API Keys (admin-managed, load-balanced pool)
|
|
54
|
+
CREATE TABLE IF NOT EXISTS platform_api_keys (
|
|
55
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
56
|
+
provider TEXT NOT NULL,
|
|
57
|
+
endpoint TEXT NOT NULL,
|
|
58
|
+
api_key TEXT NOT NULL,
|
|
59
|
+
label TEXT,
|
|
60
|
+
plan_ids UUID[] NOT NULL,
|
|
61
|
+
models TEXT[] NOT NULL,
|
|
62
|
+
weight INT NOT NULL DEFAULT 1,
|
|
63
|
+
is_active BOOLEAN NOT NULL DEFAULT true,
|
|
64
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
-- 4. Tenant-owned API Keys (BYOK)
|
|
68
|
+
CREATE TABLE IF NOT EXISTS tenant_api_keys (
|
|
69
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
70
|
+
tenant_id UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
|
|
71
|
+
provider TEXT NOT NULL,
|
|
72
|
+
endpoint TEXT NOT NULL,
|
|
73
|
+
api_key TEXT NOT NULL,
|
|
74
|
+
model TEXT NOT NULL,
|
|
75
|
+
label TEXT,
|
|
76
|
+
is_active BOOLEAN NOT NULL DEFAULT true,
|
|
77
|
+
last_validated TIMESTAMPTZ,
|
|
78
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
CREATE INDEX IF NOT EXISTS idx_tenant_keys_tenant ON tenant_api_keys(tenant_id);
|
|
82
|
+
|
|
83
|
+
-- 5. Usage Logs
|
|
84
|
+
CREATE TABLE IF NOT EXISTS usage_logs (
|
|
85
|
+
id BIGSERIAL PRIMARY KEY,
|
|
86
|
+
tenant_id UUID NOT NULL REFERENCES tenants(id),
|
|
87
|
+
key_source TEXT NOT NULL,
|
|
88
|
+
platform_key_id UUID REFERENCES platform_api_keys(id),
|
|
89
|
+
tenant_key_id UUID REFERENCES tenant_api_keys(id),
|
|
90
|
+
provider TEXT NOT NULL,
|
|
91
|
+
model TEXT NOT NULL,
|
|
92
|
+
tokens_prompt INT NOT NULL DEFAULT 0,
|
|
93
|
+
tokens_completion INT NOT NULL DEFAULT 0,
|
|
94
|
+
tokens_total INT NOT NULL DEFAULT 0,
|
|
95
|
+
tool_calls INT NOT NULL DEFAULT 0,
|
|
96
|
+
agent_id INT,
|
|
97
|
+
cost_estimated NUMERIC,
|
|
98
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
CREATE INDEX IF NOT EXISTS idx_usage_tenant_date ON usage_logs(tenant_id, created_at DESC);
|
|
102
|
+
CREATE INDEX IF NOT EXISTS idx_usage_date ON usage_logs(created_at DESC);
|
|
103
|
+
|
|
104
|
+
-- 6. Chat Messages (optional cloud persistence)
|
|
105
|
+
CREATE TABLE IF NOT EXISTS chat_messages (
|
|
106
|
+
id BIGSERIAL PRIMARY KEY,
|
|
107
|
+
tenant_id UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE,
|
|
108
|
+
agent_id INT NOT NULL,
|
|
109
|
+
role TEXT NOT NULL,
|
|
110
|
+
content TEXT NOT NULL,
|
|
111
|
+
tool_name TEXT,
|
|
112
|
+
tool_input JSONB,
|
|
113
|
+
tool_output JSONB,
|
|
114
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
CREATE INDEX IF NOT EXISTS idx_chat_tenant_agent ON chat_messages(tenant_id, agent_id, created_at);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
-- AgentX Gateway — Agents Index Table
|
|
2
|
+
-- Stores agent metadata indexed from the IdentityRegistry contract
|
|
3
|
+
|
|
4
|
+
CREATE TABLE IF NOT EXISTS agents (
|
|
5
|
+
id INTEGER PRIMARY KEY,
|
|
6
|
+
owner VARCHAR(42) NOT NULL DEFAULT '',
|
|
7
|
+
name VARCHAR(200) NOT NULL DEFAULT '',
|
|
8
|
+
description TEXT NOT NULL DEFAULT '',
|
|
9
|
+
tags TEXT[] DEFAULT '{}',
|
|
10
|
+
capabilities TEXT[] DEFAULT '{}',
|
|
11
|
+
token_uri TEXT NOT NULL DEFAULT '',
|
|
12
|
+
metadata_json JSONB DEFAULT '{}'::jsonb,
|
|
13
|
+
synced_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
14
|
+
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
15
|
+
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
CREATE INDEX IF NOT EXISTS idx_agents_owner ON agents(owner);
|
|
19
|
+
CREATE INDEX IF NOT EXISTS idx_agents_name ON agents(name);
|
|
20
|
+
CREATE INDEX IF NOT EXISTS idx_agents_tags ON agents USING GIN(tags);
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
-- AgentX Gateway — A2A Task Results Table
|
|
2
|
+
-- Stores LLM-processed results for A2A tasks, ready for agent SDK to pick up
|
|
3
|
+
|
|
4
|
+
CREATE TABLE IF NOT EXISTS a2a_task_results (
|
|
5
|
+
task_id INTEGER PRIMARY KEY,
|
|
6
|
+
agent_id INTEGER NOT NULL,
|
|
7
|
+
task_type TEXT NOT NULL DEFAULT '',
|
|
8
|
+
input_data TEXT NOT NULL DEFAULT '',
|
|
9
|
+
output_data TEXT NOT NULL DEFAULT '',
|
|
10
|
+
status INTEGER NOT NULL DEFAULT 0, -- 0=pending, 1=processing, 2=completed, 3=failed
|
|
11
|
+
tenant_id UUID REFERENCES tenants(id),
|
|
12
|
+
error_message TEXT,
|
|
13
|
+
llm_model TEXT,
|
|
14
|
+
tokens_used INTEGER NOT NULL DEFAULT 0,
|
|
15
|
+
processed_at TIMESTAMP WITH TIME ZONE,
|
|
16
|
+
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
ALTER TABLE a2a_task_results ADD COLUMN IF NOT EXISTS tenant_id UUID REFERENCES tenants(id);
|
|
20
|
+
|
|
21
|
+
CREATE INDEX IF NOT EXISTS idx_a2a_results_agent ON a2a_task_results(agent_id, status);
|
|
22
|
+
CREATE INDEX IF NOT EXISTS idx_a2a_results_status ON a2a_task_results(status);
|
|
23
|
+
CREATE INDEX IF NOT EXISTS idx_a2a_results_created ON a2a_task_results(created_at DESC);
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# AgentX Deploy — 凭证配置模板
|
|
3
|
+
# =============================================================================
|
|
4
|
+
# 复制为 .env.deploy 并填入实际值。
|
|
5
|
+
# 然后 source .env.deploy 以加载到当前 shell。
|
|
6
|
+
#
|
|
7
|
+
# 注意: .env.deploy 已加入 .gitignore,切勿提交到仓库!
|
|
8
|
+
# =============================================================================
|
|
9
|
+
|
|
10
|
+
# SSH 部署服务器
|
|
11
|
+
export AGENTX_DEPLOY_HOST=43.156.225.164
|
|
12
|
+
export AGENTX_DEPLOY_USER=ubuntu
|
|
13
|
+
export AGENTX_DEPLOY_PASSWORD=change-me
|
|
14
|
+
|
|
15
|
+
# 合约部署私钥(勿提交真实值!)
|
|
16
|
+
export AGENTX_DEPLOY_PRIVATE_KEY=0x0000000000000000000000000000000000000000000000000000000000000000
|
|
17
|
+
|
|
18
|
+
# RPC 端点
|
|
19
|
+
export AGENTX_OX_RPC=http://43.156.99.215:18545
|
|
20
|
+
export AGENTX_SEPOLIA_RPC=https://ethereum-sepolia-rpc.publicnode.com
|
|
21
|
+
|
|
22
|
+
# 项目根目录
|
|
23
|
+
export AGENTX_PROJECT_ROOT=/home/ubuntu/agentx
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import paramiko
|
|
2
|
+
import time
|
|
3
|
+
|
|
4
|
+
host_f = '43.156.78.59'
|
|
5
|
+
c = paramiko.SSHClient()
|
|
6
|
+
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
|
7
|
+
c.connect(host_f, username='ubuntu', password='Asdf1234!', timeout=10)
|
|
8
|
+
|
|
9
|
+
def run(cmd):
|
|
10
|
+
print(f"> {cmd}")
|
|
11
|
+
stdin, stdout, stderr = c.exec_command(cmd)
|
|
12
|
+
out = stdout.read().decode()
|
|
13
|
+
err = stderr.read().decode()
|
|
14
|
+
stdout.channel.recv_exit_status()
|
|
15
|
+
if out: print(out[-500:])
|
|
16
|
+
if err and 'Warning' not in err: print("ERR:", err[-300:])
|
|
17
|
+
|
|
18
|
+
# Cleanup
|
|
19
|
+
run("fuser -k 8080/tcp 2>/dev/null; echo cleaned")
|
|
20
|
+
|
|
21
|
+
# Add 2GB swap
|
|
22
|
+
print("\n=== Adding 2GB swap ===")
|
|
23
|
+
run("sudo fallocate -l 2G /swapfile 2>/dev/null || sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 2>&1 | tail -2")
|
|
24
|
+
run("sudo chmod 600 /swapfile && sudo mkswap /swapfile 2>&1 | tail -1")
|
|
25
|
+
run("sudo swapon /swapfile 2>&1 && free -h | head -2")
|
|
26
|
+
run("grep -q swapfile /etc/fstab || echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab")
|
|
27
|
+
|
|
28
|
+
# Production build
|
|
29
|
+
print("\n=== Production build ===")
|
|
30
|
+
run("cd ~/agentx-platform && NODE_OPTIONS='--max-old-space-size=1536' npx next build 2>&1 | tail -30")
|
|
31
|
+
|
|
32
|
+
# Verify build
|
|
33
|
+
print("\n=== Checking build ===")
|
|
34
|
+
run("ls ~/agentx-platform/.next/BUILD_ID 2>/dev/null && cat ~/agentx-platform/.next/BUILD_ID || echo 'BUILD FAILED'")
|
|
35
|
+
|
|
36
|
+
# Start production
|
|
37
|
+
if True:
|
|
38
|
+
print("\n=== Starting production ===")
|
|
39
|
+
run("fuser -k 8080/tcp 2>/dev/null")
|
|
40
|
+
run("cd ~/agentx-platform && nohup npx next start -p 8080 > /tmp/prod-8080.log 2>&1 &")
|
|
41
|
+
time.sleep(5)
|
|
42
|
+
run("ss -tlnp | grep 8080")
|
|
43
|
+
run("curl -sI http://localhost:8080/ 2>&1 | head -3")
|
|
44
|
+
|
|
45
|
+
c.close()
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import paramiko
|
|
2
|
+
import time
|
|
3
|
+
import tarfile
|
|
4
|
+
import os
|
|
5
|
+
|
|
6
|
+
# Step 1: Tar the frontend source (excluding node_modules/.next) and upload to gateway server
|
|
7
|
+
gateway_host = '101.33.109.117'
|
|
8
|
+
frontend_host = '43.156.78.59'
|
|
9
|
+
password = 'Asdf1234!'
|
|
10
|
+
ubuntu = 'ubuntu'
|
|
11
|
+
|
|
12
|
+
local_dir = r'c:\Users\apply\Downloads\code\agentx\extracted\Agentx\frontend'
|
|
13
|
+
tar_path = r'c:\Users\apply\Downloads\code\agentx_fe.tar.gz'
|
|
14
|
+
|
|
15
|
+
print("=== Creating tar ===")
|
|
16
|
+
with tarfile.open(tar_path, 'w:gz') as tar:
|
|
17
|
+
count = 0
|
|
18
|
+
for root, dirs, files in os.walk(local_dir):
|
|
19
|
+
dirs[:] = [d for d in dirs if d not in ('node_modules', '.next', '.git', '__pycache__')]
|
|
20
|
+
for f in files:
|
|
21
|
+
if f == 'pnpm-lock.yaml': continue
|
|
22
|
+
full = os.path.join(root, f)
|
|
23
|
+
arc = os.path.relpath(full, local_dir).replace('\\', '/')
|
|
24
|
+
tar.add(full, arcname=arc)
|
|
25
|
+
count += 1
|
|
26
|
+
print(f"{count} files, {os.path.getsize(tar_path)} bytes")
|
|
27
|
+
|
|
28
|
+
# Step 2: Upload to gateway server
|
|
29
|
+
c1 = paramiko.SSHClient()
|
|
30
|
+
c1.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
|
31
|
+
c1.connect(gateway_host, username=ubuntu, password=password, timeout=10)
|
|
32
|
+
|
|
33
|
+
sftp = c1.open_sftp()
|
|
34
|
+
print("\n=== Uploading to gateway server ===")
|
|
35
|
+
sftp.put(tar_path, '/tmp/agentx_fe.tar.gz')
|
|
36
|
+
sftp.close()
|
|
37
|
+
|
|
38
|
+
def run(client, cmd, desc=""):
|
|
39
|
+
print(f"[{desc}] > {cmd[:100]}")
|
|
40
|
+
stdin, stdout, stderr = client.exec_command(cmd)
|
|
41
|
+
out = stdout.read().decode()
|
|
42
|
+
err = stderr.read().decode()
|
|
43
|
+
ec = stdout.channel.recv_exit_status()
|
|
44
|
+
if out and len(out) > 0: print(out[-400:])
|
|
45
|
+
if err and 'warn' not in err.lower() and 'deprecated' not in err.lower(): print("ERR:", err[-300:])
|
|
46
|
+
return ec, out, err
|
|
47
|
+
|
|
48
|
+
# Extract
|
|
49
|
+
print("\n=== Extracting ===")
|
|
50
|
+
run(c1, "cd /tmp && rm -rf agentx_fe && mkdir agentx_fe && cd agentx_fe && tar xzf /tmp/agentx_fe.tar.gz && echo extracted")
|
|
51
|
+
|
|
52
|
+
# Install dependencies
|
|
53
|
+
print("\n=== npm install ===")
|
|
54
|
+
run(c1, "cd /tmp/agentx_fe && npm install 2>&1 | tail -5", "install")
|
|
55
|
+
|
|
56
|
+
# Build
|
|
57
|
+
print("\n=== Building ===")
|
|
58
|
+
run(c1, "cd /tmp/agentx_fe && npx next build 2>&1 | tail -20", "build")
|
|
59
|
+
|
|
60
|
+
# Check build
|
|
61
|
+
print("\n=== Verify build ===")
|
|
62
|
+
run(c1, "ls /tmp/agentx_fe/.next/BUILD_ID 2>/dev/null && echo 'BUILD OK' || echo 'BUILD FAILED'")
|
|
63
|
+
run(c1, "ls /tmp/agentx_fe/.next/ | head -10")
|
|
64
|
+
|
|
65
|
+
# If build succeeded, tar .next and node_modules and upload to frontend server
|
|
66
|
+
ec, out, err = run(c1, "test -f /tmp/agentx_fe/.next/BUILD_ID && echo FOUND")
|
|
67
|
+
if 'FOUND' not in out:
|
|
68
|
+
print("BUILD FAILED - checking error log")
|
|
69
|
+
run(c1, "cat /tmp/agentx_fe/.next/trace 2>/dev/null || echo 'no trace'")
|
|
70
|
+
c1.close()
|
|
71
|
+
exit(1)
|
|
72
|
+
|
|
73
|
+
# Pack build output
|
|
74
|
+
print("\n=== Packing build ===")
|
|
75
|
+
run(c1, "cd /tmp/agentx_fe && tar czf /tmp/agentx_fe_build.tar.gz .next node_modules package.json ecosystem.config.js next.config.js .env.local .env.production 2>&1", "pack")
|
|
76
|
+
|
|
77
|
+
# Upload to frontend server via scp from gateway
|
|
78
|
+
print("\n=== SCP to frontend server ===")
|
|
79
|
+
# Generate the scp command
|
|
80
|
+
run(c1, f"sshpass -p '{password}' scp -o StrictHostKeyChecking=no /tmp/agentx_fe_build.tar.gz ubuntu@{frontend_host}:/tmp/")
|
|
81
|
+
|
|
82
|
+
# Deploy on frontend server
|
|
83
|
+
print("\n=== Deploy on frontend ===")
|
|
84
|
+
c2 = paramiko.SSHClient()
|
|
85
|
+
c2.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
|
86
|
+
c2.connect(frontend_host, username=ubuntu, password=password, timeout=10)
|
|
87
|
+
|
|
88
|
+
run(c2, "fuser -k 8080/tcp 2>/dev/null; pkill -f 'next' 2>/dev/null; sleep 1; echo done")
|
|
89
|
+
run(c2, "cd /tmp && rm -rf /tmp/agentx_deploy && mkdir /tmp/agentx_deploy && cd /tmp/agentx_deploy && tar xzf /tmp/agentx_fe_build.tar.gz && echo extracted")
|
|
90
|
+
run(c2, "rm -rf /home/ubuntu/agentx-platform/.next && cp -r /tmp/agentx_deploy/.next /home/ubuntu/agentx-platform/")
|
|
91
|
+
|
|
92
|
+
# Update node_modules if needed
|
|
93
|
+
# Copy just the updated sdk
|
|
94
|
+
run(c2, "cp -r /tmp/agentx_deploy/node_modules/@agentxv2 /home/ubuntu/agentx-platform/node_modules/ 2>/dev/null || echo 'SKIP node_modules'")
|
|
95
|
+
|
|
96
|
+
# Copy new env files
|
|
97
|
+
run(c2, "cp /tmp/agentx_deploy/.env.local /home/ubuntu/agentx-platform/ 2>/dev/null && echo env-copied || echo NOPE")
|
|
98
|
+
run(c2, "cp /tmp/agentx_deploy/.env.production /home/ubuntu/agentx-platform/ 2>/dev/null && echo env-prod-copied || echo NOPE")
|
|
99
|
+
|
|
100
|
+
# Start
|
|
101
|
+
print("\n=== Starting frontend ===")
|
|
102
|
+
run(c2, "cd /home/ubuntu/agentx-platform && nohup npx next start -p 8080 > /tmp/next-final.log 2>&1 &")
|
|
103
|
+
time.sleep(5)
|
|
104
|
+
run(c2, "ss -tlnp | grep 8080")
|
|
105
|
+
run(c2, "curl -sI http://localhost:8080/ 2>&1 | head -3")
|
|
106
|
+
run(c2, "tail -5 /tmp/next-final.log")
|
|
107
|
+
|
|
108
|
+
c1.close()
|
|
109
|
+
c2.close()
|
|
110
|
+
print("\n=== ALL DONE ===")
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import paramiko
|
|
2
|
+
import tarfile
|
|
3
|
+
import os
|
|
4
|
+
import time
|
|
5
|
+
|
|
6
|
+
host = '43.156.78.59'
|
|
7
|
+
pk = '0x872c3190b82d17b29bb046c9c55a7f7390c7f74bd6d592ba8d211f20f896f28e'
|
|
8
|
+
|
|
9
|
+
# SEP and L1 IdentityRegistry addresses
|
|
10
|
+
SEP_IR = '0xe94ad380d3F8d08a7590eda0C84f354a93F96e5F'
|
|
11
|
+
OX_IR = '0xbf5F9db266c8c97E3334466C88597Eb758AfE212'
|
|
12
|
+
|
|
13
|
+
# RPC URLs
|
|
14
|
+
SEP_RPC = 'https://ethereum-sepolia-rpc.publicnode.com'
|
|
15
|
+
OX_RPC = 'http://43.156.99.215:18545'
|
|
16
|
+
|
|
17
|
+
# Tar contracts source (exclude lib since it's empty)
|
|
18
|
+
local_dir = r'c:\Users\apply\Downloads\code\agentx\extracted\Agentx\contracts'
|
|
19
|
+
tar_path = r'c:\Users\apply\Downloads\code\agentx_contracts.tar.gz'
|
|
20
|
+
|
|
21
|
+
print("=== Creating contracts tar ===")
|
|
22
|
+
with tarfile.open(tar_path, 'w:gz') as tar:
|
|
23
|
+
count = 0
|
|
24
|
+
for root, dirs, files in os.walk(local_dir):
|
|
25
|
+
dirs[:] = [d for d in dirs if d not in ('node_modules', 'lib', 'out', 'cache', 'broadcast', '.git', '__pycache__')]
|
|
26
|
+
for f in files:
|
|
27
|
+
if f.endswith('.json') and ('out' in root or 'broadcast' in root or 'cache' in root): continue
|
|
28
|
+
full = os.path.join(root, f)
|
|
29
|
+
arc = os.path.relpath(full, local_dir).replace('\\', '/')
|
|
30
|
+
tar.add(full, arcname=arc)
|
|
31
|
+
count += 1
|
|
32
|
+
print(f"{count} files, {os.path.getsize(tar_path)} bytes")
|
|
33
|
+
|
|
34
|
+
# Upload via SFTP
|
|
35
|
+
print("\n=== Uploading ===")
|
|
36
|
+
transport = paramiko.Transport((host, 22))
|
|
37
|
+
transport.connect(username='ubuntu', password='Asdf1234!')
|
|
38
|
+
sftp = paramiko.SFTPClient.from_transport(transport)
|
|
39
|
+
sftp.put(tar_path, '/tmp/a2a_contracts.tar.gz')
|
|
40
|
+
sftp.close()
|
|
41
|
+
transport.close()
|
|
42
|
+
|
|
43
|
+
def ssh():
|
|
44
|
+
c = paramiko.SSHClient()
|
|
45
|
+
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
|
46
|
+
c.connect(host, username='ubuntu', password='Asdf1234!', timeout=30)
|
|
47
|
+
return c
|
|
48
|
+
|
|
49
|
+
def run(client, cmd, desc=""):
|
|
50
|
+
print(f"\n[{desc}] > {cmd[:130]}")
|
|
51
|
+
stdin, stdout, stderr = client.exec_command(cmd, timeout=600)
|
|
52
|
+
out = stdout.read().decode()
|
|
53
|
+
err = stderr.read().decode()
|
|
54
|
+
ec = stdout.channel.recv_exit_status()
|
|
55
|
+
if out: print(out[-800:])
|
|
56
|
+
if err and 'warn' not in err.lower() and 'deprecated' not in err.lower(): print("STDERR:", err[-300:])
|
|
57
|
+
return ec, out, err
|
|
58
|
+
|
|
59
|
+
c = ssh()
|
|
60
|
+
|
|
61
|
+
# Extract
|
|
62
|
+
run(c, "cd /tmp && rm -rf a2a_build && mkdir a2a_build && cd a2a_build && tar xzf /tmp/a2a_contracts.tar.gz && echo 'OK'")
|
|
63
|
+
|
|
64
|
+
# Install forge dependencies
|
|
65
|
+
print("\n=== Installing forge deps ===")
|
|
66
|
+
run(c, "export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && forge install foundry-rs/forge-std --no-commit 2>&1 | tail -5", "forge-std")
|
|
67
|
+
run(c, "export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && forge install OpenZeppelin/openzeppelin-contracts@v5.0.2 --no-commit 2>&1 | tail -5", "oz")
|
|
68
|
+
|
|
69
|
+
# Verify deps
|
|
70
|
+
run(c, "ls /tmp/a2a_build/lib/forge-std/src/Script.sol && ls /tmp/a2a_build/lib/openzeppelin-contracts/contracts/access/Ownable.sol && echo 'DEPS OK'")
|
|
71
|
+
|
|
72
|
+
# Fix remappings
|
|
73
|
+
print("\n=== Configuring remappings ===")
|
|
74
|
+
foundry_toml = """[profile.default]
|
|
75
|
+
solc = "0.8.20"
|
|
76
|
+
via_ir = true
|
|
77
|
+
optimizer = true
|
|
78
|
+
optimizer_runs = 200
|
|
79
|
+
evm_version = "paris"
|
|
80
|
+
remappings = [
|
|
81
|
+
"@openzeppelin/=lib/openzeppelin-contracts/",
|
|
82
|
+
"forge-std/=lib/forge-std/src/"
|
|
83
|
+
]
|
|
84
|
+
"""
|
|
85
|
+
import base64
|
|
86
|
+
b64 = base64.b64encode(foundry_toml.encode()).decode()
|
|
87
|
+
run(c, f"echo '{b64}' | base64 -d > /tmp/a2a_build/foundry.toml && cat /tmp/a2a_build/foundry.toml")
|
|
88
|
+
|
|
89
|
+
# Build
|
|
90
|
+
print("\n=== FORGE BUILD ===")
|
|
91
|
+
ec, out, err = run(c, "export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && forge build 2>&1 | tail -20", "build")
|
|
92
|
+
if ec != 0:
|
|
93
|
+
print("BUILD FAILED!")
|
|
94
|
+
run(c, "export PATH=$HOME/.foundry/bin:$PATH && cd /tmp/a2a_build && forge build 2>&1 | tail -40")
|
|
95
|
+
exit(1)
|
|
96
|
+
|
|
97
|
+
# Deploy to Sepolia
|
|
98
|
+
print("\n=========================================")
|
|
99
|
+
print(" DEPLOYING TO SEPOLIA (11155111)")
|
|
100
|
+
print("=========================================")
|
|
101
|
+
ec, out, err = run(c,
|
|
102
|
+
f"export PATH=$HOME/.foundry/bin:$PATH && "
|
|
103
|
+
f"cd /tmp/a2a_build && "
|
|
104
|
+
f"forge create src/erc8004-extensions/A2AProtocolRegistry.sol:A2AProtocolRegistry "
|
|
105
|
+
f"--rpc-url {SEP_RPC} "
|
|
106
|
+
f"--private-key {pk} "
|
|
107
|
+
f"--constructor-args {SEP_IR} "
|
|
108
|
+
f"--legacy "
|
|
109
|
+
f"2>&1",
|
|
110
|
+
"deploy SEP"
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
# Parse deployed address
|
|
114
|
+
sep_address = ""
|
|
115
|
+
for line in (out + err).split('\n'):
|
|
116
|
+
if 'Deployed to' in line:
|
|
117
|
+
sep_address = line.split(':')[-1].strip()
|
|
118
|
+
print(f"\n>>> SEPOLIA A2A: {sep_address}")
|
|
119
|
+
|
|
120
|
+
# Deploy to OxaChain L1
|
|
121
|
+
print("\n=========================================")
|
|
122
|
+
print(" DEPLOYING TO OXACHAIN L1 (19505)")
|
|
123
|
+
print("=========================================")
|
|
124
|
+
ec, out, err = run(c,
|
|
125
|
+
f"export PATH=$HOME/.foundry/bin:$PATH && "
|
|
126
|
+
f"cd /tmp/a2a_build && "
|
|
127
|
+
f"forge create src/erc8004-extensions/A2AProtocolRegistry.sol:A2AProtocolRegistry "
|
|
128
|
+
f"--rpc-url {OX_RPC} "
|
|
129
|
+
f"--private-key {pk} "
|
|
130
|
+
f"--constructor-args {OX_IR} "
|
|
131
|
+
f"--legacy "
|
|
132
|
+
f"2>&1",
|
|
133
|
+
"deploy OX"
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
ox_address = ""
|
|
137
|
+
for line in (out + err).split('\n'):
|
|
138
|
+
if 'Deployed to' in line:
|
|
139
|
+
ox_address = line.split(':')[-1].strip()
|
|
140
|
+
print(f"\n>>> OXACHAIN A2A: {ox_address}")
|
|
141
|
+
|
|
142
|
+
# Verify on Sepolia Blockscout
|
|
143
|
+
if sep_address:
|
|
144
|
+
print("\n=== Verifying on Sepolia Blockscout ===")
|
|
145
|
+
run(c,
|
|
146
|
+
f"export PATH=$HOME/.foundry/bin:$PATH && "
|
|
147
|
+
f"cd /tmp/a2a_build && "
|
|
148
|
+
f"forge verify-contract {sep_address} src/erc8004-extensions/A2AProtocolRegistry.sol:A2AProtocolRegistry "
|
|
149
|
+
f"--verifier blockscout "
|
|
150
|
+
f"--verifier-url 'https://eth-sepolia.blockscout.com/api/' "
|
|
151
|
+
f"--constructor-args $(cast abi-encode 'constructor(address)' {SEP_IR}) "
|
|
152
|
+
f"--compiler-version v0.8.20+commit.a1b79de6 "
|
|
153
|
+
f"--num-of-optimizations 200 "
|
|
154
|
+
f"--evm-version paris "
|
|
155
|
+
f"2>&1 | tail -10",
|
|
156
|
+
"verify SEP"
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
# Verify on OxaChain Explorer
|
|
160
|
+
if ox_address:
|
|
161
|
+
print("\n=== Verifying on OxaChain Explorer ===")
|
|
162
|
+
run(c,
|
|
163
|
+
f"export PATH=$HOME/.foundry/bin:$PATH && "
|
|
164
|
+
f"cd /tmp/a2a_build && "
|
|
165
|
+
f"forge verify-contract {ox_address} src/erc8004-extensions/A2AProtocolRegistry.sol:A2AProtocolRegistry "
|
|
166
|
+
f"--verifier blockscout "
|
|
167
|
+
f"--verifier-url '{OX_RPC.replace(':18545',':18400')}/api/' "
|
|
168
|
+
f"--constructor-args $(cast abi-encode 'constructor(address)' {OX_IR}) "
|
|
169
|
+
f"--compiler-version v0.8.20+commit.a1b79de6 "
|
|
170
|
+
f"--num-of-optimizations 200 "
|
|
171
|
+
f"--evm-version paris "
|
|
172
|
+
f"2>&1 | tail -10",
|
|
173
|
+
"verify OX"
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
c.close()
|
|
177
|
+
|
|
178
|
+
print("\n============================================")
|
|
179
|
+
print(" DEPLOYMENT COMPLETE")
|
|
180
|
+
print("============================================")
|
|
181
|
+
print(f" Sepolia A2A: {sep_address}")
|
|
182
|
+
print(f" OxaChain L1 A2A: {ox_address}")
|
|
183
|
+
print("============================================")
|
|
184
|
+
|
|
185
|
+
# Save addresses to update later
|
|
186
|
+
if sep_address or ox_address:
|
|
187
|
+
with open(r'c:\Users\apply\Downloads\code\agentx\extracted\Agentx\gateway\deploy\a2a_addresses.txt', 'w') as f:
|
|
188
|
+
f.write(f"SEPOLIA_A2A={sep_address}\n")
|
|
189
|
+
f.write(f"OXACHAIN_A2A={ox_address}\n")
|
|
190
|
+
print("Addresses saved to a2a_addresses.txt")
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import paramiko, time
|
|
2
|
+
|
|
3
|
+
c = paramiko.SSHClient()
|
|
4
|
+
c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
|
5
|
+
c.connect('43.156.225.164', username='ubuntu', password='Asdf1234!', timeout=30)
|
|
6
|
+
|
|
7
|
+
# Build with next.config.js typecheck disabled
|
|
8
|
+
# First, modify next.config.js to skip type checking
|
|
9
|
+
stdin, stdout, stderr = c.exec_command(
|
|
10
|
+
"cd /home/ubuntu/agentx-platform && "
|
|
11
|
+
"head -20 next.config.js",
|
|
12
|
+
timeout=10
|
|
13
|
+
)
|
|
14
|
+
print("Config:", stdout.read().decode()[:500])
|
|
15
|
+
|
|
16
|
+
# Build with --no-lint (skip eslint + type checking)
|
|
17
|
+
print("\n=== Build (--no-lint) ===")
|
|
18
|
+
stdin, stdout, stderr = c.exec_command(
|
|
19
|
+
"cd /home/ubuntu/agentx-platform && NODE_OPTIONS='--max-old-space-size=2560' ./node_modules/.bin/next build --no-lint 2>&1 | tail -25",
|
|
20
|
+
timeout=600
|
|
21
|
+
)
|
|
22
|
+
out = stdout.read().decode()
|
|
23
|
+
err = stderr.read().decode()
|
|
24
|
+
ec = stdout.channel.recv_exit_status()
|
|
25
|
+
print(out)
|
|
26
|
+
if err: print("E:", err[-300:])
|
|
27
|
+
print(f"Exit: {ec}")
|
|
28
|
+
|
|
29
|
+
# Check
|
|
30
|
+
stdin2, stdout2, stderr2 = c.exec_command("ls /home/ubuntu/agentx-platform/.next/BUILD_ID 2>/dev/null && echo BUILD_OK || echo FAILED")
|
|
31
|
+
check = stdout2.read().decode().strip()
|
|
32
|
+
print(f"Result: {check}")
|
|
33
|
+
|
|
34
|
+
if 'FAILED' in check:
|
|
35
|
+
print("FAILED")
|
|
36
|
+
c.close()
|
|
37
|
+
exit(1)
|
|
38
|
+
|
|
39
|
+
# Start
|
|
40
|
+
print("\n=== Start ===")
|
|
41
|
+
c.exec_command("fuser -k 3000/tcp 2>/dev/null; sleep 2", timeout=10)
|
|
42
|
+
c.exec_command(
|
|
43
|
+
"cd /home/ubuntu/agentx-platform && nohup ./node_modules/.bin/next start -p 3000 > /tmp/agentx-run.log 2>&1 & disown",
|
|
44
|
+
timeout=5
|
|
45
|
+
)
|
|
46
|
+
time.sleep(6)
|
|
47
|
+
|
|
48
|
+
stdin3, stdout3, stderr3 = c.exec_command("ss -tlnp | grep 3000 && echo '---' && curl -sI http://localhost:3000/ 2>&1 | head -5")
|
|
49
|
+
print(stdout3.read().decode())
|
|
50
|
+
|
|
51
|
+
c.close()
|
|
52
|
+
print("\n✅ http://43.156.225.164:3000")
|