@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
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module memory/tool-call-store
|
|
3
|
+
* @description Store for recording and searching tool call history.
|
|
4
|
+
*
|
|
5
|
+
* All methods are synchronous (better-sqlite3 is synchronous). FTS5 search
|
|
6
|
+
* returns relevance-ranked results using the inverted index.
|
|
7
|
+
*/
|
|
8
|
+
import { memoryDatabase } from './database.js';
|
|
9
|
+
import { truncate } from './utils.js';
|
|
10
|
+
/**
|
|
11
|
+
* @name ToolCallStore
|
|
12
|
+
* @description Records and queries tool call execution history.
|
|
13
|
+
*
|
|
14
|
+
* Every tool call (paid or free) is recorded with its input, output, outcome,
|
|
15
|
+
* cost, and latency. The FTS5 index enables full-text search across all
|
|
16
|
+
* recorded calls for pattern detection and failure analysis.
|
|
17
|
+
*/
|
|
18
|
+
export class ToolCallStore {
|
|
19
|
+
/**
|
|
20
|
+
* @name record
|
|
21
|
+
* @description Records a tool call execution in the memory database.
|
|
22
|
+
* @param record - Tool call data to record.
|
|
23
|
+
* @returns The auto-incremented ID of the inserted record, or -1 if degraded.
|
|
24
|
+
*/
|
|
25
|
+
record(record) {
|
|
26
|
+
if (memoryDatabase.isDegraded())
|
|
27
|
+
return -1;
|
|
28
|
+
memoryDatabase.init();
|
|
29
|
+
const stmt = memoryDatabase.getStatement('insert_tool_call');
|
|
30
|
+
if (!stmt)
|
|
31
|
+
return -1;
|
|
32
|
+
const maxBytes = 8192;
|
|
33
|
+
const result = stmt.run({
|
|
34
|
+
toolName: record.toolName,
|
|
35
|
+
sessionId: record.sessionId,
|
|
36
|
+
callerProfile: record.callerProfile,
|
|
37
|
+
input: truncate(record.input, maxBytes),
|
|
38
|
+
output: truncate(record.output, maxBytes),
|
|
39
|
+
outcome: record.outcome,
|
|
40
|
+
costUsd: record.costUsd ?? null,
|
|
41
|
+
txSignature: record.txSignature ?? null,
|
|
42
|
+
latencyMs: record.latencyMs ?? null,
|
|
43
|
+
});
|
|
44
|
+
return result.lastInsertRowid;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* @name search
|
|
48
|
+
* @description Full-text search across tool call history using FTS5.
|
|
49
|
+
* @param options - Search options including query, filters, and pagination.
|
|
50
|
+
* @returns Search results with relevance ranking.
|
|
51
|
+
*/
|
|
52
|
+
search(options) {
|
|
53
|
+
if (memoryDatabase.isDegraded()) {
|
|
54
|
+
return { results: [], total: 0, hasMore: false };
|
|
55
|
+
}
|
|
56
|
+
memoryDatabase.init();
|
|
57
|
+
const db = memoryDatabase.getDb();
|
|
58
|
+
const limit = Math.min(options.limit ?? 20, 100);
|
|
59
|
+
const offset = options.offset ?? 0;
|
|
60
|
+
// Build FTS5 query with optional filters.
|
|
61
|
+
let whereClause = '';
|
|
62
|
+
const params = { limit, offset };
|
|
63
|
+
if (options.toolName) {
|
|
64
|
+
whereClause += ' AND t.tool_name = @toolName';
|
|
65
|
+
params['toolName'] = options.toolName;
|
|
66
|
+
}
|
|
67
|
+
if (options.outcome) {
|
|
68
|
+
whereClause += ' AND t.outcome = @outcome';
|
|
69
|
+
params['outcome'] = options.outcome;
|
|
70
|
+
}
|
|
71
|
+
// FTS5 MATCH query — use bm25 ranking for relevance.
|
|
72
|
+
const ftsQuery = this.buildFtsQuery(options.query);
|
|
73
|
+
const sql = `
|
|
74
|
+
SELECT t.id, t.tool_name, t.session_id, t.caller_profile, t.input, t.output,
|
|
75
|
+
t.outcome, t.cost_usd, t.tx_signature, t.latency_ms,
|
|
76
|
+
t.created_at, t.updated_at
|
|
77
|
+
FROM tool_calls_fts fts
|
|
78
|
+
JOIN tool_calls t ON t.id = fts.rowid
|
|
79
|
+
WHERE tool_calls_fts MATCH @ftsQuery
|
|
80
|
+
${whereClause}
|
|
81
|
+
ORDER BY ${options.sort === 'newest' ? 't.created_at DESC' : options.sort === 'oldest' ? 't.created_at ASC' : 'bm25(tool_calls_fts)'}
|
|
82
|
+
LIMIT @limit OFFSET @offset
|
|
83
|
+
`;
|
|
84
|
+
params['ftsQuery'] = ftsQuery;
|
|
85
|
+
try {
|
|
86
|
+
const results = db.prepare(sql).all(params);
|
|
87
|
+
const countSql = `
|
|
88
|
+
SELECT COUNT(*) as total
|
|
89
|
+
FROM tool_calls_fts fts
|
|
90
|
+
JOIN tool_calls t ON t.id = fts.rowid
|
|
91
|
+
WHERE tool_calls_fts MATCH @ftsQuery ${whereClause}
|
|
92
|
+
`;
|
|
93
|
+
const countResult = db.prepare(countSql).get(params);
|
|
94
|
+
const total = countResult?.total ?? 0;
|
|
95
|
+
return {
|
|
96
|
+
results,
|
|
97
|
+
total,
|
|
98
|
+
hasMore: offset + results.length < total,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return { results: [], total: 0, hasMore: false };
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* @name count
|
|
107
|
+
* @description Returns the total number of tool call records.
|
|
108
|
+
*/
|
|
109
|
+
count() {
|
|
110
|
+
if (memoryDatabase.isDegraded())
|
|
111
|
+
return 0;
|
|
112
|
+
memoryDatabase.init();
|
|
113
|
+
const stmt = memoryDatabase.getStatement('count_tool_calls');
|
|
114
|
+
if (!stmt)
|
|
115
|
+
return 0;
|
|
116
|
+
return stmt.get().count;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* @name outcomeBreakdown
|
|
120
|
+
* @description Returns counts grouped by outcome.
|
|
121
|
+
*/
|
|
122
|
+
outcomeBreakdown() {
|
|
123
|
+
if (memoryDatabase.isDegraded()) {
|
|
124
|
+
return { success: 0, error: 0, partial: 0 };
|
|
125
|
+
}
|
|
126
|
+
memoryDatabase.init();
|
|
127
|
+
const stmt = memoryDatabase.getStatement('count_tool_calls_by_outcome');
|
|
128
|
+
if (!stmt)
|
|
129
|
+
return { success: 0, error: 0, partial: 0 };
|
|
130
|
+
const rows = stmt.all();
|
|
131
|
+
const result = { success: 0, error: 0, partial: 0 };
|
|
132
|
+
for (const row of rows) {
|
|
133
|
+
result[row.outcome] = row.count;
|
|
134
|
+
}
|
|
135
|
+
return result;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* @name lastToolCallAt
|
|
139
|
+
* @description Returns the timestamp of the most recent tool call.
|
|
140
|
+
*/
|
|
141
|
+
lastToolCallAt() {
|
|
142
|
+
if (memoryDatabase.isDegraded())
|
|
143
|
+
return null;
|
|
144
|
+
memoryDatabase.init();
|
|
145
|
+
const stmt = memoryDatabase.getStatement('last_tool_call_at');
|
|
146
|
+
if (!stmt)
|
|
147
|
+
return null;
|
|
148
|
+
const row = stmt.get();
|
|
149
|
+
return row?.created_at ?? null;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* @name archive
|
|
153
|
+
* @description Archives tool call records older than the retention period.
|
|
154
|
+
* @param retentionDays - Number of days to keep records. Default 90.
|
|
155
|
+
* @returns Number of records archived.
|
|
156
|
+
*/
|
|
157
|
+
archive(retentionDays = 90) {
|
|
158
|
+
if (memoryDatabase.isDegraded())
|
|
159
|
+
return 0;
|
|
160
|
+
memoryDatabase.init();
|
|
161
|
+
const db = memoryDatabase.getDb();
|
|
162
|
+
const result = db.prepare(`DELETE FROM tool_calls WHERE created_at < datetime('now', ?)`).run(`-${retentionDays} days`);
|
|
163
|
+
return result.changes;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* @name buildFtsQuery
|
|
167
|
+
* @description Converts a natural language query into a FTS5 MATCH expression.
|
|
168
|
+
* Handles multi-word queries by quoting phrases and prefixing with OR for
|
|
169
|
+
* broader recall.
|
|
170
|
+
* @internal
|
|
171
|
+
*/
|
|
172
|
+
buildFtsQuery(query) {
|
|
173
|
+
// Escape FTS5 special characters and wrap in quotes for phrase matching.
|
|
174
|
+
const escaped = query.replace(/["'*:]/g, ' ').trim();
|
|
175
|
+
if (!escaped)
|
|
176
|
+
return '*';
|
|
177
|
+
// For multi-word queries, use OR to match any word (broader recall).
|
|
178
|
+
const words = escaped.split(/\s+/).filter(w => w.length > 0);
|
|
179
|
+
if (words.length === 1)
|
|
180
|
+
return `"${words[0]}"*`;
|
|
181
|
+
return words.map(w => `"${w}"*`).join(' OR ');
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* @name toolCallStore
|
|
186
|
+
* @description Singleton instance of the tool call store.
|
|
187
|
+
*/
|
|
188
|
+
export const toolCallStore = new ToolCallStore();
|
|
189
|
+
//# sourceMappingURL=tool-call-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-call-store.js","sourceRoot":"","sources":["../../src/memory/tool-call-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module memory/types
|
|
3
|
+
* @description Type definitions for the SAP MCP local agent memory subsystem.
|
|
4
|
+
*
|
|
5
|
+
* The memory subsystem uses SQLite FTS5 to store and retrieve:
|
|
6
|
+
* - Tool call history (input, output, outcome, cost, latency)
|
|
7
|
+
* - Agent memories (LLM-compressed summaries of past interactions)
|
|
8
|
+
* - Stream buffer events (premium stream data persisted locally)
|
|
9
|
+
*
|
|
10
|
+
* All types are designed for non-custodial, local-only operation — no data
|
|
11
|
+
* leaves the user's machine. The memory DB is stored at
|
|
12
|
+
* ~/.config/sap-mcp/memory/agent-memory.db.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* @name ToolCallRecord
|
|
16
|
+
* @description A single tool call execution record stored in the memory DB.
|
|
17
|
+
*/
|
|
18
|
+
export interface ToolCallRecord {
|
|
19
|
+
/** Auto-increment primary key. */
|
|
20
|
+
id?: number;
|
|
21
|
+
/** MCP tool name (e.g. 'jupiter_getQuote', 'sap_build_sol_transfer'). */
|
|
22
|
+
toolName: string;
|
|
23
|
+
/** Session identifier from the MCP transport. */
|
|
24
|
+
sessionId: string | null;
|
|
25
|
+
/** Signer profile used for the call, if any. */
|
|
26
|
+
callerProfile: string | null;
|
|
27
|
+
/** JSON-serialized tool input. Truncated to 8KB. */
|
|
28
|
+
input: string;
|
|
29
|
+
/** JSON-serialized tool output. Truncated to 8KB. */
|
|
30
|
+
output: string;
|
|
31
|
+
/** Execution outcome classification. */
|
|
32
|
+
outcome: ToolCallOutcome;
|
|
33
|
+
/** x402 cost in USD, if the tool was paid. */
|
|
34
|
+
costUsd: number | null;
|
|
35
|
+
/** Solana transaction signature, if the tool produced one. */
|
|
36
|
+
txSignature: string | null;
|
|
37
|
+
/** Execution latency in milliseconds. */
|
|
38
|
+
latencyMs: number | null;
|
|
39
|
+
/** ISO 8601 timestamp of when the record was created. */
|
|
40
|
+
createdAt: string;
|
|
41
|
+
/** ISO 8601 timestamp of when the record was last updated. */
|
|
42
|
+
updatedAt: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* @name ToolCallOutcome
|
|
46
|
+
* @description Classification of a tool call's execution result.
|
|
47
|
+
*/
|
|
48
|
+
export type ToolCallOutcome = 'success' | 'error' | 'partial';
|
|
49
|
+
/**
|
|
50
|
+
* @name AgentMemoryRecord
|
|
51
|
+
* @description An LLM-generated summary of past agent interactions.
|
|
52
|
+
*
|
|
53
|
+
* Memories are compressed representations of tool call patterns, failures,
|
|
54
|
+
* successes, and lessons learned. They decay over time via a relevance
|
|
55
|
+
* score that decreases as memories age, ensuring the agent prioritizes
|
|
56
|
+
* recent, high-signal knowledge.
|
|
57
|
+
*/
|
|
58
|
+
export interface AgentMemoryRecord {
|
|
59
|
+
/** Auto-increment primary key. */
|
|
60
|
+
id?: number;
|
|
61
|
+
/** Type of memory — determines how it's used in prompt injection. */
|
|
62
|
+
memoryType: MemoryType;
|
|
63
|
+
/** Tool category this memory relates to (e.g. 'jupiter', 'adrena', 'premium'). */
|
|
64
|
+
category: string;
|
|
65
|
+
/** LLM-compressed summary text. Max 4KB. */
|
|
66
|
+
summary: string;
|
|
67
|
+
/** JSON array of tool_call IDs that were the source of this memory. */
|
|
68
|
+
sourceToolCalls: string | null;
|
|
69
|
+
/** Relevance score 0-1. Decays over time. Higher = more relevant. */
|
|
70
|
+
relevanceScore: number;
|
|
71
|
+
/** ISO 8601 timestamp of when the memory was created. */
|
|
72
|
+
createdAt: string;
|
|
73
|
+
/** ISO 8601 timestamp of when the memory expires. NULL = never expires. */
|
|
74
|
+
expiresAt: string | null;
|
|
75
|
+
/** ISO 8601 timestamp of when the memory was last accessed. */
|
|
76
|
+
lastAccessedAt: string;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* @name MemoryType
|
|
80
|
+
* @description Classification of agent memory entries.
|
|
81
|
+
* - 'lesson': A learned pattern or rule (e.g. "Jupiter swaps fail when slippage < 50bps on low-liquidity pairs")
|
|
82
|
+
* - 'pattern': A recurring behavior (e.g. "Agent consistently buys when SOL price drops > 2%")
|
|
83
|
+
* - 'failure': A specific failure with root cause (e.g. "BlockhashNotFound after 90s — retry with fresh blockhash")
|
|
84
|
+
* - 'success': A successful outcome worth remembering (e.g. "Arb opportunity on SOL/USDC at block 123456")
|
|
85
|
+
*/
|
|
86
|
+
export type MemoryType = 'lesson' | 'pattern' | 'failure' | 'success';
|
|
87
|
+
/**
|
|
88
|
+
* @name StreamBufferRecord
|
|
89
|
+
* @description A buffered stream event persisted locally for offline analysis.
|
|
90
|
+
*/
|
|
91
|
+
export interface StreamBufferRecord {
|
|
92
|
+
/** Auto-increment primary key. */
|
|
93
|
+
id?: number;
|
|
94
|
+
/** Stream type identifier (e.g. 'pyth-price', 'meme-alerts', 'volatility'). */
|
|
95
|
+
streamType: string;
|
|
96
|
+
/** Unique event ID from the provider. */
|
|
97
|
+
eventId: string;
|
|
98
|
+
/** Event type from the provider (e.g. 'price.tick', 'volatility.breakout'). */
|
|
99
|
+
eventType: string;
|
|
100
|
+
/** JSON-serialized event payload. */
|
|
101
|
+
payload: string;
|
|
102
|
+
/** Whether the event has been consumed by the agent. */
|
|
103
|
+
consumed: number;
|
|
104
|
+
/** ISO 8601 timestamp of when the event was buffered. */
|
|
105
|
+
createdAt: string;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* @name MemorySearchResult
|
|
109
|
+
* @description A result from a full-text search across tool calls or agent memories.
|
|
110
|
+
*/
|
|
111
|
+
export interface MemorySearchResult<T = unknown> {
|
|
112
|
+
/** The matching records. */
|
|
113
|
+
results: T[];
|
|
114
|
+
/** Total number of matching records (before pagination). */
|
|
115
|
+
total: number;
|
|
116
|
+
/** Whether there are more results available. */
|
|
117
|
+
hasMore: boolean;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* @name MemoryQueryOptions
|
|
121
|
+
* @description Options for searching the memory database.
|
|
122
|
+
*/
|
|
123
|
+
export interface MemoryQueryOptions {
|
|
124
|
+
/** FTS5 search query (e.g. 'swap failure', 'jupiter slippage'). */
|
|
125
|
+
query: string;
|
|
126
|
+
/** Filter by tool name (tool_calls only). */
|
|
127
|
+
toolName?: string;
|
|
128
|
+
/** Filter by outcome (tool_calls only). */
|
|
129
|
+
outcome?: ToolCallOutcome;
|
|
130
|
+
/** Filter by memory type (agent_memory only). */
|
|
131
|
+
memoryType?: MemoryType;
|
|
132
|
+
/** Filter by category. */
|
|
133
|
+
category?: string;
|
|
134
|
+
/** Minimum relevance score (agent_memory only). */
|
|
135
|
+
minRelevance?: number;
|
|
136
|
+
/** Maximum number of results to return. Default 20. */
|
|
137
|
+
limit?: number;
|
|
138
|
+
/** Offset for pagination. Default 0. */
|
|
139
|
+
offset?: number;
|
|
140
|
+
/** Sort order. Default 'relevance' for FTS, 'newest' for time-based. */
|
|
141
|
+
sort?: 'relevance' | 'newest' | 'oldest';
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* @name MemoryStats
|
|
145
|
+
* @description Aggregate statistics about the memory database.
|
|
146
|
+
*/
|
|
147
|
+
export interface MemoryStats {
|
|
148
|
+
/** Total number of tool call records. */
|
|
149
|
+
toolCallCount: number;
|
|
150
|
+
/** Total number of agent memory records. */
|
|
151
|
+
memoryCount: number;
|
|
152
|
+
/** Total number of stream buffer records (unconsumed). */
|
|
153
|
+
pendingStreamEvents: number;
|
|
154
|
+
/** Total database size in bytes. */
|
|
155
|
+
dbSizeBytes: number;
|
|
156
|
+
/** Breakdown of tool calls by outcome. */
|
|
157
|
+
outcomeBreakdown: Record<ToolCallOutcome, number>;
|
|
158
|
+
/** Breakdown of agent memories by type. */
|
|
159
|
+
memoryTypeBreakdown: Record<MemoryType, number>;
|
|
160
|
+
/** Most recent tool call timestamp. */
|
|
161
|
+
lastToolCallAt: string | null;
|
|
162
|
+
/** Most recent memory timestamp. */
|
|
163
|
+
lastMemoryAt: string | null;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* @name MemoryPruneResult
|
|
167
|
+
* @description Result of pruning old, low-relevance memories.
|
|
168
|
+
*/
|
|
169
|
+
export interface MemoryPruneResult {
|
|
170
|
+
/** Number of memories pruned. */
|
|
171
|
+
pruned: number;
|
|
172
|
+
/** Number of tool calls archived (old records). */
|
|
173
|
+
archived: number;
|
|
174
|
+
/** Database size reduction in bytes. */
|
|
175
|
+
freedBytes: number;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* @name MemoryConfig
|
|
179
|
+
* @description Configuration for the memory subsystem.
|
|
180
|
+
*/
|
|
181
|
+
export interface MemoryConfig {
|
|
182
|
+
/** Path to the SQLite database file. */
|
|
183
|
+
dbPath: string;
|
|
184
|
+
/** Whether to enable WAL mode (recommended for concurrent access). */
|
|
185
|
+
enableWal: boolean;
|
|
186
|
+
/** Maximum size of tool call input/output stored. Default 8192 bytes. */
|
|
187
|
+
maxPayloadBytes: number;
|
|
188
|
+
/** Relevance decay rate per day. Default 0.01 (1% per day). */
|
|
189
|
+
relevanceDecayPerDay: number;
|
|
190
|
+
/** Minimum relevance score to keep a memory. Default 0.05. */
|
|
191
|
+
minRelevanceThreshold: number;
|
|
192
|
+
/** Number of days to keep tool call records. Default 90. */
|
|
193
|
+
toolCallRetentionDays: number;
|
|
194
|
+
/** Maximum number of stream buffer events per type. Default 10000. */
|
|
195
|
+
maxStreamBufferSize: number;
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module memory/types
|
|
3
|
+
* @description Type definitions for the SAP MCP local agent memory subsystem.
|
|
4
|
+
*
|
|
5
|
+
* The memory subsystem uses SQLite FTS5 to store and retrieve:
|
|
6
|
+
* - Tool call history (input, output, outcome, cost, latency)
|
|
7
|
+
* - Agent memories (LLM-compressed summaries of past interactions)
|
|
8
|
+
* - Stream buffer events (premium stream data persisted locally)
|
|
9
|
+
*
|
|
10
|
+
* All types are designed for non-custodial, local-only operation — no data
|
|
11
|
+
* leaves the user's machine. The memory DB is stored at
|
|
12
|
+
* ~/.config/sap-mcp/memory/agent-memory.db.
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module memory/utils
|
|
3
|
+
* @description Utility functions for the memory subsystem.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* @name truncate
|
|
7
|
+
* @description Truncates a string to the specified byte length, ensuring it
|
|
8
|
+
* doesn't end in the middle of a multi-byte UTF-8 sequence.
|
|
9
|
+
* @param str - The string to truncate.
|
|
10
|
+
* @param maxBytes - Maximum byte length.
|
|
11
|
+
* @returns The truncated string.
|
|
12
|
+
*/
|
|
13
|
+
export declare function truncate(str: string, maxBytes: number): string;
|
|
14
|
+
/**
|
|
15
|
+
* @name decayRelevance
|
|
16
|
+
* @description Computes the decayed relevance score based on days since creation.
|
|
17
|
+
* @param initialScore - Initial relevance score (0-1).
|
|
18
|
+
* @param createdAt - ISO 8601 timestamp of creation.
|
|
19
|
+
* @param decayPerDay - Decay rate per day (e.g. 0.01 = 1% per day).
|
|
20
|
+
* @returns Decayed relevance score, clamped to [0, 1].
|
|
21
|
+
*/
|
|
22
|
+
export declare function decayRelevance(initialScore: number, createdAt: string, decayPerDay: number): number;
|
|
23
|
+
/**
|
|
24
|
+
* @name isExpired
|
|
25
|
+
* @description Checks if a memory record has expired.
|
|
26
|
+
* @param expiresAt - ISO 8601 timestamp or null (null = never expires).
|
|
27
|
+
* @returns True if the memory has expired.
|
|
28
|
+
*/
|
|
29
|
+
export declare function isExpired(expiresAt: string | null): boolean;
|
|
30
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/memory/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK9D;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,MAAM,CAMR;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAG3D"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module memory/utils
|
|
3
|
+
* @description Utility functions for the memory subsystem.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* @name truncate
|
|
7
|
+
* @description Truncates a string to the specified byte length, ensuring it
|
|
8
|
+
* doesn't end in the middle of a multi-byte UTF-8 sequence.
|
|
9
|
+
* @param str - The string to truncate.
|
|
10
|
+
* @param maxBytes - Maximum byte length.
|
|
11
|
+
* @returns The truncated string.
|
|
12
|
+
*/
|
|
13
|
+
export function truncate(str, maxBytes) {
|
|
14
|
+
if (!str)
|
|
15
|
+
return '';
|
|
16
|
+
const buf = Buffer.from(str, 'utf-8');
|
|
17
|
+
if (buf.length <= maxBytes)
|
|
18
|
+
return str;
|
|
19
|
+
return buf.subarray(0, maxBytes).toString('utf-8');
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* @name decayRelevance
|
|
23
|
+
* @description Computes the decayed relevance score based on days since creation.
|
|
24
|
+
* @param initialScore - Initial relevance score (0-1).
|
|
25
|
+
* @param createdAt - ISO 8601 timestamp of creation.
|
|
26
|
+
* @param decayPerDay - Decay rate per day (e.g. 0.01 = 1% per day).
|
|
27
|
+
* @returns Decayed relevance score, clamped to [0, 1].
|
|
28
|
+
*/
|
|
29
|
+
export function decayRelevance(initialScore, createdAt, decayPerDay) {
|
|
30
|
+
const created = new Date(createdAt).getTime();
|
|
31
|
+
const now = Date.now();
|
|
32
|
+
const daysSince = (now - created) / (1000 * 60 * 60 * 24);
|
|
33
|
+
const decayed = initialScore * Math.pow(1 - decayPerDay, daysSince);
|
|
34
|
+
return Math.max(0, Math.min(1, decayed));
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* @name isExpired
|
|
38
|
+
* @description Checks if a memory record has expired.
|
|
39
|
+
* @param expiresAt - ISO 8601 timestamp or null (null = never expires).
|
|
40
|
+
* @returns True if the memory has expired.
|
|
41
|
+
*/
|
|
42
|
+
export function isExpired(expiresAt) {
|
|
43
|
+
if (!expiresAt)
|
|
44
|
+
return false;
|
|
45
|
+
return new Date(expiresAt).getTime() <= Date.now();
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/memory/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,QAAgB;IACpD,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACtC,IAAI,GAAG,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,GAAG,CAAC;IACvC,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACrD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAC5B,YAAoB,EACpB,SAAiB,EACjB,WAAmB;IAEnB,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,SAAS,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,WAAW,EAAE,SAAS,CAAC,CAAC;IACpE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,SAAwB;IAChD,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7B,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;AACrD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"facilitator-rpc-fallback.d.ts","sourceRoot":"","sources":["../../src/payments/facilitator-rpc-fallback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAGtD;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,oBAAoB,CAAC;CAC9B;
|
|
1
|
+
{"version":3,"file":"facilitator-rpc-fallback.d.ts","sourceRoot":"","sources":["../../src/payments/facilitator-rpc-fallback.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAGtD;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,oBAAoB,CAAC;CAC9B;AA0BD;;;;GAIG;AACH,wBAAgB,gCAAgC,CAAC,SAAS,EAAE,SAAS,sBAAsB,EAAE,GAAG,oBAAoB,CAoDnH;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAMxE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAa/D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAwD3D"}
|
|
@@ -12,8 +12,14 @@
|
|
|
12
12
|
import { logger, redactSensitiveString } from '../core/logger.js';
|
|
13
13
|
/** Per-attempt timeout in milliseconds. If an RPC doesn't respond in this window, we move to the next. */
|
|
14
14
|
const RPC_ATTEMPT_TIMEOUT_MS = 8_000;
|
|
15
|
+
/** Health check interval — proactively probes endpoints every 30s. */
|
|
16
|
+
const HEALTH_CHECK_INTERVAL_MS = 30_000;
|
|
15
17
|
/** Round-robin counter — shared across all operations so calls distribute across endpoints. */
|
|
16
18
|
let roundRobinIndex = 0;
|
|
19
|
+
/** Endpoint health status — updated by periodic health checks and inline failures. */
|
|
20
|
+
const endpointHealth = new Map();
|
|
21
|
+
/** Health check timer handle. */
|
|
22
|
+
let healthCheckTimer;
|
|
17
23
|
/**
|
|
18
24
|
* @name createResilientFacilitatorSigner
|
|
19
25
|
* @description Wraps one or more facilitator signers with round-robin load balancing,
|
|
@@ -146,6 +152,8 @@ async function runWithRoundRobin(endpoints, operation, network, execute) {
|
|
|
146
152
|
if (endpoints.length === 0) {
|
|
147
153
|
throw new Error('No facilitator RPC endpoints configured');
|
|
148
154
|
}
|
|
155
|
+
// Start health check timer if not already running
|
|
156
|
+
startHealthCheckTimer(endpoints);
|
|
149
157
|
// Advance the round-robin counter — each call starts from the next endpoint.
|
|
150
158
|
const startIndex = roundRobinIndex % endpoints.length;
|
|
151
159
|
roundRobinIndex = (roundRobinIndex + 1) % endpoints.length;
|
|
@@ -155,9 +163,16 @@ async function runWithRoundRobin(endpoints, operation, network, execute) {
|
|
|
155
163
|
const endpoint = endpoints[index];
|
|
156
164
|
if (!endpoint)
|
|
157
165
|
continue;
|
|
166
|
+
// Skip unhealthy endpoints (but still try them as last resort)
|
|
167
|
+
const health = getEndpointHealth(endpoint);
|
|
168
|
+
if (!health.healthy && attempt < endpoints.length - 1) {
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
158
171
|
try {
|
|
159
172
|
// Race the execution against a timeout — if the RPC is slow, we move on immediately.
|
|
160
173
|
const result = await withTimeout(execute(endpoint), RPC_ATTEMPT_TIMEOUT_MS, endpoint.label, operation);
|
|
174
|
+
// Mark endpoint as healthy on success
|
|
175
|
+
markEndpointHealthy(endpoint);
|
|
161
176
|
return result;
|
|
162
177
|
}
|
|
163
178
|
catch (error) {
|
|
@@ -165,6 +180,10 @@ async function runWithRoundRobin(endpoints, operation, network, execute) {
|
|
|
165
180
|
const hasNext = attempt < endpoints.length - 1;
|
|
166
181
|
const isTimeout = error instanceof RpcTimeoutError;
|
|
167
182
|
const isTransient = isTimeout || isTransientRpcError(error);
|
|
183
|
+
// Mark endpoint as unhealthy on transient failure
|
|
184
|
+
if (isTransient) {
|
|
185
|
+
markEndpointUnhealthy(endpoint);
|
|
186
|
+
}
|
|
168
187
|
if (!hasNext || !isTransient) {
|
|
169
188
|
throw error;
|
|
170
189
|
}
|
|
@@ -179,6 +198,82 @@ async function runWithRoundRobin(endpoints, operation, network, execute) {
|
|
|
179
198
|
}
|
|
180
199
|
throw lastError instanceof Error ? lastError : new Error(getErrorMessage(lastError));
|
|
181
200
|
}
|
|
201
|
+
/**
|
|
202
|
+
* Get or initialize health status for an endpoint.
|
|
203
|
+
*/
|
|
204
|
+
function getEndpointHealth(endpoint) {
|
|
205
|
+
const key = endpoint.label;
|
|
206
|
+
let status = endpointHealth.get(key);
|
|
207
|
+
if (!status) {
|
|
208
|
+
status = { healthy: true, lastCheckedAt: 0, consecutiveFailures: 0 };
|
|
209
|
+
endpointHealth.set(key, status);
|
|
210
|
+
}
|
|
211
|
+
return status;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Mark an endpoint as healthy after a successful operation.
|
|
215
|
+
*/
|
|
216
|
+
function markEndpointHealthy(endpoint) {
|
|
217
|
+
const status = getEndpointHealth(endpoint);
|
|
218
|
+
status.healthy = true;
|
|
219
|
+
status.consecutiveFailures = 0;
|
|
220
|
+
status.lastCheckedAt = Date.now();
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Mark an endpoint as unhealthy after a transient failure.
|
|
224
|
+
* After 3 consecutive failures, the endpoint is marked unhealthy until the next health check.
|
|
225
|
+
*/
|
|
226
|
+
function markEndpointUnhealthy(endpoint) {
|
|
227
|
+
const status = getEndpointHealth(endpoint);
|
|
228
|
+
status.consecutiveFailures += 1;
|
|
229
|
+
status.lastCheckedAt = Date.now();
|
|
230
|
+
if (status.consecutiveFailures >= 3) {
|
|
231
|
+
status.healthy = false;
|
|
232
|
+
logger.warn('Facilitator RPC endpoint marked unhealthy', {
|
|
233
|
+
endpoint: endpoint.label,
|
|
234
|
+
consecutiveFailures: status.consecutiveFailures,
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Start periodic health check timer. Probes each endpoint every 30s with a lightweight
|
|
240
|
+
* getLatestBlockhash call. Resets unhealthy endpoints that recover.
|
|
241
|
+
*/
|
|
242
|
+
function startHealthCheckTimer(endpoints) {
|
|
243
|
+
if (healthCheckTimer) {
|
|
244
|
+
return; // Already running
|
|
245
|
+
}
|
|
246
|
+
healthCheckTimer = setInterval(async () => {
|
|
247
|
+
for (const endpoint of endpoints) {
|
|
248
|
+
if (!endpoint.rpcUrl)
|
|
249
|
+
continue;
|
|
250
|
+
const status = getEndpointHealth(endpoint);
|
|
251
|
+
if (status.healthy) {
|
|
252
|
+
continue; // Only probe unhealthy endpoints
|
|
253
|
+
}
|
|
254
|
+
try {
|
|
255
|
+
// Lightweight probe — just check if the RPC responds
|
|
256
|
+
const controller = new AbortController();
|
|
257
|
+
const timeout = setTimeout(() => controller.abort(), 3_000);
|
|
258
|
+
const response = await fetch(endpoint.rpcUrl, {
|
|
259
|
+
method: 'POST',
|
|
260
|
+
headers: { 'Content-Type': 'application/json' },
|
|
261
|
+
body: JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'getHealth' }),
|
|
262
|
+
signal: controller.signal,
|
|
263
|
+
});
|
|
264
|
+
clearTimeout(timeout);
|
|
265
|
+
if (response.ok) {
|
|
266
|
+
markEndpointHealthy(endpoint);
|
|
267
|
+
logger.info('Facilitator RPC endpoint recovered', { endpoint: endpoint.label });
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
catch {
|
|
271
|
+
// Still unhealthy — will be checked again next interval
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}, HEALTH_CHECK_INTERVAL_MS);
|
|
275
|
+
healthCheckTimer.unref?.();
|
|
276
|
+
}
|
|
182
277
|
/**
|
|
183
278
|
* Race a promise against a timeout. If the timeout fires, throw `RpcTimeoutError`.
|
|
184
279
|
*/
|