@egain/egain-mcp-server 1.0.1

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 (693) hide show
  1. package/.speakeasy/templates/src/lib/env.ts +1 -0
  2. package/README.md +119 -0
  3. package/bin/mcp-server.js +47817 -0
  4. package/bin/mcp-server.js.map +371 -0
  5. package/esm/src/cloudflare-worker/cloudflare-worker.d.ts +17 -0
  6. package/esm/src/cloudflare-worker/cloudflare-worker.d.ts.map +1 -0
  7. package/esm/src/cloudflare-worker/cloudflare-worker.js +72 -0
  8. package/esm/src/cloudflare-worker/cloudflare-worker.js.map +1 -0
  9. package/esm/src/cloudflare-worker/landing-page.d.ts +2 -0
  10. package/esm/src/cloudflare-worker/landing-page.d.ts.map +1 -0
  11. package/esm/src/cloudflare-worker/landing-page.js +330 -0
  12. package/esm/src/cloudflare-worker/landing-page.js.map +1 -0
  13. package/esm/src/core.d.ts +10 -0
  14. package/esm/src/core.d.ts.map +1 -0
  15. package/esm/src/core.js +13 -0
  16. package/esm/src/core.js.map +1 -0
  17. package/esm/src/funcs/getAnnouncements.d.ts +25 -0
  18. package/esm/src/funcs/getAnnouncements.d.ts.map +1 -0
  19. package/esm/src/funcs/getAnnouncements.js +111 -0
  20. package/esm/src/funcs/getAnnouncements.js.map +1 -0
  21. package/esm/src/funcs/getAnswers.d.ts +25 -0
  22. package/esm/src/funcs/getAnswers.d.ts.map +1 -0
  23. package/esm/src/funcs/getAnswers.js +115 -0
  24. package/esm/src/funcs/getAnswers.js.map +1 -0
  25. package/esm/src/funcs/getArticle.d.ts +28 -0
  26. package/esm/src/funcs/getArticle.d.ts.map +1 -0
  27. package/esm/src/funcs/getArticle.js +118 -0
  28. package/esm/src/funcs/getArticle.js.map +1 -0
  29. package/esm/src/funcs/getPopularArticles.d.ts +25 -0
  30. package/esm/src/funcs/getPopularArticles.d.ts.map +1 -0
  31. package/esm/src/funcs/getPopularArticles.js +111 -0
  32. package/esm/src/funcs/getPopularArticles.js.map +1 -0
  33. package/esm/src/funcs/getPortals.d.ts +23 -0
  34. package/esm/src/funcs/getPortals.d.ts.map +1 -0
  35. package/esm/src/funcs/getPortals.js +106 -0
  36. package/esm/src/funcs/getPortals.js.map +1 -0
  37. package/esm/src/funcs/makeSuggestion.d.ts +25 -0
  38. package/esm/src/funcs/makeSuggestion.d.ts.map +1 -0
  39. package/esm/src/funcs/makeSuggestion.js +104 -0
  40. package/esm/src/funcs/makeSuggestion.js.map +1 -0
  41. package/esm/src/funcs/queryAnswers.d.ts +25 -0
  42. package/esm/src/funcs/queryAnswers.d.ts.map +1 -0
  43. package/esm/src/funcs/queryAnswers.js +109 -0
  44. package/esm/src/funcs/queryAnswers.js.map +1 -0
  45. package/esm/src/funcs/queryRetrieve.d.ts +27 -0
  46. package/esm/src/funcs/queryRetrieve.d.ts.map +1 -0
  47. package/esm/src/funcs/queryRetrieve.js +115 -0
  48. package/esm/src/funcs/queryRetrieve.js.map +1 -0
  49. package/esm/src/funcs/querySearch.d.ts +16 -0
  50. package/esm/src/funcs/querySearch.d.ts.map +1 -0
  51. package/esm/src/funcs/querySearch.js +98 -0
  52. package/esm/src/funcs/querySearch.js.map +1 -0
  53. package/esm/src/funcs/retrieveChunks.d.ts +27 -0
  54. package/esm/src/funcs/retrieveChunks.d.ts.map +1 -0
  55. package/esm/src/funcs/retrieveChunks.js +117 -0
  56. package/esm/src/funcs/retrieveChunks.js.map +1 -0
  57. package/esm/src/funcs/searchAiSearch.d.ts +16 -0
  58. package/esm/src/funcs/searchAiSearch.d.ts.map +1 -0
  59. package/esm/src/funcs/searchAiSearch.js +102 -0
  60. package/esm/src/funcs/searchAiSearch.js.map +1 -0
  61. package/esm/src/hooks/auth-hook.d.ts +100 -0
  62. package/esm/src/hooks/auth-hook.d.ts.map +1 -0
  63. package/esm/src/hooks/auth-hook.js +1565 -0
  64. package/esm/src/hooks/auth-hook.js.map +1 -0
  65. package/esm/src/hooks/hooks.d.ts +25 -0
  66. package/esm/src/hooks/hooks.d.ts.map +1 -0
  67. package/esm/src/hooks/hooks.js +82 -0
  68. package/esm/src/hooks/hooks.js.map +1 -0
  69. package/esm/src/hooks/portal-cache-hook.d.ts +34 -0
  70. package/esm/src/hooks/portal-cache-hook.d.ts.map +1 -0
  71. package/esm/src/hooks/portal-cache-hook.js +441 -0
  72. package/esm/src/hooks/portal-cache-hook.js.map +1 -0
  73. package/esm/src/hooks/portal-lookup-hook.d.ts +17 -0
  74. package/esm/src/hooks/portal-lookup-hook.d.ts.map +1 -0
  75. package/esm/src/hooks/portal-lookup-hook.js +374 -0
  76. package/esm/src/hooks/portal-lookup-hook.js.map +1 -0
  77. package/esm/src/hooks/registration.d.ts +3 -0
  78. package/esm/src/hooks/registration.d.ts.map +1 -0
  79. package/esm/src/hooks/registration.js +36 -0
  80. package/esm/src/hooks/registration.js.map +1 -0
  81. package/esm/src/hooks/server-routing-hook.d.ts +19 -0
  82. package/esm/src/hooks/server-routing-hook.d.ts.map +1 -0
  83. package/esm/src/hooks/server-routing-hook.js +43 -0
  84. package/esm/src/hooks/server-routing-hook.js.map +1 -0
  85. package/esm/src/hooks/types.d.ts +76 -0
  86. package/esm/src/hooks/types.d.ts.map +1 -0
  87. package/esm/src/hooks/types.js +5 -0
  88. package/esm/src/hooks/types.js.map +1 -0
  89. package/esm/src/lib/base64.d.ts +10 -0
  90. package/esm/src/lib/base64.d.ts.map +1 -0
  91. package/esm/src/lib/base64.js +29 -0
  92. package/esm/src/lib/base64.js.map +1 -0
  93. package/esm/src/lib/config.d.ts +57 -0
  94. package/esm/src/lib/config.d.ts.map +1 -0
  95. package/esm/src/lib/config.js +46 -0
  96. package/esm/src/lib/config.js.map +1 -0
  97. package/esm/src/lib/dlv.d.ts +14 -0
  98. package/esm/src/lib/dlv.d.ts.map +1 -0
  99. package/esm/src/lib/dlv.js +46 -0
  100. package/esm/src/lib/dlv.js.map +1 -0
  101. package/esm/src/lib/encodings.d.ts +52 -0
  102. package/esm/src/lib/encodings.d.ts.map +1 -0
  103. package/esm/src/lib/encodings.js +354 -0
  104. package/esm/src/lib/encodings.js.map +1 -0
  105. package/esm/src/lib/env.d.ts +15 -0
  106. package/esm/src/lib/env.d.ts.map +1 -0
  107. package/esm/src/lib/env.js +27 -0
  108. package/esm/src/lib/env.js.map +1 -0
  109. package/esm/src/lib/files.d.ts +13 -0
  110. package/esm/src/lib/files.d.ts.map +1 -0
  111. package/esm/src/lib/files.js +73 -0
  112. package/esm/src/lib/files.js.map +1 -0
  113. package/esm/src/lib/http.d.ts +67 -0
  114. package/esm/src/lib/http.d.ts.map +1 -0
  115. package/esm/src/lib/http.js +209 -0
  116. package/esm/src/lib/http.js.map +1 -0
  117. package/esm/src/lib/is-plain-object.d.ts +2 -0
  118. package/esm/src/lib/is-plain-object.d.ts.map +1 -0
  119. package/esm/src/lib/is-plain-object.js +38 -0
  120. package/esm/src/lib/is-plain-object.js.map +1 -0
  121. package/esm/src/lib/logger.d.ts +6 -0
  122. package/esm/src/lib/logger.d.ts.map +1 -0
  123. package/esm/src/lib/logger.js +5 -0
  124. package/esm/src/lib/logger.js.map +1 -0
  125. package/esm/src/lib/matchers.d.ts +66 -0
  126. package/esm/src/lib/matchers.d.ts.map +1 -0
  127. package/esm/src/lib/matchers.js +209 -0
  128. package/esm/src/lib/matchers.js.map +1 -0
  129. package/esm/src/lib/primitives.d.ts +11 -0
  130. package/esm/src/lib/primitives.d.ts.map +1 -0
  131. package/esm/src/lib/primitives.js +81 -0
  132. package/esm/src/lib/primitives.js.map +1 -0
  133. package/esm/src/lib/result.d.ts +31 -0
  134. package/esm/src/lib/result.d.ts.map +1 -0
  135. package/esm/src/lib/result.js +31 -0
  136. package/esm/src/lib/result.js.map +1 -0
  137. package/esm/src/lib/retries.d.ts +38 -0
  138. package/esm/src/lib/retries.d.ts.map +1 -0
  139. package/esm/src/lib/retries.js +150 -0
  140. package/esm/src/lib/retries.js.map +1 -0
  141. package/esm/src/lib/schemas.d.ts +19 -0
  142. package/esm/src/lib/schemas.d.ts.map +1 -0
  143. package/esm/src/lib/schemas.js +57 -0
  144. package/esm/src/lib/schemas.js.map +1 -0
  145. package/esm/src/lib/sdks.d.ts +63 -0
  146. package/esm/src/lib/sdks.d.ts.map +1 -0
  147. package/esm/src/lib/sdks.js +258 -0
  148. package/esm/src/lib/sdks.js.map +1 -0
  149. package/esm/src/lib/security.d.ts +83 -0
  150. package/esm/src/lib/security.d.ts.map +1 -0
  151. package/esm/src/lib/security.js +138 -0
  152. package/esm/src/lib/security.js.map +1 -0
  153. package/esm/src/lib/url.d.ts +5 -0
  154. package/esm/src/lib/url.d.ts.map +1 -0
  155. package/esm/src/lib/url.js +22 -0
  156. package/esm/src/lib/url.js.map +1 -0
  157. package/esm/src/mcp-server/cli/start/command.d.ts +2 -0
  158. package/esm/src/mcp-server/cli/start/command.d.ts.map +1 -0
  159. package/esm/src/mcp-server/cli/start/command.js +96 -0
  160. package/esm/src/mcp-server/cli/start/command.js.map +1 -0
  161. package/esm/src/mcp-server/cli/start/impl.d.ts +17 -0
  162. package/esm/src/mcp-server/cli/start/impl.d.ts.map +1 -0
  163. package/esm/src/mcp-server/cli/start/impl.js +98 -0
  164. package/esm/src/mcp-server/cli/start/impl.js.map +1 -0
  165. package/esm/src/mcp-server/cli.d.ts +6 -0
  166. package/esm/src/mcp-server/cli.d.ts.map +1 -0
  167. package/esm/src/mcp-server/cli.js +7 -0
  168. package/esm/src/mcp-server/cli.js.map +1 -0
  169. package/esm/src/mcp-server/console-logger.d.ts +9 -0
  170. package/esm/src/mcp-server/console-logger.d.ts.map +1 -0
  171. package/esm/src/mcp-server/console-logger.js +56 -0
  172. package/esm/src/mcp-server/console-logger.js.map +1 -0
  173. package/esm/src/mcp-server/extensions.d.ts +11 -0
  174. package/esm/src/mcp-server/extensions.d.ts.map +1 -0
  175. package/esm/src/mcp-server/extensions.js +5 -0
  176. package/esm/src/mcp-server/extensions.js.map +1 -0
  177. package/esm/src/mcp-server/mcp-server.d.ts +2 -0
  178. package/esm/src/mcp-server/mcp-server.d.ts.map +1 -0
  179. package/esm/src/mcp-server/mcp-server.js +23 -0
  180. package/esm/src/mcp-server/mcp-server.js.map +1 -0
  181. package/esm/src/mcp-server/prompts.d.ts +26 -0
  182. package/esm/src/mcp-server/prompts.d.ts.map +1 -0
  183. package/esm/src/mcp-server/prompts.js +47 -0
  184. package/esm/src/mcp-server/prompts.js.map +1 -0
  185. package/esm/src/mcp-server/resources.d.ts +32 -0
  186. package/esm/src/mcp-server/resources.d.ts.map +1 -0
  187. package/esm/src/mcp-server/resources.js +82 -0
  188. package/esm/src/mcp-server/resources.js.map +1 -0
  189. package/esm/src/mcp-server/scopes.d.ts +3 -0
  190. package/esm/src/mcp-server/scopes.d.ts.map +1 -0
  191. package/esm/src/mcp-server/scopes.js +5 -0
  192. package/esm/src/mcp-server/scopes.js.map +1 -0
  193. package/esm/src/mcp-server/server.d.ts +16 -0
  194. package/esm/src/mcp-server/server.d.ts.map +1 -0
  195. package/esm/src/mcp-server/server.js +53 -0
  196. package/esm/src/mcp-server/server.js.map +1 -0
  197. package/esm/src/mcp-server/shared.d.ts +8 -0
  198. package/esm/src/mcp-server/shared.d.ts.map +1 -0
  199. package/esm/src/mcp-server/shared.js +61 -0
  200. package/esm/src/mcp-server/shared.js.map +1 -0
  201. package/esm/src/mcp-server/tools/getAnnouncements.d.ts +7 -0
  202. package/esm/src/mcp-server/tools/getAnnouncements.d.ts.map +1 -0
  203. package/esm/src/mcp-server/tools/getAnnouncements.js +44 -0
  204. package/esm/src/mcp-server/tools/getAnnouncements.js.map +1 -0
  205. package/esm/src/mcp-server/tools/getAnswers.d.ts +7 -0
  206. package/esm/src/mcp-server/tools/getAnswers.d.ts.map +1 -0
  207. package/esm/src/mcp-server/tools/getAnswers.js +44 -0
  208. package/esm/src/mcp-server/tools/getAnswers.js.map +1 -0
  209. package/esm/src/mcp-server/tools/getArticle.d.ts +7 -0
  210. package/esm/src/mcp-server/tools/getArticle.d.ts.map +1 -0
  211. package/esm/src/mcp-server/tools/getArticle.js +47 -0
  212. package/esm/src/mcp-server/tools/getArticle.js.map +1 -0
  213. package/esm/src/mcp-server/tools/getPopularArticles.d.ts +7 -0
  214. package/esm/src/mcp-server/tools/getPopularArticles.d.ts.map +1 -0
  215. package/esm/src/mcp-server/tools/getPopularArticles.js +44 -0
  216. package/esm/src/mcp-server/tools/getPopularArticles.js.map +1 -0
  217. package/esm/src/mcp-server/tools/getPortals.d.ts +7 -0
  218. package/esm/src/mcp-server/tools/getPortals.d.ts.map +1 -0
  219. package/esm/src/mcp-server/tools/getPortals.js +42 -0
  220. package/esm/src/mcp-server/tools/getPortals.js.map +1 -0
  221. package/esm/src/mcp-server/tools/makeSuggestion.d.ts +7 -0
  222. package/esm/src/mcp-server/tools/makeSuggestion.d.ts.map +1 -0
  223. package/esm/src/mcp-server/tools/makeSuggestion.js +44 -0
  224. package/esm/src/mcp-server/tools/makeSuggestion.js.map +1 -0
  225. package/esm/src/mcp-server/tools/queryAnswers.d.ts +7 -0
  226. package/esm/src/mcp-server/tools/queryAnswers.d.ts.map +1 -0
  227. package/esm/src/mcp-server/tools/queryAnswers.js +44 -0
  228. package/esm/src/mcp-server/tools/queryAnswers.js.map +1 -0
  229. package/esm/src/mcp-server/tools/queryRetrieve.d.ts +7 -0
  230. package/esm/src/mcp-server/tools/queryRetrieve.d.ts.map +1 -0
  231. package/esm/src/mcp-server/tools/queryRetrieve.js +46 -0
  232. package/esm/src/mcp-server/tools/queryRetrieve.js.map +1 -0
  233. package/esm/src/mcp-server/tools/querySearch.d.ts +7 -0
  234. package/esm/src/mcp-server/tools/querySearch.d.ts.map +1 -0
  235. package/esm/src/mcp-server/tools/querySearch.js +35 -0
  236. package/esm/src/mcp-server/tools/querySearch.js.map +1 -0
  237. package/esm/src/mcp-server/tools/retrieveChunks.d.ts +7 -0
  238. package/esm/src/mcp-server/tools/retrieveChunks.d.ts.map +1 -0
  239. package/esm/src/mcp-server/tools/retrieveChunks.js +46 -0
  240. package/esm/src/mcp-server/tools/retrieveChunks.js.map +1 -0
  241. package/esm/src/mcp-server/tools/searchAiSearch.d.ts +7 -0
  242. package/esm/src/mcp-server/tools/searchAiSearch.d.ts.map +1 -0
  243. package/esm/src/mcp-server/tools/searchAiSearch.js +35 -0
  244. package/esm/src/mcp-server/tools/searchAiSearch.js.map +1 -0
  245. package/esm/src/mcp-server/tools.d.ts +37 -0
  246. package/esm/src/mcp-server/tools.d.ts.map +1 -0
  247. package/esm/src/mcp-server/tools.js +78 -0
  248. package/esm/src/mcp-server/tools.js.map +1 -0
  249. package/esm/src/models/acceptlanguage.d.ts +7 -0
  250. package/esm/src/models/acceptlanguage.d.ts.map +1 -0
  251. package/esm/src/models/acceptlanguage.js +25 -0
  252. package/esm/src/models/acceptlanguage.js.map +1 -0
  253. package/esm/src/models/accessibleportal.d.ts +12 -0
  254. package/esm/src/models/accessibleportal.d.ts.map +1 -0
  255. package/esm/src/models/accessibleportal.js +14 -0
  256. package/esm/src/models/accessibleportal.js.map +1 -0
  257. package/esm/src/models/additionalsnippets.d.ts +17 -0
  258. package/esm/src/models/additionalsnippets.d.ts.map +1 -0
  259. package/esm/src/models/additionalsnippets.js +23 -0
  260. package/esm/src/models/additionalsnippets.js.map +1 -0
  261. package/esm/src/models/aisearchop.d.ts +23 -0
  262. package/esm/src/models/aisearchop.d.ts.map +1 -0
  263. package/esm/src/models/aisearchop.js +24 -0
  264. package/esm/src/models/aisearchop.js.map +1 -0
  265. package/esm/src/models/allaccessibleportals.d.ts +12 -0
  266. package/esm/src/models/allaccessibleportals.d.ts.map +1 -0
  267. package/esm/src/models/allaccessibleportals.js +11 -0
  268. package/esm/src/models/allaccessibleportals.js.map +1 -0
  269. package/esm/src/models/answersrequest.d.ts +28 -0
  270. package/esm/src/models/answersrequest.d.ts.map +1 -0
  271. package/esm/src/models/answersrequest.js +28 -0
  272. package/esm/src/models/answersrequest.js.map +1 -0
  273. package/esm/src/models/answersresponse.d.ts +34 -0
  274. package/esm/src/models/answersresponse.d.ts.map +1 -0
  275. package/esm/src/models/answersresponse.js +38 -0
  276. package/esm/src/models/answersresponse.js.map +1 -0
  277. package/esm/src/models/article.d.ts +59 -0
  278. package/esm/src/models/article.d.ts.map +1 -0
  279. package/esm/src/models/article.js +59 -0
  280. package/esm/src/models/article.js.map +1 -0
  281. package/esm/src/models/articleadditionalattributes.d.ts +4 -0
  282. package/esm/src/models/articleadditionalattributes.d.ts.map +1 -0
  283. package/esm/src/models/articleadditionalattributes.js +22 -0
  284. package/esm/src/models/articleadditionalattributes.js.map +1 -0
  285. package/esm/src/models/articleattachment.d.ts +16 -0
  286. package/esm/src/models/articleattachment.d.ts.map +1 -0
  287. package/esm/src/models/articleattachment.js +20 -0
  288. package/esm/src/models/articleattachment.js.map +1 -0
  289. package/esm/src/models/articleresult.d.ts +43 -0
  290. package/esm/src/models/articleresult.d.ts.map +1 -0
  291. package/esm/src/models/articleresult.js +42 -0
  292. package/esm/src/models/articleresult.js.map +1 -0
  293. package/esm/src/models/articleresultadditionalattributes.d.ts +4 -0
  294. package/esm/src/models/articleresultadditionalattributes.d.ts.map +1 -0
  295. package/esm/src/models/articleresultadditionalattributes.js +21 -0
  296. package/esm/src/models/articleresultadditionalattributes.js.map +1 -0
  297. package/esm/src/models/articleresults.d.ts +12 -0
  298. package/esm/src/models/articleresults.d.ts.map +1 -0
  299. package/esm/src/models/articleresults.js +11 -0
  300. package/esm/src/models/articleresults.js.map +1 -0
  301. package/esm/src/models/articlesearchresult.d.ts +57 -0
  302. package/esm/src/models/articlesearchresult.d.ts.map +1 -0
  303. package/esm/src/models/articlesearchresult.js +62 -0
  304. package/esm/src/models/articlesearchresult.js.map +1 -0
  305. package/esm/src/models/articletype.d.ts +17 -0
  306. package/esm/src/models/articletype.d.ts.map +1 -0
  307. package/esm/src/models/articletype.js +24 -0
  308. package/esm/src/models/articletype.js.map +1 -0
  309. package/esm/src/models/attachmentforcreatesuggestion.d.ts +9 -0
  310. package/esm/src/models/attachmentforcreatesuggestion.d.ts.map +1 -0
  311. package/esm/src/models/attachmentforcreatesuggestion.js +8 -0
  312. package/esm/src/models/attachmentforcreatesuggestion.js.map +1 -0
  313. package/esm/src/models/bookmarkstatus.d.ts +12 -0
  314. package/esm/src/models/bookmarkstatus.d.ts.map +1 -0
  315. package/esm/src/models/bookmarkstatus.js +11 -0
  316. package/esm/src/models/bookmarkstatus.js.map +1 -0
  317. package/esm/src/models/complianceforarticle.d.ts +24 -0
  318. package/esm/src/models/complianceforarticle.d.ts.map +1 -0
  319. package/esm/src/models/complianceforarticle.js +15 -0
  320. package/esm/src/models/complianceforarticle.js.map +1 -0
  321. package/esm/src/models/createdby.d.ts +10 -0
  322. package/esm/src/models/createdby.d.ts.map +1 -0
  323. package/esm/src/models/createdby.js +12 -0
  324. package/esm/src/models/createdby.js.map +1 -0
  325. package/esm/src/models/createsuggestion.d.ts +43 -0
  326. package/esm/src/models/createsuggestion.d.ts.map +1 -0
  327. package/esm/src/models/createsuggestion.js +47 -0
  328. package/esm/src/models/createsuggestion.js.map +1 -0
  329. package/esm/src/models/customattribute.d.ts +13 -0
  330. package/esm/src/models/customattribute.d.ts.map +1 -0
  331. package/esm/src/models/customattribute.js +19 -0
  332. package/esm/src/models/customattribute.js.map +1 -0
  333. package/esm/src/models/department.d.ts +7 -0
  334. package/esm/src/models/department.d.ts.map +1 -0
  335. package/esm/src/models/department.js +9 -0
  336. package/esm/src/models/department.js.map +1 -0
  337. package/esm/src/models/edition.d.ts +22 -0
  338. package/esm/src/models/edition.d.ts.map +1 -0
  339. package/esm/src/models/edition.js +18 -0
  340. package/esm/src/models/edition.js.map +1 -0
  341. package/esm/src/models/errors/apierror.d.ts +13 -0
  342. package/esm/src/models/errors/apierror.d.ts.map +1 -0
  343. package/esm/src/models/errors/apierror.js +12 -0
  344. package/esm/src/models/errors/apierror.js.map +1 -0
  345. package/esm/src/models/errors/httpclienterrors.d.ts +44 -0
  346. package/esm/src/models/errors/httpclienterrors.d.ts.map +1 -0
  347. package/esm/src/models/errors/httpclienterrors.js +56 -0
  348. package/esm/src/models/errors/httpclienterrors.js.map +1 -0
  349. package/esm/src/models/errors/sdkvalidationerror.d.ts +20 -0
  350. package/esm/src/models/errors/sdkvalidationerror.d.ts.map +1 -0
  351. package/esm/src/models/errors/sdkvalidationerror.js +85 -0
  352. package/esm/src/models/errors/sdkvalidationerror.js.map +1 -0
  353. package/esm/src/models/folderbreadcrumb.d.ts +10 -0
  354. package/esm/src/models/folderbreadcrumb.d.ts.map +1 -0
  355. package/esm/src/models/folderbreadcrumb.js +9 -0
  356. package/esm/src/models/folderbreadcrumb.js.map +1 -0
  357. package/esm/src/models/foldersummary.d.ts +12 -0
  358. package/esm/src/models/foldersummary.d.ts.map +1 -0
  359. package/esm/src/models/foldersummary.js +11 -0
  360. package/esm/src/models/foldersummary.js.map +1 -0
  361. package/esm/src/models/getannouncementarticlesop.d.ts +25 -0
  362. package/esm/src/models/getannouncementarticlesop.d.ts.map +1 -0
  363. package/esm/src/models/getannouncementarticlesop.js +26 -0
  364. package/esm/src/models/getannouncementarticlesop.js.map +1 -0
  365. package/esm/src/models/getarticlebyidop.d.ts +57 -0
  366. package/esm/src/models/getarticlebyidop.d.ts.map +1 -0
  367. package/esm/src/models/getarticlebyidop.js +130 -0
  368. package/esm/src/models/getarticlebyidop.js.map +1 -0
  369. package/esm/src/models/getmyportalsop.d.ts +28 -0
  370. package/esm/src/models/getmyportalsop.d.ts.map +1 -0
  371. package/esm/src/models/getmyportalsop.js +29 -0
  372. package/esm/src/models/getmyportalsop.js.map +1 -0
  373. package/esm/src/models/getpopulararticlesop.d.ts +24 -0
  374. package/esm/src/models/getpopulararticlesop.d.ts.map +1 -0
  375. package/esm/src/models/getpopulararticlesop.js +25 -0
  376. package/esm/src/models/getpopulararticlesop.js.map +1 -0
  377. package/esm/src/models/l10nstring.d.ts +7 -0
  378. package/esm/src/models/l10nstring.d.ts.map +1 -0
  379. package/esm/src/models/l10nstring.js +9 -0
  380. package/esm/src/models/l10nstring.js.map +1 -0
  381. package/esm/src/models/languagecode.d.ts +7 -0
  382. package/esm/src/models/languagecode.d.ts.map +1 -0
  383. package/esm/src/models/languagecode.js +40 -0
  384. package/esm/src/models/languagecode.js.map +1 -0
  385. package/esm/src/models/languagecodeparameter.d.ts +7 -0
  386. package/esm/src/models/languagecodeparameter.d.ts.map +1 -0
  387. package/esm/src/models/languagecodeparameter.js +41 -0
  388. package/esm/src/models/languagecodeparameter.js.map +1 -0
  389. package/esm/src/models/languagequeryparameter.d.ts +7 -0
  390. package/esm/src/models/languagequeryparameter.d.ts.map +1 -0
  391. package/esm/src/models/languagequeryparameter.js +41 -0
  392. package/esm/src/models/languagequeryparameter.js.map +1 -0
  393. package/esm/src/models/link.d.ts +10 -0
  394. package/esm/src/models/link.d.ts.map +1 -0
  395. package/esm/src/models/link.js +9 -0
  396. package/esm/src/models/link.js.map +1 -0
  397. package/esm/src/models/makesuggestionop.d.ts +18 -0
  398. package/esm/src/models/makesuggestionop.d.ts.map +1 -0
  399. package/esm/src/models/makesuggestionop.js +19 -0
  400. package/esm/src/models/makesuggestionop.js.map +1 -0
  401. package/esm/src/models/mandatorylanguagequeryparameter.d.ts +7 -0
  402. package/esm/src/models/mandatorylanguagequeryparameter.d.ts.map +1 -0
  403. package/esm/src/models/mandatorylanguagequeryparameter.js +40 -0
  404. package/esm/src/models/mandatorylanguagequeryparameter.js.map +1 -0
  405. package/esm/src/models/milestone.d.ts +10 -0
  406. package/esm/src/models/milestone.d.ts.map +1 -0
  407. package/esm/src/models/milestone.js +9 -0
  408. package/esm/src/models/milestone.js.map +1 -0
  409. package/esm/src/models/milestonename.d.ts +10 -0
  410. package/esm/src/models/milestonename.d.ts.map +1 -0
  411. package/esm/src/models/milestonename.js +9 -0
  412. package/esm/src/models/milestonename.js.map +1 -0
  413. package/esm/src/models/modifiedby.d.ts +10 -0
  414. package/esm/src/models/modifiedby.d.ts.map +1 -0
  415. package/esm/src/models/modifiedby.js +12 -0
  416. package/esm/src/models/modifiedby.js.map +1 -0
  417. package/esm/src/models/order.d.ts +4 -0
  418. package/esm/src/models/order.d.ts.map +1 -0
  419. package/esm/src/models/order.js +9 -0
  420. package/esm/src/models/order.js.map +1 -0
  421. package/esm/src/models/ownedby.d.ts +10 -0
  422. package/esm/src/models/ownedby.d.ts.map +1 -0
  423. package/esm/src/models/ownedby.js +13 -0
  424. package/esm/src/models/ownedby.js.map +1 -0
  425. package/esm/src/models/paginationinfo.d.ts +10 -0
  426. package/esm/src/models/paginationinfo.d.ts.map +1 -0
  427. package/esm/src/models/paginationinfo.js +12 -0
  428. package/esm/src/models/paginationinfo.js.map +1 -0
  429. package/esm/src/models/personalization.d.ts +25 -0
  430. package/esm/src/models/personalization.d.ts.map +1 -0
  431. package/esm/src/models/personalization.js +22 -0
  432. package/esm/src/models/personalization.js.map +1 -0
  433. package/esm/src/models/postportalidanswersop.d.ts +24 -0
  434. package/esm/src/models/postportalidanswersop.d.ts.map +1 -0
  435. package/esm/src/models/postportalidanswersop.js +25 -0
  436. package/esm/src/models/postportalidanswersop.js.map +1 -0
  437. package/esm/src/models/postportalidretrieveop.d.ts +26 -0
  438. package/esm/src/models/postportalidretrieveop.d.ts.map +1 -0
  439. package/esm/src/models/postportalidretrieveop.js +27 -0
  440. package/esm/src/models/postportalidretrieveop.js.map +1 -0
  441. package/esm/src/models/publishview.d.ts +13 -0
  442. package/esm/src/models/publishview.d.ts.map +1 -0
  443. package/esm/src/models/publishview.js +15 -0
  444. package/esm/src/models/publishview.js.map +1 -0
  445. package/esm/src/models/referenceresponse.d.ts +25 -0
  446. package/esm/src/models/referenceresponse.d.ts.map +1 -0
  447. package/esm/src/models/referenceresponse.js +30 -0
  448. package/esm/src/models/referenceresponse.js.map +1 -0
  449. package/esm/src/models/retrieverequest.d.ts +18 -0
  450. package/esm/src/models/retrieverequest.d.ts.map +1 -0
  451. package/esm/src/models/retrieverequest.js +21 -0
  452. package/esm/src/models/retrieverequest.js.map +1 -0
  453. package/esm/src/models/retrieveresponse.d.ts +37 -0
  454. package/esm/src/models/retrieveresponse.d.ts.map +1 -0
  455. package/esm/src/models/retrieveresponse.js +37 -0
  456. package/esm/src/models/retrieveresponse.js.map +1 -0
  457. package/esm/src/models/schemaslink.d.ts +8 -0
  458. package/esm/src/models/schemaslink.d.ts.map +1 -0
  459. package/esm/src/models/schemaslink.js +10 -0
  460. package/esm/src/models/schemaslink.js.map +1 -0
  461. package/esm/src/models/searchresponse.d.ts +14 -0
  462. package/esm/src/models/searchresponse.d.ts.map +1 -0
  463. package/esm/src/models/searchresponse.js +12 -0
  464. package/esm/src/models/searchresponse.js.map +1 -0
  465. package/esm/src/models/searchresult.d.ts +27 -0
  466. package/esm/src/models/searchresult.d.ts.map +1 -0
  467. package/esm/src/models/searchresult.js +32 -0
  468. package/esm/src/models/searchresult.js.map +1 -0
  469. package/esm/src/models/security.d.ts +6 -0
  470. package/esm/src/models/security.d.ts.map +1 -0
  471. package/esm/src/models/security.js +9 -0
  472. package/esm/src/models/security.js.map +1 -0
  473. package/esm/src/models/shorturl.d.ts +9 -0
  474. package/esm/src/models/shorturl.d.ts.map +1 -0
  475. package/esm/src/models/shorturl.js +12 -0
  476. package/esm/src/models/shorturl.js.map +1 -0
  477. package/esm/src/models/sortidnamedepartment.d.ts +4 -0
  478. package/esm/src/models/sortidnamedepartment.d.ts.map +1 -0
  479. package/esm/src/models/sortidnamedepartment.js +10 -0
  480. package/esm/src/models/sortidnamedepartment.js.map +1 -0
  481. package/esm/src/models/stage.d.ts +11 -0
  482. package/esm/src/models/stage.d.ts.map +1 -0
  483. package/esm/src/models/stage.js +11 -0
  484. package/esm/src/models/stage.js.map +1 -0
  485. package/esm/src/models/structuredauthoringfields.d.ts +10 -0
  486. package/esm/src/models/structuredauthoringfields.d.ts.map +1 -0
  487. package/esm/src/models/structuredauthoringfields.js +12 -0
  488. package/esm/src/models/structuredauthoringfields.js.map +1 -0
  489. package/esm/src/models/tag.d.ts +7 -0
  490. package/esm/src/models/tag.d.ts.map +1 -0
  491. package/esm/src/models/tag.js +9 -0
  492. package/esm/src/models/tag.js.map +1 -0
  493. package/esm/src/models/tagcategory.d.ts +14 -0
  494. package/esm/src/models/tagcategory.d.ts.map +1 -0
  495. package/esm/src/models/tagcategory.js +13 -0
  496. package/esm/src/models/tagcategory.js.map +1 -0
  497. package/esm/src/models/taggroup.d.ts +7 -0
  498. package/esm/src/models/taggroup.d.ts.map +1 -0
  499. package/esm/src/models/taggroup.js +10 -0
  500. package/esm/src/models/taggroup.js.map +1 -0
  501. package/esm/src/models/taggroups.d.ts +7 -0
  502. package/esm/src/models/taggroups.d.ts.map +1 -0
  503. package/esm/src/models/taggroups.js +9 -0
  504. package/esm/src/models/taggroups.js.map +1 -0
  505. package/esm/src/models/tags.d.ts +7 -0
  506. package/esm/src/models/tags.d.ts.map +1 -0
  507. package/esm/src/models/tags.js +9 -0
  508. package/esm/src/models/tags.js.map +1 -0
  509. package/esm/src/models/topicbreadcrumb.d.ts +10 -0
  510. package/esm/src/models/topicbreadcrumb.d.ts.map +1 -0
  511. package/esm/src/models/topicbreadcrumb.js +9 -0
  512. package/esm/src/models/topicbreadcrumb.js.map +1 -0
  513. package/esm/src/models/topicsummary.d.ts +10 -0
  514. package/esm/src/models/topicsummary.d.ts.map +1 -0
  515. package/esm/src/models/topicsummary.js +9 -0
  516. package/esm/src/models/topicsummary.js.map +1 -0
  517. package/esm/src/models/workflow.d.ts +10 -0
  518. package/esm/src/models/workflow.d.ts.map +1 -0
  519. package/esm/src/models/workflow.js +10 -0
  520. package/esm/src/models/workflow.js.map +1 -0
  521. package/esm/src/models/workflowmilestone.d.ts +4 -0
  522. package/esm/src/models/workflowmilestone.d.ts.map +1 -0
  523. package/esm/src/models/workflowmilestone.js +10 -0
  524. package/esm/src/models/workflowmilestone.js.map +1 -0
  525. package/esm/src/models/wserrorcommon.d.ts +17 -0
  526. package/esm/src/models/wserrorcommon.d.ts.map +1 -0
  527. package/esm/src/models/wserrorcommon.js +16 -0
  528. package/esm/src/models/wserrorcommon.js.map +1 -0
  529. package/esm/src/types/async.d.ts +23 -0
  530. package/esm/src/types/async.d.ts.map +1 -0
  531. package/esm/src/types/async.js +28 -0
  532. package/esm/src/types/async.js.map +1 -0
  533. package/esm/src/types/blobs.d.ts +2 -0
  534. package/esm/src/types/blobs.d.ts.map +1 -0
  535. package/esm/src/types/blobs.js +20 -0
  536. package/esm/src/types/blobs.js.map +1 -0
  537. package/esm/src/types/enums.d.ts +12 -0
  538. package/esm/src/types/enums.d.ts.map +1 -0
  539. package/esm/src/types/enums.js +7 -0
  540. package/esm/src/types/enums.js.map +1 -0
  541. package/esm/src/types/fp.d.ts +31 -0
  542. package/esm/src/types/fp.d.ts.map +1 -0
  543. package/esm/src/types/fp.js +31 -0
  544. package/esm/src/types/fp.js.map +1 -0
  545. package/esm/src/types/rfcdate.d.ts +21 -0
  546. package/esm/src/types/rfcdate.d.ts.map +1 -0
  547. package/esm/src/types/rfcdate.js +43 -0
  548. package/esm/src/types/rfcdate.js.map +1 -0
  549. package/esm/src/types/streams.d.ts +2 -0
  550. package/esm/src/types/streams.d.ts.map +1 -0
  551. package/esm/src/types/streams.js +15 -0
  552. package/esm/src/types/streams.js.map +1 -0
  553. package/esm/worker-configuration.d.ts +4 -0
  554. package/esm/worker-configuration.d.ts.map +1 -0
  555. package/esm/worker-configuration.js +5 -0
  556. package/esm/worker-configuration.js.map +1 -0
  557. package/manifest.json +96 -0
  558. package/package.json +41 -0
  559. package/scripts/login.js +93 -0
  560. package/scripts/logout.js +53 -0
  561. package/src/cloudflare-worker/cloudflare-worker.ts +98 -0
  562. package/src/cloudflare-worker/landing-page.ts +337 -0
  563. package/src/core.ts +13 -0
  564. package/src/funcs/getAnnouncements.ts +202 -0
  565. package/src/funcs/getArticle.ts +208 -0
  566. package/src/funcs/getPopularArticles.ts +198 -0
  567. package/src/funcs/getPortals.ts +190 -0
  568. package/src/funcs/makeSuggestion.ts +191 -0
  569. package/src/funcs/queryAnswers.ts +191 -0
  570. package/src/funcs/queryRetrieve.ts +197 -0
  571. package/src/funcs/querySearch.ts +181 -0
  572. package/src/hooks/auth-hook.ts +1752 -0
  573. package/src/hooks/auth-pages/config-page.js +531 -0
  574. package/src/hooks/hooks.ts +132 -0
  575. package/src/hooks/portal-cache-hook.ts +505 -0
  576. package/src/hooks/portal-lookup-hook.ts +429 -0
  577. package/src/hooks/registration.ts +43 -0
  578. package/src/hooks/server-routing-hook.ts +58 -0
  579. package/src/hooks/types.ts +107 -0
  580. package/src/lib/base64.ts +37 -0
  581. package/src/lib/config.ts +89 -0
  582. package/src/lib/dlv.ts +53 -0
  583. package/src/lib/encodings.ts +483 -0
  584. package/src/lib/env.ts +41 -0
  585. package/src/lib/files.ts +82 -0
  586. package/src/lib/http.ts +323 -0
  587. package/src/lib/is-plain-object.ts +43 -0
  588. package/src/lib/logger.ts +9 -0
  589. package/src/lib/matchers.ts +350 -0
  590. package/src/lib/primitives.ts +113 -0
  591. package/src/lib/result.ts +50 -0
  592. package/src/lib/retries.ts +218 -0
  593. package/src/lib/schemas.ts +91 -0
  594. package/src/lib/sdks.ts +409 -0
  595. package/src/lib/security.ts +260 -0
  596. package/src/lib/url.ts +33 -0
  597. package/src/mcp-server/cli/start/command.ts +100 -0
  598. package/src/mcp-server/cli/start/impl.ts +133 -0
  599. package/src/mcp-server/cli.ts +13 -0
  600. package/src/mcp-server/console-logger.ts +76 -0
  601. package/src/mcp-server/extensions.ts +17 -0
  602. package/src/mcp-server/mcp-server.ts +26 -0
  603. package/src/mcp-server/prompts.ts +121 -0
  604. package/src/mcp-server/resources.ts +176 -0
  605. package/src/mcp-server/scopes.ts +7 -0
  606. package/src/mcp-server/server.ts +91 -0
  607. package/src/mcp-server/shared.ts +78 -0
  608. package/src/mcp-server/tools/getAnnouncements.ts +53 -0
  609. package/src/mcp-server/tools/getArticle.ts +56 -0
  610. package/src/mcp-server/tools/getPopularArticles.ts +53 -0
  611. package/src/mcp-server/tools/getPortals.ts +51 -0
  612. package/src/mcp-server/tools/makeSuggestion.ts +53 -0
  613. package/src/mcp-server/tools/queryAnswers.ts +53 -0
  614. package/src/mcp-server/tools/queryRetrieve.ts +55 -0
  615. package/src/mcp-server/tools/querySearch.ts +44 -0
  616. package/src/mcp-server/tools.ts +156 -0
  617. package/src/models/acceptlanguage.ts +30 -0
  618. package/src/models/accessibleportal.ts +27 -0
  619. package/src/models/additionalsnippets.ts +43 -0
  620. package/src/models/aisearchop.ts +62 -0
  621. package/src/models/allaccessibleportals.ts +27 -0
  622. package/src/models/answersrequest.ts +67 -0
  623. package/src/models/answersresponse.ts +88 -0
  624. package/src/models/article.ts +120 -0
  625. package/src/models/articleadditionalattributes.ts +27 -0
  626. package/src/models/articleattachment.ts +38 -0
  627. package/src/models/articleresult.ts +91 -0
  628. package/src/models/articleresults.ts +24 -0
  629. package/src/models/articlesearchresult.ts +139 -0
  630. package/src/models/articletype.ts +42 -0
  631. package/src/models/attachmentforcreatesuggestion.ts +18 -0
  632. package/src/models/bookmarkstatus.ts +28 -0
  633. package/src/models/complianceforarticle.ts +48 -0
  634. package/src/models/createdby.ts +22 -0
  635. package/src/models/createsuggestion.ts +108 -0
  636. package/src/models/customattribute.ts +33 -0
  637. package/src/models/department.ts +16 -0
  638. package/src/models/edition.ts +40 -0
  639. package/src/models/errors/apierror.ts +21 -0
  640. package/src/models/errors/httpclienterrors.ts +62 -0
  641. package/src/models/errors/sdkvalidationerror.ts +97 -0
  642. package/src/models/folderbreadcrumb.ts +21 -0
  643. package/src/models/foldersummary.ts +27 -0
  644. package/src/models/getannouncementarticlesop.ts +68 -0
  645. package/src/models/getarticlebyidop.ts +182 -0
  646. package/src/models/getmyportalsop.ts +78 -0
  647. package/src/models/getpopulararticlesop.ts +66 -0
  648. package/src/models/l10nstring.ts +19 -0
  649. package/src/models/languagecode.ts +43 -0
  650. package/src/models/languagecodeparameter.ts +48 -0
  651. package/src/models/languagequeryparameter.ts +48 -0
  652. package/src/models/link.ts +17 -0
  653. package/src/models/makesuggestionop.ts +47 -0
  654. package/src/models/mandatorylanguagequeryparameter.ts +47 -0
  655. package/src/models/milestone.ts +16 -0
  656. package/src/models/milestonename.ts +22 -0
  657. package/src/models/modifiedby.ts +25 -0
  658. package/src/models/order.ts +12 -0
  659. package/src/models/ownedby.ts +22 -0
  660. package/src/models/paginationinfo.ts +24 -0
  661. package/src/models/personalization.ts +55 -0
  662. package/src/models/postportalidanswersop.ts +62 -0
  663. package/src/models/postportalidretrieveop.ts +68 -0
  664. package/src/models/publishview.ts +35 -0
  665. package/src/models/referenceresponse.ts +60 -0
  666. package/src/models/retrieverequest.ts +47 -0
  667. package/src/models/retrieveresponse.ts +92 -0
  668. package/src/models/schemaslink.ts +21 -0
  669. package/src/models/searchresponse.ts +34 -0
  670. package/src/models/searchresult.ts +64 -0
  671. package/src/models/security.ts +14 -0
  672. package/src/models/shorturl.ts +20 -0
  673. package/src/models/sortidnamedepartment.ts +15 -0
  674. package/src/models/stage.ts +20 -0
  675. package/src/models/structuredauthoringfields.ts +24 -0
  676. package/src/models/tagcategory.ts +28 -0
  677. package/src/models/taggroup.ts +13 -0
  678. package/src/models/taggroups.ts +13 -0
  679. package/src/models/tags.ts +15 -0
  680. package/src/models/topicbreadcrumb.ts +21 -0
  681. package/src/models/topicsummary.ts +24 -0
  682. package/src/models/workflow.ts +16 -0
  683. package/src/models/workflowmilestone.ts +13 -0
  684. package/src/models/wserrorcommon.ts +34 -0
  685. package/src/types/async.ts +68 -0
  686. package/src/types/blobs.ts +23 -0
  687. package/src/types/enums.ts +16 -0
  688. package/src/types/fp.ts +50 -0
  689. package/src/types/rfcdate.ts +54 -0
  690. package/src/types/streams.ts +21 -0
  691. package/tsconfig.json +36 -0
  692. package/worker-configuration.d.ts +8489 -0
  693. package/worker-configuration.ts +11 -0
