@nanocollective/get-md 1.0.2 → 1.1.0-beta.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 (62) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +155 -1
  3. package/dist/cli.js +388 -4
  4. package/dist/cli.js.map +1 -1
  5. package/dist/cli.spec.js +187 -0
  6. package/dist/cli.spec.js.map +1 -1
  7. package/dist/converters/llm-converter.d.ts +71 -0
  8. package/dist/converters/llm-converter.d.ts.map +1 -0
  9. package/dist/converters/llm-converter.js +191 -0
  10. package/dist/converters/llm-converter.js.map +1 -0
  11. package/dist/converters/llm-converter.spec.d.ts +2 -0
  12. package/dist/converters/llm-converter.spec.d.ts.map +1 -0
  13. package/dist/converters/llm-converter.spec.js +281 -0
  14. package/dist/converters/llm-converter.spec.js.map +1 -0
  15. package/dist/converters/llm-manager.d.ts +88 -0
  16. package/dist/converters/llm-manager.d.ts.map +1 -0
  17. package/dist/converters/llm-manager.js +277 -0
  18. package/dist/converters/llm-manager.js.map +1 -0
  19. package/dist/converters/llm-manager.spec.d.ts +2 -0
  20. package/dist/converters/llm-manager.spec.d.ts.map +1 -0
  21. package/dist/converters/llm-manager.spec.js +280 -0
  22. package/dist/converters/llm-manager.spec.js.map +1 -0
  23. package/dist/extractors/metadata-extractor.js +1 -1
  24. package/dist/extractors/metadata-extractor.js.map +1 -1
  25. package/dist/index.d.ts +14 -4
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +23 -10
  28. package/dist/index.js.map +1 -1
  29. package/dist/index.spec.js +172 -1
  30. package/dist/index.spec.js.map +1 -1
  31. package/dist/optimizers/html-cleaner.js +1 -1
  32. package/dist/optimizers/html-cleaner.js.map +1 -1
  33. package/dist/optimizers/html-cleaner.spec.js +1 -0
  34. package/dist/optimizers/html-cleaner.spec.js.map +1 -1
  35. package/dist/optimizers/llm-formatter.js +2 -2
  36. package/dist/optimizers/llm-formatter.js.map +1 -1
  37. package/dist/optimizers/structure-enhancer.js +3 -3
  38. package/dist/optimizers/structure-enhancer.js.map +1 -1
  39. package/dist/optimizers/structure-enhancer.spec.js +1 -1
  40. package/dist/optimizers/structure-enhancer.spec.js.map +1 -1
  41. package/dist/parsers/markdown-parser.d.ts +36 -0
  42. package/dist/parsers/markdown-parser.d.ts.map +1 -1
  43. package/dist/parsers/markdown-parser.js +267 -45
  44. package/dist/parsers/markdown-parser.js.map +1 -1
  45. package/dist/parsers/markdown-parser.spec.js +106 -98
  46. package/dist/parsers/markdown-parser.spec.js.map +1 -1
  47. package/dist/types.d.ts +149 -0
  48. package/dist/types.d.ts.map +1 -1
  49. package/dist/utils/config-loader.d.ts +62 -0
  50. package/dist/utils/config-loader.d.ts.map +1 -0
  51. package/dist/utils/config-loader.js +167 -0
  52. package/dist/utils/config-loader.js.map +1 -0
  53. package/dist/utils/config-loader.spec.d.ts +2 -0
  54. package/dist/utils/config-loader.spec.d.ts.map +1 -0
  55. package/dist/utils/config-loader.spec.js +355 -0
  56. package/dist/utils/config-loader.spec.js.map +1 -0
  57. package/dist/utils/url-fetcher.d.ts.map +1 -1
  58. package/dist/utils/url-fetcher.js +1 -1
  59. package/dist/utils/url-fetcher.js.map +1 -1
  60. package/dist/utils/validators.js +1 -1
  61. package/dist/utils/validators.js.map +1 -1
  62. package/package.json +25 -17
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-manager.spec.d.ts","sourceRoot":"","sources":["../../src/converters/llm-manager.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,280 @@
1
+ // src/converters/llm-manager.spec.ts
2
+ import test from "ava";
3
+ import fs from "node:fs/promises";
4
+ import path from "node:path";
5
+ import os from "node:os";
6
+ import { LLMManager, checkLLMModel, downloadLLMModel, removeLLMModel, getLLMModelInfo, } from "./llm-manager.js";
7
+ // ============================================================================
8
+ // Test Fixtures
9
+ // ============================================================================
10
+ const TEST_MODEL_DIR = path.join(os.tmpdir(), "get-md-test-models");
11
+ const TEST_MODEL_PATH = path.join(TEST_MODEL_DIR, "test-model.gguf");
12
+ // Helper to create a fake model file
13
+ async function createFakeModel(filePath) {
14
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
15
+ await fs.writeFile(filePath, "fake-model-content");
16
+ }
17
+ // Helper to clean up test files
18
+ async function cleanupTestFiles() {
19
+ try {
20
+ await fs.rm(TEST_MODEL_DIR, { recursive: true, force: true });
21
+ }
22
+ catch {
23
+ // Ignore errors
24
+ }
25
+ }
26
+ // ============================================================================
27
+ // LLMManager Class Tests
28
+ // ============================================================================
29
+ test.beforeEach(async () => {
30
+ await cleanupTestFiles();
31
+ });
32
+ test.afterEach(async () => {
33
+ await cleanupTestFiles();
34
+ });
35
+ test("LLMManager: constructor sets default model path", (t) => {
36
+ const manager = new LLMManager();
37
+ const modelPath = manager.getModelPath();
38
+ t.true(modelPath.includes(".get-md"));
39
+ t.true(modelPath.includes("models"));
40
+ t.true(modelPath.endsWith(".gguf"));
41
+ });
42
+ test("LLMManager: constructor accepts custom model path", (t) => {
43
+ const customPath = "/custom/path/model.gguf";
44
+ const manager = new LLMManager({ modelPath: customPath });
45
+ t.is(manager.getModelPath(), customPath);
46
+ });
47
+ test("LLMManager: checkModel returns not available for missing model", async (t) => {
48
+ const manager = new LLMManager({ modelPath: TEST_MODEL_PATH });
49
+ const status = await manager.checkModel();
50
+ t.false(status.available);
51
+ t.is(status.path, TEST_MODEL_PATH);
52
+ t.is(status.size, undefined);
53
+ t.is(status.sizeFormatted, undefined);
54
+ });
55
+ test("LLMManager: checkModel returns available for existing model", async (t) => {
56
+ await createFakeModel(TEST_MODEL_PATH);
57
+ const manager = new LLMManager({ modelPath: TEST_MODEL_PATH });
58
+ const status = await manager.checkModel();
59
+ t.true(status.available);
60
+ t.is(status.path, TEST_MODEL_PATH);
61
+ t.is(typeof status.size, "number");
62
+ t.true(status.size > 0);
63
+ t.is(typeof status.sizeFormatted, "string");
64
+ t.is(status.version, "2.0");
65
+ });
66
+ test("LLMManager: checkModel emits events", async (t) => {
67
+ const events = [];
68
+ const manager = new LLMManager({
69
+ modelPath: TEST_MODEL_PATH,
70
+ onEvent: (event) => {
71
+ events.push(event);
72
+ },
73
+ });
74
+ await manager.checkModel();
75
+ t.true(events.length >= 2);
76
+ t.is(events[0].type, "model-check");
77
+ t.is(events[0].status, "checking");
78
+ t.is(events[1].type, "model-check");
79
+ t.is(events[1].status, "not-found");
80
+ });
81
+ test("LLMManager: checkModel emits found event for existing model", async (t) => {
82
+ await createFakeModel(TEST_MODEL_PATH);
83
+ const events = [];
84
+ const manager = new LLMManager({
85
+ modelPath: TEST_MODEL_PATH,
86
+ onEvent: (event) => {
87
+ events.push(event);
88
+ },
89
+ });
90
+ await manager.checkModel();
91
+ t.true(events.length >= 2);
92
+ t.is(events[1].type, "model-check");
93
+ t.is(events[1].status, "found");
94
+ });
95
+ test("LLMManager: removeModel deletes existing model", async (t) => {
96
+ await createFakeModel(TEST_MODEL_PATH);
97
+ // Verify file exists
98
+ const existsBefore = await fs
99
+ .access(TEST_MODEL_PATH)
100
+ .then(() => true)
101
+ .catch(() => false);
102
+ t.true(existsBefore);
103
+ const manager = new LLMManager({ modelPath: TEST_MODEL_PATH });
104
+ await manager.removeModel();
105
+ // Verify file is deleted
106
+ const existsAfter = await fs
107
+ .access(TEST_MODEL_PATH)
108
+ .then(() => true)
109
+ .catch(() => false);
110
+ t.false(existsAfter);
111
+ });
112
+ test("LLMManager: removeModel handles missing file gracefully", async (t) => {
113
+ const manager = new LLMManager({ modelPath: TEST_MODEL_PATH });
114
+ // Should not throw
115
+ await t.notThrowsAsync(async () => {
116
+ await manager.removeModel();
117
+ });
118
+ });
119
+ test("LLMManager: getModelInfo returns correct structure", (t) => {
120
+ const info = LLMManager.getModelInfo();
121
+ t.is(typeof info.defaultPath, "string");
122
+ t.is(typeof info.recommendedModel, "string");
123
+ t.true(Array.isArray(info.availableModels));
124
+ t.true(info.availableModels.length > 0);
125
+ // Check first model variant
126
+ const variant = info.availableModels[0];
127
+ t.is(typeof variant.name, "string");
128
+ t.is(typeof variant.size, "number");
129
+ t.is(typeof variant.quantization, "string");
130
+ t.is(typeof variant.ramRequired, "string");
131
+ });
132
+ test("LLMManager: getModelInfo includes Q4_K_M as recommended", (t) => {
133
+ const info = LLMManager.getModelInfo();
134
+ t.true(info.recommendedModel.includes("Q4_K_M"));
135
+ t.true(info.availableModels.some((m) => m.name === info.recommendedModel));
136
+ });
137
+ // ============================================================================
138
+ // Exported Function Tests
139
+ // ============================================================================
140
+ test("checkLLMModel: returns status for default path", async (t) => {
141
+ const status = await checkLLMModel();
142
+ t.is(typeof status.available, "boolean");
143
+ t.is(typeof status.path, "string");
144
+ });
145
+ test("checkLLMModel: accepts custom model path", async (t) => {
146
+ await createFakeModel(TEST_MODEL_PATH);
147
+ const status = await checkLLMModel({ modelPath: TEST_MODEL_PATH });
148
+ t.true(status.available);
149
+ t.is(status.path, TEST_MODEL_PATH);
150
+ });
151
+ test("removeLLMModel: removes model at custom path", async (t) => {
152
+ await createFakeModel(TEST_MODEL_PATH);
153
+ await removeLLMModel({ modelPath: TEST_MODEL_PATH });
154
+ const exists = await fs
155
+ .access(TEST_MODEL_PATH)
156
+ .then(() => true)
157
+ .catch(() => false);
158
+ t.false(exists);
159
+ });
160
+ test("removeLLMModel: handles missing model gracefully", async (t) => {
161
+ await t.notThrowsAsync(async () => {
162
+ await removeLLMModel({ modelPath: TEST_MODEL_PATH });
163
+ });
164
+ });
165
+ test("getLLMModelInfo: returns model information", (t) => {
166
+ const info = getLLMModelInfo();
167
+ t.is(typeof info, "object");
168
+ t.is(typeof info.defaultPath, "string");
169
+ t.is(typeof info.recommendedModel, "string");
170
+ t.true(Array.isArray(info.availableModels));
171
+ });
172
+ test("getLLMModelInfo: default path is in home directory", (t) => {
173
+ const info = getLLMModelInfo();
174
+ t.true(info.defaultPath.includes(os.homedir()));
175
+ t.true(info.defaultPath.includes(".get-md"));
176
+ });
177
+ test("getLLMModelInfo: includes multiple model variants", (t) => {
178
+ const info = getLLMModelInfo();
179
+ t.true(info.availableModels.length >= 3);
180
+ // Check for different quantization types
181
+ const quantizations = info.availableModels.map((m) => m.quantization);
182
+ t.true(quantizations.includes("Q2_K"));
183
+ t.true(quantizations.includes("Q4_K_M"));
184
+ t.true(quantizations.includes("Q8_0"));
185
+ });
186
+ // ============================================================================
187
+ // Type Export Tests
188
+ // ============================================================================
189
+ test("types: LLMModelStatus interface is properly structured", async (t) => {
190
+ const status = {
191
+ available: false,
192
+ path: "/test/path",
193
+ };
194
+ t.is(typeof status.available, "boolean");
195
+ t.is(typeof status.path, "string");
196
+ });
197
+ test("types: LLMModelStatus with all fields", async (t) => {
198
+ const status = {
199
+ available: true,
200
+ path: "/test/path",
201
+ size: 1024,
202
+ sizeFormatted: "1KB",
203
+ version: "2.0",
204
+ };
205
+ t.is(status.available, true);
206
+ t.is(status.size, 1024);
207
+ t.is(status.sizeFormatted, "1KB");
208
+ t.is(status.version, "2.0");
209
+ });
210
+ test("types: LLMModelInfo interface is properly structured", (t) => {
211
+ const info = {
212
+ defaultPath: "/path",
213
+ recommendedModel: "model",
214
+ availableModels: [
215
+ {
216
+ name: "test",
217
+ size: 100,
218
+ quantization: "Q4",
219
+ ramRequired: "2GB",
220
+ },
221
+ ],
222
+ };
223
+ t.is(typeof info.defaultPath, "string");
224
+ t.is(typeof info.recommendedModel, "string");
225
+ t.true(Array.isArray(info.availableModels));
226
+ });
227
+ // ============================================================================
228
+ // Edge Cases
229
+ // ============================================================================
230
+ test("LLMManager: handles empty model file", async (t) => {
231
+ await fs.mkdir(path.dirname(TEST_MODEL_PATH), { recursive: true });
232
+ await fs.writeFile(TEST_MODEL_PATH, "");
233
+ const manager = new LLMManager({ modelPath: TEST_MODEL_PATH });
234
+ const status = await manager.checkModel();
235
+ // Empty file should not be considered available
236
+ t.false(status.available);
237
+ });
238
+ test("LLMManager: handles directory instead of file", async (t) => {
239
+ await fs.mkdir(TEST_MODEL_PATH, { recursive: true });
240
+ const manager = new LLMManager({ modelPath: TEST_MODEL_PATH });
241
+ const status = await manager.checkModel();
242
+ // Directory should not be considered a valid model
243
+ t.false(status.available);
244
+ });
245
+ test("LLMManager: async event callback works correctly", async (t) => {
246
+ const events = [];
247
+ const manager = new LLMManager({
248
+ modelPath: TEST_MODEL_PATH,
249
+ onEvent: async (event) => {
250
+ // Simulate async operation
251
+ await new Promise((resolve) => setTimeout(resolve, 1));
252
+ events.push(event);
253
+ },
254
+ });
255
+ await manager.checkModel();
256
+ t.true(events.length >= 2);
257
+ });
258
+ // ============================================================================
259
+ // Download Tests (Mocked - don't actually download)
260
+ // ============================================================================
261
+ // Note: We don't test actual downloads in unit tests to avoid network calls
262
+ // and large file downloads. Integration tests should cover actual downloads.
263
+ test("downloadLLMModel: function exists and is callable", (t) => {
264
+ t.is(typeof downloadLLMModel, "function");
265
+ });
266
+ test("downloadLLMModel: accepts options parameter", (t) => {
267
+ // Just verify the function signature is correct by checking it accepts the right shape
268
+ // We use a type assertion to verify the parameter types without actually calling the function
269
+ const options = {
270
+ modelPath: TEST_MODEL_PATH,
271
+ onProgress: () => { },
272
+ onComplete: () => { },
273
+ onError: () => { },
274
+ };
275
+ t.is(typeof options.modelPath, "string");
276
+ t.is(typeof options.onProgress, "function");
277
+ t.is(typeof options.onComplete, "function");
278
+ t.is(typeof options.onError, "function");
279
+ });
280
+ //# sourceMappingURL=llm-manager.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-manager.spec.js","sourceRoot":"","sources":["../../src/converters/llm-manager.spec.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAErC,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EACL,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAG1B,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC;AACpE,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,iBAAiB,CAAC,CAAC;AAErE,qCAAqC;AACrC,KAAK,UAAU,eAAe,CAAC,QAAgB;IAC7C,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;AACrD,CAAC;AAED,gCAAgC;AAChC,KAAK,UAAU,gBAAgB;IAC7B,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,EAAE,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB;IAClB,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,yBAAyB;AACzB,+EAA+E;AAE/E,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE;IACzB,MAAM,gBAAgB,EAAE,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;IACxB,MAAM,gBAAgB,EAAE,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iDAAiD,EAAE,CAAC,CAAC,EAAE,EAAE;IAC5D,MAAM,OAAO,GAAG,IAAI,UAAU,EAAE,CAAC;IACjC,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAEzC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACtC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mDAAmD,EAAE,CAAC,CAAC,EAAE,EAAE;IAC9D,MAAM,UAAU,GAAG,yBAAyB,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;IAE1D,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,UAAU,CAAC,CAAC;AAC3C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gEAAgE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACjF,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAE1C,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IACnC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC7B,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6DAA6D,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC9E,MAAM,eAAe,CAAC,eAAe,CAAC,CAAC;IAEvC,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAE1C,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IACnC,CAAC,CAAC,EAAE,CAAC,OAAO,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAK,GAAG,CAAC,CAAC,CAAC;IACzB,CAAC,CAAC,EAAE,CAAC,OAAO,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAC9B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qCAAqC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACtD,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC;QAC7B,SAAS,EAAE,eAAe;QAC1B,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAE3B,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACpC,CAAC,CAAC,EAAE,CAAE,MAAM,CAAC,CAAC,CAAwB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC3D,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACpC,CAAC,CAAC,EAAE,CAAE,MAAM,CAAC,CAAC,CAAwB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAC9D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6DAA6D,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC9E,MAAM,eAAe,CAAC,eAAe,CAAC,CAAC;IAEvC,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC;QAC7B,SAAS,EAAE,eAAe;QAC1B,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAE3B,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IACpC,CAAC,CAAC,EAAE,CAAE,MAAM,CAAC,CAAC,CAAwB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC1D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gDAAgD,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACjE,MAAM,eAAe,CAAC,eAAe,CAAC,CAAC;IAEvC,qBAAqB;IACrB,MAAM,YAAY,GAAG,MAAM,EAAE;SAC1B,MAAM,CAAC,eAAe,CAAC;SACvB,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;SAChB,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAErB,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;IAC/D,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;IAE5B,yBAAyB;IACzB,MAAM,WAAW,GAAG,MAAM,EAAE;SACzB,MAAM,CAAC,eAAe,CAAC;SACvB,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;SAChB,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yDAAyD,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC1E,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;IAE/D,mBAAmB;IACnB,MAAM,CAAC,CAAC,cAAc,CAAC,KAAK,IAAI,EAAE;QAChC,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,oDAAoD,EAAE,CAAC,CAAC,EAAE,EAAE;IAC/D,MAAM,IAAI,GAAG,UAAU,CAAC,YAAY,EAAE,CAAC;IAEvC,CAAC,CAAC,EAAE,CAAC,OAAO,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC,CAAC,EAAE,CAAC,OAAO,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAExC,4BAA4B;IAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,EAAE,CAAC,OAAO,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC,CAAC,EAAE,CAAC,OAAO,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC,CAAC,EAAE,CAAC,OAAO,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC,CAAC,EAAE,CAAC,OAAO,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yDAAyD,EAAE,CAAC,CAAC,EAAE,EAAE;IACpE,MAAM,IAAI,GAAG,UAAU,CAAC,YAAY,EAAE,CAAC;IAEvC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAC7E,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAC/E,0BAA0B;AAC1B,+EAA+E;AAE/E,IAAI,CAAC,gDAAgD,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACjE,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;IAErC,CAAC,CAAC,EAAE,CAAC,OAAO,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACzC,CAAC,CAAC,EAAE,CAAC,OAAO,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0CAA0C,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC3D,MAAM,eAAe,CAAC,eAAe,CAAC,CAAC;IAEvC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;IAEnE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,8CAA8C,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC/D,MAAM,eAAe,CAAC,eAAe,CAAC,CAAC;IAEvC,MAAM,cAAc,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;IAErD,MAAM,MAAM,GAAG,MAAM,EAAE;SACpB,MAAM,CAAC,eAAe,CAAC;SACvB,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;SAChB,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kDAAkD,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACnE,MAAM,CAAC,CAAC,cAAc,CAAC,KAAK,IAAI,EAAE;QAChC,MAAM,cAAc,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4CAA4C,EAAE,CAAC,CAAC,EAAE,EAAE;IACvD,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAE/B,CAAC,CAAC,EAAE,CAAC,OAAO,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC5B,CAAC,CAAC,EAAE,CAAC,OAAO,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC,CAAC,EAAE,CAAC,OAAO,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;AAC9C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,oDAAoD,EAAE,CAAC,CAAC,EAAE,EAAE;IAC/D,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAE/B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;AAC/C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mDAAmD,EAAE,CAAC,CAAC,EAAE,EAAE;IAC9D,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAE/B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;IAEzC,yCAAyC;IACzC,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IACtE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,IAAI,CAAC,wDAAwD,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACzE,MAAM,MAAM,GAAmB;QAC7B,SAAS,EAAE,KAAK;QAChB,IAAI,EAAE,YAAY;KACnB,CAAC;IAEF,CAAC,CAAC,EAAE,CAAC,OAAO,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACzC,CAAC,CAAC,EAAE,CAAC,OAAO,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uCAAuC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACxD,MAAM,MAAM,GAAmB;QAC7B,SAAS,EAAE,IAAI;QACf,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,IAAI;QACV,aAAa,EAAE,KAAK;QACpB,OAAO,EAAE,KAAK;KACf,CAAC;IAEF,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxB,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAC9B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sDAAsD,EAAE,CAAC,CAAC,EAAE,EAAE;IACjE,MAAM,IAAI,GAAiB;QACzB,WAAW,EAAE,OAAO;QACpB,gBAAgB,EAAE,OAAO;QACzB,eAAe,EAAE;YACf;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,GAAG;gBACT,YAAY,EAAE,IAAI;gBAClB,WAAW,EAAE,KAAK;aACnB;SACF;KACF,CAAC;IAEF,CAAC,CAAC,EAAE,CAAC,OAAO,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC,CAAC,EAAE,CAAC,OAAO,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;AAC9C,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E,IAAI,CAAC,sCAAsC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACvD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,MAAM,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IAExC,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAE1C,gDAAgD;IAChD,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+CAA+C,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAChE,MAAM,EAAE,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAErD,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAE1C,mDAAmD;IACnD,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kDAAkD,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACnE,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC;QAC7B,SAAS,EAAE,eAAe;QAC1B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACvB,2BAA2B;YAC3B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YACvD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAE3B,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;AAC7B,CAAC,CAAC,CAAC;AAEH,+EAA+E;AAC/E,oDAAoD;AACpD,+EAA+E;AAE/E,4EAA4E;AAC5E,6EAA6E;AAE7E,IAAI,CAAC,mDAAmD,EAAE,CAAC,CAAC,EAAE,EAAE;IAC9D,CAAC,CAAC,EAAE,CAAC,OAAO,gBAAgB,EAAE,UAAU,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,6CAA6C,EAAE,CAAC,CAAC,EAAE,EAAE;IACxD,uFAAuF;IACvF,8FAA8F;IAC9F,MAAM,OAAO,GAA2C;QACtD,SAAS,EAAE,eAAe;QAC1B,UAAU,EAAE,GAAG,EAAE,GAAE,CAAC;QACpB,UAAU,EAAE,GAAG,EAAE,GAAE,CAAC;QACpB,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;KAClB,CAAC;IAEF,CAAC,CAAC,EAAE,CAAC,OAAO,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC,CAAC,EAAE,CAAC,OAAO,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC5C,CAAC,CAAC,EAAE,CAAC,OAAO,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC5C,CAAC,CAAC,EAAE,CAAC,OAAO,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAC3C,CAAC,CAAC,CAAC"}
@@ -1,5 +1,5 @@
1
1
  // src/extractors/metadata-extractor.ts
