@intuned/browser-dev 2.2.3-test-build.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/.babelrc +21 -0
  2. package/.eslintignore +10 -0
  3. package/.eslintrc.js +39 -0
  4. package/LICENSE +43 -0
  5. package/dist/ai/export.d.js +5 -0
  6. package/dist/ai/export.d.ts +641 -0
  7. package/dist/ai/extractStructuredData.js +320 -0
  8. package/dist/ai/extractStructuredDataUsingAi.js +139 -0
  9. package/dist/ai/extractionHelpers/screenshotHelpers.js +56 -0
  10. package/dist/ai/extractionHelpers/validateSchema.js +148 -0
  11. package/dist/ai/index.d.ts +641 -0
  12. package/dist/ai/index.js +19 -0
  13. package/dist/ai/isPageLoaded.js +77 -0
  14. package/dist/ai/prompt.js +39 -0
  15. package/dist/ai/tests/testCheckAllTypesAreStrings.spec.js +137 -0
  16. package/dist/ai/tests/testExtractFromContent.spec.js +372 -0
  17. package/dist/ai/tests/testExtractStructuredData.spec.js +646 -0
  18. package/dist/ai/tests/testIsPageLoaded.spec.js +277 -0
  19. package/dist/ai/tools/index.js +48 -0
  20. package/dist/ai/types/errors.js +67 -0
  21. package/dist/ai/types/models.js +45 -0
  22. package/dist/ai/types/types.js +48 -0
  23. package/dist/ai/validators.js +167 -0
  24. package/dist/common/Logger/index.js +60 -0
  25. package/dist/common/Logger/types.js +5 -0
  26. package/dist/common/SdkError.js +50 -0
  27. package/dist/common/aiModelsValidations.js +32 -0
  28. package/dist/common/browser_scripts.js +2596 -0
  29. package/dist/common/ensureBrowserScripts.js +18 -0
  30. package/dist/common/extendedTest.js +148 -0
  31. package/dist/common/extractionHelpers.js +19 -0
  32. package/dist/common/formatZodError.js +18 -0
  33. package/dist/common/fuzzySearch/fuzzySearch.test.js +250 -0
  34. package/dist/common/fuzzySearch/levenshtein-search.js +298 -0
  35. package/dist/common/fuzzySearch/utils.js +23 -0
  36. package/dist/common/getModelProvider.js +18 -0
  37. package/dist/common/getSimplifiedHtml.js +122 -0
  38. package/dist/common/hashObject.js +32 -0
  39. package/dist/common/html2markdown/convertElementToMarkdown.js +469 -0
  40. package/dist/common/html2markdown/index.js +19 -0
  41. package/dist/common/jwtTokenManager.js +18 -0
  42. package/dist/common/loadRuntime.js +16 -0
  43. package/dist/common/locatorHelpers.js +41 -0
  44. package/dist/common/matching/collectStrings.js +32 -0
  45. package/dist/common/matching/levenshtein.js +40 -0
  46. package/dist/common/matching/matching.js +317 -0
  47. package/dist/common/matching/types.js +1 -0
  48. package/dist/common/noEmpty.js +9 -0
  49. package/dist/common/saveSnapshotWithExamples.js +60 -0
  50. package/dist/common/tests/testEnsureBrowserScript.spec.js +31 -0
  51. package/dist/common/xpathMapping.js +107 -0
  52. package/dist/helpers/clickUntilExhausted.js +85 -0
  53. package/dist/helpers/downloadFile.js +125 -0
  54. package/dist/helpers/export.d.js +5 -0
  55. package/dist/helpers/export.d.ts +1220 -0
  56. package/dist/helpers/extractMarkdown.js +35 -0
  57. package/dist/helpers/filterEmptyValues.js +54 -0
  58. package/dist/helpers/gotoUrl.js +98 -0
  59. package/dist/helpers/index.d.ts +1220 -0
  60. package/dist/helpers/index.js +128 -0
  61. package/dist/helpers/processDate.js +25 -0
  62. package/dist/helpers/resolveUrl.js +64 -0
  63. package/dist/helpers/sanitizeHtml.js +74 -0
  64. package/dist/helpers/saveFileToS3.js +50 -0
  65. package/dist/helpers/scrollToLoadContent.js +57 -0
  66. package/dist/helpers/tests/extendedTest.js +130 -0
  67. package/dist/helpers/tests/testClickUntilExhausted.spec.js +387 -0
  68. package/dist/helpers/tests/testDownloadFile.spec.js +204 -0
  69. package/dist/helpers/tests/testExtractMarkdown.spec.js +290 -0
  70. package/dist/helpers/tests/testFilterEmptyValues.spec.js +151 -0
  71. package/dist/helpers/tests/testGoToUrl.spec.js +37 -0
  72. package/dist/helpers/tests/testProcessDate.spec.js +13 -0
  73. package/dist/helpers/tests/testResolveUrl.spec.js +341 -0
  74. package/dist/helpers/tests/testSanitizeHtml.spec.js +330 -0
  75. package/dist/helpers/tests/testScrollToLoadContent.spec.js +163 -0
  76. package/dist/helpers/tests/testValidateDataUsingSchema.spec.js +342 -0
  77. package/dist/helpers/tests/testWithDomSettledWait.spec.js +164 -0
  78. package/dist/helpers/tests/testWithNetworkIdleWait.spec.js +114 -0
  79. package/dist/helpers/types/Attachment.js +115 -0
  80. package/dist/helpers/types/CustomTypeRegistry.js +48 -0
  81. package/dist/helpers/types/RunEnvironment.js +18 -0
  82. package/dist/helpers/types/ValidationError.js +17 -0
  83. package/dist/helpers/types/index.js +51 -0
  84. package/dist/helpers/uploadFileToS3.js +154 -0
  85. package/dist/helpers/utils/getS3Client.js +22 -0
  86. package/dist/helpers/utils/index.js +73 -0
  87. package/dist/helpers/utils/isDownload.js +10 -0
  88. package/dist/helpers/utils/isGenerateCodeMode.js +9 -0
  89. package/dist/helpers/utils/isLocator.js +9 -0
  90. package/dist/helpers/utils/jwtTokenManager.js +18 -0
  91. package/dist/helpers/validateDataUsingSchema.js +103 -0
  92. package/dist/helpers/waitForDomSettled.js +90 -0
  93. package/dist/helpers/withNetworkSettledWait.js +91 -0
  94. package/dist/index.d.js +16 -0
  95. package/dist/index.d.ts +10 -0
  96. package/dist/index.js +16 -0
  97. package/dist/intunedServices/ApiGateway/aiApiGateway.js +99 -0
  98. package/dist/intunedServices/ApiGateway/factory.js +13 -0
  99. package/dist/intunedServices/ApiGateway/providers/Anthropic.js +26 -0
  100. package/dist/intunedServices/ApiGateway/providers/Gemini.js +29 -0
  101. package/dist/intunedServices/ApiGateway/providers/OpenAI.js +29 -0
  102. package/dist/intunedServices/ApiGateway/tests/testApiGateway.spec.js +224 -0
  103. package/dist/intunedServices/ApiGateway/types.js +11 -0
  104. package/dist/intunedServices/cache/cache.js +61 -0
  105. package/dist/intunedServices/cache/index.js +12 -0
  106. package/dist/intunedServices/cache/tests/testCache.spec.js +117 -0
  107. package/dist/optimized-extractors/common/buildExamplesPrompt.js +12 -0
  108. package/dist/optimized-extractors/common/buildImagesFromPage.js +55 -0
  109. package/dist/optimized-extractors/common/extractStructuredDataUsingClaude.js +135 -0
  110. package/dist/optimized-extractors/common/extractStructuredDataUsingGoogle.js +37 -0
  111. package/dist/optimized-extractors/common/extractStructuredDataUsingOpenAi.js +132 -0
  112. package/dist/optimized-extractors/common/extractStrucutredDataUsingAiInstance.js +122 -0
  113. package/dist/optimized-extractors/common/findTableHeaders.js +162 -0
  114. package/dist/optimized-extractors/common/index.js +55 -0
  115. package/dist/optimized-extractors/common/isTableHeaderOrFooter.js +84 -0
  116. package/dist/optimized-extractors/common/matching/matching.js +212 -0
  117. package/dist/optimized-extractors/common/matching/matching.test.js +655 -0
  118. package/dist/optimized-extractors/common/matching/types.js +18 -0
  119. package/dist/optimized-extractors/common/matching/utils.js +184 -0
  120. package/dist/optimized-extractors/common/utils.js +58 -0
  121. package/dist/optimized-extractors/export.d.js +5 -0
  122. package/dist/optimized-extractors/export.d.ts +397 -0
  123. package/dist/optimized-extractors/extractArray.js +120 -0
  124. package/dist/optimized-extractors/extractObject.js +104 -0
  125. package/dist/optimized-extractors/index.d.ts +397 -0
  126. package/dist/optimized-extractors/index.js +31 -0
  127. package/dist/optimized-extractors/listExtractionHelpers/__tests__/dynamicListExtractor.spec.js +312 -0
  128. package/dist/optimized-extractors/listExtractionHelpers/__tests__/findSetOfXpathsToCreateAnArrayExtractor.test.js +22 -0
  129. package/dist/optimized-extractors/listExtractionHelpers/__tests__/getContainerElement.test.js +21 -0
  130. package/dist/optimized-extractors/listExtractionHelpers/__tests__/partOfSameArrayXpath.test.js +42 -0
  131. package/dist/optimized-extractors/listExtractionHelpers/__tests__/verifyThatAllXpathsArePartOfSameArray.test.js +9 -0
  132. package/dist/optimized-extractors/listExtractionHelpers/dynamicListExtractor.js +152 -0
  133. package/dist/optimized-extractors/listExtractionHelpers/errors.js +46 -0
  134. package/dist/optimized-extractors/listExtractionHelpers/getListMatches.js +14 -0
  135. package/dist/optimized-extractors/listExtractionHelpers/runAiExtraction.js +240 -0
  136. package/dist/optimized-extractors/listExtractionHelpers/typesAndSchema.js +5 -0
  137. package/dist/optimized-extractors/listExtractionHelpers/utils/extractPropertiesUsingGPTFromArray.js +277 -0
  138. package/dist/optimized-extractors/listExtractionHelpers/utils/extractStructuredListUsingAi.js +44 -0
  139. package/dist/optimized-extractors/listExtractionHelpers/utils/getListContainerXpath.js +94 -0
  140. package/dist/optimized-extractors/listExtractionHelpers/utils/getRelativeContainerXpathSelector.js +20 -0
  141. package/dist/optimized-extractors/listExtractionHelpers/utils/getSimplifiedHtmlPerListItem.js +21 -0
  142. package/dist/optimized-extractors/listExtractionHelpers/utils/tablesUtils.js +48 -0
  143. package/dist/optimized-extractors/listExtractionHelpers/utils/validateOptions.js +52 -0
  144. package/dist/optimized-extractors/models/anthropicModel.js +23 -0
  145. package/dist/optimized-extractors/models/openaiModel.js +23 -0
  146. package/dist/optimized-extractors/objectExtractionHelpers/AIExtractors.js +73 -0
  147. package/dist/optimized-extractors/objectExtractionHelpers/__tests__/checksumUtils.test.js +103 -0
  148. package/dist/optimized-extractors/objectExtractionHelpers/__tests__/testObjectExtractorFromLocator.spec.js +107 -0
  149. package/dist/optimized-extractors/objectExtractionHelpers/__tests__/testObjectExtractorFromPage.spec.js +107 -0
  150. package/dist/optimized-extractors/objectExtractionHelpers/calculateObjectExampleHash.js +28 -0
  151. package/dist/optimized-extractors/objectExtractionHelpers/captureSnapshot.js +26 -0
  152. package/dist/optimized-extractors/objectExtractionHelpers/checksumUtils.js +32 -0
  153. package/dist/optimized-extractors/objectExtractionHelpers/constants.js +7 -0
  154. package/dist/optimized-extractors/objectExtractionHelpers/dynamicObjectExtractor.js +106 -0
  155. package/dist/optimized-extractors/objectExtractionHelpers/errors.js +42 -0
  156. package/dist/optimized-extractors/objectExtractionHelpers/findDomMatches.js +54 -0
  157. package/dist/optimized-extractors/objectExtractionHelpers/getSimplifiedHtml.js +122 -0
  158. package/dist/optimized-extractors/objectExtractionHelpers/typesAndSchemas.js +5 -0
  159. package/dist/optimized-extractors/objectExtractionHelpers/validateDynamicObjectExtractorOptions.js +52 -0
  160. package/dist/optimized-extractors/types/aiModelsValidation.js +45 -0
  161. package/dist/optimized-extractors/types/errors.js +42 -0
  162. package/dist/optimized-extractors/types/jsonSchema.d.js +5 -0
  163. package/dist/optimized-extractors/types/jsonSchema.d.ts +50 -0
  164. package/dist/optimized-extractors/types/types.js +5 -0
  165. package/dist/optimized-extractors/validators.js +152 -0
  166. package/dist/vite-env.d.js +1 -0
  167. package/dist/vite-env.d.ts +9 -0
  168. package/docs.md +14 -0
  169. package/generated-docs/ai/functions/extractStructuredData.mdx +255 -0
  170. package/generated-docs/ai/functions/isPageLoaded.mdx +88 -0
  171. package/generated-docs/ai/interfaces/ArraySchema.mdx +36 -0
  172. package/generated-docs/ai/interfaces/BasicSchema.mdx +14 -0
  173. package/generated-docs/ai/interfaces/BooleanSchema.mdx +28 -0
  174. package/generated-docs/ai/interfaces/ImageBufferContentItem.mdx +16 -0
  175. package/generated-docs/ai/interfaces/ImageUrlContentItem.mdx +16 -0
  176. package/generated-docs/ai/interfaces/NumberSchema.mdx +35 -0
  177. package/generated-docs/ai/interfaces/ObjectSchema.mdx +39 -0
  178. package/generated-docs/ai/interfaces/StringSchema.mdx +35 -0
  179. package/generated-docs/ai/interfaces/TextContentItem.mdx +14 -0
  180. package/generated-docs/ai/type-aliases/ContentItem.mdx +12 -0
  181. package/generated-docs/ai/type-aliases/JsonSchema.mdx +47 -0
  182. package/generated-docs/ai/type-aliases/SUPPORTED_MODELS.mdx +85 -0
  183. package/generated-docs/helpers/functions/downloadFile.mdx +99 -0
  184. package/generated-docs/helpers/functions/extractMarkdown.mdx +56 -0
  185. package/generated-docs/helpers/functions/filterEmptyValues.mdx +51 -0
  186. package/generated-docs/helpers/functions/goToUrl.mdx +124 -0
  187. package/generated-docs/helpers/functions/processDate.mdx +55 -0
  188. package/generated-docs/helpers/functions/resolveUrl.mdx +165 -0
  189. package/generated-docs/helpers/functions/sanitizeHtml.mdx +113 -0
  190. package/generated-docs/helpers/functions/saveFileToS3.mdx +127 -0
  191. package/generated-docs/helpers/functions/scrollToLoadContent.mdx +89 -0
  192. package/generated-docs/helpers/functions/uploadFileToS3.mdx +121 -0
  193. package/generated-docs/helpers/functions/validateDataUsingSchema.mdx +90 -0
  194. package/generated-docs/helpers/functions/waitForDomSettled.mdx +91 -0
  195. package/generated-docs/helpers/functions/withNetworkSettledWait.mdx +76 -0
  196. package/generated-docs/helpers/interfaces/Attachment.mdx +56 -0
  197. package/generated-docs/helpers/interfaces/S3Configs.mdx +52 -0
  198. package/generated-docs/helpers/interfaces/SanitizeHtmlOptions.mdx +22 -0
  199. package/generated-docs/helpers/type-aliases/AttachmentType.mdx +10 -0
  200. package/generated-docs/helpers/type-aliases/FileType.mdx +61 -0
  201. package/generated-docs/helpers/type-aliases/Trigger.mdx +62 -0
  202. package/how-to-run-tests.md +10 -0
  203. package/intuned-runtime-setup.md +13 -0
  204. package/package.json +119 -0
  205. package/tsconfig.eslint.json +5 -0
  206. package/tsconfig.json +26 -0
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.waitForDomSettled = void 0;
7
+ var _locatorHelpers = require("../common/locatorHelpers");
8
+ var _Logger = require("../common/Logger");
9
+ const waitForDomSettled = async options => {
10
+ const {
11
+ source,
12
+ settleDurationMs = 500,
13
+ timeoutInMs = 30000
14
+ } = options;
15
+ const settleDurationMsFloored = Math.floor(settleDurationMs);
16
+ const timeoutMs = Math.floor(timeoutInMs);
17
+ let pageObj;
18
+ let elementHandle;
19
+ if (!(0, _locatorHelpers.isPage)(source)) {
20
+ pageObj = source.page();
21
+ const handle = await source.elementHandle();
22
+ if (!handle) {
23
+ _Logger.logger.warn("Could not get element handle from locator");
24
+ return false;
25
+ }
26
+ elementHandle = handle;
27
+ } else if ((0, _locatorHelpers.isPage)(source)) {
28
+ pageObj = source;
29
+ elementHandle = await pageObj.evaluateHandle("document.documentElement");
30
+ } else {
31
+ throw new Error("Invalid state");
32
+ }
33
+ try {
34
+ const result = await pageObj.evaluate(({
35
+ target,
36
+ settleDurationMsFloored,
37
+ timeoutMs
38
+ }) => {
39
+ return new Promise((resolve, reject) => {
40
+ if (!target) {
41
+ reject(new Error("Target element not found"));
42
+ return;
43
+ }
44
+ let mutationTimer;
45
+ let settled = false;
46
+ const observer = new MutationObserver(() => {
47
+ if (settled) return;
48
+ clearTimeout(mutationTimer);
49
+ mutationTimer = window.setTimeout(() => {
50
+ settled = true;
51
+ observer.disconnect();
52
+ clearTimeout(timeoutTimer);
53
+ resolve(true);
54
+ }, settleDurationMsFloored);
55
+ });
56
+ const timeoutTimer = window.setTimeout(() => {
57
+ settled = true;
58
+ observer.disconnect();
59
+ clearTimeout(mutationTimer);
60
+ reject(new Error(`DOM timed out settling after ${timeoutMs} ms`));
61
+ }, timeoutMs);
62
+ observer.observe(target, {
63
+ childList: true,
64
+ subtree: true,
65
+ attributes: true,
66
+ characterData: true
67
+ });
68
+ mutationTimer = window.setTimeout(() => {
69
+ settled = true;
70
+ observer.disconnect();
71
+ clearTimeout(timeoutTimer);
72
+ resolve(true);
73
+ }, settleDurationMsFloored);
74
+ });
75
+ }, {
76
+ target: elementHandle,
77
+ settleDurationMsFloored,
78
+ timeoutMs
79
+ });
80
+ return result;
81
+ } catch (error) {
82
+ _Logger.logger.warn(`DOM settlement detection failed: ${error}`);
83
+ return false;
84
+ } finally {
85
+ if ((0, _locatorHelpers.isPage)(source) && elementHandle) {
86
+ await elementHandle.dispose();
87
+ }
88
+ }
89
+ };
90
+ exports.waitForDomSettled = waitForDomSettled;
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.withNetworkSettledWait = void 0;
7
+ var _Logger = require("../common/Logger");
8
+ const withNetworkSettledWait = async (callback, options) => {
9
+ const {
10
+ page,
11
+ timeoutInMs = 30000,
12
+ maxInflightRequests = 0
13
+ } = options || {};
14
+ _Logger.logger.debug(`Page object: ${page}`);
15
+ let networkSettledResolve = null;
16
+ let networkSettledPromise = new Promise(resolve => {
17
+ networkSettledResolve = resolve;
18
+ });
19
+ let isTimeout = false;
20
+ let requestCounter = 0;
21
+ let actionDone = false;
22
+ const pendingRequests = new Set();
23
+ const maybeSettle = async () => {
24
+ if (actionDone && requestCounter <= maxInflightRequests) {
25
+ var _networkSettledResolv;
26
+ (_networkSettledResolv = networkSettledResolve) === null || _networkSettledResolv === void 0 || _networkSettledResolv();
27
+ }
28
+ };
29
+ const onRequest = request => {
30
+ requestCounter++;
31
+ pendingRequests.add(request);
32
+ };
33
+ const onRequestDone = async request => {
34
+ await new Promise(resolve => setTimeout(resolve, 0));
35
+ if (pendingRequests.has(request)) {
36
+ requestCounter--;
37
+ pendingRequests.delete(request);
38
+ await maybeSettle();
39
+ }
40
+ };
41
+ const handleRequestFinished = async req => {
42
+ await onRequestDone(req);
43
+ };
44
+ const handleRequestFailed = async req => {
45
+ await onRequestDone(req);
46
+ };
47
+ page === null || page === void 0 || page.on("request", onRequest);
48
+ page === null || page === void 0 || page.on("requestfinished", handleRequestFinished);
49
+ page === null || page === void 0 || page.on("requestfailed", handleRequestFailed);
50
+ const timeoutPromise = new Promise(resolve => {
51
+ setTimeout(() => {
52
+ var _networkSettledResolv2;
53
+ _Logger.logger.info("waiting for network to settle timed out");
54
+ isTimeout = true;
55
+ (_networkSettledResolv2 = networkSettledResolve) === null || _networkSettledResolv2 === void 0 || _networkSettledResolv2();
56
+ resolve();
57
+ }, timeoutInMs);
58
+ });
59
+ try {
60
+ const result = await callback(page);
61
+ actionDone = true;
62
+ await new Promise(resolve => setTimeout(resolve, 500));
63
+ await maybeSettle();
64
+ _Logger.logger.info("-- Start waiting for network to settle... --");
65
+ let shouldContinue = true;
66
+ while (shouldContinue) {
67
+ _Logger.logger.info(`waiting for network to settle, ${requestCounter} requests pending`);
68
+ await Promise.race([networkSettledPromise, timeoutPromise]);
69
+ await new Promise(resolve => setTimeout(resolve, 500));
70
+ if (actionDone && requestCounter <= maxInflightRequests || isTimeout) {
71
+ if (isTimeout) {
72
+ _Logger.logger.info("Exiting due to timeout, network did not settle");
73
+ } else {
74
+ _Logger.logger.info("network settled, no pending requests");
75
+ }
76
+ shouldContinue = false;
77
+ } else {
78
+ networkSettledPromise = new Promise(resolve => {
79
+ networkSettledResolve = resolve;
80
+ });
81
+ }
82
+ }
83
+ _Logger.logger.info("-- Finished waiting for network to settle --");
84
+ return result;
85
+ } finally {
86
+ page === null || page === void 0 || page.off("request", onRequest);
87
+ page === null || page === void 0 || page.off("requestfinished", handleRequestFinished);
88
+ page === null || page === void 0 || page.off("requestfailed", handleRequestFailed);
89
+ }
90
+ };
91
+ exports.withNetworkSettledWait = withNetworkSettledWait;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _export = require("./helpers/export");
7
+ Object.keys(_export).forEach(function (key) {
8
+ if (key === "default" || key === "__esModule") return;
9
+ if (key in exports && exports[key] === _export[key]) return;
10
+ Object.defineProperty(exports, key, {
11
+ enumerable: true,
12
+ get: function () {
13
+ return _export[key];
14
+ }
15
+ });
16
+ });
@@ -0,0 +1,10 @@
1
+ export * from "./helpers/export";
2
+
3
+ export type {
4
+ Attachment,
5
+ Trigger,
6
+ S3Configs,
7
+ FileType,
8
+ AttachmentType,
9
+ SanitizeHtmlOptions,
10
+ } from "./helpers/export";
package/dist/index.js ADDED
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _helpers = require("./helpers");
7
+ Object.keys(_helpers).forEach(function (key) {
8
+ if (key === "default" || key === "__esModule") return;
9
+ if (key in exports && exports[key] === _helpers[key]) return;
10
+ Object.defineProperty(exports, key, {
11
+ enumerable: true,
12
+ get: function () {
13
+ return _helpers[key];
14
+ }
15
+ });
16
+ });
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.APIGateway = void 0;
7
+ var _getModelProvider = require("../../common/getModelProvider");
8
+ var _Anthropic = require("./providers/Anthropic");
9
+ var _OpenAI = require("./providers/OpenAI");
10
+ var _Gemini = require("./providers/Gemini");
11
+ var _dotenv = require("dotenv");
12
+ (0, _dotenv.config)();
13
+ class APIGateway {
14
+ constructor() {
15
+ this.config = this.getDefaultConfig();
16
+ this.validateConfig(this.config);
17
+ }
18
+ validateConfig(config) {
19
+ if (!config.functionsDomain || !config.workspaceId || !config.integrationId) {
20
+ throw new Error("Gateway configuration is incomplete. " + "Please provide functionsDomain, workspaceId, and integrationId");
21
+ }
22
+ }
23
+ getDefaultConfig() {
24
+ return {
25
+ functionsDomain: process.env.FUNCTIONS_DOMAIN,
26
+ workspaceId: process.env.INTUNED_WORKSPACE_ID,
27
+ integrationId: process.env.INTUNED_INTEGRATION_ID
28
+ };
29
+ }
30
+ detectProvider(model) {
31
+ const modelLower = model.toLowerCase();
32
+ return (0, _getModelProvider.getModelProvider)(modelLower);
33
+ }
34
+ buildGatewayUrl(provider) {
35
+ var _this$config;
36
+ const baseDomain = (_this$config = this.config) === null || _this$config === void 0 || (_this$config = _this$config.functionsDomain) === null || _this$config === void 0 ? void 0 : _this$config.replace(/\/$/, "");
37
+ return `${baseDomain}/api/${this.config.workspaceId}/functions/${this.config.integrationId}/${provider === "anthropic" ? "anthropic/v1" : provider === "google_vertexai" ? "google_vertexai/v1beta" : provider}`;
38
+ }
39
+ getModelConfig(model, options) {
40
+ const {
41
+ apiKey,
42
+ extraHeaders
43
+ } = options;
44
+ const provider = this.detectProvider(model);
45
+ let apiKeyToUse = apiKey;
46
+ if (apiKey === undefined) {
47
+ if (provider !== null && provider !== void 0 && provider.toLowerCase().includes("anthropic")) {
48
+ apiKeyToUse = process.env.ANTHROPIC_API_KEY;
49
+ } else if (provider !== null && provider !== void 0 && provider.toLowerCase().includes("openai")) {
50
+ apiKeyToUse = process.env.OPENAI_API_KEY;
51
+ } else if (provider !== null && provider !== void 0 && provider.toLowerCase().includes("google_vertexai")) {
52
+ apiKeyToUse = process.env.GOOGLE_API_KEY;
53
+ }
54
+ }
55
+ if (apiKeyToUse) {
56
+ return {
57
+ model,
58
+ apiKey: apiKeyToUse,
59
+ extraHeaders,
60
+ baseUrl: undefined
61
+ };
62
+ }
63
+ const baseUrl = this.buildGatewayUrl(provider);
64
+ return {
65
+ model,
66
+ apiKey: "--THI_VALUE_WILL_BE_REPLACED_BY_INTUNED_BE--",
67
+ extraHeaders,
68
+ baseUrl
69
+ };
70
+ }
71
+ createProviderInstance(model, apiKey, extraHeaders) {
72
+ const config = this.getModelConfig(model, {
73
+ apiKey,
74
+ extraHeaders
75
+ });
76
+ const provider = this.detectProvider(model);
77
+ const input = {
78
+ apiKey: config.apiKey,
79
+ headers: config.extraHeaders,
80
+ model: config.model,
81
+ baseUrl: config.baseUrl
82
+ };
83
+ const providerFactories = {
84
+ anthropic: () => (0, _Anthropic.createAnthropicInstance)(input),
85
+ openai: () => (0, _OpenAI.createOpenAIInstance)(input),
86
+ google_vertexai: () => (0, _Gemini.createGoogleInstance)(input)
87
+ };
88
+ const factory = providerFactories[provider];
89
+ if (!factory) {
90
+ throw new Error(`Unsupported provider: ${provider}`);
91
+ }
92
+ return factory();
93
+ }
94
+ getModel(model, apiKey, extraHeaders) {
95
+ const providerInstance = this.createProviderInstance(model, apiKey, extraHeaders);
96
+ return providerInstance.chat(model);
97
+ }
98
+ }
99
+ exports.APIGateway = APIGateway;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.GatewayFactory = void 0;
7
+ var _aiApiGateway = require("./aiApiGateway");
8
+ class GatewayFactory {
9
+ static createAIGateway() {
10
+ return new _aiApiGateway.APIGateway();
11
+ }
12
+ }
13
+ exports.GatewayFactory = GatewayFactory;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createAnthropicInstance = void 0;
7
+ var _anthropic = require("@ai-sdk/anthropic");
8
+ var _jwtTokenManager = require("../../../common/jwtTokenManager");
9
+ const createAnthropicInstance = input => {
10
+ const {
11
+ apiKey,
12
+ baseUrl
13
+ } = input;
14
+ if (apiKey && baseUrl === undefined) {
15
+ return (0, _anthropic.createAnthropic)({
16
+ apiKey
17
+ });
18
+ } else {
19
+ return (0, _anthropic.createAnthropic)({
20
+ apiKey: "--THI_VALUE_WILL_BE_REPLACED_BY_INTUNED_BE--",
21
+ baseURL: baseUrl,
22
+ fetch: _jwtTokenManager.backendFunctionsTokenManager.fetchWithToken.bind(_jwtTokenManager.backendFunctionsTokenManager)
23
+ });
24
+ }
25
+ };
26
+ exports.createAnthropicInstance = createAnthropicInstance;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createGoogleInstance = void 0;
7
+ var _google = require("@ai-sdk/google");
8
+ var _jwtTokenManager = require("../../../common/jwtTokenManager");
9
+ const createGoogleInstance = input => {
10
+ const {
11
+ apiKey,
12
+ headers,
13
+ baseUrl
14
+ } = input;
15
+ if (apiKey && baseUrl === undefined) {
16
+ return (0, _google.createGoogleGenerativeAI)({
17
+ apiKey,
18
+ headers
19
+ });
20
+ } else {
21
+ return (0, _google.createGoogleGenerativeAI)({
22
+ apiKey: "--THI_VALUE_WILL_BE_REPLACED_BY_INTUNED_BE--",
23
+ headers,
24
+ baseURL: baseUrl,
25
+ fetch: _jwtTokenManager.backendFunctionsTokenManager.fetchWithToken.bind(_jwtTokenManager.backendFunctionsTokenManager)
26
+ });
27
+ }
28
+ };
29
+ exports.createGoogleInstance = createGoogleInstance;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createOpenAIInstance = void 0;
7
+ var _openai = require("@ai-sdk/openai");
8
+ var _jwtTokenManager = require("../../../common/jwtTokenManager");
9
+ const createOpenAIInstance = input => {
10
+ const {
11
+ apiKey,
12
+ headers,
13
+ baseUrl
14
+ } = input;
15
+ if (apiKey && baseUrl === undefined) {
16
+ return (0, _openai.createOpenAI)({
17
+ apiKey,
18
+ headers
19
+ });
20
+ } else {
21
+ return (0, _openai.createOpenAI)({
22
+ apiKey: "--THI_VALUE_WILL_BE_REPLACED_BY_INTUNED_BE--",
23
+ headers,
24
+ baseURL: baseUrl,
25
+ fetch: _jwtTokenManager.backendFunctionsTokenManager.fetchWithToken.bind(_jwtTokenManager.backendFunctionsTokenManager)
26
+ });
27
+ }
28
+ };
29
+ exports.createOpenAIInstance = createOpenAIInstance;
@@ -0,0 +1,224 @@
1
+ "use strict";
2
+
3
+ var _extendedTest = require("../../../common/extendedTest");
4
+ var _vitest = require("vitest");
5
+ var _aiApiGateway = require("../aiApiGateway");
6
+ var _getModelProvider = require("../../../common/getModelProvider");
7
+ var _Anthropic = require("../providers/Anthropic");
8
+ var _OpenAI = require("../providers/OpenAI");
9
+ var _Gemini = require("../providers/Gemini");
10
+ _vitest.vi.mock("../../../common/jwtTokenManager", () => ({
11
+ backendFunctionsTokenManager: {
12
+ fetchWithToken: _vitest.vi.fn()
13
+ }
14
+ }));
15
+ _vitest.vi.mock("../../../common/getModelProvider", () => ({
16
+ getModelProvider: _vitest.vi.fn()
17
+ }));
18
+ _vitest.vi.mock("../providers/Anthropic", () => ({
19
+ createAnthropicInstance: _vitest.vi.fn()
20
+ }));
21
+ _vitest.vi.mock("../providers/OpenAI", () => ({
22
+ createOpenAIInstance: _vitest.vi.fn()
23
+ }));
24
+ _vitest.vi.mock("../providers/Gemini", () => ({
25
+ createGoogleInstance: _vitest.vi.fn()
26
+ }));
27
+ const mockGetModelProvider = _vitest.vi.mocked(_getModelProvider.getModelProvider);
28
+ const mockCreateAnthropicInstance = _vitest.vi.mocked(_Anthropic.createAnthropicInstance);
29
+ const mockCreateOpenAIInstance = _vitest.vi.mocked(_OpenAI.createOpenAIInstance);
30
+ const mockCreateGoogleInstance = _vitest.vi.mocked(_Gemini.createGoogleInstance);
31
+ (0, _extendedTest.describe)("APIGateway", () => {
32
+ let originalEnv;
33
+ let gateway;
34
+ (0, _extendedTest.beforeEach)(() => {
35
+ originalEnv = process.env;
36
+ process.env = {
37
+ ...originalEnv,
38
+ FUNCTIONS_DOMAIN: "https://functions.example.com",
39
+ INTUNED_WORKSPACE_ID: "workspace123",
40
+ INTUNED_INTEGRATION_ID: "integration456",
41
+ ANTHROPIC_API_KEY: undefined
42
+ };
43
+ gateway = new _aiApiGateway.APIGateway();
44
+ _vitest.vi.clearAllMocks();
45
+ });
46
+ (0, _extendedTest.afterEach)(() => {
47
+ process.env = originalEnv;
48
+ });
49
+ (0, _extendedTest.describe)("constructor and config", () => {
50
+ (0, _extendedTest.it)("should initialize with default config from environment", () => {
51
+ (0, _extendedTest.expect)(gateway["config"]).toEqual({
52
+ functionsDomain: "https://functions.example.com",
53
+ workspaceId: "workspace123",
54
+ integrationId: "integration456"
55
+ });
56
+ });
57
+ });
58
+ (0, _extendedTest.describe)("detectProvider", () => {
59
+ (0, _extendedTest.it)("should detect openai models", () => {
60
+ mockGetModelProvider.mockReturnValue("openai");
61
+ (0, _extendedTest.expect)(gateway["detectProvider"]("gpt-4")).toBe("openai");
62
+ (0, _extendedTest.expect)(mockGetModelProvider).toHaveBeenCalledWith("gpt-4");
63
+ });
64
+ (0, _extendedTest.it)("should detect anthropic models", () => {
65
+ mockGetModelProvider.mockReturnValue("anthropic");
66
+ (0, _extendedTest.expect)(gateway["detectProvider"]("claude-3-sonnet")).toBe("anthropic");
67
+ (0, _extendedTest.expect)(mockGetModelProvider).toHaveBeenCalledWith("claude-3-sonnet");
68
+ });
69
+ (0, _extendedTest.it)("should handle case insensitive models", () => {
70
+ mockGetModelProvider.mockReturnValue("anthropic");
71
+ (0, _extendedTest.expect)(gateway["detectProvider"]("CLAUDE-3-OPUS")).toBe("anthropic");
72
+ (0, _extendedTest.expect)(mockGetModelProvider).toHaveBeenCalledWith("claude-3-opus");
73
+ });
74
+ (0, _extendedTest.it)("should return unknown for unsupported models", () => {
75
+ mockGetModelProvider.mockReturnValue("unknown");
76
+ (0, _extendedTest.expect)(gateway["detectProvider"]("unknown-model")).toBe("unknown");
77
+ });
78
+ });
79
+ (0, _extendedTest.describe)("buildGatewayUrl", () => {
80
+ (0, _extendedTest.it)("should build correct URL for anthropic", () => {
81
+ const result = gateway["buildGatewayUrl"]("anthropic");
82
+ (0, _extendedTest.expect)(result).toBe("https://functions.example.com/api/workspace123/functions/integration456/anthropic/v1");
83
+ });
84
+ (0, _extendedTest.it)("should build correct URL for google_vertexai", () => {
85
+ const result = gateway["buildGatewayUrl"]("google_vertexai");
86
+ (0, _extendedTest.expect)(result).toBe("https://functions.example.com/api/workspace123/functions/integration456/google_vertexai/v1beta");
87
+ });
88
+ (0, _extendedTest.it)("should build correct URL for other providers", () => {
89
+ const result = gateway["buildGatewayUrl"]("openai");
90
+ (0, _extendedTest.expect)(result).toBe("https://functions.example.com/api/workspace123/functions/integration456/openai");
91
+ });
92
+ (0, _extendedTest.it)("should strip trailing slash from domain", () => {
93
+ process.env.FUNCTIONS_DOMAIN = "https://functions.example.com/";
94
+ const newGateway = new _aiApiGateway.APIGateway();
95
+ const result = newGateway["buildGatewayUrl"]("openai");
96
+ (0, _extendedTest.expect)(result).toBe("https://functions.example.com/api/workspace123/functions/integration456/openai");
97
+ });
98
+ (0, _extendedTest.it)("should throw error for incomplete config", () => {
99
+ delete process.env.FUNCTIONS_DOMAIN;
100
+ (0, _extendedTest.expect)(() => new _aiApiGateway.APIGateway()).toThrow("Gateway configuration is incomplete");
101
+ });
102
+ });
103
+ (0, _extendedTest.describe)("getModelConfig", () => {
104
+ (0, _extendedTest.it)("should return direct mode config when API key provided", () => {
105
+ const config = gateway.getModelConfig("claude-3-sonnet", {
106
+ apiKey: "sk-test123",
107
+ extraHeaders: {
108
+ "Custom-Header": "value"
109
+ }
110
+ });
111
+ (0, _extendedTest.expect)(config).toEqual({
112
+ model: "claude-3-sonnet",
113
+ apiKey: "sk-test123",
114
+ extraHeaders: {
115
+ "Custom-Header": "value"
116
+ },
117
+ baseUrl: undefined
118
+ });
119
+ });
120
+ (0, _extendedTest.it)("should return gateway mode config when no API key", () => {
121
+ mockGetModelProvider.mockReturnValue("anthropic");
122
+ const config = gateway.getModelConfig("claude-3-sonnet", {
123
+ apiKey: undefined,
124
+ extraHeaders: {
125
+ "Custom-Header": "value"
126
+ }
127
+ });
128
+ process.env.ANTHROPIC_API_KEY = undefined;
129
+ (0, _extendedTest.expect)(config).toEqual({
130
+ model: "claude-3-sonnet",
131
+ apiKey: "--THI_VALUE_WILL_BE_REPLACED_BY_INTUNED_BE--",
132
+ extraHeaders: {
133
+ "Custom-Header": "value"
134
+ },
135
+ baseUrl: "https://functions.example.com/api/workspace123/functions/integration456/anthropic/v1"
136
+ });
137
+ });
138
+ });
139
+ (0, _extendedTest.describe)("createProviderInstance", () => {
140
+ (0, _extendedTest.it)("should create anthropic instance", () => {
141
+ mockGetModelProvider.mockReturnValue("anthropic");
142
+ const mockInstance = {
143
+ chat: _vitest.vi.fn()
144
+ };
145
+ mockCreateAnthropicInstance.mockReturnValue(mockInstance);
146
+ const result = gateway.createProviderInstance("claude-3-sonnet");
147
+ process.env.ANTHROPIC_API_KEY = undefined;
148
+ (0, _extendedTest.expect)(mockCreateAnthropicInstance).toHaveBeenCalledWith({
149
+ apiKey: "--THI_VALUE_WILL_BE_REPLACED_BY_INTUNED_BE--",
150
+ headers: undefined,
151
+ model: "claude-3-sonnet",
152
+ baseUrl: "https://functions.example.com/api/workspace123/functions/integration456/anthropic/v1"
153
+ });
154
+ (0, _extendedTest.expect)(result).toBe(mockInstance);
155
+ });
156
+ (0, _extendedTest.it)("should create openai instance", () => {
157
+ mockGetModelProvider.mockReturnValue("openai");
158
+ const mockInstance = {
159
+ chat: _vitest.vi.fn()
160
+ };
161
+ mockCreateOpenAIInstance.mockReturnValue(mockInstance);
162
+ const result = gateway.createProviderInstance("gpt-4", "sk-test123");
163
+ (0, _extendedTest.expect)(mockCreateOpenAIInstance).toHaveBeenCalledWith({
164
+ apiKey: "sk-test123",
165
+ headers: undefined,
166
+ model: "gpt-4",
167
+ baseUrl: undefined
168
+ });
169
+ (0, _extendedTest.expect)(result).toBe(mockInstance);
170
+ });
171
+ (0, _extendedTest.it)("should create google instance", () => {
172
+ mockGetModelProvider.mockReturnValue("google_vertexai");
173
+ const mockInstance = {
174
+ chat: _vitest.vi.fn()
175
+ };
176
+ mockCreateGoogleInstance.mockReturnValue(mockInstance);
177
+ const result = gateway.createProviderInstance("gemini-pro");
178
+ (0, _extendedTest.expect)(mockCreateGoogleInstance).toHaveBeenCalled();
179
+ (0, _extendedTest.expect)(result).toBe(mockInstance);
180
+ });
181
+ (0, _extendedTest.it)("should throw error for unsupported provider", () => {
182
+ mockGetModelProvider.mockReturnValue("unknown");
183
+ (0, _extendedTest.expect)(() => gateway.createProviderInstance("unknown-model")).toThrow("Unsupported provider: unknown");
184
+ });
185
+ });
186
+ (0, _extendedTest.describe)("getModel", () => {
187
+ (0, _extendedTest.it)("should return language model from provider instance", () => {
188
+ mockGetModelProvider.mockReturnValue("anthropic");
189
+ const mockModelInstance = {
190
+ generate: _vitest.vi.fn()
191
+ };
192
+ const mockProviderInstance = {
193
+ chat: _vitest.vi.fn().mockReturnValue(mockModelInstance)
194
+ };
195
+ mockCreateAnthropicInstance.mockReturnValue(mockProviderInstance);
196
+ const result = gateway.getModel("claude-3-sonnet");
197
+ (0, _extendedTest.expect)(mockProviderInstance.chat).toHaveBeenCalledWith("claude-3-sonnet");
198
+ (0, _extendedTest.expect)(result).toBe(mockModelInstance);
199
+ });
200
+ (0, _extendedTest.it)("should pass through API key and headers", () => {
201
+ mockGetModelProvider.mockReturnValue("openai");
202
+ const mockModelInstance = {
203
+ generate: _vitest.vi.fn()
204
+ };
205
+ const mockProviderInstance = {
206
+ chat: _vitest.vi.fn().mockReturnValue(mockModelInstance)
207
+ };
208
+ mockCreateOpenAIInstance.mockReturnValue(mockProviderInstance);
209
+ const result = gateway.getModel("gpt-4", "sk-test123", {
210
+ "Custom-Header": "value"
211
+ });
212
+ (0, _extendedTest.expect)(mockCreateOpenAIInstance).toHaveBeenCalledWith({
213
+ apiKey: "sk-test123",
214
+ headers: {
215
+ "Custom-Header": "value"
216
+ },
217
+ model: "gpt-4",
218
+ baseUrl: undefined
219
+ });
220
+ (0, _extendedTest.expect)(mockProviderInstance.chat).toHaveBeenCalledWith("gpt-4");
221
+ (0, _extendedTest.expect)(result).toBe(mockModelInstance);
222
+ });
223
+ });
224
+ });
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.GatewayMode = void 0;
7
+ let GatewayMode = exports.GatewayMode = function (GatewayMode) {
8
+ GatewayMode["DIRECT"] = "direct";
9
+ GatewayMode["GATEWAY"] = "gateway";
10
+ return GatewayMode;
11
+ }({});