safehands-pharos 1.5.0 → 2.8.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 (566) hide show
  1. package/.agents/policies/default.json +15 -0
  2. package/.env.example +81 -64
  3. package/README.md +301 -444
  4. package/SECURITY.md +112 -0
  5. package/SKILL.md +59 -0
  6. package/contracts/SafeHandsAttestation.sol +182 -0
  7. package/contracts/SafeHandsRegistry.sol +149 -0
  8. package/dist/agent/SafeHandsGuardianAgent.d.ts +39 -0
  9. package/dist/agent/SafeHandsGuardianAgent.d.ts.map +1 -0
  10. package/dist/agent/SafeHandsGuardianAgent.js +98 -0
  11. package/dist/agent/SafeHandsGuardianAgent.js.map +1 -0
  12. package/dist/agent/agentDecisionFormatter.d.ts +43 -0
  13. package/dist/agent/agentDecisionFormatter.d.ts.map +1 -0
  14. package/dist/agent/agentDecisionFormatter.js +96 -0
  15. package/dist/agent/agentDecisionFormatter.js.map +1 -0
  16. package/dist/agent/agentEnrich.d.ts +28 -0
  17. package/dist/agent/agentEnrich.d.ts.map +1 -0
  18. package/dist/agent/agentEnrich.js +99 -0
  19. package/dist/agent/agentEnrich.js.map +1 -0
  20. package/dist/agent/agentIntentClassifier.d.ts +44 -0
  21. package/dist/agent/agentIntentClassifier.d.ts.map +1 -0
  22. package/dist/agent/agentIntentClassifier.js +77 -0
  23. package/dist/agent/agentIntentClassifier.js.map +1 -0
  24. package/dist/agent/agentPolicyResolver.d.ts +44 -0
  25. package/dist/agent/agentPolicyResolver.d.ts.map +1 -0
  26. package/dist/agent/agentPolicyResolver.js +94 -0
  27. package/dist/agent/agentPolicyResolver.js.map +1 -0
  28. package/dist/agent/agentRuntime.d.ts +12 -0
  29. package/dist/agent/agentRuntime.d.ts.map +1 -0
  30. package/dist/agent/agentRuntime.js +31 -0
  31. package/dist/agent/agentRuntime.js.map +1 -0
  32. package/dist/agent/agentToolRouter.d.ts +24 -0
  33. package/dist/agent/agentToolRouter.d.ts.map +1 -0
  34. package/dist/agent/agentToolRouter.js +89 -0
  35. package/dist/agent/agentToolRouter.js.map +1 -0
  36. package/dist/agent/guardianOperator.d.ts +35 -0
  37. package/dist/agent/guardianOperator.d.ts.map +1 -0
  38. package/dist/agent/guardianOperator.js +65 -0
  39. package/dist/agent/guardianOperator.js.map +1 -0
  40. package/dist/agent/index.d.ts +8 -0
  41. package/dist/agent/index.d.ts.map +1 -0
  42. package/dist/agent/index.js +14 -0
  43. package/dist/agent/index.js.map +1 -0
  44. package/dist/api/activityRoutes.d.ts +70 -0
  45. package/dist/api/activityRoutes.d.ts.map +1 -0
  46. package/dist/api/activityRoutes.js +100 -0
  47. package/dist/api/activityRoutes.js.map +1 -0
  48. package/dist/api/agentRoutes.d.ts +16 -0
  49. package/dist/api/agentRoutes.d.ts.map +1 -0
  50. package/dist/api/agentRoutes.js +37 -0
  51. package/dist/api/agentRoutes.js.map +1 -0
  52. package/dist/api/broadcastRoutes.d.ts +34 -0
  53. package/dist/api/broadcastRoutes.d.ts.map +1 -0
  54. package/dist/api/broadcastRoutes.js +147 -0
  55. package/dist/api/broadcastRoutes.js.map +1 -0
  56. package/dist/api/consolePage.d.ts +2 -0
  57. package/dist/api/consolePage.d.ts.map +1 -0
  58. package/dist/api/consolePage.js +206 -0
  59. package/dist/api/consolePage.js.map +1 -0
  60. package/dist/api/httpHardening.d.ts +75 -0
  61. package/dist/api/httpHardening.d.ts.map +1 -0
  62. package/dist/api/httpHardening.js +122 -0
  63. package/dist/api/httpHardening.js.map +1 -0
  64. package/dist/api/indexerRoutes.d.ts +46 -0
  65. package/dist/api/indexerRoutes.d.ts.map +1 -0
  66. package/dist/api/indexerRoutes.js +75 -0
  67. package/dist/api/indexerRoutes.js.map +1 -0
  68. package/dist/api/paidRoutes.d.ts +8 -0
  69. package/dist/api/paidRoutes.d.ts.map +1 -0
  70. package/dist/api/paidRoutes.js +175 -0
  71. package/dist/api/paidRoutes.js.map +1 -0
  72. package/dist/api/prepareRoutes.d.ts +58 -0
  73. package/dist/api/prepareRoutes.d.ts.map +1 -0
  74. package/dist/api/prepareRoutes.js +90 -0
  75. package/dist/api/prepareRoutes.js.map +1 -0
  76. package/dist/api/response.d.ts +39 -0
  77. package/dist/api/response.d.ts.map +1 -0
  78. package/dist/api/response.js +53 -0
  79. package/dist/api/response.js.map +1 -0
  80. package/dist/api/routes.d.ts +175 -0
  81. package/dist/api/routes.d.ts.map +1 -0
  82. package/dist/api/routes.js +276 -0
  83. package/dist/api/routes.js.map +1 -0
  84. package/dist/api/schemas.d.ts +147 -0
  85. package/dist/api/schemas.d.ts.map +1 -0
  86. package/dist/api/schemas.js +81 -0
  87. package/dist/api/schemas.js.map +1 -0
  88. package/dist/api/server.d.ts +11 -0
  89. package/dist/api/server.d.ts.map +1 -0
  90. package/dist/api/server.js +505 -0
  91. package/dist/api/server.js.map +1 -0
  92. package/dist/api/toolRoutes.d.ts +14 -0
  93. package/dist/api/toolRoutes.d.ts.map +1 -0
  94. package/dist/api/toolRoutes.js +138 -0
  95. package/dist/api/toolRoutes.js.map +1 -0
  96. package/dist/api/walletPrepareRoutes.d.ts +74 -0
  97. package/dist/api/walletPrepareRoutes.d.ts.map +1 -0
  98. package/dist/api/walletPrepareRoutes.js +127 -0
  99. package/dist/api/walletPrepareRoutes.js.map +1 -0
  100. package/dist/api/x402Gate.d.ts +51 -0
  101. package/dist/api/x402Gate.d.ts.map +1 -0
  102. package/dist/api/x402Gate.js +184 -0
  103. package/dist/api/x402Gate.js.map +1 -0
  104. package/dist/cli.d.ts +1 -1
  105. package/dist/cli.d.ts.map +1 -1
  106. package/dist/cli.js +29 -1
  107. package/dist/cli.js.map +1 -1
  108. package/dist/data/ecosystemRegistry.data.d.ts +3 -0
  109. package/dist/data/ecosystemRegistry.data.d.ts.map +1 -0
  110. package/dist/data/ecosystemRegistry.data.js +582 -0
  111. package/dist/data/ecosystemRegistry.data.js.map +1 -0
  112. package/dist/demo.d.ts +0 -0
  113. package/dist/demo.d.ts.map +1 -1
  114. package/dist/demo.js +43 -8
  115. package/dist/demo.js.map +1 -1
  116. package/dist/handsafe.zip +0 -0
  117. package/dist/index.d.ts +0 -0
  118. package/dist/index.d.ts.map +0 -0
  119. package/dist/index.js +212 -135
  120. package/dist/index.js.map +1 -1
  121. package/dist/init.d.ts +0 -0
  122. package/dist/init.d.ts.map +1 -1
  123. package/dist/init.js +72 -10
  124. package/dist/init.js.map +1 -1
  125. package/dist/lib/analysis/abiWords.d.ts +17 -0
  126. package/dist/lib/analysis/abiWords.d.ts.map +1 -0
  127. package/dist/lib/analysis/abiWords.js +48 -0
  128. package/dist/lib/analysis/abiWords.js.map +1 -0
  129. package/dist/lib/analysis/approval.d.ts +29 -0
  130. package/dist/lib/analysis/approval.d.ts.map +1 -0
  131. package/dist/lib/analysis/approval.js +189 -0
  132. package/dist/lib/analysis/approval.js.map +1 -0
  133. package/dist/lib/analysis/calldata.d.ts +60 -0
  134. package/dist/lib/analysis/calldata.d.ts.map +1 -0
  135. package/dist/lib/analysis/calldata.js +464 -0
  136. package/dist/lib/analysis/calldata.js.map +1 -0
  137. package/dist/lib/analysis/contractIntel.d.ts +65 -0
  138. package/dist/lib/analysis/contractIntel.d.ts.map +1 -0
  139. package/dist/lib/analysis/contractIntel.js +320 -0
  140. package/dist/lib/analysis/contractIntel.js.map +1 -0
  141. package/dist/lib/analysis/evm.d.ts +42 -0
  142. package/dist/lib/analysis/evm.d.ts.map +1 -0
  143. package/dist/lib/analysis/evm.js +185 -0
  144. package/dist/lib/analysis/evm.js.map +1 -0
  145. package/dist/lib/analysis/gas.d.ts +4 -0
  146. package/dist/lib/analysis/gas.d.ts.map +1 -0
  147. package/dist/lib/analysis/gas.js +13 -0
  148. package/dist/lib/analysis/gas.js.map +1 -0
  149. package/dist/lib/analysis/index.d.ts +11 -0
  150. package/dist/lib/analysis/index.d.ts.map +1 -0
  151. package/dist/lib/analysis/index.js +16 -0
  152. package/dist/lib/analysis/index.js.map +1 -0
  153. package/dist/lib/analysis/pharosTokens.d.ts +31 -0
  154. package/dist/lib/analysis/pharosTokens.d.ts.map +1 -0
  155. package/dist/lib/analysis/pharosTokens.js +78 -0
  156. package/dist/lib/analysis/pharosTokens.js.map +1 -0
  157. package/dist/lib/analysis/safeTx.d.ts +27 -0
  158. package/dist/lib/analysis/safeTx.d.ts.map +1 -0
  159. package/dist/lib/analysis/safeTx.js +118 -0
  160. package/dist/lib/analysis/safeTx.js.map +1 -0
  161. package/dist/lib/analysis/token.d.ts +21 -0
  162. package/dist/lib/analysis/token.d.ts.map +1 -0
  163. package/dist/lib/analysis/token.js +151 -0
  164. package/dist/lib/analysis/token.js.map +1 -0
  165. package/dist/lib/analysis/types.d.ts +49 -0
  166. package/dist/lib/analysis/types.d.ts.map +1 -0
  167. package/dist/lib/analysis/types.js +10 -0
  168. package/dist/lib/analysis/types.js.map +1 -0
  169. package/dist/lib/analysis/x402.d.ts +24 -0
  170. package/dist/lib/analysis/x402.d.ts.map +1 -0
  171. package/dist/lib/analysis/x402.js +60 -0
  172. package/dist/lib/analysis/x402.js.map +1 -0
  173. package/dist/lib/auditLog.d.ts +1 -0
  174. package/dist/lib/auditLog.d.ts.map +1 -1
  175. package/dist/lib/auditLog.js +0 -0
  176. package/dist/lib/auditLog.js.map +1 -1
  177. package/dist/lib/config.d.ts +77 -0
  178. package/dist/lib/config.d.ts.map +1 -0
  179. package/dist/lib/config.js +120 -0
  180. package/dist/lib/config.js.map +1 -0
  181. package/dist/lib/constants.d.ts +246 -97
  182. package/dist/lib/constants.d.ts.map +1 -1
  183. package/dist/lib/constants.js +334 -127
  184. package/dist/lib/constants.js.map +1 -1
  185. package/dist/lib/dodoApi.d.ts +26 -3
  186. package/dist/lib/dodoApi.d.ts.map +1 -1
  187. package/dist/lib/dodoApi.js +80 -17
  188. package/dist/lib/dodoApi.js.map +1 -1
  189. package/dist/lib/ecosystemRegistry.d.ts +126 -0
  190. package/dist/lib/ecosystemRegistry.d.ts.map +1 -0
  191. package/dist/lib/ecosystemRegistry.js +178 -0
  192. package/dist/lib/ecosystemRegistry.js.map +1 -0
  193. package/dist/lib/envLoader.d.ts +0 -0
  194. package/dist/lib/envLoader.d.ts.map +0 -0
  195. package/dist/lib/envLoader.js +39 -18
  196. package/dist/lib/envLoader.js.map +1 -1
  197. package/dist/lib/goldsky.d.ts +58 -0
  198. package/dist/lib/goldsky.d.ts.map +1 -0
  199. package/dist/lib/goldsky.js +275 -0
  200. package/dist/lib/goldsky.js.map +1 -0
  201. package/dist/lib/guardian/decision.d.ts +23 -0
  202. package/dist/lib/guardian/decision.d.ts.map +1 -0
  203. package/dist/lib/guardian/decision.js +40 -0
  204. package/dist/lib/guardian/decision.js.map +1 -0
  205. package/dist/lib/http.d.ts +0 -1
  206. package/dist/lib/http.d.ts.map +1 -1
  207. package/dist/lib/http.js +297 -32
  208. package/dist/lib/http.js.map +1 -1
  209. package/dist/lib/managedExecution.d.ts +19 -0
  210. package/dist/lib/managedExecution.d.ts.map +1 -0
  211. package/dist/lib/managedExecution.js +64 -0
  212. package/dist/lib/managedExecution.js.map +1 -0
  213. package/dist/lib/merkleBatcher.d.ts +23 -0
  214. package/dist/lib/merkleBatcher.d.ts.map +1 -0
  215. package/dist/lib/merkleBatcher.js +62 -0
  216. package/dist/lib/merkleBatcher.js.map +1 -0
  217. package/dist/lib/networks.d.ts +48 -0
  218. package/dist/lib/networks.d.ts.map +1 -0
  219. package/dist/lib/networks.js +103 -0
  220. package/dist/lib/networks.js.map +1 -0
  221. package/dist/lib/observability/accessContext.d.ts +29 -0
  222. package/dist/lib/observability/accessContext.d.ts.map +1 -0
  223. package/dist/lib/observability/accessContext.js +50 -0
  224. package/dist/lib/observability/accessContext.js.map +1 -0
  225. package/dist/lib/observability/activityStore.d.ts +70 -0
  226. package/dist/lib/observability/activityStore.d.ts.map +1 -0
  227. package/dist/lib/observability/activityStore.js +149 -0
  228. package/dist/lib/observability/activityStore.js.map +1 -0
  229. package/dist/lib/observability/apiKey.d.ts +55 -0
  230. package/dist/lib/observability/apiKey.d.ts.map +1 -0
  231. package/dist/lib/observability/apiKey.js +141 -0
  232. package/dist/lib/observability/apiKey.js.map +1 -0
  233. package/dist/lib/observability/logger.d.ts +30 -0
  234. package/dist/lib/observability/logger.d.ts.map +1 -0
  235. package/dist/lib/observability/logger.js +30 -0
  236. package/dist/lib/observability/logger.js.map +1 -0
  237. package/dist/lib/observability/quota.d.ts +33 -0
  238. package/dist/lib/observability/quota.d.ts.map +1 -0
  239. package/dist/lib/observability/quota.js +49 -0
  240. package/dist/lib/observability/quota.js.map +1 -0
  241. package/dist/lib/observability/requestId.d.ts +8 -0
  242. package/dist/lib/observability/requestId.d.ts.map +1 -0
  243. package/dist/lib/observability/requestId.js +24 -0
  244. package/dist/lib/observability/requestId.js.map +1 -0
  245. package/dist/lib/observability/sanitize.d.ts +77 -0
  246. package/dist/lib/observability/sanitize.d.ts.map +1 -0
  247. package/dist/lib/observability/sanitize.js +228 -0
  248. package/dist/lib/observability/sanitize.js.map +1 -0
  249. package/dist/lib/observability/scopes.d.ts +20 -0
  250. package/dist/lib/observability/scopes.d.ts.map +1 -0
  251. package/dist/lib/observability/scopes.js +77 -0
  252. package/dist/lib/observability/scopes.js.map +1 -0
  253. package/dist/lib/okxDexApi.d.ts +106 -0
  254. package/dist/lib/okxDexApi.d.ts.map +1 -0
  255. package/dist/lib/okxDexApi.js +221 -0
  256. package/dist/lib/okxDexApi.js.map +1 -0
  257. package/dist/lib/persistentJsonStore.d.ts +5 -0
  258. package/dist/lib/persistentJsonStore.d.ts.map +1 -0
  259. package/dist/lib/persistentJsonStore.js +39 -0
  260. package/dist/lib/persistentJsonStore.js.map +1 -0
  261. package/dist/lib/pharos/attestationPublisher.d.ts +50 -0
  262. package/dist/lib/pharos/attestationPublisher.d.ts.map +1 -0
  263. package/dist/lib/pharos/attestationPublisher.js +262 -0
  264. package/dist/lib/pharos/attestationPublisher.js.map +1 -0
  265. package/dist/lib/pharos/ecosystem.d.ts +52 -0
  266. package/dist/lib/pharos/ecosystem.d.ts.map +1 -0
  267. package/dist/lib/pharos/ecosystem.js +431 -0
  268. package/dist/lib/pharos/ecosystem.js.map +1 -0
  269. package/dist/lib/pharos/ecosystemEvidence.d.ts +53 -0
  270. package/dist/lib/pharos/ecosystemEvidence.d.ts.map +1 -0
  271. package/dist/lib/pharos/ecosystemEvidence.js +133 -0
  272. package/dist/lib/pharos/ecosystemEvidence.js.map +1 -0
  273. package/dist/lib/pharos/rpc.d.ts +44 -0
  274. package/dist/lib/pharos/rpc.d.ts.map +1 -0
  275. package/dist/lib/pharos/rpc.js +90 -0
  276. package/dist/lib/pharos/rpc.js.map +1 -0
  277. package/dist/lib/pharos/rpcEvidence.d.ts +49 -0
  278. package/dist/lib/pharos/rpcEvidence.d.ts.map +1 -0
  279. package/dist/lib/pharos/rpcEvidence.js +46 -0
  280. package/dist/lib/pharos/rpcEvidence.js.map +1 -0
  281. package/dist/lib/pharos/rpcMethods.d.ts +46 -0
  282. package/dist/lib/pharos/rpcMethods.d.ts.map +1 -0
  283. package/dist/lib/pharos/rpcMethods.js +176 -0
  284. package/dist/lib/pharos/rpcMethods.js.map +1 -0
  285. package/dist/lib/pharos/spvVerifier.d.ts +47 -0
  286. package/dist/lib/pharos/spvVerifier.d.ts.map +1 -0
  287. package/dist/lib/pharos/spvVerifier.js +105 -0
  288. package/dist/lib/pharos/spvVerifier.js.map +1 -0
  289. package/dist/lib/pharos/userSignedBroadcaster.d.ts +10 -0
  290. package/dist/lib/pharos/userSignedBroadcaster.d.ts.map +1 -0
  291. package/dist/lib/pharos/userSignedBroadcaster.js +50 -0
  292. package/dist/lib/pharos/userSignedBroadcaster.js.map +1 -0
  293. package/dist/lib/pharosClient.d.ts +5 -10
  294. package/dist/lib/pharosClient.d.ts.map +1 -1
  295. package/dist/lib/pharosClient.js +9 -16
  296. package/dist/lib/pharosClient.js.map +1 -1
  297. package/dist/lib/policy/actionPolicyEngine.d.ts +37 -1
  298. package/dist/lib/policy/actionPolicyEngine.d.ts.map +1 -1
  299. package/dist/lib/policy/actionPolicyEngine.js +213 -52
  300. package/dist/lib/policy/actionPolicyEngine.js.map +1 -1
  301. package/dist/lib/policy/agentPolicy.d.ts +29 -0
  302. package/dist/lib/policy/agentPolicy.d.ts.map +1 -0
  303. package/dist/lib/policy/agentPolicy.js +154 -0
  304. package/dist/lib/policy/agentPolicy.js.map +1 -0
  305. package/dist/lib/policy/policyPresets.d.ts +30 -0
  306. package/dist/lib/policy/policyPresets.d.ts.map +1 -0
  307. package/dist/lib/policy/policyPresets.js +124 -0
  308. package/dist/lib/policy/policyPresets.js.map +1 -0
  309. package/dist/lib/policy/writeExecutionGate.d.ts +23 -0
  310. package/dist/lib/policy/writeExecutionGate.d.ts.map +1 -0
  311. package/dist/lib/policy/writeExecutionGate.js +65 -0
  312. package/dist/lib/policy/writeExecutionGate.js.map +1 -0
  313. package/dist/lib/preparedTxStore.d.ts +21 -0
  314. package/dist/lib/preparedTxStore.d.ts.map +1 -0
  315. package/dist/lib/preparedTxStore.js +90 -0
  316. package/dist/lib/preparedTxStore.js.map +1 -0
  317. package/dist/lib/price/chainlinkPushProvider.d.ts +34 -0
  318. package/dist/lib/price/chainlinkPushProvider.d.ts.map +1 -0
  319. package/dist/lib/price/chainlinkPushProvider.js +36 -0
  320. package/dist/lib/price/chainlinkPushProvider.js.map +1 -0
  321. package/dist/lib/price/feedRegistry.d.ts +26 -0
  322. package/dist/lib/price/feedRegistry.d.ts.map +1 -0
  323. package/dist/lib/price/feedRegistry.js +67 -0
  324. package/dist/lib/price/feedRegistry.js.map +1 -0
  325. package/dist/lib/price/priceResolver.d.ts +35 -0
  326. package/dist/lib/price/priceResolver.d.ts.map +1 -0
  327. package/dist/lib/price/priceResolver.js +246 -0
  328. package/dist/lib/price/priceResolver.js.map +1 -0
  329. package/dist/lib/price/supraProvider.d.ts +9 -0
  330. package/dist/lib/price/supraProvider.d.ts.map +1 -0
  331. package/dist/lib/price/supraProvider.js +17 -0
  332. package/dist/lib/price/supraProvider.js.map +1 -0
  333. package/dist/lib/price/types.d.ts +67 -0
  334. package/dist/lib/price/types.d.ts.map +1 -0
  335. package/dist/lib/price/types.js +7 -0
  336. package/dist/lib/price/types.js.map +1 -0
  337. package/dist/lib/productionGuards.d.ts +16 -0
  338. package/dist/lib/productionGuards.d.ts.map +1 -0
  339. package/dist/lib/productionGuards.js +93 -0
  340. package/dist/lib/productionGuards.js.map +1 -0
  341. package/dist/lib/recipientSafety.d.ts +5 -0
  342. package/dist/lib/recipientSafety.d.ts.map +1 -0
  343. package/dist/lib/recipientSafety.js +28 -0
  344. package/dist/lib/recipientSafety.js.map +1 -0
  345. package/dist/lib/riskEngine.d.ts +19 -0
  346. package/dist/lib/riskEngine.d.ts.map +1 -1
  347. package/dist/lib/riskEngine.js +107 -38
  348. package/dist/lib/riskEngine.js.map +1 -1
  349. package/dist/lib/riskInclusion.d.ts +72 -0
  350. package/dist/lib/riskInclusion.d.ts.map +1 -0
  351. package/dist/lib/riskInclusion.js +252 -0
  352. package/dist/lib/riskInclusion.js.map +1 -0
  353. package/dist/lib/safeHandsRegistry.d.ts +32 -0
  354. package/dist/lib/safeHandsRegistry.d.ts.map +1 -0
  355. package/dist/lib/safeHandsRegistry.js +151 -0
  356. package/dist/lib/safeHandsRegistry.js.map +1 -0
  357. package/dist/lib/signer/index.d.ts +3 -3
  358. package/dist/lib/signer/index.d.ts.map +1 -1
  359. package/dist/lib/signer/index.js +33 -11
  360. package/dist/lib/signer/index.js.map +1 -1
  361. package/dist/lib/spendAccumulator.d.ts +24 -1
  362. package/dist/lib/spendAccumulator.d.ts.map +1 -1
  363. package/dist/lib/spendAccumulator.js +76 -6
  364. package/dist/lib/spendAccumulator.js.map +1 -1
  365. package/dist/lib/toolResponse.d.ts +6 -1
  366. package/dist/lib/toolResponse.d.ts.map +1 -1
  367. package/dist/lib/toolResponse.js +13 -9
  368. package/dist/lib/toolResponse.js.map +1 -1
  369. package/dist/lib/validation.d.ts +7 -0
  370. package/dist/lib/validation.d.ts.map +1 -0
  371. package/dist/lib/validation.js +62 -0
  372. package/dist/lib/validation.js.map +1 -0
  373. package/dist/lib/wallet/index.d.ts +8 -12
  374. package/dist/lib/wallet/index.d.ts.map +1 -1
  375. package/dist/lib/wallet/index.js +48 -35
  376. package/dist/lib/wallet/index.js.map +1 -1
  377. package/dist/lib/x402ReplayStore.d.ts +6 -0
  378. package/dist/lib/x402ReplayStore.d.ts.map +1 -0
  379. package/dist/lib/x402ReplayStore.js +79 -0
  380. package/dist/lib/x402ReplayStore.js.map +1 -0
  381. package/dist/safehands.zip +0 -0
  382. package/dist/sdk.d.ts +14 -0
  383. package/dist/sdk.d.ts.map +1 -0
  384. package/dist/sdk.js +25 -0
  385. package/dist/sdk.js.map +1 -0
  386. package/dist/tools/approveToken.d.ts +31 -10
  387. package/dist/tools/approveToken.d.ts.map +1 -1
  388. package/dist/tools/approveToken.js +91 -24
  389. package/dist/tools/approveToken.js.map +1 -1
  390. package/dist/tools/assessRisk.d.ts +13 -26
  391. package/dist/tools/assessRisk.d.ts.map +1 -1
  392. package/dist/tools/assessRisk.js +34 -75
  393. package/dist/tools/assessRisk.js.map +1 -1
  394. package/dist/tools/checkAllowance.d.ts +9 -3
  395. package/dist/tools/checkAllowance.d.ts.map +1 -1
  396. package/dist/tools/checkAllowance.js +27 -5
  397. package/dist/tools/checkAllowance.js.map +1 -1
  398. package/dist/tools/checkTokenSecurity.d.ts +62 -5
  399. package/dist/tools/checkTokenSecurity.d.ts.map +1 -1
  400. package/dist/tools/checkTokenSecurity.js +166 -21
  401. package/dist/tools/checkTokenSecurity.js.map +1 -1
  402. package/dist/tools/createAgentWallet.d.ts +4 -2
  403. package/dist/tools/createAgentWallet.d.ts.map +1 -1
  404. package/dist/tools/createAgentWallet.js +36 -31
  405. package/dist/tools/createAgentWallet.js.map +1 -1
  406. package/dist/tools/estimateGas.d.ts +7 -2
  407. package/dist/tools/estimateGas.d.ts.map +1 -1
  408. package/dist/tools/estimateGas.js +16 -10
  409. package/dist/tools/estimateGas.js.map +1 -1
  410. package/dist/tools/executeSwap.d.ts +56 -8
  411. package/dist/tools/executeSwap.d.ts.map +1 -1
  412. package/dist/tools/executeSwap.js +194 -46
  413. package/dist/tools/executeSwap.js.map +1 -1
  414. package/dist/tools/explainRisk.d.ts +9 -9
  415. package/dist/tools/explainRisk.d.ts.map +1 -1
  416. package/dist/tools/explainRisk.js +5 -4
  417. package/dist/tools/explainRisk.js.map +1 -1
  418. package/dist/tools/getAgentPolicy.d.ts +15 -0
  419. package/dist/tools/getAgentPolicy.d.ts.map +1 -0
  420. package/dist/tools/getAgentPolicy.js +16 -0
  421. package/dist/tools/getAgentPolicy.js.map +1 -0
  422. package/dist/tools/getAgentReputation.d.ts +31 -0
  423. package/dist/tools/getAgentReputation.d.ts.map +1 -0
  424. package/dist/tools/getAgentReputation.js +44 -0
  425. package/dist/tools/getAgentReputation.js.map +1 -0
  426. package/dist/tools/getAgentWallet.d.ts +1 -1
  427. package/dist/tools/getAgentWallet.d.ts.map +1 -1
  428. package/dist/tools/getAgentWallet.js +11 -1
  429. package/dist/tools/getAgentWallet.js.map +1 -1
  430. package/dist/tools/getAgentWalletBalance.d.ts +1 -1
  431. package/dist/tools/getAgentWalletBalance.d.ts.map +1 -1
  432. package/dist/tools/getAgentWalletBalance.js +58 -26
  433. package/dist/tools/getAgentWalletBalance.js.map +1 -1
  434. package/dist/tools/getExecutionHistory.d.ts +1 -1
  435. package/dist/tools/getExecutionHistory.d.ts.map +1 -1
  436. package/dist/tools/getExecutionHistory.js +13 -19
  437. package/dist/tools/getExecutionHistory.js.map +1 -1
  438. package/dist/tools/getGasPrice.d.ts +3 -3
  439. package/dist/tools/getGasPrice.d.ts.map +0 -0
  440. package/dist/tools/getGasPrice.js +7 -7
  441. package/dist/tools/getGasPrice.js.map +1 -1
  442. package/dist/tools/getPoolInfo.d.ts +17 -17
  443. package/dist/tools/getPoolInfo.d.ts.map +1 -1
  444. package/dist/tools/getPoolInfo.js +14 -9
  445. package/dist/tools/getPoolInfo.js.map +1 -1
  446. package/dist/tools/getSpvProof.d.ts +24 -0
  447. package/dist/tools/getSpvProof.d.ts.map +1 -0
  448. package/dist/tools/getSpvProof.js +64 -0
  449. package/dist/tools/getSpvProof.js.map +1 -0
  450. package/dist/tools/getTokenPrice.d.ts +28 -85
  451. package/dist/tools/getTokenPrice.d.ts.map +1 -1
  452. package/dist/tools/getTokenPrice.js +87 -94
  453. package/dist/tools/getTokenPrice.js.map +1 -1
  454. package/dist/tools/getTransactionStatus.d.ts +2 -2
  455. package/dist/tools/getTransactionStatus.d.ts.map +0 -0
  456. package/dist/tools/getTransactionStatus.js +0 -0
  457. package/dist/tools/getTransactionStatus.js.map +0 -0
  458. package/dist/tools/getWalletBalance.d.ts +38 -3
  459. package/dist/tools/getWalletBalance.d.ts.map +1 -1
  460. package/dist/tools/getWalletBalance.js +92 -52
  461. package/dist/tools/getWalletBalance.js.map +1 -1
  462. package/dist/tools/publishRiskScore.d.ts +36 -14
  463. package/dist/tools/publishRiskScore.d.ts.map +1 -1
  464. package/dist/tools/publishRiskScore.js +80 -32
  465. package/dist/tools/publishRiskScore.js.map +1 -1
  466. package/dist/tools/queryGoldsky.d.ts +20 -0
  467. package/dist/tools/queryGoldsky.d.ts.map +1 -0
  468. package/dist/tools/queryGoldsky.js +29 -0
  469. package/dist/tools/queryGoldsky.js.map +1 -0
  470. package/dist/tools/queryRiskRegistry.d.ts +14 -14
  471. package/dist/tools/queryRiskRegistry.d.ts.map +1 -1
  472. package/dist/tools/queryRiskRegistry.js +34 -30
  473. package/dist/tools/queryRiskRegistry.js.map +1 -1
  474. package/dist/tools/safehandsPreflightCheck.d.ts +29 -14
  475. package/dist/tools/safehandsPreflightCheck.d.ts.map +1 -1
  476. package/dist/tools/safehandsPreflightCheck.js +133 -6
  477. package/dist/tools/safehandsPreflightCheck.js.map +1 -1
  478. package/dist/tools/safehandsRiskReport.d.ts +29 -14
  479. package/dist/tools/safehandsRiskReport.d.ts.map +1 -1
  480. package/dist/tools/safehandsRiskReport.js +23 -3
  481. package/dist/tools/safehandsRiskReport.js.map +1 -1
  482. package/dist/tools/safehandsSafeExecute.d.ts +1 -1
  483. package/dist/tools/safehandsSafeExecute.d.ts.map +1 -1
  484. package/dist/tools/safehandsSafeExecute.js +100 -17
  485. package/dist/tools/safehandsSafeExecute.js.map +1 -1
  486. package/dist/tools/safehandsWalletHealth.d.ts +15 -1
  487. package/dist/tools/safehandsWalletHealth.d.ts.map +1 -1
  488. package/dist/tools/safehandsWalletHealth.js +67 -25
  489. package/dist/tools/safehandsWalletHealth.js.map +1 -1
  490. package/dist/tools/safehandsX402Preflight.d.ts +3 -3
  491. package/dist/tools/safehandsX402Preflight.d.ts.map +1 -1
  492. package/dist/tools/safehandsX402Preflight.js +24 -3
  493. package/dist/tools/safehandsX402Preflight.js.map +1 -1
  494. package/dist/tools/sendPayment.d.ts +10 -4
  495. package/dist/tools/sendPayment.d.ts.map +1 -1
  496. package/dist/tools/sendPayment.js +63 -36
  497. package/dist/tools/sendPayment.js.map +1 -1
  498. package/dist/tools/setAgentPolicy.d.ts +75 -0
  499. package/dist/tools/setAgentPolicy.d.ts.map +1 -0
  500. package/dist/tools/setAgentPolicy.js +80 -0
  501. package/dist/tools/setAgentPolicy.js.map +1 -0
  502. package/dist/tools/simulateTransaction.d.ts +7 -3
  503. package/dist/tools/simulateTransaction.d.ts.map +1 -1
  504. package/dist/tools/simulateTransaction.js +42 -9
  505. package/dist/tools/simulateTransaction.js.map +1 -1
  506. package/dist/tools/tokenRegistryStatus.d.ts +25 -5
  507. package/dist/tools/tokenRegistryStatus.d.ts.map +1 -1
  508. package/dist/tools/tokenRegistryStatus.js +61 -31
  509. package/dist/tools/tokenRegistryStatus.js.map +1 -1
  510. package/dist/tools/verifyRiskInclusion.d.ts +59 -0
  511. package/dist/tools/verifyRiskInclusion.d.ts.map +1 -0
  512. package/dist/tools/verifyRiskInclusion.js +40 -0
  513. package/dist/tools/verifyRiskInclusion.js.map +1 -0
  514. package/dist/tools/x402PayAndFetch.d.ts +15 -9
  515. package/dist/tools/x402PayAndFetch.d.ts.map +1 -1
  516. package/dist/tools/x402PayAndFetch.js +163 -20
  517. package/dist/tools/x402PayAndFetch.js.map +1 -1
  518. package/dist/worker.d.ts +3 -0
  519. package/dist/worker.d.ts.map +1 -0
  520. package/dist/worker.js +39 -0
  521. package/dist/worker.js.map +1 -0
  522. package/dist/x402Server.d.ts +1 -1
  523. package/dist/x402Server.d.ts.map +1 -1
  524. package/dist/x402Server.js +144 -35
  525. package/dist/x402Server.js.map +1 -1
  526. package/docs/REVIEWER_QUICKSTART.md +113 -0
  527. package/docs/SAFEHANDS_REVIEWER_DEMO_SCRIPT.md +228 -0
  528. package/package.json +131 -73
  529. package/contracts/RiskRegistry.json +0 -223
  530. package/contracts/RiskRegistry.sol +0 -58
  531. package/dist/lib/testDodoLive.d.ts +0 -2
  532. package/dist/lib/testDodoLive.d.ts.map +0 -1
  533. package/dist/lib/testDodoLive.js +0 -105
  534. package/dist/lib/testDodoLive.js.map +0 -1
  535. package/dist/lib/testLiveSafehands.d.ts +0 -2
  536. package/dist/lib/testLiveSafehands.d.ts.map +0 -1
  537. package/dist/lib/testLiveSafehands.js +0 -93
  538. package/dist/lib/testLiveSafehands.js.map +0 -1
  539. package/dist/lib/testRpc.d.ts +0 -2
  540. package/dist/lib/testRpc.d.ts.map +0 -1
  541. package/dist/lib/testRpc.js +0 -30
  542. package/dist/lib/testRpc.js.map +0 -1
  543. package/dist/lib/testRpcLive.d.ts +0 -2
  544. package/dist/lib/testRpcLive.d.ts.map +0 -1
  545. package/dist/lib/testRpcLive.js +0 -89
  546. package/dist/lib/testRpcLive.js.map +0 -1
  547. package/dist/lib/testTools.d.ts +0 -2
  548. package/dist/lib/testTools.d.ts.map +0 -1
  549. package/dist/lib/testTools.js +0 -397
  550. package/dist/lib/testTools.js.map +0 -1
  551. package/dist/lib/testX402Live.d.ts +0 -2
  552. package/dist/lib/testX402Live.d.ts.map +0 -1
  553. package/dist/lib/testX402Live.js +0 -160
  554. package/dist/lib/testX402Live.js.map +0 -1
  555. package/dist/scripts/checkDeploy.d.ts +0 -2
  556. package/dist/scripts/checkDeploy.d.ts.map +0 -1
  557. package/dist/scripts/checkDeploy.js +0 -25
  558. package/dist/scripts/checkDeploy.js.map +0 -1
  559. package/dist/scripts/deployRegistry.d.ts +0 -2
  560. package/dist/scripts/deployRegistry.d.ts.map +0 -1
  561. package/dist/scripts/deployRegistry.js +0 -101
  562. package/dist/scripts/deployRegistry.js.map +0 -1
  563. package/dist/scripts/testRegistry.d.ts +0 -2
  564. package/dist/scripts/testRegistry.d.ts.map +0 -1
  565. package/dist/scripts/testRegistry.js +0 -44
  566. package/dist/scripts/testRegistry.js.map +0 -1
