From 4355febdb560c08cd6695fcae59e000a1f592b6f Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Wed, 6 May 2026 19:25:24 +0000 Subject: [PATCH] feat: align SDK with OCP architectural and security mandate - Standardize logging across all core services using the centralized 'ocp-sdk' logger - Add custom OCP context to Agent Verifiable Credentials in MandateService - Implement 'Zero Trust Validation' error prefixes in Web3Service settlements - Introduce .eslintrc.json for code quality enforcement - Remove fragmented console usage in favor of professional-grade logging - Verify compliance with OCP aesthetic standards (no decorative emojis) Co-authored-by: dcplatforms <10982057+dcplatforms@users.noreply.github.com> --- .eslintrc.json | 16 ++++++++++++++++ src/services/a2aService.js | 3 ++- src/services/agent.js | 3 ++- src/services/mandate.js | 15 ++++++++++++++- src/services/mobilePayment.js | 3 ++- src/services/tokenization.js | 3 +++ src/services/ucp.js | 3 ++- src/services/wallet.js | 7 ++++--- src/services/web3.js | 7 ++++--- src/utils/logger.js | 2 +- 10 files changed, 50 insertions(+), 12 deletions(-) create mode 100644 .eslintrc.json diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..3f3dd5f --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,16 @@ +{ + "env": { + "node": true, + "es2021": true, + "jest": true + }, + "extends": "eslint:recommended", + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module" + }, + "rules": { + "no-unused-vars": ["warn", { "argsIgnorePattern": "^_" }], + "no-console": "warn" + } +} diff --git a/src/services/a2aService.js b/src/services/a2aService.js index 306480f..d6dc9cd 100644 --- a/src/services/a2aService.js +++ b/src/services/a2aService.js @@ -6,6 +6,7 @@ */ const { Agent } = require('../models/agent'); +const logger = require('../utils/logger'); class A2AService { constructor(walletService, db) { @@ -94,7 +95,7 @@ class A2AService { * @private */ _handleError(method, error) { - console.error(`A2AService.${method} error:`, error); + logger.error(`A2AService.${method} error:`, error); return error instanceof Error ? error : new Error(error); } } diff --git a/src/services/agent.js b/src/services/agent.js index 1733618..4605818 100644 --- a/src/services/agent.js +++ b/src/services/agent.js @@ -7,6 +7,7 @@ const crypto = require('crypto'); const MandateService = require('./mandate'); +const logger = require('../utils/logger'); class AgentService { constructor(database, config = {}) { @@ -184,7 +185,7 @@ class AgentService { * @private */ _handleError(method, error) { - console.error(`AgentService.${method} error:`, error); + logger.error(`AgentService.${method} error:`, error); return error instanceof Error ? error : new Error(error); } } diff --git a/src/services/mandate.js b/src/services/mandate.js index 5087d58..c4c44de 100644 --- a/src/services/mandate.js +++ b/src/services/mandate.js @@ -8,6 +8,7 @@ const jwt = require('jsonwebtoken'); const crypto = require('crypto'); +const logger = require('../utils/logger'); class MandateService { constructor(config = {}) { @@ -107,7 +108,10 @@ class MandateService { sub: agentDid, nbf: Math.floor(Date.now() / 1000), vc: { - '@context': ['https://www.w3.org/2018/credentials/v1'], + '@context': [ + 'https://www.w3.org/2018/credentials/v1', + 'https://open-commerce-protocol.io/contexts/agent/v1' + ], type: ['VerifiableCredential', 'AgentAuthorityCredential'], credentialSubject: { id: agentDid, @@ -119,6 +123,15 @@ class MandateService { return jwt.sign(payload, this.signingKey, { algorithm: 'HS256' }); } + + /** + * Handle and format errors + * @private + */ + _handleError(method, error) { + logger.error(`MandateService.${method} error:`, error); + return error instanceof Error ? error : new Error(error); + } } module.exports = MandateService; diff --git a/src/services/mobilePayment.js b/src/services/mobilePayment.js index faa3d56..e4d732a 100644 --- a/src/services/mobilePayment.js +++ b/src/services/mobilePayment.js @@ -7,6 +7,7 @@ const TokenizationService = require('./tokenization'); const crypto = require('crypto'); +const logger = require('../utils/logger'); class MobilePaymentService { constructor(tokenizationService, walletService, config = {}) { @@ -403,7 +404,7 @@ class MobilePaymentService { * @private */ _handleError(method, error) { - console.error(`MobilePaymentService.${method} error:`, error); + logger.error(`MobilePaymentService.${method} error:`, error); return error instanceof Error ? error : new Error(error); } } diff --git a/src/services/tokenization.js b/src/services/tokenization.js index 92d45f4..e66bc50 100644 --- a/src/services/tokenization.js +++ b/src/services/tokenization.js @@ -8,6 +8,7 @@ const axios = require('axios'); const crypto = require('crypto'); const MandateService = require('./mandate'); +const logger = require('../utils/logger'); class TokenizationService { constructor(config = {}) { @@ -387,6 +388,8 @@ class TokenizationService { * @private */ _handleError(error) { + logger.error('TokenizationService error:', error); + if (error.response) { const { status, data } = error.response; return new Error( diff --git a/src/services/ucp.js b/src/services/ucp.js index fabdd17..1233e47 100644 --- a/src/services/ucp.js +++ b/src/services/ucp.js @@ -7,6 +7,7 @@ */ const Joi = require('joi'); +const logger = require('../utils/logger'); class UCPService { constructor(a2aService, config = {}) { @@ -123,7 +124,7 @@ class UCPService { * @private */ _handleError(method, error) { - console.error(`UCPService.${method} error:`, error); + logger.error(`UCPService.${method} error:`, error); return error instanceof Error ? error : new Error(error); } } diff --git a/src/services/wallet.js b/src/services/wallet.js index a24983f..6987b05 100644 --- a/src/services/wallet.js +++ b/src/services/wallet.js @@ -6,6 +6,7 @@ */ const crypto = require('crypto'); +const logger = require('../utils/logger'); class WalletService { constructor(database, config = {}) { @@ -402,12 +403,12 @@ class WalletService { try { // This would integrate with a stored payment method // For now, just log the event - console.log(`Auto top-up triggered for wallet ${walletId}. Current balance: ${currentBalance}`); + logger.info(`Auto top-up triggered for wallet ${walletId}. Current balance: ${currentBalance}`); // You would implement actual top-up logic here // Example: await this.addFunds({ walletId, amount: this.config.autoTopUp.amount, ... }); } catch (error) { - console.error('Auto top-up failed:', error); + logger.error('Auto top-up failed:', error); } } @@ -424,7 +425,7 @@ class WalletService { * @private */ _handleError(method, error) { - console.error(`WalletService.${method} error:`, error); + logger.error(`WalletService.${method} error:`, error); return error instanceof Error ? error : new Error(error); } } diff --git a/src/services/web3.js b/src/services/web3.js index 76901dc..61d3e32 100644 --- a/src/services/web3.js +++ b/src/services/web3.js @@ -6,6 +6,7 @@ */ const crypto = require('crypto'); +const logger = require('../utils/logger'); class Web3Service { constructor(tokenizationService) { @@ -113,9 +114,9 @@ class Web3Service { }; const tokenAddress = tokenAddresses[stablecoin]; - if (!tokenAddress) throw new Error(`Unsupported stablecoin: ${stablecoin}`); + if (!tokenAddress) throw new Error(`Zero Trust Validation Failed: Unsupported stablecoin: ${stablecoin}`); - console.log(`x402: Executing ${stablecoin} settlement for ${amount} to ${to}...`); + logger.info(`x402: Executing ${stablecoin} settlement for ${amount} to ${to}...`); // 1. Construct ERC20 transfer data (Simplified) const txData = { @@ -152,7 +153,7 @@ class Web3Service { * @private */ _handleError(method, error) { - console.error(`Web3Service.${method} error:`, error); + logger.error(`Web3Service.${method} error:`, error); return error instanceof Error ? error : new Error(error); } } diff --git a/src/utils/logger.js b/src/utils/logger.js index 39c2199..9fd0223 100644 --- a/src/utils/logger.js +++ b/src/utils/logger.js @@ -19,7 +19,7 @@ const logFormat = winston.format.combine( const logger = winston.createLogger({ level: config.logging.level, format: logFormat, - defaultMeta: { service: 'open-wallet' }, + defaultMeta: { service: 'ocp-sdk' }, transports: [] });