@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.
Files changed (607) hide show
  1. package/.env.example +8 -7
  2. package/CHANGELOG.md +227 -0
  3. package/README.md +3 -3
  4. package/USER_DOCS/01_HOSTED_REMOTE_MCP.md +1 -1
  5. package/USER_DOCS/04_CLIENT_CONFIGS.md +3 -3
  6. package/USER_DOCS/05_SKILLS_AND_TOOLS.md +16 -8
  7. package/USER_DOCS/06_DESKTOP_GUI_WIZARD.md +5 -5
  8. package/config.example.json +5 -4
  9. package/config.schema.json +7 -2
  10. package/config.secure-example.json +5 -4
  11. package/dist/adapters/index.d.ts +7 -1
  12. package/dist/adapters/index.d.ts.map +1 -1
  13. package/dist/adapters/index.js +7 -1
  14. package/dist/adapters/index.js.map +1 -1
  15. package/dist/adapters/mcp/errors.d.ts +13 -1
  16. package/dist/adapters/mcp/errors.d.ts.map +1 -1
  17. package/dist/adapters/mcp/errors.js +13 -1
  18. package/dist/adapters/mcp/errors.js.map +1 -1
  19. package/dist/adapters/mcp/index.d.ts +7 -1
  20. package/dist/adapters/mcp/index.d.ts.map +1 -1
  21. package/dist/adapters/mcp/index.js +7 -1
  22. package/dist/adapters/mcp/index.js.map +1 -1
  23. package/dist/adapters/mcp/prompt-response.d.ts +13 -1
  24. package/dist/adapters/mcp/prompt-response.d.ts.map +1 -1
  25. package/dist/adapters/mcp/prompt-response.js +13 -1
  26. package/dist/adapters/mcp/prompt-response.js.map +1 -1
  27. package/dist/adapters/mcp/resource-response.d.ts +14 -1
  28. package/dist/adapters/mcp/resource-response.d.ts.map +1 -1
  29. package/dist/adapters/mcp/resource-response.js +14 -1
  30. package/dist/adapters/mcp/resource-response.js.map +1 -1
  31. package/dist/adapters/mcp/sdk-compat.d.ts +11 -3
  32. package/dist/adapters/mcp/sdk-compat.d.ts.map +1 -1
  33. package/dist/adapters/mcp/sdk-compat.js +213 -24
  34. package/dist/adapters/mcp/sdk-compat.js.map +1 -1
  35. package/dist/adapters/mcp/tool-response.d.ts +39 -4
  36. package/dist/adapters/mcp/tool-response.d.ts.map +1 -1
  37. package/dist/adapters/mcp/tool-response.js +39 -4
  38. package/dist/adapters/mcp/tool-response.js.map +1 -1
  39. package/dist/adapters/solana/commitment.d.ts +14 -2
  40. package/dist/adapters/solana/commitment.d.ts.map +1 -1
  41. package/dist/adapters/solana/commitment.js +14 -2
  42. package/dist/adapters/solana/commitment.js.map +1 -1
  43. package/dist/adapters/solana/connection.d.ts +11 -2
  44. package/dist/adapters/solana/connection.d.ts.map +1 -1
  45. package/dist/adapters/solana/connection.js +11 -2
  46. package/dist/adapters/solana/connection.js.map +1 -1
  47. package/dist/adapters/solana/index.d.ts +7 -1
  48. package/dist/adapters/solana/index.d.ts.map +1 -1
  49. package/dist/adapters/solana/index.js +7 -1
  50. package/dist/adapters/solana/index.js.map +1 -1
  51. package/dist/adapters/solana/public-key.d.ts +11 -2
  52. package/dist/adapters/solana/public-key.d.ts.map +1 -1
  53. package/dist/adapters/solana/public-key.js +11 -2
  54. package/dist/adapters/solana/public-key.js.map +1 -1
  55. package/dist/config/defaults.d.ts +5 -0
  56. package/dist/config/defaults.d.ts.map +1 -1
  57. package/dist/config/defaults.js +5 -0
  58. package/dist/config/defaults.js.map +1 -1
  59. package/dist/config/env.d.ts +4 -0
  60. package/dist/config/env.d.ts.map +1 -1
  61. package/dist/config/env.js +11 -6
  62. package/dist/config/env.js.map +1 -1
  63. package/dist/config/index.d.ts +5 -0
  64. package/dist/config/index.d.ts.map +1 -1
  65. package/dist/config/index.js +5 -0
  66. package/dist/config/index.js.map +1 -1
  67. package/dist/config/mcp-client-injection.d.ts.map +1 -1
  68. package/dist/config/mcp-client-injection.js +97 -1
  69. package/dist/config/mcp-client-injection.js.map +1 -1
  70. package/dist/config/paths.d.ts +5 -0
  71. package/dist/config/paths.d.ts.map +1 -1
  72. package/dist/config/paths.js +5 -0
  73. package/dist/config/paths.js.map +1 -1
  74. package/dist/config/profiles.d.ts +3 -10
  75. package/dist/config/profiles.d.ts.map +1 -1
  76. package/dist/config/profiles.js +5 -0
  77. package/dist/config/profiles.js.map +1 -1
  78. package/dist/config/schema.d.ts +5 -0
  79. package/dist/config/schema.d.ts.map +1 -1
  80. package/dist/config/schema.js +5 -0
  81. package/dist/config/schema.js.map +1 -1
  82. package/dist/config/secure-config.d.ts +5 -0
  83. package/dist/config/secure-config.d.ts.map +1 -1
  84. package/dist/config/secure-config.js +5 -0
  85. package/dist/config/secure-config.js.map +1 -1
  86. package/dist/config/setup.d.ts +5 -0
  87. package/dist/config/setup.d.ts.map +1 -1
  88. package/dist/config/setup.js +5 -0
  89. package/dist/config/setup.js.map +1 -1
  90. package/dist/config-cli.d.ts +3 -13
  91. package/dist/config-cli.d.ts.map +1 -1
  92. package/dist/config-cli.js +5 -0
  93. package/dist/config-cli.js.map +1 -1
  94. package/dist/core/constants.d.ts +25 -6
  95. package/dist/core/constants.d.ts.map +1 -1
  96. package/dist/core/constants.js +27 -8
  97. package/dist/core/constants.js.map +1 -1
  98. package/dist/core/errors.d.ts +5 -0
  99. package/dist/core/errors.d.ts.map +1 -1
  100. package/dist/core/errors.js +5 -0
  101. package/dist/core/errors.js.map +1 -1
  102. package/dist/core/guards.d.ts +5 -0
  103. package/dist/core/guards.d.ts.map +1 -1
  104. package/dist/core/guards.js +3 -1
  105. package/dist/core/guards.js.map +1 -1
  106. package/dist/core/index.d.ts +7 -1
  107. package/dist/core/index.d.ts.map +1 -1
  108. package/dist/core/index.js +7 -1
  109. package/dist/core/index.js.map +1 -1
  110. package/dist/core/logger.js +1 -1
  111. package/dist/core/logger.js.map +1 -1
  112. package/dist/core/result.d.ts +77 -9
  113. package/dist/core/result.d.ts.map +1 -1
  114. package/dist/core/result.js +68 -9
  115. package/dist/core/result.js.map +1 -1
  116. package/dist/core/types.d.ts +5 -0
  117. package/dist/core/types.d.ts.map +1 -1
  118. package/dist/core/types.js +3 -4
  119. package/dist/core/types.js.map +1 -1
  120. package/dist/index.d.ts +5 -0
  121. package/dist/index.d.ts.map +1 -1
  122. package/dist/index.js +5 -0
  123. package/dist/index.js.map +1 -1
  124. package/dist/payments/facilitator-rpc-fallback.d.ts.map +1 -1
  125. package/dist/payments/facilitator-rpc-fallback.js +95 -0
  126. package/dist/payments/facilitator-rpc-fallback.js.map +1 -1
  127. package/dist/payments/hosted-tool-eligibility.d.ts +1 -0
  128. package/dist/payments/hosted-tool-eligibility.d.ts.map +1 -1
  129. package/dist/payments/hosted-tool-eligibility.js +1 -0
  130. package/dist/payments/hosted-tool-eligibility.js.map +1 -1
  131. package/dist/payments/mcp-session-cache.d.ts +35 -0
  132. package/dist/payments/mcp-session-cache.d.ts.map +1 -0
  133. package/dist/payments/mcp-session-cache.js +83 -0
  134. package/dist/payments/mcp-session-cache.js.map +1 -0
  135. package/dist/payments/monetization-gate.d.ts +5 -0
  136. package/dist/payments/monetization-gate.d.ts.map +1 -1
  137. package/dist/payments/monetization-gate.js +24 -1
  138. package/dist/payments/monetization-gate.js.map +1 -1
  139. package/dist/payments/pricing.d.ts +2 -0
  140. package/dist/payments/pricing.d.ts.map +1 -1
  141. package/dist/payments/pricing.js +126 -10
  142. package/dist/payments/pricing.js.map +1 -1
  143. package/dist/payments/usage-ledger.d.ts +36 -2
  144. package/dist/payments/usage-ledger.d.ts.map +1 -1
  145. package/dist/payments/usage-ledger.js +121 -4
  146. package/dist/payments/usage-ledger.js.map +1 -1
  147. package/dist/payments/x402-paid-call.d.ts +50 -0
  148. package/dist/payments/x402-paid-call.d.ts.map +1 -1
  149. package/dist/payments/x402-paid-call.js +171 -0
  150. package/dist/payments/x402-paid-call.js.map +1 -1
  151. package/dist/policy/default-policies.d.ts +18 -2
  152. package/dist/policy/default-policies.d.ts.map +1 -1
  153. package/dist/policy/default-policies.js +18 -2
  154. package/dist/policy/default-policies.js.map +1 -1
  155. package/dist/policy/index.d.ts +6 -3
  156. package/dist/policy/index.d.ts.map +1 -1
  157. package/dist/policy/index.js +6 -3
  158. package/dist/policy/index.js.map +1 -1
  159. package/dist/policy/local-policy-engine.d.ts +71 -13
  160. package/dist/policy/local-policy-engine.d.ts.map +1 -1
  161. package/dist/policy/local-policy-engine.js +33 -11
  162. package/dist/policy/local-policy-engine.js.map +1 -1
  163. package/dist/policy/permission-checks.d.ts +29 -3
  164. package/dist/policy/permission-checks.d.ts.map +1 -1
  165. package/dist/policy/permission-checks.js +29 -3
  166. package/dist/policy/permission-checks.js.map +1 -1
  167. package/dist/policy/policy-engine.d.ts +22 -2
  168. package/dist/policy/policy-engine.d.ts.map +1 -1
  169. package/dist/policy/policy-engine.js +22 -2
  170. package/dist/policy/policy-engine.js.map +1 -1
  171. package/dist/policy/policy-types.d.ts +55 -5
  172. package/dist/policy/policy-types.d.ts.map +1 -1
  173. package/dist/policy/policy-types.js +8 -1
  174. package/dist/policy/policy-types.js.map +1 -1
  175. package/dist/policy/risk-level.d.ts +32 -3
  176. package/dist/policy/risk-level.d.ts.map +1 -1
  177. package/dist/policy/risk-level.js +32 -3
  178. package/dist/policy/risk-level.js.map +1 -1
  179. package/dist/policy/spending-limits.d.ts +29 -3
  180. package/dist/policy/spending-limits.d.ts.map +1 -1
  181. package/dist/policy/spending-limits.js +29 -3
  182. package/dist/policy/spending-limits.js.map +1 -1
  183. package/dist/premium/activation-manager.d.ts +43 -0
  184. package/dist/premium/activation-manager.d.ts.map +1 -0
  185. package/dist/premium/activation-manager.js +131 -0
  186. package/dist/premium/activation-manager.js.map +1 -0
  187. package/dist/premium/builtin-plugins.d.ts +143 -0
  188. package/dist/premium/builtin-plugins.d.ts.map +1 -0
  189. package/dist/premium/builtin-plugins.js +394 -0
  190. package/dist/premium/builtin-plugins.js.map +1 -0
  191. package/dist/premium/event-store.d.ts +61 -0
  192. package/dist/premium/event-store.d.ts.map +1 -0
  193. package/dist/premium/event-store.js +130 -0
  194. package/dist/premium/event-store.js.map +1 -0
  195. package/dist/premium/index.d.ts +54 -0
  196. package/dist/premium/index.d.ts.map +1 -0
  197. package/dist/premium/index.js +54 -0
  198. package/dist/premium/index.js.map +1 -0
  199. package/dist/premium/manifest-builder.d.ts +65 -0
  200. package/dist/premium/manifest-builder.d.ts.map +1 -0
  201. package/dist/premium/manifest-builder.js +182 -0
  202. package/dist/premium/manifest-builder.js.map +1 -0
  203. package/dist/premium/meme-radar-capabilities.d.ts +38 -0
  204. package/dist/premium/meme-radar-capabilities.d.ts.map +1 -0
  205. package/dist/premium/meme-radar-capabilities.js +306 -0
  206. package/dist/premium/meme-radar-capabilities.js.map +1 -0
  207. package/dist/premium/metrics.d.ts +27 -0
  208. package/dist/premium/metrics.d.ts.map +1 -0
  209. package/dist/premium/metrics.js +65 -0
  210. package/dist/premium/metrics.js.map +1 -0
  211. package/dist/premium/plugin-validator.d.ts +39 -0
  212. package/dist/premium/plugin-validator.d.ts.map +1 -0
  213. package/dist/premium/plugin-validator.js +325 -0
  214. package/dist/premium/plugin-validator.js.map +1 -0
  215. package/dist/premium/private-manifest-loader.d.ts +111 -0
  216. package/dist/premium/private-manifest-loader.d.ts.map +1 -0
  217. package/dist/premium/private-manifest-loader.js +285 -0
  218. package/dist/premium/private-manifest-loader.js.map +1 -0
  219. package/dist/premium/provider-bridge.d.ts +109 -0
  220. package/dist/premium/provider-bridge.d.ts.map +1 -0
  221. package/dist/premium/provider-bridge.js +239 -0
  222. package/dist/premium/provider-bridge.js.map +1 -0
  223. package/dist/premium/session-manager.d.ts +125 -0
  224. package/dist/premium/session-manager.d.ts.map +1 -0
  225. package/dist/premium/session-manager.js +337 -0
  226. package/dist/premium/session-manager.js.map +1 -0
  227. package/dist/premium/stream-broker.d.ts +98 -0
  228. package/dist/premium/stream-broker.d.ts.map +1 -0
  229. package/dist/premium/stream-broker.js +199 -0
  230. package/dist/premium/stream-broker.js.map +1 -0
  231. package/dist/premium/tech-fundamentals-capabilities.d.ts +37 -0
  232. package/dist/premium/tech-fundamentals-capabilities.d.ts.map +1 -0
  233. package/dist/premium/tech-fundamentals-capabilities.js +283 -0
  234. package/dist/premium/tech-fundamentals-capabilities.js.map +1 -0
  235. package/dist/premium/trading-capabilities.d.ts +36 -0
  236. package/dist/premium/trading-capabilities.d.ts.map +1 -0
  237. package/dist/premium/trading-capabilities.js +205 -0
  238. package/dist/premium/trading-capabilities.js.map +1 -0
  239. package/dist/premium/types.d.ts +518 -0
  240. package/dist/premium/types.d.ts.map +1 -0
  241. package/dist/premium/types.js +23 -0
  242. package/dist/premium/types.js.map +1 -0
  243. package/dist/premium/webhook-engine.d.ts +102 -0
  244. package/dist/premium/webhook-engine.d.ts.map +1 -0
  245. package/dist/premium/webhook-engine.js +382 -0
  246. package/dist/premium/webhook-engine.js.map +1 -0
  247. package/dist/prompts/context/sap-agent-context.prompt.d.ts +5 -0
  248. package/dist/prompts/context/sap-agent-context.prompt.d.ts.map +1 -1
  249. package/dist/prompts/context/sap-agent-context.prompt.js +2 -8
  250. package/dist/prompts/context/sap-agent-context.prompt.js.map +1 -1
  251. package/dist/prompts/context/sap-agent-intent-router.prompt.d.ts +14 -0
  252. package/dist/prompts/context/sap-agent-intent-router.prompt.d.ts.map +1 -0
  253. package/dist/prompts/context/sap-agent-intent-router.prompt.js +155 -0
  254. package/dist/prompts/context/sap-agent-intent-router.prompt.js.map +1 -0
  255. package/dist/prompts/context/sap-agent-start.prompt.js +1 -0
  256. package/dist/prompts/context/sap-agent-start.prompt.js.map +1 -1
  257. package/dist/prompts/developer/debug-sap-error.prompt.d.ts +5 -0
  258. package/dist/prompts/developer/debug-sap-error.prompt.d.ts.map +1 -1
  259. package/dist/prompts/developer/debug-sap-error.prompt.js +3 -4
  260. package/dist/prompts/developer/debug-sap-error.prompt.js.map +1 -1
  261. package/dist/prompts/developer/generate-sap-integration.prompt.d.ts +5 -0
  262. package/dist/prompts/developer/generate-sap-integration.prompt.d.ts.map +1 -1
  263. package/dist/prompts/developer/generate-sap-integration.prompt.js +3 -4
  264. package/dist/prompts/developer/generate-sap-integration.prompt.js.map +1 -1
  265. package/dist/prompts/developer/index.d.ts +4 -1
  266. package/dist/prompts/developer/index.d.ts.map +1 -1
  267. package/dist/prompts/developer/index.js +4 -1
  268. package/dist/prompts/developer/index.js.map +1 -1
  269. package/dist/prompts/execution-proof/explain-proof-of-execution.prompt.d.ts +5 -0
  270. package/dist/prompts/execution-proof/explain-proof-of-execution.prompt.d.ts.map +1 -1
  271. package/dist/prompts/execution-proof/explain-proof-of-execution.prompt.js +3 -4
  272. package/dist/prompts/execution-proof/explain-proof-of-execution.prompt.js.map +1 -1
  273. package/dist/prompts/execution-proof/index.d.ts +4 -1
  274. package/dist/prompts/execution-proof/index.d.ts.map +1 -1
  275. package/dist/prompts/execution-proof/index.js +4 -1
  276. package/dist/prompts/execution-proof/index.js.map +1 -1
  277. package/dist/prompts/execution-proof/verify-execution-proof.prompt.d.ts +5 -0
  278. package/dist/prompts/execution-proof/verify-execution-proof.prompt.d.ts.map +1 -1
  279. package/dist/prompts/execution-proof/verify-execution-proof.prompt.js +3 -4
  280. package/dist/prompts/execution-proof/verify-execution-proof.prompt.js.map +1 -1
  281. package/dist/prompts/index.d.ts +4 -1
  282. package/dist/prompts/index.d.ts.map +1 -1
  283. package/dist/prompts/index.js +4 -1
  284. package/dist/prompts/index.js.map +1 -1
  285. package/dist/prompts/payments/create-paid-api.prompt.d.ts +5 -0
  286. package/dist/prompts/payments/create-paid-api.prompt.d.ts.map +1 -1
  287. package/dist/prompts/payments/create-paid-api.prompt.js +3 -4
  288. package/dist/prompts/payments/create-paid-api.prompt.js.map +1 -1
  289. package/dist/prompts/payments/explain-x402-settlement.prompt.d.ts +5 -0
  290. package/dist/prompts/payments/explain-x402-settlement.prompt.d.ts.map +1 -1
  291. package/dist/prompts/payments/explain-x402-settlement.prompt.js +3 -4
  292. package/dist/prompts/payments/explain-x402-settlement.prompt.js.map +1 -1
  293. package/dist/prompts/payments/index.d.ts +4 -1
  294. package/dist/prompts/payments/index.d.ts.map +1 -1
  295. package/dist/prompts/payments/index.js +4 -1
  296. package/dist/prompts/payments/index.js.map +1 -1
  297. package/dist/prompts/register-prompts.d.ts +18 -2
  298. package/dist/prompts/register-prompts.d.ts.map +1 -1
  299. package/dist/prompts/register-prompts.js +21 -3
  300. package/dist/prompts/register-prompts.js.map +1 -1
  301. package/dist/prompts/registry/analyze-sap-agent.prompt.d.ts +5 -0
  302. package/dist/prompts/registry/analyze-sap-agent.prompt.d.ts.map +1 -1
  303. package/dist/prompts/registry/analyze-sap-agent.prompt.js +3 -4
  304. package/dist/prompts/registry/analyze-sap-agent.prompt.js.map +1 -1
  305. package/dist/prompts/registry/index.d.ts +4 -1
  306. package/dist/prompts/registry/index.d.ts.map +1 -1
  307. package/dist/prompts/registry/index.js +4 -1
  308. package/dist/prompts/registry/index.js.map +1 -1
  309. package/dist/prompts/registry/register-sap-agent.prompt.d.ts +5 -0
  310. package/dist/prompts/registry/register-sap-agent.prompt.d.ts.map +1 -1
  311. package/dist/prompts/registry/register-sap-agent.prompt.js +3 -4
  312. package/dist/prompts/registry/register-sap-agent.prompt.js.map +1 -1
  313. package/dist/remote/premium-memory.d.ts +90 -0
  314. package/dist/remote/premium-memory.d.ts.map +1 -0
  315. package/dist/remote/premium-memory.js +161 -0
  316. package/dist/remote/premium-memory.js.map +1 -0
  317. package/dist/remote/premium-routes.d.ts +99 -0
  318. package/dist/remote/premium-routes.d.ts.map +1 -0
  319. package/dist/remote/premium-routes.js +346 -0
  320. package/dist/remote/premium-routes.js.map +1 -0
  321. package/dist/remote/public-home/sections.d.ts.map +1 -1
  322. package/dist/remote/public-home/sections.js +7 -1
  323. package/dist/remote/public-home/sections.js.map +1 -1
  324. package/dist/remote/public-home/types.d.ts +6 -0
  325. package/dist/remote/public-home/types.d.ts.map +1 -1
  326. package/dist/remote/server.d.ts +18 -0
  327. package/dist/remote/server.d.ts.map +1 -1
  328. package/dist/remote/server.js +298 -116
  329. package/dist/remote/server.js.map +1 -1
  330. package/dist/remote/tx-relay.d.ts +42 -0
  331. package/dist/remote/tx-relay.d.ts.map +1 -0
  332. package/dist/remote/tx-relay.js +118 -0
  333. package/dist/remote/tx-relay.js.map +1 -0
  334. package/dist/resources/current/sap-current-config.resource.d.ts +5 -0
  335. package/dist/resources/current/sap-current-config.resource.d.ts.map +1 -1
  336. package/dist/resources/current/sap-current-config.resource.js +2 -5
  337. package/dist/resources/current/sap-current-config.resource.js.map +1 -1
  338. package/dist/resources/execution-proof/index.d.ts +5 -0
  339. package/dist/resources/execution-proof/index.d.ts.map +1 -1
  340. package/dist/resources/execution-proof/index.js +5 -0
  341. package/dist/resources/execution-proof/index.js.map +1 -1
  342. package/dist/resources/execution-proof/sap-execution-record.resource.d.ts +5 -0
  343. package/dist/resources/execution-proof/sap-execution-record.resource.d.ts.map +1 -1
  344. package/dist/resources/execution-proof/sap-execution-record.resource.js +3 -4
  345. package/dist/resources/execution-proof/sap-execution-record.resource.js.map +1 -1
  346. package/dist/resources/index.d.ts +5 -0
  347. package/dist/resources/index.d.ts.map +1 -1
  348. package/dist/resources/index.js +5 -0
  349. package/dist/resources/index.js.map +1 -1
  350. package/dist/resources/memory/index.d.ts +5 -0
  351. package/dist/resources/memory/index.d.ts.map +1 -1
  352. package/dist/resources/memory/index.js +5 -0
  353. package/dist/resources/memory/index.js.map +1 -1
  354. package/dist/resources/memory/sap-memory.resource.d.ts +5 -0
  355. package/dist/resources/memory/sap-memory.resource.d.ts.map +1 -1
  356. package/dist/resources/memory/sap-memory.resource.js +3 -4
  357. package/dist/resources/memory/sap-memory.resource.js.map +1 -1
  358. package/dist/resources/profile/sap-active-profile.resource.d.ts +5 -0
  359. package/dist/resources/profile/sap-active-profile.resource.d.ts.map +1 -1
  360. package/dist/resources/profile/sap-active-profile.resource.js +2 -5
  361. package/dist/resources/profile/sap-active-profile.resource.js.map +1 -1
  362. package/dist/resources/register-resources.d.ts +5 -0
  363. package/dist/resources/register-resources.d.ts.map +1 -1
  364. package/dist/resources/register-resources.js +3 -1
  365. package/dist/resources/register-resources.js.map +1 -1
  366. package/dist/resources/registry/index.d.ts +5 -0
  367. package/dist/resources/registry/index.d.ts.map +1 -1
  368. package/dist/resources/registry/index.js +5 -0
  369. package/dist/resources/registry/index.js.map +1 -1
  370. package/dist/resources/registry/sap-agent.resource.d.ts +5 -0
  371. package/dist/resources/registry/sap-agent.resource.d.ts.map +1 -1
  372. package/dist/resources/registry/sap-agent.resource.js +3 -4
  373. package/dist/resources/registry/sap-agent.resource.js.map +1 -1
  374. package/dist/resources/registry/sap-global-registry.resource.d.ts +18 -4
  375. package/dist/resources/registry/sap-global-registry.resource.d.ts.map +1 -1
  376. package/dist/resources/registry/sap-global-registry.resource.js +18 -4
  377. package/dist/resources/registry/sap-global-registry.resource.js.map +1 -1
  378. package/dist/resources/reputation/index.d.ts +4 -1
  379. package/dist/resources/reputation/index.d.ts.map +1 -1
  380. package/dist/resources/reputation/index.js +4 -1
  381. package/dist/resources/reputation/index.js.map +1 -1
  382. package/dist/resources/reputation/sap-reputation.resource.d.ts +18 -4
  383. package/dist/resources/reputation/sap-reputation.resource.d.ts.map +1 -1
  384. package/dist/resources/reputation/sap-reputation.resource.js +18 -4
  385. package/dist/resources/reputation/sap-reputation.resource.js.map +1 -1
  386. package/dist/resources/tool-schema/index.d.ts +4 -1
  387. package/dist/resources/tool-schema/index.d.ts.map +1 -1
  388. package/dist/resources/tool-schema/index.js +4 -1
  389. package/dist/resources/tool-schema/index.js.map +1 -1
  390. package/dist/resources/tool-schema/sap-tool-schema.resource.d.ts +18 -4
  391. package/dist/resources/tool-schema/sap-tool-schema.resource.d.ts.map +1 -1
  392. package/dist/resources/tool-schema/sap-tool-schema.resource.js +18 -4
  393. package/dist/resources/tool-schema/sap-tool-schema.resource.js.map +1 -1
  394. package/dist/sap/index.d.ts +7 -1
  395. package/dist/sap/index.d.ts.map +1 -1
  396. package/dist/sap/index.js +7 -1
  397. package/dist/sap/index.js.map +1 -1
  398. package/dist/sap/sap-client-manager.d.ts +80 -13
  399. package/dist/sap/sap-client-manager.d.ts.map +1 -1
  400. package/dist/sap/sap-client-manager.js +80 -13
  401. package/dist/sap/sap-client-manager.js.map +1 -1
  402. package/dist/sap/sap-errors.d.ts +22 -3
  403. package/dist/sap/sap-errors.d.ts.map +1 -1
  404. package/dist/sap/sap-errors.js +22 -3
  405. package/dist/sap/sap-errors.js.map +1 -1
  406. package/dist/sap/sap-types.d.ts +75 -6
  407. package/dist/sap/sap-types.d.ts.map +1 -1
  408. package/dist/sap/sap-types.js +11 -1
  409. package/dist/sap/sap-types.js.map +1 -1
  410. package/dist/schemas/common.schema.d.ts +45 -8
  411. package/dist/schemas/common.schema.d.ts.map +1 -1
  412. package/dist/schemas/common.schema.js +45 -8
  413. package/dist/schemas/common.schema.js.map +1 -1
  414. package/dist/schemas/developer.schema.d.ts +22 -3
  415. package/dist/schemas/developer.schema.d.ts.map +1 -1
  416. package/dist/schemas/developer.schema.js +22 -3
  417. package/dist/schemas/developer.schema.js.map +1 -1
  418. package/dist/schemas/execution-proof.schema.d.ts +29 -4
  419. package/dist/schemas/execution-proof.schema.d.ts.map +1 -1
  420. package/dist/schemas/execution-proof.schema.js +29 -4
  421. package/dist/schemas/execution-proof.schema.js.map +1 -1
  422. package/dist/schemas/identity.schema.d.ts +23 -3
  423. package/dist/schemas/identity.schema.d.ts.map +1 -1
  424. package/dist/schemas/identity.schema.js +23 -3
  425. package/dist/schemas/identity.schema.js.map +1 -1
  426. package/dist/schemas/index.d.ts +11 -1
  427. package/dist/schemas/index.d.ts.map +1 -1
  428. package/dist/schemas/index.js +11 -1
  429. package/dist/schemas/index.js.map +1 -1
  430. package/dist/schemas/memory.schema.d.ts +23 -3
  431. package/dist/schemas/memory.schema.d.ts.map +1 -1
  432. package/dist/schemas/memory.schema.js +23 -3
  433. package/dist/schemas/memory.schema.js.map +1 -1
  434. package/dist/schemas/payments.schema.d.ts +24 -3
  435. package/dist/schemas/payments.schema.d.ts.map +1 -1
  436. package/dist/schemas/payments.schema.js +24 -3
  437. package/dist/schemas/payments.schema.js.map +1 -1
  438. package/dist/schemas/registry.schema.d.ts +36 -4
  439. package/dist/schemas/registry.schema.d.ts.map +1 -1
  440. package/dist/schemas/registry.schema.js +36 -4
  441. package/dist/schemas/registry.schema.js.map +1 -1
  442. package/dist/schemas/reputation.schema.d.ts +22 -3
  443. package/dist/schemas/reputation.schema.d.ts.map +1 -1
  444. package/dist/schemas/reputation.schema.js +22 -3
  445. package/dist/schemas/reputation.schema.js.map +1 -1
  446. package/dist/schemas/settlement.schema.d.ts +31 -4
  447. package/dist/schemas/settlement.schema.d.ts.map +1 -1
  448. package/dist/schemas/settlement.schema.js +31 -4
  449. package/dist/schemas/settlement.schema.js.map +1 -1
  450. package/dist/schemas/tool-schema.schema.d.ts +29 -3
  451. package/dist/schemas/tool-schema.schema.d.ts.map +1 -1
  452. package/dist/schemas/tool-schema.schema.js +29 -3
  453. package/dist/schemas/tool-schema.schema.js.map +1 -1
  454. package/dist/schemas/transaction.schema.d.ts +23 -3
  455. package/dist/schemas/transaction.schema.d.ts.map +1 -1
  456. package/dist/schemas/transaction.schema.js +23 -3
  457. package/dist/schemas/transaction.schema.js.map +1 -1
  458. package/dist/security/approval-required.d.ts +19 -2
  459. package/dist/security/approval-required.d.ts.map +1 -1
  460. package/dist/security/approval-required.js +19 -2
  461. package/dist/security/approval-required.js.map +1 -1
  462. package/dist/security/index.d.ts +7 -1
  463. package/dist/security/index.d.ts.map +1 -1
  464. package/dist/security/index.js +7 -1
  465. package/dist/security/index.js.map +1 -1
  466. package/dist/security/private-key-guard.d.ts +18 -2
  467. package/dist/security/private-key-guard.d.ts.map +1 -1
  468. package/dist/security/private-key-guard.js +19 -2
  469. package/dist/security/private-key-guard.js.map +1 -1
  470. package/dist/security/prompt-injection-notes.d.ts +10 -1
  471. package/dist/security/prompt-injection-notes.d.ts.map +1 -1
  472. package/dist/security/prompt-injection-notes.js +10 -1
  473. package/dist/security/prompt-injection-notes.js.map +1 -1
  474. package/dist/security/unsafe-action-guard.d.ts +36 -10
  475. package/dist/security/unsafe-action-guard.d.ts.map +1 -1
  476. package/dist/security/unsafe-action-guard.js +67 -15
  477. package/dist/security/unsafe-action-guard.js.map +1 -1
  478. package/dist/server/create-server.d.ts +18 -3
  479. package/dist/server/create-server.d.ts.map +1 -1
  480. package/dist/server/create-server.js +18 -3
  481. package/dist/server/create-server.js.map +1 -1
  482. package/dist/server/index.d.ts +6 -1
  483. package/dist/server/index.d.ts.map +1 -1
  484. package/dist/server/index.js +6 -1
  485. package/dist/server/index.js.map +1 -1
  486. package/dist/server/register-capabilities.d.ts +17 -2
  487. package/dist/server/register-capabilities.d.ts.map +1 -1
  488. package/dist/server/register-capabilities.js +17 -2
  489. package/dist/server/register-capabilities.js.map +1 -1
  490. package/dist/server/server-metadata.d.ts +34 -1
  491. package/dist/server/server-metadata.d.ts.map +1 -1
  492. package/dist/server/server-metadata.js +35 -2
  493. package/dist/server/server-metadata.js.map +1 -1
  494. package/dist/session/agent-session.d.ts +35 -4
  495. package/dist/session/agent-session.d.ts.map +1 -1
  496. package/dist/session/agent-session.js +35 -4
  497. package/dist/session/agent-session.js.map +1 -1
  498. package/dist/session/delegated-session.d.ts +31 -3
  499. package/dist/session/delegated-session.d.ts.map +1 -1
  500. package/dist/session/delegated-session.js +31 -3
  501. package/dist/session/delegated-session.js.map +1 -1
  502. package/dist/session/index.d.ts +7 -1
  503. package/dist/session/index.d.ts.map +1 -1
  504. package/dist/session/index.js +7 -1
  505. package/dist/session/index.js.map +1 -1
  506. package/dist/session/redis-session-store.d.ts +94 -21
  507. package/dist/session/redis-session-store.d.ts.map +1 -1
  508. package/dist/session/redis-session-store.js +87 -20
  509. package/dist/session/redis-session-store.js.map +1 -1
  510. package/dist/session/session-limits.d.ts +34 -4
  511. package/dist/session/session-limits.d.ts.map +1 -1
  512. package/dist/session/session-limits.js +34 -4
  513. package/dist/session/session-limits.js.map +1 -1
  514. package/dist/session/session-permissions.d.ts +57 -7
  515. package/dist/session/session-permissions.d.ts.map +1 -1
  516. package/dist/session/session-permissions.js +57 -7
  517. package/dist/session/session-permissions.js.map +1 -1
  518. package/dist/session/session-store.d.ts +9 -1
  519. package/dist/session/session-store.d.ts.map +1 -1
  520. package/dist/session/session-store.js +18 -3
  521. package/dist/session/session-store.js.map +1 -1
  522. package/dist/session/session-types.d.ts +33 -4
  523. package/dist/session/session-types.d.ts.map +1 -1
  524. package/dist/session/session-types.js +9 -1
  525. package/dist/session/session-types.js.map +1 -1
  526. package/dist/signer/index.d.ts +7 -1
  527. package/dist/signer/index.d.ts.map +1 -1
  528. package/dist/signer/index.js +7 -1
  529. package/dist/signer/index.js.map +1 -1
  530. package/dist/signer/load-keypair.d.ts +25 -4
  531. package/dist/signer/load-keypair.d.ts.map +1 -1
  532. package/dist/signer/load-keypair.js +25 -4
  533. package/dist/signer/load-keypair.js.map +1 -1
  534. package/dist/signer/local-keypair-signer.d.ts +16 -2
  535. package/dist/signer/local-keypair-signer.d.ts.map +1 -1
  536. package/dist/signer/local-keypair-signer.js +16 -2
  537. package/dist/signer/local-keypair-signer.js.map +1 -1
  538. package/dist/signer/signer-resolver.d.ts +19 -2
  539. package/dist/signer/signer-resolver.d.ts.map +1 -1
  540. package/dist/signer/signer-resolver.js +26 -3
  541. package/dist/signer/signer-resolver.js.map +1 -1
  542. package/dist/signer/signer-types.d.ts +47 -5
  543. package/dist/signer/signer-types.d.ts.map +1 -1
  544. package/dist/signer/signer-types.js +13 -1
  545. package/dist/signer/signer-types.js.map +1 -1
  546. package/dist/tools/agent-start-tool.d.ts.map +1 -1
  547. package/dist/tools/agent-start-tool.js +210 -2
  548. package/dist/tools/agent-start-tool.js.map +1 -1
  549. package/dist/tools/client-sdk-tools.d.ts.map +1 -1
  550. package/dist/tools/client-sdk-tools.js +27 -2
  551. package/dist/tools/client-sdk-tools.js.map +1 -1
  552. package/dist/tools/estimate-tool-cost.d.ts +13 -0
  553. package/dist/tools/estimate-tool-cost.d.ts.map +1 -0
  554. package/dist/tools/estimate-tool-cost.js +139 -0
  555. package/dist/tools/estimate-tool-cost.js.map +1 -0
  556. package/dist/tools/index.d.ts +6 -0
  557. package/dist/tools/index.d.ts.map +1 -1
  558. package/dist/tools/index.js +7 -0
  559. package/dist/tools/index.js.map +1 -1
  560. package/dist/tools/magicblock-tools.d.ts +25 -0
  561. package/dist/tools/magicblock-tools.d.ts.map +1 -1
  562. package/dist/tools/magicblock-tools.js +116 -8
  563. package/dist/tools/magicblock-tools.js.map +1 -1
  564. package/dist/tools/perp-tools.d.ts +39 -0
  565. package/dist/tools/perp-tools.d.ts.map +1 -0
  566. package/dist/tools/perp-tools.js +1110 -0
  567. package/dist/tools/perp-tools.js.map +1 -0
  568. package/dist/tools/premium-tools.d.ts +8 -0
  569. package/dist/tools/premium-tools.d.ts.map +1 -0
  570. package/dist/tools/premium-tools.js +732 -0
  571. package/dist/tools/premium-tools.js.map +1 -0
  572. package/dist/tools/register-tools.d.ts.map +1 -1
  573. package/dist/tools/register-tools.js +9 -0
  574. package/dist/tools/register-tools.js.map +1 -1
  575. package/dist/tools/sap-sdk-tools.d.ts.map +1 -1
  576. package/dist/tools/sap-sdk-tools.js +191 -13
  577. package/dist/tools/sap-sdk-tools.js.map +1 -1
  578. package/dist/tools/x402-paid-call-tool.js +2 -2
  579. package/dist/tools/x402-paid-call-tool.js.map +1 -1
  580. package/dist/transports/index.d.ts +6 -1
  581. package/dist/transports/index.d.ts.map +1 -1
  582. package/dist/transports/index.js +6 -1
  583. package/dist/transports/index.js.map +1 -1
  584. package/dist/transports/stdio.d.ts +17 -5
  585. package/dist/transports/stdio.d.ts.map +1 -1
  586. package/dist/transports/stdio.js +17 -5
  587. package/dist/transports/stdio.js.map +1 -1
  588. package/dist/tui/wizard-save.d.ts +88 -8
  589. package/dist/tui/wizard-save.d.ts.map +1 -1
  590. package/dist/tui/wizard-save.js +77 -8
  591. package/dist/tui/wizard-save.js.map +1 -1
  592. package/docs/06_PAYMENTS_X402_AND_PAYSH.md +20 -4
  593. package/docs/07_ENDPOINTS_AND_CLIENTS.md +4 -1
  594. package/docs/09_TOOLS_SKILLS_AND_AGENT_GUIDE.md +16 -5
  595. package/docs/14_DESKTOP_WIZARD_RELEASE.md +3 -3
  596. package/docs/16_SAP_AGENT_IDENTITY_PIPELINE.md +6 -0
  597. package/docs/18_PREMIUM_PLUGIN_RUNTIME.md +108 -0
  598. package/docs/README.md +12 -0
  599. package/package.json +8 -6
  600. package/server.json +3 -3
  601. package/skills/README.md +10 -2
  602. package/skills/sap-agent-registry/SKILL.md +27 -6
  603. package/skills/sap-discovery-indexing/SKILL.md +11 -0
  604. package/skills/sap-mcp/SKILL.md +49 -16
  605. package/skills/sap-mcp/TOOL_REFERENCE.md +20 -7
  606. package/skills/sap-operations/SKILL.md +11 -0
  607. 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"}