@oobe-protocol-labs/sap-mcp-server 0.9.16 → 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 (602) hide show
  1. package/.env.example +8 -7
  2. package/CHANGELOG.md +199 -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 +1 -0
  140. package/dist/payments/pricing.d.ts.map +1 -1
  141. package/dist/payments/pricing.js +64 -8
  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.js +20 -1
  547. package/dist/tools/agent-start-tool.js.map +1 -1
  548. package/dist/tools/client-sdk-tools.d.ts.map +1 -1
  549. package/dist/tools/client-sdk-tools.js +27 -2
  550. package/dist/tools/client-sdk-tools.js.map +1 -1
  551. package/dist/tools/estimate-tool-cost.d.ts +13 -0
  552. package/dist/tools/estimate-tool-cost.d.ts.map +1 -0
  553. package/dist/tools/estimate-tool-cost.js +139 -0
  554. package/dist/tools/estimate-tool-cost.js.map +1 -0
  555. package/dist/tools/index.d.ts +6 -0
  556. package/dist/tools/index.d.ts.map +1 -1
  557. package/dist/tools/index.js +7 -0
  558. package/dist/tools/index.js.map +1 -1
  559. package/dist/tools/magicblock-tools.d.ts +25 -0
  560. package/dist/tools/magicblock-tools.d.ts.map +1 -1
  561. package/dist/tools/magicblock-tools.js +116 -8
  562. package/dist/tools/magicblock-tools.js.map +1 -1
  563. package/dist/tools/perp-tools.d.ts +39 -0
  564. package/dist/tools/perp-tools.d.ts.map +1 -0
  565. package/dist/tools/perp-tools.js +1110 -0
  566. package/dist/tools/perp-tools.js.map +1 -0
  567. package/dist/tools/premium-tools.d.ts +8 -0
  568. package/dist/tools/premium-tools.d.ts.map +1 -0
  569. package/dist/tools/premium-tools.js +732 -0
  570. package/dist/tools/premium-tools.js.map +1 -0
  571. package/dist/tools/register-tools.d.ts.map +1 -1
  572. package/dist/tools/register-tools.js +9 -0
  573. package/dist/tools/register-tools.js.map +1 -1
  574. package/dist/tools/sap-sdk-tools.d.ts.map +1 -1
  575. package/dist/tools/sap-sdk-tools.js +42 -32
  576. package/dist/tools/sap-sdk-tools.js.map +1 -1
  577. package/dist/tools/x402-paid-call-tool.js +2 -2
  578. package/dist/tools/x402-paid-call-tool.js.map +1 -1
  579. package/dist/transports/index.d.ts +6 -1
  580. package/dist/transports/index.d.ts.map +1 -1
  581. package/dist/transports/index.js +6 -1
  582. package/dist/transports/index.js.map +1 -1
  583. package/dist/transports/stdio.d.ts +17 -5
  584. package/dist/transports/stdio.d.ts.map +1 -1
  585. package/dist/transports/stdio.js +17 -5
  586. package/dist/transports/stdio.js.map +1 -1
  587. package/dist/tui/wizard-save.d.ts +88 -8
  588. package/dist/tui/wizard-save.d.ts.map +1 -1
  589. package/dist/tui/wizard-save.js +77 -8
  590. package/dist/tui/wizard-save.js.map +1 -1
  591. package/docs/06_PAYMENTS_X402_AND_PAYSH.md +3 -3
  592. package/docs/07_ENDPOINTS_AND_CLIENTS.md +4 -1
  593. package/docs/14_DESKTOP_WIZARD_RELEASE.md +3 -3
  594. package/docs/16_SAP_AGENT_IDENTITY_PIPELINE.md +6 -0
  595. package/docs/18_PREMIUM_PLUGIN_RUNTIME.md +108 -0
  596. package/docs/README.md +12 -0
  597. package/package.json +8 -9
  598. package/server.json +3 -3
  599. package/skills/sap-agent-registry/SKILL.md +6 -0
  600. package/skills/sap-mcp/SKILL.md +27 -4
  601. package/skills/sap-mcp/TOOL_REFERENCE.md +4 -1
  602. package/skills/sap-payments-x402/SKILL.md +22 -8