@@ -0,0 +1,505 @@
1
+ /**
2
+ * Portal Cache Hook for eGain MCP Server
3
+ * Caches portal names and IDs using v4 API after authentication
4
+ */
5
+
6
+ import { BeforeCreateRequestHook, BeforeCreateRequestContext, SDKInitHook } from "./types.js";
7
+ import { RequestInput } from "../lib/http.js";
8
+ import { SDKOptions } from "../lib/config.js";
9
+ import * as fs from "fs";
10
+ import * as path from "path";
11
+ import { fileURLToPath } from 'url';
12
+
13
+ // ES module __dirname equivalent
14
+ const __filename = fileURLToPath(import.meta.url);
15
+ const __dirname = path.dirname(__filename);
16
+
17
+ // Get the project root directory by finding package.json
18
+ const getProjectRoot = (): string => {
19
+ // Start from current directory and walk up until we find package.json
20
+ let currentDir = __dirname;
21
+ while (currentDir !== path.dirname(currentDir)) { // Stop at filesystem root
22
+ if (fs.existsSync(path.join(currentDir, 'package.json'))) {
23
+ return currentDir;
24
+ }
25
+ currentDir = path.dirname(currentDir);
26
+ }
27
+ // If package.json not found, use current working directory as fallback
28
+ return process.cwd();
29
+ };
30
+
31
+ interface Portal {
32
+ id: string;
33
+ name: string;
34
+ }
35
+
36
+ // Always use project root for cache file
37
+ const getCacheFilePath = (): string => {
38
+ const projectRoot = getProjectRoot();
39
+ const cachePath = path.join(projectRoot, 'portals_cache.json');
40
+
41
+ console.error(`📁 Using cache file in project directory: ${cachePath}`);
42
+
43
+ // Ensure the directory exists (it should, since it's project root)
44
+ try {
45
+ const dir = path.dirname(cachePath);
46
+ if (!fs.existsSync(dir)) {
47
+ fs.mkdirSync(dir, { recursive: true });
48
+ }
49
+ } catch (error) {
50
+ console.error(`⚠️ Could not ensure cache directory exists: ${error instanceof Error ? error.message : String(error)}`);
51
+ }
52
+
53
+ return cachePath;
54
+ };
55
+
56
+ const PORTALS_CACHE_FILE = getCacheFilePath();
57
+
58
+ export class PortalCacheHook implements SDKInitHook, BeforeCreateRequestHook {
59
+ private portalCache: Map<string, string> = new Map(); // name -> id mapping
60
+ private cacheInitialized: boolean = false;
61
+ private cachePromise: Promise<void> | null = null;
62
+ private apiDomain: string = 'api.egain.cloud'; // Default, will be overridden by SDK options
63
+
64
+ constructor() {
65
+ console.error('🏗️ CACHE: PortalCacheHook constructor called');
66
+ // Try to load from cache file immediately on construction
67
+ this.loadFromCacheFileIfExists();
68
+ console.error(`🏗️ CACHE: PortalCacheHook constructor completed. Cache size: ${this.portalCache.size}, initialized: ${this.cacheInitialized}`);
69
+ }
70
+
71
+ // SDKInit hook - initialize portal cache early during SDK initialization
72
+ sdkInit(opts: SDKOptions): SDKOptions {
73
+ console.error('🚀 CACHE: Portal cache SDKInit hook called - preparing for early initialization');
74
+
75
+ // Capture API_DOMAIN from SDK options (respects --api-domain flag)
76
+ if (opts.API_DOMAIN) {
77
+ this.apiDomain = opts.API_DOMAIN;
78
+ console.error(`🌐 CACHE: Using API domain from SDK options: ${this.apiDomain}`);
79
+ } else {
80
+ console.error(`🌐 CACHE: No API_DOMAIN in SDK options, using default: ${this.apiDomain}`);
81
+ }
82
+
83
+ // Always ensure we try to load from cache file during SDK init
84
+ if (!this.cacheInitialized) {
85
+ this.loadFromCacheFileIfExists();
86
+ }
87
+
88
+ // If we already have cached portals from file, mark as initialized
89
+ if (this.portalCache.size > 0) {
90
+ this.cacheInitialized = true;
91
+ console.error(`✅ CACHE: Portal cache initialized from file with ${this.portalCache.size} entries`);
92
+ console.error(`🔍 CACHE: Cache includes portals: ${Array.from(this.portalCache.keys()).slice(0, 10).join(', ')}`);
93
+ } else {
94
+ console.error('⚠️ CACHE: No cached portals found during SDK init, will need to fetch during first request');
95
+ // Start async initialization in background if we have bearer token
96
+ this.startBackgroundInitialization();
97
+ }
98
+
99
+ return opts;
100
+ }
101
+
102
+ private startBackgroundInitialization(): void {
103
+ // Try to get bearer token from file system to start initialization early
104
+ const projectRoot = getProjectRoot();
105
+ const bearerTokenPath = path.join(projectRoot, '.bearer_token');
106
+ try {
107
+ if (fs.existsSync(bearerTokenPath)) {
108
+ const bearerToken = fs.readFileSync(bearerTokenPath, 'utf8').trim();
109
+ if (bearerToken) {
110
+ console.error('🔄 CACHE: Found existing bearer token, starting background cache initialization...');
111
+ // Create a fake request for background initialization
112
+ const fakeRequest = new Request(`https://${this.apiDomain}/knowledge`, {
113
+ headers: { 'Authorization': `Bearer ${bearerToken}` }
114
+ });
115
+
116
+ // Start initialization without blocking
117
+ this.ensureCacheInitialized(fakeRequest).catch(error => {
118
+ console.error('⚠️ CACHE: Background initialization failed:', error);
119
+ });
120
+ }
121
+ }
122
+ } catch (error) {
123
+ console.error('⚠️ CACHE: Could not start background initialization:', error);
124
+ }
125
+ }
126
+
127
+ private loadFromCacheFileIfExists(): void {
128
+ try {
129
+ const portals = this.loadPortalsFromCache();
130
+ if (portals && portals.length > 0) {
131
+ // Build the in-memory cache from file
132
+ this.portalCache.clear();
133
+ for (const portal of portals) {
134
+ if (portal.name && portal.id) {
135
+ // Store both exact name and lowercase name for flexible matching
136
+ this.portalCache.set(portal.name, portal.id);
137
+ this.portalCache.set(portal.name.toLowerCase(), portal.id);
138
+ }
139
+ }
140
+ this.cacheInitialized = true;
141
+ console.error(`🚀 CACHE: Portal cache pre-loaded with ${portals.length} portals from cache file`);
142
+ } else {
143
+ console.error(`⚠️ CACHE: No portals loaded from cache file (portals: ${portals ? portals.length : 'null'})`);
144
+ }
145
+ } catch (error) {
146
+ console.error('⚠️ Failed to pre-load portal cache from file:', error);
147
+ }
148
+ }
149
+
150
+ private async fetchPortals(bearerToken: string): Promise<Portal[]> {
151
+ try {
152
+ const allPortals: Portal[] = [];
153
+ let currentPage = 1;
154
+ const pageSize = 25; // Max page size
155
+ const maxPages = 99; // Safety limit
156
+
157
+ const headers = {
158
+ "Authorization": `Bearer ${bearerToken}`,
159
+ "Accept-Language": "en-US",
160
+ "Accept": "application/json",
161
+ "Content-Type": "application/json",
162
+ "User-Agent": "speakeasy-sdk/mcp-typescript 0.1.20 2.721.0 4.0.0 test-knowledge-mcp"
163
+ };
164
+
165
+ // Temporarily disable SSL verification for development/testing
166
+ const originalRejectUnauthorized = process.env['NODE_TLS_REJECT_UNAUTHORIZED'];
167
+ process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
168
+
169
+ try {
170
+ while (currentPage <= maxPages) {
171
+ const v4ApiUrl = `https://${this.apiDomain}/knowledge/portalmgr/v4/myportals?$lang=en-US&$pagenum=${currentPage}&$pagesize=${pageSize}`;
172
+
173
+ console.error(`🔍 CACHE: Fetching portals from v4 API (page ${currentPage}) using domain ${this.apiDomain}`);
174
+
175
+ const response = await fetch(v4ApiUrl, {
176
+ method: 'GET',
177
+ headers
178
+ });
179
+
180
+ console.error(`📨 v4 API Response Status (page ${currentPage}): ${response.status} ${response.statusText}`);
181
+ //console.error(`📨 v4 API Response Headers (page ${currentPage}):`, Object.fromEntries(response.headers.entries()));
182
+
183
+ if (!response.ok) {
184
+ const errorText = await response.text();
185
+ console.error(`❌ v4 API failed on page ${currentPage}: ${response.status} - ${errorText}`);
186
+ console.error(`❌ Full error response body:`, errorText);
187
+ throw new Error(`Failed to fetch portals page ${currentPage}: ${response.status} ${response.statusText}`);
188
+ }
189
+
190
+ const responseText = await response.text();
191
+ //console.error(`📋 v4 API Response Body (page ${currentPage}) - Length: ${responseText.length} chars`);
192
+ //console.error(`📋 v4 API Response Body Preview (page ${currentPage}): ${responseText.substring(0, 500)}...`);
193
+
194
+ // Also log the full response if it's not too large
195
+ if (responseText.length < 2000) {
196
+ console.error(`📋 v4 API Full Response Body (page ${currentPage}):`, responseText);
197
+ }
198
+
199
+ const data = JSON.parse(responseText);
200
+
201
+ // Log the parsed JSON structure
202
+ console.error(`🔍 v4 API Parsed JSON structure (page ${currentPage}):`, {
203
+ hasPortalArray: !!(data && data.portal && Array.isArray(data.portal)),
204
+ portalCount: data?.portal?.length || 0,
205
+ topLevelKeys: data ? Object.keys(data) : [],
206
+ firstPortalKeys: data?.portal?.[0] ? Object.keys(data.portal[0]) : []
207
+ });
208
+
209
+ // Extract portals from current page
210
+ if (data && data.portal && Array.isArray(data.portal)) {
211
+ const pagePortals = data.portal.map((portal: any) => ({
212
+ id: portal.id?.toString() || '',
213
+ name: portal.name || ''
214
+ })).filter((portal: Portal) => portal.id && portal.name);
215
+
216
+ allPortals.push(...pagePortals);
217
+ } else {
218
+ console.error(`❌ Unexpected v4 API response structure on page ${currentPage}:`, data);
219
+ break;
220
+ }
221
+
222
+ // Check pagination info to see if there are more pages
223
+ const paginationInfo = data.paginationInfo;
224
+ if (paginationInfo) {
225
+ const totalCount = paginationInfo.count || 0;
226
+ const currentPageNum = paginationInfo.pagenum || currentPage;
227
+ const currentPageSize = paginationInfo.pagesize || pageSize;
228
+
229
+ console.error(`📄 CACHE: Pagination info - Total: ${totalCount}, Page: ${currentPageNum}, Size: ${currentPageSize}`);
230
+
231
+ // Check if we have a "next" link or if we've reached the end
232
+ const hasNextPage = paginationInfo.link &&
233
+ paginationInfo.link.some((link: any) => link.rel === 'next');
234
+
235
+ if (!hasNextPage) {
236
+ break;
237
+ }
238
+
239
+ // Also check if we've reached the total count
240
+ if (allPortals.length >= totalCount) {
241
+ console.error(`✅ CACHE: Fetched all ${totalCount} portals. Stopping pagination.`);
242
+ break;
243
+ }
244
+ } else {
245
+ break;
246
+ }
247
+
248
+ currentPage++;
249
+ }
250
+ } finally {
251
+ // Restore original SSL setting
252
+ if (originalRejectUnauthorized !== undefined) {
253
+ process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = originalRejectUnauthorized;
254
+ } else {
255
+ delete process.env['NODE_TLS_REJECT_UNAUTHORIZED'];
256
+ }
257
+ }
258
+
259
+ console.error(`✅ CACHE: Successfully fetched ${allPortals.length} portals across ${currentPage - 1} pages`);
260
+ return allPortals;
261
+ } catch (error) {
262
+ console.error('❌ Error fetching portals:', error);
263
+ return [];
264
+ }
265
+ }
266
+
267
+ private savePortalsToCache(portals: Portal[]): void {
268
+ try {
269
+ if (portals.length > 0) {
270
+ fs.writeFileSync(PORTALS_CACHE_FILE, JSON.stringify(portals, null, 4));
271
+ console.error(`💾 CACHE: Saved ${portals.length} portals to cache file: ${PORTALS_CACHE_FILE}`);
272
+ } else {
273
+ console.error('⚠️ No valid portals data to save');
274
+ }
275
+ } catch (error) {
276
+ if (error instanceof Error && 'code' in error && error.code === 'EROFS') {
277
+ console.error('⚠️ File system is read-only, continuing with in-memory cache only');
278
+ console.error(`💭 ${portals.length} portals cached in memory (cannot persist to disk)`);
279
+ } else {
280
+ console.error('❌ Error saving portals to cache:', error);
281
+ }
282
+ // Don't throw - continue with in-memory cache even if disk save fails
283
+ }
284
+ }
285
+
286
+ private loadPortalsFromCache(): Portal[] | null {
287
+ try {
288
+ if (fs.existsSync(PORTALS_CACHE_FILE)) {
289
+ const data = fs.readFileSync(PORTALS_CACHE_FILE, 'utf8');
290
+ console.error(`📄 CACHE: Read ${data.length} characters from cache file`);
291
+ const portals = JSON.parse(data) as Portal[];
292
+ console.error(`📂 CACHE: Parsed ${portals.length} portals from cache file`);
293
+ return portals;
294
+ } else {
295
+ console.error(`❌ CACHE: Cache file does not exist: ${PORTALS_CACHE_FILE}`);
296
+ }
297
+ } catch (error) {
298
+ console.error('❌ Error loading portals from cache:', error);
299
+ }
300
+ return null;
301
+ }
302
+
303
+ private async initializeCache(_context: BeforeCreateRequestContext, request: Request): Promise<void> {
304
+ if (this.cacheInitialized) {
305
+ return;
306
+ }
307
+
308
+ // Prevent multiple concurrent cache initializations
309
+ if (this.cachePromise) {
310
+ await this.cachePromise;
311
+ return;
312
+ }
313
+
314
+ this.cachePromise = (async () => {
315
+ try {
316
+ console.error('🏗️ CACHE: Initializing portal cache...');
317
+
318
+ // Check if cache is already loaded from constructor
319
+ if (this.portalCache.size > 0) {
320
+ console.error('✅ CACHE: Portal cache already loaded from file during construction');
321
+ this.cacheInitialized = true;
322
+ return;
323
+ }
324
+
325
+ // Try to load from cache first (if not already loaded in constructor)
326
+ let portals = this.loadPortalsFromCache();
327
+
328
+ if (!portals || portals.length === 0) {
329
+ console.error('📥 CACHE: Cache is empty or does not exist. Fetching new data...');
330
+
331
+ // Extract bearer token from request headers
332
+ const authHeader = request.headers.get('Authorization');
333
+ const bearerToken = authHeader?.replace('Bearer ', '') || '';
334
+
335
+ if (!bearerToken) {
336
+ console.error('❌ CACHE: No bearer token found in request headers');
337
+ return;
338
+ }
339
+
340
+ // Fetch portals from API
341
+ portals = await this.fetchPortals(bearerToken);
342
+
343
+ if (portals && portals.length > 0) {
344
+ // Save to cache file
345
+ this.savePortalsToCache(portals);
346
+ } else {
347
+ console.error('❌ CACHE: Failed to fetch portals from API');
348
+ return;
349
+ }
350
+ }
351
+
352
+ // Build the in-memory cache
353
+ this.portalCache.clear();
354
+ for (const portal of portals) {
355
+ if (portal.name && portal.id) {
356
+ // Store both exact name and lowercase name for flexible matching
357
+ this.portalCache.set(portal.name, portal.id);
358
+ this.portalCache.set(portal.name.toLowerCase(), portal.id);
359
+ }
360
+ }
361
+
362
+ console.error(`✅ Portal cache initialized with ${portals.length} portals`);
363
+ if (portals.length > 0) {
364
+ console.error('📋 Available portals:', portals.map(p => `${p.name} (${p.id})`).join(', '));
365
+ }
366
+
367
+ this.cacheInitialized = true;
368
+ } catch (error) {
369
+ console.error('❌ Failed to initialize portal cache:', error);
370
+ // Don't throw - we'll continue without cache
371
+ }
372
+ })();
373
+
374
+ await this.cachePromise;
375
+ }
376
+
377
+ public getPortalId(portalName: string): string | null {
378
+ // Allow portal lookups even if not officially "initialized" but we have cached data
379
+ if (!this.cacheInitialized && this.portalCache.size === 0) {
380
+ return null;
381
+ }
382
+
383
+ // Try exact match first
384
+ const exactMatch = this.portalCache.get(portalName) || this.portalCache.get(portalName.toLowerCase());
385
+ if (exactMatch) {
386
+ return exactMatch;
387
+ }
388
+
389
+ // If no exact match, try partial matching (like Python version)
390
+ // Look for portal names that contain the search term
391
+ const searchTerm = portalName.toLowerCase();
392
+ for (const [cachedName, id] of this.portalCache.entries()) {
393
+ if (cachedName.toLowerCase().includes(searchTerm)) {
394
+ console.error(`🔄 Found partial match: "${portalName}" -> "${cachedName}" (${id})`);
395
+ return id;
396
+ }
397
+ }
398
+
399
+ // If still no match, list available portals for debugging
400
+ console.error(`⚠️ Portal name "${portalName}" not found in cache. Available portals:`,
401
+ this.getAvailablePortals().map(p => p.name).join(', '));
402
+
403
+ return null;
404
+ }
405
+
406
+ public getAvailablePortals(): Array<{name: string, id: string}> {
407
+ const portals: Array<{name: string, id: string}> = [];
408
+ const addedIds = new Set<string>();
409
+
410
+ for (const [name, id] of this.portalCache.entries()) {
411
+ // Avoid duplicates (since we store both original and lowercase names)
412
+ if (!addedIds.has(id)) {
413
+ portals.push({ name, id });
414
+ addedIds.add(id);
415
+ }
416
+ }
417
+
418
+ return portals;
419
+ }
420
+
421
+ public getMasterPortalId(): string | null {
422
+ const masterPortalId = this.getPortalId("Master Portal");
423
+ if (!masterPortalId) {
424
+ console.error('❌ "Master Portal" not found. Cannot provide default portal.');
425
+ return null;
426
+ }
427
+ return masterPortalId;
428
+ }
429
+
430
+ public isCacheInitialized(): boolean {
431
+ return this.cacheInitialized;
432
+ }
433
+
434
+ public isCacheInitializing(): boolean {
435
+ return this.cachePromise !== null && !this.cacheInitialized;
436
+ }
437
+
438
+ public async waitForCacheInitialization(): Promise<void> {
439
+ if (this.cachePromise) {
440
+ await this.cachePromise;
441
+ }
442
+ }
443
+
444
+ // BeforeCreateRequestHook - ensures cache is ready before request creation (synchronous)
445
+ beforeCreateRequest(_hookCtx: BeforeCreateRequestContext, input: RequestInput): RequestInput {
446
+
447
+ // Check if cache is ready
448
+ const availablePortals = this.getAvailablePortals();
449
+ const cacheReady = this.cacheInitialized || availablePortals.length > 0;
450
+
451
+ if (!cacheReady) {
452
+ console.error('❌ CACHE: Portal cache not ready during request creation - this should not happen!');
453
+ console.error('🐛 CACHE: This indicates a bug in the cache initialization logic');
454
+
455
+ // Don't start background initialization here - it should have been started in sdkInit
456
+ if (!this.cachePromise) {
457
+ console.error('⚠️ CACHE: No cache initialization in progress - this may cause issues');
458
+ }
459
+ } else {
460
+ console.error(`✅ CACHE: Portal cache ready with ${availablePortals.length} portals for request processing`);
461
+ }
462
+
463
+ // ALWAYS return the input unchanged - never fail request creation
464
+ return input;
465
+ }
466
+
467
+
468
+ // Public method to manually initialize cache if needed (e.g., called by auth hook when token is available)
469
+ public async ensureCacheInitialized(request: Request): Promise<void> {
470
+ if (!this.cacheInitialized && !this.cachePromise) {
471
+ console.error('🔧 Manual cache initialization requested...');
472
+ // Create a minimal context for manual initialization
473
+ const context: BeforeCreateRequestContext = {
474
+ operationID: "manual_init",
475
+ baseURL: "",
476
+ oAuth2Scopes: [],
477
+ retryConfig: { strategy: "backoff", backoff: { initialInterval: 500, maxInterval: 5000, maxElapsedTime: 30000, exponent: 1.5 } },
478
+ resolvedSecurity: null,
479
+ options: {}
480
+ };
481
+ await this.initializeCache(context, request);
482
+ } else if (this.cachePromise) {
483
+ console.error('🔧 Cache initialization already in progress, waiting...');
484
+ await this.cachePromise;
485
+ } else {
486
+ console.error('🔧 Cache already initialized, no action needed');
487
+ }
488
+ }
489
+
490
+ // Method to force refresh the cache (useful when auth hook gets a fresh token)
491
+ public async refreshCacheWithToken(bearerToken: string): Promise<void> {
492
+ console.error('🔄 Forcing cache refresh with new token...');
493
+ // Reset the cache state to force a fresh fetch
494
+ this.cacheInitialized = false;
495
+ this.cachePromise = null;
496
+ this.portalCache.clear();
497
+
498
+ // Create a fake request with the bearer token
499
+ const fakeRequest = new Request(`https://${this.apiDomain}/knowledge`, {
500
+ headers: { 'Authorization': `Bearer ${bearerToken}` }
501
+ });
502
+
503
+ await this.ensureCacheInitialized(fakeRequest);
504
+ }
505
+ }