@vertesia/tools-sdk 0.82.0 → 0.82.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 (80) hide show
  1. package/lib/cjs/InteractionCollection.js +164 -0
  2. package/lib/cjs/InteractionCollection.js.map +1 -0
  3. package/lib/cjs/SkillCollection.js +318 -0
  4. package/lib/cjs/SkillCollection.js.map +1 -0
  5. package/lib/cjs/ToolCollection.js +192 -0
  6. package/lib/cjs/ToolCollection.js.map +1 -0
  7. package/lib/cjs/ToolRegistry.js +44 -0
  8. package/lib/cjs/ToolRegistry.js.map +1 -0
  9. package/lib/cjs/auth.js +89 -0
  10. package/lib/cjs/auth.js.map +1 -0
  11. package/lib/cjs/build/validate.js +7 -0
  12. package/lib/cjs/build/validate.js.map +1 -0
  13. package/lib/cjs/copy-assets.js +84 -0
  14. package/lib/cjs/copy-assets.js.map +1 -0
  15. package/lib/cjs/index.js +30 -0
  16. package/lib/cjs/index.js.map +1 -0
  17. package/lib/cjs/package.json +3 -0
  18. package/lib/cjs/server.js +327 -0
  19. package/lib/cjs/server.js.map +1 -0
  20. package/lib/cjs/site/styles.js +621 -0
  21. package/lib/cjs/site/styles.js.map +1 -0
  22. package/lib/cjs/site/templates.js +932 -0
  23. package/lib/cjs/site/templates.js.map +1 -0
  24. package/lib/cjs/types.js +3 -0
  25. package/lib/cjs/types.js.map +1 -0
  26. package/lib/cjs/utils.js +7 -0
  27. package/lib/cjs/utils.js.map +1 -0
  28. package/lib/esm/InteractionCollection.js +125 -0
  29. package/lib/esm/InteractionCollection.js.map +1 -0
  30. package/lib/esm/SkillCollection.js +311 -0
  31. package/lib/esm/SkillCollection.js.map +1 -0
  32. package/lib/esm/ToolCollection.js +154 -0
  33. package/lib/esm/ToolCollection.js.map +1 -0
  34. package/lib/esm/ToolRegistry.js +39 -0
  35. package/lib/esm/ToolRegistry.js.map +1 -0
  36. package/lib/esm/auth.js +82 -0
  37. package/lib/esm/auth.js.map +1 -0
  38. package/lib/esm/build/validate.js +4 -0
  39. package/lib/esm/build/validate.js.map +1 -0
  40. package/lib/esm/copy-assets.js +81 -0
  41. package/lib/esm/copy-assets.js.map +1 -0
  42. package/lib/esm/index.js +10 -0
  43. package/lib/esm/index.js.map +1 -0
  44. package/lib/esm/server.js +323 -0
  45. package/lib/esm/server.js.map +1 -0
  46. package/lib/esm/site/styles.js +618 -0
  47. package/lib/esm/site/styles.js.map +1 -0
  48. package/lib/esm/site/templates.js +920 -0
  49. package/lib/esm/site/templates.js.map +1 -0
  50. package/lib/esm/types.js +2 -0
  51. package/lib/esm/types.js.map +1 -0
  52. package/lib/esm/utils.js +4 -0
  53. package/lib/esm/utils.js.map +1 -0
  54. package/lib/types/InteractionCollection.d.ts +48 -0
  55. package/lib/types/InteractionCollection.d.ts.map +1 -0
  56. package/lib/types/SkillCollection.d.ts +111 -0
  57. package/lib/types/SkillCollection.d.ts.map +1 -0
  58. package/lib/types/ToolCollection.d.ts +61 -0
  59. package/lib/types/ToolCollection.d.ts.map +1 -0
  60. package/lib/types/ToolRegistry.d.ts +15 -0
  61. package/lib/types/ToolRegistry.d.ts.map +1 -0
  62. package/lib/types/auth.d.ts +20 -0
  63. package/lib/types/auth.d.ts.map +1 -0
  64. package/lib/types/build/validate.d.ts +2 -0
  65. package/lib/types/build/validate.d.ts.map +1 -0
  66. package/lib/types/copy-assets.d.ts +14 -0
  67. package/lib/types/copy-assets.d.ts.map +1 -0
  68. package/lib/types/index.d.ts +10 -0
  69. package/lib/types/index.d.ts.map +1 -0
  70. package/lib/types/server.d.ts +72 -0
  71. package/lib/types/server.d.ts.map +1 -0
  72. package/lib/types/site/styles.d.ts +5 -0
  73. package/lib/types/site/styles.d.ts.map +1 -0
  74. package/lib/types/site/templates.d.ts +54 -0
  75. package/lib/types/site/templates.d.ts.map +1 -0
  76. package/lib/types/types.d.ts +262 -0
  77. package/lib/types/types.d.ts.map +1 -0
  78. package/lib/types/utils.d.ts +2 -0
  79. package/lib/types/utils.d.ts.map +1 -0
  80. package/package.json +4 -4
