@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.
Files changed (144) hide show
  1. package/LICENSE +13 -0
  2. package/README.md +122 -0
  3. package/lib/cjs/InteractionCollection.js +164 -0
  4. package/lib/cjs/InteractionCollection.js.map +1 -0
  5. package/lib/cjs/SkillCollection.js +376 -0
  6. package/lib/cjs/SkillCollection.js.map +1 -0
  7. package/lib/cjs/ToolCollection.js +228 -0
  8. package/lib/cjs/ToolCollection.js.map +1 -0
  9. package/lib/cjs/ToolRegistry.js +111 -0
  10. package/lib/cjs/ToolRegistry.js.map +1 -0
  11. package/lib/cjs/auth.js +104 -0
  12. package/lib/cjs/auth.js.map +1 -0
  13. package/lib/cjs/build/validate.js +7 -0
  14. package/lib/cjs/build/validate.js.map +1 -0
  15. package/lib/cjs/copy-assets.js +84 -0
  16. package/lib/cjs/copy-assets.js.map +1 -0
  17. package/lib/cjs/index.js +31 -0
  18. package/lib/cjs/index.js.map +1 -0
  19. package/lib/cjs/package.json +3 -0
  20. package/lib/cjs/server/interactions.js +66 -0
  21. package/lib/cjs/server/interactions.js.map +1 -0
  22. package/lib/cjs/server/mcp.js +45 -0
  23. package/lib/cjs/server/mcp.js.map +1 -0
  24. package/lib/cjs/server/site.js +30 -0
  25. package/lib/cjs/server/site.js.map +1 -0
  26. package/lib/cjs/server/skills.js +114 -0
  27. package/lib/cjs/server/skills.js.map +1 -0
  28. package/lib/cjs/server/tools.js +104 -0
  29. package/lib/cjs/server/tools.js.map +1 -0
  30. package/lib/cjs/server/types.js +3 -0
  31. package/lib/cjs/server/types.js.map +1 -0
  32. package/lib/cjs/server/widgets.js +27 -0
  33. package/lib/cjs/server/widgets.js.map +1 -0
  34. package/lib/cjs/server.js +132 -0
  35. package/lib/cjs/server.js.map +1 -0
  36. package/lib/cjs/site/styles.js +621 -0
  37. package/lib/cjs/site/styles.js.map +1 -0
  38. package/lib/cjs/site/templates.js +968 -0
  39. package/lib/cjs/site/templates.js.map +1 -0
  40. package/lib/cjs/types.js +3 -0
  41. package/lib/cjs/types.js.map +1 -0
  42. package/lib/cjs/utils.js +31 -0
  43. package/lib/cjs/utils.js.map +1 -0
  44. package/lib/esm/InteractionCollection.js +125 -0
  45. package/lib/esm/InteractionCollection.js.map +1 -0
  46. package/lib/esm/SkillCollection.js +369 -0
  47. package/lib/esm/SkillCollection.js.map +1 -0
  48. package/lib/esm/ToolCollection.js +190 -0
  49. package/lib/esm/ToolCollection.js.map +1 -0
  50. package/lib/esm/ToolRegistry.js +106 -0
  51. package/lib/esm/ToolRegistry.js.map +1 -0
  52. package/lib/esm/auth.js +97 -0
  53. package/lib/esm/auth.js.map +1 -0
  54. package/lib/esm/build/validate.js +4 -0
  55. package/lib/esm/build/validate.js.map +1 -0
  56. package/lib/esm/copy-assets.js +81 -0
  57. package/lib/esm/copy-assets.js.map +1 -0
  58. package/lib/esm/index.js +11 -0
  59. package/lib/esm/index.js.map +1 -0
  60. package/lib/esm/server/interactions.js +63 -0
  61. package/lib/esm/server/interactions.js.map +1 -0
  62. package/lib/esm/server/mcp.js +42 -0
  63. package/lib/esm/server/mcp.js.map +1 -0
  64. package/lib/esm/server/site.js +27 -0
  65. package/lib/esm/server/site.js.map +1 -0
  66. package/lib/esm/server/skills.js +111 -0
  67. package/lib/esm/server/skills.js.map +1 -0
  68. package/lib/esm/server/tools.js +101 -0
  69. package/lib/esm/server/tools.js.map +1 -0
  70. package/lib/esm/server/types.js +2 -0
  71. package/lib/esm/server/types.js.map +1 -0
  72. package/lib/esm/server/widgets.js +24 -0
  73. package/lib/esm/server/widgets.js.map +1 -0
  74. package/lib/esm/server.js +128 -0
  75. package/lib/esm/server.js.map +1 -0
  76. package/lib/esm/site/styles.js +618 -0
  77. package/lib/esm/site/styles.js.map +1 -0
  78. package/lib/esm/site/templates.js +956 -0
  79. package/lib/esm/site/templates.js.map +1 -0
  80. package/lib/esm/types.js +2 -0
  81. package/lib/esm/types.js.map +1 -0
  82. package/lib/esm/utils.js +26 -0
  83. package/lib/esm/utils.js.map +1 -0
  84. package/lib/types/InteractionCollection.d.ts +48 -0
  85. package/lib/types/InteractionCollection.d.ts.map +1 -0
  86. package/lib/types/SkillCollection.d.ts +118 -0
  87. package/lib/types/SkillCollection.d.ts.map +1 -0
  88. package/lib/types/ToolCollection.d.ts +72 -0
  89. package/lib/types/ToolCollection.d.ts.map +1 -0
  90. package/lib/types/ToolRegistry.d.ts +41 -0
  91. package/lib/types/ToolRegistry.d.ts.map +1 -0
  92. package/lib/types/auth.d.ts +32 -0
  93. package/lib/types/auth.d.ts.map +1 -0
  94. package/lib/types/build/validate.d.ts +2 -0
  95. package/lib/types/build/validate.d.ts.map +1 -0
  96. package/lib/types/copy-assets.d.ts +14 -0
  97. package/lib/types/copy-assets.d.ts.map +1 -0
  98. package/lib/types/index.d.ts +11 -0
  99. package/lib/types/index.d.ts.map +1 -0
  100. package/lib/types/server/interactions.d.ts +4 -0
  101. package/lib/types/server/interactions.d.ts.map +1 -0
  102. package/lib/types/server/mcp.d.ts +4 -0
  103. package/lib/types/server/mcp.d.ts.map +1 -0
  104. package/lib/types/server/site.d.ts +4 -0
  105. package/lib/types/server/site.d.ts.map +1 -0
  106. package/lib/types/server/skills.d.ts +4 -0
  107. package/lib/types/server/skills.d.ts.map +1 -0
  108. package/lib/types/server/tools.d.ts +4 -0
  109. package/lib/types/server/tools.d.ts.map +1 -0
  110. package/lib/types/server/types.d.ts +62 -0
  111. package/lib/types/server/types.d.ts.map +1 -0
  112. package/lib/types/server/widgets.d.ts +9 -0
  113. package/lib/types/server/widgets.d.ts.map +1 -0
  114. package/lib/types/server.d.ts +27 -0
  115. package/lib/types/server.d.ts.map +1 -0
  116. package/lib/types/site/styles.d.ts +5 -0
  117. package/lib/types/site/styles.d.ts.map +1 -0
  118. package/lib/types/site/templates.d.ts +54 -0
  119. package/lib/types/site/templates.d.ts.map +1 -0
  120. package/lib/types/types.d.ts +280 -0
  121. package/lib/types/types.d.ts.map +1 -0
  122. package/lib/types/utils.d.ts +4 -0
  123. package/lib/types/utils.d.ts.map +1 -0
  124. package/package.json +58 -0
  125. package/src/InteractionCollection.ts +143 -0
  126. package/src/SkillCollection.ts +461 -0
  127. package/src/ToolCollection.ts +223 -0
  128. package/src/ToolRegistry.ts +135 -0
  129. package/src/auth.ts +123 -0
  130. package/src/build/validate.ts +3 -0
  131. package/src/copy-assets.ts +104 -0
  132. package/src/index.ts +12 -0
  133. package/src/server/interactions.ts +79 -0
  134. package/src/server/mcp.ts +51 -0
  135. package/src/server/site.ts +46 -0
  136. package/src/server/skills.ts +133 -0
  137. package/src/server/tools.ts +128 -0
  138. package/src/server/types.ts +65 -0
  139. package/src/server/widgets.ts +38 -0
  140. package/src/server.ts +160 -0
  141. package/src/site/styles.ts +617 -0
  142. package/src/site/templates.ts +994 -0
  143. package/src/types.ts +303 -0
  144. package/src/utils.ts +23 -0
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ // ================== Interaction Endpoints ==================
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.createInteractionsRoute = createInteractionsRoute;
5
+ const hono_1 = require("hono");
6
+ const http_exception_1 = require("hono/http-exception");
7
+ const auth_js_1 = require("../auth.js");
8
+ function createInteractionsRoute(app, basePath, config) {
9
+ const { interactions = [] } = config;
10
+ // GET /api/interactions - Returns all interactions from all collections
11
+ app.get(basePath, (c) => {
12
+ const allInteractions = [];
13
+ for (const coll of interactions) {
14
+ for (const inter of coll.interactions) {
15
+ allInteractions.push({
16
+ type: "app",
17
+ id: inter.name,
18
+ name: inter.name,
19
+ title: inter.title || inter.name,
20
+ description: inter.description,
21
+ tags: inter.tags || [],
22
+ });
23
+ }
24
+ }
25
+ return c.json({
26
+ title: 'All Interactions',
27
+ description: 'All available interactions across all collections',
28
+ interactions: allInteractions,
29
+ collections: interactions.map(i => ({
30
+ name: i.name,
31
+ title: i.title,
32
+ description: i.description,
33
+ })),
34
+ });
35
+ });
36
+ // Create interaction collection endpoints
37
+ for (const coll of interactions) {
38
+ app.route(`${basePath}/${coll.name}`, createInteractionEndpoints(coll));
39
+ }
40
+ }
41
+ function createInteractionEndpoints(coll) {
42
+ const endpoint = new hono_1.Hono();
43
+ endpoint.get('/', (c) => {
44
+ return c.json(coll.interactions.map(inter => ({
45
+ type: "app",
46
+ id: inter.name,
47
+ name: inter.name,
48
+ title: inter.title || inter.name,
49
+ description: inter.description,
50
+ tags: inter.tags || [],
51
+ })));
52
+ });
53
+ endpoint.get('/:name', async (c) => {
54
+ await (0, auth_js_1.authorize)(c);
55
+ const name = c.req.param('name');
56
+ const inter = coll.getInteractionByName(name);
57
+ if (!inter) {
58
+ throw new http_exception_1.HTTPException(404, {
59
+ message: "No interaction found with name: " + name
60
+ });
61
+ }
62
+ return c.json(inter);
63
+ });
64
+ return endpoint;
65
+ }
66
+ //# 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,45 @@
1
+ "use strict";
2
+ // ================== MCP Endpoints ==================
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.createMcpRoute = createMcpRoute;
5
+ const hono_1 = require("hono");
6
+ const http_exception_1 = require("hono/http-exception");
7
+ const auth_js_1 = require("../auth.js");
8
+ function createMcpRoute(app, basePath, config) {
9
+ const { mcpProviders = [] } = config;
10
+ // Create MCP provider endpoints
11
+ if (mcpProviders.length > 0) {
12
+ app.route(basePath, createMCPEndpoints(mcpProviders));
13
+ }
14
+ }
15
+ function createMCPEndpoints(providers) {
16
+ const endpoint = new hono_1.Hono();
17
+ for (const p of providers) {
18
+ endpoint.post(`/${p.name}`, async (c) => {
19
+ const session = await (0, auth_js_1.authorize)(c);
20
+ const config = await readJsonBody(c);
21
+ const info = await p.createMCPConnection(session, config);
22
+ return c.json(info);
23
+ });
24
+ endpoint.get(`/${p.name}`, (c) => c.json({
25
+ name: p.name,
26
+ description: p.description,
27
+ }));
28
+ }
29
+ return endpoint;
30
+ }
31
+ async function readJsonBody(ctx) {
32
+ try {
33
+ const text = await ctx.req.text();
34
+ const jsonContent = text?.trim() || '';
35
+ if (!jsonContent)
36
+ return {};
37
+ return JSON.parse(jsonContent);
38
+ }
39
+ catch (err) {
40
+ throw new http_exception_1.HTTPException(400, {
41
+ message: "Failed to parse JSON body: " + err.message
42
+ });
43
+ }
44
+ }
45
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/server/mcp.ts"],"names":[],"mappings":";AAAA,sDAAsD;;AAUtD,wCAOC;AAfD,+BAAqC;AACrC,wDAAoD;AACpD,wCAAuC;AAMvC,SAAgB,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,WAAI,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,IAAA,mBAAS,EAAC,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,8BAAa,CAAC,GAAG,EAAE;YACzB,OAAO,EAAE,6BAA6B,GAAG,GAAG,CAAC,OAAO;SACvD,CAAC,CAAC;IACP,CAAC;AACL,CAAC"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSiteRoute = createSiteRoute;
4
+ const templates_js_1 = require("../site/templates.js");
5
+ function createSiteRoute(app, basePath, config) {
6
+ const { title = 'Tools Server', tools = [], interactions = [], skills = [], mcpProviders = [], } = config;
7
+ // Index page
8
+ app.get(`${basePath}/`, (c) => {
9
+ return c.html((0, templates_js_1.indexPage)(tools, skills, interactions, mcpProviders, title));
10
+ });
11
+ // Tool collection pages
12
+ for (const coll of tools) {
13
+ app.get(`${basePath}/tools/${coll.name}`, (c) => {
14
+ return c.html((0, templates_js_1.toolCollectionPage)(coll));
15
+ });
16
+ }
17
+ // Skill collection pages
18
+ for (const coll of skills) {
19
+ app.get(`${basePath}/skills/${coll.name}`, (c) => {
20
+ return c.html((0, templates_js_1.skillCollectionPage)(coll));
21
+ });
22
+ }
23
+ // Interaction collection pages
24
+ for (const coll of interactions) {
25
+ app.get(`${basePath}/interactions/${coll.name}`, (c) => {
26
+ return c.html((0, templates_js_1.interactionCollectionPage)(coll));
27
+ });
28
+ }
29
+ }
30
+ //# sourceMappingURL=site.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"site.js","sourceRoot":"","sources":["../../../src/server/site.ts"],"names":[],"mappings":";;AAUA,0CAmCC;AA5CD,uDAK8B;AAI9B,SAAgB,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,IAAA,wBAAS,EAAC,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,IAAA,iCAAkB,EAAC,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,IAAA,kCAAmB,EAAC,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,IAAA,wCAAyB,EAAC,IAAI,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACP,CAAC;AAEL,CAAC"}
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ // ================== Skill Endpoints ==================
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.createSkillsRoute = createSkillsRoute;
5
+ const hono_1 = require("hono");
6
+ const http_exception_1 = require("hono/http-exception");
7
+ const utils_js_1 = require("../utils.js");
8
+ function createSkillsRoute(app, basePath, config) {
9
+ const { skills = [] } = config;
10
+ // Build a map of skill name -> collection for routing
11
+ const skillToCollection = new Map();
12
+ for (const coll of skills) {
13
+ for (const skill of coll.getSkillDefinitions()) {
14
+ skillToCollection.set(skill.name, coll);
15
+ // Also map the learn_ prefixed name
16
+ skillToCollection.set(`learn_${skill.name}`, coll);
17
+ }
18
+ }
19
+ // GET /api/skills - Returns all skills from all collections
20
+ app.get(basePath, (c) => {
21
+ const url = new URL(c.req.url);
22
+ const allSkills = [];
23
+ for (const coll of skills) {
24
+ allSkills.push(...coll.getToolDefinitions());
25
+ }
26
+ return c.json({
27
+ src: `${url.origin}${url.pathname}`,
28
+ title: 'All Skills',
29
+ description: 'All available skills across all collections',
30
+ tools: allSkills,
31
+ collections: skills.map(s => ({
32
+ name: s.name,
33
+ title: s.title,
34
+ description: s.description,
35
+ })),
36
+ });
37
+ });
38
+ // POST /api/skills - Route to the correct collection based on tool_name
39
+ app.post(basePath, async (c) => {
40
+ const ctx = c;
41
+ // Payload is already parsed and validated by middleware
42
+ if (!ctx.payload) {
43
+ throw new http_exception_1.HTTPException(400, {
44
+ message: 'Invalid or missing skill execution payload. Expected { tool_use: { id, tool_name, tool_input? }, metadata? }'
45
+ });
46
+ }
47
+ const toolName = ctx.payload.tool_use.tool_name;
48
+ // Find the collection for this skill
49
+ const collection = skillToCollection.get(toolName);
50
+ if (!collection) {
51
+ // Extract skill name for better error message
52
+ const skillName = toolName.startsWith('learn_') ? toolName.slice(6) : toolName;
53
+ throw new http_exception_1.HTTPException(404, {
54
+ message: `Skill not found: ${skillName}. Available skills: ${Array.from(skillToCollection.keys()).filter(k => !k.startsWith('learn_')).join(', ')}`
55
+ });
56
+ }
57
+ // Delegate to the collection's execute method with pre-parsed payload
58
+ return collection.execute(c, ctx.payload);
59
+ });
60
+ // Create skill collection endpoints (exposed as tools)
61
+ for (const coll of skills) {
62
+ app.route(`${basePath}/${coll.name}`, createSkillEndpoints(coll));
63
+ }
64
+ }
65
+ function createSkillEndpoints(coll) {
66
+ const endpoint = new hono_1.Hono();
67
+ // List skills as tool definitions (tool collection format)
68
+ // This allows skills to be used exactly like tools
69
+ endpoint.get('/', (c) => {
70
+ const url = new URL(c.req.url);
71
+ return c.json({
72
+ src: `${url.origin}${url.pathname}`,
73
+ title: coll.title || coll.name,
74
+ description: coll.description || '',
75
+ tools: coll.getToolDefinitions()
76
+ });
77
+ });
78
+ // Get scripts for a specific skill
79
+ // Returns all scripts bundled with the skill
80
+ endpoint.get('/:name/scripts', (c) => {
81
+ const name = c.req.param('name');
82
+ const skillName = name.startsWith('learn_') ? name.slice(6) : name;
83
+ const skill = coll.getSkill(skillName);
84
+ if (!skill) {
85
+ throw new http_exception_1.HTTPException(404, {
86
+ message: `Skill not found: ${skillName}`
87
+ });
88
+ }
89
+ const url = new URL(c.req.url);
90
+ return c.json({
91
+ skill_name: skill.name,
92
+ scripts: skill.scripts ? skill.scripts.map(s => (0, utils_js_1.makeScriptUrl)(url.origin, s)) : []
93
+ });
94
+ });
95
+ // Get a specific skill by name
96
+ endpoint.get('/:name', (c) => {
97
+ const name = c.req.param('name');
98
+ // Handle both "learn_name" and "name" formats
99
+ const skillName = name.startsWith('learn_') ? name.slice(6) : name;
100
+ const skill = coll.getSkill(skillName);
101
+ if (!skill) {
102
+ throw new http_exception_1.HTTPException(404, {
103
+ message: `Skill not found: ${skillName}`
104
+ });
105
+ }
106
+ return c.json(skill);
107
+ });
108
+ // Execute skill (standard tool execution format)
109
+ endpoint.post('/', (c) => {
110
+ return coll.execute(c);
111
+ });
112
+ return endpoint;
113
+ }
114
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/server/skills.ts"],"names":[],"mappings":";AAAA,wDAAwD;;AASxD,8CAmEC;AA1ED,+BAAqC;AACrC,wDAAoD;AAGpD,0CAA4C;AAG5C,SAAgB,iBAAiB,CAAC,GAAS,EAAE,QAAgB,EAAE,MAAwB;IACnF,MAAM,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC;IAE/B,sDAAsD;IACtD,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAA2B,CAAC;IAC7D,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QACxB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC;YAC7C,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACxC,oCAAoC;YACpC,iBAAiB,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;QACvD,CAAC;IACL,CAAC;IAED,4DAA4D;IAC5D,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;QACpB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,SAAS,GAAqB,EAAE,CAAC;QAEvC,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YACxB,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,OAAO,CAAC,CAAC,IAAI,CAAC;YACV,GAAG,EAAE,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,QAAQ,EAAE;YACnC,KAAK,EAAE,YAAY;YACnB,WAAW,EAAE,6CAA6C;YAC1D,KAAK,EAAE,SAAS;YAChB,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC1B,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,WAAW,EAAE,CAAC,CAAC,WAAW;aAC7B,CAAC,CAAC;SACsD,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,wEAAwE;IACxE,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC3B,MAAM,GAAG,GAAG,CAA2B,CAAC;QAExC,wDAAwD;QACxD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACf,MAAM,IAAI,8BAAa,CAAC,GAAG,EAAE;gBACzB,OAAO,EAAE,8GAA8G;aAC1H,CAAC,CAAC;QACP,CAAC;QAED,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;QAEhD,qCAAqC;QACrC,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,8CAA8C;YAC9C,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC/E,MAAM,IAAI,8BAAa,CAAC,GAAG,EAAE;gBACzB,OAAO,EAAE,oBAAoB,SAAS,uBAAuB,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aACtJ,CAAC,CAAC;QACP,CAAC;QAED,sEAAsE;QACtE,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,uDAAuD;IACvD,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QACxB,GAAG,CAAC,KAAK,CAAC,GAAG,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;IACtE,CAAC;AAEL,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAqB;IAC/C,MAAM,QAAQ,GAAG,IAAI,WAAI,EAAE,CAAC;IAE5B,2DAA2D;IAC3D,mDAAmD;IACnD,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAU,EAAE,EAAE;QAC7B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,CAAC,CAAC,IAAI,CAAC;YACV,GAAG,EAAE,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,QAAQ,EAAE;YACnC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI;YAC9B,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;YACnC,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE;SACA,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,mCAAmC;IACnC,6CAA6C;IAC7C,QAAQ,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAU,EAAE,EAAE;QAC1C,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACnE,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,MAAM,IAAI,8BAAa,CAAC,GAAG,EAAE;gBACzB,OAAO,EAAE,oBAAoB,SAAS,EAAE;aAC3C,CAAC,CAAC;QACP,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,CAAC,CAAC,IAAI,CAAC;YACV,UAAU,EAAE,KAAK,CAAC,IAAI;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAA,wBAAa,EAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;SACrF,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAGH,+BAA+B;IAC/B,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAU,EAAE,EAAE;QAClC,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjC,8CAA8C;QAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACnE,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,MAAM,IAAI,8BAAa,CAAC,GAAG,EAAE;gBACzB,OAAO,EAAE,oBAAoB,SAAS,EAAE;aAC3C,CAAC,CAAC;QACP,CAAC;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,KAA+B,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,iDAAiD;IACjD,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAU,EAAE,EAAE;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC;AACpB,CAAC"}
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createToolsRoute = createToolsRoute;
4
+ const hono_1 = require("hono");
5
+ const http_exception_1 = require("hono/http-exception");
6
+ function createToolsRoute(app, basePath, config) {
7
+ const { tools = [] } = config;
8
+ // Build a map of tool name -> collection for routing
9
+ const toolToCollection = new Map();
10
+ for (const coll of tools) {
11
+ for (const toolDef of coll.getToolDefinitions()) {
12
+ toolToCollection.set(toolDef.name, coll);
13
+ }
14
+ }
15
+ // GET /api/tools - Returns all tools from all collections
16
+ // Query params:
17
+ // - defaultOnly=true: Only return tools with default !== false
18
+ // - unlocked=tool1,tool2: Comma-separated list of unlocked tool names
19
+ app.get(basePath, (c) => {
20
+ const url = new URL(c.req.url);
21
+ const defaultOnly = c.req.query('defaultOnly') === 'true';
22
+ const unlockedParam = c.req.query('unlocked');
23
+ const unlockedTools = unlockedParam ? unlockedParam.split(',').map(t => t.trim()).filter(Boolean) : [];
24
+ const filterOptions = defaultOnly ? { defaultOnly, unlockedTools } : undefined;
25
+ const allTools = [];
26
+ let reserveToolCount = 0;
27
+ for (const coll of tools) {
28
+ allTools.push(...coll.getToolDefinitions(filterOptions));
29
+ if (defaultOnly) {
30
+ reserveToolCount += coll.getReserveTools(unlockedTools).length;
31
+ }
32
+ }
33
+ return c.json({
34
+ src: `${url.origin}${url.pathname}`,
35
+ title: 'All Tools',
36
+ description: 'All available tools across all collections',
37
+ tools: allTools,
38
+ reserveToolCount: defaultOnly ? reserveToolCount : undefined,
39
+ collections: tools.map(t => ({
40
+ name: t.name,
41
+ title: t.title,
42
+ description: t.description,
43
+ })),
44
+ });
45
+ });
46
+ // POST /api/tools - Route to the correct collection based on tool_name
47
+ app.post(basePath, async (c) => {
48
+ const ctx = c;
49
+ // Payload is already parsed and validated by middleware
50
+ if (!ctx.payload) {
51
+ throw new http_exception_1.HTTPException(400, {
52
+ message: 'Invalid or missing tool execution payload. Expected { tool_use: { id, tool_name, tool_input? }, metadata? }'
53
+ });
54
+ }
55
+ const toolName = ctx.payload.tool_use.tool_name;
56
+ // Find the collection for this tool
57
+ const collection = toolToCollection.get(toolName);
58
+ if (!collection) {
59
+ throw new http_exception_1.HTTPException(404, {
60
+ message: `Tool not found: ${toolName}. Available tools: ${Array.from(toolToCollection.keys()).join(', ')}`
61
+ });
62
+ }
63
+ // Delegate to the collection's execute method with pre-parsed payload
64
+ return collection.execute(c, ctx.payload);
65
+ });
66
+ // Create tool collection endpoints
67
+ for (const coll of tools) {
68
+ app.route(`${basePath}/${coll.name}`, createToolEndpoints(coll));
69
+ }
70
+ }
71
+ function createToolEndpoints(coll) {
72
+ const endpoint = new hono_1.Hono();
73
+ endpoint.post('/', (c) => {
74
+ return coll.execute(c);
75
+ });
76
+ // GET /api/tools/{collection}
77
+ // Query params:
78
+ // - import: Return import source URL instead of API URL
79
+ // - defaultOnly=true: Only return tools with default !== false
80
+ // - unlocked=tool1,tool2: Comma-separated list of unlocked tool names
81
+ endpoint.get('/', (c) => {
82
+ const importSourceUrl = c.req.query('import') != null;
83
+ const defaultOnly = c.req.query('defaultOnly') === 'true';
84
+ const unlockedParam = c.req.query('unlocked');
85
+ const unlockedTools = unlockedParam ? unlockedParam.split(',').map(t => t.trim()).filter(Boolean) : [];
86
+ const filterOptions = defaultOnly ? { defaultOnly, unlockedTools } : undefined;
87
+ const url = new URL(c.req.url);
88
+ const response = {
89
+ src: importSourceUrl
90
+ ? `${url.origin}/libs/vertesia-tools-${coll.name}.js`
91
+ : `${url.origin}${url.pathname}`,
92
+ title: coll.title || coll.name,
93
+ description: coll.description || '',
94
+ tools: coll.getToolDefinitions(filterOptions)
95
+ };
96
+ // Include reserve count when filtering
97
+ if (defaultOnly) {
98
+ response.reserveToolCount = coll.getReserveTools(unlockedTools).length;
99
+ }
100
+ return c.json(response);
101
+ });
102
+ return endpoint;
103
+ }
104
+ //# 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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/server/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createWidgetsRoute = createWidgetsRoute;
4
+ function createWidgetsRoute(app, basePath, config) {
5
+ const { skills = [] } = config;
6
+ // GET /api/widgets - Returns all widgets from all skill collections
7
+ app.get(basePath, (c) => {
8
+ const url = new URL(c.req.url);
9
+ const widgets = {};
10
+ for (const coll of skills) {
11
+ const collWidgets = coll.getWidgets();
12
+ for (const widget of collWidgets) {
13
+ widgets[widget.name] = {
14
+ collection: coll.name,
15
+ skill: widget.skill,
16
+ url: `${url.origin}/widgets/${widget.name}.js`,
17
+ };
18
+ }
19
+ }
20
+ return c.json({
21
+ title: 'All Widgets',
22
+ description: 'All available widgets across all skill collections',
23
+ widgets,
24
+ });
25
+ });
26
+ }
27
+ //# sourceMappingURL=widgets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widgets.js","sourceRoot":"","sources":["../../../src/server/widgets.ts"],"names":[],"mappings":";;AASA,gDA4BC;AA5BD,SAAgB,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,132 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createToolServer = createToolServer;
4
+ exports.createDevServer = createDevServer;
5
+ const hono_1 = require("hono");
6
+ const cors_1 = require("hono/cors");
7
+ const http_exception_1 = require("hono/http-exception");
8
+ const zod_1 = require("zod");
9
+ const interactions_js_1 = require("./server/interactions.js");
10
+ const mcp_js_1 = require("./server/mcp.js");
11
+ const site_js_1 = require("./server/site.js");
12
+ const skills_js_1 = require("./server/skills.js");
13
+ const tools_js_1 = require("./server/tools.js");
14
+ const widgets_js_1 = require("./server/widgets.js");
15
+ // Schema for tool execution payload
16
+ const ToolExecutionPayloadSchema = zod_1.z.object({
17
+ tool_use: zod_1.z.object({
18
+ id: zod_1.z.string(),
19
+ tool_name: zod_1.z.string(),
20
+ tool_input: zod_1.z.record(zod_1.z.string(), zod_1.z.any()).default({}),
21
+ }),
22
+ metadata: zod_1.z.record(zod_1.z.string(), zod_1.z.any()).optional(),
23
+ });
24
+ /**
25
+ * Create a Hono server for tools, interactions, and skills.
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * import { createToolServer, ToolCollection, SkillCollection } from "@vertesia/tools-sdk";
30
+ *
31
+ * const server = createToolServer({
32
+ * tools: [myToolCollection],
33
+ * skills: [mySkillCollection],
34
+ * });
35
+ *
36
+ * export default server;
37
+ * ```
38
+ */
39
+ function createToolServer(config) {
40
+ const { prefix = '/api', tools = [], interactions = [], skills = [], mcpProviders = [], disableHtml = false, } = config;
41
+ const app = new hono_1.Hono();
42
+ // Add CORS middleware globally
43
+ app.use('*', (0, cors_1.cors)({ origin: '*', allowMethods: ['GET', 'POST', 'OPTIONS'] }));
44
+ // Middleware to parse and validate body, store on context for reuse
45
+ app.use('*', async (c, next) => {
46
+ const ctx = c;
47
+ if (c.req.method === 'POST') {
48
+ try {
49
+ const text = await c.req.text();
50
+ const body = JSON.parse(text);
51
+ const result = ToolExecutionPayloadSchema.safeParse(body);
52
+ if (result.success) {
53
+ ctx.payload = result.data;
54
+ ctx.toolUseId = result.data.tool_use.id;
55
+ ctx.toolName = result.data.tool_use.tool_name;
56
+ }
57
+ // If validation fails, still store raw body for error reporting
58
+ // but don't set payload - handlers will return validation error
59
+ }
60
+ catch {
61
+ // Ignore parsing errors - body might not be JSON
62
+ }
63
+ }
64
+ await next();
65
+ });
66
+ // HTML pages (unless disabled)
67
+ if (!disableHtml) {
68
+ (0, site_js_1.createSiteRoute)(app, '', config);
69
+ }
70
+ // Add base API route
71
+ app.get(prefix, (c) => {
72
+ // Skills are exposed as tools, so include them in the tools list
73
+ const allToolEndpoints = [
74
+ ...tools.map(col => `${prefix}/tools/${col.name}`),
75
+ ...skills.map(col => `${prefix}/skills/${col.name}`),
76
+ ];
77
+ return c.json({
78
+ message: 'Vertesia Tools API',
79
+ version: '1.0.0',
80
+ endpoints: {
81
+ tools: allToolEndpoints,
82
+ interactions: interactions.map(col => `${prefix}/interactions/${col.name}`),
83
+ mcp: mcpProviders.map(p => `${prefix}/mcp/${p.name}`),
84
+ }
85
+ });
86
+ });
87
+ (0, tools_js_1.createToolsRoute)(app, `${prefix}/tools`, config);
88
+ (0, skills_js_1.createSkillsRoute)(app, `${prefix}/skills`, config);
89
+ (0, widgets_js_1.createWidgetsRoute)(app, `${prefix}/widgets`, config);
90
+ (0, interactions_js_1.createInteractionsRoute)(app, `${prefix}/interactions`, config);
91
+ (0, mcp_js_1.createMcpRoute)(app, `${prefix}/mcp`, config);
92
+ // Global error handler - returns ToolExecutionResponseError format
93
+ app.onError((err, c) => {
94
+ const ctx = c;
95
+ const status = err instanceof http_exception_1.HTTPException ? err.status : 500;
96
+ const errorMessage = err instanceof http_exception_1.HTTPException ? err.message : 'Internal Server Error';
97
+ if (!(err instanceof http_exception_1.HTTPException)) {
98
+ console.error('Uncaught Error:', err);
99
+ }
100
+ return c.json({
101
+ tool_use_id: ctx.toolUseId || 'unknown',
102
+ status,
103
+ error: errorMessage,
104
+ data: ctx.toolName ? { tool_name: ctx.toolName } : undefined,
105
+ }, status);
106
+ });
107
+ // Not found handler - returns ToolExecutionResponseError format
108
+ app.notFound((c) => {
109
+ const ctx = c;
110
+ return c.json({
111
+ tool_use_id: ctx.toolUseId || 'unknown',
112
+ status: 404,
113
+ error: `Not found: ${c.req.method} ${c.req.path}`,
114
+ data: ctx.toolName ? { tool_name: ctx.toolName } : undefined,
115
+ }, 404);
116
+ });
117
+ return app;
118
+ }
119
+ // ================== Server Utilities ==================
120
+ /**
121
+ * Simple development server with static fimesale handling
122
+ *
123
+ * @deprecated Use tools server template
124
+ */
125
+ function createDevServer(config) {
126
+ const app = createToolServer(config);
127
+ if (config.staticHandler) {
128
+ app.use('*', config.staticHandler);
129
+ }
130
+ return app;
131
+ }
132
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}