@j0hanz/fetch-url-mcp 1.4.0 → 1.5.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 (215) hide show
  1. package/dist/cli.d.ts +2 -3
  2. package/dist/cli.js +1 -2
  3. package/dist/http/auth.d.ts +5 -3
  4. package/dist/http/auth.js +64 -15
  5. package/dist/http/health.d.ts +1 -2
  6. package/dist/http/health.js +7 -18
  7. package/dist/http/helpers.d.ts +3 -4
  8. package/dist/http/helpers.js +21 -21
  9. package/dist/http/native.d.ts +0 -1
  10. package/dist/http/native.js +34 -26
  11. package/dist/http/rate-limit.d.ts +0 -1
  12. package/dist/http/rate-limit.js +3 -4
  13. package/dist/index.d.ts +0 -1
  14. package/dist/index.js +17 -18
  15. package/dist/lib/{markdown-cleanup.d.ts → content.d.ts} +4 -2
  16. package/dist/lib/content.js +1356 -0
  17. package/dist/lib/core.d.ts +253 -0
  18. package/dist/lib/core.js +1228 -0
  19. package/dist/lib/{tool-pipeline.d.ts → fetch-pipeline.d.ts} +1 -2
  20. package/dist/lib/{tool-pipeline.js → fetch-pipeline.js} +10 -19
  21. package/dist/lib/{fetch.d.ts → http.d.ts} +7 -9
  22. package/dist/lib/{fetch.js → http.js} +706 -944
  23. package/dist/lib/mcp-tools.d.ts +28 -0
  24. package/dist/lib/mcp-tools.js +107 -0
  25. package/dist/lib/{tool-progress.d.ts → progress.d.ts} +0 -1
  26. package/dist/lib/{tool-progress.js → progress.js} +8 -13
  27. package/dist/lib/task-handlers.d.ts +5 -0
  28. package/dist/lib/{mcp.js → task-handlers.js} +56 -12
  29. package/dist/lib/url.d.ts +70 -0
  30. package/dist/lib/url.js +686 -0
  31. package/dist/lib/utils.d.ts +58 -0
  32. package/dist/lib/utils.js +304 -0
  33. package/dist/prompts/index.d.ts +0 -1
  34. package/dist/prompts/index.js +0 -1
  35. package/dist/resources/index.d.ts +0 -1
  36. package/dist/resources/index.js +74 -33
  37. package/dist/resources/instructions.d.ts +0 -1
  38. package/dist/resources/instructions.js +2 -2
  39. package/dist/schemas/inputs.d.ts +0 -1
  40. package/dist/schemas/inputs.js +2 -3
  41. package/dist/schemas/outputs.d.ts +0 -1
  42. package/dist/schemas/outputs.js +1 -2
  43. package/dist/server.d.ts +0 -1
  44. package/dist/server.js +16 -26
  45. package/dist/tasks/execution.d.ts +0 -1
  46. package/dist/tasks/execution.js +27 -24
  47. package/dist/tasks/manager.d.ts +7 -3
  48. package/dist/tasks/manager.js +53 -34
  49. package/dist/tasks/owner.d.ts +1 -2
  50. package/dist/tasks/owner.js +1 -2
  51. package/dist/tasks/tool-registry.d.ts +1 -2
  52. package/dist/tasks/tool-registry.js +0 -1
  53. package/dist/tools/fetch-url.d.ts +1 -2
  54. package/dist/tools/fetch-url.js +39 -31
  55. package/dist/tools/index.d.ts +0 -1
  56. package/dist/tools/index.js +0 -1
  57. package/dist/transform/html-translators.d.ts +1 -0
  58. package/dist/transform/html-translators.js +454 -0
  59. package/dist/transform/metadata.d.ts +4 -0
  60. package/dist/transform/metadata.js +183 -0
  61. package/dist/transform/transform.d.ts +0 -1
  62. package/dist/transform/transform.js +24 -641
  63. package/dist/transform/types.d.ts +9 -11
  64. package/dist/transform/types.js +0 -1
  65. package/dist/transform/worker-pool.d.ts +0 -1
  66. package/dist/transform/worker-pool.js +7 -16
  67. package/dist/transform/workers/shared.d.ts +0 -1
  68. package/dist/transform/workers/shared.js +1 -2
  69. package/dist/transform/workers/transform-child.d.ts +0 -1
  70. package/dist/transform/workers/transform-child.js +0 -1
  71. package/dist/transform/workers/transform-worker.d.ts +0 -1
  72. package/dist/transform/workers/transform-worker.js +0 -1
  73. package/package.json +6 -3
  74. package/dist/cli.d.ts.map +0 -1
  75. package/dist/cli.js.map +0 -1
  76. package/dist/http/auth.d.ts.map +0 -1
  77. package/dist/http/auth.js.map +0 -1
  78. package/dist/http/health.d.ts.map +0 -1
  79. package/dist/http/health.js.map +0 -1
  80. package/dist/http/helpers.d.ts.map +0 -1
  81. package/dist/http/helpers.js.map +0 -1
  82. package/dist/http/native.d.ts.map +0 -1
  83. package/dist/http/native.js.map +0 -1
  84. package/dist/http/rate-limit.d.ts.map +0 -1
  85. package/dist/http/rate-limit.js.map +0 -1
  86. package/dist/index.d.ts.map +0 -1
  87. package/dist/index.js.map +0 -1
  88. package/dist/lib/cache.d.ts +0 -54
  89. package/dist/lib/cache.d.ts.map +0 -1
  90. package/dist/lib/cache.js +0 -264
  91. package/dist/lib/cache.js.map +0 -1
  92. package/dist/lib/config.d.ts +0 -143
  93. package/dist/lib/config.d.ts.map +0 -1
  94. package/dist/lib/config.js +0 -476
  95. package/dist/lib/config.js.map +0 -1
  96. package/dist/lib/crypto.d.ts +0 -4
  97. package/dist/lib/crypto.d.ts.map +0 -1
  98. package/dist/lib/crypto.js +0 -56
  99. package/dist/lib/crypto.js.map +0 -1
  100. package/dist/lib/dom-noise-removal.d.ts +0 -2
  101. package/dist/lib/dom-noise-removal.d.ts.map +0 -1
  102. package/dist/lib/dom-noise-removal.js +0 -494
  103. package/dist/lib/dom-noise-removal.js.map +0 -1
  104. package/dist/lib/download.d.ts +0 -4
  105. package/dist/lib/download.d.ts.map +0 -1
  106. package/dist/lib/download.js +0 -106
  107. package/dist/lib/download.js.map +0 -1
  108. package/dist/lib/errors.d.ts +0 -14
  109. package/dist/lib/errors.d.ts.map +0 -1
  110. package/dist/lib/errors.js +0 -72
  111. package/dist/lib/errors.js.map +0 -1
  112. package/dist/lib/fetch-content.d.ts +0 -5
  113. package/dist/lib/fetch-content.d.ts.map +0 -1
  114. package/dist/lib/fetch-content.js +0 -164
  115. package/dist/lib/fetch-content.js.map +0 -1
  116. package/dist/lib/fetch-stream.d.ts +0 -5
  117. package/dist/lib/fetch-stream.d.ts.map +0 -1
  118. package/dist/lib/fetch-stream.js +0 -29
  119. package/dist/lib/fetch-stream.js.map +0 -1
  120. package/dist/lib/fetch.d.ts.map +0 -1
  121. package/dist/lib/fetch.js.map +0 -1
  122. package/dist/lib/host-normalization.d.ts +0 -2
  123. package/dist/lib/host-normalization.d.ts.map +0 -1
  124. package/dist/lib/host-normalization.js +0 -91
  125. package/dist/lib/host-normalization.js.map +0 -1
  126. package/dist/lib/ip-blocklist.d.ts +0 -9
  127. package/dist/lib/ip-blocklist.d.ts.map +0 -1
  128. package/dist/lib/ip-blocklist.js +0 -79
  129. package/dist/lib/ip-blocklist.js.map +0 -1
  130. package/dist/lib/json.d.ts +0 -2
  131. package/dist/lib/json.d.ts.map +0 -1
  132. package/dist/lib/json.js +0 -45
  133. package/dist/lib/json.js.map +0 -1
  134. package/dist/lib/language-detection.d.ts +0 -3
  135. package/dist/lib/language-detection.d.ts.map +0 -1
  136. package/dist/lib/language-detection.js +0 -355
  137. package/dist/lib/language-detection.js.map +0 -1
  138. package/dist/lib/markdown-cleanup.d.ts.map +0 -1
  139. package/dist/lib/markdown-cleanup.js +0 -532
  140. package/dist/lib/markdown-cleanup.js.map +0 -1
  141. package/dist/lib/mcp-lifecycle.d.ts +0 -5
  142. package/dist/lib/mcp-lifecycle.d.ts.map +0 -1
  143. package/dist/lib/mcp-lifecycle.js +0 -51
  144. package/dist/lib/mcp-lifecycle.js.map +0 -1
  145. package/dist/lib/mcp-validator.d.ts +0 -17
  146. package/dist/lib/mcp-validator.d.ts.map +0 -1
  147. package/dist/lib/mcp-validator.js +0 -45
  148. package/dist/lib/mcp-validator.js.map +0 -1
  149. package/dist/lib/mcp.d.ts +0 -4
  150. package/dist/lib/mcp.d.ts.map +0 -1
  151. package/dist/lib/mcp.js.map +0 -1
  152. package/dist/lib/observability.d.ts +0 -23
  153. package/dist/lib/observability.d.ts.map +0 -1
  154. package/dist/lib/observability.js +0 -238
  155. package/dist/lib/observability.js.map +0 -1
  156. package/dist/lib/server-tuning.d.ts +0 -15
  157. package/dist/lib/server-tuning.d.ts.map +0 -1
  158. package/dist/lib/server-tuning.js +0 -49
  159. package/dist/lib/server-tuning.js.map +0 -1
  160. package/dist/lib/session.d.ts +0 -45
  161. package/dist/lib/session.d.ts.map +0 -1
  162. package/dist/lib/session.js +0 -263
  163. package/dist/lib/session.js.map +0 -1
  164. package/dist/lib/timer-utils.d.ts +0 -13
  165. package/dist/lib/timer-utils.d.ts.map +0 -1
  166. package/dist/lib/timer-utils.js +0 -44
  167. package/dist/lib/timer-utils.js.map +0 -1
  168. package/dist/lib/tool-errors.d.ts +0 -12
  169. package/dist/lib/tool-errors.d.ts.map +0 -1
  170. package/dist/lib/tool-errors.js +0 -55
  171. package/dist/lib/tool-errors.js.map +0 -1
  172. package/dist/lib/tool-pipeline.d.ts.map +0 -1
  173. package/dist/lib/tool-pipeline.js.map +0 -1
  174. package/dist/lib/tool-progress.d.ts.map +0 -1
  175. package/dist/lib/tool-progress.js.map +0 -1
  176. package/dist/lib/type-guards.d.ts +0 -16
  177. package/dist/lib/type-guards.d.ts.map +0 -1
  178. package/dist/lib/type-guards.js +0 -13
  179. package/dist/lib/type-guards.js.map +0 -1
  180. package/dist/prompts/index.d.ts.map +0 -1
  181. package/dist/prompts/index.js.map +0 -1
  182. package/dist/resources/index.d.ts.map +0 -1
  183. package/dist/resources/index.js.map +0 -1
  184. package/dist/resources/instructions.d.ts.map +0 -1
  185. package/dist/resources/instructions.js.map +0 -1
  186. package/dist/schemas/inputs.d.ts.map +0 -1
  187. package/dist/schemas/inputs.js.map +0 -1
  188. package/dist/schemas/outputs.d.ts.map +0 -1
  189. package/dist/schemas/outputs.js.map +0 -1
  190. package/dist/server.d.ts.map +0 -1
  191. package/dist/server.js.map +0 -1
  192. package/dist/tasks/execution.d.ts.map +0 -1
  193. package/dist/tasks/execution.js.map +0 -1
  194. package/dist/tasks/manager.d.ts.map +0 -1
  195. package/dist/tasks/manager.js.map +0 -1
  196. package/dist/tasks/owner.d.ts.map +0 -1
  197. package/dist/tasks/owner.js.map +0 -1
  198. package/dist/tasks/tool-registry.d.ts.map +0 -1
  199. package/dist/tasks/tool-registry.js.map +0 -1
  200. package/dist/tools/fetch-url.d.ts.map +0 -1
  201. package/dist/tools/fetch-url.js.map +0 -1
  202. package/dist/tools/index.d.ts.map +0 -1
  203. package/dist/tools/index.js.map +0 -1
  204. package/dist/transform/transform.d.ts.map +0 -1
  205. package/dist/transform/transform.js.map +0 -1
  206. package/dist/transform/types.d.ts.map +0 -1
  207. package/dist/transform/types.js.map +0 -1
  208. package/dist/transform/worker-pool.d.ts.map +0 -1
  209. package/dist/transform/worker-pool.js.map +0 -1
  210. package/dist/transform/workers/shared.d.ts.map +0 -1
  211. package/dist/transform/workers/shared.js.map +0 -1
  212. package/dist/transform/workers/transform-child.d.ts.map +0 -1
  213. package/dist/transform/workers/transform-child.js.map +0 -1
  214. package/dist/transform/workers/transform-worker.d.ts.map +0 -1
  215. package/dist/transform/workers/transform-worker.js.map +0 -1
