@dexto/server 1.2.5

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 (174) hide show
  1. package/LICENSE +44 -0
  2. package/dist/a2a/adapters/index.cjs +42 -0
  3. package/dist/a2a/adapters/index.d.ts +10 -0
  4. package/dist/a2a/adapters/index.d.ts.map +1 -0
  5. package/dist/a2a/adapters/index.js +12 -0
  6. package/dist/a2a/adapters/message.cjs +193 -0
  7. package/dist/a2a/adapters/message.d.ts +50 -0
  8. package/dist/a2a/adapters/message.d.ts.map +1 -0
  9. package/dist/a2a/adapters/message.js +167 -0
  10. package/dist/a2a/adapters/state.cjs +57 -0
  11. package/dist/a2a/adapters/state.d.ts +36 -0
  12. package/dist/a2a/adapters/state.d.ts.map +1 -0
  13. package/dist/a2a/adapters/state.js +32 -0
  14. package/dist/a2a/adapters/task-view.cjs +85 -0
  15. package/dist/a2a/adapters/task-view.d.ts +58 -0
  16. package/dist/a2a/adapters/task-view.d.ts.map +1 -0
  17. package/dist/a2a/adapters/task-view.js +60 -0
  18. package/dist/a2a/index.cjs +51 -0
  19. package/dist/a2a/index.d.ts +15 -0
  20. package/dist/a2a/index.d.ts.map +1 -0
  21. package/dist/a2a/index.js +30 -0
  22. package/dist/a2a/jsonrpc/index.cjs +38 -0
  23. package/dist/a2a/jsonrpc/index.d.ts +11 -0
  24. package/dist/a2a/jsonrpc/index.d.ts.map +1 -0
  25. package/dist/a2a/jsonrpc/index.js +10 -0
  26. package/dist/a2a/jsonrpc/methods.cjs +183 -0
  27. package/dist/a2a/jsonrpc/methods.d.ts +110 -0
  28. package/dist/a2a/jsonrpc/methods.d.ts.map +1 -0
  29. package/dist/a2a/jsonrpc/methods.js +159 -0
  30. package/dist/a2a/jsonrpc/server.cjs +199 -0
  31. package/dist/a2a/jsonrpc/server.d.ts +100 -0
  32. package/dist/a2a/jsonrpc/server.d.ts.map +1 -0
  33. package/dist/a2a/jsonrpc/server.js +175 -0
  34. package/dist/a2a/jsonrpc/types.cjs +47 -0
  35. package/dist/a2a/jsonrpc/types.d.ts +91 -0
  36. package/dist/a2a/jsonrpc/types.d.ts.map +1 -0
  37. package/dist/a2a/jsonrpc/types.js +21 -0
  38. package/dist/a2a/types.cjs +16 -0
  39. package/dist/a2a/types.d.ts +250 -0
  40. package/dist/a2a/types.d.ts.map +1 -0
  41. package/dist/a2a/types.js +0 -0
  42. package/dist/approval/approval-coordinator.cjs +87 -0
  43. package/dist/approval/approval-coordinator.d.ts +52 -0
  44. package/dist/approval/approval-coordinator.d.ts.map +1 -0
  45. package/dist/approval/approval-coordinator.js +63 -0
  46. package/dist/approval/manual-approval-handler.cjs +100 -0
  47. package/dist/approval/manual-approval-handler.d.ts +32 -0
  48. package/dist/approval/manual-approval-handler.d.ts.map +1 -0
  49. package/dist/approval/manual-approval-handler.js +76 -0
  50. package/dist/events/a2a-sse-subscriber.cjs +271 -0
  51. package/dist/events/a2a-sse-subscriber.d.ts +94 -0
  52. package/dist/events/a2a-sse-subscriber.d.ts.map +1 -0
  53. package/dist/events/a2a-sse-subscriber.js +247 -0
  54. package/dist/events/types.cjs +16 -0
  55. package/dist/events/types.d.ts +15 -0
  56. package/dist/events/types.d.ts.map +1 -0
  57. package/dist/events/types.js +0 -0
  58. package/dist/events/webhook-subscriber.cjs +301 -0
  59. package/dist/events/webhook-subscriber.d.ts +64 -0
  60. package/dist/events/webhook-subscriber.d.ts.map +1 -0
  61. package/dist/events/webhook-subscriber.js +269 -0
  62. package/dist/events/webhook-types.cjs +16 -0
  63. package/dist/events/webhook-types.d.ts +91 -0
  64. package/dist/events/webhook-types.d.ts.map +1 -0
  65. package/dist/events/webhook-types.js +0 -0
  66. package/dist/hono/__tests__/test-fixtures.cjs +236 -0
  67. package/dist/hono/__tests__/test-fixtures.d.ts +65 -0
  68. package/dist/hono/__tests__/test-fixtures.d.ts.map +1 -0
  69. package/dist/hono/__tests__/test-fixtures.js +197 -0
  70. package/dist/hono/index.cjs +166 -0
  71. package/dist/hono/index.d.ts +2783 -0
  72. package/dist/hono/index.d.ts.map +1 -0
  73. package/dist/hono/index.js +141 -0
  74. package/dist/hono/middleware/auth.cjs +75 -0
  75. package/dist/hono/middleware/auth.d.ts +3 -0
  76. package/dist/hono/middleware/auth.d.ts.map +1 -0
  77. package/dist/hono/middleware/auth.js +51 -0
  78. package/dist/hono/middleware/cors.cjs +57 -0
  79. package/dist/hono/middleware/cors.d.ts +9 -0
  80. package/dist/hono/middleware/cors.d.ts.map +1 -0
  81. package/dist/hono/middleware/cors.js +33 -0
  82. package/dist/hono/middleware/error.cjs +131 -0
  83. package/dist/hono/middleware/error.d.ts +5 -0
  84. package/dist/hono/middleware/error.d.ts.map +1 -0
  85. package/dist/hono/middleware/error.js +105 -0
  86. package/dist/hono/middleware/redaction.cjs +45 -0
  87. package/dist/hono/middleware/redaction.d.ts +4 -0
  88. package/dist/hono/middleware/redaction.d.ts.map +1 -0
  89. package/dist/hono/middleware/redaction.js +20 -0
  90. package/dist/hono/node/index.cjs +139 -0
  91. package/dist/hono/node/index.d.ts +19 -0
  92. package/dist/hono/node/index.d.ts.map +1 -0
  93. package/dist/hono/node/index.js +115 -0
  94. package/dist/hono/routes/a2a-jsonrpc.cjs +119 -0
  95. package/dist/hono/routes/a2a-jsonrpc.d.ts +46 -0
  96. package/dist/hono/routes/a2a-jsonrpc.d.ts.map +1 -0
  97. package/dist/hono/routes/a2a-jsonrpc.js +95 -0
  98. package/dist/hono/routes/a2a-tasks.cjs +315 -0
  99. package/dist/hono/routes/a2a-tasks.d.ts +530 -0
  100. package/dist/hono/routes/a2a-tasks.d.ts.map +1 -0
  101. package/dist/hono/routes/a2a-tasks.js +291 -0
  102. package/dist/hono/routes/a2a.cjs +36 -0
  103. package/dist/hono/routes/a2a.d.ts +4 -0
  104. package/dist/hono/routes/a2a.d.ts.map +1 -0
  105. package/dist/hono/routes/a2a.js +12 -0
  106. package/dist/hono/routes/agents.cjs +735 -0
  107. package/dist/hono/routes/agents.d.ts +650 -0
  108. package/dist/hono/routes/agents.d.ts.map +1 -0
  109. package/dist/hono/routes/agents.js +711 -0
  110. package/dist/hono/routes/approvals.cjs +125 -0
  111. package/dist/hono/routes/approvals.d.ts +89 -0
  112. package/dist/hono/routes/approvals.d.ts.map +1 -0
  113. package/dist/hono/routes/approvals.js +101 -0
  114. package/dist/hono/routes/greeting.cjs +60 -0
  115. package/dist/hono/routes/greeting.d.ts +19 -0
  116. package/dist/hono/routes/greeting.d.ts.map +1 -0
  117. package/dist/hono/routes/greeting.js +36 -0
  118. package/dist/hono/routes/health.cjs +45 -0
  119. package/dist/hono/routes/health.d.ts +17 -0
  120. package/dist/hono/routes/health.d.ts.map +1 -0
  121. package/dist/hono/routes/health.js +21 -0
  122. package/dist/hono/routes/llm.cjs +298 -0
  123. package/dist/hono/routes/llm.d.ts +294 -0
  124. package/dist/hono/routes/llm.d.ts.map +1 -0
  125. package/dist/hono/routes/llm.js +287 -0
  126. package/dist/hono/routes/mcp.cjs +356 -0
  127. package/dist/hono/routes/mcp.d.ts +246 -0
  128. package/dist/hono/routes/mcp.d.ts.map +1 -0
  129. package/dist/hono/routes/mcp.js +332 -0
  130. package/dist/hono/routes/memory.cjs +192 -0
  131. package/dist/hono/routes/memory.d.ts +146 -0
  132. package/dist/hono/routes/memory.d.ts.map +1 -0
  133. package/dist/hono/routes/memory.js +168 -0
  134. package/dist/hono/routes/messages.cjs +320 -0
  135. package/dist/hono/routes/messages.d.ts +163 -0
  136. package/dist/hono/routes/messages.d.ts.map +1 -0
  137. package/dist/hono/routes/messages.js +296 -0
  138. package/dist/hono/routes/prompts.cjs +228 -0
  139. package/dist/hono/routes/prompts.d.ts +150 -0
  140. package/dist/hono/routes/prompts.d.ts.map +1 -0
  141. package/dist/hono/routes/prompts.js +204 -0
  142. package/dist/hono/routes/resources.cjs +110 -0
  143. package/dist/hono/routes/resources.d.ts +76 -0
  144. package/dist/hono/routes/resources.d.ts.map +1 -0
  145. package/dist/hono/routes/resources.js +86 -0
  146. package/dist/hono/routes/search.cjs +109 -0
  147. package/dist/hono/routes/search.d.ts +137 -0
  148. package/dist/hono/routes/search.d.ts.map +1 -0
  149. package/dist/hono/routes/search.js +85 -0
  150. package/dist/hono/routes/sessions.cjs +366 -0
  151. package/dist/hono/routes/sessions.d.ts +229 -0
  152. package/dist/hono/routes/sessions.d.ts.map +1 -0
  153. package/dist/hono/routes/sessions.js +342 -0
  154. package/dist/hono/routes/webhooks.cjs +228 -0
  155. package/dist/hono/routes/webhooks.d.ts +127 -0
  156. package/dist/hono/routes/webhooks.d.ts.map +1 -0
  157. package/dist/hono/routes/webhooks.js +204 -0
  158. package/dist/hono/schemas/responses.cjs +276 -0
  159. package/dist/hono/schemas/responses.d.ts +1418 -0
  160. package/dist/hono/schemas/responses.d.ts.map +1 -0
  161. package/dist/hono/schemas/responses.js +227 -0
  162. package/dist/hono/types.cjs +16 -0
  163. package/dist/hono/types.d.ts +6 -0
  164. package/dist/hono/types.d.ts.map +1 -0
  165. package/dist/hono/types.js +0 -0
  166. package/dist/index.cjs +38 -0
  167. package/dist/index.d.ts +11 -0
  168. package/dist/index.d.ts.map +1 -0
  169. package/dist/index.js +9 -0
  170. package/dist/mcp/mcp-handler.cjs +145 -0
  171. package/dist/mcp/mcp-handler.d.ts +14 -0
  172. package/dist/mcp/mcp-handler.d.ts.map +1 -0
  173. package/dist/mcp/mcp-handler.js +118 -0
  174. package/package.json +59 -0
