@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,190 @@
|
|
|
1
|
+
import { readdirSync, statSync, existsSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import { pathToFileURL } from "url";
|
|
4
|
+
import { HTTPException } from "hono/http-exception";
|
|
5
|
+
import { authorize } from "./auth.js";
|
|
6
|
+
import { ToolRegistry } from "./ToolRegistry.js";
|
|
7
|
+
import { kebabCaseToTitle } from "./utils.js";
|
|
8
|
+
/**
|
|
9
|
+
* Implements a tools collection endpoint
|
|
10
|
+
*/
|
|
11
|
+
export class ToolCollection {
|
|
12
|
+
/**
|
|
13
|
+
* A kebab case collection name. Must only contains alphanumeric and dash characters,
|
|
14
|
+
* The name can be used to generate the path where the collection is exposed.
|
|
15
|
+
* Example: my-collection
|
|
16
|
+
*/
|
|
17
|
+
name;
|
|
18
|
+
/**
|
|
19
|
+
* Optional title for UI display.
|
|
20
|
+
* If not provided the title will be generated form the kebab case name by replacing - with spaces and upper casing first letter in words.
|
|
21
|
+
*/
|
|
22
|
+
title;
|
|
23
|
+
/**
|
|
24
|
+
* Optional icon for UI display
|
|
25
|
+
*/
|
|
26
|
+
icon;
|
|
27
|
+
/**
|
|
28
|
+
* A short description
|
|
29
|
+
*/
|
|
30
|
+
description;
|
|
31
|
+
/**
|
|
32
|
+
* The tool registry
|
|
33
|
+
*/
|
|
34
|
+
tools;
|
|
35
|
+
constructor({ name, title, icon, description, tools }) {
|
|
36
|
+
this.name = name;
|
|
37
|
+
this.title = title || kebabCaseToTitle(name);
|
|
38
|
+
this.icon = icon;
|
|
39
|
+
this.description = description;
|
|
40
|
+
this.tools = new ToolRegistry(tools);
|
|
41
|
+
}
|
|
42
|
+
[Symbol.iterator]() {
|
|
43
|
+
let index = 0;
|
|
44
|
+
const tools = this.tools.getTools();
|
|
45
|
+
return {
|
|
46
|
+
next() {
|
|
47
|
+
if (index < tools.length) {
|
|
48
|
+
return { value: tools[index++], done: false };
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
return { done: true, value: undefined };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
map(callback) {
|
|
57
|
+
return this.tools.getTools().map(callback);
|
|
58
|
+
}
|
|
59
|
+
async execute(ctx, preParsedPayload) {
|
|
60
|
+
let payload = preParsedPayload;
|
|
61
|
+
try {
|
|
62
|
+
if (!payload) {
|
|
63
|
+
payload = await readPayload(ctx);
|
|
64
|
+
}
|
|
65
|
+
const toolName = payload.tool_use?.tool_name;
|
|
66
|
+
const toolUseId = payload.tool_use?.id;
|
|
67
|
+
const endpointOverrides = payload.metadata?.endpoints;
|
|
68
|
+
const runId = payload.metadata?.run_id;
|
|
69
|
+
console.log(`[ToolCollection] Tool call received: ${toolName}`, {
|
|
70
|
+
collection: this.name,
|
|
71
|
+
toolUseId,
|
|
72
|
+
runId,
|
|
73
|
+
hasEndpointOverrides: !!endpointOverrides,
|
|
74
|
+
});
|
|
75
|
+
const session = await authorize(ctx, endpointOverrides, { toolName, toolUseId, runId });
|
|
76
|
+
const r = await this.tools.runTool(payload, session);
|
|
77
|
+
return ctx.json({
|
|
78
|
+
...r,
|
|
79
|
+
tool_use_id: payload.tool_use.id
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
catch (err) { // HTTPException ?
|
|
83
|
+
const status = err.status || 500;
|
|
84
|
+
const toolName = payload?.tool_use?.tool_name;
|
|
85
|
+
const toolUseId = payload?.tool_use?.id;
|
|
86
|
+
console.error("[ToolCollection] Tool execution failed", {
|
|
87
|
+
collection: this.name,
|
|
88
|
+
tool: toolName,
|
|
89
|
+
toolUseId,
|
|
90
|
+
error: err.message,
|
|
91
|
+
status,
|
|
92
|
+
stack: err.stack,
|
|
93
|
+
});
|
|
94
|
+
return ctx.json({
|
|
95
|
+
tool_use_id: toolUseId || "undefined",
|
|
96
|
+
error: err.message || "Error executing tool",
|
|
97
|
+
status
|
|
98
|
+
}, status);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Get tool definitions with optional filtering.
|
|
103
|
+
* @param options - Filtering options for default/unlocked tools
|
|
104
|
+
* @returns Filtered tool definitions
|
|
105
|
+
*/
|
|
106
|
+
getToolDefinitions(options) {
|
|
107
|
+
return this.tools.getDefinitions(options);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get tools that are in reserve (default: false and not unlocked).
|
|
111
|
+
* @param unlockedTools - List of tool names that are unlocked
|
|
112
|
+
* @returns Tool definitions for reserve tools
|
|
113
|
+
*/
|
|
114
|
+
getReserveTools(unlockedTools = []) {
|
|
115
|
+
return this.tools.getReserveTools(unlockedTools);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function readPayload(ctx) {
|
|
119
|
+
const toolCtx = ctx;
|
|
120
|
+
// Check if body was already parsed and validated by middleware
|
|
121
|
+
if (toolCtx.payload) {
|
|
122
|
+
return toolCtx.payload;
|
|
123
|
+
}
|
|
124
|
+
// If no payload, middleware couldn't parse/validate - return error
|
|
125
|
+
throw new HTTPException(400, {
|
|
126
|
+
message: 'Invalid or missing tool execution payload. Expected { tool_use: { id, tool_name, tool_input? }, metadata? }'
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Load all tools from a directory.
|
|
131
|
+
* Scans for .js files and imports tools that match naming convention.
|
|
132
|
+
*
|
|
133
|
+
* Directory structure:
|
|
134
|
+
* ```
|
|
135
|
+
* collection/
|
|
136
|
+
* tools/
|
|
137
|
+
* SearchFundsTool.js # exports SearchFundsTool
|
|
138
|
+
* GetFundDetailsTool.js # exports GetFundDetailsTool
|
|
139
|
+
* ```
|
|
140
|
+
*
|
|
141
|
+
* Naming convention: File should export a Tool with name matching *Tool pattern.
|
|
142
|
+
*
|
|
143
|
+
* @param toolsDir - Path to the tools directory (e.g., /path/to/collection/tools)
|
|
144
|
+
* @returns Promise resolving to array of Tool objects
|
|
145
|
+
*/
|
|
146
|
+
export async function loadToolsFromDirectory(toolsDir) {
|
|
147
|
+
const tools = [];
|
|
148
|
+
if (!existsSync(toolsDir)) {
|
|
149
|
+
console.warn(`Tools directory not found: ${toolsDir}`);
|
|
150
|
+
return tools;
|
|
151
|
+
}
|
|
152
|
+
let entries;
|
|
153
|
+
try {
|
|
154
|
+
entries = readdirSync(toolsDir);
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
console.warn(`Could not read tools directory: ${toolsDir}`);
|
|
158
|
+
return tools;
|
|
159
|
+
}
|
|
160
|
+
for (const entry of entries) {
|
|
161
|
+
// Only process .js and .ts files that end with Tool
|
|
162
|
+
if (!entry.endsWith('Tool.js') && !entry.endsWith('Tool.ts'))
|
|
163
|
+
continue;
|
|
164
|
+
if (entry.endsWith('.d.ts'))
|
|
165
|
+
continue;
|
|
166
|
+
const entryPath = join(toolsDir, entry);
|
|
167
|
+
try {
|
|
168
|
+
const stat = statSync(entryPath);
|
|
169
|
+
if (!stat.isFile())
|
|
170
|
+
continue;
|
|
171
|
+
// Dynamic import - need file:// URL for ESM
|
|
172
|
+
const fileUrl = pathToFileURL(entryPath).href;
|
|
173
|
+
const module = await import(fileUrl);
|
|
174
|
+
// Find exported Tool (named export matching filename or any Tool export)
|
|
175
|
+
const baseName = entry.replace(/\.(js|ts)$/, '');
|
|
176
|
+
const tool = module[baseName] || module.default;
|
|
177
|
+
if (tool && typeof tool.name === 'string' && typeof tool.run === 'function') {
|
|
178
|
+
tools.push(tool);
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
console.warn(`No valid Tool export found in ${entry}`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
catch (err) {
|
|
185
|
+
console.warn(`Error loading tool from ${entry}:`, err);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return tools;
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=ToolCollection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolCollection.js","sourceRoot":"","sources":["../../src/ToolCollection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { HTTPException } from "hono/http-exception";
|
|
2
|
+
export class ToolRegistry {
|
|
3
|
+
registry = {};
|
|
4
|
+
constructor(tools = []) {
|
|
5
|
+
for (const tool of tools) {
|
|
6
|
+
this.registry[tool.name] = tool;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Get tool definitions with optional filtering.
|
|
11
|
+
* @param options - Filtering options
|
|
12
|
+
* @returns Filtered tool definitions
|
|
13
|
+
*/
|
|
14
|
+
getDefinitions(options) {
|
|
15
|
+
const { defaultOnly, unlockedTools = [] } = options || {};
|
|
16
|
+
const unlockedSet = new Set(unlockedTools);
|
|
17
|
+
return Object.values(this.registry)
|
|
18
|
+
.filter(tool => {
|
|
19
|
+
// If not filtering by default, include all tools
|
|
20
|
+
if (!defaultOnly)
|
|
21
|
+
return true;
|
|
22
|
+
// Include if tool is default (default !== false) or is in unlocked list
|
|
23
|
+
const isDefault = tool.default !== false;
|
|
24
|
+
const isUnlocked = unlockedSet.has(tool.name);
|
|
25
|
+
return isDefault || isUnlocked;
|
|
26
|
+
})
|
|
27
|
+
.map(tool => ({
|
|
28
|
+
name: tool.name,
|
|
29
|
+
description: tool.description,
|
|
30
|
+
input_schema: tool.input_schema,
|
|
31
|
+
default: tool.default,
|
|
32
|
+
}));
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get tools that are in reserve (default: false and not unlocked).
|
|
36
|
+
* @param unlockedTools - List of tool names that are unlocked
|
|
37
|
+
* @returns Tool definitions for reserve tools
|
|
38
|
+
*/
|
|
39
|
+
getReserveTools(unlockedTools = []) {
|
|
40
|
+
const unlockedSet = new Set(unlockedTools);
|
|
41
|
+
return Object.values(this.registry)
|
|
42
|
+
.filter(tool => tool.default === false && !unlockedSet.has(tool.name))
|
|
43
|
+
.map(tool => ({
|
|
44
|
+
name: tool.name,
|
|
45
|
+
description: tool.description,
|
|
46
|
+
input_schema: tool.input_schema,
|
|
47
|
+
default: tool.default,
|
|
48
|
+
}));
|
|
49
|
+
}
|
|
50
|
+
getTool(name) {
|
|
51
|
+
const tool = this.registry[name];
|
|
52
|
+
if (tool === undefined) {
|
|
53
|
+
throw new ToolNotFoundError(name);
|
|
54
|
+
}
|
|
55
|
+
return tool;
|
|
56
|
+
}
|
|
57
|
+
getTools() {
|
|
58
|
+
return Object.values(this.registry);
|
|
59
|
+
}
|
|
60
|
+
registerTool(tool) {
|
|
61
|
+
this.registry[tool.name] = tool;
|
|
62
|
+
}
|
|
63
|
+
runTool(payload, context) {
|
|
64
|
+
const toolName = payload.tool_use.tool_name;
|
|
65
|
+
const toolUseId = payload.tool_use.id;
|
|
66
|
+
const runId = payload.metadata?.run_id;
|
|
67
|
+
console.log(`[ToolRegistry] Executing tool: ${toolName}`, {
|
|
68
|
+
toolUseId,
|
|
69
|
+
runId,
|
|
70
|
+
input: sanitizeInput(payload.tool_use.tool_input),
|
|
71
|
+
});
|
|
72
|
+
return this.getTool(toolName).run(payload, context);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export class ToolNotFoundError extends HTTPException {
|
|
76
|
+
constructor(name) {
|
|
77
|
+
super(404, { message: "Tool function not found: " + name });
|
|
78
|
+
this.name = "ToolNotFoundError";
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const SENSITIVE_KEYS = new Set([
|
|
82
|
+
'apikey', 'api_key', 'token', 'secret', 'password', 'credential', 'credentials',
|
|
83
|
+
'authorization', 'auth', 'key', 'private_key', 'access_token', 'refresh_token'
|
|
84
|
+
]);
|
|
85
|
+
function sanitizeInput(input) {
|
|
86
|
+
if (!input)
|
|
87
|
+
return null;
|
|
88
|
+
const sanitized = {};
|
|
89
|
+
for (const [key, value] of Object.entries(input)) {
|
|
90
|
+
const lowerKey = key.toLowerCase();
|
|
91
|
+
if (SENSITIVE_KEYS.has(lowerKey) || lowerKey.includes('key') || lowerKey.includes('token') || lowerKey.includes('secret')) {
|
|
92
|
+
sanitized[key] = '[REDACTED]';
|
|
93
|
+
}
|
|
94
|
+
else if (typeof value === 'string' && value.length > 50) {
|
|
95
|
+
sanitized[key] = value.slice(0, 50) + '...';
|
|
96
|
+
}
|
|
97
|
+
else if (typeof value === 'object' && value !== null) {
|
|
98
|
+
sanitized[key] = Array.isArray(value) ? `[Array(${value.length})]` : '[Object]';
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
sanitized[key] = value;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return sanitized;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=ToolRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolRegistry.js","sourceRoot":"","sources":["../../src/ToolRegistry.ts"],"names":[],"mappings":"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"}
|
package/lib/esm/auth.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { decodeEndpoints, VertesiaClient } from "@vertesia/client";
|
|
2
|
+
import { HTTPException } from "hono/http-exception";
|
|
3
|
+
import { createLocalJWKSet, decodeJwt, jwtVerify } from "jose";
|
|
4
|
+
const cache = {};
|
|
5
|
+
export async function getJwks(url) {
|
|
6
|
+
if (!cache.url) {
|
|
7
|
+
console.log('JWKS cache miss for: ', url);
|
|
8
|
+
const jwks = await fetch(url).then(r => {
|
|
9
|
+
if (r.ok) {
|
|
10
|
+
return r.json();
|
|
11
|
+
}
|
|
12
|
+
throw new Error("Fetching jwks failed with code: " + r.status);
|
|
13
|
+
}).catch(err => {
|
|
14
|
+
throw new Error("Failed to fetch jwks: " + err.message);
|
|
15
|
+
});
|
|
16
|
+
cache.url = createLocalJWKSet(jwks);
|
|
17
|
+
}
|
|
18
|
+
return cache.url;
|
|
19
|
+
}
|
|
20
|
+
export async function verifyToken(token) {
|
|
21
|
+
const decodedJwt = decodeJwt(token);
|
|
22
|
+
if (!decodedJwt.iss) {
|
|
23
|
+
throw new Error("No issuer URL found in JWT");
|
|
24
|
+
}
|
|
25
|
+
if (!isAllowedIssuer(decodedJwt.iss)) {
|
|
26
|
+
throw new Error("Issuer is not allowed: " + decodedJwt.iss);
|
|
27
|
+
}
|
|
28
|
+
const jwks = await getJwks(`${decodedJwt.iss}/.well-known/jwks`);
|
|
29
|
+
return await jwtVerify(token, jwks);
|
|
30
|
+
}
|
|
31
|
+
export async function authorize(ctx, endpointOverrides, toolContext) {
|
|
32
|
+
const auth = ctx.req.header('Authorization');
|
|
33
|
+
if (!auth) {
|
|
34
|
+
throw new HTTPException(401, {
|
|
35
|
+
message: `Missing Authorization header`
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
const [scheme, value] = auth.trim().split(' ');
|
|
39
|
+
if (scheme.toLowerCase() !== 'bearer') {
|
|
40
|
+
throw new HTTPException(401, {
|
|
41
|
+
message: `Authorization scheme ${scheme} is not supported`
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
if (!value) {
|
|
45
|
+
throw new HTTPException(401, {
|
|
46
|
+
message: `Missing bearer token value`
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
const { payload } = await verifyToken(value);
|
|
51
|
+
const session = new AuthSession(value, payload, endpointOverrides, toolContext);
|
|
52
|
+
ctx.set("auth", session);
|
|
53
|
+
return session;
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
throw new HTTPException(401, {
|
|
57
|
+
message: err.message,
|
|
58
|
+
cause: err
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export class AuthSession {
|
|
63
|
+
token;
|
|
64
|
+
payload;
|
|
65
|
+
_client;
|
|
66
|
+
endpoints;
|
|
67
|
+
toolContext;
|
|
68
|
+
constructor(token, payload, endpointOverrides, toolContext) {
|
|
69
|
+
this.token = token;
|
|
70
|
+
this.payload = payload;
|
|
71
|
+
const decoded = decodeEndpoints(payload.endpoints);
|
|
72
|
+
// Use overrides from workflow config if provided, falling back to JWT endpoints
|
|
73
|
+
this.endpoints = {
|
|
74
|
+
studio: endpointOverrides?.studio || decoded.studio,
|
|
75
|
+
store: endpointOverrides?.store || decoded.store,
|
|
76
|
+
token: endpointOverrides?.token || decoded.token || payload.iss,
|
|
77
|
+
};
|
|
78
|
+
this.toolContext = toolContext;
|
|
79
|
+
}
|
|
80
|
+
async getClient() {
|
|
81
|
+
if (!this._client) {
|
|
82
|
+
const toolInfo = this.toolContext?.toolName ? ` for ${this.toolContext.toolName}` : '';
|
|
83
|
+
console.log(`[VertesiaClient] Initializing client${toolInfo}`, {
|
|
84
|
+
tool: this.toolContext?.toolName,
|
|
85
|
+
toolUseId: this.toolContext?.toolUseId,
|
|
86
|
+
runId: this.toolContext?.runId,
|
|
87
|
+
endpoints: this.endpoints,
|
|
88
|
+
});
|
|
89
|
+
this._client = await VertesiaClient.fromAuthToken(this.token, this.payload, this.endpoints);
|
|
90
|
+
}
|
|
91
|
+
return this._client;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function isAllowedIssuer(iss) {
|
|
95
|
+
return iss.endsWith(".vertesia.io") || iss.endsWith(".becomposable.com");
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/build/validate.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ;IACpB,MAAM;AACV,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Copy runtime assets (skill files, prompt files, scripts) to dist folder
|
|
4
|
+
* These files are read from disk at runtime and need to be deployed with the app
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* npx tools-sdk-copy-assets [srcDir] [distDir]
|
|
8
|
+
*
|
|
9
|
+
* Or import and call directly:
|
|
10
|
+
* import { copyRuntimeAssets } from '@vertesia/tools-sdk';
|
|
11
|
+
* copyRuntimeAssets('./src', './dist');
|
|
12
|
+
*/
|
|
13
|
+
import { existsSync, readdirSync, statSync, mkdirSync, copyFileSync } from "fs";
|
|
14
|
+
import { dirname, join } from "path";
|
|
15
|
+
/**
|
|
16
|
+
* Recursively copy files matching a filter
|
|
17
|
+
*/
|
|
18
|
+
function copyFilesRecursive(src, dest, fileFilter) {
|
|
19
|
+
if (!existsSync(src))
|
|
20
|
+
return;
|
|
21
|
+
const entries = readdirSync(src);
|
|
22
|
+
for (const entry of entries) {
|
|
23
|
+
const srcPath = join(src, entry);
|
|
24
|
+
const destPath = join(dest, entry);
|
|
25
|
+
const stat = statSync(srcPath);
|
|
26
|
+
if (stat.isDirectory()) {
|
|
27
|
+
// Recurse into directories
|
|
28
|
+
copyFilesRecursive(srcPath, destPath, fileFilter);
|
|
29
|
+
}
|
|
30
|
+
else if (fileFilter(entry)) {
|
|
31
|
+
// Copy matching files
|
|
32
|
+
mkdirSync(dirname(destPath), { recursive: true });
|
|
33
|
+
copyFileSync(srcPath, destPath);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Copy runtime assets (skills, interactions) from src to dist
|
|
39
|
+
*/
|
|
40
|
+
export function copyRuntimeAssets(options = {}) {
|
|
41
|
+
const { srcDir = './src', distDir = './dist', verbose = true } = options;
|
|
42
|
+
if (verbose) {
|
|
43
|
+
console.log('Copying runtime assets to dist...');
|
|
44
|
+
}
|
|
45
|
+
// Copy skill files (SKILL.md, SKILL.jst, *.py)
|
|
46
|
+
const skillsSrc = join(srcDir, 'skills');
|
|
47
|
+
const skillsDest = join(distDir, 'skills');
|
|
48
|
+
if (existsSync(skillsSrc)) {
|
|
49
|
+
copyFilesRecursive(skillsSrc, skillsDest, (filename) => {
|
|
50
|
+
return filename === 'SKILL.md' ||
|
|
51
|
+
filename === 'SKILL.jst' ||
|
|
52
|
+
filename.endsWith('.py');
|
|
53
|
+
});
|
|
54
|
+
if (verbose) {
|
|
55
|
+
console.log(' ✓ Skills assets (SKILL.md, SKILL.jst, *.py)');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Copy interaction prompt files (prompt.jst, prompt.md)
|
|
59
|
+
const interactionsSrc = join(srcDir, 'interactions');
|
|
60
|
+
const interactionsDest = join(distDir, 'interactions');
|
|
61
|
+
if (existsSync(interactionsSrc)) {
|
|
62
|
+
copyFilesRecursive(interactionsSrc, interactionsDest, (filename) => {
|
|
63
|
+
return filename === 'prompt.jst' ||
|
|
64
|
+
filename === 'prompt.md';
|
|
65
|
+
});
|
|
66
|
+
if (verbose) {
|
|
67
|
+
console.log(' ✓ Interaction assets (prompt.jst, prompt.md)');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (verbose) {
|
|
71
|
+
console.log('Runtime assets copied successfully!');
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// CLI entry point
|
|
75
|
+
if (typeof process !== 'undefined' && process.argv[1]?.includes('copy-assets')) {
|
|
76
|
+
const args = process.argv.slice(2);
|
|
77
|
+
const srcDir = args[0] || './src';
|
|
78
|
+
const distDir = args[1] || './dist';
|
|
79
|
+
copyRuntimeAssets({ srcDir, distDir });
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=copy-assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy-assets.js","sourceRoot":"","sources":["../../src/copy-assets.ts"],"names":[],"mappings":"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"}
|
package/lib/esm/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { authorize, AuthSession } from "./auth.js";
|
|
2
|
+
export { copyRuntimeAssets } from "./copy-assets.js";
|
|
3
|
+
export * from "./InteractionCollection.js";
|
|
4
|
+
export * from "./server.js";
|
|
5
|
+
export * from "./server/types.js";
|
|
6
|
+
export * from "./site/templates.js";
|
|
7
|
+
export * from "./SkillCollection.js";
|
|
8
|
+
export * from "./ToolCollection.js";
|
|
9
|
+
export * from "./ToolRegistry.js";
|
|
10
|
+
export * from "./types.js";
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// ================== Interaction Endpoints ==================
|
|
2
|
+
import { Hono } from "hono";
|
|
3
|
+
import { HTTPException } from "hono/http-exception";
|
|
4
|
+
import { authorize } from "../auth.js";
|
|
5
|
+
export function createInteractionsRoute(app, basePath, config) {
|
|
6
|
+
const { interactions = [] } = config;
|
|
7
|
+
// GET /api/interactions - Returns all interactions from all collections
|
|
8
|
+
app.get(basePath, (c) => {
|
|
9
|
+
const allInteractions = [];
|
|
10
|
+
for (const coll of interactions) {
|
|
11
|
+
for (const inter of coll.interactions) {
|
|
12
|
+
allInteractions.push({
|
|
13
|
+
type: "app",
|
|
14
|
+
id: inter.name,
|
|
15
|
+
name: inter.name,
|
|
16
|
+
title: inter.title || inter.name,
|
|
17
|
+
description: inter.description,
|
|
18
|
+
tags: inter.tags || [],
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return c.json({
|
|
23
|
+
title: 'All Interactions',
|
|
24
|
+
description: 'All available interactions across all collections',
|
|
25
|
+
interactions: allInteractions,
|
|
26
|
+
collections: interactions.map(i => ({
|
|
27
|
+
name: i.name,
|
|
28
|
+
title: i.title,
|
|
29
|
+
description: i.description,
|
|
30
|
+
})),
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
// Create interaction collection endpoints
|
|
34
|
+
for (const coll of interactions) {
|
|
35
|
+
app.route(`${basePath}/${coll.name}`, createInteractionEndpoints(coll));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function createInteractionEndpoints(coll) {
|
|
39
|
+
const endpoint = new Hono();
|
|
40
|
+
endpoint.get('/', (c) => {
|
|
41
|
+
return c.json(coll.interactions.map(inter => ({
|
|
42
|
+
type: "app",
|
|
43
|
+
id: inter.name,
|
|
44
|
+
name: inter.name,
|
|
45
|
+
title: inter.title || inter.name,
|
|
46
|
+
description: inter.description,
|
|
47
|
+
tags: inter.tags || [],
|
|
48
|
+
})));
|
|
49
|
+
});
|
|
50
|
+
endpoint.get('/:name', async (c) => {
|
|
51
|
+
await authorize(c);
|
|
52
|
+
const name = c.req.param('name');
|
|
53
|
+
const inter = coll.getInteractionByName(name);
|
|
54
|
+
if (!inter) {
|
|
55
|
+
throw new HTTPException(404, {
|
|
56
|
+
message: "No interaction found with name: " + name
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
return c.json(inter);
|
|
60
|
+
});
|
|
61
|
+
return endpoint;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=interactions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactions.js","sourceRoot":"","sources":["../../../src/server/interactions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// ================== MCP Endpoints ==================
|
|
2
|
+
import { Hono } from "hono";
|
|
3
|
+
import { HTTPException } from "hono/http-exception";
|
|
4
|
+
import { authorize } from "../auth.js";
|
|
5
|
+
export function createMcpRoute(app, basePath, config) {
|
|
6
|
+
const { mcpProviders = [] } = config;
|
|
7
|
+
// Create MCP provider endpoints
|
|
8
|
+
if (mcpProviders.length > 0) {
|
|
9
|
+
app.route(basePath, createMCPEndpoints(mcpProviders));
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function createMCPEndpoints(providers) {
|
|
13
|
+
const endpoint = new Hono();
|
|
14
|
+
for (const p of providers) {
|
|
15
|
+
endpoint.post(`/${p.name}`, async (c) => {
|
|
16
|
+
const session = await authorize(c);
|
|
17
|
+
const config = await readJsonBody(c);
|
|
18
|
+
const info = await p.createMCPConnection(session, config);
|
|
19
|
+
return c.json(info);
|
|
20
|
+
});
|
|
21
|
+
endpoint.get(`/${p.name}`, (c) => c.json({
|
|
22
|
+
name: p.name,
|
|
23
|
+
description: p.description,
|
|
24
|
+
}));
|
|
25
|
+
}
|
|
26
|
+
return endpoint;
|
|
27
|
+
}
|
|
28
|
+
async function readJsonBody(ctx) {
|
|
29
|
+
try {
|
|
30
|
+
const text = await ctx.req.text();
|
|
31
|
+
const jsonContent = text?.trim() || '';
|
|
32
|
+
if (!jsonContent)
|
|
33
|
+
return {};
|
|
34
|
+
return JSON.parse(jsonContent);
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
throw new HTTPException(400, {
|
|
38
|
+
message: "Failed to parse JSON body: " + err.message
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/server/mcp.ts"],"names":[],"mappings":"AAAA,sDAAsD;AAEtD,OAAO,EAAW,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAMvC,MAAM,UAAU,cAAc,CAAC,GAAS,EAAE,QAAgB,EAAE,MAAwB;IAChF,MAAM,EAAE,YAAY,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC;IACrC,gCAAgC;IAChC,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC;IAC1D,CAAC;AAEL,CAAC;AAED,SAAS,kBAAkB,CAAC,SAA8B;IACtD,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;IAE5B,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QACxB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAU,EAAE,EAAE;YAC7C,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC1D,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAC9C,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW;SAC7B,CAAC,CAAC,CAAC;IACR,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,GAAY;IACpC,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,WAAW,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACvC,IAAI,CAAC,WAAW;YAAE,OAAO,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAwB,CAAC;IAC1D,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAChB,MAAM,IAAI,aAAa,CAAC,GAAG,EAAE;YACzB,OAAO,EAAE,6BAA6B,GAAG,GAAG,CAAC,OAAO;SACvD,CAAC,CAAC;IACP,CAAC;AACL,CAAC"}
|