package/dist/lib/cache.js DELETED
@@ -1,264 +0,0 @@
1
- import { EventEmitter } from 'node:events';
2
- import { z } from 'zod';
3
- import { config } from './config.js';
4
- import { sha256Hex } from './crypto.js';
5
- import { getErrorMessage } from './errors.js';
6
- import { stableStringify as stableJsonStringify } from './json.js';
7
- import { logWarn } from './observability.js';
8
- /* -------------------------------------------------------------------------------------------------
9
- * Schemas & Types
10
- * ------------------------------------------------------------------------------------------------- */
11
- const CachedPayloadSchema = z.strictObject({
12
- content: z.string().optional(),
13
- markdown: z.string().optional(),
14
- title: z.string().optional(),
15
- });
16
- /* -------------------------------------------------------------------------------------------------
17
- * Core: Cache Key Logic
18
- * ------------------------------------------------------------------------------------------------- */
19
- const CACHE_CONSTANTS = {
20
- URL_HASH_LENGTH: 32,
21
- VARY_HASH_LENGTH: 16,
22
- };
23
- export function parseCachedPayload(raw) {
24
- try {
25
- const parsed = JSON.parse(raw);
26
- return CachedPayloadSchema.parse(parsed);
27
- }
28
- catch {
29
- return null;
30
- }
31
- }
32
- export function resolveCachedPayloadContent(payload) {
33
- return payload.markdown ?? payload.content ?? null;
34
- }
35
- function createHashFragment(input, length) {
36
- return sha256Hex(input).substring(0, length);
37
- }
38
- function buildCacheKey(namespace, urlHash, varyHash) {
39
- return varyHash
40
- ? `${namespace}:${urlHash}.${varyHash}`
41
- : `${namespace}:${urlHash}`;
42
- }
43
- function resolveVaryString(vary) {
44
- if (typeof vary === 'string')
45
- return vary;
46
- try {
47
- return stableJsonStringify(vary);
48
- }
49
- catch {
50
- return null;
51
- }
52
- }
53
- export function createCacheKey(namespace, url, vary) {
54
- if (!namespace || !url)
55
- return null;
56
- const urlHash = createHashFragment(url, CACHE_CONSTANTS.URL_HASH_LENGTH);
57
- let varyHash;
58
- if (vary) {
59
- const varyString = resolveVaryString(vary);
60
- if (varyString === null)
61
- return null;
62
- if (varyString) {
63
- varyHash = createHashFragment(varyString, CACHE_CONSTANTS.VARY_HASH_LENGTH);
64
- }
65
- }
66
- return buildCacheKey(namespace, urlHash, varyHash);
67
- }
68
- export function parseCacheKey(cacheKey) {
69
- if (!cacheKey)
70
- return null;
71
- const separatorIndex = cacheKey.indexOf(':');
72
- if (separatorIndex === -1)
73
- return null;
74
- const namespace = cacheKey.slice(0, separatorIndex);
75
- const urlHash = cacheKey.slice(separatorIndex + 1);
76
- if (!namespace || !urlHash)
77
- return null;
78
- return { namespace, urlHash };
79
- }
80
- /* -------------------------------------------------------------------------------------------------
81
- * Core: In-Memory Store
82
- * ------------------------------------------------------------------------------------------------- */
83
- class InMemoryCacheStore {
84
- max = config.cache.maxKeys;
85
- maxBytes = config.cache.maxSizeBytes;
86
- ttlMs = config.cache.ttl * 1000;
87
- entries = new Map();
88
- updateEmitter = new EventEmitter();
89
- currentBytes = 0;
90
- isEnabled() {
91
- return config.cache.enabled;
92
- }
93
- isExpired(entry, now = Date.now()) {
94
- return entry.expiresAtMs <= now;
95
- }
96
- keys() {
97
- if (!this.isEnabled())
98
- return [];
99
- const now = Date.now();
100
- const result = [];
101
- for (const [key, entry] of this.entries) {
102
- if (!this.isExpired(entry, now))
103
- result.push(key);
104
- }
105
- return result;
106
- }
107
- onUpdate(listener) {
108
- const wrapped = (event) => {
109
- try {
110
- const result = listener(event);
111
- if (result instanceof Promise) {
112
- void result.catch((error) => {
113
- this.logError('Cache update listener failed (async)', event.cacheKey, error);
114
- });
115
- }
116
- }
117
- catch (error) {
118
- this.logError('Cache update listener failed', event.cacheKey, error);
119
- }
120
- };
121
- this.updateEmitter.on('update', wrapped);
122
- return () => {
123
- this.updateEmitter.off('update', wrapped);
124
- };
125
- }
126
- get(cacheKey, options) {
127
- if (!cacheKey || (!this.isEnabled() && !options?.force))
128
- return undefined;
129
- const entry = this.entries.get(cacheKey);
130
- if (!entry)
131
- return undefined;
132
- const now = Date.now();
133
- if (this.isExpired(entry, now)) {
134
- this.delete(cacheKey);
135
- // listChanged=false: lazy eviction on read is silent — only writes change
136
- // the list. Clients must not rely on list-changed events from reads.
137
- this.notify(cacheKey, false);
138
- return undefined;
139
- }
140
- // Refresh LRU position
141
- this.entries.delete(cacheKey);
142
- this.entries.set(cacheKey, entry);
143
- return entry;
144
- }
145
- delete(cacheKey) {
146
- const entry = this.entries.get(cacheKey);
147
- if (entry) {
148
- this.currentBytes -= entry.content.length;
149
- this.entries.delete(cacheKey);
150
- return true;
151
- }
152
- return false;
153
- }
154
- evictOldestEntry() {
155
- const firstKey = this.entries.keys().next();
156
- return !firstKey.done && this.delete(firstKey.value);
157
- }
158
- set(cacheKey, content, metadata, options) {
159
- if (!cacheKey || !content)
160
- return;
161
- if (!this.isEnabled() && !options?.force)
162
- return;
163
- const now = Date.now();
164
- const expiresAtMs = now + this.ttlMs;
165
- // Check size limit before insertion
166
- const entrySize = content.length;
167
- if (entrySize > this.maxBytes) {
168
- logWarn('Cache entry exceeds max size', {
169
- key: cacheKey,
170
- size: entrySize,
171
- max: this.maxBytes,
172
- });
173
- return;
174
- }
175
- let listChanged = !this.entries.has(cacheKey);
176
- // Evict if needed (size-based)
177
- while (this.currentBytes + entrySize > this.maxBytes) {
178
- if (this.evictOldestEntry()) {
179
- listChanged = true;
180
- }
181
- else {
182
- break;
183
- }
184
- }
185
- const entry = {
186
- url: metadata.url,
187
- content,
188
- fetchedAt: new Date(now).toISOString(),
189
- expiresAt: new Date(expiresAtMs).toISOString(),
190
- expiresAtMs,
191
- ...(metadata.title ? { title: metadata.title } : {}),
192
- };
193
- if (this.entries.has(cacheKey)) {
194
- this.delete(cacheKey);
195
- }
196
- this.entries.set(cacheKey, entry);
197
- this.currentBytes += entrySize;
198
- // Eviction (LRU: first insertion-order key) - Count based
199
- if (this.entries.size > this.max && this.evictOldestEntry()) {
200
- listChanged = true;
201
- }
202
- this.notify(cacheKey, listChanged);
203
- }
204
- notify(cacheKey, listChanged) {
205
- if (this.updateEmitter.listenerCount('update') === 0)
206
- return;
207
- const parts = parseCacheKey(cacheKey);
208
- if (!parts)
209
- return;
210
- this.updateEmitter.emit('update', { cacheKey, ...parts, listChanged });
211
- }
212
- /**
213
- * Read an entry without updating its LRU position.
214
- * Use this for metadata access (e.g. resource listing) to avoid polluting the
215
- * eviction order; expired entries are treated as absent but not evicted here.
216
- */
217
- peek(cacheKey) {
218
- if (!cacheKey)
219
- return undefined;
220
- const entry = this.entries.get(cacheKey);
221
- if (!entry)
222
- return undefined;
223
- if (this.isExpired(entry))
224
- return undefined;
225
- return entry;
226
- }
227
- logError(message, cacheKey, error) {
228
- logWarn(message, {
229
- key: cacheKey.length > 100 ? cacheKey.slice(0, 100) : cacheKey,
230
- error: getErrorMessage(error),
231
- });
232
- }
233
- }
234
- // Singleton Instance
235
- const store = new InMemoryCacheStore();
236
- // Public Proxy API
237
- export function onCacheUpdate(listener) {
238
- return store.onUpdate(listener);
239
- }
240
- export function get(cacheKey, options) {
241
- return store.get(cacheKey, options);
242
- }
243
- export function set(cacheKey, content, metadata, options) {
244
- store.set(cacheKey, content, metadata, options);
245
- }
246
- export function keys() {
247
- return store.keys();
248
- }
249
- /**
250
- * Return lightweight metadata (url and optional page title) for a cache entry.
251
- * Returns `undefined` if the key is not found or cache is disabled.
252
- */
253
- export function getEntryMeta(cacheKey) {
254
- const entry = store.peek(cacheKey);
255
- if (!entry)
256
- return undefined;
257
- return entry.title !== undefined
258
- ? { url: entry.url, title: entry.title }
259
- : { url: entry.url };
260
- }
261
- export function isEnabled() {
262
- return store.isEnabled();
263
- }
264
- //# sourceMappingURL=cache.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/lib/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,eAAe,IAAI,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C;;uGAEuG;AAEvG,MAAM,mBAAmB,GAAG,CAAC,CAAC,YAAY,CAAC;IACzC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC7B,CAAC,CAAC;AA2CH;;uGAEuG;AAEvG,MAAM,eAAe,GAAG;IACtB,eAAe,EAAE,EAAE;IACnB,gBAAgB,EAAE,EAAE;CACZ,CAAC;AAEX,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,OAAO,mBAAmB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,OAAsB;IAEtB,OAAO,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;AACrD,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa,EAAE,MAAc;IACvD,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,aAAa,CACpB,SAAiB,EACjB,OAAe,EACf,QAAiB;IAEjB,OAAO,QAAQ;QACb,CAAC,CAAC,GAAG,SAAS,IAAI,OAAO,IAAI,QAAQ,EAAE;QACvC,CAAC,CAAC,GAAG,SAAS,IAAI,OAAO,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,iBAAiB,CACxB,IAAsC;IAEtC,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE1C,IAAI,CAAC;QACH,OAAO,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,SAAiB,EACjB,GAAW,EACX,IAAuC;IAEvC,IAAI,CAAC,SAAS,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAEpC,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,EAAE,eAAe,CAAC,eAAe,CAAC,CAAC;IAEzE,IAAI,QAA4B,CAAC;IAEjC,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,UAAU,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAErC,IAAI,UAAU,EAAE,CAAC;YACf,QAAQ,GAAG,kBAAkB,CAC3B,UAAU,EACV,eAAe,CAAC,gBAAgB,CACjC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,aAAa,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,cAAc,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;IACnD,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AAChC,CAAC;AAED;;uGAEuG;AAEvG,MAAM,kBAAkB;IACL,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;IAC3B,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC;IACrC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC;IAEhC,OAAO,GAAG,IAAI,GAAG,EAA4B,CAAC;IAC9C,aAAa,GAAG,IAAI,YAAY,EAAE,CAAC;IAE5C,YAAY,GAAG,CAAC,CAAC;IAEzB,SAAS;QACP,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;IAC9B,CAAC;IAEO,SAAS,CAAC,KAAuB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACzD,OAAO,KAAK,CAAC,WAAW,IAAI,GAAG,CAAC;IAClC,CAAC;IAED,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE,OAAO,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,QAAQ,CAAC,QAA6B;QACpC,MAAM,OAAO,GAAG,CAAC,KAAuB,EAAQ,EAAE;YAChD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAC/B,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;oBAC9B,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;wBACnC,IAAI,CAAC,QAAQ,CACX,sCAAsC,EACtC,KAAK,CAAC,QAAQ,EACd,KAAK,CACN,CAAC;oBACJ,CAAC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,QAAQ,CAAC,8BAA8B,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACvE,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC,CAAC;IACJ,CAAC;IAED,GAAG,CACD,QAAuB,EACvB,OAAyB;QAEzB,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAE1E,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAE7B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACtB,0EAA0E;YAC1E,qEAAqE;YACrE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAC7B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,uBAAuB;QACvB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAElC,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,MAAM,CAAC,QAAgB;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAC1C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,gBAAgB;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;QAC5C,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC;IAED,GAAG,CACD,QAAuB,EACvB,OAAe,EACf,QAA4B,EAC5B,OAAyB;QAEzB,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO;YAAE,OAAO;QAClC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK;YAAE,OAAO;QAEjD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,WAAW,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC;QAErC,oCAAoC;QACpC,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;QACjC,IAAI,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,OAAO,CAAC,8BAA8B,EAAE;gBACtC,GAAG,EAAE,QAAQ;gBACb,IAAI,EAAE,SAAS;gBACf,GAAG,EAAE,IAAI,CAAC,QAAQ;aACnB,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,WAAW,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAE9C,+BAA+B;QAC/B,OAAO,IAAI,CAAC,YAAY,GAAG,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YACrD,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;gBAC5B,WAAW,GAAG,IAAI,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,MAAM;YACR,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAqB;YAC9B,GAAG,EAAE,QAAQ,CAAC,GAAG;YACjB,OAAO;YACP,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE;YACtC,SAAS,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE;YAC9C,WAAW;YACX,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrD,CAAC;QAEF,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,YAAY,IAAI,SAAS,CAAC;QAE/B,0DAA0D;QAC1D,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;YAC5D,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACrC,CAAC;IAEO,MAAM,CAAC,QAAgB,EAAE,WAAoB;QACnD,IAAI,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO;QAC7D,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IACzE,CAAC;IAED;;;;OAIG;IACH,IAAI,CAAC,QAAuB;QAC1B,IAAI,CAAC,QAAQ;YAAE,OAAO,SAAS,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAC7B,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAC5C,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,QAAQ,CAAC,OAAe,EAAE,QAAgB,EAAE,KAAc;QAChE,OAAO,CAAC,OAAO,EAAE;YACf,GAAG,EAAE,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ;YAC9D,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC;SAC9B,CAAC,CAAC;IACL,CAAC;CACF;AAED,qBAAqB;AACrB,MAAM,KAAK,GAAG,IAAI,kBAAkB,EAAE,CAAC;AAEvC,mBAAmB;AACnB,MAAM,UAAU,aAAa,CAAC,QAA6B;IACzD,OAAO,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,GAAG,CACjB,QAAuB,EACvB,OAAyB;IAEzB,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,GAAG,CACjB,QAAuB,EACvB,OAAe,EACf,QAA4B,EAC5B,OAAyB;IAEzB,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,IAAI;IAClB,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,QAAgB;IAEhB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,OAAO,KAAK,CAAC,KAAK,KAAK,SAAS;QAC9B,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE;QACxC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,KAAK,CAAC,SAAS,EAAE,CAAC;AAC3B,CAAC"}
@@ -1,143 +0,0 @@
1
- export declare const serverVersion: string;
2
- export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
3
- type TransformWorkerMode = 'threads' | 'process';
4
- type AuthMode = 'oauth' | 'static';
5
- interface WorkerResourceLimits {
6
- maxOldGenerationSizeMb?: number;
7
- maxYoungGenerationSizeMb?: number;
8
- codeRangeSizeMb?: number;
9
- stackSizeMb?: number;
10
- }
11
- interface AuthConfig {
12
- mode: AuthMode;
13
- issuerUrl: URL | undefined;
14
- authorizationUrl: URL | undefined;
15
- tokenUrl: URL | undefined;
16
- revocationUrl: URL | undefined;
17
- registrationUrl: URL | undefined;
18
- introspectionUrl: URL | undefined;
19
- resourceUrl: URL;
20
- requiredScopes: string[];
21
- clientId: string | undefined;
22
- clientSecret: string | undefined;
23
- introspectionTimeoutMs: number;
24
- staticTokens: string[];
25
- }
26
- interface HttpsConfig {
27
- enabled: boolean;
28
- keyFile: string | undefined;
29
- certFile: string | undefined;
30
- caFile: string | undefined;
31
- }
32
- interface RuntimeState {
33
- httpMode: boolean;
34
- }
35
- export declare const config: {
36
- server: {
37
- name: string;
38
- version: string;
39
- port: number;
40
- host: string;
41
- https: HttpsConfig;
42
- sessionTtlMs: number;
43
- sessionInitTimeoutMs: number;
44
- maxSessions: number;
45
- http: {
46
- headersTimeoutMs: number | undefined;
47
- requestTimeoutMs: number | undefined;
48
- keepAliveTimeoutMs: number | undefined;
49
- keepAliveTimeoutBufferMs: number | undefined;
50
- maxHeadersCount: number | undefined;
51
- maxConnections: number;
52
- blockPrivateConnections: boolean;
53
- requireProtocolVersionHeaderOnSessionInit: boolean;
54
- shutdownCloseIdleConnections: boolean;
55
- shutdownCloseAllConnections: boolean;
56
- };
57
- };
58
- fetcher: {
59
- timeout: number;
60
- maxRedirects: number;
61
- userAgent: string;
62
- maxContentLength: number;
63
- };
64
- transform: {
65
- timeoutMs: number;
66
- stageWarnRatio: number;
67
- metadataFormat: string;
68
- maxWorkerScale: number;
69
- cancelAckTimeoutMs: number;
70
- workerMode: TransformWorkerMode;
71
- workerResourceLimits: WorkerResourceLimits | undefined;
72
- };
73
- tools: {
74
- enabled: string[];
75
- timeoutMs: number;
76
- };
77
- tasks: {
78
- maxTotal: number;
79
- maxPerOwner: number;
80
- emitStatusNotifications: boolean;
81
- };
82
- cache: {
83
- enabled: boolean;
84
- ttl: number;
85
- maxKeys: number;
86
- maxSizeBytes: number;
87
- };
88
- extraction: {
89
- maxBlockLength: number;
90
- minParagraphLength: number;
91
- };
92
- noiseRemoval: {
93
- extraTokens: string[];
94
- extraSelectors: string[];
95
- enabledCategories: string[];
96
- debug: boolean;
97
- aggressiveMode: boolean;
98
- preserveSvgCanvas: boolean;
99
- weights: {
100
- hidden: number;
101
- structural: number;
102
- promo: number;
103
- stickyFixed: number;
104
- threshold: number;
105
- };
106
- };
107
- markdownCleanup: {
108
- promoteOrphanHeadings: boolean;
109
- removeSkipLinks: boolean;
110
- removeTocBlocks: boolean;
111
- removeTypeDocComments: boolean;
112
- headingKeywords: string[];
113
- };
114
- i18n: {
115
- locale: string | undefined;
116
- };
117
- logging: {
118
- level: LogLevel;
119
- format: string;
120
- };
121
- constants: {
122
- maxHtmlSize: number;
123
- maxUrlLength: number;
124
- maxInlineContentChars: number;
125
- };
126
- security: {
127
- blockedHosts: Set<string>;
128
- allowedHosts: Set<string>;
129
- apiKey: string | undefined;
130
- allowRemote: boolean;
131
- };
132
- auth: AuthConfig;
133
- rateLimit: {
134
- enabled: boolean;
135
- maxRequests: number;
136
- windowMs: number;
137
- cleanupIntervalMs: number;
138
- };
139
- runtime: RuntimeState;
140
- };
141
- export declare function enableHttpMode(): void;
142
- export {};
143
- //# sourceMappingURL=config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAkCA,eAAO,MAAM,aAAa,EAAE,MAA2C,CAAC;AAExE,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AA0B3D,KAAK,mBAAmB,GAAG,SAAS,GAAG,SAAS,CAAC;AAEjD,KAAK,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AA+OnC,UAAU,oBAAoB;IAC5B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA+BD,UAAU,UAAU;IAClB,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,GAAG,GAAG,SAAS,CAAC;IAC3B,gBAAgB,EAAE,GAAG,GAAG,SAAS,CAAC;IAClC,QAAQ,EAAE,GAAG,GAAG,SAAS,CAAC;IAC1B,aAAa,EAAE,GAAG,GAAG,SAAS,CAAC;IAC/B,eAAe,EAAE,GAAG,GAAG,SAAS,CAAC;IACjC,gBAAgB,EAAE,GAAG,GAAG,SAAS,CAAC;IAClC,WAAW,EAAE,GAAG,CAAC;IACjB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,UAAU,WAAW;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AA+ID,UAAU,YAAY;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAMD,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyHlB,CAAC;AAEF,wBAAgB,cAAc,IAAI,IAAI,CAErC"}