@@ -0,0 +1,298 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var llm_exports = {};
20
+ __export(llm_exports, {
21
+ createLlmRouter: () => createLlmRouter
22
+ });
23
+ module.exports = __toCommonJS(llm_exports);
24
+ var import_zod_openapi = require("@hono/zod-openapi");
25
+ var import_core = require("@dexto/core");
26
+ var import_agent_management = require("@dexto/agent-management");
27
+ var import_responses = require("../schemas/responses.js");
28
+ const CurrentQuerySchema = import_zod_openapi.z.object({
29
+ sessionId: import_zod_openapi.z.string().optional().describe("Session identifier to retrieve session-specific LLM configuration")
30
+ }).describe("Query parameters for getting current LLM configuration");
31
+ const CatalogQuerySchema = import_zod_openapi.z.object({
32
+ provider: import_zod_openapi.z.union([import_zod_openapi.z.string(), import_zod_openapi.z.array(import_zod_openapi.z.string())]).optional().transform(
33
+ (value) => Array.isArray(value) ? value : value ? value.split(",") : void 0
34
+ ).describe("Comma-separated list of LLM providers to filter by"),
35
+ hasKey: import_zod_openapi.z.union([import_zod_openapi.z.literal("true"), import_zod_openapi.z.literal("false"), import_zod_openapi.z.literal("1"), import_zod_openapi.z.literal("0")]).optional().transform(
36
+ (raw) => raw === "true" || raw === "1" ? true : raw === "false" || raw === "0" ? false : void 0
37
+ ).describe("Filter by API key presence (true or false)"),
38
+ router: import_zod_openapi.z.enum(import_core.LLM_ROUTERS).optional().describe("Filter by router type (vercel or in-built)"),
39
+ fileType: import_zod_openapi.z.enum(import_core.SUPPORTED_FILE_TYPES).optional().describe("Filter by supported file type (audio, pdf, or image)"),
40
+ defaultOnly: import_zod_openapi.z.union([import_zod_openapi.z.literal("true"), import_zod_openapi.z.literal("false"), import_zod_openapi.z.literal("1"), import_zod_openapi.z.literal("0")]).optional().transform(
41
+ (raw) => raw === "true" || raw === "1" ? true : raw === "false" || raw === "0" ? false : void 0
42
+ ).describe("Include only default models (true or false)"),
43
+ mode: import_zod_openapi.z.enum(["grouped", "flat"]).default("grouped").describe("Response format mode (grouped by provider or flat list)")
44
+ }).describe("Query parameters for filtering and formatting the LLM catalog");
45
+ const SaveKeySchema = import_zod_openapi.z.object({
46
+ provider: import_zod_openapi.z.enum(import_core.LLM_PROVIDERS).describe("LLM provider identifier (e.g., openai, anthropic)"),
47
+ apiKey: import_zod_openapi.z.string().min(1, "API key is required").describe("API key for the provider (writeOnly - never returned in responses)").openapi({ writeOnly: true })
48
+ }).describe("Request body for saving a provider API key");
49
+ const SwitchLLMBodySchema = import_core.LLMUpdatesSchema.and(
50
+ import_zod_openapi.z.object({
51
+ sessionId: import_zod_openapi.z.string().optional().describe("Session identifier for session-specific LLM configuration")
52
+ })
53
+ ).describe("LLM switch request body with optional session ID and LLM fields");
54
+ function createLlmRouter(getAgent) {
55
+ const app = new import_zod_openapi.OpenAPIHono();
56
+ const currentRoute = (0, import_zod_openapi.createRoute)({
57
+ method: "get",
58
+ path: "/llm/current",
59
+ summary: "Get Current LLM Config",
60
+ description: "Retrieves the current LLM configuration for the agent or a specific session",
61
+ tags: ["llm"],
62
+ request: { query: CurrentQuerySchema },
63
+ responses: {
64
+ 200: {
65
+ description: "Current LLM config",
66
+ content: {
67
+ "application/json": {
68
+ schema: import_zod_openapi.z.object({
69
+ config: import_responses.LLMConfigResponseSchema.partial({
70
+ maxIterations: true,
71
+ router: true
72
+ }).extend({
73
+ displayName: import_zod_openapi.z.string().optional().describe("Human-readable model display name")
74
+ })
75
+ }).describe("Response containing current LLM configuration")
76
+ }
77
+ }
78
+ }
79
+ }
80
+ });
81
+ const catalogRoute = (0, import_zod_openapi.createRoute)({
82
+ method: "get",
83
+ path: "/llm/catalog",
84
+ summary: "LLM Catalog",
85
+ description: "Providers, models, capabilities, and API key status",
86
+ tags: ["llm"],
87
+ request: { query: CatalogQuerySchema },
88
+ responses: {
89
+ 200: {
90
+ description: "LLM catalog",
91
+ content: {
92
+ "application/json": {
93
+ schema: import_zod_openapi.z.union([
94
+ import_zod_openapi.z.object({
95
+ providers: import_zod_openapi.z.record(import_zod_openapi.z.enum(import_core.LLM_PROVIDERS), import_responses.ProviderCatalogSchema).describe(
96
+ "Providers grouped by ID with their models and capabilities"
97
+ )
98
+ }).strict().describe("Grouped catalog response (mode=grouped)"),
99
+ import_zod_openapi.z.object({
100
+ models: import_zod_openapi.z.array(import_responses.ModelFlatSchema).describe(
101
+ "Flat list of all models with provider information"
102
+ )
103
+ }).strict().describe("Flat catalog response (mode=flat)")
104
+ ]).describe(
105
+ "LLM catalog in grouped or flat format based on mode query parameter"
106
+ )
107
+ }
108
+ }
109
+ }
110
+ }
111
+ });
112
+ const saveKeyRoute = (0, import_zod_openapi.createRoute)({
113
+ method: "post",
114
+ path: "/llm/key",
115
+ summary: "Save Provider API Key",
116
+ description: "Stores an API key for a provider in .env and makes it available immediately",
117
+ tags: ["llm"],
118
+ request: { body: { content: { "application/json": { schema: SaveKeySchema } } } },
119
+ responses: {
120
+ 200: {
121
+ description: "API key saved",
122
+ content: {
123
+ "application/json": {
124
+ schema: import_zod_openapi.z.object({
125
+ ok: import_zod_openapi.z.literal(true).describe("Operation success indicator"),
126
+ provider: import_zod_openapi.z.enum(import_core.LLM_PROVIDERS).describe("Provider for which the key was saved"),
127
+ envVar: import_zod_openapi.z.string().describe("Environment variable name where key was stored")
128
+ }).strict().describe("API key save response")
129
+ }
130
+ }
131
+ }
132
+ }
133
+ });
134
+ const switchRoute = (0, import_zod_openapi.createRoute)({
135
+ method: "post",
136
+ path: "/llm/switch",
137
+ summary: "Switch LLM",
138
+ description: "Switches the LLM configuration for the agent or a specific session",
139
+ tags: ["llm"],
140
+ request: {
141
+ body: {
142
+ content: {
143
+ "application/json": {
144
+ schema: SwitchLLMBodySchema
145
+ }
146
+ }
147
+ }
148
+ },
149
+ responses: {
150
+ 200: {
151
+ description: "LLM switch result",
152
+ content: {
153
+ "application/json": {
154
+ schema: import_zod_openapi.z.object({
155
+ config: import_responses.LLMConfigResponseSchema.describe(
156
+ "New LLM configuration with all defaults applied (apiKey omitted)"
157
+ ),
158
+ sessionId: import_zod_openapi.z.string().optional().describe("Session ID if session-specific switch")
159
+ }).describe("LLM switch result")
160
+ }
161
+ }
162
+ }
163
+ }
164
+ });
165
+ return app.openapi(currentRoute, (ctx) => {
166
+ const agent = getAgent();
167
+ const { sessionId } = ctx.req.valid("query");
168
+ const currentConfig = sessionId ? agent.getEffectiveConfig(sessionId).llm : agent.getCurrentLLMConfig();
169
+ let displayName;
170
+ try {
171
+ const model = import_core.LLM_REGISTRY[currentConfig.provider]?.models.find(
172
+ (m) => m.name.toLowerCase() === String(currentConfig.model).toLowerCase()
173
+ );
174
+ displayName = model?.displayName || void 0;
175
+ } catch {
176
+ }
177
+ const { apiKey, ...configWithoutKey } = currentConfig;
178
+ return ctx.json({
179
+ config: {
180
+ ...configWithoutKey,
181
+ hasApiKey: !!apiKey,
182
+ ...displayName && { displayName }
183
+ }
184
+ });
185
+ }).openapi(catalogRoute, (ctx) => {
186
+ const queryParams = ctx.req.valid("query");
187
+ const providers = {};
188
+ for (const provider of import_core.LLM_PROVIDERS) {
189
+ const info = import_core.LLM_REGISTRY[provider];
190
+ const displayName = provider.charAt(0).toUpperCase() + provider.slice(1);
191
+ const keyStatus = (0, import_agent_management.getProviderKeyStatus)(provider);
192
+ providers[provider] = {
193
+ name: displayName,
194
+ hasApiKey: keyStatus.hasApiKey,
195
+ primaryEnvVar: keyStatus.envVar,
196
+ supportedRouters: (0, import_core.getSupportedRoutersForProvider)(provider),
197
+ supportsBaseURL: (0, import_core.supportsBaseURL)(provider),
198
+ models: info.models,
199
+ supportedFileTypes: info.supportedFileTypes
200
+ };
201
+ }
202
+ let filtered = { ...providers };
203
+ if (queryParams.provider && queryParams.provider.length > 0) {
204
+ const allowed = new Set(
205
+ queryParams.provider.filter(
206
+ (p) => import_core.LLM_PROVIDERS.includes(p)
207
+ )
208
+ );
209
+ const filteredByProvider = {};
210
+ for (const [id, catalog] of Object.entries(filtered)) {
211
+ if (allowed.has(id)) {
212
+ filteredByProvider[id] = catalog;
213
+ }
214
+ }
215
+ filtered = filteredByProvider;
216
+ }
217
+ if (typeof queryParams.hasKey === "boolean") {
218
+ const byKey = {};
219
+ for (const [id, catalog] of Object.entries(filtered)) {
220
+ if (catalog.hasApiKey === queryParams.hasKey) {
221
+ byKey[id] = catalog;
222
+ }
223
+ }
224
+ filtered = byKey;
225
+ }
226
+ if (queryParams.router) {
227
+ const byRouter = {};
228
+ for (const [id, catalog] of Object.entries(filtered)) {
229
+ if (!catalog.supportedRouters.includes(queryParams.router)) continue;
230
+ const models = catalog.models.filter(
231
+ (model) => (0, import_core.isRouterSupportedForModel)(
232
+ id,
233
+ model.name,
234
+ queryParams.router
235
+ )
236
+ );
237
+ if (models.length > 0) {
238
+ byRouter[id] = { ...catalog, models };
239
+ }
240
+ }
241
+ filtered = byRouter;
242
+ }
243
+ if (queryParams.fileType) {
244
+ const byFileType = {};
245
+ for (const [id, catalog] of Object.entries(filtered)) {
246
+ const models = catalog.models.filter((model) => {
247
+ const modelTypes = Array.isArray(model.supportedFileTypes) && model.supportedFileTypes.length > 0 ? model.supportedFileTypes : catalog.supportedFileTypes || [];
248
+ return modelTypes.includes(queryParams.fileType);
249
+ });
250
+ if (models.length > 0) {
251
+ byFileType[id] = { ...catalog, models };
252
+ }
253
+ }
254
+ filtered = byFileType;
255
+ }
256
+ if (queryParams.defaultOnly) {
257
+ const byDefault = {};
258
+ for (const [id, catalog] of Object.entries(filtered)) {
259
+ const models = catalog.models.filter((model) => model.default === true);
260
+ if (models.length > 0) {
261
+ byDefault[id] = { ...catalog, models };
262
+ }
263
+ }
264
+ filtered = byDefault;
265
+ }
266
+ if (queryParams.mode === "flat") {
267
+ const flat = [];
268
+ for (const [id, catalog] of Object.entries(filtered)) {
269
+ for (const model of catalog.models) {
270
+ flat.push({ provider: id, ...model });
271
+ }
272
+ }
273
+ return ctx.json({ models: flat });
274
+ }
275
+ return ctx.json({ providers: filtered });
276
+ }).openapi(saveKeyRoute, async (ctx) => {
277
+ const { provider, apiKey } = ctx.req.valid("json");
278
+ const meta = await (0, import_agent_management.saveProviderApiKey)(provider, apiKey, process.cwd());
279
+ return ctx.json({ ok: true, provider, envVar: meta.envVar });
280
+ }).openapi(switchRoute, async (ctx) => {
281
+ const agent = getAgent();
282
+ const raw = ctx.req.valid("json");
283
+ const { sessionId, ...llmUpdates } = raw;
284
+ const config = await agent.switchLLM(llmUpdates, sessionId);
285
+ const { apiKey, ...configWithoutKey } = config;
286
+ return ctx.json({
287
+ config: {
288
+ ...configWithoutKey,
289
+ hasApiKey: !!apiKey
290
+ },
291
+ sessionId
292
+ });
293
+ });
294
+ }
295
+ // Annotate the CommonJS export names for ESM import in node:
296
+ 0 && (module.exports = {
297
+ createLlmRouter
298
+ });
@@ -0,0 +1,294 @@
1
+ import { OpenAPIHono } from '@hono/zod-openapi';
2
+ import type { DextoAgent } from '@dexto/core';
3
+ export declare function createLlmRouter(getAgent: () => DextoAgent): OpenAPIHono<import("hono").Env, {
4
+ "/llm/current": {
5
+ $get: {
6
+ input: {
7
+ query: {
8
+ sessionId?: string | undefined;
9
+ };
10
+ };
11
+ output: {
12
+ config: {
13
+ provider: "openai" | "openai-compatible" | "anthropic" | "google" | "groq" | "xai" | "cohere";
14
+ model: string;
15
+ maxIterations?: number | undefined;
16
+ router?: "vercel" | "in-built" | undefined;
17
+ baseURL?: string | undefined;
18
+ maxInputTokens?: number | undefined;
19
+ maxOutputTokens?: number | undefined;
20
+ temperature?: number | undefined;
21
+ allowedMediaTypes?: string[] | undefined;
22
+ hasApiKey?: boolean | undefined;
23
+ displayName?: string | undefined;
24
+ };
25
+ };
26
+ outputFormat: "json";
27
+ status: 200;
28
+ };
29
+ };
30
+ } & {
31
+ "/llm/catalog": {
32
+ $get: {
33
+ input: {
34
+ query: {
35
+ provider?: string | string[] | undefined;
36
+ router?: "vercel" | "in-built" | undefined;
37
+ hasKey?: "0" | "1" | "true" | "false" | undefined;
38
+ fileType?: "image" | "audio" | "pdf" | undefined;
39
+ defaultOnly?: "0" | "1" | "true" | "false" | undefined;
40
+ mode?: "flat" | "grouped" | undefined;
41
+ };
42
+ };
43
+ output: {
44
+ providers: {
45
+ openai?: {
46
+ hasApiKey: boolean;
47
+ name: string;
48
+ supportedFileTypes: ("image" | "audio" | "pdf")[];
49
+ supportedRouters: ("vercel" | "in-built")[];
50
+ primaryEnvVar: string;
51
+ supportsBaseURL: boolean;
52
+ models: {
53
+ maxInputTokens: number;
54
+ name: string;
55
+ supportedFileTypes: ("image" | "audio" | "pdf")[];
56
+ default?: boolean | undefined;
57
+ supportedRouters?: ("vercel" | "in-built")[] | undefined;
58
+ displayName?: string | undefined;
59
+ pricing?: {
60
+ inputPerM: number;
61
+ outputPerM: number;
62
+ cacheReadPerM?: number | undefined;
63
+ cacheWritePerM?: number | undefined;
64
+ currency?: "USD" | undefined;
65
+ unit?: "per_million_tokens" | undefined;
66
+ } | undefined;
67
+ }[];
68
+ } | undefined;
69
+ "openai-compatible"?: {
70
+ hasApiKey: boolean;
71
+ name: string;
72
+ supportedFileTypes: ("image" | "audio" | "pdf")[];
73
+ supportedRouters: ("vercel" | "in-built")[];
74
+ primaryEnvVar: string;
75
+ supportsBaseURL: boolean;
76
+ models: {
77
+ maxInputTokens: number;
78
+ name: string;
79
+ supportedFileTypes: ("image" | "audio" | "pdf")[];
80
+ default?: boolean | undefined;
81
+ supportedRouters?: ("vercel" | "in-built")[] | undefined;
82
+ displayName?: string | undefined;
83
+ pricing?: {
84
+ inputPerM: number;
85
+ outputPerM: number;
86
+ cacheReadPerM?: number | undefined;
87
+ cacheWritePerM?: number | undefined;
88
+ currency?: "USD" | undefined;
89
+ unit?: "per_million_tokens" | undefined;
90
+ } | undefined;
91
+ }[];
92
+ } | undefined;
93
+ anthropic?: {
94
+ hasApiKey: boolean;
95
+ name: string;
96
+ supportedFileTypes: ("image" | "audio" | "pdf")[];
97
+ supportedRouters: ("vercel" | "in-built")[];
98
+ primaryEnvVar: string;
99
+ supportsBaseURL: boolean;
100
+ models: {
101
+ maxInputTokens: number;
102
+ name: string;
103
+ supportedFileTypes: ("image" | "audio" | "pdf")[];
104
+ default?: boolean | undefined;
105
+ supportedRouters?: ("vercel" | "in-built")[] | undefined;
106
+ displayName?: string | undefined;
107
+ pricing?: {
108
+ inputPerM: number;
109
+ outputPerM: number;
110
+ cacheReadPerM?: number | undefined;
111
+ cacheWritePerM?: number | undefined;
112
+ currency?: "USD" | undefined;
113
+ unit?: "per_million_tokens" | undefined;
114
+ } | undefined;
115
+ }[];
116
+ } | undefined;
117
+ google?: {
118
+ hasApiKey: boolean;
119
+ name: string;
120
+ supportedFileTypes: ("image" | "audio" | "pdf")[];
121
+ supportedRouters: ("vercel" | "in-built")[];
122
+ primaryEnvVar: string;
123
+ supportsBaseURL: boolean;
124
+ models: {
125
+ maxInputTokens: number;
126
+ name: string;
127
+ supportedFileTypes: ("image" | "audio" | "pdf")[];
128
+ default?: boolean | undefined;
129
+ supportedRouters?: ("vercel" | "in-built")[] | undefined;
130
+ displayName?: string | undefined;
131
+ pricing?: {
132
+ inputPerM: number;
133
+ outputPerM: number;
134
+ cacheReadPerM?: number | undefined;
135
+ cacheWritePerM?: number | undefined;
136
+ currency?: "USD" | undefined;
137
+ unit?: "per_million_tokens" | undefined;
138
+ } | undefined;
139
+ }[];
140
+ } | undefined;
141
+ groq?: {
142
+ hasApiKey: boolean;
143
+ name: string;
144
+ supportedFileTypes: ("image" | "audio" | "pdf")[];
145
+ supportedRouters: ("vercel" | "in-built")[];
146
+ primaryEnvVar: string;
147
+ supportsBaseURL: boolean;
148
+ models: {
149
+ maxInputTokens: number;
150
+ name: string;
151
+ supportedFileTypes: ("image" | "audio" | "pdf")[];
152
+ default?: boolean | undefined;
153
+ supportedRouters?: ("vercel" | "in-built")[] | undefined;
154
+ displayName?: string | undefined;
155
+ pricing?: {
156
+ inputPerM: number;
157
+ outputPerM: number;
158
+ cacheReadPerM?: number | undefined;
159
+ cacheWritePerM?: number | undefined;
160
+ currency?: "USD" | undefined;
161
+ unit?: "per_million_tokens" | undefined;
162
+ } | undefined;
163
+ }[];
164
+ } | undefined;
165
+ xai?: {
166
+ hasApiKey: boolean;
167
+ name: string;
168
+ supportedFileTypes: ("image" | "audio" | "pdf")[];
169
+ supportedRouters: ("vercel" | "in-built")[];
170
+ primaryEnvVar: string;
171
+ supportsBaseURL: boolean;
172
+ models: {
173
+ maxInputTokens: number;
174
+ name: string;
175
+ supportedFileTypes: ("image" | "audio" | "pdf")[];
176
+ default?: boolean | undefined;
177
+ supportedRouters?: ("vercel" | "in-built")[] | undefined;
178
+ displayName?: string | undefined;
179
+ pricing?: {
180
+ inputPerM: number;
181
+ outputPerM: number;
182
+ cacheReadPerM?: number | undefined;
183
+ cacheWritePerM?: number | undefined;
184
+ currency?: "USD" | undefined;
185
+ unit?: "per_million_tokens" | undefined;
186
+ } | undefined;
187
+ }[];
188
+ } | undefined;
189
+ cohere?: {
190
+ hasApiKey: boolean;
191
+ name: string;
192
+ supportedFileTypes: ("image" | "audio" | "pdf")[];
193
+ supportedRouters: ("vercel" | "in-built")[];
194
+ primaryEnvVar: string;
195
+ supportsBaseURL: boolean;
196
+ models: {
197
+ maxInputTokens: number;
198
+ name: string;
199
+ supportedFileTypes: ("image" | "audio" | "pdf")[];
200
+ default?: boolean | undefined;
201
+ supportedRouters?: ("vercel" | "in-built")[] | undefined;
202
+ displayName?: string | undefined;
203
+ pricing?: {
204
+ inputPerM: number;
205
+ outputPerM: number;
206
+ cacheReadPerM?: number | undefined;
207
+ cacheWritePerM?: number | undefined;
208
+ currency?: "USD" | undefined;
209
+ unit?: "per_million_tokens" | undefined;
210
+ } | undefined;
211
+ }[];
212
+ } | undefined;
213
+ };
214
+ } | {
215
+ models: {
216
+ provider: string;
217
+ maxInputTokens: number;
218
+ name: string;
219
+ supportedFileTypes: ("image" | "audio" | "pdf")[];
220
+ default?: boolean | undefined;
221
+ supportedRouters?: ("vercel" | "in-built")[] | undefined;
222
+ displayName?: string | undefined;
223
+ pricing?: {
224
+ inputPerM: number;
225
+ outputPerM: number;
226
+ cacheReadPerM?: number | undefined;
227
+ cacheWritePerM?: number | undefined;
228
+ currency?: "USD" | undefined;
229
+ unit?: "per_million_tokens" | undefined;
230
+ } | undefined;
231
+ }[];
232
+ };
233
+ outputFormat: "json";
234
+ status: 200;
235
+ };
236
+ };
237
+ } & {
238
+ "/llm/key": {
239
+ $post: {
240
+ input: {
241
+ json: {
242
+ provider: "openai" | "openai-compatible" | "anthropic" | "google" | "groq" | "xai" | "cohere";
243
+ apiKey: string;
244
+ };
245
+ };
246
+ output: {
247
+ provider: "openai" | "openai-compatible" | "anthropic" | "google" | "groq" | "xai" | "cohere";
248
+ ok: true;
249
+ envVar: string;
250
+ };
251
+ outputFormat: "json";
252
+ status: 200;
253
+ };
254
+ };
255
+ } & {
256
+ "/llm/switch": {
257
+ $post: {
258
+ input: {
259
+ json: {
260
+ apiKey?: string | undefined;
261
+ model?: string | undefined;
262
+ provider?: "openai" | "openai-compatible" | "anthropic" | "google" | "groq" | "xai" | "cohere" | undefined;
263
+ router?: "vercel" | "in-built" | undefined;
264
+ maxIterations?: number | undefined;
265
+ baseURL?: string | undefined;
266
+ maxInputTokens?: number | undefined;
267
+ maxOutputTokens?: number | undefined;
268
+ temperature?: number | undefined;
269
+ allowedMediaTypes?: string[] | undefined;
270
+ } & {
271
+ sessionId?: string | undefined;
272
+ };
273
+ };
274
+ output: {
275
+ config: {
276
+ provider: "openai" | "openai-compatible" | "anthropic" | "google" | "groq" | "xai" | "cohere";
277
+ model: string;
278
+ maxIterations: number;
279
+ router: "vercel" | "in-built";
280
+ baseURL?: string | undefined;
281
+ maxInputTokens?: number | undefined;
282
+ maxOutputTokens?: number | undefined;
283
+ temperature?: number | undefined;
284
+ allowedMediaTypes?: string[] | undefined;
285
+ hasApiKey?: boolean | undefined;
286
+ };
287
+ sessionId?: string | undefined;
288
+ };
289
+ outputFormat: "json";
290
+ status: 200;
291
+ };
292
+ };
293
+ }, "/">;
294
+ //# sourceMappingURL=llm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../../src/hono/routes/llm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,mBAAmB,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAmG9C,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAyTzD"}