@vertesia/tools-sdk 1.0.0-dev.20260128.144200 → 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 (113) 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 +0 -121
  4. package/lib/cjs/InteractionCollection.js.map +1 -1
  5. package/lib/cjs/SkillCollection.js +10 -2
  6. package/lib/cjs/SkillCollection.js.map +1 -1
  7. package/lib/cjs/ToolCollection.js +6 -13
  8. package/lib/cjs/ToolCollection.js.map +1 -1
  9. package/lib/cjs/ToolRegistry.js +16 -32
  10. package/lib/cjs/ToolRegistry.js.map +1 -1
  11. package/lib/cjs/index.js +1 -0
  12. package/lib/cjs/index.js.map +1 -1
  13. package/lib/cjs/server/app-package.js +130 -0
  14. package/lib/cjs/server/app-package.js.map +1 -0
  15. package/lib/cjs/server/content-types.js +73 -0
  16. package/lib/cjs/server/content-types.js.map +1 -0
  17. package/lib/cjs/server/interactions.js +26 -3
  18. package/lib/cjs/server/interactions.js.map +1 -1
  19. package/lib/cjs/server/site.js +7 -1
  20. package/lib/cjs/server/site.js.map +1 -1
  21. package/lib/cjs/server/tools.js +2 -19
  22. package/lib/cjs/server/tools.js.map +1 -1
  23. package/lib/cjs/server/widgets.js.map +1 -1
  24. package/lib/cjs/server.js +4 -0
  25. package/lib/cjs/server.js.map +1 -1
  26. package/lib/cjs/site/styles.js +55 -0
  27. package/lib/cjs/site/styles.js.map +1 -1
  28. package/lib/cjs/site/templates.js +104 -85
  29. package/lib/cjs/site/templates.js.map +1 -1
  30. package/lib/cjs/utils.js +13 -0
  31. package/lib/cjs/utils.js.map +1 -1
  32. package/lib/esm/ContentTypesCollection.js +39 -0
  33. package/lib/esm/ContentTypesCollection.js.map +1 -0
  34. package/lib/esm/InteractionCollection.js +0 -86
  35. package/lib/esm/InteractionCollection.js.map +1 -1
  36. package/lib/esm/SkillCollection.js +10 -2
  37. package/lib/esm/SkillCollection.js.map +1 -1
  38. package/lib/esm/ToolCollection.js +7 -14
  39. package/lib/esm/ToolCollection.js.map +1 -1
  40. package/lib/esm/ToolRegistry.js +16 -32
  41. package/lib/esm/ToolRegistry.js.map +1 -1
  42. package/lib/esm/index.js +1 -0
  43. package/lib/esm/index.js.map +1 -1
  44. package/lib/esm/server/app-package.js +127 -0
  45. package/lib/esm/server/app-package.js.map +1 -0
  46. package/lib/esm/server/content-types.js +70 -0
  47. package/lib/esm/server/content-types.js.map +1 -0
  48. package/lib/esm/server/interactions.js +26 -3
  49. package/lib/esm/server/interactions.js.map +1 -1
  50. package/lib/esm/server/site.js +8 -2
  51. package/lib/esm/server/site.js.map +1 -1
  52. package/lib/esm/server/tools.js +2 -19
  53. package/lib/esm/server/tools.js.map +1 -1
  54. package/lib/esm/server/widgets.js.map +1 -1
  55. package/lib/esm/server.js +4 -0
  56. package/lib/esm/server.js.map +1 -1
  57. package/lib/esm/site/styles.js +55 -0
  58. package/lib/esm/site/styles.js.map +1 -1
  59. package/lib/esm/site/templates.js +103 -85
  60. package/lib/esm/site/templates.js.map +1 -1
  61. package/lib/esm/utils.js +12 -0
  62. package/lib/esm/utils.js.map +1 -1
  63. package/lib/types/ContentTypesCollection.d.ts +18 -0
  64. package/lib/types/ContentTypesCollection.d.ts.map +1 -0
  65. package/lib/types/InteractionCollection.d.ts +1 -31
  66. package/lib/types/InteractionCollection.d.ts.map +1 -1
  67. package/lib/types/SkillCollection.d.ts +3 -2
  68. package/lib/types/SkillCollection.d.ts.map +1 -1
  69. package/lib/types/ToolCollection.d.ts +5 -10
  70. package/lib/types/ToolCollection.d.ts.map +1 -1
  71. package/lib/types/ToolRegistry.d.ts +5 -24
  72. package/lib/types/ToolRegistry.d.ts.map +1 -1
  73. package/lib/types/index.d.ts +1 -0
  74. package/lib/types/index.d.ts.map +1 -1
  75. package/lib/types/server/app-package.d.ts +4 -0
  76. package/lib/types/server/app-package.d.ts.map +1 -0
  77. package/lib/types/server/content-types.d.ts +4 -0
  78. package/lib/types/server/content-types.d.ts.map +1 -0
  79. package/lib/types/server/interactions.d.ts.map +1 -1
  80. package/lib/types/server/site.d.ts.map +1 -1
  81. package/lib/types/server/tools.d.ts.map +1 -1
  82. package/lib/types/server/types.d.ts +22 -0
  83. package/lib/types/server/types.d.ts.map +1 -1
  84. package/lib/types/server/widgets.d.ts +0 -5
  85. package/lib/types/server/widgets.d.ts.map +1 -1
  86. package/lib/types/server.d.ts.map +1 -1
  87. package/lib/types/site/styles.d.ts +1 -1
  88. package/lib/types/site/styles.d.ts.map +1 -1
  89. package/lib/types/site/templates.d.ts +5 -0
  90. package/lib/types/site/templates.d.ts.map +1 -1
  91. package/lib/types/types.d.ts +29 -16
  92. package/lib/types/types.d.ts.map +1 -1
  93. package/lib/types/utils.d.ts +6 -0
  94. package/lib/types/utils.d.ts.map +1 -1
  95. package/package.json +5 -5
  96. package/src/ContentTypesCollection.ts +51 -0
  97. package/src/InteractionCollection.ts +1 -94
  98. package/src/SkillCollection.ts +13 -3
  99. package/src/ToolCollection.ts +11 -18
  100. package/src/ToolRegistry.ts +22 -55
  101. package/src/index.ts +1 -0
  102. package/src/server/app-package.ts +147 -0
  103. package/src/server/content-types.ts +89 -0
  104. package/src/server/interactions.ts +29 -3
  105. package/src/server/site.ts +9 -0
  106. package/src/server/tools.ts +3 -22
  107. package/src/server/types.ts +26 -0
  108. package/src/server/widgets.ts +2 -6
  109. package/src/server.ts +5 -0
  110. package/src/site/styles.ts +55 -0
  111. package/src/site/templates.ts +107 -84
  112. package/src/types.ts +33 -16
  113. package/src/utils.ts +15 -1
@@ -3,6 +3,9 @@ import { InteractionCollection } from "../InteractionCollection.js";
3
3
  import { SkillCollection } from "../SkillCollection.js";
4
4
  import { ToolCollection } from "../ToolCollection.js";
5
5
  import { ToolExecutionPayload } from "../types.js";
6
+ import { JSONSchema } from "@llumiverse/common";
7
+ import { AppUIConfig, ProjectConfiguration } from "@vertesia/common";
8
+ import { ContentTypesCollection } from "../ContentTypesCollection.js";
6
9
  /**
7
10
  * Extended context with parsed payload for tool/skill execution
8
11
  */