@@ -0,0 +1,39 @@
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
+ getDefinitions() {
10
+ return Object.values(this.registry).map(tool => ({
11
+ name: tool.name,
12
+ description: tool.description,
13
+ input_schema: tool.input_schema
14
+ }));
15
+ }
16
+ getTool(name) {
17
+ const tool = this.registry[name];
18
+ if (tool === undefined) {
19
+ throw new ToolNotFoundError(name);
20
+ }
21
+ return tool;
22
+ }
23
+ getTools() {
24
+ return Object.values(this.registry);
25
+ }
26
+ registerTool(tool) {
27
+ this.registry[tool.name] = tool;
28
+ }
29
+ runTool(payload, context) {
30
+ return this.getTool(payload.tool_use.tool_name).run(payload, context);
31
+ }
32
+ }
33
+ export class ToolNotFoundError extends HTTPException {
34
+ constructor(name) {
35
+ super(404, { message: "Tool function not found: " + name });
36
+ this.name = "ToolNotFoundError";
37
+ }
38
+ }
39
+ //# sourceMappingURL=ToolRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolRegistry.js","sourceRoot":"","sources":["../../src/ToolRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,OAAO,YAAY;IAErB,QAAQ,GAA8B,EAAE,CAAC;IAEzC,YAAY,QAAqB,EAAE;QAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QACpC,CAAC;IACL,CAAC;IAED,cAAc;QACV,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC7C,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;SAClC,CAAC,CAAC,CAAC;IACR,CAAC;IAED,OAAO,CAAsC,IAAY;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAChC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACrB,MAAM,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,QAAQ;QACJ,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,YAAY,CAAsC,IAAmB;QACjE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACpC,CAAC;IAED,OAAO,CAAsC,OAAsC,EAAE,OAA6B;QAC9G,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC1E,CAAC;CAEJ;AAGD,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IAChD,YAAY,IAAY;QACpB,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,2BAA2B,GAAG,IAAI,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IACpC,CAAC;CACJ"}
@@ -0,0 +1,82 @@
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) {
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);
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
+ constructor(token, payload) {
68
+ this.token = token;
69
+ this.payload = payload;
70
+ this.endpoints = decodeEndpoints(payload.endpoints);
71
+ }
72
+ async getClient() {
73
+ if (!this._client) {
74
+ this._client = await VertesiaClient.fromAuthToken(this.token, this.payload);
75
+ }
76
+ return this._client;
77
+ }
78
+ }
79
+ function isAllowedIssuer(iss) {
80
+ return iss.endsWith(".vertesia.io") || iss.endsWith(".becomposable.com");
81
+ }
82
+ //# 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,4 @@
1
+ export function validate() {
2
+ //TODO
3
+ }
4
+ //# sourceMappingURL=validate.js.map
@@ -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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"}
@@ -0,0 +1,10 @@
1
+ export { authorize, AuthSession } from "./auth.js";
2
+ export * from "./InteractionCollection.js";
3
+ export * from "./SkillCollection.js";
4
+ export * from "./ToolCollection.js";
5
+ export * from "./ToolRegistry.js";
6
+ export * from "./types.js";
7
+ export * from "./server.js";
8
+ export * from "./site/templates.js";
9
+ export { copyRuntimeAssets } from "./copy-assets.js";
10
+ //# 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,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -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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"}