safehands-pharos 1.4.0 → 1.5.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 +174 -63
- package/dist/cli.d.ts +5 -5
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +126 -124
- package/dist/cli.js.map +1 -1
- package/dist/demo.d.ts +1 -1
- package/dist/demo.js +171 -171
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +73 -65
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +1 -1
- package/dist/init.js +65 -65
- package/dist/lib/constants.d.ts +303 -291
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +302 -292
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/dodoApi.d.ts +78 -78
- package/dist/lib/dodoApi.js +196 -196
- package/dist/lib/envLoader.d.ts +2 -0
- package/dist/lib/envLoader.d.ts.map +1 -0
- package/dist/lib/envLoader.js +44 -0
- package/dist/lib/envLoader.js.map +1 -0
- package/dist/lib/http.d.ts +14 -14
- package/dist/lib/http.js +118 -118
- package/dist/lib/pharosClient.d.ts +58 -58
- package/dist/lib/pharosClient.js +63 -63
- package/dist/lib/policy/actionPolicyEngine.d.ts +53 -53
- package/dist/lib/policy/actionPolicyEngine.js +212 -212
- package/dist/lib/riskEngine.d.ts +26 -26
- package/dist/lib/riskEngine.d.ts.map +1 -1
- package/dist/lib/riskEngine.js +288 -283
- package/dist/lib/riskEngine.js.map +1 -1
- package/dist/lib/signer/index.d.ts +24 -24
- package/dist/lib/signer/index.js +88 -88
- package/dist/lib/testDodoLive.d.ts +1 -1
- package/dist/lib/testDodoLive.js +104 -104
- package/dist/lib/testLiveSafehands.d.ts +1 -1
- package/dist/lib/testLiveSafehands.js +92 -92
- package/dist/lib/testRpcLive.d.ts +1 -1
- package/dist/lib/testRpcLive.js +88 -88
- package/dist/lib/testTools.js +397 -398
- package/dist/lib/testX402Live.d.ts +1 -1
- package/dist/lib/testX402Live.js +159 -159
- package/dist/lib/toolResponse.d.ts +25 -25
- package/dist/lib/toolResponse.js +53 -53
- package/dist/lib/wallet/index.d.ts +37 -37
- package/dist/lib/wallet/index.js +128 -128
- package/dist/scripts/checkDeploy.d.ts +1 -1
- package/dist/scripts/checkDeploy.js +24 -24
- package/dist/scripts/deployRegistry.d.ts +1 -1
- package/dist/scripts/deployRegistry.js +100 -100
- package/dist/scripts/testRegistry.d.ts +1 -1
- package/dist/scripts/testRegistry.js +43 -43
- package/dist/tools/approveToken.d.ts +45 -45
- package/dist/tools/approveToken.js +85 -85
- package/dist/tools/assessRisk.d.ts +79 -79
- package/dist/tools/assessRisk.js +104 -104
- package/dist/tools/checkAllowance.d.ts +43 -43
- package/dist/tools/checkAllowance.js +56 -56
- package/dist/tools/checkTokenSecurity.d.ts +46 -46
- package/dist/tools/checkTokenSecurity.js +95 -95
- package/dist/tools/createAgentWallet.d.ts +28 -26
- package/dist/tools/createAgentWallet.d.ts.map +1 -1
- package/dist/tools/createAgentWallet.js +82 -58
- package/dist/tools/createAgentWallet.js.map +1 -1
- package/dist/tools/estimateGas.d.ts +79 -79
- package/dist/tools/estimateGas.js +124 -124
- package/dist/tools/executeSwap.d.ts +61 -61
- package/dist/tools/executeSwap.js +141 -141
- package/dist/tools/explainRisk.d.ts +29 -29
- package/dist/tools/explainRisk.js +32 -32
- package/dist/tools/getAgentWallet.d.ts +21 -21
- package/dist/tools/getAgentWallet.js +27 -27
- package/dist/tools/getAgentWalletBalance.d.ts +11 -11
- package/dist/tools/getAgentWalletBalance.js +70 -70
- package/dist/tools/getExecutionHistory.d.ts +49 -49
- package/dist/tools/getExecutionHistory.js +154 -154
- package/dist/tools/getGasPrice.d.ts +43 -43
- package/dist/tools/getGasPrice.js +59 -59
- package/dist/tools/getPoolInfo.d.ts +75 -75
- package/dist/tools/getPoolInfo.js +137 -137
- package/dist/tools/getTokenPrice.d.ts +113 -113
- package/dist/tools/getTokenPrice.js +117 -117
- package/dist/tools/getTransactionStatus.d.ts +43 -43
- package/dist/tools/getTransactionStatus.js +59 -59
- package/dist/tools/getWalletBalance.d.ts +68 -68
- package/dist/tools/getWalletBalance.js +87 -87
- package/dist/tools/publishRiskScore.d.ts +63 -63
- package/dist/tools/publishRiskScore.js +88 -88
- package/dist/tools/queryRiskRegistry.d.ts +38 -38
- package/dist/tools/queryRiskRegistry.js +55 -55
- package/dist/tools/safehandsPreflightCheck.d.ts +77 -77
- package/dist/tools/safehandsPreflightCheck.js +47 -47
- package/dist/tools/safehandsRiskReport.d.ts +81 -81
- package/dist/tools/safehandsRiskReport.js +28 -28
- package/dist/tools/safehandsSafeExecute.d.ts +20 -20
- package/dist/tools/safehandsSafeExecute.js +81 -81
- package/dist/tools/safehandsWalletHealth.d.ts +14 -14
- package/dist/tools/safehandsWalletHealth.js +103 -103
- package/dist/tools/safehandsX402Preflight.d.ts +26 -26
- package/dist/tools/safehandsX402Preflight.js +65 -65
- package/dist/tools/sendPayment.d.ts +57 -57
- package/dist/tools/sendPayment.js +117 -117
- package/dist/tools/simulateTransaction.d.ts +60 -60
- package/dist/tools/simulateTransaction.js +83 -83
- package/dist/tools/tokenRegistryStatus.d.ts +26 -26
- package/dist/tools/tokenRegistryStatus.js +96 -96
- package/dist/tools/x402PayAndFetch.d.ts +81 -81
- package/dist/tools/x402PayAndFetch.js +152 -152
- package/dist/x402Server.d.ts +1 -1
- package/dist/x402Server.js +300 -252
- package/dist/x402Server.js.map +1 -1
- package/package.json +6 -16
- package/examples/dashboard/index.html +0 -337
- package/examples/pharos-skill-engine/SKILL.safehands.md +0 -85
- package/examples/pharos-skill-engine/assets/safehands/example-actions.json +0 -49
- package/examples/pharos-skill-engine/assets/safehands/policy-defaults.json +0 -11
- package/examples/pharos-skill-engine/references/safehands.md +0 -345
- package/examples/scenario-hack.ts +0 -38
- package/skill/SKILL.md +0 -133
- package/skill/assets/safehands/example-actions.json +0 -49
- package/skill/assets/safehands/policy-defaults.json +0 -11
- package/skill/references/safehands.md +0 -345
package/README.md
CHANGED
|
@@ -1,3 +1,56 @@
|
|
|
1
|
+
# SafeHands-Pharos — Transaction Safety Firewall for AI Agents
|
|
2
|
+
|
|
3
|
+
> **Most Pharos skills let an agent *do* things — check balances, swap, pay, deploy.**
|
|
4
|
+
> **SafeHands is the one that decides whether the agent *should*.**
|
|
5
|
+
|
|
6
|
+
```bash
|
|
7
|
+
npx safehands-pharos skill safehands_preflight_check --input-json \
|
|
8
|
+
'{"actionType":"approve_token","chainId":688689,"tokenAddress":"0xE0BE08c77f415F577A1B3A9aD7a1Df1479564ec8","spenderAddress":"0x000000000000000000000000000000000000dEaD","approvalAmount":"max"}'
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Sample output:
|
|
12
|
+
|
|
13
|
+
```json
|
|
14
|
+
{
|
|
15
|
+
"success": true,
|
|
16
|
+
"data": {
|
|
17
|
+
"decision": "BLOCK",
|
|
18
|
+
"riskLevel": "HIGH",
|
|
19
|
+
"safeToExecute": false,
|
|
20
|
+
"reasons": [
|
|
21
|
+
"Unlimited approval requested."
|
|
22
|
+
],
|
|
23
|
+
"requiredActions": [
|
|
24
|
+
"Use a limited approval amount."
|
|
25
|
+
],
|
|
26
|
+
"checks": [
|
|
27
|
+
{ "name": "mainnet_guard", "status": "pass", "message": "Action is not targeting mainnet." },
|
|
28
|
+
{ "name": "chain_id", "status": "pass", "message": "Chain ID is Pharos Atlantic Testnet (688689)." },
|
|
29
|
+
{ "name": "environment", "status": "pass", "message": "Environment is atlantic-testnet." },
|
|
30
|
+
{ "name": "approval_amount", "status": "fail", "message": "Unlimited approval is blocked by default." }
|
|
31
|
+
],
|
|
32
|
+
"environment": "atlantic-testnet",
|
|
33
|
+
"chainId": 688689,
|
|
34
|
+
"isMainnet": false,
|
|
35
|
+
"tokenRegistry": {
|
|
36
|
+
"symbol": "USDC",
|
|
37
|
+
"status": "SKILL_ENGINE_CANONICAL_TOKEN",
|
|
38
|
+
"verificationStatus": "DOCS_VERIFIED_FROM_PHAROS_SKILL_ENGINE"
|
|
39
|
+
},
|
|
40
|
+
"source": "safehands_preflight_check"
|
|
41
|
+
},
|
|
42
|
+
"error": null,
|
|
43
|
+
"timestamp": "2026-06-14T00:00:00.000Z"
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
That's the whole idea: **before** an agent approves a token, swaps, sends a payment,
|
|
48
|
+
or pays an x402 resource, SafeHands runs a policy check and returns `ALLOW`, `WARN`,
|
|
49
|
+
or `BLOCK` — with a plain-English reason. If `BLOCK`, the agent stops. No transaction,
|
|
50
|
+
no loss.
|
|
51
|
+
|
|
52
|
+
**Live preflight examples:** see [DEMO.md](DEMO.md) — real ALLOW and BLOCK outputs.
|
|
53
|
+
|
|
1
54
|
<p align="center">
|
|
2
55
|
<img src="https://img.shields.io/badge/TypeScript-3178C6?style=for-the-badge&logo=typescript&logoColor=white" />
|
|
3
56
|
<img src="https://img.shields.io/badge/MCP_Skill-000000?style=for-the-badge" />
|
|
@@ -6,37 +59,47 @@
|
|
|
6
59
|
<img src="https://img.shields.io/badge/Testnet_Only-SAFE-blue?style=for-the-badge" />
|
|
7
60
|
</p>
|
|
8
61
|
|
|
9
|
-
|
|
62
|
+
> **Testnet only.** SafeHands targets Pharos Atlantic Testnet (Chain ID 688689). Not audited for mainnet use.
|
|
10
63
|
|
|
11
|
-
|
|
64
|
+
---
|
|
12
65
|
|
|
13
|
-
|
|
66
|
+
## Why AI Agents Need This
|
|
14
67
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
↓
|
|
18
|
-
safehands_preflight_check
|
|
19
|
-
↓
|
|
20
|
-
ALLOW → safe, proceed
|
|
21
|
-
WARN → proceed with caution
|
|
22
|
-
BLOCK → stop, reason explained
|
|
23
|
-
```
|
|
68
|
+
Generic Web3 tools answer: *"Can this transaction be sent?"*
|
|
69
|
+
SafeHands answers: **"Should this action be allowed at all?"**
|
|
24
70
|
|
|
25
|
-
|
|
71
|
+
| Risk | What goes wrong without SafeHands | SafeHands guardrail |
|
|
72
|
+
|------|----------------------------------|---------------------|
|
|
73
|
+
| Unlimited approval | Agent approves malicious spender forever | Blocked by default |
|
|
74
|
+
| Wrong chain | Agent signs on mainnet by mistake | Blocked |
|
|
75
|
+
| Risky x402 URL | Agent pays a localhost / private IP | Blocked (SSRF guard) |
|
|
76
|
+
| Overspending | Agent drains wallet in one session | Daily cap enforced |
|
|
77
|
+
| Unknown token | Agent swaps unverified contract | Warns, requires review |
|
|
78
|
+
| Missing signer | Agent attempts write without wallet | Structured error returned |
|
|
79
|
+
|
|
80
|
+
SafeHands is a **Pharos Skill Engine-compatible MCP package** — a composable guardrail layer that any agent can add in front of any action, without modifying existing skill logic.
|
|
26
81
|
|
|
27
82
|
---
|
|
28
83
|
|
|
29
84
|
## Getting Started
|
|
30
85
|
|
|
31
|
-
###
|
|
86
|
+
### Step 1 — Try it now (no setup, no wallet)
|
|
32
87
|
|
|
33
88
|
```bash
|
|
34
|
-
npx
|
|
89
|
+
npx safehands-pharos --demo
|
|
35
90
|
```
|
|
36
91
|
|
|
37
|
-
|
|
92
|
+
Runs 10 live safety checks in your terminal: ALLOW/BLOCK decisions, wallet health, token registry, x402 preflight, risk report. No config, no private key, no transactions.
|
|
38
93
|
|
|
39
|
-
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
### Step 2 — Connect to your AI agent
|
|
97
|
+
|
|
98
|
+
Pick **one** depending on how you use AI agents:
|
|
99
|
+
|
|
100
|
+
#### Claude Desktop
|
|
101
|
+
|
|
102
|
+
Add to your `claude_desktop_config.json`, then restart Claude Desktop:
|
|
40
103
|
|
|
41
104
|
```json
|
|
42
105
|
{
|
|
@@ -49,44 +112,46 @@ Add to `claude_desktop_config.json`:
|
|
|
49
112
|
}
|
|
50
113
|
```
|
|
51
114
|
|
|
52
|
-
|
|
115
|
+
All 27 SafeHands tools appear automatically in every Claude conversation.
|
|
53
116
|
|
|
54
|
-
|
|
117
|
+
#### Anvita Flow
|
|
55
118
|
|
|
56
|
-
Add as MCP server in Anvita Flow settings:
|
|
119
|
+
Add as an MCP server in Anvita Flow settings:
|
|
57
120
|
|
|
58
121
|
```json
|
|
59
|
-
{
|
|
60
|
-
"command": "npx",
|
|
61
|
-
"args": ["safehands-pharos"]
|
|
62
|
-
}
|
|
122
|
+
{ "command": "npx", "args": ["safehands-pharos"] }
|
|
63
123
|
```
|
|
64
124
|
|
|
65
|
-
|
|
125
|
+
#### Terminal / scripts (CLI)
|
|
126
|
+
|
|
127
|
+
Call any tool directly without connecting to an AI client:
|
|
66
128
|
|
|
67
129
|
```bash
|
|
68
|
-
npx safehands-pharos
|
|
130
|
+
npx safehands-pharos skill safehands_preflight_check \
|
|
131
|
+
'{"actionType":"send_payment","chainId":688689,"amount":"0.001","recipient":"0x1234567890123456789012345678901234567890"}'
|
|
69
132
|
```
|
|
70
133
|
|
|
71
|
-
|
|
134
|
+
---
|
|
72
135
|
|
|
73
|
-
###
|
|
136
|
+
### Step 3 — (Optional) Enable write operations
|
|
74
137
|
|
|
75
|
-
|
|
76
|
-
npx safehands-pharos --demo
|
|
77
|
-
```
|
|
138
|
+
By default, SafeHands is **read-only**: preflight checks, risk scoring, token registry, wallet health. No private key needed.
|
|
78
139
|
|
|
79
|
-
|
|
140
|
+
To unlock swaps, payments, and approvals, run the setup wizard:
|
|
80
141
|
|
|
81
|
-
|
|
142
|
+
```bash
|
|
143
|
+
npx safehands-pharos init
|
|
144
|
+
```
|
|
82
145
|
|
|
83
|
-
|
|
146
|
+
Or set manually in a `.env` file in your working directory:
|
|
84
147
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
148
|
+
```env
|
|
149
|
+
WALLET_MODE=env # env | managed-testnet
|
|
150
|
+
PRIVATE_KEY=0x... # testnet key only — never mainnet
|
|
151
|
+
WRITE_TOOLS_ENABLED=true
|
|
152
|
+
MAX_TX_AMOUNT_PHRS=0.1 # per-transaction cap
|
|
153
|
+
MAX_DAILY_SPEND_USD=10 # daily spend cap
|
|
154
|
+
```
|
|
90
155
|
|
|
91
156
|
---
|
|
92
157
|
|
|
@@ -204,13 +269,13 @@ On failure: `success: false`, `data: null`, `error: { code, message, retryable }
|
|
|
204
269
|
|
|
205
270
|
## Configuration
|
|
206
271
|
|
|
207
|
-
|
|
272
|
+
If you cloned the repo, copy the example file:
|
|
208
273
|
|
|
209
274
|
```bash
|
|
210
|
-
cp .env.example .env
|
|
275
|
+
cp .env.example .env # then edit .env with your settings
|
|
211
276
|
```
|
|
212
277
|
|
|
213
|
-
|
|
278
|
+
If you installed via `npx` or `npm install`, create a `.env` in your working directory with these settings:
|
|
214
279
|
|
|
215
280
|
```env
|
|
216
281
|
# Wallet mode
|
|
@@ -266,29 +331,17 @@ SafeHands ships safe by default — nothing is enabled without explicit opt-in:
|
|
|
266
331
|
|
|
267
332
|
---
|
|
268
333
|
|
|
269
|
-
## Why AI Agents Need This
|
|
270
|
-
|
|
271
|
-
Generic Web3 tools answer: *"Can this transaction be sent?"*
|
|
272
|
-
SafeHands answers: **"Should this action be allowed at all?"**
|
|
273
|
-
|
|
274
|
-
| Risk | What goes wrong | SafeHands guardrail |
|
|
275
|
-
|------|----------------|---------------------|
|
|
276
|
-
| Unlimited approval | Agent approves malicious spender forever | Blocked by default |
|
|
277
|
-
| Wrong chain | Agent signs on mainnet | Blocked |
|
|
278
|
-
| Risky x402 URL | Agent pays a localhost/private IP | Blocked |
|
|
279
|
-
| Overspending | Agent drains wallet | Daily cap enforced |
|
|
280
|
-
| Unknown token | Agent swaps unverified token | Warns or requires review |
|
|
281
|
-
| Missing signer | Agent tries write without wallet | Structured error returned |
|
|
282
|
-
|
|
283
|
-
---
|
|
284
|
-
|
|
285
334
|
## x402 Support
|
|
286
335
|
|
|
287
336
|
SafeHands acts as both an x402 client and server.
|
|
288
337
|
|
|
289
338
|
**Client** (`x402_pay_and_fetch`): Fetches a resource normally first. If the server returns HTTP 402, SafeHands runs a preflight check, requests the signer, pays, and retries — all in one tool call. Payment proofs are never logged.
|
|
290
339
|
|
|
291
|
-
**Server** (`npm run x402-server`): Exposes paid endpoints:
|
|
340
|
+
**Server** (`npm run x402-server`): Exposes paid endpoints. A live instance runs at:
|
|
341
|
+
|
|
342
|
+
```
|
|
343
|
+
https://safehands-pharos-production.up.railway.app
|
|
344
|
+
```
|
|
292
345
|
|
|
293
346
|
| Endpoint | Type | Price |
|
|
294
347
|
|----------|------|-------|
|
|
@@ -300,6 +353,27 @@ SafeHands acts as both an x402 client and server.
|
|
|
300
353
|
|
|
301
354
|
---
|
|
302
355
|
|
|
356
|
+
## Examples
|
|
357
|
+
|
|
358
|
+
**Prompt-injection attack scenario** — SafeHands blocking an unlimited token approval triggered by a simulated prompt-injection attack:
|
|
359
|
+
|
|
360
|
+
```bash
|
|
361
|
+
npx safehands-pharos skill safehands_preflight_check \
|
|
362
|
+
'{"actionType":"approve_token","chainId":688689,"approvalAmount":"max","spender":"0xBadActor12300000000000000000000000000000"}'
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
Expected output: `BLOCK` — `"Unlimited approval is blocked by default."`
|
|
366
|
+
|
|
367
|
+
**Live server** — the SafeHands x402 server runs at:
|
|
368
|
+
|
|
369
|
+
```
|
|
370
|
+
https://safehands-pharos-production.up.railway.app
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
Hit `/preflight?actionType=send_payment&amount=0.001&chainId=688689&recipient=0x1234...` for a live ALLOW/WARN/BLOCK response with no setup required.
|
|
374
|
+
|
|
375
|
+
---
|
|
376
|
+
|
|
303
377
|
## Network Info
|
|
304
378
|
|
|
305
379
|
| Item | Value |
|
|
@@ -310,16 +384,34 @@ SafeHands acts as both an x402 client and server.
|
|
|
310
384
|
| USDC | `0xE0BE08c77f415F577A1B3A9aD7a1Df1479564ec8` |
|
|
311
385
|
| RiskRegistry | `0x61962a6c812ee9f57b207e1ea47c19ae70bb7141` |
|
|
312
386
|
|
|
387
|
+
**Proof of life — live on-chain tx:**
|
|
388
|
+
|
|
389
|
+
| What | Value |
|
|
390
|
+
|------|-------|
|
|
391
|
+
| Action | `publish_risk_score` → RiskRegistry |
|
|
392
|
+
| Tx Hash | [`0x6a58f636...fdefc`](https://atlantic.pharosscan.xyz/tx/0x6a58f636814458c09304db3d7c4f5f48e764f6439649fbb786cddb32c77fdefc) |
|
|
393
|
+
| Block | `24168297` |
|
|
394
|
+
| Gas Used | `140,187` |
|
|
395
|
+
|
|
313
396
|
---
|
|
314
397
|
|
|
315
398
|
## Testing
|
|
316
399
|
|
|
317
400
|
```bash
|
|
401
|
+
npm run build # compile TypeScript
|
|
402
|
+
npm run demo # run 10 live safety checks in terminal (no wallet needed)
|
|
403
|
+
npm run dev # run MCP server in dev mode (tsx, no build step)
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
For manual testing, use the CLI directly after building:
|
|
407
|
+
|
|
408
|
+
```bash
|
|
409
|
+
# Build first
|
|
318
410
|
npm run build
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
411
|
+
|
|
412
|
+
# Then call any tool
|
|
413
|
+
node dist/index.js skill safehands_preflight_check \
|
|
414
|
+
'{"actionType":"approve_token","chainId":688689,"approvalAmount":"max"}'
|
|
323
415
|
```
|
|
324
416
|
|
|
325
417
|
---
|
|
@@ -331,3 +423,22 @@ npm run test:dodo:live # DODO API check (skips if DODO_API_KEY not set)
|
|
|
331
423
|
- `get_token_price` and swap routing require a DODO API key
|
|
332
424
|
- GoPlus token security does not support Pharos testnet (Chain 688689) — `check_token_security` returns a clear error
|
|
333
425
|
- DODO reverse routes (e.g. USDT → PHRS) have no liquidity on testnet
|
|
426
|
+
- x402 client and server are implemented with the official `@x402/fetch` and `@x402/evm` SDKs and verified against a local x402-compatible server. They have not yet been verified against live third-party x402 endpoints on Pharos.
|
|
427
|
+
|
|
428
|
+
---
|
|
429
|
+
|
|
430
|
+
## Roadmap
|
|
431
|
+
|
|
432
|
+
SafeHands is designed to grow from a single-project guardrail into **shared safety infrastructure** for the Pharos agent economy.
|
|
433
|
+
|
|
434
|
+
**Near-term**
|
|
435
|
+
- **Per-agent spend limits** — a `set_spend_limits` / `get_spend_limits` tool pair so each agent carries its own policy instead of a shared global cap. Stored in the existing AES-256-GCM encrypted wallet store.
|
|
436
|
+
- **x402 live endpoint verification** — validate SafeHands's x402 preflight against production third-party x402 endpoints on Pharos as they become available.
|
|
437
|
+
|
|
438
|
+
**Medium-term**
|
|
439
|
+
- **Community risk registry** — as more agents publish scores to the on-chain RiskRegistry (`0x61962a6c812ee9f57b207e1ea47c19ae70bb7141`), `query_risk_registry` becomes shared reputation infrastructure. A malicious contract blocked by one agent is flagged for all agents across the ecosystem.
|
|
440
|
+
- **Cross-chain x402 guardrails** — SafeHands's x402 preflight logic is protocol-level, not Pharos-specific. The same guardrail pattern can protect agents making x402 payments on AgentCash (Base / Solana) or any other compatible network.
|
|
441
|
+
|
|
442
|
+
**Long-term**
|
|
443
|
+
- **Mainnet support** — currently testnet-only by design. Mainnet requires a full re-audit of every safety check, formal verification of the RiskRegistry contract, and KMS/Vault-grade key management before it can be trusted with real funds.
|
|
444
|
+
- **Standardized guardrail interface** — a community spec so any Pharos skill can expose a `preflight(action) → ALLOW | WARN | BLOCK` interface and compose with SafeHands, rather than each skill reinventing safety logic independently.
|
package/dist/cli.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { type ToolResponse } from "./lib/toolResponse.js";
|
|
2
|
-
export type SkillCliToolName = "safehands_preflight_check" | "safehands_x402_preflight" | "safehands_wallet_health" | "token_registry_status" | "explain_risk" | "safehands_risk_report" | "safehands_safe_execute" | "create_agent_wallet" | "get_agent_wallet" | "get_agent_wallet_balance" | "check_token_security" | "assess_risk" | "get_wallet_balance" | "simulate_transaction" | "estimate_gas" | "get_token_price" | "get_transaction_status" | "query_risk_registry";
|
|
3
|
-
export declare function getSkillCliToolNames(): string[];
|
|
4
|
-
export declare function invokeSkillCliTool(toolName: string, input: unknown): Promise<ToolResponse<unknown>>;
|
|
5
|
-
export declare function runSkillCli(argv: string[]): Promise<number>;
|
|
1
|
+
import { type ToolResponse } from "./lib/toolResponse.js";
|
|
2
|
+
export type SkillCliToolName = "safehands_preflight_check" | "safehands_x402_preflight" | "safehands_wallet_health" | "token_registry_status" | "explain_risk" | "safehands_risk_report" | "safehands_safe_execute" | "create_agent_wallet" | "get_agent_wallet" | "get_agent_wallet_balance" | "check_token_security" | "assess_risk" | "get_wallet_balance" | "simulate_transaction" | "estimate_gas" | "get_token_price" | "get_transaction_status" | "query_risk_registry" | "publish_risk_score";
|
|
3
|
+
export declare function getSkillCliToolNames(): string[];
|
|
4
|
+
export declare function invokeSkillCliTool(toolName: string, input: unknown): Promise<ToolResponse<unknown>>;
|
|
5
|
+
export declare function runSkillCli(argv: string[]): Promise<number>;
|
|
6
6
|
//# sourceMappingURL=cli.d.ts.map
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAMA,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAMA,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAqBpE,MAAM,MAAM,gBAAgB,GACxB,2BAA2B,GAC3B,0BAA0B,GAC1B,yBAAyB,GACzB,uBAAuB,GACvB,cAAc,GACd,uBAAuB,GACvB,wBAAwB,GACxB,qBAAqB,GACrB,kBAAkB,GAClB,0BAA0B,GAC1B,sBAAsB,GACtB,aAAa,GACb,oBAAoB,GACpB,sBAAsB,GACtB,cAAc,GACd,iBAAiB,GACjB,wBAAwB,GACxB,qBAAqB,GACrB,oBAAoB,CAAC;AA+DzB,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAE/C;AAED,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAuBzG;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BjE"}
|
package/dist/cli.js
CHANGED
|
@@ -1,125 +1,127 @@
|
|
|
1
|
-
// ─── SafeHands Skill Engine CLI Adapter ────────────────────────────────
|
|
2
|
-
// Terminal entrypoint used by Pharos Skill Engine reference files.
|
|
3
|
-
// It calls the same tool handlers as MCP registration and prints the
|
|
4
|
-
// standard SafeHands response envelope as JSON.
|
|
5
|
-
// ────────────────────────────────────────────────────────────────────────
|
|
6
|
-
import { fail, ok } from "./lib/toolResponse.js";
|
|
7
|
-
import { handleSafeHandsPreflightCheck } from "./tools/safehandsPreflightCheck.js";
|
|
8
|
-
import { handleSafeHandsX402Preflight } from "./tools/safehandsX402Preflight.js";
|
|
9
|
-
import { handleSafeHandsWalletHealth } from "./tools/safehandsWalletHealth.js";
|
|
10
|
-
import { handleTokenRegistryStatus } from "./tools/tokenRegistryStatus.js";
|
|
11
|
-
import { handleExplainRisk } from "./tools/explainRisk.js";
|
|
12
|
-
import { handleSafeHandsRiskReport } from "./tools/safehandsRiskReport.js";
|
|
13
|
-
import { handleSafeHandsSafeExecute } from "./tools/safehandsSafeExecute.js";
|
|
14
|
-
import { handleCreateAgentWallet } from "./tools/createAgentWallet.js";
|
|
15
|
-
import { handleGetAgentWallet } from "./tools/getAgentWallet.js";
|
|
16
|
-
import { handleGetAgentWalletBalance } from "./tools/getAgentWalletBalance.js";
|
|
17
|
-
import { handleCheckTokenSecurity } from "./tools/checkTokenSecurity.js";
|
|
18
|
-
import { handleAssessRisk } from "./tools/assessRisk.js";
|
|
19
|
-
import { handleGetWalletBalance } from "./tools/getWalletBalance.js";
|
|
20
|
-
import { handleSimulateTransaction } from "./tools/simulateTransaction.js";
|
|
21
|
-
import { handleEstimateGas } from "./tools/estimateGas.js";
|
|
22
|
-
import { handleGetTokenPrice } from "./tools/getTokenPrice.js";
|
|
23
|
-
import { handleGetTransactionStatus } from "./tools/getTransactionStatus.js";
|
|
24
|
-
import { handleQueryRiskRegistry } from "./tools/queryRiskRegistry.js";
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
"",
|
|
58
|
-
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
" npx safehands-pharos skill
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
1
|
+
// ─── SafeHands Skill Engine CLI Adapter ────────────────────────────────
|
|
2
|
+
// Terminal entrypoint used by Pharos Skill Engine reference files.
|
|
3
|
+
// It calls the same tool handlers as MCP registration and prints the
|
|
4
|
+
// standard SafeHands response envelope as JSON.
|
|
5
|
+
// ────────────────────────────────────────────────────────────────────────
|
|
6
|
+
import { fail, ok } from "./lib/toolResponse.js";
|
|
7
|
+
import { handleSafeHandsPreflightCheck } from "./tools/safehandsPreflightCheck.js";
|
|
8
|
+
import { handleSafeHandsX402Preflight } from "./tools/safehandsX402Preflight.js";
|
|
9
|
+
import { handleSafeHandsWalletHealth } from "./tools/safehandsWalletHealth.js";
|
|
10
|
+
import { handleTokenRegistryStatus } from "./tools/tokenRegistryStatus.js";
|
|
11
|
+
import { handleExplainRisk } from "./tools/explainRisk.js";
|
|
12
|
+
import { handleSafeHandsRiskReport } from "./tools/safehandsRiskReport.js";
|
|
13
|
+
import { handleSafeHandsSafeExecute } from "./tools/safehandsSafeExecute.js";
|
|
14
|
+
import { handleCreateAgentWallet } from "./tools/createAgentWallet.js";
|
|
15
|
+
import { handleGetAgentWallet } from "./tools/getAgentWallet.js";
|
|
16
|
+
import { handleGetAgentWalletBalance } from "./tools/getAgentWalletBalance.js";
|
|
17
|
+
import { handleCheckTokenSecurity } from "./tools/checkTokenSecurity.js";
|
|
18
|
+
import { handleAssessRisk } from "./tools/assessRisk.js";
|
|
19
|
+
import { handleGetWalletBalance } from "./tools/getWalletBalance.js";
|
|
20
|
+
import { handleSimulateTransaction } from "./tools/simulateTransaction.js";
|
|
21
|
+
import { handleEstimateGas } from "./tools/estimateGas.js";
|
|
22
|
+
import { handleGetTokenPrice } from "./tools/getTokenPrice.js";
|
|
23
|
+
import { handleGetTransactionStatus } from "./tools/getTransactionStatus.js";
|
|
24
|
+
import { handleQueryRiskRegistry } from "./tools/queryRiskRegistry.js";
|
|
25
|
+
import { handlePublishRiskScore } from "./tools/publishRiskScore.js";
|
|
26
|
+
const SKILL_CLI_TOOLS = {
|
|
27
|
+
safehands_preflight_check: handleSafeHandsPreflightCheck,
|
|
28
|
+
safehands_x402_preflight: handleSafeHandsX402Preflight,
|
|
29
|
+
safehands_wallet_health: handleSafeHandsWalletHealth,
|
|
30
|
+
token_registry_status: handleTokenRegistryStatus,
|
|
31
|
+
explain_risk: handleExplainRisk,
|
|
32
|
+
safehands_risk_report: handleSafeHandsRiskReport,
|
|
33
|
+
safehands_safe_execute: handleSafeHandsSafeExecute,
|
|
34
|
+
create_agent_wallet: handleCreateAgentWallet,
|
|
35
|
+
get_agent_wallet: handleGetAgentWallet,
|
|
36
|
+
get_agent_wallet_balance: handleGetAgentWalletBalance,
|
|
37
|
+
check_token_security: handleCheckTokenSecurity,
|
|
38
|
+
assess_risk: handleAssessRisk,
|
|
39
|
+
get_wallet_balance: handleGetWalletBalance,
|
|
40
|
+
simulate_transaction: handleSimulateTransaction,
|
|
41
|
+
estimate_gas: handleEstimateGas,
|
|
42
|
+
get_token_price: handleGetTokenPrice,
|
|
43
|
+
get_transaction_status: handleGetTransactionStatus,
|
|
44
|
+
query_risk_registry: handleQueryRiskRegistry,
|
|
45
|
+
publish_risk_score: handlePublishRiskScore,
|
|
46
|
+
};
|
|
47
|
+
function isStructuredResponse(value) {
|
|
48
|
+
return !!value && typeof value === "object" && "success" in value && "data" in value && "error" in value && "timestamp" in value;
|
|
49
|
+
}
|
|
50
|
+
function printJson(response) {
|
|
51
|
+
process.stdout.write(`${JSON.stringify(response, null, 2)}\n`);
|
|
52
|
+
}
|
|
53
|
+
function usage() {
|
|
54
|
+
const tools = Object.keys(SKILL_CLI_TOOLS).sort().join(", ");
|
|
55
|
+
return [
|
|
56
|
+
"Usage: npx safehands-pharos skill <tool_name> [<json> | --input-json '<json>' | -i '<json>']",
|
|
57
|
+
"",
|
|
58
|
+
`Supported Skill Engine tools: ${tools}`,
|
|
59
|
+
"",
|
|
60
|
+
"Examples:",
|
|
61
|
+
" npx safehands-pharos skill assess_risk '{\"action\":\"swap\",\"amount\":\"0.01\"}'",
|
|
62
|
+
" npx safehands-pharos skill get_wallet_balance '{\"walletAddress\":\"0xABC...\"}'",
|
|
63
|
+
" npx safehands-pharos skill safehands_preflight_check -i '{\"actionType\":\"approve_token\",\"chainId\":688689,\"amount\":\"1\"}'",
|
|
64
|
+
].join("\n");
|
|
65
|
+
}
|
|
66
|
+
function readInputJsonArg(argv) {
|
|
67
|
+
// --input-json <json>
|
|
68
|
+
const flag = argv.indexOf("--input-json");
|
|
69
|
+
if (flag >= 0)
|
|
70
|
+
return argv[flag + 1] ?? null;
|
|
71
|
+
// --input-json=<json>
|
|
72
|
+
const inline = argv.find((a) => a.startsWith("--input-json="));
|
|
73
|
+
if (inline)
|
|
74
|
+
return inline.slice("--input-json=".length);
|
|
75
|
+
// -i <json>
|
|
76
|
+
const short = argv.indexOf("-i");
|
|
77
|
+
if (short >= 0)
|
|
78
|
+
return argv[short + 1] ?? null;
|
|
79
|
+
// positional: first arg that looks like JSON or is not a flag
|
|
80
|
+
const positional = argv.find((a) => !a.startsWith("-"));
|
|
81
|
+
return positional ?? null;
|
|
82
|
+
}
|
|
83
|
+
export function getSkillCliToolNames() {
|
|
84
|
+
return Object.keys(SKILL_CLI_TOOLS).sort();
|
|
85
|
+
}
|
|
86
|
+
export async function invokeSkillCliTool(toolName, input) {
|
|
87
|
+
const handler = SKILL_CLI_TOOLS[toolName];
|
|
88
|
+
if (!handler) {
|
|
89
|
+
return fail("UNKNOWN_SKILL_TOOL", `Unknown SafeHands Skill Engine tool: ${toolName}. Supported tools: ${getSkillCliToolNames().join(", ")}`, false, "safehands_cli");
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
const result = await handler(input);
|
|
93
|
+
if (isStructuredResponse(result))
|
|
94
|
+
return result;
|
|
95
|
+
return ok(result);
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
return fail("TOOL_EXECUTION_FAILED", err instanceof Error ? err.message : String(err), false, toolName);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export async function runSkillCli(argv) {
|
|
102
|
+
const [toolName] = argv;
|
|
103
|
+
if (!toolName || toolName === "--help" || toolName === "-h") {
|
|
104
|
+
printJson(fail("CLI_USAGE_ERROR", usage(), false, "safehands_cli"));
|
|
105
|
+
return 2;
|
|
106
|
+
}
|
|
107
|
+
if (!SKILL_CLI_TOOLS[toolName]) {
|
|
108
|
+
printJson(await invokeSkillCliTool(toolName, {}));
|
|
109
|
+
return 2;
|
|
110
|
+
}
|
|
111
|
+
const rawJson = readInputJsonArg(argv.slice(1));
|
|
112
|
+
if (rawJson === null) {
|
|
113
|
+
printJson(fail("MISSING_INPUT_JSON", "Missing required --input-json '<json>' argument.", false, "safehands_cli"));
|
|
114
|
+
return 2;
|
|
115
|
+
}
|
|
116
|
+
let input;
|
|
117
|
+
try {
|
|
118
|
+
input = JSON.parse(rawJson);
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
printJson(fail("INVALID_INPUT_JSON", err instanceof Error ? err.message : String(err), false, "safehands_cli"));
|
|
122
|
+
return 2;
|
|
123
|
+
}
|
|
124
|
+
printJson(await invokeSkillCliTool(toolName, input));
|
|
125
|
+
return 0;
|
|
126
|
+
}
|
|
125
127
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,mEAAmE;AACnE,qEAAqE;AACrE,gDAAgD;AAChD,2EAA2E;AAE3E,OAAO,EAAE,IAAI,EAAE,EAAE,EAAqB,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AACnF,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/demo.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function runDemo(): Promise<void>;
|
|
1
|
+
export declare function runDemo(): Promise<void>;
|
|
2
2
|
//# sourceMappingURL=demo.d.ts.map
|