@@ -46,6 +49,10 @@ export interface ToolServerConfig {
46
49
  * Interaction collections to expose
47
50
  */
48
51
  interactions?: InteractionCollection[];
52
+ /**
53
+ * Content type collections to expose
54
+ */
55
+ types?: ContentTypesCollection[];
49
56
  /**
50
57
  * Skill collections to expose
51
58
  */
@@ -54,6 +61,14 @@ export interface ToolServerConfig {
54
61
  * MCP providers to expose
55
62
  */
56
63
  mcpProviders?: MCPProviderConfig[];
64
+ /**
65
+ * A JSON schema defining settings for the application using this server
66
+ */
67
+ settings?: JSONSchema;
68
+ /**
69
+ * The UI configuration for the application using this server
70
+ */
71
+ uiConfig?: AppUIConfig;
57
72
  /**
58
73
  * Disable HTML pages (default: false)
59
74
  */
@@ -62,5 +77,12 @@ export interface ToolServerConfig {
62
77
  * Hide UI app links on the index page (default: false)
63
78
  */
64
79
  hideUILinks?: boolean;
80
+ /**
81
+ * If a filter is provided, it will be called with the project configuration when requesting tool definitions, and can be used to filter which tools are returned based on the project configuration.
82
+ * This allows for dynamic enabling/disabling of tools based on project settings.
83
+ * @param projectConfig
84
+ * @returns
85
+ */
86
+ toolFilter?: (projectConfig: ProjectConfiguration) => boolean;
65
87
  }
66
88
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/server/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,OAAO;IACxC,iCAAiC;IACjC,OAAO,CAAC,EAAE,oBAAoB,CAAC,GAAG,CAAC,CAAC;IACpC,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,OAAO,CAAC;QACxE,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACN;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC7B;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB;;OAEG;IACH,YAAY,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACvC;;OAEG;IACH,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;IAC3B;;OAEG;IACH,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACnC;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/server/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAEtE;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,OAAO;IACxC,iCAAiC;IACjC,OAAO,CAAC,EAAE,oBAAoB,CAAC,GAAG,CAAC,CAAC;IACpC,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,OAAO,CAAC;QACxE,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACN;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC7B;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB;;OAEG;IACH,YAAY,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACvC;;OAEG;IACH,KAAK,CAAC,EAAE,sBAAsB,EAAE,CAAC;IACjC;;OAEG;IACH,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;IAC3B;;OAEG;IACH,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAEnC;;OAEG;IACH,QAAQ,CAAC,EAAE,UAAU,CAAC;IAEtB;;OAEG;IACH,QAAQ,CAAC,EAAE,WAAW,CAAC;IAEvB;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,CAAC,aAAa,EAAE,oBAAoB,KAAK,OAAO,CAAC;CACjE"}
@@ -1,9 +1,4 @@
1
1
  import { Hono } from "hono";
2
2
  import { ToolServerConfig } from "./types.js";
3
- export interface WidgetInfo {
4
- collection: string;
5
- skill: string;
6
- url: string;
7
- }
8
3
  export declare function createWidgetsRoute(app: Hono, basePath: string, config: ToolServerConfig): void;
9
4
  //# sourceMappingURL=widgets.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"widgets.d.ts","sourceRoot":"","sources":["../../../src/server/widgets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,UAAU;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,QA4BvF"}
1
+ {"version":3,"file":"widgets.d.ts","sourceRoot":"","sources":["../../../src/server/widgets.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG9C,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,QA4BvF"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AASrC,OAAO,EAAe,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAgBlE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAiG/D;AAMD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG;IACvD,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;CACvF,GAAG,IAAI,CAQP"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AASrC,OAAO,EAAe,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAkBlE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAoG/D;AAMD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG;IACvD,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;CACvF,GAAG,IAAI,CAQP"}
@@ -1,5 +1,5 @@
1
1
  /**
2
2
  * Shared CSS styles for the tools server HTML pages
3
3
  */
4
- export declare const baseStyles = "\n:root {\n color-scheme: light dark;\n}\n\nbody {\n font-family: system-ui, -apple-system, sans-serif;\n margin: 0;\n padding: 2.5rem 1.75rem;\n background:\n radial-gradient(circle at 0 0, rgba(56, 189, 248, 0.10), transparent 55%),\n radial-gradient(circle at 100% 0, rgba(129, 140, 248, 0.12), transparent 55%),\n #f9fafb;\n color: #0f172a;\n line-height: 1.5;\n}\n\n.page {\n max-width: 1120px;\n margin: 0 auto;\n}\n\n.hero {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 2.25rem;\n padding: 1.75rem 2rem;\n margin-bottom: 2.5rem;\n border-radius: 1.25rem;\n background: linear-gradient(135deg, #ffffff, #f3f4ff);\n border: 1px solid #e5e7eb;\n box-shadow:\n 0 18px 40px rgba(15, 23, 42, 0.08),\n 0 0 0 1px rgba(248, 250, 252, 0.8);\n}\n\n.hero-main {\n display: flex;\n gap: 1.5rem;\n align-items: center;\n}\n\n.hero-logo {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 56px;\n height: 56px;\n border-radius: 999px;\n background: radial-gradient(circle at 30% 0, #38bdf8, #6366f1);\n box-shadow:\n 0 0 0 1px rgba(15, 23, 42, 0.85),\n 0 12px 30px rgba(37, 99, 235, 0.6);\n}\n\n.hero-logo-initial {\n font-size: 1.1rem;\n font-weight: 650;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: #eff6ff;\n}\n\n.hero-logo img {\n display: block;\n max-width: 80%;\n max-height: 60%;\n}\n\n.logo-dark {\n display: none;\n}\n\n.hero-meta {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.hero-eyebrow {\n font-size: 0.75rem;\n letter-spacing: 0.12em;\n text-transform: uppercase;\n color: #6b7280;\n}\n\n.hero-title {\n font-size: 1.9rem;\n font-weight: 650;\n letter-spacing: -0.03em;\n color: #0f172a;\n margin: 0;\n}\n\n.hero-tagline {\n font-size: 0.95rem;\n color: #4b5563;\n margin: 0.1rem 0 0 0;\n}\n\n.hero-summary {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n margin-top: 0.75rem;\n font-size: 0.8rem;\n color: #6b7280;\n}\n\n.hero-summary span {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n padding: 0.15rem 0.55rem;\n border-radius: 999px;\n background: #f9fafb;\n border: 1px solid #e5e7eb;\n}\n\n.hero-summary dot {\n width: 6px;\n height: 6px;\n border-radius: 999px;\n display: inline-block;\n background: #22c55e;\n}\n\n.search-bar {\n display: flex;\n flex-direction: column;\n gap: 0.4rem;\n margin: 0 0 1.75rem 0;\n}\n\n.search-input {\n max-width: 360px;\n padding: 0.55rem 0.75rem;\n border-radius: 999px;\n border: 1px solid #e5e7eb;\n background: #ffffff;\n color: #111827;\n font-size: 0.9rem;\n font-family: inherit;\n box-shadow: 0 4px 10px rgba(15, 23, 42, 0.04);\n}\n\n.search-input::placeholder {\n color: #9ca3af;\n}\n\n.search-input:focus {\n outline: none;\n border-color: #60a5fa;\n box-shadow:\n 0 0 0 1px rgba(59, 130, 246, 0.4),\n 0 6px 18px rgba(37, 99, 235, 0.18);\n}\n\n.search-hint {\n font-size: 0.75rem;\n color: #9ca3af;\n}\n\n.search-empty {\n margin-top: 1rem;\n font-size: 0.85rem;\n color: #9ca3af;\n}\n\n.hero-panel {\n min-width: 220px;\n max-width: 260px;\n padding: 1.25rem 1.4rem;\n border-radius: 1rem;\n background: radial-gradient(circle at 0 0, rgba(59, 130, 246, 0.10), transparent 70%),\n #eff6ff;\n border: 1px solid #bfdbfe;\n box-shadow: 0 16px 34px rgba(15, 23, 42, 0.10);\n font-size: 0.8rem;\n}\n\n.hero-panel-label {\n font-size: 0.7rem;\n letter-spacing: 0.13em;\n text-transform: uppercase;\n color: #1d4ed8;\n margin-bottom: 0.5rem;\n}\n\n.hero-panel-endpoint {\n display: inline-flex;\n align-items: center;\n padding: 0.3rem 0.6rem;\n border-radius: 0.5rem;\n background: #f9fafb;\n border: 1px solid #e5e7eb;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 0.82rem;\n color: #111827;\n}\n\n.hero-panel-hint {\n margin-top: 0.6rem;\n color: #6b7280;\n line-height: 1.4;\n}\n\n.hero-panel-hint strong {\n color: #111827;\n}\n\nh1, h2 {\n margin: 0 0 1rem 0;\n color: #0f172a;\n}\n\nh1 { font-size: 1.875rem; }\nh2 {\n font-size: 1.4rem;\n margin-top: 2rem;\n letter-spacing: 0.03em;\n text-transform: uppercase;\n color: #6b7280;\n}\n\na {\n color: #2563eb;\n text-decoration: none;\n}\na:hover {\n text-decoration: underline;\n}\n\nhr {\n border: none;\n border-top: 1px solid #e5e7eb;\n margin: 2rem 0;\n}\n\n.card-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 1.5rem;\n}\n\n.card {\n background: radial-gradient(circle at 0 0, rgba(56, 189, 248, 0.12), transparent 75%),\n #ffffff;\n padding: 1.25rem 1.35rem;\n border-radius: 14px;\n box-shadow:\n 0 14px 30px rgba(15, 23, 42, 0.06),\n 0 0 0 1px rgba(248, 250, 252, 0.9);\n border: 1px solid #e5e7eb;\n transition: transform 0.15s, box-shadow 0.15s;\n text-decoration: none;\n color: inherit;\n display: block;\n}\n\n.card:hover {\n transform: translateY(-3px);\n box-shadow:\n 0 18px 40px rgba(15, 23, 42, 0.10),\n 0 0 0 1px rgba(59, 130, 246, 0.6);\n}\n\n.card-icon {\n width: 48px;\n height: 48px;\n margin-bottom: 0.75rem;\n}\n\n.card-icon svg {\n width: 100%;\n height: 100%;\n}\n\n.card-title {\n font-weight: 600;\n font-size: 1.1rem;\n margin-bottom: 0.25rem;\n color: #0f172a;\n}\n\n.card-desc {\n font-size: 0.925rem;\n color: #6b7280;\n}\n\n.card-meta {\n margin-top: 0.45rem;\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: #9ca3af;\n}\n\n.item-list {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n\n.item-card {\n background: #ffffff;\n padding: 1rem 1.25rem;\n border-radius: 10px;\n border-left: 4px solid #6366f1;\n box-shadow:\n 0 10px 24px rgba(15, 23, 42, 0.06),\n 0 0 0 1px rgba(248, 250, 252, 0.9);\n}\n\n.item-card.skill {\n border-left-color: #10b981;\n}\n\n.item-card.interaction {\n border-left-color: #f59e0b;\n}\n\n.item-name {\n font-weight: 600;\n font-size: 1.05rem;\n}\n\n.item-desc {\n font-size: 0.9rem;\n color: #6b7280;\n margin-top: 0.25rem;\n}\n\n.item-meta {\n font-size: 0.8rem;\n color: #9ca3af;\n margin-top: 0.5rem;\n}\n\n.item-schema {\n margin-top: 0.75rem;\n font-size: 0.8rem;\n font-family: ui-monospace, monospace;\n background: #f3f4f6;\n padding: 0.75rem;\n border-radius: 6px;\n overflow-x: auto;\n white-space: pre-wrap;\n color: #374151;\n}\n\n.header {\n display: flex;\n align-items: center;\n gap: 1rem;\n margin-bottom: 1.5rem;\n}\n\n.header-icon {\n width: 64px;\n height: 64px;\n}\n\n.header-icon svg {\n width: 100%;\n height: 100%;\n}\n\n.section-header {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 1rem;\n margin-bottom: 0.75rem;\n}\n\n.section-subtitle {\n font-size: 0.8rem;\n color: #6b7280;\n}\n\n.endpoint-url {\n font-size: 0.85rem;\n color: #6b7280;\n margin-top: 0.25rem;\n}\n\n.endpoint-url code {\n background: #f3f4f6;\n padding: 0.125rem 0.375rem;\n border-radius: 4px;\n font-family: ui-monospace, monospace;\n}\n\n.badge {\n display: inline-block;\n font-size: 0.75rem;\n padding: 0.125rem 0.5rem;\n border-radius: 9999px;\n background: #f9fafb;\n color: #374151;\n border: 1px solid #e5e7eb;\n margin-right: 0.25rem;\n}\n\n.badge.python { background: #fef3c7; color: #92400e; border-color: #facc15; }\n.badge.typescript { background: #dbeafe; color: #1e40af; border-color: #60a5fa; }\n.badge.javascript { background: #fef9c3; color: #854d0e; border-color: #facc15; }\n\n@media (max-width: 768px) {\n body {\n padding: 1.75rem 1.25rem;\n }\n\n .hero {\n flex-direction: column;\n padding: 1.5rem 1.35rem;\n }\n\n .hero-panel {\n max-width: 100%;\n width: 100%;\n }\n}\n\n@media (prefers-color-scheme: dark) {\n body {\n background:\n radial-gradient(circle at 0 0, rgba(56, 189, 248, 0.18), transparent 55%),\n radial-gradient(circle at 100% 0, rgba(129, 140, 248, 0.25), transparent 55%),\n #020617;\n color: #e5e7eb;\n }\n\n .hero {\n background: linear-gradient(135deg, rgba(15, 23, 42, 0.98), rgba(15, 23, 42, 0.92));\n border: 1px solid rgba(148, 163, 184, 0.45);\n box-shadow:\n 0 24px 60px rgba(15, 23, 42, 0.85),\n 0 0 0 1px rgba(15, 23, 42, 0.75);\n }\n\n .hero-eyebrow {\n color: #9ca3af;\n }\n\n .hero-title {\n color: #f9fafb;\n }\n\n .hero-tagline {\n color: #cbd5f5;\n }\n\n .hero-summary {\n color: #9ca3af;\n }\n\n .hero-summary span {\n background: rgba(15, 23, 42, 0.95);\n border-color: rgba(148, 163, 184, 0.45);\n }\n\n .hero-panel {\n background: radial-gradient(circle at 0 0, rgba(56, 189, 248, 0.16), transparent 70%),\n rgba(15, 23, 42, 0.96);\n border: 1px solid rgba(59, 130, 246, 0.6);\n box-shadow: 0 20px 40px rgba(15, 23, 42, 0.85);\n }\n\n .hero-panel-label {\n color: #93c5fd;\n }\n\n .hero-panel-endpoint {\n background: rgba(15, 23, 42, 0.98);\n border-color: rgba(148, 163, 184, 0.6);\n color: #e5e7eb;\n }\n\n .hero-panel-hint {\n color: #9ca3af;\n }\n\n .hero-panel-hint strong {\n color: #e5e7eb;\n }\n\n .search-input {\n background: rgba(15, 23, 42, 0.96);\n border-color: rgba(55, 65, 81, 0.9);\n color: #e5e7eb;\n box-shadow:\n 0 6px 16px rgba(15, 23, 42, 0.9),\n 0 0 0 1px rgba(15, 23, 42, 0.9);\n }\n\n .search-input::placeholder {\n color: #6b7280;\n }\n\n .search-input:focus {\n border-color: #60a5fa;\n box-shadow:\n 0 0 0 1px rgba(59, 130, 246, 0.7),\n 0 10px 26px rgba(30, 64, 175, 0.7);\n }\n\n .search-hint,\n .search-empty {\n color: #9ca3af;\n }\n\n h1, h2 {\n color: #e5e7eb;\n }\n\n h2 {\n color: #9ca3af;\n }\n\n a {\n color: #60a5fa;\n }\n\n hr {\n border-top-color: rgba(148, 163, 184, 0.4);\n }\n\n .card {\n background: radial-gradient(circle at 0 0, rgba(56, 189, 248, 0.12), transparent 75%),\n rgba(15, 23, 42, 0.9);\n box-shadow:\n 0 14px 30px rgba(15, 23, 42, 0.8),\n 0 0 0 1px rgba(15, 23, 42, 0.85);\n border-color: rgba(148, 163, 184, 0.5);\n }\n\n .card:hover {\n box-shadow:\n 0 18px 40px rgba(15, 23, 42, 0.9),\n 0 0 0 1px rgba(59, 130, 246, 0.8);\n }\n\n .card-title {\n color: #e5e7eb;\n }\n\n .card-desc {\n color: #9ca3af;\n }\n\n .card-meta {\n color: #6b7280;\n }\n\n .item-card {\n background: rgba(15, 23, 42, 0.9);\n box-shadow:\n 0 10px 24px rgba(15, 23, 42, 0.9),\n 0 0 0 1px rgba(15, 23, 42, 0.9);\n }\n\n .item-desc,\n .item-meta {\n color: #9ca3af;\n }\n\n .item-schema {\n background: rgba(15, 23, 42, 0.95);\n color: #e5e7eb;\n }\n\n .endpoint-url {\n color: #9ca3af;\n }\n\n .endpoint-url code {\n background: rgba(15, 23, 42, 0.95);\n }\n\n .badge {\n background: rgba(15, 23, 42, 0.96);\n color: #e5e7eb;\n border-color: rgba(148, 163, 184, 0.6);\n }\n\n .badge.python {\n background: rgba(252, 211, 77, 0.12);\n color: #facc15;\n border-color: rgba(250, 204, 21, 0.5);\n }\n\n .badge.typescript {\n background: rgba(59, 130, 246, 0.12);\n color: #93c5fd;\n border-color: rgba(59, 130, 246, 0.7);\n }\n\n .badge.javascript {\n background: rgba(251, 191, 36, 0.12);\n color: #fbbf24;\n border-color: rgba(251, 191, 36, 0.55);\n }\n\n .logo-light {\n display: none;\n }\n .logo-dark {\n display: block;\n }\n\n .plugin-link-primary:hover {\n background: #2563eb !important;\n }\n\n .plugin-link-secondary:hover {\n background: #059669 !important;\n }\n}\n\n.plugin-link-primary:hover {\n background: #2563eb;\n}\n\n.plugin-link-secondary:hover {\n background: #059669;\n}\n";
4
+ export declare const baseStyles = "\n:root {\n color-scheme: light dark;\n}\n\nbody {\n font-family: system-ui, -apple-system, sans-serif;\n margin: 0;\n padding: 2.5rem 1.75rem;\n background:\n radial-gradient(circle at 0 0, rgba(56, 189, 248, 0.10), transparent 55%),\n radial-gradient(circle at 100% 0, rgba(129, 140, 248, 0.12), transparent 55%),\n #f9fafb;\n color: #0f172a;\n line-height: 1.5;\n}\n\n.page {\n max-width: 1120px;\n margin: 0 auto;\n}\n\n.hero {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 2.25rem;\n padding: 1.75rem 2rem;\n margin-bottom: 2.5rem;\n border-radius: 1.25rem;\n background: linear-gradient(135deg, #ffffff, #f3f4ff);\n border: 1px solid #e5e7eb;\n box-shadow:\n 0 18px 40px rgba(15, 23, 42, 0.08),\n 0 0 0 1px rgba(248, 250, 252, 0.8);\n}\n\n.hero-main {\n display: flex;\n gap: 1.5rem;\n align-items: center;\n}\n\n.hero-logo {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 56px;\n height: 56px;\n border-radius: 999px;\n background: radial-gradient(circle at 30% 0, #38bdf8, #6366f1);\n box-shadow:\n 0 0 0 1px rgba(15, 23, 42, 0.85),\n 0 12px 30px rgba(37, 99, 235, 0.6);\n}\n\n.hero-logo-initial {\n font-size: 1.1rem;\n font-weight: 650;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: #eff6ff;\n}\n\n.hero-logo img {\n display: block;\n max-width: 80%;\n max-height: 60%;\n}\n\n.logo-dark {\n display: none;\n}\n\n.hero-meta {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.hero-eyebrow {\n font-size: 0.75rem;\n letter-spacing: 0.12em;\n text-transform: uppercase;\n color: #6b7280;\n}\n\n.hero-title {\n font-size: 1.9rem;\n font-weight: 650;\n letter-spacing: -0.03em;\n color: #0f172a;\n margin: 0;\n}\n\n.hero-tagline {\n font-size: 0.95rem;\n color: #4b5563;\n margin: 0.1rem 0 0 0;\n}\n\n.hero-summary {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n margin-top: 0.75rem;\n font-size: 0.8rem;\n color: #6b7280;\n}\n\n.hero-summary span {\n display: inline-flex;\n align-items: center;\n gap: 0.35rem;\n padding: 0.15rem 0.55rem;\n border-radius: 999px;\n background: #f9fafb;\n border: 1px solid #e5e7eb;\n}\n\n.hero-summary dot {\n width: 6px;\n height: 6px;\n border-radius: 999px;\n display: inline-block;\n background: #22c55e;\n}\n\n.search-bar {\n display: flex;\n flex-direction: column;\n gap: 0.4rem;\n margin: 0 0 1.75rem 0;\n}\n\n.search-input {\n max-width: 360px;\n padding: 0.55rem 0.75rem;\n border-radius: 999px;\n border: 1px solid #e5e7eb;\n background: #ffffff;\n color: #111827;\n font-size: 0.9rem;\n font-family: inherit;\n box-shadow: 0 4px 10px rgba(15, 23, 42, 0.04);\n}\n\n.search-input::placeholder {\n color: #9ca3af;\n}\n\n.search-input:focus {\n outline: none;\n border-color: #60a5fa;\n box-shadow:\n 0 0 0 1px rgba(59, 130, 246, 0.4),\n 0 6px 18px rgba(37, 99, 235, 0.18);\n}\n\n.search-hint {\n font-size: 0.75rem;\n color: #9ca3af;\n}\n\n.search-empty {\n margin-top: 1rem;\n font-size: 0.85rem;\n color: #9ca3af;\n}\n\n.hero-panel {\n min-width: 220px;\n max-width: 260px;\n padding: 1.25rem 1.4rem;\n border-radius: 1rem;\n background: radial-gradient(circle at 0 0, rgba(59, 130, 246, 0.10), transparent 70%),\n #eff6ff;\n border: 1px solid #bfdbfe;\n box-shadow: 0 16px 34px rgba(15, 23, 42, 0.10);\n font-size: 0.8rem;\n}\n\n.hero-panel-label {\n font-size: 0.7rem;\n letter-spacing: 0.13em;\n text-transform: uppercase;\n color: #1d4ed8;\n margin-bottom: 0.5rem;\n}\n\n.hero-panel-endpoint {\n display: inline-flex;\n align-items: center;\n padding: 0.3rem 0.6rem;\n border-radius: 0.5rem;\n background: #f9fafb;\n border: 1px solid #e5e7eb;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 0.82rem;\n color: #111827;\n}\n\n.hero-panel-hint {\n margin-top: 0.6rem;\n color: #6b7280;\n line-height: 1.4;\n}\n\n.hero-panel-hint strong {\n color: #111827;\n}\n\nh1, h2 {\n margin: 0 0 1rem 0;\n color: #0f172a;\n}\n\nh1 { font-size: 1.875rem; }\nh2 {\n font-size: 1.4rem;\n margin-top: 2rem;\n letter-spacing: 0.03em;\n text-transform: uppercase;\n color: #6b7280;\n}\n\na {\n color: #2563eb;\n text-decoration: none;\n}\na:hover {\n text-decoration: underline;\n}\n\nhr {\n border: none;\n border-top: 1px solid #e5e7eb;\n margin: 2rem 0;\n}\n\n.card-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 1.5rem;\n}\n\n.card {\n background: radial-gradient(circle at 0 0, rgba(56, 189, 248, 0.12), transparent 75%),\n #ffffff;\n padding: 1.25rem 1.35rem;\n border-radius: 14px;\n box-shadow:\n 0 14px 30px rgba(15, 23, 42, 0.06),\n 0 0 0 1px rgba(248, 250, 252, 0.9);\n border: 1px solid #e5e7eb;\n transition: transform 0.15s, box-shadow 0.15s;\n text-decoration: none;\n color: inherit;\n display: block;\n}\n\n.card:hover {\n transform: translateY(-3px);\n box-shadow:\n 0 18px 40px rgba(15, 23, 42, 0.10),\n 0 0 0 1px rgba(59, 130, 246, 0.6);\n}\n\n.card-icon {\n width: 48px;\n height: 48px;\n margin-bottom: 0.75rem;\n}\n\n.card-icon svg {\n width: 100%;\n height: 100%;\n}\n\n.card-title {\n font-weight: 600;\n font-size: 1.1rem;\n margin-bottom: 0.25rem;\n color: #0f172a;\n}\n\n.card-desc {\n font-size: 0.925rem;\n color: #6b7280;\n}\n\n.card-meta {\n margin-top: 0.45rem;\n font-size: 0.75rem;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: #9ca3af;\n}\n\n.item-list {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n\n.item-card {\n background: #ffffff;\n padding: 1rem 1.25rem;\n border-radius: 10px;\n border-left: 4px solid #6366f1;\n box-shadow:\n 0 10px 24px rgba(15, 23, 42, 0.06),\n 0 0 0 1px rgba(248, 250, 252, 0.9);\n}\n\n.item-card.skill {\n border-left-color: #10b981;\n}\n\n.item-card.interaction {\n border-left-color: #f59e0b;\n}\n\n.item-name {\n font-weight: 600;\n font-size: 1.05rem;\n}\n\n.item-desc {\n font-size: 0.9rem;\n color: #6b7280;\n margin-top: 0.25rem;\n}\n\n.item-meta {\n font-size: 0.8rem;\n color: #9ca3af;\n margin-top: 0.5rem;\n}\n\n.item-schema {\n margin-top: 0.75rem;\n font-size: 0.8rem;\n font-family: ui-monospace, monospace;\n background: #f3f4f6;\n padding: 0.75rem;\n border-radius: 6px;\n overflow-x: auto;\n white-space: pre-wrap;\n color: #374151;\n}\n\n.header {\n display: flex;\n align-items: center;\n gap: 1rem;\n margin-bottom: 1.5rem;\n}\n\n.header-icon {\n width: 64px;\n height: 64px;\n}\n\n.header-icon svg {\n width: 100%;\n height: 100%;\n}\n\n.section-header {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 1rem;\n margin-bottom: 0.75rem;\n}\n\n.section-subtitle {\n font-size: 0.8rem;\n color: #6b7280;\n}\n\n.endpoint-url {\n font-size: 0.85rem;\n color: #6b7280;\n margin-top: 0.25rem;\n}\n\n.endpoint-url code {\n background: #f3f4f6;\n padding: 0.125rem 0.375rem;\n border-radius: 4px;\n font-family: ui-monospace, monospace;\n}\n\n.endpoint-box {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n background: #f3f4f6;\n padding: 0.75rem 1rem;\n border-radius: 8px;\n margin-top: 0.5rem;\n}\n\n.endpoint-box code {\n flex: 1;\n font-family: ui-monospace, monospace;\n font-size: 0.875rem;\n color: #1f2937;\n}\n\n.copy-btn {\n background: #e5e7eb;\n border: none;\n padding: 0.5rem;\n border-radius: 6px;\n cursor: pointer;\n color: #6b7280;\n transition: all 0.15s;\n}\n\n.copy-btn:hover {\n background: #d1d5db;\n color: #374151;\n}\n\n.copy-btn svg {\n width: 16px;\n height: 16px;\n}\n\n.badge {\n display: inline-block;\n font-size: 0.75rem;\n padding: 0.125rem 0.5rem;\n border-radius: 9999px;\n background: #f9fafb;\n color: #374151;\n border: 1px solid #e5e7eb;\n margin-right: 0.25rem;\n}\n\n.badge.python { background: #fef3c7; color: #92400e; border-color: #facc15; }\n.badge.typescript { background: #dbeafe; color: #1e40af; border-color: #60a5fa; }\n.badge.javascript { background: #fef9c3; color: #854d0e; border-color: #facc15; }\n\n@media (max-width: 768px) {\n body {\n padding: 1.75rem 1.25rem;\n }\n\n .hero {\n flex-direction: column;\n padding: 1.5rem 1.35rem;\n }\n\n .hero-panel {\n max-width: 100%;\n width: 100%;\n }\n}\n\n@media (prefers-color-scheme: dark) {\n body {\n background:\n radial-gradient(circle at 0 0, rgba(56, 189, 248, 0.18), transparent 55%),\n radial-gradient(circle at 100% 0, rgba(129, 140, 248, 0.25), transparent 55%),\n #020617;\n color: #e5e7eb;\n }\n\n .hero {\n background: linear-gradient(135deg, rgba(15, 23, 42, 0.98), rgba(15, 23, 42, 0.92));\n border: 1px solid rgba(148, 163, 184, 0.45);\n box-shadow:\n 0 24px 60px rgba(15, 23, 42, 0.85),\n 0 0 0 1px rgba(15, 23, 42, 0.75);\n }\n\n .hero-eyebrow {\n color: #9ca3af;\n }\n\n .hero-title {\n color: #f9fafb;\n }\n\n .hero-tagline {\n color: #cbd5f5;\n }\n\n .hero-summary {\n color: #9ca3af;\n }\n\n .hero-summary span {\n background: rgba(15, 23, 42, 0.95);\n border-color: rgba(148, 163, 184, 0.45);\n }\n\n .hero-panel {\n background: radial-gradient(circle at 0 0, rgba(56, 189, 248, 0.16), transparent 70%),\n rgba(15, 23, 42, 0.96);\n border: 1px solid rgba(59, 130, 246, 0.6);\n box-shadow: 0 20px 40px rgba(15, 23, 42, 0.85);\n }\n\n .hero-panel-label {\n color: #93c5fd;\n }\n\n .hero-panel-endpoint {\n background: rgba(15, 23, 42, 0.98);\n border-color: rgba(148, 163, 184, 0.6);\n color: #e5e7eb;\n }\n\n .hero-panel-hint {\n color: #9ca3af;\n }\n\n .hero-panel-hint strong {\n color: #e5e7eb;\n }\n\n .search-input {\n background: rgba(15, 23, 42, 0.96);\n border-color: rgba(55, 65, 81, 0.9);\n color: #e5e7eb;\n box-shadow:\n 0 6px 16px rgba(15, 23, 42, 0.9),\n 0 0 0 1px rgba(15, 23, 42, 0.9);\n }\n\n .search-input::placeholder {\n color: #6b7280;\n }\n\n .search-input:focus {\n border-color: #60a5fa;\n box-shadow:\n 0 0 0 1px rgba(59, 130, 246, 0.7),\n 0 10px 26px rgba(30, 64, 175, 0.7);\n }\n\n .search-hint,\n .search-empty {\n color: #9ca3af;\n }\n\n h1, h2 {\n color: #e5e7eb;\n }\n\n h2 {\n color: #9ca3af;\n }\n\n a {\n color: #60a5fa;\n }\n\n hr {\n border-top-color: rgba(148, 163, 184, 0.4);\n }\n\n .card {\n background: radial-gradient(circle at 0 0, rgba(56, 189, 248, 0.12), transparent 75%),\n rgba(15, 23, 42, 0.9);\n box-shadow:\n 0 14px 30px rgba(15, 23, 42, 0.8),\n 0 0 0 1px rgba(15, 23, 42, 0.85);\n border-color: rgba(148, 163, 184, 0.5);\n }\n\n .card:hover {\n box-shadow:\n 0 18px 40px rgba(15, 23, 42, 0.9),\n 0 0 0 1px rgba(59, 130, 246, 0.8);\n }\n\n .card-title {\n color: #e5e7eb;\n }\n\n .card-desc {\n color: #9ca3af;\n }\n\n .card-meta {\n color: #6b7280;\n }\n\n .item-card {\n background: rgba(15, 23, 42, 0.9);\n box-shadow:\n 0 10px 24px rgba(15, 23, 42, 0.9),\n 0 0 0 1px rgba(15, 23, 42, 0.9);\n }\n\n .item-desc,\n .item-meta {\n color: #9ca3af;\n }\n\n .item-schema {\n background: rgba(15, 23, 42, 0.95);\n color: #e5e7eb;\n }\n\n .endpoint-url {\n color: #9ca3af;\n }\n\n .endpoint-url code {\n background: rgba(15, 23, 42, 0.95);\n }\n\n .endpoint-box {\n background: rgba(31, 41, 55, 0.95);\n }\n\n .endpoint-box code {\n color: #e5e7eb;\n }\n\n .copy-btn {\n background: rgba(55, 65, 81, 0.95);\n color: #e5e7eb;\n }\n\n .copy-btn:hover {\n background: rgba(75, 85, 99, 0.98);\n color: #f9fafb;\n }\n\n .badge {\n background: rgba(15, 23, 42, 0.96);\n color: #e5e7eb;\n border-color: rgba(148, 163, 184, 0.6);\n }\n\n .badge.python {\n background: rgba(252, 211, 77, 0.12);\n color: #facc15;\n border-color: rgba(250, 204, 21, 0.5);\n }\n\n .badge.typescript {\n background: rgba(59, 130, 246, 0.12);\n color: #93c5fd;\n border-color: rgba(59, 130, 246, 0.7);\n }\n\n .badge.javascript {\n background: rgba(251, 191, 36, 0.12);\n color: #fbbf24;\n border-color: rgba(251, 191, 36, 0.55);\n }\n\n .logo-light {\n display: none;\n }\n .logo-dark {\n display: block;\n }\n\n .plugin-link-primary:hover {\n background: #2563eb !important;\n }\n\n .plugin-link-secondary:hover {\n background: #059669 !important;\n }\n}\n\n.plugin-link-primary:hover {\n background: #2563eb;\n}\n\n.plugin-link-secondary:hover {\n background: #059669;\n}\n";
5
5
  //# sourceMappingURL=styles.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/site/styles.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,UAAU,6gZAqnBtB,CAAC"}
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/site/styles.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,UAAU,m9aA4qBtB,CAAC"}
@@ -2,6 +2,7 @@ import type { InteractionCollection } from "../InteractionCollection.js";
2
2
  import { ToolServerConfig } from "../server/types.js";
3
3
  import type { SkillCollection } from "../SkillCollection.js";
4
4
  import type { ToolCollection } from "../ToolCollection.js";
5
+ import type { ContentTypesCollection } from "../ContentTypesCollection.js";
5
6
  import type { ICollection, SkillDefinition, Tool } from "../types.js";
6
7
  type MCPProviderMeta = {
7
8
  name: string;
@@ -51,5 +52,9 @@ export declare function skillCollectionPage(collection: SkillCollection): string
51
52
  * Render an interaction collection detail page
52
53
  */
53
54
  export declare function interactionCollectionPage(collection: InteractionCollection): string;
55
+ /**
56
+ * Render a content type collection detail page
57
+ */
58
+ export declare function contentTypeCollectionPage(collection: ContentTypesCollection): string;
54
59
  export {};
55
60
  //# sourceMappingURL=templates.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../../src/site/templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAItE,KAAK,eAAe,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAiZF;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAQjG;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CASpE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAMjE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CA0DlG;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAWxD;AAsBD;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,GAAG,MAAM,CAsF3F;AAoED;;;;;;GAMG;AACH,wBAAgB,SAAS,CACrB,MAAM,EAAE,gBAAgB,GACzB,MAAM,CA8KR;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,cAAc,GAAG,MAAM,CAsCrE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,eAAe,GAAG,MAAM,CAsCvE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,qBAAqB,GAAG,MAAM,CAgDnF"}
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../../src/site/templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAItE,KAAK,eAAe,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AA0VF;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAQjG;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CASpE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAMjE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CA0DlG;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAWxD;AAsBD;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,GAAG,MAAM,CAsF3F;AAoED;;;;;;GAMG;AACH,wBAAgB,SAAS,CACrB,MAAM,EAAE,gBAAgB,GACzB,MAAM,CAmNR;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,cAAc,GAAG,MAAM,CAsCrE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,eAAe,GAAG,MAAM,CAsCvE;AA4CD;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,qBAAqB,GAAG,MAAM,CAoBnF;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,sBAAsB,GAAG,MAAM,CAqBpF"}
@@ -1,6 +1,6 @@
1
1
  import type { ToolDefinition, ToolUse } from "@llumiverse/common";
2
2
  import { VertesiaClient } from "@vertesia/client";
3
- import { AuthTokenPayload, ToolExecutionMetadata, ToolResult, ToolResultContent } from "@vertesia/common";
3
+ import { AgentToolDefinition, AuthTokenPayload, ProjectConfiguration, ToolExecutionMetadata, ToolResult, ToolResultContent } from "@vertesia/common";
4
4
  export type { ToolExecutionMetadata };
5
5
  export type ICollection<T = any> = CollectionProperties & Iterable<T>;
6
6
  export interface CollectionProperties {
@@ -77,6 +77,14 @@ export interface ToolExecutionPayload<ParamsT extends Record<string, any>> {
77
77
  metadata?: ToolExecutionMetadata;
78
78
  }
79
79
  export type ToolFn<ParamsT extends Record<string, any>> = (payload: ToolExecutionPayload<ParamsT>, context: ToolExecutionContext) => Promise<ToolExecutionResult>;
80
+ export interface ToolUseContext {
81
+ project_id?: string;
82
+ account_id?: string;
83
+ project_name?: string;
84
+ project_ns?: string;
85
+ configuration?: ProjectConfiguration;
86
+ vars?: Record<string, any>;
87
+ }
80
88
  export interface Tool<ParamsT extends Record<string, any>> extends ToolDefinition {
81
89
  run: ToolFn<ParamsT>;
82
90
  /**
@@ -85,22 +93,14 @@ export interface Tool<ParamsT extends Record<string, any>> extends ToolDefinitio
85
93
  * - false: Tool is only available when activated by a skill's related_tools
86
94
  */
87
95
  default?: boolean;
88
- }
89
- /**
90
- * Tool definition with optional activation control for agent exposure.
91
- */
92
- export interface ToolDefinitionWithDefault extends ToolDefinition {
93
96
  /**
94
- * Whether this tool is available by default.
95
- * - true/undefined: Tool is always available to agents
96
- * - false: Tool is only available when activated by a skill's related_tools
97
+ * Optional filter to check if the tool is enabled for the given project configuration.
98
+ * This can be used to dynamically enable/disable tools based on project settings, environment variables, or any other logic.
99
+ * If no filter is provided, the tool will be enabled by default.
100
+ * @param payload
101
+ * @returns
97
102
  */
98
- default?: boolean;
99
- /**
100
- * For skill tools (learn_*): list of related tool names that become available
101
- * when this skill is called. Used for dynamic tool discovery.
102
- */
103
- related_tools?: string[];
103
+ isEnabled?: (payload: ToolUseContext) => boolean;
104
104
  }
105
105
  /**
106
106
  * The interface that should be returned when requesting a collection endpoint using a GET
@@ -109,7 +109,7 @@ export interface ToolCollectionDefinition {
109
109
  title: string;
110
110
  description: string;
111
111
  src: string;
112
- tools: ToolDefinitionWithDefault[];
112
+ tools: AgentToolDefinition[];
113
113
  }
114
114
  export type { ToolDefinition };
115
115
  /**
@@ -129,6 +129,11 @@ export interface MCPConnectionDetails {
129
129
  * If an empty string no authentication will be done
130
130
  */
131
131
  token: string;
132
+ /**
133
+ * Optional additional HTTP headers to include with requests to the MCP server.
134
+ * Merged with the Authorization header derived from the token.
135
+ */
136
+ headers?: Record<string, string>;
132
137
  }
133
138
  /**
134
139
  * Content type for skill instructions
@@ -229,6 +234,14 @@ export interface SkillDefinition {
229
234
  * The widget file must be located in the skill directory under the name {{widget-name}}.tsx.
230
235
  */
231
236
  widgets?: string[];
237
+ /**
238
+ * Optional filter to check if the tool is enabled for the given project configuration.
239
+ * This can be used to dynamically enable/disable tools based on project settings, environment variables, or any other logic.
240
+ * If no filter is provided, the tool will be enabled by default.
241
+ * @param payload
242
+ * @returns
243
+ */
244
+ isEnabled?: (payload: ToolUseContext) => boolean;
232
245
  }
233
246
  /**
234
247
  * Skill execution payload
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,9 @@
1
+ /**
2
+ * Convert a name to a URL-safe path segment.
3
+ * If the name contains spaces or underscores, convert to PascalCase.
4
+ * Otherwise return as-is. Any characters not in [a-zA-Z0-9$_\-@] are replaced with '-'.
5
+ */
6
+ export declare function toPathName(name: string): string;
1
7
  export declare function kebabCaseToTitle(name: string): string;
2
8
  export declare function makeScriptUrl(origin: string, script: string): string;
3
9
  export declare function join(left: string, right: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,UAE5C;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,UAE3D;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UAc/C"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM/C;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,UAE5C;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,UAE3D;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,UAc/C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vertesia/tools-sdk",
3
- "version": "1.0.0-dev.20260128.144200",
3
+ "version": "1.0.0-dev.20260225.024852Z",
4
4
  "description": "Tools SDK - utilities for building remote tools",
5
5
  "type": "module",
6
6
  "types": "./lib/types/index.d.ts",
@@ -27,14 +27,14 @@
27
27
  "outDir": "lib"
28
28
  },
29
29
  "peerDependencies": {
30
- "hono": "^4.11.4"
30
+ "hono": "^4.11.7"
31
31
  },
32
32
  "dependencies": {
33
33
  "jose": "^6.0.11",
34
34
  "zod": "^4.3.5",
35
- "@llumiverse/common": "1.0.0-dev.20260128.144200",
36
- "@vertesia/client": "1.0.0-dev.20260128.144200",
37
- "@vertesia/common": "1.0.0-dev.20260128.144200"
35
+ "@vertesia/client": "1.0.0-dev.20260225.024852Z",
36
+ "@llumiverse/common": "1.0.0-dev.20260224.234313Z",
37
+ "@vertesia/common": "1.0.0-dev.20260225.024852Z"
38
38
  },
39
39
  "repository": {
40
40
  "type": "git",
@@ -0,0 +1,51 @@
1
+ import { InCodeTypeSpec } from "@vertesia/common";
2
+ import { CollectionProperties, ICollection } from "./types.js";
3
+ import { kebabCaseToTitle } from "./utils.js";
4
+
5
+ export interface ContentTypesCollectionProps extends CollectionProperties {
6
+ types: InCodeTypeSpec[];
7
+ }
8
+ export class ContentTypesCollection implements ICollection<InCodeTypeSpec> {
9
+ types: InCodeTypeSpec[];
10
+ name: string;
11
+ title?: string;
12
+ icon?: string;
13
+ description?: string;
14
+ constructor({
15
+ name, title, icon, description, types
16
+ }: ContentTypesCollectionProps) {
17
+ this.name = name;
18
+ this.title = title || kebabCaseToTitle(name);
19
+ this.icon = icon;
20
+ this.description = description;
21
+ this.types = types;
22
+ }
23
+
24
+ getContentTypes() {
25
+ return this.types;
26
+ }
27
+
28
+ [Symbol.iterator](): Iterator<InCodeTypeSpec> {
29
+ let index = 0;
30
+ const types = this.types;
31
+
32
+ return {
33
+ next(): IteratorResult<InCodeTypeSpec> {
34
+ if (index < types.length) {
35
+ return { value: types[index++], done: false };
36
+ } else {
37
+ return { done: true, value: undefined };
38
+ }
39
+ }
40
+ };
41
+ }
42
+
43
+ map<U>(callback: (type: InCodeTypeSpec, index: number) => U): U[] {
44
+ return this.types.map(callback);
45
+ }
46
+
47
+ getTypeByName(name: string): InCodeTypeSpec | undefined {
48
+ return this.types.find(type => type.name === name);
49
+ }
50
+
51
+ }
@@ -1,8 +1,5 @@
1
- import { readdirSync, statSync, existsSync, readFileSync } from "fs";
2
- import { join } from "path";
3
- import { pathToFileURL } from "url";
4
1
  import { InteractionSpec } from "@vertesia/common";
5
- import { ICollection, CollectionProperties } from "./types.js";
2
+ import { CollectionProperties, ICollection } from "./types.js";
6
3
  import { kebabCaseToTitle } from "./utils.js";
7
4
 
8
5
  export interface InteractionCollectionProps extends CollectionProperties {
@@ -23,9 +20,6 @@ export class InteractionCollection implements ICollection<InteractionSpec> {
23
20
  this.description = description;
24
21
  this.interactions = interactions;
25
22
  }
26
- addInteraction(interaction: any) {
27
- this.interactions.push(interaction);
28
- }
29
23
 
30
24
  getInteractions() {
31
25
  return this.interactions;
@@ -54,90 +48,3 @@ export class InteractionCollection implements ICollection<InteractionSpec> {
54
48
  return this.interactions.find(interaction => interaction.name === name);
55
49
  }
56
50
  }
57
-
58
- /**
59
- * Load all interactions from a directory.
60
- * Scans for subdirectories containing index.ts/index.js files.
61
- *
62
- * Directory structure:
63
- * ```
64
- * interactions/
65
- * nagare/
66
- * extract-fund-actuals/
67
- * index.ts # exports default InteractionSpec
68
- * prompt.jst # prompt template (read via readPromptFile helper)
69
- * parse-fund-document/
70
- * index.ts
71
- * prompt.md
72
- * ```
73
- *
74
- * @param interactionsDir - Path to the interactions collection directory
75
- * @returns Promise resolving to array of InteractionSpec objects
76
- */
77
- export async function loadInteractionsFromDirectory(interactionsDir: string): Promise<InteractionSpec[]> {
78
- const interactions: InteractionSpec[] = [];
79
-
80
- if (!existsSync(interactionsDir)) {
81
- console.warn(`Interactions directory not found: ${interactionsDir}`);
82
- return interactions;
83
- }
84
-
85
- let entries: string[];
86
- try {
87
- entries = readdirSync(interactionsDir);
88
- } catch {
89
- console.warn(`Could not read interactions directory: ${interactionsDir}`);
90
- return interactions;
91
- }
92
-
93
- for (const entry of entries) {
94
- // Skip hidden files and index files
95
- if (entry.startsWith('.')) continue;
96
- if (entry === 'index.ts' || entry === 'index.js') continue;
97
-
98
- const entryPath = join(interactionsDir, entry);
99
-
100
- try {
101
- const stat = statSync(entryPath);
102
- if (!stat.isDirectory()) continue;
103
-
104
- // Look for index.ts or index.js in the subdirectory
105
- const indexTs = join(entryPath, 'index.ts');
106
- const indexJs = join(entryPath, 'index.js');
107
- const indexPath = existsSync(indexTs) ? indexTs : existsSync(indexJs) ? indexJs : null;
108
-
109
- if (!indexPath) {
110
- continue; // No index file, skip
111
- }
112
-
113
- // Dynamic import
114
- const fileUrl = pathToFileURL(indexPath).href;
115
- const module = await import(fileUrl);
116
-
117
- const interaction = module.default || module.interaction;
118
-
119
- if (interaction && typeof interaction.name === 'string') {
120
- interactions.push(interaction);
121
- } else {
122
- console.warn(`No valid InteractionSpec export found in ${entry}/index`);
123
- }
124
- } catch (err) {
125
- console.warn(`Error loading interaction from ${entry}:`, err);
126
- }
127
- }
128
-
129
- return interactions;
130
- }
131
-
132
- /**
133
- * Helper to read a prompt file from the same directory as the interaction.
134
- * Use this in interaction index.ts files to load prompt templates.
135
- *
136
- * @param dirname - Pass __dirname or dirname(fileURLToPath(import.meta.url))
137
- * @param filename - Prompt filename (e.g., 'prompt.jst' or 'prompt.md')
138
- * @returns File contents as string
139
- */
140
- export function readPromptFile(dirname: string, filename: string): string {
141
- const filePath = join(dirname, filename);
142
- return readFileSync(filePath, 'utf-8');
143
- }
@@ -11,11 +11,12 @@ import type {
11
11
  SkillDefinition,
12
12
  SkillExecutionResult,
13
13
  ToolCollectionDefinition,
14
- ToolDefinitionWithDefault,
15
14
  ToolExecutionPayload,
16
15
  ToolExecutionResult,
16
+ ToolUseContext,
17
17
  } from "./types.js";
18
18
  import { kebabCaseToTitle } from "./utils.js";
19
+ import { AgentToolDefinition } from "@vertesia/common";
19
20
 
20
21
  export interface SkillCollectionProperties extends CollectionProperties {
21
22
  /**
@@ -87,7 +88,7 @@ export class SkillCollection implements ICollection<SkillDefinition> {
87
88
  * When called, they return rendered instructions.
88
89
  * Includes related_tools for dynamic tool discovery.
89
90
  */
90
- getToolDefinitions(): ToolDefinitionWithDefault[] {
91
+ getToolDefinitions(filterContext?: ToolUseContext): AgentToolDefinition[] {
91
92
  const defaultSchema: ToolDefinition['input_schema'] = {
92
93
  type: 'object',
93
94
  properties: {
@@ -98,7 +99,14 @@ export class SkillCollection implements ICollection<SkillDefinition> {
98
99
  }
99
100
  };
100
101
 
101
- return Array.from(this.skills.values()).map(skill => {
102
+ let skills = Array.from(this.skills.values());
103
+ if (filterContext) {
104
+ skills = skills.filter(skill => {
105
+ return skill.isEnabled ? skill.isEnabled(filterContext) : true;
106
+ });
107
+ }
108
+
109
+ return skills.map(skill => {
102
110
  // Build description with related tools info if available
103
111
  let description = `[Skill] ${skill.description}. Returns contextual instructions for this task.`;
104
112
  if (skill.related_tools && skill.related_tools.length > 0) {
@@ -106,10 +114,12 @@ export class SkillCollection implements ICollection<SkillDefinition> {
106
114
  }
107
115
 
108
116
  return {
117
+ url: `skills/${this.name}`,
109
118
  name: `learn_${skill.name}`,
110
119
  description,
111
120
  input_schema: skill.input_schema || defaultSchema,
112
121
  related_tools: skill.related_tools,
122
+ category: this.name,
113
123
  };
114
124
  });
115
125
  }
@@ -1,12 +1,13 @@
1
- import { readdirSync, statSync, existsSync } from "fs";
2
- import { join } from "path";
3
- import { pathToFileURL } from "url";
1
+ import { AgentToolDefinition } from "@vertesia/common";
2
+ import { existsSync, readdirSync, statSync } from "fs";
4
3
  import { Context } from "hono";
5
4
  import { HTTPException } from "hono/http-exception";
5
+ import { join } from "path";
6
+ import { pathToFileURL } from "url";
6
7
  import { authorize } from "./auth.js";
7
- import { ToolFilterOptions, ToolRegistry } from "./ToolRegistry.js";
8
8
  import { ToolContext } from "./server/types.js";
9
- import type { CollectionProperties, ICollection, Tool, ToolDefinitionWithDefault, ToolExecutionPayload, ToolExecutionResponse, ToolExecutionResponseError } from "./types.js";
9
+ import { ToolRegistry } from "./ToolRegistry.js";
10
+ import type { CollectionProperties, ICollection, Tool, ToolExecutionPayload, ToolExecutionResponse, ToolExecutionResponseError, ToolUseContext } from "./types.js";
10
11
  import { kebabCaseToTitle } from "./utils.js";
11
12
 
12
13
  export interface ToolCollectionProperties extends CollectionProperties {
@@ -52,7 +53,8 @@ export class ToolCollection implements ICollection<Tool<any>> {
52
53
  this.title = title || kebabCaseToTitle(name);
53
54
  this.icon = icon;
54
55
  this.description = description;
55
- this.tools = new ToolRegistry(tools);
56
+ // we add the collection name info
57
+ this.tools = new ToolRegistry(name, tools);
56
58
  }
57
59
 
58
60
  [Symbol.iterator](): Iterator<Tool<any>> {
@@ -123,20 +125,11 @@ export class ToolCollection implements ICollection<Tool<any>> {
123
125
 
124
126
  /**
125
127
  * Get tool definitions with optional filtering.
126
- * @param options - Filtering options for default/unlocked tools
128
+ * @param options - context for filtering
127
129
  * @returns Filtered tool definitions
128
130
  */
129
- getToolDefinitions(options?: ToolFilterOptions): ToolDefinitionWithDefault[] {
130
- return this.tools.getDefinitions(options);
131
- }
132
-
133
- /**
134
- * Get tools that are in reserve (default: false and not unlocked).
135
- * @param unlockedTools - List of tool names that are unlocked
136
- * @returns Tool definitions for reserve tools
137
- */
138
- getReserveTools(unlockedTools: string[] = []): ToolDefinitionWithDefault[] {
139
- return this.tools.getReserveTools(unlockedTools);
131
+ getToolDefinitions(context?: ToolUseContext): AgentToolDefinition[] {
132
+ return this.tools.getDefinitions(context);
140
133
  }
141
134
 
142
135
  }