@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,429 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Portal Lookup Hook for eGain MCP Server
|
|
3
|
+
* Translates portal names to portal IDs in request parameters before sending requests
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { BeforeRequestHook, BeforeRequestContext } from "./types.js";
|
|
7
|
+
import { PortalCacheHook } from "./portal-cache-hook.js";
|
|
8
|
+
|
|
9
|
+
export class PortalLookupHook implements BeforeRequestHook {
|
|
10
|
+
constructor(private portalCache: PortalCacheHook) {}
|
|
11
|
+
|
|
12
|
+
private translatePortalName(portalName: string): string | null {
|
|
13
|
+
// Skip if it's already a numeric ID
|
|
14
|
+
if (/^\d+$/.test(portalName)) {
|
|
15
|
+
return null; // Already an ID, no translation needed
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// Check cache readiness using the same logic as beforeCreateRequest
|
|
19
|
+
const availablePortals = this.portalCache.getAvailablePortals();
|
|
20
|
+
const cacheInitialized = this.portalCache.isCacheInitialized();
|
|
21
|
+
const cacheReady = cacheInitialized || availablePortals.length > 0;
|
|
22
|
+
|
|
23
|
+
if (!cacheReady) {
|
|
24
|
+
const isInitializing = this.portalCache.isCacheInitializing();
|
|
25
|
+
if (isInitializing) {
|
|
26
|
+
console.error(`⚠️ LOOKUP: Portal cache still initializing, cannot translate portal name: "${portalName}"`);
|
|
27
|
+
console.error('💡 LOOKUP: Race condition detected - cache initialization in progress');
|
|
28
|
+
} else {
|
|
29
|
+
console.error(`⚠️ LOOKUP: Portal cache not ready, cannot translate portal name: "${portalName}"`);
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Try exact match first
|
|
35
|
+
let portalId = this.portalCache.getPortalId(portalName);
|
|
36
|
+
|
|
37
|
+
if (portalId) {
|
|
38
|
+
console.error(`✅ LOOKUP: Exact match found "${portalName}" -> "${portalId}"`);
|
|
39
|
+
return portalId;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Try fuzzy matching if exact match fails
|
|
43
|
+
portalId = this.fuzzyMatchPortal(portalName, availablePortals);
|
|
44
|
+
|
|
45
|
+
if (portalId) {
|
|
46
|
+
console.error(`✅ LOOKUP: Fuzzy match found for "${portalName}" -> "${portalId}"`);
|
|
47
|
+
} else {
|
|
48
|
+
console.error(`⚠️ LOOKUP: Portal name "${portalName}" not found in cache. Available portals:`,
|
|
49
|
+
availablePortals.map(p => p.name).join(', '));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return portalId;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
private fuzzyMatchPortal(searchName: string, availablePortals: Array<{id: string, name: string}>): string | null {
|
|
56
|
+
const normalizedSearch = searchName.toLowerCase().trim();
|
|
57
|
+
|
|
58
|
+
// Remove common suffixes/prefixes that might differ
|
|
59
|
+
const cleanSearch = normalizedSearch
|
|
60
|
+
.replace(/\s*portal\s*$/i, '')
|
|
61
|
+
.replace(/^portal\s*/i, '')
|
|
62
|
+
.trim();
|
|
63
|
+
|
|
64
|
+
for (const portal of availablePortals) {
|
|
65
|
+
const normalizedPortal = portal.name.toLowerCase().trim();
|
|
66
|
+
const cleanPortal = normalizedPortal
|
|
67
|
+
.replace(/\s*portal\s*$/i, '')
|
|
68
|
+
.replace(/^portal\s*/i, '')
|
|
69
|
+
.trim();
|
|
70
|
+
|
|
71
|
+
// Try various matching strategies
|
|
72
|
+
if (
|
|
73
|
+
// Exact match after cleaning
|
|
74
|
+
cleanSearch === cleanPortal ||
|
|
75
|
+
// Contains match (search contains portal name or vice versa)
|
|
76
|
+
cleanSearch.includes(cleanPortal) ||
|
|
77
|
+
cleanPortal.includes(cleanSearch) ||
|
|
78
|
+
// Partial word match
|
|
79
|
+
this.wordsMatch(cleanSearch, cleanPortal)
|
|
80
|
+
) {
|
|
81
|
+
console.error(`🎯 LOOKUP: Fuzzy matched "${searchName}" -> "${portal.name}" (${portal.id})`);
|
|
82
|
+
return portal.id;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
private wordsMatch(search: string, target: string): boolean {
|
|
90
|
+
const searchWords = search.split(/\s+/).filter(w => w.length > 2);
|
|
91
|
+
const targetWords = target.split(/\s+/).filter(w => w.length > 2);
|
|
92
|
+
|
|
93
|
+
// If either has significant words, check if any match
|
|
94
|
+
if (searchWords.length > 0 && targetWords.length > 0) {
|
|
95
|
+
return searchWords.some(sw =>
|
|
96
|
+
targetWords.some(tw =>
|
|
97
|
+
sw.includes(tw) || tw.includes(sw)
|
|
98
|
+
)
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Get default portal ID (only from cache, no hard-coded fallbacks)
|
|
106
|
+
private getDefaultPortalId(): string | null {
|
|
107
|
+
// Try common default portal names from cache only
|
|
108
|
+
const defaultPortalNames = ['Master Portal'];
|
|
109
|
+
|
|
110
|
+
for (const defaultName of defaultPortalNames) {
|
|
111
|
+
const portalId = this.translatePortalName(defaultName);
|
|
112
|
+
if (portalId) {
|
|
113
|
+
console.error(`🎯 LOOKUP: Using default portal "${defaultName}" -> ${portalId}`);
|
|
114
|
+
return portalId;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
console.error('⚠️ LOOKUP: No default portal found in cache');
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Get portal name from ID (reverse lookup)
|
|
123
|
+
private getPortalNameFromId(portalId: string): string | null {
|
|
124
|
+
const availablePortals = this.portalCache.getAvailablePortals();
|
|
125
|
+
for (const portal of availablePortals) {
|
|
126
|
+
if (portal.id === portalId) {
|
|
127
|
+
return portal.name;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
async beforeRequest(_hookCtx: BeforeRequestContext, request: Request): Promise<Request> {
|
|
136
|
+
// console.error('🔍 LOOKUP: ===== PORTAL LOOKUP HOOK TRIGGERED =====');
|
|
137
|
+
// console.error('🔍 LOOKUP: Request URL:', request.url);
|
|
138
|
+
// console.error('🔍 LOOKUP: Request method:', request.method);
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
// Check if cache is ready (should be ready from SDKInit)
|
|
142
|
+
|
|
143
|
+
// Check if URL contains portal name in path (e.g., /portals/{portalName}/)
|
|
144
|
+
const urlObj = new URL(request.url);
|
|
145
|
+
// console.error('🔍 LOOKUP: Full URL:', request.url);
|
|
146
|
+
// console.error('🔍 LOOKUP: URL pathname:', urlObj.pathname);
|
|
147
|
+
// console.error('🔍 LOOKUP: Testing regex /\\/portals\\/([^\\/]+)/ against pathname...');
|
|
148
|
+
|
|
149
|
+
const portalPathMatch = urlObj.pathname.match(/\/portals\/([^\/]+)/);
|
|
150
|
+
// console.error('🔍 LOOKUP: Regex match result:', portalPathMatch);
|
|
151
|
+
|
|
152
|
+
if (portalPathMatch && portalPathMatch[1]) {
|
|
153
|
+
const portalNameInPath = portalPathMatch[1];
|
|
154
|
+
|
|
155
|
+
// Check if it's already a proper portal ID
|
|
156
|
+
const portalIdPattern = /^[a-zA-Z0-9]{2,4}-\d{4,15}$/;
|
|
157
|
+
if (!portalIdPattern.test(portalNameInPath)) {
|
|
158
|
+
console.error(`🔍 LOOKUP: Portal name "${portalNameInPath}" in URL path needs translation...`);
|
|
159
|
+
|
|
160
|
+
// Get cache info
|
|
161
|
+
const availablePortals = this.portalCache.getAvailablePortals();
|
|
162
|
+
const cacheInitialized = this.portalCache.isCacheInitialized();
|
|
163
|
+
const cacheReady = cacheInitialized || availablePortals.length > 0;
|
|
164
|
+
|
|
165
|
+
if (!cacheReady) {
|
|
166
|
+
console.error(`⚠️ LOOKUP: Cache not ready, cannot translate portal name "${portalNameInPath}" from URL path`);
|
|
167
|
+
// Don't return here - let it continue to wait for cache initialization
|
|
168
|
+
} else {
|
|
169
|
+
const translatedPortalId = this.translatePortalName(portalNameInPath);
|
|
170
|
+
if (translatedPortalId) {
|
|
171
|
+
console.error(`🔄 LOOKUP: SUCCESS! Translating URL path: "${portalNameInPath}" -> "${translatedPortalId}"`);
|
|
172
|
+
|
|
173
|
+
// Replace portal name in URL path with portal ID
|
|
174
|
+
const newPathname = urlObj.pathname.replace(`/portals/${portalNameInPath}`, `/portals/${translatedPortalId}`);
|
|
175
|
+
urlObj.pathname = newPathname;
|
|
176
|
+
|
|
177
|
+
console.error(`🔄 LOOKUP: Original URL: ${request.url}`);
|
|
178
|
+
console.error(`🔄 LOOKUP: Modified URL: ${urlObj.toString()}`);
|
|
179
|
+
|
|
180
|
+
// Create new request with modified URL
|
|
181
|
+
const newRequest = new Request(urlObj.toString(), {
|
|
182
|
+
method: request.method,
|
|
183
|
+
headers: request.headers,
|
|
184
|
+
body: request.body
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
console.error(`🔄 LOOKUP: ===== RETURNING MODIFIED REQUEST (URL PATH) =====`);
|
|
188
|
+
return newRequest;
|
|
189
|
+
} else {
|
|
190
|
+
console.error(`❌ LOOKUP: Failed to translate portal name "${portalNameInPath}" from URL path`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
} else {
|
|
194
|
+
console.error(`✅ LOOKUP: Portal ID "${portalNameInPath}" in URL path already in correct format`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// If cache is initializing, wait for it to complete
|
|
199
|
+
if (this.portalCache.isCacheInitializing()) {
|
|
200
|
+
console.error('⏳ LOOKUP: Cache is initializing, waiting for completion...');
|
|
201
|
+
await this.portalCache.waitForCacheInitialization();
|
|
202
|
+
console.error('✅ LOOKUP: Cache initialization completed');
|
|
203
|
+
|
|
204
|
+
// Re-check URL translation now that cache is ready
|
|
205
|
+
const portalPathMatch = urlObj.pathname.match(/\/portals\/([^\/]+)/);
|
|
206
|
+
if (portalPathMatch && portalPathMatch[1]) {
|
|
207
|
+
const portalNameInPath = portalPathMatch[1];
|
|
208
|
+
const portalIdPattern = /^[a-zA-Z0-9]{2,4}-\d{4,15}$/;
|
|
209
|
+
|
|
210
|
+
if (!portalIdPattern.test(portalNameInPath)) {
|
|
211
|
+
console.error(`🔄 LOOKUP: Re-checking URL translation after cache initialization for: "${portalNameInPath}"`);
|
|
212
|
+
|
|
213
|
+
const translatedPortalId = this.translatePortalName(portalNameInPath);
|
|
214
|
+
if (translatedPortalId) {
|
|
215
|
+
console.error(`🔄 LOOKUP: SUCCESS! Post-cache translating URL path: "${portalNameInPath}" -> "${translatedPortalId}"`);
|
|
216
|
+
|
|
217
|
+
// Replace portal name in URL path with portal ID
|
|
218
|
+
const newPathname = urlObj.pathname.replace(`/portals/${portalNameInPath}`, `/portals/${translatedPortalId}`);
|
|
219
|
+
urlObj.pathname = newPathname;
|
|
220
|
+
|
|
221
|
+
console.error(`🔄 LOOKUP: Original URL: ${request.url}`);
|
|
222
|
+
console.error(`🔄 LOOKUP: Modified URL: ${urlObj.toString()}`);
|
|
223
|
+
|
|
224
|
+
// Create new request with modified URL
|
|
225
|
+
const newRequest = new Request(urlObj.toString(), {
|
|
226
|
+
method: request.method,
|
|
227
|
+
headers: request.headers,
|
|
228
|
+
body: request.body
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
// console.error(`🔄 LOOKUP: ===== RETURNING MODIFIED REQUEST (POST-CACHE) =====`);
|
|
232
|
+
return newRequest;
|
|
233
|
+
} else {
|
|
234
|
+
console.error(`❌ LOOKUP: Post-cache translation failed for portal name "${portalNameInPath}"`);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
const availablePortals = this.portalCache.getAvailablePortals();
|
|
241
|
+
const cacheReady = this.portalCache.isCacheInitialized() || availablePortals.length > 0;
|
|
242
|
+
|
|
243
|
+
if (!cacheReady) {
|
|
244
|
+
console.error('⚠️ LOOKUP: Portal cache not ready, using fallback behavior');
|
|
245
|
+
console.error('💡 LOOKUP: Will use portalId as-is and attempt minimal translation');
|
|
246
|
+
// Don't return early - try to do what we can with the request
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
console.error(`📂 LOOKUP: Portal cache ready with ${availablePortals.length} portals, proceeding with translation`);
|
|
250
|
+
|
|
251
|
+
// Process request body for portal name translation
|
|
252
|
+
if (request.headers.get('content-type')?.includes('application/json')) {
|
|
253
|
+
try {
|
|
254
|
+
// Clone the request to avoid "already used" error
|
|
255
|
+
const clonedRequest = request.clone();
|
|
256
|
+
const body = await clonedRequest.text();
|
|
257
|
+
if (body.trim().startsWith('{') || body.trim().startsWith('[')) {
|
|
258
|
+
const parsedJson = JSON.parse(body);
|
|
259
|
+
let bodyModified = false;
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
// Check for both portalID (uppercase D) and portalId (lowercase d)
|
|
263
|
+
const currentPortalId = parsedJson.portalID || parsedJson.portalId;
|
|
264
|
+
|
|
265
|
+
// Log current portal lookup context
|
|
266
|
+
if (parsedJson.channel && parsedJson.channel.name) {
|
|
267
|
+
console.error(`🎯 LOOKUP: Portal name detected in channel.name: "${parsedJson.channel.name}"`);
|
|
268
|
+
} else if (parsedJson.channel && parsedJson.channel.type === 'portal') {
|
|
269
|
+
console.error(`⚠️ LOOKUP: Channel type is "portal" but no channel.name provided for lookup`);
|
|
270
|
+
} else {
|
|
271
|
+
console.error(`📋 LOOKUP: No portal name in channel.name, will use portalID as-is: ${currentPortalId}`);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// Process portal_name in JSON body
|
|
275
|
+
if (parsedJson.portal_name && typeof parsedJson.portal_name === 'string') {
|
|
276
|
+
const portalId = this.translatePortalName(parsedJson.portal_name);
|
|
277
|
+
if (portalId) {
|
|
278
|
+
console.error(`🔄 LOOKUP: Translated JSON field portal_name: "${parsedJson.portal_name}" -> portal_id: "${portalId}"`);
|
|
279
|
+
parsedJson.portal_id = portalId;
|
|
280
|
+
delete parsedJson.portal_name;
|
|
281
|
+
bodyModified = true;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// Process portalID field (MCP tools use uppercase D)
|
|
286
|
+
|
|
287
|
+
if (parsedJson.portalID && typeof parsedJson.portalID === 'string') {
|
|
288
|
+
|
|
289
|
+
// Check if portalID doesn't match the expected pattern (prefix-digits)
|
|
290
|
+
const portalIdPattern = /^[a-zA-Z0-9]{2,4}-\d{4,15}$/;
|
|
291
|
+
const patternMatches = portalIdPattern.test(parsedJson.portalID);
|
|
292
|
+
|
|
293
|
+
if (!patternMatches) {
|
|
294
|
+
|
|
295
|
+
const translatedPortalId = this.translatePortalName(parsedJson.portalID);
|
|
296
|
+
console.error(`🔍 LOOKUP: Translation result: "${translatedPortalId}"`);
|
|
297
|
+
|
|
298
|
+
if (translatedPortalId) {
|
|
299
|
+
console.error(`🔄 LOOKUP: SUCCESS! Translated portalID: "${parsedJson.portalID}" -> "${translatedPortalId}"`);
|
|
300
|
+
console.error(`🔄 LOOKUP: BEFORE assignment - parsedJson.portalID = "${parsedJson.portalID}"`);
|
|
301
|
+
parsedJson.portalID = translatedPortalId;
|
|
302
|
+
console.error(`🔄 LOOKUP: AFTER assignment - parsedJson.portalID = "${parsedJson.portalID}"`);
|
|
303
|
+
bodyModified = true;
|
|
304
|
+
console.error(`🔄 LOOKUP: bodyModified set to: ${bodyModified}`);
|
|
305
|
+
} else {
|
|
306
|
+
console.error(`❌ LOOKUP: Failed to translate portalID "${parsedJson.portalID}". Available portals: ${availablePortals.map(p => p.name).slice(0, 5).join(', ')}${availablePortals.length > 5 ? '...' : ''}`);
|
|
307
|
+
}
|
|
308
|
+
} else {
|
|
309
|
+
console.error(`✅ LOOKUP: portalID "${parsedJson.portalID}" already in correct format, no translation needed`);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// Process portalId field (lowercase d for compatibility)
|
|
314
|
+
if (parsedJson.portalId && typeof parsedJson.portalId === 'string') {
|
|
315
|
+
// Check if portalId doesn't match the expected pattern (prefix-digits)
|
|
316
|
+
const portalIdPattern = /^[a-zA-Z0-9]{2,4}-\d{4,15}$/;
|
|
317
|
+
if (!portalIdPattern.test(parsedJson.portalId)) {
|
|
318
|
+
console.error(`🔍 LOOKUP: portalId "${parsedJson.portalId}" doesn't match expected pattern, attempting translation...`);
|
|
319
|
+
const translatedPortalId = this.translatePortalName(parsedJson.portalId);
|
|
320
|
+
if (translatedPortalId) {
|
|
321
|
+
console.error(`🔄 LOOKUP: Translated portalId: "${parsedJson.portalId}" -> "${translatedPortalId}"`);
|
|
322
|
+
parsedJson.portalId = translatedPortalId;
|
|
323
|
+
bodyModified = true;
|
|
324
|
+
} else {
|
|
325
|
+
console.error(`❌ LOOKUP: Failed to translate portalId "${parsedJson.portalId}". Available portals: ${availablePortals.map(p => p.name).slice(0, 5).join(', ')}${availablePortals.length > 5 ? '...' : ''}`);
|
|
326
|
+
}
|
|
327
|
+
} else {
|
|
328
|
+
console.error(`✅ LOOKUP: portalId "${parsedJson.portalId}" already in correct format, no translation needed`);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// Process channel.name in JSON body (for eGain requests)
|
|
333
|
+
if (parsedJson.channel &&
|
|
334
|
+
typeof parsedJson.channel === 'object' &&
|
|
335
|
+
parsedJson.channel.name &&
|
|
336
|
+
typeof parsedJson.channel.name === 'string') {
|
|
337
|
+
const portalId = this.translatePortalName(parsedJson.channel.name);
|
|
338
|
+
if (portalId) {
|
|
339
|
+
console.error(`🔄 LOOKUP: Translated JSON field channel.name: "${parsedJson.channel.name}" -> portalId: "${portalId}"`);
|
|
340
|
+
parsedJson.portalId = portalId;
|
|
341
|
+
bodyModified = true;
|
|
342
|
+
} else {
|
|
343
|
+
console.error(`❌ LOOKUP: Failed to translate portal name "${parsedJson.channel.name}". Available portals: ${availablePortals.map(p => p.name).slice(0, 5).join(', ')}${availablePortals.length > 5 ? '...' : ''}`);
|
|
344
|
+
console.error(`💡 LOOKUP: Make sure the portal name matches exactly or use fuzzy matching patterns`);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
// Process portalId if it's 1 (default/placeholder) and we have channel info
|
|
349
|
+
if (parsedJson.portalId === 1 &&
|
|
350
|
+
parsedJson.channel &&
|
|
351
|
+
typeof parsedJson.channel === 'object' &&
|
|
352
|
+
parsedJson.channel.name &&
|
|
353
|
+
typeof parsedJson.channel.name === 'string') {
|
|
354
|
+
const portalId = this.translatePortalName(parsedJson.channel.name);
|
|
355
|
+
if (portalId) {
|
|
356
|
+
console.error(`🔄 LOOKUP: Replaced default portalId: 1 with "${parsedJson.channel.name}" -> portalId: "${portalId}"`);
|
|
357
|
+
parsedJson.portalId = portalId;
|
|
358
|
+
bodyModified = true;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// Handle case where channel.type is "portal" but no channel.name is provided
|
|
363
|
+
if (parsedJson.portalId === 1 &&
|
|
364
|
+
parsedJson.channel &&
|
|
365
|
+
typeof parsedJson.channel === 'object' &&
|
|
366
|
+
parsedJson.channel.type === 'portal' &&
|
|
367
|
+
!parsedJson.channel.name) {
|
|
368
|
+
console.error('⚠️ LOOKUP: Portal type="portal" specified but no channel.name provided for lookup');
|
|
369
|
+
if (cacheReady) {
|
|
370
|
+
// Try to get a default portal from cache
|
|
371
|
+
const portalId = this.getDefaultPortalId();
|
|
372
|
+
if (portalId) {
|
|
373
|
+
const portalName = this.getPortalNameFromId(portalId) || 'Default Portal';
|
|
374
|
+
console.error(`🔄 LOOKUP: No portal name provided, using default portal: "${portalName}" -> portalId: "${portalId}"`);
|
|
375
|
+
parsedJson.portalId = portalId;
|
|
376
|
+
// Also set the channel name for clarity
|
|
377
|
+
parsedJson.channel.name = portalName;
|
|
378
|
+
bodyModified = true;
|
|
379
|
+
} else {
|
|
380
|
+
console.error('❌ LOOKUP: No portal name provided and no default portal available in cache');
|
|
381
|
+
console.error('💡 LOOKUP: Please specify channel.name with a valid portal name (e.g., "eBrain")');
|
|
382
|
+
}
|
|
383
|
+
} else {
|
|
384
|
+
// Cache not ready - cannot proceed without cache
|
|
385
|
+
console.error('❌ LOOKUP: Cache not ready and no default portal available');
|
|
386
|
+
console.error('💡 LOOKUP: Portal cache must be initialized before making requests');
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
// Handle case where portalId is a placeholder value (like 100) that needs translation
|
|
391
|
+
if ((parsedJson.portalId === 100 || parsedJson.portalId === 1) &&
|
|
392
|
+
parsedJson.channel &&
|
|
393
|
+
typeof parsedJson.channel === 'object' &&
|
|
394
|
+
parsedJson.channel.type === 'portal' &&
|
|
395
|
+
!cacheReady) {
|
|
396
|
+
console.error('❌ LOOKUP: Cache not ready and portalId needs translation - cannot proceed without cache');
|
|
397
|
+
console.error('💡 LOOKUP: Please ensure portal cache is initialized before making requests');
|
|
398
|
+
// Don't use hardcoded fallbacks - let the request fail properly
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
if (bodyModified) {
|
|
402
|
+
const newBody = JSON.stringify(parsedJson);
|
|
403
|
+
// console.error(`🔄 LOOKUP: ===== REQUEST BODY MODIFIED =====`);
|
|
404
|
+
// console.error(`🔄 LOOKUP: Original body: ${body}`);
|
|
405
|
+
// console.error(`🔄 LOOKUP: Modified body: ${newBody}`);
|
|
406
|
+
// console.error(`🔄 LOOKUP: Creating new request with modified body...`);
|
|
407
|
+
|
|
408
|
+
const newRequest = new Request(request.url, {
|
|
409
|
+
method: request.method,
|
|
410
|
+
headers: request.headers,
|
|
411
|
+
body: newBody
|
|
412
|
+
});
|
|
413
|
+
|
|
414
|
+
console.error(`🔄 LOOKUP: ===== RETURNING MODIFIED REQUEST =====`);
|
|
415
|
+
return newRequest;
|
|
416
|
+
} else {
|
|
417
|
+
// console.error(`🔄 LOOKUP: No modifications made to request body`);
|
|
418
|
+
// console.error('⚠️ Request body NOT modified. Final request will use original portalId:', parsedJson.portalId || parsedJson.portalID);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
} catch (error) {
|
|
422
|
+
console.error('Failed to parse JSON body for portal translation:', error);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
console.error(`🔄 LOOKUP: ===== RETURNING ORIGINAL REQUEST =====`);
|
|
427
|
+
return request;
|
|
428
|
+
}
|
|
429
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Hooks } from "./types.js";
|
|
2
|
+
import { AuthenticationHook } from "./auth-hook.js";
|
|
3
|
+
import { PortalCacheHook } from "./portal-cache-hook.js";
|
|
4
|
+
import { PortalLookupHook } from "./portal-lookup-hook.js";
|
|
5
|
+
import { ServerRoutingHook } from "./server-routing-hook.js";
|
|
6
|
+
|
|
7
|
+
/*
|
|
8
|
+
* This file is only ever generated once on the first generation and then is free to be modified.
|
|
9
|
+
* Any hooks you wish to add should be registered in the initHooks function. Feel free to define them
|
|
10
|
+
* in this file or in separate files in the hooks folder.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
export function initHooks(hooks: Hooks) {
|
|
14
|
+
console.error('🚀 Initializing eGain MCP hooks...');
|
|
15
|
+
|
|
16
|
+
// 1. Server Routing Hook - routes operations to correct API server
|
|
17
|
+
// Register this FIRST before request creation so URLs are correct from the start
|
|
18
|
+
const serverRoutingHook = new ServerRoutingHook();
|
|
19
|
+
hooks.registerBeforeCreateRequestHook(serverRoutingHook);
|
|
20
|
+
console.error('✅ ROUTING: Registered server routing hook for before create request');
|
|
21
|
+
|
|
22
|
+
// 2. Portal Cache Hook - caches portal names/IDs after authentication
|
|
23
|
+
// Create this so we can pass it to the auth hook
|
|
24
|
+
const portalCacheHook = new PortalCacheHook();
|
|
25
|
+
hooks.registerSDKInitHook(portalCacheHook); // Handles full initialization
|
|
26
|
+
hooks.registerBeforeCreateRequestHook(portalCacheHook); // Synchronous readiness check only
|
|
27
|
+
console.error('✅ CACHE: Registered portal cache hook for SDK init and before create request');
|
|
28
|
+
|
|
29
|
+
// 3. Authentication Hook - handles login popup and token management
|
|
30
|
+
// Pass portal cache hook reference so it can trigger cache initialization after auth
|
|
31
|
+
const authHook = new AuthenticationHook(portalCacheHook);
|
|
32
|
+
hooks.registerSDKInitHook(authHook);
|
|
33
|
+
hooks.registerBeforeRequestHook(authHook); // Register for automatic token refresh
|
|
34
|
+
console.error('✅ AUTH: Registered authentication hook for SDK init and before request');
|
|
35
|
+
|
|
36
|
+
// 4. Portal Lookup Hook - translates portal names to IDs in requests
|
|
37
|
+
// Now synchronous since cache is guaranteed ready after SDKInit
|
|
38
|
+
const portalLookupHook = new PortalLookupHook(portalCacheHook);
|
|
39
|
+
hooks.registerBeforeRequestHook(portalLookupHook); // Should be mostly synchronous now
|
|
40
|
+
console.error('✅ LOOKUP: Registered portal lookup hook for before request');
|
|
41
|
+
|
|
42
|
+
console.error('🎉 All eGain MCP hooks registered successfully!');
|
|
43
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { BeforeCreateRequestContext, BeforeCreateRequestHook } from "./types.js";
|
|
2
|
+
import { RequestInput } from "../lib/http.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Server Routing Hook
|
|
6
|
+
*
|
|
7
|
+
* Automatically routes operations to the correct API server:
|
|
8
|
+
* - Most operations → Portal Manager API (server_0): /knowledge/portalmgr/v4
|
|
9
|
+
* - Answers & Retrieve → AI Services API (server_1): /core/aiservices/v4
|
|
10
|
+
*
|
|
11
|
+
* Why this hook exists:
|
|
12
|
+
* Speakeasy doesn't support automatic per-operation server routing.
|
|
13
|
+
* Using operation-level servers in the OpenAPI spec breaks the --api-domain flag.
|
|
14
|
+
* This hook provides transparent routing while keeping --api-domain functional.
|
|
15
|
+
*/
|
|
16
|
+
export class ServerRoutingHook implements BeforeCreateRequestHook {
|
|
17
|
+
// Operations that need AI Services API
|
|
18
|
+
private readonly aiServicesOperations = new Set([
|
|
19
|
+
"post_/{portalID}/answers",
|
|
20
|
+
"post_/{portalID}/retrieve",
|
|
21
|
+
]);
|
|
22
|
+
|
|
23
|
+
beforeCreateRequest(
|
|
24
|
+
hookCtx: BeforeCreateRequestContext,
|
|
25
|
+
input: RequestInput
|
|
26
|
+
): RequestInput {
|
|
27
|
+
const operationID = hookCtx.operationID;
|
|
28
|
+
|
|
29
|
+
// Check if this operation needs AI Services API
|
|
30
|
+
if (this.aiServicesOperations.has(operationID)) {
|
|
31
|
+
console.error(`🔀 ROUTING: Operation "${operationID}" → AI Services API (/core/aiservices/v4)`);
|
|
32
|
+
|
|
33
|
+
// Parse the URL
|
|
34
|
+
const url = new URL(input.url);
|
|
35
|
+
|
|
36
|
+
// Replace Portal Manager path with AI Services path
|
|
37
|
+
if (url.pathname.includes('/knowledge/portalmgr/v4')) {
|
|
38
|
+
url.pathname = url.pathname.replace(
|
|
39
|
+
'/knowledge/portalmgr/v4',
|
|
40
|
+
'/core/aiservices/v4'
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
console.error(`🔀 ROUTING: Rewritten URL: ${url.toString()}`);
|
|
44
|
+
|
|
45
|
+
return {
|
|
46
|
+
...input,
|
|
47
|
+
url,
|
|
48
|
+
};
|
|
49
|
+
} else {
|
|
50
|
+
console.error(`⚠️ ROUTING: Expected /knowledge/portalmgr/v4 in URL but found: ${url.pathname}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// All other operations stay on Portal Manager API (default)
|
|
55
|
+
return input;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { SDKOptions } from "../lib/config.js";
|
|
6
|
+
import { RequestInput } from "../lib/http.js";
|
|
7
|
+
import { RetryConfig } from "../lib/retries.js";
|
|
8
|
+
import { SecurityState } from "../lib/security.js";
|
|
9
|
+
|
|
10
|
+
export type HookContext = {
|
|
11
|
+
baseURL: string | URL;
|
|
12
|
+
operationID: string;
|
|
13
|
+
oAuth2Scopes: string[] | null;
|
|
14
|
+
securitySource?: any | (() => Promise<any>);
|
|
15
|
+
retryConfig: RetryConfig;
|
|
16
|
+
resolvedSecurity: SecurityState | null;
|
|
17
|
+
options: SDKOptions;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export type Awaitable<T> = T | Promise<T>;
|
|
21
|
+
|
|
22
|
+
export type BeforeCreateRequestContext = HookContext & {};
|
|
23
|
+
export type BeforeRequestContext = HookContext & {};
|
|
24
|
+
export type AfterSuccessContext = HookContext & {};
|
|
25
|
+
export type AfterErrorContext = HookContext & {};
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* SDKInitHook is called when the SDK is initializing. The
|
|
29
|
+
* hook can return a new baseURL and HTTP client to be used by the SDK.
|
|
30
|
+
*/
|
|
31
|
+
export interface SDKInitHook {
|
|
32
|
+
sdkInit: (opts: SDKOptions) => SDKOptions;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface BeforeCreateRequestHook {
|
|
36
|
+
/**
|
|
37
|
+
* A hook that is called before the SDK creates a `Request` object. The hook
|
|
38
|
+
* can modify how a request is constructed since certain modifications, like
|
|
39
|
+
* changing the request URL, cannot be done on a request object directly.
|
|
40
|
+
*/
|
|
41
|
+
beforeCreateRequest: (
|
|
42
|
+
hookCtx: BeforeCreateRequestContext,
|
|
43
|
+
input: RequestInput,
|
|
44
|
+
) => RequestInput;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface BeforeRequestHook {
|
|
48
|
+
/**
|
|
49
|
+
* A hook that is called before the SDK sends a request. The hook can
|
|
50
|
+
* introduce instrumentation code such as logging, tracing and metrics or
|
|
51
|
+
* replace the request before it is sent or throw an error to stop the
|
|
52
|
+
* request from being sent.
|
|
53
|
+
*/
|
|
54
|
+
beforeRequest: (
|
|
55
|
+
hookCtx: BeforeRequestContext,
|
|
56
|
+
request: Request,
|
|
57
|
+
) => Awaitable<Request>;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export interface AfterSuccessHook {
|
|
61
|
+
/**
|
|
62
|
+
* A hook that is called after the SDK receives a response. The hook can
|
|
63
|
+
* introduce instrumentation code such as logging, tracing and metrics or
|
|
64
|
+
* modify the response before it is handled or throw an error to stop the
|
|
65
|
+
* response from being handled.
|
|
66
|
+
*/
|
|
67
|
+
afterSuccess: (
|
|
68
|
+
hookCtx: AfterSuccessContext,
|
|
69
|
+
response: Response,
|
|
70
|
+
) => Awaitable<Response>;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export interface AfterErrorHook {
|
|
74
|
+
/**
|
|
75
|
+
* A hook that is called after the SDK encounters an error, or a
|
|
76
|
+
* non-successful response. The hook can introduce instrumentation code such
|
|
77
|
+
* as logging, tracing and metrics or modify the response or error values.
|
|
78
|
+
*/
|
|
79
|
+
afterError: (
|
|
80
|
+
hookCtx: AfterErrorContext,
|
|
81
|
+
response: Response | null,
|
|
82
|
+
error: unknown,
|
|
83
|
+
) => Awaitable<{
|
|
84
|
+
response: Response | null;
|
|
85
|
+
error: unknown;
|
|
86
|
+
}>;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export interface Hooks {
|
|
90
|
+
/** Registers a hook to be used by the SDK for initialization event. */
|
|
91
|
+
registerSDKInitHook(hook: SDKInitHook): void;
|
|
92
|
+
/** Registers a hook to be used by the SDK for to modify `Request` construction. */
|
|
93
|
+
registerBeforeCreateRequestHook(hook: BeforeCreateRequestHook): void;
|
|
94
|
+
/** Registers a hook to be used by the SDK for the before request event. */
|
|
95
|
+
registerBeforeRequestHook(hook: BeforeRequestHook): void;
|
|
96
|
+
/** Registers a hook to be used by the SDK for the after success event. */
|
|
97
|
+
registerAfterSuccessHook(hook: AfterSuccessHook): void;
|
|
98
|
+
/** Registers a hook to be used by the SDK for the after error event. */
|
|
99
|
+
registerAfterErrorHook(hook: AfterErrorHook): void;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export type Hook =
|
|
103
|
+
| SDKInitHook
|
|
104
|
+
| BeforeCreateRequestHook
|
|
105
|
+
| BeforeRequestHook
|
|
106
|
+
| AfterSuccessHook
|
|
107
|
+
| AfterErrorHook;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import * as z from "zod";
|
|
6
|
+
|
|
7
|
+
export function bytesToBase64(u8arr: Uint8Array): string {
|
|
8
|
+
return btoa(String.fromCodePoint(...u8arr));
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function bytesFromBase64(encoded: string): Uint8Array {
|
|
12
|
+
return Uint8Array.from(atob(encoded), (c) => c.charCodeAt(0));
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function stringToBytes(str: string): Uint8Array {
|
|
16
|
+
return new TextEncoder().encode(str);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function stringFromBytes(u8arr: Uint8Array): string {
|
|
20
|
+
return new TextDecoder().decode(u8arr);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function stringToBase64(str: string): string {
|
|
24
|
+
return bytesToBase64(stringToBytes(str));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function stringFromBase64(b64str: string): string {
|
|
28
|
+
return stringFromBytes(bytesFromBase64(b64str));
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export const zodOutbound = z
|
|
32
|
+
.instanceof(Uint8Array)
|
|
33
|
+
.or(z.string().transform(stringToBytes));
|
|
34
|
+
|
|
35
|
+
export const zodInbound = z
|
|
36
|
+
.instanceof(Uint8Array)
|
|
37
|
+
.or(z.string().transform(bytesFromBase64));
|