@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.
- package/LICENSE +1 -1
- package/README.md +155 -1
- package/dist/cli.js +388 -4
- package/dist/cli.js.map +1 -1
- package/dist/cli.spec.js +187 -0
- package/dist/cli.spec.js.map +1 -1
- package/dist/converters/llm-converter.d.ts +71 -0
- package/dist/converters/llm-converter.d.ts.map +1 -0
- package/dist/converters/llm-converter.js +191 -0
- package/dist/converters/llm-converter.js.map +1 -0
- package/dist/converters/llm-converter.spec.d.ts +2 -0
- package/dist/converters/llm-converter.spec.d.ts.map +1 -0
- package/dist/converters/llm-converter.spec.js +281 -0
- package/dist/converters/llm-converter.spec.js.map +1 -0
- package/dist/converters/llm-manager.d.ts +88 -0
- package/dist/converters/llm-manager.d.ts.map +1 -0
- package/dist/converters/llm-manager.js +277 -0
- package/dist/converters/llm-manager.js.map +1 -0
- package/dist/converters/llm-manager.spec.d.ts +2 -0
- package/dist/converters/llm-manager.spec.d.ts.map +1 -0
- package/dist/converters/llm-manager.spec.js +280 -0
- package/dist/converters/llm-manager.spec.js.map +1 -0
- package/dist/extractors/metadata-extractor.js +1 -1
- package/dist/extractors/metadata-extractor.js.map +1 -1
- package/dist/index.d.ts +14 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -10
- package/dist/index.js.map +1 -1
- package/dist/index.spec.js +172 -1
- package/dist/index.spec.js.map +1 -1
- package/dist/optimizers/html-cleaner.js +1 -1
- package/dist/optimizers/html-cleaner.js.map +1 -1
- package/dist/optimizers/html-cleaner.spec.js +1 -0
- package/dist/optimizers/html-cleaner.spec.js.map +1 -1
- package/dist/optimizers/llm-formatter.js +2 -2
- package/dist/optimizers/llm-formatter.js.map +1 -1
- package/dist/optimizers/structure-enhancer.js +3 -3
- package/dist/optimizers/structure-enhancer.js.map +1 -1
- package/dist/optimizers/structure-enhancer.spec.js +1 -1
- package/dist/optimizers/structure-enhancer.spec.js.map +1 -1
- package/dist/parsers/markdown-parser.d.ts +36 -0
- package/dist/parsers/markdown-parser.d.ts.map +1 -1
- package/dist/parsers/markdown-parser.js +267 -45
- package/dist/parsers/markdown-parser.js.map +1 -1
- package/dist/parsers/markdown-parser.spec.js +106 -98
- package/dist/parsers/markdown-parser.spec.js.map +1 -1
- package/dist/types.d.ts +149 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/config-loader.d.ts +62 -0
- package/dist/utils/config-loader.d.ts.map +1 -0
- package/dist/utils/config-loader.js +167 -0
- package/dist/utils/config-loader.js.map +1 -0
- package/dist/utils/config-loader.spec.d.ts +2 -0
- package/dist/utils/config-loader.spec.d.ts.map +1 -0
- package/dist/utils/config-loader.spec.js +355 -0
- package/dist/utils/config-loader.spec.js.map +1 -0
- package/dist/utils/url-fetcher.d.ts.map +1 -1
- package/dist/utils/url-fetcher.js +1 -1
- package/dist/utils/url-fetcher.js.map +1 -1
- package/dist/utils/validators.js +1 -1
- package/dist/utils/validators.js.map +1 -1
- 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":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata-extractor.js","sourceRoot":"","sources":["../../src/extractors/metadata-extractor.ts"],"names":[],"mappings":"AAAA,uCAAuC;AAEvC,OAAO,KAAK,OAAO,MAAM,
|
|
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
|
|
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
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
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
|
-
|
|
51
|
-
|
|
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
|
-
|
|
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;
|
|
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"}
|
package/dist/index.spec.js
CHANGED
|
@@ -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
|