@j0hanz/fetch-url-mcp 1.2.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/dist/cache.d.ts +9 -3
  2. package/dist/cache.d.ts.map +1 -0
  3. package/dist/cache.js +54 -119
  4. package/dist/cache.js.map +1 -0
  5. package/dist/cli.d.ts +1 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +7 -4
  8. package/dist/cli.js.map +1 -0
  9. package/dist/config.d.ts +2 -3
  10. package/dist/config.d.ts.map +1 -0
  11. package/dist/config.js +19 -27
  12. package/dist/config.js.map +1 -0
  13. package/dist/crypto.d.ts +1 -0
  14. package/dist/crypto.d.ts.map +1 -0
  15. package/dist/crypto.js +7 -3
  16. package/dist/crypto.js.map +1 -0
  17. package/dist/dom-noise-removal.d.ts +2 -1
  18. package/dist/dom-noise-removal.d.ts.map +1 -0
  19. package/dist/dom-noise-removal.js +9 -6
  20. package/dist/dom-noise-removal.js.map +1 -0
  21. package/dist/download.d.ts +4 -0
  22. package/dist/download.d.ts.map +1 -0
  23. package/dist/download.js +106 -0
  24. package/dist/download.js.map +1 -0
  25. package/dist/errors.d.ts +1 -0
  26. package/dist/errors.d.ts.map +1 -0
  27. package/dist/errors.js +2 -1
  28. package/dist/errors.js.map +1 -0
  29. package/dist/examples/mcp-fetch-url-client.js +19 -3
  30. package/dist/examples/mcp-fetch-url-client.js.map +1 -1
  31. package/dist/fetch-content.d.ts +1 -0
  32. package/dist/fetch-content.d.ts.map +1 -0
  33. package/dist/fetch-content.js +15 -14
  34. package/dist/fetch-content.js.map +1 -0
  35. package/dist/fetch-stream.d.ts +1 -0
  36. package/dist/fetch-stream.d.ts.map +1 -0
  37. package/dist/fetch-stream.js +1 -0
  38. package/dist/fetch-stream.js.map +1 -0
  39. package/dist/fetch.d.ts +1 -0
  40. package/dist/fetch.d.ts.map +1 -0
  41. package/dist/fetch.js +123 -54
  42. package/dist/fetch.js.map +1 -0
  43. package/dist/host-normalization.d.ts +1 -0
  44. package/dist/host-normalization.d.ts.map +1 -0
  45. package/dist/host-normalization.js +22 -9
  46. package/dist/host-normalization.js.map +1 -0
  47. package/dist/http/auth.d.ts +51 -0
  48. package/dist/http/auth.d.ts.map +1 -0
  49. package/dist/http/auth.js +344 -0
  50. package/dist/http/auth.js.map +1 -0
  51. package/dist/http/health.d.ts +7 -0
  52. package/dist/http/health.d.ts.map +1 -0
  53. package/dist/http/health.js +156 -0
  54. package/dist/http/health.js.map +1 -0
  55. package/dist/http/helpers.d.ts +58 -0
  56. package/dist/http/helpers.d.ts.map +1 -0
  57. package/dist/http/helpers.js +370 -0
  58. package/dist/http/helpers.js.map +1 -0
  59. package/dist/{http-native.d.ts → http/native.d.ts} +1 -0
  60. package/dist/http/native.d.ts.map +1 -0
  61. package/dist/http/native.js +618 -0
  62. package/dist/http/native.js.map +1 -0
  63. package/dist/http/rate-limit.d.ts +13 -0
  64. package/dist/http/rate-limit.d.ts.map +1 -0
  65. package/dist/http/rate-limit.js +92 -0
  66. package/dist/http/rate-limit.js.map +1 -0
  67. package/dist/index.d.ts +1 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +20 -14
  70. package/dist/index.js.map +1 -0
  71. package/dist/instructions.d.ts +2 -0
  72. package/dist/instructions.d.ts.map +1 -0
  73. package/dist/instructions.js +41 -0
  74. package/dist/instructions.js.map +1 -0
  75. package/dist/ip-blocklist.d.ts +1 -0
  76. package/dist/ip-blocklist.d.ts.map +1 -0
  77. package/dist/ip-blocklist.js +13 -8
  78. package/dist/ip-blocklist.js.map +1 -0
  79. package/dist/json.d.ts +2 -1
  80. package/dist/json.d.ts.map +1 -0
  81. package/dist/json.js +16 -6
  82. package/dist/json.js.map +1 -0
  83. package/dist/language-detection.d.ts +1 -0
  84. package/dist/language-detection.d.ts.map +1 -0
  85. package/dist/language-detection.js +2 -7
  86. package/dist/language-detection.js.map +1 -0
  87. package/dist/markdown-cleanup.d.ts +2 -1
  88. package/dist/markdown-cleanup.d.ts.map +1 -0
  89. package/dist/markdown-cleanup.js +52 -54
  90. package/dist/markdown-cleanup.js.map +1 -0
  91. package/dist/mcp-validator.d.ts +1 -0
  92. package/dist/mcp-validator.d.ts.map +1 -0
  93. package/dist/mcp-validator.js +20 -18
  94. package/dist/mcp-validator.js.map +1 -0
  95. package/dist/mcp.d.ts +2 -2
  96. package/dist/mcp.d.ts.map +1 -0
  97. package/dist/mcp.js +35 -344
  98. package/dist/mcp.js.map +1 -0
  99. package/dist/observability.d.ts +2 -0
  100. package/dist/observability.d.ts.map +1 -0
  101. package/dist/observability.js +32 -6
  102. package/dist/observability.js.map +1 -0
  103. package/dist/prompts.d.ts +1 -0
  104. package/dist/prompts.d.ts.map +1 -0
  105. package/dist/prompts.js +15 -3
  106. package/dist/prompts.js.map +1 -0
  107. package/dist/resources.d.ts +1 -0
  108. package/dist/resources.d.ts.map +1 -0
  109. package/dist/resources.js +46 -25
  110. package/dist/resources.js.map +1 -0
  111. package/dist/server-tuning.d.ts +1 -0
  112. package/dist/server-tuning.d.ts.map +1 -0
  113. package/dist/server-tuning.js +14 -17
  114. package/dist/server-tuning.js.map +1 -0
  115. package/dist/server.d.ts +1 -0
  116. package/dist/server.d.ts.map +1 -0
  117. package/dist/server.js +29 -35
  118. package/dist/server.js.map +1 -0
  119. package/dist/session.d.ts +2 -0
  120. package/dist/session.d.ts.map +1 -0
  121. package/dist/session.js +58 -29
  122. package/dist/session.js.map +1 -0
  123. package/dist/tasks/execution.d.ts +42 -0
  124. package/dist/tasks/execution.d.ts.map +1 -0
  125. package/dist/tasks/execution.js +241 -0
  126. package/dist/tasks/execution.js.map +1 -0
  127. package/dist/{tasks.d.ts → tasks/manager.d.ts} +12 -0
  128. package/dist/tasks/manager.d.ts.map +1 -0
  129. package/dist/{tasks.js → tasks/manager.js} +95 -43
  130. package/dist/tasks/manager.js.map +1 -0
  131. package/dist/tasks/owner.d.ts +32 -0
  132. package/dist/tasks/owner.d.ts.map +1 -0
  133. package/dist/tasks/owner.js +92 -0
  134. package/dist/tasks/owner.js.map +1 -0
  135. package/dist/timer-utils.d.ts +1 -0
  136. package/dist/timer-utils.d.ts.map +1 -0
  137. package/dist/timer-utils.js +8 -4
  138. package/dist/timer-utils.js.map +1 -0
  139. package/dist/tool-errors.d.ts +12 -0
  140. package/dist/tool-errors.d.ts.map +1 -0
  141. package/dist/tool-errors.js +55 -0
  142. package/dist/tool-errors.js.map +1 -0
  143. package/dist/tool-pipeline.d.ts +72 -0
  144. package/dist/tool-pipeline.d.ts.map +1 -0
  145. package/dist/tool-pipeline.js +408 -0
  146. package/dist/tool-pipeline.js.map +1 -0
  147. package/dist/tool-progress.d.ts +32 -0
  148. package/dist/tool-progress.d.ts.map +1 -0
  149. package/dist/tool-progress.js +129 -0
  150. package/dist/tool-progress.js.map +1 -0
  151. package/dist/tools.d.ts +35 -111
  152. package/dist/tools.d.ts.map +1 -0
  153. package/dist/tools.js +150 -610
  154. package/dist/tools.js.map +1 -0
  155. package/dist/{transform.d.ts → transform/transform.d.ts} +2 -1
  156. package/dist/transform/transform.d.ts.map +1 -0
  157. package/dist/{transform.js → transform/transform.js} +81 -771
  158. package/dist/transform/transform.js.map +1 -0
  159. package/dist/{transform-types.d.ts → transform/types.d.ts} +2 -0
  160. package/dist/transform/types.d.ts.map +1 -0
  161. package/dist/{transform-types.js → transform/types.js} +1 -0
  162. package/dist/transform/types.js.map +1 -0
  163. package/dist/transform/worker-pool.d.ts +93 -0
  164. package/dist/transform/worker-pool.d.ts.map +1 -0
  165. package/dist/transform/worker-pool.js +757 -0
  166. package/dist/transform/worker-pool.js.map +1 -0
  167. package/dist/transform/workers/transform-child.d.ts +2 -0
  168. package/dist/transform/workers/transform-child.d.ts.map +1 -0
  169. package/dist/{workers → transform/workers}/transform-child.js +17 -13
  170. package/dist/transform/workers/transform-child.js.map +1 -0
  171. package/dist/transform/workers/transform-worker.d.ts +2 -0
  172. package/dist/transform/workers/transform-worker.d.ts.map +1 -0
  173. package/dist/{workers → transform/workers}/transform-worker.js +16 -13
  174. package/dist/transform/workers/transform-worker.js.map +1 -0
  175. package/dist/type-guards.d.ts +1 -0
  176. package/dist/type-guards.d.ts.map +1 -0
  177. package/dist/type-guards.js +4 -4
  178. package/dist/type-guards.js.map +1 -0
  179. package/package.json +6 -7
  180. package/dist/AGENTS.md +0 -152
  181. package/dist/http-native.js +0 -1320
  182. package/dist/instructions.md +0 -113
  183. package/dist/workers/transform-child.d.ts +0 -1
  184. package/dist/workers/transform-worker.d.ts +0 -1
