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
@@ -0,0 +1,43 @@
1
+ import type { GuardianDecision } from "../lib/guardian/decision.js";
2
+ import type { AnalyzerRiskLevel } from "../lib/analysis/index.js";
3
+ import type { AgentIntent, AgentRequest } from "./agentIntentClassifier.js";
4
+ import type { RoutedResult } from "./agentToolRouter.js";
5
+ import type { PolicyOutcome } from "./agentPolicyResolver.js";
6
+ import { type CallerObligation } from "./agentRuntime.js";
7
+ export interface AgentDecision {
8
+ intent: AgentIntent;
9
+ /** Public four-value SafeHands decision. */
10
+ decision: GuardianDecision;
11
+ riskLevel: AnalyzerRiskLevel;
12
+ summary: string;
13
+ reasons: string[];
14
+ recommendedAction: string;
15
+ /** Raw analyzer/handler output + any supporting evidence. */
16
+ evidence: unknown;
17
+ /** Always true — the agent never writes, signs, sends, or publishes. */
18
+ readOnly: true;
19
+ /** False by default (mainnet execution disabled + gates off). */
20
+ executionAvailable: boolean;
21
+ nextStep: string;
22
+ callerObligation: CallerObligation;
23
+ /** Which capability produced the verdict. */
24
+ tool: string;
25
+ /** The applied policy preset — or null when none was selected. */
26
+ policyPreset: string | null;
27
+ /** Policy semantics version — surfaced, never secret. */
28
+ policyVersion: string;
29
+ experimental?: boolean;
30
+ }
31
+ export interface FormatArgs {
32
+ intent: AgentIntent;
33
+ req: AgentRequest;
34
+ routed: RoutedResult;
35
+ policyOutcome: PolicyOutcome;
36
+ executionAvailable: boolean;
37
+ /** The applied policy preset name. */
38
+ policyPreset?: string;
39
+ /** The real market/security/chain evidence from the Enrich step. */
40
+ enrichment?: any;
41
+ }
42
+ export declare function formatDecision(args: FormatArgs): AgentDecision;
43
+ //# sourceMappingURL=agentDecisionFormatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentDecisionFormatter.d.ts","sourceRoot":"","sources":["../../src/agent/agentDecisionFormatter.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAKlE,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGzE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,WAAW,CAAC;IACpB,4CAA4C;IAC5C,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,SAAS,EAAE,iBAAiB,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,6DAA6D;IAC7D,QAAQ,EAAE,OAAO,CAAC;IAClB,wEAAwE;IACxE,QAAQ,EAAE,IAAI,CAAC;IACf,iEAAiE;IACjE,kBAAkB,EAAE,OAAO,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,yDAAyD;IACzD,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AA2BD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,WAAW,CAAC;IACpB,GAAG,EAAE,YAAY,CAAC;IAClB,MAAM,EAAE,YAAY,CAAC;IACrB,aAAa,EAAE,aAAa,CAAC;IAC7B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,UAAU,CAAC,EAAE,GAAG,CAAC;CAClB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,aAAa,CA0D9D"}
@@ -0,0 +1,96 @@
1
+ // ─── SafeHands Agent — Decision Formatter (read-only) ─────────
2
+ // Shapes the final AgentDecision from the routed analyzer output + policy
3
+ // outcome. Applies the PREPARE_ONLY rule (an ALLOW execution-intent becomes
4
+ // PREPARE_ONLY when execution is unavailable — the default) and derives the
5
+ // caller obligation, recommended action, and next step. Pure: no execution.
6
+ // ────────────────────────────────────────────────────────────────────────
7
+ import { tokenRegistryEvidence } from "../lib/analysis/pharosTokens.js";
8
+ import { rpcEvidence, gasEvidence } from "../lib/pharos/rpcEvidence.js";
9
+ import { ecosystemEvidenceForRequest, applyEcosystemEscalation } from "../lib/pharos/ecosystemEvidence.js";
10
+ import { getActiveNetwork } from "../lib/networks.js";
11
+ import { obligationFor } from "./agentRuntime.js";
12
+ import { POLICY_VERSION } from "../lib/policy/policyPresets.js";
13
+ /** Intents that represent an action the caller intends to EXECUTE. */
14
+ const EXECUTION_INTENTS = new Set([
15
+ "native_transfer",
16
+ "raw_transaction_intent",
17
+ "unknown_contract_call",
18
+ "erc20_approval",
19
+ "permit2_approval",
20
+ "safe_transaction",
21
+ "x402_payment_request",
22
+ ]);
23
+ const RECOMMENDED = {
24
+ ALLOW: "Proceed: no blocking risk found. SafeHands does not execute; the caller executes externally.",
25
+ BLOCK: "Do not execute: the action is unsafe and must be aborted.",
26
+ REQUIRE_CONFIRMATION: "Obtain explicit user/admin confirmation before any execution.",
27
+ PREPARE_ONLY: "Prepare or hand off only: execution is disabled here; do not execute.",
28
+ };
29
+ const NEXT_STEP = {
30
+ ALLOW: "Execute externally with your own signer (SafeHands holds no keys).",
31
+ BLOCK: "Abort the action and surface the block reason to the user/agent.",
32
+ REQUIRE_CONFIRMATION: "Pause and request explicit confirmation from the user or admin.",
33
+ PREPARE_ONLY: "Return a prepared/handoff action for external execution; do not execute here.",
34
+ };
35
+ export function formatDecision(args) {
36
+ const { intent, req, routed, policyOutcome, executionAvailable, enrichment } = args;
37
+ let decision = policyOutcome.decision;
38
+ const reasons = [...routed.reasons, ...policyOutcome.reasons, ...policyOutcome.notes];
39
+ // Ecosystem awareness: classify the target/intent against the Pharos ecosystem
40
+ // registry. ESCALATE-ONLY — cross-chain / WASM-interop intents become
41
+ // REQUIRE_CONFIRMATION; ecosystem evidence NEVER relaxes a decision or makes a
42
+ // risky action safe (a BLOCK stays a BLOCK).
43
+ const ecosystemEvidence = ecosystemEvidenceForRequest(req);
44
+ const escalated = applyEcosystemEscalation(decision, ecosystemEvidence);
45
+ if (escalated !== decision) {
46
+ decision = escalated;
47
+ reasons.push(`Ecosystem awareness (${ecosystemEvidence.category}): ${ecosystemEvidence.safehandsBehavior}`);
48
+ }
49
+ // PREPARE_ONLY: a safe execution-intent the caller cannot execute here.
50
+ if (decision === "ALLOW" && !executionAvailable && EXECUTION_INTENTS.has(intent)) {
51
+ decision = "PREPARE_ONLY";
52
+ reasons.push("Action is safe but execution is disabled by default: prepare-only (no execution here).");
53
+ }
54
+ // Optional supporting evidence: token-registry status for token-bearing intents,
55
+ // plus read-only RPC + gas capability evidence (deterministic, secret-free).
56
+ const evidence = { analyzer: routed.evidence };
57
+ const tokenRef = req.token ?? (intent === "contract_check" ? req.address ?? req.to : undefined);
58
+ if (tokenRef) {
59
+ try {
60
+ evidence.tokenRegistry = tokenRegistryEvidence(tokenRef, getActiveNetwork());
61
+ }
62
+ catch {
63
+ /* evidence is best-effort */
64
+ }
65
+ }
66
+ evidence.rpcEvidence = rpcEvidence(getActiveNetwork());
67
+ evidence.gasEvidence = gasEvidence();
68
+ evidence.ecosystemEvidence = ecosystemEvidence;
69
+ if (enrichment)
70
+ evidence.enrichment = enrichment;
71
+ const summary = buildSummary(intent, decision, routed, reasons);
72
+ return {
73
+ intent,
74
+ decision,
75
+ riskLevel: routed.riskLevel,
76
+ summary,
77
+ reasons,
78
+ recommendedAction: RECOMMENDED[decision],
79
+ evidence,
80
+ readOnly: true,
81
+ executionAvailable,
82
+ nextStep: NEXT_STEP[decision],
83
+ callerObligation: obligationFor(decision).obligation,
84
+ tool: routed.tool,
85
+ policyPreset: args.policyPreset ?? null,
86
+ policyVersion: POLICY_VERSION,
87
+ experimental: routed.experimental,
88
+ };
89
+ }
90
+ function buildSummary(intent, decision, routed, reasons) {
91
+ const head = `SafeHands → ${decision} for ${intent.replace(/_/g, " ")}`;
92
+ const why = reasons[0] ?? routed.reasons[0] ?? "No additional detail.";
93
+ const exp = routed.experimental ? " (experimental decode)" : "";
94
+ return `${head}${exp}. ${why}`;
95
+ }
96
+ //# sourceMappingURL=agentDecisionFormatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentDecisionFormatter.js","sourceRoot":"","sources":["../../src/agent/agentDecisionFormatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { AgentRequest } from "./agentIntentClassifier.js";
2
+ export interface Enrichment {
3
+ enriched: boolean;
4
+ network: string;
5
+ /** SafeHands on-chain reputation for the action target (from SafeHandsRegistry). */
6
+ onChainReputation?: {
7
+ target: string;
8
+ currentMerkleRoot: string | null;
9
+ hasL2BatchRecord: boolean;
10
+ isAuthorizedAgent: boolean;
11
+ /** Count of SafeHands-verified safe broadcasts attributed to the target (0 = no track record yet → neutral). */
12
+ verifiedActionCount: number;
13
+ /** Unix seconds of the target's most recent verified action (0 = none yet). */
14
+ lastVerifiedActionAt: number;
15
+ };
16
+ /** Live gas context from the active network. */
17
+ gas?: {
18
+ gasPriceGwei: number;
19
+ };
20
+ /** Profile of the action target (contract vs EOA, native PROS balance). */
21
+ targetProfile?: {
22
+ isContract: boolean;
23
+ nativeBalancePROS: string;
24
+ };
25
+ notes: string[];
26
+ }
27
+ export declare function enrich(req: AgentRequest): Promise<Enrichment>;
28
+ //# sourceMappingURL=agentEnrich.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentEnrich.d.ts","sourceRoot":"","sources":["../../src/agent/agentEnrich.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AA2B/D,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,oFAAoF;IACpF,iBAAiB,CAAC,EAAE;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;QACjC,gBAAgB,EAAE,OAAO,CAAC;QAC1B,iBAAiB,EAAE,OAAO,CAAC;QAC3B,gHAAgH;QAChH,mBAAmB,EAAE,MAAM,CAAC;QAC5B,+EAA+E;QAC/E,oBAAoB,EAAE,MAAM,CAAC;KAC9B,CAAC;IACF,gDAAgD;IAChD,GAAG,CAAC,EAAE;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/B,2EAA2E;IAC3E,aAAa,CAAC,EAAE;QAAE,UAAU,EAAE,OAAO,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAE,CAAC;IACnE,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,wBAAsB,MAAM,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAkEnE"}
@@ -0,0 +1,99 @@
1
+ // ─── SafeHands Operator — Enrich step (read-only) ───────────────────────
2
+ // Composes REAL on-chain + market intelligence into the SafeHands verdict so a
3
+ // decision is data-backed, not just a static policy result. Best-effort: every
4
+ // enricher is wrapped so a failure (offline / RPC hiccup) only omits that signal
5
+ // — it never breaks the verdict. No signing, no writes.
6
+ //
7
+ // This enricher adds on-chain signals only (contract profile, SafeHands
8
+ // reputation oracle, gas). Token-security intelligence (GoPlus, queried live
9
+ // for Pharos by checkTokenSecurity) is applied separately in the check
10
+ // pipeline — it is not duplicated here.
11
+ // ────────────────────────────────────────────────────────────────────────
12
+ import { isAddress, formatGwei, formatEther } from "viem";
13
+ import { publicClient } from "../lib/pharosClient.js";
14
+ import { queryRegistryForTarget } from "../lib/safeHandsRegistry.js";
15
+ import { getAgentReputation } from "../lib/pharos/attestationPublisher.js";
16
+ import { getActiveNetwork } from "../lib/networks.js";
17
+ const DEFAULT_ENRICHMENT_TIMEOUT_MS = 4_000;
18
+ function getEnrichmentTimeoutMs() {
19
+ const parsed = Number.parseInt(process.env.SAFEHANDS_ENRICH_TIMEOUT_MS ?? "", 10);
20
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_ENRICHMENT_TIMEOUT_MS;
21
+ }
22
+ async function withEnrichmentTimeout(promise, label) {
23
+ const timeoutMs = getEnrichmentTimeoutMs();
24
+ let timer;
25
+ try {
26
+ return await Promise.race([
27
+ promise,
28
+ new Promise((_, reject) => {
29
+ timer = setTimeout(() => {
30
+ reject(new Error(`${label} timed out after ${timeoutMs}ms`));
31
+ }, timeoutMs);
32
+ }),
33
+ ]);
34
+ }
35
+ finally {
36
+ if (timer)
37
+ clearTimeout(timer);
38
+ }
39
+ }
40
+ export async function enrich(req) {
41
+ const notes = [];
42
+ const out = { enriched: false, network: getActiveNetwork().name, notes };
43
+ // 1. On-chain SafeHands reputation for the target (composable oracle).
44
+ const target = req.to ?? req.address ?? req.token;
45
+ if (target && isAddress(target)) {
46
+ try {
47
+ const [reg, rep] = await withEnrichmentTimeout(Promise.all([
48
+ queryRegistryForTarget(target),
49
+ getAgentReputation(target),
50
+ ]), "on-chain SafeHands reputation");
51
+ out.onChainReputation = {
52
+ target,
53
+ currentMerkleRoot: reg.currentMerkleRoot ?? null,
54
+ hasL2BatchRecord: reg.hasRiskRecord,
55
+ isAuthorizedAgent: reg.authorized,
56
+ verifiedActionCount: rep.verifiedCount,
57
+ lastVerifiedActionAt: rep.lastAttestationAt,
58
+ };
59
+ out.enriched = true;
60
+ if (rep.verifiedCount > 0) {
61
+ notes.push(`Target has ${rep.verifiedCount} SafeHands-verified on-chain action(s); positive track record.`);
62
+ }
63
+ if (reg.error)
64
+ notes.push(reg.error);
65
+ }
66
+ catch {
67
+ notes.push("on-chain SafeHands reputation unavailable");
68
+ }
69
+ }
70
+ // 2. Target profile: contract vs EOA + native balance (real on-chain reads).
71
+ if (target && isAddress(target)) {
72
+ try {
73
+ const [code, balance] = await withEnrichmentTimeout(Promise.all([
74
+ publicClient.getCode({ address: target }),
75
+ publicClient.getBalance({ address: target }),
76
+ ]), "target profile");
77
+ out.targetProfile = {
78
+ isContract: Boolean(code && code !== "0x"),
79
+ nativeBalancePROS: formatEther(balance),
80
+ };
81
+ out.enriched = true;
82
+ }
83
+ catch {
84
+ notes.push("target profile unavailable");
85
+ }
86
+ }
87
+ // 3. Live gas context.
88
+ try {
89
+ const gasPrice = await withEnrichmentTimeout(publicClient.getGasPrice(), "gas context");
90
+ out.gas = { gasPriceGwei: Number(formatGwei(gasPrice)) };
91
+ out.enriched = true;
92
+ }
93
+ catch {
94
+ notes.push("gas context unavailable");
95
+ }
96
+ notes.push("security signals in this enrichment are on-chain reads (contract profile + SafeHands reputation oracle); GoPlus token-security intelligence is applied separately by the token-security check");
97
+ return out;
98
+ }
99
+ //# sourceMappingURL=agentEnrich.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentEnrich.js","sourceRoot":"","sources":["../../src/agent/agentEnrich.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /** Canonical Permit2 singleton (lowercased). */
2
+ export declare const PERMIT2_ADDRESS = "0x000000000022d473030f116ddee9f6b43ac78ba3";
3
+ export type AgentIntent = "tx_hash_check" | "contract_check" | "raw_transaction_intent" | "erc20_approval" | "permit2_approval" | "safe_transaction" | "x402_payment_request" | "native_transfer" | "unknown_contract_call" | "policy_question" | "risk_explanation";
4
+ /** A request to the SafeHands Agent. Every field optional — the agent decides. */
5
+ export interface AgentRequest {
6
+ /** Free-text question (used for policy/risk-explanation intents). */
7
+ text?: string;
8
+ /** Transaction target. */
9
+ to?: string;
10
+ /** Calldata, e.g. 0x095ea7b3… */
11
+ data?: string;
12
+ /** Value in wei (decimal or 0x-hex string). */
13
+ value?: string;
14
+ /** Existing transaction hash to inspect. */
15
+ txHash?: string;
16
+ /** Explicit contract address to vet (contract_check). */
17
+ address?: string;
18
+ /** Token contract an approval targets. */
19
+ token?: string;
20
+ /** x402 resource URL. */
21
+ url?: string;
22
+ paymentAmountUsdc?: string;
23
+ paymentTokenAddress?: string;
24
+ payTo?: string;
25
+ agentId?: string;
26
+ network?: string;
27
+ chainId?: number;
28
+ /** Optional ecosystem provider hint (e.g. "LayerZero") — evidence only. */
29
+ provider?: string;
30
+ /** Optional ecosystem category hint (e.g. "cross_chain") — evidence only. */
31
+ ecosystemCategory?: string;
32
+ /** Optional explicit override of the classification. */
33
+ inputType?: AgentIntent;
34
+ }
35
+ export interface IntentResult {
36
+ intent: AgentIntent;
37
+ /** 0..1 — 1.0 for unambiguous structural matches, lower for text heuristics. */
38
+ confidence: number;
39
+ /** Human-readable signals that led to the classification. */
40
+ signals: string[];
41
+ }
42
+ /** Classify a request into a SafeHands intent. Deterministic and offline. */
43
+ export declare function classifyIntent(req: AgentRequest): IntentResult;
44
+ //# sourceMappingURL=agentIntentClassifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentIntentClassifier.d.ts","sourceRoot":"","sources":["../../src/agent/agentIntentClassifier.ts"],"names":[],"mappings":"AASA,gDAAgD;AAChD,eAAO,MAAM,eAAe,+CAA+C,CAAC;AAI5E,MAAM,MAAM,WAAW,GACnB,eAAe,GACf,gBAAgB,GAChB,wBAAwB,GACxB,gBAAgB,GAChB,kBAAkB,GAClB,kBAAkB,GAClB,sBAAsB,GACtB,iBAAiB,GACjB,uBAAuB,GACvB,iBAAiB,GACjB,kBAAkB,CAAC;AAEvB,kFAAkF;AAClF,MAAM,WAAW,YAAY;IAC3B,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0BAA0B;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,iCAAiC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,wDAAwD;IACxD,SAAS,CAAC,EAAE,WAAW,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,CAAC;IACpB,gFAAgF;IAChF,UAAU,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAgBD,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,GAAG,EAAE,YAAY,GAAG,YAAY,CAyD9D"}
@@ -0,0 +1,77 @@
1
+ // ─── SafeHands Agent — Intent Classifier (read-only) ──────────
2
+ // Deterministic, offline classification of a user/agent request into one of the
3
+ // supported SafeHands intents. Pure: no RPC, no keys, no side effects. The
4
+ // classifier only *labels* a request — it never executes anything.
5
+ // ────────────────────────────────────────────────────────────────────────
6
+ import { APPROVE_SELECTOR } from "../lib/analysis/approval.js";
7
+ import { MULTISEND_SELECTOR, SAFE_EXEC_SELECTOR } from "../lib/analysis/safeTx.js";
8
+ /** Canonical Permit2 singleton (lowercased). */
9
+ export const PERMIT2_ADDRESS = "0x000000000022d473030f116ddee9f6b43ac78ba3";
10
+ /** Permit2.approve(token,spender,amount,expiration) selector. */
11
+ const PERMIT2_APPROVE_SELECTOR = "0x87517c45";
12
+ function selectorOf(data) {
13
+ if (!data || !data.startsWith("0x") || data.length < 10)
14
+ return null;
15
+ return data.slice(0, 10).toLowerCase();
16
+ }
17
+ function valuePositive(value) {
18
+ if (value === undefined)
19
+ return false;
20
+ try {
21
+ return BigInt(value) > 0n;
22
+ }
23
+ catch {
24
+ return false;
25
+ }
26
+ }
27
+ /** Classify a request into a SafeHands intent. Deterministic and offline. */
28
+ export function classifyIntent(req) {
29
+ if (req.inputType) {
30
+ return { intent: req.inputType, confidence: 1, signals: ["explicit inputType override"] };
31
+ }
32
+ const selector = selectorOf(req.data);
33
+ const hasValue = valuePositive(req.value);
34
+ const lowerTo = (req.to ?? req.token ?? "").toLowerCase();
35
+ if (req.txHash) {
36
+ return { intent: "tx_hash_check", confidence: 1, signals: ["txHash present"] };
37
+ }
38
+ if (req.url || req.paymentAmountUsdc !== undefined) {
39
+ return { intent: "x402_payment_request", confidence: 1, signals: ["x402 url/payment fields present"] };
40
+ }
41
+ if (selector) {
42
+ if (selector === APPROVE_SELECTOR || selector === PERMIT2_APPROVE_SELECTOR) {
43
+ if (selector === PERMIT2_APPROVE_SELECTOR || lowerTo === PERMIT2_ADDRESS) {
44
+ return { intent: "permit2_approval", confidence: 1, signals: ["Permit2 approval selector/target"] };
45
+ }
46
+ return { intent: "erc20_approval", confidence: 1, signals: ["ERC-20 approve selector"] };
47
+ }
48
+ if (selector === MULTISEND_SELECTOR || selector === SAFE_EXEC_SELECTOR) {
49
+ return { intent: "safe_transaction", confidence: 1, signals: ["Safe/MultiSend selector"] };
50
+ }
51
+ return {
52
+ intent: hasValue ? "raw_transaction_intent" : "unknown_contract_call",
53
+ confidence: 0.9,
54
+ signals: [hasValue ? "value-bearing call with unrecognized selector" : "unrecognized calldata selector"],
55
+ };
56
+ }
57
+ if (hasValue) {
58
+ return { intent: "native_transfer", confidence: 1, signals: ["positive value, no calldata"] };
59
+ }
60
+ if (req.address && !req.to) {
61
+ return { intent: "contract_check", confidence: 1, signals: ["explicit contract address"] };
62
+ }
63
+ const text = (req.text ?? "").toLowerCase();
64
+ if (text) {
65
+ if (/\bpolic(y|ies)\b|\blimit\b|\ballow ?list\b|\btrusted\b/.test(text)) {
66
+ return { intent: "policy_question", confidence: 0.7, signals: ["policy keywords in text"] };
67
+ }
68
+ if (/\bexplain\b|\bwhy\b|\bwhat does\b|\brisk\b|\bmean(s)?\b/.test(text)) {
69
+ return { intent: "risk_explanation", confidence: 0.7, signals: ["explanation keywords in text"] };
70
+ }
71
+ }
72
+ if (req.to) {
73
+ return { intent: "unknown_contract_call", confidence: 0.6, signals: ["target present, intent ambiguous"] };
74
+ }
75
+ return { intent: "unknown_contract_call", confidence: 0.3, signals: ["no actionable fields"] };
76
+ }
77
+ //# sourceMappingURL=agentIntentClassifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentIntentClassifier.js","sourceRoot":"","sources":["../../src/agent/agentIntentClassifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { GuardianDecision } from "../lib/guardian/decision.js";
2
+ import type { AgentIntent, AgentRequest } from "./agentIntentClassifier.js";
3
+ /** Who owns the policy. backend = the public default; the rest are advanced. */
4
+ export type PolicyOwner = "backend" | "user" | "dapp" | "agent";
5
+ export interface GuardianPolicy {
6
+ /** Max native transfer (wei) before confirmation is required. */
7
+ maxNativeTransferWei: string;
8
+ /** Max ERC-20 approval amount (raw token units) before confirmation. */
9
+ maxApprovalAmount: string;
10
+ /** Max single x402 payment (USDC) before confirmation. */
11
+ maxX402PaymentUsdc: string;
12
+ /** Max cumulative daily agent spend (USDC) — advisory ceiling. */
13
+ maxDailyAgentSpendUsdc: string;
14
+ /** Recipients exempt from the native-transfer confirmation (annotated, not relaxed past BLOCK). */
15
+ trustedRecipients: string[];
16
+ /** Spenders treated as known for approvals (annotation only). */
17
+ trustedSpenders: string[];
18
+ /** Escalate unlimited approvals to BLOCK even for known spenders. */
19
+ blockUnlimitedApproval: boolean;
20
+ /** Require confirmation for any unknown / unrecognized contract call. */
21
+ requireConfirmationForUnknownContract: boolean;
22
+ }
23
+ /** The public default backend policy (conservative, read-only). */
24
+ export declare const DEFAULT_BACKEND_POLICY: GuardianPolicy;
25
+ /** Merge owner defaults with explicit overrides. */
26
+ export declare function resolvePolicy(owner?: PolicyOwner, overrides?: Partial<GuardianPolicy>): GuardianPolicy;
27
+ export interface PolicyOutcome {
28
+ decision: GuardianDecision;
29
+ reasons: string[];
30
+ notes: string[];
31
+ escalated: boolean;
32
+ }
33
+ /**
34
+ * Apply policy to a base (analyzer) decision. Escalates severity only.
35
+ * @param analyzerDetails the primary analyzer's `details` object (read-only).
36
+ */
37
+ export declare function applyPolicy(args: {
38
+ base: GuardianDecision;
39
+ intent: AgentIntent;
40
+ req: AgentRequest;
41
+ policy: GuardianPolicy;
42
+ analyzerDetails?: Record<string, unknown>;
43
+ }): PolicyOutcome;
44
+ //# sourceMappingURL=agentPolicyResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentPolicyResolver.d.ts","sourceRoot":"","sources":["../../src/agent/agentPolicyResolver.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE5E,gFAAgF;AAChF,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEhE,MAAM,WAAW,cAAc;IAC7B,iEAAiE;IACjE,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wEAAwE;IACxE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,0DAA0D;IAC1D,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kEAAkE;IAClE,sBAAsB,EAAE,MAAM,CAAC;IAC/B,mGAAmG;IACnG,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,iEAAiE;IACjE,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,qEAAqE;IACrE,sBAAsB,EAAE,OAAO,CAAC;IAChC,yEAAyE;IACzE,qCAAqC,EAAE,OAAO,CAAC;CAChD;AAED,mEAAmE;AACnE,eAAO,MAAM,sBAAsB,EAAE,cASpC,CAAC;AAEF,oDAAoD;AACpD,wBAAgB,aAAa,CAAC,KAAK,GAAE,WAAuB,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,CAIjH;AASD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAWD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAChC,IAAI,EAAE,gBAAgB,CAAC;IACvB,MAAM,EAAE,WAAW,CAAC;IACpB,GAAG,EAAE,YAAY,CAAC;IAClB,MAAM,EAAE,cAAc,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C,GAAG,aAAa,CA+ChB"}
@@ -0,0 +1,94 @@
1
+ // ─── SafeHands Agent — Policy Resolver (read-only) ────────────
2
+ // Configurable SafeHands policy and an ESCALATE-ONLY enforcement step. Policy may
3
+ // only raise severity (ALLOW → REQUIRE_CONFIRMATION → BLOCK) or annotate — it can
4
+ // never relax a BLOCK or weaken an analyzer verdict. Pure: no RPC, no keys.
5
+ // ────────────────────────────────────────────────────────────────────────
6
+ import { isUnlimitedApprovalAmount } from "../lib/policy/actionPolicyEngine.js";
7
+ /** The public default backend policy (conservative, read-only). */
8
+ export const DEFAULT_BACKEND_POLICY = {
9
+ maxNativeTransferWei: "10000000000000000000", // 10 native
10
+ maxApprovalAmount: "1000000000000", // 1e12 raw units
11
+ maxX402PaymentUsdc: "1",
12
+ maxDailyAgentSpendUsdc: "100",
13
+ trustedRecipients: [],
14
+ trustedSpenders: [],
15
+ blockUnlimitedApproval: true,
16
+ requireConfirmationForUnknownContract: true,
17
+ };
18
+ /** Merge owner defaults with explicit overrides. */
19
+ export function resolvePolicy(owner = "backend", overrides) {
20
+ // Every owner currently starts from the conservative backend baseline.
21
+ void owner;
22
+ return { ...DEFAULT_BACKEND_POLICY, ...(overrides ?? {}) };
23
+ }
24
+ const SEVERITY = { BLOCK: 3, REQUIRE_CONFIRMATION: 2, PREPARE_ONLY: 1, ALLOW: 0 };
25
+ /** Return the more severe of two decisions (escalate-only). */
26
+ function escalate(current, to) {
27
+ return SEVERITY[to] > SEVERITY[current] ? to : current;
28
+ }
29
+ function bigintOrNull(v) {
30
+ if (typeof v !== "string" && typeof v !== "number" && typeof v !== "bigint")
31
+ return null;
32
+ try {
33
+ return BigInt(v);
34
+ }
35
+ catch {
36
+ return null;
37
+ }
38
+ }
39
+ /**
40
+ * Apply policy to a base (analyzer) decision. Escalates severity only.
41
+ * @param analyzerDetails the primary analyzer's `details` object (read-only).
42
+ */
43
+ export function applyPolicy(args) {
44
+ const { intent, req, policy } = args;
45
+ const details = args.analyzerDetails ?? {};
46
+ let decision = args.base;
47
+ const reasons = [];
48
+ const notes = [];
49
+ const before = decision;
50
+ if (intent === "native_transfer") {
51
+ const value = bigintOrNull(req.value);
52
+ const max = bigintOrNull(policy.maxNativeTransferWei);
53
+ const trusted = req.to && policy.trustedRecipients.map((r) => r.toLowerCase()).includes(req.to.toLowerCase());
54
+ if (trusted)
55
+ notes.push(`Recipient ${req.to} is in trustedRecipients.`);
56
+ if (value !== null && max !== null && value > max && !trusted) {
57
+ decision = escalate(decision, "REQUIRE_CONFIRMATION");
58
+ reasons.push(`Native transfer ${value} wei exceeds policy max ${policy.maxNativeTransferWei} wei.`);
59
+ }
60
+ }
61
+ else if (intent === "erc20_approval" || intent === "permit2_approval") {
62
+ const unlimited = details.unlimited === true || (typeof details.amountRaw === "string" && isUnlimitedApprovalAmount(details.amountRaw));
63
+ const spender = typeof details.spender === "string" ? details.spender : null;
64
+ const trusted = spender && policy.trustedSpenders.map((s) => s.toLowerCase()).includes(spender.toLowerCase());
65
+ if (trusted)
66
+ notes.push(`Spender ${spender} is in trustedSpenders.`);
67
+ if (unlimited && policy.blockUnlimitedApproval) {
68
+ decision = escalate(decision, "BLOCK");
69
+ reasons.push("Policy blocks unlimited approvals (blockUnlimitedApproval=true).");
70
+ }
71
+ const amount = bigintOrNull(details.amountRaw);
72
+ const max = bigintOrNull(policy.maxApprovalAmount);
73
+ if (!unlimited && amount !== null && max !== null && amount > max && !trusted) {
74
+ decision = escalate(decision, "REQUIRE_CONFIRMATION");
75
+ reasons.push(`Approval amount ${amount} exceeds policy max ${policy.maxApprovalAmount}.`);
76
+ }
77
+ }
78
+ else if (intent === "x402_payment_request") {
79
+ const amt = Number(details.paymentAmountUsdc ?? req.paymentAmountUsdc);
80
+ const max = Number(policy.maxX402PaymentUsdc);
81
+ if (Number.isFinite(amt) && Number.isFinite(max) && amt > max) {
82
+ decision = escalate(decision, "REQUIRE_CONFIRMATION");
83
+ reasons.push(`x402 payment ${amt} USDC exceeds policy max ${policy.maxX402PaymentUsdc} USDC.`);
84
+ }
85
+ }
86
+ else if (intent === "unknown_contract_call" || intent === "raw_transaction_intent") {
87
+ if (policy.requireConfirmationForUnknownContract) {
88
+ decision = escalate(decision, "REQUIRE_CONFIRMATION");
89
+ reasons.push("Policy requires confirmation for unknown/unrecognized contract calls.");
90
+ }
91
+ }
92
+ return { decision, reasons, notes, escalated: SEVERITY[decision] > SEVERITY[before] };
93
+ }
94
+ //# sourceMappingURL=agentPolicyResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentPolicyResolver.js","sourceRoot":"","sources":["../../src/agent/agentPolicyResolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { GuardianDecision } from "../lib/guardian/decision.js";
2
+ /** What the calling agent is obligated to do. */
3
+ export type CallerObligation = "proceed" | "stop" | "ask_user_or_admin" | "prepare_handoff_no_execute";
4
+ export interface ObligationSpec {
5
+ obligation: CallerObligation;
6
+ /** One-line caller responsibility. */
7
+ responsibility: string;
8
+ }
9
+ /** The public Agent-to-Agent contract, keyed by SafeHands decision. */
10
+ export declare const OBLIGATION_CONTRACT: Record<GuardianDecision, ObligationSpec>;
11
+ export declare function obligationFor(decision: GuardianDecision): ObligationSpec;
12
+ //# sourceMappingURL=agentRuntime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agentRuntime.d.ts","sourceRoot":"","sources":["../../src/agent/agentRuntime.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,iDAAiD;AACjD,MAAM,MAAM,gBAAgB,GACxB,SAAS,GACT,MAAM,GACN,mBAAmB,GACnB,4BAA4B,CAAC;AAEjC,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,gBAAgB,CAAC;IAC7B,sCAAsC;IACtC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,uEAAuE;AACvE,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,gBAAgB,EAAE,cAAc,CAiBxE,CAAC;AAEF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,gBAAgB,GAAG,cAAc,CAExE"}
@@ -0,0 +1,31 @@
1
+ // ─── SafeHands Agent — Runtime & Agent-to-Agent Contract ──────
2
+ // The A2A obligation contract: what a CALLING agent must do given a SafeHands
3
+ // decision. SafeHands only advises — it never executes. The caller is solely
4
+ // responsible for honoring the obligation. Leaf module: no value imports from
5
+ // the agent/formatter (keeps the module graph acyclic).
6
+ // ────────────────────────────────────────────────────────────────────────
7
+ /** The public Agent-to-Agent contract, keyed by SafeHands decision. */
8
+ export const OBLIGATION_CONTRACT = {
9
+ ALLOW: {
10
+ obligation: "proceed",
11
+ responsibility: "Caller MAY proceed. SafeHands found no blocking risk; the caller still executes externally.",
12
+ },
13
+ BLOCK: {
14
+ obligation: "stop",
15
+ responsibility: "Caller MUST stop. The action is unsafe and must not be executed.",
16
+ },
17
+ REQUIRE_CONFIRMATION: {
18
+ obligation: "ask_user_or_admin",
19
+ responsibility: "Caller MUST pause and obtain explicit user/admin confirmation before any execution.",
20
+ },
21
+ PREPARE_ONLY: {
22
+ obligation: "prepare_handoff_no_execute",
23
+ responsibility: "Caller MUST NOT execute. It may only prepare/hand off the action; execution is disabled here.",
24
+ },
25
+ };
26
+ export function obligationFor(decision) {
27
+ return OBLIGATION_CONTRACT[decision];
28
+ }
29
+ // NOTE: the former describeObligation / GuardianAgentLike / runScenario exports
30
+ // were removed as dead code — no consumer in src/, test/, or scripts/ used them.
31
+ //# sourceMappingURL=agentRuntime.js.map