safehands-pharos 1.3.0 → 1.4.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.
Files changed (159) hide show
  1. package/.env.example +64 -26
  2. package/README.md +333 -445
  3. package/dist/cli.d.ts +5 -5
  4. package/dist/cli.d.ts.map +1 -1
  5. package/dist/cli.js +124 -98
  6. package/dist/cli.js.map +1 -1
  7. package/dist/demo.d.ts +1 -1
  8. package/dist/demo.js +171 -171
  9. package/dist/index.d.ts +2 -2
  10. package/dist/index.js +138 -85
  11. package/dist/index.js.map +1 -1
  12. package/dist/init.d.ts +1 -1
  13. package/dist/init.js +65 -65
  14. package/dist/lib/auditLog.d.ts +9 -0
  15. package/dist/lib/auditLog.d.ts.map +1 -0
  16. package/dist/lib/auditLog.js +30 -0
  17. package/dist/lib/auditLog.js.map +1 -0
  18. package/dist/lib/constants.d.ts +291 -291
  19. package/dist/lib/constants.js +292 -292
  20. package/dist/lib/dodoApi.d.ts +78 -70
  21. package/dist/lib/dodoApi.d.ts.map +1 -1
  22. package/dist/lib/dodoApi.js +196 -178
  23. package/dist/lib/dodoApi.js.map +1 -1
  24. package/dist/lib/http.d.ts +14 -14
  25. package/dist/lib/http.js +118 -118
  26. package/dist/lib/pharosClient.d.ts +58 -58
  27. package/dist/lib/pharosClient.d.ts.map +1 -1
  28. package/dist/lib/pharosClient.js +63 -53
  29. package/dist/lib/pharosClient.js.map +1 -1
  30. package/dist/lib/policy/actionPolicyEngine.d.ts +53 -53
  31. package/dist/lib/policy/actionPolicyEngine.js +212 -212
  32. package/dist/lib/riskEngine.d.ts +26 -26
  33. package/dist/lib/riskEngine.js +283 -283
  34. package/dist/lib/signer/index.d.ts +24 -24
  35. package/dist/lib/signer/index.d.ts.map +1 -1
  36. package/dist/lib/signer/index.js +88 -89
  37. package/dist/lib/signer/index.js.map +1 -1
  38. package/dist/lib/spendAccumulator.d.ts +10 -0
  39. package/dist/lib/spendAccumulator.d.ts.map +1 -0
  40. package/dist/lib/spendAccumulator.js +54 -0
  41. package/dist/lib/spendAccumulator.js.map +1 -0
  42. package/dist/lib/testDodoLive.d.ts +1 -1
  43. package/dist/lib/testDodoLive.js +104 -104
  44. package/dist/lib/testLiveSafehands.d.ts +1 -1
  45. package/dist/lib/testLiveSafehands.js +92 -92
  46. package/dist/lib/testRpc.d.ts +1 -1
  47. package/dist/lib/testRpc.js +29 -29
  48. package/dist/lib/testRpcLive.d.ts +1 -1
  49. package/dist/lib/testRpcLive.js +88 -88
  50. package/dist/lib/testTools.d.ts +1 -1
  51. package/dist/lib/testTools.js +397 -397
  52. package/dist/lib/testX402Live.d.ts +1 -1
  53. package/dist/lib/testX402Live.js +159 -159
  54. package/dist/lib/toolResponse.d.ts +25 -25
  55. package/dist/lib/toolResponse.js +53 -53
  56. package/dist/lib/wallet/index.d.ts +37 -18
  57. package/dist/lib/wallet/index.d.ts.map +1 -1
  58. package/dist/lib/wallet/index.js +128 -70
  59. package/dist/lib/wallet/index.js.map +1 -1
  60. package/dist/scripts/checkDeploy.d.ts +1 -1
  61. package/dist/scripts/checkDeploy.js +24 -24
  62. package/dist/scripts/deployRegistry.d.ts +1 -1
  63. package/dist/scripts/deployRegistry.js +100 -100
  64. package/dist/scripts/testRegistry.d.ts +1 -1
  65. package/dist/scripts/testRegistry.js +43 -43
  66. package/dist/tools/approveToken.d.ts +45 -46
  67. package/dist/tools/approveToken.d.ts.map +1 -1
  68. package/dist/tools/approveToken.js +85 -83
  69. package/dist/tools/approveToken.js.map +1 -1
  70. package/dist/tools/assessRisk.d.ts +79 -79
  71. package/dist/tools/assessRisk.d.ts.map +1 -1
  72. package/dist/tools/assessRisk.js +104 -93
  73. package/dist/tools/assessRisk.js.map +1 -1
  74. package/dist/tools/checkAllowance.d.ts +43 -36
  75. package/dist/tools/checkAllowance.d.ts.map +1 -1
  76. package/dist/tools/checkAllowance.js +56 -42
  77. package/dist/tools/checkAllowance.js.map +1 -1
  78. package/dist/tools/checkTokenSecurity.d.ts +46 -46
  79. package/dist/tools/checkTokenSecurity.d.ts.map +1 -1
  80. package/dist/tools/checkTokenSecurity.js +95 -88
  81. package/dist/tools/checkTokenSecurity.js.map +1 -1
  82. package/dist/tools/createAgentWallet.d.ts +26 -26
  83. package/dist/tools/createAgentWallet.d.ts.map +1 -1
  84. package/dist/tools/createAgentWallet.js +58 -59
  85. package/dist/tools/createAgentWallet.js.map +1 -1
  86. package/dist/tools/estimateGas.d.ts +79 -79
  87. package/dist/tools/estimateGas.js +124 -124
  88. package/dist/tools/executeSwap.d.ts +61 -59
  89. package/dist/tools/executeSwap.d.ts.map +1 -1
  90. package/dist/tools/executeSwap.js +141 -129
  91. package/dist/tools/executeSwap.js.map +1 -1
  92. package/dist/tools/explainRisk.d.ts +29 -29
  93. package/dist/tools/explainRisk.js +32 -32
  94. package/dist/tools/getAgentWallet.d.ts +21 -21
  95. package/dist/tools/getAgentWallet.js +27 -27
  96. package/dist/tools/getAgentWalletBalance.d.ts +11 -11
  97. package/dist/tools/getAgentWalletBalance.js +70 -70
  98. package/dist/tools/getExecutionHistory.d.ts +49 -51
  99. package/dist/tools/getExecutionHistory.d.ts.map +1 -1
  100. package/dist/tools/getExecutionHistory.js +154 -93
  101. package/dist/tools/getExecutionHistory.js.map +1 -1
  102. package/dist/tools/getGasPrice.d.ts +43 -43
  103. package/dist/tools/getGasPrice.js +59 -59
  104. package/dist/tools/getPoolInfo.d.ts +75 -75
  105. package/dist/tools/getPoolInfo.js +137 -137
  106. package/dist/tools/getTokenPrice.d.ts +113 -113
  107. package/dist/tools/getTokenPrice.js +117 -117
  108. package/dist/tools/getTransactionStatus.d.ts +43 -57
  109. package/dist/tools/getTransactionStatus.d.ts.map +1 -1
  110. package/dist/tools/getTransactionStatus.js +59 -67
  111. package/dist/tools/getTransactionStatus.js.map +1 -1
  112. package/dist/tools/getWalletBalance.d.ts +68 -68
  113. package/dist/tools/getWalletBalance.js +87 -87
  114. package/dist/tools/publishRiskScore.d.ts +63 -63
  115. package/dist/tools/publishRiskScore.d.ts.map +1 -1
  116. package/dist/tools/publishRiskScore.js +88 -85
  117. package/dist/tools/publishRiskScore.js.map +1 -1
  118. package/dist/tools/queryRiskRegistry.d.ts +38 -48
  119. package/dist/tools/queryRiskRegistry.d.ts.map +1 -1
  120. package/dist/tools/queryRiskRegistry.js +55 -60
  121. package/dist/tools/queryRiskRegistry.js.map +1 -1
  122. package/dist/tools/safehandsPreflightCheck.d.ts +77 -77
  123. package/dist/tools/safehandsPreflightCheck.js +47 -47
  124. package/dist/tools/safehandsRiskReport.d.ts +81 -81
  125. package/dist/tools/safehandsRiskReport.js +28 -28
  126. package/dist/tools/safehandsSafeExecute.d.ts +20 -20
  127. package/dist/tools/safehandsSafeExecute.d.ts.map +1 -1
  128. package/dist/tools/safehandsSafeExecute.js +81 -75
  129. package/dist/tools/safehandsSafeExecute.js.map +1 -1
  130. package/dist/tools/safehandsWalletHealth.d.ts +14 -14
  131. package/dist/tools/safehandsWalletHealth.js +103 -103
  132. package/dist/tools/safehandsX402Preflight.d.ts +26 -26
  133. package/dist/tools/safehandsX402Preflight.js +65 -65
  134. package/dist/tools/sendPayment.d.ts +57 -58
  135. package/dist/tools/sendPayment.d.ts.map +1 -1
  136. package/dist/tools/sendPayment.js +117 -108
  137. package/dist/tools/sendPayment.js.map +1 -1
  138. package/dist/tools/simulateTransaction.d.ts +60 -81
  139. package/dist/tools/simulateTransaction.d.ts.map +1 -1
  140. package/dist/tools/simulateTransaction.js +83 -88
  141. package/dist/tools/simulateTransaction.js.map +1 -1
  142. package/dist/tools/tokenRegistryStatus.d.ts +26 -26
  143. package/dist/tools/tokenRegistryStatus.js +96 -96
  144. package/dist/tools/x402PayAndFetch.d.ts +81 -81
  145. package/dist/tools/x402PayAndFetch.d.ts.map +1 -1
  146. package/dist/tools/x402PayAndFetch.js +152 -149
  147. package/dist/tools/x402PayAndFetch.js.map +1 -1
  148. package/dist/x402Server.d.ts +1 -1
  149. package/dist/x402Server.js +252 -252
  150. package/examples/dashboard/index.html +337 -0
  151. package/package.json +83 -84
  152. package/.agents/skill/safehands/SKILL.md +0 -212
  153. package/.agents/skill/safehands/assets/networks.json +0 -24
  154. package/.agents/skill/safehands/assets/tokens.json +0 -66
  155. package/.agents/wallets.json +0 -20
  156. package/docs/reports/OFFICIAL_DOCS_ALIGNMENT_REPORT.md +0 -137
  157. package/docs/reports/final_audit_report.md +0 -307
  158. package/docs/reports/live_verification_report.md +0 -147
  159. package/docs/reports/pharos_skill_engine_alignment_report.md +0 -85
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";
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";
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;AAapE,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,CAAC;AA6C3B,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"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAMA,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAoBpE,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,CAAC;AA8D1B,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,99 +1,125 @@
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
- const SKILL_CLI_TOOLS = {
19
- safehands_preflight_check: handleSafeHandsPreflightCheck,
20
- safehands_x402_preflight: handleSafeHandsX402Preflight,
21
- safehands_wallet_health: handleSafeHandsWalletHealth,
22
- token_registry_status: handleTokenRegistryStatus,
23
- explain_risk: handleExplainRisk,
24
- safehands_risk_report: handleSafeHandsRiskReport,
25
- safehands_safe_execute: handleSafeHandsSafeExecute,
26
- create_agent_wallet: handleCreateAgentWallet,
27
- get_agent_wallet: handleGetAgentWallet,
28
- get_agent_wallet_balance: handleGetAgentWalletBalance,
29
- check_token_security: handleCheckTokenSecurity,
30
- };
31
- function isStructuredResponse(value) {
32
- return !!value && typeof value === "object" && "success" in value && "data" in value && "error" in value && "timestamp" in value;
33
- }
34
- function printJson(response) {
35
- process.stdout.write(`${JSON.stringify(response, null, 2)}\n`);
36
- }
37
- function usage() {
38
- const tools = Object.keys(SKILL_CLI_TOOLS).sort().join(", ");
39
- return [
40
- "Usage: npx safehands-pharos skill <tool_name> --input-json '<json>'",
41
- "",
42
- `Supported Skill Engine tools: ${tools}`,
43
- "",
44
- "Example:",
45
- " npx safehands-pharos skill safehands_preflight_check --input-json '{\"actionType\":\"approve_token\",\"chainId\":688689,\"amount\":\"1\"}'",
46
- ].join("\n");
47
- }
48
- function readInputJsonArg(argv) {
49
- const positional = argv.indexOf("--input-json");
50
- if (positional >= 0)
51
- return argv[positional + 1] ?? null;
52
- const prefixed = argv.find((arg) => arg.startsWith("--input-json="));
53
- return prefixed ? prefixed.slice("--input-json=".length) : null;
54
- }
55
- export function getSkillCliToolNames() {
56
- return Object.keys(SKILL_CLI_TOOLS).sort();
57
- }
58
- export async function invokeSkillCliTool(toolName, input) {
59
- const handler = SKILL_CLI_TOOLS[toolName];
60
- if (!handler) {
61
- return fail("UNKNOWN_SKILL_TOOL", `Unknown SafeHands Skill Engine tool: ${toolName}. Supported tools: ${getSkillCliToolNames().join(", ")}`, false, "safehands_cli");
62
- }
63
- try {
64
- const result = await handler(input);
65
- if (isStructuredResponse(result))
66
- return result;
67
- return ok(result);
68
- }
69
- catch (err) {
70
- return fail("TOOL_EXECUTION_FAILED", err instanceof Error ? err.message : String(err), false, toolName);
71
- }
72
- }
73
- export async function runSkillCli(argv) {
74
- const [toolName] = argv;
75
- if (!toolName || toolName === "--help" || toolName === "-h") {
76
- printJson(fail("CLI_USAGE_ERROR", usage(), false, "safehands_cli"));
77
- return 2;
78
- }
79
- if (!SKILL_CLI_TOOLS[toolName]) {
80
- printJson(await invokeSkillCliTool(toolName, {}));
81
- return 2;
82
- }
83
- const rawJson = readInputJsonArg(argv.slice(1));
84
- if (rawJson === null) {
85
- printJson(fail("MISSING_INPUT_JSON", "Missing required --input-json '<json>' argument.", false, "safehands_cli"));
86
- return 2;
87
- }
88
- let input;
89
- try {
90
- input = JSON.parse(rawJson);
91
- }
92
- catch (err) {
93
- printJson(fail("INVALID_INPUT_JSON", err instanceof Error ? err.message : String(err), false, "safehands_cli"));
94
- return 2;
95
- }
96
- printJson(await invokeSkillCliTool(toolName, input));
97
- return 0;
98
- }
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
+ const SKILL_CLI_TOOLS = {
26
+ safehands_preflight_check: handleSafeHandsPreflightCheck,
27
+ safehands_x402_preflight: handleSafeHandsX402Preflight,
28
+ safehands_wallet_health: handleSafeHandsWalletHealth,
29
+ token_registry_status: handleTokenRegistryStatus,
30
+ explain_risk: handleExplainRisk,
31
+ safehands_risk_report: handleSafeHandsRiskReport,
32
+ safehands_safe_execute: handleSafeHandsSafeExecute,
33
+ create_agent_wallet: handleCreateAgentWallet,
34
+ get_agent_wallet: handleGetAgentWallet,
35
+ get_agent_wallet_balance: handleGetAgentWalletBalance,
36
+ check_token_security: handleCheckTokenSecurity,
37
+ assess_risk: handleAssessRisk,
38
+ get_wallet_balance: handleGetWalletBalance,
39
+ simulate_transaction: handleSimulateTransaction,
40
+ estimate_gas: handleEstimateGas,
41
+ get_token_price: handleGetTokenPrice,
42
+ get_transaction_status: handleGetTransactionStatus,
43
+ query_risk_registry: handleQueryRiskRegistry,
44
+ };
45
+ function isStructuredResponse(value) {
46
+ return !!value && typeof value === "object" && "success" in value && "data" in value && "error" in value && "timestamp" in value;
47
+ }
48
+ function printJson(response) {
49
+ process.stdout.write(`${JSON.stringify(response, null, 2)}\n`);
50
+ }
51
+ function usage() {
52
+ const tools = Object.keys(SKILL_CLI_TOOLS).sort().join(", ");
53
+ return [
54
+ "Usage: npx safehands-pharos skill <tool_name> [<json> | --input-json '<json>' | -i '<json>']",
55
+ "",
56
+ `Supported Skill Engine tools: ${tools}`,
57
+ "",
58
+ "Examples:",
59
+ " npx safehands-pharos skill assess_risk '{\"action\":\"swap\",\"amount\":\"0.01\"}'",
60
+ " npx safehands-pharos skill get_wallet_balance '{\"walletAddress\":\"0xABC...\"}'",
61
+ " npx safehands-pharos skill safehands_preflight_check -i '{\"actionType\":\"approve_token\",\"chainId\":688689,\"amount\":\"1\"}'",
62
+ ].join("\n");
63
+ }
64
+ function readInputJsonArg(argv) {
65
+ // --input-json <json>
66
+ const flag = argv.indexOf("--input-json");
67
+ if (flag >= 0)
68
+ return argv[flag + 1] ?? null;
69
+ // --input-json=<json>
70
+ const inline = argv.find((a) => a.startsWith("--input-json="));
71
+ if (inline)
72
+ return inline.slice("--input-json=".length);
73
+ // -i <json>
74
+ const short = argv.indexOf("-i");
75
+ if (short >= 0)
76
+ return argv[short + 1] ?? null;
77
+ // positional: first arg that looks like JSON or is not a flag
78
+ const positional = argv.find((a) => !a.startsWith("-"));
79
+ return positional ?? null;
80
+ }
81
+ export function getSkillCliToolNames() {
82
+ return Object.keys(SKILL_CLI_TOOLS).sort();
83
+ }
84
+ export async function invokeSkillCliTool(toolName, input) {
85
+ const handler = SKILL_CLI_TOOLS[toolName];
86
+ if (!handler) {
87
+ return fail("UNKNOWN_SKILL_TOOL", `Unknown SafeHands Skill Engine tool: ${toolName}. Supported tools: ${getSkillCliToolNames().join(", ")}`, false, "safehands_cli");
88
+ }
89
+ try {
90
+ const result = await handler(input);
91
+ if (isStructuredResponse(result))
92
+ return result;
93
+ return ok(result);
94
+ }
95
+ catch (err) {
96
+ return fail("TOOL_EXECUTION_FAILED", err instanceof Error ? err.message : String(err), false, toolName);
97
+ }
98
+ }
99
+ export async function runSkillCli(argv) {
100
+ const [toolName] = argv;
101
+ if (!toolName || toolName === "--help" || toolName === "-h") {
102
+ printJson(fail("CLI_USAGE_ERROR", usage(), false, "safehands_cli"));
103
+ return 2;
104
+ }
105
+ if (!SKILL_CLI_TOOLS[toolName]) {
106
+ printJson(await invokeSkillCliTool(toolName, {}));
107
+ return 2;
108
+ }
109
+ const rawJson = readInputJsonArg(argv.slice(1));
110
+ if (rawJson === null) {
111
+ printJson(fail("MISSING_INPUT_JSON", "Missing required --input-json '<json>' argument.", false, "safehands_cli"));
112
+ return 2;
113
+ }
114
+ let input;
115
+ try {
116
+ input = JSON.parse(rawJson);
117
+ }
118
+ catch (err) {
119
+ printJson(fail("INVALID_INPUT_JSON", err instanceof Error ? err.message : String(err), false, "safehands_cli"));
120
+ return 2;
121
+ }
122
+ printJson(await invokeSkillCliTool(toolName, input));
123
+ return 0;
124
+ }
99
125
  //# 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;AAiBzE,MAAM,eAAe,GAA8C;IACjE,yBAAyB,EAAE,6BAA6B;IACxD,wBAAwB,EAAE,4BAA4B;IACtD,uBAAuB,EAAE,2BAA2B;IACpD,qBAAqB,EAAE,yBAAyB;IAChD,YAAY,EAAE,iBAAiB;IAC/B,qBAAqB,EAAE,yBAAyB;IAChD,sBAAsB,EAAE,0BAA0B;IAClD,mBAAmB,EAAE,uBAAuB;IAC5C,gBAAgB,EAAE,oBAAoB;IACtC,wBAAwB,EAAE,2BAA2B;IACrD,oBAAoB,EAAE,wBAAwB;CAC/C,CAAC;AAEF,SAAS,oBAAoB,CAAC,KAAc;IAC1C,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,SAAS,IAAI,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,OAAO,IAAI,KAAK,IAAI,WAAW,IAAI,KAAK,CAAC;AACnI,CAAC;AAED,SAAS,SAAS,CAAC,QAA+B;IAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,KAAK;IACZ,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,OAAO;QACL,qEAAqE;QACrE,EAAE;QACF,iCAAiC,KAAK,EAAE;QACxC,EAAE;QACF,UAAU;QACV,8IAA8I;KAC/I,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAc;IACtC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAChD,IAAI,UAAU,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;IACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC;IACrE,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,EAAE,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,QAAgB,EAAE,KAAc;IACvE,MAAM,OAAO,GAAG,eAAe,CAAC,QAA4B,CAAC,CAAC;IAC9D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CACT,oBAAoB,EACpB,wCAAwC,QAAQ,sBAAsB,oBAAoB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACzG,KAAK,EACL,eAAe,CAChB,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,oBAAoB,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC;QAChD,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;IACpB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,IAAI,CACT,uBAAuB,EACvB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAChD,KAAK,EACL,QAAQ,CACT,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAc;IAC9C,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC5D,SAAS,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,CAAC,eAAe,CAAC,QAA4B,CAAC,EAAE,CAAC;QACnD,SAAS,CAAC,MAAM,kBAAkB,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,SAAS,CAAC,IAAI,CAAC,oBAAoB,EAAE,kDAAkD,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC;QAClH,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,KAAc,CAAC;IACnB,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,SAAS,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC;QAChH,OAAO,CAAC,CAAC;IACX,CAAC;IAED,SAAS,CAAC,MAAM,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,CAAC;AACX,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
