@loopstack/web-module 0.2.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 (65) hide show
  1. package/dist/constants.d.ts +10 -0
  2. package/dist/constants.d.ts.map +1 -0
  3. package/dist/constants.js +13 -0
  4. package/dist/constants.js.map +1 -0
  5. package/dist/index.d.ts +7 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +23 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/services/index.d.ts +4 -0
  10. package/dist/services/index.d.ts.map +1 -0
  11. package/dist/services/index.js +20 -0
  12. package/dist/services/index.js.map +1 -0
  13. package/dist/services/webfetch-fetcher.service.d.ts +20 -0
  14. package/dist/services/webfetch-fetcher.service.d.ts.map +1 -0
  15. package/dist/services/webfetch-fetcher.service.js +218 -0
  16. package/dist/services/webfetch-fetcher.service.js.map +1 -0
  17. package/dist/services/webfetch-markdown.service.d.ts +6 -0
  18. package/dist/services/webfetch-markdown.service.d.ts.map +1 -0
  19. package/dist/services/webfetch-markdown.service.js +66 -0
  20. package/dist/services/webfetch-markdown.service.js.map +1 -0
  21. package/dist/services/webfetch-summarizer.service.d.ts +15 -0
  22. package/dist/services/webfetch-summarizer.service.d.ts.map +1 -0
  23. package/dist/services/webfetch-summarizer.service.js +57 -0
  24. package/dist/services/webfetch-summarizer.service.js.map +1 -0
  25. package/dist/tools/index.d.ts +2 -0
  26. package/dist/tools/index.d.ts.map +1 -0
  27. package/dist/tools/index.js +18 -0
  28. package/dist/tools/index.js.map +1 -0
  29. package/dist/tools/web-fetch.tool.d.ts +20 -0
  30. package/dist/tools/web-fetch.tool.d.ts.map +1 -0
  31. package/dist/tools/web-fetch.tool.js +163 -0
  32. package/dist/tools/web-fetch.tool.js.map +1 -0
  33. package/dist/types/index.d.ts +2 -0
  34. package/dist/types/index.d.ts.map +1 -0
  35. package/dist/types/index.js +18 -0
  36. package/dist/types/index.js.map +1 -0
  37. package/dist/types/webfetch.types.d.ts +31 -0
  38. package/dist/types/webfetch.types.d.ts.map +1 -0
  39. package/dist/types/webfetch.types.js +3 -0
  40. package/dist/types/webfetch.types.js.map +1 -0
  41. package/dist/utils/errors.d.ts +18 -0
  42. package/dist/utils/errors.d.ts.map +1 -0
  43. package/dist/utils/errors.js +43 -0
  44. package/dist/utils/errors.js.map +1 -0
  45. package/dist/utils/index.d.ts +5 -0
  46. package/dist/utils/index.d.ts.map +1 -0
  47. package/dist/utils/index.js +21 -0
  48. package/dist/utils/index.js.map +1 -0
  49. package/dist/utils/preapproved-hosts.d.ts +4 -0
  50. package/dist/utils/preapproved-hosts.d.ts.map +1 -0
  51. package/dist/utils/preapproved-hosts.js +63 -0
  52. package/dist/utils/preapproved-hosts.js.map +1 -0
  53. package/dist/utils/secondary-model-prompt.d.ts +2 -0
  54. package/dist/utils/secondary-model-prompt.d.ts.map +1 -0
  55. package/dist/utils/secondary-model-prompt.js +23 -0
  56. package/dist/utils/secondary-model-prompt.js.map +1 -0
  57. package/dist/utils/url.utils.d.ts +10 -0
  58. package/dist/utils/url.utils.d.ts.map +1 -0
  59. package/dist/utils/url.utils.js +52 -0
  60. package/dist/utils/url.utils.js.map +1 -0
  61. package/dist/web.module.d.ts +3 -0
  62. package/dist/web.module.d.ts.map +1 -0
  63. package/dist/web.module.js +25 -0
  64. package/dist/web.module.js.map +1 -0
  65. package/package.json +78 -0
