@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.
- package/LICENSE +44 -0
- package/dist/a2a/adapters/index.cjs +42 -0
- package/dist/a2a/adapters/index.d.ts +10 -0
- package/dist/a2a/adapters/index.d.ts.map +1 -0
- package/dist/a2a/adapters/index.js +12 -0
- package/dist/a2a/adapters/message.cjs +193 -0
- package/dist/a2a/adapters/message.d.ts +50 -0
- package/dist/a2a/adapters/message.d.ts.map +1 -0
- package/dist/a2a/adapters/message.js +167 -0
- package/dist/a2a/adapters/state.cjs +57 -0
- package/dist/a2a/adapters/state.d.ts +36 -0
- package/dist/a2a/adapters/state.d.ts.map +1 -0
- package/dist/a2a/adapters/state.js +32 -0
- package/dist/a2a/adapters/task-view.cjs +85 -0
- package/dist/a2a/adapters/task-view.d.ts +58 -0
- package/dist/a2a/adapters/task-view.d.ts.map +1 -0
- package/dist/a2a/adapters/task-view.js +60 -0
- package/dist/a2a/index.cjs +51 -0
- package/dist/a2a/index.d.ts +15 -0
- package/dist/a2a/index.d.ts.map +1 -0
- package/dist/a2a/index.js +30 -0
- package/dist/a2a/jsonrpc/index.cjs +38 -0
- package/dist/a2a/jsonrpc/index.d.ts +11 -0
- package/dist/a2a/jsonrpc/index.d.ts.map +1 -0
- package/dist/a2a/jsonrpc/index.js +10 -0
- package/dist/a2a/jsonrpc/methods.cjs +183 -0
- package/dist/a2a/jsonrpc/methods.d.ts +110 -0
- package/dist/a2a/jsonrpc/methods.d.ts.map +1 -0
- package/dist/a2a/jsonrpc/methods.js +159 -0
- package/dist/a2a/jsonrpc/server.cjs +199 -0
- package/dist/a2a/jsonrpc/server.d.ts +100 -0
- package/dist/a2a/jsonrpc/server.d.ts.map +1 -0
- package/dist/a2a/jsonrpc/server.js +175 -0
- package/dist/a2a/jsonrpc/types.cjs +47 -0
- package/dist/a2a/jsonrpc/types.d.ts +91 -0
- package/dist/a2a/jsonrpc/types.d.ts.map +1 -0
- package/dist/a2a/jsonrpc/types.js +21 -0
- package/dist/a2a/types.cjs +16 -0
- package/dist/a2a/types.d.ts +250 -0
- package/dist/a2a/types.d.ts.map +1 -0
- package/dist/a2a/types.js +0 -0
- package/dist/approval/approval-coordinator.cjs +87 -0
- package/dist/approval/approval-coordinator.d.ts +52 -0
- package/dist/approval/approval-coordinator.d.ts.map +1 -0
- package/dist/approval/approval-coordinator.js +63 -0
- package/dist/approval/manual-approval-handler.cjs +100 -0
- package/dist/approval/manual-approval-handler.d.ts +32 -0
- package/dist/approval/manual-approval-handler.d.ts.map +1 -0
- package/dist/approval/manual-approval-handler.js +76 -0
- package/dist/events/a2a-sse-subscriber.cjs +271 -0
- package/dist/events/a2a-sse-subscriber.d.ts +94 -0
- package/dist/events/a2a-sse-subscriber.d.ts.map +1 -0
- package/dist/events/a2a-sse-subscriber.js +247 -0
- package/dist/events/types.cjs +16 -0
- package/dist/events/types.d.ts +15 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/events/types.js +0 -0
- package/dist/events/webhook-subscriber.cjs +301 -0
- package/dist/events/webhook-subscriber.d.ts +64 -0
- package/dist/events/webhook-subscriber.d.ts.map +1 -0
- package/dist/events/webhook-subscriber.js +269 -0
- package/dist/events/webhook-types.cjs +16 -0
- package/dist/events/webhook-types.d.ts +91 -0
- package/dist/events/webhook-types.d.ts.map +1 -0
- package/dist/events/webhook-types.js +0 -0
- package/dist/hono/__tests__/test-fixtures.cjs +236 -0
- package/dist/hono/__tests__/test-fixtures.d.ts +65 -0
- package/dist/hono/__tests__/test-fixtures.d.ts.map +1 -0
- package/dist/hono/__tests__/test-fixtures.js +197 -0
- package/dist/hono/index.cjs +166 -0
- package/dist/hono/index.d.ts +2783 -0
- package/dist/hono/index.d.ts.map +1 -0
- package/dist/hono/index.js +141 -0
- package/dist/hono/middleware/auth.cjs +75 -0
- package/dist/hono/middleware/auth.d.ts +3 -0
- package/dist/hono/middleware/auth.d.ts.map +1 -0
- package/dist/hono/middleware/auth.js +51 -0
- package/dist/hono/middleware/cors.cjs +57 -0
- package/dist/hono/middleware/cors.d.ts +9 -0
- package/dist/hono/middleware/cors.d.ts.map +1 -0
- package/dist/hono/middleware/cors.js +33 -0
- package/dist/hono/middleware/error.cjs +131 -0
- package/dist/hono/middleware/error.d.ts +5 -0
- package/dist/hono/middleware/error.d.ts.map +1 -0
- package/dist/hono/middleware/error.js +105 -0
- package/dist/hono/middleware/redaction.cjs +45 -0
- package/dist/hono/middleware/redaction.d.ts +4 -0
- package/dist/hono/middleware/redaction.d.ts.map +1 -0
- package/dist/hono/middleware/redaction.js +20 -0
- package/dist/hono/node/index.cjs +139 -0
- package/dist/hono/node/index.d.ts +19 -0
- package/dist/hono/node/index.d.ts.map +1 -0
- package/dist/hono/node/index.js +115 -0
- package/dist/hono/routes/a2a-jsonrpc.cjs +119 -0
- package/dist/hono/routes/a2a-jsonrpc.d.ts +46 -0
- package/dist/hono/routes/a2a-jsonrpc.d.ts.map +1 -0
- package/dist/hono/routes/a2a-jsonrpc.js +95 -0
- package/dist/hono/routes/a2a-tasks.cjs +315 -0
- package/dist/hono/routes/a2a-tasks.d.ts +530 -0
- package/dist/hono/routes/a2a-tasks.d.ts.map +1 -0
- package/dist/hono/routes/a2a-tasks.js +291 -0
- package/dist/hono/routes/a2a.cjs +36 -0
- package/dist/hono/routes/a2a.d.ts +4 -0
- package/dist/hono/routes/a2a.d.ts.map +1 -0
- package/dist/hono/routes/a2a.js +12 -0
- package/dist/hono/routes/agents.cjs +735 -0
- package/dist/hono/routes/agents.d.ts +650 -0
- package/dist/hono/routes/agents.d.ts.map +1 -0
- package/dist/hono/routes/agents.js +711 -0
- package/dist/hono/routes/approvals.cjs +125 -0
- package/dist/hono/routes/approvals.d.ts +89 -0
- package/dist/hono/routes/approvals.d.ts.map +1 -0
- package/dist/hono/routes/approvals.js +101 -0
- package/dist/hono/routes/greeting.cjs +60 -0
- package/dist/hono/routes/greeting.d.ts +19 -0
- package/dist/hono/routes/greeting.d.ts.map +1 -0
- package/dist/hono/routes/greeting.js +36 -0
- package/dist/hono/routes/health.cjs +45 -0
- package/dist/hono/routes/health.d.ts +17 -0
- package/dist/hono/routes/health.d.ts.map +1 -0
- package/dist/hono/routes/health.js +21 -0
- package/dist/hono/routes/llm.cjs +298 -0
- package/dist/hono/routes/llm.d.ts +294 -0
- package/dist/hono/routes/llm.d.ts.map +1 -0
- package/dist/hono/routes/llm.js +287 -0
- package/dist/hono/routes/mcp.cjs +356 -0
- package/dist/hono/routes/mcp.d.ts +246 -0
- package/dist/hono/routes/mcp.d.ts.map +1 -0
- package/dist/hono/routes/mcp.js +332 -0
- package/dist/hono/routes/memory.cjs +192 -0
- package/dist/hono/routes/memory.d.ts +146 -0
- package/dist/hono/routes/memory.d.ts.map +1 -0
- package/dist/hono/routes/memory.js +168 -0
- package/dist/hono/routes/messages.cjs +320 -0
- package/dist/hono/routes/messages.d.ts +163 -0
- package/dist/hono/routes/messages.d.ts.map +1 -0
- package/dist/hono/routes/messages.js +296 -0
- package/dist/hono/routes/prompts.cjs +228 -0
- package/dist/hono/routes/prompts.d.ts +150 -0
- package/dist/hono/routes/prompts.d.ts.map +1 -0
- package/dist/hono/routes/prompts.js +204 -0
- package/dist/hono/routes/resources.cjs +110 -0
- package/dist/hono/routes/resources.d.ts +76 -0
- package/dist/hono/routes/resources.d.ts.map +1 -0
- package/dist/hono/routes/resources.js +86 -0
- package/dist/hono/routes/search.cjs +109 -0
- package/dist/hono/routes/search.d.ts +137 -0
- package/dist/hono/routes/search.d.ts.map +1 -0
- package/dist/hono/routes/search.js +85 -0
- package/dist/hono/routes/sessions.cjs +366 -0
- package/dist/hono/routes/sessions.d.ts +229 -0
- package/dist/hono/routes/sessions.d.ts.map +1 -0
- package/dist/hono/routes/sessions.js +342 -0
- package/dist/hono/routes/webhooks.cjs +228 -0
- package/dist/hono/routes/webhooks.d.ts +127 -0
- package/dist/hono/routes/webhooks.d.ts.map +1 -0
- package/dist/hono/routes/webhooks.js +204 -0
- package/dist/hono/schemas/responses.cjs +276 -0
- package/dist/hono/schemas/responses.d.ts +1418 -0
- package/dist/hono/schemas/responses.d.ts.map +1 -0
- package/dist/hono/schemas/responses.js +227 -0
- package/dist/hono/types.cjs +16 -0
- package/dist/hono/types.d.ts +6 -0
- package/dist/hono/types.d.ts.map +1 -0
- package/dist/hono/types.js +0 -0
- package/dist/index.cjs +38 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/mcp/mcp-handler.cjs +145 -0
- package/dist/mcp/mcp-handler.d.ts +14 -0
- package/dist/mcp/mcp-handler.d.ts.map +1 -0
- package/dist/mcp/mcp-handler.js +118 -0
- package/package.json +59 -0
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi";
|
|
2
|
+
import { PromptError } from "@dexto/core";
|
|
3
|
+
import { PromptInfoSchema, PromptDefinitionSchema } from "../schemas/responses.js";
|
|
4
|
+
const CustomPromptRequestSchema = z.object({
|
|
5
|
+
name: z.string().min(1, "Prompt name is required").describe("Unique name for the custom prompt"),
|
|
6
|
+
title: z.string().optional().describe("Display title for the prompt"),
|
|
7
|
+
description: z.string().optional().describe("Description of what the prompt does"),
|
|
8
|
+
content: z.string().min(1, "Prompt content is required").describe("The prompt content text (can include {{argumentName}} placeholders)"),
|
|
9
|
+
arguments: z.array(
|
|
10
|
+
z.object({
|
|
11
|
+
name: z.string().min(1, "Argument name is required").describe("Argument name"),
|
|
12
|
+
description: z.string().optional().describe("Argument description"),
|
|
13
|
+
required: z.boolean().optional().describe("Whether the argument is required")
|
|
14
|
+
}).strict()
|
|
15
|
+
).optional().describe("Array of argument definitions"),
|
|
16
|
+
resource: z.object({
|
|
17
|
+
base64: z.string().min(1, "Resource data is required").describe("Base64-encoded resource data"),
|
|
18
|
+
mimeType: z.string().min(1, "Resource MIME type is required").describe("MIME type of the resource (e.g., text/plain, application/pdf)"),
|
|
19
|
+
filename: z.string().optional().describe("Resource filename")
|
|
20
|
+
}).strict().optional().describe("Attach a resource to this prompt")
|
|
21
|
+
}).strict().describe("Request body for creating a custom prompt with optional resource attachment");
|
|
22
|
+
const PromptNameParamSchema = z.object({
|
|
23
|
+
name: z.string().min(1, "Prompt name is required").describe("The prompt name")
|
|
24
|
+
}).describe("Path parameters for prompt endpoints");
|
|
25
|
+
const ResolvePromptQuerySchema = z.object({
|
|
26
|
+
context: z.string().optional().describe("Additional context for prompt resolution"),
|
|
27
|
+
args: z.string().optional().describe("Arguments to substitute in the prompt template (pass as a JSON string)")
|
|
28
|
+
}).describe("Query parameters for resolving prompt templates");
|
|
29
|
+
function createPromptsRouter(getAgent) {
|
|
30
|
+
const app = new OpenAPIHono();
|
|
31
|
+
const listRoute = createRoute({
|
|
32
|
+
method: "get",
|
|
33
|
+
path: "/prompts",
|
|
34
|
+
summary: "List Prompts",
|
|
35
|
+
description: "Retrieves all available prompts, including both built-in and custom prompts",
|
|
36
|
+
tags: ["prompts"],
|
|
37
|
+
responses: {
|
|
38
|
+
200: {
|
|
39
|
+
description: "List all prompts",
|
|
40
|
+
content: {
|
|
41
|
+
"application/json": {
|
|
42
|
+
schema: z.object({
|
|
43
|
+
prompts: z.array(PromptInfoSchema).describe("Array of available prompts")
|
|
44
|
+
}).strict().describe("Prompts list response")
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
const createCustomRoute = createRoute({
|
|
51
|
+
method: "post",
|
|
52
|
+
path: "/prompts/custom",
|
|
53
|
+
summary: "Create Custom Prompt",
|
|
54
|
+
description: "Creates a new custom prompt with optional resource attachment. Maximum request size: 10MB",
|
|
55
|
+
tags: ["prompts"],
|
|
56
|
+
request: {
|
|
57
|
+
body: {
|
|
58
|
+
content: {
|
|
59
|
+
"application/json": {
|
|
60
|
+
schema: CustomPromptRequestSchema
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
responses: {
|
|
66
|
+
201: {
|
|
67
|
+
description: "Custom prompt created",
|
|
68
|
+
content: {
|
|
69
|
+
"application/json": {
|
|
70
|
+
schema: z.object({
|
|
71
|
+
prompt: PromptInfoSchema.describe("Created prompt information")
|
|
72
|
+
}).strict().describe("Create prompt response")
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
const deleteCustomRoute = createRoute({
|
|
79
|
+
method: "delete",
|
|
80
|
+
path: "/prompts/custom/{name}",
|
|
81
|
+
summary: "Delete Custom Prompt",
|
|
82
|
+
description: "Permanently deletes a custom prompt. Built-in prompts cannot be deleted",
|
|
83
|
+
tags: ["prompts"],
|
|
84
|
+
request: {
|
|
85
|
+
params: z.object({
|
|
86
|
+
name: z.string().min(1, "Prompt name is required").describe("The prompt name")
|
|
87
|
+
})
|
|
88
|
+
},
|
|
89
|
+
responses: {
|
|
90
|
+
204: { description: "Prompt deleted" }
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
const getPromptRoute = createRoute({
|
|
94
|
+
method: "get",
|
|
95
|
+
path: "/prompts/{name}",
|
|
96
|
+
summary: "Get Prompt Definition",
|
|
97
|
+
description: "Fetches the definition for a specific prompt",
|
|
98
|
+
tags: ["prompts"],
|
|
99
|
+
request: {
|
|
100
|
+
params: PromptNameParamSchema
|
|
101
|
+
},
|
|
102
|
+
responses: {
|
|
103
|
+
200: {
|
|
104
|
+
description: "Prompt definition",
|
|
105
|
+
content: {
|
|
106
|
+
"application/json": {
|
|
107
|
+
schema: z.object({
|
|
108
|
+
definition: PromptDefinitionSchema.describe("Prompt definition")
|
|
109
|
+
}).strict().describe("Get prompt definition response")
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
404: { description: "Prompt not found" }
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
const resolvePromptRoute = createRoute({
|
|
117
|
+
method: "get",
|
|
118
|
+
path: "/prompts/{name}/resolve",
|
|
119
|
+
summary: "Resolve Prompt",
|
|
120
|
+
description: "Resolves a prompt template with provided arguments and returns the final text with resources",
|
|
121
|
+
tags: ["prompts"],
|
|
122
|
+
request: {
|
|
123
|
+
params: PromptNameParamSchema,
|
|
124
|
+
query: ResolvePromptQuerySchema
|
|
125
|
+
},
|
|
126
|
+
responses: {
|
|
127
|
+
200: {
|
|
128
|
+
description: "Resolved prompt content",
|
|
129
|
+
content: {
|
|
130
|
+
"application/json": {
|
|
131
|
+
schema: z.object({
|
|
132
|
+
text: z.string().describe("Resolved prompt text"),
|
|
133
|
+
resources: z.array(z.string()).describe("Array of resource identifiers")
|
|
134
|
+
}).strict().describe("Resolve prompt response")
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
404: { description: "Prompt not found" }
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
return app.openapi(listRoute, async (ctx) => {
|
|
142
|
+
const agent = getAgent();
|
|
143
|
+
const prompts = await agent.listPrompts();
|
|
144
|
+
const list = Object.values(prompts);
|
|
145
|
+
return ctx.json({ prompts: list });
|
|
146
|
+
}).openapi(createCustomRoute, async (ctx) => {
|
|
147
|
+
const agent = getAgent();
|
|
148
|
+
const payload = ctx.req.valid("json");
|
|
149
|
+
const promptArguments = payload.arguments?.map((arg) => ({
|
|
150
|
+
name: arg.name,
|
|
151
|
+
...arg.description ? { description: arg.description } : {},
|
|
152
|
+
...typeof arg.required === "boolean" ? { required: arg.required } : {}
|
|
153
|
+
})).filter(Boolean);
|
|
154
|
+
const createPayload = {
|
|
155
|
+
name: payload.name,
|
|
156
|
+
content: payload.content,
|
|
157
|
+
...payload.title ? { title: payload.title } : {},
|
|
158
|
+
...payload.description ? { description: payload.description } : {},
|
|
159
|
+
...promptArguments && promptArguments.length > 0 ? { arguments: promptArguments } : {},
|
|
160
|
+
...payload.resource ? {
|
|
161
|
+
resource: {
|
|
162
|
+
base64: payload.resource.base64,
|
|
163
|
+
mimeType: payload.resource.mimeType,
|
|
164
|
+
...payload.resource.filename ? { filename: payload.resource.filename } : {}
|
|
165
|
+
}
|
|
166
|
+
} : {}
|
|
167
|
+
};
|
|
168
|
+
const prompt = await agent.createCustomPrompt(createPayload);
|
|
169
|
+
return ctx.json({ prompt }, 201);
|
|
170
|
+
}).openapi(deleteCustomRoute, async (ctx) => {
|
|
171
|
+
const agent = getAgent();
|
|
172
|
+
const { name } = ctx.req.valid("param");
|
|
173
|
+
await agent.deleteCustomPrompt(name);
|
|
174
|
+
return ctx.body(null, 204);
|
|
175
|
+
}).openapi(getPromptRoute, async (ctx) => {
|
|
176
|
+
const agent = getAgent();
|
|
177
|
+
const { name } = ctx.req.valid("param");
|
|
178
|
+
const definition = await agent.getPromptDefinition(name);
|
|
179
|
+
if (!definition) throw PromptError.notFound(name);
|
|
180
|
+
return ctx.json({ definition });
|
|
181
|
+
}).openapi(resolvePromptRoute, async (ctx) => {
|
|
182
|
+
const agent = getAgent();
|
|
183
|
+
const { name } = ctx.req.valid("param");
|
|
184
|
+
const { context, args: argsString } = ctx.req.valid("query");
|
|
185
|
+
let parsedArgs;
|
|
186
|
+
if (argsString) {
|
|
187
|
+
try {
|
|
188
|
+
const parsed = JSON.parse(argsString);
|
|
189
|
+
if (parsed && typeof parsed === "object") {
|
|
190
|
+
parsedArgs = parsed;
|
|
191
|
+
}
|
|
192
|
+
} catch {
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
const options = {};
|
|
196
|
+
if (context !== void 0) options.context = context;
|
|
197
|
+
if (parsedArgs !== void 0) options.args = parsedArgs;
|
|
198
|
+
const result = await agent.resolvePrompt(name, options);
|
|
199
|
+
return ctx.json({ text: result.text, resources: result.resources });
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
export {
|
|
203
|
+
createPromptsRouter
|
|
204
|
+
};
|
|
@@ -0,0 +1,110 @@
|
|
|
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 resources_exports = {};
|
|
20
|
+
__export(resources_exports, {
|
|
21
|
+
createResourcesRouter: () => createResourcesRouter
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(resources_exports);
|
|
24
|
+
var import_zod_openapi = require("@hono/zod-openapi");
|
|
25
|
+
var import_responses = require("../schemas/responses.js");
|
|
26
|
+
const ResourceIdParamSchema = import_zod_openapi.z.object({
|
|
27
|
+
resourceId: import_zod_openapi.z.string().min(1, "Resource ID is required").transform((encoded) => decodeURIComponent(encoded)).describe("The URI-encoded resource identifier")
|
|
28
|
+
}).describe("Path parameters for resource endpoints");
|
|
29
|
+
const ListResourcesResponseSchema = import_zod_openapi.z.object({
|
|
30
|
+
ok: import_zod_openapi.z.literal(true).describe("Indicates successful response"),
|
|
31
|
+
resources: import_zod_openapi.z.array(import_responses.ResourceSchema).describe("Array of all available resources from all sources")
|
|
32
|
+
}).strict().describe("List of all resources");
|
|
33
|
+
const ResourceContentItemSchema = import_zod_openapi.z.object({
|
|
34
|
+
uri: import_zod_openapi.z.string().describe("Resource URI"),
|
|
35
|
+
mimeType: import_zod_openapi.z.string().optional().describe("MIME type of the content"),
|
|
36
|
+
text: import_zod_openapi.z.string().optional().describe("Text content (for text resources)"),
|
|
37
|
+
blob: import_zod_openapi.z.string().optional().describe("Base64-encoded binary content (for binary resources)")
|
|
38
|
+
}).strict().describe("Resource content item");
|
|
39
|
+
const ReadResourceResponseSchema = import_zod_openapi.z.object({
|
|
40
|
+
ok: import_zod_openapi.z.literal(true).describe("Indicates successful response"),
|
|
41
|
+
content: import_zod_openapi.z.object({
|
|
42
|
+
contents: import_zod_openapi.z.array(ResourceContentItemSchema).describe("Array of content items (typically one item)"),
|
|
43
|
+
_meta: import_zod_openapi.z.record(import_zod_openapi.z.any()).optional().describe("Optional metadata about the resource")
|
|
44
|
+
}).strict().describe("Resource content from MCP ReadResourceResult")
|
|
45
|
+
}).strict().describe("Resource content response");
|
|
46
|
+
function createResourcesRouter(getAgent) {
|
|
47
|
+
const app = new import_zod_openapi.OpenAPIHono();
|
|
48
|
+
const listRoute = (0, import_zod_openapi.createRoute)({
|
|
49
|
+
method: "get",
|
|
50
|
+
path: "/resources",
|
|
51
|
+
summary: "List All Resources",
|
|
52
|
+
description: "Retrieves a list of all available resources from all sources (MCP servers and internal providers)",
|
|
53
|
+
tags: ["resources"],
|
|
54
|
+
responses: {
|
|
55
|
+
200: {
|
|
56
|
+
description: "List all resources",
|
|
57
|
+
content: { "application/json": { schema: ListResourcesResponseSchema } }
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
const getContentRoute = (0, import_zod_openapi.createRoute)({
|
|
62
|
+
method: "get",
|
|
63
|
+
path: "/resources/{resourceId}/content",
|
|
64
|
+
summary: "Read Resource Content",
|
|
65
|
+
description: "Reads the content of a specific resource by its URI. The resource ID in the URL must be URI-encoded",
|
|
66
|
+
tags: ["resources"],
|
|
67
|
+
request: {
|
|
68
|
+
params: ResourceIdParamSchema
|
|
69
|
+
},
|
|
70
|
+
responses: {
|
|
71
|
+
200: {
|
|
72
|
+
description: "Resource content",
|
|
73
|
+
content: { "application/json": { schema: ReadResourceResponseSchema } }
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
const headRoute = (0, import_zod_openapi.createRoute)({
|
|
78
|
+
method: "head",
|
|
79
|
+
path: "/resources/{resourceId}",
|
|
80
|
+
summary: "Check Resource Exists",
|
|
81
|
+
description: "Checks if a resource exists by its URI without retrieving its content",
|
|
82
|
+
tags: ["resources"],
|
|
83
|
+
request: {
|
|
84
|
+
params: ResourceIdParamSchema
|
|
85
|
+
},
|
|
86
|
+
responses: {
|
|
87
|
+
200: { description: "Resource exists" },
|
|
88
|
+
404: { description: "Resource not found" }
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
return app.openapi(listRoute, async (ctx) => {
|
|
92
|
+
const agent = getAgent();
|
|
93
|
+
const resources = await agent.listResources();
|
|
94
|
+
return ctx.json({ ok: true, resources: Object.values(resources) });
|
|
95
|
+
}).openapi(getContentRoute, async (ctx) => {
|
|
96
|
+
const agent = getAgent();
|
|
97
|
+
const { resourceId } = ctx.req.valid("param");
|
|
98
|
+
const content = await agent.readResource(resourceId);
|
|
99
|
+
return ctx.json({ ok: true, content });
|
|
100
|
+
}).openapi(headRoute, async (ctx) => {
|
|
101
|
+
const agent = getAgent();
|
|
102
|
+
const { resourceId } = ctx.req.valid("param");
|
|
103
|
+
const exists = await agent.hasResource(resourceId);
|
|
104
|
+
return ctx.body(null, exists ? 200 : 404);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
108
|
+
0 && (module.exports = {
|
|
109
|
+
createResourcesRouter
|
|
110
|
+
});
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { OpenAPIHono } from '@hono/zod-openapi';
|
|
2
|
+
import type { DextoAgent } from '@dexto/core';
|
|
3
|
+
export declare function createResourcesRouter(getAgent: () => DextoAgent): OpenAPIHono<import("hono").Env, {
|
|
4
|
+
"/resources": {
|
|
5
|
+
$get: {
|
|
6
|
+
input: {};
|
|
7
|
+
output: {
|
|
8
|
+
ok: true;
|
|
9
|
+
resources: {
|
|
10
|
+
uri: string;
|
|
11
|
+
source: "mcp" | "internal";
|
|
12
|
+
description?: string | undefined;
|
|
13
|
+
mimeType?: string | undefined;
|
|
14
|
+
name?: string | undefined;
|
|
15
|
+
metadata?: {
|
|
16
|
+
[x: string]: import("hono/utils/types").JSONValue;
|
|
17
|
+
} | undefined;
|
|
18
|
+
serverName?: string | undefined;
|
|
19
|
+
size?: number | undefined;
|
|
20
|
+
lastModified?: string | undefined;
|
|
21
|
+
}[];
|
|
22
|
+
};
|
|
23
|
+
outputFormat: "json";
|
|
24
|
+
status: 200;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
} & {
|
|
28
|
+
"/resources/:resourceId/content": {
|
|
29
|
+
$get: {
|
|
30
|
+
input: {
|
|
31
|
+
param: {
|
|
32
|
+
resourceId: string;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
output: {
|
|
36
|
+
content: {
|
|
37
|
+
contents: {
|
|
38
|
+
uri: string;
|
|
39
|
+
text?: string | undefined;
|
|
40
|
+
mimeType?: string | undefined;
|
|
41
|
+
blob?: string | undefined;
|
|
42
|
+
}[];
|
|
43
|
+
_meta?: {
|
|
44
|
+
[x: string]: any;
|
|
45
|
+
} | undefined;
|
|
46
|
+
};
|
|
47
|
+
ok: true;
|
|
48
|
+
};
|
|
49
|
+
outputFormat: "json";
|
|
50
|
+
status: 200;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
} & {
|
|
54
|
+
"/resources/:resourceId": {
|
|
55
|
+
$head: {
|
|
56
|
+
input: {
|
|
57
|
+
param: {
|
|
58
|
+
resourceId: string;
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
output: {};
|
|
62
|
+
outputFormat: string;
|
|
63
|
+
status: 200;
|
|
64
|
+
} | {
|
|
65
|
+
input: {
|
|
66
|
+
param: {
|
|
67
|
+
resourceId: string;
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
output: {};
|
|
71
|
+
outputFormat: string;
|
|
72
|
+
status: 404;
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
}, "/">;
|
|
76
|
+
//# sourceMappingURL=resources.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../../../src/hono/routes/resources.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,mBAAmB,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAyD9C,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAqE/D"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi";
|
|
2
|
+
import { ResourceSchema } from "../schemas/responses.js";
|
|
3
|
+
const ResourceIdParamSchema = z.object({
|
|
4
|
+
resourceId: z.string().min(1, "Resource ID is required").transform((encoded) => decodeURIComponent(encoded)).describe("The URI-encoded resource identifier")
|
|
5
|
+
}).describe("Path parameters for resource endpoints");
|
|
6
|
+
const ListResourcesResponseSchema = z.object({
|
|
7
|
+
ok: z.literal(true).describe("Indicates successful response"),
|
|
8
|
+
resources: z.array(ResourceSchema).describe("Array of all available resources from all sources")
|
|
9
|
+
}).strict().describe("List of all resources");
|
|
10
|
+
const ResourceContentItemSchema = z.object({
|
|
11
|
+
uri: z.string().describe("Resource URI"),
|
|
12
|
+
mimeType: z.string().optional().describe("MIME type of the content"),
|
|
13
|
+
text: z.string().optional().describe("Text content (for text resources)"),
|
|
14
|
+
blob: z.string().optional().describe("Base64-encoded binary content (for binary resources)")
|
|
15
|
+
}).strict().describe("Resource content item");
|
|
16
|
+
const ReadResourceResponseSchema = z.object({
|
|
17
|
+
ok: z.literal(true).describe("Indicates successful response"),
|
|
18
|
+
content: z.object({
|
|
19
|
+
contents: z.array(ResourceContentItemSchema).describe("Array of content items (typically one item)"),
|
|
20
|
+
_meta: z.record(z.any()).optional().describe("Optional metadata about the resource")
|
|
21
|
+
}).strict().describe("Resource content from MCP ReadResourceResult")
|
|
22
|
+
}).strict().describe("Resource content response");
|
|
23
|
+
function createResourcesRouter(getAgent) {
|
|
24
|
+
const app = new OpenAPIHono();
|
|
25
|
+
const listRoute = createRoute({
|
|
26
|
+
method: "get",
|
|
27
|
+
path: "/resources",
|
|
28
|
+
summary: "List All Resources",
|
|
29
|
+
description: "Retrieves a list of all available resources from all sources (MCP servers and internal providers)",
|
|
30
|
+
tags: ["resources"],
|
|
31
|
+
responses: {
|
|
32
|
+
200: {
|
|
33
|
+
description: "List all resources",
|
|
34
|
+
content: { "application/json": { schema: ListResourcesResponseSchema } }
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
const getContentRoute = createRoute({
|
|
39
|
+
method: "get",
|
|
40
|
+
path: "/resources/{resourceId}/content",
|
|
41
|
+
summary: "Read Resource Content",
|
|
42
|
+
description: "Reads the content of a specific resource by its URI. The resource ID in the URL must be URI-encoded",
|
|
43
|
+
tags: ["resources"],
|
|
44
|
+
request: {
|
|
45
|
+
params: ResourceIdParamSchema
|
|
46
|
+
},
|
|
47
|
+
responses: {
|
|
48
|
+
200: {
|
|
49
|
+
description: "Resource content",
|
|
50
|
+
content: { "application/json": { schema: ReadResourceResponseSchema } }
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
const headRoute = createRoute({
|
|
55
|
+
method: "head",
|
|
56
|
+
path: "/resources/{resourceId}",
|
|
57
|
+
summary: "Check Resource Exists",
|
|
58
|
+
description: "Checks if a resource exists by its URI without retrieving its content",
|
|
59
|
+
tags: ["resources"],
|
|
60
|
+
request: {
|
|
61
|
+
params: ResourceIdParamSchema
|
|
62
|
+
},
|
|
63
|
+
responses: {
|
|
64
|
+
200: { description: "Resource exists" },
|
|
65
|
+
404: { description: "Resource not found" }
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
return app.openapi(listRoute, async (ctx) => {
|
|
69
|
+
const agent = getAgent();
|
|
70
|
+
const resources = await agent.listResources();
|
|
71
|
+
return ctx.json({ ok: true, resources: Object.values(resources) });
|
|
72
|
+
}).openapi(getContentRoute, async (ctx) => {
|
|
73
|
+
const agent = getAgent();
|
|
74
|
+
const { resourceId } = ctx.req.valid("param");
|
|
75
|
+
const content = await agent.readResource(resourceId);
|
|
76
|
+
return ctx.json({ ok: true, content });
|
|
77
|
+
}).openapi(headRoute, async (ctx) => {
|
|
78
|
+
const agent = getAgent();
|
|
79
|
+
const { resourceId } = ctx.req.valid("param");
|
|
80
|
+
const exists = await agent.hasResource(resourceId);
|
|
81
|
+
return ctx.body(null, exists ? 200 : 404);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
export {
|
|
85
|
+
createResourcesRouter
|
|
86
|
+
};
|
|
@@ -0,0 +1,109 @@
|
|
|
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 search_exports = {};
|
|
20
|
+
__export(search_exports, {
|
|
21
|
+
createSearchRouter: () => createSearchRouter
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(search_exports);
|
|
24
|
+
var import_zod_openapi = require("@hono/zod-openapi");
|
|
25
|
+
var import_responses = require("../schemas/responses.js");
|
|
26
|
+
const MessageSearchQuery = import_zod_openapi.z.object({
|
|
27
|
+
q: import_zod_openapi.z.string().min(1, "Search query is required").describe("Search query string"),
|
|
28
|
+
limit: import_zod_openapi.z.coerce.number().min(1).max(100).optional().describe("Maximum number of results to return (default: 20)"),
|
|
29
|
+
offset: import_zod_openapi.z.coerce.number().min(0).optional().describe("Number of results to skip for pagination (default: 0)"),
|
|
30
|
+
sessionId: import_zod_openapi.z.string().optional().describe("Limit search to a specific session"),
|
|
31
|
+
role: import_zod_openapi.z.enum(["user", "assistant", "system", "tool"]).optional().describe("Filter by message role")
|
|
32
|
+
});
|
|
33
|
+
const SessionSearchQuery = import_zod_openapi.z.object({
|
|
34
|
+
q: import_zod_openapi.z.string().min(1, "Search query is required").describe("Search query string")
|
|
35
|
+
});
|
|
36
|
+
function createSearchRouter(getAgent) {
|
|
37
|
+
const app = new import_zod_openapi.OpenAPIHono();
|
|
38
|
+
const messagesRoute = (0, import_zod_openapi.createRoute)({
|
|
39
|
+
method: "get",
|
|
40
|
+
path: "/search/messages",
|
|
41
|
+
summary: "Search Messages",
|
|
42
|
+
description: "Searches for messages across all sessions or within a specific session",
|
|
43
|
+
tags: ["search"],
|
|
44
|
+
request: { query: MessageSearchQuery },
|
|
45
|
+
responses: {
|
|
46
|
+
200: {
|
|
47
|
+
description: "Message search results",
|
|
48
|
+
content: {
|
|
49
|
+
"application/json": {
|
|
50
|
+
schema: import_zod_openapi.z.object({
|
|
51
|
+
results: import_zod_openapi.z.array(import_responses.SearchResultSchema).describe("Array of search results"),
|
|
52
|
+
total: import_zod_openapi.z.number().int().nonnegative().describe("Total number of results available"),
|
|
53
|
+
hasMore: import_zod_openapi.z.boolean().describe(
|
|
54
|
+
"Whether there are more results beyond the current page"
|
|
55
|
+
),
|
|
56
|
+
query: import_zod_openapi.z.string().describe("Query that was searched")
|
|
57
|
+
}).strict().describe("Message search response")
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
const sessionsRoute = (0, import_zod_openapi.createRoute)({
|
|
64
|
+
method: "get",
|
|
65
|
+
path: "/search/sessions",
|
|
66
|
+
summary: "Search Sessions",
|
|
67
|
+
description: "Searches for sessions that contain the specified query",
|
|
68
|
+
tags: ["search"],
|
|
69
|
+
request: { query: SessionSearchQuery },
|
|
70
|
+
responses: {
|
|
71
|
+
200: {
|
|
72
|
+
description: "Session search results",
|
|
73
|
+
content: {
|
|
74
|
+
"application/json": {
|
|
75
|
+
schema: import_zod_openapi.z.object({
|
|
76
|
+
results: import_zod_openapi.z.array(import_responses.SessionSearchResultSchema).describe("Array of session search results"),
|
|
77
|
+
total: import_zod_openapi.z.number().int().nonnegative().describe("Total number of sessions with matches"),
|
|
78
|
+
hasMore: import_zod_openapi.z.boolean().describe(
|
|
79
|
+
"Always false - session search returns all matching sessions without pagination"
|
|
80
|
+
),
|
|
81
|
+
query: import_zod_openapi.z.string().describe("Query that was searched")
|
|
82
|
+
}).strict().describe("Session search response")
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
return app.openapi(messagesRoute, async (ctx) => {
|
|
89
|
+
const agent = getAgent();
|
|
90
|
+
const { q, limit, offset, sessionId, role } = ctx.req.valid("query");
|
|
91
|
+
const options = {
|
|
92
|
+
limit: limit || 20,
|
|
93
|
+
offset: offset || 0,
|
|
94
|
+
...sessionId && { sessionId },
|
|
95
|
+
...role && { role }
|
|
96
|
+
};
|
|
97
|
+
const searchResults = await agent.searchMessages(q, options);
|
|
98
|
+
return ctx.json(searchResults);
|
|
99
|
+
}).openapi(sessionsRoute, async (ctx) => {
|
|
100
|
+
const agent = getAgent();
|
|
101
|
+
const { q } = ctx.req.valid("query");
|
|
102
|
+
const searchResults = await agent.searchSessions(q);
|
|
103
|
+
return ctx.json(searchResults);
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
107
|
+
0 && (module.exports = {
|
|
108
|
+
createSearchRouter
|
|
109
|
+
});
|