@vielzeug/codex 1.0.2

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 (50) hide show
  1. package/README.md +142 -0
  2. package/data/.cache.json +33 -0
  3. package/data/llms-full.txt +43590 -0
  4. package/data/llms.txt +117 -0
  5. package/data/vielzeug-data.json +14554 -0
  6. package/dist/__tests__/server.test.js +346 -0
  7. package/dist/__tests__/server.test.js.map +1 -0
  8. package/dist/__tests__/unit.test.js +502 -0
  9. package/dist/__tests__/unit.test.js.map +1 -0
  10. package/dist/_log.js +5 -0
  11. package/dist/_log.js.map +1 -0
  12. package/dist/cli.js +94 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/data.js +91 -0
  15. package/dist/data.js.map +1 -0
  16. package/dist/errors.js +26 -0
  17. package/dist/errors.js.map +1 -0
  18. package/dist/frontmatter.js +72 -0
  19. package/dist/frontmatter.js.map +1 -0
  20. package/dist/generator.js +176 -0
  21. package/dist/generator.js.map +1 -0
  22. package/dist/http.js +108 -0
  23. package/dist/http.js.map +1 -0
  24. package/dist/index.js +6 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/llms.js +162 -0
  27. package/dist/llms.js.map +1 -0
  28. package/dist/port.js +12 -0
  29. package/dist/port.js.map +1 -0
  30. package/dist/resources.js +4 -0
  31. package/dist/resources.js.map +1 -0
  32. package/dist/search.js +125 -0
  33. package/dist/search.js.map +1 -0
  34. package/dist/server.js +13 -0
  35. package/dist/server.js.map +1 -0
  36. package/dist/tools/index.js +62 -0
  37. package/dist/tools/index.js.map +1 -0
  38. package/dist/tools/packages.js +196 -0
  39. package/dist/tools/packages.js.map +1 -0
  40. package/dist/tools/refine.js +329 -0
  41. package/dist/tools/refine.js.map +1 -0
  42. package/dist/tools/schema.js +37 -0
  43. package/dist/tools/schema.js.map +1 -0
  44. package/dist/tools/shared.js +27 -0
  45. package/dist/tools/shared.js.map +1 -0
  46. package/dist/tools.js +1040 -0
  47. package/dist/tools.js.map +1 -0
  48. package/dist/types.js +4 -0
  49. package/dist/types.js.map +1 -0
  50. package/package.json +47 -0