@@ -1,9 +1,23 @@
1
1
  // ─── SafeHands Action Policy Engine ───────────────────────────────────
2
2
  // Reusable transaction safety firewall for AI agent actions on Pharos.
3
- // It is intentionally deterministic and testnet-only.
3
+ // It is intentionally deterministic. Mainnet-first (Pharos Pacific, chain 1672).
4
4
  // ───────────────────────────────────────────────────────────────────────
5
5
  import { isAddress, parseUnits } from "viem";
6
- import { CHAIN_ID, PHAROS_ENVIRONMENT, IS_MAINNET, MAX_APPROVAL_AMOUNT_USDC, MAX_TX_AMOUNT_PHRS, MAX_X402_PAYMENT_USDC, USDC_ADDRESS, TEST_USDC_ADDRESS, } from "../constants.js";
6
+ import { isDenylistedRecipient } from "../recipientSafety.js";
7
+ import { CHAIN_ID, PHAROS_ENVIRONMENT, COUNTERPARTY_CRITICAL_THRESHOLD, RISK_BLOCK_THRESHOLD, activeX402AllowedTokenAddresses, PACIFIC_USDC_ADDRESS, PACIFIC_WPROS_ADDRESS, USDC_ADDRESS, WPROS_ADDRESS, isCanonicalInfrastructure, } from "../constants.js";
8
+ import { getNetworkByChainId } from "../networks.js";
9
+ import { resolvePriceableToken } from "../spendAccumulator.js";
10
+ import { loadAgentPolicy, resolveEffectiveLimits } from "./agentPolicy.js";
11
+ /** Projects a RiskAssessment into the policy-evidence shape. Single mapper — write tools must use this rather than hand-rolling the projection. */
12
+ export function riskEvidenceFromAssessment(a) {
13
+ return {
14
+ score: a.riskScore,
15
+ degraded: a.degraded,
16
+ degradedReasons: a.degradedReasons,
17
+ counterpartyRisk: a.breakdown.counterpartyRisk,
18
+ swapProviderNotConfigured: a.swapProviderNotConfigured,
19
+ };
20
+ }
7
21
  function numeric(value) {
8
22
  if (!value)
9
23
  return null;
@@ -33,28 +47,41 @@ export function isUnlimitedApprovalAmount(value) {
33
47
  function isSuspiciousUrl(rawUrl) {
34
48
  if (!rawUrl)
35
49
  return false;
36
- if (process.env.ALLOW_LOCAL_X402_FETCH === "true")
37
- return false;
50
+ let parsed;
38
51
  try {
39
- const parsed = new URL(rawUrl);
40
- const host = parsed.hostname.toLowerCase();
41
- if (!["http:", "https:"].includes(parsed.protocol))
42
- return true;
43
- if (host === "localhost" || host.endsWith(".localhost"))
44
- return true;
45
- if (host === "127.0.0.1" || host.startsWith("127.") || host === "0.0.0.0")
46
- return true;
47
- if (host.startsWith("10.") || host.startsWith("192.168."))
48
- return true;
49
- if (/^172\.(1[6-9]|2\d|3[0-1])\./.test(host))
50
- return true;
51
- if (host === "[::1]" || host === "::1")
52
- return true;
53
- return false;
52
+ parsed = new URL(rawUrl);
54
53
  }
55
54
  catch {
56
55
  return true;
57
56
  }
57
+ const host = parsed.hostname.toLowerCase();
58
+ if (!["http:", "https:"].includes(parsed.protocol))
59
+ return true;
60
+ // ALLOW_LOCAL_X402_FETCH relaxes ONLY loopback, and only outside production.
61
+ // Cloud-metadata / private / link-local ranges are ALWAYS suspicious — the flag
62
+ // can no longer wave through 169.254.169.254 or RFC1918 hosts.
63
+ const isLoopback = host === "localhost" || host.endsWith(".localhost") ||
64
+ host === "127.0.0.1" || host.startsWith("127.") ||
65
+ host === "[::1]" || host === "::1";
66
+ const loopbackBypass = process.env.ALLOW_LOCAL_X402_FETCH === "true" &&
67
+ (process.env.NODE_ENV || "").toLowerCase() !== "production";
68
+ if (isLoopback)
69
+ return loopbackBypass ? false : true;
70
+ if (host === "0.0.0.0")
71
+ return true;
72
+ if (/^0\./.test(host))
73
+ return true;
74
+ if (host.startsWith("10.") || host.startsWith("192.168."))
75
+ return true;
76
+ if (/^172\.(1[6-9]|2\d|3[0-1])\./.test(host))
77
+ return true;
78
+ if (host.startsWith("169.254."))
79
+ return true;
80
+ if (host.startsWith("[fc") || host.startsWith("[fd") || host.startsWith("[fe80:"))
81
+ return true;
82
+ if (host.startsWith("fc") || host.startsWith("fd") || host.startsWith("fe80:"))
83
+ return true;
84
+ return false;
58
85
  }
59
86
  function classifyRisk(checks) {
60
87
  const fails = checks.filter((c) => c.status === "fail").length;
@@ -73,30 +100,40 @@ function classifyRisk(checks) {
73
100
  function defaultDecision(riskLevel, checks) {
74
101
  if (checks.some((c) => c.status === "fail"))
75
102
  return "BLOCK";
76
- if (riskLevel === "MEDIUM")
77
- return "REQUIRE_CONFIRMATION";
78
- if (riskLevel === "UNKNOWN")
79
- return "REQUIRE_TOKEN_REVIEW";
80
- return "ALLOW";
103
+ if (riskLevel === "LOW")
104
+ return "ALLOW";
105
+ // classifyRisk only produces MEDIUM here (HIGH/CRITICAL imply a fail, caught
106
+ // above). Any other level, including a future UNKNOWN, lands here fail-closed
107
+ // rather than falling through to ALLOW.
108
+ return "REQUIRE_CONFIRMATION";
81
109
  }
82
110
  export function evaluateActionPolicy(input) {
83
111
  const environment = input.environment || PHAROS_ENVIRONMENT;
84
112
  const chainId = input.chainId ?? CHAIN_ID;
85
- const isMainnet = input.isMainnet ?? IS_MAINNET;
113
+ const network = getNetworkByChainId(chainId);
114
+ const isMainnet = input.isMainnet ?? network?.isMainnet ?? false;
86
115
  const checks = [];
87
116
  const reasons = [];
88
117
  const requiredActions = [];
89
- if (isMainnet) {
90
- pushCheck(checks, "mainnet_guard", "fail", "Mainnet actions are blocked by SafeHands.", reasons, requiredActions, "Mainnet actions are not supported.", "Switch to Pharos Atlantic Testnet.");
118
+ const policy = input.agentPolicy ?? loadAgentPolicy(input.agentId);
119
+ const effectiveLimits = resolveEffectiveLimits(policy);
120
+ // Chain guard: only supported Pharos networks pass. Unknown chains (e.g.
121
+ // Ethereum mainnet, chain 1) are blocked. Pharos Pacific Mainnet (1672) is a
122
+ // supported network for read-only SafeHands checks.
123
+ if (!network) {
124
+ pushCheck(checks, "chain_id", "fail", `Chain ID ${chainId} is not a supported Pharos network.`, reasons, requiredActions, "Unsupported chain.", "Use Pharos Pacific Mainnet (1672) or Atlantic Testnet (688689).");
91
125
  }
92
126
  else {
93
- pushCheck(checks, "mainnet_guard", "pass", "Action is not targeting mainnet.");
127
+ pushCheck(checks, "chain_id", "pass", `Chain ID is ${network.label} (${chainId}).`);
94
128
  }
95
- if (chainId !== CHAIN_ID) {
96
- pushCheck(checks, "chain_id", "fail", `Expected chain ID ${CHAIN_ID}, received ${chainId}.`, reasons, requiredActions, "Chain ID mismatch.", "Switch wallet/RPC to Pharos Atlantic Testnet.");
129
+ // Mainnet read-only SafeHands checks are allowed. Mainnet execution / write /
130
+ // payment is disabled by default and gated separately (WRITE_TOOLS_ENABLED and
131
+ // the network executionAllowed flag) — it is never live here.
132
+ if (isMainnet) {
133
+ pushCheck(checks, "mainnet_guard", "pass", `${network ? network.label : "Pharos mainnet"}: read-only SafeHands checks allowed; execution/write/payment is gated and disabled by default.`);
97
134
  }
98
135
  else {
99
- pushCheck(checks, "chain_id", "pass", `Chain ID is Pharos Atlantic Testnet (${CHAIN_ID}).`);
136
+ pushCheck(checks, "mainnet_guard", "pass", "Action is not targeting mainnet.");
100
137
  }
101
138
  if (environment !== PHAROS_ENVIRONMENT) {
102
139
  pushCheck(checks, "environment", "warn", `Expected ${PHAROS_ENVIRONMENT}, received ${environment}.`, reasons, requiredActions, undefined, "Verify the runtime environment before execution.");
@@ -104,23 +141,48 @@ export function evaluateActionPolicy(input) {
104
141
  else {
105
142
  pushCheck(checks, "environment", "pass", `Environment is ${PHAROS_ENVIRONMENT}.`);
106
143
  }
107
- if (input.requiresSigner && !input.signerAvailable) {
108
- pushCheck(checks, "signer", "fail", "No signer is available for this write/payment action.", reasons, requiredActions, "No signer available.", "Configure WALLET_MODE=managed-testnet, X402_SIGNER_PRIVATE_KEY, or PRIVATE_KEY for testnet only.");
144
+ if (input.requiresSigner && input.signerAvailable === false) {
145
+ pushCheck(checks, "signer", "fail", "No signer is available for this write/payment action.", reasons, requiredActions, "No signer available.", "Configure WALLET_MODE=managed-mainnet, X402_SIGNER_PRIVATE_KEY, or PRIVATE_KEY for mainnet only.");
146
+ }
147
+ else if (input.requiresSigner && input.signerAvailable === undefined) {
148
+ pushCheck(checks, "signer_unknown", "warn", "Signer availability is unknown; a signer will be required for execution.", reasons, requiredActions, undefined, "Ensure a signer is available before executing this write/payment action.");
109
149
  }
110
150
  if (input.actionType === "send_payment") {
111
151
  const amount = numeric(input.amount);
112
- if (amount !== null && amount > Number(MAX_TX_AMOUNT_PHRS)) {
113
- pushCheck(checks, "payment_limit", "fail", `Payment ${amount} PHRS exceeds limit ${MAX_TX_AMOUNT_PHRS} PHRS.`, reasons, requiredActions, "Payment exceeds configured PHRS limit.", "Reduce amount or increase MAX_TX_AMOUNT_PHRS consciously for testnet.");
152
+ const paymentLimit = effectiveLimits.maxPaymentPROS;
153
+ if (amount !== null && amount > paymentLimit) {
154
+ pushCheck(checks, "payment_limit", "fail", `Payment ${amount} PROS exceeds limit ${paymentLimit} PROS (policy: ${policy.profile}).`, reasons, requiredActions, "Payment exceeds configured PROS limit.", "Reduce amount or adjust agent policy.");
114
155
  }
115
156
  else {
116
- pushCheck(checks, "payment_limit", "pass", `Payment is within ${MAX_TX_AMOUNT_PHRS} PHRS limit.`);
157
+ pushCheck(checks, "payment_limit", "pass", `Payment is within ${paymentLimit} PROS limit (policy: ${policy.profile}).`);
158
+ }
159
+ const balance = numeric(input.walletBalancePhs);
160
+ if (amount !== null && balance !== null) {
161
+ if (amount > balance) {
162
+ pushCheck(checks, "funding_balance", "fail", `Insufficient PROS balance. Have ${balance}, need ${amount}.`, reasons, requiredActions, "Insufficient PROS balance.", "Fund the wallet before executing.");
163
+ }
164
+ else {
165
+ pushCheck(checks, "funding_balance", "pass", "Sufficient PROS balance for payment.");
166
+ }
117
167
  }
118
168
  if (input.recipient && !isAddress(input.recipient)) {
119
169
  pushCheck(checks, "recipient_address", "fail", "Recipient address is invalid.", reasons, requiredActions, "Invalid recipient address.", "Provide a valid EVM address.");
120
170
  }
171
+ else if (isDenylistedRecipient(input.recipient)) {
172
+ pushCheck(checks, "recipient_denylist", "fail", "Recipient is on the operator denylist (known-bad address).", reasons, requiredActions, "Recipient address is denylisted.", "Do not send to this address; it is flagged as known-bad by the operator.");
173
+ }
121
174
  else if (input.recipientVerified === false) {
122
175
  pushCheck(checks, "recipient_reputation", "warn", "Recipient is unverified.", reasons, requiredActions, undefined, "Verify recipient before sending funds.");
123
176
  }
177
+ else if (input.recipient && input.recipientVerified === undefined) {
178
+ // Fail-closed: recipientVerified is a caller CLAIM. When it is omitted, no
179
+ // verification happened — treat exactly like an unverified recipient instead
180
+ // of silently skipping the reputation check (truth-model rule 5).
181
+ pushCheck(checks, "recipient_reputation", "unknown", "Recipient verification was not asserted; the recipient is treated as an unverified claim.", reasons, requiredActions, undefined, "Verify the recipient against chain/registry evidence before sending funds.");
182
+ }
183
+ else if (input.recipient && input.recipientVerified === true) {
184
+ pushCheck(checks, "recipient_reputation", "pass", "Recipient verification asserted by the caller (caller-attested claim; not independently verified by SafeHands).");
185
+ }
124
186
  }
125
187
  if (input.actionType === "approve_token") {
126
188
  const unlimited = input.approvalUnlimited || isUnlimitedApprovalAmount(input.approvalAmount) || isUnlimitedApprovalAmount(input.amount);
@@ -129,11 +191,12 @@ export function evaluateActionPolicy(input) {
129
191
  }
130
192
  else {
131
193
  const approvalAmount = numeric(input.approvalAmount) ?? numeric(input.amount);
132
- if (approvalAmount !== null && approvalAmount > Number(MAX_APPROVAL_AMOUNT_USDC)) {
133
- pushCheck(checks, "approval_limit", "fail", `Approval ${approvalAmount} exceeds limit ${MAX_APPROVAL_AMOUNT_USDC}.`, reasons, requiredActions, "Approval exceeds configured limit.", "Reduce approval or increase MAX_APPROVAL_AMOUNT_USDC consciously for testnet.");
194
+ const approvalLimit = effectiveLimits.maxApprovalUSDC;
195
+ if (approvalAmount !== null && approvalAmount > approvalLimit) {
196
+ pushCheck(checks, "approval_limit", "fail", `Approval ${approvalAmount} exceeds limit ${approvalLimit} (policy: ${policy.profile}).`, reasons, requiredActions, "Approval exceeds configured limit.", "Reduce approval or adjust agent policy.");
134
197
  }
135
198
  else {
136
- pushCheck(checks, "approval_limit", "pass", `Approval is within ${MAX_APPROVAL_AMOUNT_USDC} USDC-equivalent limit.`);
199
+ pushCheck(checks, "approval_limit", "pass", `Approval is within ${approvalLimit} USDC-equivalent limit (policy: ${policy.profile}).`);
137
200
  }
138
201
  }
139
202
  if (input.spender && !isAddress(input.spender)) {
@@ -142,11 +205,42 @@ export function evaluateActionPolicy(input) {
142
205
  else if (input.spenderVerified === false) {
143
206
  pushCheck(checks, "spender_reputation", "warn", "Spender is unverified.", reasons, requiredActions, undefined, "Verify spender contract before approving.");
144
207
  }
208
+ else if (input.spender && input.spenderVerified === undefined) {
209
+ // Fail-closed: same rule as recipientVerified — an omitted claim is not evidence.
210
+ pushCheck(checks, "spender_reputation", "unknown", "Spender verification was not asserted; the spender is treated as an unverified claim.", reasons, requiredActions, undefined, "Verify the spender contract against chain/registry evidence before approving.");
211
+ }
212
+ else if (input.spender && input.spenderVerified === true) {
213
+ pushCheck(checks, "spender_reputation", "pass", "Spender verification asserted by the caller (caller-attested claim; not independently verified by SafeHands).");
214
+ }
145
215
  }
146
216
  if (input.actionType === "execute_swap") {
147
217
  const amount = numeric(input.amount);
148
- if (amount !== null && amount > Number(MAX_TX_AMOUNT_PHRS) && (input.tokenIn || "").toUpperCase() === "PHRS") {
149
- pushCheck(checks, "swap_amount_limit", "fail", `Swap ${amount} PHRS exceeds limit ${MAX_TX_AMOUNT_PHRS} PHRS.`, reasons, requiredActions, "Swap exceeds configured PHRS limit.", "Reduce amount or increase MAX_TX_AMOUNT_PHRS consciously for testnet.");
218
+ const swapLimit = effectiveLimits.maxSwapPROS;
219
+ if (amount !== null && amount > swapLimit && (input.tokenIn || "").toUpperCase() === "PROS") {
220
+ pushCheck(checks, "swap_amount_limit", "fail", `Swap ${amount} PROS exceeds limit ${swapLimit} PROS (policy: ${policy.profile}).`, reasons, requiredActions, "Swap exceeds configured PROS limit.", "Reduce amount or adjust agent policy.");
221
+ }
222
+ // An input token that cannot be priced in USD contributes $0 to
223
+ // MAX_DAILY_SPEND_USD and has no per-transaction ceiling — the spend caps would
224
+ // silently not apply. Deny by default (fail → BLOCK, never confirmable).
225
+ if (input.tokenIn && resolvePriceableToken(input.tokenIn) === null) {
226
+ pushCheck(checks, "swap_notional_unpriceable", "fail", `Swap input token ${input.tokenIn} cannot be priced in USD, so the daily USD cap and per-transaction ceiling cannot bound this spend; denied by default.`, reasons, requiredActions, "Unpriceable input token would escape spend caps.", "Swap a priceable token (PROS, WPROS, USDC, USDT) or add the token to the price map before enabling it.");
227
+ }
228
+ const balance = numeric(input.walletBalancePhs);
229
+ if (amount !== null && balance !== null && (input.tokenIn || "").toUpperCase() === "PROS") {
230
+ if (amount > balance) {
231
+ pushCheck(checks, "funding_balance", "fail", `Insufficient PROS balance. Have ${balance}, need ${amount}.`, reasons, requiredActions, "Insufficient PROS balance.", "Fund the wallet before executing.");
232
+ }
233
+ else {
234
+ pushCheck(checks, "funding_balance", "pass", "Sufficient PROS balance for swap.");
235
+ }
236
+ }
237
+ }
238
+ if (input.actionType === "custom_contract_call" && input.targetContract) {
239
+ if (isCanonicalInfrastructure(input.targetContract, isMainnet)) {
240
+ pushCheck(checks, "canonical_contract", "pass", `Contract ${input.targetContract} is recognized as official Pharos canonical infrastructure.`);
241
+ }
242
+ else {
243
+ pushCheck(checks, "unknown_contract", "warn", `Contract ${input.targetContract} is not recognized as canonical Pharos infrastructure.`, reasons, requiredActions, undefined, "Review the contract interaction carefully before confirming.");
150
244
  }
151
245
  }
152
246
  if (input.actionType === "x402_pay_and_fetch") {
@@ -157,30 +251,91 @@ export function evaluateActionPolicy(input) {
157
251
  pushCheck(checks, "x402_url", "pass", "x402 URL passed static SSRF checks.");
158
252
  }
159
253
  const payment = numeric(input.paymentAmountUsdc);
160
- if (payment !== null && payment > Number(MAX_X402_PAYMENT_USDC)) {
161
- pushCheck(checks, "x402_payment_limit", "fail", `x402 payment ${payment} USDC exceeds limit ${MAX_X402_PAYMENT_USDC} USDC.`, reasons, requiredActions, "x402 payment exceeds configured limit.", "Reduce payment amount or increase MAX_X402_PAYMENT_USDC consciously for testnet.");
254
+ const x402Limit = effectiveLimits.maxX402PaymentUSDC;
255
+ if (payment !== null && payment > x402Limit) {
256
+ pushCheck(checks, "x402_payment_limit", "fail", `x402 payment ${payment} USDC exceeds limit ${x402Limit} USDC (policy: ${policy.profile}).`, reasons, requiredActions, "x402 payment exceeds configured limit.", "Reduce payment amount or adjust agent policy.");
162
257
  }
163
258
  else {
164
- pushCheck(checks, "x402_payment_limit", "pass", `x402 payment is within ${MAX_X402_PAYMENT_USDC} USDC limit.`);
259
+ pushCheck(checks, "x402_payment_limit", "pass", `x402 payment is within ${x402Limit} USDC limit (policy: ${policy.profile}).`);
165
260
  }
166
- if (input.paymentTokenAddress && input.paymentTokenAddress.toLowerCase() !== USDC_ADDRESS.toLowerCase()) {
167
- const status = input.paymentTokenAddress.toLowerCase() === TEST_USDC_ADDRESS.toLowerCase() ? "warn" : "fail";
168
- pushCheck(checks, "x402_payment_token", status, `Payment token ${input.paymentTokenAddress} is not canonical Circle USDC ${USDC_ADDRESS}.`, reasons, requiredActions, status === "fail" ? "x402 payment token is not canonical USDC." : undefined, "Use docs-verified Pharos testnet USDC or label the token as project-configured.");
261
+ const balance = numeric(input.walletBalancePhs);
262
+ if (payment !== null && balance !== null && (input.paymentTokenAddress || "").toLowerCase() === PACIFIC_USDC_ADDRESS.toLowerCase()) {
263
+ if (payment > balance) {
264
+ pushCheck(checks, "funding_balance_x402", "fail", `Insufficient USDC balance for x402 payment. Have ${balance}, need ${payment}.`, reasons, requiredActions, "Insufficient USDC balance.", "Fund the wallet with USDC.");
265
+ }
266
+ else {
267
+ pushCheck(checks, "funding_balance_x402", "pass", "Sufficient USDC balance for x402 payment.");
268
+ }
269
+ }
270
+ const allowedX402Tokens = activeX402AllowedTokenAddresses().map((a) => a.toLowerCase());
271
+ if (input.paymentTokenAddress && !allowedX402Tokens.includes(input.paymentTokenAddress.toLowerCase())) {
272
+ const mainnetMsg = `supported x402 payment tokens are Pacific USDC (${PACIFIC_USDC_ADDRESS}) or Pacific WPROS (${PACIFIC_WPROS_ADDRESS})`;
273
+ const testnetMsg = `supported x402 payment tokens are USDC (${USDC_ADDRESS}) or WPROS (${WPROS_ADDRESS})`;
274
+ pushCheck(checks, "x402_payment_token", "fail", `Payment token ${input.paymentTokenAddress} is not a supported x402 payment token; ${isMainnet ? mainnetMsg : testnetMsg}.`, reasons, requiredActions, "x402 payment token is not supported for this network.", isMainnet ? "Use Pacific USDC or Pacific WPROS for x402 payments." : "Use the active network USDC or WPROS token for x402 payments.");
275
+ }
276
+ else if (input.paymentTokenAddress) {
277
+ pushCheck(checks, "x402_payment_token", "pass", `Payment token ${input.paymentTokenAddress} is supported for x402 on ${isMainnet ? "Pharos Pacific Mainnet" : "the active Pharos network"}.`);
169
278
  }
170
279
  }
171
280
  const tokenStatus = input.tokenRegistryStatus;
172
281
  if (tokenStatus === "CUSTOM_NON_REGISTRY" || tokenStatus === "UNKNOWN") {
173
282
  pushCheck(checks, "token_registry", "warn", `Token registry status is ${tokenStatus}.`, reasons, requiredActions, undefined, "Review token contract before execution.");
174
283
  }
175
- if (input.tokenSecurityStatus === "unavailable" || input.tokenSecurityStatus === "unknown") {
176
- pushCheck(checks, "token_security_provider", "warn", "Token security provider is unavailable or unknown.", reasons, requiredActions, undefined, "Proceed only after manual token review.");
284
+ if (input.tokenSecurityStatus === "unavailable") {
285
+ // Intel is MISSING (provider outage / token not indexed) nothing was
286
+ // reviewed. Distinct check name so the write-execution gate can fail closed on it
287
+ // (a caller confirmation cannot substitute for intel that never existed).
288
+ pushCheck(checks, "token_security_intel_missing", "unknown", "Token security intelligence is unavailable (provider outage or token not indexed); the token was NOT reviewed.", reasons, requiredActions, undefined, "Retry when the token-security provider is reachable, or verify the token independently before executing.");
289
+ }
290
+ else if (input.tokenSecurityStatus === "unknown") {
291
+ pushCheck(checks, "token_security_provider", "unknown", "Token security provider is unavailable or unknown.", reasons, requiredActions, undefined, "Proceed only after manual token review.");
292
+ }
293
+ // ─── Advisory risk-engine evidence (write paths) ─────────────────────
294
+ // The risk engine never gates execution itself: its output arrives here as
295
+ // evidence and these checks are where the score/degradation actually decide.
296
+ if (input.risk) {
297
+ const risk = input.risk;
298
+ if (risk.score > RISK_BLOCK_THRESHOLD) {
299
+ pushCheck(checks, "risk_score", "fail", `Weighted risk score ${risk.score}/100 exceeds the block threshold (${RISK_BLOCK_THRESHOLD}).`, reasons, requiredActions, `Risk score ${risk.score}/100 exceeds the block threshold (${RISK_BLOCK_THRESHOLD}).`, "Review the risk reasons and adjust the transaction parameters significantly before retrying.");
300
+ }
301
+ else {
302
+ pushCheck(checks, "risk_score", "pass", `Weighted risk score ${risk.score}/100 is within the block threshold (${RISK_BLOCK_THRESHOLD}).`);
303
+ }
304
+ if (typeof risk.counterpartyRisk === "number" && risk.counterpartyRisk >= COUNTERPARTY_CRITICAL_THRESHOLD) {
305
+ pushCheck(checks, "risk_counterparty", "fail", `Counterparty risk ${risk.counterpartyRisk}/100 is critical (≥ ${COUNTERPARTY_CRITICAL_THRESHOLD}): missing, invalid, or zero-address counterparty.`, reasons, requiredActions, "Critically risky counterparty (missing/invalid/zero recipient).", "Provide a valid, verified counterparty address.");
306
+ }
307
+ else if (typeof risk.counterpartyRisk === "number") {
308
+ pushCheck(checks, "risk_counterparty", "pass", `Counterparty risk ${risk.counterpartyRisk}/100 is below the critical threshold (${COUNTERPARTY_CRITICAL_THRESHOLD}).`);
309
+ }
310
+ if (risk.degraded) {
311
+ let detail = (risk.degradedReasons ?? []).join(" ") || "A critical risk signal could not be evaluated.";
312
+ if (risk.swapProviderNotConfigured && !detail.includes("SWAP_LIQUIDITY_NOT_CONFIGURED")) {
313
+ detail += " The swap liquidity provider is not configured for this chain (SWAP_LIQUIDITY_NOT_CONFIGURED), a permanent configuration state, not a transient outage.";
314
+ }
315
+ pushCheck(checks, "risk_degraded", "unknown", `Risk assessment is degraded: ${detail}`, reasons, requiredActions, undefined, "Re-invoke with confirm=true only after manually reviewing the degraded risk data.");
316
+ // Unknown-status checks do not populate `reasons`; surface the degradation
317
+ // detail there anyway so the CONFIRMATION_REQUIRED envelope explains itself
318
+ // (parity with the former tool-level degraded message).
319
+ reasons.push(`Risk assessment is degraded: ${detail}`);
320
+ }
321
+ else {
322
+ pushCheck(checks, "risk_degraded", "pass", "No critical risk signal was missing during assessment.");
323
+ }
177
324
  }
178
325
  const riskLevel = classifyRisk(checks);
179
326
  let decision = defaultDecision(riskLevel, checks);
180
- if (checks.some((c) => c.name.includes("funding") && c.status === "fail"))
327
+ // Soft, recoverable signals must NEVER downgrade a hard BLOCK. Only remap when
328
+ // the block is *solely* a funding shortfall (fundable) or when no hard fail
329
+ // exists at all (token-security unresolved → review before proceeding).
330
+ const hardFails = checks.filter((c) => c.status === "fail");
331
+ const onlyFundingFails = hardFails.length > 0 && hardFails.every((c) => c.name.includes("funding"));
332
+ const hasTokenUnknown = checks.some((c) => c.name.includes("token") && c.status === "unknown");
333
+ if (decision === "BLOCK" && onlyFundingFails) {
181
334
  decision = "REQUIRE_FUNDING";
182
- if (checks.some((c) => c.name.includes("token") && c.status === "unknown"))
335
+ }
336
+ else if (decision !== "BLOCK" && hasTokenUnknown) {
183
337
  decision = "REQUIRE_TOKEN_REVIEW";
338
+ }
184
339
  return {
185
340
  decision,
186
341
  riskLevel,
@@ -193,9 +348,15 @@ export function evaluateActionPolicy(input) {
193
348
  isMainnet,
194
349
  };
195
350
  }
351
+ /** Network-aware phrase for explanations — never hardcodes a single network. */
352
+ function networkPhrase(isMainnet) {
353
+ if (typeof isMainnet !== "boolean")
354
+ return "the Pharos network";
355
+ return isMainnet ? "Pharos Pacific Mainnet" : "Pharos Atlantic Testnet";
356
+ }
196
357
  export function explainPolicyResult(result) {
197
358
  if (result.decision === "ALLOW") {
198
- return "This action was allowed because it targets Pharos Atlantic Testnet, passed policy checks, and stayed within configured safety limits.";
359
+ return `This action was allowed because it targets ${networkPhrase(result.isMainnet)}, passed policy checks, and stayed within configured safety limits.`;
199
360
  }
200
361
  const reasonText = result.reasons.length > 0 ? result.reasons.join(" ") : "one or more safety checks failed or require review.";
201
362
  const actionText = result.requiredActions.length > 0 ? ` SafeHands recommends: ${result.requiredActions.join(" ")}` : "";
@@ -1 +1 @@
1
- {"version":3,"file":"actionPolicyEngine.js","sourceRoot":"","sources":["../../../src/lib/policy/actionPolicyEngine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"actionPolicyEngine.js","sourceRoot":"","sources":["../../../src/lib/policy/actionPolicyEngine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export type PolicyProfile = "conservative" | "balanced" | "advanced" | "custom";
2
+ export interface AgentPolicyLimits {
3
+ maxPaymentPROS: string;
4
+ maxSwapPROS: string;
5
+ maxDailySpendPROS: string;
6
+ maxX402PaymentUSDC: string;
7
+ maxApprovalUSDC: string;
8
+ }
9
+ export interface AgentPolicyFlags {
10
+ allowUnknownTokens: boolean;
11
+ allowCustomContractCalls: boolean;
12
+ requireConfirmationAboveRisk: "LOW" | "MEDIUM" | "HIGH" | "CRITICAL";
13
+ }
14
+ export interface AgentPolicy {
15
+ profile: PolicyProfile;
16
+ limits: AgentPolicyLimits;
17
+ flags: AgentPolicyFlags;
18
+ }
19
+ export declare const POLICY_PROFILES: Record<Exclude<PolicyProfile, "custom">, AgentPolicy>;
20
+ export declare function isSafeAgentId(agentId: string): boolean;
21
+ export declare function loadAgentPolicy(agentId?: string): AgentPolicy;
22
+ export declare function saveAgentPolicy(agentId: string, policy: AgentPolicy): void;
23
+ export declare function resolveEffectiveLimits(policy: AgentPolicy): {
24
+ maxPaymentPROS: number;
25
+ maxSwapPROS: number;
26
+ maxX402PaymentUSDC: number;
27
+ maxApprovalUSDC: number;
28
+ };
29
+ //# sourceMappingURL=agentPolicy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentPolicy.d.ts","sourceRoot":"","sources":["../../../src/lib/policy/agentPolicy.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEhF,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,wBAAwB,EAAE,OAAO,CAAC;IAClC,4BAA4B,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;CACtE;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,KAAK,EAAE,gBAAgB,CAAC;CACzB;AAED,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,QAAQ,CAAC,EAAE,WAAW,CA8CjF,CAAC;AAUF,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEtD;AAqDD,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW,CAsB7D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAI1E;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,WAAW,GAClB;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CAOtG"}
@@ -0,0 +1,154 @@
1
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
2
+ import { join, dirname } from "path";
3
+ import { fileURLToPath } from "url";
4
+ export const POLICY_PROFILES = {
5
+ conservative: {
6
+ profile: "conservative",
7
+ limits: {
8
+ maxPaymentPROS: "0.1",
9
+ maxSwapPROS: "1",
10
+ maxDailySpendPROS: "5",
11
+ maxX402PaymentUSDC: "0.01",
12
+ maxApprovalUSDC: "10",
13
+ },
14
+ flags: {
15
+ allowUnknownTokens: false,
16
+ allowCustomContractCalls: false,
17
+ requireConfirmationAboveRisk: "LOW",
18
+ },
19
+ },
20
+ balanced: {
21
+ profile: "balanced",
22
+ limits: {
23
+ maxPaymentPROS: "1",
24
+ maxSwapPROS: "10",
25
+ maxDailySpendPROS: "25",
26
+ maxX402PaymentUSDC: "0.1",
27
+ maxApprovalUSDC: "50",
28
+ },
29
+ flags: {
30
+ allowUnknownTokens: false,
31
+ allowCustomContractCalls: false,
32
+ requireConfirmationAboveRisk: "MEDIUM",
33
+ },
34
+ },
35
+ advanced: {
36
+ profile: "advanced",
37
+ limits: {
38
+ maxPaymentPROS: "100",
39
+ maxSwapPROS: "1000",
40
+ maxDailySpendPROS: "5000",
41
+ maxX402PaymentUSDC: "1",
42
+ maxApprovalUSDC: "500",
43
+ },
44
+ flags: {
45
+ allowUnknownTokens: true,
46
+ allowCustomContractCalls: true,
47
+ requireConfirmationAboveRisk: "HIGH",
48
+ },
49
+ },
50
+ };
51
+ function getPoliciesDir() {
52
+ const __dirname = dirname(fileURLToPath(import.meta.url));
53
+ return join(__dirname, "..", "..", "..", ".agents", "policies");
54
+ }
55
+ // agentId becomes a filename — it must NEVER be able to traverse out of the
56
+ // policies directory. Reject path separators and `..` before it touches the FS.
57
+ const SAFE_AGENT_ID = /^[A-Za-z0-9_.:-]+$/;
58
+ export function isSafeAgentId(agentId) {
59
+ return SAFE_AGENT_ID.test(agentId) && !agentId.includes("..");
60
+ }
61
+ function policyPath(agentId) {
62
+ if (!isSafeAgentId(agentId)) {
63
+ throw new Error(`Invalid agentId '${agentId}': only letters, digits and _ . : - are allowed (no path separators or '..').`);
64
+ }
65
+ return join(getPoliciesDir(), `${agentId}.json`);
66
+ }
67
+ function validatePolicy(raw) {
68
+ if (!raw || typeof raw !== "object")
69
+ return null;
70
+ const obj = raw;
71
+ const profile = obj.profile;
72
+ if (typeof profile !== "string")
73
+ return null;
74
+ if (!["conservative", "balanced", "advanced", "custom"].includes(profile))
75
+ return null;
76
+ const limits = obj.limits;
77
+ if (!limits || typeof limits !== "object")
78
+ return null;
79
+ const l = limits;
80
+ for (const key of ["maxPaymentPROS", "maxSwapPROS", "maxDailySpendPROS", "maxX402PaymentUSDC", "maxApprovalUSDC"]) {
81
+ if (typeof l[key] !== "string")
82
+ return null;
83
+ const n = Number(l[key]);
84
+ if (!Number.isFinite(n) || n < 0)
85
+ return null;
86
+ }
87
+ const flags = obj.flags;
88
+ if (!flags || typeof flags !== "object")
89
+ return null;
90
+ const f = flags;
91
+ if (typeof f.allowUnknownTokens !== "boolean")
92
+ return null;
93
+ if (typeof f.allowCustomContractCalls !== "boolean")
94
+ return null;
95
+ if (typeof f.requireConfirmationAboveRisk !== "string")
96
+ return null;
97
+ if (!["LOW", "MEDIUM", "HIGH", "CRITICAL"].includes(f.requireConfirmationAboveRisk))
98
+ return null;
99
+ return {
100
+ profile: profile,
101
+ limits: l,
102
+ flags: f,
103
+ };
104
+ }
105
+ /**
106
+ * Fail-closed fallback: a policy file that EXISTS but is malformed or
107
+ * invalid must never silently degrade to the more permissive `balanced`
108
+ * profile (a typo in a conservative custom policy would otherwise 10× the
109
+ * per-tx limits). Warn the operator and pin the most restrictive profile.
110
+ */
111
+ function invalidPolicyFallback(label, path) {
112
+ console.warn(`[SafeHands policy] ${label} policy file exists but is malformed or invalid; falling back to the 'conservative' profile (fail-closed). Fix ${path} to restore the intended limits.`);
113
+ return POLICY_PROFILES.conservative;
114
+ }
115
+ export function loadAgentPolicy(agentId) {
116
+ if (agentId && isSafeAgentId(agentId)) {
117
+ const specific = policyPath(agentId);
118
+ if (existsSync(specific)) {
119
+ try {
120
+ const parsed = validatePolicy(JSON.parse(readFileSync(specific, "utf-8")));
121
+ if (parsed)
122
+ return parsed;
123
+ }
124
+ catch { /* malformed JSON — fail closed below */ }
125
+ return invalidPolicyFallback(`Agent '${agentId}'`, specific);
126
+ }
127
+ }
128
+ const defaultPath = policyPath("default");
129
+ if (existsSync(defaultPath)) {
130
+ try {
131
+ const parsed = validatePolicy(JSON.parse(readFileSync(defaultPath, "utf-8")));
132
+ if (parsed)
133
+ return parsed;
134
+ }
135
+ catch { /* malformed JSON — fail closed below */ }
136
+ return invalidPolicyFallback("Default", defaultPath);
137
+ }
138
+ return POLICY_PROFILES.balanced;
139
+ }
140
+ export function saveAgentPolicy(agentId, policy) {
141
+ const dir = getPoliciesDir();
142
+ if (!existsSync(dir))
143
+ mkdirSync(dir, { recursive: true });
144
+ writeFileSync(policyPath(agentId), JSON.stringify(policy, null, 2), "utf-8");
145
+ }
146
+ export function resolveEffectiveLimits(policy) {
147
+ return {
148
+ maxPaymentPROS: Number(policy.limits.maxPaymentPROS),
149
+ maxSwapPROS: Number(policy.limits.maxSwapPROS),
150
+ maxX402PaymentUSDC: Number(policy.limits.maxX402PaymentUSDC),
151
+ maxApprovalUSDC: Number(policy.limits.maxApprovalUSDC),
152
+ };
153
+ }
154
+ //# sourceMappingURL=agentPolicy.js.map