package/dist/demo.js CHANGED
@@ -1,172 +1,172 @@
1
- // ─── SafeHands Deterministic Hackathon Demo ────────────────────────────
2
- // Non-destructive demo for judges and reviewers. It uses offline/sample-safe
3
- // paths and a local HTTP server only when explicitly allowed in-process.
4
- // No real transaction is broadcast.
5
- // ────────────────────────────────────────────────────────────────────────
6
- import express from "express";
7
- import { handleSafeHandsWalletHealth } from "./tools/safehandsWalletHealth.js";
8
- import { handleSafeHandsPreflightCheck } from "./tools/safehandsPreflightCheck.js";
9
- import { handleTokenRegistryStatus } from "./tools/tokenRegistryStatus.js";
10
- import { handleSafeHandsX402Preflight } from "./tools/safehandsX402Preflight.js";
11
- import { handleX402PayAndFetch } from "./tools/x402PayAndFetch.js";
12
- import { handleSendPayment } from "./tools/sendPayment.js";
13
- import { handleExplainRisk } from "./tools/explainRisk.js";
14
- import { CHAIN_ID, PHAROS_ENVIRONMENT, USDC_ADDRESS } from "./lib/constants.js";
15
- const RECIPIENT = "0x0000000000000000000000000000000000000001";
16
- function section(title) {
17
- console.log(`\n${"═".repeat(78)}`);
18
- console.log(` ${title}`);
19
- console.log("═".repeat(78));
20
- }
21
- function print(label, value) {
22
- console.log(`\n${label}`);
23
- console.log(JSON.stringify(value, null, 2));
24
- }
25
- function setEnv(key, value) {
26
- const previous = process.env[key];
27
- if (value === undefined)
28
- delete process.env[key];
29
- else
30
- process.env[key] = value;
31
- return () => {
32
- if (previous === undefined)
33
- delete process.env[key];
34
- else
35
- process.env[key] = previous;
36
- };
37
- }
38
- async function withLocalX402DemoServer(handler) {
39
- const app = express();
40
- app.get("/supported", (_req, res) => {
41
- res.json({
42
- ok: true,
43
- demo: true,
44
- paymentRequired: false,
45
- endpoints: ["/supported", "/paid"],
46
- network: `eip155:${CHAIN_ID}`,
47
- });
48
- });
49
- app.get("/paid", (_req, res) => {
50
- res.status(402).json({
51
- error: "Payment Required",
52
- demo: true,
53
- price: "0.001",
54
- asset: USDC_ADDRESS,
55
- network: `eip155:${CHAIN_ID}`,
56
- });
57
- });
58
- const server = await new Promise((resolve) => {
59
- const instance = app.listen(0, "127.0.0.1", () => resolve(instance));
60
- });
61
- try {
62
- const address = server.address();
63
- if (!address || typeof address === "string")
64
- throw new Error("Failed to open local demo server");
65
- return await handler(`http://127.0.0.1:${address.port}`);
66
- }
67
- finally {
68
- if ("closeAllConnections" in server)
69
- server.closeAllConnections();
70
- await new Promise((resolve, reject) => server.close((err) => (err ? reject(err) : resolve())));
71
- }
72
- }
73
- export async function runDemo() {
74
- const restoreWalletMode = setEnv("WALLET_MODE", process.env.WALLET_MODE || "none");
75
- const restoreWrite = setEnv("WRITE_TOOLS_ENABLED", "false");
76
- const restorePrivateKey = setEnv("PRIVATE_KEY", undefined);
77
- const restoreX402Signer = setEnv("X402_SIGNER_PRIVATE_KEY", undefined);
78
- try {
79
- console.log("\nšŸ›”ļø SafeHands-Pharos Deterministic Demo");
80
- console.log(` Environment: ${PHAROS_ENVIRONMENT}`);
81
- console.log(` Chain ID: ${CHAIN_ID}`);
82
- console.log(" Mode: non-destructive demo, no real transactions broadcast");
83
- section("1. Wallet Health");
84
- print("safehands_wallet_health", await handleSafeHandsWalletHealth({}));
85
- section("2. Safe Payment Preflight: ALLOW");
86
- print("safehands_preflight_check", await handleSafeHandsPreflightCheck({
87
- actionType: "send_payment",
88
- chainId: CHAIN_ID,
89
- isMainnet: false,
90
- amount: "0.001",
91
- amountUnit: "PHRS",
92
- recipient: RECIPIENT,
93
- }));
94
- section("3. Unlimited Approval Preflight: BLOCK");
95
- const blockedApproval = await handleSafeHandsPreflightCheck({
96
- actionType: "approve_token",
97
- chainId: CHAIN_ID,
98
- isMainnet: false,
99
- approvalAmount: "max",
100
- spender: RECIPIENT,
101
- });
102
- print("safehands_preflight_check", blockedApproval);
103
- section("4. Token Registry Status");
104
- print("token_registry_status", await handleTokenRegistryStatus({ tokenAddress: USDC_ADDRESS }));
105
- section("5. x402 Preflight Without Private Key");
106
- await withLocalX402DemoServer(async (baseUrl) => {
107
- const restoreLocal = setEnv("ALLOW_LOCAL_X402_FETCH", "true");
108
- try {
109
- print("safehands_x402_preflight", await handleSafeHandsX402Preflight({
110
- url: `${baseUrl}/paid`,
111
- paymentAmountUsdc: "0.001",
112
- probeEndpoint: false,
113
- }));
114
- }
115
- finally {
116
- restoreLocal();
117
- }
118
- });
119
- section("6. x402 /supported Free Endpoint Without Private Key");
120
- await withLocalX402DemoServer(async (baseUrl) => {
121
- const restoreLocal = setEnv("ALLOW_LOCAL_X402_FETCH", "true");
122
- try {
123
- print("x402_pay_and_fetch free endpoint", await handleX402PayAndFetch({ url: `${baseUrl}/supported` }));
124
- }
125
- finally {
126
- restoreLocal();
127
- }
128
- });
129
- section("7. x402 Paid Endpoint Without Signer");
130
- await withLocalX402DemoServer(async (baseUrl) => {
131
- const restoreLocal = setEnv("ALLOW_LOCAL_X402_FETCH", "true");
132
- try {
133
- print("x402_pay_and_fetch paid endpoint", await handleX402PayAndFetch({ url: `${baseUrl}/paid`, maxPaymentUsdc: "0.001" }));
134
- }
135
- finally {
136
- restoreLocal();
137
- }
138
- });
139
- section("8. SSRF_BLOCKED");
140
- const restoreLocalBlocked = setEnv("ALLOW_LOCAL_X402_FETCH", undefined);
141
- try {
142
- print("safehands_x402_preflight localhost blocked", await handleSafeHandsX402Preflight({ url: "http://127.0.0.1:4021/supported" }));
143
- }
144
- finally {
145
- restoreLocalBlocked();
146
- }
147
- section("9. WRITE_TOOLS_DISABLED");
148
- print("send_payment guarded", await handleSendPayment({ toAddress: RECIPIENT, amount: "0.001" }));
149
- section("10. Human-Readable Risk Explanation");
150
- print("explain_risk", await handleExplainRisk({
151
- decision: "BLOCK",
152
- riskLevel: "HIGH",
153
- reasons: ["Unlimited approval requested"],
154
- requiredActions: ["Use a limited approval amount before approving a spender"],
155
- }));
156
- section("Demo Complete");
157
- console.log("SafeHands demonstrated wallet health, ALLOW/BLOCK policy, token registry, x402 safety, SSRF blocking, write-tool guardrails, and explainable risk output.");
158
- }
159
- finally {
160
- restoreWalletMode();
161
- restoreWrite();
162
- restorePrivateKey();
163
- restoreX402Signer();
164
- }
165
- }
166
- if (import.meta.url === `file://${process.argv[1]}`) {
167
- runDemo().catch((err) => {
168
- console.error("Demo error:", err instanceof Error ? err.message : String(err));
169
- process.exit(1);
170
- });
171
- }
1
+ // ─── SafeHands Deterministic Hackathon Demo ────────────────────────────
2
+ // Non-destructive demo for judges and reviewers. It uses offline/sample-safe
3
+ // paths and a local HTTP server only when explicitly allowed in-process.
4
+ // No real transaction is broadcast.
5
+ // ────────────────────────────────────────────────────────────────────────
6
+ import express from "express";
7
+ import { handleSafeHandsWalletHealth } from "./tools/safehandsWalletHealth.js";
8
+ import { handleSafeHandsPreflightCheck } from "./tools/safehandsPreflightCheck.js";
9
+ import { handleTokenRegistryStatus } from "./tools/tokenRegistryStatus.js";
10
+ import { handleSafeHandsX402Preflight } from "./tools/safehandsX402Preflight.js";
11
+ import { handleX402PayAndFetch } from "./tools/x402PayAndFetch.js";
12
+ import { handleSendPayment } from "./tools/sendPayment.js";
13
+ import { handleExplainRisk } from "./tools/explainRisk.js";
14
+ import { CHAIN_ID, PHAROS_ENVIRONMENT, USDC_ADDRESS } from "./lib/constants.js";
15
+ const RECIPIENT = "0x0000000000000000000000000000000000000001";
16
+ function section(title) {
17
+ console.log(`\n${"═".repeat(78)}`);
18
+ console.log(` ${title}`);
19
+ console.log("═".repeat(78));
20
+ }
21
+ function print(label, value) {
22
+ console.log(`\n${label}`);
23
+ console.log(JSON.stringify(value, null, 2));
24
+ }
25
+ function setEnv(key, value) {
26
+ const previous = process.env[key];
27
+ if (value === undefined)
28
+ delete process.env[key];
29
+ else
30
+ process.env[key] = value;
31
+ return () => {
32
+ if (previous === undefined)
33
+ delete process.env[key];
34
+ else
35
+ process.env[key] = previous;
36
+ };
37
+ }
38
+ async function withLocalX402DemoServer(handler) {
39
+ const app = express();
40
+ app.get("/supported", (_req, res) => {
41
+ res.json({
42
+ ok: true,
43
+ demo: true,
44
+ paymentRequired: false,
45
+ endpoints: ["/supported", "/paid"],
46
+ network: `eip155:${CHAIN_ID}`,
47
+ });
48
+ });
49
+ app.get("/paid", (_req, res) => {
50
+ res.status(402).json({
51
+ error: "Payment Required",
52
+ demo: true,
53
+ price: "0.001",
54
+ asset: USDC_ADDRESS,
55
+ network: `eip155:${CHAIN_ID}`,
56
+ });
57
+ });
58
+ const server = await new Promise((resolve) => {
59
+ const instance = app.listen(0, "127.0.0.1", () => resolve(instance));
60
+ });
61
+ try {
62
+ const address = server.address();
63
+ if (!address || typeof address === "string")
64
+ throw new Error("Failed to open local demo server");
65
+ return await handler(`http://127.0.0.1:${address.port}`);
66
+ }
67
+ finally {
68
+ if ("closeAllConnections" in server)
69
+ server.closeAllConnections();
70
+ await new Promise((resolve, reject) => server.close((err) => (err ? reject(err) : resolve())));
71
+ }
72
+ }
73
+ export async function runDemo() {
74
+ const restoreWalletMode = setEnv("WALLET_MODE", process.env.WALLET_MODE || "none");
75
+ const restoreWrite = setEnv("WRITE_TOOLS_ENABLED", "false");
76
+ const restorePrivateKey = setEnv("PRIVATE_KEY", undefined);
77
+ const restoreX402Signer = setEnv("X402_SIGNER_PRIVATE_KEY", undefined);
78
+ try {
79
+ console.log("\nšŸ›”ļø SafeHands-Pharos Deterministic Demo");
80
+ console.log(` Environment: ${PHAROS_ENVIRONMENT}`);
81
+ console.log(` Chain ID: ${CHAIN_ID}`);
82
+ console.log(" Mode: non-destructive demo, no real transactions broadcast");
83
+ section("1. Wallet Health");
84
+ print("safehands_wallet_health", await handleSafeHandsWalletHealth({}));
85
+ section("2. Safe Payment Preflight: ALLOW");
86
+ print("safehands_preflight_check", await handleSafeHandsPreflightCheck({
87
+ actionType: "send_payment",
88
+ chainId: CHAIN_ID,
89
+ isMainnet: false,
90
+ amount: "0.001",
91
+ amountUnit: "PHRS",
92
+ recipient: RECIPIENT,
93
+ }));
94
+ section("3. Unlimited Approval Preflight: BLOCK");
95
+ const blockedApproval = await handleSafeHandsPreflightCheck({
96
+ actionType: "approve_token",
97
+ chainId: CHAIN_ID,
98
+ isMainnet: false,
99
+ approvalAmount: "max",
100
+ spender: RECIPIENT,
101
+ });
102
+ print("safehands_preflight_check", blockedApproval);
103
+ section("4. Token Registry Status");
104
+ print("token_registry_status", await handleTokenRegistryStatus({ tokenAddress: USDC_ADDRESS }));
105
+ section("5. x402 Preflight Without Private Key");
106
+ await withLocalX402DemoServer(async (baseUrl) => {
107
+ const restoreLocal = setEnv("ALLOW_LOCAL_X402_FETCH", "true");
108
+ try {
109
+ print("safehands_x402_preflight", await handleSafeHandsX402Preflight({
110
+ url: `${baseUrl}/paid`,
111
+ paymentAmountUsdc: "0.001",
112
+ probeEndpoint: false,
113
+ }));
114
+ }
115
+ finally {
116
+ restoreLocal();
117
+ }
118
+ });
119
+ section("6. x402 /supported Free Endpoint Without Private Key");
120
+ await withLocalX402DemoServer(async (baseUrl) => {
121
+ const restoreLocal = setEnv("ALLOW_LOCAL_X402_FETCH", "true");
122
+ try {
123
+ print("x402_pay_and_fetch free endpoint", await handleX402PayAndFetch({ url: `${baseUrl}/supported` }));
124
+ }
125
+ finally {
126
+ restoreLocal();
127
+ }
128
+ });
129
+ section("7. x402 Paid Endpoint Without Signer");
130
+ await withLocalX402DemoServer(async (baseUrl) => {
131
+ const restoreLocal = setEnv("ALLOW_LOCAL_X402_FETCH", "true");
132
+ try {
133
+ print("x402_pay_and_fetch paid endpoint", await handleX402PayAndFetch({ url: `${baseUrl}/paid`, maxPaymentUsdc: "0.001" }));
134
+ }
135
+ finally {
136
+ restoreLocal();
137
+ }
138
+ });
139
+ section("8. SSRF_BLOCKED");
140
+ const restoreLocalBlocked = setEnv("ALLOW_LOCAL_X402_FETCH", undefined);
141
+ try {
142
+ print("safehands_x402_preflight localhost blocked", await handleSafeHandsX402Preflight({ url: "http://127.0.0.1:4021/supported" }));
143
+ }
144
+ finally {
145
+ restoreLocalBlocked();
146
+ }
147
+ section("9. WRITE_TOOLS_DISABLED");
148
+ print("send_payment guarded", await handleSendPayment({ toAddress: RECIPIENT, amount: "0.001" }));
149
+ section("10. Human-Readable Risk Explanation");
150
+ print("explain_risk", await handleExplainRisk({
151
+ decision: "BLOCK",
152
+ riskLevel: "HIGH",
153
+ reasons: ["Unlimited approval requested"],
154
+ requiredActions: ["Use a limited approval amount before approving a spender"],
155
+ }));
156
+ section("Demo Complete");
157
+ console.log("SafeHands demonstrated wallet health, ALLOW/BLOCK policy, token registry, x402 safety, SSRF blocking, write-tool guardrails, and explainable risk output.");
158
+ }
159
+ finally {
160
+ restoreWalletMode();
161
+ restoreWrite();
162
+ restorePrivateKey();
163
+ restoreX402Signer();
164
+ }
165
+ }
166
+ if (import.meta.url === `file://${process.argv[1]}`) {
167
+ runDemo().catch((err) => {
168
+ console.error("Demo error:", err instanceof Error ? err.message : String(err));
169
+ process.exit(1);
170
+ });
171
+ }
172
172
  //# sourceMappingURL=demo.js.map
package/dist/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- #!/usr/bin/env node
2
- export {};
1
+ #!/usr/bin/env node
2
+ export {};
3
3
  //# sourceMappingURL=index.d.ts.map