@@ -0,0 +1,92 @@
1
+ import { setInterval as setIntervalPromise } from 'node:timers/promises';
2
+ import { logWarn } from '../observability.js';
3
+ import { sendJson } from './helpers.js';
4
+ function isAbortError(error) {
5
+ return error instanceof Error && error.name === 'AbortError';
6
+ }
7
+ // ---------------------------------------------------------------------------
8
+ // Rate limiter
9
+ // ---------------------------------------------------------------------------
10
+ class RateLimiter {
11
+ options;
12
+ store = new Map();
13
+ cleanup = new AbortController();
14
+ constructor(options) {
15
+ this.options = options;
16
+ this.startCleanupLoop();
17
+ }
18
+ startCleanupLoop() {
19
+ const interval = setIntervalPromise(this.options.cleanupIntervalMs, Date.now, { signal: this.cleanup.signal, ref: false });
20
+ void (async () => {
21
+ try {
22
+ for await (const getNow of interval) {
23
+ this.cleanupEntries(getNow());
24
+ }
25
+ }
26
+ catch (err) {
27
+ if (!isAbortError(err)) {
28
+ logWarn('Rate limit cleanup failed', { error: err });
29
+ }
30
+ }
31
+ })();
32
+ }
33
+ cleanupEntries(now) {
34
+ const maxIdle = this.options.windowMs * 2;
35
+ for (const [key, entry] of this.store.entries()) {
36
+ if (now - entry.lastAccessed > maxIdle) {
37
+ this.store.delete(key);
38
+ }
39
+ }
40
+ }
41
+ resetEntry(entry, now) {
42
+ entry.count = 1;
43
+ entry.resetTime = now + this.options.windowMs;
44
+ entry.lastAccessed = now;
45
+ }
46
+ incrementEntry(entry, now) {
47
+ entry.count += 1;
48
+ entry.lastAccessed = now;
49
+ }
50
+ createEntry(now) {
51
+ return {
52
+ count: 1,
53
+ resetTime: now + this.options.windowMs,
54
+ lastAccessed: now,
55
+ };
56
+ }
57
+ check(ctx) {
58
+ if (!this.options.enabled || ctx.method === 'OPTIONS')
59
+ return true;
60
+ if (!ctx.ip)
61
+ return true; // no identifiable IP (e.g. Unix socket) — bypass rate limiting
62
+ const key = ctx.ip;
63
+ const now = Date.now();
64
+ let entry = this.store.get(key);
65
+ if (entry) {
66
+ if (now > entry.resetTime) {
67
+ this.resetEntry(entry, now);
68
+ }
69
+ else {
70
+ this.incrementEntry(entry, now);
71
+ }
72
+ }
73
+ else {
74
+ entry = this.createEntry(now);
75
+ this.store.set(key, entry);
76
+ }
77
+ if (entry.count > this.options.maxRequests) {
78
+ const retryAfter = Math.max(1, Math.ceil((entry.resetTime - now) / 1000));
79
+ ctx.res.setHeader('Retry-After', String(retryAfter));
80
+ sendJson(ctx.res, 429, { error: 'Rate limit exceeded', retryAfter });
81
+ return false;
82
+ }
83
+ return true;
84
+ }
85
+ stop() {
86
+ this.cleanup.abort();
87
+ }
88
+ }
89
+ export function createRateLimitManagerImpl(options) {
90
+ return new RateLimiter(options);
91
+ }
92
+ //# sourceMappingURL=rate-limit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/http/rate-limit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAEzE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAuB,QAAQ,EAAE,MAAM,cAAc,CAAC;AAmB7D,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC;AAC/D,CAAC;AAOD,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,MAAM,WAAW;IAIc;IAHZ,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC1C,OAAO,GAAG,IAAI,eAAe,EAAE,CAAC;IAEjD,YAA6B,OAAwB;QAAxB,YAAO,GAAP,OAAO,CAAiB;QACnD,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAEO,gBAAgB;QACtB,MAAM,QAAQ,GAAG,kBAAkB,CACjC,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAC9B,IAAI,CAAC,GAAG,EACR,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAC5C,CAAC;QAEF,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,IAAI,CAAC;gBACH,IAAI,KAAK,EAAE,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;oBACpC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvB,OAAO,CAAC,2BAA2B,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IACP,CAAC;IAEO,cAAc,CAAC,GAAW;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YAChD,IAAI,GAAG,GAAG,KAAK,CAAC,YAAY,GAAG,OAAO,EAAE,CAAC;gBACvC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,KAAqB,EAAE,GAAW;QACnD,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;QAChB,KAAK,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;QAC9C,KAAK,CAAC,YAAY,GAAG,GAAG,CAAC;IAC3B,CAAC;IAEO,cAAc,CAAC,KAAqB,EAAE,GAAW;QACvD,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;QACjB,KAAK,CAAC,YAAY,GAAG,GAAG,CAAC;IAC3B,CAAC;IAEO,WAAW,CAAC,GAAW;QAC7B,OAAO;YACL,KAAK,EAAE,CAAC;YACR,SAAS,EAAE,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ;YACtC,YAAY,EAAE,GAAG;SAClB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,GAAmB;QACvB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QAEnE,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC,CAAC,+DAA+D;QACzF,MAAM,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEhC,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,GAAG,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;gBAC1B,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7B,CAAC;QAED,IAAI,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YAC1E,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;YACrD,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,UAAU,EAAE,CAAC,CAAC;YACrE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI;QACF,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF;AAED,MAAM,UAAU,0BAA0B,CACxC,OAAwB;IAExB,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  #!/usr/bin/env node
2
2
  export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import process from 'node:process';