@@ -0,0 +1,10 @@
1
+ export declare const MAX_URL_LENGTH = 2000;
2
+ export declare const MAX_HTTP_CONTENT_LENGTH: number;
3
+ export declare const FETCH_TIMEOUT_MS = 60000;
4
+ export declare const MAX_REDIRECTS = 10;
5
+ export declare const MAX_MARKDOWN_LENGTH = 100000;
6
+ export declare const MAX_RESULT_SIZE_CHARS = 100000;
7
+ export declare const CACHE_TTL_MS: number;
8
+ export declare const MAX_CACHE_SIZE_BYTES: number;
9
+ export declare const DEFAULT_USER_AGENT = "Loopstack-WebFetch/0.1 (+https://loopstack.ai)";
10
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,OAAO,CAAC;AAEnC,eAAO,MAAM,uBAAuB,QAAmB,CAAC;AAExD,eAAO,MAAM,gBAAgB,QAAS,CAAC;AAEvC,eAAO,MAAM,aAAa,KAAK,CAAC;AAEhC,eAAO,MAAM,mBAAmB,SAAU,CAAC;AAE3C,eAAO,MAAM,qBAAqB,SAAU,CAAC;AAE7C,eAAO,MAAM,YAAY,QAAiB,CAAC;AAE3C,eAAO,MAAM,oBAAoB,QAAmB,CAAC;AAErD,eAAO,MAAM,kBAAkB,mDAAmD,CAAC"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_USER_AGENT = exports.MAX_CACHE_SIZE_BYTES = exports.CACHE_TTL_MS = exports.MAX_RESULT_SIZE_CHARS = exports.MAX_MARKDOWN_LENGTH = exports.MAX_REDIRECTS = exports.FETCH_TIMEOUT_MS = exports.MAX_HTTP_CONTENT_LENGTH = exports.MAX_URL_LENGTH = void 0;
4
+ exports.MAX_URL_LENGTH = 2000;
5
+ exports.MAX_HTTP_CONTENT_LENGTH = 10 * 1024 * 1024;
6
+ exports.FETCH_TIMEOUT_MS = 60_000;
7
+ exports.MAX_REDIRECTS = 10;
8
+ exports.MAX_MARKDOWN_LENGTH = 100_000;
9
+ exports.MAX_RESULT_SIZE_CHARS = 100_000;
10
+ exports.CACHE_TTL_MS = 15 * 60 * 1000;
11
+ exports.MAX_CACHE_SIZE_BYTES = 50 * 1024 * 1024;
12
+ exports.DEFAULT_USER_AGENT = 'Loopstack-WebFetch/0.1 (+https://loopstack.ai)';
13
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,cAAc,GAAG,IAAI,CAAC;AAEtB,QAAA,uBAAuB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAE3C,QAAA,gBAAgB,GAAG,MAAM,CAAC;AAE1B,QAAA,aAAa,GAAG,EAAE,CAAC;AAEnB,QAAA,mBAAmB,GAAG,OAAO,CAAC;AAE9B,QAAA,qBAAqB,GAAG,OAAO,CAAC;AAEhC,QAAA,YAAY,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE9B,QAAA,oBAAoB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAExC,QAAA,kBAAkB,GAAG,gDAAgD,CAAC"}
@@ -0,0 +1,7 @@
1
+ export * from './constants';
2
+ export * from './services';
3
+ export * from './tools';
4
+ export * from './types';
5
+ export * from './utils';
6
+ export * from './web.module';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./constants"), exports);
18
+ __exportStar(require("./services"), exports);
19
+ __exportStar(require("./tools"), exports);
20
+ __exportStar(require("./types"), exports);
21
+ __exportStar(require("./utils"), exports);
22
+ __exportStar(require("./web.module"), exports);
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,6CAA2B;AAC3B,0CAAwB;AACxB,0CAAwB;AACxB,0CAAwB;AACxB,+CAA6B"}
@@ -0,0 +1,4 @@
1
+ export * from './webfetch-fetcher.service';
2
+ export * from './webfetch-markdown.service';
3
+ export * from './webfetch-summarizer.service';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./webfetch-fetcher.service"), exports);
18
+ __exportStar(require("./webfetch-markdown.service"), exports);
19
+ __exportStar(require("./webfetch-summarizer.service"), exports);
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6DAA2C;AAC3C,8DAA4C;AAC5C,gEAA8C"}
@@ -0,0 +1,20 @@
1
+ import { FetchedContent, RedirectInfo } from '../types';
2
+ export type FetchOutcome = {
3
+ type: 'content';
4
+ content: FetchedContent;
5
+ cached: boolean;
6
+ } | {
7
+ type: 'redirect';
8
+ redirect: RedirectInfo;
9
+ };
10
+ export declare class WebFetchFetcherService {
11
+ private readonly markdownService;
12
+ private readonly urlCache;
13
+ clearCache(): void;
14
+ fetch(url: string, callerSignal?: AbortSignal): Promise<FetchOutcome>;
15
+ htmlToMarkdown(content: FetchedContent): Promise<string>;
16
+ private fetchWithPermittedRedirects;
17
+ private toFetchedContent;
18
+ private reclassifyFetchError;
19
+ }
20
+ //# sourceMappingURL=webfetch-fetcher.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webfetch-fetcher.service.d.ts","sourceRoot":"","sources":["../../src/services/webfetch-fetcher.service.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAaxD,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,YAAY,CAAA;CAAE,CAAC;AAEjD,qBACa,sBAAsB;IACvB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA0B;IAEpE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAItB;IAEH,UAAU,IAAI,IAAI;IAIZ,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAyBrE,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;YAQhD,2BAA2B;YA0D3B,gBAAgB;IAsB9B,OAAO,CAAC,oBAAoB;CAe7B"}
@@ -0,0 +1,218 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.WebFetchFetcherService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const lru_cache_1 = require("lru-cache");
15
+ const constants_1 = require("../constants");
16
+ const errors_1 = require("../utils/errors");
17
+ const url_utils_1 = require("../utils/url.utils");
18
+ const webfetch_markdown_service_1 = require("./webfetch-markdown.service");
19
+ let WebFetchFetcherService = class WebFetchFetcherService {
20
+ markdownService;
21
+ urlCache = new lru_cache_1.LRUCache({
22
+ maxSize: constants_1.MAX_CACHE_SIZE_BYTES,
23
+ ttl: constants_1.CACHE_TTL_MS,
24
+ sizeCalculation: (entry) => Math.max(1, Buffer.byteLength(entry.content, 'utf-8')),
25
+ });
26
+ clearCache() {
27
+ this.urlCache.clear();
28
+ }
29
+ async fetch(url, callerSignal) {
30
+ const validation = (0, url_utils_1.validateURL)(url);
31
+ if (!validation.ok) {
32
+ throw new errors_1.InvalidUrlError(url, validation.reason);
33
+ }
34
+ const cached = this.urlCache.get(url);
35
+ if (cached) {
36
+ return { type: 'content', content: { ...cached }, cached: true };
37
+ }
38
+ const upgradedUrl = upgradeToHttps(validation.parsed);
39
+ const response = await this.fetchWithPermittedRedirects(upgradedUrl, callerSignal);
40
+ if ('type' in response && response.type === 'redirect') {
41
+ return { type: 'redirect', redirect: response };
42
+ }
43
+ const content = await this.toFetchedContent(response);
44
+ this.urlCache.set(url, { ...content });
45
+ return { type: 'content', content, cached: false };
46
+ }
47
+ async htmlToMarkdown(content) {
48
+ if (content.isBinary)
49
+ return '';
50
+ if (content.contentType.toLowerCase().includes('text/html')) {
51
+ return this.markdownService.toMarkdown(content.content);
52
+ }
53
+ return content.content;
54
+ }
55
+ async fetchWithPermittedRedirects(url, callerSignal, depth = 0) {
56
+ if (depth > constants_1.MAX_REDIRECTS) {
57
+ throw new errors_1.RedirectLimitExceededError(constants_1.MAX_REDIRECTS);
58
+ }
59
+ const composed = composeSignal(callerSignal);
60
+ let response;
61
+ try {
62
+ response = await fetch(url, {
63
+ method: 'GET',
64
+ redirect: 'manual',
65
+ signal: composed,
66
+ headers: {
67
+ Accept: 'text/markdown, text/html, */*',
68
+ 'User-Agent': constants_1.DEFAULT_USER_AGENT,
69
+ },
70
+ });
71
+ }
72
+ catch (error) {
73
+ throw this.reclassifyFetchError(error, composed, callerSignal);
74
+ }
75
+ if (isRedirectStatus(response.status)) {
76
+ const location = response.headers.get('location');
77
+ if (!location) {
78
+ throw new Error(`Redirect (${response.status}) missing Location header`);
79
+ }
80
+ const redirectUrl = new URL(location, url).toString();
81
+ if ((0, url_utils_1.isPermittedRedirect)(url, redirectUrl)) {
82
+ await drain(response);
83
+ return this.fetchWithPermittedRedirects(redirectUrl, callerSignal, depth + 1);
84
+ }
85
+ await drain(response);
86
+ return {
87
+ type: 'redirect',
88
+ originalUrl: url,
89
+ redirectUrl,
90
+ statusCode: response.status,
91
+ };
92
+ }
93
+ if (response.status === 403 && response.headers.get('x-proxy-error') === 'blocked-by-allowlist') {
94
+ await drain(response);
95
+ throw new errors_1.EgressBlockedError(new URL(url).hostname);
96
+ }
97
+ return response;
98
+ }
99
+ async toFetchedContent(response) {
100
+ const contentType = response.headers.get('content-type') ?? '';
101
+ const declaredLength = parseInt(response.headers.get('content-length') ?? '', 10);
102
+ if (Number.isFinite(declaredLength) && declaredLength > constants_1.MAX_HTTP_CONTENT_LENGTH) {
103
+ await drain(response);
104
+ throw new errors_1.ContentTooLargeError(constants_1.MAX_HTTP_CONTENT_LENGTH);
105
+ }
106
+ const buffer = await readBodyWithCap(response, constants_1.MAX_HTTP_CONTENT_LENGTH);
107
+ const isBinary = (0, url_utils_1.isBinaryContentType)(contentType);
108
+ return {
109
+ content: isBinary ? '' : buffer.toString('utf-8'),
110
+ bytes: buffer.length,
111
+ code: response.status,
112
+ codeText: response.statusText,
113
+ contentType,
114
+ isBinary,
115
+ };
116
+ }
117
+ reclassifyFetchError(error, composed, callerSignal) {
118
+ if (!(error instanceof Error))
119
+ return error;
120
+ const isAbort = error.name === 'AbortError' || error.name === 'TimeoutError';
121
+ if (!isAbort)
122
+ return error;
123
+ if (callerSignal?.aborted)
124
+ return error;
125
+ if (composed.aborted) {
126
+ return new errors_1.FetchTimeoutError(constants_1.FETCH_TIMEOUT_MS);
127
+ }
128
+ return error;
129
+ }
130
+ };
131
+ exports.WebFetchFetcherService = WebFetchFetcherService;
132
+ __decorate([
133
+ (0, common_1.Inject)(),
134
+ __metadata("design:type", webfetch_markdown_service_1.WebFetchMarkdownService)
135
+ ], WebFetchFetcherService.prototype, "markdownService", void 0);
136
+ exports.WebFetchFetcherService = WebFetchFetcherService = __decorate([
137
+ (0, common_1.Injectable)()
138
+ ], WebFetchFetcherService);
139
+ function upgradeToHttps(parsed) {
140
+ if (parsed.protocol === 'http:') {
141
+ const copy = new URL(parsed.toString());
142
+ copy.protocol = 'https:';
143
+ return copy.toString();
144
+ }
145
+ return parsed.toString();
146
+ }
147
+ function isRedirectStatus(status) {
148
+ return status === 301 || status === 302 || status === 303 || status === 307 || status === 308;
149
+ }
150
+ function composeSignal(callerSignal) {
151
+ const timeout = AbortSignal.timeout(constants_1.FETCH_TIMEOUT_MS);
152
+ if (!callerSignal)
153
+ return timeout;
154
+ const controller = new AbortController();
155
+ const abortFrom = (source) => {
156
+ if (!controller.signal.aborted)
157
+ controller.abort(source.reason);
158
+ };
159
+ if (callerSignal.aborted) {
160
+ abortFrom(callerSignal);
161
+ }
162
+ else {
163
+ callerSignal.addEventListener('abort', () => abortFrom(callerSignal), { once: true });
164
+ }
165
+ if (timeout.aborted) {
166
+ abortFrom(timeout);
167
+ }
168
+ else {
169
+ timeout.addEventListener('abort', () => abortFrom(timeout), { once: true });
170
+ }
171
+ return controller.signal;
172
+ }
173
+ async function drain(response) {
174
+ try {
175
+ await response.body?.cancel();
176
+ }
177
+ catch {
178
+ }
179
+ }
180
+ async function readBodyWithCap(response, cap) {
181
+ if (!response.body) {
182
+ const buf = Buffer.from(await response.arrayBuffer());
183
+ if (buf.length > cap)
184
+ throw new errors_1.ContentTooLargeError(cap);
185
+ return buf;
186
+ }
187
+ const reader = response.body.getReader();
188
+ const chunks = [];
189
+ let total = 0;
190
+ try {
191
+ while (true) {
192
+ const { value, done } = await reader.read();
193
+ if (done)
194
+ break;
195
+ if (!value)
196
+ continue;
197
+ total += value.byteLength;
198
+ if (total > cap) {
199
+ try {
200
+ await reader.cancel();
201
+ }
202
+ catch {
203
+ }
204
+ throw new errors_1.ContentTooLargeError(cap);
205
+ }
206
+ chunks.push(Buffer.from(value));
207
+ }
208
+ }
209
+ finally {
210
+ try {
211
+ reader.releaseLock();
212
+ }
213
+ catch {
214
+ }
215
+ }
216
+ return Buffer.concat(chunks, total);
217
+ }
218
+ //# sourceMappingURL=webfetch-fetcher.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webfetch-fetcher.service.js","sourceRoot":"","sources":["../../src/services/webfetch-fetcher.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare class WebFetchMarkdownService {
2
+ private instancePromise?;
3
+ private getService;
4
+ toMarkdown(html: string): Promise<string>;
5
+ }
6
+ //# sourceMappingURL=webfetch-markdown.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webfetch-markdown.service.d.ts","sourceRoot":"","sources":["../../src/services/webfetch-markdown.service.ts"],"names":[],"mappings":"AAKA,qBACa,uBAAuB;IAClC,OAAO,CAAC,eAAe,CAAC,CAA4B;IAEpD,OAAO,CAAC,UAAU;IAcZ,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAIhD"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.WebFetchMarkdownService = void 0;
43
+ const common_1 = require("@nestjs/common");
44
+ let WebFetchMarkdownService = class WebFetchMarkdownService {
45
+ instancePromise;
46
+ getService() {
47
+ return (this.instancePromise ??= Promise.resolve().then(() => __importStar(require('turndown'))).then((m) => {
48
+ const Turndown = m.default;
49
+ const td = new Turndown({
50
+ headingStyle: 'atx',
51
+ codeBlockStyle: 'fenced',
52
+ });
53
+ td.remove(['script', 'style', 'noscript', 'iframe']);
54
+ return td;
55
+ }));
56
+ }
57
+ async toMarkdown(html) {
58
+ const service = await this.getService();
59
+ return service.turndown(html);
60
+ }
61
+ };
62
+ exports.WebFetchMarkdownService = WebFetchMarkdownService;
63
+ exports.WebFetchMarkdownService = WebFetchMarkdownService = __decorate([
64
+ (0, common_1.Injectable)()
65
+ ], WebFetchMarkdownService);
66
+ //# sourceMappingURL=webfetch-markdown.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webfetch-markdown.service.js","sourceRoot":"","sources":["../../src/services/webfetch-markdown.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA4C;AAMrC,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IAC1B,eAAe,CAA6B;IAE5C,UAAU;QAChB,OAAO,CAAC,IAAI,CAAC,eAAe,KAAK,kDAAO,UAAU,IAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YAG7D,MAAM,QAAQ,GAAI,CAA0C,CAAC,OAAO,CAAC;YACrE,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC;gBACtB,YAAY,EAAE,KAAK;gBACnB,cAAc,EAAE,QAAQ;aACzB,CAAC,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;YACrD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY;QAC3B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;CACF,CAAA;AArBY,0DAAuB;kCAAvB,uBAAuB;IADnC,IAAA,mBAAU,GAAE;GACA,uBAAuB,CAqBnC"}
@@ -0,0 +1,15 @@
1
+ export interface SummarizeOptions {
2
+ model?: string;
3
+ envApiKey?: string;
4
+ maxTokens?: number;
5
+ signal?: AbortSignal;
6
+ }
7
+ export declare class WebFetchSummarizerService {
8
+ private readonly logger;
9
+ private readonly claudeClientService;
10
+ summarize(url: string, markdown: string, userPrompt: string, options?: SummarizeOptions): Promise<{
11
+ summary: string;
12
+ truncated: boolean;
13
+ }>;
14
+ }
15
+ //# sourceMappingURL=webfetch-summarizer.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webfetch-summarizer.service.d.ts","sourceRoot":"","sources":["../../src/services/webfetch-summarizer.service.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAID,qBACa,yBAAyB;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8C;IAE3D,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAsB;IAS9D,SAAS,CACb,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;CA+BpD"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var WebFetchSummarizerService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.WebFetchSummarizerService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const claude_module_1 = require("@loopstack/claude-module");
16
+ const constants_1 = require("../constants");
17
+ const preapproved_hosts_1 = require("../utils/preapproved-hosts");
18
+ const secondary_model_prompt_1 = require("../utils/secondary-model-prompt");
19
+ const DEFAULT_SUMMARIZER_MODEL = 'claude-haiku-4-5-20251001';
20
+ let WebFetchSummarizerService = WebFetchSummarizerService_1 = class WebFetchSummarizerService {
21
+ logger = new common_1.Logger(WebFetchSummarizerService_1.name);
22
+ claudeClientService;
23
+ async summarize(url, markdown, userPrompt, options) {
24
+ const truncated = markdown.length > constants_1.MAX_MARKDOWN_LENGTH;
25
+ const content = truncated
26
+ ? markdown.slice(0, constants_1.MAX_MARKDOWN_LENGTH) + '\n\n[Content truncated due to length...]'
27
+ : markdown;
28
+ const finalPrompt = (0, secondary_model_prompt_1.makeSecondaryModelPrompt)(content, userPrompt, (0, preapproved_hosts_1.isPreapprovedUrl)(url));
29
+ const client = this.claudeClientService.getClient({
30
+ envApiKey: options?.envApiKey,
31
+ });
32
+ const model = options?.model ?? process.env['CLAUDE_WEB_FETCH_MODEL'] ?? DEFAULT_SUMMARIZER_MODEL;
33
+ const message = await client.messages.create({
34
+ model,
35
+ max_tokens: options?.maxTokens ?? 1024,
36
+ messages: [{ role: 'user', content: finalPrompt }],
37
+ });
38
+ if (options?.signal?.aborted) {
39
+ throw options.signal.reason ?? new Error('aborted');
40
+ }
41
+ const first = message.content[0];
42
+ if (first && 'text' in first) {
43
+ return { summary: first.text, truncated };
44
+ }
45
+ this.logger.warn('Summarizer returned no text block');
46
+ return { summary: '', truncated };
47
+ }
48
+ };
49
+ exports.WebFetchSummarizerService = WebFetchSummarizerService;
50
+ __decorate([
51
+ (0, common_1.Inject)(),
52
+ __metadata("design:type", claude_module_1.ClaudeClientService)
53
+ ], WebFetchSummarizerService.prototype, "claudeClientService", void 0);
54
+ exports.WebFetchSummarizerService = WebFetchSummarizerService = WebFetchSummarizerService_1 = __decorate([
55
+ (0, common_1.Injectable)()
56
+ ], WebFetchSummarizerService);
57
+ //# sourceMappingURL=webfetch-summarizer.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webfetch-summarizer.service.js","sourceRoot":"","sources":["../../src/services/webfetch-summarizer.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAA4D;AAC5D,4DAA+D;AAC/D,4CAAmD;AACnD,kEAA8D;AAC9D,4EAA2E;AAS3E,MAAM,wBAAwB,GAAG,2BAA2B,CAAC;AAGtD,IAAM,yBAAyB,iCAA/B,MAAM,yBAAyB;IACnB,MAAM,GAAG,IAAI,eAAM,CAAC,2BAAyB,CAAC,IAAI,CAAC,CAAC;IAE1C,mBAAmB,CAAsB;IASpE,KAAK,CAAC,SAAS,CACb,GAAW,EACX,QAAgB,EAChB,UAAkB,EAClB,OAA0B;QAE1B,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,GAAG,+BAAmB,CAAC;QACxD,MAAM,OAAO,GAAG,SAAS;YACvB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,+BAAmB,CAAC,GAAG,0CAA0C;YACrF,CAAC,CAAC,QAAQ,CAAC;QAEb,MAAM,WAAW,GAAG,IAAA,iDAAwB,EAAC,OAAO,EAAE,UAAU,EAAE,IAAA,oCAAgB,EAAC,GAAG,CAAC,CAAC,CAAC;QAEzF,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC;YAChD,SAAS,EAAE,OAAO,EAAE,SAAS;SAC9B,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,IAAI,wBAAwB,CAAC;QAElG,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC3C,KAAK;YACL,UAAU,EAAE,OAAO,EAAE,SAAS,IAAI,IAAI;YACtC,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;SACnD,CAAC,CAAC;QAEH,IAAI,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;YAC7B,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACjC,IAAI,KAAK,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;YAC7B,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;QAC5C,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QACtD,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;IACpC,CAAC;CACF,CAAA;AAhDY,8DAAyB;AAGT;IAA1B,IAAA,eAAM,GAAE;8BAAuC,mCAAmB;sEAAC;oCAHzD,yBAAyB;IADrC,IAAA,mBAAU,GAAE;GACA,yBAAyB,CAgDrC"}
@@ -0,0 +1,2 @@
1
+ export * from './web-fetch.tool';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./web-fetch.tool"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAiC"}
@@ -0,0 +1,20 @@
1
+ import { z } from 'zod';
2
+ import { BaseTool, ToolResult } from '@loopstack/common';
3
+ import { WebFetchResult } from '../types';
4
+ export declare const WebFetchSchema: z.ZodObject<{
5
+ url: z.ZodURL;
6
+ prompt: z.ZodOptional<z.ZodString>;
7
+ claude: z.ZodOptional<z.ZodObject<{
8
+ model: z.ZodOptional<z.ZodString>;
9
+ envApiKey: z.ZodOptional<z.ZodString>;
10
+ maxTokens: z.ZodOptional<z.ZodNumber>;
11
+ }, z.core.$strip>>;
12
+ }, z.core.$strict>;
13
+ type WebFetchArgs = z.infer<typeof WebFetchSchema>;
14
+ export declare class WebFetchTool extends BaseTool {
15
+ private readonly fetcher;
16
+ private readonly summarizer;
17
+ call(args: WebFetchArgs): Promise<ToolResult<WebFetchResult>>;
18
+ }
19
+ export {};
20
+ //# sourceMappingURL=web-fetch.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-fetch.tool.d.ts","sourceRoot":"","sources":["../../src/tools/web-fetch.tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAQ,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/D,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1C,eAAO,MAAM,cAAc;;;;;;;;kBAmBhB,CAAC;AAEZ,KAAK,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEnD,qBAQa,YAAa,SAAQ,QAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA4B;IAE3D,IAAI,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;CAiFpE"}