@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.
- package/.speakeasy/templates/src/lib/env.ts +1 -0
- package/README.md +119 -0
- package/bin/mcp-server.js +47817 -0
- package/bin/mcp-server.js.map +371 -0
- package/esm/src/cloudflare-worker/cloudflare-worker.d.ts +17 -0
- package/esm/src/cloudflare-worker/cloudflare-worker.d.ts.map +1 -0
- package/esm/src/cloudflare-worker/cloudflare-worker.js +72 -0
- package/esm/src/cloudflare-worker/cloudflare-worker.js.map +1 -0
- package/esm/src/cloudflare-worker/landing-page.d.ts +2 -0
- package/esm/src/cloudflare-worker/landing-page.d.ts.map +1 -0
- package/esm/src/cloudflare-worker/landing-page.js +330 -0
- package/esm/src/cloudflare-worker/landing-page.js.map +1 -0
- package/esm/src/core.d.ts +10 -0
- package/esm/src/core.d.ts.map +1 -0
- package/esm/src/core.js +13 -0
- package/esm/src/core.js.map +1 -0
- package/esm/src/funcs/getAnnouncements.d.ts +25 -0
- package/esm/src/funcs/getAnnouncements.d.ts.map +1 -0
- package/esm/src/funcs/getAnnouncements.js +111 -0
- package/esm/src/funcs/getAnnouncements.js.map +1 -0
- package/esm/src/funcs/getAnswers.d.ts +25 -0
- package/esm/src/funcs/getAnswers.d.ts.map +1 -0
- package/esm/src/funcs/getAnswers.js +115 -0
- package/esm/src/funcs/getAnswers.js.map +1 -0
- package/esm/src/funcs/getArticle.d.ts +28 -0
- package/esm/src/funcs/getArticle.d.ts.map +1 -0
- package/esm/src/funcs/getArticle.js +118 -0
- package/esm/src/funcs/getArticle.js.map +1 -0
- package/esm/src/funcs/getPopularArticles.d.ts +25 -0
- package/esm/src/funcs/getPopularArticles.d.ts.map +1 -0
- package/esm/src/funcs/getPopularArticles.js +111 -0
- package/esm/src/funcs/getPopularArticles.js.map +1 -0
- package/esm/src/funcs/getPortals.d.ts +23 -0
- package/esm/src/funcs/getPortals.d.ts.map +1 -0
- package/esm/src/funcs/getPortals.js +106 -0
- package/esm/src/funcs/getPortals.js.map +1 -0
- package/esm/src/funcs/makeSuggestion.d.ts +25 -0
- package/esm/src/funcs/makeSuggestion.d.ts.map +1 -0
- package/esm/src/funcs/makeSuggestion.js +104 -0
- package/esm/src/funcs/makeSuggestion.js.map +1 -0
- package/esm/src/funcs/queryAnswers.d.ts +25 -0
- package/esm/src/funcs/queryAnswers.d.ts.map +1 -0
- package/esm/src/funcs/queryAnswers.js +109 -0
- package/esm/src/funcs/queryAnswers.js.map +1 -0
- package/esm/src/funcs/queryRetrieve.d.ts +27 -0
- package/esm/src/funcs/queryRetrieve.d.ts.map +1 -0
- package/esm/src/funcs/queryRetrieve.js +115 -0
- package/esm/src/funcs/queryRetrieve.js.map +1 -0
- package/esm/src/funcs/querySearch.d.ts +16 -0
- package/esm/src/funcs/querySearch.d.ts.map +1 -0
- package/esm/src/funcs/querySearch.js +98 -0
- package/esm/src/funcs/querySearch.js.map +1 -0
- package/esm/src/funcs/retrieveChunks.d.ts +27 -0
- package/esm/src/funcs/retrieveChunks.d.ts.map +1 -0
- package/esm/src/funcs/retrieveChunks.js +117 -0
- package/esm/src/funcs/retrieveChunks.js.map +1 -0
- package/esm/src/funcs/searchAiSearch.d.ts +16 -0
- package/esm/src/funcs/searchAiSearch.d.ts.map +1 -0
- package/esm/src/funcs/searchAiSearch.js +102 -0
- package/esm/src/funcs/searchAiSearch.js.map +1 -0
- package/esm/src/hooks/auth-hook.d.ts +100 -0
- package/esm/src/hooks/auth-hook.d.ts.map +1 -0
- package/esm/src/hooks/auth-hook.js +1565 -0
- package/esm/src/hooks/auth-hook.js.map +1 -0
- package/esm/src/hooks/hooks.d.ts +25 -0
- package/esm/src/hooks/hooks.d.ts.map +1 -0
- package/esm/src/hooks/hooks.js +82 -0
- package/esm/src/hooks/hooks.js.map +1 -0
- package/esm/src/hooks/portal-cache-hook.d.ts +34 -0
- package/esm/src/hooks/portal-cache-hook.d.ts.map +1 -0
- package/esm/src/hooks/portal-cache-hook.js +441 -0
- package/esm/src/hooks/portal-cache-hook.js.map +1 -0
- package/esm/src/hooks/portal-lookup-hook.d.ts +17 -0
- package/esm/src/hooks/portal-lookup-hook.d.ts.map +1 -0
- package/esm/src/hooks/portal-lookup-hook.js +374 -0
- package/esm/src/hooks/portal-lookup-hook.js.map +1 -0
- package/esm/src/hooks/registration.d.ts +3 -0
- package/esm/src/hooks/registration.d.ts.map +1 -0
- package/esm/src/hooks/registration.js +36 -0
- package/esm/src/hooks/registration.js.map +1 -0
- package/esm/src/hooks/server-routing-hook.d.ts +19 -0
- package/esm/src/hooks/server-routing-hook.d.ts.map +1 -0
- package/esm/src/hooks/server-routing-hook.js +43 -0
- package/esm/src/hooks/server-routing-hook.js.map +1 -0
- package/esm/src/hooks/types.d.ts +76 -0
- package/esm/src/hooks/types.d.ts.map +1 -0
- package/esm/src/hooks/types.js +5 -0
- package/esm/src/hooks/types.js.map +1 -0
- package/esm/src/lib/base64.d.ts +10 -0
- package/esm/src/lib/base64.d.ts.map +1 -0
- package/esm/src/lib/base64.js +29 -0
- package/esm/src/lib/base64.js.map +1 -0
- package/esm/src/lib/config.d.ts +57 -0
- package/esm/src/lib/config.d.ts.map +1 -0
- package/esm/src/lib/config.js +46 -0
- package/esm/src/lib/config.js.map +1 -0
- package/esm/src/lib/dlv.d.ts +14 -0
- package/esm/src/lib/dlv.d.ts.map +1 -0
- package/esm/src/lib/dlv.js +46 -0
- package/esm/src/lib/dlv.js.map +1 -0
- package/esm/src/lib/encodings.d.ts +52 -0
- package/esm/src/lib/encodings.d.ts.map +1 -0
- package/esm/src/lib/encodings.js +354 -0
- package/esm/src/lib/encodings.js.map +1 -0
- package/esm/src/lib/env.d.ts +15 -0
- package/esm/src/lib/env.d.ts.map +1 -0
- package/esm/src/lib/env.js +27 -0
- package/esm/src/lib/env.js.map +1 -0
- package/esm/src/lib/files.d.ts +13 -0
- package/esm/src/lib/files.d.ts.map +1 -0
- package/esm/src/lib/files.js +73 -0
- package/esm/src/lib/files.js.map +1 -0
- package/esm/src/lib/http.d.ts +67 -0
- package/esm/src/lib/http.d.ts.map +1 -0
- package/esm/src/lib/http.js +209 -0
- package/esm/src/lib/http.js.map +1 -0
- package/esm/src/lib/is-plain-object.d.ts +2 -0
- package/esm/src/lib/is-plain-object.d.ts.map +1 -0
- package/esm/src/lib/is-plain-object.js +38 -0
- package/esm/src/lib/is-plain-object.js.map +1 -0
- package/esm/src/lib/logger.d.ts +6 -0
- package/esm/src/lib/logger.d.ts.map +1 -0
- package/esm/src/lib/logger.js +5 -0
- package/esm/src/lib/logger.js.map +1 -0
- package/esm/src/lib/matchers.d.ts +66 -0
- package/esm/src/lib/matchers.d.ts.map +1 -0
- package/esm/src/lib/matchers.js +209 -0
- package/esm/src/lib/matchers.js.map +1 -0
- package/esm/src/lib/primitives.d.ts +11 -0
- package/esm/src/lib/primitives.d.ts.map +1 -0
- package/esm/src/lib/primitives.js +81 -0
- package/esm/src/lib/primitives.js.map +1 -0
- package/esm/src/lib/result.d.ts +31 -0
- package/esm/src/lib/result.d.ts.map +1 -0
- package/esm/src/lib/result.js +31 -0
- package/esm/src/lib/result.js.map +1 -0
- package/esm/src/lib/retries.d.ts +38 -0
- package/esm/src/lib/retries.d.ts.map +1 -0
- package/esm/src/lib/retries.js +150 -0
- package/esm/src/lib/retries.js.map +1 -0
- package/esm/src/lib/schemas.d.ts +19 -0
- package/esm/src/lib/schemas.d.ts.map +1 -0
- package/esm/src/lib/schemas.js +57 -0
- package/esm/src/lib/schemas.js.map +1 -0
- package/esm/src/lib/sdks.d.ts +63 -0
- package/esm/src/lib/sdks.d.ts.map +1 -0
- package/esm/src/lib/sdks.js +258 -0
- package/esm/src/lib/sdks.js.map +1 -0
- package/esm/src/lib/security.d.ts +83 -0
- package/esm/src/lib/security.d.ts.map +1 -0
- package/esm/src/lib/security.js +138 -0
- package/esm/src/lib/security.js.map +1 -0
- package/esm/src/lib/url.d.ts +5 -0
- package/esm/src/lib/url.d.ts.map +1 -0
- package/esm/src/lib/url.js +22 -0
- package/esm/src/lib/url.js.map +1 -0
- package/esm/src/mcp-server/cli/start/command.d.ts +2 -0
- package/esm/src/mcp-server/cli/start/command.d.ts.map +1 -0
- package/esm/src/mcp-server/cli/start/command.js +96 -0
- package/esm/src/mcp-server/cli/start/command.js.map +1 -0
- package/esm/src/mcp-server/cli/start/impl.d.ts +17 -0
- package/esm/src/mcp-server/cli/start/impl.d.ts.map +1 -0
- package/esm/src/mcp-server/cli/start/impl.js +98 -0
- package/esm/src/mcp-server/cli/start/impl.js.map +1 -0
- package/esm/src/mcp-server/cli.d.ts +6 -0
- package/esm/src/mcp-server/cli.d.ts.map +1 -0
- package/esm/src/mcp-server/cli.js +7 -0
- package/esm/src/mcp-server/cli.js.map +1 -0
- package/esm/src/mcp-server/console-logger.d.ts +9 -0
- package/esm/src/mcp-server/console-logger.d.ts.map +1 -0
- package/esm/src/mcp-server/console-logger.js +56 -0
- package/esm/src/mcp-server/console-logger.js.map +1 -0
- package/esm/src/mcp-server/extensions.d.ts +11 -0
- package/esm/src/mcp-server/extensions.d.ts.map +1 -0
- package/esm/src/mcp-server/extensions.js +5 -0
- package/esm/src/mcp-server/extensions.js.map +1 -0
- package/esm/src/mcp-server/mcp-server.d.ts +2 -0
- package/esm/src/mcp-server/mcp-server.d.ts.map +1 -0
- package/esm/src/mcp-server/mcp-server.js +23 -0
- package/esm/src/mcp-server/mcp-server.js.map +1 -0
- package/esm/src/mcp-server/prompts.d.ts +26 -0
- package/esm/src/mcp-server/prompts.d.ts.map +1 -0
- package/esm/src/mcp-server/prompts.js +47 -0
- package/esm/src/mcp-server/prompts.js.map +1 -0
- package/esm/src/mcp-server/resources.d.ts +32 -0
- package/esm/src/mcp-server/resources.d.ts.map +1 -0
- package/esm/src/mcp-server/resources.js +82 -0
- package/esm/src/mcp-server/resources.js.map +1 -0
- package/esm/src/mcp-server/scopes.d.ts +3 -0
- package/esm/src/mcp-server/scopes.d.ts.map +1 -0
- package/esm/src/mcp-server/scopes.js +5 -0
- package/esm/src/mcp-server/scopes.js.map +1 -0
- package/esm/src/mcp-server/server.d.ts +16 -0
- package/esm/src/mcp-server/server.d.ts.map +1 -0
- package/esm/src/mcp-server/server.js +53 -0
- package/esm/src/mcp-server/server.js.map +1 -0
- package/esm/src/mcp-server/shared.d.ts +8 -0
- package/esm/src/mcp-server/shared.d.ts.map +1 -0
- package/esm/src/mcp-server/shared.js +61 -0
- package/esm/src/mcp-server/shared.js.map +1 -0
- package/esm/src/mcp-server/tools/getAnnouncements.d.ts +7 -0
- package/esm/src/mcp-server/tools/getAnnouncements.d.ts.map +1 -0
- package/esm/src/mcp-server/tools/getAnnouncements.js +44 -0
- package/esm/src/mcp-server/tools/getAnnouncements.js.map +1 -0
- package/esm/src/mcp-server/tools/getAnswers.d.ts +7 -0
- package/esm/src/mcp-server/tools/getAnswers.d.ts.map +1 -0
- package/esm/src/mcp-server/tools/getAnswers.js +44 -0
- package/esm/src/mcp-server/tools/getAnswers.js.map +1 -0
- package/esm/src/mcp-server/tools/getArticle.d.ts +7 -0
- package/esm/src/mcp-server/tools/getArticle.d.ts.map +1 -0
- package/esm/src/mcp-server/tools/getArticle.js +47 -0
- package/esm/src/mcp-server/tools/getArticle.js.map +1 -0
- package/esm/src/mcp-server/tools/getPopularArticles.d.ts +7 -0
- package/esm/src/mcp-server/tools/getPopularArticles.d.ts.map +1 -0
- package/esm/src/mcp-server/tools/getPopularArticles.js +44 -0
- package/esm/src/mcp-server/tools/getPopularArticles.js.map +1 -0
- package/esm/src/mcp-server/tools/getPortals.d.ts +7 -0
- package/esm/src/mcp-server/tools/getPortals.d.ts.map +1 -0
- package/esm/src/mcp-server/tools/getPortals.js +42 -0
- package/esm/src/mcp-server/tools/getPortals.js.map +1 -0
- package/esm/src/mcp-server/tools/makeSuggestion.d.ts +7 -0
- package/esm/src/mcp-server/tools/makeSuggestion.d.ts.map +1 -0
- package/esm/src/mcp-server/tools/makeSuggestion.js +44 -0
- package/esm/src/mcp-server/tools/makeSuggestion.js.map +1 -0
- package/esm/src/mcp-server/tools/queryAnswers.d.ts +7 -0
- package/esm/src/mcp-server/tools/queryAnswers.d.ts.map +1 -0
- package/esm/src/mcp-server/tools/queryAnswers.js +44 -0
- package/esm/src/mcp-server/tools/queryAnswers.js.map +1 -0
- package/esm/src/mcp-server/tools/queryRetrieve.d.ts +7 -0
- package/esm/src/mcp-server/tools/queryRetrieve.d.ts.map +1 -0
- package/esm/src/mcp-server/tools/queryRetrieve.js +46 -0
- package/esm/src/mcp-server/tools/queryRetrieve.js.map +1 -0
- package/esm/src/mcp-server/tools/querySearch.d.ts +7 -0
- package/esm/src/mcp-server/tools/querySearch.d.ts.map +1 -0
- package/esm/src/mcp-server/tools/querySearch.js +35 -0
- package/esm/src/mcp-server/tools/querySearch.js.map +1 -0
- package/esm/src/mcp-server/tools/retrieveChunks.d.ts +7 -0
- package/esm/src/mcp-server/tools/retrieveChunks.d.ts.map +1 -0
- package/esm/src/mcp-server/tools/retrieveChunks.js +46 -0
- package/esm/src/mcp-server/tools/retrieveChunks.js.map +1 -0
- package/esm/src/mcp-server/tools/searchAiSearch.d.ts +7 -0
- package/esm/src/mcp-server/tools/searchAiSearch.d.ts.map +1 -0
- package/esm/src/mcp-server/tools/searchAiSearch.js +35 -0
- package/esm/src/mcp-server/tools/searchAiSearch.js.map +1 -0
- package/esm/src/mcp-server/tools.d.ts +37 -0
- package/esm/src/mcp-server/tools.d.ts.map +1 -0
- package/esm/src/mcp-server/tools.js +78 -0
- package/esm/src/mcp-server/tools.js.map +1 -0
- package/esm/src/models/acceptlanguage.d.ts +7 -0
- package/esm/src/models/acceptlanguage.d.ts.map +1 -0
- package/esm/src/models/acceptlanguage.js +25 -0
- package/esm/src/models/acceptlanguage.js.map +1 -0
- package/esm/src/models/accessibleportal.d.ts +12 -0
- package/esm/src/models/accessibleportal.d.ts.map +1 -0
- package/esm/src/models/accessibleportal.js +14 -0
- package/esm/src/models/accessibleportal.js.map +1 -0
- package/esm/src/models/additionalsnippets.d.ts +17 -0
- package/esm/src/models/additionalsnippets.d.ts.map +1 -0
- package/esm/src/models/additionalsnippets.js +23 -0
- package/esm/src/models/additionalsnippets.js.map +1 -0
- package/esm/src/models/aisearchop.d.ts +23 -0
- package/esm/src/models/aisearchop.d.ts.map +1 -0
- package/esm/src/models/aisearchop.js +24 -0
- package/esm/src/models/aisearchop.js.map +1 -0
- package/esm/src/models/allaccessibleportals.d.ts +12 -0
- package/esm/src/models/allaccessibleportals.d.ts.map +1 -0
- package/esm/src/models/allaccessibleportals.js +11 -0
- package/esm/src/models/allaccessibleportals.js.map +1 -0
- package/esm/src/models/answersrequest.d.ts +28 -0
- package/esm/src/models/answersrequest.d.ts.map +1 -0
- package/esm/src/models/answersrequest.js +28 -0
- package/esm/src/models/answersrequest.js.map +1 -0
- package/esm/src/models/answersresponse.d.ts +34 -0
- package/esm/src/models/answersresponse.d.ts.map +1 -0
- package/esm/src/models/answersresponse.js +38 -0
- package/esm/src/models/answersresponse.js.map +1 -0
- package/esm/src/models/article.d.ts +59 -0
- package/esm/src/models/article.d.ts.map +1 -0
- package/esm/src/models/article.js +59 -0
- package/esm/src/models/article.js.map +1 -0
- package/esm/src/models/articleadditionalattributes.d.ts +4 -0
- package/esm/src/models/articleadditionalattributes.d.ts.map +1 -0
- package/esm/src/models/articleadditionalattributes.js +22 -0
- package/esm/src/models/articleadditionalattributes.js.map +1 -0
- package/esm/src/models/articleattachment.d.ts +16 -0
- package/esm/src/models/articleattachment.d.ts.map +1 -0
- package/esm/src/models/articleattachment.js +20 -0
- package/esm/src/models/articleattachment.js.map +1 -0
- package/esm/src/models/articleresult.d.ts +43 -0
- package/esm/src/models/articleresult.d.ts.map +1 -0
- package/esm/src/models/articleresult.js +42 -0
- package/esm/src/models/articleresult.js.map +1 -0
- package/esm/src/models/articleresultadditionalattributes.d.ts +4 -0
- package/esm/src/models/articleresultadditionalattributes.d.ts.map +1 -0
- package/esm/src/models/articleresultadditionalattributes.js +21 -0
- package/esm/src/models/articleresultadditionalattributes.js.map +1 -0
- package/esm/src/models/articleresults.d.ts +12 -0
- package/esm/src/models/articleresults.d.ts.map +1 -0
- package/esm/src/models/articleresults.js +11 -0
- package/esm/src/models/articleresults.js.map +1 -0
- package/esm/src/models/articlesearchresult.d.ts +57 -0
- package/esm/src/models/articlesearchresult.d.ts.map +1 -0
- package/esm/src/models/articlesearchresult.js +62 -0
- package/esm/src/models/articlesearchresult.js.map +1 -0
- package/esm/src/models/articletype.d.ts +17 -0
- package/esm/src/models/articletype.d.ts.map +1 -0
- package/esm/src/models/articletype.js +24 -0
- package/esm/src/models/articletype.js.map +1 -0
- package/esm/src/models/attachmentforcreatesuggestion.d.ts +9 -0
- package/esm/src/models/attachmentforcreatesuggestion.d.ts.map +1 -0
- package/esm/src/models/attachmentforcreatesuggestion.js +8 -0
- package/esm/src/models/attachmentforcreatesuggestion.js.map +1 -0
- package/esm/src/models/bookmarkstatus.d.ts +12 -0
- package/esm/src/models/bookmarkstatus.d.ts.map +1 -0
- package/esm/src/models/bookmarkstatus.js +11 -0
- package/esm/src/models/bookmarkstatus.js.map +1 -0
- package/esm/src/models/complianceforarticle.d.ts +24 -0
- package/esm/src/models/complianceforarticle.d.ts.map +1 -0
- package/esm/src/models/complianceforarticle.js +15 -0
- package/esm/src/models/complianceforarticle.js.map +1 -0
- package/esm/src/models/createdby.d.ts +10 -0
- package/esm/src/models/createdby.d.ts.map +1 -0
- package/esm/src/models/createdby.js +12 -0
- package/esm/src/models/createdby.js.map +1 -0
- package/esm/src/models/createsuggestion.d.ts +43 -0
- package/esm/src/models/createsuggestion.d.ts.map +1 -0
- package/esm/src/models/createsuggestion.js +47 -0
- package/esm/src/models/createsuggestion.js.map +1 -0
- package/esm/src/models/customattribute.d.ts +13 -0
- package/esm/src/models/customattribute.d.ts.map +1 -0
- package/esm/src/models/customattribute.js +19 -0
- package/esm/src/models/customattribute.js.map +1 -0
- package/esm/src/models/department.d.ts +7 -0
- package/esm/src/models/department.d.ts.map +1 -0
- package/esm/src/models/department.js +9 -0
- package/esm/src/models/department.js.map +1 -0
- package/esm/src/models/edition.d.ts +22 -0
- package/esm/src/models/edition.d.ts.map +1 -0
- package/esm/src/models/edition.js +18 -0
- package/esm/src/models/edition.js.map +1 -0
- package/esm/src/models/errors/apierror.d.ts +13 -0
- package/esm/src/models/errors/apierror.d.ts.map +1 -0
- package/esm/src/models/errors/apierror.js +12 -0
- package/esm/src/models/errors/apierror.js.map +1 -0
- package/esm/src/models/errors/httpclienterrors.d.ts +44 -0
- package/esm/src/models/errors/httpclienterrors.d.ts.map +1 -0
- package/esm/src/models/errors/httpclienterrors.js +56 -0
- package/esm/src/models/errors/httpclienterrors.js.map +1 -0
- package/esm/src/models/errors/sdkvalidationerror.d.ts +20 -0
- package/esm/src/models/errors/sdkvalidationerror.d.ts.map +1 -0
- package/esm/src/models/errors/sdkvalidationerror.js +85 -0
- package/esm/src/models/errors/sdkvalidationerror.js.map +1 -0
- package/esm/src/models/folderbreadcrumb.d.ts +10 -0
- package/esm/src/models/folderbreadcrumb.d.ts.map +1 -0
- package/esm/src/models/folderbreadcrumb.js +9 -0
- package/esm/src/models/folderbreadcrumb.js.map +1 -0
- package/esm/src/models/foldersummary.d.ts +12 -0
- package/esm/src/models/foldersummary.d.ts.map +1 -0
- package/esm/src/models/foldersummary.js +11 -0
- package/esm/src/models/foldersummary.js.map +1 -0
- package/esm/src/models/getannouncementarticlesop.d.ts +25 -0
- package/esm/src/models/getannouncementarticlesop.d.ts.map +1 -0
- package/esm/src/models/getannouncementarticlesop.js +26 -0
- package/esm/src/models/getannouncementarticlesop.js.map +1 -0
- package/esm/src/models/getarticlebyidop.d.ts +57 -0
- package/esm/src/models/getarticlebyidop.d.ts.map +1 -0
- package/esm/src/models/getarticlebyidop.js +130 -0
- package/esm/src/models/getarticlebyidop.js.map +1 -0
- package/esm/src/models/getmyportalsop.d.ts +28 -0
- package/esm/src/models/getmyportalsop.d.ts.map +1 -0
- package/esm/src/models/getmyportalsop.js +29 -0
- package/esm/src/models/getmyportalsop.js.map +1 -0
- package/esm/src/models/getpopulararticlesop.d.ts +24 -0
- package/esm/src/models/getpopulararticlesop.d.ts.map +1 -0
- package/esm/src/models/getpopulararticlesop.js +25 -0
- package/esm/src/models/getpopulararticlesop.js.map +1 -0
- package/esm/src/models/l10nstring.d.ts +7 -0
- package/esm/src/models/l10nstring.d.ts.map +1 -0
- package/esm/src/models/l10nstring.js +9 -0
- package/esm/src/models/l10nstring.js.map +1 -0
- package/esm/src/models/languagecode.d.ts +7 -0
- package/esm/src/models/languagecode.d.ts.map +1 -0
- package/esm/src/models/languagecode.js +40 -0
- package/esm/src/models/languagecode.js.map +1 -0
- package/esm/src/models/languagecodeparameter.d.ts +7 -0
- package/esm/src/models/languagecodeparameter.d.ts.map +1 -0
- package/esm/src/models/languagecodeparameter.js +41 -0
- package/esm/src/models/languagecodeparameter.js.map +1 -0
- package/esm/src/models/languagequeryparameter.d.ts +7 -0
- package/esm/src/models/languagequeryparameter.d.ts.map +1 -0
- package/esm/src/models/languagequeryparameter.js +41 -0
- package/esm/src/models/languagequeryparameter.js.map +1 -0
- package/esm/src/models/link.d.ts +10 -0
- package/esm/src/models/link.d.ts.map +1 -0
- package/esm/src/models/link.js +9 -0
- package/esm/src/models/link.js.map +1 -0
- package/esm/src/models/makesuggestionop.d.ts +18 -0
- package/esm/src/models/makesuggestionop.d.ts.map +1 -0
- package/esm/src/models/makesuggestionop.js +19 -0
- package/esm/src/models/makesuggestionop.js.map +1 -0
- package/esm/src/models/mandatorylanguagequeryparameter.d.ts +7 -0
- package/esm/src/models/mandatorylanguagequeryparameter.d.ts.map +1 -0
- package/esm/src/models/mandatorylanguagequeryparameter.js +40 -0
- package/esm/src/models/mandatorylanguagequeryparameter.js.map +1 -0
- package/esm/src/models/milestone.d.ts +10 -0
- package/esm/src/models/milestone.d.ts.map +1 -0
- package/esm/src/models/milestone.js +9 -0
- package/esm/src/models/milestone.js.map +1 -0
- package/esm/src/models/milestonename.d.ts +10 -0
- package/esm/src/models/milestonename.d.ts.map +1 -0
- package/esm/src/models/milestonename.js +9 -0
- package/esm/src/models/milestonename.js.map +1 -0
- package/esm/src/models/modifiedby.d.ts +10 -0
- package/esm/src/models/modifiedby.d.ts.map +1 -0
- package/esm/src/models/modifiedby.js +12 -0
- package/esm/src/models/modifiedby.js.map +1 -0
- package/esm/src/models/order.d.ts +4 -0
- package/esm/src/models/order.d.ts.map +1 -0
- package/esm/src/models/order.js +9 -0
- package/esm/src/models/order.js.map +1 -0
- package/esm/src/models/ownedby.d.ts +10 -0
- package/esm/src/models/ownedby.d.ts.map +1 -0
- package/esm/src/models/ownedby.js +13 -0
- package/esm/src/models/ownedby.js.map +1 -0
- package/esm/src/models/paginationinfo.d.ts +10 -0
- package/esm/src/models/paginationinfo.d.ts.map +1 -0
- package/esm/src/models/paginationinfo.js +12 -0
- package/esm/src/models/paginationinfo.js.map +1 -0
- package/esm/src/models/personalization.d.ts +25 -0
- package/esm/src/models/personalization.d.ts.map +1 -0
- package/esm/src/models/personalization.js +22 -0
- package/esm/src/models/personalization.js.map +1 -0
- package/esm/src/models/postportalidanswersop.d.ts +24 -0
- package/esm/src/models/postportalidanswersop.d.ts.map +1 -0
- package/esm/src/models/postportalidanswersop.js +25 -0
- package/esm/src/models/postportalidanswersop.js.map +1 -0
- package/esm/src/models/postportalidretrieveop.d.ts +26 -0
- package/esm/src/models/postportalidretrieveop.d.ts.map +1 -0
- package/esm/src/models/postportalidretrieveop.js +27 -0
- package/esm/src/models/postportalidretrieveop.js.map +1 -0
- package/esm/src/models/publishview.d.ts +13 -0
- package/esm/src/models/publishview.d.ts.map +1 -0
- package/esm/src/models/publishview.js +15 -0
- package/esm/src/models/publishview.js.map +1 -0
- package/esm/src/models/referenceresponse.d.ts +25 -0
- package/esm/src/models/referenceresponse.d.ts.map +1 -0
- package/esm/src/models/referenceresponse.js +30 -0
- package/esm/src/models/referenceresponse.js.map +1 -0
- package/esm/src/models/retrieverequest.d.ts +18 -0
- package/esm/src/models/retrieverequest.d.ts.map +1 -0
- package/esm/src/models/retrieverequest.js +21 -0
- package/esm/src/models/retrieverequest.js.map +1 -0
- package/esm/src/models/retrieveresponse.d.ts +37 -0
- package/esm/src/models/retrieveresponse.d.ts.map +1 -0
- package/esm/src/models/retrieveresponse.js +37 -0
- package/esm/src/models/retrieveresponse.js.map +1 -0
- package/esm/src/models/schemaslink.d.ts +8 -0
- package/esm/src/models/schemaslink.d.ts.map +1 -0
- package/esm/src/models/schemaslink.js +10 -0
- package/esm/src/models/schemaslink.js.map +1 -0
- package/esm/src/models/searchresponse.d.ts +14 -0
- package/esm/src/models/searchresponse.d.ts.map +1 -0
- package/esm/src/models/searchresponse.js +12 -0
- package/esm/src/models/searchresponse.js.map +1 -0
- package/esm/src/models/searchresult.d.ts +27 -0
- package/esm/src/models/searchresult.d.ts.map +1 -0
- package/esm/src/models/searchresult.js +32 -0
- package/esm/src/models/searchresult.js.map +1 -0
- package/esm/src/models/security.d.ts +6 -0
- package/esm/src/models/security.d.ts.map +1 -0
- package/esm/src/models/security.js +9 -0
- package/esm/src/models/security.js.map +1 -0
- package/esm/src/models/shorturl.d.ts +9 -0
- package/esm/src/models/shorturl.d.ts.map +1 -0
- package/esm/src/models/shorturl.js +12 -0
- package/esm/src/models/shorturl.js.map +1 -0
- package/esm/src/models/sortidnamedepartment.d.ts +4 -0
- package/esm/src/models/sortidnamedepartment.d.ts.map +1 -0
- package/esm/src/models/sortidnamedepartment.js +10 -0
- package/esm/src/models/sortidnamedepartment.js.map +1 -0
- package/esm/src/models/stage.d.ts +11 -0
- package/esm/src/models/stage.d.ts.map +1 -0
- package/esm/src/models/stage.js +11 -0
- package/esm/src/models/stage.js.map +1 -0
- package/esm/src/models/structuredauthoringfields.d.ts +10 -0
- package/esm/src/models/structuredauthoringfields.d.ts.map +1 -0
- package/esm/src/models/structuredauthoringfields.js +12 -0
- package/esm/src/models/structuredauthoringfields.js.map +1 -0
- package/esm/src/models/tag.d.ts +7 -0
- package/esm/src/models/tag.d.ts.map +1 -0
- package/esm/src/models/tag.js +9 -0
- package/esm/src/models/tag.js.map +1 -0
- package/esm/src/models/tagcategory.d.ts +14 -0
- package/esm/src/models/tagcategory.d.ts.map +1 -0
- package/esm/src/models/tagcategory.js +13 -0
- package/esm/src/models/tagcategory.js.map +1 -0
- package/esm/src/models/taggroup.d.ts +7 -0
- package/esm/src/models/taggroup.d.ts.map +1 -0
- package/esm/src/models/taggroup.js +10 -0
- package/esm/src/models/taggroup.js.map +1 -0
- package/esm/src/models/taggroups.d.ts +7 -0
- package/esm/src/models/taggroups.d.ts.map +1 -0
- package/esm/src/models/taggroups.js +9 -0
- package/esm/src/models/taggroups.js.map +1 -0
- package/esm/src/models/tags.d.ts +7 -0
- package/esm/src/models/tags.d.ts.map +1 -0
- package/esm/src/models/tags.js +9 -0
- package/esm/src/models/tags.js.map +1 -0
- package/esm/src/models/topicbreadcrumb.d.ts +10 -0
- package/esm/src/models/topicbreadcrumb.d.ts.map +1 -0
- package/esm/src/models/topicbreadcrumb.js +9 -0
- package/esm/src/models/topicbreadcrumb.js.map +1 -0
- package/esm/src/models/topicsummary.d.ts +10 -0
- package/esm/src/models/topicsummary.d.ts.map +1 -0
- package/esm/src/models/topicsummary.js +9 -0
- package/esm/src/models/topicsummary.js.map +1 -0
- package/esm/src/models/workflow.d.ts +10 -0
- package/esm/src/models/workflow.d.ts.map +1 -0
- package/esm/src/models/workflow.js +10 -0
- package/esm/src/models/workflow.js.map +1 -0
- package/esm/src/models/workflowmilestone.d.ts +4 -0
- package/esm/src/models/workflowmilestone.d.ts.map +1 -0
- package/esm/src/models/workflowmilestone.js +10 -0
- package/esm/src/models/workflowmilestone.js.map +1 -0
- package/esm/src/models/wserrorcommon.d.ts +17 -0
- package/esm/src/models/wserrorcommon.d.ts.map +1 -0
- package/esm/src/models/wserrorcommon.js +16 -0
- package/esm/src/models/wserrorcommon.js.map +1 -0
- package/esm/src/types/async.d.ts +23 -0
- package/esm/src/types/async.d.ts.map +1 -0
- package/esm/src/types/async.js +28 -0
- package/esm/src/types/async.js.map +1 -0
- package/esm/src/types/blobs.d.ts +2 -0
- package/esm/src/types/blobs.d.ts.map +1 -0
- package/esm/src/types/blobs.js +20 -0
- package/esm/src/types/blobs.js.map +1 -0
- package/esm/src/types/enums.d.ts +12 -0
- package/esm/src/types/enums.d.ts.map +1 -0
- package/esm/src/types/enums.js +7 -0
- package/esm/src/types/enums.js.map +1 -0
- package/esm/src/types/fp.d.ts +31 -0
- package/esm/src/types/fp.d.ts.map +1 -0
- package/esm/src/types/fp.js +31 -0
- package/esm/src/types/fp.js.map +1 -0
- package/esm/src/types/rfcdate.d.ts +21 -0
- package/esm/src/types/rfcdate.d.ts.map +1 -0
- package/esm/src/types/rfcdate.js +43 -0
- package/esm/src/types/rfcdate.js.map +1 -0
- package/esm/src/types/streams.d.ts +2 -0
- package/esm/src/types/streams.d.ts.map +1 -0
- package/esm/src/types/streams.js +15 -0
- package/esm/src/types/streams.js.map +1 -0
- package/esm/worker-configuration.d.ts +4 -0
- package/esm/worker-configuration.d.ts.map +1 -0
- package/esm/worker-configuration.js +5 -0
- package/esm/worker-configuration.js.map +1 -0
- package/manifest.json +96 -0
- package/package.json +41 -0
- package/scripts/login.js +93 -0
- package/scripts/logout.js +53 -0
- package/src/cloudflare-worker/cloudflare-worker.ts +98 -0
- package/src/cloudflare-worker/landing-page.ts +337 -0
- package/src/core.ts +13 -0
- package/src/funcs/getAnnouncements.ts +202 -0
- package/src/funcs/getArticle.ts +208 -0
- package/src/funcs/getPopularArticles.ts +198 -0
- package/src/funcs/getPortals.ts +190 -0
- package/src/funcs/makeSuggestion.ts +191 -0
- package/src/funcs/queryAnswers.ts +191 -0
- package/src/funcs/queryRetrieve.ts +197 -0
- package/src/funcs/querySearch.ts +181 -0
- package/src/hooks/auth-hook.ts +1752 -0
- package/src/hooks/auth-pages/config-page.js +531 -0
- package/src/hooks/hooks.ts +132 -0
- package/src/hooks/portal-cache-hook.ts +505 -0
- package/src/hooks/portal-lookup-hook.ts +429 -0
- package/src/hooks/registration.ts +43 -0
- package/src/hooks/server-routing-hook.ts +58 -0
- package/src/hooks/types.ts +107 -0
- package/src/lib/base64.ts +37 -0
- package/src/lib/config.ts +89 -0
- package/src/lib/dlv.ts +53 -0
- package/src/lib/encodings.ts +483 -0
- package/src/lib/env.ts +41 -0
- package/src/lib/files.ts +82 -0
- package/src/lib/http.ts +323 -0
- package/src/lib/is-plain-object.ts +43 -0
- package/src/lib/logger.ts +9 -0
- package/src/lib/matchers.ts +350 -0
- package/src/lib/primitives.ts +113 -0
- package/src/lib/result.ts +50 -0
- package/src/lib/retries.ts +218 -0
- package/src/lib/schemas.ts +91 -0
- package/src/lib/sdks.ts +409 -0
- package/src/lib/security.ts +260 -0
- package/src/lib/url.ts +33 -0
- package/src/mcp-server/cli/start/command.ts +100 -0
- package/src/mcp-server/cli/start/impl.ts +133 -0
- package/src/mcp-server/cli.ts +13 -0
- package/src/mcp-server/console-logger.ts +76 -0
- package/src/mcp-server/extensions.ts +17 -0
- package/src/mcp-server/mcp-server.ts +26 -0
- package/src/mcp-server/prompts.ts +121 -0
- package/src/mcp-server/resources.ts +176 -0
- package/src/mcp-server/scopes.ts +7 -0
- package/src/mcp-server/server.ts +91 -0
- package/src/mcp-server/shared.ts +78 -0
- package/src/mcp-server/tools/getAnnouncements.ts +53 -0
- package/src/mcp-server/tools/getArticle.ts +56 -0
- package/src/mcp-server/tools/getPopularArticles.ts +53 -0
- package/src/mcp-server/tools/getPortals.ts +51 -0
- package/src/mcp-server/tools/makeSuggestion.ts +53 -0
- package/src/mcp-server/tools/queryAnswers.ts +53 -0
- package/src/mcp-server/tools/queryRetrieve.ts +55 -0
- package/src/mcp-server/tools/querySearch.ts +44 -0
- package/src/mcp-server/tools.ts +156 -0
- package/src/models/acceptlanguage.ts +30 -0
- package/src/models/accessibleportal.ts +27 -0
- package/src/models/additionalsnippets.ts +43 -0
- package/src/models/aisearchop.ts +62 -0
- package/src/models/allaccessibleportals.ts +27 -0
- package/src/models/answersrequest.ts +67 -0
- package/src/models/answersresponse.ts +88 -0
- package/src/models/article.ts +120 -0
- package/src/models/articleadditionalattributes.ts +27 -0
- package/src/models/articleattachment.ts +38 -0
- package/src/models/articleresult.ts +91 -0
- package/src/models/articleresults.ts +24 -0
- package/src/models/articlesearchresult.ts +139 -0
- package/src/models/articletype.ts +42 -0
- package/src/models/attachmentforcreatesuggestion.ts +18 -0
- package/src/models/bookmarkstatus.ts +28 -0
- package/src/models/complianceforarticle.ts +48 -0
- package/src/models/createdby.ts +22 -0
- package/src/models/createsuggestion.ts +108 -0
- package/src/models/customattribute.ts +33 -0
- package/src/models/department.ts +16 -0
- package/src/models/edition.ts +40 -0
- package/src/models/errors/apierror.ts +21 -0
- package/src/models/errors/httpclienterrors.ts +62 -0
- package/src/models/errors/sdkvalidationerror.ts +97 -0
- package/src/models/folderbreadcrumb.ts +21 -0
- package/src/models/foldersummary.ts +27 -0
- package/src/models/getannouncementarticlesop.ts +68 -0
- package/src/models/getarticlebyidop.ts +182 -0
- package/src/models/getmyportalsop.ts +78 -0
- package/src/models/getpopulararticlesop.ts +66 -0
- package/src/models/l10nstring.ts +19 -0
- package/src/models/languagecode.ts +43 -0
- package/src/models/languagecodeparameter.ts +48 -0
- package/src/models/languagequeryparameter.ts +48 -0
- package/src/models/link.ts +17 -0
- package/src/models/makesuggestionop.ts +47 -0
- package/src/models/mandatorylanguagequeryparameter.ts +47 -0
- package/src/models/milestone.ts +16 -0
- package/src/models/milestonename.ts +22 -0
- package/src/models/modifiedby.ts +25 -0
- package/src/models/order.ts +12 -0
- package/src/models/ownedby.ts +22 -0
- package/src/models/paginationinfo.ts +24 -0
- package/src/models/personalization.ts +55 -0
- package/src/models/postportalidanswersop.ts +62 -0
- package/src/models/postportalidretrieveop.ts +68 -0
- package/src/models/publishview.ts +35 -0
- package/src/models/referenceresponse.ts +60 -0
- package/src/models/retrieverequest.ts +47 -0
- package/src/models/retrieveresponse.ts +92 -0
- package/src/models/schemaslink.ts +21 -0
- package/src/models/searchresponse.ts +34 -0
- package/src/models/searchresult.ts +64 -0
- package/src/models/security.ts +14 -0
- package/src/models/shorturl.ts +20 -0
- package/src/models/sortidnamedepartment.ts +15 -0
- package/src/models/stage.ts +20 -0
- package/src/models/structuredauthoringfields.ts +24 -0
- package/src/models/tagcategory.ts +28 -0
- package/src/models/taggroup.ts +13 -0
- package/src/models/taggroups.ts +13 -0
- package/src/models/tags.ts +15 -0
- package/src/models/topicbreadcrumb.ts +21 -0
- package/src/models/topicsummary.ts +24 -0
- package/src/models/workflow.ts +16 -0
- package/src/models/workflowmilestone.ts +13 -0
- package/src/models/wserrorcommon.ts +34 -0
- package/src/types/async.ts +68 -0
- package/src/types/blobs.ts +23 -0
- package/src/types/enums.ts +16 -0
- package/src/types/fp.ts +50 -0
- package/src/types/rfcdate.ts +54 -0
- package/src/types/streams.ts +21 -0
- package/tsconfig.json +36 -0
- package/worker-configuration.d.ts +8489 -0
- 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
|
+
}
|