@vertesia/tools-sdk 1.0.0-dev.20260203.130115Z → 1.0.0-dev.20260225.024852Z

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 (153) hide show
  1. package/lib/cjs/ContentTypesCollection.js +43 -0
  2. package/lib/cjs/ContentTypesCollection.js.map +1 -0
  3. package/lib/cjs/InteractionCollection.js +43 -0
  4. package/lib/cjs/InteractionCollection.js.map +1 -0
  5. package/lib/cjs/SkillCollection.js +384 -0
  6. package/lib/cjs/SkillCollection.js.map +1 -0
  7. package/lib/cjs/ToolCollection.js +221 -0
  8. package/lib/cjs/ToolCollection.js.map +1 -0
  9. package/lib/cjs/ToolRegistry.js +95 -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 +32 -0
  18. package/lib/cjs/index.js.map +1 -0
  19. package/lib/cjs/package.json +3 -0
  20. package/lib/cjs/server/app-package.js +130 -0
  21. package/lib/cjs/server/app-package.js.map +1 -0
  22. package/lib/cjs/server/content-types.js +73 -0
  23. package/lib/cjs/server/content-types.js.map +1 -0
  24. package/lib/cjs/server/interactions.js +89 -0
  25. package/lib/cjs/server/interactions.js.map +1 -0
  26. package/lib/cjs/server/mcp.js +45 -0
  27. package/lib/cjs/server/mcp.js.map +1 -0
  28. package/lib/cjs/server/site.js +36 -0
  29. package/lib/cjs/server/site.js.map +1 -0
  30. package/lib/cjs/server/skills.js +114 -0
  31. package/lib/cjs/server/skills.js.map +1 -0
  32. package/lib/cjs/server/tools.js +87 -0
  33. package/lib/cjs/server/tools.js.map +1 -0
  34. package/lib/cjs/server/types.js +3 -0
  35. package/lib/cjs/server/types.js.map +1 -0
  36. package/lib/cjs/server/widgets.js +27 -0
  37. package/lib/cjs/server/widgets.js.map +1 -0
  38. package/lib/cjs/server.js +136 -0
  39. package/lib/cjs/server.js.map +1 -0
  40. package/lib/cjs/site/styles.js +692 -0
  41. package/lib/cjs/site/styles.js.map +1 -0
  42. package/lib/cjs/site/templates.js +1014 -0
  43. package/lib/cjs/site/templates.js.map +1 -0
  44. package/lib/cjs/types.js +3 -0
  45. package/lib/cjs/types.js.map +1 -0
  46. package/lib/cjs/utils.js +44 -0
  47. package/lib/cjs/utils.js.map +1 -0
  48. package/lib/esm/ContentTypesCollection.js +39 -0
  49. package/lib/esm/ContentTypesCollection.js.map +1 -0
  50. package/lib/esm/InteractionCollection.js +39 -0
  51. package/lib/esm/InteractionCollection.js.map +1 -0
  52. package/lib/esm/SkillCollection.js +377 -0
  53. package/lib/esm/SkillCollection.js.map +1 -0
  54. package/lib/esm/ToolCollection.js +183 -0
  55. package/lib/esm/ToolCollection.js.map +1 -0
  56. package/lib/esm/ToolRegistry.js +90 -0
  57. package/lib/esm/ToolRegistry.js.map +1 -0
  58. package/lib/esm/auth.js +97 -0
  59. package/lib/esm/auth.js.map +1 -0
  60. package/lib/esm/build/validate.js +4 -0
  61. package/lib/esm/build/validate.js.map +1 -0
  62. package/lib/esm/copy-assets.js +81 -0
  63. package/lib/esm/copy-assets.js.map +1 -0
  64. package/lib/esm/index.js +12 -0
  65. package/lib/esm/index.js.map +1 -0
  66. package/lib/esm/server/app-package.js +127 -0
  67. package/lib/esm/server/app-package.js.map +1 -0
  68. package/lib/esm/server/content-types.js +70 -0
  69. package/lib/esm/server/content-types.js.map +1 -0
  70. package/lib/esm/server/interactions.js +86 -0
  71. package/lib/esm/server/interactions.js.map +1 -0
  72. package/lib/esm/server/mcp.js +42 -0
  73. package/lib/esm/server/mcp.js.map +1 -0
  74. package/lib/esm/server/site.js +33 -0
  75. package/lib/esm/server/site.js.map +1 -0
  76. package/lib/esm/server/skills.js +111 -0
  77. package/lib/esm/server/skills.js.map +1 -0
  78. package/lib/esm/server/tools.js +84 -0
  79. package/lib/esm/server/tools.js.map +1 -0
  80. package/lib/esm/server/types.js +2 -0
  81. package/lib/esm/server/types.js.map +1 -0
  82. package/lib/esm/server/widgets.js +24 -0
  83. package/lib/esm/server/widgets.js.map +1 -0
  84. package/lib/esm/server.js +132 -0
  85. package/lib/esm/server.js.map +1 -0
  86. package/lib/esm/site/styles.js +689 -0
  87. package/lib/esm/site/styles.js.map +1 -0
  88. package/lib/esm/site/templates.js +1001 -0
  89. package/lib/esm/site/templates.js.map +1 -0
  90. package/lib/esm/types.js +2 -0
  91. package/lib/esm/types.js.map +1 -0
  92. package/lib/esm/utils.js +38 -0
  93. package/lib/esm/utils.js.map +1 -0
  94. package/lib/types/ContentTypesCollection.d.ts +18 -0
  95. package/lib/types/ContentTypesCollection.d.ts.map +1 -0
  96. package/lib/types/InteractionCollection.d.ts +18 -0
  97. package/lib/types/InteractionCollection.d.ts.map +1 -0
  98. package/lib/types/SkillCollection.d.ts +119 -0
  99. package/lib/types/SkillCollection.d.ts.map +1 -0
  100. package/lib/types/ToolCollection.d.ts +67 -0
  101. package/lib/types/ToolCollection.d.ts.map +1 -0
  102. package/lib/types/ToolRegistry.d.ts +22 -0
  103. package/lib/types/ToolRegistry.d.ts.map +1 -0
  104. package/lib/types/auth.d.ts +32 -0
  105. package/lib/types/auth.d.ts.map +1 -0
  106. package/lib/types/build/validate.d.ts +2 -0
  107. package/lib/types/build/validate.d.ts.map +1 -0
  108. package/lib/types/copy-assets.d.ts +14 -0
  109. package/lib/types/copy-assets.d.ts.map +1 -0
  110. package/lib/types/index.d.ts +12 -0
  111. package/lib/types/index.d.ts.map +1 -0
  112. package/lib/types/server/app-package.d.ts +4 -0
  113. package/lib/types/server/app-package.d.ts.map +1 -0
  114. package/lib/types/server/content-types.d.ts +4 -0
  115. package/lib/types/server/content-types.d.ts.map +1 -0
  116. package/lib/types/server/interactions.d.ts +4 -0
  117. package/lib/types/server/interactions.d.ts.map +1 -0
  118. package/lib/types/server/mcp.d.ts +4 -0
  119. package/lib/types/server/mcp.d.ts.map +1 -0
  120. package/lib/types/server/site.d.ts +4 -0
  121. package/lib/types/server/site.d.ts.map +1 -0
  122. package/lib/types/server/skills.d.ts +4 -0
  123. package/lib/types/server/skills.d.ts.map +1 -0
  124. package/lib/types/server/tools.d.ts +4 -0
  125. package/lib/types/server/tools.d.ts.map +1 -0
  126. package/lib/types/server/types.d.ts +88 -0
  127. package/lib/types/server/types.d.ts.map +1 -0
  128. package/lib/types/server/widgets.d.ts +4 -0
  129. package/lib/types/server/widgets.d.ts.map +1 -0
  130. package/lib/types/server.d.ts +27 -0
  131. package/lib/types/server.d.ts.map +1 -0
  132. package/lib/types/site/styles.d.ts +5 -0
  133. package/lib/types/site/styles.d.ts.map +1 -0
  134. package/lib/types/site/templates.d.ts +60 -0
  135. package/lib/types/site/templates.d.ts.map +1 -0
  136. package/lib/types/types.d.ts +293 -0
  137. package/lib/types/types.d.ts.map +1 -0
  138. package/lib/types/utils.d.ts +10 -0
  139. package/lib/types/utils.d.ts.map +1 -0
  140. package/package.json +4 -4
  141. package/src/ContentTypesCollection.ts +8 -8
  142. package/src/SkillCollection.ts +11 -2
  143. package/src/ToolCollection.ts +9 -18
  144. package/src/ToolRegistry.ts +17 -56
  145. package/src/server/app-package.ts +88 -43
  146. package/src/server/{conyent-types.ts → content-types.ts} +29 -11
  147. package/src/server/interactions.ts +11 -6
  148. package/src/server/tools.ts +3 -22
  149. package/src/server/types.ts +9 -1
  150. package/src/server/widgets.ts +2 -6
  151. package/src/server.ts +1 -1
  152. package/src/types.ts +34 -1
  153. package/src/utils.ts +15 -1