2
- import * as cheerio from "cheerio";
2
+ import * as cheerio from "cheerio/slim";
3
3
  /**
4
4
  * Extract metadata from HTML
5
5
  */
@@ -1 +1 @@
1
- {"version":3,"file":"metadata-extractor.js","sourceRoot":"","sources":["../../src/extractors/metadata-extractor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"metadata-extractor.js","sourceRoot":"","sources":["../../src/extractors/metadata-extractor.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import type { MarkdownOptions, MarkdownResult, ContentMetadata, TurndownRule, ConversionStats } from "./types.js";
1
+ import { checkLLMModel, downloadLLMModel, getLLMModelInfo, removeLLMModel } from "./converters/llm-manager.js";
2
+ import type { ContentMetadata, ConversionStats, FetchOptions, LLMDownloadOptions, LLMEvent, LLMEventCallback, LLMModelInfo, LLMModelStatus, LLMModelVariant, MarkdownOptions, MarkdownResult, TurndownRule } from "./types.js";
2
3
  /**
3
4
  * Convert HTML to clean, LLM-optimized Markdown
4
5
  *
@@ -24,12 +25,17 @@ import type { MarkdownOptions, MarkdownResult, ContentMetadata, TurndownRule, Co
24
25
  * // From URL with custom fetch options
25
26
  * const result = await convertToMarkdown('https://example.com', {
26
27
  * timeout: 10000,
27
- * headers: { 'Authorization': 'Bearer token' },
28
- * llmOptimized: true
28
+ * headers: { 'Authorization': 'Bearer token' }
29
29
  * });
30
30
  *
31
31
  * // Force URL mode if auto-detection fails
32
32
  * const result = await convertToMarkdown('example.com', { isUrl: true });
33
+ *
34
+ * // Use LLM for higher quality conversion
35
+ * const result = await convertToMarkdown('https://example.com', {
36
+ * useLLM: true,
37
+ * onLLMEvent: (event) => console.log(event)
38
+ * });
33
39
  * ```
34
40
  */
35
41
  export declare function convertToMarkdown(html: string, options?: MarkdownOptions): Promise<MarkdownResult>;
@@ -40,5 +46,9 @@ export declare function convertToMarkdown(html: string, options?: MarkdownOption
40
46
  * @returns Whether content can be extracted
41
47
  */
42
48
  export declare function hasContent(html: string): boolean;
43
- export type { MarkdownOptions, MarkdownResult, ContentMetadata, ConversionStats, TurndownRule, };
49
+ export { checkLLMModel, downloadLLMModel, removeLLMModel, getLLMModelInfo };
50
+ export { createLLMConverter, LLMConverter, } from "./converters/llm-converter.js";
51
+ export { LLMManager } from "./converters/llm-manager.js";
52
+ export { findConfigPath, type GetMdConfig, loadConfig, loadConfigFromFile, mergeConfigWithOptions, } from "./utils/config-loader.js";
53
+ export type { MarkdownOptions, MarkdownResult, ContentMetadata, ConversionStats, TurndownRule, FetchOptions, LLMEvent, LLMEventCallback, LLMModelStatus, LLMDownloadOptions, LLMModelInfo, LLMModelVariant, };
44
54
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,eAAe,EACf,YAAY,EACZ,eAAe,EAChB,MAAM,YAAY,CAAC;AAGpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,cAAc,CAAC,CAyBzB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhD;AAGD,YAAY,EACV,eAAe,EACf,cAAc,EACd,eAAe,EACf,eAAe,EACf,YAAY,GACb,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,cAAc,EACf,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,YAAY,EACZ,kBAAkB,EAElB,QAAQ,EACR,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,eAAe,EACf,eAAe,EACf,cAAc,EACd,YAAY,EACb,MAAM,YAAY,CAAC;AAIpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,cAAc,CAAC,CA0BzB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhD;AAGD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC;AAE5E,OAAO,EACL,kBAAkB,EAClB,YAAY,GACb,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAGzD,OAAO,EACL,cAAc,EACd,KAAK,WAAW,EAChB,UAAU,EACV,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAGlC,YAAY,EAEV,eAAe,EACf,cAAc,EACd,eAAe,EACf,eAAe,EACf,YAAY,EACZ,YAAY,EAEZ,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,eAAe,GAChB,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  // src/index.ts
2
+ import { checkLLMModel, downloadLLMModel, getLLMModelInfo, removeLLMModel, } from "./converters/llm-manager.js";
2
3
  import { MarkdownParser } from "./parsers/markdown-parser.js";
3
4
  import { fetchUrl, isValidUrl } from "./utils/url-fetcher.js";
4
5
  import { hasContent as hasContentUtil } from "./utils/validators.js";
@@ -27,15 +28,22 @@ import { hasContent as hasContentUtil } from "./utils/validators.js";
27
28
  * // From URL with custom fetch options
28
29
  * const result = await convertToMarkdown('https://example.com', {
29
30
  * timeout: 10000,
30
- * headers: { 'Authorization': 'Bearer token' },
31
- * llmOptimized: true
31
+ * headers: { 'Authorization': 'Bearer token' }
32
32
  * });
33
33
  *
34
34
  * // Force URL mode if auto-detection fails
35
35
  * const result = await convertToMarkdown('example.com', { isUrl: true });
36
+ *
37
+ * // Use LLM for higher quality conversion
38
+ * const result = await convertToMarkdown('https://example.com', {
39
+ * useLLM: true,
40
+ * onLLMEvent: (event) => console.log(event)
41
+ * });
36
42
  * ```
37
43
  */
38
44
  export async function convertToMarkdown(html, options) {
45
+ let inputHtml = html;
46
+ let baseUrl = options?.baseUrl;
39
47
  // Check if input is a URL (or forced to be treated as one)
40
48
  if (options?.isUrl || isValidUrl(html)) {
41
49
  // Extract fetch options
@@ -47,16 +55,14 @@ export async function convertToMarkdown(html, options) {
47
55
  userAgent: options?.userAgent,
48
56
  };
49
57
  // Fetch HTML from URL
50
- const fetchedHtml = await fetchUrl(html, fetchOptions);
51
- // Parse with base URL set to the fetched URL
52
- const parser = new MarkdownParser();
53
- return parser.convert(fetchedHtml, {
54
- ...options,
55
- baseUrl: options?.baseUrl || html,
56
- });
58
+ inputHtml = await fetchUrl(html, fetchOptions);
59
+ baseUrl = baseUrl || html;
57
60
  }
58
61
  const parser = new MarkdownParser();
59
- return parser.convert(html, options);
62
+ const convertOptions = { ...options, baseUrl };
63
+ // Use async path to enable Readability content extraction
64
+ // sync path doesn't support content extraction
65
+ return parser.convertAsync(inputHtml, convertOptions);
60
66
  }
61
67
  /**
62
68
  * Validate if HTML contains extractable content
@@ -67,4 +73,11 @@ export async function convertToMarkdown(html, options) {
67
73
  export function hasContent(html) {
68
74
  return hasContentUtil(html);
69
75
  }
76
+ // Re-export LLM utility functions
77
+ export { checkLLMModel, downloadLLMModel, removeLLMModel, getLLMModelInfo };
78
+ export { createLLMConverter, LLMConverter, } from "./converters/llm-converter.js";
79
+ // Re-export LLM classes for advanced usage
80
+ export { LLMManager } from "./converters/llm-manager.js";
81
+ // Re-export config utilities
82
+ export { findConfigPath, loadConfig, loadConfigFromFile, mergeConfigWithOptions, } from "./utils/config-loader.js";
70
83
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAe;AAEf,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,UAAU,IAAI,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAUrE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAY,EACZ,OAAyB;IAEzB,2DAA2D;IAC3D,IAAI,OAAO,EAAE,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,wBAAwB;QACxB,MAAM,YAAY,GAAiB;YACjC,OAAO,EAAE,OAAO,EAAE,OAAO;YACzB,eAAe,EAAE,OAAO,EAAE,eAAe;YACzC,YAAY,EAAE,OAAO,EAAE,YAAY;YACnC,OAAO,EAAE,OAAO,EAAE,OAAO;YACzB,SAAS,EAAE,OAAO,EAAE,SAAS;SAC9B,CAAC;QAEF,sBAAsB;QACtB,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAEvD,6CAA6C;QAC7C,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACpC,OAAO,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE;YACjC,GAAG,OAAO;YACV,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI;SAClC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;IACpC,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAe;AAEf,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,cAAc,GACf,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAgB9D,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,UAAU,IAAI,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAErE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAY,EACZ,OAAyB;IAEzB,IAAI,SAAS,GAAG,IAAI,CAAC;IACrB,IAAI,OAAO,GAAG,OAAO,EAAE,OAAO,CAAC;IAE/B,2DAA2D;IAC3D,IAAI,OAAO,EAAE,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,wBAAwB;QACxB,MAAM,YAAY,GAAiB;YACjC,OAAO,EAAE,OAAO,EAAE,OAAO;YACzB,eAAe,EAAE,OAAO,EAAE,eAAe;YACzC,YAAY,EAAE,OAAO,EAAE,YAAY;YACnC,OAAO,EAAE,OAAO,EAAE,OAAO;YACzB,SAAS,EAAE,OAAO,EAAE,SAAS;SAC9B,CAAC;QAEF,sBAAsB;QACtB,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAC/C,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC;IAC5B,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;IACpC,MAAM,cAAc,GAAG,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC;IAE/C,0DAA0D;IAC1D,+CAA+C;IAC/C,OAAO,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;AACxD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,kCAAkC;AAClC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC;AAE5E,OAAO,EACL,kBAAkB,EAClB,YAAY,GACb,MAAM,+BAA+B,CAAC;AACvC,2CAA2C;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAEzD,6BAA6B;AAC7B,OAAO,EACL,cAAc,EAEd,UAAU,EACV,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,0BAA0B,CAAC"}
@@ -1,6 +1,6 @@
1
1
  // src/index.spec.ts
2
2
  import test from "ava";
3
- import { convertToMarkdown, hasContent } from "./index.js";
3
+ import { convertToMarkdown, hasContent, checkLLMModel, downloadLLMModel, removeLLMModel, getLLMModelInfo, LLMManager, LLMConverter, createLLMConverter, } from "./index.js";
4
4
  // Add cleanup hook to force exit after tests complete
5
5
  // This is necessary because network fetch operations can keep the event loop alive
6
6
  test.after.always("cleanup", () => {
@@ -515,4 +515,175 @@ test("hasContent: handles very long HTML efficiently", (t) => {
515
515
  // Should complete quickly (under 1 second)
516
516
  t.true(endTime - startTime < 1000);
517
517
  });
518
+ // ============================================================================
519
+ // LLM Function Export Tests
520
+ // ============================================================================
521
+ test("exports: checkLLMModel is exported and callable", async (t) => {
522
+ t.is(typeof checkLLMModel, "function");
523
+ const status = await checkLLMModel();
524
+ t.is(typeof status.available, "boolean");
525
+ });
526
+ test("exports: downloadLLMModel is exported and callable", (t) => {
527
+ t.is(typeof downloadLLMModel, "function");
528
+ });
529
+ test("exports: removeLLMModel is exported and callable", (t) => {
530
+ t.is(typeof removeLLMModel, "function");
531
+ });
532
+ test("exports: getLLMModelInfo is exported and callable", (t) => {
533
+ t.is(typeof getLLMModelInfo, "function");
534
+ const info = getLLMModelInfo();
535
+ t.is(typeof info.defaultPath, "string");
536
+ t.is(typeof info.recommendedModel, "string");
537
+ t.true(Array.isArray(info.availableModels));
538
+ });
539
+ test("exports: LLMManager class is exported", (t) => {
540
+ t.is(typeof LLMManager, "function");
541
+ const manager = new LLMManager();
542
+ t.truthy(manager);
543
+ t.is(typeof manager.checkModel, "function");
544
+ });
545
+ test("exports: LLMConverter class is exported", (t) => {
546
+ t.is(typeof LLMConverter, "function");
547
+ const converter = new LLMConverter({ modelPath: "/test/path" });
548
+ t.truthy(converter);
549
+ t.is(typeof converter.loadModel, "function");
550
+ });
551
+ test("exports: createLLMConverter factory is exported", (t) => {
552
+ t.is(typeof createLLMConverter, "function");
553
+ const converter = createLLMConverter({ modelPath: "/test/path" });
554
+ t.truthy(converter);
555
+ t.true(converter instanceof LLMConverter);
556
+ });
557
+ // ============================================================================
558
+ // LLM Type Export Tests
559
+ // ============================================================================
560
+ test("types: LLMEvent type is properly structured", (t) => {
561
+ const event = { type: "model-check", status: "checking" };
562
+ t.is(event.type, "model-check");
563
+ });
564
+ test("types: LLMEventCallback type works correctly", (t) => {
565
+ const callback = (event) => {
566
+ t.truthy(event.type);
567
+ };
568
+ callback({ type: "model-check", status: "checking" });
569
+ });
570
+ test("types: LLMModelStatus type is properly structured", (t) => {
571
+ const status = {
572
+ available: true,
573
+ path: "/test/path",
574
+ size: 1024,
575
+ sizeFormatted: "1KB",
576
+ version: "2.0",
577
+ };
578
+ t.is(status.available, true);
579
+ t.is(status.path, "/test/path");
580
+ });
581
+ test("types: LLMDownloadOptions type is properly structured", (t) => {
582
+ const options = {
583
+ modelPath: "/test/path",
584
+ onProgress: (downloaded, total, percentage) => {
585
+ t.is(typeof downloaded, "number");
586
+ t.is(typeof total, "number");
587
+ t.is(typeof percentage, "number");
588
+ },
589
+ onComplete: (path) => {
590
+ t.is(typeof path, "string");
591
+ },
592
+ onError: (error) => {
593
+ t.truthy(error);
594
+ },
595
+ };
596
+ t.is(options.modelPath, "/test/path");
597
+ });
598
+ test("types: LLMModelInfo type is properly structured", (t) => {
599
+ const info = {
600
+ defaultPath: "/default/path",
601
+ recommendedModel: "test-model",
602
+ availableModels: [],
603
+ };
604
+ t.is(info.defaultPath, "/default/path");
605
+ t.is(info.recommendedModel, "test-model");
606
+ });
607
+ test("types: LLMModelVariant type is properly structured", (t) => {
608
+ const variant = {
609
+ name: "test-variant",
610
+ size: 1024,
611
+ quantization: "Q4_K_M",
612
+ ramRequired: "2-4GB",
613
+ };
614
+ t.is(variant.name, "test-variant");
615
+ t.is(variant.size, 1024);
616
+ t.is(variant.quantization, "Q4_K_M");
617
+ t.is(variant.ramRequired, "2-4GB");
618
+ });
619
+ // ============================================================================
620
+ // LLM Conversion Option Tests
621
+ // ============================================================================
622
+ test("convertToMarkdown: accepts useLLM option", async (t) => {
623
+ const options = {
624
+ useLLM: false,
625
+ };
626
+ // Should work with useLLM: false (uses Turndown)
627
+ const result = await convertToMarkdown(SIMPLE_HTML, options);
628
+ t.truthy(result);
629
+ t.is(typeof result.markdown, "string");
630
+ });
631
+ test("convertToMarkdown: accepts llmFallback option", async (t) => {
632
+ const options = {
633
+ useLLM: false,
634
+ llmFallback: true,
635
+ };
636
+ const result = await convertToMarkdown(SIMPLE_HTML, options);
637
+ t.truthy(result);
638
+ });
639
+ test("convertToMarkdown: accepts llmTemperature option", async (t) => {
640
+ const options = {
641
+ useLLM: false,
642
+ llmTemperature: 0.5,
643
+ };
644
+ const result = await convertToMarkdown(SIMPLE_HTML, options);
645
+ t.truthy(result);
646
+ });
647
+ test("convertToMarkdown: accepts llmMaxTokens option", async (t) => {
648
+ const options = {
649
+ useLLM: false,
650
+ llmMaxTokens: 10000,
651
+ };
652
+ const result = await convertToMarkdown(SIMPLE_HTML, options);
653
+ t.truthy(result);
654
+ });
655
+ test("convertToMarkdown: accepts onLLMEvent callback", async (t) => {
656
+ const events = [];
657
+ const options = {
658
+ useLLM: false,
659
+ onLLMEvent: (event) => {
660
+ events.push(event);
661
+ },
662
+ };
663
+ const result = await convertToMarkdown(SIMPLE_HTML, options);
664
+ t.truthy(result);
665
+ // No events should fire when useLLM is false
666
+ t.is(events.length, 0);
667
+ });
668
+ test("convertToMarkdown: accepts simplified callbacks", async (t) => {
669
+ const options = {
670
+ useLLM: false,
671
+ onDownloadProgress: () => { },
672
+ onModelStatus: () => { },
673
+ onConversionProgress: () => { },
674
+ };
675
+ const result = await convertToMarkdown(SIMPLE_HTML, options);
676
+ t.truthy(result);
677
+ });
678
+ test("convertToMarkdown: useLLM without model falls back to Turndown", async (t) => {
679
+ // When model is not installed and llmFallback is true (default),
680
+ // should fall back to Turndown conversion
681
+ const result = await convertToMarkdown(SIMPLE_HTML, {
682
+ useLLM: true,
683
+ llmFallback: true,
684
+ });
685
+ t.truthy(result);
686
+ t.is(typeof result.markdown, "string");
687
+ t.true(result.markdown.length > 0);
688
+ });
518
689
  //# sourceMappingURL=index.spec.js.map