safehands-pharos 1.5.0 → 2.6.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 (561) 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/index.d.ts +0 -0
  117. package/dist/index.d.ts.map +0 -0
  118. package/dist/index.js +212 -135
  119. package/dist/index.js.map +1 -1
  120. package/dist/init.d.ts +0 -0
  121. package/dist/init.d.ts.map +1 -1
  122. package/dist/init.js +72 -10
  123. package/dist/init.js.map +1 -1
  124. package/dist/lib/analysis/approval.d.ts +29 -0
  125. package/dist/lib/analysis/approval.d.ts.map +1 -0
  126. package/dist/lib/analysis/approval.js +162 -0
  127. package/dist/lib/analysis/approval.js.map +1 -0
  128. package/dist/lib/analysis/calldata.d.ts +60 -0
  129. package/dist/lib/analysis/calldata.d.ts.map +1 -0
  130. package/dist/lib/analysis/calldata.js +349 -0
  131. package/dist/lib/analysis/calldata.js.map +1 -0
  132. package/dist/lib/analysis/contractIntel.d.ts +65 -0
  133. package/dist/lib/analysis/contractIntel.d.ts.map +1 -0
  134. package/dist/lib/analysis/contractIntel.js +320 -0
  135. package/dist/lib/analysis/contractIntel.js.map +1 -0
  136. package/dist/lib/analysis/evm.d.ts +42 -0
  137. package/dist/lib/analysis/evm.d.ts.map +1 -0
  138. package/dist/lib/analysis/evm.js +185 -0
  139. package/dist/lib/analysis/evm.js.map +1 -0
  140. package/dist/lib/analysis/gas.d.ts +4 -0
  141. package/dist/lib/analysis/gas.d.ts.map +1 -0
  142. package/dist/lib/analysis/gas.js +13 -0
  143. package/dist/lib/analysis/gas.js.map +1 -0
  144. package/dist/lib/analysis/index.d.ts +11 -0
  145. package/dist/lib/analysis/index.d.ts.map +1 -0
  146. package/dist/lib/analysis/index.js +16 -0
  147. package/dist/lib/analysis/index.js.map +1 -0
  148. package/dist/lib/analysis/pharosTokens.d.ts +31 -0
  149. package/dist/lib/analysis/pharosTokens.d.ts.map +1 -0
  150. package/dist/lib/analysis/pharosTokens.js +78 -0
  151. package/dist/lib/analysis/pharosTokens.js.map +1 -0
  152. package/dist/lib/analysis/safeTx.d.ts +27 -0
  153. package/dist/lib/analysis/safeTx.d.ts.map +1 -0
  154. package/dist/lib/analysis/safeTx.js +118 -0
  155. package/dist/lib/analysis/safeTx.js.map +1 -0
  156. package/dist/lib/analysis/token.d.ts +21 -0
  157. package/dist/lib/analysis/token.d.ts.map +1 -0
  158. package/dist/lib/analysis/token.js +151 -0
  159. package/dist/lib/analysis/token.js.map +1 -0
  160. package/dist/lib/analysis/types.d.ts +49 -0
  161. package/dist/lib/analysis/types.d.ts.map +1 -0
  162. package/dist/lib/analysis/types.js +10 -0
  163. package/dist/lib/analysis/types.js.map +1 -0
  164. package/dist/lib/analysis/x402.d.ts +24 -0
  165. package/dist/lib/analysis/x402.d.ts.map +1 -0
  166. package/dist/lib/analysis/x402.js +60 -0
  167. package/dist/lib/analysis/x402.js.map +1 -0
  168. package/dist/lib/auditLog.d.ts +1 -0
  169. package/dist/lib/auditLog.d.ts.map +1 -1
  170. package/dist/lib/auditLog.js +0 -0
  171. package/dist/lib/auditLog.js.map +1 -1
  172. package/dist/lib/config.d.ts +77 -0
  173. package/dist/lib/config.d.ts.map +1 -0
  174. package/dist/lib/config.js +120 -0
  175. package/dist/lib/config.js.map +1 -0
  176. package/dist/lib/constants.d.ts +246 -97
  177. package/dist/lib/constants.d.ts.map +1 -1
  178. package/dist/lib/constants.js +334 -127
  179. package/dist/lib/constants.js.map +1 -1
  180. package/dist/lib/dodoApi.d.ts +26 -3
  181. package/dist/lib/dodoApi.d.ts.map +1 -1
  182. package/dist/lib/dodoApi.js +80 -17
  183. package/dist/lib/dodoApi.js.map +1 -1
  184. package/dist/lib/ecosystemRegistry.d.ts +116 -0
  185. package/dist/lib/ecosystemRegistry.d.ts.map +1 -0
  186. package/dist/lib/ecosystemRegistry.js +178 -0
  187. package/dist/lib/ecosystemRegistry.js.map +1 -0
  188. package/dist/lib/envLoader.d.ts +0 -0
  189. package/dist/lib/envLoader.d.ts.map +0 -0
  190. package/dist/lib/envLoader.js +39 -18
  191. package/dist/lib/envLoader.js.map +1 -1
  192. package/dist/lib/goldsky.d.ts +58 -0
  193. package/dist/lib/goldsky.d.ts.map +1 -0
  194. package/dist/lib/goldsky.js +275 -0
  195. package/dist/lib/goldsky.js.map +1 -0
  196. package/dist/lib/guardian/decision.d.ts +23 -0
  197. package/dist/lib/guardian/decision.d.ts.map +1 -0
  198. package/dist/lib/guardian/decision.js +40 -0
  199. package/dist/lib/guardian/decision.js.map +1 -0
  200. package/dist/lib/http.d.ts +0 -1
  201. package/dist/lib/http.d.ts.map +1 -1
  202. package/dist/lib/http.js +297 -32
  203. package/dist/lib/http.js.map +1 -1
  204. package/dist/lib/managedExecution.d.ts +19 -0
  205. package/dist/lib/managedExecution.d.ts.map +1 -0
  206. package/dist/lib/managedExecution.js +64 -0
  207. package/dist/lib/managedExecution.js.map +1 -0
  208. package/dist/lib/merkleBatcher.d.ts +23 -0
  209. package/dist/lib/merkleBatcher.d.ts.map +1 -0
  210. package/dist/lib/merkleBatcher.js +62 -0
  211. package/dist/lib/merkleBatcher.js.map +1 -0
  212. package/dist/lib/networks.d.ts +48 -0
  213. package/dist/lib/networks.d.ts.map +1 -0
  214. package/dist/lib/networks.js +103 -0
  215. package/dist/lib/networks.js.map +1 -0
  216. package/dist/lib/observability/accessContext.d.ts +29 -0
  217. package/dist/lib/observability/accessContext.d.ts.map +1 -0
  218. package/dist/lib/observability/accessContext.js +50 -0
  219. package/dist/lib/observability/accessContext.js.map +1 -0
  220. package/dist/lib/observability/activityStore.d.ts +70 -0
  221. package/dist/lib/observability/activityStore.d.ts.map +1 -0
  222. package/dist/lib/observability/activityStore.js +149 -0
  223. package/dist/lib/observability/activityStore.js.map +1 -0
  224. package/dist/lib/observability/apiKey.d.ts +55 -0
  225. package/dist/lib/observability/apiKey.d.ts.map +1 -0
  226. package/dist/lib/observability/apiKey.js +141 -0
  227. package/dist/lib/observability/apiKey.js.map +1 -0
  228. package/dist/lib/observability/logger.d.ts +30 -0
  229. package/dist/lib/observability/logger.d.ts.map +1 -0
  230. package/dist/lib/observability/logger.js +30 -0
  231. package/dist/lib/observability/logger.js.map +1 -0
  232. package/dist/lib/observability/quota.d.ts +33 -0
  233. package/dist/lib/observability/quota.d.ts.map +1 -0
  234. package/dist/lib/observability/quota.js +49 -0
  235. package/dist/lib/observability/quota.js.map +1 -0
  236. package/dist/lib/observability/requestId.d.ts +8 -0
  237. package/dist/lib/observability/requestId.d.ts.map +1 -0
  238. package/dist/lib/observability/requestId.js +24 -0
  239. package/dist/lib/observability/requestId.js.map +1 -0
  240. package/dist/lib/observability/sanitize.d.ts +77 -0
  241. package/dist/lib/observability/sanitize.d.ts.map +1 -0
  242. package/dist/lib/observability/sanitize.js +228 -0
  243. package/dist/lib/observability/sanitize.js.map +1 -0
  244. package/dist/lib/observability/scopes.d.ts +20 -0
  245. package/dist/lib/observability/scopes.d.ts.map +1 -0
  246. package/dist/lib/observability/scopes.js +77 -0
  247. package/dist/lib/observability/scopes.js.map +1 -0
  248. package/dist/lib/okxDexApi.d.ts +106 -0
  249. package/dist/lib/okxDexApi.d.ts.map +1 -0
  250. package/dist/lib/okxDexApi.js +221 -0
  251. package/dist/lib/okxDexApi.js.map +1 -0
  252. package/dist/lib/persistentJsonStore.d.ts +5 -0
  253. package/dist/lib/persistentJsonStore.d.ts.map +1 -0
  254. package/dist/lib/persistentJsonStore.js +39 -0
  255. package/dist/lib/persistentJsonStore.js.map +1 -0
  256. package/dist/lib/pharos/attestationPublisher.d.ts +50 -0
  257. package/dist/lib/pharos/attestationPublisher.d.ts.map +1 -0
  258. package/dist/lib/pharos/attestationPublisher.js +262 -0
  259. package/dist/lib/pharos/attestationPublisher.js.map +1 -0
  260. package/dist/lib/pharos/ecosystem.d.ts +52 -0
  261. package/dist/lib/pharos/ecosystem.d.ts.map +1 -0
  262. package/dist/lib/pharos/ecosystem.js +431 -0
  263. package/dist/lib/pharos/ecosystem.js.map +1 -0
  264. package/dist/lib/pharos/ecosystemEvidence.d.ts +53 -0
  265. package/dist/lib/pharos/ecosystemEvidence.d.ts.map +1 -0
  266. package/dist/lib/pharos/ecosystemEvidence.js +133 -0
  267. package/dist/lib/pharos/ecosystemEvidence.js.map +1 -0
  268. package/dist/lib/pharos/rpc.d.ts +44 -0
  269. package/dist/lib/pharos/rpc.d.ts.map +1 -0
  270. package/dist/lib/pharos/rpc.js +90 -0
  271. package/dist/lib/pharos/rpc.js.map +1 -0
  272. package/dist/lib/pharos/rpcEvidence.d.ts +49 -0
  273. package/dist/lib/pharos/rpcEvidence.d.ts.map +1 -0
  274. package/dist/lib/pharos/rpcEvidence.js +46 -0
  275. package/dist/lib/pharos/rpcEvidence.js.map +1 -0
  276. package/dist/lib/pharos/rpcMethods.d.ts +46 -0
  277. package/dist/lib/pharos/rpcMethods.d.ts.map +1 -0
  278. package/dist/lib/pharos/rpcMethods.js +176 -0
  279. package/dist/lib/pharos/rpcMethods.js.map +1 -0
  280. package/dist/lib/pharos/spvVerifier.d.ts +47 -0
  281. package/dist/lib/pharos/spvVerifier.d.ts.map +1 -0
  282. package/dist/lib/pharos/spvVerifier.js +105 -0
  283. package/dist/lib/pharos/spvVerifier.js.map +1 -0
  284. package/dist/lib/pharos/userSignedBroadcaster.d.ts +10 -0
  285. package/dist/lib/pharos/userSignedBroadcaster.d.ts.map +1 -0
  286. package/dist/lib/pharos/userSignedBroadcaster.js +50 -0
  287. package/dist/lib/pharos/userSignedBroadcaster.js.map +1 -0
  288. package/dist/lib/pharosClient.d.ts +5 -10
  289. package/dist/lib/pharosClient.d.ts.map +1 -1
  290. package/dist/lib/pharosClient.js +9 -16
  291. package/dist/lib/pharosClient.js.map +1 -1
  292. package/dist/lib/policy/actionPolicyEngine.d.ts +37 -1
  293. package/dist/lib/policy/actionPolicyEngine.d.ts.map +1 -1
  294. package/dist/lib/policy/actionPolicyEngine.js +213 -52
  295. package/dist/lib/policy/actionPolicyEngine.js.map +1 -1
  296. package/dist/lib/policy/agentPolicy.d.ts +29 -0
  297. package/dist/lib/policy/agentPolicy.d.ts.map +1 -0
  298. package/dist/lib/policy/agentPolicy.js +154 -0
  299. package/dist/lib/policy/agentPolicy.js.map +1 -0
  300. package/dist/lib/policy/policyPresets.d.ts +30 -0
  301. package/dist/lib/policy/policyPresets.d.ts.map +1 -0
  302. package/dist/lib/policy/policyPresets.js +124 -0
  303. package/dist/lib/policy/policyPresets.js.map +1 -0
  304. package/dist/lib/policy/writeExecutionGate.d.ts +23 -0
  305. package/dist/lib/policy/writeExecutionGate.d.ts.map +1 -0
  306. package/dist/lib/policy/writeExecutionGate.js +65 -0
  307. package/dist/lib/policy/writeExecutionGate.js.map +1 -0
  308. package/dist/lib/preparedTxStore.d.ts +21 -0
  309. package/dist/lib/preparedTxStore.d.ts.map +1 -0
  310. package/dist/lib/preparedTxStore.js +90 -0
  311. package/dist/lib/preparedTxStore.js.map +1 -0
  312. package/dist/lib/price/chainlinkPushProvider.d.ts +34 -0
  313. package/dist/lib/price/chainlinkPushProvider.d.ts.map +1 -0
  314. package/dist/lib/price/chainlinkPushProvider.js +36 -0
  315. package/dist/lib/price/chainlinkPushProvider.js.map +1 -0
  316. package/dist/lib/price/feedRegistry.d.ts +26 -0
  317. package/dist/lib/price/feedRegistry.d.ts.map +1 -0
  318. package/dist/lib/price/feedRegistry.js +67 -0
  319. package/dist/lib/price/feedRegistry.js.map +1 -0
  320. package/dist/lib/price/priceResolver.d.ts +35 -0
  321. package/dist/lib/price/priceResolver.d.ts.map +1 -0
  322. package/dist/lib/price/priceResolver.js +246 -0
  323. package/dist/lib/price/priceResolver.js.map +1 -0
  324. package/dist/lib/price/supraProvider.d.ts +9 -0
  325. package/dist/lib/price/supraProvider.d.ts.map +1 -0
  326. package/dist/lib/price/supraProvider.js +17 -0
  327. package/dist/lib/price/supraProvider.js.map +1 -0
  328. package/dist/lib/price/types.d.ts +67 -0
  329. package/dist/lib/price/types.d.ts.map +1 -0
  330. package/dist/lib/price/types.js +7 -0
  331. package/dist/lib/price/types.js.map +1 -0
  332. package/dist/lib/productionGuards.d.ts +16 -0
  333. package/dist/lib/productionGuards.d.ts.map +1 -0
  334. package/dist/lib/productionGuards.js +93 -0
  335. package/dist/lib/productionGuards.js.map +1 -0
  336. package/dist/lib/recipientSafety.d.ts +5 -0
  337. package/dist/lib/recipientSafety.d.ts.map +1 -0
  338. package/dist/lib/recipientSafety.js +28 -0
  339. package/dist/lib/recipientSafety.js.map +1 -0
  340. package/dist/lib/riskEngine.d.ts +19 -0
  341. package/dist/lib/riskEngine.d.ts.map +1 -1
  342. package/dist/lib/riskEngine.js +94 -36
  343. package/dist/lib/riskEngine.js.map +1 -1
  344. package/dist/lib/riskInclusion.d.ts +72 -0
  345. package/dist/lib/riskInclusion.d.ts.map +1 -0
  346. package/dist/lib/riskInclusion.js +252 -0
  347. package/dist/lib/riskInclusion.js.map +1 -0
  348. package/dist/lib/safeHandsRegistry.d.ts +32 -0
  349. package/dist/lib/safeHandsRegistry.d.ts.map +1 -0
  350. package/dist/lib/safeHandsRegistry.js +151 -0
  351. package/dist/lib/safeHandsRegistry.js.map +1 -0
  352. package/dist/lib/signer/index.d.ts +3 -3
  353. package/dist/lib/signer/index.d.ts.map +1 -1
  354. package/dist/lib/signer/index.js +33 -11
  355. package/dist/lib/signer/index.js.map +1 -1
  356. package/dist/lib/spendAccumulator.d.ts +24 -1
  357. package/dist/lib/spendAccumulator.d.ts.map +1 -1
  358. package/dist/lib/spendAccumulator.js +76 -6
  359. package/dist/lib/spendAccumulator.js.map +1 -1
  360. package/dist/lib/toolResponse.d.ts +6 -1
  361. package/dist/lib/toolResponse.d.ts.map +1 -1
  362. package/dist/lib/toolResponse.js +13 -9
  363. package/dist/lib/toolResponse.js.map +1 -1
  364. package/dist/lib/validation.d.ts +7 -0
  365. package/dist/lib/validation.d.ts.map +1 -0
  366. package/dist/lib/validation.js +62 -0
  367. package/dist/lib/validation.js.map +1 -0
  368. package/dist/lib/wallet/index.d.ts +8 -12
  369. package/dist/lib/wallet/index.d.ts.map +1 -1
  370. package/dist/lib/wallet/index.js +48 -35
  371. package/dist/lib/wallet/index.js.map +1 -1
  372. package/dist/lib/x402ReplayStore.d.ts +6 -0
  373. package/dist/lib/x402ReplayStore.d.ts.map +1 -0
  374. package/dist/lib/x402ReplayStore.js +79 -0
  375. package/dist/lib/x402ReplayStore.js.map +1 -0
  376. package/dist/safehands.zip +0 -0
  377. package/dist/sdk.d.ts +14 -0
  378. package/dist/sdk.d.ts.map +1 -0
  379. package/dist/sdk.js +25 -0
  380. package/dist/sdk.js.map +1 -0
  381. package/dist/tools/approveToken.d.ts +31 -10
  382. package/dist/tools/approveToken.d.ts.map +1 -1
  383. package/dist/tools/approveToken.js +91 -24
  384. package/dist/tools/approveToken.js.map +1 -1
  385. package/dist/tools/assessRisk.d.ts +13 -26
  386. package/dist/tools/assessRisk.d.ts.map +1 -1
  387. package/dist/tools/assessRisk.js +34 -75
  388. package/dist/tools/assessRisk.js.map +1 -1
  389. package/dist/tools/checkAllowance.d.ts +9 -3
  390. package/dist/tools/checkAllowance.d.ts.map +1 -1
  391. package/dist/tools/checkAllowance.js +27 -5
  392. package/dist/tools/checkAllowance.js.map +1 -1
  393. package/dist/tools/checkTokenSecurity.d.ts +62 -5
  394. package/dist/tools/checkTokenSecurity.d.ts.map +1 -1
  395. package/dist/tools/checkTokenSecurity.js +166 -21
  396. package/dist/tools/checkTokenSecurity.js.map +1 -1
  397. package/dist/tools/createAgentWallet.d.ts +4 -2
  398. package/dist/tools/createAgentWallet.d.ts.map +1 -1
  399. package/dist/tools/createAgentWallet.js +36 -31
  400. package/dist/tools/createAgentWallet.js.map +1 -1
  401. package/dist/tools/estimateGas.d.ts +7 -2
  402. package/dist/tools/estimateGas.d.ts.map +1 -1
  403. package/dist/tools/estimateGas.js +16 -10
  404. package/dist/tools/estimateGas.js.map +1 -1
  405. package/dist/tools/executeSwap.d.ts +56 -8
  406. package/dist/tools/executeSwap.d.ts.map +1 -1
  407. package/dist/tools/executeSwap.js +194 -46
  408. package/dist/tools/executeSwap.js.map +1 -1
  409. package/dist/tools/explainRisk.d.ts +9 -9
  410. package/dist/tools/explainRisk.d.ts.map +1 -1
  411. package/dist/tools/explainRisk.js +5 -4
  412. package/dist/tools/explainRisk.js.map +1 -1
  413. package/dist/tools/getAgentPolicy.d.ts +15 -0
  414. package/dist/tools/getAgentPolicy.d.ts.map +1 -0
  415. package/dist/tools/getAgentPolicy.js +16 -0
  416. package/dist/tools/getAgentPolicy.js.map +1 -0
  417. package/dist/tools/getAgentReputation.d.ts +31 -0
  418. package/dist/tools/getAgentReputation.d.ts.map +1 -0
  419. package/dist/tools/getAgentReputation.js +44 -0
  420. package/dist/tools/getAgentReputation.js.map +1 -0
  421. package/dist/tools/getAgentWallet.d.ts +1 -1
  422. package/dist/tools/getAgentWallet.d.ts.map +1 -1
  423. package/dist/tools/getAgentWallet.js +11 -1
  424. package/dist/tools/getAgentWallet.js.map +1 -1
  425. package/dist/tools/getAgentWalletBalance.d.ts +1 -1
  426. package/dist/tools/getAgentWalletBalance.d.ts.map +1 -1
  427. package/dist/tools/getAgentWalletBalance.js +58 -26
  428. package/dist/tools/getAgentWalletBalance.js.map +1 -1
  429. package/dist/tools/getExecutionHistory.d.ts +1 -1
  430. package/dist/tools/getExecutionHistory.d.ts.map +1 -1
  431. package/dist/tools/getExecutionHistory.js +13 -19
  432. package/dist/tools/getExecutionHistory.js.map +1 -1
  433. package/dist/tools/getGasPrice.d.ts +3 -3
  434. package/dist/tools/getGasPrice.d.ts.map +0 -0
  435. package/dist/tools/getGasPrice.js +7 -7
  436. package/dist/tools/getGasPrice.js.map +1 -1
  437. package/dist/tools/getPoolInfo.d.ts +17 -17
  438. package/dist/tools/getPoolInfo.d.ts.map +1 -1
  439. package/dist/tools/getPoolInfo.js +14 -9
  440. package/dist/tools/getPoolInfo.js.map +1 -1
  441. package/dist/tools/getSpvProof.d.ts +24 -0
  442. package/dist/tools/getSpvProof.d.ts.map +1 -0
  443. package/dist/tools/getSpvProof.js +64 -0
  444. package/dist/tools/getSpvProof.js.map +1 -0
  445. package/dist/tools/getTokenPrice.d.ts +28 -85
  446. package/dist/tools/getTokenPrice.d.ts.map +1 -1
  447. package/dist/tools/getTokenPrice.js +87 -94
  448. package/dist/tools/getTokenPrice.js.map +1 -1
  449. package/dist/tools/getTransactionStatus.d.ts +2 -2
  450. package/dist/tools/getTransactionStatus.d.ts.map +0 -0
  451. package/dist/tools/getTransactionStatus.js +0 -0
  452. package/dist/tools/getTransactionStatus.js.map +0 -0
  453. package/dist/tools/getWalletBalance.d.ts +38 -3
  454. package/dist/tools/getWalletBalance.d.ts.map +1 -1
  455. package/dist/tools/getWalletBalance.js +92 -52
  456. package/dist/tools/getWalletBalance.js.map +1 -1
  457. package/dist/tools/publishRiskScore.d.ts +36 -14
  458. package/dist/tools/publishRiskScore.d.ts.map +1 -1
  459. package/dist/tools/publishRiskScore.js +80 -32
  460. package/dist/tools/publishRiskScore.js.map +1 -1
  461. package/dist/tools/queryGoldsky.d.ts +20 -0
  462. package/dist/tools/queryGoldsky.d.ts.map +1 -0
  463. package/dist/tools/queryGoldsky.js +29 -0
  464. package/dist/tools/queryGoldsky.js.map +1 -0
  465. package/dist/tools/queryRiskRegistry.d.ts +14 -14
  466. package/dist/tools/queryRiskRegistry.d.ts.map +1 -1
  467. package/dist/tools/queryRiskRegistry.js +34 -30
  468. package/dist/tools/queryRiskRegistry.js.map +1 -1
  469. package/dist/tools/safehandsPreflightCheck.d.ts +29 -14
  470. package/dist/tools/safehandsPreflightCheck.d.ts.map +1 -1
  471. package/dist/tools/safehandsPreflightCheck.js +133 -6
  472. package/dist/tools/safehandsPreflightCheck.js.map +1 -1
  473. package/dist/tools/safehandsRiskReport.d.ts +29 -14
  474. package/dist/tools/safehandsRiskReport.d.ts.map +1 -1
  475. package/dist/tools/safehandsRiskReport.js +23 -3
  476. package/dist/tools/safehandsRiskReport.js.map +1 -1
  477. package/dist/tools/safehandsSafeExecute.d.ts +1 -1
  478. package/dist/tools/safehandsSafeExecute.d.ts.map +1 -1
  479. package/dist/tools/safehandsSafeExecute.js +100 -17
  480. package/dist/tools/safehandsSafeExecute.js.map +1 -1
  481. package/dist/tools/safehandsWalletHealth.d.ts +15 -1
  482. package/dist/tools/safehandsWalletHealth.d.ts.map +1 -1
  483. package/dist/tools/safehandsWalletHealth.js +67 -25
  484. package/dist/tools/safehandsWalletHealth.js.map +1 -1
  485. package/dist/tools/safehandsX402Preflight.d.ts +3 -3
  486. package/dist/tools/safehandsX402Preflight.d.ts.map +1 -1
  487. package/dist/tools/safehandsX402Preflight.js +24 -3
  488. package/dist/tools/safehandsX402Preflight.js.map +1 -1
  489. package/dist/tools/sendPayment.d.ts +10 -4
  490. package/dist/tools/sendPayment.d.ts.map +1 -1
  491. package/dist/tools/sendPayment.js +63 -36
  492. package/dist/tools/sendPayment.js.map +1 -1
  493. package/dist/tools/setAgentPolicy.d.ts +75 -0
  494. package/dist/tools/setAgentPolicy.d.ts.map +1 -0
  495. package/dist/tools/setAgentPolicy.js +80 -0
  496. package/dist/tools/setAgentPolicy.js.map +1 -0
  497. package/dist/tools/simulateTransaction.d.ts +7 -3
  498. package/dist/tools/simulateTransaction.d.ts.map +1 -1
  499. package/dist/tools/simulateTransaction.js +42 -9
  500. package/dist/tools/simulateTransaction.js.map +1 -1
  501. package/dist/tools/tokenRegistryStatus.d.ts +25 -5
  502. package/dist/tools/tokenRegistryStatus.d.ts.map +1 -1
  503. package/dist/tools/tokenRegistryStatus.js +61 -31
  504. package/dist/tools/tokenRegistryStatus.js.map +1 -1
  505. package/dist/tools/verifyRiskInclusion.d.ts +59 -0
  506. package/dist/tools/verifyRiskInclusion.d.ts.map +1 -0
  507. package/dist/tools/verifyRiskInclusion.js +40 -0
  508. package/dist/tools/verifyRiskInclusion.js.map +1 -0
  509. package/dist/tools/x402PayAndFetch.d.ts +15 -9
  510. package/dist/tools/x402PayAndFetch.d.ts.map +1 -1
  511. package/dist/tools/x402PayAndFetch.js +163 -20
  512. package/dist/tools/x402PayAndFetch.js.map +1 -1
  513. package/dist/worker.d.ts +3 -0
  514. package/dist/worker.d.ts.map +1 -0
  515. package/dist/worker.js +39 -0
  516. package/dist/worker.js.map +1 -0
  517. package/dist/x402Server.d.ts +1 -1
  518. package/dist/x402Server.d.ts.map +1 -1
  519. package/dist/x402Server.js +144 -35
  520. package/dist/x402Server.js.map +1 -1
  521. package/docs/REVIEWER_QUICKSTART.md +113 -0
  522. package/docs/SAFEHANDS_REVIEWER_DEMO_SCRIPT.md +228 -0
  523. package/package.json +130 -73
  524. package/contracts/RiskRegistry.json +0 -223
  525. package/contracts/RiskRegistry.sol +0 -58
  526. package/dist/lib/testDodoLive.d.ts +0 -2
  527. package/dist/lib/testDodoLive.d.ts.map +0 -1
  528. package/dist/lib/testDodoLive.js +0 -105
  529. package/dist/lib/testDodoLive.js.map +0 -1
  530. package/dist/lib/testLiveSafehands.d.ts +0 -2
  531. package/dist/lib/testLiveSafehands.d.ts.map +0 -1
  532. package/dist/lib/testLiveSafehands.js +0 -93
  533. package/dist/lib/testLiveSafehands.js.map +0 -1
  534. package/dist/lib/testRpc.d.ts +0 -2
  535. package/dist/lib/testRpc.d.ts.map +0 -1
  536. package/dist/lib/testRpc.js +0 -30
  537. package/dist/lib/testRpc.js.map +0 -1
  538. package/dist/lib/testRpcLive.d.ts +0 -2
  539. package/dist/lib/testRpcLive.d.ts.map +0 -1
  540. package/dist/lib/testRpcLive.js +0 -89
  541. package/dist/lib/testRpcLive.js.map +0 -1
  542. package/dist/lib/testTools.d.ts +0 -2
  543. package/dist/lib/testTools.d.ts.map +0 -1
  544. package/dist/lib/testTools.js +0 -397
  545. package/dist/lib/testTools.js.map +0 -1
  546. package/dist/lib/testX402Live.d.ts +0 -2
  547. package/dist/lib/testX402Live.d.ts.map +0 -1
  548. package/dist/lib/testX402Live.js +0 -160
  549. package/dist/lib/testX402Live.js.map +0 -1
  550. package/dist/scripts/checkDeploy.d.ts +0 -2
  551. package/dist/scripts/checkDeploy.d.ts.map +0 -1
  552. package/dist/scripts/checkDeploy.js +0 -25
  553. package/dist/scripts/checkDeploy.js.map +0 -1
  554. package/dist/scripts/deployRegistry.d.ts +0 -2
  555. package/dist/scripts/deployRegistry.d.ts.map +0 -1
  556. package/dist/scripts/deployRegistry.js +0 -101
  557. package/dist/scripts/deployRegistry.js.map +0 -1
  558. package/dist/scripts/testRegistry.d.ts +0 -2
  559. package/dist/scripts/testRegistry.d.ts.map +0 -1
  560. package/dist/scripts/testRegistry.js +0 -44
  561. package/dist/scripts/testRegistry.js.map +0 -1
