@adaptabletools/adaptable-mcp 0.0.0-stage → 0.1.0-canary.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 +95 -2
- package/dist/adaptable/loadEntry.js +94 -0
- package/dist/adaptable/loadEntry.js.map +1 -0
- package/dist/adaptable/types.js +13 -0
- package/dist/adaptable/types.js.map +1 -0
- package/dist/cache.js +11 -0
- package/dist/cache.js.map +1 -0
- package/dist/checks/stateRules.js +389 -0
- package/dist/checks/stateRules.js.map +1 -0
- package/dist/checks/stateTypes.js +142 -0
- package/dist/checks/stateTypes.js.map +1 -0
- package/dist/context.js +39 -0
- package/dist/context.js.map +1 -0
- package/dist/docs/corpus.js +114 -0
- package/dist/docs/corpus.js.map +1 -0
- package/dist/docs/search.js +92 -0
- package/dist/docs/search.js.map +1 -0
- package/dist/docs/source.js +151 -0
- package/dist/docs/source.js.map +1 -0
- package/dist/environment.js +181 -0
- package/dist/environment.js.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts.js +84 -0
- package/dist/prompts.js.map +1 -0
- package/dist/resources.js +59 -0
- package/dist/resources.js.map +1 -0
- package/dist/server.js +23 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/checks.js +250 -0
- package/dist/tools/checks.js.map +1 -0
- package/dist/tools/docs.js +173 -0
- package/dist/tools/docs.js.map +1 -0
- package/dist/tools/environment.js +52 -0
- package/dist/tools/environment.js.map +1 -0
- package/package.json +35 -4
- package/skills/adaptable-dev/SKILL.md +42 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { existsSync, statSync } from 'node:fs';
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
const CHECK_FILE = '__adaptable_mcp_state_check__.ts';
|
|
5
|
+
/** Module that exports `InitialState`, as an absolute path without extension */
|
|
6
|
+
function resolveInitialStateModule(projectPath) {
|
|
7
|
+
const sourceDir = process.env.ADAPTABLE_MCP_ADAPTABLE_SRC;
|
|
8
|
+
if (sourceDir) {
|
|
9
|
+
const file = join(sourceDir, 'src/AdaptableState/InitialState');
|
|
10
|
+
return existsSync(`${file}.ts`) ? file : undefined;
|
|
11
|
+
}
|
|
12
|
+
try {
|
|
13
|
+
const require = createRequire(join(projectPath, 'package.json'));
|
|
14
|
+
const packageDir = dirname(require.resolve('@adaptabletools/adaptable/package.json'));
|
|
15
|
+
const file = join(packageDir, 'types');
|
|
16
|
+
return existsSync(`${file}.d.ts`) ? file : undefined;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
let typescript;
|
|
23
|
+
const loadTypeScript = () => (typescript ??= import('typescript').then((m) => m.default));
|
|
24
|
+
/** Parsed declaration files, shared across calls (AdapTable's types are large) */
|
|
25
|
+
const sourceFiles = new Map();
|
|
26
|
+
const OPTIONS = {
|
|
27
|
+
strict: true,
|
|
28
|
+
noEmit: true,
|
|
29
|
+
skipLibCheck: true,
|
|
30
|
+
types: [],
|
|
31
|
+
};
|
|
32
|
+
/** Path of the state property that contains `pos`, e.g. `CalculatedColumn.CalculatedColumns[0].Query` */
|
|
33
|
+
function pathAt(ts, sf, root, pos) {
|
|
34
|
+
let path = '';
|
|
35
|
+
let node = root;
|
|
36
|
+
for (;;) {
|
|
37
|
+
let next;
|
|
38
|
+
if (ts.isObjectLiteralExpression(node)) {
|
|
39
|
+
const prop = node.properties.find((p) => p.getStart(sf) <= pos && pos < p.end);
|
|
40
|
+
if (prop?.name && (ts.isStringLiteral(prop.name) || ts.isIdentifier(prop.name))) {
|
|
41
|
+
path += `${path ? '.' : ''}${prop.name.text}`;
|
|
42
|
+
next = ts.isPropertyAssignment(prop) ? prop.initializer : undefined;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else if (ts.isArrayLiteralExpression(node)) {
|
|
46
|
+
const index = node.elements.findIndex((e) => e.getStart(sf) <= pos && pos < e.end);
|
|
47
|
+
if (index >= 0) {
|
|
48
|
+
path += `[${index}]`;
|
|
49
|
+
next = node.elements[index];
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (!next || next.getStart(sf) > pos) {
|
|
53
|
+
return path;
|
|
54
|
+
}
|
|
55
|
+
node = next;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function messageOf(ts, diagnostic) {
|
|
59
|
+
const lines = ts
|
|
60
|
+
.flattenDiagnosticMessageText(diagnostic.messageText, '\n')
|
|
61
|
+
.split('\n')
|
|
62
|
+
.map((l) => l.trim())
|
|
63
|
+
.filter(Boolean);
|
|
64
|
+
const message = lines.length > 2 ? `${lines[0]} ${lines[lines.length - 1]}` : lines.join(' ');
|
|
65
|
+
return message.length > 400 ? `${message.slice(0, 400)}…` : message;
|
|
66
|
+
}
|
|
67
|
+
/** Type issues not already explained by a rule issue on the same object (or inside it) */
|
|
68
|
+
export function unexplainedTypeIssues(typeIssues, ruleIssues) {
|
|
69
|
+
return typeIssues.filter((t) => !ruleIssues.some((r) => r.path === t.path || r.path.startsWith(`${t.path}.`)));
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Type-checks a state object against `InitialState` from the project's AdapTable
|
|
73
|
+
* (the TypeScript a developer would get from `const initialState: InitialState = ...`).
|
|
74
|
+
*/
|
|
75
|
+
export async function typeCheckState(projectPath, state) {
|
|
76
|
+
const typesModule = resolveInitialStateModule(projectPath);
|
|
77
|
+
if (!typesModule) {
|
|
78
|
+
return {
|
|
79
|
+
ok: false,
|
|
80
|
+
reason: 'AdapTable type definitions (InitialState) not found in this project; install @adaptabletools/adaptable first.',
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
const ts = await loadTypeScript();
|
|
84
|
+
const checkFile = join(projectPath, CHECK_FILE);
|
|
85
|
+
const prefix = `import type { InitialState } from ${JSON.stringify(typesModule)};\nexport const state: InitialState = `;
|
|
86
|
+
const text = `${prefix}${JSON.stringify(state, null, 2)};\n`;
|
|
87
|
+
const host = ts.createCompilerHost(OPTIONS, true);
|
|
88
|
+
const getSourceFile = host.getSourceFile.bind(host);
|
|
89
|
+
host.getSourceFile = (fileName, languageVersion, onError) => {
|
|
90
|
+
if (fileName === checkFile) {
|
|
91
|
+
return ts.createSourceFile(fileName, text, languageVersion, true);
|
|
92
|
+
}
|
|
93
|
+
let mtime = 0;
|
|
94
|
+
try {
|
|
95
|
+
mtime = statSync(fileName).mtimeMs;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// missing files are reported by the compiler
|
|
99
|
+
}
|
|
100
|
+
const cached = sourceFiles.get(fileName);
|
|
101
|
+
if (cached && cached.mtime === mtime) {
|
|
102
|
+
return cached.file;
|
|
103
|
+
}
|
|
104
|
+
const file = getSourceFile(fileName, languageVersion, onError);
|
|
105
|
+
if (file) {
|
|
106
|
+
sourceFiles.set(fileName, { mtime, file });
|
|
107
|
+
}
|
|
108
|
+
return file;
|
|
109
|
+
};
|
|
110
|
+
const fileExists = host.fileExists.bind(host);
|
|
111
|
+
host.fileExists = (fileName) => fileName === checkFile || fileExists(fileName);
|
|
112
|
+
const program = ts.createProgram({
|
|
113
|
+
rootNames: [checkFile],
|
|
114
|
+
options: {
|
|
115
|
+
...OPTIONS,
|
|
116
|
+
target: ts.ScriptTarget.ES2020,
|
|
117
|
+
module: ts.ModuleKind.ESNext,
|
|
118
|
+
moduleResolution: ts.ModuleResolutionKind.Bundler,
|
|
119
|
+
jsx: ts.JsxEmit.ReactJSX,
|
|
120
|
+
},
|
|
121
|
+
host,
|
|
122
|
+
});
|
|
123
|
+
const sf = program.getSourceFile(checkFile);
|
|
124
|
+
const diagnostics = [...program.getSyntacticDiagnostics(sf), ...program.getSemanticDiagnostics(sf)];
|
|
125
|
+
if (diagnostics.some((d) => d.code === 2307 || (d.start ?? 0) < prefix.indexOf('export'))) {
|
|
126
|
+
return {
|
|
127
|
+
ok: false,
|
|
128
|
+
reason: `Could not load InitialState from ${typesModule}: ${diagnostics.map((d) => messageOf(ts, d)).join('; ')}`,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
const declaration = sf.statements
|
|
132
|
+
.filter(ts.isVariableStatement)
|
|
133
|
+
.flatMap((s) => s.declarationList.declarations)[0];
|
|
134
|
+
const root = declaration?.initializer;
|
|
135
|
+
const issues = diagnostics.map((d) => ({
|
|
136
|
+
path: root && d.start !== undefined ? pathAt(ts, sf, root, d.start) : '',
|
|
137
|
+
severity: 'error',
|
|
138
|
+
message: messageOf(ts, d),
|
|
139
|
+
}));
|
|
140
|
+
return { ok: true, issues, source: `${typesModule}${process.env.ADAPTABLE_MCP_ADAPTABLE_SRC ? '.ts' : '.d.ts'}` };
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=stateTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stateTypes.js","sourceRoot":"","sources":["../../src/checks/stateTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAQ1C,MAAM,UAAU,GAAG,kCAAkC,CAAC;AAEtD,gFAAgF;AAChF,SAAS,yBAAyB,CAAC,WAAmB;IACpD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC;IAC1D,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,iCAAiC,CAAC,CAAC;QAChE,OAAO,UAAU,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACrD,CAAC;IACD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;QACjE,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC,CAAC;QACtF,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACvC,OAAO,UAAU,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,IAAI,UAA0C,CAAC;AAC/C,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,CAAC,UAAU,KAAK,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAE1F,kFAAkF;AAClF,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkD,CAAC;AAE9E,MAAM,OAAO,GAAuB;IAClC,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,IAAI;IACZ,YAAY,EAAE,IAAI;IAClB,KAAK,EAAE,EAAE;CACV,CAAC;AAEF,yGAAyG;AACzG,SAAS,MAAM,CAAC,EAAa,EAAE,EAAiB,EAAE,IAAmB,EAAE,GAAW;IAChF,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,IAAI,GAAY,IAAI,CAAC;IACzB,SAAS,CAAC;QACR,IAAI,IAAyB,CAAC;QAC9B,IAAI,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAC/E,IAAI,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;gBAChF,IAAI,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC9C,IAAI,GAAG,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;YACtE,CAAC;QACH,CAAC;aAAM,IAAI,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACnF,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBACf,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC;gBACrB,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QACD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,GAAG,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,EAAa,EAAE,UAAyB;IACzD,MAAM,KAAK,GAAG,EAAE;SACb,4BAA4B,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC;SAC1D,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9F,OAAO,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;AACtE,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,qBAAqB,CAAC,UAAwB,EAAE,UAAwB;IACtF,OAAO,UAAU,CAAC,MAAM,CACtB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CACrF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,WAAmB,EAAE,KAAa;IACrE,MAAM,WAAW,GAAG,yBAAyB,CAAC,WAAW,CAAC,CAAC;IAC3D,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,+GAA+G;SACxH,CAAC;IACJ,CAAC;IACD,MAAM,EAAE,GAAG,MAAM,cAAc,EAAE,CAAC;IAClC,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,qCAAqC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,wCAAwC,CAAC;IACxH,MAAM,IAAI,GAAG,GAAG,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC;IAE7D,MAAM,IAAI,GAAG,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,IAAI,CAAC,aAAa,GAAG,CAAC,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE;QAC1D,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,CAAC;YACH,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,6CAA6C;QAC/C,CAAC;QACD,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACrC,OAAO,MAAM,CAAC,IAAI,CAAC;QACrB,CAAC;QACD,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;QAC/D,IAAI,IAAI,EAAE,CAAC;YACT,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,CAAC,UAAU,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,KAAK,SAAS,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;IAE/E,MAAM,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC;QAC/B,SAAS,EAAE,CAAC,SAAS,CAAC;QACtB,OAAO,EAAE;YACP,GAAG,OAAO;YACV,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM;YAC9B,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM;YAC5B,gBAAgB,EAAE,EAAE,CAAC,oBAAoB,CAAC,OAAO;YACjD,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ;SACzB;QACD,IAAI;KACL,CAAC,CAAC;IACH,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,SAAS,CAAE,CAAC;IAC7C,MAAM,WAAW,GAAG,CAAC,GAAG,OAAO,CAAC,uBAAuB,CAAC,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC;IAEpG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC1F,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,oCAAoC,WAAW,KAAK,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SAClH,CAAC;IACJ,CAAC;IACD,MAAM,WAAW,GAAG,EAAE,CAAC,UAAU;SAC9B,MAAM,CAAC,EAAE,CAAC,mBAAmB,CAAC;SAC9B,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,WAAW,EAAE,WAAW,CAAC;IACtC,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACrC,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;QACxE,QAAQ,EAAE,OAAgB;QAC1B,OAAO,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;KAC1B,CAAC,CAAC,CAAC;IACJ,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;AACpH,CAAC"}
|
package/dist/context.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { fileURLToPath } from 'node:url';
|
|
2
|
+
import { FRAMEWORKS } from './docs/corpus.js';
|
|
3
|
+
import { detectEnvironment } from './environment.js';
|
|
4
|
+
let rootsPromise;
|
|
5
|
+
/** First workspace root the editor reports, when the client supports roots */
|
|
6
|
+
function getClientRoot(server) {
|
|
7
|
+
if (!rootsPromise) {
|
|
8
|
+
const capabilities = server.server.getClientCapabilities();
|
|
9
|
+
rootsPromise = capabilities?.roots
|
|
10
|
+
? server.server
|
|
11
|
+
.listRoots()
|
|
12
|
+
.then((result) => {
|
|
13
|
+
const root = result.roots.find((r) => r.uri.startsWith('file://'));
|
|
14
|
+
return root ? fileURLToPath(root.uri) : undefined;
|
|
15
|
+
})
|
|
16
|
+
.catch(() => undefined)
|
|
17
|
+
: Promise.resolve(undefined);
|
|
18
|
+
}
|
|
19
|
+
return rootsPromise;
|
|
20
|
+
}
|
|
21
|
+
export async function resolveProjectPath(server, projectPath) {
|
|
22
|
+
return (projectPath ||
|
|
23
|
+
process.env.ADAPTABLE_MCP_PROJECT ||
|
|
24
|
+
(await getClientRoot(server)) ||
|
|
25
|
+
process.cwd());
|
|
26
|
+
}
|
|
27
|
+
export async function resolveEnvironment(server, projectPath) {
|
|
28
|
+
return detectEnvironment(await resolveProjectPath(server, projectPath));
|
|
29
|
+
}
|
|
30
|
+
export function pickFramework(requested, env) {
|
|
31
|
+
if (requested && FRAMEWORKS.includes(requested)) {
|
|
32
|
+
return requested;
|
|
33
|
+
}
|
|
34
|
+
return env.framework;
|
|
35
|
+
}
|
|
36
|
+
export function pageUrl(baseUrl, routePath, framework) {
|
|
37
|
+
return `${baseUrl}${routePath}${framework && framework !== 'vanilla' ? `?framework=${framework}` : ''}`;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAkB,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAoB,MAAM,kBAAkB,CAAC;AAEvE,IAAI,YAAqD,CAAC;AAE1D,8EAA8E;AAC9E,SAAS,aAAa,CAAC,MAAiB;IACtC,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC;QAC3D,YAAY,GAAG,YAAY,EAAE,KAAK;YAChC,CAAC,CAAC,MAAM,CAAC,MAAM;iBACV,SAAS,EAAE;iBACX,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gBACf,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;gBACnE,OAAO,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACpD,CAAC,CAAC;iBACD,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;YAC3B,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAiB,EAAE,WAAoB;IAC9E,OAAO,CACL,WAAW;QACX,OAAO,CAAC,GAAG,CAAC,qBAAqB;QACjC,CAAC,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,EAAE,CACd,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAiB,EACjB,WAAoB;IAEpB,OAAO,iBAAiB,CAAC,MAAM,kBAAkB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,SAA6B,EAC7B,GAAgB;IAEhB,IAAI,SAAS,IAAK,UAAuB,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9D,OAAO,SAAsB,CAAC;IAChC,CAAC;IACD,OAAO,GAAG,CAAC,SAAS,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe,EAAE,SAAiB,EAAE,SAAqB;IAC/E,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,IAAI,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC1G,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
export const FRAMEWORKS = ['vanilla', 'react', 'angular', 'vue'];
|
|
2
|
+
const PAGE_MARKER = /^<!-- page: (\S+) -->$/gm;
|
|
3
|
+
const FRAMEWORK_OPEN = /^\s*<!-- framework: ([a-z,]*) -->\s*$/;
|
|
4
|
+
const FRAMEWORK_CLOSE = /^\s*<!-- \/framework -->\s*$/;
|
|
5
|
+
const HEADING = /^(#{1,4})\s+(.+?)\s*#*\s*$/;
|
|
6
|
+
const FENCE = /^\s*(```|~~~)/;
|
|
7
|
+
export function splitPages(llmsFull, meta) {
|
|
8
|
+
const markers = [...llmsFull.matchAll(PAGE_MARKER)];
|
|
9
|
+
return markers.map((match, index) => {
|
|
10
|
+
const start = match.index + match[0].length;
|
|
11
|
+
const end = index + 1 < markers.length ? markers[index + 1].index : llmsFull.length;
|
|
12
|
+
const markdown = llmsFull
|
|
13
|
+
.slice(start, end)
|
|
14
|
+
.replace(/\n+---\n+\s*$/, '')
|
|
15
|
+
.trim();
|
|
16
|
+
const routePath = match[1];
|
|
17
|
+
const pageMeta = meta.get(routePath);
|
|
18
|
+
const title = pageMeta?.title ?? markdown.match(/^# (.+)$/m)?.[1] ?? routePath;
|
|
19
|
+
return { routePath, title, category: pageMeta?.category ?? 'other', markdown };
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
/** Splits a page into heading sections, tracking framework blocks and skipping code fences. */
|
|
23
|
+
export function splitSections(page, startId) {
|
|
24
|
+
const sections = [];
|
|
25
|
+
const headingStack = [];
|
|
26
|
+
let frameworks;
|
|
27
|
+
let buffer = [];
|
|
28
|
+
let inFence = false;
|
|
29
|
+
const flush = () => {
|
|
30
|
+
const text = buffer.join('\n').trim();
|
|
31
|
+
buffer = [];
|
|
32
|
+
if (!text) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
sections.push({
|
|
36
|
+
id: startId + sections.length,
|
|
37
|
+
routePath: page.routePath,
|
|
38
|
+
pageTitle: page.title,
|
|
39
|
+
category: page.category,
|
|
40
|
+
headings: headingStack.map((h) => h.text),
|
|
41
|
+
frameworks,
|
|
42
|
+
text,
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
for (const line of page.markdown.split('\n')) {
|
|
46
|
+
if (FENCE.test(line)) {
|
|
47
|
+
inFence = !inFence;
|
|
48
|
+
buffer.push(line);
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
if (inFence) {
|
|
52
|
+
buffer.push(line);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
const open = line.match(FRAMEWORK_OPEN);
|
|
56
|
+
if (open) {
|
|
57
|
+
flush();
|
|
58
|
+
frameworks = open[1].split(',').filter(Boolean);
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
if (FRAMEWORK_CLOSE.test(line)) {
|
|
62
|
+
flush();
|
|
63
|
+
frameworks = undefined;
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
const heading = line.match(HEADING);
|
|
67
|
+
if (heading) {
|
|
68
|
+
flush();
|
|
69
|
+
const level = heading[1].length;
|
|
70
|
+
if (level === 1) {
|
|
71
|
+
headingStack.length = 0;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
while (headingStack.length && headingStack[headingStack.length - 1].level >= level) {
|
|
75
|
+
headingStack.pop();
|
|
76
|
+
}
|
|
77
|
+
headingStack.push({ level, text: heading[2] });
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
buffer.push(line);
|
|
81
|
+
}
|
|
82
|
+
flush();
|
|
83
|
+
return sections;
|
|
84
|
+
}
|
|
85
|
+
/** Removes framework blocks that do not apply to `framework`. */
|
|
86
|
+
export function filterFramework(markdown, framework) {
|
|
87
|
+
if (!framework) {
|
|
88
|
+
return markdown;
|
|
89
|
+
}
|
|
90
|
+
const out = [];
|
|
91
|
+
let skipping = false;
|
|
92
|
+
let inFence = false;
|
|
93
|
+
for (const line of markdown.split('\n')) {
|
|
94
|
+
if (!skipping && FENCE.test(line)) {
|
|
95
|
+
inFence = !inFence;
|
|
96
|
+
}
|
|
97
|
+
if (!inFence) {
|
|
98
|
+
const open = line.match(FRAMEWORK_OPEN);
|
|
99
|
+
if (open) {
|
|
100
|
+
skipping = !open[1].split(',').includes(framework);
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (FRAMEWORK_CLOSE.test(line)) {
|
|
104
|
+
skipping = false;
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (!skipping) {
|
|
109
|
+
out.push(line);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return out.join('\n');
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=corpus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"corpus.js","sourceRoot":"","sources":["../../src/docs/corpus.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,UAAU,GAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;AA8B9E,MAAM,WAAW,GAAG,0BAA0B,CAAC;AAC/C,MAAM,cAAc,GAAG,uCAAuC,CAAC;AAC/D,MAAM,eAAe,GAAG,8BAA8B,CAAC;AACvD,MAAM,OAAO,GAAG,4BAA4B,CAAC;AAC7C,MAAM,KAAK,GAAG,eAAe,CAAC;AAE9B,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,IAA2B;IACtE,MAAM,OAAO,GAAG,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;IACpD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAClC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC7C,MAAM,GAAG,GAAG,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrF,MAAM,QAAQ,GAAG,QAAQ;aACtB,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC;aACjB,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;aAC5B,IAAI,EAAE,CAAC;QACV,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,QAAQ,EAAE,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;QAC/E,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,IAAI,OAAO,EAAE,QAAQ,EAAE,CAAC;IACjF,CAAC,CAAC,CAAC;AACL,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,aAAa,CAAC,IAAa,EAAE,OAAe;IAC1D,MAAM,QAAQ,GAAiB,EAAE,CAAC;IAClC,MAAM,YAAY,GAAsC,EAAE,CAAC;IAC3D,IAAI,UAAmC,CAAC;IACxC,IAAI,MAAM,GAAa,EAAE,CAAC;IAC1B,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,MAAM,GAAG,EAAE,CAAC;QACZ,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC;YACZ,EAAE,EAAE,OAAO,GAAG,QAAQ,CAAC,MAAM;YAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,KAAK;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACzC,UAAU;YACV,IAAI;SACL,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,OAAO,GAAG,CAAC,OAAO,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACxC,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,EAAE,CAAC;YACR,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAgB,CAAC;YAC/D,SAAS;QACX,CAAC;QACD,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,KAAK,EAAE,CAAC;YACR,UAAU,GAAG,SAAS,CAAC;YACvB,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,EAAE,CAAC;YACR,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAChC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBAChB,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;gBACxB,SAAS;YACX,CAAC;YACD,OAAO,YAAY,CAAC,MAAM,IAAI,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC;gBACnF,YAAY,CAAC,GAAG,EAAE,CAAC;YACrB,CAAC;YACD,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC/C,SAAS;QACX,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IACD,KAAK,EAAE,CAAC;IACR,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,SAAgC;IAChF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,OAAO,GAAG,CAAC,OAAO,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YACxC,IAAI,IAAI,EAAE,CAAC;gBACT,QAAQ,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBACnD,SAAS;YACX,CAAC;YACD,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/B,QAAQ,GAAG,KAAK,CAAC;gBACjB,SAAS;YACX,CAAC;QACH,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
const STOP_WORDS = new Set('a an and are as at be by can do does for from how i in is it of on or should that the this to use using what when where which with you your'.split(' '));
|
|
2
|
+
/**
|
|
3
|
+
* Identifiers are indexed whole (`layoutapi`, `group_by`) and split
|
|
4
|
+
* (`layout`, `api`, `group`, `by`), so exact API tokens rank highest while
|
|
5
|
+
* prose queries still match.
|
|
6
|
+
*/
|
|
7
|
+
export function tokenize(text) {
|
|
8
|
+
const tokens = [];
|
|
9
|
+
for (const raw of text.match(/[A-Za-z_$][A-Za-z0-9_$]*|\d+/g) ?? []) {
|
|
10
|
+
const whole = raw.toLowerCase();
|
|
11
|
+
if (!STOP_WORDS.has(whole)) {
|
|
12
|
+
tokens.push(whole);
|
|
13
|
+
}
|
|
14
|
+
const parts = raw
|
|
15
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1 $2')
|
|
16
|
+
.replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')
|
|
17
|
+
.split(/[\s_$]+/)
|
|
18
|
+
.map((p) => p.toLowerCase())
|
|
19
|
+
.filter((p) => p && p !== whole && !STOP_WORDS.has(p));
|
|
20
|
+
tokens.push(...parts);
|
|
21
|
+
}
|
|
22
|
+
return tokens;
|
|
23
|
+
}
|
|
24
|
+
const K1 = 1.2;
|
|
25
|
+
const B = 0.75;
|
|
26
|
+
const TITLE_WEIGHT = 3;
|
|
27
|
+
const HEADING_WEIGHT = 2;
|
|
28
|
+
export class SectionIndex {
|
|
29
|
+
docs = [];
|
|
30
|
+
documentFrequency = new Map();
|
|
31
|
+
averageLength = 0;
|
|
32
|
+
constructor(sections) {
|
|
33
|
+
let totalLength = 0;
|
|
34
|
+
for (const section of sections) {
|
|
35
|
+
const termFrequencies = new Map();
|
|
36
|
+
const add = (text, weight) => {
|
|
37
|
+
for (const token of tokenize(text)) {
|
|
38
|
+
termFrequencies.set(token, (termFrequencies.get(token) ?? 0) + weight);
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
add(section.pageTitle, TITLE_WEIGHT);
|
|
42
|
+
add(section.headings.join(' '), HEADING_WEIGHT);
|
|
43
|
+
add(section.text, 1);
|
|
44
|
+
let length = 0;
|
|
45
|
+
for (const [term, count] of termFrequencies) {
|
|
46
|
+
length += count;
|
|
47
|
+
this.documentFrequency.set(term, (this.documentFrequency.get(term) ?? 0) + 1);
|
|
48
|
+
}
|
|
49
|
+
totalLength += length;
|
|
50
|
+
this.docs.push({ section, length, termFrequencies });
|
|
51
|
+
}
|
|
52
|
+
this.averageLength = this.docs.length ? totalLength / this.docs.length : 0;
|
|
53
|
+
}
|
|
54
|
+
search(query, options = {}) {
|
|
55
|
+
const terms = [...new Set(tokenize(query))];
|
|
56
|
+
if (!terms.length) {
|
|
57
|
+
return [];
|
|
58
|
+
}
|
|
59
|
+
const total = this.docs.length;
|
|
60
|
+
const hits = [];
|
|
61
|
+
for (const doc of this.docs) {
|
|
62
|
+
const { section } = doc;
|
|
63
|
+
if (options.framework &&
|
|
64
|
+
section.frameworks &&
|
|
65
|
+
!section.frameworks.includes(options.framework)) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (options.categories?.length
|
|
69
|
+
? !options.categories.includes(section.category)
|
|
70
|
+
: options.excludeCategories?.includes(section.category)) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
let score = 0;
|
|
74
|
+
for (const term of terms) {
|
|
75
|
+
const tf = doc.termFrequencies.get(term);
|
|
76
|
+
if (!tf) {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
const df = this.documentFrequency.get(term) ?? 0;
|
|
80
|
+
const idf = Math.log(1 + (total - df + 0.5) / (df + 0.5));
|
|
81
|
+
score +=
|
|
82
|
+
(idf * tf * (K1 + 1)) / (tf + K1 * (1 - B + (B * doc.length) / this.averageLength));
|
|
83
|
+
}
|
|
84
|
+
if (score > 0) {
|
|
85
|
+
hits.push({ section, score });
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
hits.sort((a, b) => b.score - a.score);
|
|
89
|
+
return hits.slice(0, options.limit ?? 8);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/docs/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { existsSync, readFileSync, readdirSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { getCacheDir } from '../cache.js';
|
|
4
|
+
import { splitPages, splitSections } from './corpus.js';
|
|
5
|
+
import { SectionIndex } from './search.js';
|
|
6
|
+
const LATEST_SITE = 'https://www.adaptabletools.com';
|
|
7
|
+
const PRERELEASE_SITE = 'https://canary.adaptabletools.com';
|
|
8
|
+
const FETCH_TIMEOUT_MS = 30_000;
|
|
9
|
+
function localReader(dir) {
|
|
10
|
+
return {
|
|
11
|
+
origin: dir,
|
|
12
|
+
read: async (path) => readFileSync(join(dir, path), 'utf8'),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function httpReader(baseUrl) {
|
|
16
|
+
const base = baseUrl.replace(/\/+$/, '');
|
|
17
|
+
return {
|
|
18
|
+
origin: base,
|
|
19
|
+
read: async (path) => {
|
|
20
|
+
const response = await fetch(`${base}${path}`, {
|
|
21
|
+
signal: AbortSignal.timeout(FETCH_TIMEOUT_MS),
|
|
22
|
+
});
|
|
23
|
+
if (!response.ok) {
|
|
24
|
+
throw new Error(`${base}${path} returned ${response.status}`);
|
|
25
|
+
}
|
|
26
|
+
return response.text();
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
async function readManifest(reader) {
|
|
31
|
+
try {
|
|
32
|
+
return JSON.parse(await reader.read('/llms/manifest.json'));
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* `www` always serves the latest major; older majors live at `v{major}.`, and a
|
|
40
|
+
* major that only has canary releases so far lives at `canary.`.
|
|
41
|
+
* `ADAPTABLE_MCP_DOCS_URL` (e.g. https://dev.adaptabletools.com) or
|
|
42
|
+
* `ADAPTABLE_MCP_DOCS_DIR` (a local `documentation/public`) override all of them.
|
|
43
|
+
*/
|
|
44
|
+
export async function findSource(major) {
|
|
45
|
+
const dir = process.env.ADAPTABLE_MCP_DOCS_DIR;
|
|
46
|
+
const url = process.env.ADAPTABLE_MCP_DOCS_URL;
|
|
47
|
+
const explicit = dir ? localReader(dir) : url ? httpReader(url) : undefined;
|
|
48
|
+
if (explicit) {
|
|
49
|
+
const manifest = await readManifest(explicit);
|
|
50
|
+
return manifest
|
|
51
|
+
? { reader: explicit, manifest }
|
|
52
|
+
: { error: `No /llms/manifest.json found at ${explicit.origin}` };
|
|
53
|
+
}
|
|
54
|
+
const latest = httpReader(LATEST_SITE);
|
|
55
|
+
const latestManifest = await readManifest(latest);
|
|
56
|
+
if (latestManifest && (major === undefined || latestManifest.major === major)) {
|
|
57
|
+
return { reader: latest, manifest: latestManifest };
|
|
58
|
+
}
|
|
59
|
+
if (major !== undefined) {
|
|
60
|
+
for (const site of [`https://v${major}.adaptabletools.com`, PRERELEASE_SITE]) {
|
|
61
|
+
const reader = httpReader(site);
|
|
62
|
+
const manifest = await readManifest(reader);
|
|
63
|
+
if (manifest?.major === major) {
|
|
64
|
+
return { reader, manifest };
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
error: major === undefined
|
|
70
|
+
? `Could not read ${LATEST_SITE}/llms/manifest.json`
|
|
71
|
+
: `No machine-readable docs found for AdapTable ${major} (checked ${LATEST_SITE}, https://v${major}.adaptabletools.com and ${PRERELEASE_SITE})`,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/** Latest cached corpus for a major, for offline use */
|
|
75
|
+
function findCachedFile(major) {
|
|
76
|
+
const root = getCacheDir('docs');
|
|
77
|
+
const candidates = readdirSync(root)
|
|
78
|
+
.map((name) => join(root, name))
|
|
79
|
+
.filter((dir) => existsSync(join(dir, 'manifest.json')) && existsSync(join(dir, 'llms-full.txt')))
|
|
80
|
+
.map((dir) => ({ dir, manifest: JSON.parse(readFileSync(join(dir, 'manifest.json'), 'utf8')) }))
|
|
81
|
+
.filter((c) => major === undefined || c.manifest.major === major)
|
|
82
|
+
.sort((a, b) => b.manifest.builtAt.localeCompare(a.manifest.builtAt));
|
|
83
|
+
return candidates[0];
|
|
84
|
+
}
|
|
85
|
+
function buildCorpus(manifest, origin, llmsFull, pagesJson) {
|
|
86
|
+
const pageMeta = new Map(JSON.parse(pagesJson).map((meta) => [meta.routePath, meta]));
|
|
87
|
+
const pages = new Map();
|
|
88
|
+
const sections = [];
|
|
89
|
+
for (const page of splitPages(llmsFull, pageMeta)) {
|
|
90
|
+
pages.set(page.routePath, page);
|
|
91
|
+
sections.push(...splitSections(page, sections.length));
|
|
92
|
+
}
|
|
93
|
+
return { manifest, origin, pages, pageMeta, sections, index: new SectionIndex(sections) };
|
|
94
|
+
}
|
|
95
|
+
const corpora = new Map();
|
|
96
|
+
const sources = new Map();
|
|
97
|
+
function getSource(major) {
|
|
98
|
+
const key = String(major ?? 'latest');
|
|
99
|
+
let source = sources.get(key);
|
|
100
|
+
if (!source) {
|
|
101
|
+
source = findSource(major);
|
|
102
|
+
sources.set(key, source);
|
|
103
|
+
}
|
|
104
|
+
return source;
|
|
105
|
+
}
|
|
106
|
+
/** The docs manifest only: version, AG Grid pairings and base URL, without downloading the docs */
|
|
107
|
+
export async function getManifest(major) {
|
|
108
|
+
const found = await getSource(major);
|
|
109
|
+
if ('error' in found) {
|
|
110
|
+
const cached = findCachedFile(major);
|
|
111
|
+
return cached
|
|
112
|
+
? { manifest: cached.manifest, origin: `${cached.manifest.baseUrl} (offline cache)` }
|
|
113
|
+
: found;
|
|
114
|
+
}
|
|
115
|
+
return { manifest: found.manifest, origin: found.reader.origin };
|
|
116
|
+
}
|
|
117
|
+
async function loadCorpusUncached(major) {
|
|
118
|
+
const found = await getSource(major);
|
|
119
|
+
if ('error' in found) {
|
|
120
|
+
const cached = findCachedFile(major);
|
|
121
|
+
if (!cached) {
|
|
122
|
+
throw new Error(found.error);
|
|
123
|
+
}
|
|
124
|
+
return buildCorpus(cached.manifest, `${cached.manifest.baseUrl} (offline cache)`, readFileSync(join(cached.dir, 'llms-full.txt'), 'utf8'), readFileSync(join(cached.dir, 'pages.json'), 'utf8'));
|
|
125
|
+
}
|
|
126
|
+
const { reader, manifest } = found;
|
|
127
|
+
const cacheDir = getCacheDir('docs', manifest.files.llmsFullTxt.sha256.slice(0, 16));
|
|
128
|
+
const cachedFull = join(cacheDir, 'llms-full.txt');
|
|
129
|
+
const cachedPages = join(cacheDir, 'pages.json');
|
|
130
|
+
if (!existsSync(cachedFull) || !existsSync(cachedPages)) {
|
|
131
|
+
const [llmsFull, pagesJson] = await Promise.all([
|
|
132
|
+
reader.read(manifest.files.llmsFullTxt.path),
|
|
133
|
+
reader.read(manifest.files.pages.path),
|
|
134
|
+
]);
|
|
135
|
+
writeFileSync(cachedFull, llmsFull);
|
|
136
|
+
writeFileSync(cachedPages, pagesJson);
|
|
137
|
+
writeFileSync(join(cacheDir, 'manifest.json'), JSON.stringify(manifest, null, 2));
|
|
138
|
+
}
|
|
139
|
+
return buildCorpus(manifest, reader.origin, readFileSync(cachedFull, 'utf8'), readFileSync(cachedPages, 'utf8'));
|
|
140
|
+
}
|
|
141
|
+
export function loadCorpus(major) {
|
|
142
|
+
const key = String(major ?? 'latest');
|
|
143
|
+
let corpus = corpora.get(key);
|
|
144
|
+
if (!corpus) {
|
|
145
|
+
corpus = loadCorpusUncached(major);
|
|
146
|
+
corpus.catch(() => corpora.delete(key));
|
|
147
|
+
corpora.set(key, corpus);
|
|
148
|
+
}
|
|
149
|
+
return corpus;
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/docs/source.ts"],"names":[],"mappings":"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"}
|