@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,125 @@
|
|
|
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 approvals_exports = {};
|
|
20
|
+
__export(approvals_exports, {
|
|
21
|
+
createApprovalsRouter: () => createApprovalsRouter
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(approvals_exports);
|
|
24
|
+
var import_zod_openapi = require("@hono/zod-openapi");
|
|
25
|
+
var import_core = require("@dexto/core");
|
|
26
|
+
const ApprovalBodySchema = import_zod_openapi.z.object({
|
|
27
|
+
status: import_zod_openapi.z.enum([import_core.ApprovalStatus.APPROVED, import_core.ApprovalStatus.DENIED]).describe("The user decision"),
|
|
28
|
+
formData: import_zod_openapi.z.record(import_zod_openapi.z.unknown()).optional().describe("Optional form data provided by the user (for elicitation)"),
|
|
29
|
+
rememberChoice: import_zod_openapi.z.boolean().optional().describe("Whether to remember this choice for future requests")
|
|
30
|
+
}).describe("Request body for submitting an approval decision");
|
|
31
|
+
const ApprovalResponseSchema = import_zod_openapi.z.object({
|
|
32
|
+
ok: import_zod_openapi.z.boolean().describe("Whether the approval was successfully processed"),
|
|
33
|
+
approvalId: import_zod_openapi.z.string().describe("The ID of the processed approval"),
|
|
34
|
+
status: import_zod_openapi.z.enum([import_core.ApprovalStatus.APPROVED, import_core.ApprovalStatus.DENIED]).describe("The final status")
|
|
35
|
+
}).describe("Response after processing approval");
|
|
36
|
+
function createApprovalsRouter(getAgent, approvalCoordinator) {
|
|
37
|
+
const app = new import_zod_openapi.OpenAPIHono();
|
|
38
|
+
const submitApprovalRoute = (0, import_zod_openapi.createRoute)({
|
|
39
|
+
method: "post",
|
|
40
|
+
path: "/approvals/{approvalId}",
|
|
41
|
+
summary: "Submit Approval Decision",
|
|
42
|
+
description: "Submit a user decision for a pending approval request",
|
|
43
|
+
tags: ["approvals"],
|
|
44
|
+
request: {
|
|
45
|
+
params: import_zod_openapi.z.object({
|
|
46
|
+
approvalId: import_zod_openapi.z.string().describe("The ID of the approval request")
|
|
47
|
+
}),
|
|
48
|
+
body: {
|
|
49
|
+
content: { "application/json": { schema: ApprovalBodySchema } }
|
|
50
|
+
},
|
|
51
|
+
headers: import_zod_openapi.z.object({
|
|
52
|
+
"Idempotency-Key": import_zod_openapi.z.string().optional().describe("Optional key to ensure idempotent processing")
|
|
53
|
+
})
|
|
54
|
+
},
|
|
55
|
+
responses: {
|
|
56
|
+
200: {
|
|
57
|
+
description: "Approval processed successfully",
|
|
58
|
+
content: {
|
|
59
|
+
"application/json": {
|
|
60
|
+
schema: ApprovalResponseSchema
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
404: {
|
|
65
|
+
description: "Approval request not found or expired"
|
|
66
|
+
},
|
|
67
|
+
400: {
|
|
68
|
+
description: "Validation error"
|
|
69
|
+
},
|
|
70
|
+
503: {
|
|
71
|
+
description: "Approval coordinator unavailable (server not initialized for approvals)"
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
return app.openapi(submitApprovalRoute, async (ctx) => {
|
|
76
|
+
const agent = getAgent();
|
|
77
|
+
const { approvalId } = ctx.req.valid("param");
|
|
78
|
+
const { status, formData, rememberChoice } = ctx.req.valid("json");
|
|
79
|
+
agent.logger.info(`Received approval decision for ${approvalId}: ${status}`);
|
|
80
|
+
if (!approvalCoordinator) {
|
|
81
|
+
agent.logger.error("ApprovalCoordinator not available");
|
|
82
|
+
return ctx.json({ ok: false, approvalId, status }, 503);
|
|
83
|
+
}
|
|
84
|
+
const pendingApprovals = agent.services.approvalManager.getPendingApprovals();
|
|
85
|
+
if (!pendingApprovals.includes(approvalId)) {
|
|
86
|
+
throw import_core.ApprovalError.notFound(approvalId);
|
|
87
|
+
}
|
|
88
|
+
try {
|
|
89
|
+
const data = {};
|
|
90
|
+
if (status === import_core.ApprovalStatus.APPROVED) {
|
|
91
|
+
if (formData !== void 0) {
|
|
92
|
+
data.formData = formData;
|
|
93
|
+
}
|
|
94
|
+
if (rememberChoice !== void 0) {
|
|
95
|
+
data.rememberChoice = rememberChoice;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const sessionId = approvalCoordinator.getSessionId(approvalId);
|
|
99
|
+
const responsePayload = {
|
|
100
|
+
approvalId,
|
|
101
|
+
status,
|
|
102
|
+
sessionId,
|
|
103
|
+
// Attach sessionId for SSE routing to correct client streams
|
|
104
|
+
...status === import_core.ApprovalStatus.DENIED ? {
|
|
105
|
+
reason: import_core.DenialReason.USER_DENIED,
|
|
106
|
+
message: "User denied the request via API"
|
|
107
|
+
} : {},
|
|
108
|
+
...Object.keys(data).length > 0 ? { data } : {}
|
|
109
|
+
};
|
|
110
|
+
approvalCoordinator.emitResponse(responsePayload);
|
|
111
|
+
return ctx.json({
|
|
112
|
+
ok: true,
|
|
113
|
+
approvalId,
|
|
114
|
+
status
|
|
115
|
+
});
|
|
116
|
+
} catch (error) {
|
|
117
|
+
agent.logger.error("Error processing approval", { approvalId, error });
|
|
118
|
+
return ctx.json({ ok: false, approvalId, status }, 500);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
123
|
+
0 && (module.exports = {
|
|
124
|
+
createApprovalsRouter
|
|
125
|
+
});
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { OpenAPIHono } from '@hono/zod-openapi';
|
|
2
|
+
import { type DextoAgent, ApprovalStatus } from '@dexto/core';
|
|
3
|
+
import type { ApprovalCoordinator } from '../../approval/approval-coordinator.js';
|
|
4
|
+
export declare function createApprovalsRouter(getAgent: () => DextoAgent, approvalCoordinator?: ApprovalCoordinator): OpenAPIHono<import("hono").Env, {
|
|
5
|
+
"/approvals/:approvalId": {
|
|
6
|
+
$post: {
|
|
7
|
+
input: {
|
|
8
|
+
param: {
|
|
9
|
+
approvalId: string;
|
|
10
|
+
};
|
|
11
|
+
} & {
|
|
12
|
+
header: {
|
|
13
|
+
'Idempotency-Key'?: string | undefined;
|
|
14
|
+
};
|
|
15
|
+
} & {
|
|
16
|
+
json: {
|
|
17
|
+
status: ApprovalStatus.APPROVED | ApprovalStatus.DENIED;
|
|
18
|
+
formData?: Record<string, unknown> | undefined;
|
|
19
|
+
rememberChoice?: boolean | undefined;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
output: {};
|
|
23
|
+
outputFormat: string;
|
|
24
|
+
status: 400;
|
|
25
|
+
} | {
|
|
26
|
+
input: {
|
|
27
|
+
param: {
|
|
28
|
+
approvalId: string;
|
|
29
|
+
};
|
|
30
|
+
} & {
|
|
31
|
+
header: {
|
|
32
|
+
'Idempotency-Key'?: string | undefined;
|
|
33
|
+
};
|
|
34
|
+
} & {
|
|
35
|
+
json: {
|
|
36
|
+
status: ApprovalStatus.APPROVED | ApprovalStatus.DENIED;
|
|
37
|
+
formData?: Record<string, unknown> | undefined;
|
|
38
|
+
rememberChoice?: boolean | undefined;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
output: {};
|
|
42
|
+
outputFormat: string;
|
|
43
|
+
status: 404;
|
|
44
|
+
} | {
|
|
45
|
+
input: {
|
|
46
|
+
param: {
|
|
47
|
+
approvalId: string;
|
|
48
|
+
};
|
|
49
|
+
} & {
|
|
50
|
+
header: {
|
|
51
|
+
'Idempotency-Key'?: string | undefined;
|
|
52
|
+
};
|
|
53
|
+
} & {
|
|
54
|
+
json: {
|
|
55
|
+
status: ApprovalStatus.APPROVED | ApprovalStatus.DENIED;
|
|
56
|
+
formData?: Record<string, unknown> | undefined;
|
|
57
|
+
rememberChoice?: boolean | undefined;
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
output: {};
|
|
61
|
+
outputFormat: string;
|
|
62
|
+
status: 503;
|
|
63
|
+
} | {
|
|
64
|
+
input: {
|
|
65
|
+
param: {
|
|
66
|
+
approvalId: string;
|
|
67
|
+
};
|
|
68
|
+
} & {
|
|
69
|
+
header: {
|
|
70
|
+
'Idempotency-Key'?: string | undefined;
|
|
71
|
+
};
|
|
72
|
+
} & {
|
|
73
|
+
json: {
|
|
74
|
+
status: ApprovalStatus.APPROVED | ApprovalStatus.DENIED;
|
|
75
|
+
formData?: Record<string, unknown> | undefined;
|
|
76
|
+
rememberChoice?: boolean | undefined;
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
output: {
|
|
80
|
+
status: ApprovalStatus.APPROVED | ApprovalStatus.DENIED;
|
|
81
|
+
ok: boolean;
|
|
82
|
+
approvalId: string;
|
|
83
|
+
};
|
|
84
|
+
outputFormat: "json";
|
|
85
|
+
status: 200;
|
|
86
|
+
};
|
|
87
|
+
};
|
|
88
|
+
}, "/">;
|
|
89
|
+
//# sourceMappingURL=approvals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approvals.d.ts","sourceRoot":"","sources":["../../../src/hono/routes/approvals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,KAAK,UAAU,EAAgB,cAAc,EAAiB,MAAM,aAAa,CAAC;AAC3F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AA4BlF,wBAAgB,qBAAqB,CACjC,QAAQ,EAAE,MAAM,UAAU,EAC1B,mBAAmB,CAAC,EAAE,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA6G5C"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi";
|
|
2
|
+
import { DenialReason, ApprovalStatus, ApprovalError } from "@dexto/core";
|
|
3
|
+
const ApprovalBodySchema = z.object({
|
|
4
|
+
status: z.enum([ApprovalStatus.APPROVED, ApprovalStatus.DENIED]).describe("The user decision"),
|
|
5
|
+
formData: z.record(z.unknown()).optional().describe("Optional form data provided by the user (for elicitation)"),
|
|
6
|
+
rememberChoice: z.boolean().optional().describe("Whether to remember this choice for future requests")
|
|
7
|
+
}).describe("Request body for submitting an approval decision");
|
|
8
|
+
const ApprovalResponseSchema = z.object({
|
|
9
|
+
ok: z.boolean().describe("Whether the approval was successfully processed"),
|
|
10
|
+
approvalId: z.string().describe("The ID of the processed approval"),
|
|
11
|
+
status: z.enum([ApprovalStatus.APPROVED, ApprovalStatus.DENIED]).describe("The final status")
|
|
12
|
+
}).describe("Response after processing approval");
|
|
13
|
+
function createApprovalsRouter(getAgent, approvalCoordinator) {
|
|
14
|
+
const app = new OpenAPIHono();
|
|
15
|
+
const submitApprovalRoute = createRoute({
|
|
16
|
+
method: "post",
|
|
17
|
+
path: "/approvals/{approvalId}",
|
|
18
|
+
summary: "Submit Approval Decision",
|
|
19
|
+
description: "Submit a user decision for a pending approval request",
|
|
20
|
+
tags: ["approvals"],
|
|
21
|
+
request: {
|
|
22
|
+
params: z.object({
|
|
23
|
+
approvalId: z.string().describe("The ID of the approval request")
|
|
24
|
+
}),
|
|
25
|
+
body: {
|
|
26
|
+
content: { "application/json": { schema: ApprovalBodySchema } }
|
|
27
|
+
},
|
|
28
|
+
headers: z.object({
|
|
29
|
+
"Idempotency-Key": z.string().optional().describe("Optional key to ensure idempotent processing")
|
|
30
|
+
})
|
|
31
|
+
},
|
|
32
|
+
responses: {
|
|
33
|
+
200: {
|
|
34
|
+
description: "Approval processed successfully",
|
|
35
|
+
content: {
|
|
36
|
+
"application/json": {
|
|
37
|
+
schema: ApprovalResponseSchema
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
404: {
|
|
42
|
+
description: "Approval request not found or expired"
|
|
43
|
+
},
|
|
44
|
+
400: {
|
|
45
|
+
description: "Validation error"
|
|
46
|
+
},
|
|
47
|
+
503: {
|
|
48
|
+
description: "Approval coordinator unavailable (server not initialized for approvals)"
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
return app.openapi(submitApprovalRoute, async (ctx) => {
|
|
53
|
+
const agent = getAgent();
|
|
54
|
+
const { approvalId } = ctx.req.valid("param");
|
|
55
|
+
const { status, formData, rememberChoice } = ctx.req.valid("json");
|
|
56
|
+
agent.logger.info(`Received approval decision for ${approvalId}: ${status}`);
|
|
57
|
+
if (!approvalCoordinator) {
|
|
58
|
+
agent.logger.error("ApprovalCoordinator not available");
|
|
59
|
+
return ctx.json({ ok: false, approvalId, status }, 503);
|
|
60
|
+
}
|
|
61
|
+
const pendingApprovals = agent.services.approvalManager.getPendingApprovals();
|
|
62
|
+
if (!pendingApprovals.includes(approvalId)) {
|
|
63
|
+
throw ApprovalError.notFound(approvalId);
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
const data = {};
|
|
67
|
+
if (status === ApprovalStatus.APPROVED) {
|
|
68
|
+
if (formData !== void 0) {
|
|
69
|
+
data.formData = formData;
|
|
70
|
+
}
|
|
71
|
+
if (rememberChoice !== void 0) {
|
|
72
|
+
data.rememberChoice = rememberChoice;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const sessionId = approvalCoordinator.getSessionId(approvalId);
|
|
76
|
+
const responsePayload = {
|
|
77
|
+
approvalId,
|
|
78
|
+
status,
|
|
79
|
+
sessionId,
|
|
80
|
+
// Attach sessionId for SSE routing to correct client streams
|
|
81
|
+
...status === ApprovalStatus.DENIED ? {
|
|
82
|
+
reason: DenialReason.USER_DENIED,
|
|
83
|
+
message: "User denied the request via API"
|
|
84
|
+
} : {},
|
|
85
|
+
...Object.keys(data).length > 0 ? { data } : {}
|
|
86
|
+
};
|
|
87
|
+
approvalCoordinator.emitResponse(responsePayload);
|
|
88
|
+
return ctx.json({
|
|
89
|
+
ok: true,
|
|
90
|
+
approvalId,
|
|
91
|
+
status
|
|
92
|
+
});
|
|
93
|
+
} catch (error) {
|
|
94
|
+
agent.logger.error("Error processing approval", { approvalId, error });
|
|
95
|
+
return ctx.json({ ok: false, approvalId, status }, 500);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
export {
|
|
100
|
+
createApprovalsRouter
|
|
101
|
+
};
|
|
@@ -0,0 +1,60 @@
|
|
|
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 greeting_exports = {};
|
|
20
|
+
__export(greeting_exports, {
|
|
21
|
+
createGreetingRouter: () => createGreetingRouter
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(greeting_exports);
|
|
24
|
+
var import_zod_openapi = require("@hono/zod-openapi");
|
|
25
|
+
const querySchema = import_zod_openapi.z.object({
|
|
26
|
+
sessionId: import_zod_openapi.z.string().optional().describe("Session identifier to retrieve session-specific greeting")
|
|
27
|
+
}).describe("Query parameters for greeting endpoint");
|
|
28
|
+
function createGreetingRouter(getAgent) {
|
|
29
|
+
const app = new import_zod_openapi.OpenAPIHono();
|
|
30
|
+
const greetingRoute = (0, import_zod_openapi.createRoute)({
|
|
31
|
+
method: "get",
|
|
32
|
+
path: "/greeting",
|
|
33
|
+
summary: "Get Greeting Message",
|
|
34
|
+
description: "Retrieves the greeting message from the agent configuration",
|
|
35
|
+
tags: ["config"],
|
|
36
|
+
request: { query: querySchema.pick({ sessionId: true }) },
|
|
37
|
+
responses: {
|
|
38
|
+
200: {
|
|
39
|
+
description: "Greeting",
|
|
40
|
+
content: {
|
|
41
|
+
"application/json": {
|
|
42
|
+
schema: import_zod_openapi.z.object({
|
|
43
|
+
greeting: import_zod_openapi.z.string().optional().describe("Greeting message from agent configuration")
|
|
44
|
+
}).strict()
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
return app.openapi(greetingRoute, (ctx) => {
|
|
51
|
+
const agent = getAgent();
|
|
52
|
+
const { sessionId } = ctx.req.valid("query");
|
|
53
|
+
const cfg = agent.getEffectiveConfig(sessionId);
|
|
54
|
+
return ctx.json({ greeting: cfg.greeting });
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
58
|
+
0 && (module.exports = {
|
|
59
|
+
createGreetingRouter
|
|
60
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { OpenAPIHono } from '@hono/zod-openapi';
|
|
2
|
+
import type { DextoAgent } from '@dexto/core';
|
|
3
|
+
export declare function createGreetingRouter(getAgent: () => DextoAgent): OpenAPIHono<import("hono").Env, {
|
|
4
|
+
"/greeting": {
|
|
5
|
+
$get: {
|
|
6
|
+
input: {
|
|
7
|
+
query: {
|
|
8
|
+
sessionId?: string | undefined;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
output: {
|
|
12
|
+
greeting?: string | undefined;
|
|
13
|
+
};
|
|
14
|
+
outputFormat: "json";
|
|
15
|
+
status: 200;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
}, "/">;
|
|
19
|
+
//# sourceMappingURL=greeting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"greeting.d.ts","sourceRoot":"","sources":["../../../src/hono/routes/greeting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,mBAAmB,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAW9C,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,UAAU;;;;;;;;;;;;;;;QAmC9D"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi";
|
|
2
|
+
const querySchema = z.object({
|
|
3
|
+
sessionId: z.string().optional().describe("Session identifier to retrieve session-specific greeting")
|
|
4
|
+
}).describe("Query parameters for greeting endpoint");
|
|
5
|
+
function createGreetingRouter(getAgent) {
|
|
6
|
+
const app = new OpenAPIHono();
|
|
7
|
+
const greetingRoute = createRoute({
|
|
8
|
+
method: "get",
|
|
9
|
+
path: "/greeting",
|
|
10
|
+
summary: "Get Greeting Message",
|
|
11
|
+
description: "Retrieves the greeting message from the agent configuration",
|
|
12
|
+
tags: ["config"],
|
|
13
|
+
request: { query: querySchema.pick({ sessionId: true }) },
|
|
14
|
+
responses: {
|
|
15
|
+
200: {
|
|
16
|
+
description: "Greeting",
|
|
17
|
+
content: {
|
|
18
|
+
"application/json": {
|
|
19
|
+
schema: z.object({
|
|
20
|
+
greeting: z.string().optional().describe("Greeting message from agent configuration")
|
|
21
|
+
}).strict()
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
return app.openapi(greetingRoute, (ctx) => {
|
|
28
|
+
const agent = getAgent();
|
|
29
|
+
const { sessionId } = ctx.req.valid("query");
|
|
30
|
+
const cfg = agent.getEffectiveConfig(sessionId);
|
|
31
|
+
return ctx.json({ greeting: cfg.greeting });
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
export {
|
|
35
|
+
createGreetingRouter
|
|
36
|
+
};
|
|
@@ -0,0 +1,45 @@
|
|
|
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 health_exports = {};
|
|
20
|
+
__export(health_exports, {
|
|
21
|
+
createHealthRouter: () => createHealthRouter
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(health_exports);
|
|
24
|
+
var import_zod_openapi = require("@hono/zod-openapi");
|
|
25
|
+
function createHealthRouter(_getAgent) {
|
|
26
|
+
const app = new import_zod_openapi.OpenAPIHono();
|
|
27
|
+
const route = (0, import_zod_openapi.createRoute)({
|
|
28
|
+
method: "get",
|
|
29
|
+
path: "/",
|
|
30
|
+
summary: "Health Check",
|
|
31
|
+
description: "Returns server health status",
|
|
32
|
+
tags: ["system"],
|
|
33
|
+
responses: {
|
|
34
|
+
200: {
|
|
35
|
+
description: "Server health",
|
|
36
|
+
content: { "text/plain": { schema: import_zod_openapi.z.string().openapi({ example: "OK" }) } }
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
return app.openapi(route, (c) => c.text("OK"));
|
|
41
|
+
}
|
|
42
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
43
|
+
0 && (module.exports = {
|
|
44
|
+
createHealthRouter
|
|
45
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { OpenAPIHono } from '@hono/zod-openapi';
|
|
2
|
+
import type { DextoAgent } from '@dexto/core';
|
|
3
|
+
/**
|
|
4
|
+
* NOTE: If we introduce a transport-agnostic handler layer later, the logic in this module can move
|
|
5
|
+
* into that layer. For now we keep the implementation inline for simplicity.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createHealthRouter(_getAgent: () => DextoAgent): OpenAPIHono<import("hono").Env, {
|
|
8
|
+
"/": {
|
|
9
|
+
$get: {
|
|
10
|
+
input: {};
|
|
11
|
+
output: string;
|
|
12
|
+
outputFormat: "text";
|
|
13
|
+
status: 200;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
}, "/">;
|
|
17
|
+
//# sourceMappingURL=health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/hono/routes/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,mBAAmB,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,UAAU;;;;;;;;;QAiB7D"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { OpenAPIHono, createRoute, z } from "@hono/zod-openapi";
|
|
2
|
+
function createHealthRouter(_getAgent) {
|
|
3
|
+
const app = new OpenAPIHono();
|
|
4
|
+
const route = createRoute({
|
|
5
|
+
method: "get",
|
|
6
|
+
path: "/",
|
|
7
|
+
summary: "Health Check",
|
|
8
|
+
description: "Returns server health status",
|
|
9
|
+
tags: ["system"],
|
|
10
|
+
responses: {
|
|
11
|
+
200: {
|
|
12
|
+
description: "Server health",
|
|
13
|
+
content: { "text/plain": { schema: z.string().openapi({ example: "OK" }) } }
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
return app.openapi(route, (c) => c.text("OK"));
|
|
18
|
+
}
|
|
19
|
+
export {
|
|
20
|
+
createHealthRouter
|
|
21
|
+
};
|