@vertesia/tools-sdk 0.24.0-dev.202601221707
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/LICENSE +13 -0
- package/README.md +122 -0
- package/lib/cjs/InteractionCollection.js +164 -0
- package/lib/cjs/InteractionCollection.js.map +1 -0
- package/lib/cjs/SkillCollection.js +376 -0
- package/lib/cjs/SkillCollection.js.map +1 -0
- package/lib/cjs/ToolCollection.js +228 -0
- package/lib/cjs/ToolCollection.js.map +1 -0
- package/lib/cjs/ToolRegistry.js +111 -0
- package/lib/cjs/ToolRegistry.js.map +1 -0
- package/lib/cjs/auth.js +104 -0
- package/lib/cjs/auth.js.map +1 -0
- package/lib/cjs/build/validate.js +7 -0
- package/lib/cjs/build/validate.js.map +1 -0
- package/lib/cjs/copy-assets.js +84 -0
- package/lib/cjs/copy-assets.js.map +1 -0
- package/lib/cjs/index.js +31 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/cjs/package.json +3 -0
- package/lib/cjs/server/interactions.js +66 -0
- package/lib/cjs/server/interactions.js.map +1 -0
- package/lib/cjs/server/mcp.js +45 -0
- package/lib/cjs/server/mcp.js.map +1 -0
- package/lib/cjs/server/site.js +30 -0
- package/lib/cjs/server/site.js.map +1 -0
- package/lib/cjs/server/skills.js +114 -0
- package/lib/cjs/server/skills.js.map +1 -0
- package/lib/cjs/server/tools.js +104 -0
- package/lib/cjs/server/tools.js.map +1 -0
- package/lib/cjs/server/types.js +3 -0
- package/lib/cjs/server/types.js.map +1 -0
- package/lib/cjs/server/widgets.js +27 -0
- package/lib/cjs/server/widgets.js.map +1 -0
- package/lib/cjs/server.js +132 -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 +968 -0
- package/lib/cjs/site/templates.js.map +1 -0
- package/lib/cjs/types.js +3 -0
- package/lib/cjs/types.js.map +1 -0
- package/lib/cjs/utils.js +31 -0
- package/lib/cjs/utils.js.map +1 -0
- package/lib/esm/InteractionCollection.js +125 -0
- package/lib/esm/InteractionCollection.js.map +1 -0
- package/lib/esm/SkillCollection.js +369 -0
- package/lib/esm/SkillCollection.js.map +1 -0
- package/lib/esm/ToolCollection.js +190 -0
- package/lib/esm/ToolCollection.js.map +1 -0
- package/lib/esm/ToolRegistry.js +106 -0
- package/lib/esm/ToolRegistry.js.map +1 -0
- package/lib/esm/auth.js +97 -0
- package/lib/esm/auth.js.map +1 -0
- package/lib/esm/build/validate.js +4 -0
- package/lib/esm/build/validate.js.map +1 -0
- package/lib/esm/copy-assets.js +81 -0
- package/lib/esm/copy-assets.js.map +1 -0
- package/lib/esm/index.js +11 -0
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/server/interactions.js +63 -0
- package/lib/esm/server/interactions.js.map +1 -0
- package/lib/esm/server/mcp.js +42 -0
- package/lib/esm/server/mcp.js.map +1 -0
- package/lib/esm/server/site.js +27 -0
- package/lib/esm/server/site.js.map +1 -0
- package/lib/esm/server/skills.js +111 -0
- package/lib/esm/server/skills.js.map +1 -0
- package/lib/esm/server/tools.js +101 -0
- package/lib/esm/server/tools.js.map +1 -0
- package/lib/esm/server/types.js +2 -0
- package/lib/esm/server/types.js.map +1 -0
- package/lib/esm/server/widgets.js +24 -0
- package/lib/esm/server/widgets.js.map +1 -0
- package/lib/esm/server.js +128 -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 +956 -0
- package/lib/esm/site/templates.js.map +1 -0
- package/lib/esm/types.js +2 -0
- package/lib/esm/types.js.map +1 -0
- package/lib/esm/utils.js +26 -0
- package/lib/esm/utils.js.map +1 -0
- package/lib/types/InteractionCollection.d.ts +48 -0
- package/lib/types/InteractionCollection.d.ts.map +1 -0
- package/lib/types/SkillCollection.d.ts +118 -0
- package/lib/types/SkillCollection.d.ts.map +1 -0
- package/lib/types/ToolCollection.d.ts +72 -0
- package/lib/types/ToolCollection.d.ts.map +1 -0
- package/lib/types/ToolRegistry.d.ts +41 -0
- package/lib/types/ToolRegistry.d.ts.map +1 -0
- package/lib/types/auth.d.ts +32 -0
- package/lib/types/auth.d.ts.map +1 -0
- package/lib/types/build/validate.d.ts +2 -0
- package/lib/types/build/validate.d.ts.map +1 -0
- 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 +11 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/server/interactions.d.ts +4 -0
- package/lib/types/server/interactions.d.ts.map +1 -0
- package/lib/types/server/mcp.d.ts +4 -0
- package/lib/types/server/mcp.d.ts.map +1 -0
- package/lib/types/server/site.d.ts +4 -0
- package/lib/types/server/site.d.ts.map +1 -0
- package/lib/types/server/skills.d.ts +4 -0
- package/lib/types/server/skills.d.ts.map +1 -0
- package/lib/types/server/tools.d.ts +4 -0
- package/lib/types/server/tools.d.ts.map +1 -0
- package/lib/types/server/types.d.ts +62 -0
- package/lib/types/server/types.d.ts.map +1 -0
- package/lib/types/server/widgets.d.ts +9 -0
- package/lib/types/server/widgets.d.ts.map +1 -0
- package/lib/types/server.d.ts +27 -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 +280 -0
- package/lib/types/types.d.ts.map +1 -0
- package/lib/types/utils.d.ts +4 -0
- package/lib/types/utils.d.ts.map +1 -0
- package/package.json +58 -0
- package/src/InteractionCollection.ts +143 -0
- package/src/SkillCollection.ts +461 -0
- package/src/ToolCollection.ts +223 -0
- package/src/ToolRegistry.ts +135 -0
- package/src/auth.ts +123 -0
- package/src/build/validate.ts +3 -0
- package/src/copy-assets.ts +104 -0
- package/src/index.ts +12 -0
- package/src/server/interactions.ts +79 -0
- package/src/server/mcp.ts +51 -0
- package/src/server/site.ts +46 -0
- package/src/server/skills.ts +133 -0
- package/src/server/tools.ts +128 -0
- package/src/server/types.ts +65 -0
- package/src/server/widgets.ts +38 -0
- package/src/server.ts +160 -0
- package/src/site/styles.ts +617 -0
- package/src/site/templates.ts +994 -0
- package/src/types.ts +303 -0
- package/src/utils.ts +23 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { indexPage, interactionCollectionPage, skillCollectionPage, toolCollectionPage } from "../site/templates.js";
|
|
2
|
+
export function createSiteRoute(app, basePath, config) {
|
|
3
|
+
const { title = 'Tools Server', tools = [], interactions = [], skills = [], mcpProviders = [], } = config;
|
|
4
|
+
// Index page
|
|
5
|
+
app.get(`${basePath}/`, (c) => {
|
|
6
|
+
return c.html(indexPage(tools, skills, interactions, mcpProviders, title));
|
|
7
|
+
});
|
|
8
|
+
// Tool collection pages
|
|
9
|
+
for (const coll of tools) {
|
|
10
|
+
app.get(`${basePath}/tools/${coll.name}`, (c) => {
|
|
11
|
+
return c.html(toolCollectionPage(coll));
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
// Skill collection pages
|
|
15
|
+
for (const coll of skills) {
|
|
16
|
+
app.get(`${basePath}/skills/${coll.name}`, (c) => {
|
|
17
|
+
return c.html(skillCollectionPage(coll));
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
// Interaction collection pages
|
|
21
|
+
for (const coll of interactions) {
|
|
22
|
+
app.get(`${basePath}/interactions/${coll.name}`, (c) => {
|
|
23
|
+
return c.html(interactionCollectionPage(coll));
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=site.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site.js","sourceRoot":"","sources":["../../../src/server/site.ts"],"names":[],"mappings":"AACA,OAAO,EACH,SAAS,EACT,yBAAyB,EACzB,mBAAmB,EACnB,kBAAkB,EACrB,MAAM,sBAAsB,CAAC;AAI9B,MAAM,UAAU,eAAe,CAAC,GAAS,EAAE,QAAgB,EAAE,MAAwB;IACjF,MAAM,EACF,KAAK,GAAG,cAAc,EACtB,KAAK,GAAG,EAAE,EACV,YAAY,GAAG,EAAE,EACjB,MAAM,GAAG,EAAE,EACX,YAAY,GAAG,EAAE,GACpB,GAAG,MAAM,CAAC;IAEX,aAAa;IACb,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE;QAC1B,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,wBAAwB;IACxB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,UAAU,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE;YAC5C,OAAO,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACP,CAAC;IAED,yBAAyB;IACzB,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QACxB,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,WAAW,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE;YAC7C,OAAO,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACP,CAAC;IAED,+BAA+B;IAC/B,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAC9B,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,iBAAiB,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE;YACnD,OAAO,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACP,CAAC;AAEL,CAAC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
// ================== Skill Endpoints ==================
|
|
2
|
+
import { Hono } from "hono";
|
|
3
|
+
import { HTTPException } from "hono/http-exception";
|
|
4
|
+
import { makeScriptUrl } from "../utils.js";
|
|
5
|
+
export function createSkillsRoute(app, basePath, config) {
|
|
6
|
+
const { skills = [] } = config;
|
|
7
|
+
// Build a map of skill name -> collection for routing
|
|
8
|
+
const skillToCollection = new Map();
|
|
9
|
+
for (const coll of skills) {
|
|
10
|
+
for (const skill of coll.getSkillDefinitions()) {
|
|
11
|
+
skillToCollection.set(skill.name, coll);
|
|
12
|
+
// Also map the learn_ prefixed name
|
|
13
|
+
skillToCollection.set(`learn_${skill.name}`, coll);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
// GET /api/skills - Returns all skills from all collections
|
|
17
|
+
app.get(basePath, (c) => {
|
|
18
|
+
const url = new URL(c.req.url);
|
|
19
|
+
const allSkills = [];
|
|
20
|
+
for (const coll of skills) {
|
|
21
|
+
allSkills.push(...coll.getToolDefinitions());
|
|
22
|
+
}
|
|
23
|
+
return c.json({
|
|
24
|
+
src: `${url.origin}${url.pathname}`,
|
|
25
|
+
title: 'All Skills',
|
|
26
|
+
description: 'All available skills across all collections',
|
|
27
|
+
tools: allSkills,
|
|
28
|
+
collections: skills.map(s => ({
|
|
29
|
+
name: s.name,
|
|
30
|
+
title: s.title,
|
|
31
|
+
description: s.description,
|
|
32
|
+
})),
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
// POST /api/skills - Route to the correct collection based on tool_name
|
|
36
|
+
app.post(basePath, async (c) => {
|
|
37
|
+
const ctx = c;
|
|
38
|
+
// Payload is already parsed and validated by middleware
|
|
39
|
+
if (!ctx.payload) {
|
|
40
|
+
throw new HTTPException(400, {
|
|
41
|
+
message: 'Invalid or missing skill execution payload. Expected { tool_use: { id, tool_name, tool_input? }, metadata? }'
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
const toolName = ctx.payload.tool_use.tool_name;
|
|
45
|
+
// Find the collection for this skill
|
|
46
|
+
const collection = skillToCollection.get(toolName);
|
|
47
|
+
if (!collection) {
|
|
48
|
+
// Extract skill name for better error message
|
|
49
|
+
const skillName = toolName.startsWith('learn_') ? toolName.slice(6) : toolName;
|
|
50
|
+
throw new HTTPException(404, {
|
|
51
|
+
message: `Skill not found: ${skillName}. Available skills: ${Array.from(skillToCollection.keys()).filter(k => !k.startsWith('learn_')).join(', ')}`
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
// Delegate to the collection's execute method with pre-parsed payload
|
|
55
|
+
return collection.execute(c, ctx.payload);
|
|
56
|
+
});
|
|
57
|
+
// Create skill collection endpoints (exposed as tools)
|
|
58
|
+
for (const coll of skills) {
|
|
59
|
+
app.route(`${basePath}/${coll.name}`, createSkillEndpoints(coll));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function createSkillEndpoints(coll) {
|
|
63
|
+
const endpoint = new Hono();
|
|
64
|
+
// List skills as tool definitions (tool collection format)
|
|
65
|
+
// This allows skills to be used exactly like tools
|
|
66
|
+
endpoint.get('/', (c) => {
|
|
67
|
+
const url = new URL(c.req.url);
|
|
68
|
+
return c.json({
|
|
69
|
+
src: `${url.origin}${url.pathname}`,
|
|
70
|
+
title: coll.title || coll.name,
|
|
71
|
+
description: coll.description || '',
|
|
72
|
+
tools: coll.getToolDefinitions()
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
// Get scripts for a specific skill
|
|
76
|
+
// Returns all scripts bundled with the skill
|
|
77
|
+
endpoint.get('/:name/scripts', (c) => {
|
|
78
|
+
const name = c.req.param('name');
|
|
79
|
+
const skillName = name.startsWith('learn_') ? name.slice(6) : name;
|
|
80
|
+
const skill = coll.getSkill(skillName);
|
|
81
|
+
if (!skill) {
|
|
82
|
+
throw new HTTPException(404, {
|
|
83
|
+
message: `Skill not found: ${skillName}`
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
const url = new URL(c.req.url);
|
|
87
|
+
return c.json({
|
|
88
|
+
skill_name: skill.name,
|
|
89
|
+
scripts: skill.scripts ? skill.scripts.map(s => makeScriptUrl(url.origin, s)) : []
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
// Get a specific skill by name
|
|
93
|
+
endpoint.get('/:name', (c) => {
|
|
94
|
+
const name = c.req.param('name');
|
|
95
|
+
// Handle both "learn_name" and "name" formats
|
|
96
|
+
const skillName = name.startsWith('learn_') ? name.slice(6) : name;
|
|
97
|
+
const skill = coll.getSkill(skillName);
|
|
98
|
+
if (!skill) {
|
|
99
|
+
throw new HTTPException(404, {
|
|
100
|
+
message: `Skill not found: ${skillName}`
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
return c.json(skill);
|
|
104
|
+
});
|
|
105
|
+
// Execute skill (standard tool execution format)
|
|
106
|
+
endpoint.post('/', (c) => {
|
|
107
|
+
return coll.execute(c);
|
|
108
|
+
});
|
|
109
|
+
return endpoint;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/server/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { Hono } from "hono";
|
|
2
|
+
import { HTTPException } from "hono/http-exception";
|
|
3
|
+
export function createToolsRoute(app, basePath, config) {
|
|
4
|
+
const { tools = [] } = config;
|
|
5
|
+
// Build a map of tool name -> collection for routing
|
|
6
|
+
const toolToCollection = new Map();
|
|
7
|
+
for (const coll of tools) {
|
|
8
|
+
for (const toolDef of coll.getToolDefinitions()) {
|
|
9
|
+
toolToCollection.set(toolDef.name, coll);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
// GET /api/tools - Returns all tools from all collections
|
|
13
|
+
// Query params:
|
|
14
|
+
// - defaultOnly=true: Only return tools with default !== false
|
|
15
|
+
// - unlocked=tool1,tool2: Comma-separated list of unlocked tool names
|
|
16
|
+
app.get(basePath, (c) => {
|
|
17
|
+
const url = new URL(c.req.url);
|
|
18
|
+
const defaultOnly = c.req.query('defaultOnly') === 'true';
|
|
19
|
+
const unlockedParam = c.req.query('unlocked');
|
|
20
|
+
const unlockedTools = unlockedParam ? unlockedParam.split(',').map(t => t.trim()).filter(Boolean) : [];
|
|
21
|
+
const filterOptions = defaultOnly ? { defaultOnly, unlockedTools } : undefined;
|
|
22
|
+
const allTools = [];
|
|
23
|
+
let reserveToolCount = 0;
|
|
24
|
+
for (const coll of tools) {
|
|
25
|
+
allTools.push(...coll.getToolDefinitions(filterOptions));
|
|
26
|
+
if (defaultOnly) {
|
|
27
|
+
reserveToolCount += coll.getReserveTools(unlockedTools).length;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return c.json({
|
|
31
|
+
src: `${url.origin}${url.pathname}`,
|
|
32
|
+
title: 'All Tools',
|
|
33
|
+
description: 'All available tools across all collections',
|
|
34
|
+
tools: allTools,
|
|
35
|
+
reserveToolCount: defaultOnly ? reserveToolCount : undefined,
|
|
36
|
+
collections: tools.map(t => ({
|
|
37
|
+
name: t.name,
|
|
38
|
+
title: t.title,
|
|
39
|
+
description: t.description,
|
|
40
|
+
})),
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
// POST /api/tools - Route to the correct collection based on tool_name
|
|
44
|
+
app.post(basePath, async (c) => {
|
|
45
|
+
const ctx = c;
|
|
46
|
+
// Payload is already parsed and validated by middleware
|
|
47
|
+
if (!ctx.payload) {
|
|
48
|
+
throw new HTTPException(400, {
|
|
49
|
+
message: 'Invalid or missing tool execution payload. Expected { tool_use: { id, tool_name, tool_input? }, metadata? }'
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
const toolName = ctx.payload.tool_use.tool_name;
|
|
53
|
+
// Find the collection for this tool
|
|
54
|
+
const collection = toolToCollection.get(toolName);
|
|
55
|
+
if (!collection) {
|
|
56
|
+
throw new HTTPException(404, {
|
|
57
|
+
message: `Tool not found: ${toolName}. Available tools: ${Array.from(toolToCollection.keys()).join(', ')}`
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
// Delegate to the collection's execute method with pre-parsed payload
|
|
61
|
+
return collection.execute(c, ctx.payload);
|
|
62
|
+
});
|
|
63
|
+
// Create tool collection endpoints
|
|
64
|
+
for (const coll of tools) {
|
|
65
|
+
app.route(`${basePath}/${coll.name}`, createToolEndpoints(coll));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function createToolEndpoints(coll) {
|
|
69
|
+
const endpoint = new Hono();
|
|
70
|
+
endpoint.post('/', (c) => {
|
|
71
|
+
return coll.execute(c);
|
|
72
|
+
});
|
|
73
|
+
// GET /api/tools/{collection}
|
|
74
|
+
// Query params:
|
|
75
|
+
// - import: Return import source URL instead of API URL
|
|
76
|
+
// - defaultOnly=true: Only return tools with default !== false
|
|
77
|
+
// - unlocked=tool1,tool2: Comma-separated list of unlocked tool names
|
|
78
|
+
endpoint.get('/', (c) => {
|
|
79
|
+
const importSourceUrl = c.req.query('import') != null;
|
|
80
|
+
const defaultOnly = c.req.query('defaultOnly') === 'true';
|
|
81
|
+
const unlockedParam = c.req.query('unlocked');
|
|
82
|
+
const unlockedTools = unlockedParam ? unlockedParam.split(',').map(t => t.trim()).filter(Boolean) : [];
|
|
83
|
+
const filterOptions = defaultOnly ? { defaultOnly, unlockedTools } : undefined;
|
|
84
|
+
const url = new URL(c.req.url);
|
|
85
|
+
const response = {
|
|
86
|
+
src: importSourceUrl
|
|
87
|
+
? `${url.origin}/libs/vertesia-tools-${coll.name}.js`
|
|
88
|
+
: `${url.origin}${url.pathname}`,
|
|
89
|
+
title: coll.title || coll.name,
|
|
90
|
+
description: coll.description || '',
|
|
91
|
+
tools: coll.getToolDefinitions(filterOptions)
|
|
92
|
+
};
|
|
93
|
+
// Include reserve count when filtering
|
|
94
|
+
if (defaultOnly) {
|
|
95
|
+
response.reserveToolCount = coll.getReserveTools(unlockedTools).length;
|
|
96
|
+
}
|
|
97
|
+
return c.json(response);
|
|
98
|
+
});
|
|
99
|
+
return endpoint;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/server/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/server/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export function createWidgetsRoute(app, basePath, config) {
|
|
2
|
+
const { skills = [] } = config;
|
|
3
|
+
// GET /api/widgets - Returns all widgets from all skill collections
|
|
4
|
+
app.get(basePath, (c) => {
|
|
5
|
+
const url = new URL(c.req.url);
|
|
6
|
+
const widgets = {};
|
|
7
|
+
for (const coll of skills) {
|
|
8
|
+
const collWidgets = coll.getWidgets();
|
|
9
|
+
for (const widget of collWidgets) {
|
|
10
|
+
widgets[widget.name] = {
|
|
11
|
+
collection: coll.name,
|
|
12
|
+
skill: widget.skill,
|
|
13
|
+
url: `${url.origin}/widgets/${widget.name}.js`,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return c.json({
|
|
18
|
+
title: 'All Widgets',
|
|
19
|
+
description: 'All available widgets across all skill collections',
|
|
20
|
+
widgets,
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=widgets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widgets.js","sourceRoot":"","sources":["../../../src/server/widgets.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,kBAAkB,CAAC,GAAS,EAAE,QAAgB,EAAE,MAAwB;IAEpF,MAAM,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC;IAE/B,oEAAoE;IACpE,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;QACpB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAE/B,MAAM,OAAO,GAA+B,EAAE,CAAC;QAC/C,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YACxB,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YACtC,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;gBAC/B,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG;oBACnB,UAAU,EAAE,IAAI,CAAC,IAAI;oBACrB,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,GAAG,EAAE,GAAG,GAAG,CAAC,MAAM,YAAY,MAAM,CAAC,IAAI,KAAK;iBACjD,CAAA;YACL,CAAC;QACL,CAAC;QAED,OAAO,CAAC,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,aAAa;YACpB,WAAW,EAAE,oDAAoD;YACjE,OAAO;SACV,CAAC,CAAC;IAEP,CAAC,CAAC,CAAC;AAEP,CAAC"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { Hono } from "hono";
|
|
2
|
+
import { cors } from "hono/cors";
|
|
3
|
+
import { HTTPException } from "hono/http-exception";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { createInteractionsRoute } from "./server/interactions.js";
|
|
6
|
+
import { createMcpRoute } from "./server/mcp.js";
|
|
7
|
+
import { createSiteRoute } from "./server/site.js";
|
|
8
|
+
import { createSkillsRoute } from "./server/skills.js";
|
|
9
|
+
import { createToolsRoute } from "./server/tools.js";
|
|
10
|
+
import { createWidgetsRoute } from "./server/widgets.js";
|
|
11
|
+
// Schema for tool execution payload
|
|
12
|
+
const ToolExecutionPayloadSchema = z.object({
|
|
13
|
+
tool_use: z.object({
|
|
14
|
+
id: z.string(),
|
|
15
|
+
tool_name: z.string(),
|
|
16
|
+
tool_input: z.record(z.string(), z.any()).default({}),
|
|
17
|
+
}),
|
|
18
|
+
metadata: z.record(z.string(), z.any()).optional(),
|
|
19
|
+
});
|
|
20
|
+
/**
|
|
21
|
+
* Create a Hono server for tools, interactions, and skills.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* import { createToolServer, ToolCollection, SkillCollection } from "@vertesia/tools-sdk";
|
|
26
|
+
*
|
|
27
|
+
* const server = createToolServer({
|
|
28
|
+
* tools: [myToolCollection],
|
|
29
|
+
* skills: [mySkillCollection],
|
|
30
|
+
* });
|
|
31
|
+
*
|
|
32
|
+
* export default server;
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export function createToolServer(config) {
|
|
36
|
+
const { prefix = '/api', tools = [], interactions = [], skills = [], mcpProviders = [], disableHtml = false, } = config;
|
|
37
|
+
const app = new Hono();
|
|
38
|
+
// Add CORS middleware globally
|
|
39
|
+
app.use('*', cors({ origin: '*', allowMethods: ['GET', 'POST', 'OPTIONS'] }));
|
|
40
|
+
// Middleware to parse and validate body, store on context for reuse
|
|
41
|
+
app.use('*', async (c, next) => {
|
|
42
|
+
const ctx = c;
|
|
43
|
+
if (c.req.method === 'POST') {
|
|
44
|
+
try {
|
|
45
|
+
const text = await c.req.text();
|
|
46
|
+
const body = JSON.parse(text);
|
|
47
|
+
const result = ToolExecutionPayloadSchema.safeParse(body);
|
|
48
|
+
if (result.success) {
|
|
49
|
+
ctx.payload = result.data;
|
|
50
|
+
ctx.toolUseId = result.data.tool_use.id;
|
|
51
|
+
ctx.toolName = result.data.tool_use.tool_name;
|
|
52
|
+
}
|
|
53
|
+
// If validation fails, still store raw body for error reporting
|
|
54
|
+
// but don't set payload - handlers will return validation error
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// Ignore parsing errors - body might not be JSON
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
await next();
|
|
61
|
+
});
|
|
62
|
+
// HTML pages (unless disabled)
|
|
63
|
+
if (!disableHtml) {
|
|
64
|
+
createSiteRoute(app, '', config);
|
|
65
|
+
}
|
|
66
|
+
// Add base API route
|
|
67
|
+
app.get(prefix, (c) => {
|
|
68
|
+
// Skills are exposed as tools, so include them in the tools list
|
|
69
|
+
const allToolEndpoints = [
|
|
70
|
+
...tools.map(col => `${prefix}/tools/${col.name}`),
|
|
71
|
+
...skills.map(col => `${prefix}/skills/${col.name}`),
|
|
72
|
+
];
|
|
73
|
+
return c.json({
|
|
74
|
+
message: 'Vertesia Tools API',
|
|
75
|
+
version: '1.0.0',
|
|
76
|
+
endpoints: {
|
|
77
|
+
tools: allToolEndpoints,
|
|
78
|
+
interactions: interactions.map(col => `${prefix}/interactions/${col.name}`),
|
|
79
|
+
mcp: mcpProviders.map(p => `${prefix}/mcp/${p.name}`),
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
createToolsRoute(app, `${prefix}/tools`, config);
|
|
84
|
+
createSkillsRoute(app, `${prefix}/skills`, config);
|
|
85
|
+
createWidgetsRoute(app, `${prefix}/widgets`, config);
|
|
86
|
+
createInteractionsRoute(app, `${prefix}/interactions`, config);
|
|
87
|
+
createMcpRoute(app, `${prefix}/mcp`, config);
|
|
88
|
+
// Global error handler - returns ToolExecutionResponseError format
|
|
89
|
+
app.onError((err, c) => {
|
|
90
|
+
const ctx = c;
|
|
91
|
+
const status = err instanceof HTTPException ? err.status : 500;
|
|
92
|
+
const errorMessage = err instanceof HTTPException ? err.message : 'Internal Server Error';
|
|
93
|
+
if (!(err instanceof HTTPException)) {
|
|
94
|
+
console.error('Uncaught Error:', err);
|
|
95
|
+
}
|
|
96
|
+
return c.json({
|
|
97
|
+
tool_use_id: ctx.toolUseId || 'unknown',
|
|
98
|
+
status,
|
|
99
|
+
error: errorMessage,
|
|
100
|
+
data: ctx.toolName ? { tool_name: ctx.toolName } : undefined,
|
|
101
|
+
}, status);
|
|
102
|
+
});
|
|
103
|
+
// Not found handler - returns ToolExecutionResponseError format
|
|
104
|
+
app.notFound((c) => {
|
|
105
|
+
const ctx = c;
|
|
106
|
+
return c.json({
|
|
107
|
+
tool_use_id: ctx.toolUseId || 'unknown',
|
|
108
|
+
status: 404,
|
|
109
|
+
error: `Not found: ${c.req.method} ${c.req.path}`,
|
|
110
|
+
data: ctx.toolName ? { tool_name: ctx.toolName } : undefined,
|
|
111
|
+
}, 404);
|
|
112
|
+
});
|
|
113
|
+
return app;
|
|
114
|
+
}
|
|
115
|
+
// ================== Server Utilities ==================
|
|
116
|
+
/**
|
|
117
|
+
* Simple development server with static fimesale handling
|
|
118
|
+
*
|
|
119
|
+
* @deprecated Use tools server template
|
|
120
|
+
*/
|
|
121
|
+
export function createDevServer(config) {
|
|
122
|
+
const app = createToolServer(config);
|
|
123
|
+
if (config.staticHandler) {
|
|
124
|
+
app.use('*', config.staticHandler);
|
|
125
|
+
}
|
|
126
|
+
return app;
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
|