@oobe-protocol-labs/sap-mcp-server 0.9.15 → 0.9.20
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 +227 -0
- package/README.md +3 -3
- package/USER_DOCS/01_HOSTED_REMOTE_MCP.md +1 -1
- package/USER_DOCS/04_CLIENT_CONFIGS.md +3 -3
- package/USER_DOCS/05_SKILLS_AND_TOOLS.md +16 -8
- package/USER_DOCS/06_DESKTOP_GUI_WIZARD.md +5 -5
- package/config.example.json +5 -4
- package/config.schema.json +7 -2
- 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 +213 -24
- package/dist/adapters/mcp/sdk-compat.js.map +1 -1
- package/dist/adapters/mcp/tool-response.d.ts +39 -4
- package/dist/adapters/mcp/tool-response.d.ts.map +1 -1
- package/dist/adapters/mcp/tool-response.js +39 -4
- 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 +11 -6
- 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 +97 -1
- package/dist/config/mcp-client-injection.js.map +1 -1
- package/dist/config/paths.d.ts +5 -0
- package/dist/config/paths.d.ts.map +1 -1
- package/dist/config/paths.js +5 -0
- 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-cli.d.ts +3 -13
- package/dist/config-cli.d.ts.map +1 -1
- package/dist/config-cli.js +5 -0
- package/dist/config-cli.js.map +1 -1
- package/dist/core/constants.d.ts +25 -6
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +27 -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/logger.js.map +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/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 +1 -0
- package/dist/payments/hosted-tool-eligibility.d.ts.map +1 -1
- package/dist/payments/hosted-tool-eligibility.js +1 -0
- package/dist/payments/hosted-tool-eligibility.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 +5 -0
- package/dist/payments/monetization-gate.d.ts.map +1 -1
- package/dist/payments/monetization-gate.js +24 -1
- package/dist/payments/monetization-gate.js.map +1 -1
- package/dist/payments/pricing.d.ts +2 -0
- package/dist/payments/pricing.d.ts.map +1 -1
- package/dist/payments/pricing.js +126 -10
- 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 +50 -0
- package/dist/payments/x402-paid-call.d.ts.map +1 -1
- package/dist/payments/x402-paid-call.js +171 -0
- 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 +143 -0
- package/dist/premium/builtin-plugins.d.ts.map +1 -0
- package/dist/premium/builtin-plugins.js +394 -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 +109 -0
- package/dist/premium/provider-bridge.d.ts.map +1 -0
- package/dist/premium/provider-bridge.js +239 -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 +102 -0
- package/dist/premium/webhook-engine.d.ts.map +1 -0
- package/dist/premium/webhook-engine.js +382 -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 +2 -8
- 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 +1 -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 +3 -4
- 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 +3 -4
- 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 +346 -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 +7 -1
- package/dist/remote/public-home/sections.js.map +1 -1
- package/dist/remote/public-home/types.d.ts +6 -0
- package/dist/remote/public-home/types.d.ts.map +1 -1
- package/dist/remote/server.d.ts +18 -0
- package/dist/remote/server.d.ts.map +1 -1
- package/dist/remote/server.js +298 -116
- 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 +36 -4
- 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/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 +34 -1
- package/dist/server/server-metadata.d.ts.map +1 -1
- package/dist/server/server-metadata.js +35 -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 +16 -2
- package/dist/signer/local-keypair-signer.d.ts.map +1 -1
- package/dist/signer/local-keypair-signer.js +16 -2
- 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/tools/agent-start-tool.d.ts.map +1 -1
- package/dist/tools/agent-start-tool.js +210 -2
- 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 +27 -2
- 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 +6 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +7 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/magicblock-tools.d.ts +25 -0
- package/dist/tools/magicblock-tools.d.ts.map +1 -1
- package/dist/tools/magicblock-tools.js +116 -8
- package/dist/tools/magicblock-tools.js.map +1 -1
- 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 +732 -0
- package/dist/tools/premium-tools.js.map +1 -0
- package/dist/tools/register-tools.d.ts.map +1 -1
- package/dist/tools/register-tools.js +9 -0
- package/dist/tools/register-tools.js.map +1 -1
- package/dist/tools/sap-sdk-tools.d.ts.map +1 -1
- package/dist/tools/sap-sdk-tools.js +191 -13
- package/dist/tools/sap-sdk-tools.js.map +1 -1
- package/dist/tools/x402-paid-call-tool.js +2 -2
- 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/docs/06_PAYMENTS_X402_AND_PAYSH.md +20 -4
- package/docs/07_ENDPOINTS_AND_CLIENTS.md +4 -1
- package/docs/09_TOOLS_SKILLS_AND_AGENT_GUIDE.md +16 -5
- package/docs/14_DESKTOP_WIZARD_RELEASE.md +3 -3
- package/docs/16_SAP_AGENT_IDENTITY_PIPELINE.md +6 -0
- package/docs/18_PREMIUM_PLUGIN_RUNTIME.md +108 -0
- package/docs/README.md +12 -0
- package/package.json +8 -6
- package/server.json +3 -3
- package/skills/README.md +10 -2
- package/skills/sap-agent-registry/SKILL.md +27 -6
- package/skills/sap-discovery-indexing/SKILL.md +11 -0
- package/skills/sap-mcp/SKILL.md +49 -16
- package/skills/sap-mcp/TOOL_REFERENCE.md +20 -7
- package/skills/sap-operations/SKILL.md +11 -0
- package/skills/sap-payments-x402/SKILL.md +30 -8
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @name premium/session-manager
|
|
3
|
+
* @description In-memory lifecycle manager for premium session plans.
|
|
4
|
+
*
|
|
5
|
+
* When an agent calls `sap_premium_create_session_plan` (via `premium-tools.ts`),
|
|
6
|
+
* this module resolves the requested capability, clamps units/TTL to the
|
|
7
|
+
* capability's pricing bounds, checks provider env readiness, calculates the
|
|
8
|
+
* estimated USD price, and stores the resulting `PremiumSessionRecord` in an
|
|
9
|
+
* in-memory `Map` keyed by session id.
|
|
10
|
+
*
|
|
11
|
+
* Session lifecycle states:
|
|
12
|
+
*
|
|
13
|
+
* pending_payment → active → closed
|
|
14
|
+
* pending_payment → expired (if TTL passes before activation)
|
|
15
|
+
* blocked_requires_provider (if provider env vars are not set)
|
|
16
|
+
*
|
|
17
|
+
* Sessions auto-expire after their TTL and are pruned on every create/list
|
|
18
|
+
* call. A hard cap of 1 000 concurrent session plans prevents unbounded growth.
|
|
19
|
+
*
|
|
20
|
+
* @flow
|
|
21
|
+
* 1. MCP tool `sap_premium_session_start` → `createPremiumSessionPlan()`.
|
|
22
|
+
* 2. MCP tool `sap_premium_activate_session` → `activateSession()`.
|
|
23
|
+
* 3. MCP tool `sap_premium_close_session` → `closeSession()`.
|
|
24
|
+
* 4. MCP tool `sap_premium_session_status` → `getPremiumSession()` / `listPremiumSessions()`.
|
|
25
|
+
*
|
|
26
|
+
* @module premium/session-manager
|
|
27
|
+
*/
|
|
28
|
+
import type { PremiumActivationResult, PremiumSessionRecord, PremiumSessionRequest } from './types.js';
|
|
29
|
+
/**
|
|
30
|
+
* @name createPremiumSessionPlan
|
|
31
|
+
* @description Create and store a premium session plan for a buyer request.
|
|
32
|
+
*
|
|
33
|
+
* Resolution steps:
|
|
34
|
+
* 1. Prune expired/overflow sessions from the store.
|
|
35
|
+
* 2. Look up the capability via `findPremiumCapability` (builtin + private).
|
|
36
|
+
* 3. Clamp `requestedUnits` to [minUnits, maxUnits] and `ttlSeconds` to [60, 3600].
|
|
37
|
+
* 4. Compute `estimatedPriceUsd = requestedUnits × unitPriceUsd`.
|
|
38
|
+
* 5. Check whether all `providerEnv` vars are set in `process.env`.
|
|
39
|
+
* 6. Set status to `blocked_requires_provider` if provider is not ready,
|
|
40
|
+
* otherwise `pending_payment`.
|
|
41
|
+
* 7. Generate a `sap-premium-<uuid>` session id, store, and return the record.
|
|
42
|
+
*
|
|
43
|
+
* @param request - Buyer-provided session request (plugin, capability, units, TTL).
|
|
44
|
+
* @returns The stored `PremiumSessionRecord` with server-generated fields.
|
|
45
|
+
* @throws {Error} If the plugin/capability pair is not found in the catalog.
|
|
46
|
+
*
|
|
47
|
+
* @usedBy `premium-tools.ts` → MCP tool `sap_premium_session_start`
|
|
48
|
+
*/
|
|
49
|
+
export declare function createPremiumSessionPlan(request: PremiumSessionRequest): PremiumSessionRecord;
|
|
50
|
+
/**
|
|
51
|
+
* @name getPremiumSession
|
|
52
|
+
* @description Retrieve a session plan by id, lazily marking it as expired.
|
|
53
|
+
*
|
|
54
|
+
* If the session's `expiresAt` has passed and it is not already marked
|
|
55
|
+
* `expired`, the stored record is updated in place and the expired version
|
|
56
|
+
* is returned. A shallow copy is always returned to prevent external mutation
|
|
57
|
+
* of the internal store.
|
|
58
|
+
*
|
|
59
|
+
* @param sessionId - The session id returned by `createPremiumSessionPlan`.
|
|
60
|
+
* @returns The session record, or `null` if not found.
|
|
61
|
+
*
|
|
62
|
+
* @usedBy `premium-tools.ts` → MCP tool `sap_premium_session_status`
|
|
63
|
+
*/
|
|
64
|
+
export declare function getPremiumSession(sessionId: string): PremiumSessionRecord | null;
|
|
65
|
+
/**
|
|
66
|
+
* @name listPremiumSessions
|
|
67
|
+
* @description List all non-null session plans after pruning expired entries.
|
|
68
|
+
*
|
|
69
|
+
* @returns Array of all current session records (including lazily-expired ones).
|
|
70
|
+
*
|
|
71
|
+
* @usedBy `premium-tools.ts` → MCP tool `sap_premium_session_status`
|
|
72
|
+
*/
|
|
73
|
+
export declare function listPremiumSessions(): PremiumSessionRecord[];
|
|
74
|
+
/**
|
|
75
|
+
* @name activateSession
|
|
76
|
+
* @description Transition a session from `pending_payment` to `active`.
|
|
77
|
+
*
|
|
78
|
+
* Called by the activation manager after the x402/pay.sh receipt has been
|
|
79
|
+
* verified. The session's `nextAction` is updated to reflect the active state.
|
|
80
|
+
* If the session is not in `pending_payment` status, activation is rejected.
|
|
81
|
+
*
|
|
82
|
+
* @param sessionId - The session id to activate.
|
|
83
|
+
* @returns The activation result with `status=active` on success, or the
|
|
84
|
+
* blocking status on failure.
|
|
85
|
+
*
|
|
86
|
+
* @usedBy `activation-manager.ts:activateSession`
|
|
87
|
+
*/
|
|
88
|
+
export declare function activateSession(sessionId: string): PremiumActivationResult;
|
|
89
|
+
/**
|
|
90
|
+
* @name closeSession
|
|
91
|
+
* @description Transition an active session to `closed`.
|
|
92
|
+
*
|
|
93
|
+
* Called by the delivery rail when the unit quota is reached, when the buyer
|
|
94
|
+
* explicitly closes the session, or when the server shuts down gracefully.
|
|
95
|
+
*
|
|
96
|
+
* @param sessionId - The session id to close.
|
|
97
|
+
* @param reason - Human-readable reason for closure.
|
|
98
|
+
* @returns True if the session was closed, false if it was not found or not active.
|
|
99
|
+
*
|
|
100
|
+
* @usedBy `stream-broker.ts`, `webhook-engine.ts`, `premium-tools.ts`
|
|
101
|
+
*/
|
|
102
|
+
export declare function closeSession(sessionId: string, reason: string): boolean;
|
|
103
|
+
/**
|
|
104
|
+
* @name decrementSessionQuota
|
|
105
|
+
* @description Decrement the remaining units quota for an active session.
|
|
106
|
+
*
|
|
107
|
+
* Called by the stream broker / webhook engine after each delivered event.
|
|
108
|
+
* When the quota reaches zero, the session is automatically closed.
|
|
109
|
+
*
|
|
110
|
+
* @param sessionId - The active session id.
|
|
111
|
+
* @returns The remaining units after decrement, or -1 if the session is not active.
|
|
112
|
+
*
|
|
113
|
+
* @usedBy `stream-broker.ts`, `webhook-engine.ts`
|
|
114
|
+
*/
|
|
115
|
+
export declare function decrementSessionQuota(sessionId: string): number;
|
|
116
|
+
/**
|
|
117
|
+
* @name clearAllSessions
|
|
118
|
+
* @description Clear all sessions from the in-memory store.
|
|
119
|
+
*
|
|
120
|
+
* Used in tests and during graceful server shutdown.
|
|
121
|
+
*
|
|
122
|
+
* @internal
|
|
123
|
+
*/
|
|
124
|
+
export declare function clearAllSessions(): void;
|
|
125
|
+
//# sourceMappingURL=session-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/premium/session-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAIH,OAAO,KAAK,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAmEvG;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,qBAAqB,GAAG,oBAAoB,CA6C7F;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAehF;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,IAAI,oBAAoB,EAAE,CAG5D;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,uBAAuB,CA0E1E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAWvE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAgB/D;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @name premium/session-manager
|
|
3
|
+
* @description In-memory lifecycle manager for premium session plans.
|
|
4
|
+
*
|
|
5
|
+
* When an agent calls `sap_premium_create_session_plan` (via `premium-tools.ts`),
|
|
6
|
+
* this module resolves the requested capability, clamps units/TTL to the
|
|
7
|
+
* capability's pricing bounds, checks provider env readiness, calculates the
|
|
8
|
+
* estimated USD price, and stores the resulting `PremiumSessionRecord` in an
|
|
9
|
+
* in-memory `Map` keyed by session id.
|
|
10
|
+
*
|
|
11
|
+
* Session lifecycle states:
|
|
12
|
+
*
|
|
13
|
+
* pending_payment → active → closed
|
|
14
|
+
* pending_payment → expired (if TTL passes before activation)
|
|
15
|
+
* blocked_requires_provider (if provider env vars are not set)
|
|
16
|
+
*
|
|
17
|
+
* Sessions auto-expire after their TTL and are pruned on every create/list
|
|
18
|
+
* call. A hard cap of 1 000 concurrent session plans prevents unbounded growth.
|
|
19
|
+
*
|
|
20
|
+
* @flow
|
|
21
|
+
* 1. MCP tool `sap_premium_session_start` → `createPremiumSessionPlan()`.
|
|
22
|
+
* 2. MCP tool `sap_premium_activate_session` → `activateSession()`.
|
|
23
|
+
* 3. MCP tool `sap_premium_close_session` → `closeSession()`.
|
|
24
|
+
* 4. MCP tool `sap_premium_session_status` → `getPremiumSession()` / `listPremiumSessions()`.
|
|
25
|
+
*
|
|
26
|
+
* @module premium/session-manager
|
|
27
|
+
*/
|
|
28
|
+
import { randomUUID } from 'node:crypto';
|
|
29
|
+
import { findPremiumCapability } from './builtin-plugins.js';
|
|
30
|
+
/**
|
|
31
|
+
* @description In-memory store of active session plans, keyed by session id.
|
|
32
|
+
* Not exported — access is mediated through the public functions below.
|
|
33
|
+
*/
|
|
34
|
+
const sessions = new Map();
|
|
35
|
+
/**
|
|
36
|
+
* @description Hard cap on concurrent session plans to prevent unbounded
|
|
37
|
+
* memory growth in long-running MCP server processes.
|
|
38
|
+
*
|
|
39
|
+
* Default: 10_000 (tuned for a 312GB RAM production server).
|
|
40
|
+
* Override via `SAP_MCP_PREMIUM_MAX_SESSIONS` env var.
|
|
41
|
+
*/
|
|
42
|
+
const MAX_PREMIUM_SESSION_PLANS = (() => {
|
|
43
|
+
const raw = process.env.SAP_MCP_PREMIUM_MAX_SESSIONS;
|
|
44
|
+
const parsed = Number(raw);
|
|
45
|
+
return Number.isFinite(parsed) && parsed > 0 ? Math.trunc(parsed) : 10_000;
|
|
46
|
+
})();
|
|
47
|
+
/**
|
|
48
|
+
* @name clampInteger
|
|
49
|
+
* @description Safely clamp an arbitrary numeric value to an integer within [min, max].
|
|
50
|
+
*
|
|
51
|
+
* Non-finite values (NaN, Infinity) fall back to `min`. The value is truncated
|
|
52
|
+
* to an integer before clamping.
|
|
53
|
+
*
|
|
54
|
+
* @param value - Raw input (may be float, NaN, or Infinity).
|
|
55
|
+
* @param min - Lower bound (inclusive).
|
|
56
|
+
* @param max - Upper bound (inclusive).
|
|
57
|
+
* @returns Integer clamped to [min, max].
|
|
58
|
+
*
|
|
59
|
+
* @internal
|
|
60
|
+
*/
|
|
61
|
+
function clampInteger(value, min, max) {
|
|
62
|
+
if (!Number.isFinite(value))
|
|
63
|
+
return min;
|
|
64
|
+
return Math.min(max, Math.max(min, Math.trunc(value)));
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* @name pruneExpiredSessions
|
|
68
|
+
* @description Remove all sessions whose `expiresAt` has passed, then evict
|
|
69
|
+
* the oldest sessions if the store exceeds `MAX_PREMIUM_SESSION_PLANS`.
|
|
70
|
+
*
|
|
71
|
+
* Called on every `createPremiumSessionPlan` and `listPremiumSessions` call
|
|
72
|
+
* to keep the store bounded without requiring a background timer.
|
|
73
|
+
*
|
|
74
|
+
* @internal
|
|
75
|
+
*/
|
|
76
|
+
function pruneExpiredSessions() {
|
|
77
|
+
const now = Date.now();
|
|
78
|
+
for (const [sessionId, record] of sessions.entries()) {
|
|
79
|
+
if (record.status === 'active' || record.status === 'closed')
|
|
80
|
+
continue;
|
|
81
|
+
if (new Date(record.expiresAt).getTime() <= now) {
|
|
82
|
+
sessions.delete(sessionId);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Evict oldest entries (Map preserves insertion order) if still over cap.
|
|
86
|
+
while (sessions.size > MAX_PREMIUM_SESSION_PLANS) {
|
|
87
|
+
const oldestSessionId = sessions.keys().next().value;
|
|
88
|
+
if (!oldestSessionId)
|
|
89
|
+
break;
|
|
90
|
+
sessions.delete(oldestSessionId);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* @name createPremiumSessionPlan
|
|
95
|
+
* @description Create and store a premium session plan for a buyer request.
|
|
96
|
+
*
|
|
97
|
+
* Resolution steps:
|
|
98
|
+
* 1. Prune expired/overflow sessions from the store.
|
|
99
|
+
* 2. Look up the capability via `findPremiumCapability` (builtin + private).
|
|
100
|
+
* 3. Clamp `requestedUnits` to [minUnits, maxUnits] and `ttlSeconds` to [60, 3600].
|
|
101
|
+
* 4. Compute `estimatedPriceUsd = requestedUnits × unitPriceUsd`.
|
|
102
|
+
* 5. Check whether all `providerEnv` vars are set in `process.env`.
|
|
103
|
+
* 6. Set status to `blocked_requires_provider` if provider is not ready,
|
|
104
|
+
* otherwise `pending_payment`.
|
|
105
|
+
* 7. Generate a `sap-premium-<uuid>` session id, store, and return the record.
|
|
106
|
+
*
|
|
107
|
+
* @param request - Buyer-provided session request (plugin, capability, units, TTL).
|
|
108
|
+
* @returns The stored `PremiumSessionRecord` with server-generated fields.
|
|
109
|
+
* @throws {Error} If the plugin/capability pair is not found in the catalog.
|
|
110
|
+
*
|
|
111
|
+
* @usedBy `premium-tools.ts` → MCP tool `sap_premium_session_start`
|
|
112
|
+
*/
|
|
113
|
+
export function createPremiumSessionPlan(request) {
|
|
114
|
+
pruneExpiredSessions();
|
|
115
|
+
const resolved = findPremiumCapability(request.pluginId, request.capabilityId, request.capabilityType);
|
|
116
|
+
if (!resolved) {
|
|
117
|
+
throw new Error(`unknown_premium_capability:${request.pluginId}/${request.capabilityId}`);
|
|
118
|
+
}
|
|
119
|
+
const { capability } = resolved;
|
|
120
|
+
// Clamp buyer-requested values to the capability's allowed bounds.
|
|
121
|
+
const requestedUnits = clampInteger(request.requestedUnits, capability.pricing.minUnits, capability.pricing.maxUnits);
|
|
122
|
+
const ttlSeconds = clampInteger(request.ttlSeconds, 60, 3_600);
|
|
123
|
+
// Calculate estimated price with 6 decimal places of precision.
|
|
124
|
+
const estimatedPriceUsd = Number((requestedUnits * capability.pricing.unitPriceUsd).toFixed(6));
|
|
125
|
+
const now = new Date();
|
|
126
|
+
const expiresAt = new Date(now.getTime() + ttlSeconds * 1000);
|
|
127
|
+
// Provider readiness: every declared env var must be truthy in process.env.
|
|
128
|
+
const providerReady = capability.providerEnv.every(envName => Boolean(process.env[envName]));
|
|
129
|
+
// Status depends on whether the capability needs an external provider.
|
|
130
|
+
const status = capability.requiresProvider && !providerReady ? 'blocked_requires_provider' : 'pending_payment';
|
|
131
|
+
// Next-action guidance is the only human-readable instruction the agent gets.
|
|
132
|
+
const nextAction = capability.requiresProvider && !providerReady
|
|
133
|
+
? `Configure provider env vars first: ${capability.providerEnv.join(', ')}. No x402 payment should be attempted until the provider is ready.`
|
|
134
|
+
: 'Activate this plan through the premium stream/webhook transport once the paid delivery endpoint is enabled. Keep payment receipts bound to this session id.';
|
|
135
|
+
const record = {
|
|
136
|
+
...request,
|
|
137
|
+
requestedUnits,
|
|
138
|
+
ttlSeconds,
|
|
139
|
+
sessionId: `sap-premium-${randomUUID()}`,
|
|
140
|
+
status,
|
|
141
|
+
providerReady,
|
|
142
|
+
createdAt: now.toISOString(),
|
|
143
|
+
expiresAt: expiresAt.toISOString(),
|
|
144
|
+
estimatedPriceUsd,
|
|
145
|
+
nextAction,
|
|
146
|
+
};
|
|
147
|
+
sessions.set(record.sessionId, record);
|
|
148
|
+
return record;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* @name getPremiumSession
|
|
152
|
+
* @description Retrieve a session plan by id, lazily marking it as expired.
|
|
153
|
+
*
|
|
154
|
+
* If the session's `expiresAt` has passed and it is not already marked
|
|
155
|
+
* `expired`, the stored record is updated in place and the expired version
|
|
156
|
+
* is returned. A shallow copy is always returned to prevent external mutation
|
|
157
|
+
* of the internal store.
|
|
158
|
+
*
|
|
159
|
+
* @param sessionId - The session id returned by `createPremiumSessionPlan`.
|
|
160
|
+
* @returns The session record, or `null` if not found.
|
|
161
|
+
*
|
|
162
|
+
* @usedBy `premium-tools.ts` → MCP tool `sap_premium_session_status`
|
|
163
|
+
*/
|
|
164
|
+
export function getPremiumSession(sessionId) {
|
|
165
|
+
const record = sessions.get(sessionId);
|
|
166
|
+
if (!record)
|
|
167
|
+
return null;
|
|
168
|
+
// Lazy expiration: update status in-place if TTL has passed.
|
|
169
|
+
// Active sessions are not expired by TTL — they are closed by the delivery rail.
|
|
170
|
+
if (record.status !== 'active' && record.status !== 'closed' && record.status !== 'expired') {
|
|
171
|
+
if (new Date(record.expiresAt).getTime() <= Date.now()) {
|
|
172
|
+
const expired = { ...record, status: 'expired', nextAction: 'Create a fresh session plan before opening a paid stream or webhook.' };
|
|
173
|
+
sessions.set(sessionId, expired);
|
|
174
|
+
return expired;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return { ...record };
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* @name listPremiumSessions
|
|
181
|
+
* @description List all non-null session plans after pruning expired entries.
|
|
182
|
+
*
|
|
183
|
+
* @returns Array of all current session records (including lazily-expired ones).
|
|
184
|
+
*
|
|
185
|
+
* @usedBy `premium-tools.ts` → MCP tool `sap_premium_session_status`
|
|
186
|
+
*/
|
|
187
|
+
export function listPremiumSessions() {
|
|
188
|
+
pruneExpiredSessions();
|
|
189
|
+
return [...sessions.keys()].map(sessionId => getPremiumSession(sessionId)).filter((record) => record !== null);
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* @name activateSession
|
|
193
|
+
* @description Transition a session from `pending_payment` to `active`.
|
|
194
|
+
*
|
|
195
|
+
* Called by the activation manager after the x402/pay.sh receipt has been
|
|
196
|
+
* verified. The session's `nextAction` is updated to reflect the active state.
|
|
197
|
+
* If the session is not in `pending_payment` status, activation is rejected.
|
|
198
|
+
*
|
|
199
|
+
* @param sessionId - The session id to activate.
|
|
200
|
+
* @returns The activation result with `status=active` on success, or the
|
|
201
|
+
* blocking status on failure.
|
|
202
|
+
*
|
|
203
|
+
* @usedBy `activation-manager.ts:activateSession`
|
|
204
|
+
*/
|
|
205
|
+
export function activateSession(sessionId) {
|
|
206
|
+
const record = sessions.get(sessionId);
|
|
207
|
+
if (!record) {
|
|
208
|
+
return {
|
|
209
|
+
sessionId,
|
|
210
|
+
status: 'expired',
|
|
211
|
+
activatedAt: null,
|
|
212
|
+
receiptBound: false,
|
|
213
|
+
unitsQuota: 0,
|
|
214
|
+
reason: 'Session not found. Create a fresh session plan before activation.',
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
if (record.status === 'blocked_requires_provider') {
|
|
218
|
+
return {
|
|
219
|
+
sessionId,
|
|
220
|
+
status: 'blocked_requires_provider',
|
|
221
|
+
activatedAt: null,
|
|
222
|
+
receiptBound: false,
|
|
223
|
+
unitsQuota: 0,
|
|
224
|
+
reason: 'Provider is not ready. Configure provider env vars before activating.',
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
if (record.status === 'expired') {
|
|
228
|
+
return {
|
|
229
|
+
sessionId,
|
|
230
|
+
status: 'expired',
|
|
231
|
+
activatedAt: null,
|
|
232
|
+
receiptBound: false,
|
|
233
|
+
unitsQuota: 0,
|
|
234
|
+
reason: 'Session has expired. Create a fresh session plan.',
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
if (record.status === 'active') {
|
|
238
|
+
return {
|
|
239
|
+
sessionId,
|
|
240
|
+
status: 'active',
|
|
241
|
+
activatedAt: record.createdAt,
|
|
242
|
+
receiptBound: true,
|
|
243
|
+
unitsQuota: record.requestedUnits,
|
|
244
|
+
reason: 'Session is already active.',
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
if (record.status === 'closed') {
|
|
248
|
+
return {
|
|
249
|
+
sessionId,
|
|
250
|
+
status: 'closed',
|
|
251
|
+
activatedAt: null,
|
|
252
|
+
receiptBound: false,
|
|
253
|
+
unitsQuota: 0,
|
|
254
|
+
reason: 'Session has been closed. Create a fresh session plan.',
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
// Status is pending_payment — transition to active.
|
|
258
|
+
const now = new Date().toISOString();
|
|
259
|
+
const activated = {
|
|
260
|
+
...record,
|
|
261
|
+
status: 'active',
|
|
262
|
+
nextAction: 'Session is active. Stream/webhook delivery is enabled. Units are metered until quota is reached or the session is closed.',
|
|
263
|
+
};
|
|
264
|
+
sessions.set(sessionId, activated);
|
|
265
|
+
return {
|
|
266
|
+
sessionId,
|
|
267
|
+
status: 'active',
|
|
268
|
+
activatedAt: now,
|
|
269
|
+
receiptBound: true,
|
|
270
|
+
unitsQuota: record.requestedUnits,
|
|
271
|
+
reason: 'Session activated successfully. Delivery rail is enabled.',
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* @name closeSession
|
|
276
|
+
* @description Transition an active session to `closed`.
|
|
277
|
+
*
|
|
278
|
+
* Called by the delivery rail when the unit quota is reached, when the buyer
|
|
279
|
+
* explicitly closes the session, or when the server shuts down gracefully.
|
|
280
|
+
*
|
|
281
|
+
* @param sessionId - The session id to close.
|
|
282
|
+
* @param reason - Human-readable reason for closure.
|
|
283
|
+
* @returns True if the session was closed, false if it was not found or not active.
|
|
284
|
+
*
|
|
285
|
+
* @usedBy `stream-broker.ts`, `webhook-engine.ts`, `premium-tools.ts`
|
|
286
|
+
*/
|
|
287
|
+
export function closeSession(sessionId, reason) {
|
|
288
|
+
const record = sessions.get(sessionId);
|
|
289
|
+
if (!record || record.status !== 'active')
|
|
290
|
+
return false;
|
|
291
|
+
const closed = {
|
|
292
|
+
...record,
|
|
293
|
+
status: 'closed',
|
|
294
|
+
nextAction: `Session closed: ${reason}. Create a fresh session plan to resume delivery.`,
|
|
295
|
+
};
|
|
296
|
+
sessions.set(sessionId, closed);
|
|
297
|
+
return true;
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* @name decrementSessionQuota
|
|
301
|
+
* @description Decrement the remaining units quota for an active session.
|
|
302
|
+
*
|
|
303
|
+
* Called by the stream broker / webhook engine after each delivered event.
|
|
304
|
+
* When the quota reaches zero, the session is automatically closed.
|
|
305
|
+
*
|
|
306
|
+
* @param sessionId - The active session id.
|
|
307
|
+
* @returns The remaining units after decrement, or -1 if the session is not active.
|
|
308
|
+
*
|
|
309
|
+
* @usedBy `stream-broker.ts`, `webhook-engine.ts`
|
|
310
|
+
*/
|
|
311
|
+
export function decrementSessionQuota(sessionId) {
|
|
312
|
+
const record = sessions.get(sessionId);
|
|
313
|
+
if (!record || record.status !== 'active')
|
|
314
|
+
return -1;
|
|
315
|
+
const remaining = Math.max(0, record.requestedUnits - 1);
|
|
316
|
+
const updated = {
|
|
317
|
+
...record,
|
|
318
|
+
requestedUnits: remaining,
|
|
319
|
+
};
|
|
320
|
+
sessions.set(sessionId, updated);
|
|
321
|
+
if (remaining === 0) {
|
|
322
|
+
closeSession(sessionId, 'Unit quota exhausted.');
|
|
323
|
+
}
|
|
324
|
+
return remaining;
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* @name clearAllSessions
|
|
328
|
+
* @description Clear all sessions from the in-memory store.
|
|
329
|
+
*
|
|
330
|
+
* Used in tests and during graceful server shutdown.
|
|
331
|
+
*
|
|
332
|
+
* @internal
|
|
333
|
+
*/
|
|
334
|
+
export function clearAllSessions() {
|
|
335
|
+
sessions.clear();
|
|
336
|
+
}
|
|
337
|
+
//# sourceMappingURL=session-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/premium/session-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @name premium/stream-broker
|
|
3
|
+
* @description SSE stream broker for premium real-time event delivery.
|
|
4
|
+
*
|
|
5
|
+
* After a session is activated (`status=active`), the stream broker opens a
|
|
6
|
+
* provider subscription, enriches each event with session metadata, stores it
|
|
7
|
+
* in the event store for replay, and delivers it to the buyer via SSE
|
|
8
|
+
* (Server-Sent Events) over the `/premium/stream/:sessionId` HTTP endpoint.
|
|
9
|
+
*
|
|
10
|
+
* The broker enforces:
|
|
11
|
+
* - Unit quota: stops delivery when `requestedUnits` reaches zero.
|
|
12
|
+
* - Session status: only delivers for `status=active` sessions.
|
|
13
|
+
* - Event idempotency: deduplicates via `eventId` in the event store.
|
|
14
|
+
* - Graceful shutdown: closes all active streams on disconnect.
|
|
15
|
+
*
|
|
16
|
+
* @flow
|
|
17
|
+
* 1. Buyer calls `GET /premium/stream/:sessionId` with `Accept: text/event-stream`.
|
|
18
|
+
* 2. → `startStream()` validates session is active, loads provider adapter.
|
|
19
|
+
* 3. → Provider `subscribe()` returns async iterable of `ProviderEvent`.
|
|
20
|
+
* 4. → For each event: enrich with session metadata, `appendEvent()`, write SSE.
|
|
21
|
+
* 5. → `decrementSessionQuota()` after each event; auto-close at zero.
|
|
22
|
+
* 6. Client disconnects or quota exhausted → `stopStream()`.
|
|
23
|
+
*
|
|
24
|
+
* @module premium/stream-broker
|
|
25
|
+
*/
|
|
26
|
+
import type { PremiumStreamSubscription, ProviderEvent } from './types.js';
|
|
27
|
+
/**
|
|
28
|
+
* @name startStream
|
|
29
|
+
* @description Start a premium stream subscription for an active session.
|
|
30
|
+
*
|
|
31
|
+
* @param sessionId - The activated premium session id.
|
|
32
|
+
* @param subscriptionKey - De-duplication key from the stream input schema.
|
|
33
|
+
* @param filters - Narrow filters for the provider subscription.
|
|
34
|
+
* @returns The `PremiumStreamSubscription` if successful, or `null` if the
|
|
35
|
+
* session is not active or the provider is not available.
|
|
36
|
+
*
|
|
37
|
+
* @usedBy `remote/server.ts` → `GET /premium/stream/:sessionId`
|
|
38
|
+
*/
|
|
39
|
+
export declare function startStream(sessionId: string, subscriptionKey: string, filters: Record<string, unknown>): Promise<PremiumStreamSubscription | null>;
|
|
40
|
+
/**
|
|
41
|
+
* @name streamEvents
|
|
42
|
+
* @description Async generator that yields enriched premium events for a session.
|
|
43
|
+
*
|
|
44
|
+
* This is the core delivery loop. It:
|
|
45
|
+
* 1. Loads the provider adapter for the session's plugin/capability.
|
|
46
|
+
* 2. Subscribes with the session's filters.
|
|
47
|
+
* 3. For each provider event: enriches with session metadata, appends to the
|
|
48
|
+
* event store, decrements the unit quota, and yields the enriched event.
|
|
49
|
+
* 4. Stops when the quota reaches zero, the provider iterable ends, or the
|
|
50
|
+
* stream is cancelled via `stopStream()`.
|
|
51
|
+
*
|
|
52
|
+
* @param sessionId - The active session id.
|
|
53
|
+
* @returns Async generator yielding `ProviderEvent` enriched with session metadata.
|
|
54
|
+
*
|
|
55
|
+
* @usedBy `remote/server.ts` → SSE response writer
|
|
56
|
+
*/
|
|
57
|
+
export declare function streamEvents(sessionId: string): AsyncGenerator<ProviderEvent, void, unknown>;
|
|
58
|
+
/**
|
|
59
|
+
* @name stopStream
|
|
60
|
+
* @description Stop an active stream subscription.
|
|
61
|
+
*
|
|
62
|
+
* Aborts the provider async iterable and marks the subscription as inactive.
|
|
63
|
+
* The session is not closed — the buyer can resume with a replay query.
|
|
64
|
+
*
|
|
65
|
+
* @param sessionId - The session id to stop streaming for.
|
|
66
|
+
*
|
|
67
|
+
* @usedBy `remote/server.ts` → client disconnect handler
|
|
68
|
+
*/
|
|
69
|
+
export declare function stopStream(sessionId: string): void;
|
|
70
|
+
/**
|
|
71
|
+
* @name replayEvents
|
|
72
|
+
* @description Replay past events for a session within the replay window.
|
|
73
|
+
*
|
|
74
|
+
* Used when a client reconnects and needs to catch up on events missed
|
|
75
|
+
* during the disconnection period.
|
|
76
|
+
*
|
|
77
|
+
* @param sessionId - The session id to replay events for.
|
|
78
|
+
* @param since - Optional ISO timestamp; only events after this are returned.
|
|
79
|
+
* @returns Array of `ProviderEvent` records from the event store.
|
|
80
|
+
*
|
|
81
|
+
* @usedBy `remote/server.ts` → SSE replay before live stream
|
|
82
|
+
*/
|
|
83
|
+
export declare function replayEvents(sessionId: string, since?: string): ProviderEvent[];
|
|
84
|
+
/**
|
|
85
|
+
* @name getActiveStreamCount
|
|
86
|
+
* @description Return the number of currently active stream subscriptions.
|
|
87
|
+
*
|
|
88
|
+
* @usedBy `metrics.ts`
|
|
89
|
+
*/
|
|
90
|
+
export declare function getActiveStreamCount(): number;
|
|
91
|
+
/**
|
|
92
|
+
* @name stopAllStreams
|
|
93
|
+
* @description Stop all active streams. Called during graceful shutdown.
|
|
94
|
+
*
|
|
95
|
+
* @usedBy `remote/server.ts` shutdown handler
|
|
96
|
+
*/
|
|
97
|
+
export declare function stopAllStreams(): void;
|
|
98
|
+
//# sourceMappingURL=stream-broker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-broker.d.ts","sourceRoot":"","sources":["../../src/premium/stream-broker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,yBAAyB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAgB3E;;;;;;;;;;;GAWG;AACH,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAqB3C;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAuB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAAC,aAAa,EAAE,IAAI,EAAE,OAAO,CAAC,CAmDnG;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAYlD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE,CAO/E;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAIrC"}
|