@@ -0,0 +1,285 @@
1
+ /**
2
+ * @name premium/private-manifest-loader
3
+ * @description Filesystem loader for private/enterprise premium plugin manifests.
4
+ *
5
+ * When `SAP_MCP_ENABLE_PREMIUM_PLUGINS=true` and `SAP_MCP_PLUGIN_DIR` is set,
6
+ * this module scans the configured directory (and its `manifests/` subdirectory)
7
+ * for `.json` files, validates each against `validatePremiumPluginManifest`,
8
+ * and returns sanitized `PremiumPluginManifest` objects.
9
+ *
10
+ * Security guarantees:
11
+ * - Manifests are data only — no code is ever executed from plugin files.
12
+ * - Provider secrets are never read from or stored in manifests.
13
+ * - Symlink escaping is prevented via `realpathSync` + prefix checks.
14
+ * - File count (100) and per-file size (256 KB) are capped.
15
+ * - Every loaded manifest is sanitized to strip any extraneous fields before
16
+ * being returned to callers.
17
+ *
18
+ * @flow
19
+ * 1. `builtin-plugins.ts:listPremiumPlugins()` calls
20
+ * `loadPrivatePremiumPluginManifests()` to merge private manifests into
21
+ * the discovery catalog.
22
+ * 2. `builtin-plugins.ts:premiumPrivatePluginSupport()` calls
23
+ * `loadPrivatePremiumPluginReport()` for diagnostic output.
24
+ * 3. Internally: `loadPrivatePremiumPluginReport()` scans the plugin dir,
25
+ * reads + validates each `.json` file, and returns accepted/rejected lists.
26
+ * 4. `loadPrivatePremiumPluginManifests()` returns only the accepted manifests,
27
+ * deep-cloned to prevent external mutation.
28
+ *
29
+ * @env SAP_MCP_ENABLE_PREMIUM_PLUGINS — Must be `true` or `1` to enable loading.
30
+ * @env SAP_MCP_PLUGIN_DIR — Filesystem path to the plugin directory.
31
+ * @env SAP_MCP_PREMIUM_EXPOSE_PRIVATE_DISCOVERY — If `true`/`1`, private/enterprise
32
+ * plugins appear in public discovery responses.
33
+ *
34
+ * @module premium/private-manifest-loader
35
+ */
36
+ import { existsSync, readdirSync, readFileSync, realpathSync, statSync } from 'node:fs';
37
+ import { basename, extname, join, resolve } from 'node:path';
38
+ import { validatePremiumPluginManifest } from './plugin-validator.js';
39
+ /* -------------------------------------------------------------------------- */
40
+ /* Limits */
41
+ /* -------------------------------------------------------------------------- */
42
+ /** @description Maximum number of manifest files scanned per plugin directory. */
43
+ const MAX_PRIVATE_MANIFEST_FILES = 100;
44
+ /** @description Maximum size per manifest file (256 KB). Rejects oversized files. */
45
+ const MAX_PRIVATE_MANIFEST_BYTES = 256 * 1024;
46
+ /* -------------------------------------------------------------------------- */
47
+ /* Internal helpers */
48
+ /* -------------------------------------------------------------------------- */
49
+ /**
50
+ * @name cloneManifest
51
+ * @description Deep-clone a manifest via JSON serialization.
52
+ *
53
+ * Ensures callers cannot mutate the internal loaded manifest objects.
54
+ *
55
+ * @param manifest - The manifest to clone.
56
+ * @returns A deep copy of the manifest.
57
+ *
58
+ * @internal
59
+ */
60
+ function cloneManifest(manifest) {
61
+ return JSON.parse(JSON.stringify(manifest));
62
+ }
63
+ /**
64
+ * @name boolEnv
65
+ * @description Read a boolean env var (accepts `true` or `1`).
66
+ *
67
+ * @param name - The environment variable name.
68
+ * @returns `true` if the env var is set to `true` or `1`, otherwise `false`.
69
+ *
70
+ * @internal
71
+ */
72
+ function boolEnv(name) {
73
+ return process.env[name] === 'true' || process.env[name] === '1';
74
+ }
75
+ /* -------------------------------------------------------------------------- */
76
+ /* Public env-var helpers */
77
+ /* -------------------------------------------------------------------------- */
78
+ /**
79
+ * @name privatePremiumPluginsEnabled
80
+ * @description Check whether private plugin loading is enabled via env var.
81
+ *
82
+ * @returns `true` if `SAP_MCP_ENABLE_PREMIUM_PLUGINS` is `true` or `1`.
83
+ *
84
+ * @usedBy `loadPrivatePremiumPluginReport` (gate check).
85
+ */
86
+ export function privatePremiumPluginsEnabled() {
87
+ return boolEnv('SAP_MCP_ENABLE_PREMIUM_PLUGINS');
88
+ }
89
+ /**
90
+ * @name premiumDiscoveryIncludesPrivate
91
+ * @description Check whether private/enterprise plugins should appear in
92
+ * public discovery responses.
93
+ *
94
+ * @returns `true` if `SAP_MCP_PREMIUM_EXPOSE_PRIVATE_DISCOVERY` is `true` or `1`.
95
+ *
96
+ * @usedBy `builtin-plugins.ts:listPremiumPlugins` (visibility filter default).
97
+ */
98
+ export function premiumDiscoveryIncludesPrivate() {
99
+ return boolEnv('SAP_MCP_PREMIUM_EXPOSE_PRIVATE_DISCOVERY');
100
+ }
101
+ /* -------------------------------------------------------------------------- */
102
+ /* Internal directory & file helpers */
103
+ /* -------------------------------------------------------------------------- */
104
+ /**
105
+ * @name configuredPluginDir
106
+ * @description Resolve the configured plugin directory from `SAP_MCP_PLUGIN_DIR`.
107
+ *
108
+ * @returns The absolute resolved path, or `null` if the env var is unset/empty.
109
+ *
110
+ * @internal
111
+ */
112
+ function configuredPluginDir() {
113
+ const raw = process.env.SAP_MCP_PLUGIN_DIR;
114
+ if (!raw || !raw.trim())
115
+ return null;
116
+ return resolve(raw.trim());
117
+ }
118
+ /**
119
+ * @name sanitizeManifest
120
+ * @description Strip a loaded manifest to only the known fields, discarding
121
+ * any extraneous properties that may have been present in the JSON file.
122
+ *
123
+ * This is a defense-in-depth measure: even though `validatePremiumPluginManifest`
124
+ * already rejects unknown fields, sanitization ensures the in-memory object
125
+ * only contains the exact fields defined by `PremiumPluginManifest`.
126
+ *
127
+ * @param manifest - The raw parsed manifest.
128
+ * @returns A sanitized `PremiumPluginManifest` with only known fields.
129
+ *
130
+ * @internal
131
+ */
132
+ function sanitizeManifest(manifest) {
133
+ return {
134
+ id: manifest.id,
135
+ version: manifest.version,
136
+ title: manifest.title,
137
+ description: manifest.description,
138
+ publisher: manifest.publisher,
139
+ visibility: manifest.visibility,
140
+ capabilities: manifest.capabilities.map(capability => ({
141
+ id: capability.id,
142
+ type: capability.type,
143
+ title: capability.title,
144
+ description: capability.description,
145
+ status: capability.status,
146
+ requiresProvider: capability.requiresProvider,
147
+ providerEnv: [...capability.providerEnv],
148
+ inputSchema: JSON.parse(JSON.stringify(capability.inputSchema)),
149
+ outputSchema: JSON.parse(JSON.stringify(capability.outputSchema)),
150
+ pricing: { ...capability.pricing },
151
+ delivery: {
152
+ transport: capability.delivery.transport,
153
+ events: [...capability.delivery.events],
154
+ latencyTargetMs: capability.delivery.latencyTargetMs,
155
+ replayWindowSeconds: capability.delivery.replayWindowSeconds,
156
+ },
157
+ })),
158
+ };
159
+ }
160
+ /**
161
+ * @name discoverManifestFiles
162
+ * @description Scan the plugin directory root and its `manifests/` subdirectory
163
+ * for `.json` files, preventing symlink escaping via `realpathSync`.
164
+ *
165
+ * Only files whose real path starts with the root directory's real path are
166
+ * included. The result is deduplicated and sorted. Scanning stops after
167
+ * `MAX_PRIVATE_MANIFEST_FILES` files are found.
168
+ *
169
+ * @param root - The absolute real path of the plugin directory.
170
+ * @returns Array of absolute real file paths to `.json` manifest files.
171
+ *
172
+ * @internal
173
+ */
174
+ function discoverManifestFiles(root) {
175
+ const roots = [root, join(root, 'manifests')];
176
+ const files = [];
177
+ for (const candidateRoot of roots) {
178
+ if (!existsSync(candidateRoot))
179
+ continue;
180
+ const rootRealPath = realpathSync(candidateRoot);
181
+ for (const entry of readdirSync(candidateRoot, { withFileTypes: true })) {
182
+ if (!entry.isFile() || extname(entry.name) !== '.json')
183
+ continue;
184
+ const filePath = join(candidateRoot, entry.name);
185
+ const fileRealPath = realpathSync(filePath);
186
+ // Symlink escape prevention: file must be under the root directory.
187
+ if (!fileRealPath.startsWith(`${rootRealPath}/`))
188
+ continue;
189
+ files.push(fileRealPath);
190
+ if (files.length >= MAX_PRIVATE_MANIFEST_FILES)
191
+ return files;
192
+ }
193
+ }
194
+ return [...new Set(files)].sort();
195
+ }
196
+ /* -------------------------------------------------------------------------- */
197
+ /* Public API */
198
+ /* -------------------------------------------------------------------------- */
199
+ /**
200
+ * @name loadPrivatePremiumPluginReport
201
+ * @description Scan, validate, and load private premium plugin manifests from
202
+ * the configured plugin directory.
203
+ *
204
+ * Steps:
205
+ * 1. Check if loading is enabled (`SAP_MCP_ENABLE_PREMIUM_PLUGINS`).
206
+ * 2. Check if `SAP_MCP_PLUGIN_DIR` is configured and exists.
207
+ * 3. Discover `.json` files in the root and `manifests/` subdirectory.
208
+ * 4. For each file: check size, parse JSON, validate with
209
+ * `validatePremiumPluginManifest`, sanitize if valid.
210
+ * 5. Accepted manifests go into `loadedManifests`; rejected ones into
211
+ * `rejectedManifests` with a reason string.
212
+ *
213
+ * @returns A `PrivatePremiumPluginLoadReport` with loaded and rejected manifests.
214
+ *
215
+ * @usedBy
216
+ * - `builtin-plugins.ts:loadPrivatePremiumPluginManifests` (accepted only).
217
+ * - `builtin-plugins.ts:premiumPrivatePluginSupport` (diagnostic counts).
218
+ */
219
+ export function loadPrivatePremiumPluginReport() {
220
+ const enabled = privatePremiumPluginsEnabled();
221
+ const exposePrivateDiscovery = premiumDiscoveryIncludesPrivate();
222
+ const pluginDir = configuredPluginDir();
223
+ const report = {
224
+ enabled,
225
+ exposePrivateDiscovery,
226
+ pluginDirConfigured: Boolean(pluginDir),
227
+ loadedManifests: [],
228
+ rejectedManifests: [],
229
+ };
230
+ // Early exit if loading is disabled or no plugin directory is configured.
231
+ if (!enabled || !pluginDir)
232
+ return report;
233
+ // Plugin directory configured but missing on disk.
234
+ if (!existsSync(pluginDir)) {
235
+ report.rejectedManifests.push({ file: basename(pluginDir), reason: 'plugin_dir_not_found' });
236
+ return report;
237
+ }
238
+ const pluginDirRealPath = realpathSync(pluginDir);
239
+ // Process each discovered manifest file.
240
+ for (const filePath of discoverManifestFiles(pluginDirRealPath)) {
241
+ try {
242
+ const stats = statSync(filePath);
243
+ if (!stats.isFile())
244
+ continue;
245
+ // Reject oversized files to prevent abuse.
246
+ if (stats.size > MAX_PRIVATE_MANIFEST_BYTES) {
247
+ report.rejectedManifests.push({ file: basename(filePath), reason: 'manifest_too_large' });
248
+ continue;
249
+ }
250
+ // Parse and validate the manifest JSON.
251
+ const parsed = JSON.parse(readFileSync(filePath, 'utf8'));
252
+ const validation = validatePremiumPluginManifest(parsed);
253
+ if (!validation.valid) {
254
+ report.rejectedManifests.push({
255
+ file: basename(filePath),
256
+ reason: 'validation_failed',
257
+ errors: validation.errors,
258
+ });
259
+ continue;
260
+ }
261
+ // Sanitize and accept the manifest.
262
+ report.loadedManifests.push(sanitizeManifest(parsed));
263
+ }
264
+ catch (error) {
265
+ report.rejectedManifests.push({
266
+ file: basename(filePath),
267
+ reason: error instanceof Error ? error.message : 'unknown_manifest_load_error',
268
+ });
269
+ }
270
+ }
271
+ return report;
272
+ }
273
+ /**
274
+ * @name loadPrivatePremiumPluginManifests
275
+ * @description Return only the successfully loaded private plugin manifests,
276
+ * deep-cloned to prevent external mutation.
277
+ *
278
+ * @returns Array of `PremiumPluginManifest` clones (empty if disabled or no dir).
279
+ *
280
+ * @usedBy `builtin-plugins.ts:listPremiumPlugins` (merged with built-in plugins).
281
+ */
282
+ export function loadPrivatePremiumPluginManifests() {
283
+ return loadPrivatePremiumPluginReport().loadedManifests.map(cloneManifest);
284
+ }
285
+ //# sourceMappingURL=private-manifest-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"private-manifest-loader.js","sourceRoot":"","sources":["../../src/premium/private-manifest-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * @name premium/provider-bridge
3
+ * @description Dynamic loader and connection manager for premium provider adapters.
4
+ *
5
+ * Provider adapters live in the private subrepo (`sap-mcp-premium-private/providers/`).
6
+ * The public server loads them dynamically only when `SAP_MCP_ENABLE_PREMIUM_PLUGINS=true`
7
+ * and the corresponding provider env vars are configured.
8
+ *
9
+ * The bridge maintains a registry of active adapters keyed by `pluginId:capabilityId`,
10
+ * handles connect/disconnect lifecycle, and exposes health status to the metrics
11
+ * and monitoring layer.
12
+ *
13
+ * Security: adapters are loaded from the configured `SAP_MCP_PLUGIN_DIR` only.
14
+ * No code is ever loaded from MCP tool input or user-supplied JSON.
15
+ *
16
+ * @flow
17
+ * 1. `stream-broker.ts` / `webhook-engine.ts` need events for a capability.
18
+ * 2. → `getProviderAdapter(pluginId, capabilityId)` returns the adapter.
19
+ * 3. If not loaded, `loadProviderAdapter()` dynamically imports from the
20
+ * private subrepo providers directory.
21
+ * 4. Adapter `connect()` is called once, then `subscribe()` returns an
22
+ * async iterable of events.
23
+ * 5. `disconnectAllProviders()` is called on graceful shutdown.
24
+ *
25
+ * @module premium/provider-bridge
26
+ */
27
+ import type { PremiumProviderAdapter, ProviderEvent, ProviderHealth } from './types.js';
28
+ /**
29
+ * @name loadProviderAdapter
30
+ * @description Dynamically load a provider adapter from the private subrepo.
31
+ *
32
+ * The adapter module must be located at:
33
+ * `<SAP_MCP_PLUGIN_DIR>/providers/<pluginId>/<capabilityId>.js`
34
+ * (or `.ts` if running via tsx/ts-node).
35
+ *
36
+ * The module must export a default factory function that returns a
37
+ * `PremiumProviderAdapter`:
38
+ *
39
+ * ```ts
40
+ * export default function createAdapter(): PremiumProviderAdapter { ... }
41
+ * ```
42
+ *
43
+ * @param pluginId - The premium plugin id.
44
+ * @param capabilityId - The capability id within the plugin.
45
+ * @returns The loaded and connected `PremiumProviderAdapter`, or `null` if
46
+ * private plugins are disabled, the dir is not configured, or the module
47
+ * is not found.
48
+ *
49
+ * @usedBy `getProviderAdapter`
50
+ */
51
+ export declare function loadProviderAdapter(pluginId: string, capabilityId: string): Promise<PremiumProviderAdapter | null>;
52
+ /**
53
+ * @name getProviderAdapter
54
+ * @description Get or load a provider adapter for a plugin/capability pair.
55
+ *
56
+ * If the adapter is already in the registry, returns it directly.
57
+ * Otherwise, attempts to load it from the private subrepo.
58
+ *
59
+ * @param pluginId - The premium plugin id.
60
+ * @param capabilityId - The capability id within the plugin.
61
+ * @returns The `PremiumProviderAdapter`, or `null` if not available.
62
+ *
63
+ * @usedBy `stream-broker.ts`, `webhook-engine.ts`
64
+ */
65
+ export declare function getProviderAdapter(pluginId: string, capabilityId: string): Promise<PremiumProviderAdapter | null>;
66
+ /**
67
+ * @name getProviderHealth
68
+ * @description Get health status for a specific provider adapter.
69
+ *
70
+ * @param pluginId - The premium plugin id.
71
+ * @param capabilityId - The capability id within the plugin.
72
+ * @returns `ProviderHealth` if the adapter is loaded, otherwise a default unhealthy status.
73
+ *
74
+ * @usedBy `metrics.ts`
75
+ */
76
+ export declare function getProviderHealth(pluginId: string, capabilityId: string): Promise<ProviderHealth>;
77
+ /**
78
+ * @name getAllProviderHealth
79
+ * @description Get health status for all loaded provider adapters.
80
+ *
81
+ * @returns Record keyed by `pluginId:capabilityId` → `ProviderHealth`.
82
+ *
83
+ * @usedBy `metrics.ts`
84
+ */
85
+ export declare function getAllProviderHealth(): Promise<Record<string, ProviderHealth>>;
86
+ /**
87
+ * @name subscribeToProvider
88
+ * @description Subscribe to events from a provider adapter with filters.
89
+ *
90
+ * Convenience wrapper that loads the adapter and returns the async iterable.
91
+ *
92
+ * @param pluginId - The premium plugin id.
93
+ * @param capabilityId - The capability id within the plugin.
94
+ * @param filters — Filter object passed to the adapter's `subscribe()`.
95
+ * @returns Async iterable of `ProviderEvent`, or `null` if the adapter is not available.
96
+ *
97
+ * @usedBy `stream-broker.ts`, `webhook-engine.ts`
98
+ */
99
+ export declare function subscribeToProvider(pluginId: string, capabilityId: string, filters: Record<string, unknown>): Promise<AsyncIterable<ProviderEvent> | null>;
100
+ /**
101
+ * @name disconnectAllProviders
102
+ * @description Disconnect all loaded provider adapters gracefully.
103
+ *
104
+ * Called during server shutdown to clean up connections.
105
+ *
106
+ * @usedBy `remote/server.ts` shutdown handler
107
+ */
108
+ export declare function disconnectAllProviders(): Promise<void>;
109
+ //# sourceMappingURL=provider-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-bridge.d.ts","sourceRoot":"","sources":["../../src/premium/provider-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAKH,OAAO,KAAK,EAAE,sBAAsB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAqCxF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CA6CxC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAMxC;AAED;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,cAAc,CAAC,CAczB;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAapF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,CAK9C;AAED;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAS5D"}
@@ -0,0 +1,239 @@
1
+ /**
2
+ * @name premium/provider-bridge
3
+ * @description Dynamic loader and connection manager for premium provider adapters.
4
+ *
5
+ * Provider adapters live in the private subrepo (`sap-mcp-premium-private/providers/`).
6
+ * The public server loads them dynamically only when `SAP_MCP_ENABLE_PREMIUM_PLUGINS=true`
7
+ * and the corresponding provider env vars are configured.
8
+ *
9
+ * The bridge maintains a registry of active adapters keyed by `pluginId:capabilityId`,
10
+ * handles connect/disconnect lifecycle, and exposes health status to the metrics
11
+ * and monitoring layer.
12
+ *
13
+ * Security: adapters are loaded from the configured `SAP_MCP_PLUGIN_DIR` only.
14
+ * No code is ever loaded from MCP tool input or user-supplied JSON.
15
+ *
16
+ * @flow
17
+ * 1. `stream-broker.ts` / `webhook-engine.ts` need events for a capability.
18
+ * 2. → `getProviderAdapter(pluginId, capabilityId)` returns the adapter.
19
+ * 3. If not loaded, `loadProviderAdapter()` dynamically imports from the
20
+ * private subrepo providers directory.
21
+ * 4. Adapter `connect()` is called once, then `subscribe()` returns an
22
+ * async iterable of events.
23
+ * 5. `disconnectAllProviders()` is called on graceful shutdown.
24
+ *
25
+ * @module premium/provider-bridge
26
+ */
27
+ import { existsSync } from 'node:fs';
28
+ import { join, resolve } from 'node:path';
29
+ import { pathToFileURL } from 'node:url';
30
+ import { findPremiumCapability } from './builtin-plugins.js';
31
+ import { privatePremiumPluginsEnabled } from './private-manifest-loader.js';
32
+ /**
33
+ * @description Registry of active provider adapters keyed by `pluginId:capabilityId`.
34
+ */
35
+ const adapterRegistry = new Map();
36
+ /**
37
+ * @name adapterKey
38
+ * @description Build the registry key for a plugin/capability pair.
39
+ *
40
+ * @param pluginId - The premium plugin id.
41
+ * @param capabilityId - The capability id within the plugin.
42
+ * @returns The registry key string.
43
+ *
44
+ * @internal
45
+ */
46
+ function adapterKey(pluginId, capabilityId) {
47
+ return `${pluginId}:${capabilityId}`;
48
+ }
49
+ /**
50
+ * @name configuredPluginDir
51
+ * @description Resolve the configured plugin directory from `SAP_MCP_PLUGIN_DIR`.
52
+ *
53
+ * @returns The absolute resolved path, or `null` if the env var is unset/empty.
54
+ *
55
+ * @internal
56
+ */
57
+ function configuredPluginDir() {
58
+ const raw = process.env.SAP_MCP_PLUGIN_DIR;
59
+ if (!raw || !raw.trim())
60
+ return null;
61
+ return resolve(raw.trim());
62
+ }
63
+ /**
64
+ * @name loadProviderAdapter
65
+ * @description Dynamically load a provider adapter from the private subrepo.
66
+ *
67
+ * The adapter module must be located at:
68
+ * `<SAP_MCP_PLUGIN_DIR>/providers/<pluginId>/<capabilityId>.js`
69
+ * (or `.ts` if running via tsx/ts-node).
70
+ *
71
+ * The module must export a default factory function that returns a
72
+ * `PremiumProviderAdapter`:
73
+ *
74
+ * ```ts
75
+ * export default function createAdapter(): PremiumProviderAdapter { ... }
76
+ * ```
77
+ *
78
+ * @param pluginId - The premium plugin id.
79
+ * @param capabilityId - The capability id within the plugin.
80
+ * @returns The loaded and connected `PremiumProviderAdapter`, or `null` if
81
+ * private plugins are disabled, the dir is not configured, or the module
82
+ * is not found.
83
+ *
84
+ * @usedBy `getProviderAdapter`
85
+ */
86
+ export async function loadProviderAdapter(pluginId, capabilityId) {
87
+ if (!privatePremiumPluginsEnabled())
88
+ return null;
89
+ const pluginDir = configuredPluginDir();
90
+ if (!pluginDir)
91
+ return null;
92
+ // Resolve the capability to check it exists and get provider env requirements.
93
+ const resolved = findPremiumCapability(pluginId, capabilityId);
94
+ if (!resolved)
95
+ return null;
96
+ // Check that all required provider env vars are set.
97
+ const providerReady = resolved.capability.providerEnv.every(envName => Boolean(process.env[envName]));
98
+ if (!providerReady)
99
+ return null;
100
+ const key = adapterKey(pluginId, capabilityId);
101
+ const existing = adapterRegistry.get(key);
102
+ if (existing)
103
+ return existing;
104
+ // Try .js first (built), then .ts (dev).
105
+ const jsPath = join(pluginDir, 'providers', pluginId, `${capabilityId}.js`);
106
+ const tsPath = join(pluginDir, 'providers', pluginId, `${capabilityId}.ts`);
107
+ let modulePath = null;
108
+ if (existsSync(jsPath)) {
109
+ modulePath = jsPath;
110
+ }
111
+ else if (existsSync(tsPath)) {
112
+ modulePath = tsPath;
113
+ }
114
+ else {
115
+ return null;
116
+ }
117
+ try {
118
+ const moduleUrl = pathToFileURL(modulePath).href;
119
+ const imported = await import(moduleUrl);
120
+ if (typeof imported.default !== 'function')
121
+ return null;
122
+ const adapter = imported.default();
123
+ if (!adapter || typeof adapter.connect !== 'function')
124
+ return null;
125
+ await adapter.connect();
126
+ adapterRegistry.set(key, adapter);
127
+ return adapter;
128
+ }
129
+ catch {
130
+ return null;
131
+ }
132
+ }
133
+ /**
134
+ * @name getProviderAdapter
135
+ * @description Get or load a provider adapter for a plugin/capability pair.
136
+ *
137
+ * If the adapter is already in the registry, returns it directly.
138
+ * Otherwise, attempts to load it from the private subrepo.
139
+ *
140
+ * @param pluginId - The premium plugin id.
141
+ * @param capabilityId - The capability id within the plugin.
142
+ * @returns The `PremiumProviderAdapter`, or `null` if not available.
143
+ *
144
+ * @usedBy `stream-broker.ts`, `webhook-engine.ts`
145
+ */
146
+ export async function getProviderAdapter(pluginId, capabilityId) {
147
+ const key = adapterKey(pluginId, capabilityId);
148
+ const existing = adapterRegistry.get(key);
149
+ if (existing)
150
+ return existing;
151
+ return loadProviderAdapter(pluginId, capabilityId);
152
+ }
153
+ /**
154
+ * @name getProviderHealth
155
+ * @description Get health status for a specific provider adapter.
156
+ *
157
+ * @param pluginId - The premium plugin id.
158
+ * @param capabilityId - The capability id within the plugin.
159
+ * @returns `ProviderHealth` if the adapter is loaded, otherwise a default unhealthy status.
160
+ *
161
+ * @usedBy `metrics.ts`
162
+ */
163
+ export async function getProviderHealth(pluginId, capabilityId) {
164
+ const adapter = adapterRegistry.get(adapterKey(pluginId, capabilityId));
165
+ if (!adapter) {
166
+ return { healthy: false, lastError: 'Adapter not loaded.' };
167
+ }
168
+ try {
169
+ return await adapter.health();
170
+ }
171
+ catch (error) {
172
+ return {
173
+ healthy: false,
174
+ lastError: error instanceof Error ? error.message : 'Unknown provider health error.',
175
+ };
176
+ }
177
+ }
178
+ /**
179
+ * @name getAllProviderHealth
180
+ * @description Get health status for all loaded provider adapters.
181
+ *
182
+ * @returns Record keyed by `pluginId:capabilityId` → `ProviderHealth`.
183
+ *
184
+ * @usedBy `metrics.ts`
185
+ */
186
+ export async function getAllProviderHealth() {
187
+ const results = {};
188
+ for (const [key, adapter] of adapterRegistry.entries()) {
189
+ try {
190
+ results[key] = await adapter.health();
191
+ }
192
+ catch (error) {
193
+ results[key] = {
194
+ healthy: false,
195
+ lastError: error instanceof Error ? error.message : 'Unknown provider health error.',
196
+ };
197
+ }
198
+ }
199
+ return results;
200
+ }
201
+ /**
202
+ * @name subscribeToProvider
203
+ * @description Subscribe to events from a provider adapter with filters.
204
+ *
205
+ * Convenience wrapper that loads the adapter and returns the async iterable.
206
+ *
207
+ * @param pluginId - The premium plugin id.
208
+ * @param capabilityId - The capability id within the plugin.
209
+ * @param filters — Filter object passed to the adapter's `subscribe()`.
210
+ * @returns Async iterable of `ProviderEvent`, or `null` if the adapter is not available.
211
+ *
212
+ * @usedBy `stream-broker.ts`, `webhook-engine.ts`
213
+ */
214
+ export async function subscribeToProvider(pluginId, capabilityId, filters) {
215
+ const adapter = await getProviderAdapter(pluginId, capabilityId);
216
+ if (!adapter)
217
+ return null;
218
+ return adapter.subscribe(filters);
219
+ }
220
+ /**
221
+ * @name disconnectAllProviders
222
+ * @description Disconnect all loaded provider adapters gracefully.
223
+ *
224
+ * Called during server shutdown to clean up connections.
225
+ *
226
+ * @usedBy `remote/server.ts` shutdown handler
227
+ */
228
+ export async function disconnectAllProviders() {
229
+ for (const [key, adapter] of adapterRegistry.entries()) {
230
+ try {
231
+ await adapter.disconnect();
232
+ }
233
+ catch {
234
+ // Best-effort disconnect — ignore errors during shutdown.
235
+ }
236
+ adapterRegistry.delete(key);
237
+ }
238
+ }
239
+ //# sourceMappingURL=provider-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-bridge.js","sourceRoot":"","sources":["../../src/premium/provider-bridge.ts"],"names":[],"mappings":"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"}