@dominusnode/openclaw-plugin 1.0.0 → 1.1.0
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/README.md +12 -12
- package/dist/plugin.d.ts +2 -2
- package/dist/plugin.js +116 -12
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Dominus Node OpenClaw Plugin
|
|
2
2
|
|
|
3
|
-
Route web requests through
|
|
3
|
+
Route web requests through Dominus Node's rotating proxy network directly from your OpenClaw AI coding sessions. Supports datacenter and residential proxy pools with geo-targeting across 195+ countries, agentic wallets for autonomous agent billing, and team collaboration with shared wallets.
|
|
4
4
|
|
|
5
|
-
## What is
|
|
5
|
+
## What is Dominus Node?
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Dominus Node is a rotating proxy-as-a-service (PaaS) platform. Users connect to Dominus Node, are automatically assigned a proxy IP from a managed pool, and their traffic is routed through it. Usage is metered by bandwidth and billed via a prepaid wallet system.
|
|
8
8
|
|
|
9
9
|
- **Datacenter proxies**: $3.00/GB (fastest, best for non-protected targets)
|
|
10
10
|
- **Residential proxies**: $5.00/GB (premium, harder to detect)
|
|
@@ -28,9 +28,9 @@ export DOMINUSNODE_BASE_URL="https://api.dominusnode.com" # optional, this is t
|
|
|
28
28
|
### Manual Setup
|
|
29
29
|
|
|
30
30
|
```bash
|
|
31
|
-
# Clone the
|
|
32
|
-
git clone https://github.com/Dominus-Node/
|
|
33
|
-
cd
|
|
31
|
+
# Clone the Dominus Node repo
|
|
32
|
+
git clone https://github.com/Dominus-Node/Dominus Node.git
|
|
33
|
+
cd Dominus Node/integrations/openclaw
|
|
34
34
|
|
|
35
35
|
# No npm install needed — the plugin uses only native fetch (Node 18+)
|
|
36
36
|
```
|
|
@@ -39,8 +39,8 @@ cd DomiNode/integrations/openclaw
|
|
|
39
39
|
|
|
40
40
|
| Environment Variable | Required | Default | Description |
|
|
41
41
|
|---|---|---|---|
|
|
42
|
-
| `DOMINUSNODE_API_KEY` | Yes | -- | Your
|
|
43
|
-
| `DOMINUSNODE_BASE_URL` | No | `https://api.dominusnode.com` | Base URL for the
|
|
42
|
+
| `DOMINUSNODE_API_KEY` | Yes | -- | Your Dominus Node API key (starts with `dn_live_` or `dn_test_`) |
|
|
43
|
+
| `DOMINUSNODE_BASE_URL` | No | `https://api.dominusnode.com` | Base URL for the Dominus Node REST API |
|
|
44
44
|
|
|
45
45
|
### Getting an API Key
|
|
46
46
|
|
|
@@ -176,7 +176,7 @@ Use proxied_fetch to get https://httpbin.org/ip through a US datacenter proxy
|
|
|
176
176
|
|
|
177
177
|
### Check your budget
|
|
178
178
|
```
|
|
179
|
-
Check my
|
|
179
|
+
Check my Dominus Node balance and tell me how much residential browsing I have left
|
|
180
180
|
```
|
|
181
181
|
|
|
182
182
|
### Set up a research team
|
|
@@ -191,7 +191,7 @@ Create an agentic wallet called "price-monitor" with a $5 spending limit, fund i
|
|
|
191
191
|
|
|
192
192
|
### View usage breakdown
|
|
193
193
|
```
|
|
194
|
-
Show my
|
|
194
|
+
Show my Dominus Node usage for the last 7 days
|
|
195
195
|
```
|
|
196
196
|
|
|
197
197
|
### Fetch with residential proxy and geo-targeting
|
|
@@ -241,7 +241,7 @@ The plugin implements comprehensive security measures:
|
|
|
241
241
|
|
|
242
242
|
- Node.js 18+ (uses native `fetch`)
|
|
243
243
|
- OpenClaw runtime with `jiti` support
|
|
244
|
-
-
|
|
244
|
+
- Dominus Node API key with funded wallet
|
|
245
245
|
|
|
246
246
|
## License
|
|
247
247
|
|
package/dist/plugin.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Dominus Node OpenClaw Plugin
|
|
3
3
|
*
|
|
4
|
-
* Implements
|
|
4
|
+
* Implements 26 tools for interacting with Dominus Node's rotating proxy service
|
|
5
5
|
* directly from OpenClaw AI coding sessions.
|
|
6
6
|
*
|
|
7
7
|
* Uses native fetch (no external dependencies). Runs via jiti runtime.
|
package/dist/plugin.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Dominus Node OpenClaw Plugin
|
|
3
3
|
*
|
|
4
|
-
* Implements
|
|
4
|
+
* Implements 26 tools for interacting with Dominus Node's rotating proxy service
|
|
5
5
|
* directly from OpenClaw AI coding sessions.
|
|
6
6
|
*
|
|
7
7
|
* Uses native fetch (no external dependencies). Runs via jiti runtime.
|
|
@@ -36,7 +36,7 @@ function getApiKey() {
|
|
|
36
36
|
const key = process.env.DOMINUSNODE_API_KEY;
|
|
37
37
|
if (!key || typeof key !== "string" || key.trim().length === 0) {
|
|
38
38
|
throw new Error("DOMINUSNODE_API_KEY environment variable is required. " +
|
|
39
|
-
'Set it to your
|
|
39
|
+
'Set it to your Dominus Node API key (starts with "dn_live_" or "dn_test_").');
|
|
40
40
|
}
|
|
41
41
|
const trimmed = key.trim();
|
|
42
42
|
if (!trimmed.startsWith("dn_live_") && !trimmed.startsWith("dn_test_")) {
|
|
@@ -61,6 +61,9 @@ function getProxyPort() {
|
|
|
61
61
|
return 8080;
|
|
62
62
|
return port;
|
|
63
63
|
}
|
|
64
|
+
function getAgentSecret() {
|
|
65
|
+
return process.env.DOMINUSNODE_AGENT_SECRET || undefined;
|
|
66
|
+
}
|
|
64
67
|
// ---------------------------------------------------------------------------
|
|
65
68
|
// Credential scrubbing
|
|
66
69
|
// ---------------------------------------------------------------------------
|
|
@@ -351,9 +354,18 @@ async function ensureAuth(apiKey, baseUrl) {
|
|
|
351
354
|
const keyPrefix = apiKey.slice(0, 16);
|
|
352
355
|
if (cachedJwt && Date.now() < jwtExpiresAt && cachedApiKeyPrefix === keyPrefix)
|
|
353
356
|
return cachedJwt;
|
|
357
|
+
const authHeaders = {
|
|
358
|
+
"Content-Type": "application/json",
|
|
359
|
+
"User-Agent": "dominusnode-openclaw-plugin/1.0.0",
|
|
360
|
+
};
|
|
361
|
+
const agentSecret = getAgentSecret();
|
|
362
|
+
if (agentSecret) {
|
|
363
|
+
authHeaders["X-DominusNode-Agent"] = "mcp";
|
|
364
|
+
authHeaders["X-DominusNode-Agent-Secret"] = agentSecret;
|
|
365
|
+
}
|
|
354
366
|
const res = await fetch(`${baseUrl}/api/auth/verify-key`, {
|
|
355
367
|
method: "POST",
|
|
356
|
-
headers:
|
|
368
|
+
headers: authHeaders,
|
|
357
369
|
body: JSON.stringify({ apiKey }),
|
|
358
370
|
redirect: "error",
|
|
359
371
|
});
|
|
@@ -378,6 +390,11 @@ async function apiRequest(method, path, body) {
|
|
|
378
390
|
"Accept": "application/json",
|
|
379
391
|
"User-Agent": "dominusnode-openclaw-plugin/1.0.0",
|
|
380
392
|
};
|
|
393
|
+
const agentSecret = getAgentSecret();
|
|
394
|
+
if (agentSecret) {
|
|
395
|
+
headers["X-DominusNode-Agent"] = "mcp";
|
|
396
|
+
headers["X-DominusNode-Agent-Secret"] = agentSecret;
|
|
397
|
+
}
|
|
381
398
|
const init = {
|
|
382
399
|
method,
|
|
383
400
|
headers,
|
|
@@ -470,7 +487,7 @@ function formatCents(cents) {
|
|
|
470
487
|
// 1. proxied_fetch
|
|
471
488
|
const proxiedFetchTool = {
|
|
472
489
|
name: "proxied_fetch",
|
|
473
|
-
description: "Fetch a URL through
|
|
490
|
+
description: "Fetch a URL through Dominus Node's rotating proxy network. Supports geo-targeting " +
|
|
474
491
|
"by country. Returns status code, headers, and response body (truncated to 4000 chars).",
|
|
475
492
|
parameters: {
|
|
476
493
|
url: {
|
|
@@ -660,7 +677,7 @@ const proxiedFetchTool = {
|
|
|
660
677
|
// 2. check_balance
|
|
661
678
|
const checkBalanceTool = {
|
|
662
679
|
name: "check_balance",
|
|
663
|
-
description: "Check your
|
|
680
|
+
description: "Check your Dominus Node wallet balance and estimated remaining bandwidth at current pricing.",
|
|
664
681
|
parameters: {},
|
|
665
682
|
execute: async () => {
|
|
666
683
|
try {
|
|
@@ -726,7 +743,7 @@ const getProxyConfigTool = {
|
|
|
726
743
|
try {
|
|
727
744
|
const data = await apiGet("/api/proxy/config");
|
|
728
745
|
const lines = [
|
|
729
|
-
"
|
|
746
|
+
"Dominus Node Proxy Configuration",
|
|
730
747
|
"",
|
|
731
748
|
`Proxy Host: ${data.proxyHost ?? "proxy.dominusnode.com"}`,
|
|
732
749
|
`HTTP Proxy Port: ${data.httpProxyPort ?? 8080}`,
|
|
@@ -1422,7 +1439,7 @@ const updateTeamTool = {
|
|
|
1422
1439
|
// 21. topup_paypal
|
|
1423
1440
|
const topupPaypalTool = {
|
|
1424
1441
|
name: "topup_paypal",
|
|
1425
|
-
description: "Top up your
|
|
1442
|
+
description: "Top up your Dominus Node wallet balance via PayPal. Creates a PayPal order and returns an " +
|
|
1426
1443
|
"approval URL to complete payment. Minimum $5 (500 cents), maximum $1,000 (100000 cents).",
|
|
1427
1444
|
parameters: {
|
|
1428
1445
|
amount_cents: {
|
|
@@ -1454,7 +1471,92 @@ const topupPaypalTool = {
|
|
|
1454
1471
|
}
|
|
1455
1472
|
},
|
|
1456
1473
|
};
|
|
1457
|
-
// 22.
|
|
1474
|
+
// 22. topup_stripe
|
|
1475
|
+
const topupStripeTool = {
|
|
1476
|
+
name: "topup_stripe",
|
|
1477
|
+
description: "Top up your Dominus Node wallet balance via Stripe. Creates a Stripe checkout session and returns " +
|
|
1478
|
+
"a checkout URL to complete payment. Minimum $5 (500 cents), maximum $1,000 (100000 cents).",
|
|
1479
|
+
parameters: {
|
|
1480
|
+
amount_cents: {
|
|
1481
|
+
type: "number",
|
|
1482
|
+
description: "Amount in cents to top up (min 500 = $5, max 100000 = $1,000)",
|
|
1483
|
+
required: true,
|
|
1484
|
+
},
|
|
1485
|
+
},
|
|
1486
|
+
execute: async (args) => {
|
|
1487
|
+
try {
|
|
1488
|
+
const amountCents = Number(args.amount_cents ?? 0);
|
|
1489
|
+
if (!Number.isInteger(amountCents) || amountCents < 500 || amountCents > 100000) {
|
|
1490
|
+
return "Error: amount_cents must be an integer between 500 ($5) and 100000 ($1,000).";
|
|
1491
|
+
}
|
|
1492
|
+
const data = await apiPost("/api/wallet/topup/stripe", { amountCents });
|
|
1493
|
+
return [
|
|
1494
|
+
"Stripe Checkout Session Created",
|
|
1495
|
+
"",
|
|
1496
|
+
`Session ID: ${data.sessionId}`,
|
|
1497
|
+
`Amount: ${formatCents(amountCents)}`,
|
|
1498
|
+
`Checkout URL: ${data.url}`,
|
|
1499
|
+
"",
|
|
1500
|
+
"Open the checkout URL in a browser to complete payment.",
|
|
1501
|
+
"Once paid, the funds will be credited to your wallet automatically.",
|
|
1502
|
+
].join("\n");
|
|
1503
|
+
}
|
|
1504
|
+
catch (err) {
|
|
1505
|
+
return `Error: ${safeError(err)}`;
|
|
1506
|
+
}
|
|
1507
|
+
},
|
|
1508
|
+
};
|
|
1509
|
+
// 23. topup_crypto
|
|
1510
|
+
const VALID_CRYPTO_CURRENCIES = new Set([
|
|
1511
|
+
"BTC", "ETH", "LTC", "XMR", "ZEC", "USDC", "SOL", "USDT", "DAI", "BNB", "LINK",
|
|
1512
|
+
]);
|
|
1513
|
+
const topupCryptoTool = {
|
|
1514
|
+
name: "topup_crypto",
|
|
1515
|
+
description: "Top up your Dominus Node wallet balance via cryptocurrency. Creates a crypto payment invoice " +
|
|
1516
|
+
"and returns payment details. Minimum $5, maximum $1,000. " +
|
|
1517
|
+
"Supported currencies: BTC, ETH, LTC, XMR, ZEC, USDC, SOL, USDT, DAI, BNB, LINK.",
|
|
1518
|
+
parameters: {
|
|
1519
|
+
amount_usd: {
|
|
1520
|
+
type: "number",
|
|
1521
|
+
description: "Amount in USD to top up (min 5, max 1000)",
|
|
1522
|
+
required: true,
|
|
1523
|
+
},
|
|
1524
|
+
currency: {
|
|
1525
|
+
type: "string",
|
|
1526
|
+
description: "Cryptocurrency to pay with",
|
|
1527
|
+
required: true,
|
|
1528
|
+
enum: ["BTC", "ETH", "LTC", "XMR", "ZEC", "USDC", "SOL", "USDT", "DAI", "BNB", "LINK"],
|
|
1529
|
+
},
|
|
1530
|
+
},
|
|
1531
|
+
execute: async (args) => {
|
|
1532
|
+
try {
|
|
1533
|
+
const amountUsd = Number(args.amount_usd ?? 0);
|
|
1534
|
+
if (typeof amountUsd !== "number" || !Number.isFinite(amountUsd) || amountUsd < 5 || amountUsd > 1000) {
|
|
1535
|
+
return "Error: amount_usd must be a number between 5 and 1000.";
|
|
1536
|
+
}
|
|
1537
|
+
const currency = String(args.currency ?? "").toUpperCase();
|
|
1538
|
+
if (!VALID_CRYPTO_CURRENCIES.has(currency)) {
|
|
1539
|
+
return `Error: currency must be one of: ${[...VALID_CRYPTO_CURRENCIES].join(", ")}.`;
|
|
1540
|
+
}
|
|
1541
|
+
const data = await apiPost("/api/wallet/topup/crypto", { amountUsd, currency: currency.toLowerCase() });
|
|
1542
|
+
return [
|
|
1543
|
+
"Crypto Payment Invoice Created",
|
|
1544
|
+
"",
|
|
1545
|
+
`Invoice ID: ${data.invoiceId}`,
|
|
1546
|
+
`Amount: $${amountUsd}`,
|
|
1547
|
+
`Pay: ${data.priceAmount} ${data.payCurrency?.toUpperCase() ?? currency}`,
|
|
1548
|
+
`Payment URL: ${data.invoiceUrl}`,
|
|
1549
|
+
"",
|
|
1550
|
+
"Open the payment URL to complete payment.",
|
|
1551
|
+
"Once confirmed on-chain, the funds will be credited to your wallet.",
|
|
1552
|
+
].join("\n");
|
|
1553
|
+
}
|
|
1554
|
+
catch (err) {
|
|
1555
|
+
return `Error: ${safeError(err)}`;
|
|
1556
|
+
}
|
|
1557
|
+
},
|
|
1558
|
+
};
|
|
1559
|
+
// 24. x402_info
|
|
1458
1560
|
const x402InfoTool = {
|
|
1459
1561
|
name: "x402_info",
|
|
1460
1562
|
description: "Get x402 micropayment protocol information including supported " +
|
|
@@ -1470,7 +1572,7 @@ const x402InfoTool = {
|
|
|
1470
1572
|
}
|
|
1471
1573
|
},
|
|
1472
1574
|
};
|
|
1473
|
-
//
|
|
1575
|
+
// 25. update_team_member_role
|
|
1474
1576
|
const updateTeamMemberRoleTool = {
|
|
1475
1577
|
name: "update_team_member_role",
|
|
1476
1578
|
description: "Update a team member's role (member or admin). Only owners and admins can change roles.",
|
|
@@ -1516,7 +1618,7 @@ const updateTeamMemberRoleTool = {
|
|
|
1516
1618
|
}
|
|
1517
1619
|
},
|
|
1518
1620
|
};
|
|
1519
|
-
//
|
|
1621
|
+
// 26. update_wallet_policy
|
|
1520
1622
|
const updateWalletPolicyTool = {
|
|
1521
1623
|
name: "update_wallet_policy",
|
|
1522
1624
|
description: "Update the policy of an agentic wallet. Sets or clears the daily budget cap " +
|
|
@@ -1623,6 +1725,8 @@ export const tools = [
|
|
|
1623
1725
|
updateTeamTool,
|
|
1624
1726
|
updateTeamMemberRoleTool,
|
|
1625
1727
|
topupPaypalTool,
|
|
1728
|
+
topupStripeTool,
|
|
1729
|
+
topupCryptoTool,
|
|
1626
1730
|
x402InfoTool,
|
|
1627
1731
|
updateWalletPolicyTool,
|
|
1628
1732
|
];
|
|
@@ -1632,7 +1736,7 @@ export const tools = [
|
|
|
1632
1736
|
export const plugin = {
|
|
1633
1737
|
name: "dominusnode-proxy",
|
|
1634
1738
|
version: "1.0.0",
|
|
1635
|
-
description: "Route web requests through
|
|
1739
|
+
description: "Route web requests through Dominus Node's rotating proxy network with geo-targeting, " +
|
|
1636
1740
|
"balance management, agentic wallets, and team collaboration.",
|
|
1637
1741
|
tools,
|
|
1638
1742
|
};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dominusnode/openclaw-plugin",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "Dominus Node proxy plugin for OpenClaw — route web requests through rotating proxy networks",
|
|
5
5
|
"main": "dist/plugin.js",
|
|
6
6
|
"types": "dist/plugin.d.ts",
|
|
7
7
|
"type": "module",
|