@oobe-protocol-labs/sap-mcp-server 0.9.2 → 0.9.3
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.
- package/.env.example +8 -7
- package/CHANGELOG.md +731 -0
- package/README.md +9 -3
- package/USER_DOCS/00_START_HERE.md +51 -4
- package/USER_DOCS/01_HOSTED_REMOTE_MCP.md +1 -1
- package/USER_DOCS/03_PAYMENTS_X402_PAYSH.md +32 -3
- package/USER_DOCS/04_CLIENT_CONFIGS.md +14 -7
- package/USER_DOCS/05_SKILLS_AND_TOOLS.md +68 -8
- package/USER_DOCS/06_DESKTOP_GUI_WIZARD.md +20 -14
- package/USER_DOCS/07_SMITHERY_AND_MARKETPLACES.md +7 -0
- package/config.example.json +5 -4
- package/config.schema.json +9 -4
- package/config.secure-example.json +5 -4
- package/dist/adapters/index.d.ts +7 -1
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +7 -1
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/mcp/errors.d.ts +13 -1
- package/dist/adapters/mcp/errors.d.ts.map +1 -1
- package/dist/adapters/mcp/errors.js +13 -1
- package/dist/adapters/mcp/errors.js.map +1 -1
- package/dist/adapters/mcp/index.d.ts +7 -1
- package/dist/adapters/mcp/index.d.ts.map +1 -1
- package/dist/adapters/mcp/index.js +7 -1
- package/dist/adapters/mcp/index.js.map +1 -1
- package/dist/adapters/mcp/prompt-response.d.ts +13 -1
- package/dist/adapters/mcp/prompt-response.d.ts.map +1 -1
- package/dist/adapters/mcp/prompt-response.js +13 -1
- package/dist/adapters/mcp/prompt-response.js.map +1 -1
- package/dist/adapters/mcp/resource-response.d.ts +14 -1
- package/dist/adapters/mcp/resource-response.d.ts.map +1 -1
- package/dist/adapters/mcp/resource-response.js +14 -1
- package/dist/adapters/mcp/resource-response.js.map +1 -1
- package/dist/adapters/mcp/sdk-compat.d.ts +11 -3
- package/dist/adapters/mcp/sdk-compat.d.ts.map +1 -1
- package/dist/adapters/mcp/sdk-compat.js +232 -25
- package/dist/adapters/mcp/sdk-compat.js.map +1 -1
- package/dist/adapters/mcp/tool-response.d.ts +51 -3
- package/dist/adapters/mcp/tool-response.d.ts.map +1 -1
- package/dist/adapters/mcp/tool-response.js +48 -3
- package/dist/adapters/mcp/tool-response.js.map +1 -1
- package/dist/adapters/solana/commitment.d.ts +14 -2
- package/dist/adapters/solana/commitment.d.ts.map +1 -1
- package/dist/adapters/solana/commitment.js +14 -2
- package/dist/adapters/solana/commitment.js.map +1 -1
- package/dist/adapters/solana/connection.d.ts +11 -2
- package/dist/adapters/solana/connection.d.ts.map +1 -1
- package/dist/adapters/solana/connection.js +11 -2
- package/dist/adapters/solana/connection.js.map +1 -1
- package/dist/adapters/solana/index.d.ts +7 -1
- package/dist/adapters/solana/index.d.ts.map +1 -1
- package/dist/adapters/solana/index.js +7 -1
- package/dist/adapters/solana/index.js.map +1 -1
- package/dist/adapters/solana/public-key.d.ts +11 -2
- package/dist/adapters/solana/public-key.d.ts.map +1 -1
- package/dist/adapters/solana/public-key.js +11 -2
- package/dist/adapters/solana/public-key.js.map +1 -1
- package/dist/config/defaults.d.ts +5 -0
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +5 -0
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/env.d.ts +4 -0
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js +15 -10
- package/dist/config/env.js.map +1 -1
- package/dist/config/index.d.ts +5 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +5 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/mcp-client-injection.d.ts.map +1 -1
- package/dist/config/mcp-client-injection.js +136 -33
- package/dist/config/mcp-client-injection.js.map +1 -1
- package/dist/config/paths.d.ts +14 -1
- package/dist/config/paths.d.ts.map +1 -1
- package/dist/config/paths.js +20 -1
- package/dist/config/paths.js.map +1 -1
- package/dist/config/profiles.d.ts +3 -10
- package/dist/config/profiles.d.ts.map +1 -1
- package/dist/config/profiles.js +5 -0
- package/dist/config/profiles.js.map +1 -1
- package/dist/config/schema.d.ts +5 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +5 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/config/secure-config.d.ts +5 -0
- package/dist/config/secure-config.d.ts.map +1 -1
- package/dist/config/secure-config.js +5 -0
- package/dist/config/secure-config.js.map +1 -1
- package/dist/config/setup.d.ts +5 -0
- package/dist/config/setup.d.ts.map +1 -1
- package/dist/config/setup.js +5 -0
- package/dist/config/setup.js.map +1 -1
- package/dist/config/wizard.d.ts +6 -0
- package/dist/config/wizard.d.ts.map +1 -1
- package/dist/config/wizard.js +102 -18
- package/dist/config/wizard.js.map +1 -1
- package/dist/config-cli.d.ts +3 -13
- package/dist/config-cli.d.ts.map +1 -1
- package/dist/config-cli.js +14 -1
- package/dist/config-cli.js.map +1 -1
- package/dist/core/constants.d.ts +33 -6
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +38 -8
- package/dist/core/constants.js.map +1 -1
- package/dist/core/errors.d.ts +5 -0
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +5 -0
- package/dist/core/errors.js.map +1 -1
- package/dist/core/guards.d.ts +5 -0
- package/dist/core/guards.d.ts.map +1 -1
- package/dist/core/guards.js +3 -1
- package/dist/core/guards.js.map +1 -1
- package/dist/core/index.d.ts +7 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +7 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/logger.js +1 -1
- package/dist/core/result.d.ts +77 -9
- package/dist/core/result.d.ts.map +1 -1
- package/dist/core/result.js +68 -9
- package/dist/core/result.js.map +1 -1
- package/dist/core/types.d.ts +5 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +3 -4
- package/dist/core/types.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/memory/async-processor.d.ts +107 -0
- package/dist/memory/async-processor.d.ts.map +1 -0
- package/dist/memory/async-processor.js +204 -0
- package/dist/memory/async-processor.js.map +1 -0
- package/dist/memory/auto-record.d.ts +47 -0
- package/dist/memory/auto-record.d.ts.map +1 -0
- package/dist/memory/auto-record.js +133 -0
- package/dist/memory/auto-record.js.map +1 -0
- package/dist/memory/database.d.ts +103 -0
- package/dist/memory/database.d.ts.map +1 -0
- package/dist/memory/database.js +337 -0
- package/dist/memory/database.js.map +1 -0
- package/dist/memory/hermes-bridge.d.ts +70 -0
- package/dist/memory/hermes-bridge.d.ts.map +1 -0
- package/dist/memory/hermes-bridge.js +155 -0
- package/dist/memory/hermes-bridge.js.map +1 -0
- package/dist/memory/index.d.ts +23 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +22 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/memory-store.d.ts +76 -0
- package/dist/memory/memory-store.d.ts.map +1 -0
- package/dist/memory/memory-store.js +231 -0
- package/dist/memory/memory-store.js.map +1 -0
- package/dist/memory/stream-buffer-store.d.ts +69 -0
- package/dist/memory/stream-buffer-store.d.ts.map +1 -0
- package/dist/memory/stream-buffer-store.js +182 -0
- package/dist/memory/stream-buffer-store.js.map +1 -0
- package/dist/memory/tool-call-store.d.ts +68 -0
- package/dist/memory/tool-call-store.d.ts.map +1 -0
- package/dist/memory/tool-call-store.js +189 -0
- package/dist/memory/tool-call-store.js.map +1 -0
- package/dist/memory/types.d.ts +197 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +15 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/memory/utils.d.ts +30 -0
- package/dist/memory/utils.d.ts.map +1 -0
- package/dist/memory/utils.js +47 -0
- package/dist/memory/utils.js.map +1 -0
- package/dist/payments/facilitator-rpc-fallback.d.ts.map +1 -1
- package/dist/payments/facilitator-rpc-fallback.js +95 -0
- package/dist/payments/facilitator-rpc-fallback.js.map +1 -1
- package/dist/payments/hosted-tool-eligibility.d.ts +22 -0
- package/dist/payments/hosted-tool-eligibility.d.ts.map +1 -0
- package/dist/payments/hosted-tool-eligibility.js +173 -0
- package/dist/payments/hosted-tool-eligibility.js.map +1 -0
- package/dist/payments/index.d.ts +2 -2
- package/dist/payments/index.d.ts.map +1 -1
- package/dist/payments/index.js +1 -1
- package/dist/payments/index.js.map +1 -1
- package/dist/payments/mcp-session-cache.d.ts +35 -0
- package/dist/payments/mcp-session-cache.d.ts.map +1 -0
- package/dist/payments/mcp-session-cache.js +83 -0
- package/dist/payments/mcp-session-cache.js.map +1 -0
- package/dist/payments/monetization-gate.d.ts +33 -0
- package/dist/payments/monetization-gate.d.ts.map +1 -1
- package/dist/payments/monetization-gate.js +124 -12
- package/dist/payments/monetization-gate.js.map +1 -1
- package/dist/payments/pricing.d.ts +31 -0
- package/dist/payments/pricing.d.ts.map +1 -1
- package/dist/payments/pricing.js +317 -19
- package/dist/payments/pricing.js.map +1 -1
- package/dist/payments/usage-ledger.d.ts +36 -2
- package/dist/payments/usage-ledger.d.ts.map +1 -1
- package/dist/payments/usage-ledger.js +121 -4
- package/dist/payments/usage-ledger.js.map +1 -1
- package/dist/payments/x402-paid-call.d.ts +121 -0
- package/dist/payments/x402-paid-call.d.ts.map +1 -1
- package/dist/payments/x402-paid-call.js +428 -1
- package/dist/payments/x402-paid-call.js.map +1 -1
- package/dist/policy/default-policies.d.ts +18 -2
- package/dist/policy/default-policies.d.ts.map +1 -1
- package/dist/policy/default-policies.js +18 -2
- package/dist/policy/default-policies.js.map +1 -1
- package/dist/policy/index.d.ts +6 -3
- package/dist/policy/index.d.ts.map +1 -1
- package/dist/policy/index.js +6 -3
- package/dist/policy/index.js.map +1 -1
- package/dist/policy/local-policy-engine.d.ts +71 -13
- package/dist/policy/local-policy-engine.d.ts.map +1 -1
- package/dist/policy/local-policy-engine.js +33 -11
- package/dist/policy/local-policy-engine.js.map +1 -1
- package/dist/policy/permission-checks.d.ts +29 -3
- package/dist/policy/permission-checks.d.ts.map +1 -1
- package/dist/policy/permission-checks.js +29 -3
- package/dist/policy/permission-checks.js.map +1 -1
- package/dist/policy/policy-engine.d.ts +22 -2
- package/dist/policy/policy-engine.d.ts.map +1 -1
- package/dist/policy/policy-engine.js +22 -2
- package/dist/policy/policy-engine.js.map +1 -1
- package/dist/policy/policy-types.d.ts +55 -5
- package/dist/policy/policy-types.d.ts.map +1 -1
- package/dist/policy/policy-types.js +8 -1
- package/dist/policy/policy-types.js.map +1 -1
- package/dist/policy/risk-level.d.ts +32 -3
- package/dist/policy/risk-level.d.ts.map +1 -1
- package/dist/policy/risk-level.js +32 -3
- package/dist/policy/risk-level.js.map +1 -1
- package/dist/policy/spending-limits.d.ts +29 -3
- package/dist/policy/spending-limits.d.ts.map +1 -1
- package/dist/policy/spending-limits.js +29 -3
- package/dist/policy/spending-limits.js.map +1 -1
- package/dist/premium/activation-manager.d.ts +43 -0
- package/dist/premium/activation-manager.d.ts.map +1 -0
- package/dist/premium/activation-manager.js +131 -0
- package/dist/premium/activation-manager.js.map +1 -0
- package/dist/premium/builtin-plugins.d.ts +165 -0
- package/dist/premium/builtin-plugins.d.ts.map +1 -0
- package/dist/premium/builtin-plugins.js +422 -0
- package/dist/premium/builtin-plugins.js.map +1 -0
- package/dist/premium/event-store.d.ts +61 -0
- package/dist/premium/event-store.d.ts.map +1 -0
- package/dist/premium/event-store.js +130 -0
- package/dist/premium/event-store.js.map +1 -0
- package/dist/premium/index.d.ts +54 -0
- package/dist/premium/index.d.ts.map +1 -0
- package/dist/premium/index.js +54 -0
- package/dist/premium/index.js.map +1 -0
- package/dist/premium/manifest-builder.d.ts +65 -0
- package/dist/premium/manifest-builder.d.ts.map +1 -0
- package/dist/premium/manifest-builder.js +182 -0
- package/dist/premium/manifest-builder.js.map +1 -0
- package/dist/premium/meme-radar-capabilities.d.ts +38 -0
- package/dist/premium/meme-radar-capabilities.d.ts.map +1 -0
- package/dist/premium/meme-radar-capabilities.js +306 -0
- package/dist/premium/meme-radar-capabilities.js.map +1 -0
- package/dist/premium/metrics.d.ts +27 -0
- package/dist/premium/metrics.d.ts.map +1 -0
- package/dist/premium/metrics.js +65 -0
- package/dist/premium/metrics.js.map +1 -0
- package/dist/premium/plugin-validator.d.ts +39 -0
- package/dist/premium/plugin-validator.d.ts.map +1 -0
- package/dist/premium/plugin-validator.js +325 -0
- package/dist/premium/plugin-validator.js.map +1 -0
- package/dist/premium/private-manifest-loader.d.ts +111 -0
- package/dist/premium/private-manifest-loader.d.ts.map +1 -0
- package/dist/premium/private-manifest-loader.js +285 -0
- package/dist/premium/private-manifest-loader.js.map +1 -0
- package/dist/premium/provider-bridge.d.ts +133 -0
- package/dist/premium/provider-bridge.d.ts.map +1 -0
- package/dist/premium/provider-bridge.js +349 -0
- package/dist/premium/provider-bridge.js.map +1 -0
- package/dist/premium/session-manager.d.ts +125 -0
- package/dist/premium/session-manager.d.ts.map +1 -0
- package/dist/premium/session-manager.js +337 -0
- package/dist/premium/session-manager.js.map +1 -0
- package/dist/premium/stream-broker.d.ts +98 -0
- package/dist/premium/stream-broker.d.ts.map +1 -0
- package/dist/premium/stream-broker.js +199 -0
- package/dist/premium/stream-broker.js.map +1 -0
- package/dist/premium/tech-fundamentals-capabilities.d.ts +37 -0
- package/dist/premium/tech-fundamentals-capabilities.d.ts.map +1 -0
- package/dist/premium/tech-fundamentals-capabilities.js +283 -0
- package/dist/premium/tech-fundamentals-capabilities.js.map +1 -0
- package/dist/premium/trading-capabilities.d.ts +36 -0
- package/dist/premium/trading-capabilities.d.ts.map +1 -0
- package/dist/premium/trading-capabilities.js +205 -0
- package/dist/premium/trading-capabilities.js.map +1 -0
- package/dist/premium/types.d.ts +518 -0
- package/dist/premium/types.d.ts.map +1 -0
- package/dist/premium/types.js +23 -0
- package/dist/premium/types.js.map +1 -0
- package/dist/premium/webhook-engine.d.ts +138 -0
- package/dist/premium/webhook-engine.d.ts.map +1 -0
- package/dist/premium/webhook-engine.js +516 -0
- package/dist/premium/webhook-engine.js.map +1 -0
- package/dist/prompts/context/sap-agent-context.prompt.d.ts +5 -0
- package/dist/prompts/context/sap-agent-context.prompt.d.ts.map +1 -1
- package/dist/prompts/context/sap-agent-context.prompt.js +20 -16
- package/dist/prompts/context/sap-agent-context.prompt.js.map +1 -1
- package/dist/prompts/context/sap-agent-intent-router.prompt.d.ts +14 -0
- package/dist/prompts/context/sap-agent-intent-router.prompt.d.ts.map +1 -0
- package/dist/prompts/context/sap-agent-intent-router.prompt.js +155 -0
- package/dist/prompts/context/sap-agent-intent-router.prompt.js.map +1 -0
- package/dist/prompts/context/sap-agent-start.prompt.js +7 -0
- package/dist/prompts/context/sap-agent-start.prompt.js.map +1 -1
- package/dist/prompts/developer/debug-sap-error.prompt.d.ts +5 -0
- package/dist/prompts/developer/debug-sap-error.prompt.d.ts.map +1 -1
- package/dist/prompts/developer/debug-sap-error.prompt.js +3 -4
- package/dist/prompts/developer/debug-sap-error.prompt.js.map +1 -1
- package/dist/prompts/developer/generate-sap-integration.prompt.d.ts +5 -0
- package/dist/prompts/developer/generate-sap-integration.prompt.d.ts.map +1 -1
- package/dist/prompts/developer/generate-sap-integration.prompt.js +3 -4
- package/dist/prompts/developer/generate-sap-integration.prompt.js.map +1 -1
- package/dist/prompts/developer/index.d.ts +4 -1
- package/dist/prompts/developer/index.d.ts.map +1 -1
- package/dist/prompts/developer/index.js +4 -1
- package/dist/prompts/developer/index.js.map +1 -1
- package/dist/prompts/execution-proof/explain-proof-of-execution.prompt.d.ts +5 -0
- package/dist/prompts/execution-proof/explain-proof-of-execution.prompt.d.ts.map +1 -1
- package/dist/prompts/execution-proof/explain-proof-of-execution.prompt.js +3 -4
- package/dist/prompts/execution-proof/explain-proof-of-execution.prompt.js.map +1 -1
- package/dist/prompts/execution-proof/index.d.ts +4 -1
- package/dist/prompts/execution-proof/index.d.ts.map +1 -1
- package/dist/prompts/execution-proof/index.js +4 -1
- package/dist/prompts/execution-proof/index.js.map +1 -1
- package/dist/prompts/execution-proof/verify-execution-proof.prompt.d.ts +5 -0
- package/dist/prompts/execution-proof/verify-execution-proof.prompt.d.ts.map +1 -1
- package/dist/prompts/execution-proof/verify-execution-proof.prompt.js +3 -4
- package/dist/prompts/execution-proof/verify-execution-proof.prompt.js.map +1 -1
- package/dist/prompts/index.d.ts +4 -1
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +4 -1
- package/dist/prompts/index.js.map +1 -1
- package/dist/prompts/payments/create-paid-api.prompt.d.ts +5 -0
- package/dist/prompts/payments/create-paid-api.prompt.d.ts.map +1 -1
- package/dist/prompts/payments/create-paid-api.prompt.js +3 -4
- package/dist/prompts/payments/create-paid-api.prompt.js.map +1 -1
- package/dist/prompts/payments/explain-x402-settlement.prompt.d.ts +5 -0
- package/dist/prompts/payments/explain-x402-settlement.prompt.d.ts.map +1 -1
- package/dist/prompts/payments/explain-x402-settlement.prompt.js +4 -5
- package/dist/prompts/payments/explain-x402-settlement.prompt.js.map +1 -1
- package/dist/prompts/payments/index.d.ts +4 -1
- package/dist/prompts/payments/index.d.ts.map +1 -1
- package/dist/prompts/payments/index.js +4 -1
- package/dist/prompts/payments/index.js.map +1 -1
- package/dist/prompts/register-prompts.d.ts +18 -2
- package/dist/prompts/register-prompts.d.ts.map +1 -1
- package/dist/prompts/register-prompts.js +21 -3
- package/dist/prompts/register-prompts.js.map +1 -1
- package/dist/prompts/registry/analyze-sap-agent.prompt.d.ts +5 -0
- package/dist/prompts/registry/analyze-sap-agent.prompt.d.ts.map +1 -1
- package/dist/prompts/registry/analyze-sap-agent.prompt.js +3 -4
- package/dist/prompts/registry/analyze-sap-agent.prompt.js.map +1 -1
- package/dist/prompts/registry/index.d.ts +4 -1
- package/dist/prompts/registry/index.d.ts.map +1 -1
- package/dist/prompts/registry/index.js +4 -1
- package/dist/prompts/registry/index.js.map +1 -1
- package/dist/prompts/registry/register-sap-agent.prompt.d.ts +5 -0
- package/dist/prompts/registry/register-sap-agent.prompt.d.ts.map +1 -1
- package/dist/prompts/registry/register-sap-agent.prompt.js +22 -23
- package/dist/prompts/registry/register-sap-agent.prompt.js.map +1 -1
- package/dist/remote/premium-memory.d.ts +90 -0
- package/dist/remote/premium-memory.d.ts.map +1 -0
- package/dist/remote/premium-memory.js +161 -0
- package/dist/remote/premium-memory.js.map +1 -0
- package/dist/remote/premium-routes.d.ts +99 -0
- package/dist/remote/premium-routes.d.ts.map +1 -0
- package/dist/remote/premium-routes.js +347 -0
- package/dist/remote/premium-routes.js.map +1 -0
- package/dist/remote/public-home/sections.d.ts.map +1 -1
- package/dist/remote/public-home/sections.js +23 -4
- package/dist/remote/public-home/sections.js.map +1 -1
- package/dist/remote/public-home/types.d.ts +9 -0
- package/dist/remote/public-home/types.d.ts.map +1 -1
- package/dist/remote/server.d.ts +20 -0
- package/dist/remote/server.d.ts.map +1 -1
- package/dist/remote/server.js +369 -8
- package/dist/remote/server.js.map +1 -1
- package/dist/remote/tx-relay.d.ts +42 -0
- package/dist/remote/tx-relay.d.ts.map +1 -0
- package/dist/remote/tx-relay.js +118 -0
- package/dist/remote/tx-relay.js.map +1 -0
- package/dist/resources/current/sap-current-config.resource.d.ts +5 -0
- package/dist/resources/current/sap-current-config.resource.d.ts.map +1 -1
- package/dist/resources/current/sap-current-config.resource.js +2 -5
- package/dist/resources/current/sap-current-config.resource.js.map +1 -1
- package/dist/resources/execution-proof/index.d.ts +5 -0
- package/dist/resources/execution-proof/index.d.ts.map +1 -1
- package/dist/resources/execution-proof/index.js +5 -0
- package/dist/resources/execution-proof/index.js.map +1 -1
- package/dist/resources/execution-proof/sap-execution-record.resource.d.ts +5 -0
- package/dist/resources/execution-proof/sap-execution-record.resource.d.ts.map +1 -1
- package/dist/resources/execution-proof/sap-execution-record.resource.js +3 -4
- package/dist/resources/execution-proof/sap-execution-record.resource.js.map +1 -1
- package/dist/resources/index.d.ts +5 -0
- package/dist/resources/index.d.ts.map +1 -1
- package/dist/resources/index.js +5 -0
- package/dist/resources/index.js.map +1 -1
- package/dist/resources/memory/index.d.ts +5 -0
- package/dist/resources/memory/index.d.ts.map +1 -1
- package/dist/resources/memory/index.js +5 -0
- package/dist/resources/memory/index.js.map +1 -1
- package/dist/resources/memory/sap-memory.resource.d.ts +5 -0
- package/dist/resources/memory/sap-memory.resource.d.ts.map +1 -1
- package/dist/resources/memory/sap-memory.resource.js +3 -4
- package/dist/resources/memory/sap-memory.resource.js.map +1 -1
- package/dist/resources/profile/sap-active-profile.resource.d.ts +5 -0
- package/dist/resources/profile/sap-active-profile.resource.d.ts.map +1 -1
- package/dist/resources/profile/sap-active-profile.resource.js +2 -5
- package/dist/resources/profile/sap-active-profile.resource.js.map +1 -1
- package/dist/resources/register-resources.d.ts +5 -0
- package/dist/resources/register-resources.d.ts.map +1 -1
- package/dist/resources/register-resources.js +3 -1
- package/dist/resources/register-resources.js.map +1 -1
- package/dist/resources/registry/index.d.ts +5 -0
- package/dist/resources/registry/index.d.ts.map +1 -1
- package/dist/resources/registry/index.js +5 -0
- package/dist/resources/registry/index.js.map +1 -1
- package/dist/resources/registry/sap-agent.resource.d.ts +5 -0
- package/dist/resources/registry/sap-agent.resource.d.ts.map +1 -1
- package/dist/resources/registry/sap-agent.resource.js +3 -4
- package/dist/resources/registry/sap-agent.resource.js.map +1 -1
- package/dist/resources/registry/sap-global-registry.resource.d.ts +18 -4
- package/dist/resources/registry/sap-global-registry.resource.d.ts.map +1 -1
- package/dist/resources/registry/sap-global-registry.resource.js +18 -4
- package/dist/resources/registry/sap-global-registry.resource.js.map +1 -1
- package/dist/resources/reputation/index.d.ts +4 -1
- package/dist/resources/reputation/index.d.ts.map +1 -1
- package/dist/resources/reputation/index.js +4 -1
- package/dist/resources/reputation/index.js.map +1 -1
- package/dist/resources/reputation/sap-reputation.resource.d.ts +18 -4
- package/dist/resources/reputation/sap-reputation.resource.d.ts.map +1 -1
- package/dist/resources/reputation/sap-reputation.resource.js +18 -4
- package/dist/resources/reputation/sap-reputation.resource.js.map +1 -1
- package/dist/resources/tool-schema/index.d.ts +4 -1
- package/dist/resources/tool-schema/index.d.ts.map +1 -1
- package/dist/resources/tool-schema/index.js +4 -1
- package/dist/resources/tool-schema/index.js.map +1 -1
- package/dist/resources/tool-schema/sap-tool-schema.resource.d.ts +18 -4
- package/dist/resources/tool-schema/sap-tool-schema.resource.d.ts.map +1 -1
- package/dist/resources/tool-schema/sap-tool-schema.resource.js +18 -4
- package/dist/resources/tool-schema/sap-tool-schema.resource.js.map +1 -1
- package/dist/sap/index.d.ts +7 -1
- package/dist/sap/index.d.ts.map +1 -1
- package/dist/sap/index.js +7 -1
- package/dist/sap/index.js.map +1 -1
- package/dist/sap/sap-client-manager.d.ts +80 -13
- package/dist/sap/sap-client-manager.d.ts.map +1 -1
- package/dist/sap/sap-client-manager.js +80 -13
- package/dist/sap/sap-client-manager.js.map +1 -1
- package/dist/sap/sap-errors.d.ts +22 -3
- package/dist/sap/sap-errors.d.ts.map +1 -1
- package/dist/sap/sap-errors.js +22 -3
- package/dist/sap/sap-errors.js.map +1 -1
- package/dist/sap/sap-types.d.ts +75 -6
- package/dist/sap/sap-types.d.ts.map +1 -1
- package/dist/sap/sap-types.js +11 -1
- package/dist/sap/sap-types.js.map +1 -1
- package/dist/schemas/common.schema.d.ts +45 -8
- package/dist/schemas/common.schema.d.ts.map +1 -1
- package/dist/schemas/common.schema.js +45 -8
- package/dist/schemas/common.schema.js.map +1 -1
- package/dist/schemas/developer.schema.d.ts +22 -3
- package/dist/schemas/developer.schema.d.ts.map +1 -1
- package/dist/schemas/developer.schema.js +22 -3
- package/dist/schemas/developer.schema.js.map +1 -1
- package/dist/schemas/execution-proof.schema.d.ts +29 -4
- package/dist/schemas/execution-proof.schema.d.ts.map +1 -1
- package/dist/schemas/execution-proof.schema.js +29 -4
- package/dist/schemas/execution-proof.schema.js.map +1 -1
- package/dist/schemas/identity.schema.d.ts +23 -3
- package/dist/schemas/identity.schema.d.ts.map +1 -1
- package/dist/schemas/identity.schema.js +23 -3
- package/dist/schemas/identity.schema.js.map +1 -1
- package/dist/schemas/index.d.ts +11 -1
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +11 -1
- package/dist/schemas/index.js.map +1 -1
- package/dist/schemas/memory.schema.d.ts +23 -3
- package/dist/schemas/memory.schema.d.ts.map +1 -1
- package/dist/schemas/memory.schema.js +23 -3
- package/dist/schemas/memory.schema.js.map +1 -1
- package/dist/schemas/payments.schema.d.ts +24 -3
- package/dist/schemas/payments.schema.d.ts.map +1 -1
- package/dist/schemas/payments.schema.js +24 -3
- package/dist/schemas/payments.schema.js.map +1 -1
- package/dist/schemas/registry.schema.d.ts +38 -6
- package/dist/schemas/registry.schema.d.ts.map +1 -1
- package/dist/schemas/registry.schema.js +36 -4
- package/dist/schemas/registry.schema.js.map +1 -1
- package/dist/schemas/reputation.schema.d.ts +22 -3
- package/dist/schemas/reputation.schema.d.ts.map +1 -1
- package/dist/schemas/reputation.schema.js +22 -3
- package/dist/schemas/reputation.schema.js.map +1 -1
- package/dist/schemas/settlement.schema.d.ts +31 -4
- package/dist/schemas/settlement.schema.d.ts.map +1 -1
- package/dist/schemas/settlement.schema.js +31 -4
- package/dist/schemas/settlement.schema.js.map +1 -1
- package/dist/schemas/tool-schema.schema.d.ts +29 -3
- package/dist/schemas/tool-schema.schema.d.ts.map +1 -1
- package/dist/schemas/tool-schema.schema.js +29 -3
- package/dist/schemas/tool-schema.schema.js.map +1 -1
- package/dist/schemas/transaction.schema.d.ts +23 -3
- package/dist/schemas/transaction.schema.d.ts.map +1 -1
- package/dist/schemas/transaction.schema.js +23 -3
- package/dist/schemas/transaction.schema.js.map +1 -1
- package/dist/security/approval-required.d.ts +19 -2
- package/dist/security/approval-required.d.ts.map +1 -1
- package/dist/security/approval-required.js +19 -2
- package/dist/security/approval-required.js.map +1 -1
- package/dist/security/index.d.ts +7 -1
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +7 -1
- package/dist/security/index.js.map +1 -1
- package/dist/security/private-key-guard.d.ts +18 -2
- package/dist/security/private-key-guard.d.ts.map +1 -1
- package/dist/security/private-key-guard.js +19 -2
- package/dist/security/private-key-guard.js.map +1 -1
- package/dist/security/prompt-injection-notes.d.ts +10 -1
- package/dist/security/prompt-injection-notes.d.ts.map +1 -1
- package/dist/security/prompt-injection-notes.js +10 -1
- package/dist/security/prompt-injection-notes.js.map +1 -1
- package/dist/security/tool-permissions.d.ts.map +1 -1
- package/dist/security/tool-permissions.js +12 -0
- package/dist/security/tool-permissions.js.map +1 -1
- package/dist/security/unsafe-action-guard.d.ts +36 -10
- package/dist/security/unsafe-action-guard.d.ts.map +1 -1
- package/dist/security/unsafe-action-guard.js +67 -15
- package/dist/security/unsafe-action-guard.js.map +1 -1
- package/dist/server/create-server.d.ts +18 -3
- package/dist/server/create-server.d.ts.map +1 -1
- package/dist/server/create-server.js +18 -3
- package/dist/server/create-server.js.map +1 -1
- package/dist/server/index.d.ts +6 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +6 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/register-capabilities.d.ts +17 -2
- package/dist/server/register-capabilities.d.ts.map +1 -1
- package/dist/server/register-capabilities.js +17 -2
- package/dist/server/register-capabilities.js.map +1 -1
- package/dist/server/server-metadata.d.ts +35 -1
- package/dist/server/server-metadata.d.ts.map +1 -1
- package/dist/server/server-metadata.js +36 -2
- package/dist/server/server-metadata.js.map +1 -1
- package/dist/session/agent-session.d.ts +35 -4
- package/dist/session/agent-session.d.ts.map +1 -1
- package/dist/session/agent-session.js +35 -4
- package/dist/session/agent-session.js.map +1 -1
- package/dist/session/delegated-session.d.ts +31 -3
- package/dist/session/delegated-session.d.ts.map +1 -1
- package/dist/session/delegated-session.js +31 -3
- package/dist/session/delegated-session.js.map +1 -1
- package/dist/session/index.d.ts +7 -1
- package/dist/session/index.d.ts.map +1 -1
- package/dist/session/index.js +7 -1
- package/dist/session/index.js.map +1 -1
- package/dist/session/redis-session-store.d.ts +94 -21
- package/dist/session/redis-session-store.d.ts.map +1 -1
- package/dist/session/redis-session-store.js +87 -20
- package/dist/session/redis-session-store.js.map +1 -1
- package/dist/session/session-limits.d.ts +34 -4
- package/dist/session/session-limits.d.ts.map +1 -1
- package/dist/session/session-limits.js +34 -4
- package/dist/session/session-limits.js.map +1 -1
- package/dist/session/session-permissions.d.ts +57 -7
- package/dist/session/session-permissions.d.ts.map +1 -1
- package/dist/session/session-permissions.js +57 -7
- package/dist/session/session-permissions.js.map +1 -1
- package/dist/session/session-store.d.ts +9 -1
- package/dist/session/session-store.d.ts.map +1 -1
- package/dist/session/session-store.js +18 -3
- package/dist/session/session-store.js.map +1 -1
- package/dist/session/session-types.d.ts +33 -4
- package/dist/session/session-types.d.ts.map +1 -1
- package/dist/session/session-types.js +9 -1
- package/dist/session/session-types.js.map +1 -1
- package/dist/signer/index.d.ts +7 -1
- package/dist/signer/index.d.ts.map +1 -1
- package/dist/signer/index.js +7 -1
- package/dist/signer/index.js.map +1 -1
- package/dist/signer/load-keypair.d.ts +25 -4
- package/dist/signer/load-keypair.d.ts.map +1 -1
- package/dist/signer/load-keypair.js +25 -4
- package/dist/signer/load-keypair.js.map +1 -1
- package/dist/signer/local-keypair-signer.d.ts +19 -3
- package/dist/signer/local-keypair-signer.d.ts.map +1 -1
- package/dist/signer/local-keypair-signer.js +24 -4
- package/dist/signer/local-keypair-signer.js.map +1 -1
- package/dist/signer/signer-resolver.d.ts +19 -2
- package/dist/signer/signer-resolver.d.ts.map +1 -1
- package/dist/signer/signer-resolver.js +26 -3
- package/dist/signer/signer-resolver.js.map +1 -1
- package/dist/signer/signer-types.d.ts +47 -5
- package/dist/signer/signer-types.d.ts.map +1 -1
- package/dist/signer/signer-types.js +13 -1
- package/dist/signer/signer-types.js.map +1 -1
- package/dist/strategies/strategy-store.d.ts +82 -0
- package/dist/strategies/strategy-store.d.ts.map +1 -0
- package/dist/strategies/strategy-store.js +165 -0
- package/dist/strategies/strategy-store.js.map +1 -0
- package/dist/tools/agent-start-tool.d.ts.map +1 -1
- package/dist/tools/agent-start-tool.js +481 -5
- package/dist/tools/agent-start-tool.js.map +1 -1
- package/dist/tools/client-sdk-tools.d.ts.map +1 -1
- package/dist/tools/client-sdk-tools.js +32 -7
- package/dist/tools/client-sdk-tools.js.map +1 -1
- package/dist/tools/estimate-tool-cost.d.ts +13 -0
- package/dist/tools/estimate-tool-cost.d.ts.map +1 -0
- package/dist/tools/estimate-tool-cost.js +139 -0
- package/dist/tools/estimate-tool-cost.js.map +1 -0
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +11 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/magicblock-tools.d.ts +31 -6
- package/dist/tools/magicblock-tools.d.ts.map +1 -1
- package/dist/tools/magicblock-tools.js +178 -53
- package/dist/tools/magicblock-tools.js.map +1 -1
- package/dist/tools/memory-tools.d.ts +26 -0
- package/dist/tools/memory-tools.d.ts.map +1 -0
- package/dist/tools/memory-tools.js +533 -0
- package/dist/tools/memory-tools.js.map +1 -0
- package/dist/tools/perp-tools.d.ts +39 -0
- package/dist/tools/perp-tools.d.ts.map +1 -0
- package/dist/tools/perp-tools.js +1110 -0
- package/dist/tools/perp-tools.js.map +1 -0
- package/dist/tools/premium-tools.d.ts +8 -0
- package/dist/tools/premium-tools.d.ts.map +1 -0
- package/dist/tools/premium-tools.js +1102 -0
- package/dist/tools/premium-tools.js.map +1 -0
- package/dist/tools/profile-tools.d.ts.map +1 -1
- package/dist/tools/profile-tools.js +18 -1
- package/dist/tools/profile-tools.js.map +1 -1
- package/dist/tools/quick-context-tool.d.ts +16 -0
- package/dist/tools/quick-context-tool.d.ts.map +1 -0
- package/dist/tools/quick-context-tool.js +304 -0
- package/dist/tools/quick-context-tool.js.map +1 -0
- package/dist/tools/register-tools.d.ts.map +1 -1
- package/dist/tools/register-tools.js +17 -0
- package/dist/tools/register-tools.js.map +1 -1
- package/dist/tools/sap-sdk-tools.d.ts +419 -0
- package/dist/tools/sap-sdk-tools.d.ts.map +1 -1
- package/dist/tools/sap-sdk-tools.js +1547 -126
- package/dist/tools/sap-sdk-tools.js.map +1 -1
- package/dist/tools/sap-sns-tools.d.ts +2 -2
- package/dist/tools/sap-sns-tools.d.ts.map +1 -1
- package/dist/tools/sap-sns-tools.js +12 -8
- package/dist/tools/sap-sns-tools.js.map +1 -1
- package/dist/tools/skills-tools.d.ts +16 -0
- package/dist/tools/skills-tools.d.ts.map +1 -1
- package/dist/tools/skills-tools.js +282 -5
- package/dist/tools/skills-tools.js.map +1 -1
- package/dist/tools/tool-aliases.d.ts.map +1 -1
- package/dist/tools/tool-aliases.js +7 -0
- package/dist/tools/tool-aliases.js.map +1 -1
- package/dist/tools/transaction-tools.d.ts +135 -0
- package/dist/tools/transaction-tools.d.ts.map +1 -1
- package/dist/tools/transaction-tools.js +515 -16
- package/dist/tools/transaction-tools.js.map +1 -1
- package/dist/tools/x402-paid-call-tool.d.ts.map +1 -1
- package/dist/tools/x402-paid-call-tool.js +756 -23
- package/dist/tools/x402-paid-call-tool.js.map +1 -1
- package/dist/transports/index.d.ts +6 -1
- package/dist/transports/index.d.ts.map +1 -1
- package/dist/transports/index.js +6 -1
- package/dist/transports/index.js.map +1 -1
- package/dist/transports/stdio.d.ts +17 -5
- package/dist/transports/stdio.d.ts.map +1 -1
- package/dist/transports/stdio.js +17 -5
- package/dist/transports/stdio.js.map +1 -1
- package/dist/tui/wizard-save.d.ts +88 -8
- package/dist/tui/wizard-save.d.ts.map +1 -1
- package/dist/tui/wizard-save.js +77 -8
- package/dist/tui/wizard-save.js.map +1 -1
- package/dist/wizard-core/desktop-flow.d.ts.map +1 -1
- package/dist/wizard-core/desktop-flow.js +4 -2
- package/dist/wizard-core/desktop-flow.js.map +1 -1
- package/docs/03_CONFIGURATION_AND_WIZARD.md +5 -3
- package/docs/06_PAYMENTS_X402_AND_PAYSH.md +82 -4
- package/docs/07_ENDPOINTS_AND_CLIENTS.md +7 -3
- package/docs/09_TOOLS_SKILLS_AND_AGENT_GUIDE.md +21 -3
- package/docs/14_DESKTOP_WIZARD_RELEASE.md +8 -6
- package/docs/16_SAP_AGENT_IDENTITY_PIPELINE.md +304 -0
- package/docs/18_PREMIUM_PLUGIN_RUNTIME.md +108 -0
- package/docs/BRANCH_AND_CI.md +67 -0
- package/docs/README.md +19 -2
- package/docs/magicblock-tools.md +70 -29
- package/package.json +10 -6
- package/server.json +3 -3
- package/skills/README.md +12 -2
- package/skills/sap-agent-registry/SKILL.md +99 -4
- package/skills/sap-defi/SKILL.md +8 -4
- package/skills/sap-discovery-indexing/SKILL.md +26 -4
- package/skills/sap-escrow-settlement/SKILL.md +22 -4
- package/skills/sap-mcp/SKILL.md +140 -22
- package/skills/sap-mcp/TOOL_REFERENCE.md +47 -7
- package/skills/sap-nft-metaplex/SKILL.md +22 -0
- package/skills/sap-operations/SKILL.md +32 -3
- package/skills/sap-payments-x402/SKILL.md +85 -8
- package/skills/sap-sns/SKILL.md +32 -10
- package/smithery.config.schema.json +7 -0
|
@@ -12,11 +12,13 @@ import { Connection, PublicKey } from '@solana/web3.js';
|
|
|
12
12
|
import { loadConfig } from '../config/env.js';
|
|
13
13
|
import { getActiveProfile, getProfileConfigPath } from '../config/profiles.js';
|
|
14
14
|
import { MCP_SERVER_VERSION } from '../core/constants.js';
|
|
15
|
+
import { getCachedSession, cacheSession, invalidateSession } from './mcp-session-cache.js';
|
|
15
16
|
export const DEFAULT_X402_PAID_CALL_ENDPOINT = 'https://mcp.sap.oobeprotocol.ai/mcp';
|
|
16
17
|
const MCP_PROTOCOL_VERSION = '2025-06-18';
|
|
17
18
|
const DEFAULT_MAX_ATTEMPTS = 3;
|
|
18
19
|
const MAX_ALLOWED_ATTEMPTS = 5;
|
|
19
20
|
const RETRY_BASE_DELAY_MS = 500;
|
|
21
|
+
const MAX_EXTERNAL_BODY_BYTES = 256 * 1024;
|
|
20
22
|
const MAINNET_USDC_MINT = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v';
|
|
21
23
|
const DEVNET_USDC_MINT = '4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU';
|
|
22
24
|
/**
|
|
@@ -59,6 +61,167 @@ export async function executeX402PaidCall(input) {
|
|
|
59
61
|
}
|
|
60
62
|
throw new Error('x402 paid call exhausted retries.');
|
|
61
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* @name executeX402BatchPaidCall
|
|
66
|
+
* @description Executes multiple paid tool calls in parallel with a shared MCP session.
|
|
67
|
+
* Uses concurrency-limited parallelism (default 3) to avoid overwhelming the hosted server.
|
|
68
|
+
* Each call gets its own x402 challenge and payment — no shared payment across calls.
|
|
69
|
+
*/
|
|
70
|
+
export async function executeX402BatchPaidCall(input) {
|
|
71
|
+
if (!input.confirm) {
|
|
72
|
+
throw new Error('Batch x402 paid calls require confirm: true because they sign payment payloads.');
|
|
73
|
+
}
|
|
74
|
+
if (!Number.isFinite(input.maxPriceUsd) || input.maxPriceUsd <= 0) {
|
|
75
|
+
throw new Error('Batch x402 paid calls require a positive maxPriceUsd spending cap.');
|
|
76
|
+
}
|
|
77
|
+
if (!input.calls || input.calls.length === 0) {
|
|
78
|
+
throw new Error('Batch x402 paid calls require at least one call.');
|
|
79
|
+
}
|
|
80
|
+
const endpoint = input.endpoint ?? DEFAULT_X402_PAID_CALL_ENDPOINT;
|
|
81
|
+
const profileName = input.profileName ?? getActiveProfile();
|
|
82
|
+
const config = loadPaymentProfile(input.profileName);
|
|
83
|
+
const signer = await loadClientSigner(config);
|
|
84
|
+
const httpClient = createHttpPaymentClient(signer);
|
|
85
|
+
const sessionId = await initializeMcpSession(endpoint);
|
|
86
|
+
const maxAttempts = normalizeMaxAttempts(input.maxAttempts);
|
|
87
|
+
const maxTotalUsd = normalizeBatchMaxTotalUsd(input.maxTotalUsd, input.maxPriceUsd, input.calls.length);
|
|
88
|
+
const enforceExplicitTotalCap = input.maxTotalUsd !== undefined;
|
|
89
|
+
const concurrency = enforceExplicitTotalCap ? 1 : Math.max(1, Math.min(input.concurrency ?? 3, 8));
|
|
90
|
+
const signerAddress = String(signer.address);
|
|
91
|
+
// Execute calls with limited concurrency
|
|
92
|
+
const results = [];
|
|
93
|
+
const queue = Array.from(input.calls.entries());
|
|
94
|
+
let reservedAmountUsd = 0;
|
|
95
|
+
async function processOne(index) {
|
|
96
|
+
while (index < queue.length) {
|
|
97
|
+
const [, call] = queue[index];
|
|
98
|
+
if (reservedAmountUsd + input.maxPriceUsd > maxTotalUsd) {
|
|
99
|
+
results[index] = {
|
|
100
|
+
success: false,
|
|
101
|
+
error: `batch_max_total_exceeded: refusing ${call.toolName}; per-call cap ${formatClientUsd(input.maxPriceUsd)} would exceed batch cap ${formatClientUsd(maxTotalUsd)}.`,
|
|
102
|
+
toolName: call.toolName,
|
|
103
|
+
};
|
|
104
|
+
index += concurrency;
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
reservedAmountUsd += input.maxPriceUsd;
|
|
108
|
+
const requestBody = buildToolCallRequest(call.toolName, call.arguments);
|
|
109
|
+
const transientRetries = [];
|
|
110
|
+
let lastError;
|
|
111
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
|
|
112
|
+
try {
|
|
113
|
+
const result = await executePaidAttempt({
|
|
114
|
+
endpoint,
|
|
115
|
+
sessionId,
|
|
116
|
+
signerAddress,
|
|
117
|
+
httpClient,
|
|
118
|
+
requestBody,
|
|
119
|
+
profileName,
|
|
120
|
+
maxPriceUsd: input.maxPriceUsd,
|
|
121
|
+
attempt,
|
|
122
|
+
transientRetries,
|
|
123
|
+
});
|
|
124
|
+
results[index] = result;
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
const retry = classifyPaidCallRetry(error);
|
|
129
|
+
if (!retry.retryable || attempt >= maxAttempts) {
|
|
130
|
+
lastError = error instanceof Error ? error.message : String(error);
|
|
131
|
+
results[index] = {
|
|
132
|
+
success: false,
|
|
133
|
+
error: lastError,
|
|
134
|
+
toolName: call.toolName,
|
|
135
|
+
};
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
transientRetries.push(retry.reason);
|
|
139
|
+
await sleep(RETRY_BASE_DELAY_MS * attempt);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
index += concurrency;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Launch concurrent workers
|
|
146
|
+
const workers = Array.from({ length: Math.min(concurrency, queue.length) }, (_, i) => processOne(i));
|
|
147
|
+
await Promise.all(workers);
|
|
148
|
+
const succeeded = results.filter(r => r.success).length;
|
|
149
|
+
const totalAmountUsd = results.reduce((sum, r) => sum + ('payment' in r ? r.payment.amountUsd : 0), 0);
|
|
150
|
+
return {
|
|
151
|
+
success: succeeded === results.length,
|
|
152
|
+
endpoint,
|
|
153
|
+
sessionId,
|
|
154
|
+
totalCalls: input.calls.length,
|
|
155
|
+
succeeded,
|
|
156
|
+
failed: results.length - succeeded,
|
|
157
|
+
totalAmountUsd,
|
|
158
|
+
results,
|
|
159
|
+
audit: {
|
|
160
|
+
profileName,
|
|
161
|
+
signerAddress,
|
|
162
|
+
totalAmountUsd,
|
|
163
|
+
maxTotalUsd,
|
|
164
|
+
callCount: input.calls.length,
|
|
165
|
+
concurrency,
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
function normalizeBatchMaxTotalUsd(value, maxPriceUsd, callCount) {
|
|
170
|
+
const defaultTotal = maxPriceUsd * callCount;
|
|
171
|
+
if (value === undefined) {
|
|
172
|
+
return defaultTotal;
|
|
173
|
+
}
|
|
174
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
175
|
+
throw new Error('Batch x402 paid calls require maxTotalUsd to be positive when provided.');
|
|
176
|
+
}
|
|
177
|
+
if (value < maxPriceUsd) {
|
|
178
|
+
throw new Error('Batch x402 paid calls require maxTotalUsd to be at least maxPriceUsd for one call.');
|
|
179
|
+
}
|
|
180
|
+
return value;
|
|
181
|
+
}
|
|
182
|
+
function formatClientUsd(value) {
|
|
183
|
+
return `$${value.toFixed(6).replace(/0+$/, '').replace(/\.$/, '')}`;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* @name executeExternalX402Call
|
|
187
|
+
* @description Calls a generic HTTP x402 endpoint by fetching its challenge, signing locally, retrying with the payment header, and returning the receipt.
|
|
188
|
+
*/
|
|
189
|
+
export async function executeExternalX402Call(input) {
|
|
190
|
+
validateExternalInput(input);
|
|
191
|
+
const url = normalizeExternalUrl(input.url);
|
|
192
|
+
const method = normalizeHttpMethod(input.method);
|
|
193
|
+
const profileName = input.profileName ?? getActiveProfile();
|
|
194
|
+
const config = loadPaymentProfile(input.profileName);
|
|
195
|
+
const signer = await loadClientSigner(config);
|
|
196
|
+
const httpClient = createHttpPaymentClient(signer);
|
|
197
|
+
const maxAttempts = normalizeMaxAttempts(input.maxAttempts);
|
|
198
|
+
const transientRetries = [];
|
|
199
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
|
|
200
|
+
try {
|
|
201
|
+
return await executeExternalPaidAttempt({
|
|
202
|
+
url,
|
|
203
|
+
method,
|
|
204
|
+
headers: normalizeExternalHeaders(input.headers),
|
|
205
|
+
body: input.body,
|
|
206
|
+
signerAddress: String(signer.address),
|
|
207
|
+
httpClient,
|
|
208
|
+
profileName,
|
|
209
|
+
maxPriceUsd: input.maxPriceUsd,
|
|
210
|
+
attempt,
|
|
211
|
+
transientRetries,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
const retry = classifyPaidCallRetry(error);
|
|
216
|
+
if (!retry.retryable || attempt >= maxAttempts) {
|
|
217
|
+
throw error;
|
|
218
|
+
}
|
|
219
|
+
transientRetries.push(retry.reason);
|
|
220
|
+
await sleep(RETRY_BASE_DELAY_MS * attempt);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
throw new Error('external x402 call exhausted retries.');
|
|
224
|
+
}
|
|
62
225
|
/**
|
|
63
226
|
* @name getX402PaymentReadiness
|
|
64
227
|
* @description Checks local profile, signer, RPC, balances, and commerce policy for hosted paid/write workflows.
|
|
@@ -229,6 +392,15 @@ export function inspectX402Receipt(receiptHeader) {
|
|
|
229
392
|
}
|
|
230
393
|
async function executePaidAttempt(options) {
|
|
231
394
|
const unpaid = await postMcp(options.endpoint, options.requestBody, options.sessionId);
|
|
395
|
+
// If the cached session expired server-side, invalidate and re-initialize once
|
|
396
|
+
if (unpaid.response.status === 404 || isSessionNotFound(unpaid.body)) {
|
|
397
|
+
if (options.sessionRefreshAttempted) {
|
|
398
|
+
throw new Error(`MCP session refresh failed: ${JSON.stringify(unpaid.body)}`);
|
|
399
|
+
}
|
|
400
|
+
invalidateSession(options.endpoint);
|
|
401
|
+
const freshSession = await initializeMcpSession(options.endpoint);
|
|
402
|
+
return executePaidAttempt({ ...options, sessionId: freshSession, sessionRefreshAttempted: true });
|
|
403
|
+
}
|
|
232
404
|
const paymentRequired = getPaymentRequiredResponse(options.httpClient, unpaid.response, unpaid.body);
|
|
233
405
|
const selectedRequirements = selectSingleRequirement(paymentRequired, options.maxPriceUsd);
|
|
234
406
|
const amountUsd = paymentRequirementsAmountUsd(selectedRequirements);
|
|
@@ -288,6 +460,94 @@ async function executePaidAttempt(options) {
|
|
|
288
460
|
audit,
|
|
289
461
|
};
|
|
290
462
|
}
|
|
463
|
+
async function executeExternalPaidAttempt(options) {
|
|
464
|
+
const unpaid = await fetchExternal(options.url, options.method, options.headers, options.body);
|
|
465
|
+
if (unpaid.response.status !== 402) {
|
|
466
|
+
return buildExternalResultWithoutPayment(options, unpaid);
|
|
467
|
+
}
|
|
468
|
+
const paymentRequired = getPaymentRequiredResponse(options.httpClient, unpaid.response, unpaid.body);
|
|
469
|
+
const selectedRequirements = selectSingleRequirement(paymentRequired, options.maxPriceUsd);
|
|
470
|
+
const amountUsd = paymentRequirementsAmountUsd(selectedRequirements);
|
|
471
|
+
const paymentPayload = await options.httpClient.createPaymentPayload({
|
|
472
|
+
...paymentRequired,
|
|
473
|
+
accepts: [selectedRequirements],
|
|
474
|
+
});
|
|
475
|
+
const paymentHeaders = options.httpClient.encodePaymentSignatureHeader(paymentPayload);
|
|
476
|
+
const paid = await fetchExternal(options.url, options.method, {
|
|
477
|
+
...options.headers,
|
|
478
|
+
...paymentHeaders,
|
|
479
|
+
}, options.body);
|
|
480
|
+
const paymentResult = await options.httpClient.processPaymentResult(paymentPayload, name => paid.response.headers.get(name), paid.response.status);
|
|
481
|
+
if (!paid.response.ok) {
|
|
482
|
+
throw new Error(`External x402 call failed with HTTP ${paid.response.status}: ${JSON.stringify(paid.body)}`);
|
|
483
|
+
}
|
|
484
|
+
const audit = {
|
|
485
|
+
intentId: buildExternalIntentId(options.url, options.method),
|
|
486
|
+
profileName: options.profileName,
|
|
487
|
+
signerAddress: options.signerAddress,
|
|
488
|
+
url: options.url,
|
|
489
|
+
method: options.method,
|
|
490
|
+
payment: {
|
|
491
|
+
amountUsd,
|
|
492
|
+
network: selectedRequirements.network,
|
|
493
|
+
asset: selectedRequirements.asset,
|
|
494
|
+
payTo: selectedRequirements.payTo,
|
|
495
|
+
},
|
|
496
|
+
receipt: {
|
|
497
|
+
present: Boolean(paymentResult.settleResponse),
|
|
498
|
+
...(paymentResult.settleResponse?.transaction ? { transaction: paymentResult.settleResponse.transaction } : {}),
|
|
499
|
+
...(paymentResult.settleResponse?.network ? { network: paymentResult.settleResponse.network } : {}),
|
|
500
|
+
...(paymentResult.settleResponse?.amount ? { amount: paymentResult.settleResponse.amount } : {}),
|
|
501
|
+
...(paymentResult.settleResponse?.payer ? { payer: paymentResult.settleResponse.payer } : {}),
|
|
502
|
+
},
|
|
503
|
+
attempts: options.attempt,
|
|
504
|
+
transientRetries: options.transientRetries,
|
|
505
|
+
secretMaterial: 'keypair-bytes-never-returned',
|
|
506
|
+
};
|
|
507
|
+
return {
|
|
508
|
+
success: true,
|
|
509
|
+
url: options.url,
|
|
510
|
+
method: options.method,
|
|
511
|
+
signerAddress: options.signerAddress,
|
|
512
|
+
payment: audit.payment,
|
|
513
|
+
settlement: paymentResult.settleResponse,
|
|
514
|
+
response: {
|
|
515
|
+
status: paid.response.status,
|
|
516
|
+
headers: safeResponseHeaders(paid.response.headers),
|
|
517
|
+
body: paid.body,
|
|
518
|
+
},
|
|
519
|
+
attempts: options.attempt,
|
|
520
|
+
transientRetries: options.transientRetries,
|
|
521
|
+
audit,
|
|
522
|
+
};
|
|
523
|
+
}
|
|
524
|
+
function buildExternalResultWithoutPayment(options, result) {
|
|
525
|
+
const audit = {
|
|
526
|
+
intentId: buildExternalIntentId(options.url, options.method),
|
|
527
|
+
profileName: options.profileName,
|
|
528
|
+
signerAddress: options.signerAddress,
|
|
529
|
+
url: options.url,
|
|
530
|
+
method: options.method,
|
|
531
|
+
receipt: { present: false },
|
|
532
|
+
attempts: options.attempt,
|
|
533
|
+
transientRetries: options.transientRetries,
|
|
534
|
+
secretMaterial: 'keypair-bytes-never-returned',
|
|
535
|
+
};
|
|
536
|
+
return {
|
|
537
|
+
success: result.response.ok,
|
|
538
|
+
url: options.url,
|
|
539
|
+
method: options.method,
|
|
540
|
+
signerAddress: options.signerAddress,
|
|
541
|
+
response: {
|
|
542
|
+
status: result.response.status,
|
|
543
|
+
headers: safeResponseHeaders(result.response.headers),
|
|
544
|
+
body: result.body,
|
|
545
|
+
},
|
|
546
|
+
attempts: options.attempt,
|
|
547
|
+
transientRetries: options.transientRetries,
|
|
548
|
+
audit,
|
|
549
|
+
};
|
|
550
|
+
}
|
|
291
551
|
function validateInput(input) {
|
|
292
552
|
if (!input.confirm) {
|
|
293
553
|
throw new Error('x402 paid calls require confirm: true because they sign a payment payload.');
|
|
@@ -299,6 +559,17 @@ function validateInput(input) {
|
|
|
299
559
|
throw new Error('Provide either body or toolName.');
|
|
300
560
|
}
|
|
301
561
|
}
|
|
562
|
+
function validateExternalInput(input) {
|
|
563
|
+
if (!input.confirm) {
|
|
564
|
+
throw new Error('external x402 calls require confirm: true because they sign a payment payload.');
|
|
565
|
+
}
|
|
566
|
+
if (!Number.isFinite(input.maxPriceUsd) || input.maxPriceUsd <= 0) {
|
|
567
|
+
throw new Error('external x402 calls require a positive maxPriceUsd spending cap.');
|
|
568
|
+
}
|
|
569
|
+
if (!input.url || typeof input.url !== 'string') {
|
|
570
|
+
throw new Error('url is required for external x402 calls.');
|
|
571
|
+
}
|
|
572
|
+
}
|
|
302
573
|
function loadPaymentProfile(profileName) {
|
|
303
574
|
if (profileName) {
|
|
304
575
|
return loadConfig(getProfileConfigPath(profileName));
|
|
@@ -327,6 +598,11 @@ function createHttpPaymentClient(signer) {
|
|
|
327
598
|
return new x402HTTPClient(client);
|
|
328
599
|
}
|
|
329
600
|
async function initializeMcpSession(endpoint) {
|
|
601
|
+
// Check cache first — reuse session if still valid (5min TTL)
|
|
602
|
+
const cached = getCachedSession(endpoint);
|
|
603
|
+
if (cached) {
|
|
604
|
+
return cached;
|
|
605
|
+
}
|
|
330
606
|
const initBody = {
|
|
331
607
|
jsonrpc: '2.0',
|
|
332
608
|
id: 'sap-x402-paid-call-init',
|
|
@@ -350,6 +626,8 @@ async function initializeMcpSession(endpoint) {
|
|
|
350
626
|
throw new Error('Hosted MCP initialize response did not include mcp-session-id.');
|
|
351
627
|
}
|
|
352
628
|
await postMcp(endpoint, initializedBody, sessionId);
|
|
629
|
+
// Cache the session for reuse by subsequent paid calls
|
|
630
|
+
cacheSession(endpoint, sessionId);
|
|
353
631
|
return sessionId;
|
|
354
632
|
}
|
|
355
633
|
function buildToolCallRequest(toolName, args) {
|
|
@@ -381,6 +659,50 @@ async function postMcp(endpoint, body, sessionId, extraHeaders = {}) {
|
|
|
381
659
|
body: parseMcpHttpBody(text, response.headers.get('content-type') ?? ''),
|
|
382
660
|
};
|
|
383
661
|
}
|
|
662
|
+
async function fetchExternal(url, method, headers, body) {
|
|
663
|
+
const hasBody = method !== 'GET' && method !== 'HEAD' && body !== undefined;
|
|
664
|
+
const requestHeaders = {
|
|
665
|
+
Accept: 'application/json',
|
|
666
|
+
...headers,
|
|
667
|
+
};
|
|
668
|
+
let requestBody;
|
|
669
|
+
if (hasBody) {
|
|
670
|
+
if (typeof body === 'string') {
|
|
671
|
+
requestBody = body;
|
|
672
|
+
}
|
|
673
|
+
else {
|
|
674
|
+
requestHeaders['Content-Type'] = requestHeaders['Content-Type'] ?? requestHeaders['content-type'] ?? 'application/json';
|
|
675
|
+
requestBody = JSON.stringify(body);
|
|
676
|
+
}
|
|
677
|
+
if (Buffer.byteLength(requestBody) > MAX_EXTERNAL_BODY_BYTES) {
|
|
678
|
+
throw new Error(`External x402 request body exceeds ${MAX_EXTERNAL_BODY_BYTES} bytes.`);
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
const response = await fetch(url, {
|
|
682
|
+
method,
|
|
683
|
+
headers: requestHeaders,
|
|
684
|
+
...(requestBody !== undefined ? { body: requestBody } : {}),
|
|
685
|
+
});
|
|
686
|
+
const text = await response.text();
|
|
687
|
+
return {
|
|
688
|
+
response,
|
|
689
|
+
body: parseExternalHttpBody(text, response.headers.get('content-type') ?? ''),
|
|
690
|
+
};
|
|
691
|
+
}
|
|
692
|
+
function parseExternalHttpBody(text, contentType) {
|
|
693
|
+
if (!text.trim()) {
|
|
694
|
+
return null;
|
|
695
|
+
}
|
|
696
|
+
if (contentType.includes('application/json') || text.trim().startsWith('{') || text.trim().startsWith('[')) {
|
|
697
|
+
try {
|
|
698
|
+
return JSON.parse(text);
|
|
699
|
+
}
|
|
700
|
+
catch {
|
|
701
|
+
return text;
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
return text;
|
|
705
|
+
}
|
|
384
706
|
function getPaymentRequiredResponse(httpClient, response, body) {
|
|
385
707
|
return httpClient.getPaymentRequiredResponse(name => response.headers.get(name), body);
|
|
386
708
|
}
|
|
@@ -468,9 +790,97 @@ function normalizeMaxAttempts(value) {
|
|
|
468
790
|
}
|
|
469
791
|
return value;
|
|
470
792
|
}
|
|
793
|
+
function normalizeExternalUrl(value) {
|
|
794
|
+
const url = new URL(value);
|
|
795
|
+
if (url.protocol !== 'https:' && url.protocol !== 'http:') {
|
|
796
|
+
throw new Error('External x402 URL must use http or https.');
|
|
797
|
+
}
|
|
798
|
+
if (url.username || url.password) {
|
|
799
|
+
throw new Error('External x402 URL must not contain embedded credentials.');
|
|
800
|
+
}
|
|
801
|
+
assertExternalHostAllowed(url.hostname);
|
|
802
|
+
return url.toString();
|
|
803
|
+
}
|
|
804
|
+
function assertExternalHostAllowed(hostname) {
|
|
805
|
+
const normalized = hostname.toLowerCase();
|
|
806
|
+
if (normalized === 'localhost' || normalized.endsWith('.localhost') || normalized.endsWith('.local')) {
|
|
807
|
+
throw new Error('External x402 URL must not target local hostnames.');
|
|
808
|
+
}
|
|
809
|
+
if (normalized === '0.0.0.0' || normalized === '::' || normalized === '::1' || normalized.startsWith('127.')) {
|
|
810
|
+
throw new Error('External x402 URL must not target loopback addresses.');
|
|
811
|
+
}
|
|
812
|
+
if (normalized.startsWith('10.') ||
|
|
813
|
+
normalized.startsWith('192.168.') ||
|
|
814
|
+
/^172\.(1[6-9]|2\d|3[0-1])\./.test(normalized) ||
|
|
815
|
+
normalized.startsWith('169.254.')) {
|
|
816
|
+
throw new Error('External x402 URL must not target private or link-local addresses.');
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
function normalizeHttpMethod(value) {
|
|
820
|
+
const method = (value ?? 'POST').toUpperCase();
|
|
821
|
+
const allowed = new Set(['GET', 'POST', 'PUT', 'PATCH', 'DELETE']);
|
|
822
|
+
if (!allowed.has(method)) {
|
|
823
|
+
throw new Error('method must be one of GET, POST, PUT, PATCH, or DELETE.');
|
|
824
|
+
}
|
|
825
|
+
return method;
|
|
826
|
+
}
|
|
827
|
+
function normalizeExternalHeaders(value) {
|
|
828
|
+
const headers = {};
|
|
829
|
+
for (const [key, rawValue] of Object.entries(value ?? {})) {
|
|
830
|
+
const normalized = key.toLowerCase();
|
|
831
|
+
if (normalized === 'payment-signature' || normalized === 'x-payment' || normalized === 'payment-response' || normalized === 'x-payment-response') {
|
|
832
|
+
throw new Error(`Do not provide ${key}; the local x402 helper creates payment headers itself.`);
|
|
833
|
+
}
|
|
834
|
+
if (normalized === 'authorization' || normalized === 'cookie' || normalized === 'set-cookie') {
|
|
835
|
+
throw new Error(`Refusing to forward sensitive header ${key} through generic x402 helper.`);
|
|
836
|
+
}
|
|
837
|
+
headers[key] = String(rawValue);
|
|
838
|
+
}
|
|
839
|
+
return headers;
|
|
840
|
+
}
|
|
841
|
+
function safeResponseHeaders(headers) {
|
|
842
|
+
const safe = new Set([
|
|
843
|
+
'content-type',
|
|
844
|
+
'payment-response',
|
|
845
|
+
'x-payment-response',
|
|
846
|
+
'x402-version',
|
|
847
|
+
'x-request-id',
|
|
848
|
+
]);
|
|
849
|
+
const out = {};
|
|
850
|
+
headers.forEach((value, key) => {
|
|
851
|
+
if (safe.has(key.toLowerCase())) {
|
|
852
|
+
out[key] = value;
|
|
853
|
+
}
|
|
854
|
+
});
|
|
855
|
+
return out;
|
|
856
|
+
}
|
|
471
857
|
function classifyPaidCallRetry(error) {
|
|
472
858
|
const message = error instanceof Error ? error.message : String(error);
|
|
473
859
|
const normalized = message.toLowerCase();
|
|
860
|
+
// Explicit maxPriceUsd exceeded check — not retryable, agent needs to raise the cap
|
|
861
|
+
if (normalized.includes('exceeds maxpriceusd')) {
|
|
862
|
+
return {
|
|
863
|
+
retryable: false,
|
|
864
|
+
reason: 'max_price_exceeded',
|
|
865
|
+
hint: 'The tool cost exceeds the maxPriceUsd cap. Use sap_estimate_tool_cost to get the expected cost, then retry with maxPriceUsd set to at least 1.5x the estimated price.',
|
|
866
|
+
};
|
|
867
|
+
}
|
|
868
|
+
// Session not found — not retryable with same session, but the caller should re-initialize
|
|
869
|
+
if (normalized.includes('mcp_session_not_found') || normalized.includes('mcp_session_required')) {
|
|
870
|
+
return {
|
|
871
|
+
retryable: false,
|
|
872
|
+
reason: 'session_expired',
|
|
873
|
+
hint: 'The MCP session expired. The session cache has been invalidated. Retry with a fresh session.',
|
|
874
|
+
};
|
|
875
|
+
}
|
|
876
|
+
// Hosted local signer required — not retryable via x402, use local sap_payments
|
|
877
|
+
if (normalized.includes('hosted_local_signer_required')) {
|
|
878
|
+
return {
|
|
879
|
+
retryable: false,
|
|
880
|
+
reason: 'local_signer_required',
|
|
881
|
+
hint: 'This tool requires a local Solana signature. Do NOT use sap_payments_call_paid_tool. Use the local sap_payments equivalent (e.g. sap_payments_register_agent, sap_payments_finalize_transaction).',
|
|
882
|
+
};
|
|
883
|
+
}
|
|
474
884
|
const retryable = containsAny(normalized, [
|
|
475
885
|
'blockhashnotfound',
|
|
476
886
|
'blockhash not found',
|
|
@@ -509,6 +919,15 @@ function sleep(ms) {
|
|
|
509
919
|
function isJsonRpcError(value) {
|
|
510
920
|
return value !== null && typeof value === 'object' && 'error' in value;
|
|
511
921
|
}
|
|
922
|
+
function isSessionNotFound(body) {
|
|
923
|
+
if (!isJsonRpcError(body))
|
|
924
|
+
return false;
|
|
925
|
+
const error = body.error;
|
|
926
|
+
if (!error || typeof error !== 'object')
|
|
927
|
+
return false;
|
|
928
|
+
const message = error.message;
|
|
929
|
+
return message === 'mcp_session_not_found' || message === 'mcp_session_required';
|
|
930
|
+
}
|
|
512
931
|
function networkFromRpcUrl(value) {
|
|
513
932
|
if (!value) {
|
|
514
933
|
return 'mainnet-beta';
|
|
@@ -584,7 +1003,7 @@ async function readBalanceSnapshot(rpcUrl, signerAddress, usdcMint, autoPayX402B
|
|
|
584
1003
|
}
|
|
585
1004
|
function readAgentCommercePolicy() {
|
|
586
1005
|
return {
|
|
587
|
-
autoPayX402BelowUsd: readPositiveNumberEnv('SAP_MCP_X402_AUTO_PAY_MAX_USD', 0.
|
|
1006
|
+
autoPayX402BelowUsd: readPositiveNumberEnv('SAP_MCP_X402_AUTO_PAY_MAX_USD', 0.05),
|
|
588
1007
|
dailyX402LimitUsd: readOptionalPositiveNumberEnv('SAP_MCP_X402_DAILY_LIMIT_USD'),
|
|
589
1008
|
maxTradeUsd: readOptionalPositiveNumberEnv('SAP_MCP_MAX_TRADE_USD') ?? 10,
|
|
590
1009
|
maxSlippageBps: readPositiveNumberEnv('SAP_MCP_MAX_SLIPPAGE_BPS', 100),
|
|
@@ -656,6 +1075,14 @@ function buildIntentId(requestBody, sessionId) {
|
|
|
656
1075
|
});
|
|
657
1076
|
return `sap-intent-${createHash('sha256').update(source).digest('hex').slice(0, 16)}`;
|
|
658
1077
|
}
|
|
1078
|
+
function buildExternalIntentId(url, method) {
|
|
1079
|
+
const source = JSON.stringify({
|
|
1080
|
+
url,
|
|
1081
|
+
method,
|
|
1082
|
+
at: Date.now(),
|
|
1083
|
+
});
|
|
1084
|
+
return `sap-external-x402-${createHash('sha256').update(source).digest('hex').slice(0, 16)}`;
|
|
1085
|
+
}
|
|
659
1086
|
function parseCliArgs(argv) {
|
|
660
1087
|
const parsed = { confirm: false };
|
|
661
1088
|
for (let index = 0; index < argv.length; index += 1) {
|