docworks 0.11.0 ā 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +86 -148
- package/dist/commands/check.d.ts +3 -2
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +31 -12
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/init.d.ts +0 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +32 -132
- package/dist/commands/init.js.map +1 -1
- package/dist/core/validator.d.ts +3 -3
- package/dist/core/validator.d.ts.map +1 -1
- package/dist/core/validator.js +10 -29
- package/dist/core/validator.js.map +1 -1
- package/dist/index.js +5 -12
- package/dist/index.js.map +1 -1
- package/dist/providers/index.d.ts +3 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +94 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/sources/source.d.ts +5 -0
- package/dist/sources/source.d.ts.map +1 -0
- package/dist/sources/source.js +23 -0
- package/dist/sources/source.js.map +1 -0
- package/dist/types/config.d.ts +7 -13
- package/dist/types/config.d.ts.map +1 -1
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +8 -3
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/reporter.d.ts +1 -1
- package/dist/utils/reporter.d.ts.map +1 -1
- package/dist/utils/reporter.js +18 -51
- package/dist/utils/reporter.js.map +1 -1
- package/package.json +1 -1
- package/dist/commands/test.d.ts +0 -5
- package/dist/commands/test.d.ts.map +0 -1
- package/dist/commands/test.js +0 -45
- package/dist/commands/test.js.map +0 -1
- package/dist/core/ai.d.ts +0 -2
- package/dist/core/ai.d.ts.map +0 -1
- package/dist/core/ai.js +0 -29
- package/dist/core/ai.js.map +0 -1
- package/dist/core/cache.d.ts +0 -3
- package/dist/core/cache.d.ts.map +0 -1
- package/dist/core/cache.js +0 -31
- package/dist/core/cache.js.map +0 -1
- package/dist/providers/anthropic.d.ts +0 -10
- package/dist/providers/anthropic.d.ts.map +0 -1
- package/dist/providers/anthropic.js +0 -51
- package/dist/providers/anthropic.js.map +0 -1
- package/dist/providers/base.d.ts +0 -12
- package/dist/providers/base.d.ts.map +0 -1
- package/dist/providers/base.js +0 -14
- package/dist/providers/base.js.map +0 -1
- package/dist/providers/openai.d.ts +0 -10
- package/dist/providers/openai.d.ts.map +0 -1
- package/dist/providers/openai.js +0 -42
- package/dist/providers/openai.js.map +0 -1
- package/dist/sources/base.d.ts +0 -3
- package/dist/sources/base.d.ts.map +0 -1
- package/dist/sources/base.js +0 -17
- package/dist/sources/base.js.map +0 -1
- package/dist/sources/llms-txt.d.ts +0 -7
- package/dist/sources/llms-txt.d.ts.map +0 -1
- package/dist/sources/llms-txt.js +0 -43
- package/dist/sources/llms-txt.js.map +0 -1
- package/dist/sources/mcp.d.ts +0 -9
- package/dist/sources/mcp.d.ts.map +0 -1
- package/dist/sources/mcp.js +0 -33
- package/dist/sources/mcp.js.map +0 -1
- package/templates/api.yml +0 -21
- package/templates/default.yml +0 -19
- package/templates/gitbook.yml +0 -13
- package/templates/library.yml +0 -21
- package/templates/mintlify.yml +0 -18
- package/templates/readme.yml +0 -13
package/dist/core/validator.js
CHANGED
|
@@ -1,38 +1,19 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
import { getCached, setCached } from './cache.js';
|
|
4
|
-
export async function validateJourneys(journeys, docs, apiKey, useCache = true) {
|
|
1
|
+
import { callProvider } from '../providers/index.js';
|
|
2
|
+
export async function validateJourneys(journeys, docs, apiKey, config) {
|
|
5
3
|
const results = {};
|
|
6
4
|
for (const [journey, questions] of Object.entries(journeys)) {
|
|
7
|
-
results[journey] = await validateQuestions(questions, docs, apiKey,
|
|
5
|
+
results[journey] = await validateQuestions(questions, docs, apiKey, config);
|
|
8
6
|
}
|
|
9
7
|
return results;
|
|
10
8
|
}
|
|
11
|
-
export async function validateQuestions(questions, docs, apiKey,
|
|
9
|
+
export async function validateQuestions(questions, docs, apiKey, config) {
|
|
12
10
|
const results = [];
|
|
11
|
+
const provider = config?.provider || 'openai';
|
|
12
|
+
const model = config?.model || 'gpt-4o-mini';
|
|
13
13
|
for (const question of questions) {
|
|
14
|
-
//
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
.update(question + docs.substring(0, 1000)) // Use first 1KB for cache key
|
|
18
|
-
.digest('hex');
|
|
19
|
-
let result = null;
|
|
20
|
-
// Try cache first
|
|
21
|
-
if (useCache) {
|
|
22
|
-
result = getCached(cacheKey);
|
|
23
|
-
}
|
|
24
|
-
// If not cached, check with AI
|
|
25
|
-
if (!result) {
|
|
26
|
-
const validation = await checkAnswerability(question, docs, apiKey);
|
|
27
|
-
result = {
|
|
28
|
-
question,
|
|
29
|
-
...validation,
|
|
30
|
-
};
|
|
31
|
-
// Cache the result
|
|
32
|
-
if (useCache) {
|
|
33
|
-
setCached(cacheKey, result);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
14
|
+
// Check with AI
|
|
15
|
+
const validation = await callProvider(provider, model, apiKey, question, docs);
|
|
16
|
+
const result = validation;
|
|
36
17
|
results.push(result);
|
|
37
18
|
// Show progress
|
|
38
19
|
const icon = result.answerable === 'YES'
|
|
@@ -40,7 +21,7 @@ export async function validateQuestions(questions, docs, apiKey, useCache = true
|
|
|
40
21
|
: result.answerable === 'PARTIAL'
|
|
41
22
|
? 'ā ļø'
|
|
42
23
|
: 'ā';
|
|
43
|
-
console.log(` ${icon} ${question}`);
|
|
24
|
+
console.log(` ${icon} ${question} (${Math.round(result.confidence * 100)}%)`);
|
|
44
25
|
}
|
|
45
26
|
return results;
|
|
46
27
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/core/validator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/core/validator.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAEpD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAkC,EAClC,IAAY,EACZ,MAAc,EACd,MAAuB;IAEvB,MAAM,OAAO,GAAmB,EAAE,CAAA;IAElC,KAAK,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5D,OAAO,CAAC,OAAO,CAAC,GAAG,MAAM,iBAAiB,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7E,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAAmB,EACnB,IAAY,EACZ,MAAc,EACd,MAAuB;IAEvB,MAAM,OAAO,GAAuB,EAAE,CAAA;IACtC,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,IAAI,QAAQ,CAAA;IAC7C,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,IAAI,aAAa,CAAA;IAE5C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,gBAAgB;QAChB,MAAM,UAAU,GAAG,MAAM,YAAY,CACnC,QAAQ,EACR,KAAK,EACL,MAAM,EACN,QAAQ,EACR,IAAI,CACL,CAAA;QACD,MAAM,MAAM,GAAG,UAAU,CAAA;QAEzB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAEpB,gBAAgB;QAChB,MAAM,IAAI,GACR,MAAM,CAAC,UAAU,KAAK,KAAK;YACzB,CAAC,CAAC,GAAG;YACL,CAAC,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS;gBAC/B,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,GAAG,CAAA;QACX,OAAO,CAAC,GAAG,CACT,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,GAAG,GAAG,CAAC,IAAI,CAClE,CAAA;IACH,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
import { Command } from 'commander';
|
|
3
3
|
import { init } from './commands/init.js';
|
|
4
4
|
import { check } from './commands/check.js';
|
|
5
|
-
import { test } from './commands/test.js';
|
|
6
5
|
const program = new Command();
|
|
7
6
|
program
|
|
8
7
|
.name('docworks')
|
|
@@ -11,22 +10,16 @@ program
|
|
|
11
10
|
program
|
|
12
11
|
.command('init')
|
|
13
12
|
.description('Initialize DocWorks configuration')
|
|
14
|
-
.option('-t, --template <
|
|
15
|
-
.option('-p, --platform <p>', 'Platform: mintlify, readme, gitbook')
|
|
13
|
+
.option('-t, --template <type>', 'Template: simple or journeys', 'simple')
|
|
16
14
|
.action(init);
|
|
17
15
|
program
|
|
18
16
|
.command('check')
|
|
19
|
-
.description('Validate documentation
|
|
17
|
+
.description('Validate documentation')
|
|
20
18
|
.option('-c, --config <path>', 'Config file', 'docworks.yml')
|
|
21
19
|
.option('-j, --journey <name>', 'Check specific journey')
|
|
22
|
-
.option('--
|
|
23
|
-
.option('
|
|
20
|
+
.option('-f, --format <type>', 'Output: json or terminal', 'terminal')
|
|
21
|
+
.option('--provider <name>', 'Override provider')
|
|
22
|
+
.option('--model <name>', 'Override model')
|
|
24
23
|
.action(check);
|
|
25
|
-
program
|
|
26
|
-
.command('test')
|
|
27
|
-
.description('Test if AI can complete tasks using your docs')
|
|
28
|
-
.option('-c, --config <path>', 'Config file', 'docworks.yml')
|
|
29
|
-
.option('--ai <task>', 'Task for AI to complete')
|
|
30
|
-
.action(test);
|
|
31
24
|
program.parse();
|
|
32
25
|
//# 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":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAA;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAE3C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,6CAA6C,CAAC;KAC1D,OAAO,CAAC,OAAO,CAAC,CAAA;AAEnB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,uBAAuB,EAAE,8BAA8B,EAAE,QAAQ,CAAC;KACzE,MAAM,CAAC,IAAI,CAAC,CAAA;AAEf,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,wBAAwB,CAAC;KACrC,MAAM,CAAC,qBAAqB,EAAE,aAAa,EAAE,cAAc,CAAC;KAC5D,MAAM,CAAC,sBAAsB,EAAE,wBAAwB,CAAC;KACxD,MAAM,CAAC,qBAAqB,EAAE,0BAA0B,EAAE,UAAU,CAAC;KACrE,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;KAChD,MAAM,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;KAC1C,MAAM,CAAC,KAAK,CAAC,CAAA;AAEhB,OAAO,CAAC,KAAK,EAAE,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAoCrD,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,gBAAgB,CAAC,CAgE3B"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import OpenAI from 'openai';
|
|
2
|
+
const VALIDATION_SCHEMA = {
|
|
3
|
+
type: 'json_schema',
|
|
4
|
+
name: 'doc_validation',
|
|
5
|
+
schema: {
|
|
6
|
+
type: 'object',
|
|
7
|
+
properties: {
|
|
8
|
+
answerable: {
|
|
9
|
+
type: 'string',
|
|
10
|
+
enum: ['YES', 'PARTIAL', 'NO'],
|
|
11
|
+
},
|
|
12
|
+
confidence: {
|
|
13
|
+
type: 'number',
|
|
14
|
+
description: '0-1 confidence score',
|
|
15
|
+
},
|
|
16
|
+
path: {
|
|
17
|
+
type: 'array',
|
|
18
|
+
items: { type: 'string' },
|
|
19
|
+
description: 'URLs visited to find answer',
|
|
20
|
+
},
|
|
21
|
+
reason: {
|
|
22
|
+
type: 'string',
|
|
23
|
+
description: 'Brief explanation',
|
|
24
|
+
},
|
|
25
|
+
missing: {
|
|
26
|
+
type: ['array', 'null'],
|
|
27
|
+
items: { type: 'string' },
|
|
28
|
+
description: 'What info is missing (null if nothing is missing)',
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
required: ['answerable', 'confidence', 'path', 'reason', 'missing'],
|
|
32
|
+
additionalProperties: false,
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
export async function callProvider(provider, model, apiKey, question, docs) {
|
|
36
|
+
const prompt = `Documentation URLs available:
|
|
37
|
+
${docs}
|
|
38
|
+
|
|
39
|
+
Task: Search these docs to answer: "${question}"
|
|
40
|
+
|
|
41
|
+
Instructions:
|
|
42
|
+
1. Use web_search to explore the documentation
|
|
43
|
+
2. Track which pages you visit
|
|
44
|
+
3. Determine if docs can answer the question
|
|
45
|
+
4. Note what's missing if incomplete`;
|
|
46
|
+
switch (provider) {
|
|
47
|
+
case 'openai': {
|
|
48
|
+
const client = new OpenAI({ apiKey });
|
|
49
|
+
try {
|
|
50
|
+
const response = await client.responses.create({
|
|
51
|
+
model,
|
|
52
|
+
input: prompt,
|
|
53
|
+
tools: [
|
|
54
|
+
{
|
|
55
|
+
type: 'web_search_preview',
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
tool_choice: 'required',
|
|
59
|
+
text: {
|
|
60
|
+
format: VALIDATION_SCHEMA,
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
const content = response.output_text;
|
|
64
|
+
if (!content) {
|
|
65
|
+
throw new Error('No response content from OpenAI');
|
|
66
|
+
}
|
|
67
|
+
const result = JSON.parse(content);
|
|
68
|
+
return {
|
|
69
|
+
question,
|
|
70
|
+
...result,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
console.error('OpenAI API error:', error);
|
|
75
|
+
// Fallback response
|
|
76
|
+
return {
|
|
77
|
+
question,
|
|
78
|
+
answerable: 'NO',
|
|
79
|
+
confidence: 0,
|
|
80
|
+
path: [],
|
|
81
|
+
reason: 'Failed to validate due to API error',
|
|
82
|
+
missing: ['Unable to complete validation'],
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
case 'anthropic': {
|
|
87
|
+
// Similar implementation
|
|
88
|
+
throw new Error('Anthropic not yet implemented');
|
|
89
|
+
}
|
|
90
|
+
default:
|
|
91
|
+
throw new Error(`Unknown provider: ${provider}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAG3B,MAAM,iBAAiB,GAAG;IACxB,IAAI,EAAE,aAAsB;IAC5B,IAAI,EAAE,gBAAgB;IACtB,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC;aAC/B;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,sBAAsB;aACpC;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,WAAW,EAAE,6BAA6B;aAC3C;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,mBAAmB;aACjC;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;gBACvB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,WAAW,EAAE,mDAAmD;aACjE;SACF;QACD,QAAQ,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC;QACnE,oBAAoB,EAAE,KAAK;KAC5B;CACF,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAgB,EAChB,KAAa,EACb,MAAc,EACd,QAAgB,EAChB,IAAY;IAEZ,MAAM,MAAM,GAAG;EACf,IAAI;;sCAEgC,QAAQ;;;;;;qCAMT,CAAA;IAEnC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;YAErC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;oBAC7C,KAAK;oBACL,KAAK,EAAE,MAAM;oBACb,KAAK,EAAE;wBACL;4BACE,IAAI,EAAE,oBAAoB;yBAC3B;qBACF;oBACD,WAAW,EAAE,UAAU;oBACvB,IAAI,EAAE;wBACJ,MAAM,EAAE,iBAAiB;qBAC1B;iBACF,CAAC,CAAA;gBAEF,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAA;gBACpC,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;gBACpD,CAAC;gBAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;gBAElC,OAAO;oBACL,QAAQ;oBACR,GAAG,MAAM;iBACV,CAAA;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAA;gBACzC,oBAAoB;gBACpB,OAAO;oBACL,QAAQ;oBACR,UAAU,EAAE,IAAI;oBAChB,UAAU,EAAE,CAAC;oBACb,IAAI,EAAE,EAAE;oBACR,MAAM,EAAE,qCAAqC;oBAC7C,OAAO,EAAE,CAAC,+BAA+B,CAAC;iBAC3C,CAAA;YACH,CAAC;QACH,CAAC;QAED,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,yBAAyB;YACzB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAA;QAClD,CAAC;QAED;YACE,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAA;IACpD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../../src/sources/source.ts"],"names":[],"mappings":"AAAA,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CA0B5C"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export async function fetchDocumentation(url) {
|
|
2
|
+
try {
|
|
3
|
+
// Try to fetch llms.txt
|
|
4
|
+
const llmsTxtUrl = new URL('/llms.txt', url).href;
|
|
5
|
+
console.log(`Fetching ${llmsTxtUrl}...`);
|
|
6
|
+
let response = await fetch(llmsTxtUrl);
|
|
7
|
+
if (!response.ok) {
|
|
8
|
+
// Maybe they provided the llms.txt URL directly
|
|
9
|
+
response = await fetch(url);
|
|
10
|
+
if (!response.ok) {
|
|
11
|
+
throw new Error(`No llms.txt found at ${url}`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
const content = await response.text();
|
|
15
|
+
const name = `llms.txt from ${new URL(url).hostname}`;
|
|
16
|
+
console.log('ā Fetched documentation\n');
|
|
17
|
+
return { content, name };
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
throw new Error(`Failed to fetch documentation from ${url}: ${error.message}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/sources/source.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,GAAW;IAEX,IAAI,CAAC;QACH,wBAAwB;QACxB,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,IAAI,CAAA;QAEjD,OAAO,CAAC,GAAG,CAAC,YAAY,UAAU,KAAK,CAAC,CAAA;QACxC,IAAI,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,CAAA;QAEtC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,gDAAgD;YAChD,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAA;YAC3B,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAA;YAChD,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QACrC,MAAM,IAAI,GAAG,iBAAiB,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAA;QAErD,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;QACxC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;IAC1B,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,sCAAsC,GAAG,KAAK,KAAK,CAAC,OAAO,EAAE,CAC9D,CAAA;IACH,CAAC;AACH,CAAC"}
|
package/dist/types/config.d.ts
CHANGED
|
@@ -1,26 +1,20 @@
|
|
|
1
1
|
export interface DocWorksConfig {
|
|
2
|
-
source: string
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
source: string;
|
|
3
|
+
questions?: string[];
|
|
4
|
+
journeys?: Record<string, string[]>;
|
|
5
|
+
provider?: string;
|
|
5
6
|
model?: string;
|
|
6
7
|
api_key?: string;
|
|
7
8
|
}
|
|
8
|
-
export interface SourceConfig {
|
|
9
|
-
type: 'llms.txt' | 'mcp';
|
|
10
|
-
server?: string;
|
|
11
|
-
}
|
|
12
9
|
export interface ValidationResult {
|
|
13
10
|
question: string;
|
|
14
11
|
answerable: 'YES' | 'PARTIAL' | 'NO';
|
|
12
|
+
confidence: number;
|
|
13
|
+
path: string[];
|
|
15
14
|
reason: string;
|
|
16
|
-
|
|
15
|
+
missing?: string[];
|
|
17
16
|
}
|
|
18
17
|
export interface JourneyResults {
|
|
19
18
|
[journey: string]: ValidationResult[];
|
|
20
19
|
}
|
|
21
|
-
export interface DocSource {
|
|
22
|
-
name: string;
|
|
23
|
-
fetch(): Promise<string>;
|
|
24
|
-
search?(query: string): Promise<string>;
|
|
25
|
-
}
|
|
26
20
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,KAAK,GAAG,SAAS,GAAG,IAAI,CAAA;IACpC,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAAA;CACtC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEnD,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEnD,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAyB5E"}
|
package/dist/utils/config.js
CHANGED
|
@@ -4,14 +4,19 @@ export async function loadConfig(configPath) {
|
|
|
4
4
|
if (!fs.existsSync(configPath)) {
|
|
5
5
|
throw new Error(`Config file not found: ${configPath}`);
|
|
6
6
|
}
|
|
7
|
-
|
|
7
|
+
let content = fs.readFileSync(configPath, 'utf-8');
|
|
8
|
+
// Replace environment variables (${VAR:-default} syntax)
|
|
9
|
+
content = content.replace(/\$\{([^}]+)\}/g, (match, expr) => {
|
|
10
|
+
const [varName, defaultValue] = expr.split(':-');
|
|
11
|
+
return process.env[varName] || defaultValue || match;
|
|
12
|
+
});
|
|
8
13
|
const config = yaml.parse(content);
|
|
9
14
|
// Validate config
|
|
10
15
|
if (!config.source) {
|
|
11
16
|
throw new Error('Config missing "source" section');
|
|
12
17
|
}
|
|
13
|
-
if (!config.journeys) {
|
|
14
|
-
throw new Error('Config
|
|
18
|
+
if (!config.journeys && !config.questions) {
|
|
19
|
+
throw new Error('Config must have either "questions" or "journeys" section');
|
|
15
20
|
}
|
|
16
21
|
return config;
|
|
17
22
|
}
|
package/dist/utils/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,IAAI,MAAM,MAAM,CAAA;AAGvB,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAkB;IACjD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAA;IACzD,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,IAAI,MAAM,MAAM,CAAA;AAGvB,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAkB;IACjD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAA;IACzD,CAAC;IAED,IAAI,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;IAElD,yDAAyD;IACzD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QAC1D,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAChD,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,YAAY,IAAI,KAAK,CAAA;IACtD,CAAC,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAElC,kBAAkB;IAClB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;IACpD,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAA;IAC9E,CAAC;IAED,OAAO,MAAwB,CAAA;AACjC,CAAC"}
|
package/dist/utils/reporter.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { JourneyResults } from '../types/config.js';
|
|
2
|
-
export declare function formatReport(results: JourneyResults
|
|
2
|
+
export declare function formatReport(results: JourneyResults): number;
|
|
3
3
|
export declare function formatJSON(results: JourneyResults, source: string): string;
|
|
4
4
|
//# sourceMappingURL=reporter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../../src/utils/reporter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../../src/utils/reporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEnD,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAgE5D;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CA2B1E"}
|
package/dist/utils/reporter.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
export function formatReport(results, github = false) {
|
|
1
|
+
export function formatReport(results) {
|
|
3
2
|
let totalQuestions = 0;
|
|
4
3
|
let answeredQuestions = 0;
|
|
5
4
|
let partialQuestions = 0;
|
|
@@ -17,75 +16,43 @@ export function formatReport(results, github = false) {
|
|
|
17
16
|
}
|
|
18
17
|
}
|
|
19
18
|
const score = Math.round((answeredQuestions / totalQuestions) * 100);
|
|
20
|
-
// Format output
|
|
21
|
-
if (github) {
|
|
22
|
-
return formatGitHub(results, score);
|
|
23
|
-
}
|
|
24
19
|
// Terminal output
|
|
25
|
-
console.log('\n' + '
|
|
26
|
-
console.log(
|
|
20
|
+
console.log('\n' + '='.repeat(50));
|
|
21
|
+
console.log('\nDocumentation Validation Report\n');
|
|
27
22
|
for (const [journey, questions] of Object.entries(results)) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
:
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
console.log(color(` Score: ${journeyScore}%`));
|
|
39
|
-
console.log(` ā
Complete: ${success.length}`);
|
|
40
|
-
if (partial.length > 0)
|
|
41
|
-
console.log(` ā ļø Partial: ${partial.length}`);
|
|
42
|
-
if (failed.length > 0) {
|
|
43
|
-
console.log(` ā Missing: ${failed.length}`);
|
|
44
|
-
for (const q of failed) {
|
|
45
|
-
console.log(chalk.red(` ⢠${q.question}`));
|
|
23
|
+
console.log(`Journey: ${journey}`);
|
|
24
|
+
console.log('ā'.repeat(40));
|
|
25
|
+
for (const q of questions) {
|
|
26
|
+
const icon = q.answerable === 'YES' ? 'ā
' : q.answerable === 'PARTIAL' ? 'ā ļø' : 'ā';
|
|
27
|
+
console.log(`${icon} ${q.question}`);
|
|
28
|
+
console.log(` Confidence: ${Math.round(q.confidence * 100)}%`);
|
|
29
|
+
console.log(` Path: ${q.path.length} pages searched`);
|
|
30
|
+
if (q.missing && q.missing.length > 0) {
|
|
31
|
+
console.log(` Missing:`);
|
|
32
|
+
q.missing.forEach((m) => console.log(` - ${m}`));
|
|
46
33
|
}
|
|
47
34
|
}
|
|
48
35
|
console.log();
|
|
49
36
|
}
|
|
50
37
|
// Summary
|
|
51
|
-
console.log('
|
|
52
|
-
console.log(
|
|
38
|
+
console.log('='.repeat(50));
|
|
39
|
+
console.log(`\nOverall Score: ${score}/100\n`);
|
|
53
40
|
if (score >= 80) {
|
|
54
|
-
console.log(
|
|
41
|
+
console.log('Documentation is AI-ready!');
|
|
55
42
|
console.log('Developers and AI agents can successfully use your docs.\n');
|
|
56
43
|
return 0;
|
|
57
44
|
}
|
|
58
45
|
else if (score >= 50) {
|
|
59
|
-
console.log(
|
|
46
|
+
console.log('Documentation needs improvement');
|
|
60
47
|
console.log('Some journeys cannot be completed.\n');
|
|
61
48
|
return 0;
|
|
62
49
|
}
|
|
63
50
|
else {
|
|
64
|
-
console.log(
|
|
51
|
+
console.log('Documentation is incomplete');
|
|
65
52
|
console.log('Many developer journeys will fail.\n');
|
|
66
53
|
return 1;
|
|
67
54
|
}
|
|
68
55
|
}
|
|
69
|
-
function formatGitHub(results, score) {
|
|
70
|
-
// GitHub PR comment format
|
|
71
|
-
console.log('## š Documentation Check Results\n');
|
|
72
|
-
console.log(`**Score: ${score}/100**\n`);
|
|
73
|
-
for (const [journey, questions] of Object.entries(results)) {
|
|
74
|
-
const failed = questions.filter((q) => q.answerable === 'NO');
|
|
75
|
-
if (failed.length > 0) {
|
|
76
|
-
console.log(`### ā Journey: ${journey}`);
|
|
77
|
-
for (const q of failed) {
|
|
78
|
-
console.log(`- ${q.question}`);
|
|
79
|
-
}
|
|
80
|
-
console.log();
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
if (score < 50) {
|
|
84
|
-
console.log('ā ļø **This check is failing.** Documentation is incomplete.');
|
|
85
|
-
return 1;
|
|
86
|
-
}
|
|
87
|
-
return 0;
|
|
88
|
-
}
|
|
89
56
|
export function formatJSON(results, source) {
|
|
90
57
|
const stats = {
|
|
91
58
|
total: 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../src/utils/reporter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../src/utils/reporter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/dist/commands/test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AAIA,wBAAsB,IAAI,CAAC,OAAO,EAAE;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,EAAE,CAAC,EAAE,MAAM,CAAA;CACZ,GAAG,OAAO,CAAC,IAAI,CAAC,CA+ChB"}
|
package/dist/commands/test.js
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { loadConfig } from '../utils/config.js';
|
|
2
|
-
import { createSource } from '../sources/base.js';
|
|
3
|
-
import { createProvider } from '../providers/base.js';
|
|
4
|
-
export async function test(options) {
|
|
5
|
-
if (!options.ai) {
|
|
6
|
-
console.error('Specify a task: docworks test --ai "build hello world"');
|
|
7
|
-
process.exit(1);
|
|
8
|
-
}
|
|
9
|
-
try {
|
|
10
|
-
const config = await loadConfig(options.config || 'docworks.yml');
|
|
11
|
-
const apiKey = process.env.OPENAI_API_KEY || config.api_key;
|
|
12
|
-
if (!apiKey) {
|
|
13
|
-
console.error('ā No API key found');
|
|
14
|
-
process.exit(1);
|
|
15
|
-
}
|
|
16
|
-
// Load docs
|
|
17
|
-
console.log('š Loading documentation...');
|
|
18
|
-
const source = await createSource(config);
|
|
19
|
-
const docs = await source.fetch();
|
|
20
|
-
// Ask AI to complete task
|
|
21
|
-
console.log(`\nš¤ Testing: "${options.ai}"\n`);
|
|
22
|
-
const provider = createProvider(config.provider || 'openai', apiKey);
|
|
23
|
-
const prompt = `
|
|
24
|
-
Using ONLY this documentation, ${options.ai}.
|
|
25
|
-
Provide working code.
|
|
26
|
-
|
|
27
|
-
Documentation:
|
|
28
|
-
${docs.substring(0, 30000)}
|
|
29
|
-
|
|
30
|
-
Provide ONLY the code, no explanation.`;
|
|
31
|
-
const response = await provider.complete(prompt);
|
|
32
|
-
console.log('Generated code:');
|
|
33
|
-
console.log('ā'.repeat(40));
|
|
34
|
-
console.log(response);
|
|
35
|
-
console.log('ā'.repeat(40));
|
|
36
|
-
// Future: Actually execute and validate the code
|
|
37
|
-
console.log('\nā
AI successfully generated code from documentation');
|
|
38
|
-
console.log('ā ļø Code execution validation coming soon');
|
|
39
|
-
}
|
|
40
|
-
catch (error) {
|
|
41
|
-
console.error('ā Error:', error.message);
|
|
42
|
-
process.exit(1);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
//# sourceMappingURL=test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAG1B;IACC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAA;QACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,IAAI,cAAc,CAAC,CAAA;QACjE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,MAAM,CAAC,OAAO,CAAA;QAE3D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAA;YACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,YAAY;QACZ,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAA;QAC1C,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAA;QACzC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;QAEjC,0BAA0B;QAC1B,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,CAAC,EAAE,KAAK,CAAC,CAAA;QAE9C,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,QAAQ,IAAI,QAAQ,EAAE,MAAM,CAAC,CAAA;QACpE,MAAM,MAAM,GAAG;iCACc,OAAO,CAAC,EAAE;;;;EAIzC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC;;uCAEa,CAAA;QAEnC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QAEhD,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;QAC9B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;QAC3B,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACrB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;QAE3B,iDAAiD;QACjD,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAA;QACpE,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAA;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,UAAU,EAAG,KAAe,CAAC,OAAO,CAAC,CAAA;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC"}
|
package/dist/core/ai.d.ts
DELETED
package/dist/core/ai.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/core/ai.ts"],"names":[],"mappings":"AAEA,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,QAAQ,SAAW,EACnB,KAAK,CAAC,EAAE,MAAM,4DA8Bf"}
|
package/dist/core/ai.js
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { createProvider } from '../providers/base.js';
|
|
2
|
-
export async function checkAnswerability(question, docs, apiKey, provider = 'openai', model) {
|
|
3
|
-
const maxRetries = 3;
|
|
4
|
-
let lastError = null;
|
|
5
|
-
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
6
|
-
try {
|
|
7
|
-
const aiProvider = createProvider(provider, apiKey, model);
|
|
8
|
-
return await aiProvider.checkAnswerability(question, docs);
|
|
9
|
-
}
|
|
10
|
-
catch (error) {
|
|
11
|
-
lastError = error;
|
|
12
|
-
// Retry on rate limits with exponential backoff
|
|
13
|
-
if (error.status === 429 && attempt < maxRetries) {
|
|
14
|
-
const delay = Math.pow(2, attempt) * 1000;
|
|
15
|
-
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
16
|
-
continue;
|
|
17
|
-
}
|
|
18
|
-
// Don't retry on other errors
|
|
19
|
-
break;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
// Return error state instead of throwing
|
|
23
|
-
return {
|
|
24
|
-
answerable: 'NO',
|
|
25
|
-
reason: lastError?.message || 'Unknown error',
|
|
26
|
-
location: 'N/A',
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
//# sourceMappingURL=ai.js.map
|
package/dist/core/ai.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/core/ai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAAgB,EAChB,IAAY,EACZ,MAAc,EACd,QAAQ,GAAG,QAAQ,EACnB,KAAc;IAEd,MAAM,UAAU,GAAG,CAAC,CAAA;IACpB,IAAI,SAAS,GAAiB,IAAI,CAAA;IAElC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;YAC1D,OAAO,MAAM,UAAU,CAAC,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QAC5D,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,SAAS,GAAG,KAAK,CAAA;YAEjB,gDAAgD;YAChD,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;gBACjD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;gBACzC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;gBAC1D,SAAQ;YACV,CAAC;YAED,8BAA8B;YAC9B,MAAK;QACP,CAAC;IACH,CAAC;IAED,yCAAyC;IACzC,OAAO;QACL,UAAU,EAAE,IAAa;QACzB,MAAM,EAAE,SAAS,EAAE,OAAO,IAAI,eAAe;QAC7C,QAAQ,EAAE,KAAK;KAChB,CAAA;AACH,CAAC"}
|
package/dist/core/cache.d.ts
DELETED
package/dist/core/cache.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/core/cache.ts"],"names":[],"mappings":"AAYA,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAgB1C;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI,CAUtD"}
|