@vielzeug/codex 1.0.3 → 2.0.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 +46 -107
- package/data/catalog.json +1679 -0
- package/data/llms-full.txt +18997 -31516
- package/data/llms.txt +32 -110
- package/data/manifest.json +8 -0
- package/data/packages/arsenal.json +210 -0
- package/data/packages/assay.json +40 -0
- package/data/packages/clockwork.json +67 -0
- package/data/packages/codex.json +43 -0
- package/data/packages/coins.json +103 -0
- package/data/packages/conduit.json +60 -0
- package/data/packages/courier.json +58 -0
- package/data/packages/dnd.json +75 -0
- package/data/packages/familiar.json +30 -0
- package/data/packages/flux.json +93 -0
- package/data/packages/forge.json +84 -0
- package/data/packages/herald.json +122 -0
- package/data/packages/keymap.json +65 -0
- package/data/packages/ledger.json +54 -0
- package/data/packages/lingua.json +66 -0
- package/data/packages/orbit.json +112 -0
- package/data/packages/ore.json +73 -0
- package/data/packages/prism.json +70 -0
- package/data/packages/pulse.json +58 -0
- package/data/packages/refine.json +12 -0
- package/data/packages/ripple.json +79 -0
- package/data/packages/rune.json +81 -0
- package/data/packages/sandbox.json +39 -0
- package/data/packages/scout.json +60 -0
- package/data/packages/scroll.json +113 -0
- package/data/packages/sourcerer.json +74 -0
- package/data/packages/spell.json +134 -0
- package/data/packages/tempo.json +113 -0
- package/data/packages/vault.json +90 -0
- package/data/packages/ward.json +125 -0
- package/data/packages/wayfinder.json +113 -0
- package/data/refine.json +11752 -0
- package/data/search.json +1437 -0
- package/dist/catalog.js +149 -0
- package/dist/catalog.js.map +1 -0
- package/dist/cli.js +33 -59
- package/dist/cli.js.map +1 -1
- package/dist/errors.js +0 -14
- package/dist/errors.js.map +1 -1
- package/dist/http.js +54 -96
- package/dist/http.js.map +1 -1
- package/dist/index.js +6 -5
- package/dist/index.js.map +1 -1
- package/dist/server.js +4 -9
- package/dist/server.js.map +1 -1
- package/dist/snapshot.js +233 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/tools/index.js +21 -42
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/packages.js +67 -166
- package/dist/tools/packages.js.map +1 -1
- package/dist/tools/refine.js +99 -305
- package/dist/tools/refine.js.map +1 -1
- package/dist/tools/schema.js +8 -8
- package/dist/tools/schema.js.map +1 -1
- package/dist/tools/shared.js +1 -26
- package/dist/tools/shared.js.map +1 -1
- package/dist/types.js +1 -2
- package/dist/types.js.map +1 -1
- package/mcp-setup.json +10 -0
- package/package.json +7 -7
- package/data/.cache.json +0 -33
- package/data/vielzeug-data.json +0 -15999
package/dist/snapshot.js
ADDED
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { dirname, resolve } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { CodexError } from './errors.js';
|
|
5
|
+
import { DOC_PAGES, SNAPSHOT_SCHEMA_VERSION, } from './types.js';
|
|
6
|
+
const DEFAULT_SNAPSHOT_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '../data');
|
|
7
|
+
const DOC_PAGE_SET = new Set(DOC_PAGES);
|
|
8
|
+
const SLUG_PATTERN = /^[a-z][a-z0-9-]*$/;
|
|
9
|
+
const POINTER_DIRECTORY_PATTERN = /^snapshots\/[a-z0-9-]+$/;
|
|
10
|
+
function fail(path, message) {
|
|
11
|
+
throw new CodexError(`Invalid snapshot at ${path}: ${message}`);
|
|
12
|
+
}
|
|
13
|
+
function record(value, path) {
|
|
14
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
15
|
+
fail(path, 'must be an object.');
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
function string(value, path) {
|
|
19
|
+
if (typeof value !== 'string')
|
|
20
|
+
fail(path, 'must be a string.');
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
function boolean(value, path) {
|
|
24
|
+
if (typeof value !== 'boolean')
|
|
25
|
+
fail(path, 'must be a boolean.');
|
|
26
|
+
return value;
|
|
27
|
+
}
|
|
28
|
+
function strings(value, path) {
|
|
29
|
+
if (!Array.isArray(value) || value.some((item) => typeof item !== 'string'))
|
|
30
|
+
fail(path, 'must be an array of strings.');
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
function json(path) {
|
|
34
|
+
try {
|
|
35
|
+
return JSON.parse(readFileSync(path, 'utf8'));
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
39
|
+
throw new CodexError(`Failed to read snapshot file ${path}: ${detail}`, { cause: error });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function equalStrings(left, right) {
|
|
43
|
+
return left.length === right.length && left.every((value, index) => value === right[index]);
|
|
44
|
+
}
|
|
45
|
+
function pageMap(value, path) {
|
|
46
|
+
const input = record(value, path);
|
|
47
|
+
const pages = {};
|
|
48
|
+
for (const [page, content] of Object.entries(input)) {
|
|
49
|
+
if (!DOC_PAGE_SET.has(page))
|
|
50
|
+
fail(`${path}.${page}`, `unknown page; expected one of ${DOC_PAGES.join(', ')}.`);
|
|
51
|
+
pages[page] = string(content, `${path}.${page}`);
|
|
52
|
+
}
|
|
53
|
+
return pages;
|
|
54
|
+
}
|
|
55
|
+
function examples(value, path) {
|
|
56
|
+
if (!Array.isArray(value))
|
|
57
|
+
fail(path, 'must be an array.');
|
|
58
|
+
const ids = new Set();
|
|
59
|
+
return value.map((item, index) => {
|
|
60
|
+
const entry = record(item, `${path}[${index}]`);
|
|
61
|
+
const id = string(entry.id, `${path}[${index}].id`);
|
|
62
|
+
if (ids.has(id))
|
|
63
|
+
fail(`${path}[${index}].id`, `duplicates ${id}.`);
|
|
64
|
+
ids.add(id);
|
|
65
|
+
return {
|
|
66
|
+
code: string(entry.code, `${path}[${index}].code`),
|
|
67
|
+
id,
|
|
68
|
+
name: string(entry.name, `${path}[${index}].name`),
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
export function parsePointer(value) {
|
|
73
|
+
const pointer = record(value, 'current.json');
|
|
74
|
+
const directory = string(pointer.directory, 'current.json.directory');
|
|
75
|
+
if (!POINTER_DIRECTORY_PATTERN.test(directory))
|
|
76
|
+
fail('current.json.directory', 'must reference one snapshot directory.');
|
|
77
|
+
return { directory };
|
|
78
|
+
}
|
|
79
|
+
export function parseManifest(value) {
|
|
80
|
+
const manifest = record(value, 'manifest.json');
|
|
81
|
+
if (manifest.schemaVersion !== SNAPSHOT_SCHEMA_VERSION)
|
|
82
|
+
fail('manifest.json.schemaVersion', `must equal ${SNAPSHOT_SCHEMA_VERSION}.`);
|
|
83
|
+
if (manifest.catalog !== 'catalog.json' ||
|
|
84
|
+
manifest.search !== 'search.json' ||
|
|
85
|
+
manifest.contentDirectory !== 'packages')
|
|
86
|
+
fail('manifest.json', 'has unsupported file layout.');
|
|
87
|
+
if (manifest.refine !== null && manifest.refine !== 'refine.json')
|
|
88
|
+
fail('manifest.json.refine', 'must be null or "refine.json".');
|
|
89
|
+
return {
|
|
90
|
+
catalog: 'catalog.json',
|
|
91
|
+
contentDirectory: 'packages',
|
|
92
|
+
refine: manifest.refine,
|
|
93
|
+
schemaVersion: SNAPSHOT_SCHEMA_VERSION,
|
|
94
|
+
search: 'search.json',
|
|
95
|
+
version: string(manifest.version, 'manifest.json.version'),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
export function parseCatalog(value) {
|
|
99
|
+
const input = record(value, 'catalog.json');
|
|
100
|
+
if (!Array.isArray(input.packages))
|
|
101
|
+
fail('catalog.json.packages', 'must be an array.');
|
|
102
|
+
const slugs = new Set();
|
|
103
|
+
const packages = input.packages.map((item, index) => {
|
|
104
|
+
const path = `catalog.json.packages[${index}]`;
|
|
105
|
+
const entry = record(item, path);
|
|
106
|
+
const slug = string(entry.slug, `${path}.slug`);
|
|
107
|
+
if (!SLUG_PATTERN.test(slug))
|
|
108
|
+
fail(`${path}.slug`, 'must be a lowercase package slug.');
|
|
109
|
+
if (slugs.has(slug))
|
|
110
|
+
fail(`${path}.slug`, `duplicates ${slug}.`);
|
|
111
|
+
slugs.add(slug);
|
|
112
|
+
const pages = strings(entry.availableDocPages, `${path}.availableDocPages`);
|
|
113
|
+
if (pages.some((page) => !DOC_PAGE_SET.has(page)))
|
|
114
|
+
fail(`${path}.availableDocPages`, 'contains unknown page.');
|
|
115
|
+
return {
|
|
116
|
+
availableDocPages: pages,
|
|
117
|
+
category: string(entry.category, `${path}.category`),
|
|
118
|
+
description: string(entry.description, `${path}.description`),
|
|
119
|
+
exampleIds: strings(entry.exampleIds, `${path}.exampleIds`),
|
|
120
|
+
exports: strings(entry.exports, `${path}.exports`),
|
|
121
|
+
hasSource: boolean(entry.hasSource, `${path}.hasSource`),
|
|
122
|
+
keywords: strings(entry.keywords, `${path}.keywords`),
|
|
123
|
+
name: string(entry.name, `${path}.name`),
|
|
124
|
+
related: strings(entry.related, `${path}.related`),
|
|
125
|
+
slug,
|
|
126
|
+
version: string(entry.version, `${path}.version`),
|
|
127
|
+
};
|
|
128
|
+
});
|
|
129
|
+
return { packages, version: string(input.version, 'catalog.json.version') };
|
|
130
|
+
}
|
|
131
|
+
export function parseContent(value, slug) {
|
|
132
|
+
const path = `packages/${slug}.json`;
|
|
133
|
+
const input = record(value, path);
|
|
134
|
+
if (input.apiSource !== null && typeof input.apiSource !== 'string')
|
|
135
|
+
fail(`${path}.apiSource`, 'must be a string or null.');
|
|
136
|
+
const signatures = record(input.typeSignatures, `${path}.typeSignatures`);
|
|
137
|
+
for (const [name, text] of Object.entries(signatures))
|
|
138
|
+
string(text, `${path}.typeSignatures.${name}`);
|
|
139
|
+
return {
|
|
140
|
+
apiSource: input.apiSource,
|
|
141
|
+
docs: pageMap(input.docs, `${path}.docs`),
|
|
142
|
+
examples: examples(input.examples, `${path}.examples`),
|
|
143
|
+
typeSignatures: signatures,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
export function parseSearch(value, catalog) {
|
|
147
|
+
if (!Array.isArray(value))
|
|
148
|
+
fail('search.json', 'must be an array.');
|
|
149
|
+
const catalogSlugs = new Set(catalog.packages.map((pkg) => pkg.slug));
|
|
150
|
+
const seen = new Set();
|
|
151
|
+
const records = value.map((item, index) => {
|
|
152
|
+
const path = `search.json[${index}]`;
|
|
153
|
+
const entry = record(item, path);
|
|
154
|
+
const slug = string(entry.slug, `${path}.slug`);
|
|
155
|
+
if (!catalogSlugs.has(slug))
|
|
156
|
+
fail(`${path}.slug`, 'does not exist in catalog.');
|
|
157
|
+
if (seen.has(slug))
|
|
158
|
+
fail(`${path}.slug`, `duplicates ${slug}.`);
|
|
159
|
+
seen.add(slug);
|
|
160
|
+
if (!Array.isArray(entry.examples))
|
|
161
|
+
fail(`${path}.examples`, 'must be an array.');
|
|
162
|
+
return {
|
|
163
|
+
category: string(entry.category, `${path}.category`),
|
|
164
|
+
description: string(entry.description, `${path}.description`),
|
|
165
|
+
docs: pageMap(entry.docs, `${path}.docs`),
|
|
166
|
+
examples: entry.examples.map((example, exampleIndex) => {
|
|
167
|
+
const value = record(example, `${path}.examples[${exampleIndex}]`);
|
|
168
|
+
return {
|
|
169
|
+
id: string(value.id, `${path}.examples[${exampleIndex}].id`),
|
|
170
|
+
text: string(value.text, `${path}.examples[${exampleIndex}].text`),
|
|
171
|
+
};
|
|
172
|
+
}),
|
|
173
|
+
exports: string(entry.exports, `${path}.exports`),
|
|
174
|
+
keywords: string(entry.keywords, `${path}.keywords`),
|
|
175
|
+
name: string(entry.name, `${path}.name`),
|
|
176
|
+
related: string(entry.related, `${path}.related`),
|
|
177
|
+
slug,
|
|
178
|
+
source: entry.source === null ? null : string(entry.source, `${path}.source`),
|
|
179
|
+
};
|
|
180
|
+
});
|
|
181
|
+
if (records.length !== catalog.packages.length)
|
|
182
|
+
fail('search.json', 'must have one record per catalog package.');
|
|
183
|
+
return records;
|
|
184
|
+
}
|
|
185
|
+
export function parseRefine(value) {
|
|
186
|
+
if (!Array.isArray(value))
|
|
187
|
+
fail('refine.json', 'must be an array.');
|
|
188
|
+
return value.map((item, index) => {
|
|
189
|
+
const declaration = record(item, `refine.json[${index}]`);
|
|
190
|
+
if (declaration.tagName !== undefined && typeof declaration.tagName !== 'string')
|
|
191
|
+
fail(`refine.json[${index}].tagName`, 'must be a string.');
|
|
192
|
+
return declaration;
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
function validateContent(meta, content) {
|
|
196
|
+
const pages = Object.keys(content.docs).sort();
|
|
197
|
+
const expectedPages = [...meta.availableDocPages].sort();
|
|
198
|
+
if (!equalStrings(pages, expectedPages))
|
|
199
|
+
fail(`packages/${meta.slug}.json.docs`, 'does not match catalog availableDocPages.');
|
|
200
|
+
const exampleIds = content.examples.map((example) => example.id).sort();
|
|
201
|
+
const expectedExampleIds = [...meta.exampleIds].sort();
|
|
202
|
+
if (!equalStrings(exampleIds, expectedExampleIds))
|
|
203
|
+
fail(`packages/${meta.slug}.json.examples`, 'does not match catalog exampleIds.');
|
|
204
|
+
if ((content.apiSource !== null) !== meta.hasSource)
|
|
205
|
+
fail(`packages/${meta.slug}.json.apiSource`, 'does not match catalog hasSource.');
|
|
206
|
+
}
|
|
207
|
+
export function loadSnapshotDirectory(directory, options = {}) {
|
|
208
|
+
const manifest = parseManifest(json(resolve(directory, 'manifest.json')));
|
|
209
|
+
const catalog = parseCatalog(json(resolve(directory, manifest.catalog)));
|
|
210
|
+
if (catalog.version !== manifest.version)
|
|
211
|
+
fail('catalog.json.version', 'does not match manifest version.');
|
|
212
|
+
const search = parseSearch(json(resolve(directory, manifest.search)), catalog);
|
|
213
|
+
const refineComponents = manifest.refine ? parseRefine(json(resolve(directory, manifest.refine))) : [];
|
|
214
|
+
const contentDirectory = resolve(directory, manifest.contentDirectory);
|
|
215
|
+
if (options.validateContents ?? false) {
|
|
216
|
+
for (const meta of catalog.packages)
|
|
217
|
+
validateContent(meta, parseContent(json(resolve(contentDirectory, `${meta.slug}.json`)), meta.slug));
|
|
218
|
+
}
|
|
219
|
+
return { catalog, contentDirectory, manifest, refineComponents, search };
|
|
220
|
+
}
|
|
221
|
+
export function loadSnapshot(snapshotRoot = DEFAULT_SNAPSHOT_ROOT, options = {}) {
|
|
222
|
+
if (!existsSync(snapshotRoot))
|
|
223
|
+
throw new CodexError(`Snapshot root not found: ${snapshotRoot}. Reinstall @vielzeug/codex or build it from source.`);
|
|
224
|
+
const pointerFile = resolve(snapshotRoot, 'current.json');
|
|
225
|
+
const directory = existsSync(pointerFile)
|
|
226
|
+
? resolve(snapshotRoot, parsePointer(json(pointerFile)).directory)
|
|
227
|
+
: snapshotRoot;
|
|
228
|
+
return loadSnapshotDirectory(directory, options);
|
|
229
|
+
}
|
|
230
|
+
export function validateSnapshot(snapshotRoot = DEFAULT_SNAPSHOT_ROOT) {
|
|
231
|
+
loadSnapshot(snapshotRoot, { validateContents: true });
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/index.js
CHANGED
|
@@ -1,61 +1,40 @@
|
|
|
1
1
|
import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError } from '@modelcontextprotocol/sdk/types.js';
|
|
2
2
|
import { log } from '../_log.js';
|
|
3
|
-
import {
|
|
3
|
+
import { CatalogError } from '../catalog.js';
|
|
4
4
|
import { packageTools } from './packages.js';
|
|
5
5
|
import { refineTools } from './refine.js';
|
|
6
|
-
export { buildToolContext } from './shared.js';
|
|
7
|
-
// One flat list: generic package tools first, then refine's structured-metadata tools.
|
|
8
|
-
// Deliberately no sandbox/ore/spell-specific tools — those used to hand-duplicate (and,
|
|
9
|
-
// for sandbox, actively misrepresent) API surface already covered accurately by the
|
|
10
|
-
// generic get-docs/get-source/get-type-signature tools above. See docs/sandbox/api.md,
|
|
11
|
-
// docs/ore/api.md, docs/spell/api.md for that reference material instead.
|
|
12
|
-
//
|
|
13
|
-
// Exported (not just a local const) so scripts/generate-tool-docs.ts can render the
|
|
14
|
-
// README tables straight from this registry instead of a hand-maintained copy.
|
|
15
6
|
export const ALL_TOOLS = [...packageTools, ...refineTools];
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
.join(', ');
|
|
22
|
-
return entries ? `(${entries})` : '()';
|
|
7
|
+
const byName = new Map(ALL_TOOLS.map((tool) => [tool.name, tool]));
|
|
8
|
+
function content(value) {
|
|
9
|
+
return {
|
|
10
|
+
content: [{ text: typeof value === 'string' ? value : JSON.stringify(value, null, 2), type: 'text' }],
|
|
11
|
+
};
|
|
23
12
|
}
|
|
24
|
-
export function registerTools(server,
|
|
13
|
+
export function registerTools(server, catalog, debug = false) {
|
|
25
14
|
server.setRequestHandler(ListToolsRequestSchema, () => ({
|
|
26
|
-
tools: ALL_TOOLS.map((
|
|
15
|
+
tools: ALL_TOOLS.map(({ description, inputSchema, name }) => ({ description, inputSchema, name })),
|
|
27
16
|
}));
|
|
28
17
|
server.setRequestHandler(CallToolRequestSchema, (request) => {
|
|
29
|
-
const tool =
|
|
30
|
-
if (!tool)
|
|
31
|
-
if (DEBUG)
|
|
32
|
-
log(`[codex] tool not found: ${request.params.name}`);
|
|
18
|
+
const tool = byName.get(request.params.name);
|
|
19
|
+
if (!tool)
|
|
33
20
|
throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${request.params.name}`);
|
|
34
|
-
|
|
35
|
-
const args = request.params.arguments ?? {};
|
|
36
|
-
if (DEBUG)
|
|
37
|
-
log(`[codex] → ${tool.name}${debugArgs(args)}`);
|
|
38
|
-
const t0 = DEBUG ? Date.now() : 0;
|
|
21
|
+
const started = Date.now();
|
|
39
22
|
try {
|
|
40
|
-
const result = tool.
|
|
41
|
-
if (
|
|
42
|
-
log(
|
|
43
|
-
return result;
|
|
23
|
+
const result = tool.execute(request.params.arguments ?? {}, catalog);
|
|
24
|
+
if (debug)
|
|
25
|
+
log(`${tool.name} ${Date.now() - started}ms`);
|
|
26
|
+
return content(result);
|
|
44
27
|
}
|
|
45
|
-
catch (
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
if (DEBUG)
|
|
50
|
-
log(`[codex] ✗ ${tool.name} ${err.code}: ${err.message}`);
|
|
28
|
+
catch (error) {
|
|
29
|
+
if (error instanceof CatalogError) {
|
|
30
|
+
if (debug)
|
|
31
|
+
log(`${tool.name} ${error.code}: ${error.message}`);
|
|
51
32
|
return {
|
|
52
|
-
content: [{ text: JSON.stringify({ code:
|
|
33
|
+
content: [{ text: JSON.stringify({ code: error.code, message: error.message }), type: 'text' }],
|
|
53
34
|
isError: true,
|
|
54
35
|
};
|
|
55
36
|
}
|
|
56
|
-
|
|
57
|
-
log(`[codex] ✗ ${tool.name} threw: ${err instanceof Error ? err.message : String(err)}`);
|
|
58
|
-
throw err;
|
|
37
|
+
throw error;
|
|
59
38
|
}
|
|
60
39
|
});
|
|
61
40
|
}
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAIxH,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAIxH,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,YAAY,EAAgB,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,CAAC,MAAM,SAAS,GAA8B,CAAC,GAAG,YAAY,EAAE,GAAG,WAAW,CAAC,CAAC;AAEtF,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AAEnE,SAAS,OAAO,CAAC,KAAc;IAC7B,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,CAAC;KAC/G,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,OAAgB,EAAE,KAAK,GAAG,KAAK;IAC3E,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,GAAG,EAAE,CAAC,CAAC;QACtD,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;KACnG,CAAC,CAAC,CAAC;IACJ,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,CAAC,OAAO,EAAE,EAAE;QAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAE7C,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,iBAAiB,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAEhG,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE3B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;YAErE,IAAI,KAAK;gBAAE,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,IAAI,CAAC,CAAC;YAEzD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;gBAClC,IAAI,KAAK;oBAAE,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAE/D,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,CAAC;oBACxG,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/tools/packages.js
CHANGED
|
@@ -1,196 +1,97 @@
|
|
|
1
|
-
import { packageMeta } from '../data.js';
|
|
2
|
-
import { ToolError } from '../errors.js';
|
|
3
|
-
import { describeScoreTiers, scorePackage } from '../search.js';
|
|
4
1
|
import { DOC_PAGES } from '../types.js';
|
|
5
2
|
import { PACKAGE_SLUG_PROPERTY, parseArgs } from './schema.js';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
// list-packages
|
|
9
|
-
// ---------------------------------------------------------------------------
|
|
10
|
-
const listPackagesSchema = { properties: {}, type: 'object' };
|
|
11
|
-
export const listPackagesTool = {
|
|
12
|
-
description: 'List all vielzeug packages with metadata (version, description, category, keywords, exports, availableDocPages, exampleIds, hasSource). Returns a JSON array of PackageMeta objects sorted by slug. Use this tool first to discover available packages, then call get-package for a single package, get-docs for docs, get-source for source, or get-example for a REPL example.',
|
|
13
|
-
inputSchema: listPackagesSchema,
|
|
14
|
-
name: 'list-packages',
|
|
15
|
-
run(_args, context) {
|
|
16
|
-
return text(JSON.stringify([...context.bySlug.values()].map(packageMeta), null, 2));
|
|
17
|
-
},
|
|
18
|
-
};
|
|
19
|
-
// ---------------------------------------------------------------------------
|
|
20
|
-
// get-package
|
|
21
|
-
// ---------------------------------------------------------------------------
|
|
22
|
-
const getPackageSchema = {
|
|
3
|
+
const empty = { properties: {}, type: 'object' };
|
|
4
|
+
const slug = {
|
|
23
5
|
properties: { packageSlug: PACKAGE_SLUG_PROPERTY },
|
|
24
6
|
required: ['packageSlug'],
|
|
25
7
|
type: 'object',
|
|
26
8
|
};
|
|
27
|
-
|
|
28
|
-
description: 'Get metadata for a single vielzeug package by slug. Returns a PackageMeta object with version, description, category, keywords, exports, availableDocPages, exampleIds, and hasSource. Use list-packages first to discover available slugs.',
|
|
29
|
-
inputSchema: getPackageSchema,
|
|
30
|
-
name: 'get-package',
|
|
31
|
-
run(args, context) {
|
|
32
|
-
const { packageSlug } = parseArgs(getPackageSchema, args);
|
|
33
|
-
const pkg = requirePackage(context, packageSlug);
|
|
34
|
-
return text(JSON.stringify(packageMeta(pkg), null, 2));
|
|
35
|
-
},
|
|
36
|
-
};
|
|
37
|
-
// ---------------------------------------------------------------------------
|
|
38
|
-
// get-docs
|
|
39
|
-
// ---------------------------------------------------------------------------
|
|
40
|
-
const getDocsSchema = {
|
|
9
|
+
const docs = {
|
|
41
10
|
properties: {
|
|
42
11
|
packageSlug: PACKAGE_SLUG_PROPERTY,
|
|
43
|
-
page: { default: 'index', description: '
|
|
44
|
-
},
|
|
45
|
-
required: ['packageSlug'],
|
|
46
|
-
type: 'object',
|
|
47
|
-
};
|
|
48
|
-
export const getDocsTool = {
|
|
49
|
-
description: 'Read a documentation page for a vielzeug package. Returns Markdown text. page defaults to "index" (overview + quick start). Use "api" for full API reference, "usage" for how-to guide, "examples" for recipe index. Check availableDocPages from list-packages before requesting a specific page.',
|
|
50
|
-
inputSchema: getDocsSchema,
|
|
51
|
-
name: 'get-docs',
|
|
52
|
-
run(args, context) {
|
|
53
|
-
const { packageSlug, page } = parseArgs(getDocsSchema, args);
|
|
54
|
-
const pkg = requirePackage(context, packageSlug);
|
|
55
|
-
const content = pkg.docs[page];
|
|
56
|
-
if (!content) {
|
|
57
|
-
throw new ToolError('NOT_FOUND', `No "${page}" page for "${packageSlug}". Available: ${pkg.availableDocPages.join(', ') || 'none'}.`);
|
|
58
|
-
}
|
|
59
|
-
return text(content);
|
|
60
|
-
},
|
|
61
|
-
};
|
|
62
|
-
// ---------------------------------------------------------------------------
|
|
63
|
-
// get-source
|
|
64
|
-
// ---------------------------------------------------------------------------
|
|
65
|
-
const getSourceSchema = {
|
|
66
|
-
properties: { packageSlug: PACKAGE_SLUG_PROPERTY },
|
|
67
|
-
required: ['packageSlug'],
|
|
68
|
-
type: 'object',
|
|
69
|
-
};
|
|
70
|
-
export const getSourceTool = {
|
|
71
|
-
description: 'Read the full src/index.ts source of a vielzeug package. Returns TypeScript text with all exported function signatures, types, and JSDoc. Use this when you need exact type signatures or implementation details not covered by docs. Check hasSource from list-packages first — returns isError if no source is bundled.',
|
|
72
|
-
inputSchema: getSourceSchema,
|
|
73
|
-
name: 'get-source',
|
|
74
|
-
run(args, context) {
|
|
75
|
-
const { packageSlug } = parseArgs(getSourceSchema, args);
|
|
76
|
-
const pkg = requirePackage(context, packageSlug);
|
|
77
|
-
if (!pkg.apiSource)
|
|
78
|
-
throw new ToolError('UNAVAILABLE', `Package "${packageSlug}" has no src/index.ts source in bundled data.`);
|
|
79
|
-
return text(pkg.apiSource);
|
|
12
|
+
page: { default: 'index', description: 'Documentation page', enum: DOC_PAGES, type: 'string' },
|
|
80
13
|
},
|
|
81
|
-
};
|
|
82
|
-
// ---------------------------------------------------------------------------
|
|
83
|
-
// list-examples
|
|
84
|
-
// ---------------------------------------------------------------------------
|
|
85
|
-
const listExamplesSchema = {
|
|
86
|
-
properties: { packageSlug: PACKAGE_SLUG_PROPERTY },
|
|
87
14
|
required: ['packageSlug'],
|
|
88
15
|
type: 'object',
|
|
89
16
|
};
|
|
90
|
-
|
|
91
|
-
description: 'List runnable REPL code examples for a vielzeug package. Returns a JSON array of { id, name } (no code — use get-example for that). These are the same examples users can run interactively at vielzeug.dev/repl. Returns an empty array (not an error) for packages with no REPL examples (e.g. DOM-output packages like refine, prism, ore).',
|
|
92
|
-
inputSchema: listExamplesSchema,
|
|
93
|
-
name: 'list-examples',
|
|
94
|
-
run(args, context) {
|
|
95
|
-
const { packageSlug } = parseArgs(listExamplesSchema, args);
|
|
96
|
-
const pkg = requirePackage(context, packageSlug);
|
|
97
|
-
return text(JSON.stringify(pkg.examples.map(({ id, name }) => ({ id, name })), null, 2));
|
|
98
|
-
},
|
|
99
|
-
};
|
|
100
|
-
// ---------------------------------------------------------------------------
|
|
101
|
-
// get-example
|
|
102
|
-
// ---------------------------------------------------------------------------
|
|
103
|
-
const getExampleSchema = {
|
|
17
|
+
const example = {
|
|
104
18
|
properties: {
|
|
105
|
-
exampleId: { description: 'Example
|
|
19
|
+
exampleId: { description: 'Example identifier', maxLength: 100, minLength: 1, type: 'string' },
|
|
106
20
|
packageSlug: PACKAGE_SLUG_PROPERTY,
|
|
107
21
|
},
|
|
108
22
|
required: ['packageSlug', 'exampleId'],
|
|
109
23
|
type: 'object',
|
|
110
24
|
};
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
inputSchema: getExampleSchema,
|
|
114
|
-
name: 'get-example',
|
|
115
|
-
run(args, context) {
|
|
116
|
-
const { exampleId, packageSlug } = parseArgs(getExampleSchema, args);
|
|
117
|
-
const pkg = requirePackage(context, packageSlug);
|
|
118
|
-
const example = pkg.examples.find((e) => e.id === exampleId);
|
|
119
|
-
if (!example) {
|
|
120
|
-
const available = pkg.examples.map((e) => e.id).join(', ') || 'none';
|
|
121
|
-
throw new ToolError('NOT_FOUND', `No example "${exampleId}" for "${packageSlug}". Available: ${available}.`);
|
|
122
|
-
}
|
|
123
|
-
return text(example.code);
|
|
124
|
-
},
|
|
125
|
-
};
|
|
126
|
-
// ---------------------------------------------------------------------------
|
|
127
|
-
// search-packages
|
|
128
|
-
// ---------------------------------------------------------------------------
|
|
129
|
-
const searchPackagesSchema = {
|
|
130
|
-
properties: { query: { description: 'Non-empty search term', maxLength: 500, minLength: 1, type: 'string' } },
|
|
25
|
+
const query = {
|
|
26
|
+
properties: { query: { description: 'Non-empty search query', maxLength: 500, minLength: 1, type: 'string' } },
|
|
131
27
|
required: ['query'],
|
|
132
28
|
type: 'object',
|
|
133
29
|
};
|
|
134
|
-
|
|
135
|
-
description: `Search vielzeug packages by keyword across name, description, category, keywords, exports, related, docs, REPL examples, and source. Supports multi-word queries (all words must match). Returns a JSON array of SearchHit objects sorted by score descending. score: ${describeScoreTiers()}. Returns empty array (not an error) when nothing matches. Prefer this over list-packages when you know what you are looking for.`,
|
|
136
|
-
inputSchema: searchPackagesSchema,
|
|
137
|
-
name: 'search-packages',
|
|
138
|
-
run(args, context) {
|
|
139
|
-
const { query } = parseArgs(searchPackagesSchema, args);
|
|
140
|
-
const results = context.normalisedPackages
|
|
141
|
-
.map((pkg) => scorePackage(pkg, query))
|
|
142
|
-
.filter((hit) => hit !== null)
|
|
143
|
-
.sort((a, b) => b.score - a.score || a.slug.localeCompare(b.slug));
|
|
144
|
-
return text(JSON.stringify(results, null, 2));
|
|
145
|
-
},
|
|
146
|
-
};
|
|
147
|
-
// ---------------------------------------------------------------------------
|
|
148
|
-
// get-type-signature
|
|
149
|
-
// ---------------------------------------------------------------------------
|
|
150
|
-
const getTypeSignatureSchema = {
|
|
30
|
+
const signature = {
|
|
151
31
|
properties: {
|
|
152
32
|
slug: PACKAGE_SLUG_PROPERTY,
|
|
153
|
-
symbol: {
|
|
154
|
-
description: 'Exported name to look up, e.g. "debounce" or "SearchOptions"',
|
|
155
|
-
maxLength: 200,
|
|
156
|
-
minLength: 1,
|
|
157
|
-
type: 'string',
|
|
158
|
-
},
|
|
33
|
+
symbol: { description: 'Exported symbol name', maxLength: 200, minLength: 1, type: 'string' },
|
|
159
34
|
},
|
|
160
35
|
required: ['slug', 'symbol'],
|
|
161
36
|
type: 'object',
|
|
162
37
|
};
|
|
163
|
-
export const getTypeSignatureTool = {
|
|
164
|
-
description: "Look up the exported TypeScript declaration for a named symbol from a @vielzeug package's bundled src/index.ts (extracted and indexed at build time, not parsed per-request). Returns the raw declaration text — useful for verifying the exact signature of a function, type alias, interface, or constant without loading the full source. Returns isError when the package has no bundled source or the symbol is not found.",
|
|
165
|
-
inputSchema: getTypeSignatureSchema,
|
|
166
|
-
name: 'get-type-signature',
|
|
167
|
-
run(args, context) {
|
|
168
|
-
const { slug, symbol } = parseArgs(getTypeSignatureSchema, args);
|
|
169
|
-
const pkg = requirePackage(context, slug);
|
|
170
|
-
if (!pkg.apiSource)
|
|
171
|
-
throw new ToolError('UNAVAILABLE', `Package "${slug}" has no bundled source.`);
|
|
172
|
-
// `Object.hasOwn` guard (not just `pkg.typeSignatures[symbol]` + truthiness): `symbol` is
|
|
173
|
-
// arbitrary user input with no charset/enum restriction. Without this check, a symbol like
|
|
174
|
-
// "__proto__", "constructor", or "toString" would resolve through the prototype chain to a
|
|
175
|
-
// real (but never bundled) `Object.prototype` member — a truthy non-string value — bypassing
|
|
176
|
-
// the not-found check below and returning a malformed result instead of a clean NOT_FOUND.
|
|
177
|
-
if (!Object.hasOwn(pkg.typeSignatures, symbol)) {
|
|
178
|
-
throw new ToolError('NOT_FOUND', `"${symbol}" not found in ${slug}/src/index.ts.`);
|
|
179
|
-
}
|
|
180
|
-
const declaration = pkg.typeSignatures[symbol];
|
|
181
|
-
if (!declaration)
|
|
182
|
-
throw new ToolError('NOT_FOUND', `"${symbol}" not found in ${slug}/src/index.ts.`);
|
|
183
|
-
return text(declaration);
|
|
184
|
-
},
|
|
185
|
-
};
|
|
186
38
|
export const packageTools = [
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
39
|
+
{
|
|
40
|
+
description: 'List every Vielzeug package. Start here for package discovery.',
|
|
41
|
+
execute: (_args, catalog) => catalog.listPackages(),
|
|
42
|
+
inputSchema: empty,
|
|
43
|
+
name: 'list-packages',
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
description: 'Read metadata for one package.',
|
|
47
|
+
execute: (args, catalog) => catalog.getPackage(parseArgs(slug, args).packageSlug),
|
|
48
|
+
inputSchema: slug,
|
|
49
|
+
name: 'get-package',
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
description: 'Read one documentation page as Markdown.',
|
|
53
|
+
execute: (args, catalog) => {
|
|
54
|
+
const input = parseArgs(docs, args);
|
|
55
|
+
return catalog.getDocs(input.packageSlug, input.page);
|
|
56
|
+
},
|
|
57
|
+
inputSchema: docs,
|
|
58
|
+
name: 'get-docs',
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
description: 'Read bundled public source for one package.',
|
|
62
|
+
execute: (args, catalog) => catalog.getSource(parseArgs(slug, args).packageSlug),
|
|
63
|
+
inputSchema: slug,
|
|
64
|
+
name: 'get-source',
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
description: 'List runnable REPL examples for one package.',
|
|
68
|
+
execute: (args, catalog) => catalog.listExamples(parseArgs(slug, args).packageSlug),
|
|
69
|
+
inputSchema: slug,
|
|
70
|
+
name: 'list-examples',
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
description: 'Read one runnable REPL example.',
|
|
74
|
+
execute: (args, catalog) => {
|
|
75
|
+
const input = parseArgs(example, args);
|
|
76
|
+
return catalog.getExample(input.packageSlug, input.exampleId).code;
|
|
77
|
+
},
|
|
78
|
+
inputSchema: example,
|
|
79
|
+
name: 'get-example',
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
description: 'Search package metadata, docs, examples, and source. Results use deterministic slug order.',
|
|
83
|
+
execute: (args, catalog) => catalog.search(parseArgs(query, args).query),
|
|
84
|
+
inputSchema: query,
|
|
85
|
+
name: 'search-packages',
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
description: 'Read one exported TypeScript declaration.',
|
|
89
|
+
execute: (args, catalog) => {
|
|
90
|
+
const input = parseArgs(signature, args);
|
|
91
|
+
return catalog.getTypeSignature(input.slug, input.symbol);
|
|
92
|
+
},
|
|
93
|
+
inputSchema: signature,
|
|
94
|
+
name: 'get-type-signature',
|
|
95
|
+
},
|
|
195
96
|
];
|
|
196
97
|
//# sourceMappingURL=packages.js.map
|