@@ -0,0 +1,70 @@
1
+ // ================== Content Type Endpoints ==================
2
+ import { Hono } from "hono";
3
+ import { HTTPException } from "hono/http-exception";
4
+ import { toPathName } from "../utils.js";
5
+ export function createContentTypesRoute(app, basePath, config) {
6
+ const { types = [] } = config;
7
+ // GET /api/types - Returns all interactions from all collections
8
+ app.get(basePath, (c) => {
9
+ const allTypes = [];
10
+ for (const coll of types) {
11
+ for (const type of coll.types) {
12
+ allTypes.push({ ...type, id: coll.name + ":" + toPathName(type.name) });
13
+ }
14
+ }
15
+ return c.json({
16
+ title: 'All Content Types',
17
+ description: 'All available content types across all collections',
18
+ types: allTypes,
19
+ collections: types.map(i => ({
20
+ name: i.name,
21
+ title: i.title,
22
+ description: i.description,
23
+ })),
24
+ });
25
+ });
26
+ // Create interaction collection endpoints
27
+ for (const coll of types) {
28
+ app.route(`${basePath}/${coll.name}`, createContentTypeEndpoints(coll));
29
+ }
30
+ // GET /api/types/:name - Direct access to content type
31
+ app.get(`${basePath}/:name`, async (c) => {
32
+ const name = c.req.param('name');
33
+ const parts = name.split(':');
34
+ if (parts.length !== 2) {
35
+ throw new HTTPException(400, {
36
+ message: "Invalid content type name. Expected format 'collection:type'"
37
+ });
38
+ }
39
+ const collName = parts[0];
40
+ const typeName = toPathName(parts[1]);
41
+ const ctype = types.find(t => t.name === collName)?.getTypeByName(typeName);
42
+ if (ctype) {
43
+ return c.json({ ...ctype, id: collName + ":" + typeName });
44
+ }
45
+ throw new HTTPException(404, {
46
+ message: "No content type found with name: " + name
47
+ });
48
+ });
49
+ }
50
+ function createContentTypeEndpoints(coll) {
51
+ const endpoint = new Hono();
52
+ endpoint.get('/', (c) => {
53
+ return c.json(coll.types.map(t => ({ ...t, id: coll.name + ":" + toPathName(t.name) })));
54
+ });
55
+ endpoint.get('/:name', (c) => {
56
+ const name = c.req.param('name');
57
+ const ctype = coll.types.find(t => toPathName(t.name) === name);
58
+ if (!ctype) {
59
+ throw new HTTPException(404, {
60
+ message: "No content type found with name: " + name
61
+ });
62
+ }
63
+ return c.json({
64
+ ...ctype,
65
+ id: coll.name + ":" + toPathName(ctype.name)
66
+ });
67
+ });
68
+ return endpoint;
69
+ }
70
+ //# sourceMappingURL=content-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-types.js","sourceRoot":"","sources":["../../../src/server/content-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
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: coll.name + ":" + 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
+ // GET /api/interactions/:name - Direct access to interaction by name (searches all collections)
38
+ app.get(`${basePath}/:name`, async (c) => {
39
+ await authorize(c);
40
+ const name = c.req.param('name');
41
+ const parts = name.split(':');
42
+ if (parts.length !== 2) {
43
+ throw new HTTPException(400, {
44
+ message: "Invalid interaction name. Expected format 'collection:interaction'"
45
+ });
46
+ }
47
+ const collName = parts[0];
48
+ const interName = parts[1];
49
+ const inter = interactions.find(t => t.name === collName)?.getInteractionByName(interName);
50
+ if (inter) {
51
+ return c.json({ ...inter, id: collName + ":" + interName });
52
+ }
53
+ throw new HTTPException(404, {
54
+ message: "No interaction found with name: " + name
55
+ });
56
+ });
57
+ }
58
+ function createInteractionEndpoints(coll) {
59
+ const endpoint = new Hono();
60
+ endpoint.get('/', (c) => {
61
+ return c.json(coll.interactions.map(inter => ({
62
+ type: "app",
63
+ id: coll.name + ":" + inter.name,
64
+ name: inter.name,
65
+ title: inter.title || inter.name,
66
+ description: inter.description,
67
+ tags: inter.tags || [],
68
+ })));
69
+ });
70
+ endpoint.get('/:name', async (c) => {
71
+ await authorize(c);
72
+ const name = c.req.param('name');
73
+ const inter = coll.getInteractionByName(name);
74
+ if (!inter) {
75
+ throw new HTTPException(404, {
76
+ message: "No interaction found with name: " + name
77
+ });
78
+ }
79
+ return c.json({
80
+ ...inter,
81
+ id: coll.name + ":" + inter.name,
82
+ });
83
+ });
84
+ return endpoint;
85
+ }
86
+ //# 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"}
@@ -0,0 +1,33 @@
1
+ import { contentTypeCollectionPage, indexPage, interactionCollectionPage, skillCollectionPage, toolCollectionPage } from "../site/templates.js";
2
+ export function createSiteRoute(app, basePath, config) {
3
+ const { tools = [], interactions = [], types = [], skills = [], } = config;
4
+ // Index page
5
+ app.get(`${basePath}/`, (c) => {
6
+ return c.html(indexPage(config));
7
+ });
8
+ // Tool collection pages
9
+ for (const coll of tools) {
10
+ app.get(`${basePath}/tools/${coll.name}`, (c) => {
11
+ return c.html(toolCollectionPage(coll));
12
+ });
13
+ }
14
+ // Skill collection pages
15
+ for (const coll of skills) {
16
+ app.get(`${basePath}/skills/${coll.name}`, (c) => {
17
+ return c.html(skillCollectionPage(coll));
18
+ });
19
+ }
20
+ // Interaction collection pages
21
+ for (const coll of interactions) {
22
+ app.get(`${basePath}/interactions/${coll.name}`, (c) => {
23
+ return c.html(interactionCollectionPage(coll));
24
+ });
25
+ }
26
+ // Content type collection pages
27
+ for (const coll of types) {
28
+ app.get(`${basePath}/types/${coll.name}`, (c) => {
29
+ return c.html(contentTypeCollectionPage(coll));
30
+ });
31
+ }
32
+ }
33
+ //# sourceMappingURL=site.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"site.js","sourceRoot":"","sources":["../../../src/server/site.ts"],"names":[],"mappings":"AACA,OAAO,EACH,yBAAyB,EACzB,SAAS,EACT,yBAAyB,EACzB,mBAAmB,EACnB,kBAAkB,EACrB,MAAM,sBAAsB,CAAC;AAI9B,MAAM,UAAU,eAAe,CAAC,GAAS,EAAE,QAAgB,EAAE,MAAwB;IACjF,MAAM,EACF,KAAK,GAAG,EAAE,EACV,YAAY,GAAG,EAAE,EACjB,KAAK,GAAG,EAAE,EACV,MAAM,GAAG,EAAE,GACd,GAAG,MAAM,CAAC;IAEX,aAAa;IACb,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE;QAC1B,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,wBAAwB;IACxB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,UAAU,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE;YAC5C,OAAO,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACP,CAAC;IAED,yBAAyB;IACzB,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QACxB,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,WAAW,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE;YAC7C,OAAO,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACP,CAAC;IAED,+BAA+B;IAC/B,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAC9B,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,iBAAiB,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE;YACnD,OAAO,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACP,CAAC;IAED,gCAAgC;IAChC,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,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACP,CAAC;AAEL,CAAC"}
@@ -0,0 +1,111 @@
1
+ // ================== Skill Endpoints ==================
2
+ import { Hono } from "hono";
3
+ import { HTTPException } from "hono/http-exception";
4
+ import { makeScriptUrl } from "../utils.js";
5
+ export function createSkillsRoute(app, basePath, config) {
6
+ const { skills = [] } = config;
7
+ // Build a map of skill name -> collection for routing
8
+ const skillToCollection = new Map();
9
+ for (const coll of skills) {
10
+ for (const skill of coll.getSkillDefinitions()) {
11
+ skillToCollection.set(skill.name, coll);
12
+ // Also map the learn_ prefixed name
13
+ skillToCollection.set(`learn_${skill.name}`, coll);
14
+ }
15
+ }
16
+ // GET /api/skills - Returns all skills from all collections
17
+ app.get(basePath, (c) => {
18
+ const url = new URL(c.req.url);
19
+ const allSkills = [];
20
+ for (const coll of skills) {
21
+ allSkills.push(...coll.getToolDefinitions());
22
+ }
23
+ return c.json({
24
+ src: `${url.origin}${url.pathname}`,
25
+ title: 'All Skills',
26
+ description: 'All available skills across all collections',
27
+ tools: allSkills,
28
+ collections: skills.map(s => ({
29
+ name: s.name,
30
+ title: s.title,
31
+ description: s.description,
32
+ })),
33
+ });
34
+ });
35
+ // POST /api/skills - Route to the correct collection based on tool_name
36
+ app.post(basePath, async (c) => {
37
+ const ctx = c;
38
+ // Payload is already parsed and validated by middleware
39
+ if (!ctx.payload) {
40
+ throw new HTTPException(400, {
41
+ message: 'Invalid or missing skill execution payload. Expected { tool_use: { id, tool_name, tool_input? }, metadata? }'
42
+ });
43
+ }
44
+ const toolName = ctx.payload.tool_use.tool_name;
45
+ // Find the collection for this skill
46
+ const collection = skillToCollection.get(toolName);
47
+ if (!collection) {
48
+ // Extract skill name for better error message
49
+ const skillName = toolName.startsWith('learn_') ? toolName.slice(6) : toolName;
50
+ throw new HTTPException(404, {
51
+ message: `Skill not found: ${skillName}. Available skills: ${Array.from(skillToCollection.keys()).filter(k => !k.startsWith('learn_')).join(', ')}`
52
+ });
53
+ }
54
+ // Delegate to the collection's execute method with pre-parsed payload
55
+ return collection.execute(c, ctx.payload);
56
+ });
57
+ // Create skill collection endpoints (exposed as tools)
58
+ for (const coll of skills) {
59
+ app.route(`${basePath}/${coll.name}`, createSkillEndpoints(coll));
60
+ }
61
+ }
62
+ function createSkillEndpoints(coll) {
63
+ const endpoint = new Hono();
64
+ // List skills as tool definitions (tool collection format)
65
+ // This allows skills to be used exactly like tools
66
+ endpoint.get('/', (c) => {
67
+ const url = new URL(c.req.url);
68
+ return c.json({
69
+ src: `${url.origin}${url.pathname}`,
70
+ title: coll.title || coll.name,
71
+ description: coll.description || '',
72
+ tools: coll.getToolDefinitions()
73
+ });
74
+ });
75
+ // Get scripts for a specific skill
76
+ // Returns all scripts bundled with the skill
77
+ endpoint.get('/:name/scripts', (c) => {
78
+ const name = c.req.param('name');
79
+ const skillName = name.startsWith('learn_') ? name.slice(6) : name;
80
+ const skill = coll.getSkill(skillName);
81
+ if (!skill) {
82
+ throw new HTTPException(404, {
83
+ message: `Skill not found: ${skillName}`
84
+ });
85
+ }
86
+ const url = new URL(c.req.url);
87
+ return c.json({
88
+ skill_name: skill.name,
89
+ scripts: skill.scripts ? skill.scripts.map(s => makeScriptUrl(url.origin, s)) : []
90
+ });
91
+ });
92
+ // Get a specific skill by name
93
+ endpoint.get('/:name', (c) => {
94
+ const name = c.req.param('name');
95
+ // Handle both "learn_name" and "name" formats
96
+ const skillName = name.startsWith('learn_') ? name.slice(6) : name;
97
+ const skill = coll.getSkill(skillName);
98
+ if (!skill) {
99
+ throw new HTTPException(404, {
100
+ message: `Skill not found: ${skillName}`
101
+ });
102
+ }
103
+ return c.json(skill);
104
+ });
105
+ // Execute skill (standard tool execution format)
106
+ endpoint.post('/', (c) => {
107
+ return coll.execute(c);
108
+ });
109
+ return endpoint;
110
+ }
111
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/server/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ import { Hono } from "hono";
2
+ import { HTTPException } from "hono/http-exception";
3
+ export function createToolsRoute(app, basePath, config) {
4
+ const { tools = [] } = config;
5
+ // Build a map of tool name -> collection for routing
6
+ const toolToCollection = new Map();
7
+ for (const coll of tools) {
8
+ for (const toolDef of coll.getToolDefinitions()) {
9
+ toolToCollection.set(toolDef.name, coll);
10
+ }
11
+ }
12
+ // GET /api/tools - Returns all tools from all collections
13
+ // Query params:
14
+ // - defaultOnly=true: Only return tools with default !== false
15
+ // - unlocked=tool1,tool2: Comma-separated list of unlocked tool names
16
+ app.get(basePath, (c) => {
17
+ const url = new URL(c.req.url);
18
+ const allTools = [];
19
+ for (const coll of tools) {
20
+ allTools.push(...coll.getToolDefinitions());
21
+ }
22
+ return c.json({
23
+ src: `${url.origin}${url.pathname}`,
24
+ title: 'All Tools',
25
+ description: 'All available tools across all collections',
26
+ tools: allTools,
27
+ collections: tools.map(t => ({
28
+ name: t.name,
29
+ title: t.title,
30
+ description: t.description,
31
+ })),
32
+ });
33
+ });
34
+ // POST /api/tools - Route to the correct collection based on tool_name
35
+ app.post(basePath, async (c) => {
36
+ const ctx = c;
37
+ // Payload is already parsed and validated by middleware
38
+ if (!ctx.payload) {
39
+ throw new HTTPException(400, {
40
+ message: 'Invalid or missing tool execution payload. Expected { tool_use: { id, tool_name, tool_input? }, metadata? }'
41
+ });
42
+ }
43
+ const toolName = ctx.payload.tool_use.tool_name;
44
+ // Find the collection for this tool
45
+ const collection = toolToCollection.get(toolName);
46
+ if (!collection) {
47
+ throw new HTTPException(404, {
48
+ message: `Tool not found: ${toolName}. Available tools: ${Array.from(toolToCollection.keys()).join(', ')}`
49
+ });
50
+ }
51
+ // Delegate to the collection's execute method with pre-parsed payload
52
+ return collection.execute(c, ctx.payload);
53
+ });
54
+ // Create tool collection endpoints
55
+ for (const coll of tools) {
56
+ app.route(`${basePath}/${coll.name}`, createToolEndpoints(coll));
57
+ }
58
+ }
59
+ function createToolEndpoints(coll) {
60
+ const endpoint = new Hono();
61
+ endpoint.post('/', (c) => {
62
+ return coll.execute(c);
63
+ });
64
+ // GET /api/tools/{collection}
65
+ // Query params:
66
+ // - import: Return import source URL instead of API URL
67
+ // - defaultOnly=true: Only return tools with default !== false
68
+ // - unlocked=tool1,tool2: Comma-separated list of unlocked tool names
69
+ endpoint.get('/', (c) => {
70
+ const importSourceUrl = c.req.query('import') != null;
71
+ const url = new URL(c.req.url);
72
+ const response = {
73
+ src: importSourceUrl
74
+ ? `${url.origin}/libs/vertesia-tools-${coll.name}.js`
75
+ : `${url.origin}${url.pathname}`,
76
+ title: coll.title || coll.name,
77
+ description: coll.description || '',
78
+ tools: coll.getToolDefinitions()
79
+ };
80
+ return c.json(response);
81
+ });
82
+ return endpoint;
83
+ }
84
+ //# 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/server/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ export function createWidgetsRoute(app, basePath, config) {
2
+ const { skills = [] } = config;
3
+ // GET /api/widgets - Returns all widgets from all skill collections
4
+ app.get(basePath, (c) => {
5
+ const url = new URL(c.req.url);
6
+ const widgets = {};
7
+ for (const coll of skills) {
8
+ const collWidgets = coll.getWidgets();
9
+ for (const widget of collWidgets) {
10
+ widgets[widget.name] = {
11
+ collection: coll.name,
12
+ skill: widget.skill,
13
+ url: `${url.origin}/widgets/${widget.name}.js`,
14
+ };
15
+ }
16
+ }
17
+ return c.json({
18
+ title: 'All Widgets',
19
+ description: 'All available widgets across all skill collections',
20
+ widgets,
21
+ });
22
+ });
23
+ }
24
+ //# sourceMappingURL=widgets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widgets.js","sourceRoot":"","sources":["../../../src/server/widgets.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,kBAAkB,CAAC,GAAS,EAAE,QAAgB,EAAE,MAAwB;IAEpF,MAAM,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC;IAE/B,oEAAoE;IACpE,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;QACpB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAE/B,MAAM,OAAO,GAAkC,EAAE,CAAC;QAClD,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
+ import { Hono } from "hono";
2
+ import { cors } from "hono/cors";
3
+ import { HTTPException } from "hono/http-exception";
4
+ import { z } from "zod";
5
+ import { createInteractionsRoute } from "./server/interactions.js";
6
+ import { createMcpRoute } from "./server/mcp.js";
7
+ import { createSiteRoute } from "./server/site.js";
8
+ import { createSkillsRoute } from "./server/skills.js";
9
+ import { createToolsRoute } from "./server/tools.js";
10
+ import { createWidgetsRoute } from "./server/widgets.js";
11
+ import { createPackageRoute } from "./server/app-package.js";
12
+ import { createContentTypesRoute } from "./server/content-types.js";
13
+ // Schema for tool execution payload
14
+ const ToolExecutionPayloadSchema = z.object({
15
+ tool_use: z.object({
16
+ id: z.string(),
17
+ tool_name: z.string(),
18
+ tool_input: z.record(z.string(), z.any()).default({}),
19
+ }),
20
+ metadata: z.record(z.string(), z.any()).optional(),
21
+ });
22
+ /**
23
+ * Create a Hono server for tools, interactions, and skills.
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * import { createToolServer, ToolCollection, SkillCollection } from "@vertesia/tools-sdk";
28
+ *
29
+ * const server = createToolServer({
30
+ * tools: [myToolCollection],
31
+ * skills: [mySkillCollection],
32
+ * });
33
+ *
34
+ * export default server;
35
+ * ```
36
+ */
37
+ export function createToolServer(config) {
38
+ const { prefix = '/api', tools = [], interactions = [], skills = [], mcpProviders = [], disableHtml = false, } = config;
39
+ const app = new Hono();
40
+ // Add CORS middleware globally
41
+ app.use('*', cors({ origin: '*', allowMethods: ['GET', 'POST', 'OPTIONS'] }));
42
+ // Middleware to parse and validate body, store on context for reuse
43
+ app.use('*', async (c, next) => {
44
+ const ctx = c;
45
+ if (c.req.method === 'POST') {
46
+ try {
47
+ const text = await c.req.text();
48
+ const body = JSON.parse(text);
49
+ const result = ToolExecutionPayloadSchema.safeParse(body);
50
+ if (result.success) {
51
+ ctx.payload = result.data;
52
+ ctx.toolUseId = result.data.tool_use.id;
53
+ ctx.toolName = result.data.tool_use.tool_name;
54
+ }
55
+ // If validation fails, still store raw body for error reporting
56
+ // but don't set payload - handlers will return validation error
57
+ }
58
+ catch {
59
+ // Ignore parsing errors - body might not be JSON
60
+ }
61
+ }
62
+ await next();
63
+ });
64
+ // HTML pages (unless disabled)
65
+ if (!disableHtml) {
66
+ createSiteRoute(app, '', config);
67
+ }
68
+ // Add base API route
69
+ app.get(prefix, (c) => {
70
+ // Skills are exposed as tools, so include them in the tools list
71
+ const allToolEndpoints = [
72
+ ...tools.map(col => `${prefix}/tools/${col.name}`),
73
+ ...skills.map(col => `${prefix}/skills/${col.name}`),
74
+ ];
75
+ return c.json({
76
+ message: 'Vertesia Tools API',
77
+ version: '1.0.0',
78
+ endpoints: {
79
+ tools: allToolEndpoints,
80
+ interactions: interactions.map(col => `${prefix}/interactions/${col.name}`),
81
+ mcp: mcpProviders.map(p => `${prefix}/mcp/${p.name}`),
82
+ }
83
+ });
84
+ });
85
+ createPackageRoute(app, `${prefix}/package`, config);
86
+ createToolsRoute(app, `${prefix}/tools`, config);
87
+ createSkillsRoute(app, `${prefix}/skills`, config);
88
+ createWidgetsRoute(app, `${prefix}/widgets`, config);
89
+ createInteractionsRoute(app, `${prefix}/interactions`, config);
90
+ createContentTypesRoute(app, `${prefix}/types`, config);
91
+ 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 HTTPException ? err.status : 500;
96
+ const errorMessage = err instanceof HTTPException ? err.message : 'Internal Server Error';
97
+ if (!(err instanceof 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
+ export 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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"}