@vielzeug/codex 1.0.4 → 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.
Files changed (68) hide show
  1. package/README.md +46 -107
  2. package/data/catalog.json +1679 -0
  3. package/data/llms-full.txt +18826 -31876
  4. package/data/llms.txt +32 -114
  5. package/data/manifest.json +8 -0
  6. package/data/packages/arsenal.json +210 -0
  7. package/data/packages/assay.json +40 -0
  8. package/data/packages/clockwork.json +67 -0
  9. package/data/packages/codex.json +43 -0
  10. package/data/packages/coins.json +103 -0
  11. package/data/packages/conduit.json +60 -0
  12. package/data/packages/courier.json +58 -0
  13. package/data/packages/dnd.json +75 -0
  14. package/data/packages/familiar.json +30 -0
  15. package/data/packages/flux.json +93 -0
  16. package/data/packages/forge.json +84 -0
  17. package/data/packages/herald.json +122 -0
  18. package/data/packages/keymap.json +65 -0
  19. package/data/packages/ledger.json +54 -0
  20. package/data/packages/lingua.json +66 -0
  21. package/data/packages/orbit.json +112 -0
  22. package/data/packages/ore.json +73 -0
  23. package/data/packages/prism.json +70 -0
  24. package/data/packages/pulse.json +58 -0
  25. package/data/packages/refine.json +12 -0
  26. package/data/packages/ripple.json +79 -0
  27. package/data/packages/rune.json +81 -0
  28. package/data/packages/sandbox.json +39 -0
  29. package/data/packages/scout.json +60 -0
  30. package/data/packages/scroll.json +113 -0
  31. package/data/packages/sourcerer.json +74 -0
  32. package/data/packages/spell.json +134 -0
  33. package/data/packages/tempo.json +113 -0
  34. package/data/packages/vault.json +90 -0
  35. package/data/packages/ward.json +125 -0
  36. package/data/packages/wayfinder.json +113 -0
  37. package/data/refine.json +11752 -0
  38. package/data/search.json +1437 -0
  39. package/dist/catalog.js +149 -0
  40. package/dist/catalog.js.map +1 -0
  41. package/dist/cli.js +33 -59
  42. package/dist/cli.js.map +1 -1
  43. package/dist/errors.js +0 -14
  44. package/dist/errors.js.map +1 -1
  45. package/dist/http.js +54 -96
  46. package/dist/http.js.map +1 -1
  47. package/dist/index.js +6 -5
  48. package/dist/index.js.map +1 -1
  49. package/dist/server.js +4 -9
  50. package/dist/server.js.map +1 -1
  51. package/dist/snapshot.js +233 -0
  52. package/dist/snapshot.js.map +1 -0
  53. package/dist/tools/index.js +21 -42
  54. package/dist/tools/index.js.map +1 -1
  55. package/dist/tools/packages.js +67 -166
  56. package/dist/tools/packages.js.map +1 -1
  57. package/dist/tools/refine.js +99 -305
  58. package/dist/tools/refine.js.map +1 -1
  59. package/dist/tools/schema.js +8 -8
  60. package/dist/tools/schema.js.map +1 -1
  61. package/dist/tools/shared.js +1 -26
  62. package/dist/tools/shared.js.map +1 -1
  63. package/dist/types.js +1 -2
  64. package/dist/types.js.map +1 -1
  65. package/mcp-setup.json +10 -0
  66. package/package.json +7 -7
  67. package/data/.cache.json +0 -34
  68. package/data/vielzeug-data.json +0 -16118
@@ -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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"}
@@ -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 { ToolError } from '../errors.js';
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 TOOL_MAP = new Map(ALL_TOOLS.map((t) => [t.name, t]));
17
- const DEBUG = process.env['CODEX_DEBUG'] === '1';
18
- function debugArgs(args) {
19
- const entries = Object.entries(args)
20
- .map(([k, v]) => `${k}=${typeof v === 'string' ? JSON.stringify(v.length > 40 ? `${v.slice(0, 40)}…` : v) : String(v)}`)
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, context) {
13
+ export function registerTools(server, catalog, debug = false) {
25
14
  server.setRequestHandler(ListToolsRequestSchema, () => ({
26
- tools: ALL_TOOLS.map((tool) => ({ description: tool.description, inputSchema: tool.inputSchema, name: tool.name })),
15
+ tools: ALL_TOOLS.map(({ description, inputSchema, name }) => ({ description, inputSchema, name })),
27
16
  }));
28
17
  server.setRequestHandler(CallToolRequestSchema, (request) => {
29
- const tool = TOOL_MAP.get(request.params.name);
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.run(args, context);
41
- if (DEBUG)
42
- log(`[codex] ✓ ${tool.name} (${Date.now() - t0}ms)`);
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 (err) {
46
- // Every expected failure (bad arg, unknown slug/tag, missing bundled data) is a
47
- // ToolError; anything else is a real bug and is left to propagate as a protocol error.
48
- if (err instanceof ToolError) {
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: err.code, message: err.message }), type: 'text' }],
33
+ content: [{ text: JSON.stringify({ code: error.code, message: error.message }), type: 'text' }],
53
34
  isError: true,
54
35
  };
55
36
  }
56
- if (DEBUG)
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
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"}
@@ -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
- import { requirePackage, text } from './shared.js';
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
- export const getPackageTool = {
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: 'Doc page to read (defaults to "index")', enum: DOC_PAGES, type: 'string' },
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
- export const listExamplesTool = {
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 id, e.g. "function-debounce"', maxLength: 100, minLength: 1, type: 'string' },
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
- export const getExampleTool = {
112
- description: 'Read the full runnable source code of a single REPL example for a vielzeug package. Returns TypeScript text. Use list-examples first to discover valid exampleId values for a package.',
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
- export const searchPackagesTool = {
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
- listPackagesTool,
188
- getPackageTool,
189
- getDocsTool,
190
- getSourceTool,
191
- listExamplesTool,
192
- getExampleTool,
193
- searchPackagesTool,
194
- getTypeSignatureTool,
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