@vertesia/tools-sdk 0.80.0-dev.20251121 → 0.80.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 +122 -0
- package/lib/cjs/InteractionCollection.js +118 -0
- package/lib/cjs/InteractionCollection.js.map +1 -1
- package/lib/cjs/SkillCollection.js +318 -0
- package/lib/cjs/SkillCollection.js.map +1 -0
- package/lib/cjs/ToolCollection.js +98 -0
- package/lib/cjs/ToolCollection.js.map +1 -1
- package/lib/cjs/copy-assets.js +84 -0
- package/lib/cjs/copy-assets.js.map +1 -0
- package/lib/cjs/index.js +6 -1
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/server.js +327 -0
- package/lib/cjs/server.js.map +1 -0
- package/lib/cjs/site/styles.js +621 -0
- package/lib/cjs/site/styles.js.map +1 -0
- package/lib/cjs/site/templates.js +932 -0
- package/lib/cjs/site/templates.js.map +1 -0
- package/lib/esm/InteractionCollection.js +83 -0
- package/lib/esm/InteractionCollection.js.map +1 -1
- package/lib/esm/SkillCollection.js +311 -0
- package/lib/esm/SkillCollection.js.map +1 -0
- package/lib/esm/ToolCollection.js +64 -0
- package/lib/esm/ToolCollection.js.map +1 -1
- package/lib/esm/copy-assets.js +81 -0
- package/lib/esm/copy-assets.js.map +1 -0
- package/lib/esm/index.js +4 -0
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/server.js +323 -0
- package/lib/esm/server.js.map +1 -0
- package/lib/esm/site/styles.js +618 -0
- package/lib/esm/site/styles.js.map +1 -0
- package/lib/esm/site/templates.js +920 -0
- package/lib/esm/site/templates.js.map +1 -0
- package/lib/types/InteractionCollection.d.ts +29 -0
- package/lib/types/InteractionCollection.d.ts.map +1 -1
- package/lib/types/SkillCollection.d.ts +111 -0
- package/lib/types/SkillCollection.d.ts.map +1 -0
- package/lib/types/ToolCollection.d.ts +18 -0
- package/lib/types/ToolCollection.d.ts.map +1 -1
- package/lib/types/copy-assets.d.ts +14 -0
- package/lib/types/copy-assets.d.ts.map +1 -0
- package/lib/types/index.d.ts +4 -0
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/server.d.ts +72 -0
- package/lib/types/server.d.ts.map +1 -0
- package/lib/types/site/styles.d.ts +5 -0
- package/lib/types/site/styles.d.ts.map +1 -0
- package/lib/types/site/templates.d.ts +54 -0
- package/lib/types/site/templates.d.ts.map +1 -0
- package/lib/types/types.d.ts +152 -0
- package/lib/types/types.d.ts.map +1 -1
- package/package.json +18 -5
- package/src/InteractionCollection.ts +90 -0
- package/src/SkillCollection.ts +389 -0
- package/src/ToolCollection.ts +68 -0
- package/src/copy-assets.ts +104 -0
- package/src/index.ts +4 -0
- package/src/server.ts +444 -0
- package/src/site/styles.ts +617 -0
- package/src/site/templates.ts +956 -0
- package/src/types.ts +162 -0
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
import { Hono } from "hono";
|
|
2
|
+
import { cors } from "hono/cors";
|
|
3
|
+
import { HTTPException } from "hono/http-exception";
|
|
4
|
+
import { authorize } from "./auth.js";
|
|
5
|
+
import { indexPage, interactionCollectionPage, skillCollectionPage, toolCollectionPage } from "./site/templates.js";
|
|
6
|
+
/**
|
|
7
|
+
* Create a Hono server for tools, interactions, and skills.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* import { createToolServer, ToolCollection, SkillCollection } from "@vertesia/tools-sdk";
|
|
12
|
+
*
|
|
13
|
+
* const server = createToolServer({
|
|
14
|
+
* tools: [myToolCollection],
|
|
15
|
+
* skills: [mySkillCollection],
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* export default server;
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export function createToolServer(config) {
|
|
22
|
+
const { title = 'Tools Server', prefix = '/api', tools = [], interactions = [], skills = [], mcpProviders = [], disableHtml = false, } = config;
|
|
23
|
+
const app = new Hono();
|
|
24
|
+
// Add CORS middleware globally
|
|
25
|
+
app.use('*', cors({ origin: '*', allowMethods: ['GET', 'POST', 'OPTIONS'] }));
|
|
26
|
+
// HTML pages (unless disabled)
|
|
27
|
+
if (!disableHtml) {
|
|
28
|
+
// Index page
|
|
29
|
+
app.get('/', (c) => {
|
|
30
|
+
return c.html(indexPage(tools, skills, interactions, mcpProviders, title));
|
|
31
|
+
});
|
|
32
|
+
// Tool collection pages
|
|
33
|
+
for (const coll of tools) {
|
|
34
|
+
app.get(`/tools/${coll.name}`, (c) => {
|
|
35
|
+
return c.html(toolCollectionPage(coll));
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
// Skill collection pages
|
|
39
|
+
for (const coll of skills) {
|
|
40
|
+
app.get(`/skills/${coll.name}`, (c) => {
|
|
41
|
+
return c.html(skillCollectionPage(coll));
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
// Interaction collection pages
|
|
45
|
+
for (const coll of interactions) {
|
|
46
|
+
app.get(`/interactions/${coll.name}`, (c) => {
|
|
47
|
+
return c.html(interactionCollectionPage(coll));
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Add base API route
|
|
52
|
+
app.get(prefix, (c) => {
|
|
53
|
+
// Skills are exposed as tools, so include them in the tools list
|
|
54
|
+
const allToolEndpoints = [
|
|
55
|
+
...tools.map(col => `${prefix}/tools/${col.name}`),
|
|
56
|
+
...skills.map(col => `${prefix}/skills/${col.name}`),
|
|
57
|
+
];
|
|
58
|
+
return c.json({
|
|
59
|
+
message: 'Vertesia Tools API',
|
|
60
|
+
version: '1.0.0',
|
|
61
|
+
endpoints: {
|
|
62
|
+
tools: allToolEndpoints,
|
|
63
|
+
interactions: interactions.map(col => `${prefix}/interactions/${col.name}`),
|
|
64
|
+
mcp: mcpProviders.map(p => `${prefix}/mcp/${p.name}`),
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
// ================== Aggregate Endpoints ==================
|
|
69
|
+
// These must be registered BEFORE collection-specific routes
|
|
70
|
+
// GET /api/skills - Returns all skills from all collections
|
|
71
|
+
app.get(`${prefix}/skills`, (c) => {
|
|
72
|
+
const url = new URL(c.req.url);
|
|
73
|
+
const allSkills = [];
|
|
74
|
+
for (const coll of skills) {
|
|
75
|
+
allSkills.push(...coll.getToolDefinitions());
|
|
76
|
+
}
|
|
77
|
+
return c.json({
|
|
78
|
+
src: `${url.origin}${url.pathname}`,
|
|
79
|
+
title: 'All Skills',
|
|
80
|
+
description: 'All available skills across all collections',
|
|
81
|
+
tools: allSkills,
|
|
82
|
+
collections: skills.map(s => ({
|
|
83
|
+
name: s.name,
|
|
84
|
+
title: s.title,
|
|
85
|
+
description: s.description,
|
|
86
|
+
})),
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
// GET /api/tools - Returns all tools from all collections
|
|
90
|
+
app.get(`${prefix}/tools`, (c) => {
|
|
91
|
+
const url = new URL(c.req.url);
|
|
92
|
+
const allTools = [];
|
|
93
|
+
for (const coll of tools) {
|
|
94
|
+
allTools.push(...coll.getToolDefinitions());
|
|
95
|
+
}
|
|
96
|
+
return c.json({
|
|
97
|
+
src: `${url.origin}${url.pathname}`,
|
|
98
|
+
title: 'All Tools',
|
|
99
|
+
description: 'All available tools across all collections',
|
|
100
|
+
tools: allTools,
|
|
101
|
+
collections: tools.map(t => ({
|
|
102
|
+
name: t.name,
|
|
103
|
+
title: t.title,
|
|
104
|
+
description: t.description,
|
|
105
|
+
})),
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
// GET /api/interactions - Returns all interactions from all collections
|
|
109
|
+
app.get(`${prefix}/interactions`, (c) => {
|
|
110
|
+
const allInteractions = [];
|
|
111
|
+
for (const coll of interactions) {
|
|
112
|
+
for (const inter of coll.interactions) {
|
|
113
|
+
allInteractions.push({
|
|
114
|
+
type: "app",
|
|
115
|
+
id: inter.name,
|
|
116
|
+
name: inter.name,
|
|
117
|
+
title: inter.title || inter.name,
|
|
118
|
+
description: inter.description,
|
|
119
|
+
tags: inter.tags || [],
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return c.json({
|
|
124
|
+
title: 'All Interactions',
|
|
125
|
+
description: 'All available interactions across all collections',
|
|
126
|
+
interactions: allInteractions,
|
|
127
|
+
collections: interactions.map(i => ({
|
|
128
|
+
name: i.name,
|
|
129
|
+
title: i.title,
|
|
130
|
+
description: i.description,
|
|
131
|
+
})),
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
// Create tool collection endpoints
|
|
135
|
+
for (const coll of tools) {
|
|
136
|
+
app.route(`${prefix}/tools/${coll.name}`, createToolEndpoints(coll));
|
|
137
|
+
// Also expose at root for backwards compatibility
|
|
138
|
+
app.route(`${prefix}/${coll.name}`, createToolEndpoints(coll));
|
|
139
|
+
}
|
|
140
|
+
// Create interaction collection endpoints
|
|
141
|
+
for (const coll of interactions) {
|
|
142
|
+
app.route(`${prefix}/interactions/${coll.name}`, createInteractionEndpoints(coll));
|
|
143
|
+
}
|
|
144
|
+
// Create skill collection endpoints (exposed as tools)
|
|
145
|
+
for (const coll of skills) {
|
|
146
|
+
app.route(`${prefix}/skills/${coll.name}`, createSkillEndpoints(coll));
|
|
147
|
+
}
|
|
148
|
+
// Create MCP provider endpoints
|
|
149
|
+
if (mcpProviders.length > 0) {
|
|
150
|
+
app.route(`${prefix}/mcp`, createMCPEndpoints(mcpProviders));
|
|
151
|
+
}
|
|
152
|
+
// Global error handler
|
|
153
|
+
app.onError((err, c) => {
|
|
154
|
+
if (err instanceof HTTPException) {
|
|
155
|
+
return c.json({ error: err.message }, err.status);
|
|
156
|
+
}
|
|
157
|
+
console.error('Uncaught Error:', err);
|
|
158
|
+
return c.json({ error: 'Internal Server Error' }, 500);
|
|
159
|
+
});
|
|
160
|
+
return app;
|
|
161
|
+
}
|
|
162
|
+
// ================== Tool Endpoints ==================
|
|
163
|
+
function createToolEndpoints(coll) {
|
|
164
|
+
const endpoint = new Hono();
|
|
165
|
+
endpoint.post('/', (c) => {
|
|
166
|
+
return coll.execute(c);
|
|
167
|
+
});
|
|
168
|
+
endpoint.get('/', (c) => {
|
|
169
|
+
const importSourceUrl = c.req.query('import') != null;
|
|
170
|
+
const url = new URL(c.req.url);
|
|
171
|
+
return c.json({
|
|
172
|
+
src: importSourceUrl
|
|
173
|
+
? `${url.origin}/libs/vertesia-tools-${coll.name}.js`
|
|
174
|
+
: `${url.origin}${url.pathname}`,
|
|
175
|
+
title: coll.title || coll.name,
|
|
176
|
+
description: coll.description || '',
|
|
177
|
+
tools: coll.getToolDefinitions()
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
return endpoint;
|
|
181
|
+
}
|
|
182
|
+
// ================== Interaction Endpoints ==================
|
|
183
|
+
function createInteractionEndpoints(coll) {
|
|
184
|
+
const endpoint = new Hono();
|
|
185
|
+
endpoint.get('/', (c) => {
|
|
186
|
+
return c.json(coll.interactions.map(inter => ({
|
|
187
|
+
type: "app",
|
|
188
|
+
id: inter.name,
|
|
189
|
+
name: inter.name,
|
|
190
|
+
title: inter.title || inter.name,
|
|
191
|
+
description: inter.description,
|
|
192
|
+
tags: inter.tags || [],
|
|
193
|
+
})));
|
|
194
|
+
});
|
|
195
|
+
endpoint.get('/:name', async (c) => {
|
|
196
|
+
await authorize(c);
|
|
197
|
+
const name = c.req.param('name');
|
|
198
|
+
const inter = coll.getInteractionByName(name);
|
|
199
|
+
if (!inter) {
|
|
200
|
+
throw new HTTPException(404, {
|
|
201
|
+
message: "No interaction found with name: " + name
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
return c.json(inter);
|
|
205
|
+
});
|
|
206
|
+
return endpoint;
|
|
207
|
+
}
|
|
208
|
+
// ================== Skill Endpoints ==================
|
|
209
|
+
function createSkillEndpoints(coll) {
|
|
210
|
+
const endpoint = new Hono();
|
|
211
|
+
// List skills as tool definitions (tool collection format)
|
|
212
|
+
// This allows skills to be used exactly like tools
|
|
213
|
+
endpoint.get('/', (c) => {
|
|
214
|
+
const url = new URL(c.req.url);
|
|
215
|
+
return c.json({
|
|
216
|
+
src: `${url.origin}${url.pathname}`,
|
|
217
|
+
title: coll.title || coll.name,
|
|
218
|
+
description: coll.description || '',
|
|
219
|
+
tools: coll.getToolDefinitions()
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
// Get scripts for a specific skill
|
|
223
|
+
// Returns all scripts bundled with the skill
|
|
224
|
+
endpoint.get('/:name/scripts', (c) => {
|
|
225
|
+
const name = c.req.param('name');
|
|
226
|
+
const skillName = name.startsWith('skill_') ? name.slice(6) : name;
|
|
227
|
+
const skill = coll.getSkill(skillName);
|
|
228
|
+
if (!skill) {
|
|
229
|
+
throw new HTTPException(404, {
|
|
230
|
+
message: `Skill not found: ${skillName}`
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
return c.json({
|
|
234
|
+
skill_name: skill.name,
|
|
235
|
+
scripts: skill.scripts || []
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
// Get a specific script file
|
|
239
|
+
endpoint.get('/:name/scripts/:filename', (c) => {
|
|
240
|
+
const name = c.req.param('name');
|
|
241
|
+
const filename = c.req.param('filename');
|
|
242
|
+
const skillName = name.startsWith('skill_') ? name.slice(6) : name;
|
|
243
|
+
const skill = coll.getSkill(skillName);
|
|
244
|
+
if (!skill) {
|
|
245
|
+
throw new HTTPException(404, {
|
|
246
|
+
message: `Skill not found: ${skillName}`
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
const script = skill.scripts?.find(s => s.name === filename);
|
|
250
|
+
if (!script) {
|
|
251
|
+
throw new HTTPException(404, {
|
|
252
|
+
message: `Script not found: ${filename}`
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
// Return as plain text with appropriate content type
|
|
256
|
+
const contentType = filename.endsWith('.py') ? 'text/x-python'
|
|
257
|
+
: filename.endsWith('.sh') ? 'text/x-shellscript'
|
|
258
|
+
: filename.endsWith('.js') ? 'text/javascript'
|
|
259
|
+
: 'text/plain';
|
|
260
|
+
return c.text(script.content, 200, { 'Content-Type': contentType });
|
|
261
|
+
});
|
|
262
|
+
// Get a specific skill by name
|
|
263
|
+
endpoint.get('/:name', (c) => {
|
|
264
|
+
const name = c.req.param('name');
|
|
265
|
+
// Handle both "skill_name" and "name" formats
|
|
266
|
+
const skillName = name.startsWith('skill_') ? name.slice(6) : name;
|
|
267
|
+
const skill = coll.getSkill(skillName);
|
|
268
|
+
if (!skill) {
|
|
269
|
+
throw new HTTPException(404, {
|
|
270
|
+
message: `Skill not found: ${skillName}`
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
return c.json(skill);
|
|
274
|
+
});
|
|
275
|
+
// Execute skill (standard tool execution format)
|
|
276
|
+
endpoint.post('/', (c) => {
|
|
277
|
+
return coll.execute(c);
|
|
278
|
+
});
|
|
279
|
+
return endpoint;
|
|
280
|
+
}
|
|
281
|
+
// ================== MCP Endpoints ==================
|
|
282
|
+
function createMCPEndpoints(providers) {
|
|
283
|
+
const endpoint = new Hono();
|
|
284
|
+
for (const p of providers) {
|
|
285
|
+
endpoint.post(`/${p.name}`, async (c) => {
|
|
286
|
+
const session = await authorize(c);
|
|
287
|
+
const config = await readJsonBody(c);
|
|
288
|
+
const info = await p.createMCPConnection(session, config);
|
|
289
|
+
return c.json(info);
|
|
290
|
+
});
|
|
291
|
+
endpoint.get(`/${p.name}`, (c) => c.json({
|
|
292
|
+
name: p.name,
|
|
293
|
+
description: p.description,
|
|
294
|
+
}));
|
|
295
|
+
}
|
|
296
|
+
return endpoint;
|
|
297
|
+
}
|
|
298
|
+
async function readJsonBody(ctx) {
|
|
299
|
+
try {
|
|
300
|
+
const text = await ctx.req.text();
|
|
301
|
+
const jsonContent = text?.trim() || '';
|
|
302
|
+
if (!jsonContent)
|
|
303
|
+
return {};
|
|
304
|
+
return JSON.parse(jsonContent);
|
|
305
|
+
}
|
|
306
|
+
catch (err) {
|
|
307
|
+
throw new HTTPException(400, {
|
|
308
|
+
message: "Failed to parse JSON body: " + err.message
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
// ================== Server Utilities ==================
|
|
313
|
+
/**
|
|
314
|
+
* Simple development server with static file handling
|
|
315
|
+
*/
|
|
316
|
+
export function createDevServer(config) {
|
|
317
|
+
const app = createToolServer(config);
|
|
318
|
+
if (config.staticHandler) {
|
|
319
|
+
app.use('*', config.staticHandler);
|
|
320
|
+
}
|
|
321
|
+
return app;
|
|
322
|
+
}
|
|
323
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
|