@@ -0,0 +1,48 @@
1
+ export type NetworkName = "pacific-mainnet" | "atlantic-testnet";
2
+ export interface PharosNetwork {
3
+ name: NetworkName;
4
+ label: string;
5
+ chainId: number;
6
+ nativeToken: string;
7
+ /** Public, key-free default RPC endpoint. */
8
+ defaultRpcUrl: string;
9
+ explorerUrl: string;
10
+ socialScanUrl?: string;
11
+ isMainnet: boolean;
12
+ /** Read-only SafeHands checks are always allowed. */
13
+ readOnlyChecks: boolean;
14
+ /** Whether execution/write/payment is permitted on this network at all. */
15
+ executionAllowed: boolean;
16
+ }
17
+ /** Mainnet-first default. */
18
+ export declare const DEFAULT_NETWORK_NAME: NetworkName;
19
+ export declare const NETWORKS: Record<NetworkName, PharosNetwork>;
20
+ export declare function isNetworkName(value: string | undefined): value is NetworkName;
21
+ /** Resolve the active network name from SAFEHANDS_NETWORK (default mainnet-first). */
22
+ export declare function getActiveNetworkName(): NetworkName;
23
+ export declare function getActiveNetwork(): PharosNetwork;
24
+ export declare function getNetworkByChainId(chainId: number): PharosNetwork | undefined;
25
+ /**
26
+ * Resolve the RPC URL for a network. Priority:
27
+ * 1. Network-specific override env var
28
+ * 2. Optional provider env vars (ZAN > Alchemy > Nirvana) — mainnet only
29
+ * 3. The public, key-free default RPC
30
+ * Premium/keyed URLs are NEVER hardcoded — they are only ever read from env.
31
+ */
32
+ export declare function resolveRpcUrl(network: PharosNetwork): string;
33
+ export type RpcProviderName = "zan" | "alchemy" | "nirvana" | "custom" | "pharos-public";
34
+ /**
35
+ * Redacted RPC provider descriptor — the provider NAME and whether it came from
36
+ * env, but NEVER the URL or API key. Safe to expose in /public-config and
37
+ * /infra/status. The provider name is inferred from which env var is set (an
38
+ * explicit PHAROS_RPC_PROVIDER label wins for custom URLs).
39
+ */
40
+ export interface RpcProviderDescriptor {
41
+ name: RpcProviderName;
42
+ configuredViaEnv: boolean;
43
+ usingPublicDefault: boolean;
44
+ }
45
+ export declare function resolveRpcProvider(network: PharosNetwork): RpcProviderDescriptor;
46
+ /** Build the explorer transaction-link base (e.g. https://www.pharosscan.xyz/tx/). */
47
+ export declare function explorerTxBase(network: PharosNetwork): string;
48
+ //# sourceMappingURL=networks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"networks.d.ts","sourceRoot":"","sources":["../../src/lib/networks.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,WAAW,GAAG,iBAAiB,GAAG,kBAAkB,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,qDAAqD;IACrD,cAAc,EAAE,OAAO,CAAC;IACxB,2EAA2E;IAC3E,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,6BAA6B;AAC7B,eAAO,MAAM,oBAAoB,EAAE,WAA+B,CAAC;AAEnE,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,WAAW,EAAE,aAAa,CA8BvD,CAAC;AAEF,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,KAAK,IAAI,WAAW,CAE7E;AAED,sFAAsF;AACtF,wBAAgB,oBAAoB,IAAI,WAAW,CAGlD;AAED,wBAAgB,gBAAgB,IAAI,aAAa,CAEhD;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAE9E;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAc5D;AAED,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,eAAe,CAAC;AAEzF;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,eAAe,CAAC;IACtB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,GAAG,qBAAqB,CAgBhF;AAED,sFAAsF;AACtF,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAG7D"}
@@ -0,0 +1,103 @@
1
+ // ─── SafeHands Network Registry ────────────────────────────────────────
2
+ // Mainnet-first: Pharos Pacific Mainnet is the DEFAULT active network for
3
+ // read-only SafeHands checks. Atlantic Testnet remains available via the
4
+ // SAFEHANDS_NETWORK env var for demo, compatibility, contract testing, and
5
+ // x402 testing.
6
+ //
7
+ // Read-only by default. No private keys and no premium/keyed RPC URLs are
8
+ // hardcoded here — optional provider URLs (ZAN/Alchemy/Nirvana) are read from
9
+ // the environment only.
10
+ // ────────────────────────────────────────────────────────────────────────
11
+ /** Mainnet-first default. */
12
+ export const DEFAULT_NETWORK_NAME = "pacific-mainnet";
13
+ export const NETWORKS = {
14
+ "pacific-mainnet": {
15
+ name: "pacific-mainnet",
16
+ label: "Pharos Pacific Mainnet",
17
+ chainId: 1672,
18
+ nativeToken: "PROS",
19
+ defaultRpcUrl: "https://rpc.pharos.xyz",
20
+ explorerUrl: "https://www.pharosscan.xyz",
21
+ socialScanUrl: "https://pharos.socialscan.io",
22
+ isMainnet: true,
23
+ readOnlyChecks: true,
24
+ // Execution at the network level targets Pacific Mainnet (all-mainnet), but
25
+ // every write stays gated by WRITE_TOOLS_ENABLED + MANAGED_WALLET_ENABLED
26
+ // (both default false) — a hosted deployment is read-only by default.
27
+ executionAllowed: true,
28
+ },
29
+ "atlantic-testnet": {
30
+ name: "atlantic-testnet",
31
+ label: "Pharos Atlantic Testnet",
32
+ chainId: 688689,
33
+ nativeToken: "PROS",
34
+ defaultRpcUrl: "https://atlantic.dplabs-internal.com/",
35
+ explorerUrl: "https://atlantic.pharosscan.xyz/",
36
+ socialScanUrl: "https://pharos.socialscan.io",
37
+ isMainnet: false,
38
+ readOnlyChecks: true,
39
+ // No mainnet execution — SafeHands is all-mainnet. Atlantic remains for
40
+ // read-only checks / compatibility only.
41
+ executionAllowed: false,
42
+ },
43
+ };
44
+ export function isNetworkName(value) {
45
+ return value === "pacific-mainnet" || value === "atlantic-testnet";
46
+ }
47
+ /** Resolve the active network name from SAFEHANDS_NETWORK (default mainnet-first). */
48
+ export function getActiveNetworkName() {
49
+ const raw = process.env.SAFEHANDS_NETWORK;
50
+ return isNetworkName(raw) ? raw : DEFAULT_NETWORK_NAME;
51
+ }
52
+ export function getActiveNetwork() {
53
+ return NETWORKS[getActiveNetworkName()];
54
+ }
55
+ export function getNetworkByChainId(chainId) {
56
+ return Object.values(NETWORKS).find((n) => n.chainId === chainId);
57
+ }
58
+ /**
59
+ * Resolve the RPC URL for a network. Priority:
60
+ * 1. Network-specific override env var
61
+ * 2. Optional provider env vars (ZAN > Alchemy > Nirvana) — mainnet only
62
+ * 3. The public, key-free default RPC
63
+ * Premium/keyed URLs are NEVER hardcoded — they are only ever read from env.
64
+ */
65
+ export function resolveRpcUrl(network) {
66
+ if (network.name === "pacific-mainnet") {
67
+ return (process.env.PHAROS_MAINNET_RPC_URL ||
68
+ process.env.PHAROS_PACIFIC_RPC_URL ||
69
+ process.env.PHAROS_RPC_URL ||
70
+ process.env.ZAN_PHAROS_MAINNET_RPC_URL ||
71
+ process.env.PHAROS_ZAN_RPC_URL ||
72
+ process.env.ALCHEMY_PHAROS_MAINNET_RPC_URL ||
73
+ process.env.NIRVANA_PHAROS_MAINNET_RPC_URL ||
74
+ network.defaultRpcUrl);
75
+ }
76
+ return process.env.PHAROS_ATLANTIC_RPC_URL || network.defaultRpcUrl;
77
+ }
78
+ export function resolveRpcProvider(network) {
79
+ const explicit = process.env.PHAROS_RPC_PROVIDER?.trim().toLowerCase();
80
+ const labelled = (fallback) => explicit === "zan" || explicit === "alchemy" || explicit === "nirvana" || explicit === "custom" || explicit === "pharos-public"
81
+ ? explicit
82
+ : fallback;
83
+ if (network.name === "pacific-mainnet") {
84
+ if (process.env.PHAROS_MAINNET_RPC_URL || process.env.PHAROS_PACIFIC_RPC_URL || process.env.PHAROS_RPC_URL)
85
+ return { name: labelled("custom"), configuredViaEnv: true, usingPublicDefault: false };
86
+ if (process.env.ZAN_PHAROS_MAINNET_RPC_URL || process.env.PHAROS_ZAN_RPC_URL)
87
+ return { name: "zan", configuredViaEnv: true, usingPublicDefault: false };
88
+ if (process.env.ALCHEMY_PHAROS_MAINNET_RPC_URL)
89
+ return { name: "alchemy", configuredViaEnv: true, usingPublicDefault: false };
90
+ if (process.env.NIRVANA_PHAROS_MAINNET_RPC_URL)
91
+ return { name: "nirvana", configuredViaEnv: true, usingPublicDefault: false };
92
+ return { name: "pharos-public", configuredViaEnv: false, usingPublicDefault: true };
93
+ }
94
+ if (process.env.PHAROS_ATLANTIC_RPC_URL)
95
+ return { name: labelled("custom"), configuredViaEnv: true, usingPublicDefault: false };
96
+ return { name: "pharos-public", configuredViaEnv: false, usingPublicDefault: true };
97
+ }
98
+ /** Build the explorer transaction-link base (e.g. https://www.pharosscan.xyz/tx/). */
99
+ export function explorerTxBase(network) {
100
+ const base = network.explorerUrl.replace(/\/+$/, "");
101
+ return `${base}/tx/`;
102
+ }
103
+ //# sourceMappingURL=networks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"networks.js","sourceRoot":"","sources":["../../src/lib/networks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { ApiKeyResolution } from "./apiKey.js";
2
+ import type { Scope } from "./scopes.js";
3
+ export type CallerType = "anonymous" | "api-key" | "agent" | "a2a";
4
+ export interface AccessContext {
5
+ callerType: CallerType;
6
+ /** keyId (hash prefix) for a valid key — never the raw key. */
7
+ keyId: string | null;
8
+ /** Granted scopes for a valid key (empty for anonymous). */
9
+ scopes: Scope[];
10
+ /** Sanitized, untrusted, display-only. */
11
+ agentId: string | null;
12
+ a2aPeerId: string | null;
13
+ requestId: string | null;
14
+ }
15
+ /** Validate + normalize an untrusted id; returns null if missing/malformed. */
16
+ export declare function sanitizeId(value: unknown): string | null;
17
+ /** Derive the access tier from the endpoint + key status. */
18
+ export declare function callerTypeFor(path: string, resolution: ApiKeyResolution): CallerType;
19
+ /**
20
+ * Build the sanitized access context. Reads only whitelisted identity fields —
21
+ * raw key/headers/IP/payload are never copied in.
22
+ */
23
+ export declare function buildAccessContext(args: {
24
+ path: string;
25
+ resolution: ApiKeyResolution;
26
+ body: unknown;
27
+ requestId?: string | null;
28
+ }): AccessContext;
29
+ //# sourceMappingURL=accessContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accessContext.d.ts","sourceRoot":"","sources":["../../../src/lib/observability/accessContext.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,KAAK,CAAC;AAEnE,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,UAAU,CAAC;IACvB,+DAA+D;IAC/D,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,4DAA4D;IAC5D,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,0CAA0C;IAC1C,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAKD,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAIxD;AAOD,6DAA6D;AAC7D,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,GAAG,UAAU,CAKpF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,gBAAgB,CAAC;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,GAAG,aAAa,CAUhB"}
@@ -0,0 +1,50 @@
1
+ // ─── Access Context ──────────────────────────────────────────────
2
+ // Builds a SANITIZED, secret-free caller identity for a request. It carries the
3
+ // access tier (callerType), the keyId (hash prefix) + granted scopes for a valid
4
+ // key, and length/charset-capped agentId/a2aPeerId pulled from the request body.
5
+ //
6
+ // NEVER captured: raw API keys, Authorization/other headers, client IP, or raw
7
+ // payloads. agentId/a2aPeerId are UNTRUSTED display-only identity (validated +
8
+ // dropped if malformed) — they are not used for any security decision. Pure +
9
+ // offline; no signing/wallet/write primitives.
10
+ // ────────────────────────────────────────────────────────────────────────
11
+ /** Safe identity charset: short, printable, no whitespace/control chars. */
12
+ const ID_RE = /^[A-Za-z0-9._:-]{1,64}$/;
13
+ /** Validate + normalize an untrusted id; returns null if missing/malformed. */
14
+ export function sanitizeId(value) {
15
+ if (typeof value !== "string")
16
+ return null;
17
+ const trimmed = value.trim();
18
+ return ID_RE.test(trimmed) ? trimmed : null;
19
+ }
20
+ function bodyString(body, key) {
21
+ if (!body || typeof body !== "object")
22
+ return undefined;
23
+ return body[key];
24
+ }
25
+ /** Derive the access tier from the endpoint + key status. */
26
+ export function callerTypeFor(path, resolution) {
27
+ if (path === "/agent/a2a/check")
28
+ return "a2a";
29
+ if (path === "/agent/check")
30
+ return "agent";
31
+ if (resolution.status === "valid")
32
+ return "api-key";
33
+ return "anonymous";
34
+ }
35
+ /**
36
+ * Build the sanitized access context. Reads only whitelisted identity fields —
37
+ * raw key/headers/IP/payload are never copied in.
38
+ */
39
+ export function buildAccessContext(args) {
40
+ const { path, resolution, body } = args;
41
+ return {
42
+ callerType: callerTypeFor(path, resolution),
43
+ keyId: resolution.status === "valid" ? resolution.keyId : null,
44
+ scopes: resolution.scopes ? [...resolution.scopes] : [],
45
+ agentId: sanitizeId(bodyString(body, "agentId")),
46
+ a2aPeerId: sanitizeId(bodyString(body, "callerAgent") ?? bodyString(body, "a2aPeerId")),
47
+ requestId: typeof args.requestId === "string" ? args.requestId : null,
48
+ };
49
+ }
50
+ //# sourceMappingURL=accessContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accessContext.js","sourceRoot":"","sources":["../../../src/lib/observability/accessContext.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,gFAAgF;AAChF,iFAAiF;AACjF,iFAAiF;AACjF,EAAE;AACF,+EAA+E;AAC/E,+EAA+E;AAC/E,8EAA8E;AAC9E,+CAA+C;AAC/C,2EAA2E;AAmB3E,4EAA4E;AAC5E,MAAM,KAAK,GAAG,yBAAyB,CAAC;AAExC,+EAA+E;AAC/E,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9C,CAAC;AAED,SAAS,UAAU,CAAC,IAAa,EAAE,GAAW;IAC5C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACxD,OAAQ,IAAgC,CAAC,GAAG,CAAC,CAAC;AAChD,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,UAA4B;IACtE,IAAI,IAAI,KAAK,kBAAkB;QAAE,OAAO,KAAK,CAAC;IAC9C,IAAI,IAAI,KAAK,cAAc;QAAE,OAAO,OAAO,CAAC;IAC5C,IAAI,UAAU,CAAC,MAAM,KAAK,OAAO;QAAE,OAAO,SAAS,CAAC;IACpD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAKlC;IACC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IACxC,OAAO;QACL,UAAU,EAAE,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC;QAC3C,KAAK,EAAE,UAAU,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;QAC9D,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;QACvD,OAAO,EAAE,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAChD,SAAS,EAAE,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACvF,SAAS,EAAE,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;KACtE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,70 @@
1
+ import type { ActivityItem, CallerType } from "./sanitize.js";
2
+ type DecisionKey = "ALLOW" | "BLOCK" | "REQUIRE_CONFIRMATION" | "PREPARE_ONLY" | "NONE";
3
+ type RiskKey = "CRITICAL" | "HIGH" | "MEDIUM" | "LOW" | "UNKNOWN";
4
+ type AccessTierKey = "anonymous" | "api-key" | "agent" | "a2a";
5
+ export interface ActivitySummary {
6
+ window: {
7
+ capacity: number;
8
+ size: number;
9
+ };
10
+ totals: {
11
+ recorded: number;
12
+ rateLimited: number;
13
+ byCaller: Record<CallerType, number>;
14
+ byAccessTier: Record<AccessTierKey, number>;
15
+ byDecision: Record<DecisionKey, number>;
16
+ byRisk: Record<RiskKey, number>;
17
+ byEndpoint: Record<string, number>;
18
+ byPolicyPreset: Record<string, number>;
19
+ };
20
+ lastActivityAt: string | null;
21
+ }
22
+ export interface ActivityMetrics {
23
+ uptimeSeconds: number;
24
+ totalChecks: number;
25
+ totalAgentChecks: number;
26
+ totalA2AChecks: number;
27
+ totalBlocked: number;
28
+ totalRequireConfirmation: number;
29
+ totalPrepareOnly: number;
30
+ totalAllowed: number;
31
+ totalRateLimited: number;
32
+ rateLimitedByTier: Record<AccessTierKey, number>;
33
+ ring: {
34
+ capacity: number;
35
+ size: number;
36
+ };
37
+ }
38
+ export declare class ActivityStore {
39
+ private capacity;
40
+ private buf;
41
+ private head;
42
+ private size;
43
+ private startedAtMs;
44
+ private lastActivityAt;
45
+ private recorded;
46
+ private rateLimited;
47
+ private rateLimitedByTier;
48
+ private byCaller;
49
+ private byAccessTier;
50
+ private byDecision;
51
+ private byRisk;
52
+ private byEndpoint;
53
+ private byPolicyPreset;
54
+ constructor(capacity?: number);
55
+ /** Resize/reset the ring (used at server start from env). Clears all state. */
56
+ configure(capacity: number): void;
57
+ /** Clear the buffer + counters (tests + reconfigure). */
58
+ reset(): void;
59
+ record(item: ActivityItem): void;
60
+ /** Count a rate-limited (429) request that never reached a handler. */
61
+ recordRateLimited(tier?: string): void;
62
+ /** Newest-first slice of the most recent items (sanitized copies). */
63
+ recent(limit: number): ActivityItem[];
64
+ summary(): ActivitySummary;
65
+ metrics(): ActivityMetrics;
66
+ }
67
+ /** Process-wide singleton used by the server + activity routes. */
68
+ export declare const activityStore: ActivityStore;
69
+ export {};
70
+ //# sourceMappingURL=activityStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activityStore.d.ts","sourceRoot":"","sources":["../../../src/lib/observability/activityStore.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAM9D,KAAK,WAAW,GAAG,OAAO,GAAG,OAAO,GAAG,sBAAsB,GAAG,cAAc,GAAG,MAAM,CAAC;AACxF,KAAK,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;AAYlE,KAAK,aAAa,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,KAAK,CAAC;AAK/D,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,MAAM,EAAE;QACN,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACrC,YAAY,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAC5C,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACxC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAChC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACxC,CAAC;IACF,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,wBAAwB,EAAE,MAAM,CAAC;IACjC,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IACjD,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1C;AAOD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,GAAG,CAA+B;IAC1C,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,cAAc,CAAuB;IAE7C,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,iBAAiB,CAAsB;IAC/C,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,cAAc,CAA8B;gBAExC,QAAQ,GAAE,MAAyB;IAK/C,+EAA+E;IAC/E,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKjC,yDAAyD;IACzD,KAAK,IAAI,IAAI;IAiBb,MAAM,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAsBhC,uEAAuE;IACvE,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAKtC,sEAAsE;IACtE,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,EAAE;IAWrC,OAAO,IAAI,eAAe;IAiB1B,OAAO,IAAI,eAAe;CAe3B;AAED,mEAAmE;AACnE,eAAO,MAAM,aAAa,eAAsB,CAAC"}
@@ -0,0 +1,149 @@
1
+ // ─── Activity Store ────────────────────────────────────────────────────
2
+ // In-memory, fixed-capacity ring buffer of sanitized activity items, plus
3
+ // O(1) cumulative counters for the public summary/metrics endpoints. No DB, no
4
+ // external service, no file I/O. Bounded memory by construction. Per-process /
5
+ // per-instance (documented): on multi-instance deployments each instance keeps
6
+ // its own window — acceptable for a public, illustrative activity feed.
7
+ // ────────────────────────────────────────────────────────────────────────
8
+ const DEFAULT_CAPACITY = 500;
9
+ const MIN_CAPACITY = 10;
10
+ const MAX_CAPACITY = 5000;
11
+ function emptyDecisions() {
12
+ return { ALLOW: 0, BLOCK: 0, REQUIRE_CONFIRMATION: 0, PREPARE_ONLY: 0, NONE: 0 };
13
+ }
14
+ function emptyRisks() {
15
+ return { CRITICAL: 0, HIGH: 0, MEDIUM: 0, LOW: 0, UNKNOWN: 0 };
16
+ }
17
+ function emptyCallers() {
18
+ return { api: 0, agent: 0, a2a: 0, unknown: 0 };
19
+ }
20
+ function emptyAccessTiers() {
21
+ return { anonymous: 0, "api-key": 0, agent: 0, a2a: 0 };
22
+ }
23
+ function clampCapacity(n) {
24
+ if (!Number.isFinite(n))
25
+ return DEFAULT_CAPACITY;
26
+ return Math.min(MAX_CAPACITY, Math.max(MIN_CAPACITY, Math.floor(n)));
27
+ }
28
+ export class ActivityStore {
29
+ capacity;
30
+ buf;
31
+ head = 0; // next write slot
32
+ size = 0;
33
+ startedAtMs = Date.now();
34
+ lastActivityAt = null;
35
+ recorded = 0;
36
+ rateLimited = 0;
37
+ rateLimitedByTier = emptyAccessTiers();
38
+ byCaller = emptyCallers();
39
+ byAccessTier = emptyAccessTiers();
40
+ byDecision = emptyDecisions();
41
+ byRisk = emptyRisks();
42
+ byEndpoint = {};
43
+ byPolicyPreset = {};
44
+ constructor(capacity = DEFAULT_CAPACITY) {
45
+ this.capacity = clampCapacity(capacity);
46
+ this.buf = new Array(this.capacity);
47
+ }
48
+ /** Resize/reset the ring (used at server start from env). Clears all state. */
49
+ configure(capacity) {
50
+ this.capacity = clampCapacity(capacity);
51
+ this.reset();
52
+ }
53
+ /** Clear the buffer + counters (tests + reconfigure). */
54
+ reset() {
55
+ this.buf = new Array(this.capacity);
56
+ this.head = 0;
57
+ this.size = 0;
58
+ this.startedAtMs = Date.now();
59
+ this.lastActivityAt = null;
60
+ this.recorded = 0;
61
+ this.rateLimited = 0;
62
+ this.rateLimitedByTier = emptyAccessTiers();
63
+ this.byCaller = emptyCallers();
64
+ this.byAccessTier = emptyAccessTiers();
65
+ this.byDecision = emptyDecisions();
66
+ this.byRisk = emptyRisks();
67
+ this.byEndpoint = {};
68
+ this.byPolicyPreset = {};
69
+ }
70
+ record(item) {
71
+ this.buf[this.head] = item;
72
+ this.head = (this.head + 1) % this.capacity;
73
+ if (this.size < this.capacity)
74
+ this.size++;
75
+ this.recorded++;
76
+ this.lastActivityAt = item.ts;
77
+ this.byCaller[item.callerType] = (this.byCaller[item.callerType] ?? 0) + 1;
78
+ const tier = (item.accessTier ?? "anonymous");
79
+ if (tier in this.byAccessTier)
80
+ this.byAccessTier[tier]++;
81
+ else
82
+ this.byAccessTier.anonymous++;
83
+ const dKey = (item.decision ?? "NONE");
84
+ if (dKey in this.byDecision)
85
+ this.byDecision[dKey]++;
86
+ else
87
+ this.byDecision.NONE++;
88
+ const rKey = (item.riskLevel ?? "UNKNOWN");
89
+ if (rKey in this.byRisk)
90
+ this.byRisk[rKey]++;
91
+ else
92
+ this.byRisk.UNKNOWN++;
93
+ this.byEndpoint[item.endpoint] = (this.byEndpoint[item.endpoint] ?? 0) + 1;
94
+ const preset = item.policyPreset ?? "none";
95
+ this.byPolicyPreset[preset] = (this.byPolicyPreset[preset] ?? 0) + 1;
96
+ }
97
+ /** Count a rate-limited (429) request that never reached a handler. */
98
+ recordRateLimited(tier) {
99
+ this.rateLimited++;
100
+ if (tier && tier in this.rateLimitedByTier)
101
+ this.rateLimitedByTier[tier]++;
102
+ }
103
+ /** Newest-first slice of the most recent items (sanitized copies). */
104
+ recent(limit) {
105
+ const n = Math.min(Math.max(0, Math.floor(limit)), this.size);
106
+ const out = [];
107
+ for (let i = 0; i < n; i++) {
108
+ const idx = (this.head - 1 - i + this.capacity * 2) % this.capacity;
109
+ const item = this.buf[idx];
110
+ if (item)
111
+ out.push(item);
112
+ }
113
+ return out;
114
+ }
115
+ summary() {
116
+ return {
117
+ window: { capacity: this.capacity, size: this.size },
118
+ totals: {
119
+ recorded: this.recorded,
120
+ rateLimited: this.rateLimited,
121
+ byCaller: { ...this.byCaller },
122
+ byAccessTier: { ...this.byAccessTier },
123
+ byDecision: { ...this.byDecision },
124
+ byRisk: { ...this.byRisk },
125
+ byEndpoint: { ...this.byEndpoint },
126
+ byPolicyPreset: { ...this.byPolicyPreset },
127
+ },
128
+ lastActivityAt: this.lastActivityAt,
129
+ };
130
+ }
131
+ metrics() {
132
+ return {
133
+ uptimeSeconds: Math.floor((Date.now() - this.startedAtMs) / 1000),
134
+ totalChecks: this.byCaller.api,
135
+ totalAgentChecks: this.byCaller.agent,
136
+ totalA2AChecks: this.byCaller.a2a,
137
+ totalBlocked: this.byDecision.BLOCK,
138
+ totalRequireConfirmation: this.byDecision.REQUIRE_CONFIRMATION,
139
+ totalPrepareOnly: this.byDecision.PREPARE_ONLY,
140
+ totalAllowed: this.byDecision.ALLOW,
141
+ totalRateLimited: this.rateLimited,
142
+ rateLimitedByTier: { ...this.rateLimitedByTier },
143
+ ring: { capacity: this.capacity, size: this.size },
144
+ };
145
+ }
146
+ }
147
+ /** Process-wide singleton used by the server + activity routes. */
148
+ export const activityStore = new ActivityStore();
149
+ //# sourceMappingURL=activityStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activityStore.js","sourceRoot":"","sources":["../../../src/lib/observability/activityStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { type Scope } from "./scopes.js";
2
+ export interface ApiKeyConfig {
3
+ /** At least one key configured via SAFEHANDS_API_KEYS. */
4
+ configured: boolean;
5
+ /** Gate non-public endpoints (only when configured). */
6
+ required: boolean;
7
+ /** Public read API open by default (SAFEHANDS_PUBLIC_READ_ENABLED !== "false"). */
8
+ publicReadEnabled: boolean;
9
+ /** keyId (hash prefix) → full sha256 hex. Never the raw key. */
10
+ hashes: Map<string, string>;
11
+ /** keyId → granted scopes. Bare keys receive the default read bundle. */
12
+ scopes: Map<string, Set<Scope>>;
13
+ }
14
+ export type ApiKeyStatus = "anonymous" | "valid" | "invalid";
15
+ export interface ApiKeyResolution {
16
+ status: ApiKeyStatus;
17
+ keyId: string | null;
18
+ /** Granted scopes for a valid key (null when anonymous/invalid). */
19
+ scopes: Set<Scope> | null;
20
+ }
21
+ type Env = Record<string, string | undefined>;
22
+ type Headers = Record<string, string | string[] | undefined>;
23
+ /**
24
+ * Endpoints that remain open even when SAFEHANDS_REQUIRE_API_KEY=true.
25
+ * The `/paid/*` bundle entrypoints are listed so PUBLIC x402 users/agents reach them
26
+ * without an API key — payment (x402), not an API key, gates those routes. (An explicitly
27
+ * INVALID key is still rejected everywhere except /health.)
28
+ */
29
+ export declare const ALWAYS_OPEN_PATHS: Set<string>;
30
+ export declare function loadApiKeyConfig(env?: Env): ApiKeyConfig;
31
+ /** Extract a presented key from `X-Api-Key` or `Authorization: Bearer <key>`. */
32
+ export declare function extractApiKey(headers: Headers): string | null;
33
+ /**
34
+ * Resolve a request's API-key status. Never returns the raw key. `anonymous`
35
+ * when none presented; `valid` (+keyId) on match; `invalid` otherwise.
36
+ */
37
+ export declare function resolveApiKey(headers: Headers, cfg: ApiKeyConfig): ApiKeyResolution;
38
+ export interface AccessDecision {
39
+ allow: boolean;
40
+ code: string | null;
41
+ }
42
+ /**
43
+ * Pure access decision for a path given the resolved key + config.
44
+ * • /health is always open (Railway healthcheck).
45
+ * • An explicitly INVALID key is rejected everywhere else.
46
+ * • ALWAYS_OPEN paths are open even when keys are required.
47
+ * • When `required`, a valid key is necessary, and the key must carry the
48
+ * endpoint's scope. Scope is only enforced in require-key mode; when the public
49
+ * read API is open (default), scopes are recorded as identity, never gates.
50
+ * (A valid resolution with `scopes` omitted skips the scope check — the live
51
+ * `resolveApiKey` always populates scopes for valid keys.)
52
+ */
53
+ export declare function evaluateAccess(path: string, resolution: ApiKeyResolution, cfg: ApiKeyConfig): AccessDecision;
54
+ export {};
55
+ //# sourceMappingURL=apiKey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiKey.d.ts","sourceRoot":"","sources":["../../../src/lib/observability/apiKey.ts"],"names":[],"mappings":"AAgBA,OAAO,EAA4D,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAEnG,MAAM,WAAW,YAAY;IAC3B,0DAA0D;IAC1D,UAAU,EAAE,OAAO,CAAC;IACpB,wDAAwD;IACxD,QAAQ,EAAE,OAAO,CAAC;IAClB,mFAAmF;IACnF,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gEAAgE;IAChE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,yEAAyE;IACzE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;CACjC;AAED,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;AAE7D,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,oEAAoE;IACpE,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;CAC3B;AAED,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAC9C,KAAK,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;AAE7D;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,aAe5B,CAAC;AAMH,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,GAAiB,GAAG,YAAY,CA2BrE;AAED,iFAAiF;AACjF,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAY7D;AAWD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,gBAAgB,CAUnF;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,gBAAgB,EAC5B,GAAG,EAAE,YAAY,GAChB,cAAc,CAchB"}