docworks 0.12.0-next.1 → 0.13.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 +83 -54
- 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 +31 -63
- 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 -11
- 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 +6 -7
- 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 -12
- package/dist/sources/base.js.map +0 -1
- package/dist/sources/llms-txt.d.ts +0 -9
- package/dist/sources/llms-txt.d.ts.map +0 -1
- package/dist/sources/llms-txt.js +0 -64
- package/dist/sources/llms-txt.js.map +0 -1
- package/dist/sources/local.d.ts +0 -8
- package/dist/sources/local.d.ts.map +0 -1
- package/dist/sources/local.js +0 -37
- package/dist/sources/local.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
|
@@ -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,21 +1,20 @@
|
|
|
1
1
|
export interface DocWorksConfig {
|
|
2
2
|
source: string;
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
questions?: string[];
|
|
4
|
+
journeys?: Record<string, string[]>;
|
|
5
|
+
provider?: string;
|
|
5
6
|
model?: string;
|
|
6
7
|
api_key?: string;
|
|
7
8
|
}
|
|
8
9
|
export interface ValidationResult {
|
|
9
10
|
question: string;
|
|
10
11
|
answerable: 'YES' | 'PARTIAL' | 'NO';
|
|
12
|
+
confidence: number;
|
|
13
|
+
path: string[];
|
|
11
14
|
reason: string;
|
|
12
|
-
|
|
15
|
+
missing?: string[];
|
|
13
16
|
}
|
|
14
17
|
export interface JourneyResults {
|
|
15
18
|
[journey: string]: ValidationResult[];
|
|
16
19
|
}
|
|
17
|
-
export interface DocSource {
|
|
18
|
-
name: string;
|
|
19
|
-
fetch(): Promise<string>;
|
|
20
|
-
}
|
|
21
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,CAAA;IACd,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;
|
|
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"}
|
package/dist/core/cache.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import os from 'os';
|
|
4
|
-
const CACHE_DIR = path.join(os.homedir(), '.docworks', 'cache');
|
|
5
|
-
const CACHE_TTL = 7 * 24 * 60 * 60 * 1000; // 7 days
|
|
6
|
-
// Ensure cache directory exists
|
|
7
|
-
if (!fs.existsSync(CACHE_DIR)) {
|
|
8
|
-
fs.mkdirSync(CACHE_DIR, { recursive: true });
|
|
9
|
-
}
|
|
10
|
-
export function getCached(key) {
|
|
11
|
-
const cachePath = path.join(CACHE_DIR, `${key}.json`);
|
|
12
|
-
if (!fs.existsSync(cachePath)) {
|
|
13
|
-
return null;
|
|
14
|
-
}
|
|
15
|
-
const cached = JSON.parse(fs.readFileSync(cachePath, 'utf-8'));
|
|
16
|
-
// Check if expired
|
|
17
|
-
if (Date.now() - cached.timestamp > CACHE_TTL) {
|
|
18
|
-
fs.unlinkSync(cachePath);
|
|
19
|
-
return null;
|
|
20
|
-
}
|
|
21
|
-
return cached.data;
|
|
22
|
-
}
|
|
23
|
-
export function setCached(key, data) {
|
|
24
|
-
const cachePath = path.join(CACHE_DIR, `${key}.json`);
|
|
25
|
-
fs.writeFileSync(cachePath, JSON.stringify({
|
|
26
|
-
timestamp: Date.now(),
|
|
27
|
-
data,
|
|
28
|
-
}));
|
|
29
|
-
}
|
|
30
|
-
//** */
|
|
31
|
-
//# sourceMappingURL=cache.js.map
|
package/dist/core/cache.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/core/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAA;AACnB,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,MAAM,IAAI,CAAA;AAEnB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,CAAA;AAC/D,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA,CAAC,SAAS;AAEnD,gCAAgC;AAChC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;IAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;AAC9C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,GAAG,OAAO,CAAC,CAAA;IAErD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAA;IAE9D,mBAAmB;IACnB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC;QAC9C,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;QACxB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAA;AACpB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,IAAS;IAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,GAAG,OAAO,CAAC,CAAA;IAErD,EAAE,CAAC,aAAa,CACd,SAAS,EACT,IAAI,CAAC,SAAS,CAAC;QACb,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,IAAI;KACL,CAAC,CACH,CAAA;AACH,CAAC;AACD,OAAO"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { AIProvider, ValidationResult } from './base.js';
|
|
2
|
-
export declare class AnthropicProvider implements AIProvider {
|
|
3
|
-
name: string;
|
|
4
|
-
private client;
|
|
5
|
-
private model;
|
|
6
|
-
constructor(apiKey: string, model?: string);
|
|
7
|
-
checkAnswerability(question: string, docs: string): Promise<ValidationResult>;
|
|
8
|
-
complete(prompt: string): Promise<string>;
|
|
9
|
-
}
|
|
10
|
-
//# sourceMappingURL=anthropic.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAExD,qBAAa,iBAAkB,YAAW,UAAU;IAClD,IAAI,SAAc;IAClB,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,KAAK,CAAQ;gBAET,MAAM,EAAE,MAAM,EAAE,KAAK,SAA+B;IAK1D,kBAAkB,CACtB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,gBAAgB,CAAC;IAgCtB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAehD"}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import Anthropic from '@anthropic-ai/sdk';
|
|
2
|
-
export class AnthropicProvider {
|
|
3
|
-
constructor(apiKey, model = 'claude-3-5-sonnet-20241022') {
|
|
4
|
-
this.name = 'anthropic';
|
|
5
|
-
this.client = new Anthropic({ apiKey });
|
|
6
|
-
this.model = model;
|
|
7
|
-
}
|
|
8
|
-
async checkAnswerability(question, docs) {
|
|
9
|
-
const response = await this.client.messages.create({
|
|
10
|
-
model: this.model,
|
|
11
|
-
max_tokens: 150,
|
|
12
|
-
temperature: 0.1,
|
|
13
|
-
messages: [
|
|
14
|
-
{
|
|
15
|
-
role: 'user',
|
|
16
|
-
content: `Given this documentation, can it answer: "${question}"?
|
|
17
|
-
|
|
18
|
-
Documentation:
|
|
19
|
-
${docs.substring(0, 50000)}
|
|
20
|
-
|
|
21
|
-
Reply with:
|
|
22
|
-
ANSWER: [YES/PARTIAL/NO]
|
|
23
|
-
REASON: [One sentence]
|
|
24
|
-
LOCATION: [Where found, or "Not found"]`,
|
|
25
|
-
},
|
|
26
|
-
],
|
|
27
|
-
});
|
|
28
|
-
const content = response.content[0].type === 'text' ? response.content[0].text : '';
|
|
29
|
-
return {
|
|
30
|
-
answerable: (content.match(/ANSWER:\s*(YES|PARTIAL|NO)/)?.[1] ||
|
|
31
|
-
'NO'),
|
|
32
|
-
reason: content.match(/REASON:\s*(.+)/)?.[1] || 'Could not determine',
|
|
33
|
-
location: content.match(/LOCATION:\s*(.+)/)?.[1] || 'Not found',
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
async complete(prompt) {
|
|
37
|
-
const response = await this.client.messages.create({
|
|
38
|
-
model: this.model,
|
|
39
|
-
max_tokens: 2000,
|
|
40
|
-
temperature: 0.3,
|
|
41
|
-
messages: [
|
|
42
|
-
{
|
|
43
|
-
role: 'user',
|
|
44
|
-
content: prompt,
|
|
45
|
-
},
|
|
46
|
-
],
|
|
47
|
-
});
|
|
48
|
-
return response.content[0].type === 'text' ? response.content[0].text : '';
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
//# sourceMappingURL=anthropic.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAA;AAGzC,MAAM,OAAO,iBAAiB;IAK5B,YAAY,MAAc,EAAE,KAAK,GAAG,4BAA4B;QAJhE,SAAI,GAAG,WAAW,CAAA;QAKhB,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;QACvC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;IAED,KAAK,CAAC,kBAAkB,CACtB,QAAgB,EAChB,IAAY;QAEZ,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACjD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,GAAG;YACf,WAAW,EAAE,GAAG;YAChB,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,6CAA6C,QAAQ;;;EAGtE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC;;;;;wCAKc;iBAC/B;aACF;SACF,CAAC,CAAA;QAEF,MAAM,OAAO,GACX,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;QAErE,OAAO;YACL,UAAU,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC3D,IAAI,CAAQ;YACd,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,qBAAqB;YACrE,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,WAAW;SAChE,CAAA;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc;QAC3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YACjD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI;YAChB,WAAW,EAAE,GAAG;YAChB,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,MAAM;iBAChB;aACF;SACF,CAAC,CAAA;QAEF,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;IAC5E,CAAC;CACF"}
|
package/dist/providers/base.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export interface ValidationResult {
|
|
2
|
-
answerable: 'YES' | 'PARTIAL' | 'NO';
|
|
3
|
-
reason: string;
|
|
4
|
-
location?: string;
|
|
5
|
-
}
|
|
6
|
-
export interface AIProvider {
|
|
7
|
-
name: string;
|
|
8
|
-
checkAnswerability(question: string, docs: string): Promise<ValidationResult>;
|
|
9
|
-
complete(prompt: string): Promise<string>;
|
|
10
|
-
}
|
|
11
|
-
export declare function createProvider(provider: string, apiKey: string, model?: string): AIProvider;
|
|
12
|
-
//# sourceMappingURL=base.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,KAAK,GAAG,SAAS,GAAG,IAAI,CAAA;IACpC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAC7E,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;CAC1C;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,GACb,UAAU,CAUZ"}
|
package/dist/providers/base.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { OpenAIProvider } from './openai.js';
|
|
2
|
-
import { AnthropicProvider } from './anthropic.js';
|
|
3
|
-
export function createProvider(provider, apiKey, model) {
|
|
4
|
-
switch (provider) {
|
|
5
|
-
case 'anthropic': {
|
|
6
|
-
return new AnthropicProvider(apiKey, model);
|
|
7
|
-
}
|
|
8
|
-
case 'openai':
|
|
9
|
-
default: {
|
|
10
|
-
return new OpenAIProvider(apiKey, model);
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=base.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAclD,MAAM,UAAU,cAAc,CAC5B,QAAgB,EAChB,MAAc,EACd,KAAc;IAEd,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,OAAO,IAAI,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAC7C,CAAC;QACD,KAAK,QAAQ,CAAC;QACd,OAAO,CAAC,CAAC,CAAC;YACR,OAAO,IAAI,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAC1C,CAAC;IACH,CAAC;AACH,CAAC"}
|