@@ -0,0 +1,329 @@
1
+ import { ToolError } from '../errors.js';
2
+ import { parseArgs } from './schema.js';
3
+ import { text } from './shared.js';
4
+ // Every tool in this file is refine-specific — named with a `refine-` prefix so the
5
+ // tool list itself signals which tools are generic (packages.ts) vs. bound to one
6
+ // package's structured component metadata (this file). Backed by the real Custom
7
+ // Elements Manifest generated from refine's build output — never hand-duplicated data,
8
+ // so it can't drift the way the old ore-directives/spell-validators/sandbox tools did.
9
+ const REFINE_UNAVAILABLE = 'Refine component metadata is unavailable in this snapshot. If using the monorepo, build /refine first then run prepare:data. Published releases include this data automatically.';
10
+ /** Every refine tool needs at least one bundled component; throws UNAVAILABLE otherwise. */
11
+ function requireAnyComponent(context) {
12
+ if (context.refineComponents.length === 0)
13
+ throw new ToolError('UNAVAILABLE', REFINE_UNAVAILABLE);
14
+ return context.refineComponents;
15
+ }
16
+ /** Resolves one component by tag name, or throws UNAVAILABLE/NOT_FOUND. */
17
+ function requireComponent(context, tagName) {
18
+ const components = requireAnyComponent(context);
19
+ const decl = components.find((d) => d.tagName === tagName);
20
+ if (!decl) {
21
+ throw new ToolError('NOT_FOUND', `Component "${tagName}" not found. Available tags: ${context.refineComponentTags.join(', ')}`);
22
+ }
23
+ return decl;
24
+ }
25
+ // ---------------------------------------------------------------------------
26
+ // refine-list-components
27
+ // ---------------------------------------------------------------------------
28
+ const listComponentsSchema = { properties: {}, type: 'object' };
29
+ export const listComponentsTool = {
30
+ description: 'List all @vielzeug/refine web component tags from bundled Custom Elements Manifest (CEM) metadata. Returns a JSON array with tagName, description, and attrs (name, type, default). Use this to discover available components before calling refine-get-component for full details. Returns isError if refine was not built before data generation.',
31
+ inputSchema: listComponentsSchema,
32
+ name: 'refine-list-components',
33
+ run(_args, context) {
34
+ const components = requireAnyComponent(context);
35
+ const tags = components
36
+ .filter((d) => d.tagName)
37
+ .map((d) => ({
38
+ attrs: (d.attributes ?? []).map((a) => ({
39
+ name: a.name,
40
+ type: a.type?.text ?? 'string',
41
+ ...(a.default !== undefined && { default: a.default }),
42
+ })),
43
+ description: d.description ?? '',
44
+ tagName: d.tagName,
45
+ }));
46
+ return text(JSON.stringify(tags, null, 2));
47
+ },
48
+ };
49
+ // ---------------------------------------------------------------------------
50
+ // refine-get-component
51
+ // ---------------------------------------------------------------------------
52
+ const getComponentSchema = {
53
+ properties: {
54
+ tagName: {
55
+ description: 'HTML custom element tag, e.g. "ore-button"',
56
+ maxLength: 100,
57
+ minLength: 1,
58
+ type: 'string',
59
+ },
60
+ },
61
+ required: ['tagName'],
62
+ type: 'object',
63
+ };
64
+ export const getComponentTool = {
65
+ description: 'Get the full Custom Elements Manifest (CEM) declaration for a single @vielzeug/refine component by its HTML tag name (e.g. "ore-button"). Returns a JSON object with attributes, events, slots, CSS parts, CSS properties, and member methods. Call refine-list-components first to get valid tag names.',
66
+ inputSchema: getComponentSchema,
67
+ name: 'refine-get-component',
68
+ run(args, context) {
69
+ const { tagName } = parseArgs(getComponentSchema, args);
70
+ const declaration = requireComponent(context, tagName);
71
+ return text(JSON.stringify(declaration, null, 2));
72
+ },
73
+ };
74
+ // ---------------------------------------------------------------------------
75
+ // refine-generate-template helpers
76
+ // ---------------------------------------------------------------------------
77
+ function attributeSnippet(attr) {
78
+ const typeText = attr.type?.text ?? '';
79
+ if (typeText === 'boolean')
80
+ return attr.name;
81
+ // Literal union e.g. 'primary' | 'secondary' — use the first literal
82
+ const firstLiteral = /^['"](\S+?)['"]/.exec(typeText);
83
+ if (firstLiteral)
84
+ return `${attr.name}="${firstLiteral[1]}"`;
85
+ if (attr.default !== undefined && attr.default !== 'undefined' && attr.default !== '')
86
+ return `${attr.name}="${attr.default}"`;
87
+ return `${attr.name}=""`;
88
+ }
89
+ function buildTemplate(decl, scenario) {
90
+ const tag = decl.tagName ?? '';
91
+ const attrs = decl.attributes ?? [];
92
+ const slots = decl.slots ?? [];
93
+ const events = decl.events ?? [];
94
+ const primary = attrs.filter((a) => a.default === undefined);
95
+ const optional = attrs.filter((a) => a.default !== undefined);
96
+ let attrStr = '';
97
+ for (const a of primary)
98
+ attrStr += `\n ${attributeSnippet(a)}`;
99
+ const namedSlots = slots.filter((s) => s.name && s.name !== '');
100
+ const hasDefaultSlot = slots.length === 0 || slots.some((s) => !s.name || s.name === '');
101
+ let inner = '';
102
+ for (const s of namedSlots)
103
+ inner += `\n <span slot="${s.name}">${s.description ?? s.name}</span>`;
104
+ if (hasDefaultSlot)
105
+ inner += '\n Content goes here';
106
+ let comments = '';
107
+ if (optional.length > 0) {
108
+ comments += '\n <!-- Optional attributes:';
109
+ for (const a of optional)
110
+ comments += `\n ${attributeSnippet(a)} (default: ${a.default ?? 'unset'})`;
111
+ comments += '\n -->';
112
+ }
113
+ if (events.length > 0) {
114
+ comments += `\n <!-- Events: ${events.map((e) => e.name).join(', ')} -->`;
115
+ }
116
+ const header = scenario ? `<!-- ${scenario} -->\n` : '';
117
+ return `${header}<${tag}${attrStr}>${comments}${inner ? inner + '\n' : ''}</${tag}>`;
118
+ }
119
+ // ---------------------------------------------------------------------------
120
+ // refine-generate-template
121
+ // ---------------------------------------------------------------------------
122
+ const generateTemplateSchema = {
123
+ properties: {
124
+ scenario: {
125
+ default: '',
126
+ description: 'Optional usage context to include as a leading comment, e.g. "primary call-to-action button"',
127
+ maxLength: 200,
128
+ type: 'string',
129
+ },
130
+ tagName: {
131
+ description: 'HTML custom element tag, e.g. "ore-button"',
132
+ maxLength: 100,
133
+ minLength: 1,
134
+ type: 'string',
135
+ },
136
+ },
137
+ required: ['tagName'],
138
+ type: 'object',
139
+ };
140
+ export const generateTemplateTool = {
141
+ description: 'Generate a ready-to-use HTML template for a @vielzeug/refine component. Returns a snippet with required attributes filled with type-appropriate placeholders, optional attributes in a comment block, and all named slots scaffolded. Use this as the starting point for AI-generated declarative UI — avoids hallucinated attribute names. Call refine-list-components first to get valid tag names.',
142
+ inputSchema: generateTemplateSchema,
143
+ name: 'refine-generate-template',
144
+ run(args, context) {
145
+ const { scenario, tagName } = parseArgs(generateTemplateSchema, args);
146
+ const decl = requireComponent(context, tagName);
147
+ return text(buildTemplate(decl, scenario || undefined));
148
+ },
149
+ };
150
+ // ---------------------------------------------------------------------------
151
+ // refine-get-tokens
152
+ // ---------------------------------------------------------------------------
153
+ const getTokensSchema = {
154
+ properties: {
155
+ filter: {
156
+ default: '',
157
+ description: 'Optional prefix to filter token names, e.g. "--refine-color". Case-insensitive.',
158
+ maxLength: 100,
159
+ type: 'string',
160
+ },
161
+ },
162
+ type: 'object',
163
+ };
164
+ export const getTokensTool = {
165
+ description: 'List all CSS custom properties (design tokens) exposed by @vielzeug/refine components. Returns a JSON array of { name, description, default, component } objects sorted by name. Pass an optional filter prefix (e.g. "--refine-color") to narrow results. Use when generating dynamic themes or inline styles in AI-driven UI.',
166
+ inputSchema: getTokensSchema,
167
+ name: 'refine-get-tokens',
168
+ run(args, context) {
169
+ const { filter } = parseArgs(getTokensSchema, args);
170
+ const components = requireAnyComponent(context);
171
+ const rawFilter = filter.toLowerCase();
172
+ // Components are iterated in stable bundled order (the order refine's CEM manifest declares
173
+ // them in), so first-seen-wins below is deterministic run-to-run, not arbitrary. Shared design
174
+ // tokens (e.g. "--refine-color-primary") are typically declared identically on every component
175
+ // that uses them, so keeping the first occurrence and dropping later duplicates is harmless in
176
+ // the common case. If two components ever document the *same* token name with genuinely
177
+ // different descriptions/defaults, only the first-encountered one is returned here — that's an
178
+ // intentional simplification (one row per token name, not per component), not a bug.
179
+ const seen = new Set();
180
+ const tokens = [];
181
+ for (const decl of components) {
182
+ const componentId = decl.tagName ?? decl.name ?? 'unknown';
183
+ for (const prop of decl.cssProperties ?? []) {
184
+ if (!prop.name || seen.has(prop.name))
185
+ continue;
186
+ if (rawFilter && !prop.name.toLowerCase().startsWith(rawFilter))
187
+ continue;
188
+ seen.add(prop.name);
189
+ tokens.push({
190
+ component: componentId,
191
+ ...(prop.default !== undefined && { default: prop.default }),
192
+ ...(prop.description && { description: prop.description }),
193
+ name: prop.name,
194
+ });
195
+ }
196
+ }
197
+ tokens.sort((a, b) => a.name.localeCompare(b.name));
198
+ return text(JSON.stringify(tokens, null, 2));
199
+ },
200
+ };
201
+ // ---------------------------------------------------------------------------
202
+ // refine-validate-usage helpers
203
+ //
204
+ // Regex-based, deliberately — this validates a single AI-generated custom-element usage
205
+ // snippet (one tag + attributes + slots), not arbitrary HTML documents. A real HTML parser
206
+ // would be more correct for pathological input (attribute values containing raw `>`) but
207
+ // adds a runtime dependency for a narrow, already-adequate check; not worth it here.
208
+ // ---------------------------------------------------------------------------
209
+ const SAFE_HTML_ATTRS = new Set([
210
+ 'class',
211
+ 'contenteditable',
212
+ 'dir',
213
+ 'draggable',
214
+ 'exportparts',
215
+ 'hidden',
216
+ 'id',
217
+ 'lang',
218
+ 'part',
219
+ 'slot',
220
+ 'style',
221
+ 'tabindex',
222
+ 'title',
223
+ ]);
224
+ const SAFE_ATTR_PREFIXES = ['aria-', 'data-', 'on'];
225
+ /** Escapes regex metacharacters so a string can be safely interpolated into a `new RegExp(...)` pattern. */
226
+ function escapeRegExp(s) {
227
+ return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
228
+ }
229
+ function parseTagAttributes(html, tagName) {
230
+ // `tagName` is always resolved through `requireComponent` first (a fixed, real-component-tag
231
+ // allowlist — see every caller below), so it can never actually carry regex metacharacters or
232
+ // attacker-controlled content today. Escaping it here is defense-in-depth, not a fix for a
233
+ // currently-reachable exploit: it keeps this function safe to call with untrusted input on its
234
+ // own terms, independent of what its current callers happen to guarantee.
235
+ const pattern = new RegExp(`<${escapeRegExp(tagName)}((?:\\s[^>]*)?)(?:>|/>)`, 'i');
236
+ const match = pattern.exec(html);
237
+ if (!match)
238
+ return null;
239
+ const attrStr = match[1] ?? '';
240
+ const result = new Map();
241
+ const attrRe = /([\w-]+)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s/>]*)))?/g;
242
+ let m;
243
+ while ((m = attrRe.exec(attrStr)) !== null) {
244
+ const [, name, dq, sq, bare] = m;
245
+ if (name)
246
+ result.set(name.toLowerCase(), dq ?? sq ?? bare ?? '');
247
+ }
248
+ return result;
249
+ }
250
+ function parseSlotNames(html) {
251
+ const slots = [];
252
+ const re = /\bslot=["']([^"']+)["']/gi;
253
+ let m;
254
+ while ((m = re.exec(html)) !== null) {
255
+ if (m[1])
256
+ slots.push(m[1]);
257
+ }
258
+ return slots;
259
+ }
260
+ // ---------------------------------------------------------------------------
261
+ // refine-validate-usage
262
+ // ---------------------------------------------------------------------------
263
+ const validateUsageSchema = {
264
+ properties: {
265
+ html: {
266
+ description: 'HTML fragment containing the component usage to validate (max 5000 chars)',
267
+ maxLength: 5_000,
268
+ minLength: 1,
269
+ type: 'string',
270
+ },
271
+ tagName: {
272
+ description: 'HTML custom element tag to validate against, e.g. "ore-button"',
273
+ maxLength: 100,
274
+ minLength: 1,
275
+ type: 'string',
276
+ },
277
+ },
278
+ required: ['html', 'tagName'],
279
+ type: 'object',
280
+ };
281
+ export const validateUsageTool = {
282
+ description: 'Validate AI-generated HTML against a @vielzeug/refine component spec. Checks for unknown attributes and unrecognised slot names. Returns a JSON array of { type, message } objects — an empty array means the usage is valid. Use this to close the generate → validate → fix loop before rendering.',
283
+ inputSchema: validateUsageSchema,
284
+ name: 'refine-validate-usage',
285
+ run(args, context) {
286
+ const { html, tagName } = parseArgs(validateUsageSchema, args);
287
+ const decl = requireComponent(context, tagName);
288
+ const issues = [];
289
+ const knownAttrs = new Set((decl.attributes ?? []).map((a) => a.name.toLowerCase()));
290
+ const knownSlots = new Set((decl.slots ?? []).map((s) => s.name).filter(Boolean));
291
+ const foundAttrs = parseTagAttributes(html, tagName);
292
+ if (!foundAttrs) {
293
+ issues.push({ message: `Could not find opening <${tagName}> tag in the provided HTML.`, type: 'error' });
294
+ }
295
+ else {
296
+ for (const attr of foundAttrs.keys()) {
297
+ if (SAFE_HTML_ATTRS.has(attr))
298
+ continue;
299
+ if (SAFE_ATTR_PREFIXES.some((p) => attr.startsWith(p)))
300
+ continue;
301
+ if (!knownAttrs.has(attr)) {
302
+ issues.push({
303
+ message: `Unknown attribute "${attr}" on <${tagName}>. Known: ${[...knownAttrs].join(', ') || 'none'}.`,
304
+ type: 'error',
305
+ });
306
+ }
307
+ }
308
+ }
309
+ if (knownSlots.size > 0) {
310
+ for (const slot of parseSlotNames(html)) {
311
+ if (!knownSlots.has(slot)) {
312
+ issues.push({
313
+ message: `Unknown slot "${slot}" on <${tagName}>. Known slots: ${[...knownSlots].join(', ')}.`,
314
+ type: 'error',
315
+ });
316
+ }
317
+ }
318
+ }
319
+ return text(JSON.stringify(issues, null, 2));
320
+ },
321
+ };
322
+ export const refineTools = [
323
+ listComponentsTool,
324
+ getComponentTool,
325
+ generateTemplateTool,
326
+ getTokensTool,
327
+ validateUsageTool,
328
+ ];
329
+ //# sourceMappingURL=refine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refine.js","sourceRoot":"","sources":["../../src/tools/refine.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,SAAS,EAAmB,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,IAAI,EAAyC,MAAM,aAAa,CAAC;AAE1E,oFAAoF;AACpF,kFAAkF;AAClF,iFAAiF;AACjF,uFAAuF;AACvF,uFAAuF;AAEvF,MAAM,kBAAkB,GACtB,kLAAkL,CAAC;AAErL,4FAA4F;AAC5F,SAAS,mBAAmB,CAAC,OAAoB;IAC/C,IAAI,OAAO,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;IAElG,OAAO,OAAO,CAAC,gBAAgB,CAAC;AAClC,CAAC;AAED,2EAA2E;AAC3E,SAAS,gBAAgB,CAAC,OAAoB,EAAE,OAAe;IAC7D,MAAM,UAAU,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;IAE3D,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,SAAS,CACjB,WAAW,EACX,cAAc,OAAO,gCAAgC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9F,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E,MAAM,oBAAoB,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAuB,CAAC;AAErF,MAAM,CAAC,MAAM,kBAAkB,GAAmB;IAChD,WAAW,EACT,qVAAqV;IACvV,WAAW,EAAE,oBAAoB;IACjC,IAAI,EAAE,wBAAwB;IAC9B,GAAG,CAAC,KAAK,EAAE,OAAO;QAChB,MAAM,UAAU,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAEhD,MAAM,IAAI,GAAG,UAAU;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;aACxB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACX,KAAK,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACtC,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,QAAQ;gBAC9B,GAAG,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;aACvD,CAAC,CAAC;YACH,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;YAChC,OAAO,EAAE,CAAC,CAAC,OAAO;SACnB,CAAC,CAAC,CAAC;QAEN,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;CACF,CAAC;AAEF,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,MAAM,kBAAkB,GAAG;IACzB,UAAU,EAAE;QACV,OAAO,EAAE;YACP,WAAW,EAAE,4CAA4C;YACzD,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,CAAC;YACZ,IAAI,EAAE,QAAQ;SACf;KACF;IACD,QAAQ,EAAE,CAAC,SAAS,CAAC;IACrB,IAAI,EAAE,QAAQ;CACM,CAAC;AAEvB,MAAM,CAAC,MAAM,gBAAgB,GAAmB;IAC9C,WAAW,EACT,0SAA0S;IAC5S,WAAW,EAAE,kBAAkB;IAC/B,IAAI,EAAE,sBAAsB;IAC5B,GAAG,CAAC,IAAI,EAAE,OAAO;QACf,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;QACxD,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEvD,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;CACF,CAAC;AAEF,8EAA8E;AAC9E,mCAAmC;AACnC,8EAA8E;AAE9E,SAAS,gBAAgB,CAAC,IAAkB;IAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;IAEvC,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC;IAE7C,qEAAqE;IACrE,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEtD,IAAI,YAAY;QAAE,OAAO,GAAG,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC;IAE7D,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,WAAW,IAAI,IAAI,CAAC,OAAO,KAAK,EAAE;QACnF,OAAO,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,GAAG,CAAC;IAE1C,OAAO,GAAG,IAAI,CAAC,IAAI,KAAK,CAAC;AAC3B,CAAC;AAED,SAAS,aAAa,CAAC,IAAoB,EAAE,QAA4B;IACvE,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;IAEjC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC;IAE9D,IAAI,OAAO,GAAG,EAAE,CAAC;IAEjB,KAAK,MAAM,CAAC,IAAI,OAAO;QAAE,OAAO,IAAI,OAAO,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;IAEjE,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;IAChE,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;IAEzF,IAAI,KAAK,GAAG,EAAE,CAAC;IAEf,KAAK,MAAM,CAAC,IAAI,UAAU;QAAE,KAAK,IAAI,mBAAmB,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,IAAI,SAAS,CAAC;IAEpG,IAAI,cAAc;QAAE,KAAK,IAAI,uBAAuB,CAAC;IAErD,IAAI,QAAQ,GAAG,EAAE,CAAC;IAElB,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,QAAQ,IAAI,+BAA+B,CAAC;QAC5C,KAAK,MAAM,CAAC,IAAI,QAAQ;YAAE,QAAQ,IAAI,SAAS,gBAAgB,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,OAAO,IAAI,OAAO,GAAG,CAAC;QACzG,QAAQ,IAAI,SAAS,CAAC;IACxB,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,QAAQ,IAAI,oBAAoB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IAC7E,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,QAAQ,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IAExD,OAAO,GAAG,MAAM,IAAI,GAAG,GAAG,OAAO,IAAI,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,GAAG,CAAC;AACvF,CAAC;AAED,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E,MAAM,sBAAsB,GAAG;IAC7B,UAAU,EAAE;QACV,QAAQ,EAAE;YACR,OAAO,EAAE,EAAE;YACX,WAAW,EAAE,8FAA8F;YAC3G,SAAS,EAAE,GAAG;YACd,IAAI,EAAE,QAAQ;SACf;QACD,OAAO,EAAE;YACP,WAAW,EAAE,4CAA4C;YACzD,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,CAAC;YACZ,IAAI,EAAE,QAAQ;SACf;KACF;IACD,QAAQ,EAAE,CAAC,SAAS,CAAC;IACrB,IAAI,EAAE,QAAQ;CACM,CAAC;AAEvB,MAAM,CAAC,MAAM,oBAAoB,GAAmB;IAClD,WAAW,EACT,uYAAuY;IACzY,WAAW,EAAE,sBAAsB;IACnC,IAAI,EAAE,0BAA0B;IAChC,GAAG,CAAC,IAAI,EAAE,OAAO;QACf,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;QACtE,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEhD,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,QAAQ,IAAI,SAAS,CAAC,CAAC,CAAC;IAC1D,CAAC;CACF,CAAC;AAEF,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,MAAM,eAAe,GAAG;IACtB,UAAU,EAAE;QACV,MAAM,EAAE;YACN,OAAO,EAAE,EAAE;YACX,WAAW,EAAE,iFAAiF;YAC9F,SAAS,EAAE,GAAG;YACd,IAAI,EAAE,QAAQ;SACf;KACF;IACD,IAAI,EAAE,QAAQ;CACM,CAAC;AAEvB,MAAM,CAAC,MAAM,aAAa,GAAmB;IAC3C,WAAW,EACT,iUAAiU;IACnU,WAAW,EAAE,eAAe;IAC5B,IAAI,EAAE,mBAAmB;IACzB,GAAG,CAAC,IAAI,EAAE,OAAO;QACf,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;QACpD,MAAM,UAAU,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAEhD,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QACvC,4FAA4F;QAC5F,+FAA+F;QAC/F,+FAA+F;QAC/F,+FAA+F;QAC/F,wFAAwF;QACxF,+FAA+F;QAC/F,qFAAqF;QACrF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,MAAM,GAAkF,EAAE,CAAC;QAEjG,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC;YAE3D,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,aAAa,IAAI,EAAE,EAAE,CAAC;gBAC5C,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;oBAAE,SAAS;gBAEhD,IAAI,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;oBAAE,SAAS;gBAE1E,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC;oBACV,SAAS,EAAE,WAAW;oBACtB,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;oBAC5D,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;oBAC1D,IAAI,EAAE,IAAI,CAAC,IAAI;iBAChB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAEpD,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;CACF,CAAC;AAEF,8EAA8E;AAC9E,gCAAgC;AAChC,EAAE;AACF,wFAAwF;AACxF,2FAA2F;AAC3F,yFAAyF;AACzF,qFAAqF;AACrF,8EAA8E;AAE9E,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,OAAO;IACP,iBAAiB;IACjB,KAAK;IACL,WAAW;IACX,aAAa;IACb,QAAQ;IACR,IAAI;IACJ,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,UAAU;IACV,OAAO;CACR,CAAC,CAAC;AACH,MAAM,kBAAkB,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAEpD,4GAA4G;AAC5G,SAAS,YAAY,CAAC,CAAS;IAC7B,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY,EAAE,OAAe;IACvD,6FAA6F;IAC7F,8FAA8F;IAC9F,2FAA2F;IAC3F,+FAA+F;IAC/F,0EAA0E;IAC1E,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,IAAI,YAAY,CAAC,OAAO,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;IACpF,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEjC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,MAAM,MAAM,GAAG,yDAAyD,CAAC;IACzE,IAAI,CAAyB,CAAC;IAE9B,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC3C,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAEjC,IAAI,IAAI;YAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,EAAE,GAAG,2BAA2B,CAAC;IACvC,IAAI,CAAyB,CAAC;IAE9B,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,CAAC,CAAC,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E,MAAM,mBAAmB,GAAG;IAC1B,UAAU,EAAE;QACV,IAAI,EAAE;YACJ,WAAW,EAAE,2EAA2E;YACxF,SAAS,EAAE,KAAK;YAChB,SAAS,EAAE,CAAC;YACZ,IAAI,EAAE,QAAQ;SACf;QACD,OAAO,EAAE;YACP,WAAW,EAAE,gEAAgE;YAC7E,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,CAAC;YACZ,IAAI,EAAE,QAAQ;SACf;KACF;IACD,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;IAC7B,IAAI,EAAE,QAAQ;CACM,CAAC;AAEvB,MAAM,CAAC,MAAM,iBAAiB,GAAmB;IAC/C,WAAW,EACT,sSAAsS;IACxS,WAAW,EAAE,mBAAmB;IAChC,IAAI,EAAE,uBAAuB;IAC7B,GAAG,CAAC,IAAI,EAAE,OAAO;QACf,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEhD,MAAM,MAAM,GAAqD,EAAE,CAAC;QACpE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACrF,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAa,CAAC,CAAC;QAE9F,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAErD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,2BAA2B,OAAO,6BAA6B,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAC3G,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;gBACrC,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAE,SAAS;gBAExC,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;oBAAE,SAAS;gBAEjE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC1B,MAAM,CAAC,IAAI,CAAC;wBACV,OAAO,EAAE,sBAAsB,IAAI,SAAS,OAAO,aAAa,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG;wBACvG,IAAI,EAAE,OAAO;qBACd,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,UAAU,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACxB,KAAK,MAAM,IAAI,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC1B,MAAM,CAAC,IAAI,CAAC;wBACV,OAAO,EAAE,iBAAiB,IAAI,SAAS,OAAO,mBAAmB,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;wBAC9F,IAAI,EAAE,OAAO;qBACd,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAqB;IAC3C,kBAAkB;IAClB,gBAAgB;IAChB,oBAAoB;IACpB,aAAa;IACb,iBAAiB;CAClB,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { ToolError } from '../errors.js';
2
+ /** A property shared by every tool that takes a package slug — one definition, reused everywhere. */
3
+ export const PACKAGE_SLUG_PROPERTY = {
4
+ description: 'Package folder name, e.g. "ripple"',
5
+ maxLength: 100,
6
+ minLength: 1,
7
+ type: 'string',
8
+ };
9
+ /** Validates + trims raw MCP tool arguments against a `ToolSchema`. Throws `ToolError('INVALID_ARG', ...)` on the first violation. */
10
+ export function parseArgs(schema, raw) {
11
+ const result = {};
12
+ for (const [key, prop] of Object.entries(schema.properties)) {
13
+ const required = schema.required?.includes(key) ?? false;
14
+ const value = raw[key];
15
+ if (value === undefined || value === '') {
16
+ if (required)
17
+ throw new ToolError('INVALID_ARG', `${key}: required non-empty string.`);
18
+ if (prop.default !== undefined)
19
+ result[key] = prop.default;
20
+ continue;
21
+ }
22
+ if (typeof value !== 'string')
23
+ throw new ToolError('INVALID_ARG', `${key}: must be a string.`);
24
+ const trimmed = value.trim();
25
+ if (required && trimmed.length === 0)
26
+ throw new ToolError('INVALID_ARG', `${key}: required non-empty string.`);
27
+ if (prop.minLength !== undefined && trimmed.length < prop.minLength)
28
+ throw new ToolError('INVALID_ARG', `${key}: must be at least ${prop.minLength} characters.`);
29
+ if (prop.maxLength !== undefined && trimmed.length > prop.maxLength)
30
+ throw new ToolError('INVALID_ARG', `${key}: exceeds ${prop.maxLength} character limit. Shorten the value.`);
31
+ if (prop.enum && !prop.enum.includes(trimmed))
32
+ throw new ToolError('INVALID_ARG', `${key}: must be one of ${prop.enum.join(', ')}.`);
33
+ result[key] = trimmed;
34
+ }
35
+ return result;
36
+ }
37
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/tools/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AA6BzC,qGAAqG;AACrG,MAAM,CAAC,MAAM,qBAAqB,GAAiB;IACjD,WAAW,EAAE,oCAAoC;IACjD,SAAS,EAAE,GAAG;IACd,SAAS,EAAE,CAAC;IACZ,IAAI,EAAE,QAAQ;CACf,CAAC;AAWF,sIAAsI;AACtI,MAAM,UAAU,SAAS,CAAuB,MAAS,EAAE,GAA4B;IACrF,MAAM,MAAM,GAA2B,EAAE,CAAC;IAE1C,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5D,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC;QACzD,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QAEvB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YACxC,IAAI,QAAQ;gBAAE,MAAM,IAAI,SAAS,CAAC,aAAa,EAAE,GAAG,GAAG,8BAA8B,CAAC,CAAC;YAEvF,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;YAE3D,SAAS;QACX,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,MAAM,IAAI,SAAS,CAAC,aAAa,EAAE,GAAG,GAAG,qBAAqB,CAAC,CAAC;QAE/F,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAE7B,IAAI,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,aAAa,EAAE,GAAG,GAAG,8BAA8B,CAAC,CAAC;QAE/G,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS;YACjE,MAAM,IAAI,SAAS,CAAC,aAAa,EAAE,GAAG,GAAG,sBAAsB,IAAI,CAAC,SAAS,cAAc,CAAC,CAAC;QAE/F,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS;YACjE,MAAM,IAAI,SAAS,CAAC,aAAa,EAAE,GAAG,GAAG,aAAa,IAAI,CAAC,SAAS,sCAAsC,CAAC,CAAC;QAE9G,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC3C,MAAM,IAAI,SAAS,CAAC,aAAa,EAAE,GAAG,GAAG,oBAAoB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAExF,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;IACxB,CAAC;IAED,OAAO,MAAsB,CAAC;AAChC,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { ToolError } from '../errors.js';
2
+ import { normalisePackage } from '../search.js';
3
+ // ---------------------------------------------------------------------------
4
+ // Result helpers
5
+ // ---------------------------------------------------------------------------
6
+ export function text(value) {
7
+ return { content: [{ text: value, type: 'text' }] };
8
+ }
9
+ export function buildToolContext(data) {
10
+ return {
11
+ bySlug: new Map(data.packages.map((pkg) => [pkg.slug, pkg])),
12
+ normalisedPackages: data.packages.map(normalisePackage),
13
+ refineComponents: data.refineComponents,
14
+ refineComponentTags: data.refineComponents.filter((d) => d.tagName).map((d) => d.tagName),
15
+ };
16
+ }
17
+ export function knownSlugs(context) {
18
+ return [...context.bySlug.keys()].join(', ');
19
+ }
20
+ /** Looks up a package by slug or throws `ToolError('NOT_FOUND', ...)` — the one place every tool resolves a slug. */
21
+ export function requirePackage(context, slug) {
22
+ const pkg = context.bySlug.get(slug);
23
+ if (!pkg)
24
+ throw new ToolError('NOT_FOUND', `Package "${slug}" not found. Available slugs: ${knownSlugs(context)}`);
25
+ return pkg;
26
+ }
27
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhD,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,MAAM,UAAU,IAAI,CAAC,KAAa;IAChC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AACtD,CAAC;AAeD,MAAM,UAAU,gBAAgB,CAAC,IAAiB;IAChD,OAAO;QACL,MAAM,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;QAC5D,kBAAkB,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC;QACvD,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,mBAAmB,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAiB,CAAC;KACpG,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAoB;IAC7C,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED,qHAAqH;AACrH,MAAM,UAAU,cAAc,CAAC,OAAoB,EAAE,IAAY;IAC/D,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAErC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,SAAS,CAAC,WAAW,EAAE,YAAY,IAAI,iCAAiC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAEnH,OAAO,GAAG,CAAC;AACb,CAAC"}