3
3
  import { parseCliArgs, renderCliUsage } from './cli.js';
4
4
  import { serverVersion } from './config.js';
5
- import { startHttpServer } from './http-native.js';
5
+ import { startHttpServer } from './http/native.js';
6
6
  import { logError } from './observability.js';
7
7
  import { startStdioServer } from './server.js';
8
8
  const FORCE_EXIT_TIMEOUT_MS = 10_000;
@@ -47,15 +47,25 @@ function attemptShutdown(signal) {
47
47
  process.stderr.write('Attempting graceful shutdown...\n');
48
48
  void shutdownHandlerRef.current(signal);
49
49
  }
50
- function registerHttpSignalHandlers() {
51
- process.once('SIGINT', () => {
52
- if (shouldAttemptShutdown())
53
- attemptShutdown('SIGINT');
50
+ function registerOnceSignal(signal, handler) {
51
+ process.once(signal, () => {
52
+ handler(signal);
54
53
  });
55
- process.once('SIGTERM', () => {
54
+ }
55
+ function registerHttpSignalHandlers() {
56
+ const tryShutdown = (signal) => {
56
57
  if (shouldAttemptShutdown())
57
- attemptShutdown('SIGTERM');
58
- });
58
+ attemptShutdown(signal);
59
+ };
60
+ for (const signal of ['SIGINT', 'SIGTERM']) {
61
+ registerOnceSignal(signal, tryShutdown);
62
+ }
63
+ }
64
+ function writeStartupError(error) {
65
+ logError('Failed to start server', error);
66
+ process.stderr.write(`Failed to start server: ${error.message}\n`);
67
+ process.exitCode = 1;
68
+ scheduleForcedExit('Startup failure');
59
69
  }
60
70
  function handleFatalError(label, error, signal) {
61
71
  logError(label, error);
@@ -85,10 +95,6 @@ try {
85
95
  }
86
96
  }
87
97
  catch (error) {
88
- const resolvedError = toError(error);
89
- logError('Failed to start server', resolvedError);
90
- const { message } = resolvedError;
91
- process.stderr.write(`Failed to start server: ${message}\n`);
92
- process.exitCode = 1;
93
- scheduleForcedExit('Startup failure');
98
+ writeStartupError(toError(error));
94
99
  }
100
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function buildServerInstructions(): string;
2
+ //# sourceMappingURL=instructions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instructions.d.ts","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":"AAGA,wBAAgB,uBAAuB,IAAI,MAAM,CAsChD"}
@@ -0,0 +1,41 @@
1
+ import { config } from './config.js';
2
+ import { FETCH_URL_TOOL_NAME } from './tools.js';
3
+ export function buildServerInstructions() {
4
+ const maxHtmlSizeMb = config.constants.maxHtmlSize / 1024 / 1024;
5
+ const cacheSizeMb = config.cache.maxSizeBytes / 1024 / 1024;
6
+ const cacheTtlHours = config.cache.ttl / 3600;
7
+ return `<role>Web Content Extractor</role>
8
+ <task>Fetch public webpages and convert HTML to clean Markdown.</task>
9
+
10
+ <capabilities>
11
+ - Tools: \`${FETCH_URL_TOOL_NAME}\` (READ-ONLY).
12
+ - Resources: \`internal://cache/{namespace}/{hash}\` (ephemeral cached Markdown).
13
+ - Prompts: \`get-help\` (returns these instructions).
14
+ </capabilities>
15
+
16
+ <workflows>
17
+ 1. Standard: Call \`${FETCH_URL_TOOL_NAME}\` -> Read \`markdown\`. If \`truncated: true\`, use \`cacheResourceUri\` with \`resources/read\` for full content.
18
+ 2. Fresh: Set \`forceRefresh: true\` to bypass cache.
19
+ 3. Full-Fidelity: Set \`skipNoiseRemoval: true\` to preserve nav/footers.
20
+ 4. Async: Add \`task: { ttl: <ms> }\` to \`tools/call\` -> Poll \`tasks/get\` -> Call \`tasks/result\`.
21
+ </workflows>
22
+
23
+ <constraints>
24
+ - Blocked: localhost, private IPs (10.x, 172.16-31.x, 192.168.x), metadata endpoints (169.254.169.254), .local/.internal.
25
+ - Limits: Max HTML ${maxHtmlSizeMb}MB. Max ${config.fetcher.maxRedirects} redirects.
26
+ - Cache: ${config.cache.maxKeys} entries, ${cacheSizeMb}MB, ${cacheTtlHours}h TTL.
27
+ - No JS: Client-side rendered pages may be incomplete.
28
+ - Binary: Not supported.
29
+ - Batch JSON-RPC: Array requests (\`[{...}]\`) are rejected with HTTP 400.
30
+ - Tasks API: Experimental (SDK v1.26). \`tasks/get\`, \`tasks/result\`, \`tasks/list\`, \`tasks/cancel\` may change.
31
+ </constraints>
32
+
33
+ <error_handling>
34
+ - VALIDATION_ERROR: Invalid/blocked URL. Do not retry.
35
+ - FETCH_ERROR: Network failure. Retry once with backoff.
36
+ - HTTP_xxx: Upstream error. Retry only for 5xx.
37
+ - ABORTED: Cancelled. Retry if needed.
38
+ - queue_full: Worker pool busy. Wait and retry, or use task mode.
39
+ </error_handling>`;
40
+ }
41
+ //# sourceMappingURL=instructions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instructions.js","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,UAAU,uBAAuB;IACrC,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC;IACjE,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,GAAG,IAAI,CAAC;IAC5D,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC;IAE9C,OAAO;;;;aAII,mBAAmB;;;;;;sBAMV,mBAAmB;;;;;;;;qBAQpB,aAAa,WAAW,MAAM,CAAC,OAAO,CAAC,YAAY;WAC7D,MAAM,CAAC,KAAK,CAAC,OAAO,aAAa,WAAW,OAAO,aAAa;;;;;;;;;;;;;kBAazD,CAAC;AACnB,CAAC"}
@@ -6,3 +6,4 @@ export declare function normalizeIpForBlockList(input: string): {
6
6
  family: IpFamily;
7
7
  } | null;
8
8
  export {};
9
+ //# sourceMappingURL=ip-blocklist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ip-blocklist.d.ts","sourceRoot":"","sources":["../src/ip-blocklist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAQ,MAAM,UAAU,CAAC;AAE3C,KAAK,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAkDhC,wBAAgB,sBAAsB,IAAI,SAAS,CAMlD;AAcD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,MAAM,GACZ;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAA;CAAE,GAAG,IAAI,CAmBzC"}
@@ -34,6 +34,7 @@ const BLOCKED_SUBNETS = [
34
34
  { subnet: IPV6_FC00, prefix: 7, family: 'ipv6' },
35
35
  { subnet: IPV6_FE80, prefix: 10, family: 'ipv6' },
36
36
  { subnet: IPV6_FF00, prefix: 8, family: 'ipv6' },
37
+ { subnet: '::', prefix: 96, family: 'ipv6' },
37
38
  ];
38
39
  export function createDefaultBlockList() {
39
40
  const list = new BlockList();
@@ -62,13 +63,17 @@ export function normalizeIpForBlockList(input) {
62
63
  if (!normalizedInput)
63
64
  return null;
64
65
  const ipType = isIP(normalizedInput);
65
- if (ipType === 4)
66
- return { ip: normalizedInput, family: 'ipv4' };
67
- if (ipType === 6) {
68
- const mapped = extractMappedIpv4(normalizedInput);
69
- if (mapped)
70
- return { ip: mapped, family: 'ipv4' };
71
- return { ip: normalizedInput, family: 'ipv6' };
66
+ switch (ipType) {
67
+ case 4:
68
+ return { ip: normalizedInput, family: 'ipv4' };
69
+ case 6: {
70
+ const mapped = extractMappedIpv4(normalizedInput);
71
+ return mapped
72
+ ? { ip: mapped, family: 'ipv4' }
73
+ : { ip: normalizedInput, family: 'ipv6' };
74
+ }
75
+ default:
76
+ return null;
72
77
  }
73
- return null;
74
78
  }
79
+ //# sourceMappingURL=ip-blocklist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ip-blocklist.js","sourceRoot":"","sources":["../src/ip-blocklist.ts"],"names":[],"mappings":"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"}
package/dist/json.d.ts CHANGED
@@ -1 +1,2 @@
1
- export declare function stableStringify(obj: unknown, depth?: number, seen?: WeakSet<object>): string;
1
+ export declare function stableStringify(obj: unknown, depth?: number, seen?: WeakSet<WeakKey>): string;
2
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AAoDA,wBAAgB,eAAe,CAC7B,GAAG,EAAE,OAAO,EACZ,KAAK,SAAI,EACT,IAAI,mBAAgB,GACnB,MAAM,CAGR"}
package/dist/json.js CHANGED
@@ -1,27 +1,36 @@
1
1
  const MAX_DEPTH = 20;
2
+ const MAX_DEPTH_ERROR = `stableStringify: Max depth (${MAX_DEPTH}) exceeded`;
3
+ const CIRCULAR_ERROR = 'stableStringify: Circular reference detected';
4
+ function compareObjectKeys(a, b) {
5
+ if (a === b)
6
+ return 0;
7
+ return a < b ? -1 : 1;
8
+ }
9
+ function getSortedObjectKeys(obj) {
10
+ return Object.keys(obj).sort(compareObjectKeys);
11
+ }
2
12
  function processValue(obj, depth, seen) {
3
13
  if (typeof obj !== 'object' || obj === null) {
4
14
  return obj;
5
15
  }
6
16
  // Depth guard
7
17
  if (depth > MAX_DEPTH) {
8
- throw new Error(`stableStringify: Max depth (${MAX_DEPTH}) exceeded`);
18
+ throw new Error(MAX_DEPTH_ERROR);
9
19
  }
10
20
  // Cycle detection (track active recursion stack only).
11
21
  if (seen.has(obj)) {
12
- throw new Error('stableStringify: Circular reference detected');
22
+ throw new Error(CIRCULAR_ERROR);
13
23
  }
14
24
  seen.add(obj);
15
25
  try {
16
- const processChild = (value) => processValue(value, depth + 1, seen);
17
26
  if (Array.isArray(obj)) {
18
- return obj.map((item) => processChild(item));
27
+ return obj.map((item) => processValue(item, depth + 1, seen));
19
28
  }
20
- const keys = Object.keys(obj).sort((a, b) => a.localeCompare(b));
29
+ const keys = getSortedObjectKeys(obj);
21
30
  const record = obj;
22
31
  const sortedObj = {};
23
32
  for (const key of keys) {
24
- sortedObj[key] = processChild(record[key]);
33
+ sortedObj[key] = processValue(record[key], depth + 1, seen);
25
34
  }
26
35
  return sortedObj;
27
36
  }
@@ -33,3 +42,4 @@ export function stableStringify(obj, depth = 0, seen = new WeakSet()) {
33
42
  const processed = processValue(obj, depth, seen);
34
43
  return JSON.stringify(processed);
35
44
  }
45
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AAAA,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,eAAe,GAAG,+BAA+B,SAAS,YAAY,CAAC;AAC7E,MAAM,cAAc,GAAG,8CAA8C,CAAC;AAEtE,SAAS,iBAAiB,CAAC,CAAS,EAAE,CAAS;IAC7C,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAW;IACtC,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,YAAY,CACnB,GAAY,EACZ,KAAa,EACb,IAAqB;IAErB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5C,OAAO,GAAG,CAAC;IACb,CAAC;IAED,cAAc;IACd,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;IACnC,CAAC;IAED,uDAAuD;IACvD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAEd,IAAI,CAAC;QACH,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,IAAI,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,GAA8B,CAAC;QAC9C,MAAM,SAAS,GAA4B,EAAE,CAAC;QAE9C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,SAAS,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,GAAY,EACZ,KAAK,GAAG,CAAC,EACT,IAAI,GAAG,IAAI,OAAO,EAAE;IAEpB,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACjD,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AACnC,CAAC"}
@@ -1,2 +1,3 @@
1
1
  export declare function resolveLanguageFromAttributes(className: string, dataLang: string): string | undefined;
2
2
  export declare function detectLanguageFromCode(code: string): string | undefined;
3
+ //# sourceMappingURL=language-detection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"language-detection.d.ts","sourceRoot":"","sources":["../src/language-detection.ts"],"names":[],"mappings":"AAoWA,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,SAAS,CAKpB;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA6BvE"}
@@ -101,13 +101,7 @@ function isBashLine(line) {
101
101
  if (BASH_COMMANDS.has(firstWord))
102
102
  return true;
103
103
  // Package Managers
104
- let isPkgMgr = false;
105
- for (const mgr of BASH_PACKAGE_MANAGERS) {
106
- if (firstWord === mgr) {
107
- isPkgMgr = true;
108
- break;
109
- }
110
- }
104
+ const isPkgMgr = BASH_PACKAGE_MANAGERS.includes(firstWord);
111
105
  if (isPkgMgr && spaceIdx !== -1) {
112
106
  const rest = trimmed.slice(spaceIdx + 1);
113
107
  const secondSpaceIdx = rest.indexOf(' ');
@@ -358,3 +352,4 @@ export function detectLanguageFromCode(code) {
358
352
  }
359
353
  return bestLang;
360
354
  }
355
+ //# sourceMappingURL=language-detection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"language-detection.js","sourceRoot":"","sources":["../src/language-detection.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { MetadataBlock } from './transform-types.js';
1
+ import type { MetadataBlock } from './transform/types.js';
2
2
  interface CleanupOptions {
3
3
  signal?: AbortSignal;
4
4
  url?: string;
@@ -9,3 +9,4 @@ export declare function addSourceToMarkdown(content: string, url: string): strin
9
9
  export declare function isRawTextContent(content: string): boolean;
10
10
  export declare function buildMetadataFooter(metadata?: MetadataBlock, fallbackUrl?: string): string;
11
11
  export {};
12
+ //# sourceMappingURL=markdown-cleanup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-cleanup.d.ts","sourceRoot":"","sources":["../src/markdown-cleanup.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAsD1D,UAAU,cAAc;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AA+SD,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,cAAc,GACvB,MAAM,CA6DR;AAoHD,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,SAAS,CAOpB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAmCxE;AAgBD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAczD;AAeD,wBAAgB,mBAAmB,CACjC,QAAQ,CAAC,EAAE,aAAa,EACxB,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAmBR"}
@@ -46,6 +46,13 @@ function throwIfAborted(signal, url, stage) {
46
46
  stage,
47
47
  });
48
48
  }
49
+ function createAbortChecker(options) {
50
+ const signal = options?.signal;
51
+ const url = options?.url ?? '';
52
+ return (stage) => {
53
+ throwIfAborted(signal, url, stage);
54
+ };
55
+ }
49
56
  // --- Helper Functions ---
50
57
  function getLineEnding(content) {
51
58
  return content.includes('\r\n') ? '\r\n' : '\n';
@@ -55,8 +62,7 @@ function isBlank(line) {
55
62
  }
56
63
  function hasFollowingContent(lines, startIndex) {
57
64
  // Optimization: Bound lookahead to avoid checking too many lines in huge files
58
- const max = Math.min(lines.length, startIndex + 50);
59
- for (let i = startIndex + 1; i < max; i++) {
65
+ for (let i = startIndex + 1; i < Math.min(lines.length, startIndex + 50); i++) {
60
66
  if (!isBlank(lines[i]))
61
67
  return true;
62
68
  }
@@ -200,6 +206,7 @@ function preprocessLines(lines, options) {
200
206
  const len = lines.length;
201
207
  const promote = config.markdownCleanup.promoteOrphanHeadings;
202
208
  const removeToc = config.markdownCleanup.removeTocBlocks;
209
+ const checkAbort = createAbortChecker(options);
203
210
  let skipUntil = -1;
204
211
  for (let i = 0; i < len; i++) {
205
212
  if (i < skipUntil)
@@ -216,7 +223,7 @@ function preprocessLines(lines, options) {
216
223
  continue;
217
224
  }
218
225
  if (promote && trimmed.length > 0) {
219
- throwIfAborted(options?.signal, options?.url ?? '', 'markdown:cleanup:promote');
226
+ checkAbort('markdown:cleanup:promote');
220
227
  const promoted = tryPromoteOrphan(lines, i, trimmed);
221
228
  if (promoted)
222
229
  line = promoted;
@@ -234,14 +241,15 @@ function processTextBuffer(lines, options) {
234
241
  }
235
242
  function applyGlobalRegexes(text, options) {
236
243
  let result = text;
237
- throwIfAborted(options?.signal, options?.url ?? '', 'markdown:cleanup:headings');
244
+ const checkAbort = createAbortChecker(options);
245
+ checkAbort('markdown:cleanup:headings');
238
246
  // fixAndSpaceHeadings
239
247
  result = result
240
248
  .replace(REGEX.HEADING_SPACING, '$1\n\n$2')
241
249
  .replace(REGEX.HEADING_CODE_BLOCK, '$1\n\n```')
242
250
  .replace(REGEX.HEADING_CAMEL_CASE, '$1\n\n$2');
243
251
  if (config.markdownCleanup.removeTypeDocComments) {
244
- throwIfAborted(options?.signal, options?.url ?? '', 'markdown:cleanup:typedoc');
252
+ checkAbort('markdown:cleanup:typedoc');
245
253
  result = result
246
254
  .split('\n')
247
255
  .filter((line) => !isTypeDocArtifactLine(line))
@@ -249,12 +257,12 @@ function applyGlobalRegexes(text, options) {
249
257
  result = result.replace(REGEX.TYPEDOC_COMMENT, (match) => match.startsWith('`') ? match : '');
250
258
  }
251
259
  if (config.markdownCleanup.removeSkipLinks) {
252
- throwIfAborted(options?.signal, options?.url ?? '', 'markdown:cleanup:skip-links');
260
+ checkAbort('markdown:cleanup:skip-links');
253
261
  result = result
254
262
  .replace(REGEX.ZERO_WIDTH_ANCHOR, '')
255
263
  .replace(REGEX.COMBINED_LINE_REMOVALS, '');
256
264
  }
257
- throwIfAborted(options?.signal, options?.url ?? '', 'markdown:cleanup:spacing');
265
+ checkAbort('markdown:cleanup:spacing');
258
266
  // normalizeSpacing
259
267
  result = result
260
268
  .replace(REGEX.SPACING_LINK_FIX, ']($1)\n\n[')
@@ -264,7 +272,7 @@ function applyGlobalRegexes(text, options) {
264
272
  .replace(REGEX.SPACING_LIST_NUM_COMBINED, '$1\n\n$2')
265
273
  .replace(REGEX.DOUBLE_NEWLINE_REDUCER, '\n\n');
266
274
  result = normalizeNestedListIndentation(result);
267
- throwIfAborted(options?.signal, options?.url ?? '', 'markdown:cleanup:properties');
275
+ checkAbort('markdown:cleanup:properties');
268
276
  // fixProperties
269
277
  for (let k = 0; k < 3; k++) {
270
278
  const next = result.replace(REGEX.CONCATENATED_PROPS, '$1$2\n\n$3');
@@ -283,65 +291,54 @@ function normalizeNestedListIndentation(text) {
283
291
  return `${normalized}${marker} `;
284
292
  });
285
293
  }
286
- function findNextLine(content, lastIndex, len) {
287
- let nextIndex = content.indexOf('\n', lastIndex);
288
- let line;
289
- if (nextIndex === -1) {
290
- line = content.slice(lastIndex);
291
- nextIndex = len;
292
- }
293
- else {
294
- if (nextIndex > lastIndex && content.charCodeAt(nextIndex - 1) === 13) {
295
- line = content.slice(lastIndex, nextIndex - 1);
296
- }
297
- else {
298
- line = content.slice(lastIndex, nextIndex);
299
- }
300
- nextIndex++; // Skip \n
301
- }
302
- return { line, nextIndex };
303
- }
304
- function checkFenceStart(line) {
305
- const match = REGEX.FENCE_START.exec(line);
306
- return match ? (match[1] ?? '```') : null;
307
- }
308
- function isFenceClosure(trimmed, marker) {
309
- return (trimmed.startsWith(marker) && trimmed.slice(marker.length).trim() === '');
310
- }
311
- function handleFencedLine(line, trimmed, fenceMarker, segments) {
312
- segments.push(line);
313
- return isFenceClosure(trimmed, fenceMarker) ? null : fenceMarker;
314
- }
315
- function handleUnfencedLine(line, segments, buffer, options) {
316
- const newMarker = checkFenceStart(line);
317
- if (!newMarker) {
318
- buffer.push(line);
319
- return { fenceMarker: null, buffer };
320
- }
321
- if (buffer.length > 0) {
322
- segments.push(processTextBuffer(buffer, options));
323
- buffer = [];
324
- }
325
- segments.push(line);
326
- return { fenceMarker: newMarker, buffer };
327
- }
328
294
  export function cleanupMarkdownArtifacts(content, options) {
329
295
  if (!content)
330
296
  return '';
331
- throwIfAborted(options?.signal, options?.url ?? '', 'markdown:cleanup:begin');
297
+ const checkAbort = createAbortChecker(options);
298
+ checkAbort('markdown:cleanup:begin');
332
299
  const len = content.length;
333
300
  let lastIndex = 0;
334
301
  let fenceMarker = null;
335
302
  const segments = [];
336
303
  let buffer = [];
337
304
  while (lastIndex < len) {
338
- const { line, nextIndex } = findNextLine(content, lastIndex, len);
305
+ let nextIndex = content.indexOf('\n', lastIndex);
306
+ let line;
307
+ if (nextIndex === -1) {
308
+ line = content.slice(lastIndex);
309
+ nextIndex = len;
310
+ }
311
+ else {
312
+ if (nextIndex > lastIndex && content.charCodeAt(nextIndex - 1) === 13) {
313
+ line = content.slice(lastIndex, nextIndex - 1);
314
+ }
315
+ else {
316
+ line = content.slice(lastIndex, nextIndex);
317
+ }
318
+ nextIndex++; // Skip \n
319
+ }
339
320
  const trimmed = line.trimStart();
340
321
  if (fenceMarker) {
341
- fenceMarker = handleFencedLine(line, trimmed, fenceMarker, segments);
322
+ segments.push(line);
323
+ if (trimmed.startsWith(fenceMarker) &&
324
+ trimmed.slice(fenceMarker.length).trim() === '') {
325
+ fenceMarker = null;
326
+ }
342
327
  }
343
328
  else {
344
- ({ fenceMarker, buffer } = handleUnfencedLine(line, segments, buffer, options));
329
+ const match = REGEX.FENCE_START.exec(line);
330
+ const newMarker = match ? (match[1] ?? '```') : null;
331
+ if (!newMarker) {
332
+ buffer.push(line);
333
+ }
334
+ else {
335
+ if (buffer.length > 0) {
336
+ segments.push(processTextBuffer(buffer, options));
337
+ buffer = [];
338
+ }
339
+ segments.push(line);
340
+ fenceMarker = newMarker;
341
+ }
345
342
  }
346
343
  lastIndex = nextIndex;
347
344
  }
@@ -534,3 +531,4 @@ export function buildMetadataFooter(metadata, fallbackUrl) {
534
531
  lines.push(` <sub>${metadata.description}</sub>`);
535
532
  return lines.join('\n');
536
533
  }
534
+ //# sourceMappingURL=markdown-cleanup.js.map